#!/usr/bin/env bash # Compila roguelikes de 7DRL feitos com a bracket-lib (Rust -> WebAssembly; terminal em WebGL) a partir do fonte, num commit # fixo, como o build web do proprio autor: # cargo build --locked --release --target wasm32-unknown-unknown (Cargo.lock do autor) # wasm-bindgen --target no-modules --no-typescript (CLI na versao do Cargo.lock) # Fontes, imagens e listas de nomes entram no .wasm por include_bytes!. A pagina de cada jogo (bracket/.html) e nossa: so # o canvas e o script; o codigo do jogo nao e alterado, a menos que haja bracket/.patch (publicado junto do jogo). # A bracket-lib vem do GitHub (dependencia git do Cargo.lock, no commit dele). O CLI do wasm-bindgen 0.2.71 so tem binario # x86_64 (roda no Rosetta). # # src/FredGames.Bundler/Builds/build-bracket-games.sh [slug ...] (sem argumento: todos) # # Saida de cada jogo: artifacts/build//{dist/,--dist.tar.gz,-licenses.txt}; o .tar.gz tem que sair # igual em dois builds seguidos (CODEGEN_UNITS=1; caminhos do fonte remapeados). O wasm-bindgen antigo pode reordenar adaptadores # entre execucoes: o bundle.yaml fixa o sha256 do build testado. set -euo pipefail here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" mkdir -p "$cache" export RUSTUP_HOME="$tools/rustup" CARGO_HOME="$tools/cargo" export PATH="$CARGO_HOME/bin:$PATH" fetch() { # url arquivo sha256 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 - >/dev/null } load() { case "$1" in secbot) REPO=thebracket/secbot-2021-7drl COMMIT=fda129fe8a5d5844382e7046fef42fbf5a8fd978 SHA256=1dbd423780b36c2ca187bc9bc20bc3b06417427ef309f5298ab309ec66d8607e CRATE=secbot TOOLCHAIN=1.74.1 WB=0.2.71 WB_ARCH=x86_64-apple-darwin WB_SHA=1c94759409631c447c50cac13371a50168700dc0ba9430cca308eee53b6d7fa8 LICENSES="LICENSE" ;; killing-orcs-with-a-sword) REPO=theq629/kowas COMMIT=f4ff96876793c65dfe2db8791197003a00ba8582 SHA256=60b3d98183973a5ec7155299d22d3b0262516d66001f0ec6cd7f7bb3ea011b94 CRATE=kowas TOOLCHAIN=1.74.1 WB=0.2.71 WB_ARCH=x86_64-apple-darwin WB_SHA=1c94759409631c447c50cac13371a50168700dc0ba9430cca308eee53b6d7fa8 LICENSES="LICENCE" ;; hazard-level) REPO=Spferical/hazard-level COMMIT=1dffba5d7f58523f0efe6ecf9b35173d405e2a49 SHA256=ae6522c425b7de0fe7cdcd819b7e729a5f2f4fb9cd31efd96bd7865fad829239 CRATE=run TOOLCHAIN=1.92.0 WB=0.2.100 WB_ARCH=aarch64-apple-darwin WB_SHA=69f25cb910de7e19777b3f93347f5e62a64c8f81709b41ba7242d00a9543573c LICENSES="LICENSE-MIT LICENSE-APACHE" ;; *) echo "jogo desconhecido: $1" >&2; exit 1 ;; esac } build() { local slug="$1" load "$slug" local out="$root/artifacts/build/$slug" tree="$root/artifacts/build/$slug/tree" fetch "https://github.com/$REPO/archive/$COMMIT.tar.gz" "$slug-${COMMIT:0:7}.tar.gz" "$SHA256" fetch "https://github.com/rustwasm/wasm-bindgen/releases/download/$WB/wasm-bindgen-$WB-$WB_ARCH.tar.gz" \ "wasm-bindgen-$WB-$WB_ARCH.tar.gz" "$WB_SHA" if [ ! -x "$tools/wasm-bindgen-$WB/wasm-bindgen" ]; then rm -rf "$tools/wasm-bindgen-$WB.tmp"; mkdir -p "$tools/wasm-bindgen-$WB.tmp" tar -xzf "$cache/wasm-bindgen-$WB-$WB_ARCH.tar.gz" -C "$tools/wasm-bindgen-$WB.tmp" --strip-components 1 mv "$tools/wasm-bindgen-$WB.tmp" "$tools/wasm-bindgen-$WB" fi rustup toolchain install "$TOOLCHAIN" --profile minimal --target wasm32-unknown-unknown >/dev/null 2>&1 export RUSTUP_TOOLCHAIN="$TOOLCHAIN" rm -rf "$out"; mkdir -p "$tree" "$out/dist" tar -xzf "$cache/$slug-${COMMIT:0:7}.tar.gz" -C "$tree" --strip-components 1 ( cd "$tree" [ ! -f "$here/bracket/$slug.patch" ] || patch -s -p1 < "$here/bracket/$slug.patch" CARGO_INCREMENTAL=0 CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 \ RUSTFLAGS="--remap-path-prefix=$tree=/src --remap-path-prefix=$CARGO_HOME=/cargo" \ cargo build --locked --release --target wasm32-unknown-unknown 2> "$out/cargo.log" \ || { tail -40 "$out/cargo.log"; exit 1; } shasum -a 256 "target/wasm32-unknown-unknown/release/$CRATE.wasm" >&2 "$tools/wasm-bindgen-$WB/wasm-bindgen" --target no-modules --no-typescript --out-name "$CRATE" --out-dir "$out/dist" \ "target/wasm32-unknown-unknown/release/$CRATE.wasm" cargo metadata --locked --format-version 1 --filter-platform wasm32-unknown-unknown 2>/dev/null \ | python3 -I "$here/gridbugs/rust-licenses.py" "$CRATE" "$out/crates.txt" ) cp "$here/bracket/$slug.html" "$out/dist/index.html" { echo "$slug - licence of the build" echo "============================" echo echo "Source: https://github.com/$REPO at commit $COMMIT. Licence texts of the repository:" echo for f in $LICENSES; do echo "------------------------------------------------------------------------" echo "$f" echo "------------------------------------------------------------------------" cat "$tree/$f"; echo done echo "========================================================================" cat "$out/crates.txt" } > "$out/$slug-licenses.txt" find "$out/dist" -exec touch -t 202511010000 {} + ( 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 > "$slug-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) rm -rf "$tree" ls -l "$out/$slug-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/$slug-${COMMIT:0:7}-dist.tar.gz" "$out/$slug-licenses.txt" "$out/dist/${CRATE}_bg.wasm" } for g in "${@:-secbot killing-orcs-with-a-sword hazard-level}"; do for s in $g; do build "$s"; done; done