#!/usr/bin/env bash # Compila o Blupimania (Daniel Roux e EPSITEC SA, 1994-96; Mathieu Schroeter, 2023; codigo e recursos GPL-3.0-or-later) # do commit cd14390 de github.com/blupi-games/blupimania para o fredygames.com, com o Emscripten 6.0.10. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-blupimania.sh # precisa tambem de cmake, make e sed # # O repositorio e o SDL2 "de area de trabalho" (o CMakeLists dele manda compilar src/platform/*_js.*, que nao existe; # o blupimania-dev tambem nao tem). Aqui os mesmos .c sao compilados direto com o emcc, sem o CMake do projeto, com as # portas SDL2 2.32.10, SDL2_image 2.6.0 e SDL2_mixer 2.8.0 do Emscripten (libogg, libvorbis, libpng, zlib) e o libwebp # 1.5.0 (BSD-3-Clause) compilado aqui: as 95 imagens do jogo sao .webp, lidas pelo sdl/SDL3_IMG_webp.c do proprio jogo. # O laco principal bloqueia em SDL_WaitEvent, entao o link usa -sASYNCIFY. Sem libcurl (a checagem de versao pela rede # fica desligada, como no CMakeLists). Os dados (data/, image/, sound/, music/) vao em share/blupimania num # blupimania.data que o proprio Emscripten carrega (--preload-file), onde o jogo os procura ("../share/blupimania"). # blupimania/blupimania-fredygames.patch: o save fica em /saves/blupimania (a pagina monta o IndexedDB ali) e "Quit" # recarrega o jogo (no navegador nao ha para onde voltar). # # Saida: artifacts/build/blupimania-cd14390/blupimania.{js,wasm,data} set -euo pipefail COMMIT=cd143907a82f2ba277e7eff00a6d9a1949a026e6 SHA256=76602edd340d66dc8416571d74477bc114c0b012621f5d14160ab6e3612a2c91 WEBP=1.5.0 WEBP_SHA256=668c9aba45565e24c27e17f7aaf7060a399f7f31dba6c97a044e1feacb930f37 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/blupimania-${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; } for tool in cmake make sed; do command -v "$tool" >/dev/null || { echo "Precisa do $tool no PATH." >&2; exit 1; }; done # Arquivo auxiliar: em blupimania/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/blupimania/$1" ]; then echo "$here/blupimania/$1"; else echo "$here/$1"; fi; } mkdir -p "$cache" fetch() { # nome url sha256 [ -f "$cache/$1" ] || curl -fsSL --retry 4 "$2" -o "$cache/$1" echo "$3 $cache/$1" | shasum -a 256 -c - >/dev/null } fetch "blupimania-${COMMIT:0:7}.tar.gz" "https://github.com/blupi-games/blupimania/archive/$COMMIT.tar.gz" "$SHA256" fetch "libwebp-$WEBP.tar.gz" "https://github.com/webmproject/libwebp/archive/refs/tags/v$WEBP.tar.gz" "$WEBP_SHA256" rm -rf "$out" mkdir -p "$out/src" "$out/webp" "$out/webp-build" "$out/inc" "$out/pre/share/blupimania" tar -xzf "$cache/blupimania-${COMMIT:0:7}.tar.gz" -C "$out/src" --strip-components 1 tar -xzf "$cache/libwebp-$WEBP.tar.gz" -C "$out/webp" --strip-components 1 ( cd "$out/src" && patch -p1 < "$(aux blupimania-fredygames.patch)" ) # libwebp: so o decodificador e o demux (as imagens animadas), sem utilitarios nem threads. ( cd "$out/webp-build" && emcmake cmake ../webp -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF \ -DWEBP_BUILD_ANIM_UTILS=OFF -DWEBP_BUILD_CWEBP=OFF -DWEBP_BUILD_DWEBP=OFF -DWEBP_BUILD_GIF2WEBP=OFF \ -DWEBP_BUILD_IMG2WEBP=OFF -DWEBP_BUILD_VWEBP=OFF -DWEBP_BUILD_WEBPINFO=OFF -DWEBP_BUILD_WEBPMUX=OFF \ -DWEBP_BUILD_EXTRAS=OFF -DWEBP_BUILD_LIBWEBPMUX=OFF -DWEBP_USE_THREAD=OFF "-DCMAKE_INSTALL_PREFIX=$out/webp-inst" > cmake.log 2>&1 \ && emmake make -j"$(sysctl -n hw.ncpu 2>/dev/null || nproc)" install > make.log 2>&1 ) || { tail -20 "$out/webp-build"/*.log; exit 1; } sed -e 's/@BM_VERSION_MAJOR@/1/;s/@BM_VERSION_MINOR@/6/;s/@BM_VERSION_PATCH@/3/;s/@BM_VERSION_EXTRA@//;s/@CMAKE_INSTALL_BINDIR@/bin/' \ "$out/src/src/config.h.in" > "$out/inc/config.h" for d in data image sound music; do cp -R "$out/src/resources/$d" "$out/pre/share/blupimania/$d"; done ( cd "$out/src/src" && emcc -O2 -I"$out/inc" -I"$out/webp-inst/include" -I. \ -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 "-sSDL2_IMAGE_FORMATS=['png']" -sUSE_SDL_MIXER=2 -sUSE_OGG=1 -sUSE_VORBIS=1 -sUSE_LIBPNG=1 -sUSE_ZLIB=1 \ *.c argtable3/argtable3.c sdl/SDL3_IMG_webp.c \ "$out/webp-inst/lib/libwebpdemux.a" "$out/webp-inst/lib/libwebp.a" "$out/webp-inst/lib/libsharpyuv.a" \ -sASYNCIFY -sALLOW_MEMORY_GROWTH=1 -lidbfs.js "-sEXPORTED_RUNTIME_METHODS=FS" \ --preload-file "$out/pre/share@/share" -o "$out/blupimania.js" ) rm -rf "$out/src" "$out/webp" "$out/webp-build" "$out/webp-inst" "$out/inc" "$out/pre" shasum -a 256 "$out"/blupimania.*