# ============================================================================== # Makefile per a Shadertoy # # Tres targets: # make → Release (cmake) # make debug → Debug (cmake) # make release → Release + empaquetat per a distribució a dist/ # # El SO es detecta automàticament. La compilació sempre passa per CMake. # ============================================================================== PROJECT := shadertoy APP_NAME := Shadertoy DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST))) BUILDDIR := build DIST_DIR := dist RELEASE_FOLDER := $(DIST_DIR)/_tmp # ============================================================================== # DETECCIÓ DE PLATAFORMA + GENERADOR CMAKE + JOBS # ============================================================================== ifeq ($(OS),Windows_NT) # MSYS2/Git Bash usa /dev/null, cmd.exe pur usa NUL. ifneq ($(MSYSTEM),) NULDEV := /dev/null else NULDEV := NUL endif JOBS ?= $(NUMBER_OF_PROCESSORS) HAS_NINJA := $(shell ninja --version 2>$(NULDEV)) ifneq ($(HAS_NINJA),) CMAKE_GEN := -G "Ninja" else CMAKE_GEN := -G "MinGW Makefiles" endif UNAME_S := Windows SHELL := cmd.exe else NULDEV := /dev/null JOBS ?= $(shell nproc 2>/dev/null || echo 4) CMAKE_GEN := UNAME_S := $(shell uname -s) endif # ============================================================================== # VERSIÓ (data, format YYYY.MM.DD) # ============================================================================== ifeq ($(OS),Windows_NT) VERSION := $(shell powershell -Command "Get-Date -Format 'yyyy.MM.dd'") else VERSION := $(shell date +%Y.%m.%d) endif # ============================================================================== # NOMS DELS ARTEFACTES DE RELEASE # ============================================================================== WINDOWS_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-win32-x64.zip MACOS_APPLE_SILICON_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-macos-apple-silicon.dmg LINUX_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-linux.tar.gz .PHONY: all debug release clean help _windows_release _macos_release _linux_release # ============================================================================== # COMPILACIÓ (delegada a CMake) # ============================================================================== all: @cmake $(CMAKE_GEN) -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release @cmake --build $(BUILDDIR) -j$(JOBS) debug: @cmake $(CMAKE_GEN) -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Debug @cmake --build $(BUILDDIR) -j$(JOBS) # ============================================================================== # RELEASE (auto-dispatch per SO) # ============================================================================== release: ifeq ($(OS),Windows_NT) @"$(MAKE)" _windows_release else ifeq ($(UNAME_S),Darwin) @$(MAKE) _macos_release else @$(MAKE) _linux_release endif endif clean: @rm -rf $(BUILDDIR) $(DIST_DIR) # ============================================================================== # RELEASE LINUX # ============================================================================== _linux_release: @echo "Creant release per a Linux - Versió: $(VERSION)" @cmake $(CMAKE_GEN) -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release @cmake --build $(BUILDDIR) -j$(JOBS) @mkdir -p $(DIST_DIR) @rm -rf $(RELEASE_FOLDER) @mkdir -p $(RELEASE_FOLDER) @cp -R data $(RELEASE_FOLDER)/ @cp LICENSE $(RELEASE_FOLDER)/ @cp README.md $(RELEASE_FOLDER)/ @cp $(PROJECT) $(RELEASE_FOLDER)/ @strip -s -R .comment -R .gnu.version $(RELEASE_FOLDER)/$(PROJECT) --strip-unneeded @rm -f $(LINUX_RELEASE) @tar -czf $(LINUX_RELEASE) -C $(RELEASE_FOLDER) . @echo "Release creat: $(LINUX_RELEASE)" @rm -rf $(RELEASE_FOLDER) # ============================================================================== # RELEASE MACOS (Apple Silicon, .dmg amb .app bundle) # ============================================================================== _macos_release: @echo "Creant release per a macOS - Versió: $(VERSION)" @command -v create-dmg >/dev/null 2>&1 || { \ echo "Falta create-dmg. Instal·la amb: brew install create-dmg"; \ exit 1; \ } @cmake -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release -DMACOS_BUNDLE=ON -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 @cmake --build $(BUILDDIR) -j$(JOBS) @mkdir -p $(DIST_DIR) @rm -rf $(RELEASE_FOLDER) @rm -f tmp.dmg "$(MACOS_APPLE_SILICON_RELEASE)" $(DIST_DIR)/rw.* @mkdir -p "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks" @mkdir -p "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS" @mkdir -p "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources" @cp -R data "$(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/icon.icns "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources/" @cp release/macos/Info.plist "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/" @cp $(PROJECT) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(PROJECT)" @cp LICENSE "$(RELEASE_FOLDER)/" @cp README.md "$(RELEASE_FOLDER)/" @RAW_VERSION=$$(echo "$(VERSION)" | sed 's/^v//'); \ sed -i '' '/CFBundleShortVersionString<\/key>/{n;s|.*|'"$$RAW_VERSION"'|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"; \ sed -i '' '/CFBundleVersion<\/key>/{n;s|.*|'"$$RAW_VERSION"'|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist" @codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app" @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 creat: $(MACOS_APPLE_SILICON_RELEASE)" @rm -rf $(RELEASE_FOLDER) @rm -f $(DIST_DIR)/rw.* # ============================================================================== # RELEASE WINDOWS (.zip amb DLLs) # ============================================================================== _windows_release: @echo off @echo Creant release per a Windows - Versió: $(VERSION) @cmake $(CMAKE_GEN) -S . -B $(BUILDDIR) -DCMAKE_BUILD_TYPE=Release @cmake --build $(BUILDDIR) -j$(JOBS) @powershell -Command "if (-not (Test-Path '$(DIST_DIR)')) {New-Item '$(DIST_DIR)' -ItemType Directory | Out-Null}" @powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}" @powershell -Command "New-Item '$(RELEASE_FOLDER)' -ItemType Directory | Out-Null" @powershell -Command "Copy-Item -Path 'data' -Destination '$(RELEASE_FOLDER)' -Recurse" @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 '$(PROJECT).exe' -Destination '$(RELEASE_FOLDER)/$(APP_NAME).exe'" @strip -s -R .comment -R .gnu.version "$(RELEASE_FOLDER)/$(APP_NAME).exe" --strip-unneeded @powershell -Command "if (Test-Path '$(WINDOWS_RELEASE)') {Remove-Item '$(WINDOWS_RELEASE)'}" @powershell -Command "Compress-Archive -Path '$(RELEASE_FOLDER)/*' -DestinationPath '$(WINDOWS_RELEASE)'" @echo Release creat: $(WINDOWS_RELEASE) @powershell -Command "Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force" # ============================================================================== # AJUDA # ============================================================================== help: @echo "Makefile per a $(PROJECT)" @echo "" @echo " make Compilar Release (cmake)" @echo " make debug Compilar Debug (cmake)" @echo " make release Compilar + empaquetar per a distribució a $(DIST_DIR)/" @echo " make clean Esborrar $(BUILDDIR)/ i $(DIST_DIR)/" @echo "" @echo " Versió actual: $(VERSION)"