# Pecas comuns dos jogos de Jason Rohrer feitos sobre a biblioteca minorGems (Cultivation, Primrose, # Transcend): Emscripten 6.0.10, GLUT do Emscripten + emulacao de OpenGL 1.x, audio via SDL2 (portaudio # trocado por pa_sdl.cpp). Usar com `source`. Dominio publico, como os jogos. # # mgw_init confere o Emscripten e define $mgw_here, $mgw_root, $mgw_cache # mgw_fetch baixa (ou usa o cache) e confere o SHA-256; imprime o caminho # mgw_flags define o vetor MGW_CXXFLAGS (compilacao) e MGW_LINKFLAGS (ligacao) EMSCRIPTEN=6.0.10 # os arquivos de compatibilidade ficam ao lado deste (Builds/minorgems-web/, ou a mesma pasta na copia achatada # que o site hospeda com o jogo) mgw_compat="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" mgw_init() { mgw_slug="$1" mgw_here="$(cd "$(dirname "${BASH_SOURCE[1]}")" && pwd)" mgw_root="$(git -C "$mgw_here" rev-parse --show-toplevel 2>/dev/null || pwd)" mgw_cache="$mgw_root/artifacts/cache/$mgw_slug" if ! emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN "; then echo "Precisa do Emscripten $EMSCRIPTEN no PATH (source /emsdk_env.sh)." >&2 exit 1 fi } mgw_fetch() { local file="$mgw_here/$(basename "$2")" if [ ! -f "$file" ]; then file="$mgw_cache/$2" if [ ! -f "$file" ]; then mkdir -p "$(dirname "$file")" curl -fsSL -o "$file.part" "$1" mv "$file.part" "$file" fi fi echo "$3 $file" | shasum -a 256 -c - >&2 echo "$file" } # mgw_flags [sdl]: chamar de dentro da pasta de saida, com a arvore do jogo em ./src (caminhos relativos # nos .o). sdl = 2 (padrao: SDL2 do Emscripten, usada pelo pa_sdl.cpp) ou 1 (SDL 1.2 do Emscripten, para os # jogos que incluem ). mgw_flags() { local sdl="${1:-2}" MGW_CFLAGS=(-O2 -w -DLINUX -ffile-prefix-map="$PWD/=" -Isrc -include "$mgw_compat/glut-compat.h" -sUSE_SDL="$sdl" -sUSE_LIBPNG=1) MGW_CXXFLAGS=("${MGW_CFLAGS[@]}" -std=gnu++14 -fpermissive -Wno-register -Wno-c++11-narrowing) MGW_LINKFLAGS=(-O2 -w -lglut -lGL -sLEGACY_GL_EMULATION -sGL_UNSAFE_OPTS=0 -sUSE_SDL="$sdl" -sUSE_LIBPNG=1 -lidbfs.js -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=64MB -sSTACK_SIZE=2MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency) } # Instala o cabecalho do portaudio que os fontes incluem (a pasta portaudio nao vem nos tarballs do Debian). mgw_install_portaudio() { local dir="$1/minorGems/sound/portaudio" mkdir -p "$dir/pa_common" "$dir/pablio" cp "$mgw_compat/portaudio.h" "$dir/pa_common/portaudio.h" cp "$mgw_compat/pablio.h" "$dir/pablio/pablio.h" } # mgw_compile_all : compila em paralelo para obj/NNN-nome.o e preenche o vetor MGW_OBJS # (os fontes .c saem com emcc, os demais com em++). Chamar de dentro da pasta de saida, depois de mgw_flags. mgw_compile_all() { MGW_OBJS=() mkdir -p obj local i=0 s o for s in "$@"; do o="obj/$(printf '%03d' $i)-$(basename "$s").o" MGW_OBJS+=("$o") i=$((i + 1)) printf '%s\n%s\n' "$s" "$o" done > obj/list.txt export MGW_CFLAGS_STR="${MGW_CFLAGS[*]}" MGW_CXXFLAGS_STR="${MGW_CXXFLAGS[*]}" xargs -n 2 -P 8 bash -c 'case "$0" in *.c) emcc $MGW_CFLAGS_STR -c "$0" -o "$1";; *) em++ $MGW_CXXFLAGS_STR -c "$0" -o "$1";; esac' < obj/list.txt }