build steps

This commit is contained in:
2026-06-07 22:55:56 +08:00
parent dff504ef67
commit 7b42a6be63
14 changed files with 467 additions and 18 deletions
+44
View File
@@ -0,0 +1,44 @@
@echo off
REM Build the Web (WASM) target. Requires Emscripten 3.1+ and Ninja on PATH.
setlocal
if not exist thirdparty\leanclr\CMakeLists.txt (
git submodule update --init --recursive
)
findstr /C:"LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 1" thirdparty\leanclr\src\runtime\build_config.h >nul 2>&1
if %errorlevel% == 0 (
echo [build-web] Re-applying leanclr NotImplemented patch...
powershell -Command "(Get-Content thirdparty/leanclr/src/runtime/build_config.h) -replace 'LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 1', 'LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 0' | Set-Content thirdparty/leanclr/src/runtime/build_config.h"
)
REM Find the Emscripten toolchain. Override via EMSDK_TOOLCHAIN if needed.
if "%EMSDK_TOOLCHAIN%"=="" (
for /f "delims=" %%i in ('where emcc 2^>nul') do set "EMCC_PATH=%%i"
if not "%EMCC_PATH%"=="" (
REM <emsdk>\upstream\emscripten\emcc -> <emsdk>\upstream\emscripten\cmake\Modules\Platform\Emscripten.cmake
for %%i in ("%EMCC_PATH%") do set "EMCC_DIR=%%~dpi"
set "EMSDK_TOOLCHAIN=%EMCC_DIR%cmake\Modules\Platform\Emscripten.cmake"
)
)
if "%EMSDK_TOOLCHAIN%"=="" (
echo [build-web] Emscripten toolchain not found. Set EMSDK_TOOLCHAIN to: 1>&2
echo [build-web] ^<emsdk^>\upstream\emscripten\cmake\Modules\Platform\Emscripten.cmake 1>&2
exit /b 1
)
echo [build-web] Using toolchain: %EMSDK_TOOLCHAIN%
cmake -S . -B build-web -G Ninja -DCMAKE_TOOLCHAIN_FILE="%EMSDK_TOOLCHAIN%" -DCMAKE_BUILD_TYPE=Release || exit /b 1
python tools\binding_generator\generate_bindings.py --api build-web\_deps\godot-cpp-src\gdextension\extension_api.json
if errorlevel 1 (
py tools\binding_generator\generate_bindings.py --api build-web\_deps\godot-cpp-src\gdextension\extension_api.json
)
cmake -S . -B build-web -G Ninja -DCMAKE_TOOLCHAIN_FILE="%EMSDK_TOOLCHAIN%" -DCMAKE_BUILD_TYPE=Release || exit /b 1
cmake --build build-web --target leanclr_godot || exit /b 1
dotnet msbuild managed\GodotSharpCompat\GodotSharpCompat.csproj -p:Configuration=Debug || exit /b 1
dotnet msbuild project\Game.csproj -p:Configuration=Debug || exit /b 1
echo [build-web] Done. Output: project\bin\Release\libleanclr_godot.wasm
echo [build-web] Export the project for Web in the Godot editor to run.
+71
View File
@@ -0,0 +1,71 @@
#!/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 <emsdk>/upstream/emscripten/emcc
# (POSIX) or <emsdk>/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] <emsdk>/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."
+30
View File
@@ -0,0 +1,30 @@
@echo off
REM Build the Windows (Desktop) target: native GDExtension + managed C# DLLs.
REM Run from the repo root.
setlocal
if not exist thirdparty\leanclr\CMakeLists.txt (
git submodule update --init --recursive
)
REM Re-apply the LeanCLR NotImplemented patch if a fresh submodule overwrote it.
findstr /C:"LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 1" thirdparty\leanclr\src\runtime\build_config.h >nul 2>&1
if %errorlevel% == 0 (
echo [build-windows] Re-applying leanclr NotImplemented patch...
powershell -Command "(Get-Content thirdparty/leanclr/src/runtime/build_config.h) -replace 'LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 1', 'LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 0' | Set-Content thirdparty/leanclr/src/runtime/build_config.h"
)
cmake -S . -B build-master -DCMAKE_BUILD_TYPE=Debug || exit /b 1
python tools\..\..\tools\binding_generator\generate_bindings.py --api build-master\_deps\godot-cpp-src\gdextension\extension_api.json
if errorlevel 1 (
REM python3 not on PATH; try py launcher as a fallback.
py tools\binding_generator\generate_bindings.py --api build-master\_deps\godot-cpp-src\gdextension\extension_api.json
)
cmake -S . -B build-master -DCMAKE_BUILD_TYPE=Debug || exit /b 1
cmake --build build-master --config Debug --target leanclr_godot || exit /b 1
dotnet msbuild managed\GodotSharpCompat\GodotSharpCompat.csproj -p:Configuration=Debug || exit /b 1
dotnet msbuild project\Game.csproj -p:Configuration=Debug || exit /b 1
echo [build-windows] Done. Run with: "C:\path\to\Godot.exe" --path project
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# Build the Windows (Desktop) target: native GDExtension + managed C# DLLs.
# Run from the repo root.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$REPO_ROOT"
# Pull submodules if missing.
if [ ! -f "thirdparty/leanclr/CMakeLists.txt" ]; then
git submodule update --init --recursive
fi
# Re-apply the LeanCLR NotImplemented patch if a fresh submodule overwrote it.
if grep -q "LEANCLR_FATAL_ON_RAISE_NOT_IMPLEMENTED_ERROR 1" \
thirdparty/leanclr/src/runtime/build_config.h 2>/dev/null; then
echo "[build-windows] 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
# Configure CMake (first pass — fetches godot-cpp via FetchContent).
cmake -S . -B build-master -DCMAKE_BUILD_TYPE=Debug
# Generate bindings (needs the just-fetched extension_api.json).
python3 tools/binding_generator/generate_bindings.py \
--api build-master/_deps/godot-cpp-src/gdextension/extension_api.json
# Re-configure so add_library sees the generated cpp, then build.
cmake -S . -B build-master -DCMAKE_BUILD_TYPE=Debug
cmake --build build-master --config Debug --target leanclr_godot
# Managed C#.
dotnet msbuild managed/GodotSharpCompat/GodotSharpCompat.csproj -p:Configuration=Debug
dotnet msbuild project/Game.csproj -p:Configuration=Debug
echo "[build-windows] Done. Run with: \"/path/to/Godot\" --path project"
+16
View File
@@ -0,0 +1,16 @@
@echo off
REM Remove all build outputs. Leaves sources, scripts, and the leanclr
REM submodule intact.
setlocal
if exist build rmdir /s /q build
if exist build-master rmdir /s /q build-master
if exist build-web rmdir /s /q build-web
if exist src\generated rmdir /s /q src\generated
if exist managed\GodotSharpCompat\Generated rmdir /s /q managed\GodotSharpCompat\Generated
if exist project\bin rmdir /s /q project\bin
if exist project\leanclr rmdir /s /q project\leanclr
if exist project\obj rmdir /s /q project\obj
echo [clean] Removed build directories, generated bindings, C# outputs.
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Remove all build outputs. Leaves sources, scripts, and the leanclr
# submodule intact.
# Run from the repo root.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$REPO_ROOT"
rm -rf build build-master build-web
rm -rf src/generated
rm -rf managed/GodotSharpCompat/Generated
rm -rf project/bin
rm -rf project/leanclr
rm -rf project/obj
rm -f tools/binding_generator/__pycache__
echo "[clean] Removed build directories, generated bindings, C# outputs."