#!/usr/bin/env bash # Build the Web (WASM) target. # Requires Emscripten 3.1+ and Ninja on PATH. # Run from the repo root. set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$REPO_ROOT" if [ ! -f "thirdparty/leanclr/CMakeLists.txt" ]; then git submodule update --init --recursive fi # Re-apply the LeanCLR NotImplemented patch if needed. if grep -q "LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 1" \ thirdparty/leanclr/src/runtime/build_config.h 2>/dev/null; then echo "[build-web] Re-applying leanclr NotImplemented patch..." sed -i 's/LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 1/LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 0/' \ thirdparty/leanclr/src/runtime/build_config.h fi # Find the Emscripten toolchain. Override via $EMSDK_TOOLCHAIN if your install # is in a non-default location. if [ -z "${EMSDK_TOOLCHAIN:-}" ]; then if command -v emcc >/dev/null 2>&1; then # `which emcc` may resolve to either /upstream/emscripten/emcc # (POSIX) or /upstream/bin/emcc.bat (Windows launcher). Walk up # until we find a directory that contains cmake/Modules/Platform/. EMCC_PATH="$(command -v emcc)" d="$(dirname "$EMCC_PATH")" for _ in 1 2 3 4 5 6 7 8; do candidate="$d/cmake/Modules/Platform/Emscripten.cmake" if [ -f "$candidate" ]; then EMSDK_TOOLCHAIN="$candidate" break fi d="$(dirname "$d")" done fi fi if [ -z "${EMSDK_TOOLCHAIN:-}" ] || [ ! -f "$EMSDK_TOOLCHAIN" ]; then echo "[build-web] Emscripten toolchain not found. Set EMSDK_TOOLCHAIN to the" >&2 echo "[build-web] full path of Emscripten.cmake, e.g.:" >&2 echo "[build-web] /upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" >&2 exit 1 fi echo "[build-web] Using toolchain: $EMSDK_TOOLCHAIN" # Configure (first pass — fetches godot-cpp). Single-threaded is forced by # the CMakeLists's own if(EMSCRIPTEN) block (GODOTCPP_THREADS=OFF, -O1). cmake -S . -B build-web -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="$EMSDK_TOOLCHAIN" \ -DCMAKE_BUILD_TYPE=Release # Generate bindings (uses the same extension_api.json path, just inside build-web/). python3 tools/binding_generator/generate_bindings.py \ --api build-web/_deps/godot-cpp-src/gdextension/extension_api.json # Re-configure so the generated cpp is part of the target, then build. cmake -S . -B build-web -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="$EMSDK_TOOLCHAIN" \ -DCMAKE_BUILD_TYPE=Release cmake --build build-web --target leanclr_godot # Managed C# (same output dir as the desktop build). dotnet msbuild managed/GodotSharpCompat/GodotSharpCompat.csproj -p:Configuration=Debug dotnet msbuild project/Game.csproj -p:Configuration=Debug echo "[build-web] Done. Output:" echo "[build-web] project/bin/Release/libleanclr_godot.wasm" echo "[build-web] Export the project for Web in the Godot editor to run."