From 74e19e995174aa4f6e8aa420059c97cc34cdf99a Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 17 Apr 2026 13:00:02 +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 | 96 ++++++++++++++++++++---------- Makefile | 108 ++++++++++++++++++++++++---------- tools/pack_resources/Makefile | 53 ----------------- 3 files changed, 142 insertions(+), 115 deletions(-) delete mode 100644 tools/pack_resources/Makefile diff --git a/CMakeLists.txt b/CMakeLists.txt index 5694376..c3618f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,17 +11,24 @@ set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # --- GENERACIÓN DE VERSIÓN AUTOMÁTICA --- -find_package(Git QUIET) -if(GIT_FOUND) - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_HASH - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET - ) -else() - set(GIT_HASH "unknown") +# Si GIT_HASH se ha pasado desde fuera (p.ej. desde el Makefile via -DGIT_HASH=xxx), +# lo usamos tal cual. Esto evita problemas con Docker/emscripten, donde git aborta por +# "dubious ownership" en el volumen montado. En builds locales sin -DGIT_HASH, se +# resuelve aquí ejecutando git directamente. +if(NOT DEFINED GIT_HASH OR GIT_HASH STREQUAL "") + find_package(Git QUIET) + if(GIT_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + endif() + if(NOT DEFINED GIT_HASH OR GIT_HASH STREQUAL "") + set(GIT_HASH "unknown") + endif() endif() # Configurar archivo de versión @@ -297,6 +304,7 @@ endif() # Buscar herramientas de análisis estático 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 formateo file(GLOB_RECURSE ALL_SOURCE_FILES @@ -313,6 +321,10 @@ set(CLANG_TIDY_SOURCES ${ALL_SOURCE_FILES}) list(FILTER CLANG_TIDY_SOURCES EXCLUDE REGEX ".*jail_audio\\.hpp$") list(FILTER CLANG_TIDY_SOURCES EXCLUDE REGEX ".*_spv\\.h$") +# Para cppcheck, pasar solo .cpp (los headers se procesan transitivamente). +set(CPPCHECK_SOURCES ${ALL_SOURCE_FILES}) +list(FILTER CPPCHECK_SOURCES INCLUDE REGEX ".*\\.cpp$") + # Targets de clang-tidy if(CLANG_TIDY_EXE) add_custom_target(tidy @@ -357,31 +369,53 @@ else() message(STATUS "clang-format no encontrado - targets 'format' y 'format-check' no disponibles") endif() -# --- 6. PACK RESOURCES TARGETS (no en Emscripten: s'utilitza --preload-file) --- +# 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() + +# --- 6. EINA STANDALONE: pack_resources (no en Emscripten: s'utilitza --preload-file) --- +# 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 if(NOT EMSCRIPTEN) - set(PACK_TOOL_SOURCES - ${CMAKE_SOURCE_DIR}/tools/pack_resources/pack_resources.cpp - ${CMAKE_SOURCE_DIR}/source/core/resources/resource_pack.cpp + add_executable(pack_resources EXCLUDE_FROM_ALL + tools/pack_resources/pack_resources.cpp + source/core/resources/resource_pack.cpp ) + target_include_directories(pack_resources PRIVATE "${CMAKE_SOURCE_DIR}/source") + target_compile_options(pack_resources PRIVATE -Wall) - add_executable(pack_tool ${PACK_TOOL_SOURCES}) - target_include_directories(pack_tool PRIVATE ${CMAKE_SOURCE_DIR}/source) - set_target_properties(pack_tool PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/tools/pack_resources - ) - - file(GLOB_RECURSE DATA_FILES "${CMAKE_SOURCE_DIR}/data/*") + # 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 "${CMAKE_SOURCE_DIR}/resources.pack" - COMMAND $ - "${CMAKE_SOURCE_DIR}/data" - "${CMAKE_SOURCE_DIR}/resources.pack" - DEPENDS pack_tool ${DATA_FILES} - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - COMMENT "Generando resources.pack desde data/..." + 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(pack DEPENDS "${CMAKE_SOURCE_DIR}/resources.pack") - add_dependencies(${PROJECT_NAME} pack) + add_custom_target(resource_pack ALL DEPENDS ${RESOURCE_PACK}) + add_dependencies(${PROJECT_NAME} resource_pack) endif() diff --git a/Makefile b/Makefile index d07fc58..af87562 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,6 @@ DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST))) DIR_SOURCES := $(addsuffix /, $(DIR_ROOT)source) DIR_BIN := $(addsuffix /, $(DIR_ROOT)) -DIR_TOOLS := $(addsuffix /, $(DIR_ROOT)tools) # ============================================================================== # TARGET NAMES @@ -20,8 +19,6 @@ RESOURCE_FILE := release/windows/jdd.res # ============================================================================== # TOOLS # ============================================================================== -DIR_PACK_TOOL := $(DIR_TOOLS)pack_resources -SHADER_SCRIPT := $(DIR_ROOT)tools/shaders/compile_spirv.sh SHADER_CMAKE := $(DIR_ROOT)tools/shaders/compile_spirv.cmake SHADERS_DIR := $(DIR_ROOT)data/shaders HEADERS_DIR := $(DIR_ROOT)source/core/rendering/sdl3gpu @@ -35,9 +32,23 @@ endif # VERSION (extracted from defines.hpp) # ============================================================================== ifeq ($(OS),Windows_NT) - VERSION := v$(shell powershell -Command "(Select-String -Path 'source/utils/defines.hpp' -Pattern 'constexpr const char\* VERSION = \"(.+?)\"').Matches.Groups[1].Value") + VERSION := $(shell powershell -Command "(Select-String -Path 'source/utils/defines.hpp' -Pattern 'constexpr const char\* VERSION = \"(.+?)\"').Matches.Groups[1].Value") else - VERSION := v$(shell grep 'constexpr const char\* VERSION' source/utils/defines.hpp | sed -E 's/.*VERSION = "([^"]+)".*/\1/') + VERSION := $(shell grep 'constexpr const char\* VERSION' source/utils/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 # ============================================================================== @@ -84,15 +95,24 @@ else UNAME_S := $(shell uname -s) 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: - @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 debug: - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Debug -DGIT_HASH=$(GIT_HASH) @cmake --build build # ============================================================================== @@ -100,12 +120,12 @@ debug: # ============================================================================== 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 @@ -120,23 +140,22 @@ else endif # ============================================================================== -# 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: pack_tool - @$(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 # ============================================================================== # COMPILACIÓN PARA WINDOWS (RELEASE) # ============================================================================== -windows_release: +_windows_release: @echo off @echo Creando release para Windows - Version: $(VERSION) # Compila con cmake (genera shaders, resources.pack y ejecutable) - @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 'RELEASE_FOLDER' @@ -164,14 +183,14 @@ windows_release: # ============================================================================== # COMPILACIÓN PARA MACOS (RELEASE) # ============================================================================== -macos_release: +_macos_release: @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 (genera shaders y resources.pack) - @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 @@ -225,7 +244,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)" @@ -258,11 +277,11 @@ macos_release: # ============================================================================== # COMPILACIÓN PARA LINUX (RELEASE) # ============================================================================== -linux_release: +_linux_release: @echo "Creando release para Linux - Version: $(VERSION)" # Compila con cmake (genera shaders, resources.pack y ejecutable) - @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 (crea dist/ si no existe) @@ -295,7 +314,7 @@ wasm: -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/ @@ -315,7 +334,7 @@ wasm_debug: -v $(DIR_ROOT):/src \ -w /src \ emscripten/emsdk:latest \ - bash -c "emcmake cmake -S . -B build/wasm_debug -DCMAKE_BUILD_TYPE=Debug && cmake --build build/wasm_debug" + 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/ @@ -324,6 +343,29 @@ 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: @@ -350,19 +392,23 @@ 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 - Crear release per a WebAssembly (requereix Docker)" @echo " make wasm_debug - Crear build Debug per a WebAssembly (entra directe a la GAME)" @echo "" @echo " Herramientas:" @echo " make compile_shaders - Compilar shaders SPIR-V" - @echo " make pack_tool - Compilar herramienta de empaquetado" - @echo " make resources.pack - Generar pack de recursos desde data/" + @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 wasm_debug compile_shaders pack_tool resources.pack controllerdb show_version help +.PHONY: all debug release _windows_release _macos_release _linux_release wasm wasm_debug compile_shaders pack controllerdb format format-check tidy tidy-fix cppcheck show_version help diff --git a/tools/pack_resources/Makefile b/tools/pack_resources/Makefile deleted file mode 100644 index 5264fd8..0000000 --- a/tools/pack_resources/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# Makefile for pack_resources tool - -# Compiler -CXX := g++ -CXXFLAGS := -std=c++20 -Wall -Wextra -O2 - -# Directories -TOOL_DIR := . -SOURCE_DIR := ../../source/core/resources - -# Source files -SOURCES := pack_resources.cpp \ - $(SOURCE_DIR)/resource_pack.cpp - -# Output -TARGET := pack_resources - -# Platform-specific executable extension -ifeq ($(OS),Windows_NT) - TARGET := $(TARGET).exe -endif - -# Default target -all: $(TARGET) - -# Build the tool -$(TARGET): $(SOURCES) - @echo "Building pack_resources tool..." - $(CXX) $(CXXFLAGS) $(SOURCES) -o $(TARGET) - @echo "Build complete: $(TARGET)" - -# Test: create a test pack -test: $(TARGET) - @echo "Creating test pack..." - ./$(TARGET) ../../data test_resources.pack - -# Create the actual resources.pack -pack: $(TARGET) - @echo "Creating resources.pack..." - ./$(TARGET) ../../data ../../resources.pack - -# List contents of a pack -list: $(TARGET) - @echo "Listing pack contents..." - ./$(TARGET) --list ../../resources.pack - -# Clean -clean: - @echo "Cleaning..." - rm -f $(TARGET) test_resources.pack - @echo "Clean complete" - -.PHONY: all test pack list clean