mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-03 21:00:01 -05:00
macOS: Offer control over host architecture on Apple Silicon hosts
Since commit b6c60f14b6 (macOS: Default to arm64 architecture on Apple
Silicon hosts, 2020-09-28, v3.19.0-rc1~63^2) we use `sysctl` to detect
that we are running on Apple Silicon in a way that pierces Rosetta.
This always sets `CMAKE_HOST_SYSTEM_PROCESSOR` to be `arm64` on such
hosts. However, macOS offers strong support for running processes under
an emulated `x86_64` architecture.
Teach CMake to select either `arm64` or `x86_64` as the host
architecture on Apple Silicon based on the architecture of its own
process. When CMake is built as a universal binary, macOS will select
whichever slice (architecture) is appropriate under the user's shell,
and `CMAKE_HOST_SYSTEM_PROCESSOR` will match.
Also offer a `CMAKE_APPLE_SILICON_PROCESSOR` variable and environment
variable to provide users with explicit control over the host
architecture selection regardless of CMake's own architecture.
Finally, if `CMAKE_OSX_ARCHITECTURES` is not set, pass explicit flags to
the toolchain to use selected host architecture instead of letting the
toolchain pick.
Fixes: #21554
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
CMAKE_APPLE_SILICON_PROCESSOR
|
||||
-----------------------------
|
||||
|
||||
.. versionadded:: 3.19.2
|
||||
|
||||
On Apple Silicon hosts running macOS, set this variable to tell
|
||||
CMake what architecture to use for :variable:`CMAKE_HOST_SYSTEM_PROCESSOR`.
|
||||
The value must be either ``arm64`` or ``x86_64``.
|
||||
|
||||
The value of this variable should never be modified by project code.
|
||||
It is meant to be set by a toolchain file specified by the
|
||||
:variable:`CMAKE_TOOLCHAIN_FILE` variable, or as a cache entry
|
||||
provided by the user, e.g. via ``-DCMAKE_APPLE_SILICON_PROCESSOR=...``.
|
||||
|
||||
See also the :envvar:`CMAKE_APPLE_SILICON_PROCESSOR` environment variable.
|
||||
@@ -3,13 +3,40 @@ CMAKE_HOST_SYSTEM_PROCESSOR
|
||||
|
||||
The name of the CPU CMake is running on.
|
||||
|
||||
On Windows, this variable is set to the value of the environment variable
|
||||
``PROCESSOR_ARCHITECTURE``. On systems that support ``uname``, this variable is
|
||||
set to the output of:
|
||||
Windows Platforms
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
- ``uname -m`` on GNU, Linux, Cygwin, Darwin, Android, or
|
||||
On Windows, this variable is set to the value of the environment variable
|
||||
``PROCESSOR_ARCHITECTURE``.
|
||||
|
||||
Unix Platforms
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
On systems that support ``uname``, this variable is set to the output of:
|
||||
|
||||
- ``uname -m`` on GNU, Linux, Cygwin, Android, or
|
||||
- ``arch`` on OpenBSD, or
|
||||
- on other systems,
|
||||
|
||||
* ``uname -p`` if its exit code is nonzero, or
|
||||
* ``uname -m`` otherwise.
|
||||
|
||||
macOS Platforms
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The value of ``uname -m`` is used by default.
|
||||
|
||||
On Apple Silicon hosts, the architecture printed by ``uname -m`` may vary
|
||||
based on CMake's own architecture and that of the invoking process tree.
|
||||
|
||||
.. versionadded:: 3.19.2
|
||||
|
||||
On Apple Silicon hosts:
|
||||
|
||||
* The :variable:`CMAKE_APPLE_SILICON_PROCESSOR` variable or
|
||||
the :envvar:`CMAKE_APPLE_SILICON_PROCESSOR` environment variable
|
||||
may be set to specify the host architecture explicitly.
|
||||
|
||||
* If :variable:`CMAKE_OSX_ARCHITECTURES` is not set, CMake adds explicit
|
||||
flags to tell the compiler to build for the host architecture so the
|
||||
toolchain does not have to guess based on the process tree's architecture.
|
||||
|
||||
Reference in New Issue
Block a user