diff --git a/CMakeLists.txt b/CMakeLists.txt index de64de1..055217e 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 @@ -395,33 +402,34 @@ else() message(STATUS "cppcheck no encontrado - target 'cppcheck' no disponible") endif() -# --- 6. PACK RESOURCES TARGETS --- -# En Emscripten no generamos resources.pack: los assets se embeben vía --preload-file -# (ver rama EMSCRIPTEN más arriba). El pack_tool tampoco tiene sentido bajo emcc. +# --- 6. EINA STANDALONE: pack_resources --- +# En Emscripten no generamos resources.pack: los assets se embeben vía --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 00a5536..39f5444 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 @@ -40,6 +37,20 @@ else VERSION := v$(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 + # ============================================================================== # SHELL (Windows usa cmd.exe para que las recetas con powershell funcionen igual # desde cualquier terminal: PowerShell, cmd o git-bash) @@ -54,9 +65,13 @@ 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 # ============================================================================== @@ -82,15 +97,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 # ============================================================================== @@ -98,12 +122,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 @@ -118,23 +142,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' @@ -148,7 +171,7 @@ windows_release: @powershell -Command "Copy-Item 'README.md' -Destination '$(RELEASE_FOLDER)'" @powershell -Command "Copy-Item 'gamecontrollerdb.txt' -Destination '$(RELEASE_FOLDER)'" @powershell -Command "Copy-Item 'release\windows\dll\*.dll' -Destination '$(RELEASE_FOLDER)'" - @powershell -Command "Copy-Item -Path '$(TARGET_FILE)' -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 @@ -162,14 +185,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 @@ -223,7 +246,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)" @@ -256,11 +279,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) @@ -293,7 +316,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/ @@ -313,7 +336,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/ @@ -325,6 +348,38 @@ wasm_debug: ssh maverick 'cd /home/sergio/gitea/web_jailgames && ./deploy.sh' @echo "Deployed to maverick" +# ============================================================================== +# ============================================================================== +# 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: + @echo "Descargando gamecontrollerdb.txt..." + curl -fsSL https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/master/gamecontrollerdb.txt \ + -o gamecontrollerdb.txt + @echo "gamecontrollerdb.txt actualizado" + # ============================================================================== # REGLAS ESPECIALES # ============================================================================== @@ -343,14 +398,18 @@ 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 "" @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 " WebAssembly (requiere Docker):" @echo " make wasm - Compilar a WebAssembly (Release) y desplegar a maverick" @@ -360,4 +419,4 @@ help: @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 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