#!/usr/bin/env bash # Compila o Apple Master Revived (jogo de pegar macas de Manuel Huber, codigo MIT e arte CC0; Zig + raylib 4.x via # raylib-zig) a partir do commit 9e3a4f7 de gitlab.com/zahnputzmonster/apple-master, com os submodulos nos commits # que o repositorio fixa (raysan5/raylib ae50bfa, zlib; Not-Nik/raylib-zig f8735a8, MIT). # # O "zig build" do projeto nao roda aqui: o Zig 0.11.0 que o projeto pede (ci/Dockerfile) nao consegue ligar o proprio # build runner no macOS atual (simbolos _abort, _free... indefinidos) e as versoes novas do Zig quebram o build.zig. Entao # os mesmos passos do build.zig e do ci/build-html5.sh sao feitos a mao: (1) o jogo em Zig vira biblioteca # wasm32-wasi com "zig build-lib -O ReleaseSmall" (modulos raylib e raylib-math como no build.zig; texturas embutidas # com @embedFile); (2) o raylib sai de emcc (-DPLATFORM_WEB -DGRAPHICS_API_OPENGL_ES2, mesmos arquivos e flags do build.zig # do raylib); (3) o webhack.c de raylib-zig (__stack_chk_guard, __stack_chk_fail, errno) vira objeto com "zig cc"; # (4) emcc liga tudo com os mesmos argumentos do raylib-zig (-sFULL-ES3=1 -sUSE_GLFW=3 -sASYNCIFY -O3) e a pagina do # jogo e a html/index.html do autor com start.js. # # Mudanca na pagina (apple-master/apple-master-fredygames.patch): uma CSP que bloqueia conexoes fora da propria origem. # O jogo nao usa audio, rede nem fontes de fora (a fonte e a padrao embutida no raylib). # # Ferramentas em artifacts/tools: Zig 0.11.0 (macos-aarch64, sha256 abaixo) e o Emscripten 6.0.10 (emsdk). # # src/FredGames.Bundler/Builds/build-apple-master.sh # # Saida: artifacts/build/apple-master-9e3a4f7/{apple-master-9e3a4f7-dist.tar.gz,licenses.txt}; o tar.gz (pasta dist/) tem # que sair igual em dois builds seguidos. set -euo pipefail COMMIT=9e3a4f73c33c40510527daa076c5e5c419d6764f SHA256=cc7058adde9d542d6c166d483f659785350cd4a6d3dc6151978101a4e2bc3574 RAYLIB=ae50bfa2cc569c0f8d5bc4315d39db64005b1b08 RAYLIB_SHA256=964bfe348b78fa655dcdd3483238675d87f56712ef65746b3fc74d162a45eef6 RAYLIBZIG=f8735a8cc79db221d3c651c93778cfdb5066818d RAYLIBZIG_SHA256=7e350a197d1b7b222a1de363eda34dc4b632fd08fe297659bc990073345056d7 ZIG=0.11.0 ZIG_SHA256=c6ebf927bb13a707d74267474a9f553274e64906fd21bf1c75a20bde8cadf7b2 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/apple-master-${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 - } # O GitLab recusa o /-/archive/ para curl; a API entrega o mesmo commit. fetch "https://gitlab.com/api/v4/projects/zahnputzmonster%2Fapple-master/repository/archive.tar.gz?sha=$COMMIT" "apple-master-${COMMIT:0:7}.tar.gz" "$SHA256" fetch "https://github.com/raysan5/raylib/archive/$RAYLIB.tar.gz" "raylib-${RAYLIB:0:7}.tar.gz" "$RAYLIB_SHA256" fetch "https://github.com/Not-Nik/raylib-zig/archive/$RAYLIBZIG.tar.gz" "raylib-zig-${RAYLIBZIG:0:7}.tar.gz" "$RAYLIBZIG_SHA256" fetch "https://ziglang.org/download/$ZIG/zig-macos-aarch64-$ZIG.tar.xz" "zig-macos-aarch64-$ZIG.tar.xz" "$ZIG_SHA256" if [ ! -x "$tools/zig-$ZIG/zig" ]; then mkdir -p "$tools/zig-$ZIG.tmp" tar -xJf "$cache/zig-macos-aarch64-$ZIG.tar.xz" -C "$tools/zig-$ZIG.tmp" --strip-components 1 mv "$tools/zig-$ZIG.tmp" "$tools/zig-$ZIG" fi zig="$tools/zig-$ZIG/zig" [ "$("$zig" version)" = "$ZIG" ] || { echo "Zig $ZIG esperado em $zig." >&2; exit 1; } # shellcheck disable=SC1091 source "$tools/emsdk/emsdk_env.sh" >/dev/null 2>&1 emver="$(emcc --version 2>/dev/null | sed -n 1p)" case "$emver" in *" 6.0.10 "*) ;; *) echo "Emscripten 6.0.10 esperado (artifacts/tools/emsdk): $emver" >&2; exit 1 ;; esac rm -rf "$out" mkdir -p "$out/tree/ext/raylib" "$out/tree/ext/raylib-zig" "$out/obj" "$out/game" "$out/dist" tar -xzf "$cache/apple-master-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 tar -xzf "$cache/raylib-${RAYLIB:0:7}.tar.gz" -C "$out/tree/ext/raylib" --strip-components 1 tar -xzf "$cache/raylib-zig-${RAYLIBZIG:0:7}.tar.gz" -C "$out/tree/ext/raylib-zig" --strip-components 1 patch -s -p1 -d "$out/tree" < "$here/apple-master/apple-master-fredygames.patch" export ZIG_GLOBAL_CACHE_DIR="$out/zig-cache-global" ZIG_LOCAL_CACHE_DIR="$out/zig-cache-local" cd "$out/tree" # 1. o jogo "$zig" build-lib src/main.zig \ --mod raylib::ext/raylib-zig/lib/raylib-zig.zig \ --mod raylib-math:raylib-zig=raylib:ext/raylib-zig/lib/raylib-zig-math.zig \ --deps raylib,raylib-math \ -target wasm32-wasi -O ReleaseSmall -lc --name apple-master -femit-bin="$out/game/libapple-master.a" # 2. o raylib for f in rcore rshapes rtextures rtext rmodels raudio utils; do emcc -c -O3 -std=gnu99 -D_GNU_SOURCE -DGL_SILENCE_DEPRECATION=199309L -DPLATFORM_WEB -DGRAPHICS_API_OPENGL_ES2 \ -Iext/raylib/src -Iext/raylib/src/external/glfw/include "ext/raylib/src/$f.c" -o "$out/obj/$f.o" 2>/dev/null done # 3. o webhack.c do raylib-zig (o texto esta no build.zig dele, em "webhack_c") cat > "$out/webhack.c" <<'C' #include uintptr_t __stack_chk_guard; void __stack_chk_fail(void){} int errno; C "$zig" cc -target wasm32-wasi -c -o "$out/obj/webhack.o" "$out/webhack.c" # 4. a ligacao emcc -O3 -sFULL-ES3=1 -sUSE_GLFW=3 -sASYNCIFY "$out/game/libapple-master.a.o" "$out/obj/"*.o -o "$out/obj/index.html" 2>/dev/null [ -f "$out/obj/index.wasm" ] && [ -f "$out/obj/index.js" ] cp "$out/obj/index.js" "$out/obj/index.wasm" "$out/tree/html/index.html" "$out/tree/html/start.js" "$out/dist/" { echo "== apple-master (LICENSE, MIT) e arte (Assets.LICENSE, CC0 1.0): ver o LICENSE.txt do jogo no site" echo echo "== raylib (LICENSE, zlib)" cat "$out/tree/ext/raylib/LICENSE" echo echo "== raylib-zig (LICENSE, MIT)" cat "$out/tree/ext/raylib-zig/LICENSE" echo echo "== Zig $ZIG (biblioteca padrao, LICENSE, MIT)" cat "$tools/zig-$ZIG/LICENSE" echo echo "== Emscripten (LICENSE, MIT / UIUC)" cat "$tools/emsdk/upstream/emscripten/LICENSE" } > "$out/licenses.txt" # dist/ vira um tar.gz deterministico (datas fixas, ordem fixa, sem dono). find "$out/dist" -exec touch -t 202404180000 {} + ( 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 > "apple-master-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) rm -rf "$out/tree" "$out/obj" "$out/game" "$out/zig-cache-global" "$out/zig-cache-local" "$out/webhack.c" ls -l "$out/apple-master-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/apple-master-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt"