#!/usr/bin/env bash # Compila o Atc do fredygames.com (o simulador de controle de trafego aereo de Ed James, UC Berkeley, 1987, # da colecao bsd-games 2.17; licenca BSD e o aviso de Ed James) em WebAssembly com o Emscripten 6.0.10, sobre # a camada de terminal de curses-web/ (curses desenhado num canvas; ver curses-web/README.md). # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-atc.sh # # Fonte: bsdgames_2.17.orig.tar.gz do Debian (bsdgames/common.sh). O analisador dos arquivos de aeroporto sai # do grammar.y e do lex.l do jogo (bison 3.8.2 de artifacts/tools e flex 2.6.4). atc/atc-fredygames.patch (so # ativo no navegador): sem shell (!), sem tty, e as teclas vem da pagina; atc/atc.web.c faz o papel do SIGALRM # (setitimer/alarm so guardam o prazo e o atc_getchar roda o update() quando ele vence enquanto espera uma # tecla). Opcoes de compilacao da colecao: -DBSD -DYY_NO_UNPUT. Os aeroportos ficam em /atc-games (dentro do # .data) e o arquivo de recordes em /atc-saves/atc_score (a pagina guarda a pasta no IndexedDB). # # Saida: artifacts/build/atc-2.17/atc.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" . "$here/bsdgames/common.sh" bsdgames_init "$here" . "$here/curses-web/flags.sh" out="$root/artifacts/build/atc-$BSDGAMES_VERSION" bison="$root/artifacts/tools/bison-3.8.2/bin/bison" [ -x "$bison" ] || bison=bison rm -rf "$out" mkdir -p "$out/work/obj" "$out/work/src" "$out/root" S="$out/work/src" tar xzf "$tarball" -C "$S" --strip-components=1 bsd-games-$BSDGAMES_VERSION/atc bsd-games-$BSDGAMES_VERSION/COPYING patch -d "$S" -p1 --no-backup-if-mismatch < "$here/atc/atc-fredygames.patch" >&2 A="$S/atc" sed 's|@atc_dir@|/atc-games|; s|@atc_scorefile@|/atc-saves/atc_score|' "$A/pathnames.h.in" > "$A/pathnames.h" (cd "$A" && "$bison" -y -d grammar.y -o grammar.c && flex -o lex.c lex.l) objs=() for f in "$A"/*.c "$here/bsdgames/compat.c" "$here/atc/atc.web.c" "$CW_DIR/curses.c"; do o="$out/work/obj/$(basename "$f").o" objs+=("$o") emcc "${CW_CFLAGS[@]}" -DBSD -DYY_NO_UNPUT -ffile-prefix-map="$out/work/=" -ffile-prefix-map="$CW_DIR/=curses-web/" \ -ffile-prefix-map="$here/=" -I"$A" -I"$here/bsdgames" -c "$f" -o "$o" done mkdir -p "$out/root/games" cp "$A"/games/* "$out/root/games/" rm -f "$out/root/games/Makefrag" # Liga de dentro da pasta dos dados, com caminhos relativos (o carregador do .data guarda o nome daqui). ( cd "$out/root" emcc "${objs[@]}" "${CW_LDFLAGS[@]}" --preload-file games@/atc-games -o ../atc.js ) rm -rf "$out/work" "$out/root" shasum -a 256 "$out/atc.js" "$out/atc.wasm" "$out/atc.data"