#!/usr/bin/env bash # Compila KIP KEPLER (reneweller-coding/KipKepler, AGPL-3.0; C++20 + raylib 5.5) do commit 9eca7cc (v1.4.0) para o # fredygames.com com o Emscripten 6.0.10. O jogo so tem builds de Windows e Linux; esta e a versao web nossa: # - raylib 5.5 do proprio repositorio (third_party/raylib, zlib) compilado com PLATFORM_WEB e OpenGL ES 3 (WebGL 2); # - kip-kepler/web.patch (publicado junto do fonte, como a AGPL pede): janela do tamanho da pagina, sem tela cheia # no inicio nem limite de FPS (o navegador marca o ritmo), sem o item "Quit" (uma pagina nao tem janela para # fechar), sem motor de vibracao do controle (Rumble.cpp so conhece XInput e evdev), os dois shaders com o cabecalho GLSL ES 3.00, o editor e o verificador de fases sem threads, e no # raylib o WindowShouldClose espera o proximo quadro do navegador (requestAnimationFrame) em vez de dormir 16 ms # e o WaitTime nao faz nada (no navegador o nanosleep so giraria em falso: o limite de FPS das opcoes nao vale); # - ASYNCIFY (o laco while (!WindowShouldClose()) do jogo fica como esta), assets/ empacotado em index.data (/assets); # - a pagina e nossa (kip-kepler/shell.html + host.js): saves no IndexedDB, nada pedido fora do site. # Dois builds seguidos tem que dar os mesmos bytes. # # src/FredGames.Bundler/Builds/build-kip-kepler.sh # # Saida: artifacts/build/kip-kepler-9eca7cc/{kip-kepler-9eca7cc-dist.tar.gz,licenses.txt} set -euo pipefail COMMIT=9eca7cce4dab8c03cc01c0f7cf0aaf05f1640305 SHA256=68da9930d5d7000bfc4943590b06b35b5ee23e85f8cd014c14315252adb145ab EMSCRIPTEN=6.0.10 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/kip-kepler-${COMMIT:0:7}" cache="$root/artifacts/build/cache" if ! emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN "; then [ -f "$root/artifacts/tools/emsdk/emsdk_env.sh" ] && source "$root/artifacts/tools/emsdk/emsdk_env.sh" >/dev/null 2>&1 fi emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN " || { echo "Precisa do Emscripten $EMSCRIPTEN no PATH." >&2; exit 1; } mkdir -p "$cache" tgz="$cache/KipKepler-${COMMIT:0:7}.tar.gz" [ -f "$tgz" ] || curl -fsSL --retry 4 "https://github.com/reneweller-coding/KipKepler/archive/$COMMIT.tar.gz" -o "$tgz" echo "$SHA256 $tgz" | shasum -a 256 -c - >/dev/null rm -rf "$out"; mkdir -p "$out/tree" "$out/obj" "$out/dist" tar -xzf "$tgz" -C "$out/tree" --strip-components 1 cd "$out/tree" patch -p1 --no-backup-if-mismatch < "$here/kip-kepler/web.patch" > /dev/null find assets -exec touch -t 202611010000 {} + cp "$here/kip-kepler/shell.html" "$here/kip-kepler/host.js" . jobs="$(sysctl -n hw.ncpu 2>/dev/null || nproc)" map="-ffile-prefix-map=$out/tree/=kipkepler/" rl=third_party/raylib/src for c in rcore rshapes rtextures rtext rmodels raudio utils; do echo "emcc -O2 $map -DPLATFORM_WEB -DGRAPHICS_API_OPENGL_ES3 -I$rl -I$rl/external/glfw/include -c $rl/$c.c -o $out/obj/rl_$c.o" done > "$out/jobs.txt" for f in src/*.cpp; do echo "em++ -O2 $map -std=c++20 -fwrapv -DNDEBUG -DPLATFORM_WEB -DKEPLER_ASSETS=\\\"/assets\\\" -DKEPLER_VERSION=\\\"1.4.0\\\" -I$rl -c $f -o $out/obj/$(basename "$f" .cpp).o" done >> "$out/jobs.txt" tr '\n' '\0' < "$out/jobs.txt" | xargs -0 -n 1 -P "$jobs" sh -c > "$out/compile.log" 2>&1 || { tail -40 "$out/compile.log"; exit 1; } objs=(); while IFS= read -r o; do objs+=("$o"); done < <(cd "$out" && find obj -name '*.o' | LC_ALL=C sort) ( cd "$out" && em++ -O2 "${objs[@]}" -o dist/index.html \ --shell-file tree/shell.html --preload-file tree/assets@/assets \ -sUSE_GLFW=3 -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 -sENVIRONMENT=web \ -sASYNCIFY -sASYNCIFY_STACK_SIZE=65536 -sSTACK_SIZE=4MB -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=128MB \ -lidbfs.js -sEXPORTED_RUNTIME_METHODS=HEAPF32,FS,IDBFS,addRunDependency,removeRunDependency \ -sWASM_BIGINT ) > "$out/link.log" 2>&1 || { tail -40 "$out/link.log"; exit 1; } cp tree/host.js dist/ 2>/dev/null || cp "$out/tree/host.js" "$out/dist/" if grep -rl "$HOME" "$out/dist" >/dev/null; then echo "Caminho desta maquina no build:" >&2; grep -rl "$HOME" "$out/dist" >&2; exit 1; fi { echo "== KIP KEPLER (LICENSE, GNU AGPL 3.0): ver o LICENSE.txt do jogo no site" echo; echo "== raylib 5.5 (third_party/raylib/LICENSE, zlib)"; cat third_party/raylib/LICENSE echo; echo "== Emscripten (LICENSE, MIT / UIUC)"; cat "$root/artifacts/tools/emsdk/upstream/emscripten/LICENSE" } > "$out/licenses.txt" find "$out/dist" -exec touch -t 202611010000 {} + ( 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 > "kip-kepler-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) cd "$root"; rm -rf "$out/tree" "$out/obj" "$out/jobs.txt" shasum -a 256 "$out/kip-kepler-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt" "$out"/dist/*