|
|
|
.. cmake-manual-description: CMake Toolchains Reference
|
|
|
|
|
|
|
|
cmake-toolchains(7)
|
|
|
|
*******************
|
|
|
|
|
|
|
|
.. only:: html
|
|
|
|
|
|
|
|
.. contents::
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
============
|
|
|
|
|
|
|
|
CMake uses a toolchain of utilities to compile, link libraries and create
|
|
|
|
archives, and other tasks to drive the build. The toolchain utilities available
|
|
|
|
are determined by the languages enabled. In normal builds, CMake automatically
|
|
|
|
determines the toolchain for host builds based on system introspection and
|
|
|
|
defaults. In cross-compiling scenarios, a toolchain file may be specified
|
|
|
|
with information about compiler and utility paths.
|
|
|
|
|
|
|
|
Languages
|
|
|
|
=========
|
|
|
|
|
|
|
|
Languages are enabled by the :command:`project` command. Language-specific
|
|
|
|
built-in variables, such as
|
|
|
|
:variable:`CMAKE_CXX_COMPILER <CMAKE_<LANG>_COMPILER>`,
|
|
|
|
:variable:`CMAKE_CXX_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>` etc are set by
|
|
|
|
invoking the :command:`project` command. If no project command
|
|
|
|
is in the top-level CMakeLists file, one will be implicitly generated. By default
|
|
|
|
the enabled languages are ``C`` and ``CXX``:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
project(C_Only C)
|
|
|
|
|
|
|
|
A special value of ``NONE`` can also be used with the :command:`project` command
|
|
|
|
to enable no languages:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
project(MyProject NONE)
|
|
|
|
|
|
|
|
The :command:`enable_language` command can be used to enable languages after the
|
|
|
|
:command:`project` command:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
enable_language(CXX)
|
|
|
|
|
|
|
|
When a language is enabled, CMake finds a compiler for that language, and
|
|
|
|
determines some information, such as the vendor and version of the compiler,
|
|
|
|
the target architecture and bitwidth, the location of corresponding utilities
|
|
|
|
etc.
|
|
|
|
|
|
|
|
The :prop_gbl:`ENABLED_LANGUAGES` global property contains the languages which
|
|
|
|
are currently enabled.
|
|
|
|
|
|
|
|
Variables and Properties
|
|
|
|
========================
|
|
|
|
|
|
|
|
Several variables relate to the language components of a toolchain which are
|
|
|
|
enabled. :variable:`CMAKE_<LANG>_COMPILER` is the full path to the compiler used
|
|
|
|
for ``<LANG>``. :variable:`CMAKE_<LANG>_COMPILER_ID` is the identifier used
|
|
|
|
by CMake for the compiler and :variable:`CMAKE_<LANG>_COMPILER_VERSION` is the
|
|
|
|
version of the compiler.
|
|
|
|
|
|
|
|
The :variable:`CMAKE_<LANG>_FLAGS` variables and the configuration-specific
|
|
|
|
equivalents contain flags that will be added to the compile command when
|
|
|
|
compiling a file of a particular language.
|
|
|
|
|
|
|
|
As the linker is invoked by the compiler driver, CMake needs a way to determine
|
|
|
|
which compiler to use to invoke the linker. This is calculated by the
|
|
|
|
:prop_sf:`LANGUAGE` of source files in the target, and in the case of static
|
|
|
|
libraries, the language of the dependent libraries. The choice CMake makes may
|
|
|
|
be overridden with the :prop_tgt:`LINKER_LANGUAGE` target property.
|
|
|
|
|
|
|
|
Toolchain Features
|
|
|
|
==================
|
|
|
|
|
|
|
|
CMake provides the :command:`try_compile` command and wrapper macros such as
|
|
|
|
:module:`CheckCXXSourceCompiles`, :module:`CheckCXXSymbolExists` and
|
|
|
|
:module:`CheckIncludeFile` to test capability and availability of various
|
|
|
|
toolchain features. These APIs test the toolchain in some way and cache the
|
|
|
|
result so that the test does not have to be performed again the next time
|
|
|
|
CMake runs.
|
|
|
|
|
|
|
|
Some toolchain features have built-in handling in CMake, and do not require
|
|
|
|
compile-tests. For example, :prop_tgt:`POSITION_INDEPENDENT_CODE` allows
|
|
|
|
specifying that a target should be built as position-independent code, if
|
|
|
|
the compiler supports that feature. The :prop_tgt:`<LANG>_VISIBILITY_PRESET`
|
|
|
|
and :prop_tgt:`VISIBILITY_INLINES_HIDDEN` target properties add flags for
|
|
|
|
hidden visibility, if supported by the compiler.
|
|
|
|
|
|
|
|
.. _`Cross Compiling Toolchain`:
|
|
|
|
|
|
|
|
Cross Compiling
|
|
|
|
===============
|
|
|
|
|
|
|
|
If :manual:`cmake(1)` is invoked with the command line parameter
|
|
|
|
``-DCMAKE_TOOLCHAIN_FILE=path/to/file``, the file will be loaded early to set
|
|
|
|
values for the compilers.
|
|
|
|
The :variable:`CMAKE_CROSSCOMPILING` variable is set to true when CMake is
|
|
|
|
cross-compiling.
|
|
|
|
|
|
|
|
Note that using the :variable:`CMAKE_SOURCE_DIR` or :variable:`CMAKE_BINARY_DIR`
|
|
|
|
variables inside a toolchain file is typically undesirable. The toolchain
|
|
|
|
file is used in contexts where these variables have different values when used
|
|
|
|
in different places (e.g. as part of a call to :command:`try_compile`). In most
|
|
|
|
cases, where there is a need to evaluate paths inside a toolchain file, the more
|
|
|
|
appropriate variable to use would be :variable:`CMAKE_CURRENT_LIST_DIR`, since
|
|
|
|
it always has an unambiguous, predictable value.
|
|
|
|
|
|
|
|
Cross Compiling for Linux
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
A typical cross-compiling toolchain for Linux has content such
|
|
|
|
as:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME Linux)
|
|
|
|
set(CMAKE_SYSTEM_PROCESSOR arm)
|
|
|
|
|
|
|
|
set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
|
|
|
|
set(CMAKE_STAGING_PREFIX /home/devel/stage)
|
|
|
|
|
|
|
|
set(tools /home/devel/gcc-4.7-linaro-rpi-gnueabihf)
|
|
|
|
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
|
|
|
|
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)
|
|
|
|
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
|
|
|
|
|
|
The :variable:`CMAKE_SYSTEM_NAME` is the CMake-identifier of the target platform
|
|
|
|
to build for.
|
|
|
|
|
|
|
|
The :variable:`CMAKE_SYSTEM_PROCESSOR` is the CMake-identifier of the target architecture
|
|
|
|
to build for.
|
|
|
|
|
|
|
|
The :variable:`CMAKE_SYSROOT` is optional, and may be specified if a sysroot
|
|
|
|
is available.
|
|
|
|
|
|
|
|
The :variable:`CMAKE_STAGING_PREFIX` is also optional. It may be used to specify
|
|
|
|
a path on the host to install to. The :variable:`CMAKE_INSTALL_PREFIX` is always
|
|
|
|
the runtime installation location, even when cross-compiling.
|
|
|
|
|
|
|
|
The :variable:`CMAKE_<LANG>_COMPILER` variables may be set to full paths, or to
|
|
|
|
names of compilers to search for in standard locations. For toolchains that
|
|
|
|
do not support linking binaries without custom flags or scripts one may set
|
|
|
|
the :variable:`CMAKE_TRY_COMPILE_TARGET_TYPE` variable to ``STATIC_LIBRARY``
|
|
|
|
to tell CMake not to try to link executables during its checks.
|
|
|
|
|
|
|
|
CMake ``find_*`` commands will look in the sysroot, and the :variable:`CMAKE_FIND_ROOT_PATH`
|
|
|
|
entries by default in all cases, as well as looking in the host system root prefix.
|
|
|
|
Although this can be controlled on a case-by-case basis, when cross-compiling, it
|
|
|
|
can be useful to exclude looking in either the host or the target for particular
|
|
|
|
artifacts. Generally, includes, libraries and packages should be found in the
|
|
|
|
target system prefixes, whereas executables which must be run as part of the build
|
|
|
|
should be found only on the host and not on the target. This is the purpose of
|
|
|
|
the ``CMAKE_FIND_ROOT_PATH_MODE_*`` variables.
|
|
|
|
|
|
|
|
.. _`Cray Cross-Compile`:
|
|
|
|
|
|
|
|
Cross Compiling for the Cray Linux Environment
|
|
|
|
----------------------------------------------
|
|
|
|
|
|
|
|
Cross compiling for compute nodes in the Cray Linux Environment can be done
|
|
|
|
without needing a separate toolchain file. Specifying
|
|
|
|
``-DCMAKE_SYSTEM_NAME=CrayLinuxEnvironment`` on the CMake command line will
|
|
|
|
ensure that the appropriate build settings and search paths are configured.
|
|
|
|
The platform will pull its configuration from the current environment
|
|
|
|
variables and will configure a project to use the compiler wrappers from the
|
|
|
|
Cray Programming Environment's ``PrgEnv-*`` modules if present and loaded.
|
|
|
|
|
|
|
|
The default configuration of the Cray Programming Environment is to only
|
|
|
|
support static libraries. This can be overridden and shared libraries
|
|
|
|
enabled by setting the ``CRAYPE_LINK_TYPE`` environment variable to
|
|
|
|
``dynamic``.
|
|
|
|
|
|
|
|
Running CMake without specifying :variable:`CMAKE_SYSTEM_NAME` will
|
|
|
|
run the configure step in host mode assuming a standard Linux environment.
|
|
|
|
If not overridden, the ``PrgEnv-*`` compiler wrappers will end up getting used,
|
|
|
|
which if targeting the either the login node or compute node, is likely not the
|
|
|
|
desired behavior. The exception to this would be if you are building directly
|
|
|
|
on a NID instead of cross-compiling from a login node. If trying to build
|
|
|
|
software for a login node, you will need to either first unload the
|
|
|
|
currently loaded ``PrgEnv-*`` module or explicitly tell CMake to use the
|
|
|
|
system compilers in ``/usr/bin`` instead of the Cray wrappers. If instead
|
|
|
|
targeting a compute node is desired, just specify the
|
|
|
|
:variable:`CMAKE_SYSTEM_NAME` as mentioned above.
|
|
|
|
|
|
|
|
Cross Compiling using Clang
|
|
|
|
---------------------------
|
|
|
|
|
|
|
|
Some compilers such as Clang are inherently cross compilers.
|
|
|
|
The :variable:`CMAKE_<LANG>_COMPILER_TARGET` can be set to pass a
|
|
|
|
value to those supported compilers when compiling:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME Linux)
|
|
|
|
set(CMAKE_SYSTEM_PROCESSOR arm)
|
|
|
|
|
|
|
|
set(triple arm-linux-gnueabihf)
|
|
|
|
|
|
|
|
set(CMAKE_C_COMPILER clang)
|
|
|
|
set(CMAKE_C_COMPILER_TARGET ${triple})
|
|
|
|
set(CMAKE_CXX_COMPILER clang++)
|
|
|
|
set(CMAKE_CXX_COMPILER_TARGET ${triple})
|
|
|
|
|
|
|
|
Similarly, some compilers do not ship their own supplementary utilities
|
|
|
|
such as linkers, but provide a way to specify the location of the external
|
|
|
|
toolchain which will be used by the compiler driver. The
|
|
|
|
:variable:`CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN` variable can be set in a
|
|
|
|
toolchain file to pass the path to the compiler driver.
|
|
|
|
|
|
|
|
Cross Compiling for QNX
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
As the Clang compiler the QNX QCC compile is inherently a cross compiler.
|
|
|
|
And the :variable:`CMAKE_<LANG>_COMPILER_TARGET` can be set to pass a
|
|
|
|
value to those supported compilers when compiling:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME QNX)
|
|
|
|
|
|
|
|
set(arch gcc_ntoarmv7le)
|
|
|
|
|
|
|
|
set(CMAKE_C_COMPILER qcc)
|
|
|
|
set(CMAKE_C_COMPILER_TARGET ${arch})
|
|
|
|
set(CMAKE_CXX_COMPILER QCC)
|
|
|
|
set(CMAKE_CXX_COMPILER_TARGET ${arch})
|
|
|
|
|
|
|
|
Cross Compiling for Windows CE
|
|
|
|
------------------------------
|
|
|
|
|
|
|
|
Cross compiling for Windows CE requires the corresponding SDK being
|
|
|
|
installed on your system. These SDKs are usually installed under
|
|
|
|
``C:/Program Files (x86)/Windows CE Tools/SDKs``.
|
|
|
|
|
|
|
|
A toolchain file to configure a Visual Studio generator for
|
|
|
|
Windows CE may look like this:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME WindowsCE)
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_VERSION 8.0)
|
|
|
|
set(CMAKE_SYSTEM_PROCESSOR arm)
|
|
|
|
|
|
|
|
set(CMAKE_GENERATOR_TOOLSET CE800) # Can be omitted for 8.0
|
|
|
|
set(CMAKE_GENERATOR_PLATFORM SDK_AM335X_SK_WEC2013_V310)
|
|
|
|
|
|
|
|
The :variable:`CMAKE_GENERATOR_PLATFORM` tells the generator which SDK to use.
|
|
|
|
Further :variable:`CMAKE_SYSTEM_VERSION` tells the generator what version of
|
|
|
|
Windows CE to use. Currently version 8.0 (Windows Embedded Compact 2013) is
|
|
|
|
supported out of the box. Other versions may require one to set
|
|
|
|
:variable:`CMAKE_GENERATOR_TOOLSET` to the correct value.
|
|
|
|
|
|
|
|
Cross Compiling for Windows 10 Universal Applications
|
|
|
|
-----------------------------------------------------
|
|
|
|
|
|
|
|
A toolchain file to configure a Visual Studio generator for a
|
|
|
|
Windows 10 Universal Application may look like this:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME WindowsStore)
|
|
|
|
set(CMAKE_SYSTEM_VERSION 10.0)
|
|
|
|
|
|
|
|
A Windows 10 Universal Application targets both Windows Store and
|
|
|
|
Windows Phone. Specify the :variable:`CMAKE_SYSTEM_VERSION` variable
|
|
|
|
to be ``10.0`` to build with the latest available Windows 10 SDK.
|
|
|
|
Specify a more specific version (e.g. ``10.0.10240.0`` for RTM)
|
|
|
|
to build with the corresponding SDK.
|
|
|
|
|
|
|
|
Cross Compiling for Windows Phone
|
|
|
|
---------------------------------
|
|
|
|
|
|
|
|
A toolchain file to configure a Visual Studio generator for
|
|
|
|
Windows Phone may look like this:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME WindowsPhone)
|
|
|
|
set(CMAKE_SYSTEM_VERSION 8.1)
|
|
|
|
|
|
|
|
Cross Compiling for Windows Store
|
|
|
|
---------------------------------
|
|
|
|
|
|
|
|
A toolchain file to configure a Visual Studio generator for
|
|
|
|
Windows Store may look like this:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME WindowsStore)
|
|
|
|
set(CMAKE_SYSTEM_VERSION 8.1)
|
|
|
|
|
|
|
|
.. _`Cross Compiling for Android`:
|
|
|
|
|
|
|
|
Cross Compiling for Android
|
|
|
|
---------------------------
|
|
|
|
|
|
|
|
A toolchain file may configure cross-compiling for Android by setting the
|
|
|
|
:variable:`CMAKE_SYSTEM_NAME` variable to ``Android``. Further configuration
|
|
|
|
is specific to the Android development environment to be used.
|
|
|
|
|
|
|
|
For :ref:`Visual Studio Generators`, CMake expects :ref:`NVIDIA Nsight Tegra
|
|
|
|
Visual Studio Edition <Cross Compiling for Android with NVIDIA Nsight Tegra
|
|
|
|
Visual Studio Edition>` to be installed. See that section for further
|
|
|
|
configuration details.
|
|
|
|
|
|
|
|
For :ref:`Makefile Generators` and the :generator:`Ninja` generator,
|
|
|
|
CMake expects one of these environments:
|
|
|
|
|
|
|
|
* :ref:`NDK <Cross Compiling for Android with the NDK>`
|
|
|
|
* :ref:`Standalone Toolchain <Cross Compiling for Android with a Standalone Toolchain>`
|
|
|
|
|
|
|
|
CMake uses the following steps to select one of the environments:
|
|
|
|
|
|
|
|
* If the :variable:`CMAKE_ANDROID_NDK` variable is set, the NDK at the
|
|
|
|
specified location will be used.
|
|
|
|
|
|
|
|
* Else, if the :variable:`CMAKE_ANDROID_STANDALONE_TOOLCHAIN` variable
|
|
|
|
is set, the Standalone Toolchain at the specified location will be used.
|
|
|
|
|
|
|
|
* Else, if the :variable:`CMAKE_SYSROOT` variable is set to a directory
|
|
|
|
of the form ``<ndk>/platforms/android-<api>/arch-<arch>``, the ``<ndk>``
|
|
|
|
part will be used as the value of :variable:`CMAKE_ANDROID_NDK` and the
|
|
|
|
NDK will be used.
|
|
|
|
|
|
|
|
* Else, if the :variable:`CMAKE_SYSROOT` variable is set to a directory of the
|
|
|
|
form ``<standalone-toolchain>/sysroot``, the ``<standalone-toolchain>`` part
|
|
|
|
will be used as the value of :variable:`CMAKE_ANDROID_STANDALONE_TOOLCHAIN`
|
|
|
|
and the Standalone Toolchain will be used.
|
|
|
|
|
|
|
|
* Else, if a cmake variable ``ANDROID_NDK`` is set it will be used
|
|
|
|
as the value of :variable:`CMAKE_ANDROID_NDK`, and the NDK will be used.
|
|
|
|
|
|
|
|
* Else, if a cmake variable ``ANDROID_STANDALONE_TOOLCHAIN`` is set, it will be
|
|
|
|
used as the value of :variable:`CMAKE_ANDROID_STANDALONE_TOOLCHAIN`, and the
|
|
|
|
Standalone Toolchain will be used.
|
|
|
|
|
|
|
|
* Else, if an environment variable ``ANDROID_NDK_ROOT`` or
|
|
|
|
``ANDROID_NDK`` is set, it will be used as the value of
|
|
|
|
:variable:`CMAKE_ANDROID_NDK`, and the NDK will be used.
|
|
|
|
|
|
|
|
* Else, if an environment variable ``ANDROID_STANDALONE_TOOLCHAIN`` is
|
|
|
|
set then it will be used as the value of
|
|
|
|
:variable:`CMAKE_ANDROID_STANDALONE_TOOLCHAIN`, and the Standalone
|
|
|
|
Toolchain will be used.
|
|
|
|
|
|
|
|
* Else, an error diagnostic will be issued that neither the NDK or
|
|
|
|
Standalone Toolchain can be found.
|
|
|
|
|
|
|
|
.. _`Cross Compiling for Android with the NDK`:
|
|
|
|
|
|
|
|
Cross Compiling for Android with the NDK
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
A toolchain file may configure :ref:`Makefile Generators` or the
|
|
|
|
:generator:`Ninja` generator to target Android for cross-compiling.
|
|
|
|
|
|
|
|
Configure use of an Android NDK with the following variables:
|
|
|
|
|
|
|
|
:variable:`CMAKE_SYSTEM_NAME`
|
|
|
|
Set to ``Android``. Must be specified to enable cross compiling
|
|
|
|
for Android.
|
|
|
|
|
|
|
|
:variable:`CMAKE_SYSTEM_VERSION`
|
|
|
|
Set to the Android API level. If not specified, the value is
|
|
|
|
determined as follows:
|
|
|
|
|
|
|
|
* If the :variable:`CMAKE_ANDROID_API` variable is set, its value
|
|
|
|
is used as the API level.
|
|
|
|
* If the :variable:`CMAKE_SYSROOT` variable is set, the API level is
|
|
|
|
detected from the NDK directory structure containing the sysroot.
|
|
|
|
* Otherwise, the latest API level available in the NDK is used.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_ARCH_ABI`
|
|
|
|
Set to the Android ABI (architecture). If not specified, this
|
|
|
|
variable will default to ``armeabi``.
|
|
|
|
The :variable:`CMAKE_ANDROID_ARCH` variable will be computed
|
|
|
|
from ``CMAKE_ANDROID_ARCH_ABI`` automatically.
|
|
|
|
Also see the :variable:`CMAKE_ANDROID_ARM_MODE` and
|
|
|
|
:variable:`CMAKE_ANDROID_ARM_NEON` variables.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_NDK`
|
|
|
|
Set to the absolute path to the Android NDK root directory.
|
|
|
|
A ``${CMAKE_ANDROID_NDK}/platforms`` directory must exist.
|
|
|
|
If not specified, a default for this variable will be chosen
|
|
|
|
as specified :ref:`above <Cross Compiling for Android>`.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_NDK_DEPRECATED_HEADERS`
|
|
|
|
Set to a true value to use the deprecated per-api-level headers
|
|
|
|
instead of the unified headers. If not specified, the default will
|
|
|
|
be false unless using a NDK that does not provide unified headers.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION`
|
|
|
|
On NDK r19 or above, this variable must be unset or set to ``clang``.
|
|
|
|
On NDK r18 or below, set this to the version of the NDK toolchain to
|
|
|
|
be selected as the compiler. If not specified, the default will be
|
|
|
|
the latest available GCC toolchain.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_STL_TYPE`
|
|
|
|
Set to specify which C++ standard library to use. If not specified,
|
|
|
|
a default will be selected as described in the variable documentation.
|
|
|
|
|
|
|
|
The following variables will be computed and provided automatically:
|
|
|
|
|
|
|
|
:variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX`
|
|
|
|
The absolute path prefix to the binutils in the NDK toolchain.
|
|
|
|
|
|
|
|
:variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX`
|
|
|
|
The host platform suffix of the binutils in the NDK toolchain.
|
|
|
|
|
|
|
|
|
|
|
|
For example, a toolchain file might contain:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME Android)
|
|
|
|
set(CMAKE_SYSTEM_VERSION 21) # API level
|
|
|
|
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
|
|
|
|
set(CMAKE_ANDROID_NDK /path/to/android-ndk)
|
|
|
|
set(CMAKE_ANDROID_STL_TYPE gnustl_static)
|
|
|
|
|
|
|
|
Alternatively one may specify the values without a toolchain file:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ cmake ../src \
|
|
|
|
-DCMAKE_SYSTEM_NAME=Android \
|
|
|
|
-DCMAKE_SYSTEM_VERSION=21 \
|
|
|
|
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
|
|
|
|
-DCMAKE_ANDROID_NDK=/path/to/android-ndk \
|
|
|
|
-DCMAKE_ANDROID_STL_TYPE=gnustl_static
|
|
|
|
|
|
|
|
.. _`Cross Compiling for Android with a Standalone Toolchain`:
|
|
|
|
|
|
|
|
Cross Compiling for Android with a Standalone Toolchain
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
A toolchain file may configure :ref:`Makefile Generators` or the
|
|
|
|
:generator:`Ninja` generator to target Android for cross-compiling
|
|
|
|
using a standalone toolchain.
|
|
|
|
|
|
|
|
Configure use of an Android standalone toolchain with the following variables:
|
|
|
|
|
|
|
|
:variable:`CMAKE_SYSTEM_NAME`
|
|
|
|
Set to ``Android``. Must be specified to enable cross compiling
|
|
|
|
for Android.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_STANDALONE_TOOLCHAIN`
|
|
|
|
Set to the absolute path to the standalone toolchain root directory.
|
|
|
|
A ``${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/sysroot`` directory
|
|
|
|
must exist.
|
|
|
|
If not specified, a default for this variable will be chosen
|
|
|
|
as specified :ref:`above <Cross Compiling for Android>`.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_ARM_MODE`
|
|
|
|
When the standalone toolchain targets ARM, optionally set this to ``ON``
|
|
|
|
to target 32-bit ARM instead of 16-bit Thumb.
|
|
|
|
See variable documentation for details.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_ARM_NEON`
|
|
|
|
When the standalone toolchain targets ARM v7, optionally set thisto ``ON``
|
|
|
|
to target ARM NEON devices. See variable documentation for details.
|
|
|
|
|
|
|
|
The following variables will be computed and provided automatically:
|
|
|
|
|
|
|
|
:variable:`CMAKE_SYSTEM_VERSION`
|
|
|
|
The Android API level detected from the standalone toolchain.
|
|
|
|
|
|
|
|
:variable:`CMAKE_ANDROID_ARCH_ABI`
|
|
|
|
The Android ABI detected from the standalone toolchain.
|
|
|
|
|
|
|
|
:variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX`
|
|
|
|
The absolute path prefix to the ``binutils`` in the standalone toolchain.
|
|
|
|
|
|
|
|
:variable:`CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX`
|
|
|
|
The host platform suffix of the ``binutils`` in the standalone toolchain.
|
|
|
|
|
|
|
|
For example, a toolchain file might contain:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME Android)
|
|
|
|
set(CMAKE_ANDROID_STANDALONE_TOOLCHAIN /path/to/android-toolchain)
|
|
|
|
|
|
|
|
Alternatively one may specify the values without a toolchain file:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ cmake ../src \
|
|
|
|
-DCMAKE_SYSTEM_NAME=Android \
|
|
|
|
-DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/path/to/android-toolchain
|
|
|
|
|
|
|
|
.. _`Cross Compiling for Android with NVIDIA Nsight Tegra Visual Studio Edition`:
|
|
|
|
|
|
|
|
Cross Compiling for Android with NVIDIA Nsight Tegra Visual Studio Edition
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
A toolchain file to configure one of the :ref:`Visual Studio Generators`
|
|
|
|
to build using NVIDIA Nsight Tegra targeting Android may look like this:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
set(CMAKE_SYSTEM_NAME Android)
|
|
|
|
|
|
|
|
The :variable:`CMAKE_GENERATOR_TOOLSET` may be set to select
|
|
|
|
the Nsight Tegra "Toolchain Version" value.
|
|
|
|
|
|
|
|
See also target properties:
|
|
|
|
|
|
|
|
* :prop_tgt:`ANDROID_ANT_ADDITIONAL_OPTIONS`
|
|
|
|
* :prop_tgt:`ANDROID_API_MIN`
|
|
|
|
* :prop_tgt:`ANDROID_API`
|
|
|
|
* :prop_tgt:`ANDROID_ARCH`
|
|
|
|
* :prop_tgt:`ANDROID_ASSETS_DIRECTORIES`
|
|
|
|
* :prop_tgt:`ANDROID_GUI`
|
|
|
|
* :prop_tgt:`ANDROID_JAR_DEPENDENCIES`
|
|
|
|
* :prop_tgt:`ANDROID_JAR_DIRECTORIES`
|
|
|
|
* :prop_tgt:`ANDROID_JAVA_SOURCE_DIR`
|
|
|
|
* :prop_tgt:`ANDROID_NATIVE_LIB_DEPENDENCIES`
|
|
|
|
* :prop_tgt:`ANDROID_NATIVE_LIB_DIRECTORIES`
|
|
|
|
* :prop_tgt:`ANDROID_PROCESS_MAX`
|
|
|
|
* :prop_tgt:`ANDROID_PROGUARD_CONFIG_PATH`
|
|
|
|
* :prop_tgt:`ANDROID_PROGUARD`
|
|
|
|
* :prop_tgt:`ANDROID_SECURE_PROPS_PATH`
|
|
|
|
* :prop_tgt:`ANDROID_SKIP_ANT_STEP`
|
|
|
|
* :prop_tgt:`ANDROID_STL_TYPE`
|
|
|
|
|
|
|
|
.. _`Cross Compiling for iOS, tvOS, or watchOS`:
|
|
|
|
|
|
|
|
Cross Compiling for iOS, tvOS, or watchOS
|
|
|
|
-----------------------------------------
|
|
|
|
|
|
|
|
For cross-compiling to iOS, tvOS, or watchOS, the :generator:`Xcode`
|
|
|
|
generator is recommended. The :generator:`Unix Makefiles` or
|
|
|
|
:generator:`Ninja` generators can also be used, but they require the
|
|
|
|
project to handle more areas like target CPU selection and code signing.
|
|
|
|
|
|
|
|
Any of the three systems can be targeted by setting the
|
|
|
|
:variable:`CMAKE_SYSTEM_NAME` variable to a value from the table below.
|
|
|
|
By default, the latest Device SDK is chosen. As for all Apple platforms,
|
|
|
|
a different SDK (e.g. a simulator) can be selected by setting the
|
|
|
|
:variable:`CMAKE_OSX_SYSROOT` variable, although this should rarely be
|
|
|
|
necessary (see :ref:`Switching Between Device and Simulator` below).
|
|
|
|
A list of available SDKs can be obtained by running ``xcodebuild -showsdks``.
|
|
|
|
|
|
|
|
======= ================= ==================== ================
|
|
|
|
OS CMAKE_SYSTEM_NAME Device SDK (default) Simulator SDK
|
|
|
|
======= ================= ==================== ================
|
|
|
|
iOS iOS iphoneos iphonesimulator
|
|
|
|
tvOS tvOS appletvos appletvsimulator
|
|
|
|
watchOS watchOS watchos watchsimulator
|
|
|
|
======= ================= ==================== ================
|
|
|
|
|
|
|
|
For example, to create a CMake configuration for iOS, the following
|
|
|
|
command is sufficient:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS
|
|
|
|
|
|
|
|
Variable :variable:`CMAKE_OSX_ARCHITECTURES` can be used to set architectures
|
|
|
|
for both device and simulator. Variable :variable:`CMAKE_OSX_DEPLOYMENT_TARGET`
|
|
|
|
can be used to set an iOS/tvOS/watchOS deployment target.
|
|
|
|
|
|
|
|
Next configuration will install fat 5 architectures iOS library
|
|
|
|
and add the ``-miphoneos-version-min=9.3``/``-mios-simulator-version-min=9.3``
|
|
|
|
flags to the compiler:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ cmake -S. -B_builds -GXcode \
|
|
|
|
-DCMAKE_SYSTEM_NAME=iOS \
|
|
|
|
"-DCMAKE_OSX_ARCHITECTURES=armv7;armv7s;arm64;i386;x86_64" \
|
|
|
|
-DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \
|
|
|
|
-DCMAKE_INSTALL_PREFIX=`pwd`/_install \
|
|
|
|
-DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO \
|
|
|
|
-DCMAKE_IOS_INSTALL_COMBINED=YES
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
# CMakeLists.txt
|
|
|
|
cmake_minimum_required(VERSION 3.14)
|
|
|
|
project(foo)
|
|
|
|
add_library(foo foo.cpp)
|
|
|
|
install(TARGETS foo DESTINATION lib)
|
|
|
|
|
|
|
|
Install:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ cmake --build _builds --config Release --target install
|
|
|
|
|
|
|
|
Check library:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ lipo -info _install/lib/libfoo.a
|
|
|
|
Architectures in the fat file: _install/lib/libfoo.a are: i386 armv7 armv7s x86_64 arm64
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ otool -l _install/lib/libfoo.a | grep -A2 LC_VERSION_MIN_IPHONEOS
|
|
|
|
cmd LC_VERSION_MIN_IPHONEOS
|
|
|
|
cmdsize 16
|
|
|
|
version 9.3
|
|
|
|
|
|
|
|
Code Signing
|
|
|
|
^^^^^^^^^^^^
|
|
|
|
|
|
|
|
Some build artifacts for the embedded Apple platforms require mandatory
|
|
|
|
code signing. If the :generator:`Xcode` generator is being used and
|
|
|
|
code signing is required or desired, the development team ID can be
|
|
|
|
specified via the ``CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM`` CMake variable.
|
|
|
|
This team ID will then be included in the generated Xcode project.
|
|
|
|
By default, CMake avoids the need for code signing during the internal
|
|
|
|
configuration phase (i.e compiler ID and feature detection).
|
|
|
|
|
|
|
|
.. _`Switching Between Device and Simulator`:
|
|
|
|
|
|
|
|
Switching Between Device and Simulator
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
When configuring for any of the embedded platforms, one can target either
|
|
|
|
real devices or the simulator. Both have their own separate SDK, but CMake
|
|
|
|
only supports specifying a single SDK for the configuration phase. This
|
|
|
|
means the developer must select one or the other at configuration time.
|
|
|
|
When using the :generator:`Xcode` generator, this is less of a limitation
|
|
|
|
because Xcode still allows you to build for either a device or a simulator,
|
|
|
|
even though configuration was only performed for one of the two. From
|
|
|
|
within the Xcode IDE, builds are performed for the selected "destination"
|
|
|
|
platform. When building from the command line, the desired sdk can be
|
|
|
|
specified directly by passing a ``-sdk`` option to the underlying build
|
|
|
|
tool (``xcodebuild``). For example:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ cmake --build ... -- -sdk iphonesimulator
|
|
|
|
|
|
|
|
Please note that checks made during configuration were performed against
|
|
|
|
the configure-time SDK and might not hold true for other SDKs. Commands
|
|
|
|
like :command:`find_package`, :command:`find_library`, etc. store and use
|
|
|
|
details only for the configured SDK/platform, so they can be problematic
|
|
|
|
if wanting to switch between device and simulator builds. You can follow
|
|
|
|
the next rules to make device + simulator configuration work:
|
|
|
|
|
|
|
|
- Use explicit ``-l`` linker flag,
|
|
|
|
e.g. ``target_link_libraries(foo PUBLIC "-lz")``
|
|
|
|
|
|
|
|
- Use explicit ``-framework`` linker flag,
|
|
|
|
e.g. ``target_link_libraries(foo PUBLIC "-framework CoreFoundation")``
|
|
|
|
|
|
|
|
- Use :command:`find_package` only for libraries installed with
|
|
|
|
:variable:`CMAKE_IOS_INSTALL_COMBINED` feature
|