#!/usr/bin/env bash # Compila o Lierolibre do fredygames.com: o fork livre do Liero (Martin Erik Werner; codigo sob a # BSD-2-Clause, graficos, dados e sons sob a WTFPL, como o COPYING e o debian/copyright do pacote) em # WebAssembly, com o Emscripten 6.0.10 e o SDL 1.2 que ele traz (-sUSE_SDL=1), a libconfig 1.7.3 (LGPL-2.1+, # compilada junto) e a zlib da porta dele. Este script e os patches 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-lierolibre.sh # # Fonte: o lierolibre_0.5.orig.tar.gz do Debian (o tarball da versao 0.5 do upstream, que o projeto publicava no Launchpad), mais os quatro patches # do Debian que a build precisa (unaligned access, outras arquiteturas, aviso de arquitetura e a API nova # da libconfig; ficam em Builds/lierolibre/, nomes originais) e o lierolibre-fredygames.patch, nosso: # - o Boost.Program_options sai: argParse.{hpp,cpp} viram um leitor de argumentos simples (o jogo roda # sem argumentos no navegador; as opcoes -f/-d/-w/-v/-h continuam as mesmas); # - o SDL 1.2 do Emscripten nao tem SDL_WaitEvent, SDL_putenv, Mix_Linked_Version nem superficies de # 8 bits, e so o emscripten_sleep (nao o apelido SDL_Delay) devolve a vez ao navegador no Asyncify: # SDL_WaitEvent vira SDL_PollEvent com emscripten_sleep, a opcao -v fica de fora, a versao do mixer e # fixa, e a tela de 320x200 com paleta e uma superficie feita no jogo (memoria, area de recorte e # paleta; SDL_FillRect, SDL_SetClipRect, SDL_GetClipRect e SDL_SetColors tem versoes proprias para # ela, em gfx.hpp), enquanto a janela de 32 bits e do SDL (lock e unlock em cada quadro, que e quando # o Emscripten copia os pixels para o canvas); # - os sons usam Mix_QuickLoad_RAW (o mixer do Emscripten nao aceita um Mix_Chunk montado a mao); # - tela sempre em 32 bits, 640x400 de partida (a pagina escala), sem tela cheia pelo F5/Alt+Enter # (a pagina tem o proprio botao); # - o iterador de diretorios (codigo derivado do Boost.Filesystem, BSL-1.0) usa o dirent tambem aqui; # - fredygames_save(), que a pagina chama quando a aba some ou fecha: o jogo so grava as opcoes ao sair. # config.h: so o titulo da janela, escrito aqui. As excecoes de C++ sao as do JavaScript (-fexceptions), # as que o Asyncify aceita. # # Os dados que vao ao navegador: LIERO.CHR, LIERO.DAT, LIERO.OPT, LIERO.SND, NAMES.DAT e liero.cfg, de # data/ do tarball, sem mudanca. O LIERO.TXT/LIEROENG.TXT (licenca freeware antiga, que o COPYING diz # nao valer mais) e os fontes de graficos e sons (graphics/, sounds/) ficam de fora do jogo, mas o # tarball do fonte hospedado os traz. # # Saida: artifacts/build/lierolibre-0.5/lierolibre.{js,wasm,data}, que o bundle.yaml do jogo confere pelo # SHA-256. set -euo pipefail VERSION=0.5 SRC_SHA256=ba0fd3c32e9592cb922768a8c9b59b85b796848d53b582b09b33452538bb9c36 LC_VERSION=1.7.3 LC_SHA256=545166d6cac037744381d1e9cc5a5405094e7bfad16a411699bcff40bbb31ee7 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/lierolibre-$VERSION" cache="$root/artifacts/cache/lierolibre" 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 lierolibre/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/lierolibre/$1" ]; then echo "$here/lierolibre/$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/l/lierolibre/lierolibre_$VERSION.orig.tar.gz" \ "$cache/lierolibre_$VERSION.orig.tar.gz" "$SRC_SHA256")" lc_tar="$(fetch "https://github.com/hyperrealm/libconfig/releases/download/v$LC_VERSION/libconfig-$LC_VERSION.tar.gz" \ "$cache/libconfig-$LC_VERSION.tar.gz" "$LC_SHA256")" rm -rf "$out" mkdir -p "$out" tar xzf "$src_tar" -C "$out" tar xzf "$lc_tar" -C "$out" s="lierolibre-$VERSION" lc="libconfig-$LC_VERSION" for p in 0001-Use-unaligned-access-define-over-checking-arch.patch \ 0002-At-least-try-building-for-other-archs-than-x86.patch \ 0003-Remove-unknown-arch-warning.patch adapt-to-new-libconfig.patch lierolibre-fredygames.patch; do patch -d "$out/$s" -p1 --quiet --no-backup-if-mismatch < "$(aux "$p")" done echo '#define PACKAGE_CAPTION "Lierolibre"' > "$out/$s/src/config.h" # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do lierolibre.data guarda o # nome que o arquivo tem aqui. ( cd "$out" mkdir obj data for f in CHR DAT OPT SND; do cp "$s/data/LIERO.$f" data/; done cp "$s/data/NAMES.DAT" "$s/data/liero.cfg" data/ for f in grammar libconfig scanctx scanner strbuf strvec util; do emcc -O2 -w -ffile-prefix-map="$out/=" -DLIBCONFIG_STATIC -I"$lc/lib" -c "$lc/lib/$f.c" -o "obj/lc_$f.o" done em++ -O2 -fexceptions -w -ffile-prefix-map="$out/=" -DLIBCONFIG_STATIC -I"$lc/lib" -x c++ -c "$lc/lib/libconfigcpp.c++" -o obj/lc_cpp.o cd "$s/src" game=$(LC_ALL=C ls *.cpp controller/*.cpp gfx/*.cpp menu/*.cpp | grep -v boostTesting) gvl="gvl/containers/list.cpp gvl/io/stream.cpp gvl/io/encoding.cpp gvl/io/convert.cpp gvl/math/ieee.cpp gvl/math/tt800.cpp gvl/resman/shared.cpp gvl/support/debug.cpp gvl/support/hash.cpp gvl/support/log.cpp gvl/support/profile.cpp" for f in $game $gvl; do em++ -O2 -std=gnu++11 -fexceptions -w -fno-strict-aliasing -ffile-prefix-map="$out/=" -sUSE_SDL=1 -DGVL_LITTLE_ENDIAN=1 \ -I. -I"../../$lc/lib" -c "$f" -o "../../obj/$(echo "$f" | tr / _).o" done emcc -O2 -w -ffile-prefix-map="$out/=" -I. -c gvl/support/bits.c -o ../../obj/gvl_bits.o cd ../.. em++ -O2 -fexceptions $(LC_ALL=C ls obj/*.o) -sUSE_SDL=1 -sUSE_ZLIB=1 -lidbfs.js \ -sASYNCIFY -sASYNCIFY_STACK_SIZE=65536 -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=64MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_FUNCTIONS=_main,_fredygames_save \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file data@/data \ -o lierolibre.js rm -rf obj data ) shasum -a 256 "$out/lierolibre.js" "$out/lierolibre.wasm" "$out/lierolibre.data"