#!/usr/bin/env bash # Pecas comuns dos builds de jogos de 32blit do fredygames.com (ver a secao "32blit" da skill bundler). # Nao e executado direto: Builds/build-.sh faz `. "$here/32blit-web/common.sh"` e chama blit_build. # # O SDK do 32blit (MIT, github.com/32blit/32blit-sdk) ja traz o backend SDL com suporte ao Emscripten # (32blit-sdl/). Aqui ele e compilado de um commit fixo (sha256 do tarball), junto do jogo, com o Emscripten # 6.0.10 de artifacts/tools/emsdk e as ferramentas de assets do 32blit (python, versoes fixas em # requirements.txt) num venv em artifacts/tools/venv-32blit. Sem threads. A saida de cada jogo e # artifacts/build/32blit-/{index.html,.js,.wasm}; host.js e o resto vem de web.local. # # Variaveis que o build-.sh define antes de chamar blit_build: # SLUG pasta do jogo em Content/games e da saida # GAME_REPO "dono/repo" no GitHub # GAME_COMMIT commit (40 hex) do jogo # GAME_SHA256 sha256 do tarball https://github.com//archive/.tar.gz # PATCH (opcional) patch -p1 aplicado no fonte do jogo, caminho absoluto # GAME_SUBDIR (opcional) pasta do CMakeLists do jogo dentro do tarball # O nome do alvo (arquivo .js/.wasm), o titulo e o autor vem do `project()` e do metadata.yml do jogo. SDK_COMMIT=4adc0482010f80f82665e792e33c921bb708e0f1 SDK_SHA256=931f86ece0fa0e82c707ab156f26754394b971839fcdbd17d9806db0393e7854 EMSCRIPTEN=6.0.10 blit_here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" blit_root="$(git -C "$blit_here" rev-parse --show-toplevel 2>/dev/null || pwd)" blit_cache="$blit_root/artifacts/cache/32blit" blit_venv="$blit_root/artifacts/tools/venv-32blit" blit_fetch() { # repo commit sha256 destino local repo="$1" commit="$2" sha="$3" dest="$4" if [ ! -f "$dest" ]; then mkdir -p "$(dirname "$dest")" curl -fsSL -o "$dest.part" "https://github.com/$repo/archive/$commit.tar.gz" mv "$dest.part" "$dest" fi echo "$sha $dest" | shasum -a 256 -c - >&2 } blit_init() { if ! emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN "; then echo "Precisa do Emscripten $EMSCRIPTEN no PATH (source artifacts/tools/emsdk/emsdk_env.sh)." >&2 return 1 fi if [ ! -x "$blit_venv/bin/32blit" ]; then python3 -m venv "$blit_venv" "$blit_venv/bin/pip" install -q --disable-pip-version-check -r "$blit_here/requirements.txt" >&2 fi blit_fetch 32blit/32blit-sdk "$SDK_COMMIT" "$SDK_SHA256" "$blit_cache/sdk-${SDK_COMMIT:0:7}.tar.gz" } blit_build() { blit_init local out="$blit_root/artifacts/build/32blit-$SLUG" local work="$out/work" # caminho fixo: entra nos binarios, por isso o -ffile-prefix-map abaixo local tarball="$blit_cache/$SLUG-${GAME_COMMIT:0:7}.tar.gz" blit_fetch "$GAME_REPO" "$GAME_COMMIT" "$GAME_SHA256" "$tarball" rm -rf "$out" mkdir -p "$work/sdk" "$work/game" tar xzf "$blit_cache/sdk-${SDK_COMMIT:0:7}.tar.gz" -C "$work/sdk" --strip-components=1 tar xzf "$tarball" -C "$work/game" --strip-components=1 if [ -n "${PATCH:-}" ]; then patch -d "$work/game" -p1 --no-backup-if-mismatch < "$PATCH" >&2 fi local src="$work/game${GAME_SUBDIR:+/$GAME_SUBDIR}" local target title author target="$(sed -n 's/^project(\([^ )]*\).*/\1/Ip' "$src/CMakeLists.txt" | head -1)" title="$("$blit_venv/bin/python3" -I -c 'import sys,yaml;print(yaml.safe_load(open(sys.argv[1]))["title"])' "$src/metadata.yml")" author="$("$blit_venv/bin/python3" -I -c 'import sys,yaml;print(yaml.safe_load(open(sys.argv[1])).get("author","Unknown"))' "$src/metadata.yml")" local flags="-ffile-prefix-map=$work=. -Wno-deprecated" ( cd "$work" PATH="$blit_venv/bin:$PATH" emcmake cmake -Wno-dev -S "$src" -B "$work/build" \ -D32BLIT_DIR="$work/sdk" -DPYTHON_EXECUTABLE="$blit_venv/bin/python3" \ -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$flags" -DCMAKE_CXX_FLAGS="$flags" >&2 PATH="$blit_venv/bin:$PATH" cmake --build "$work/build" -j"$(sysctl -n hw.ncpu 2>/dev/null || nproc)" >&2 ) cp "$work/build/$target.js" "$work/build/$target.wasm" "$out/" sed -e "s|@TITLE@|$title|g" -e "s|@GAME@|$target|g" -e "s|@SAVEDIR@|/libsdl/$author/$title|g" \ "$blit_here/index.html.in" > "$out/index.html" rm -rf "$work" shasum -a 256 "$out/index.html" "$out/$target.js" "$out/$target.wasm" }