#!/usr/bin/env bash # Compila o Gigalomania do fredygames.com: o jogo de estrategia em tempo real de Mark Harman (codigo sob a # GPL-2.0-or-later; graficos, sons e musicas itemizados, cada um sob uma licenca livre, no readme.html do # jogo e no debian/copyright) em WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 2.32.10, SDL2_image # 2.6.0 (libpng 1.6.58, libjpeg 9f, zlib 1.3.2) e SDL2_mixer 2.8.0 (libogg 1.3.5, libvorbis 1.3.7) dele. # 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-gigalomania.sh # # Fonte: o tarball upstream 1.0.1 como o Debian o publica (gigalomania_1.0.1+ds1.orig.tar.xz, # deb.debian.org; hospedado aqui como gigalomania-1.0.1-ds1.orig.tar.xz). E a arvore da tag v1.0.1 do repositorio do autor sem as pastas amigaos4/, android/, # aros/ e TinyXML/ (o Debian as tira; as tres primeiras so servem a outras plataformas). O TinyXML 2.6.2 # (licenca zlib) que o jogo usa e restaurado do tarball oficial (tinyxml_2_6_2.tar.gz, SourceForge); sao # os mesmos quatro arquivos da tag, que so acrescenta "#define TIXML_USE_STL" em tinyxml.h, o que o # build faz com -DTIXML_USE_STL. Os dois tarballs sao conferidos pelo SHA-256 e guardados em # artifacts/cache/gigalomania/ (o site hospeda os mesmos arquivos). Na pasta de fontes do site, o script # acha os tarballs e o patch ao lado dele. # # gigalomania-fredygames.patch (so com __EMSCRIPTEN__): # - o laco principal devolve a vez ao navegador a cada quadro (o build usa Asyncify); # - fredygames_save(), que a pagina chama quando a aba some ou fecha: o jogo salva o estado da partida # (autosave.sav) ao sair, e a pagina leva isso ao IndexedDB. # O jogo escolhe os caminhos do Linux (pasta $HOME/.config/gigalomania para os saves) pelo macro __linux, # que o Emscripten nao define: o build o define (-D__linux=1). Roda em janela ("windowed"; a pagina passa # o argumento). O codigo e C++ antigo (register): -std=gnu++14. gfx/, islands/, music/ e sound/ vao num # gigalomania.data que o proprio Emscripten carrega (--preload-file), na raiz, que e a pasta de trabalho # do jogo. # # Saida: artifacts/build/gigalomania-1.0.1/gigalomania.{js,wasm,data}, que o bundle.yaml do jogo confere # pelo SHA-256. set -euo pipefail VERSION=1.0.1 SRC_SHA256=3addd1d6330dd49dd6a0f343b808a4513305c35759948aadb19790c4f78f72f3 TINYXML_SHA256=15bdfdcec58a7da30adc87ac2b078e4417dbe5392f3afb719f9ba6d062645593 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/gigalomania-$VERSION" cache="$root/artifacts/cache/gigalomania" tarball="gigalomania_$VERSION+ds1.orig.tar.xz" localname="gigalomania-$VERSION-ds1.orig.tar.xz" # o site hospeda o arquivo sem o "+" no nome tinyxml="tinyxml_2_6_2.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 gigalomania/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/gigalomania/$1" ]; then echo "$here/gigalomania/$1"; else echo "$here/$1"; fi } # fetch : usa o arquivo ao lado do script, ou baixa para o cache. fetch() { local file="$here/$(basename "$2")" if [ ! -f "$file" ]; then file="$2" if [ ! -f "$file" ]; then mkdir -p "$(dirname "$file")" curl -fsSL -o "$file.part" "$1" mv "$file.part" "$file" fi fi echo "$3 $file" | shasum -a 256 -c - >&2 echo "$file" } src_tar="$(fetch "https://deb.debian.org/debian/pool/main/g/gigalomania/$tarball" "$cache/$localname" "$SRC_SHA256")" tx_tar="$(fetch "https://downloads.sourceforge.net/project/tinyxml/tinyxml/2.6.2/$tinyxml" "$cache/$tinyxml" "$TINYXML_SHA256")" rm -rf "$out" mkdir -p "$out" tar xJf "$src_tar" -C "$out" s="gigalomania-$VERSION+ds1" mkdir "$out/$s/TinyXML" "$out/tinyxml-src" tar xzf "$tx_tar" -C "$out/tinyxml-src" for f in tinyxml.cpp tinyxml.h tinyxmlerror.cpp tinyxmlparser.cpp; do cp "$out/tinyxml-src/tinyxml/$f" "$out/$s/TinyXML/$f" done rm -rf "$out/tinyxml-src" patch -d "$out/$s" -p1 --quiet --no-backup-if-mismatch < "$(aux gigalomania-fredygames.patch)" # Compila de dentro da pasta do jogo, com caminhos relativos: o carregador do gigalomania.data guarda o # nome que o arquivo tem aqui. ( cd "$out/$s" ports=(-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png","jpg"]' -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["ogg"]') mkdir "$out/obj" for f in game gamestate gui image main panel player resources screen sector sound tutorial utils \ TinyXML/tinyxml TinyXML/tinyxmlerror TinyXML/tinyxmlparser; do em++ -O2 -w -std=gnu++14 -D__linux=1 -DTIXML_USE_STL "${ports[@]}" \ -c "$f.cpp" -o "$out/obj/$(echo "$f" | tr / _).o" done em++ -O2 $(LC_ALL=C ls "$out"/obj/*.o) "${ports[@]}" -lidbfs.js \ -sASYNCIFY -sSTACK_SIZE=1MB -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=128MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_FUNCTIONS=_main,_fredygames_save \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file gfx --preload-file islands --preload-file music --preload-file sound \ -o "$out/gigalomania.js" rm -rf "$out/obj" ) shasum -a 256 "$out/gigalomania.js" "$out/gigalomania.wasm" "$out/gigalomania.data"