From cc529afeb2f8daa300a483a0fbf9a53f6e5c81c1 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 28 Apr 2026 08:17:49 +0200 Subject: [PATCH] build: detecta Windows i tria generador CMake (Ninja o MinGW Makefiles) --- Makefile | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 0b62e8e..a0f84c3 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,35 @@ PROJECT := aee_2026 BUILDDIR := build -JOBS ?= $(shell nproc 2>/dev/null || echo 4) -# VERSION (única font de veritat: source/utils/defines.hpp) -VERSION := v$(shell grep 'constexpr const char\* VERSION' source/utils/defines.hpp | sed -E 's/.*VERSION = "([^"]+)".*/\1/') +# 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) + NULDEV := NUL + 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) + CMAKE_GEN := +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>/dev/null) +GIT_HASH := $(shell git rev-parse --short=7 HEAD 2>$(NULDEV)) ifeq ($(GIT_HASH),) GIT_HASH := unknown endif @@ -26,11 +48,11 @@ CMAKE_DEFS := -DGIT_HASH=$(GIT_HASH) # ============================================================================== all: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) @cmake --build $(BUILDDIR) -j$(JOBS) debug: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Debug $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Debug $(CMAKE_DEFS) @cmake --build $(BUILDDIR) -j$(JOBS) run: all @@ -57,7 +79,7 @@ rebuild: clean all # 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`. pack: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) @cmake --build $(BUILDDIR) --target pack_resources @./$(BUILDDIR)/pack_resources data $(BUILDDIR)/resources.pack @@ -74,23 +96,23 @@ controllerdb: # CODE QUALITY (delegados a cmake) # ============================================================================== format: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) @cmake --build $(BUILDDIR) --target format format-check: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) @cmake --build $(BUILDDIR) --target format-check tidy: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) @cmake --build $(BUILDDIR) --target tidy tidy-fix: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) @cmake --build $(BUILDDIR) --target tidy-fix cppcheck: - @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) + @cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS) @cmake --build $(BUILDDIR) --target cppcheck # ==============================================================================