#!/usr/bin/env bash # bin/build-web — WASM/web build via Emscripten # # Produces build-web/index.{html,js,wasm} from src/ + web/shell.html. # Requires emcc + emar (Emscripten SDK) on PATH. # # Usage: # bin/build-web set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_DIR" SRC_DIR="src" BUILD_DIR="build-web" RAYLIB_SRC="deps/raylib/src" RAYLIB_LIB="$BUILD_DIR/libraylib.a" COMMON_INCS="-I$BUILD_DIR -I$RAYLIB_SRC -I$RAYLIB_SRC/external/glfw/include -Ideps/raygui/src" DEFINES="-DPLATFORM_WEB -DGRAPHICS_API_OPENGL_ES2" CFLAGS="-std=c99 -O2 $COMMON_INCS $DEFINES" mkdir -p "$BUILD_DIR" # --- Font header (same logic as Makefile) --- FONT_HEADER="$BUILD_DIR/font_data.h" FONT_FILE="$(find resources -maxdepth 1 -type f \( -iname '*.otf' -o -iname '*.ttf' \) -print -quit 2>/dev/null || true)" if [ -n "$FONT_FILE" ] && command -v xxd >/dev/null 2>&1; then echo " XXD $(basename "$FONT_FILE") -> $FONT_HEADER" xxd -i "$FONT_FILE" > "$FONT_HEADER.tmp" VARNAME="$(grep -oP 'unsigned char \K[a-zA-Z0-9_]+' "$FONT_HEADER.tmp" | head -1)" sed -i "s/${VARNAME}/embedded_font_data/g" "$FONT_HEADER.tmp" echo '#define FONT_EMBEDDED 1' >> "$FONT_HEADER.tmp" mv "$FONT_HEADER.tmp" "$FONT_HEADER" else echo " INFO No font file or xxd unavailable — using default font" printf '/* No font embedded */\nstatic unsigned char embedded_font_data[] = {0};\nstatic unsigned int embedded_font_data_len = 0;\n#define FONT_EMBEDDED 0\n' > "$FONT_HEADER" fi # --- Build raylib for web --- RAYLIB_SRCS="$RAYLIB_SRC/rcore.c $RAYLIB_SRC/rshapes.c $RAYLIB_SRC/rtextures.c $RAYLIB_SRC/rtext.c $RAYLIB_SRC/rmodels.c $RAYLIB_SRC/raudio.c" RAYLIB_OBJS="" for src in $RAYLIB_SRCS; do obj="$BUILD_DIR/raylib_$(basename "${src%.c}").o" echo " CC $src" emcc $CFLAGS -w -c -o "$obj" "$src" RAYLIB_OBJS="$RAYLIB_OBJS $obj" done echo " AR $RAYLIB_LIB" emar rcs "$RAYLIB_LIB" $RAYLIB_OBJS # --- Build application --- APP_SRCS="$(find "$SRC_DIR" -name '*.c')" APP_OBJS="" for src in $APP_SRCS; do obj="$BUILD_DIR/$(basename "${src%.c}").o" echo " CC $src" emcc $CFLAGS -Wall -Wextra -c -o "$obj" "$src" APP_OBJS="$APP_OBJS $obj" done # --- Link --- SHELL_HTML="web/shell.html" if [ ! -f "$SHELL_HTML" ]; then echo "Error: $SHELL_HTML not found" >&2 exit 1 fi echo " LINK $BUILD_DIR/index.html" emcc $CFLAGS -o "$BUILD_DIR/index.html" $APP_OBJS "$RAYLIB_LIB" \ -s USE_GLFW=3 \ -s WASM=1 \ -s ASYNCIFY \ -s SHELL_FILE="$PWD/$SHELL_HTML" \ -s EXPORTED_FUNCTIONS='["_main","_load_file_web"]' \ -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' \ --preload-file resources \ "$@" echo "Build complete: $BUILD_DIR/index.html"