#!/usr/bin/env bash # Compila Bugz (plataforma para Uzebox de Matt Pandina, GPL-3.0-or-later) no commit be93407 com o kernel # do Uzebox (GPL-3.0-or-later, compilado dentro da ROM) no commit 384ceb3, pelo avr-gcc 7.3.0 do nucleo # Arduino AVR 1.8.6 (o mesmo do MicroCity). O Makefile do jogo ja desliga o logo de abertura do Uzebox # (INTRO_LOGO=0; o nome e marca registrada) e o script confere isso. # # As fases sao .xcf do GIMP; o default/scratch do autor as exporta com o GIMP e roda o png2inc (BSD-2, na # pasta editor/, com a libpng 1.5.10 e a zlib 1.2.7 que vem junto). Aqui o bugz-xcf2png.py faz a parte do # GIMP e o png2inc e compilado do fonte do proprio repositorio, com o bugz-png2inc-strncpy.patch: dois # strncpy com tamanho errado estouram o buffer na pilha e, com o clang do macOS, apagam o nome do PNG da # camada de escadas (no Linux do autor o estouro caia em outro lugar). So a ferramenta muda; o jogo nao. # O tileset e os sprites ja vem convertidos (data/*.inc). O .uze sai do packrom do repositorio do Uzebox. # Fonte a hospedar: o tarball do jogo, o do Uzebox, o bugz-xcf2png.py, o patch e este script. # # src/FredGames.Bundler/Builds/build-bugz.sh # # Saida: artifacts/build/bugz/bugz.uze set -euo pipefail GAME=be934076df1babf2da7cf2bba004d12473565ad0 GAME_SHA256=89ad0158f74444c7680ab27acb733344fc31ded9ca7a6d3f099e0272b99bbd6c UZEBOX=384ceb3d0a3e66b2a6a3e0bd7ed5ca3f8a73e7f9 UZEBOX_SHA256=789bec225fdbf3438aeb3117f75ed678f3fcc886f7a908b2fc1f92d905b42bd9 CLI=1.5.1 CLI_SHA256=cb952e8c1621c95ef5f1d17831c945e3d0ec5973f89c557a7ec8feb9c4f7d4c9 CORE=1.8.6 AVR_GCC=7.3.0-atmel3.6.1-arduino7 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/bugz" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools/arduino-$CLI" # avr-gcc 7.3.0: o do nucleo Arduino AVR, instalado pelo arduino-cli (como no build-microcity.sh). avr="$tools/data/packages/arduino/tools/avr-gcc/$AVR_GCC/bin" if [ ! -x "$avr/avr-gcc" ]; then mkdir -p "$cache" "$tools" cli="$cache/arduino-cli_${CLI}_macOS_ARM64.tar.gz" [ -f "$cli" ] || curl -fsSL "https://github.com/arduino/arduino-cli/releases/download/v$CLI/arduino-cli_${CLI}_macOS_ARM64.tar.gz" -o "$cli" echo "$CLI_SHA256 $cli" | shasum -a 256 -c - tar -xzf "$cli" -C "$tools" arduino-cli export ARDUINO_DIRECTORIES_DATA="$tools/data" ARDUINO_DIRECTORIES_DOWNLOADS="$tools/staging" ARDUINO_DIRECTORIES_USER="$tools/user" "$tools/arduino-cli" core update-index >/dev/null "$tools/arduino-cli" core install "arduino:avr@$CORE" >/dev/null fi "$avr/avr-gcc" --version | head -1 | grep -q " 7.3.0$" mkdir -p "$cache" game="$cache/bugz-$GAME.tar.gz" uzebox="$cache/uzebox-$UZEBOX.tar.gz" [ -f "$game" ] || curl -fsSL "https://github.com/artcfox/bugz/archive/$GAME.tar.gz" -o "$game" [ -f "$uzebox" ] || curl -fsSL "https://github.com/Uzebox/uzebox/archive/$UZEBOX.tar.gz" -o "$uzebox" echo "$GAME_SHA256 $game" | shasum -a 256 -c - echo "$UZEBOX_SHA256 $uzebox" | shasum -a 256 -c - rm -rf "$out" mkdir -p "$out/bugz" "$out/uzebox" "$out/bin" tar -xzf "$game" -C "$out/bugz" --strip-components 1 tar -xzf "$uzebox" -C "$out/uzebox" --strip-components 1 "uzebox-$UZEBOX/kernel" "uzebox-$UZEBOX/tools/packrom" grep -q -- "-DINTRO_LOGO=0" "$out/bugz/default/Makefile" # packrom (ferramenta do Uzebox que monta o .uze: cabecalho de 512 bytes + a flash). c++ -O2 -DMACOSX -o "$out/bin/packrom" "$out/uzebox/tools/packrom/packrom.cpp" 2>/dev/null # Fases: .xcf -> PNG -> png2inc -> editor/levels/*.inc (o png2inc le e grava em /levels). ed="$out/bugz/editor" patch -s -d "$out/bugz" -p1 < "$here/bugz-png2inc-strncpy.patch" python3 "$here/bugz-xcf2png.py" "$out/bugz/data/levels" "$ed/levels" find "$ed/libpng" "$ed/zlib" -name '*.o' -delete # No macOS (TARGET_OS_MAC) a zlib 1.2.7 troca fdopen por NULL e a libpng 1.5.10 pede o do Mac OS # classico; -Dfdopen=fdopen e -include math.h desviam os dois. cc -O2 -w -std=gnu99 -Dfdopen=fdopen -include math.h -DPNG_STATIC -DZLIB_STATIC -I"$ed/libpng" -I"$ed/zlib" -I"$ed" -o "$ed/png2inc" \ "$ed/png2inc.c" "$ed/rbtree/rbtree.c" "$ed/rbtree/rbtree+setinsert.c" \ $(ls "$ed"/libpng/png*.c | grep -v pngtest) \ $(ls "$ed"/zlib/*.c) -lm (cd "$ed" && ./png2inc >/dev/null) # ROM: o Makefile do autor, com o kernel e o packrom daqui (sem o .hex/.uze que o repositorio traz). rm -f "$out/bugz/default/bugz.hex" "$out/bugz/default/bugz.uze" PATH="$avr:$PATH" make -s -C "$out/bugz/default" CC=avr-gcc KERNEL_DIR="$out/uzebox/kernel" UZEBIN_DIR="$out/bin" >/dev/null cp "$out/bugz/default/bugz.uze" "$out/bugz.uze" shasum -a 256 "$out/bugz.uze"