diff --git a/CMakeLists.txt b/CMakeLists.txt index 9303abe94d72f90eac96f4d2bf504c8036d194d1..6bca7ca900447a1b1b3e02c878061c2c518913da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ SOFTWARE. cmake_minimum_required(VERSION 3.12) -set(CMAKE_MAXIMUM_SUPPORTED_VERSION 3.29) +set(CMAKE_MAXIMUM_SUPPORTED_VERSION 3.30) include("./cmake/HandlePolicies.cmake" NO_POLICY_SCOPE) @@ -40,17 +40,67 @@ if (NOT IS_TOP_LEVEL) endif () if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") + # The available binary Accelerate version is determined by the MacOS system + message(STATUS "The Darwin kernel version is: ${CMAKE_HOST_SYSTEM_VERSION}") + # Mac OS X 15.0 Sequoia if (CMAKE_HOST_SYSTEM_VERSION VERSION_GREATER_EQUAL 24.0) + message(STATUS "The MacOS version is: >=15.0") + set(MINIMUM_MACOS_SDK_VERSION 15.0) set(ACCELERATE_NEW_LAPACK_VERSION 3.11.0) # Mac OS X 13.3 Ventura elseif (CMAKE_HOST_SYSTEM_VERSION VERSION_GREATER_EQUAL 22.4) + message(STATUS "The MacOS version is: >=13.3,<15.0") + set(MINIMUM_MACOS_SDK_VERSION 13.3) + set(VALID_MACOS_SDK_VERSIONS 14.5 14.4 14.2 14.0 13.3) set(ACCELERATE_NEW_LAPACK_VERSION 3.9.1) else () - message(FATAL_ERROR "You need at least Mac OS X 13.3 Ventura for Accelerate with BLAS/LAPACK v3.9.1!") + message(FATAL_ERROR "You need at least MacOS 13.3 Ventura for Accelerate with BLAS/LAPACK v3.9.1!") endif () endif () +string(REGEX MATCH [=[SDKs/MacOSX(.*)\.sdk$]=] _REGEX_DUMMY "${CMAKE_OSX_SYSROOT}") +set(DEFAULT_MACOS_SDK_VERSION "${CMAKE_MATCH_1}") + +# The text-based .dylib stubs describing the Accelerate framework are provided +# by the MacOS SDK, which has to match the MacOS system. Otherwise, there might +# be newer symbols in the text-based .dylib stubs that are not provided by the +# Accelerate binary, leading to linking errors. +if (NOT DEFINED VALID_MACOS_SDK_VERSIONS) + # MacOS system supports the latest iteration of the new Accelerate + # BLAS/LAPACK. Use the default SDK, if it's recent enough. + if (DEFAULT_MACOS_SDK_VERSION VERSION_LESS MINIMUM_MACOS_SDK_VERSION) + message(STATUS "The MacOS SDK is: ${CMAKE_OSX_SYSROOT}") + message(STATUS "The minimum compatible MacOS SDK version is: ${MINIMUM_MACOS_SDK_VERSION}") + message(FATAL_ERROR "Please install a more recent XCode for a compatible MacOS SDK.") + endif () +elseif (NOT DEFAULT_MACOS_SDK_VERSION IN_LIST VALID_MACOS_SDK_VERSIONS) + # MacOS system supports one of the past iterations of the new Accelerate + # BLAS/LAPACK. If the latest possible XCode is installed is installed on + # this older system, there might be a mismatch between the SDK and the + # system binary. Find a matching SDK from the Command Line Tools instead. + foreach (_MACOS_SDK_VERSION IN LISTS VALID_MACOS_SDK_VERSIONS) + find_path(VALID_MACOS_SDK NAMES "MacOSX${_MACOS_SDK_VERSION}.sdk" HINTS "/Library/Developer/CommandLineTools/SDKs" NO_CACHE) + + if (VALID_MACOS_SDK) + set(VALID_MACOS_SDK "${VALID_MACOS_SDK}/MacOSX${_MACOS_SDK_VERSION}.sdk") + break () + endif () + endforeach () + + if (VALID_MACOS_SDK) + set(CMAKE_OSX_SYSROOT "${VALID_MACOS_SDK}" CACHE PATH "" FORCE) + else () + message(STATUS "The MacOS SDK is: ${CMAKE_OSX_SYSROOT}") + message(STATUS "The compatible MacOS SDK versions are: ${VALID_MACOS_SDK_VERSIONS}") + message(FATAL_ERROR "Couldn't find a compatible MacOS SDK. Please install compatible XCode Command Line Tools.") + endif () +endif () + +message(STATUS "The MacOS SDK is: ${CMAKE_OSX_SYSROOT}") + +set(ENV{CMAKE_FRAMEWORK_PATH} "${CMAKE_OSX_SYSROOT}/System/Library/Frameworks") + set(BLA_VENDOR "Apple") find_package(LAPACK MODULE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index de151172d933a9bf8c3313fe4c2ec14a42894dbd..1dfaa72293717c9246e4ab3b867c67665ed89cb8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -72,14 +72,14 @@ set(CBLAS OFF CACHE BOOL "") set(LAPACKE ON CACHE BOOL "") # Add the $NEWLAPACK symbols to the linker flags used in try_compile() -set(CMAKE_EXE_LINKER_FLAGS "-Wl,-alias_list,${CMAKE_CURRENT_BINARY_DIR}/new-lapack.alias") +set(CMAKE_EXE_LINKER_FLAGS "-framework Accelerate -Wl,-alias_list,${CMAKE_CURRENT_BINARY_DIR}/new-lapack.alias") if (BUILD_INDEX64) # Add the $NEWLAPACK$ILP64 symbols to the linker flags used for shared libraries - set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-alias_list,${CMAKE_CURRENT_BINARY_DIR}/new-lapack-ilp64.alias") + set(CMAKE_SHARED_LINKER_FLAGS "-framework Accelerate -Wl,-alias_list,${CMAKE_CURRENT_BINARY_DIR}/new-lapack-ilp64.alias") else () # Add the $NEWLAPACK symbols to the linker flags used for shared libraries - set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-alias_list,${CMAKE_CURRENT_BINARY_DIR}/new-lapack.alias") + set(CMAKE_SHARED_LINKER_FLAGS "-framework Accelerate -Wl,-alias_list,${CMAKE_CURRENT_BINARY_DIR}/new-lapack.alias") endif () FetchContent_Declare(