#!/usr/bin/env bash # Compila o OpenTTD do fredygames.com: OpenTTD 15.3 (GPL-2.0) em WebAssembly, pelo alvo Emscripten do # proprio projeto (os/emscripten), com o Emscripten 6.0.10, e embute os conjuntos basicos livres # OpenGFX 8.0 (graficos, GPL-2.0) e OpenSFX 1.0.3 (sons, CC BY-SA 3.0). Este script e o patch 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/openttd-15.3/openttd.{js,wasm,data}, que o bundle.yaml do jogo confere pelo # SHA-256. Tambem precisa de cmake e de um compilador C++ do sistema, para as ferramentas que geram # codigo e os arquivos de idioma (strgen, settingsgen...), que rodam na maquina e nao entram no jogo. # # O README do alvo Emscripten do OpenTTD usa o Emscripten 3.1.57 (imagem Docker); aqui e o 6.0.10, o # mesmo dos outros jogos do site, sem Docker. # # openttd-fredygames.patch: # - o jogo roda offline: _network_available = false no Emscripten (network.cpp), entao o servico de # conteudo online (BaNaNaS), a lista de servidores e o coordenador de partidas em rede nao se # conectam ao openttd.org (os botoes avisam "rede indisponivel"); pre.js sem o proxy WebSocket; # - a pergunta da pesquisa anonima de uso nao aparece (sem HTTP no Emscripten, nada seria enviado); # - som pelo SDL (-ssdl) no lugar de nenhum (-snull); a musica continua desligada (o OpenMSX e MIDI e # o navegador nao tem sintetizador); # - a porta da liblzma (os/emscripten/ports/liblzma.py, do proprio OpenTTD) e usada pelo caminho, sem # copiar para dentro do emsdk; # - random_func.cpp usa HEAPU8 direto (o Emscripten atual nao exporta mais Module.HEAPU8; sem isso # o jogo trava ao gerar um mapa novo); # - portugues do Brasil alem do ingles (a fonte em sprites do OpenGFX cobre os acentos); no primeiro # inicio o idioma vem da pagina (Module.openttdLang -> LANG). # Os conjuntos basicos vao, como os .tar publicados, para baseset/ antes de ligar, e entram no # openttd.data junto do resto (o alvo web original baixava o OpenGFX do openttd.org no primeiro # inicio). set -euo pipefail VERSION=15.3 EMSCRIPTEN=6.0.10 OPENTTD_SHA256=5ea21eea7d59c78a42071924ac18c6bc0116088f2e96b14cfee9369175973be7 OPENGFX_SHA256=43a0c1dabf39cb865394f3a6cc36d4da5c10ecfaaf55652043104806810903be OPENSFX_SHA256=e0a218b7dd9438e701503b0f84c25a97c1c11b7c2f025323fb19d6db16ef3759 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/openttd-$VERSION" jobs="$(sysctl -n hw.ncpu 2>/dev/null || nproc)" 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" fetch() { # url arquivo sha256 [ -f "$out/$2" ] || curl -fsSL "$1" -o "$out/$2" echo "$3 $out/$2" | shasum -a 256 -c - } fetch "https://cdn.openttd.org/openttd-releases/$VERSION/openttd-$VERSION-source.tar.xz" \ "openttd-$VERSION-source.tar.xz" "$OPENTTD_SHA256" fetch https://cdn.openttd.org/opengfx-releases/8.0/opengfx-8.0-all.zip opengfx-8.0-all.zip "$OPENGFX_SHA256" fetch https://cdn.openttd.org/opensfx-releases/1.0.3/opensfx-1.0.3-all.zip opensfx-1.0.3-all.zip "$OPENSFX_SHA256" # O rev.cpp do OpenTTD grava a data da compilacao (__DATE__ __TIME__); o clang usa esta no lugar do # relogio, a data do release 15.3, e a saida fica igual a cada build. export SOURCE_DATE_EPOCH=1775332620 rm -rf "$out/source" "$out/build-host" "$out/build" mkdir -p "$out/source" "$out/build-host" "$out/build" tar -xJf "$out/openttd-$VERSION-source.tar.xz" -C "$out/source" --strip-components 1 patch -d "$out/source" -p1 --no-backup-if-mismatch < "$here/openttd-fredygames.patch" # Ferramentas da maquina (strgen, settingsgen...), com o compilador do sistema. ( cd "$out/build-host" env -u CC -u CXX cmake ../source -DOPTION_TOOLS_ONLY=ON -DCMAKE_BUILD_TYPE=Release > cmake.log make -j"$jobs" tools > make.log ) # Os cabecalhos da zlib e da libpng so entram no sysroot quando as portas sao compiladas. embuilder build zlib libpng sdl2 cd "$out/build" emcmake cmake ../source -DHOST_BINARY_DIR=../build-host -DCMAKE_BUILD_TYPE=Release \ -DOPTION_USE_ASSERTS=OFF > cmake.log # Os conjuntos basicos entram no openttd.data (--preload-file baseset), com a data dos arquivos fixa. mkdir -p baseset unzip -p "$out/opengfx-8.0-all.zip" opengfx-8.0.tar > baseset/opengfx-8.0.tar unzip -p "$out/opensfx-1.0.3-all.zip" opensfx-1.0.3.tar > baseset/opensfx-1.0.3.tar emmake make -j"$jobs" openttd > make.log cp openttd.js openttd.wasm openttd.data "$out/" shasum -a 256 "$out/openttd.js" "$out/openttd.wasm" "$out/openttd.data"