#!/usr/bin/env bash # Compila The Legend of Tuna (karl-zylinski/the-legend-of-tuna, MIT; Odin + raylib 5.5 + Box2D 3) do commit 069553d # para o fredygames.com, seguindo o build_web.sh do proprio repositorio: # odin build source/main_web -target:js_wasm32 -build-mode:obj -define:RAYLIB_WASM_LIB=env.o -o:speed # emcc main_web.c game.wasm.o /vendor/raylib/wasm/libraylib.a source/box2d/lib/box2d_wasm.o ... # com o Odin dev-2025-01 (Builds/odin/install-odin.sh; o vendor:raylib dele traz a libraylib.a da web, raylib 5.5) e o # Emscripten 6.0.10. Diferencas: a pagina e nossa (the-legend-of-tuna/shell.html + host.js, sem script inline nem # pedidos fora do site); sem -sASSERTIONS e com -sEXPORTED_RUNTIME_METHODS=HEAPF32 (o miniaudio do raylib 5.5 le Module.HEAPF32, # que o Emscripten 6 nao exporta mais por padrao); os caminhos desta maquina nao entram no # binario: o Odin grava o caminho absoluto dos fontes, que odin/scrub-paths.py troca por barras + "odin/" ou "tuna/", # do mesmo tamanho); o atlas.png/atlas.odin ja gerados no repositorio sao usados como estao (o atlas_builder nao roda). O # box2d_wasm.o e o que o autor publicou no repositorio (Box2D 3.0.0, MIT). Uma mudanca no jogo: # the-legend-of-tuna/no-quit-on-web.patch tira do menu o item "No More Tuna!" (fecha a janela, o que no navegador so # congela o jogo). # O Odin dev-2025-01 NAO gera objetos reproduziveis (dois builds do mesmo fonte diferem em alguns bytes, mesmo com # -thread-count:1): como no TeaVM, o sha256 do bundle.yaml fica pinado na saida testada em artifacts/build/, e um # rebuild exige atualizar o sha256 e testar de novo. # # src/FredGames.Bundler/Builds/build-the-legend-of-tuna.sh # # Saida: artifacts/build/the-legend-of-tuna-069553d/{the-legend-of-tuna-069553d-dist.tar.gz,licenses.txt} set -euo pipefail COMMIT=069553d16fd796597620dc323e97aa2c78c7d1c2 SHA256=11c92646ac01a82977346b4e75868ebbd5a19aeaa47229e21aa25b7fe60c914f ODIN_VERSION=dev-2025-01 EMSCRIPTEN=6.0.10 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/the-legend-of-tuna-${COMMIT:0:7}" cache="$root/artifacts/build/cache" odin_dir="$("$here/odin/install-odin.sh" "$ODIN_VERSION" | head -1)" [ -x "$odin_dir/odin" ] || odin_dir="$root/artifacts/tools/odin-$ODIN_VERSION" ODIN="$odin_dir/odin" if ! emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN "; then [ -f "$root/artifacts/tools/emsdk/emsdk_env.sh" ] && source "$root/artifacts/tools/emsdk/emsdk_env.sh" >/dev/null 2>&1 fi emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN " || { echo "Precisa do Emscripten $EMSCRIPTEN no PATH." >&2; exit 1; } mkdir -p "$cache" tgz="$cache/the-legend-of-tuna-${COMMIT:0:7}.tar.gz" [ -f "$tgz" ] || curl -fsSL --retry 4 "https://github.com/karl-zylinski/the-legend-of-tuna/archive/$COMMIT.tar.gz" -o "$tgz" echo "$SHA256 $tgz" | shasum -a 256 -c - >/dev/null rm -rf "$out"; mkdir -p "$out/tree" "$out/dist" tar -xzf "$tgz" -C "$out/tree" --strip-components 1 cd "$out/tree" patch -p1 --no-backup-if-mismatch < "$here/the-legend-of-tuna/no-quit-on-web.patch" > /dev/null "$ODIN" build source/main_web -target:js_wasm32 -build-mode:obj -define:RAYLIB_WASM_LIB=env.o -o:speed \ -out:"$out/game" > "$out/odin.log" 2>&1 || { cat "$out/odin.log"; exit 1; } python3 -I "$here/odin/scrub-paths.py" "$out/game.wasm.o" "$odin_dir=odin" "$out/tree=tuna" mkdir -p "$out/data"; cp -R assets "$out/data/assets" find "$out/data" -exec touch -t 202501240000 {} + cp source/main_web/main_web.c source/box2d/lib/box2d_wasm.o "$odin_dir/vendor/raylib/wasm/libraylib.a" "$out/" cp "$here/the-legend-of-tuna/shell.html" "$out/shell.html" ( cd "$out" && emcc -O2 main_web.c game.wasm.o libraylib.a box2d_wasm.o \ -sUSE_GLFW=3 -sWASM_BIGINT -sWARN_ON_UNDEFINED_SYMBOLS=0 -sENVIRONMENT=web -sEXPORTED_RUNTIME_METHODS=HEAPF32 \ --shell-file shell.html --preload-file data/assets@assets -o dist/index.html ) > "$out/emcc.log" 2>&1 \ || { cat "$out/emcc.log"; exit 1; } if grep -rl "$HOME" "$out/dist" >/dev/null; then echo "Caminho desta maquina no build:" >&2; grep -rl "$HOME" "$out/dist" >&2; exit 1; fi cp "$odin_dir/core/sys/wasm/js/odin.js" "$here/the-legend-of-tuna/host.js" "$out/dist/" { echo "== The Legend of Tuna (LICENSE, MIT): ver o LICENSE.txt do jogo no site" echo; echo "== Box2D 3.0.0 (source/box2d/LICENSE, MIT)"; cat source/box2d/LICENSE echo; echo "== raylib 5.5 (vendor/raylib/LICENSE do Odin $ODIN_VERSION, zlib)"; cat "$odin_dir/vendor/raylib/LICENSE" echo; echo "== Odin (LICENSE, BSD-3-Clause: runtime e core:, odin.js)"; cat "$odin_dir/LICENSE" echo; echo "== Source Sans 3 (Adobe, SIL Open Font License 1.1): letras desenhadas no atlas.png (fonts/font.ttf)" echo; echo "== Emscripten (LICENSE, MIT / UIUC)"; cat "$root/artifacts/tools/emsdk/upstream/emscripten/LICENSE" } > "$out/licenses.txt" find "$out/dist" -exec touch -t 202501240000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > files.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T files.txt \ | gzip -n -9 > "the-legend-of-tuna-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) cd "$root"; rm -rf "$out/tree" "$out/data" "$out"/*.o "$out"/*.a "$out/main_web.c" "$out/shell.html" shasum -a 256 "$out/the-legend-of-tuna-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt" "$out"/dist/*