#!/usr/bin/env bash # Compila o Numpty Physics do fredygames.com: o jogo de desenhar e resolver puzzles de fisica de Tim Edmonds # e Thomas Perl (codigo GPL-3.0-or-later; Box2D e tinyxml2 sob a licenca zlib; stb de dominio publico; # vmath BSD-3-Clause) em WebAssembly, com o Emscripten 6.0.10 e o SDL 1.2 do proprio Emscripten # (-sUSE_SDL=1; nao ha porta de biblioteca a parte: o jogo usa o stb_truetype e o stb_image para fontes # e imagens, e o OpenGL ES 2 do navegador). Este script e o patch fazem parte do codigo-fonte publicado # junto do jogo. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-numpty-physics.sh # # Fonte: o tarball upstream 0.3.10 como o Debian o publica (numptyphysics_0.3.10.orig.tar.gz, # deb.debian.org), conferido pelo SHA-256 e guardado em artifacts/cache/numpty-physics/. O site hospeda esse # tarball sem o data/femkeklaver.ttf (numptyphysics-0.3.10-pruned.tar.gz). O script aceita os dois e apaga o # arquivo de qualquer forma; o resultado e o mesmo. Na pasta de fontes do site, o script acha o tarball e o # patch ao lado dele. # # O jogo ja traz a plataforma "emscripten" (platform/emscripten, com o renderizador SDL1 + stb + GLES2); o # makefile dele nao e usado: o script compila a mesma lista de fontes que o makefile reuniria (src/, # platform/{emscripten,sdlstb,gl}, external/{thp,tinyxml2,petals_log,stb_loader}, glaserl e o Box2D). # numpty-physics-fredygames.patch (so com __EMSCRIPTEN__ ou na plataforma emscripten): # - os pilotos/niveis/gravacoes do usuario ficam em /home/web_user/.numptyphysics, que a pagina guarda no # IndexedDB (o upstream aponta para uma pasta que nao existe); # - a ajuda nao mostra o botao com o endereco do projeto (uma pagina nao abre o navegador). # A pasta data/ vai num numptyphysics.data que o proprio Emscripten carrega (--preload-file), sem # data/femkeklaver.ttf: uma fonte sem licenca no pacote e que o jogo nem usa (ele usa so a # SourceSansPro-Light.ttf, da Adobe, SIL Open Font License 1.1, sem mudancas). # # Saida: artifacts/build/numpty-physics-0.3.10/numptyphysics.{js,wasm,data}, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail VERSION=0.3.10 SRC_SHA256=b92f012f5b737be15e07aa702673a14271a0a0ae698041eaf1dea6ba8f0fb2e5 PRUNED_SHA256=f20199b77e1199e5eefddfb3729be69377e16a793f97cc4ed0fee822e6a0b706 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/numpty-physics-$VERSION" cache="$root/artifacts/cache/numpty-physics" tarball="numptyphysics_$VERSION.orig.tar.gz" pruned="numptyphysics-$VERSION-pruned.tar.gz" if ! emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN "; then echo "Precisa do Emscripten $EMSCRIPTEN no PATH (source /emsdk_env.sh)." >&2 exit 1 fi # Arquivo auxiliar: em numpty-physics/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/numpty-physics/$1" ]; then echo "$here/numpty-physics/$1"; else echo "$here/$1"; fi } if [ -f "$here/$pruned" ]; then src_tar="$here/$pruned" echo "$PRUNED_SHA256 $src_tar" | shasum -a 256 -c - >&2 elif [ -f "$here/$tarball" ]; then src_tar="$here/$tarball" echo "$SRC_SHA256 $src_tar" | shasum -a 256 -c - >&2 else src_tar="$cache/$tarball" if [ ! -f "$src_tar" ]; then mkdir -p "$cache" curl -fsSL -o "$src_tar.part" "https://deb.debian.org/debian/pool/main/n/numptyphysics/$tarball" mv "$src_tar.part" "$src_tar" fi echo "$SRC_SHA256 $src_tar" | shasum -a 256 -c - >&2 fi rm -rf "$out" mkdir -p "$out" tar xzf "$src_tar" -C "$out" s="numptyphysics-$VERSION" patch -d "$out/$s" -p1 --quiet --no-backup-if-mismatch < "$(aux numpty-physics-fredygames.patch)" rm -f "$out/$s/data/femkeklaver.ttf" # Compila de dentro da pasta do jogo, com caminhos relativos. ( cd "$out/$s" inc=(-Isrc -Iplatform/emscripten -Iplatform/sdlstb -Iplatform/gl -Iexternal/thp -Iexternal/tinyxml2 -Iexternal/petals_log -Iexternal/vmath -Iexternal/stb_loader -Iexternal/Box2D/Include -Iexternal/glaserl) box2d=$(sed -n '/^SOURCES = /,/b2BroadPhase.cpp/p' external/Box2D/Source/Makefile \ | grep -o '\./[A-Za-z/0-9]*\.cpp' | sed 's|^\./|external/Box2D/Source/|') cpp="$(LC_ALL=C ls src/*.cpp) platform/emscripten/OsEmscripten.cpp platform/sdlstb/SDLSTBRenderer.cpp \ platform/gl/GLRenderer.cpp $(LC_ALL=C ls external/thp/*.cpp) external/tinyxml2/tinyxml2.cpp \ external/petals_log/petals_log.cpp external/stb_loader/stb_loader.cpp $box2d" mkdir "$out/obj" for f in $cpp; do em++ -std=c++11 -O2 -w -ffile-prefix-map="$out/=" "${inc[@]}" -DUSE_OPENGL_ES -DEMSCRIPTEN -sUSE_SDL=1 \ -DAPP='"numptyphysics"' -DVERSION='"'$VERSION'"' -c "$f" -o "$out/obj/$(echo "$f" | tr / _).o" done for f in $(LC_ALL=C ls external/glaserl/*.c); do emcc -O2 -w -ffile-prefix-map="$out/=" "${inc[@]}" -DUSE_OPENGL_ES -DEMSCRIPTEN -sUSE_SDL=1 \ -c "$f" -o "$out/obj/$(echo "$f" | tr / _).o" done em++ -O2 $(LC_ALL=C ls "$out"/obj/*.o) -sUSE_SDL=1 -sFULL_ES2=1 -sMIN_WEBGL_VERSION=1 -sMAX_WEBGL_VERSION=2 \ -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=64MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 -lidbfs.js \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file data -o "$out/numptyphysics.js" rm -rf "$out/obj" ) shasum -a 256 "$out/numptyphysics.js" "$out/numptyphysics.wasm" "$out/numptyphysics.data"