Merge topic 'xcode-macos-deployment-target' into release-4.1

de53a46a91 Help: Add 4.1 release note for restored Xcode default deployment target
85ba6f5d1b Merge branch 'backport-4.0-xcode-macos-deployment-target'
884260ced6 Help: Add 4.0 release note for restored Xcode default deployment target
1a37c83c7e Xcode: Restore default CMAKE_OSX_DEPLOYMENT_TARGET to run on host
e927408047 Apple: Initialize deployment target after SDK

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !11361
This commit is contained in:
Brad King 2025-10-27 09:11:37 -04:00
commit 4e2aeae7ba
4 changed files with 92 additions and 24 deletions

View File

@ -301,3 +301,10 @@ Changes made since CMake 4.0.0 include the following.
* These versions made no changes to documented features or interfaces.
Some implementation updates were made to support ecosystem changes
and/or fix regressions.
.. 4.0.5
* When building for macOS with the :generator:`Xcode` generator,
:variable:`CMAKE_OSX_DEPLOYMENT_TARGET` once again defaults to the
host's macOS version if it is older than the macOS SDK version,
as it did in CMake versions prior to 4.0.

View File

@ -243,3 +243,10 @@ Changes made since CMake 4.1.0 include the following.
each call site. Previously, it used the value as of the end of the
directory's ``CMakeLists.txt``, as all other generator expression
evaluations do.
.. 4.1.3
* When building for macOS with the :generator:`Xcode` generator,
:variable:`CMAKE_OSX_DEPLOYMENT_TARGET` once again defaults to the
host's macOS version if it is older than the macOS SDK version,
as it did in CMake versions prior to 4.0.

View File

@ -1,15 +1,39 @@
CMAKE_OSX_DEPLOYMENT_TARGET
---------------------------
Specify the minimum version of the target platform (e.g. macOS or iOS)
on which the target binaries are to be deployed. CMake uses this
variable value for the ``-mmacosx-version-min`` flag or their respective
target platform equivalents. For older Xcode versions that shipped
multiple macOS SDKs this variable also helps to choose the SDK in case
:variable:`CMAKE_OSX_SYSROOT` is unset.
Specify the minimum version of the target platform, e.g., macOS or iOS,
on which the target binaries are to be deployed.
If not set explicitly the value is initialized by the
``MACOSX_DEPLOYMENT_TARGET`` environment variable, if set,
and otherwise computed based on the host platform.
For builds targeting macOS (:variable:`CMAKE_SYSTEM_NAME` is ``Darwin``), if
``CMAKE_OSX_DEPLOYMENT_TARGET`` is not explicitly set, a default is set:
* If the ``MACOSX_DEPLOYMENT_TARGET`` environment variable is non-empty,
its value is the default.
* Otherwise, if using the :generator:`Xcode` generator, and the host's
macOS version is older than the macOS SDK (:variable:`CMAKE_OSX_SYSROOT`,
if set, or Xcode's default SDK), the host's macOS version is the default.
.. versionchanged:: 4.0
Previously this was done for all generators, not just Xcode.
* Otherwise, the default is empty.
The effects of ``CMAKE_OSX_DEPLOYMENT_TARGET`` depend on the generator:
:generator:`Xcode`
If ``CMAKE_OSX_DEPLOYMENT_TARGET`` is set to a non-empty value, it is added
to the generated Xcode project as the ``MACOSX_DEPLOYMENT_TARGET`` setting.
Otherwise, no such setting is added, so Xcode's default deployed target is
used, typically based on the SDK version.
Other Generators
If ``CMAKE_OSX_DEPLOYMENT_TARGET`` is set to a non-empty value, it is passed
to the compiler via the ``-mmacosx-version-min`` flag or equivalent.
Otherwise, no such flag is added, so the compiler's default deployment
target is used.
.. include:: include/CMAKE_OSX_VARIABLE.rst

View File

@ -15,12 +15,6 @@ else()
set(OSX_DEVELOPER_ROOT "")
endif()
if(NOT CMAKE_CROSSCOMPILING)
execute_process(COMMAND sw_vers -productVersion
OUTPUT_VARIABLE _CMAKE_HOST_OSX_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
# Save CMAKE_OSX_ARCHITECTURES from the environment.
set(CMAKE_OSX_ARCHITECTURES "$ENV{CMAKE_OSX_ARCHITECTURES}" CACHE STRING
"Build architectures for OSX")
@ -49,15 +43,6 @@ endif()
# Platform/Apple-${CMAKE_CXX_COMPILER_ID}-<LANG>
set(CMAKE_EFFECTIVE_SYSTEM_NAME "Apple")
#----------------------------------------------------------------------------
# CMAKE_OSX_DEPLOYMENT_TARGET
# Set cache variable - end user may change this during ccmake or cmake-gui configure.
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(CMAKE_OSX_DEPLOYMENT_TARGET "$ENV{MACOSX_DEPLOYMENT_TARGET}" CACHE STRING
"Minimum OS X version to target for deployment (at runtime); newer APIs weak linked. Set to empty string for default value.")
endif()
#----------------------------------------------------------------------------
# CMAKE_OSX_SYSROOT
@ -296,3 +281,48 @@ if(NOT CMAKE_OSX_SYSROOT)
/usr/local/lib
)
endif()
#----------------------------------------------------------------------------
# CMAKE_OSX_DEPLOYMENT_TARGET
if(NOT CMAKE_CROSSCOMPILING)
execute_process(COMMAND sw_vers -productVersion
OUTPUT_VARIABLE _CMAKE_HOST_OSX_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
set(_CMAKE_OSX_DEPLOYMENT_TARGET_DEFAULT "$ENV{MACOSX_DEPLOYMENT_TARGET}")
# Xcode chooses a default macOS deployment target based on the macOS SDK
# version, which may be too new for binaries to run on the host.
if(NOT _CMAKE_OSX_DEPLOYMENT_TARGET_DEFAULT
AND CMAKE_GENERATOR STREQUAL "Xcode" AND NOT CMAKE_CROSSCOMPILING
AND _CMAKE_HOST_OSX_VERSION MATCHES "^([0-9]+\\.[0-9]+)")
set(_macos_version "${CMAKE_MATCH_1}")
if(CMAKE_OSX_SYSROOT)
set(_sdk_macosx --sdk ${CMAKE_OSX_SYSROOT})
else()
set(_sdk_macosx)
endif()
execute_process(
COMMAND xcrun ${_sdk_macosx} --show-sdk-version
OUTPUT_VARIABLE _sdk_version OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE _sdk_version_error
RESULT_VARIABLE _sdk_version_result
)
if(_sdk_version_result EQUAL 0 AND _sdk_version
AND "${_macos_version}" VERSION_LESS "${_sdk_version}")
set(_CMAKE_OSX_DEPLOYMENT_TARGET_DEFAULT "${_macos_version}")
endif()
unset(_sdk_macosx)
unset(_sdk_version_result)
unset(_sdk_version_error)
unset(_sdk_version)
unset(_macos_version)
endif()
set(CMAKE_OSX_DEPLOYMENT_TARGET "${_CMAKE_OSX_DEPLOYMENT_TARGET_DEFAULT}" CACHE STRING
"Minimum OS X version to target for deployment (at runtime); newer APIs weak linked. Set to empty string for default value.")
unset(_CMAKE_OSX_DEPLOYMENT_TARGET_DEFAULT)
endif()