From 671583ebbe9774afad9b6c8ef10005f4cadee705 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 17 Apr 2026 12:59:57 +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 | 32 ++++ Makefile | 250 +++++++++--------------------- tools/pack_resources/Makefile | 85 ---------- tools/shaders/compile_spirv.cmake | 101 ++++++++++++ tools/shaders/compile_spirv.sh | 65 -------- 5 files changed, 209 insertions(+), 324 deletions(-) delete mode 100644 tools/pack_resources/Makefile create mode 100644 tools/shaders/compile_spirv.cmake delete mode 100755 tools/shaders/compile_spirv.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 3eda6f1..2afb521 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -396,3 +396,35 @@ if(CPPCHECK_EXE) 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/core/resources/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 547385f..6d002c3 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,6 @@ # DIRECTORIES # ============================================================================== DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST))) -DIR_TOOLS := $(addsuffix /, $(DIR_ROOT)tools) # ============================================================================== # TARGET NAMES @@ -22,8 +21,14 @@ RESOURCE_FILE := release/windows/coffee.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 +ifeq ($(OS),Windows_NT) + GLSLC := $(shell where glslc 2>NUL) +else + GLSLC := $(shell command -v glslc 2>/dev/null) +endif # ============================================================================== # VERSION (extraída de defines.hpp) @@ -58,9 +63,13 @@ endif ifeq ($(OS),Windows_NT) WIN_TARGET_FILE := $(DIR_ROOT)$(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 # ============================================================================== @@ -70,7 +79,6 @@ WINDOWS_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-win32-x64.z MACOS_INTEL_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-macos-intel.dmg MACOS_APPLE_SILICON_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-macos-apple-silicon.dmg LINUX_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-linux.tar.gz -RASPI_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-raspberry.tar.gz # ============================================================================== # PLATAFORMA @@ -87,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 @cmake --build build debug: - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Debug @cmake --build build # ============================================================================== @@ -103,41 +120,43 @@ 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 # ============================================================================== -# 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 # ============================================================================== -# COMPILACIÓN DE SHADERS +# REGLAS PARA COMPILACIÓN DE SHADERS (multiplataforma via cmake) # ============================================================================== -spirv: - @echo "Compilando shaders SPIR-V..." - $(SHADER_SCRIPT) +compile_shaders: +ifdef GLSLC + @cmake -D GLSLC=$(GLSLC) -D SHADERS_DIR=$(SHADERS_DIR) -D HEADERS_DIR=$(HEADERS_DIR) -P $(SHADER_CMAKE) +else + @echo "glslc no encontrado - asegurate de que los headers SPIR-V precompilados existen" +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 @cmake --build build # Crea carpeta de distribución y carpeta temporal 'RELEASE_FOLDER' @@ -153,7 +172,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)' -Destination '$(WIN_RELEASE_FILE).exe'" + @powershell -Command "Copy-Item -Path '$(TARGET_FILE)' -Destination '$(WIN_RELEASE_FILE_PS).exe'" strip -s -R .comment -R .gnu.version "$(WIN_RELEASE_FILE).exe" --strip-unneeded # Crea el fichero .zip @@ -167,8 +186,8 @@ 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 @@ -257,12 +276,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 @cmake --build build # Elimina carpeta temporal previa y la recrea (crea dist/ si no existe) @@ -285,139 +304,6 @@ linux_release: # Elimina la carpeta temporal $(RMDIR) "$(RELEASE_FOLDER)" -# ============================================================================== -# COMPILACIÓN PARA LINUX (RELEASE CON INTEGRACIÓN DESKTOP) -# ============================================================================== -linux_release_desktop: - @$(MAKE) resources.pack - @echo "Creando release con integracion desktop para Linux - Version: $(VERSION)" - -# Compila con cmake - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release - @cmake --build build - -# Elimina carpetas previas y recrea (crea dist/ si no existe) - $(RMDIR) "$(RELEASE_FOLDER)" - -# Crea la estructura de directorios estándar para Linux - $(MKDIR) "$(RELEASE_FOLDER)/$(TARGET_NAME)" - $(MKDIR) "$(RELEASE_FOLDER)/$(TARGET_NAME)/bin" - $(MKDIR) "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications" - $(MKDIR) "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/icons/hicolor/256x256/apps" - $(MKDIR) "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/$(TARGET_NAME)" - -# Copia ficheros del juego - cp -R config "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/$(TARGET_NAME)/" - cp resources.pack "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/$(TARGET_NAME)/" - cp LICENSE "$(RELEASE_FOLDER)/$(TARGET_NAME)/" - cp README.md "$(RELEASE_FOLDER)/$(TARGET_NAME)/" - -# Copia el ejecutable - cp "$(TARGET_FILE)" "$(RELEASE_FOLDER)/$(TARGET_NAME)/bin/$(TARGET_NAME)" - strip -s -R .comment -R .gnu.version "$(RELEASE_FOLDER)/$(TARGET_NAME)/bin/$(TARGET_NAME)" --strip-unneeded - -# Crea el archivo .desktop - @echo '[Desktop Entry]' > "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Version=1.0' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Type=Application' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Name=$(APP_NAME)' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Comment=Arcade action game - defend Earth from alien invasion!' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Exec=/opt/$(TARGET_NAME)/bin/$(TARGET_NAME)' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Icon=$(TARGET_NAME)' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Path=/opt/$(TARGET_NAME)/share/$(TARGET_NAME)' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Terminal=false' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'StartupNotify=true' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Categories=Game;ArcadeGame;' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - @echo 'Keywords=arcade;action;shooter;retro;' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop" - -# Copia el icono (si existe) y lo redimensiona si es necesario - @if [ -f "release/icons/icon.png" ]; then \ - if command -v magick >/dev/null 2>&1; then \ - magick "release/icons/icon.png" -resize 256x256 "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/icons/hicolor/256x256/apps/$(TARGET_NAME).png"; \ - echo "Icono redimensionado de release/icons/icon.png (usando ImageMagick)"; \ - elif command -v convert >/dev/null 2>&1; then \ - convert "release/icons/icon.png" -resize 256x256 "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/icons/hicolor/256x256/apps/$(TARGET_NAME).png"; \ - echo "Icono redimensionado de release/icons/icon.png (usando ImageMagick legacy)"; \ - elif command -v ffmpeg >/dev/null 2>&1; then \ - ffmpeg -i "release/icons/icon.png" -vf scale=256:256 "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/icons/hicolor/256x256/apps/$(TARGET_NAME).png" -y -loglevel quiet; \ - echo "Icono redimensionado de release/icons/icon.png (usando ffmpeg)"; \ - else \ - cp "release/icons/icon.png" "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/icons/hicolor/256x256/apps/$(TARGET_NAME).png"; \ - echo "Icono copiado sin redimensionar (instalar ImageMagick o ffmpeg para redimensionado automatico)"; \ - fi; \ - else \ - echo "Advertencia: No se encontró release/icons/icon.png - crear icono manualmente"; \ - fi - -# Crea script de instalación - @echo '#!/bin/bash' > "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'echo "Instalando $(APP_NAME)..."' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo mkdir -p /opt/$(TARGET_NAME)' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo cp -R bin /opt/$(TARGET_NAME)/' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo cp -R share /opt/$(TARGET_NAME)/' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo cp LICENSE /opt/$(TARGET_NAME)/' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo cp README.md /opt/$(TARGET_NAME)/' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo mkdir -p /usr/share/applications' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo mkdir -p /usr/share/icons/hicolor/256x256/apps' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo cp /opt/$(TARGET_NAME)/share/applications/$(TARGET_NAME).desktop /usr/share/applications/' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo cp /opt/$(TARGET_NAME)/share/icons/hicolor/256x256/apps/$(TARGET_NAME).png /usr/share/icons/hicolor/256x256/apps/' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo update-desktop-database /usr/share/applications 2>/dev/null || true' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'sudo gtk-update-icon-cache /usr/share/icons/hicolor 2>/dev/null || true' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'echo "$(APP_NAME) instalado correctamente!"' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - @echo 'echo "Ya puedes encontrarlo en el menu de aplicaciones en la categoria Juegos."' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - chmod +x "$(RELEASE_FOLDER)/$(TARGET_NAME)/install.sh" - -# Crea script de desinstalación - @echo '#!/bin/bash' > "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - @echo 'echo "Desinstalando $(APP_NAME)..."' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - @echo 'sudo rm -rf /opt/$(TARGET_NAME)' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - @echo 'sudo rm -f /usr/share/applications/$(TARGET_NAME).desktop' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - @echo 'sudo rm -f /usr/share/icons/hicolor/256x256/apps/$(TARGET_NAME).png' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - @echo 'sudo update-desktop-database /usr/share/applications 2>/dev/null || true' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - @echo 'sudo gtk-update-icon-cache /usr/share/icons/hicolor 2>/dev/null || true' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - @echo 'echo "$(APP_NAME) desinstalado correctamente."' >> "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - chmod +x "$(RELEASE_FOLDER)/$(TARGET_NAME)/uninstall.sh" - -# Empaqueta ficheros - $(RMFILE) "$(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-linux-desktop.tar.gz" - tar -czvf "$(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-linux-desktop.tar.gz" -C "$(RELEASE_FOLDER)" . - @echo "Release con integracion desktop creado: $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-linux-desktop.tar.gz" - @echo "Para instalar: extraer y ejecutar ./$(TARGET_NAME)/install.sh" - -# Elimina la carpeta temporal - $(RMDIR) "$(RELEASE_FOLDER)" - -# ============================================================================== -# COMPILACIÓN PARA RASPBERRY PI (RELEASE) -# ============================================================================== -raspi_release: - @$(MAKE) resources.pack - @echo "Creando release para Raspberry Pi - Version: $(VERSION)" - -# Compila con cmake - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release - @cmake --build build - -# Elimina carpetas previas y recrea (crea dist/ si no existe) - $(RMDIR) "$(RELEASE_FOLDER)" - $(MKDIR) "$(RELEASE_FOLDER)" - -# Copia ficheros - cp -R config "$(RELEASE_FOLDER)" - cp resources.pack "$(RELEASE_FOLDER)" - cp LICENSE "$(RELEASE_FOLDER)" - cp README.md "$(RELEASE_FOLDER)" - cp "$(TARGET_FILE)" "$(RELEASE_FILE)" - strip -s -R .comment -R .gnu.version "$(RELEASE_FILE)" --strip-unneeded - -# Empaqueta ficheros - $(RMFILE) "$(RASPI_RELEASE)" - tar -czvf "$(RASPI_RELEASE)" -C "$(RELEASE_FOLDER)" . - @echo "Release creado: $(RASPI_RELEASE)" - -# Elimina la carpeta temporal - $(RMDIR) "$(RELEASE_FOLDER)" - # ============================================================================== # COMPILACIÓN PARA WEBASSEMBLY (requiere Docker) # ============================================================================== @@ -440,25 +326,45 @@ 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: + @echo "Compilando WebAssembly Debug - Version: $(VERSION) ($(GIT_HASH))" + 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 -S . -B build -DCMAKE_BUILD_TYPE=Release + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target format format-check: - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target format-check tidy: - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target tidy tidy-fix: - @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target tidy-fix +cppcheck: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release + @cmake --build build --target cppcheck + # ============================================================================== # DESCARGA DE GAMECONTROLLERDB # ============================================================================== @@ -484,26 +390,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 basico para Linux" - @echo " make linux_release_desktop - Crear release con integracion desktop para Linux" - @echo " make macos_release - Crear release para macOS" - @echo " make raspi_release - Crear release para Raspberry Pi" @echo " make wasm - Crear build WebAssembly (requiere Docker) en dist/wasm" + @echo " make wasm_debug - Build WebAssembly Debug local (sin deploy)" @echo "" @echo " Herramientas:" - @echo " make spirv - Compilar shaders SPIR-V" - @echo " make pack_tool - Compilar herramienta de empaquetado" - @echo " make resources.pack - Generar pack de recursos desde data/" + @echo " make compile_shaders - Compilar shaders SPIR-V" + @echo " make pack - Empaquetar recursos a resources.pack" @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 linux_release_desktop raspi_release wasm pack_tool resources.pack spirv format format-check tidy tidy-fix controllerdb show_version help +.PHONY: all debug release _windows_release _macos_release _linux_release wasm wasm_debug pack compile_shaders format format-check tidy tidy-fix cppcheck controllerdb show_version help diff --git a/tools/pack_resources/Makefile b/tools/pack_resources/Makefile deleted file mode 100644 index f91059b..0000000 --- a/tools/pack_resources/Makefile +++ /dev/null @@ -1,85 +0,0 @@ -# Makefile para herramientas de Coffee Crisis Arcade Edition -# ========================================================= - -# Variables -CXX := g++ -CXXFLAGS := -std=c++20 -Wall -Os -I../../source -SOURCES := pack_resources.cpp ../../source/core/resources/resource_pack.cpp -TARGET := pack_resources -CLEAN_FILES := pack_resources *.pack *.o - -# Detectar sistema operativo -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 - -# Reglas principales -.PHONY: all pack_tool pack clean help test_pack - -# Compilar herramienta de empaquetado -all: pack_tool - -pack_tool: - @echo "Compilando herramienta de empaquetado para $(DETECTED_OS)..." - $(CXX) $(CXXFLAGS) $(SOURCES) -o $(TARGET) - @echo "✓ Herramienta compilada: $(TARGET)" - -# Limpiar archivos generados -clean: - @echo "Limpiando archivos generados..." - $(CLEAN_CMD) $(call FixPath,$(CLEAN_FILES)) - @echo "✓ Archivos limpiados" - -# Crear pack de recursos final (invocado desde Makefile raíz) -pack: pack_tool -ifeq ($(OS),Windows_NT) - .\$(TARGET) ..\..\data ..\..\resources.pack -else - ./$(TARGET) ../../data ../../resources.pack -endif - -# Crear pack de recursos de prueba -test_pack: pack_tool - @echo "Creando pack de recursos de prueba..." -ifeq ($(OS),Windows_NT) - .\$(TARGET) ..\..\data test_resources.pack -else - ./$(TARGET) ../../data test_resources.pack -endif - @echo "✓ Pack de prueba creado: test_resources.pack" - -# Crear pack de recursos final -create_pack: pack_tool - @echo "Creando pack de recursos final..." -ifeq ($(OS),Windows_NT) - .\$(TARGET) ..\..\data ..\..\resources.pack -else - ./$(TARGET) ../../data ../../resources.pack -endif - @echo "✓ Pack final creado: ../../resources.pack" - -# Mostrar ayuda -help: - @echo "Makefile para herramientas de Coffee Crisis Arcade Edition" - @echo "=========================================================" - @echo "" - @echo "Comandos disponibles:" - @echo " all - Compilar herramienta de empaquetado (por defecto)" - @echo " pack_tool - Compilar herramienta de empaquetado" - @echo " test_pack - Crear pack de recursos de prueba" - @echo " create_pack - Crear pack de recursos final" - @echo " clean - Limpiar archivos generados" - @echo " help - Mostrar esta ayuda" - @echo "" - @echo "Ejemplos de uso:" - @echo " make # Compilar herramienta" - @echo " make test_pack # Crear pack de prueba" - @echo " make create_pack # Crear pack final" - @echo " make clean # Limpiar archivos" \ No newline at end of file diff --git a/tools/shaders/compile_spirv.cmake b/tools/shaders/compile_spirv.cmake new file mode 100644 index 0000000..e41ad2f --- /dev/null +++ b/tools/shaders/compile_spirv.cmake @@ -0,0 +1,101 @@ +# compile_spirv.cmake +# Compila shaders GLSL a SPIR-V y genera headers C++ embebibles. +# Multiplataforma: Windows, macOS, Linux (no requiere bash, xxd ni /tmp/). +# +# Invocado por CMakeLists.txt con: +# cmake -D GLSLC= -D SHADERS_DIR= -D HEADERS_DIR= -P compile_spirv.cmake +# +# También puede ejecutarse manualmente desde la raíz del proyecto: +# cmake -D GLSLC=glslc -D SHADERS_DIR=data/shaders -D HEADERS_DIR=source/core/rendering/sdl3gpu -P tools/shaders/compile_spirv.cmake + +cmake_minimum_required(VERSION 3.10) +cmake_policy(SET CMP0007 NEW) + +# Lista de shaders: fuente relativa a SHADERS_DIR +set(SHADER_SOURCES + "postfx.vert" + "postfx.frag" + "upscale.frag" + "downscale.frag" + "crtpi_frag.glsl" +) + +# Nombre de la variable C++ para cada shader (mismo orden) +set(SHADER_VARS + "kpostfx_vert_spv" + "kpostfx_frag_spv" + "kupscale_frag_spv" + "kdownscale_frag_spv" + "kcrtpi_frag_spv" +) + +# Flags extra de glslc para cada shader (vacío si no hay) +set(SHADER_FLAGS + "" + "" + "" + "" + "-fshader-stage=frag" +) + +list(LENGTH SHADER_SOURCES NUM_SHADERS) +math(EXPR LAST_IDX "${NUM_SHADERS} - 1") + +foreach(IDX RANGE ${LAST_IDX}) + list(GET SHADER_SOURCES ${IDX} SRC_NAME) + list(GET SHADER_VARS ${IDX} VAR) + list(GET SHADER_FLAGS ${IDX} EXTRA_FLAG) + + # Derivar nombre del header desde la variable: kpostfx_vert_spv → postfx_vert_spv.h + string(REGEX REPLACE "^k" "" HDR_BASE "${VAR}") + set(SRC "${SHADERS_DIR}/${SRC_NAME}") + set(SPV "${HEADERS_DIR}/${HDR_BASE}.spv") + set(HDR "${HEADERS_DIR}/${HDR_BASE}.h") + + message(STATUS "Compilando ${SRC} ...") + + if(EXTRA_FLAG) + execute_process( + COMMAND "${GLSLC}" "${EXTRA_FLAG}" "${SRC}" -o "${SPV}" + RESULT_VARIABLE GLSLC_RESULT + ERROR_VARIABLE GLSLC_ERROR + ) + else() + execute_process( + COMMAND "${GLSLC}" "${SRC}" -o "${SPV}" + RESULT_VARIABLE GLSLC_RESULT + ERROR_VARIABLE GLSLC_ERROR + ) + endif() + + if(NOT GLSLC_RESULT EQUAL 0) + message(FATAL_ERROR "glslc falló para ${SRC}:\n${GLSLC_ERROR}") + endif() + + # Leer binario SPV como hex (sin separadores: "0302230700...") + file(READ "${SPV}" HEX_DATA HEX) + # Dividir en pares de caracteres hex → lista de bytes + string(REGEX MATCHALL ".." BYTES "${HEX_DATA}") + list(LENGTH BYTES NUM_BYTES) + + # Construir el cuerpo del array C++ con un byte por línea + set(ARRAY_BODY "") + foreach(BYTE ${BYTES}) + string(APPEND ARRAY_BODY " 0x${BYTE},\n") + endforeach() + + file(WRITE "${HDR}" + "#pragma once\n" + "#include \n" + "#include \n" + "static const uint8_t ${VAR}[] = {\n" + "${ARRAY_BODY}" + "};\n" + "static const size_t ${VAR}_size = ${NUM_BYTES};\n" + ) + + file(REMOVE "${SPV}") + message(STATUS " -> ${HDR} (${NUM_BYTES} bytes)") +endforeach() + +message(STATUS "Shaders SPIR-V compilados correctamente.") diff --git a/tools/shaders/compile_spirv.sh b/tools/shaders/compile_spirv.sh deleted file mode 100755 index ffe3cea..0000000 --- a/tools/shaders/compile_spirv.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash -# Compile Vulkan GLSL shaders to SPIR-V and update the C++ headers used by SDL3GPUShader. -# Required: glslc (from Vulkan SDK or: brew install glslang / apt install glslang-tools) -# -# Run from the project root: tools/shaders/compile_spirv.sh - -set -e - -SHADERS_DIR="data/shaders" -HEADERS_DIR="source/core/rendering/sdl3gpu" - -if ! command -v glslc &> /dev/null; then - echo "ERROR: glslc not found. Install Vulkan SDK or run:" - echo " macOS: brew install glslang" - echo " Linux: sudo apt install glslang-tools" - exit 1 -fi - -echo "Compiling SPIR-V shaders..." - -glslc "${SHADERS_DIR}/postfx.vert" -o /tmp/postfx.vert.spv -glslc "${SHADERS_DIR}/postfx.frag" -o /tmp/postfx.frag.spv -glslc -fshader-stage=fragment "${SHADERS_DIR}/crtpi_frag.glsl" -o /tmp/crtpi_frag.spv -glslc "${SHADERS_DIR}/upscale.frag" -o /tmp/upscale.frag.spv -glslc "${SHADERS_DIR}/downscale.frag" -o /tmp/downscale.frag.spv - -echo "Generating C++ headers..." - -xxd -i /tmp/postfx.vert.spv | \ - sed 's/unsigned char .*postfx_vert_spv\[\]/static const uint8_t kpostfx_vert_spv[]/' | \ - sed 's/unsigned int .*postfx_vert_spv_len/static const size_t kpostfx_vert_spv_size/' \ - > "${HEADERS_DIR}/postfx_vert_spv.h" - -xxd -i /tmp/postfx.frag.spv | \ - sed 's/unsigned char .*postfx_frag_spv\[\]/static const uint8_t kpostfx_frag_spv[]/' | \ - sed 's/unsigned int .*postfx_frag_spv_len/static const size_t kpostfx_frag_spv_size/' \ - > "${HEADERS_DIR}/postfx_frag_spv.h" - -xxd -i /tmp/crtpi_frag.spv | \ - sed 's/unsigned char .*crtpi_frag_spv\[\]/static const uint8_t kcrtpi_frag_spv[]/' | \ - sed 's/unsigned int .*crtpi_frag_spv_len/static const size_t kcrtpi_frag_spv_size/' \ - > "${HEADERS_DIR}/crtpi_frag_spv.h" - -xxd -i /tmp/upscale.frag.spv | \ - sed 's/unsigned char .*upscale_frag_spv\[\]/static const uint8_t kupscale_frag_spv[]/' | \ - sed 's/unsigned int .*upscale_frag_spv_len/static const size_t kupscale_frag_spv_size/' \ - > "${HEADERS_DIR}/upscale_frag_spv.h" - -xxd -i /tmp/downscale.frag.spv | \ - sed 's/unsigned char .*downscale_frag_spv\[\]/static const uint8_t kdownscale_frag_spv[]/' | \ - sed 's/unsigned int .*downscale_frag_spv_len/static const size_t kdownscale_frag_spv_size/' \ - > "${HEADERS_DIR}/downscale_frag_spv.h" - -# Prepend required includes to the headers -for f in "${HEADERS_DIR}/postfx_vert_spv.h" "${HEADERS_DIR}/postfx_frag_spv.h" "${HEADERS_DIR}/crtpi_frag_spv.h" "${HEADERS_DIR}/upscale_frag_spv.h" "${HEADERS_DIR}/downscale_frag_spv.h"; do - echo -e "#pragma once\n#include \n#include \n$(cat "$f")" > "$f" -done - -echo "Done. Headers updated in ${HEADERS_DIR}/" -echo " postfx_vert_spv.h" -echo " postfx_frag_spv.h" -echo " crtpi_frag_spv.h" -echo " upscale_frag_spv.h" -echo " downscale_frag_spv.h" -echo "Rebuild the project to use the new shaders."