#!/usr/bin/env bash # Compila o Shamogu (roguelike coffee-break de Yon / anaseto, ISC; gruid) para a web a partir do fonte, # num commit fixo, com Go 1.24.13 (o go.mod pede 1.24.0; usamos o ultimo 1.24.x): # GOOS=js GOARCH=wasm go build (como o README do autor) # Sem mudancas no jogo. A pagina que hospeda (canvas + wasm_exec.js) e nossa: Content/games/shamogu/play.html. # # src/FredGames.Bundler/Builds/build-shamogu.sh # # Os modulos Go vem do go.sum do autor (conferidos pelo Go, GOPROXY padrao). O wasm_exec.js e o do proprio # Go 1.24.13 (lib/wasm). Ferramentas em artifacts/tools/go-1.24.13. # Saida: artifacts/build/shamogu-194ca4e/{main.wasm,wasm_exec.js,shamogu-194ca4e.tar.gz,go-licenses/}; # main.wasm tem que sair igual em dois builds seguidos. set -euo pipefail SLUG=shamogu COMMIT=194ca4e180129ff727c1722ba16c2191e719d8cd SHA256=587eebac075032902b469aa495f8f44046485e306ae03c512ef77a41b24034db URL="https://codeberg.org/anaseto/shamogu/archive/$COMMIT.tar.gz" GO=1.24.13 GO_SHA256_ARM64=f282d882c3353485e2fc6c634606d85caf36e855167d59b996dbeae19fa7629a GO_SHA256_AMD64=6cc6549b06725220b342b740497ffd24e0ebdcef75781a77931ca199f46ad781 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() { 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) goarch=arm64; gosha=$GO_SHA256_ARM64 ;; *) goarch=amd64; gosha=$GO_SHA256_AMD64 ;; esac if [ ! -x "$tools/go-$GO/bin/go" ]; then fetch "https://go.dev/dl/go$GO.darwin-$goarch.tar.gz" "go$GO.darwin-$goarch.tar.gz" "$gosha" rm -rf "$tools/go-$GO.tmp"; mkdir -p "$tools/go-$GO.tmp" tar -xzf "$cache/go$GO.darwin-$goarch.tar.gz" -C "$tools/go-$GO.tmp" --strip-components 1 mv "$tools/go-$GO.tmp" "$tools/go-$GO" fi export GOROOT="$tools/go-$GO" export PATH="$GOROOT/bin:$PATH" export GOPATH="$cache/gopath-$SLUG" GOCACHE="$cache/gocache-$SLUG" export GOFLAGS=-modcacherw GOTOOLCHAIN=local CGO_ENABLED=0 GO111MODULE=on [ "$(go env GOVERSION)" = "go$GO" ] || { echo "Go inesperado: $(go version)"; exit 1; } fetch "$URL" "$SLUG-${COMMIT:0:7}.tar.gz" "$SHA256" 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" cd "$out/tree" GOOS=js GOARCH=wasm go build -trimpath -buildvcs=false -ldflags="-buildid=" -o "$out/main.wasm" . cp "$GOROOT/lib/wasm/wasm_exec.js" "$out/wasm_exec.js" # Licencas dos modulos que entram na build (go.sum travado; o Go confere os hashes). mkdir -p "$out/go-licenses" GOOS=js GOARCH=wasm go list -deps -f '{{with .Module}}{{.Path}} {{.Version}} {{.Dir}}{{end}}' . | sort -u | while read -r path ver dir; do [ -n "${dir:-}" ] || continue for f in "$dir"/LICEN[CS]E* "$dir"/COPYING* "$dir"/NOTICE*; do if [ -f "$f" ]; then echo "== $path $ver: $(basename "$f")"; cat "$f"; echo; fi done done > "$out/go-licenses/licenses.txt" GOOS=js GOARCH=wasm go list -deps -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' . | sort -u > "$out/go-licenses/modules.txt" ls -l "$out/main.wasm" "$out/wasm_exec.js" shasum -a 256 "$out/main.wasm" "$out/wasm_exec.js" "$out/$SLUG-${COMMIT:0:7}.tar.gz"