transformation_visualizer/build_web.sh
2026-09-14 10:42:52 +02:00

52 lines
1.7 KiB
Bash
Executable file

#!/bin/bash -eu
PROJECT_NAME="transformation_visualizer"
ASSETS_DIR="src/assets"
RAYLIB_PATH="src/libraries/raylib"
EMSCRIPTEN_SDK_DIR="$HOME/programs/emsdk"
OUT_DIR="build/web"
WEB_SOURCE_PATH="src/web"
if [[ -v 1 ]]; then
if [ "$1" = "DEBUG" ]; then
ODIN_FLAGS="-debug"
EMCC_FLAGS="-O0 -g"
elif [ "$1" = "RELEASE" ]; then
ODIN_FLAGS="-o:size"
EMCC_FLAGS="-O2"
else
echo "Usage: <script> <DEBUG/RELEASE>"
exit 1
fi
else
echo "Usage: <script> <DEBUG/RELEASE>"
exit 1
fi
WASM_OBJ_NAME="transformation_visualizer.wasm.obj"
rm -rf $OUT_DIR
mkdir -p $OUT_DIR
export EMSDK_QUIET=1
[[ -f "$EMSCRIPTEN_SDK_DIR/emsdk_env.sh" ]] && . "$EMSCRIPTEN_SDK_DIR/emsdk_env.sh"
# Note RAYLIB_WASM_LIB=env.o -- env.o is an internal WASM object file. You can
# see how RAYLIB_WASM_LIB is used inside <odin>/vendor/raylib/raylib.odin.
#
# The emcc call will be fed the actual raylib library file. That stuff will end
# up in env.o
ODIN_DEFINES="-define:RAYLIB_WASM_LIB=env.o -define:RAYGUI_WASM_LIB=env.o"
odin build src/web/ -target:js_wasm32 -target-features:simd128 -build-mode:obj $ODIN_DEFINES $ODIN_FLAGS -out:$OUT_DIR/$WASM_OBJ_NAME
cp ${WEB_SOURCE_PATH}/odin.js $OUT_DIR
# TODO (synthas): Investigate why emcc's size optimization flag causes a linker error on itch.io
EMCC_SETTINGS="-sEXPORTED_RUNTIME_METHODS=['HEAPF32'] -sUSE_GLFW=3 -sWARN_ON_UNDEFINED_SYMBOLS=0"
EMCC_FILES="$OUT_DIR/$WASM_OBJ_NAME $RAYLIB_PATH/wasm/libraylib.a $RAYLIB_PATH/wasm/libraygui.a"
emcc -o $OUT_DIR/index.html $EMCC_FLAGS $EMCC_FILES $EMCC_SETTINGS --shell-file $WEB_SOURCE_PATH/index_template.html --preload-file src/assets
rm -f $OUT_DIR/$WASM_OBJ_NAME
zip -r $OUT_DIR/${PROJECT_NAME}.zip $OUT_DIR
echo "Web build created in ${OUT_DIR}"