#!/usr/bin/env bash # Compila o RuggRogue (roguelike completo em Rust + SDL2, de Tung Nguyen; MIT) para a web a partir do fonte, num commit # fixo, com o Rust 1.92.0 (alvo wasm32-unknown-emscripten) e o Emscripten 6.0.10 de artifacts/tools/emsdk (o mesmo dos # outros jogos), com o Cargo.lock do autor (cargo build --release --locked). O BUILD.md do autor pede o Emscripten 1.39.20 # ("a ultima versao nao funciona"); com o Emscripten atual o jogo so precisa de tres ajustes no link, todos aqui: # - o link e feito com em++ (-C linker=em++) e -fexceptions, para existir o __resumeException que a std do Rust usa; # - open64.c (Builds/ruggrogue/open64.c): o getrandom 0.2 chama open64, que o Emscripten novo nao exporta mais; # - sem o --profiling do autor (so deixava os nomes das funcoes no wasm). # Mudancas no jogo (Builds/ruggrogue/ruggrogue-fredygames.patch): sai o tileset "Terminal" (assets/terminal-8x8.png, que o # autor diz ter "emprestado" do tutorial de roguelike em Rust, sem licenca citada); o Urizen vira o segundo tileset e e o padrao; # o index.html perde o link do favicon. Os outros dois (GohuFont, WTFPL; Urizen 1-Bit mono, CC0) tem licenca no repositorio. # # src/FredGames.Bundler/Builds/build-ruggrogue.sh # # Saida: artifacts/build/ruggrogue-164ff83/{site.tar.gz,ruggrogue-164ff83.tar.gz,licenses/}; site.tar.gz (a pasta do jogo, # com o prefixo "site/") tem que sair igual em dois builds seguidos. set -euo pipefail SLUG=ruggrogue COMMIT=164ff8380deb21964cbe65bd60db7c5cd7dbd107 SHA256=49447a6f10b881d49d4aa81a672ab9e351469b27640eb98801a9b553c5993aef URL="https://github.com/tung/ruggrogue/archive/$COMMIT.tar.gz" RUST=1.92.0 EMSCRIPTEN=6.0.10 MTIME=202408101935 # data do commit here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/$SLUG-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" mkdir -p "$cache" fetch() { # url sha256 arquivo [ -f "$cache/$3" ] || curl -fsSL --retry 4 "$1" -o "$cache/$3" echo "$2 $cache/$3" | shasum -a 256 -c - >/dev/null } fetch "$URL" "$SHA256" "$SLUG-${COMMIT:0:7}.tar.gz" export RUSTUP_HOME="$tools/rustup" export CARGO_HOME="$tools/cargo" export PATH="$CARGO_HOME/bin:$PATH" export RUSTUP_TOOLCHAIN="$RUST-$(uname -m | sed 's/arm64/aarch64/')-apple-darwin" [ "$(rustc --version | cut -d' ' -f2)" = "$RUST" ] || { echo "Rust inesperado: $(rustc --version)"; exit 1; } [ -d "$RUSTUP_HOME/toolchains/$RUSTUP_TOOLCHAIN/lib/rustlib/wasm32-unknown-emscripten" ] || rustup target add wasm32-unknown-emscripten --toolchain "$RUSTUP_TOOLCHAIN" # shellcheck disable=SC1091 source "$tools/emsdk/emsdk_env.sh" >/dev/null 2>&1 [ "$(cat "$tools/emsdk/upstream/emscripten/emscripten-version.txt" | tr -d '"')" = "$EMSCRIPTEN" ] || { echo "Emscripten inesperado"; exit 1; } rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$cache/$SLUG-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 # Fonte publicado (sem alteracoes): o tarball do commit, regravado em tar deterministico. ( cd "$out/tree" && find . -type f | sed 's|^\./||' | LC_ALL=C sort > "$out/files.txt" ) ( cd "$out/tree" && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n \ -cf - -T "$out/files.txt" ) | gzip -n -9 > "$out/$SLUG-${COMMIT:0:7}.tar.gz" patch -s -p1 -d "$out/tree" < "$here/ruggrogue/ruggrogue-fredygames.patch" rm "$out/tree/assets/terminal-8x8.png" emcc -O2 -c "$here/ruggrogue/open64.c" -o "$out/open64.o" cd "$out/tree" cat > .cargo/config.toml </dev/null 2>&1 rel="$CARGO_TARGET_DIR/wasm32-unknown-emscripten/release" # A pasta do jogo (a estrutura do BUILD.md do autor: o .data fica em deps/). site="$out/site" mkdir -p "$site/deps" cp index.html "$site/index.html" cp "$rel/ruggrogue.js" "$rel/ruggrogue.wasm" "$site/" cp "$rel/deps/ruggrogue.data" "$site/deps/" find "$site" -exec touch -t "$MTIME" {} + ( cd "$out" && find site -type f | LC_ALL=C sort > "$out/site-files.txt" ) ( cd "$out" && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n \ -cf - -T "$out/site-files.txt" ) | gzip -n -9 > "$out/site.tar.gz" # Licencas: as crates Rust do jogo, e o que o Emscripten embute (SDL2, SDL2_image, libpng, zlib, musl, libc++ e o proprio). mkdir -p "$out/licenses" cargo metadata --locked --format-version 1 --filter-platform wasm32-unknown-emscripten | python3 -I -c ' import json, os, sys m = json.load(sys.stdin) ids = {n["id"] for n in m["resolve"]["nodes"]} for p in sorted(m["packages"], key=lambda p: (p["name"], p["version"])): if p["id"] not in ids or p["name"] in ("ruggrogue",): continue d = os.path.dirname(p["manifest_path"]) print("== crate %s %s (%s)" % (p["name"], p["version"], p.get("license"))) for f in sorted(os.listdir(d)): if f.upper().startswith(("LICENSE", "LICENCE", "COPYING", "NOTICE", "UNLICENSE")): print("-- " + f) print(open(os.path.join(d, f), errors="replace").read()) ' > "$out/licenses/rust-crates.txt" em="$tools/emsdk/upstream/emscripten" { echo "== Emscripten $EMSCRIPTEN (runtime em JavaScript e bibliotecas do sistema)"; cat "$em/LICENSE"; echo echo "== musl libc (COPYRIGHT)"; cat "$em/system/lib/libc/musl/COPYRIGHT"; echo echo "== libc++ / libc++abi / libunwind / compiler-rt (LLVM, Apache-2.0 com excecao LLVM)"; cat "$em/system/lib/libcxx/LICENSE.TXT"; echo echo "== SDL 2.32.10 (porta do Emscripten)"; unzip -p "$em/cache/ports/sdl2.32.10.zip" 'SDL-release-2.32.10/LICENSE.txt'; echo echo "== SDL_image 2.6.0 (porta do Emscripten)"; unzip -p "$em/cache/ports/sdl2_image.6.0.zip" 'SDL_image-release-2.6.0/LICENSE.txt'; echo echo "== libpng (porta do Emscripten)"; cat "$em/cache/ports/libpng/"libpng-*/LICENSE; echo echo "== zlib (porta do Emscripten)"; cat "$em/cache/ports/zlib/"zlib-*/LICENSE; echo } > "$out/licenses/emscripten.txt" cp "$here/ruggrogue/WTFPL.txt" "$out/licenses/wtfpl.txt" ls -l "$out/site.tar.gz" "$site/ruggrogue.wasm" shasum -a 256 "$site/ruggrogue.wasm" "$out/site.tar.gz" "$out/$SLUG-${COMMIT:0:7}.tar.gz"