Makefile (8557B)
1 CC ?= cc 2 CFLAGS ?= -O2 -g 3 CFLAGS += -std=c99 -Wall -Wextra -Wshadow -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 4 COMUN ?= ../comun 5 include $(COMUN)/comun.mk 6 CPPFLAGS += -I. $(COMUN_INC) -DFORM_MAX_FIELDS=32 7 # version que se ve en el menu: el tag de git (v1.0, v1.0-3-gabc123 si hay commits despues, 8 # -dirty si hay cambios sin commitear); sin git, "dev". linux/version.h se reescribe solo si 9 # cambia, asi tagear recompila el cliente. 10 VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) 11 $(shell printf '#define APP_VERSION "%s"\n' '$(VERSION)' > linux/version.h.tmp; \ 12 cmp -s linux/version.h.tmp linux/version.h || mv linux/version.h.tmp linux/version.h; rm -f linux/version.h.tmp) 13 CORE := $(wildcard core/*.c) 14 GFX := $(wildcard gfx/*.c) 15 LINUX := $(wildcard linux/*.c) 16 SERVER := server/catan_game.c server/export.c 17 HDRS := $(wildcard core/*.h gfx/*.h linux/*.h server/*.h) app_config.h $(COMUN_HDRS) 18 NCURSES := $(shell pkg-config --libs ncursesw 2>/dev/null || echo -lncursesw) 19 SDL := $(shell pkg-config --cflags --libs sdl3 2>/dev/null) 20 LDLIBS += $(NCURSES) $(SDL) -lm 21 22 CLIENT_SRC := $(CORE) $(GFX) $(LINUX) $(SERVER) $(COMUN_BASE) $(COMUN_GFX) $(COMUN_LINUX) $(COMUN_TUI) $(COMUN_GUI) $(COMUN_SERVER) 23 SERVER_SRC := $(CORE) $(SERVER) server/main.c $(COMUN_BASE) $(COMUN_SERVER) 24 SIM_SRC := $(CORE) $(GFX) pico/app.c $(COMUN_BASE) $(COMUN_GFX) $(COMUN_SIM) 25 26 all: catan catan-server catan-picosim 27 28 catan: $(CLIENT_SRC) $(HDRS) 29 $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $(CLIENT_SRC) $(LDLIBS) 30 31 # servidor: solo nucleo + server, sin ncurses ni SDL (estatico para copiar al VPS) 32 catan-server: $(SERVER_SRC) $(HDRS) 33 $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $(SERVER_SRC) 34 35 catan-server-static: $(SERVER_SRC) $(HDRS) 36 $(CC) $(CPPFLAGS) $(CFLAGS) -static -o catan-server $(SERVER_SRC) 37 38 # simulador de la PicoCalc en la PC (mismo codigo que el firmware, con SDL) 39 catan-picosim: $(SIM_SRC) $(HDRS) 40 $(CC) $(CPPFLAGS) $(CFLAGS) -DCATAN_SMALL -o $@ $(SIM_SRC) $(SDL) 41 42 # Windows: un solo catan.exe con SDL3 estatico (sin TUI), compilado en cruzado con MinGW. 43 # Necesita mingw-w64-gcc y la fuente de SDL3 (SDL3-x.y.z.tar.gz de los releases de SDL); 44 # la primera vez compila SDL3 estatico en WIN_SDL. 45 WIN_CC ?= x86_64-w64-mingw32-gcc 46 WIN_SDL_SRC ?= $(HOME)/.local/opt/src/SDL3-3.4.16 47 WIN_SDL ?= $(HOME)/.local/opt/SDL3-mingw-static 48 WIN_SRC := $(filter-out linux/tui.c $(COMUN_TUI),$(CLIENT_SRC)) 49 50 $(WIN_SDL)/lib/libSDL3.a: 51 cmake -S $(WIN_SDL_SRC) -B $(WIN_SDL_SRC)/build-mingw -G Ninja \ 52 -DCMAKE_TOOLCHAIN_FILE=$(WIN_SDL_SRC)/build-scripts/cmake-toolchain-mingw64-x86_64.cmake \ 53 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(WIN_SDL) \ 54 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DSDL_TESTS=OFF -DSDL_EXAMPLES=OFF 55 cmake --build $(WIN_SDL_SRC)/build-mingw 56 cmake --install $(WIN_SDL_SRC)/build-mingw 57 58 catan.exe: $(WIN_SRC) $(HDRS) $(WIN_SDL)/lib/libSDL3.a 59 $(WIN_CC) $(CPPFLAGS) -I$(WIN_SDL)/include $(CFLAGS) -static -mwindows -o $@ $(WIN_SRC) \ 60 $$(PKG_CONFIG_LIBDIR=$(WIN_SDL)/lib/pkgconfig pkg-config --static --libs sdl3) -lws2_32 -lm 61 x86_64-w64-mingw32-strip $@ 62 63 windows: catan.exe 64 65 # Lo que se reparte: catan.exe y el catan de Linux (compilado en un Ubuntu 22.04 con docker 66 # para que corra en distros no tan nuevas), sueltos, en release/. make publish los sube a 67 # https://catan.lu3dhn.xyz/descargas/ y empuja el codigo al git (CT111 y espejo publico). 68 # el de Linux se compila en docker con una imagen que ya tiene SDL3 (ver linux-release.sh); 69 # por defecto en el CT112 por ssh (tiene docker y no hace falta sudo); RELEASE_HOST=local 70 # usa el docker de esta compu (sudo con popup) 71 RELEASE_HOST ?= ct112-remoto 72 release: catan.exe 73 mkdir -p release 74 cp catan.exe release/catan.exe 75 RELEASE_HOST=$(RELEASE_HOST) tools/linux-release.sh "$(VERSION)" release/catan-linux 76 77 publish: release 78 cd .. && git push origin main --tags && git push publico main --tags 79 scp release/catan.exe release/catan-linux vps:/var/www/descargas/ 80 ssh vps 'chmod a+r /var/www/descargas/*' 81 82 # Web (PWA para el telefono): el mismo cliente (sin TUI ni red local) compilado a 83 # WebAssembly con emscripten y SDL3 estatico, servido desde web/dist. Necesita emscripten 84 # (pacman -S emscripten; source /etc/profile.d/emscripten.sh) y la fuente de SDL3 (la 85 # misma que usa Windows); la primera vez compila SDL3 para wasm en $(WEB_SDL). 86 # Los bucles bloqueantes del cliente andan tal cual gracias a -sASYNCIFY (SDL y poll() 87 # ceden al navegador); los sockets van por WebSocket (web/shell.html pone la URL). 88 EMCC ?= emcc 89 WEB_SDL_SRC ?= $(WIN_SDL_SRC) 90 WEB_SDL ?= $(HOME)/.local/opt/SDL3-em 91 WEB_SRC := $(filter-out linux/tui.c $(COMUN_TUI),$(CLIENT_SRC)) 92 WEB_OUT := web/dist 93 WEB_CFLAGS := $(filter-out -O2 -g -std=c99,$(CFLAGS)) -std=gnu99 -Os # EM_ASM necesita gnu99 94 WEB_LDFLAGS := -sUSE_SDL=0 -sASYNCIFY -sASYNCIFY_STACK_SIZE=65536 -sSTACK_SIZE=1048576 -sALLOW_MEMORY_GROWTH \ 95 -sEXPORTED_RUNTIME_METHODS=UTF8ToString,stringToUTF8,FS -lidbfs.js \ 96 --pre-js web/pre.js --shell-file web/shell.html 97 98 $(WEB_SDL)/lib/libSDL3.a: 99 emcmake cmake -S $(WEB_SDL_SRC) -B $(WEB_SDL_SRC)/build-em -G Ninja -DCMAKE_BUILD_TYPE=Release \ 100 -DSDL_SHARED=OFF -DSDL_STATIC=ON -DSDL_PTHREADS=OFF -DSDL_TESTS=OFF -DSDL_EXAMPLES=OFF \ 101 -DCMAKE_INSTALL_PREFIX=$(WEB_SDL) 102 cmake --build $(WEB_SDL_SRC)/build-em 103 cmake --install $(WEB_SDL_SRC)/build-em 104 105 web: $(WEB_SRC) $(HDRS) $(WEB_SDL)/lib/libSDL3.a web/shell.html web/pre.js web/sw.js web/manifest.json web/icon-192.png 106 mkdir -p $(WEB_OUT) 107 $(EMCC) $(CPPFLAGS) -I$(WEB_SDL)/include $(WEB_CFLAGS) $(WEB_LDFLAGS) -o $(WEB_OUT)/index.html $(WEB_SRC) $(WEB_SDL)/lib/libSDL3.a 108 cp web/manifest.json web/icon-192.png web/icon-512.png $(WEB_OUT)/ 109 sed "s/@VERSION@/$$(cat $(WEB_OUT)/index.html $(WEB_OUT)/index.js $(WEB_OUT)/index.wasm $(WEB_OUT)/manifest.json web/sw.js | sha1sum | cut -c1-12)/" web/sw.js > $(WEB_OUT)/sw.js 110 @ls -la $(WEB_OUT)/index.wasm | awk '{ print "wasm:", $$5, "bytes" }' 111 112 web/icon-%.png: web/mkicon.py 113 python3 web/mkicon.py 114 115 # sube web/dist al VPS (Caddy sirve /var/www/catan en https://catan.lu3dhn.xyz); sin rsync 116 # porque el VPS no lo tiene: tar por ssh, borrando la version anterior 117 deploy-web: web 118 tar -C $(WEB_OUT) -cz . | ssh vps 'sudo mkdir -p /var/www/catan && sudo find /var/www/catan -mindepth 1 -delete && sudo tar -xz -C /var/www/catan && sudo chown -R caddy:caddy /var/www/catan && ls /var/www/catan' 119 120 # firmware para la PicoCalc (necesita arm-none-eabi-gcc y PICO_SDK_PATH) 121 pico: 122 cmake -S pico -B pico/build -DPICO_SDK_PATH=$${PICO_SDK_PATH:-$$HOME/pico-sdk} -DCOMUN_DIR=$(abspath $(COMUN)) && $(MAKE) -C pico/build -j4 123 @mkdir -p sd/pico1-apps sd/firmware 124 cp pico/build/catan_picocalc.uf2 sd/pico1-apps/Catan.uf2 125 cp pico/build/catan_picocalc_sd200k.bin sd/firmware/Catan.bin 126 python3 $(COMUN_TOOLS)/patch_reset.py pico/build/catan_picocalc_sd200k.elf sd/firmware/Catan.bin 127 @test -f sd/CATAN.LOG || head -c 262144 /dev/zero | tr '\0' ' ' > sd/CATAN.LOG 128 @test -f sd/CATAN.SAV || head -c 81920 /dev/zero > sd/CATAN.SAV 129 @echo "Listo: copiá el contenido de sd/ a la raíz de la tarjeta SD de la PicoCalc" 130 @echo "CATAN.LOG y CATAN.SAV van solo la primera vez: si los pisás, perdés el log y la partida guardada" 131 132 # Duelo nueva vs vieja: catan-duel lleva ademas la search.c de DUEL_BASE (un tag o commit 133 # del git) con el simbolo renombrado; --duel ahi enfrenta la busqueda nueva contra la vieja 134 # en la misma partida, rotando asientos. Asi se ve si un cambio del bot es positivo. 135 # (va en duel/, no en core/: core/*.c lo recorren este Makefile y el CMake de la Pico) 136 DUEL_BASE ?= $(shell git describe --tags --abbrev=0 2>/dev/null || echo v1.1.2) 137 duel/search_old.c: FORCE 138 mkdir -p duel 139 git show $(DUEL_BASE):catan/core/search.c > $@ 140 duel/search_old.o: duel/search_old.c $(HDRS) 141 $(CC) $(CPPFLAGS) -Icore $(CFLAGS) -Dsearch_decide=search_old_decide -c $< -o $@ 142 catan-duel: $(CLIENT_SRC) $(HDRS) duel/search_old.o 143 $(CC) $(CPPFLAGS) $(CFLAGS) -DDUEL_OLD -o $@ $(CLIENT_SRC) duel/search_old.o $(LDLIBS) 144 FORCE: 145 146 debug: 147 $(MAKE) -B catan CFLAGS="-O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer" 148 149 test: catan 150 ./catan --selftest 151 ./catan --sim 200 4 152 ./catan --sim 200 2 2p 153 ./catan --sim 100 6 154 ./catan --sim 100 4 mar 155 ./catan --sim 50 4 islas 1 156 ./catan --sim 50 3 archi 4 157 ./catan --duel 8 4 100 8 158 ./catan --duel 4 2 100 8 2p 159 160 clean: 161 rm -f catan catan-server catan-picosim catan.exe 162 rm -rf pico/build 163 164 .PHONY: all debug test clean pico catan-server-static windows web deploy-web release publish FORCE