#!/usr/bin/env bash # Compila Carazu (homebrew de Game Boy de Martin Holtkamp, GPL-3.0) da tag v1.0 (commit 2e08738, o # codigo da ROM que o autor publica no Game Jolt) com o RGBDS 0.3.10, a ultima versao que ainda aceita a # sintaxe antiga do jogo (secoes HOME/DATA/BSS e "and ~CONST"). O autor montou a ROM com o xlink, o # linker do RGBDS original para Windows, que posiciona as secoes de outro jeito; a nossa ROM tem o mesmo # codigo e os mesmos dados, mas nao e identica byte a byte. Servimos esta, com o fonte exato ao lado. # # O RGBDS antigo precisa do Bison para gerar o parser do rgbasm (o do macOS exige o Xcode): o script # compila o GNU Bison 3.8.2 e o RGBDS em artifacts/tools/. # # src/FredGames.Bundler/Builds/build-carazu.sh # # Saida: artifacts/build/carazu/carazu.gb set -euo pipefail BISON=3.8.2 BISON_SHA256=9bba0214ccf7f1079c5d59210045227bcf619519840ebfa80cd3849cff5a5bf2 RGBDS=0.3.10 RGBDS_SHA256=b2b4e7d3454e648cec66fc157c507a890a5df1c777516badbf722ad4762d2f68 COMMIT=2e087388de2f4f5766c76c677527a7c67529dd36 GAME_SHA256=b2e8f8776ef0dd1055b6672412866032bfab9967d80a4321dfa23652d9a6f723 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/carazu" cache="$root/artifacts/build/cache" bison="$root/artifacts/tools/bison-$BISON" rgbds="$root/artifacts/tools/rgbds-$RGBDS" mkdir -p "$cache" fetch() { [ -f "$2" ] || curl -fsSL --retry 4 "$1" -o "$2"; echo "$3 $2" | shasum -a 256 -c -; } fetch "https://ftp.gnu.org/gnu/bison/bison-$BISON.tar.xz" "$cache/bison-$BISON.tar.xz" "$BISON_SHA256" fetch "https://github.com/gbdev/rgbds/archive/refs/tags/v$RGBDS.tar.gz" "$cache/rgbds-$RGBDS.tar.gz" "$RGBDS_SHA256" fetch "https://github.com/mholtkamp/carazu/archive/$COMMIT.tar.gz" "$cache/carazu-$COMMIT.tar.gz" "$GAME_SHA256" if [ ! -x "$bison/bin/bison" ]; then rm -rf "$bison" "$bison.src" && mkdir -p "$bison.src" tar -xJf "$cache/bison-$BISON.tar.xz" -C "$bison.src" --strip-components 1 (cd "$bison.src" && ./configure --prefix="$bison" --disable-nls >/dev/null && make -j8 >/dev/null && make install >/dev/null) rm -rf "$bison.src" fi if [ ! -x "$rgbds/rgbasm" ] || [ ! -x "$rgbds/rgblink" ] || [ ! -x "$rgbds/rgbfix" ]; then rm -rf "$rgbds" && mkdir -p "$rgbds" tar -xzf "$cache/rgbds-$RGBDS.tar.gz" -C "$rgbds" --strip-components 1 # Sem -Werror: o clang atual reclama de construcoes que o de 2019 aceitava. make -C "$rgbds" YACC="$bison/bin/bison" WARNFLAGS=-w rgbasm rgblink rgbfix >/dev/null fi rm -rf "$out" && mkdir -p "$out/tree" tar -xzf "$cache/carazu-$COMMIT.tar.gz" -C "$out/tree" --strip-components 1 cd "$out/tree" mkdir -p obj rom # A mesma lista e a mesma ordem do make.bat e do carazu.link do autor. for f in src/main src/rect src/font src/input src/player src/level src/sound src/music src/menu src/util \ src/stats src/item src/enemy src/bullet src/splash tiles/special_tiles tiles/item_tiles tiles/enemy_tiles \ tiles/bullet_tiles tiles/bg_tiles_0 tiles/bg_tiles_1 tiles/bg_tiles_2 tiles/player_sprite_tiles \ levels/level_items levels/level_enemies levels/level_maps levels/level_properties music/song0; do "$rgbds/rgbasm" -o "obj/$(basename "$f").obj" "$f.asm" 2>/dev/null done objects="$(sed -n '/\[Objects\]/,/\[Output\]/p' carazu.link | grep 'obj/' | tr -d ' \r')" # shellcheck disable=SC2086 "$rgbds/rgblink" -m rom/carazu.map -n rom/carazu.sym -o rom/carazu.gb $objects # "rgbfix -v -p" do make.bat: cabecalho valido e ROM completada ate um tamanho de cartucho (com zeros). "$rgbds/rgbfix" -v -p 0 rom/carazu.gb cp rom/carazu.gb "$out/" shasum -a 256 "$out/carazu.gb"