#!/usr/bin/env bash # Compila o xNetHack do fredygames.com (a variante do NetHack 3.7 de Copperwater e colaboradores, sob a # NetHack General Public License) em WebAssembly, com a interface de terminal (tty) do proprio jogo, o # Emscripten 6.0.10 e o Lua 5.4.8 (MIT) que o jogo embute. 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-xnethack.sh # # Fonte: o tarball do commit 6eef394 de github.com/copperwater/xNetHack (versao 10.0.0), conferido pelo # SHA-256 e guardado em artifacts/cache/xnethack/ (o site hospeda o mesmo arquivo), e o Lua de lua.org. # Na pasta de fontes do site, o script acha os tarballs e o patch ao lado dele. # # Como compila: o proprio Makefile do jogo (o alvo CROSS_TO_WASM=1 da 3.7, que roda o makedefs e gera os # dados no Mac/Linux e compila o resto com o emcc). O patch troca a interface do alvo: o tty no lugar do # window port "shim" (JavaScript) que o alvo traz. xnethack-fredygames.patch: # - sys/unix/fredytc.c e sys/unix/fredyterm/: um termcap minimo, que responde as chamadas do tty como um # terminal ANSI de 80x26 e 16 cores, e le as teclas da pagina (Asyncify). Quem desenha a tela e a # play.html; # - cross-pre2.500: flags do Emscripten (Asyncify, IDBFS, dados num nethack.data que o proprio Emscripten # carrega), tty no lugar do shim, unixmain.c no lugar do libnhmain.c, sem -Werror; # - unixunix.c e wintty.c: o jogo nao exige mais um tty de verdade na entrada; # - sysconf: "web_user" entre os nomes genericos (o jogo pergunta o nome do personagem); # - date.c: a data da versao e a do commit, nao a da compilacao (build reprodutivel; TZ=UTC). # # Saida: artifacts/build/xnethack-10.0.0/nethack.{js,wasm,data}, que o bundle.yaml do jogo confere pelo # SHA-256. set -euo pipefail export TZ=UTC LC_ALL=C VERSION=10.0.0 COMMIT=6eef39403f16f65e13f5d57242ee8d036307687a SRC_SHA256=32bd5d0ca69204168edddfe3daf7dfd94264c81687df2eed334824dac4147c97 LUA_VERSION=5.4.8 LUA_SHA256=4f18ddae154e793e46eeab727c59ef1c0c0c2b744e7b94219710d76f530629ae 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/xnethack-$VERSION" cache="$root/artifacts/cache/xnethack" 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 aux() { if [ -f "$here/xnethack/$1" ]; then echo "$here/xnethack/$1"; else echo "$here/$1"; fi } fetch() { # arquivo url sha256 [pasta-local] local f="$1" if [ -f "$here/$f" ]; then f="$here/$f"; else f="$cache/$f" if [ ! -f "$f" ]; then mkdir -p "$cache"; curl -fsSL -o "$f.part" "$2"; mv "$f.part" "$f"; fi fi echo "$3 $f" | shasum -a 256 -c - >&2 echo "$f" } src_tar="$(fetch xnethack-6eef394.tar.gz "https://github.com/copperwater/xNetHack/archive/$COMMIT.tar.gz" "$SRC_SHA256")" lua_tar="$(fetch lua-$LUA_VERSION.tar.gz "https://www.lua.org/ftp/lua-$LUA_VERSION.tar.gz" "$LUA_SHA256")" rm -rf "$out" mkdir -p "$out/work" tar xzf "$src_tar" -C "$out/work" G="$out/work/xNetHack-$COMMIT" mkdir -p "$G/lib" tar xzf "$lua_tar" -C "$G/lib" patch -d "$G" -p1 --no-backup-if-mismatch < "$(aux xnethack-fredygames.patch)" >&2 ( cd "$G/sys/unix" ./setup.sh hints/macOS.500 >&2 cd ../.. mkdir -p targets/wasm/wasm-data make CROSS_TO_WASM=1 all -j"${JOBS:-1}" >&2 ) cp "$G/targets/wasm/nethack.js" "$G/targets/wasm/nethack.wasm" "$G/targets/wasm/nethack.data" "$out/" rm -rf "$out/work" shasum -a 256 "$out/nethack.js" "$out/nethack.wasm" "$out/nethack.data"