# Pecas comuns dos scripts de build dos jogos em Go + Ebitengine (Retromancer, Tower of Purgatory, MAG(net), Feta Feles, Go-inovation, # Linefire). Usado com `source`; quem chama define antes `here` (a pasta Builds/) e `root` (a raiz do repositorio). # # Go 1.27.2 (tarball oficial, sha256 abaixo) em artifacts/tools/go-1.27.2; os modulos vem do proxy do Go e sao conferidos pelo go.sum # do projeto (GOFLAGS=-mod=readonly: se o go.mod/go.sum do jogo nao bastarem, a build falha em vez de baixar algo nao conferido). GO=1.27.2 GO_SHA256=76812b213b1b2302c978d28fa52fa92d541704b9e7d9d5db8002c50e4018c4c5 cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" godir="$tools/go-$GO" mkdir -p "$cache" fetch() { # url destino sha256 if [ ! -f "$2" ]; then curl -fsSL --retry 4 "$1" -o "$2.partial" && mv "$2.partial" "$2" fi echo "$3 $2" | shasum -a 256 -c - } go_setup() { if [ ! -x "$godir/bin/go" ]; then local gotgz="$cache/go$GO.darwin-arm64.tar.gz" fetch "https://go.dev/dl/go$GO.darwin-arm64.tar.gz" "$gotgz" "$GO_SHA256" mkdir -p "$godir.tmp" && tar -xzf "$gotgz" -C "$godir.tmp" && mv "$godir.tmp/go" "$godir" && rmdir "$godir.tmp" fi export GOTOOLCHAIN=local export PATH="$godir/bin:$PATH" [ "$(go version | cut -d' ' -f3)" = "go$GO" ] || { echo "Precisa do Go $GO em $godir." >&2; exit 1; } export GOMODCACHE="$cache/gomod" GOCACHE="$cache/gobuild" GOFLAGS=-mod=readonly CGO_ENABLED=0 GOOS=js GOARCH=wasm } # go_build_wasm [tags]: build de release para o navegador (mesmos flags do release web do AAAAXY). O pacote main e "." ou # o que estiver em GO_PKG (ex.: ./cmd/game). go_build_wasm() { go build -trimpath -buildvcs=false ${2:+-tags=$2} "-gcflags=all=-dwarf=false" "-ldflags=all=-s -w -buildid=" -o "$1" "${GO_PKG:-.}" 2>&1 | tail -30 [ -s "$1" ] || { echo "A build falhou." >&2; exit 1; } cp "$(go env GOROOT)/lib/wasm/wasm_exec.js" "$(dirname "$1")/wasm_exec.js" } # Ferramentas de audio para recodificar a musica (libvorbis 1.3.7 em artifacts/tools/vorbis-1.3.7; ver Builds/pygame-music/README). audio_tools() { local V="$tools/vorbis-1.3.7" if [ ! -x "$tools/pygame-music/oggdec" ]; then cc -O2 "$here/terratactician/oggdec.c" "$tools/vorbis-src/libvorbis-1.3.7/lib/vorbisfile.c" -I"$V/include" \ -I"$tools/vorbis-src/libvorbis-1.3.7/include" -L"$V/lib" -lvorbis -logg -lm -o "$tools/pygame-music/oggdec" fi [ -x "$tools/pygame-music/wav2ogg" ] || cc -O2 "$here/pygame-music/wav2ogg.c" -I"$V/include" -L"$V/lib" -lvorbisenc -lvorbis -logg -lm -o "$tools/pygame-music/wav2ogg" } # reencode_ogg ...: decodifica e recodifica no mesmo lugar (Ogg Vorbis estereo, qualidade VBR). reencode_ogg() { local q="$1"; shift local tmp; tmp="$(mktemp -d "$cache/ogg.XXXXXX")" local f for f in "$@"; do "$tools/pygame-music/oggdec" "$f" "$tmp/in.wav" "$tools/pygame-music/wav2ogg" "$tmp/in.wav" "$tmp/out.ogg" "$q" mv "$tmp/out.ogg" "$f" done rm -rf "$tmp" } # go_licenses [tags]: textos de licenca da biblioteca padrao e dos modulos que entram no binario (licenses.py). # Roda dentro da arvore do jogo, depois do patch. go_licenses() { go list -deps ${3:+-tags=$3} -f '{{if .Module}}{{if not .Module.Main}}{{.Module.Path}}|{{.Module.Version}}|{{.Module.Dir}}{{end}}{{end}}' "${GO_PKG:-.}" \ | python3 -I "$here/go-ebiten/licenses.py" "$(go env GOROOT)" "$1" "$2" }