fix(web): repair Emscripten build after module split + font move

The web build had bit-rotted since the last successful build (Apr 12):

- build_web.sh only compiled spectrogram.c + platform_web.c, but commit
  3a8f20b split the code into 9 modules — link failed with undefined
  symbols. Now compiles all app modules (kept in sync with rspektrum.make,
  swapping platform_linux -> platform_web).
- Dropped -DPLATFORM_WEB from the app-module compile/link: the platform
  refactor (b6942d8) added a `Platform` enum whose PLATFORM_WEB enumerator
  collides with the macro. Web behavior is selected by linking
  platform_web.c, not the macro, so the define was never needed by our code
  (raylib still gets it in its own build).
- Removed the stale `fonts/DejaVuSansMono.ttf` preload (font moved to
  resources/fonts/); resources@resources already bundles it and the runtime
  loads it relative to the resources dir.
- platform_web.c: include <errno.h> for ENOSYS (this stub had never compiled).
- build_web.sh: skip the slow raylib rebuild when libraylib.a already exists.

Verified: `./build_web.sh release` exits 0 and produces html/js/wasm/data;
font is packaged; all artifacts serve 200 via python http.server and the
wasm has valid magic bytes.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-25 11:15:31 -07:00
parent e8ed19d338
commit 6347eb172e
2 changed files with 46 additions and 27 deletions
+45 -27
View File
@@ -29,37 +29,57 @@ fi
echo "=== Step 1: Compiling raylib for web ==="
# Compile raylib source files
emcc -c "$RAYLIB_DIR/src/rcore.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rcore.o"
emcc -c "$RAYLIB_DIR/src/rshapes.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rshapes.o"
emcc -c "$RAYLIB_DIR/src/rtextures.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rtextures.o"
emcc -c "$RAYLIB_DIR/src/rtext.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rtext.o"
emcc -c "$RAYLIB_DIR/src/rmodels.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rmodels.o"
emcc -c "$RAYLIB_DIR/src/raudio.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/raudio.o"
# raylib rarely changes; skip the (slow) rebuild if the archive already exists.
# Delete "$RAYLIB_BUILD/libraylib.a" to force a clean raylib rebuild.
if [ ! -f "$RAYLIB_BUILD/libraylib.a" ]; then
# Compile raylib source files
emcc -c "$RAYLIB_DIR/src/rcore.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rcore.o"
emcc -c "$RAYLIB_DIR/src/rshapes.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rshapes.o"
emcc -c "$RAYLIB_DIR/src/rtextures.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rtextures.o"
emcc -c "$RAYLIB_DIR/src/rtext.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rtext.o"
emcc -c "$RAYLIB_DIR/src/rmodels.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/rmodels.o"
emcc -c "$RAYLIB_DIR/src/raudio.c" $RAYLIB_CFLAGS -o "$RAYLIB_BUILD/raudio.o"
# Create static library
cd "$RAYLIB_BUILD"
emar rcs libraylib.a rcore.o rshapes.o rtextures.o rtext.o rmodels.o raudio.o
# Create static library
cd "$RAYLIB_BUILD"
emar rcs libraylib.a rcore.o rshapes.o rtextures.o rtext.o rmodels.o raudio.o
cd "$SCRIPT_DIR"
else
echo "libraylib.a found, skipping raylib rebuild"
fi
# Compile the application modules (web version — no subprocess support).
# platform_web.c provides stub implementations for spawn/error functions.
# Keep this list in sync with rspektrum.make (use platform_web instead of
# platform_linux for the web target).
echo "=== Step 2: Compiling spectrogram modules for web ==="
cd "$SCRIPT_DIR"
# Compile spectrogram (web version — no subprocess support)
# platform_web.c provides stub implementations for spawn/error functions
echo "=== Step 2: Compiling spectrogram + platform for web ==="
cd "$SCRIPT_DIR"
APP_MODULES="spectrogram fft stft audio render ui utils primitives platform_web"
# Compile platform_web.o (handles fork/execvp stubs for web)
emcc -c -Os -Wall -DPLATFORM_WEB "$SRC_DIR/platform_web.c" -o "$RAYLIB_BUILD/platform_web.o"
APP_OPT="-Os"
if [ "$BUILD_TYPE" = "debug" ]; then
APP_OPT="-g -O0"
fi
# Compile spectrogram
emcc -c -Os -Wall -DPLATFORM_WEB "$SRC_DIR/spectrogram.c" \
-I"$RAYLIB_DIR/src" \
-I"$RAYLIB_DIR/src/external" \
-I"$RAYLIB_DIR/src/external/glfw/include" \
-Iinclude \
-o "$RAYLIB_BUILD/spectrogram.o"
APP_INCLUDES="-I$RAYLIB_DIR/src -I$RAYLIB_DIR/src/external -I$RAYLIB_DIR/src/external/glfw/include -Iinclude"
# NOTE: do NOT pass -DPLATFORM_WEB to the app modules. Our code selects web
# behavior by linking platform_web.c (not via the macro), and PLATFORM_WEB is
# also an enumerator in platform.h — defining it as a macro breaks that enum.
# (raylib itself is built with -DPLATFORM_WEB above; it needs the macro.)
OBJECTS=""
for m in $APP_MODULES; do
echo " CC $m.c"
emcc -c $APP_OPT -Wall $APP_INCLUDES \
"$SRC_DIR/$m.c" -o "$RAYLIB_BUILD/$m.o"
OBJECTS="$OBJECTS $RAYLIB_BUILD/$m.o"
done
# Linker flags
LDFLAGS="-s USE_GLFW=3 -s ASYNCIFY -s TOTAL_MEMORY=67108864 -s FORCE_FILESYSTEM=1 --preload-file resources@resources --preload-file fonts/DejaVuSansMono.ttf@fonts/DejaVuSansMono.ttf --shell-file $SCRIPT_DIR/web_shell.html -s NO_EXIT_RUNTIME=1"
# The font lives at resources/fonts/DejaVuSansMono.ttf and is loaded relative to
# the resources dir at runtime, so the resources@resources preload covers it.
LDFLAGS="-s USE_GLFW=3 -s ASYNCIFY -s TOTAL_MEMORY=67108864 -s FORCE_FILESYSTEM=1 --preload-file resources@resources --shell-file $SCRIPT_DIR/web_shell.html -s NO_EXIT_RUNTIME=1"
if [ "$BUILD_TYPE" = "debug" ]; then
LDFLAGS="$LDFLAGS -g -O0 -s ASSERTIONS=1"
@@ -69,13 +89,11 @@ fi
# Compile and link
emcc -o "$OUTPUT" \
"$RAYLIB_BUILD/platform_web.o" \
"$RAYLIB_BUILD/spectrogram.o" \
$OBJECTS \
-I"$RAYLIB_DIR/src" \
-I"$RAYLIB_DIR/src/external" \
-I"$RAYLIB_DIR/src/external/glfw/include" \
-Iinclude \
-DPLATFORM_WEB \
"$RAYLIB_BUILD/libraylib.a" \
$LDFLAGS
+1
View File
@@ -10,6 +10,7 @@
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <errno.h> /* ENOSYS */
/* ── Helpers ─────────────────────────────────────────────────────────── */