# Funcoes comuns dos scripts Builds/build-.sh dos cartuchos do Vircon32 (use com "." no inicio do script). # Toolchain: Builds/vircon32/install-toolchain.sh. Jogos oficiais: repositorio vircon32/ConsoleSoftware, commit pinado. # # Variaveis do script do jogo: # SLUG nome da pasta de saida (artifacts/build//) # GAME_DIR pasta do jogo dentro de Games/ ou GameDemos/ do ConsoleSoftware (ex.: Games/2048) # MAKE_SH (opcional) script de build do jogo dentro da pasta; padrao Make.sh # OUT_V32 caminho do .v32 gerado dentro da pasta do jogo (ex.: bin/2048.v32) # OUT_NAME nome do arquivo de saida (sem .v32), com o commit # V32_EXTRA_PATH (opcional) pasta de binarios extras no PATH (ex.: o v32lua, de Builds/vircon32/install-v32lua.sh) # Chame v32_build; ele extrai so a pasta do jogo, compila duas vezes, confere que as duas ROMs sao identicas e gera # tambem $OUT_NAME-src.tar.gz (o fonte do cartucho, para hospedar junto). set -euo pipefail V32_CSW_COMMIT=70ed768 V32_CONSOLE_COMMIT=d103e2c191a4896d83e6e567479ce35995801731 V32_CONSOLE_SHA256=1b211bb3b5ff3607420c060d75f219546505af9330dbbfa167ebc714f3ac3814 V32_CONSOLE_NAME=ConsoleSoftware-${V32_CONSOLE_COMMIT:0:7}.tar.gz v32_here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" v32_root="$(git -C "$v32_here" rev-parse --show-toplevel 2>/dev/null || (cd "$v32_here/../../../.." && pwd))" V32_TOOLS="$v32_root/artifacts/tools/vircon32-$V32_CSW_COMMIT/bin" V32_CACHE="$v32_root/artifacts/build/vircon32-$V32_CSW_COMMIT/cache" v32_fetch_console() { [ -x "$V32_TOOLS/compile" ] || "$v32_here/install-toolchain.sh" mkdir -p "$V32_CACHE" V32_TARBALL="$V32_CACHE/$V32_CONSOLE_NAME" [ -f "$V32_TARBALL" ] || curl -fsSL "https://github.com/vircon32/ConsoleSoftware/archive/$V32_CONSOLE_COMMIT.tar.gz" -o "$V32_TARBALL" echo "$V32_CONSOLE_SHA256 $V32_TARBALL" | shasum -a 256 -c - >/dev/null } v32_build() { v32_fetch_console local out="$v32_root/artifacts/build/$SLUG" make_sh="${MAKE_SH:-Make.sh}" i rm -rf "$out/tree1" "$out/tree2" mkdir -p "$out" for i in 1 2; do mkdir -p "$out/tree$i" tar -xzf "$V32_TARBALL" -C "$out/tree$i" --strip-components 1 "*/$GAME_DIR" chmod +x "$out/tree$i/$GAME_DIR"/*.sh ( cd "$out/tree$i/$GAME_DIR" && PATH="$V32_TOOLS:${V32_EXTRA_PATH:+$V32_EXTRA_PATH:}$PATH" bash "$make_sh" >"$out/build$i.log" 2>&1 ) \ || { tail -20 "$out/build$i.log" >&2; echo "Build $i falhou" >&2; exit 1; } done local a b a="$(shasum -a 256 "$out/tree1/$GAME_DIR/$OUT_V32" | cut -d' ' -f1)" b="$(shasum -a 256 "$out/tree2/$GAME_DIR/$OUT_V32" | cut -d' ' -f1)" [ "$a" = "$b" ] || { echo "Dois builds deram ROMs diferentes ($a x $b)" >&2; exit 1; } cp "$out/tree1/$GAME_DIR/$OUT_V32" "$out/$OUT_NAME.v32" # fonte do cartucho (a pasta do jogo sem obj/ e bin/), tar.gz deterministico local files=() f while IFS= read -r -d '' f; do files+=("$f"); done < <(cd "$out/tree1" && find "$GAME_DIR" -type f ! -path '*/obj/*' ! -path '*/bin/*' -print0) python3 -I "$v32_here/../sprig-web/pack-source.py" "$out/$OUT_NAME-src.tar.gz" "$out/tree1" "${files[@]}" rm -rf "$out/tree1" "$out/tree2" echo "$a $out/$OUT_NAME.v32 (dois builds iguais)" }