From 28606a9fe11af6a9240c394bd29cb4f9ed95144d Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 17 Apr 2026 12:59:51 +0200 Subject: [PATCH] arreglos en make i cmake per estandaritzar amb la resta de projectes Co-Authored-By: Claude Opus 4.7 (1M context) --- CMakeLists.txt | 58 ++++++++++++++ Makefile | 143 ++++++++++++++++++++++++++-------- source/defines.hpp | 5 ++ tools/pack_resources/Makefile | 52 ------------- 4 files changed, 174 insertions(+), 84 deletions(-) create mode 100644 source/defines.hpp delete mode 100644 tools/pack_resources/Makefile diff --git a/CMakeLists.txt b/CMakeLists.txt index 3744404..d327bb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,6 +109,7 @@ endif() find_program(CLANG_TIDY_EXE NAMES clang-tidy) find_program(CLANG_FORMAT_EXE NAMES clang-format) +find_program(CPPCHECK_EXE NAMES cppcheck) # Recopilar todos los archivos fuente para analisis file(GLOB_RECURSE ALL_SOURCE_FILES @@ -128,6 +129,11 @@ list(FILTER FORMAT_SOURCES EXCLUDE REGEX ".*stb_image\\.h$") list(FILTER FORMAT_SOURCES EXCLUDE REGEX ".*stb_vorbis\\.c$") list(FILTER FORMAT_SOURCES EXCLUDE REGEX ".*jail_audio\\.hpp$") +# Para cppcheck, pasar solo .cpp (los headers se procesan transitivamente). +set(CPPCHECK_SOURCES ${ALL_SOURCE_FILES}) +list(FILTER CPPCHECK_SOURCES INCLUDE REGEX ".*\\.cpp$") +list(FILTER CPPCHECK_SOURCES EXCLUDE REGEX ".*stb_vorbis\\.c$") + # Targets de clang-tidy if(CLANG_TIDY_EXE) add_custom_target(tidy @@ -171,3 +177,55 @@ if(CLANG_FORMAT_EXE) else() message(STATUS "clang-format no encontrado - targets 'format' y 'format-check' no disponibles") endif() + +# Target de cppcheck +if(CPPCHECK_EXE) + add_custom_target(cppcheck + COMMAND ${CPPCHECK_EXE} + --enable=warning,style,performance,portability + --std=c++20 + --language=c++ + --inline-suppr + --suppress=missingIncludeSystem + --suppress=toomanyconfigs + --quiet + -I ${CMAKE_SOURCE_DIR}/source + ${CPPCHECK_SOURCES} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Running cppcheck..." + ) +else() + message(STATUS "cppcheck no encontrado - target 'cppcheck' no disponible") +endif() + +# --- EINA STANDALONE: pack_resources --- +# Executable auxiliar que empaqueta `data/` a `resources.pack`. +# No es compila per defecte (EXCLUDE_FROM_ALL). Build explícit: +# cmake --build build --target pack_resources +# Després executar: ./build/pack_resources data resources.pack +if(NOT EMSCRIPTEN) + add_executable(pack_resources EXCLUDE_FROM_ALL + tools/pack_resources/pack_resources.cpp + source/resource_pack.cpp + ) + target_include_directories(pack_resources PRIVATE "${CMAKE_SOURCE_DIR}/source") + target_compile_options(pack_resources PRIVATE -Wall) + + # Regeneració automàtica de resources.pack en cada build si canvia data/. + file(GLOB_RECURSE DATA_FILES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/data/*") + set(RESOURCE_PACK "${CMAKE_SOURCE_DIR}/resources.pack") + + add_custom_command( + OUTPUT ${RESOURCE_PACK} + COMMAND $ + "${CMAKE_SOURCE_DIR}/data" + "${RESOURCE_PACK}" + DEPENDS pack_resources ${DATA_FILES} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Empaquetant data/ → resources.pack" + VERBATIM + ) + + add_custom_target(resource_pack ALL DEPENDS ${RESOURCE_PACK}) + add_dependencies(${PROJECT_NAME} resource_pack) +endif() diff --git a/Makefile b/Makefile index 0e9504d..87dc593 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,6 @@ # ============================================================================== DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST))) DIR_BIN := $(addsuffix /, $(DIR_ROOT)) -DIR_PACK_TOOL := tools/pack_resources # ============================================================================== # TARGET NAMES @@ -11,12 +10,34 @@ DIR_PACK_TOOL := tools/pack_resources TARGET_NAME := coffee_crisis TARGET_FILE := $(DIR_BIN)$(TARGET_NAME) APP_NAME := Coffee Crisis -VERSION := v2.3.3 DIST_DIR := dist RELEASE_FOLDER := dist/_tmp RELEASE_FILE := $(RELEASE_FOLDER)/$(TARGET_NAME) RESOURCE_FILE := release/windows/coffee.res +# ============================================================================== +# VERSION (extracted from defines.hpp) +# ============================================================================== +ifeq ($(OS),Windows_NT) + VERSION := $(shell powershell -Command "(Select-String -Path 'source/defines.hpp' -Pattern 'constexpr const char\* VERSION = \"(.+?)\"').Matches.Groups[1].Value") +else + VERSION := $(shell grep 'constexpr const char\* VERSION' source/defines.hpp | sed -E 's/.*VERSION = "([^"]+)".*/\1/') +endif + +# ============================================================================== +# GIT HASH (computat al host, passat a CMake via -DGIT_HASH) +# Evita que CMake haja de cridar git des de Docker/emscripten on falla per +# "dubious ownership" del volum muntat. +# ============================================================================== +ifeq ($(OS),Windows_NT) + GIT_HASH := $(shell git rev-parse --short=7 HEAD 2>NUL) +else + GIT_HASH := $(shell git rev-parse --short=7 HEAD 2>/dev/null) +endif +ifeq ($(GIT_HASH),) + GIT_HASH := unknown +endif + # ============================================================================== # RELEASE NAMES # ============================================================================== @@ -53,55 +74,67 @@ endif ifeq ($(OS),Windows_NT) WIN_TARGET_FILE := $(DIR_BIN)$(APP_NAME) WIN_RELEASE_FILE := $(RELEASE_FOLDER)/$(APP_NAME) + # Escapa apòstrofs per a PowerShell (duplica ' → ''). Sense això, APP_NAMEs + # com "JailDoctor's Dilemma" trencarien el parsing de -Destination '...'. + WIN_RELEASE_FILE_PS := $(subst ','',$(WIN_RELEASE_FILE)) else WIN_TARGET_FILE := $(TARGET_FILE) WIN_RELEASE_FILE := $(RELEASE_FILE) + WIN_RELEASE_FILE_PS := $(WIN_RELEASE_FILE) +endif + +# ============================================================================== +# CMAKE GENERATOR (Windows needs explicit MinGW Makefiles generator) +# ============================================================================== +ifeq ($(OS),Windows_NT) + CMAKE_GEN := -G "MinGW Makefiles" +else + CMAKE_GEN := endif # ============================================================================== # COMPILACIÓN CON CMAKE # ============================================================================== -all: resources.pack - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +all: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) @cmake --build build -debug: resources.pack - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug +debug: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Debug -DGIT_HASH=$(GIT_HASH) @cmake --build build # ============================================================================== -# REGLAS PARA HERRAMIENTA DE EMPAQUETADO Y RESOURCES.PACK +# EMPAQUETADO DE RECURSOS (build previ de l'eina + execució) # ============================================================================== -pack_tool: - @$(MAKE) -C $(DIR_PACK_TOOL) - -resources.pack: - @$(MAKE) -C $(DIR_PACK_TOOL) pack +pack: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) + @cmake --build build --target pack_resources + @./build/pack_resources data resources.pack # ============================================================================== # RELEASE AUTOMÁTICO (detecta SO) # ============================================================================== release: ifeq ($(OS),Windows_NT) - @"$(MAKE)" windows_release + @"$(MAKE)" _windows_release else ifeq ($(UNAME_S),Darwin) - @$(MAKE) macos_release + @$(MAKE) _macos_release else - @$(MAKE) linux_release + @$(MAKE) _linux_release endif endif # ============================================================================== # COMPILACIÓN PARA WINDOWS (RELEASE) # ============================================================================== -windows_release: - @$(MAKE) resources.pack +_windows_release: + @$(MAKE) pack @echo off @echo Creando release para Windows - Version: $(VERSION) # Compila con cmake - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) @cmake --build build # Crea carpeta de distribución y carpeta temporal @@ -115,7 +148,7 @@ windows_release: @powershell -Command "Copy-Item 'LICENSE' -Destination '$(RELEASE_FOLDER)'" @powershell -Command "Copy-Item 'README.md' -Destination '$(RELEASE_FOLDER)'" @powershell -Command "Copy-Item 'release\windows\dll\*.dll' -Destination '$(RELEASE_FOLDER)'" - @powershell -Command "Copy-Item -Path '$(TARGET_FILE).exe' -Destination '$(WIN_RELEASE_FILE).exe'" + @powershell -Command "Copy-Item -Path '$(TARGET_FILE).exe' -Destination '$(WIN_RELEASE_FILE_PS).exe'" strip -s -R .comment -R .gnu.version "$(WIN_RELEASE_FILE).exe" --strip-unneeded # Crea el fichero .zip @@ -129,15 +162,15 @@ windows_release: # ============================================================================== # COMPILACIÓN PARA MACOS (RELEASE) # ============================================================================== -macos_release: - @$(MAKE) resources.pack +_macos_release: + @$(MAKE) pack @echo "Creando release para macOS - Version: $(VERSION)" # Verificar e instalar create-dmg si es necesario @which create-dmg > /dev/null || (echo "Instalando create-dmg..." && brew install create-dmg) # Compila la versión para procesadores Intel con cmake - @cmake -S . -B build/intel -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DMACOS_BUNDLE=ON + @cmake -S . -B build/intel -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DMACOS_BUNDLE=ON -DGIT_HASH=$(GIT_HASH) @cmake --build build/intel # Elimina datos de compilaciones anteriores @@ -191,7 +224,7 @@ macos_release: @echo "Release Intel creado: $(MACOS_INTEL_RELEASE)" # Compila la versión para procesadores Apple Silicon con cmake - @cmake -S . -B build/arm -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DMACOS_BUNDLE=ON + @cmake -S . -B build/arm -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DMACOS_BUNDLE=ON -DGIT_HASH=$(GIT_HASH) @cmake --build build/arm cp "$(TARGET_FILE)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" @@ -224,12 +257,12 @@ macos_release: # ============================================================================== # COMPILACIÓN PARA LINUX (RELEASE) # ============================================================================== -linux_release: - @$(MAKE) resources.pack +_linux_release: + @$(MAKE) pack @echo "Creando release para Linux - Version: $(VERSION)" # Compila con cmake - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) @cmake --build build # Elimina carpeta temporal previa y la recrea @@ -256,14 +289,14 @@ linux_release: # COMPILACIÓN PARA WEBASSEMBLY (requiere Docker) # ============================================================================== wasm: - @$(MAKE) resources.pack + @$(MAKE) pack @echo "Compilando para WebAssembly - Version: $(VERSION)" docker run --rm \ --user $(shell id -u):$(shell id -g) \ -v $(DIR_ROOT):/src \ -w /src \ emscripten/emsdk:latest \ - bash -c "emcmake cmake -S . -B build/wasm -DCMAKE_BUILD_TYPE=Release && cmake --build build/wasm" + bash -c "emcmake cmake -S . -B build/wasm -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) && cmake --build build/wasm" $(MKDIR) "$(DIST_DIR)/wasm" cp build/wasm/$(TARGET_NAME).html $(DIST_DIR)/wasm/ cp build/wasm/$(TARGET_NAME).js $(DIST_DIR)/wasm/ @@ -275,7 +308,47 @@ wasm: ssh maverick 'cd /home/sergio/gitea/web_jailgames && ./deploy.sh' @echo "Deployed to maverick" +# Versió Debug del build wasm: build local sense deploy. Sortida a dist/wasm_debug/. +wasm_debug: + @$(MAKE) pack + @echo "Compilando WebAssembly Debug - Version: $(VERSION)" + docker run --rm \ + --user $(shell id -u):$(shell id -g) \ + -v $(DIR_ROOT):/src \ + -w /src \ + emscripten/emsdk:latest \ + bash -c "emcmake cmake -S . -B build/wasm_debug -DCMAKE_BUILD_TYPE=Debug -DGIT_HASH=$(GIT_HASH) && cmake --build build/wasm_debug" + $(MKDIR) "$(DIST_DIR)/wasm_debug" + cp build/wasm_debug/$(TARGET_NAME).html $(DIST_DIR)/wasm_debug/ + cp build/wasm_debug/$(TARGET_NAME).js $(DIST_DIR)/wasm_debug/ + cp build/wasm_debug/$(TARGET_NAME).wasm $(DIST_DIR)/wasm_debug/ + cp build/wasm_debug/$(TARGET_NAME).data $(DIST_DIR)/wasm_debug/ + @echo "Output: $(DIST_DIR)/wasm_debug/" + # ============================================================================== +# ============================================================================== +# CODE QUALITY (delegados a cmake) +# ============================================================================== +format: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) + @cmake --build build --target format + +format-check: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) + @cmake --build build --target format-check + +tidy: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) + @cmake --build build --target tidy + +tidy-fix: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) + @cmake --build build --target tidy-fix + +cppcheck: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) + @cmake --build build --target cppcheck + # DESCARGA DE GAMECONTROLLERDB # ============================================================================== controllerdb: @@ -300,16 +373,22 @@ help: @echo "" @echo " Release:" @echo " make release - Crear release (detecta SO automaticamente)" - @echo " make windows_release - Crear release para Windows" - @echo " make linux_release - Crear release para Linux" - @echo " make macos_release - Crear release para macOS" @echo " make wasm - Compilar para WebAssembly (requiere Docker) y deploy a maverick" + @echo " make wasm_debug - Compilar WebAssembly Debug local (sin deploy)" @echo "" @echo " Herramientas:" + @echo " make pack - Empaquetar recursos a resources.pack" @echo " make controllerdb - Descargar gamecontrollerdb.txt actualizado" @echo "" + @echo " Calidad de codigo:" + @echo " make format - Formatear codigo con clang-format" + @echo " make format-check - Verificar formato sin modificar" + @echo " make tidy - Analisis estatico con clang-tidy" + @echo " make tidy-fix - Analisis estatico con auto-fix" + @echo " make cppcheck - Analisis estatico con cppcheck" + @echo "" @echo " Otros:" @echo " make show_version - Mostrar version actual ($(VERSION))" @echo " make help - Mostrar esta ayuda" -.PHONY: all debug release windows_release macos_release linux_release wasm controllerdb pack_tool resources.pack show_version help +.PHONY: all debug release _windows_release _macos_release _linux_release wasm wasm_debug controllerdb pack format format-check tidy tidy-fix cppcheck show_version help diff --git a/source/defines.hpp b/source/defines.hpp new file mode 100644 index 0000000..fffd22e --- /dev/null +++ b/source/defines.hpp @@ -0,0 +1,5 @@ +#pragma once + +namespace Texts { + constexpr const char* VERSION = "2.3.4"; // Versión del juego (también usada por el Makefile) +} // namespace Texts diff --git a/tools/pack_resources/Makefile b/tools/pack_resources/Makefile deleted file mode 100644 index 6d370c0..0000000 --- a/tools/pack_resources/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -# Makefile para la herramienta de empaquetado de Coffee Crisis -# ============================================================= - -CXX := g++ -CXXFLAGS := -std=c++20 -Wall -Os -I../../source -SOURCES := pack_resources.cpp ../../source/resource_pack.cpp -TARGET := pack_resources -CLEAN_FILES := pack_resources *.pack *.o - -ifeq ($(OS),Windows_NT) - DETECTED_OS := Windows - TARGET := $(TARGET).exe - CLEAN_CMD := del /Q - FixPath = $(subst /,\\,$1) -else - DETECTED_OS := $(shell uname -s) - CLEAN_CMD := rm -f - FixPath = $1 -endif - -.PHONY: all pack_tool pack clean help - -all: pack_tool - -pack_tool: - @echo "Compilando herramienta de empaquetado para $(DETECTED_OS)..." - $(CXX) $(CXXFLAGS) $(SOURCES) -o $(TARGET) - @echo "Herramienta compilada: $(TARGET)" - -clean: - @echo "Limpiando archivos generados..." - $(CLEAN_CMD) $(call FixPath,$(CLEAN_FILES)) - @echo "Archivos limpiados" - -# Crear pack final (invocado desde el Makefile raíz) -pack: pack_tool -ifeq ($(OS),Windows_NT) - .\$(TARGET) ..\..\data ..\..\resources.pack -else - ./$(TARGET) ../../data ../../resources.pack -endif - -help: - @echo "Makefile para herramientas de Coffee Crisis" - @echo "===========================================" - @echo "" - @echo "Comandos disponibles:" - @echo " all - Compilar herramienta de empaquetado (por defecto)" - @echo " pack_tool - Compilar herramienta de empaquetado" - @echo " pack - Crear pack final en ../../resources.pack" - @echo " clean - Limpiar archivos generados" - @echo " help - Mostrar esta ayuda"