Crafter.Build/examples/wasi/README.md
Jorijn van der Graaf 3e125d83f0
docs: wasm exceptions as the review left them
The README called an exception escaping main a trap. It is an uncaught
WebAssembly exception, and nothing prints its type or what(); the
README says so now. It also lists what a wasm build refuses and why,
says that setjmp needs -lsetjmp and that a longjmp across a noexcept
function ends the program, that a wasmtime older than 47 needs
-W exceptions=y, and that an old wasm-opt on PATH breaks release links.
It documents exit and park in a page from EnableWasiBrowserRuntime,
with the declaration of the park import.

The wasi example still sent Arch users to wasi-libc++, which has no
exception-enabled libraries. It asks for a wasi-sdk 33 sysroot or the
Flatpak now, and names the browsers a page needs. AGENTS.md notes that
the runtime test needs node, so it runs in the native loop and not in
CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 06:10:41 +01:00

1.3 KiB

WASI

Build a C++26 program for the wasm32-wasi target and run it in a browser.

Prerequisites

  • A WASI sysroot with the exception-enabled libc++, lib/wasm32-wasip1/eh/ from wasi-sdk 33 or later: wasm builds compile C++ exceptions and link those libraries. The Flatpak bundles one, which crafter-build uses as it is. Elsewhere, point CRAFTER_BUILD_WASI_SYSROOT at a wasi-sdk sysroot, or set cfg.sysroot in project.cpp. Arch's wasi-libc++ packages have no such libraries, and the build stops with a message saying so.
  • For the browser: WebAssembly exception handling, in Chrome 137, Firefox 131, Safari 18.4 or newer.

Build

crafter-build

Output lands in bin/wasi-hello-wasm32-wasip1-native/:

  • wasi-hello.wasm — the compiled module
  • index.html + runtime.js — a minimal in-browser WASI shim, dropped in by EnableWasiBrowserRuntime(cfg) in project.cpp. Stdout goes to the browser console.

Run in a browser

./serve.sh                  # any static file server works

Open http://localhost:8080/. The string from main() shows up in the DevTools console.

Run in a standalone runtime

If you don't need the browser, drop the EnableWasiBrowserRuntime(cfg) line from project.cpp and run the .wasm directly:

wasmtime bin/wasi-hello-wasm32-wasip1-native/wasi-hello.wasm