#!/usr/bin/env bash # Compila o Cube Collection (wiryls; Rust + Bevy 0.20; cube-collection MIT, cube-core LGPL-3.0) para WebAssembly, no # commit 42b161d, como o AGENTS.md do autor descreve (o mesmo passo a passo do site dele no GitHub Pages): # cargo build --profile wasm-release --target wasm32-unknown-unknown -p cube-collection (Rust 1.99.1, Cargo.lock do autor) # wasm-bindgen --target web (CLI 0.2.129, a versao do Cargo.lock) # wasm-opt -Oz (binaryen 133) # Uma mudanca no fonte, publicada: cube-collection/reduce-bevy-features.patch troca as features padrao do Bevy (que # trazem 3D, audio, gamepad e UI, nada disso usado pelo jogo) pelas de 2D com WebGL2 e poda o Cargo.lock; o .wasm # cai de 57 MB para 15 MB. Nenhuma linha de codigo do jogo muda. A pagina (cube-collection/index.html, start.js) e # nossa: baixa o .wasm comprimido em gzip e o descomprime no navegador. # O cube-core e LGPL-3.0: o fonte do commit exato (com o Cargo.lock) vai junto, mais este script e o patch; qualquer um # recompila o conjunto e troca o cube-core. # # src/FredGames.Bundler/Builds/build-cube-collection.sh # # Saida: artifacts/build/cube-collection/{dist/, cube-collection--dist.tar.gz, cube-collection-licenses.txt}. # O .tar.gz tem que sair igual em dois builds seguidos (CODEGEN_UNITS ja e 1 no perfil; caminhos remapeados). 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" TOOLCHAIN=1.99.1 COMMIT=42b161da33e160c72521dae85797cba2faf97806 SHA256=9a149c7d0824a80de4328bf933a7263364379698329d904d4cc5d071287ffa59 WB=0.2.129 WB_SHA=81d4a23d56b3c3eb8187658329116d50e0b228a93b343825fb71f70179051cd1 BINARYEN=133 BINARYEN_SHA=ad66da82ac13f163e424b1643f16c6dfcccc98b5966296b43e52d3cab04f84a8 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 } untar() { # arquivo destino if [ ! -d "$2" ]; then rm -rf "$2.tmp"; mkdir -p "$2.tmp"; tar -xzf "$1" -C "$2.tmp" --strip-components 1; mv "$2.tmp" "$2" fi } slug=cube-collection out="$root/artifacts/build/$slug" tree="$root/artifacts/build/$slug/tree" fetch "https://github.com/wiryls/cube-collection/archive/$COMMIT.tar.gz" "$slug-${COMMIT:0:7}.tar.gz" "$SHA256" fetch "https://github.com/wasm-bindgen/wasm-bindgen/releases/download/$WB/wasm-bindgen-$WB-aarch64-apple-darwin.tar.gz" \ "wasm-bindgen-$WB-aarch64-apple-darwin.tar.gz" "$WB_SHA" fetch "https://github.com/WebAssembly/binaryen/releases/download/version_$BINARYEN/binaryen-version_$BINARYEN-arm64-macos.tar.gz" \ "binaryen-version_$BINARYEN-arm64-macos.tar.gz" "$BINARYEN_SHA" untar "$cache/wasm-bindgen-$WB-aarch64-apple-darwin.tar.gz" "$tools/wasm-bindgen-$WB" untar "$cache/binaryen-version_$BINARYEN-arm64-macos.tar.gz" "$tools/binaryen-version_$BINARYEN" 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/assets/level" "$out/wb" tar -xzf "$cache/$slug-${COMMIT:0:7}.tar.gz" -C "$tree" --strip-components 1 ( cd "$tree" patch -p1 < "$here/cube-collection/reduce-bevy-features.patch" >/dev/null CARGO_INCREMENTAL=0 RUSTFLAGS="--remap-path-prefix=$tree=/src --remap-path-prefix=$CARGO_HOME=/cargo" \ cargo build --locked --profile wasm-release --target wasm32-unknown-unknown -p cube-collection 2> "$out/cargo.log" \ || { tail -40 "$out/cargo.log"; exit 1; } "$tools/wasm-bindgen-$WB/wasm-bindgen" --out-name cube-collection --out-dir "$out/wb" --target web --no-typescript \ target/wasm32-unknown-unknown/wasm-release/cube-collection.wasm "$tools/binaryen-version_$BINARYEN/bin/wasm-opt" -Oz --enable-bulk-memory --enable-nontrapping-float-to-int \ --enable-sign-ext --enable-mutable-globals --enable-simd --enable-reference-types --strip-debug --strip-producers \ --output "$out/wb/opt.wasm" "$out/wb/cube-collection_bg.wasm" gzip -9n -c "$out/wb/opt.wasm" > "$out/dist/cube-collection_bg.wasm.gz" cp "$out/wb/cube-collection.js" "$out/dist/" # So as fases que o index.toml lista (as de depuracao ficam de fora). cp cube-collection/assets/level/index.toml "$out/dist/assets/level/" for n in $(sed -n "s/^ *'\\([a-z0-9-]*\\)',\$/\\1/p" cube-collection/assets/level/index.toml); do cp "cube-collection/assets/level/$n.toml" "$out/dist/assets/level/" done cargo metadata --locked --format-version 1 --filter-platform wasm32-unknown-unknown 2>/dev/null > "$out/metadata.json" python3 -I "$here/gridbugs/rust-licenses.py" cube-collection "$out/crates.txt" < "$out/metadata.json" ) cp "$here/cube-collection/index.html" "$here/cube-collection/start.js" "$out/dist/" { echo "Cube Collection - licences of the build" echo "=======================================" echo echo "Source: https://github.com/wiryls/cube-collection at commit $COMMIT. cube-collection (the game, its levels) is under the" echo "MIT License; cube-core (the rules of the game, a library) is under the GNU Lesser General Public License 3.0." echo for f in cube-collection/LICENSE cube-core/LICENSE; 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" "$out/metadata.json" "$out/wb" 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/cube-collection_bg.wasm.gz"