# ============================================================================== # DIRECTORIES # ============================================================================== DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST))) DIR_TOOLS := $(addsuffix /, $(DIR_ROOT)tools) # ============================================================================== # TARGET NAMES # ============================================================================== TARGET_NAME := coffee_crisis_arcade_edition TARGET_FILE := $(DIR_ROOT)$(TARGET_NAME) APP_NAME := Coffee Crisis Arcade Edition DIST_DIR := dist RELEASE_FOLDER := dist/_tmp RELEASE_FILE := $(RELEASE_FOLDER)/$(TARGET_NAME) RESOURCE_FILE := release/windows/coffee.res # ============================================================================== # TOOLS # ============================================================================== DIR_PACK_TOOL := $(DIR_TOOLS)pack_resources SHADER_SCRIPT := $(DIR_ROOT)tools/shaders/compile_spirv.sh # ============================================================================== # VERSION (fecha actual) # ============================================================================== ifeq ($(OS),Windows_NT) VERSION := $(shell powershell -Command "Get-Date -Format 'yyyy-MM-dd'") else VERSION := $(shell date +%Y-%m-%d) endif # ============================================================================== # SHELL (Windows usa cmd.exe) # ============================================================================== ifeq ($(OS),Windows_NT) SHELL := cmd.exe endif # ============================================================================== # WINDOWS-SPECIFIC VARIABLES # ============================================================================== ifeq ($(OS),Windows_NT) WIN_TARGET_FILE := $(DIR_ROOT)$(APP_NAME) WIN_RELEASE_FILE := $(RELEASE_FOLDER)/$(APP_NAME) else WIN_TARGET_FILE := $(TARGET_FILE) WIN_RELEASE_FILE := $(RELEASE_FILE) endif # ============================================================================== # RELEASE NAMES # ============================================================================== WINDOWS_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-win32-x64.zip 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 # ============================================================================== ifeq ($(OS),Windows_NT) FixPath = $(subst /,\\,$1) RM := del /Q MKDIR := mkdir else FixPath = $1 RMFILE := rm -f RMDIR := rm -rdf MKDIR := mkdir -p UNAME_S := $(shell uname -s) endif # ============================================================================== # COMPILACIÓN CON CMAKE # ============================================================================== all: @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build debug: @cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug @cmake --build build # ============================================================================== # RELEASE AUTOMÁTICO (detecta SO) # ============================================================================== release: ifeq ($(OS),Windows_NT) @"$(MAKE)" windows_release else ifeq ($(UNAME_S),Darwin) @$(MAKE) macos_release else @$(MAKE) linux_release endif endif # ============================================================================== # REGLAS PARA HERRAMIENTA DE EMPAQUETADO Y RESOURCES.PACK # ============================================================================== pack_tool: @$(MAKE) -C $(DIR_PACK_TOOL) resources.pack: @$(MAKE) -C $(DIR_PACK_TOOL) pack # ============================================================================== # COMPILACIÓN DE SHADERS # ============================================================================== spirv: @echo "Compilando shaders SPIR-V..." $(SHADER_SCRIPT) # ============================================================================== # COMPILACIÓN PARA WINDOWS (RELEASE) # ============================================================================== windows_release: @$(MAKE) resources.pack @echo off @echo Creando release para Windows - Version: $(VERSION) # Compila con cmake @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build # Crea carpeta de distribución y carpeta temporal 'RELEASE_FOLDER' @powershell -Command "if (-not (Test-Path '$(DIST_DIR)')) {New-Item '$(DIST_DIR)' -ItemType Directory}" @powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}" @powershell -Command "if (-not (Test-Path '$(RELEASE_FOLDER)')) {New-Item '$(RELEASE_FOLDER)' -ItemType Directory}" # Copia la carpeta 'config' y el archivo 'resources.pack' @powershell -Command "Copy-Item -Path 'config' -Destination '$(RELEASE_FOLDER)' -recurse -Force" @powershell -Command "Copy-Item -Path 'resources.pack' -Destination '$(RELEASE_FOLDER)'" # Copia los ficheros que estan en la raíz del proyecto @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\"'" strip -s -R .comment -R .gnu.version "$(WIN_RELEASE_FILE).exe" --strip-unneeded # Crea el fichero .zip @powershell -Command "if (Test-Path '$(WINDOWS_RELEASE)') {Remove-Item '$(WINDOWS_RELEASE)'}" @powershell -Command "Compress-Archive -Path '$(RELEASE_FOLDER)/*' -DestinationPath '$(WINDOWS_RELEASE)'" @echo Release creado: $(WINDOWS_RELEASE) # Elimina la carpeta temporal 'RELEASE_FOLDER' @powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}" # ============================================================================== # COMPILACIÓN PARA MACOS (RELEASE) # ============================================================================== macos_release: @$(MAKE) resources.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 --build build/intel # Elimina datos de compilaciones anteriores $(RMDIR) "$(RELEASE_FOLDER)" $(RMFILE) tmp.dmg $(RMFILE) "$(DIST_DIR)"/rw.* $(RMFILE) "$(MACOS_INTEL_RELEASE)" $(RMFILE) "$(MACOS_APPLE_SILICON_RELEASE)" # Crea la carpeta de distribución y la carpeta temporal con las carpetas obligatorias para una app macOS $(MKDIR) "$(DIST_DIR)" $(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks" $(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS" $(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources" # Copia carpetas y ficheros cp -R config "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources" cp resources.pack "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources" cp -R release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks" cp release/icons/*.icns "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources" cp release/macos/Info.plist "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents" cp LICENSE "$(RELEASE_FOLDER)" cp README.md "$(RELEASE_FOLDER)" # Copia el ejecutable Intel al bundle cp "$(TARGET_FILE)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" # Firma la aplicación codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app" # Empaqueta el .dmg de la versión Intel con create-dmg @echo "Creando DMG Intel con iconos de 96x96..." create-dmg \ --volname "$(APP_NAME)" \ --window-pos 200 120 \ --window-size 720 300 \ --icon-size 96 \ --text-size 12 \ --icon "$(APP_NAME).app" 278 102 \ --icon "LICENSE" 441 102 \ --icon "README.md" 604 102 \ --app-drop-link 115 102 \ --hide-extension "$(APP_NAME).app" \ "$(MACOS_INTEL_RELEASE)" \ "$(RELEASE_FOLDER)" || true @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 --build build/arm cp "$(TARGET_FILE)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" # Firma la aplicación codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app" # Empaqueta el .dmg de la versión Apple Silicon con create-dmg @echo "Creando DMG Apple Silicon con iconos de 96x96..." create-dmg \ --volname "$(APP_NAME)" \ --window-pos 200 120 \ --window-size 720 300 \ --icon-size 96 \ --text-size 12 \ --icon "$(APP_NAME).app" 278 102 \ --icon "LICENSE" 441 102 \ --icon "README.md" 604 102 \ --app-drop-link 115 102 \ --hide-extension "$(APP_NAME).app" \ "$(MACOS_APPLE_SILICON_RELEASE)" \ "$(RELEASE_FOLDER)" || true @echo "Release Apple Silicon creado: $(MACOS_APPLE_SILICON_RELEASE)" # Elimina las carpetas temporales $(RMDIR) "$(RELEASE_FOLDER)" $(RMDIR) build/intel $(RMDIR) build/arm $(RMFILE) "$(DIST_DIR)"/rw.* # ============================================================================== # COMPILACIÓN PARA LINUX (RELEASE) # ============================================================================== linux_release: @$(MAKE) resources.pack @echo "Creando release para Linux - Version: $(VERSION)" # Compila con cmake @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build # Elimina carpeta temporal previa y la 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) "$(LINUX_RELEASE)" tar -czvf "$(LINUX_RELEASE)" -C "$(RELEASE_FOLDER)" . @echo "Release creado: $(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)" # ============================================================================== # CODE QUALITY (delegados a cmake) # ============================================================================== format: @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target format format-check: @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target format-check tidy: @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target tidy tidy-fix: @cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @cmake --build build --target tidy-fix # ============================================================================== # REGLAS ESPECIALES # ============================================================================== show_version: @echo "Version actual: $(VERSION)" help: @echo "Makefile para Coffee Crisis Arcade Edition" @echo "Comandos disponibles:" @echo "" @echo " Compilacion:" @echo " make - Compilar con cmake (Release)" @echo " make debug - Compilar con cmake (Debug)" @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 "" @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 "" @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 "" @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 pack_tool resources.pack spirv format format-check tidy tidy-fix show_version help