#!/usr/bin/env bash # Compila Solar Guard (homebrew de Game Boy Advance de Deft Spade, GBA Jam 2021, GPL-3.0; arte de terceiros sob # CC0, CC BY 3.0/4.0 e CC BY-SA 3.0, documentada na pasta "Art Acknowledgments" do repositorio) do commit 7418bdb # do repositorio Deft-Spade/Solar-Guard, com o Butano 7.0.1 (zlib, de julho de 2021: o jogo usa a API dessa # epoca, a do Butano atual nao compila) e o maxmod 1.0.14 (ISC), que o Butano 7 espera instalado no devkitPro # (aqui compilado do fonte). O repositorio nao traz ROM. Toolchain: ver gba-butano-toolchain.sh. # Mudancas nossas: # - a tela de abertura com o logo da GBA Jam 2021 sai (Builds/solar-guard/no-jam-splash.patch); # - as amostras de instrumento dos 9 modulos .it (da biblioteca do OpenMPT e do GM.DLS, licenca desconhecida) # sao trocadas por ondas sinteticas nossas (Builds/solar-guard/replace-samples.py): as notas continuam as do autor; # - syscalls_stub.c: a biblioteca C do GCC pede as chamadas de sistema que o libsysbase do devkitPro daria. # O fonte da ROM servida (jogo ja modificado, sem a pasta de arte original de terceiros) sai em solar-guard-src.tar.gz. # # src/FredGames.Bundler/Builds/build-solar-guard.sh # # Saida: artifacts/build/solar-guard/solar-guard.gba e solar-guard-src.tar.gz set -euo pipefail COMMIT=7418bdb GAME_SHA256=fdfbc8a27e65b0e534b2ac3efd586be61a38fc0defa04c994d3db316e74bfc2d BUTANO=7.0.1 BUTANO_SHA256=5b493b7a7af1ef943a86ec55711572feb8b7d9bb122f372d83434f12f84d2bf9 MAXMOD=1.0.14 MAXMOD_SHA256=2d268641240fb1c27366380e15829c52a366f93072e8afa689f6ca72c8e09ac6 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/solar-guard" cache="$root/artifacts/build/cache" dkp="$root/artifacts/tools/devkitpro-compat" "$here/gba-butano-toolchain.sh" mkdir -p "$cache" fetch() { [ -f "$2" ] || curl -fsSL --retry 4 "$1" -o "$2"; echo "$3 $2" | shasum -a 256 -c -; } fetch "https://github.com/Deft-Spade/Solar-Guard/archive/$COMMIT.tar.gz" "$cache/solar-guard-$COMMIT.tar.gz" "$GAME_SHA256" fetch "https://github.com/GValiente/butano/archive/refs/tags/$BUTANO.tar.gz" "$cache/butano-$BUTANO.tar.gz" "$BUTANO_SHA256" fetch "https://github.com/devkitPro/maxmod/archive/refs/tags/v$MAXMOD.tar.gz" "$cache/maxmod-$MAXMOD.tar.gz" "$MAXMOD_SHA256" rm -rf "$out" && mkdir -p "$out"/{butano,game,maxmod,libgba/include,libgba/lib} tar -xzf "$cache/butano-$BUTANO.tar.gz" -C "$out/butano" --strip-components 1 tar -xzf "$cache/solar-guard-$COMMIT.tar.gz" -C "$out/game" --strip-components 1 tar -xzf "$cache/maxmod-$MAXMOD.tar.gz" -C "$out/maxmod" --strip-components 1 export DEVKITPRO="$dkp" DEVKITARM="$dkp/devkitARM" export PATH="$dkp/devkitARM/bin:$dkp/tools/bin:$PATH" ( cd "$out/maxmod" && make gba >"$out/maxmod.log" 2>&1 ) || { tail -20 "$out/maxmod.log"; exit 1; } cp "$out/maxmod/lib/libmm.a" "$out/libgba/lib/" cp "$out/maxmod/include/maxmod.h" "$out/maxmod/include/mm_types.h" "$out/libgba/include/" cd "$out/game" patch -p1 --quiet < "$here/solar-guard/no-jam-splash.patch" rm Solar_Guard/graphics/bg_splash_screen_gba_jam_2021.bmp Solar_Guard/graphics/bg_splash_screen_gba_jam_2021.json python3 -I "$here/solar-guard/replace-samples.py" Solar_Guard/audio >/dev/null cp "$here/gba-syscalls-stub.c" Solar_Guard/src/syscalls_stub.c # Fonte da ROM servida: o jogo modificado, a licenca, o README e os READMEs de credito da arte (os originais de # terceiros, com 52 MB, ficam no repositorio do autor). python3 -I - "$out/game" "$out/solar-guard-src.tar.gz" <<'PY' import gzip, io, sys, tarfile from pathlib import Path root, dest = Path(sys.argv[1]), Path(sys.argv[2]) files = [p for p in root.rglob("*") if p.is_file()] keep = [] for p in files: rel = p.relative_to(root).as_posix() if rel.startswith("Art Acknowledgments/"): if rel.endswith("README.md") and rel.count("/") <= 2: keep.append(rel) elif rel.startswith(("Solar_Guard/", "Original Soundtrack/", "Readme_Content/")) or rel in ("LICENSE", "README.md"): keep.append(rel) buf = io.BytesIO() with tarfile.open(fileobj=buf, mode="w", format=tarfile.GNU_FORMAT) as tar: for rel in sorted(keep): ti = tarfile.TarInfo("solar-guard/" + rel) data = (root / rel).read_bytes() ti.size, ti.mtime, ti.mode, ti.uname, ti.gname = len(data), 1625961600, 0o644, "", "" tar.addfile(ti, io.BytesIO(data)) with open(dest, "wb") as f: with gzip.GzipFile(fileobj=f, mode="wb", mtime=0, filename="") as g: g.write(buf.getvalue()) PY cd Solar_Guard make -j8 LIBGBA="$out/libgba" LIBBUTANO="$out/butano/butano" PYTHON=python3 ROMTITLE=SOLARGUARD ROMCODE=SGRD >"$out/make.log" 2>&1 || { tail -30 "$out/make.log"; exit 1; } cp Solar_Guard.gba "$out/solar-guard.gba" shasum -a 256 "$out/solar-guard.gba" "$out/solar-guard-src.tar.gz"