#!/usr/bin/env bash # Compila o Me and My Shadow do fredygames.com: o jogo de quebra-cabeca e plataforma do projeto Me and # My Shadow (codigo GPL-3.0-or-later; graficos, sons, musica, fontes e fases sob CC0, CC BY, CC BY-SA, # OFL, Apache, LGPL e GPL, arquivo por arquivo no data/Credits.txt, nos cabecalhos dos .music e nos # arquivos de licenca dos temas) em WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 2.32.10, # SDL2_image 2.6.0 (libpng 1.6.58, zlib 1.3.2), SDL2_ttf 2.20.2 (FreeType 2.14.3, HarfBuzz 3.2.0) e # SDL2_mixer 2.8.0 (libogg 1.3.5, libvorbis 1.3.7) dele, mais o Lua 5.4.7 (MIT), que os scripts das # fases usam. 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-meandmyshadow.sh # # Fontes: o tarball de fontes da release 0.5a (meandmyshadow-0.5a-src.tar.gz, publicado pelo projeto no # SourceForge; e o mesmo arquivo da tag v0.5a no GitHub) e o lua-5.4.7.tar.gz do lua.org, conferidos # pelo SHA-256 e guardados em artifacts/cache/meandmyshadow/ (o site hospeda os mesmos arquivos). Na # pasta de fontes do site, o script acha os tarballs e o patch ao lado dele. # # Sem CMake: os mesmos arquivos que o CMakeLists.txt compila (src/*.cpp e as bibliotecas embutidas # tinyformat, tinygettext e findlocale), sem libcurl e sem libarchive, que so servem para baixar e # instalar add-ons. data/ vai num meandmyshadow.data que o proprio Emscripten carrega (--preload-file), # em /data, que o jogo acha como ./data/ a partir da raiz. # # meandmyshadow-fredygames.patch (so ativo com __EMSCRIPTEN__): # - sem rede: downloadFile e extractFile so devolvem erro, e a opcao Addons do menu explica que os # add-ons nao existem nesta versao; a opcao "internet" comeca desligada; # - o laco principal devolve a vez ao navegador mesmo quando o quadro atrasou (o build usa Asyncify, e # o SDL_Delay ja cede a vez nos outros casos); # - fredygames_save(), que a pagina chama quando a aba some ou fecha: o jogo so grava as opcoes e as # estatisticas ao sair (o progresso das fases ele grava sozinho). # # Saida: artifacts/build/meandmyshadow-0.5a/meandmyshadow.{js,wasm,data}, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail VERSION=0.5a SRC_SHA256=50f8a910498ed934be0d3b5b313f9fd5606c9cf14283b5eaf15ddffa98d92845 LUA=5.4.7 LUA_SHA256=9fbf5e28ef86c69858f6d3d34eccc32e911c1a28b4120ff3e84aaa70cfbf1e30 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/meandmyshadow-$VERSION" cache="$root/artifacts/cache/meandmyshadow" 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 meandmyshadow/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/meandmyshadow/$1" ]; then echo "$here/meandmyshadow/$1"; else echo "$here/$1"; fi } # Tarball ao lado do script, no cache ou baixado do endereco original; confere o SHA-256. fetch() { local name="$1" url="$2" sha="$3" file if [ -f "$here/$name" ]; then file="$here/$name" else file="$cache/$name" if [ ! -f "$file" ]; then mkdir -p "$cache" curl -fsSL -o "$file.part" "$url" mv "$file.part" "$file" fi fi echo "$sha $file" | shasum -a 256 -c - >&2 echo "$file" } src_tar="$(fetch "meandmyshadow-$VERSION-src.tar.gz" \ "https://downloads.sourceforge.net/project/meandmyshadow/$VERSION/meandmyshadow-$VERSION-src.tar.gz" "$SRC_SHA256")" lua_tar="$(fetch "lua-$LUA.tar.gz" "https://www.lua.org/ftp/lua-$LUA.tar.gz" "$LUA_SHA256")" rm -rf "$out" mkdir -p "$out/obj" tar xzf "$src_tar" -C "$out" tar xzf "$lua_tar" -C "$out" s="meandmyshadow-$VERSION" l="lua-$LUA" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux meandmyshadow-fredygames.patch)" # O config.h que o CMake geraria (sem DATA_PATH: o jogo acha ./data/ a partir da pasta de trabalho). cat > "$out/$s/config.h" <