make -C mux/rv64 install copies the artifact to mux/game/bin/, and both
copies are committed. They can drift independently, and did: my
241c89bd8 regenerated mux/rv64/softlib.rv64 and left game/bin/ holding
the previous binary, so master carried two different blobs at once --
138,576 in one path and 138,072 in the other -- for several hours.
Nothing caught it. run.sh verified only mux/rv64/softlib.rv64 against
its source and never looked at game/bin/, and each copy is
self-consistent in isolation, so whichever one you inspect looks
correct. game/bin/ is the copy a fresh checkout carries without
running the rv64 install step, which makes it the one an unsuspecting
build actually loads.
Added as check 0, before the cross-compiler detection, because unlike
the two checks that follow it needs no toolchain: it is a hash
comparison of two files. That means it runs on boxes that cannot build
the blob at all -- Windows, and any end user -- where the script
previously exited early with SKIP and checked nothing.
Verified in three states rather than assuming a new check works:
drift present, toolchain available exit 1
drift present, no cross-compiler exit 1 (previously SKIP/0)
copies agree, artifact matches source exit 0
The middle case is the point of the placement. The first was run
against master's real divergence rather than a synthetic one, since the
bug this closes is currently live there; #2014 repairs the artifacts.