388 lines
16 KiB
Makefile
388 lines
16 KiB
Makefile
PROJECT := aee_arcade
|
|
BUILDDIR := build
|
|
|
|
# Detecció de plataforma. En Windows CMake defaulteja a "NMake Makefiles"
|
|
# (que requereix Visual Studio); forcem MinGW Makefiles per usar el g++ de
|
|
# MinGW. nproc tampoc existeix en cmd.exe → fem servir NUMBER_OF_PROCESSORS.
|
|
ifeq ($(OS),Windows_NT)
|
|
# Si Make corre dins MSYS2/Git Bash/MinGW, $(shell ...) usa sh.exe i
|
|
# "NUL" NO és dispositiu — un redirect "2>NUL" crearia un fitxer literal
|
|
# anomenat NUL al cwd (i en Windows es complica esborrar-lo). Detectem
|
|
# MSYSTEM per usar /dev/null en aquests entorns; només cmd.exe pur necessita NUL.
|
|
ifneq ($(MSYSTEM),)
|
|
NULDEV := /dev/null
|
|
else
|
|
NULDEV := NUL
|
|
endif
|
|
JOBS ?= $(NUMBER_OF_PROCESSORS)
|
|
# Si Ninja està al PATH, l'usem (més ràpid i paral·lelitza millor).
|
|
# Si no, caiem a MinGW Makefiles. Sense aquesta selecció CMake
|
|
# defaultejaria a "NMake Makefiles", que requereix Visual Studio.
|
|
HAS_NINJA := $(shell ninja --version 2>$(NULDEV))
|
|
ifneq ($(HAS_NINJA),)
|
|
CMAKE_GEN := -G "Ninja"
|
|
else
|
|
CMAKE_GEN := -G "MinGW Makefiles"
|
|
endif
|
|
else
|
|
NULDEV := /dev/null
|
|
JOBS ?= $(shell nproc 2>/dev/null || echo 4)
|
|
# Si Ninja està al PATH, l'usem (més ràpid i paral·lelitza millor).
|
|
# Si no, deixem que CMake usi el generador per defecte (Unix Makefiles).
|
|
HAS_NINJA := $(shell ninja --version 2>/dev/null)
|
|
ifneq ($(HAS_NINJA),)
|
|
CMAKE_GEN := -G "Ninja"
|
|
else
|
|
CMAKE_GEN :=
|
|
endif
|
|
endif
|
|
|
|
# VERSION (única font de veritat: source/utils/defines.hpp).
|
|
# Lazy (=): només es calcula quan s'invoca un target que la usa
|
|
# (show-version/help). Evita executar grep/sed des de cmd.exe en `make debug`.
|
|
VERSION = v$(shell grep 'constexpr const char\* VERSION' source/utils/defines.hpp | sed -E 's/.*VERSION = "([^"]+)".*/\1/')
|
|
|
|
# GIT_HASH calculat al host i passat a CMake (evita problemes si CMake corre en
|
|
# entorns sense accés a git, p.ex. Docker/emscripten).
|
|
GIT_HASH := $(shell git rev-parse --short=7 HEAD 2>$(NULDEV))
|
|
ifeq ($(GIT_HASH),)
|
|
GIT_HASH := unknown
|
|
endif
|
|
|
|
CMAKE_DEFS := -DGIT_HASH=$(GIT_HASH)
|
|
|
|
# ==============================================================================
|
|
# RELEASE — variables d'empaquetat per distribució
|
|
# ==============================================================================
|
|
APP_NAME := Aventures en Egipte ARCADE
|
|
DIST_DIR := dist
|
|
RELEASE_FOLDER := $(DIST_DIR)/_tmp
|
|
TARGET_FILE := $(BUILDDIR)/$(PROJECT)
|
|
RELEASE_FILE := $(RELEASE_FOLDER)/$(PROJECT)
|
|
|
|
# Noms dels artefactes finals (amb VERSION i PROJECT)
|
|
WINDOWS_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-win32-x64.zip
|
|
MACOS_INTEL_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-macos-intel.dmg
|
|
MACOS_APPLE_SILICON_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-macos-apple-silicon.dmg
|
|
LINUX_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-linux.tar.gz
|
|
|
|
# Variables específiques de Windows (PowerShell). El subst escapa apòstrofs
|
|
# (' → '') perquè APP_NAMEs amb apòstrof no trenquen el parser de PowerShell.
|
|
ifeq ($(OS),Windows_NT)
|
|
WIN_TARGET_FILE := $(BUILDDIR)/$(APP_NAME)
|
|
WIN_RELEASE_FILE := $(RELEASE_FOLDER)/$(APP_NAME)
|
|
WIN_RELEASE_FILE_PS := $(subst ','',$(WIN_RELEASE_FILE))
|
|
UNAME_S :=
|
|
else
|
|
WIN_TARGET_FILE := $(TARGET_FILE)
|
|
WIN_RELEASE_FILE := $(RELEASE_FILE)
|
|
WIN_RELEASE_FILE_PS := $(WIN_RELEASE_FILE)
|
|
UNAME_S := $(shell uname -s)
|
|
endif
|
|
|
|
# Helpers cross-platform per crear/esborrar directoris als sub-targets release.
|
|
ifeq ($(OS),Windows_NT)
|
|
RMFILE := del /Q
|
|
RMDIR := rmdir /S /Q
|
|
MKDIR := mkdir
|
|
else
|
|
RMFILE := rm -f
|
|
RMDIR := rm -rdf
|
|
MKDIR := mkdir -p
|
|
endif
|
|
|
|
.PHONY: all debug release _windows_release _macos_release _linux_release run run-debug clean rebuild show-version pack controllerdb format format-check tidy tidy-fix cppcheck hooks-install help
|
|
|
|
# ==============================================================================
|
|
# COMPILACIÓ
|
|
# ==============================================================================
|
|
# Convenció alineada amb ../aee i ../projecte_2026:
|
|
# make → Release (binari d'ús normal)
|
|
# make debug → Debug (flux complet + `debug.yaml` per triar escena inicial)
|
|
# make release → Release + empaquetat per a distribució (zip/dmg/tar.gz segons SO)
|
|
# ==============================================================================
|
|
|
|
all:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) -j$(JOBS)
|
|
|
|
debug:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Debug $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) -j$(JOBS)
|
|
|
|
run: all
|
|
@./$(BUILDDIR)/$(PROJECT)
|
|
|
|
run-debug: debug
|
|
@./$(BUILDDIR)/$(PROJECT)
|
|
|
|
# Release + empaquetat per a distribució: detecta el SO i delega al
|
|
# sub-target corresponent. Cada sub-target compila Release, copia
|
|
# resources.pack + binari + assets al RELEASE_FOLDER, i empaqueta el
|
|
# resultat a $(DIST_DIR)/.
|
|
release:
|
|
ifeq ($(OS),Windows_NT)
|
|
@"$(MAKE)" _windows_release
|
|
else
|
|
ifeq ($(UNAME_S),Darwin)
|
|
@$(MAKE) _macos_release
|
|
else
|
|
@$(MAKE) _linux_release
|
|
endif
|
|
endif
|
|
|
|
# ==============================================================================
|
|
# RELEASE — Linux (.tar.gz)
|
|
# ==============================================================================
|
|
_linux_release:
|
|
@echo "Creando release para Linux - Version: $(VERSION)"
|
|
|
|
# Compila Release (genera shaders, resources.pack i binari)
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) -j$(JOBS)
|
|
|
|
# Recrea la carpeta temporal (i $(DIST_DIR) si no existeix)
|
|
@$(MKDIR) "$(DIST_DIR)" 2>/dev/null || true
|
|
@$(RMDIR) "$(RELEASE_FOLDER)" 2>/dev/null || true
|
|
$(MKDIR) "$(RELEASE_FOLDER)"
|
|
|
|
# Còpia de fitxers (LICENSE condicional — encara no existeix al repo)
|
|
cp $(BUILDDIR)/resources.pack "$(RELEASE_FOLDER)"
|
|
cp README.md "$(RELEASE_FOLDER)"
|
|
cp gamecontrollerdb.txt "$(RELEASE_FOLDER)"
|
|
@[ -f LICENSE ] && cp LICENSE "$(RELEASE_FOLDER)" || true
|
|
cp "$(TARGET_FILE)" "$(RELEASE_FILE)"
|
|
strip -s -R .comment -R .gnu.version "$(RELEASE_FILE)" --strip-unneeded
|
|
|
|
# Empaqueta a .tar.gz
|
|
$(RMFILE) "$(LINUX_RELEASE)"
|
|
tar -czvf "$(LINUX_RELEASE)" -C "$(RELEASE_FOLDER)" .
|
|
@echo "Release creado: $(LINUX_RELEASE)"
|
|
|
|
# Neteja la carpeta temporal
|
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
|
|
|
# ==============================================================================
|
|
# RELEASE — Windows (.zip)
|
|
# ==============================================================================
|
|
_windows_release:
|
|
@echo off
|
|
@echo Creando release para Windows - Version: $(VERSION)
|
|
|
|
# Compila Release
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) -j$(JOBS)
|
|
|
|
# Crea $(DIST_DIR) i recrea la carpeta temporal
|
|
@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}"
|
|
|
|
# Còpia de fitxers (LICENSE condicional)
|
|
@powershell -Command "Copy-Item -Path '$(BUILDDIR)/resources.pack' -Destination '$(RELEASE_FOLDER)'"
|
|
@powershell -Command "if (Test-Path 'LICENSE') { Copy-Item 'LICENSE' -Destination '$(RELEASE_FOLDER)' }"
|
|
@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).exe' -Destination '$(WIN_RELEASE_FILE_PS).exe'"
|
|
strip -s -R .comment -R .gnu.version "$(WIN_RELEASE_FILE).exe" --strip-unneeded
|
|
|
|
# Empaqueta a .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)
|
|
|
|
# Neteja la carpeta temporal
|
|
@powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}"
|
|
|
|
# ==============================================================================
|
|
# RELEASE — macOS (.dmg per Intel + Apple Silicon)
|
|
# ==============================================================================
|
|
_macos_release:
|
|
@echo "Creando release para macOS - Version: $(VERSION)"
|
|
|
|
# Verificar/instal·lar create-dmg si cal
|
|
@which create-dmg > /dev/null || (echo "Instalando create-dmg..." && brew install create-dmg)
|
|
|
|
# Compila la versió Intel (genera shaders, resources.pack i binari)
|
|
@cmake -S . -B $(BUILDDIR)/intel -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DMACOS_BUNDLE=ON $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR)/intel -j$(JOBS)
|
|
|
|
# Neteja artefactes anteriors
|
|
$(RMDIR) "$(RELEASE_FOLDER)" 2>/dev/null || true
|
|
$(RMFILE) tmp.dmg
|
|
$(RMFILE) "$(DIST_DIR)"/rw.* 2>/dev/null || true
|
|
$(RMFILE) "$(MACOS_INTEL_RELEASE)"
|
|
$(RMFILE) "$(MACOS_APPLE_SILICON_RELEASE)"
|
|
|
|
# Crea l'estructura del bundle .app
|
|
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
|
|
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS"
|
|
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
|
|
|
# Còpia de recursos i metadades del bundle
|
|
cp $(BUILDDIR)/intel/resources.pack "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
|
cp gamecontrollerdb.txt "$(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"
|
|
@[ -f LICENSE ] && cp LICENSE "$(RELEASE_FOLDER)" || true
|
|
cp README.md "$(RELEASE_FOLDER)"
|
|
|
|
# Sobreescriu CFBundleShortVersionString i CFBundleVersion al Info.plist amb la VERSION actual
|
|
@echo "Actualizando Info.plist con versión $(VERSION)..."
|
|
@RAW_VERSION=$$(echo "$(VERSION)" | sed 's/^v//'); \
|
|
sed -i '' '/<key>CFBundleShortVersionString<\/key>/{n;s|<string>.*</string>|<string>'"$$RAW_VERSION"'</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"; \
|
|
sed -i '' '/<key>CFBundleVersion<\/key>/{n;s|<string>.*</string>|<string>'"$$RAW_VERSION"'</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"
|
|
|
|
# Còpia del binari Intel al bundle
|
|
cp "$(BUILDDIR)/intel/$(PROJECT)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(PROJECT)"
|
|
|
|
# Firma ad-hoc del bundle Intel
|
|
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
|
|
|
# Empaqueta el .dmg Intel
|
|
@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ó Apple Silicon i la posa al mateix bundle
|
|
@cmake -S . -B $(BUILDDIR)/arm -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DMACOS_BUNDLE=ON $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR)/arm -j$(JOBS)
|
|
cp "$(BUILDDIR)/arm/$(PROJECT)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(PROJECT)"
|
|
|
|
# Re-firma amb el binari arm64
|
|
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
|
|
|
# Empaqueta el .dmg Apple Silicon
|
|
@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)"
|
|
|
|
# Neteja temporals
|
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
|
$(RMDIR) $(BUILDDIR)/intel
|
|
$(RMDIR) $(BUILDDIR)/arm
|
|
$(RMFILE) "$(DIST_DIR)"/rw.* 2>/dev/null || true
|
|
|
|
show-version:
|
|
@echo "$(PROJECT) $(VERSION) ($(GIT_HASH))"
|
|
|
|
clean:
|
|
@rm -rf $(BUILDDIR)
|
|
|
|
rebuild: clean all
|
|
|
|
# Empaqueta data/ a $(BUILDDIR)/resources.pack (format AE26). Força un rebuild
|
|
# del pack encara que res no hagi canviat dins data/. L'empaquetat també es fa
|
|
# automàticament a cada `make`/`make debug` via el target CMake `resource_pack`.
|
|
#
|
|
# NO passem `-DCMAKE_BUILD_TYPE`: així respectem el tipus ja configurat al
|
|
# `CMakeCache.txt` (Debug si vens de `make debug`, Release si vens de
|
|
# `make release`). Si forcéssim Release ací, el següent build de debug
|
|
# invalidaria la cache i recompilaria-ho tot. El binari `pack_resources`
|
|
# és una utilitat petita on el build type és irrellevant.
|
|
pack:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) --target pack_resources
|
|
@./$(BUILDDIR)/pack_resources data $(BUILDDIR)/resources.pack
|
|
|
|
# Descàrrega de la base de dades de mappings de mandos. SDL només pot
|
|
# obrir-la des del filesystem (no del pack), per això viu a l'arrel del
|
|
# projecte i CMake la copia al costat del binari a cada build.
|
|
controllerdb:
|
|
@echo "Descarregant gamecontrollerdb.txt..."
|
|
@curl -fsSL https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/master/gamecontrollerdb.txt \
|
|
-o gamecontrollerdb.txt
|
|
@echo "gamecontrollerdb.txt actualitzat"
|
|
|
|
# ==============================================================================
|
|
# CODE QUALITY (delegados a cmake)
|
|
# ==============================================================================
|
|
format:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) --target format
|
|
|
|
format-check:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) --target format-check
|
|
|
|
tidy:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) --target tidy
|
|
|
|
tidy-fix:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) --target tidy-fix
|
|
|
|
cppcheck:
|
|
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
|
|
@cmake --build $(BUILDDIR) --target cppcheck
|
|
|
|
# ==============================================================================
|
|
# GIT HOOKS
|
|
# ==============================================================================
|
|
hooks-install:
|
|
@git config core.hooksPath .githooks
|
|
@echo "Git hooks activats: $(shell pwd)/.githooks"
|
|
|
|
# ==============================================================================
|
|
# AJUDA
|
|
# ==============================================================================
|
|
help:
|
|
@echo "Makefile per a $(PROJECT)"
|
|
@echo ""
|
|
@echo " Compilació:"
|
|
@echo " make - Compilar amb cmake (Release)"
|
|
@echo " make debug - Compilar amb cmake (Debug)"
|
|
@echo ""
|
|
@echo " Execució:"
|
|
@echo " make run - Compilar (Release) i executar"
|
|
@echo " make run-debug - Compilar (Debug) i executar"
|
|
@echo ""
|
|
@echo " Release:"
|
|
@echo " make release - Release + empaquetat (zip/dmg/tar.gz segons SO)"
|
|
@echo ""
|
|
@echo " Recursos:"
|
|
@echo " make pack - Empaquetar data/ a $(BUILDDIR)/resources.pack (format AE26)"
|
|
@echo " make controllerdb - Descarregar gamecontrollerdb.txt actualitzat (arrel)"
|
|
@echo ""
|
|
@echo " Qualitat de codi:"
|
|
@echo " make format - Formatar codi amb clang-format"
|
|
@echo " make format-check - Verificar format sense modificar"
|
|
@echo " make tidy - Anàlisi estàtic amb clang-tidy"
|
|
@echo " make tidy-fix - Anàlisi estàtic amb auto-fix"
|
|
@echo " make cppcheck - Anàlisi estàtic amb cppcheck"
|
|
@echo ""
|
|
@echo " Altres:"
|
|
@echo " make clean - Esborrar carpeta $(BUILDDIR)/"
|
|
@echo " make rebuild - clean + all"
|
|
@echo " make show-version - Mostrar versió"
|
|
@echo " make hooks-install - Activar git hooks del projecte"
|
|
@echo ""
|
|
@echo " Versió actual: $(VERSION) ($(GIT_HASH))"
|