wasm32 runs the table, and the hash matches

sand-headless prints 2256461126764447066 on native and on wasm32, at -O2 and at
-O0, in one dune test run. That is the whole point of the exercise and the
reason rand-f32 is written in Flan rather than bound to libc.

The old note said the builtins archive has to come from a wasi-sdk release. It
does not: emscripten builds the same compiler-rt and it links correctly under
the other name. It is a different triple built by a different clang, so it is a
substitution rather than the real article, and both the code and the note say so
- nobody should read "wasm32 works" without knowing which joint is glued.

Two findings the note did not have. The entry point is __main_argc_argv, not
main, and the link succeeds before trapping on a signature-mismatched weak stub.
And the target has to reach the C compiles as well as the link, since flan_rt.c
includes stdio.h.

Also corrects why sand is two programs. Two claims had been run together: raylib
does work on wasm through emscripten, and a game loop is expressible there with
emscripten_set_main_loop - a different main, not a different program. What
justifies the split is only that a headless test needs no window on any target.
What makes it mandatory is Load collecting a package's C and link flags whether
or not anything references the package, and that is the thing to fix.
This commit is contained in:
Joseph Ferano 2026-09-11 19:51:33 +07:00
parent 32e20f03da
commit 66cd83d2a1

24
NEXT.md
View File

@ -346,6 +346,30 @@ callable), no cycle detection, and a package cannot import another one.
## sand.flan is two programs
**The stated reason below is narrower than it reads, and the real fix is a
one-line change to `Load` rather than two files.** Two claims got run together:
- *raylib does not work on wasm* — false. It works through emscripten, which
plan.org says itself. What is true is that it does not work on the **wasi**
path, which is what the headless table targets, and which has no GL and no
browser.
- *a game loop cannot be expressed on wasm* — false. The browser cannot be
blocked, so a web build drives the loop with `emscripten_set_main_loop`
instead of a `while`. That is a different `main`, not a different program,
and nothing about it requires the simulation to live in its own package.
What actually justifies the split is smaller and stands on its own: **the
headless test needs no window and no input on any target.** `sand.flan` could
not be that test even natively — with no mouse the grid stays empty and
`settle` and `move-grain` never run on real data.
What makes the split *mandatory* rather than chosen is the packaging
limitation: **`Load` collects a package's C sources and link flags whether or
not anything references the package.** Make that conditional and the two files
become a preference. That is the thing to fix, and it is not large.
plan.org wants sand tested twice — interactive at 120 fps, and headless over N
frames with the grid hashed, the version CI runs on native *and* wasm32. Those
cannot be one binary: `Load` collects a package's C sources and linker