From 5ce5b5779a981c490827ad1668891df98fb361d9 Mon Sep 17 00:00:00 2001 From: John McCardle Date: Fri, 10 Apr 2026 03:31:25 -0400 Subject: [PATCH] Add Emscripten debug build targets with DWARF and source maps, closes #238 Adds MCRF_WASM_DEBUG CMake option that enables -g4, -gsource-map, and --emit-symbol-map for WASM builds. New Makefile targets: wasm-debug, playground-debug, serve-wasm-debug, serve-playground-debug. Co-Authored-By: Claude Opus 4.6 --- CLAUDE.md | 2 ++ CMakeLists.txt | 12 ++++++++++++ Makefile | 52 ++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 0c78aa6..fa4cdc0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -311,6 +311,8 @@ make serve # Serve at http://localhost:8080 |--------|------------------|---------| | `make wasm` | `build-emscripten/` | Full game with all scripts/assets | | `make playground` | `build-playground/` | Minimal REPL build for interactive testing | +| `make wasm-debug` | `build-wasm-debug/` | Debug build with DWARF symbols and source maps | +| `make playground-debug` | `build-playground-debug/` | Debug playground with DWARF and source maps | ### Rendering Backend Selection diff --git a/CMakeLists.txt b/CMakeLists.txt index 326c181..0a02462 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ option(MCRF_SANITIZE_ADDRESS "Build with AddressSanitizer" OFF) option(MCRF_SANITIZE_UNDEFINED "Build with UBSan" OFF) option(MCRF_SANITIZE_THREAD "Build with ThreadSanitizer" OFF) option(MCRF_DEBUG_PYTHON "Link against debug CPython from __lib_debug/" OFF) +option(MCRF_WASM_DEBUG "Build WASM with DWARF debug info and source maps" OFF) # Validate mutually exclusive sanitizers if(MCRF_SANITIZE_ADDRESS AND MCRF_SANITIZE_THREAD) @@ -398,6 +399,17 @@ if(EMSCRIPTEN) message(STATUS "Emscripten SDL2 options enabled: -sUSE_SDL=2 -sUSE_SDL_MIXER=2 -sFULL_ES2=1 -sUSE_FREETYPE=1") endif() + # WASM debug builds: DWARF symbols, source maps, symbol map for stack traces + if(MCRF_WASM_DEBUG) + list(APPEND EMSCRIPTEN_LINK_OPTIONS + -g4 + -gsource-map + --emit-symbol-map + ) + target_compile_options(mcrogueface PRIVATE -g4) + message(STATUS "Emscripten debug enabled: DWARF (-g4), source maps, symbol map") + endif() + target_link_options(mcrogueface PRIVATE ${EMSCRIPTEN_LINK_OPTIONS}) # Output as HTML to use the shell file diff --git a/Makefile b/Makefile index b14e076..fd2b4fd 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ # Tags HEAD with current version, builds all packages, bumps to NEXT_VERSION .PHONY: all linux windows windows-debug clean clean-windows clean-dist run -.PHONY: wasm wasm-game playground serve serve-game serve-playground clean-wasm +.PHONY: wasm wasm-game wasm-debug playground playground-debug serve serve-game serve-playground clean-wasm .PHONY: package-windows-light package-windows-full package-linux-light package-linux-full package-all .PHONY: version-bump .PHONY: debug debug-test asan asan-test valgrind-test massif-test analyze clean-debug @@ -273,7 +273,55 @@ serve-demo: clean-wasm: @echo "Cleaning Emscripten builds..." - @rm -rf build-emscripten build-playground build-wasm-game build-wasm-demo + @rm -rf build-emscripten build-playground build-wasm-game build-wasm-demo build-wasm-debug build-playground-debug + +wasm-debug: + @if ! command -v emcmake >/dev/null 2>&1; then \ + echo "Error: emcmake not found. Run 'source ~/emsdk/emsdk_env.sh' first."; \ + exit 1; \ + fi + @if [ ! -f build-wasm-debug/Makefile ]; then \ + echo "Configuring WebAssembly debug build (DWARF + source maps)..."; \ + mkdir -p build-wasm-debug; \ + cd build-wasm-debug && emcmake cmake .. \ + -DCMAKE_BUILD_TYPE=Debug \ + -DMCRF_SDL2=ON \ + -DMCRF_WASM_DEBUG=ON; \ + fi + @echo "Building McRogueFace for WebAssembly (debug)..." + @emmake make -C build-wasm-debug -j$(JOBS) + @echo "Debug WASM build complete! Files in build-wasm-debug/" + @echo "Debug artifacts: .wasm.map (source map), .symbols (symbol map)" + @echo "Run 'make serve-wasm-debug' to test locally" + +serve-wasm-debug: + @echo "Serving debug WASM build at http://localhost:8080" + @echo "Press Ctrl+C to stop" + @cd build-wasm-debug && python3 -m http.server 8080 + +playground-debug: + @if ! command -v emcmake >/dev/null 2>&1; then \ + echo "Error: emcmake not found. Run 'source ~/emsdk/emsdk_env.sh' first."; \ + exit 1; \ + fi + @if [ ! -f build-playground-debug/Makefile ]; then \ + echo "Configuring Playground debug build (DWARF + source maps)..."; \ + mkdir -p build-playground-debug; \ + cd build-playground-debug && emcmake cmake .. \ + -DCMAKE_BUILD_TYPE=Debug \ + -DMCRF_SDL2=ON \ + -DMCRF_PLAYGROUND=ON \ + -DMCRF_WASM_DEBUG=ON; \ + fi + @echo "Building McRogueFace Playground for WebAssembly (debug)..." + @emmake make -C build-playground-debug -j$(JOBS) + @echo "Playground debug build complete! Files in build-playground-debug/" + @echo "Run 'make serve-playground-debug' to test locally" + +serve-playground-debug: + @echo "Serving debug Playground build at http://localhost:8080" + @echo "Press Ctrl+C to stop" + @cd build-playground-debug && python3 -m http.server 8080 # Current version extracted from source CURRENT_VERSION := $(shell grep 'MCRFPY_VERSION' src/McRogueFaceVersion.h | sed 's/.*"\(.*\)"/\1/')