juegos

Juegos de terminal de Pancho: Catan (TUI, GUI, web, servidor, PicoCalc), ajedrez, calculadora y minijuegos
git clone https://git.lu3dhn.xyz/juegos.git
Log | Files | Refs

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