#!/usr/bin/env bash # Compila o Hauberk (roguelike de Bob Nystrom, MIT; Dart) para a web a partir do fonte, num commit fixo, com o # Dart SDK 3.12.2 oficial (o pubspec.lock do autor pede ">=3.11.0 <3.13.0-z"): # dart pub get --enforce-lockfile (versoes e sha256 do pubspec.lock do autor) # dart compile js -O2 --no-source-maps web/main.dart # O autor publica com "dart run build_runner build --release" (build_web_compilers, que chama o mesmo dart2js); # aqui o dart2js e chamado direto. # # Mudancas no jogo (hauberk/hauberk-fredygames.patch): o web/index.html sem o Google Fonts (a Buenard, SIL OFL # 1.1, vem de fonts/, do google/fonts num commit fixo), com uma CSP que bloqueia conexoes fora da propria # origem e um script que guarda as chaves do localStorage com o prefixo "hauberk:" (todos os jogos do site # dividem o mesmo localStorage); o web/main.dart comeca na fonte 8x10, nao na 6x9 (pequena demais no quadro do # player). As fontes de pixels (font_*.png) sao do autor e entram sem mudanca. # # src/FredGames.Bundler/Builds/build-hauberk.sh # # Ferramentas em artifacts/tools/dart-3.12.2. Saida: artifacts/build/hauberk-6c5c684/{dist/, # hauberk-6c5c684-dist.tar.gz,licenses.txt}; o .tar.gz (pasta dist/) tem que sair igual em dois builds seguidos. set -euo pipefail COMMIT=6c5c684c91082742857972f5c93607d52c189929 SHA256=2387fc1ed5fd02ceec54bb12ce1e066e1389ef7f5d22470278376d0e9330954c DART=3.12.2 DART_SHA256_ARM64=cd8753928e77b6b665bd70dce0e64b4ec6d2e2fde141d6409bb716c8ac1f1c0a DART_SHA256_X64=38199f56fe22f2235e76799191d5b9516e360369c61b6ba4411398d5d5920bab FONTS_COMMIT=9862abc066c9b83bf84c3e8ed1fc2d8d48f9bbf0 BUENARD_SHA256=275f9307353c7502ce7553cbd09ab7c80c73dd2da854728df18d796f9455beb9 BUENARD_OFL_SHA256=6d23bd7e9bf8c35c58504f42c0fe2d55cb1295d6cc49fdb942c3a5bab6ebaca6 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/hauberk-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" mkdir -p "$cache" fetch() { if [ ! -f "$cache/$2" ]; then curl -fsSL --retry 4 "$1" -o "$cache/$2.partial" && mv "$cache/$2.partial" "$cache/$2" fi echo "$3 $cache/$2" | shasum -a 256 -c - } case "$(uname -m)" in arm64) darch=arm64; dsha=$DART_SHA256_ARM64 ;; *) darch=x64; dsha=$DART_SHA256_X64 ;; esac if [ ! -x "$tools/dart-$DART/bin/dart" ]; then fetch "https://storage.googleapis.com/dart-archive/channels/stable/release/$DART/sdk/dartsdk-macos-$darch-release.zip" \ "dartsdk-$DART-macos-$darch.zip" "$dsha" rm -rf "$tools/dart-$DART.tmp"; mkdir -p "$tools/dart-$DART.tmp" unzip -q "$cache/dartsdk-$DART-macos-$darch.zip" -d "$tools/dart-$DART.tmp" mv "$tools/dart-$DART.tmp/dart-sdk" "$tools/dart-$DART" rmdir "$tools/dart-$DART.tmp" fi dart="$tools/dart-$DART/bin/dart" [ "$("$dart" --version 2>&1 | sed -n 's/^Dart SDK version: \([0-9.]*\).*/\1/p')" = "$DART" ] || { echo "Dart inesperado: $("$dart" --version 2>&1)"; exit 1; } fetch "https://github.com/munificent/hauberk/archive/$COMMIT.tar.gz" "hauberk-${COMMIT:0:7}.tar.gz" "$SHA256" gf="https://raw.githubusercontent.com/google/fonts/$FONTS_COMMIT" fetch "$gf/ofl/buenard/Buenard%5Bwght%5D.ttf" "Buenard-wght-${FONTS_COMMIT:0:7}.ttf" "$BUENARD_SHA256" fetch "$gf/ofl/buenard/OFL.txt" "Buenard-OFL-${FONTS_COMMIT:0:7}.txt" "$BUENARD_OFL_SHA256" rm -rf "$out" mkdir -p "$out/tree" "$out/home" tar -xzf "$cache/hauberk-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 patch -s -p1 -d "$out/tree" < "$here/hauberk/hauberk-fredygames.patch" # Ambiente isolado: HOME e cache de pacotes proprios; o pub confere o sha256 de cada pacote do pubspec.lock. export HOME="$out/home" PUB_CACHE="$cache/pub-hauberk" DART_SUPPRESS_ANALYTICS=true CI=true cd "$out/tree" "$dart" pub get --enforce-lockfile > "$out/pub-get.log" 2>&1 || { cat "$out/pub-get.log"; exit 1; } mkdir -p "$out/dist/fonts" "$dart" compile js -O2 --no-source-maps -o "$out/dist/main.dart.js" web/main.dart rm -f "$out/dist/main.dart.js.deps" cp web/index.html "$out/dist/index.html" for f in font_6_8 font_6_9 font_8 font_8_10 font_9_12 font_10_12 font_12_16 font_12_18 font_16 font_16_20; do cp "web/$f.png" "$out/dist/$f.png" done cp "$cache/Buenard-wght-${FONTS_COMMIT:0:7}.ttf" "$out/dist/fonts/Buenard-wght.ttf" cp "$cache/Buenard-OFL-${FONTS_COMMIT:0:7}.txt" "$out/dist/fonts/Buenard-OFL.txt" # Licencas: o jogo, o runtime do dart2js (SDK) e os pacotes que entram no JavaScript (o .deps do dart2js lista # quais: malison, meta, piecemeal, web). deps="$out/main.deps" "$dart" compile js -O2 --no-source-maps -o "$out/main-deps.js" web/main.dart > /dev/null grep -o 'hosted/pub.dev/[^/]*' "$out/main-deps.js.deps" | sed 's|hosted/pub.dev/||' | LC_ALL=C sort -u > "$deps" { echo "== hauberk (COPYRIGHT)"; cat COPYRIGHT; echo echo "== Dart SDK $DART (LICENSE; the dart2js runtime is part of main.dart.js)"; cat "$tools/dart-$DART/LICENSE"; echo while read -r pkg; do echo "== $pkg (LICENSE)"; cat "$PUB_CACHE/hosted/pub.dev/$pkg/LICENSE"; echo done < "$deps" } > "$out/licenses.txt" rm -f "$out/main-deps.js" "$out/main-deps.js.deps" # dist/ vira um tar.gz deterministico (datas fixas, ordem fixa, sem dono). find "$out/dist" -exec touch -t 202609140000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > files.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T files.txt \ | gzip -n -9 > "hauberk-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) rm -rf "$out/tree" "$out/home" "$deps" ls -l "$out/hauberk-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/hauberk-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt" "$out/dist/main.dart.js"