#!/usr/bin/env bash # Compila o HyperRogue do fredygames.com: HyperRogue 13.1o (GPL-2.0-or-later) em WebAssembly, pelo # alvo web do proprio projeto (mymake -web), com o Emscripten 6.0.10. Este script e os patches ao lado # dele sao parte do codigo-fonte publicado junto do jogo ("the scripts used to control compilation" # da GPL). # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # ./build.sh # # Saida: artifacts/build/hyperrogue-13.1o/hyper.{js,wasm}, que o bundle.yaml do jogo confere pelo # SHA-256. Tambem precisa de um compilador C++ do sistema (c++), para o mymake e para as duas # ferramentas que geram codigo (langen e makeh), que rodam na maquina e nao entram no jogo. # # Patches (aplicados em ordem): # - hyperrogue-mymake-emscripten.patch: o mymake chama o em++ do PATH e usa # EXPORTED_RUNTIME_METHODS (o EXTRA_ virou erro no Emscripten atual); # - hyperrogue-web-build.patch: o alvo web nao compilava mais (tres trechos que usavam coisas que # so existem com SDL_ttf, audio ou threads); # - hyperrogue-fredygames.patch: sair do jogo grava o placar/jogo salvo e avisa a pagina, e a tela # ocupa o quadro inteiro. # Opcoes de compilacao alem das do mymake -web: # - CAP_SAVE=1 e CAP_CONFIG=1: placares, jogo salvo (Orbe da Seguranca) e configuracao, que o alvo # web deixava de fora; a pagina guarda os arquivos no IndexedDB; # - CAP_SDLJOY=1: controles (gamepads) pela API de joystick do SDL do Emscripten; sem ela o alvo # web tambem nao compila; # - -lidbfs.js: sistema de arquivos no IndexedDB. # O alvo web ja deixa de fora som e musica (CAP_AUDIO), as fontes TTF (usa a tabela embutida em # nofont.cpp, desenhada a partir da DejaVu Sans Bold), PNG, threads, conquistas e o modo diario. # A zlib que o Emscripten compila junto (1.3.2) e o proprio Emscripten (libc e runtime) estao # publicados ao lado deste script. set -euo pipefail VERSION=13.1o EMSCRIPTEN=6.0.10 SHA256=a03485097ac75acdb28f7aeb9ce767735e07a9c8c65f21f51ca6b03fa532230f URL="https://github.com/zenorogue/hyperrogue/archive/refs/tags/v$VERSION.tar.gz" here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/hyperrogue-$VERSION" 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 mkdir -p "$out" tarball="$out/hyperrogue-$VERSION.tar.gz" if [ ! -f "$tarball" ]; then curl -fsSL "$URL" -o "$tarball" fi echo "$SHA256 $tarball" | shasum -a 256 -c - rm -rf "$out/source" mkdir -p "$out/source" tar -xzf "$tarball" -C "$out/source" --strip-components 1 for patch in hyperrogue-mymake-emscripten hyperrogue-web-build hyperrogue-fredygames; do patch -d "$out/source" -p1 --no-backup-if-mismatch < "$here/$patch.patch" done # Os cabecalhos da zlib so entram no sysroot quando a porta e compilada; o mymake compila antes de # ligar, entao ela vem primeiro. embuilder build zlib cd "$out/source" c++ -O2 -std=c++14 mymake.cpp -pthread -o mymake ./mymake -web -O2 -DCAP_SAVE=1 -DCAP_CONFIG=1 -DCAP_SDLJOY=1 -lidbfs.js -o hyper.js cp hyper.js hyper.wasm "$out/" shasum -a 256 "$out/hyper.js" "$out/hyper.wasm"