#!/usr/bin/env bash # Compila o C-Dogs SDL do fredygames.com: o jogo de acao de cima de Ronny Wester (1997) e de Cong Xu e # colaboradores (codigo GPL-2.0-ou-posterior, com partes BSD/MIT/zlib/ISC) em WebAssembly, com o Emscripten # 6.0.10 e as portas SDL2, SDL2_image, SDL2_mixer, ogg e vorbis dele, do jeito que o projeto ja faz em # make_emscripten.sh (IDBFS para configuracao e recordes, ASYNCIFY). # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-cdogs.sh # # Fonte: o commit 9343f5b do repositorio cxong/cdogs-sdl, conferido pelo SHA-256 e guardado em # artifacts/cache/cdogs/. O script tira dele (e o bundle.yaml tira do fonte hospedado, a mesma lista): # - src/cdogs/cwolfmap/: o importador de mapas do Wolfenstein 3D traz o OPL do MAME (fmopl.c), cuja # licenca proibe uso comercial; map_wolf_stub.c (cdogs/) ocupa o lugar de map_wolf.c e # cdogs-fredygames.patch tira as chamadas a ele de campaign_entry.c e map_new.c; # - data/.wolf3d, missions/WOLF3D e doc/license-mame.txt, do mesmo importador; # - as campanhas e mapas sem licenca livre registrada: ficam so as de missions/ e dogfights/ que trazem # LICENSE.md em CC0 (Sauer2, clovehoof, Cong Xu); as originais de Ronny Wester que outros jogadores # mandaram (sem autor, segundo o proprio Wester em doc/README_DATA.md), as copias de jogos comerciais # (Doom, Counter-Strike) e as musicas das campanhas sem credito (devhell1.xm, devhell2.ogg, # graveintent1.xm) ficam de fora. Os graficos, sons e musicas do jogo trazem credito por arquivo # (CC0, CC BY, CC BY-SA), conferidos no LICENSE.txt do jogo. # sys_config.h, que o CMake geraria, sai do modelo sys_config.h.cmake por sed. # # Saida: artifacts/build/cdogs-2.5.0-9343f5b/cdogs.{js,wasm,data}, que o bundle.yaml confere pelo SHA-256. set -euo pipefail COMMIT=9343f5b56144f1c4f663db9fb8341c0157917ffa SRC_SHA256=fb445840847615c09e25c005935aadd9738a72d56aaa7608b850b1bc4bc48c2b PRUNED_SHA256=8fdbe1318c6c4256fa6556f85a42ac08f03a99616eb1a24f1a284a4883306ca8 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/cdogs-2.5.0-${COMMIT:0:7}" cache="$root/artifacts/cache/cdogs" tarball="$cache/cdogs-$COMMIT.tar.gz" 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 aux() { if [ -f "$here/cdogs/$1" ]; then echo "$here/cdogs/$1"; else echo "$here/$1"; fi; } # Fonte tirado das pastas abaixo: a mesma lista do bundle.yaml (sources.remove). PRUNE=( src/cdogs/cwolfmap data/.wolf3d doc/license-mame.txt missions/WOLF3D missions/custom missions/ai_insurgency_2.cdogscpn missions/bem.cdogscpn missions/cyberdogs.cdogscpn missions/distress.cdogscpn missions/doom.cdogscpn missions/ogre.cdogscpn missions/Sand.cdogscpn missions/terror.cdogscpn missions/zombie.cdogscpn missions/devhell1.xm missions/devhell2.ogg missions/graveintent1.xm dogfights/cubicle.cdogscpn dogfights/de_dust.cdogscpn dogfights/doom_e1m1.cdogscpn dogfights/dungeon.cdogscpn dogfights/dwango5_map01.cdogscpn dogfights/map07.cdogscpn dogfights/temple_of_carnage.cdogscpn ) # O site hospeda o mesmo commit ja sem as pastas de PRUNE (cdogs-9343f5b.tar.gz, ao lado deste script); o # script aceita os dois. Tirar o que ja nao esta la nao faz nada. if [ -f "$here/cdogs-${COMMIT:0:7}.tar.gz" ]; then tarball="$here/cdogs-${COMMIT:0:7}.tar.gz" echo "$PRUNED_SHA256 $tarball" | shasum -a 256 -c - >&2 else if [ ! -f "$tarball" ]; then mkdir -p "$cache" curl -fsSL -o "$tarball.part" "https://github.com/cxong/cdogs-sdl/archive/$COMMIT.tar.gz" mv "$tarball.part" "$tarball" fi echo "$SRC_SHA256 $tarball" | shasum -a 256 -c - >&2 fi rm -rf "$out" mkdir -p "$out/work/obj" "$out/work/src" S="$out/work/src" tar xzf "$tarball" -C "$S" --strip-components=1 for p in "${PRUNE[@]}"; do rm -rf "${S:?}/$p"; done patch -d "$S" -p1 --no-backup-if-mismatch < "$(aux cdogs-fredygames.patch)" >&2 cp "$(aux map_wolf_stub.c)" "$S/src/cdogs/map_wolf_stub.c" sed -e 's|@VERSION@|2.5.0|; s|@CDOGS_DATA_DIR@|./|; s|@CDOGS_CFG_DIR@|.config/cdogs-sdl/|' \ "$S/src/cdogs/sys_config.h.cmake" > "$S/src/cdogs/sys_config.h" # O yajl espera seus cabecalhos publicos em , que o CMake do projeto copia; o yajl_version.h # sai do modelo (yajl 2.1.1). mkdir -p "$out/work/inc/yajl" cp "$S"/src/cdogs/yajl/api/yajl_{parse,gen,common,tree}.h "$out/work/inc/yajl/" sed -e 's|${YAJL_MAJOR}|2|g; s|${YAJL_MINOR}|1|g; s|${YAJL_MICRO}|1|g' \ "$S/src/cdogs/yajl/api/yajl_version.h.cmake" > "$out/work/inc/yajl/yajl_version.h" PORTS=(-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png"]' -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["ogg"]' -sUSE_VORBIS=1 -sUSE_OGG=1) FLAGS=(-O2 -w -D PB_FIELD_16BIT=1 -D YAJL_BUILD -ffile-prefix-map="$out/work/=" -I"$S/src" -I"$S/src/cdogs" -I"$S/src/proto/nanopb" -I"$S/src/cdogs/enet/include" -I"$S/src/cdogs/include" -I"$out/work/inc" "${PORTS[@]}") srcs=() while IFS= read -r f; do srcs+=("$f"); done < <( { ls "$S"/src/*.c; find "$S/src/cdogs" -name '*.c' ! -name map_wolf.c; ls "$S"/src/base64/base64.c "$S"/src/json/*.c "$S"/src/proto/*.c \ "$S"/src/proto/nanopb/*.c; } | LC_ALL=C sort) objs=() for f in "${srcs[@]}"; do rel="${f#"$S/"}" o="$out/work/obj/${rel//\//_}.o" objs+=("$o") emcc "${FLAGS[@]}" -c "$f" -o "$o" done # Dados: so o que o jogo le, nas pastas de sempre; liga de dentro da pasta de saida com caminhos relativos. mkdir -p "$out/doc" cp -R "$S/data" "$S/graphics" "$S/music" "$S/sounds" "$S/missions" "$S/dogfights" "$out/" cp "$S/doc/CREDITS" "$S/doc/AUTHORS" "$out/doc/" find "$out" -name .DS_Store -delete ( cd "$out" emcc -O2 "${objs[@]}" "${PORTS[@]}" -lidbfs.js \ -sASYNCIFY -sSTACK_SIZE=2097152 -sINITIAL_MEMORY=128mb -sALLOW_MEMORY_GROWTH=1 -sENVIRONMENT=web \ -sEXPORTED_RUNTIME_METHODS=FS \ --preload-file data --preload-file doc --preload-file dogfights --preload-file graphics \ --preload-file missions --preload-file music --preload-file sounds \ -o cdogs.js ) rm -rf "$out/work" "$out/data" "$out/doc" "$out/dogfights" "$out/graphics" "$out/missions" "$out/music" "$out/sounds" shasum -a 256 "$out/cdogs.js" "$out/cdogs.wasm" "$out/cdogs.data"