CMake prioritizes deployment target and current macOS versions when choosing SDK
When determining which SDK to use in Darwin-initialize.cmake
, CMake uses the logic:
# pick an SDK that works
set(_CMAKE_OSX_SYSROOT_DEFAULT)
foreach(ver ${CMAKE_OSX_DEPLOYMENT_TARGET}
${_CURRENT_OSX_VERSION}
${_CMAKE_OSX_LATEST_SDK_VERSION})
set(_CMAKE_OSX_DEPLOYMENT_TARGET ${ver})
set(_CMAKE_OSX_SDKS_VER ${_CMAKE_OSX_DEPLOYMENT_TARGET}${_CMAKE_OSX_SDKS_VER_SUFFIX_${_CMAKE_OSX_DEPLOYMENT_TARGET}})
set(_CMAKE_OSX_SYSROOT_CHECK "${_CMAKE_OSX_SDKS_DIR}/MacOSX${_CMAKE_OSX_SDKS_VER}.sdk")
if(IS_DIRECTORY "${_CMAKE_OSX_SYSROOT_CHECK}")
set(_CMAKE_OSX_SYSROOT_DEFAULT "${_CMAKE_OSX_SYSROOT_CHECK}")
break()
endif()
endforeach()
If there are multiple SDKs installed, for example in the case of an upgraded command line tools:
❯ ls -l /Library/Developer/CommandLineTools/SDKs
total 0
lrwxr-xr-x 1 root wheel 15 Nov 7 2019 MacOSX.sdk -> MacOSX10.15.sdk
drwxr-xr-x 7 root wheel 224 Nov 7 2019 MacOSX10.14.sdk
drwxr-xr-x 8 root wheel 256 Nov 7 2019 MacOSX10.15.sdk
This will pick the 10.14 SDK if either the deployment target is set to 10.14, or the user is building on macOS 10.14.
This is counter to what Apple recommends, which is to always build with the latest SDK. The OS version you're building on is irrelevant, and the deployment target sets the lower bound for supported OS versions.
Shifting the list should solve this:
diff --git i/Modules/Platform/Darwin-Initialize.cmake w/Modules/Platform/Darwin-Initialize.cmake
index aa0e554523..75532d352f 100644
--- i/Modules/Platform/Darwin-Initialize.cmake
+++ w/Modules/Platform/Darwin-Initialize.cmake
@@ -88,9 +88,9 @@ elseif("${CMAKE_GENERATOR}" MATCHES Xcode
# pick an SDK that works
set(_CMAKE_OSX_SYSROOT_DEFAULT)
- foreach(_ver ${CMAKE_OSX_DEPLOYMENT_TARGET}
- ${_CURRENT_OSX_VERSION}
- ${_CMAKE_OSX_LATEST_SDK_VERSION})
+ foreach(_ver ${_CMAKE_OSX_LATEST_SDK_VERSION}
+ ${CMAKE_OSX_DEPLOYMENT_TARGET}
+ ${_CURRENT_OSX_VERSION})
set(_CMAKE_OSX_DEPLOYMENT_TARGET ${_ver})
set(_CMAKE_OSX_SDKS_VER ${_CMAKE_OSX_DEPLOYMENT_TARGET}${_CMAKE_OSX_SDKS_VER_SUFFIX_${_CMAKE_OSX_DEPLOYMENT_TARGET}})
set(_CMAKE_OSX_SYSROOT_CHECK "${_CMAKE_OSX_SDKS_DIR}/MacOSX${_CMAKE_OSX_SDKS_VER}.sdk")
Edited by Tor Arne Vestbø