From 6ed9a8ad288aebd6438af924e2de9f4061f99fb9 Mon Sep 17 00:00:00 2001 From: quarrel07 Date: Fri, 17 Jul 2026 15:28:29 -0700 Subject: [PATCH] Fix macOS arm64 build: fmt consteval error in the TorchExternal sub-build (#712) * Fix macOS arm64 build: fmt consteval error in the TorchExternal sub-build Torch's pinned spdlog bundles an fmt whose consteval format-string checking fails to compile under newer AppleClang (Xcode 16+), breaking the build-macos-arm64 CI job (the intel runner's older Xcode doesn't hit it): error: call to consteval function 'fmt::basic_format_string<...>' is not a constant expression Define FMT_CONSTEVAL as empty inside the Torch sub-build, falling back to fmt's pre-C++20 constexpr checking. Injected via CMAKE_PROJECT_INCLUDE because Torch's CMakeLists overwrites CMAKE_CXX_FLAGS, so plain flag injection through CMAKE_ARGS is discarded. Scoped to AppleClang; no other platform or compiler is affected, and the Torch pin is unchanged. Co-Authored-By: Claude Fable 5 * Also neutralize FMT_CONSTEVAL for the game build (vcpkg spdlog/fmt) With the TorchExternal fix in place, CI reaches the game build and hits the same consteval error again, this time from the vcpkg-provided spdlog/fmt headers (SPDLOG_FMT_EXTERNAL) under the runner's Xcode 26.5. Apply the same AppleClang-scoped FMT_CONSTEVAL= define at the project level so both layers compile. Co-Authored-By: Claude Fable 5 * Pin vcpkg fmt to 10.2.1 (+ spdlog 1.14.1): fmt 11.0.2 can't compile on new AppleClang The baseline's fmt 11.0.2 both fails to compile under newer AppleClang (consteval format-string checking) and removed the #ifndef guard around FMT_CONSTEVAL, so the AppleClang-scoped define from the previous commit lands on the compile line but gets clobbered by fmt's own definition (FMT_USE_CONSTEVAL is likewise unguarded in that version). No newer fmt exists in the pinned baseline. Override fmt to 10.2.1, which keeps the #ifndef guard, making the existing define effective; spdlog moves to the matching 1.14.1 (1.15.x requires fmt >= 11 headers). Verified locally against the exact CI setup (vcpkg at baseline 2e58bb35ff, vcpkg toolchain file, Ninja): the previous failure reproduces without this change and the full game builds cleanly with it. Co-Authored-By: Claude Fable 5 * Add TODO markers for removing the fmt consteval workarounds Requested in PR #712 review: mark all three workaround sites (project-level define, Torch sub-build include, vcpkg fmt/spdlog pins) so they can be found and removed together once the Torch pin is bumped past its spdlog/fmt update. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: siliconports Co-authored-by: Claude Fable 5 --- CMakeLists.txt | 28 ++++++++++++++++++++++++++++ cmake/TorchExternalFixes.cmake | 18 ++++++++++++++++++ vcpkg.json | 12 ++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 cmake/TorchExternalFixes.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 45dff319a..53ae41d78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,23 @@ cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) project(Spaghettify VERSION 1.0.0 LANGUAGES C CXX ASM) include(FetchContent) +# fmt's consteval format-string checking fails to compile under newer +# AppleClang (Xcode 16+) with the spdlog/fmt versions in use (both vcpkg's on +# CI and Torch's bundled copy — see cmake/TorchExternalFixes.cmake for the +# latter): +# error: call to consteval function 'fmt::basic_format_string<...>' is not +# a constant expression +# Defining FMT_CONSTEVAL as empty falls back to fmt's pre-C++20 constexpr +# checking, which compiles cleanly with identical runtime behavior. Scoped to +# AppleClang; other platforms and compilers are untouched. +# TODO: Temporary hack. Remove this (plus cmake/TorchExternalFixes.cmake and +# the vcpkg.json fmt/spdlog pins) once the Torch pin is bumped past Torch's +# spdlog/fmt update. Note the bump also needs matching MK64 loader changes, +# see the discussion on PR #712. +if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_definitions("FMT_CONSTEVAL=") +endif() + set(NATO_PHONETIC_ALPHABET "Alfa" "Bravo" "Charlie" "Delta" "Echo" "Foxtrot" "Golf" "Hotel" "India" "Juliett" "Kilo" "Lima" "Mike" "November" "Oscar" "Papa" @@ -704,10 +721,21 @@ add_custom_command( if(NOT CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") include(ExternalProject) + # Torch's pinned spdlog bundles an fmt that trips a consteval error under + # newer AppleClang (Xcode 16+): "call to consteval function + # 'fmt::basic_format_string<...>' is not a constant expression". Neutralize + # FMT_CONSTEVAL inside the Torch sub-build via CMAKE_PROJECT_INCLUDE (Torch's + # CMakeLists overwrites CMAKE_CXX_FLAGS, so flags can't be injected that + # way). Fixes the build-macos-arm64 job; the intel runner's older Xcode + # doesn't hit it. + # TODO: Temporary hack. Remove the CMAKE_PROJECT_INCLUDE line below (plus + # cmake/TorchExternalFixes.cmake itself) once the Torch pin is bumped past + # Torch's spdlog/fmt update, see the discussion on PR #712. ExternalProject_Add(TorchExternal PREFIX TorchExternal SOURCE_DIR ${CMAKE_SOURCE_DIR}/torch CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/torch + -DCMAKE_PROJECT_INCLUDE=${CMAKE_SOURCE_DIR}/cmake/TorchExternalFixes.cmake ) ExternalProject_Get_Property(TorchExternal install_dir) diff --git a/cmake/TorchExternalFixes.cmake b/cmake/TorchExternalFixes.cmake new file mode 100644 index 000000000..9dd5bf9e3 --- /dev/null +++ b/cmake/TorchExternalFixes.cmake @@ -0,0 +1,18 @@ +# Included in the TorchExternal sub-build via CMAKE_PROJECT_INCLUDE (runs right +# after Torch's project() call). +# +# Torch's pinned spdlog bundles an fmt whose consteval format-string checking +# fails to compile under newer AppleClang (Xcode 16+): +# error: call to consteval function 'fmt::basic_format_string<...>' is not a +# constant expression +# Defining FMT_CONSTEVAL to empty falls back to fmt's pre-C++20 constexpr +# checking, which compiles cleanly. Scoped to AppleClang so other platforms and +# compilers are untouched. add_compile_definitions (rather than CMAKE_CXX_FLAGS) +# because Torch's CMakeLists overwrites the latter. +# TODO: Temporary hack. Delete this file (plus the CMAKE_PROJECT_INCLUDE line +# in CMakeLists.txt and the vcpkg.json fmt/spdlog pins) once the Torch pin is +# bumped past Torch's spdlog/fmt update. Note the bump also needs matching +# MK64 loader changes, see the discussion on PR #712. +if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_definitions("FMT_CONSTEVAL=") +endif() diff --git a/vcpkg.json b/vcpkg.json index 53da50815..f1d6c7be3 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -31,5 +31,17 @@ "libogg", "libvorbis" ], + "overrides": [ + { + "$reason": "fmt 11.0.2 (spdlog's dependency) fails to compile under newer AppleClang (consteval format-string checking) and hard-defines FMT_CONSTEVAL with no override guard, so it cannot be disabled either. 10.2.1 keeps the #ifndef guard, letting the AppleClang-scoped FMT_CONSTEVAL= define in CMakeLists.txt take effect. spdlog is pinned to the matching 1.14.1 (1.15.x requires fmt >= 11). TODO: Temporary hack. Remove both pins (plus the FMT_CONSTEVAL blocks in CMakeLists.txt and cmake/TorchExternalFixes.cmake) once the Torch pin is bumped past Torch's spdlog/fmt update. Note the bump also needs matching MK64 loader changes, see the discussion on PR #712.", + "name": "fmt", + "version": "10.2.1", + "port-version": 2 + }, + { + "name": "spdlog", + "version": "1.14.1" + } + ], "builtin-baseline": "2e58bb35ff7a3a037920d959ce20cb4d8c22319a" }