build: refresh toolchain and dependency wiring

This commit is contained in:
scawful
2025-12-22 14:45:31 -05:00
parent 7b72b2e3d4
commit df866b3f7f
18 changed files with 160 additions and 67 deletions

View File

@@ -7,16 +7,39 @@
# 1. Set the target system (macOS)
set(CMAKE_SYSTEM_NAME Darwin)
# Ensure a non-empty system version for third-party CMake logic.
if(NOT CMAKE_SYSTEM_VERSION)
execute_process(
COMMAND sw_vers -productVersion
OUTPUT_VARIABLE _yaze_macos_version
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(_yaze_macos_version)
set(CMAKE_SYSTEM_VERSION "${_yaze_macos_version}")
else()
set(CMAKE_SYSTEM_VERSION "0")
endif()
endif()
# 2. Find the Homebrew LLVM installation path
# We use execute_process to make this portable across machine architectures.
execute_process(
COMMAND brew --prefix llvm@18
OUTPUT_VARIABLE HOMEBREW_LLVM_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(_yaze_llvm_candidates llvm@21 llvm@20 llvm@19 llvm@18 llvm)
foreach(_yaze_llvm_candidate IN LISTS _yaze_llvm_candidates)
execute_process(
COMMAND brew --prefix ${_yaze_llvm_candidate}
OUTPUT_VARIABLE _yaze_llvm_prefix
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE _yaze_llvm_result
)
if(_yaze_llvm_result EQUAL 0 AND EXISTS "${_yaze_llvm_prefix}")
set(HOMEBREW_LLVM_PREFIX "${_yaze_llvm_prefix}")
break()
endif()
endforeach()
if(NOT EXISTS "${HOMEBREW_LLVM_PREFIX}")
message(FATAL_ERROR "Homebrew LLVM not found. Please run 'brew install llvm'. Path: ${HOMEBREW_LLVM_PREFIX}")
message(FATAL_ERROR "Homebrew LLVM not found. Please run 'brew install llvm'.")
endif()
# Cache this variable so it's available in the main CMakeLists.txt
@@ -52,18 +75,29 @@ execute_process(
set(CMAKE_SYSROOT "${CMAKE_OSX_SYSROOT}")
message(STATUS "Using macOS SDK at: ${CMAKE_SYSROOT}")
# 5. **[THE CRITICAL FIX]** Explicitly define the C++ standard library include directory.
# This forces CMake to add Homebrew's libc++ headers to the search path *before*
# any other system paths, resolving the header conflict for the main project
# and all dependencies.
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES "${HOMEBREW_LLVM_PREFIX}/include/c++/v1")
# 5. Ensure Homebrew libc++ + Clang resource headers are searched before SDK headers.
execute_process(
COMMAND "${HOMEBREW_LLVM_PREFIX}/bin/clang++" -print-resource-dir
OUTPUT_VARIABLE HOMEBREW_LLVM_RESOURCE_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(HOMEBREW_LLVM_RESOURCE_INCLUDE "${HOMEBREW_LLVM_RESOURCE_DIR}/include")
if(EXISTS "${HOMEBREW_LLVM_PREFIX}/include/c++/v1")
set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON)
include_directories(BEFORE SYSTEM "${HOMEBREW_LLVM_PREFIX}/include/c++/v1")
endif()
if(EXISTS "${HOMEBREW_LLVM_RESOURCE_INCLUDE}")
include_directories(BEFORE SYSTEM "${HOMEBREW_LLVM_RESOURCE_INCLUDE}")
endif()
# 5.5 Ensure Homebrew libc++ is linked to avoid mixing ABI with system libc++.
set(_yaze_llvm_lib_dir "${HOMEBREW_LLVM_PREFIX}/lib")
set(_yaze_llvm_libcxx_dir "${HOMEBREW_LLVM_PREFIX}/lib/c++")
set(CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT} -stdlib=libc++")
set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT} -L${_yaze_llvm_lib_dir} -Wl,-rpath,${_yaze_llvm_lib_dir}")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_SHARED_LINKER_FLAGS_INIT} -L${_yaze_llvm_lib_dir} -Wl,-rpath,${_yaze_llvm_lib_dir}")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_MODULE_LINKER_FLAGS_INIT} -L${_yaze_llvm_lib_dir} -Wl,-rpath,${_yaze_llvm_lib_dir}")
set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT} -L${_yaze_llvm_lib_dir} -Wl,-rpath,${_yaze_llvm_lib_dir} -L${_yaze_llvm_libcxx_dir} -Wl,-rpath,${_yaze_llvm_libcxx_dir}")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_SHARED_LINKER_FLAGS_INIT} -L${_yaze_llvm_lib_dir} -Wl,-rpath,${_yaze_llvm_lib_dir} -L${_yaze_llvm_libcxx_dir} -Wl,-rpath,${_yaze_llvm_libcxx_dir}")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_MODULE_LINKER_FLAGS_INIT} -L${_yaze_llvm_lib_dir} -Wl,-rpath,${_yaze_llvm_lib_dir} -L${_yaze_llvm_libcxx_dir} -Wl,-rpath,${_yaze_llvm_libcxx_dir}")
# 6. Set the default installation path for macOS frameworks
set(CMAKE_FIND_FRAMEWORK FIRST)