cmake-toolchains(7)
- Введение
- Языки
- Переменные и свойства
- Функции инструментальной цепочки
Введение
CMake использует инструментальную цепочку утилит для компиляции, линковки библиотек, создания архивов и выполнения других задач для управления сборкой. Доступные утилиты инструментальной цепочки определяются включенными языками. При нормальной сборке CMake автоматически определяет инструментальную цепочку для хостовых сборок на основе интроспекции системы и значений по умолчанию. В сценариях кросс-компиляции может быть указан файл инструментальной цепочки с информацией о путях компилятора и утилит.
Языки
Языки включаются с помощью команды project(). Языковые встроенные переменные, такие как CMAKE_CXX_COMPILER, CMAKE_CXX_COMPILER_ID и т. д., устанавливаются путём вызова команды project(). Если в файле CMakeLists верхнего уровня нет команды project, она будет сгенерирована неявно. По умолчанию включенными языками являются C и CXX:
project(C_Only C)
Также можно использовать специальное значение NONE с командой project() для отключения всех языков:
project(MyProject NONE)
Команда enable_language() может быть использована для включения языков после команды project():
enable_language(CXX)
При включении языка CMake находит компилятор для этого языка и определяет некоторые сведения, такие как поставщик и версия компилятора, целевая архитектура и разрядность, расположение соответствующих утилит и т. д.
Глобальное свойство ENABLED_LANGUAGES содержит языки, которые в настоящее время включены.
Переменные и свойства
Несколько переменных относятся к языковым компонентам инструментальной цепочки, которые включены. CMAKE_<LANG>_COMPILER — это полный путь к компилятору, используемому для <LANG>. CMAKE_<LANG>_COMPILER_ID — идентификатор, используемый CMake для компилятора, а CMAKE_<LANG>_COMPILER_VERSION — версия компилятора.
Переменные CMAKE_<LANG>_FLAGS и их конфигурационные аналоги содержат флаги, которые будут добавлены к команде компиляции при компиляции файла определённого языка.
Поскольку линковщик вызывается драйвером компилятора, CMake нужен способ определить, какой компилятор использовать для вызова линковщика. Это вычисляется по свойству LANGUAGE исходных файлов в целевом объекте и, в случае статических библиотек, по языку зависимых библиотек. Выбор, сделанный CMake, может быть изменён с помощью свойства целевого объекта LINKER_LANGUAGE.
Функции инструментальной цепочки
CMake предоставляет команду try_compile() и обертки-макросы, такие как CheckCXXSourceCompiles, CheckCXXSymbolExists и CheckIncludeFile, для проверки возможностей и доступности различных функций инструментальной цепочки. Эти API проверяют инструментальную цепочку каким-то образом и кэшируют результат, чтобы при последующем запуске CMake проверку не приходилось выполнять заново.
Некоторые функции инструментальной цепочки имеют встроенную обработку в CMake и не требуют проверки компиляцией. Например, POSITION_INDEPENDENT_CODE позволяет указать, что целевой объект должен быть скомпилирован как позиционно-независимый код, если компилятор поддерживает эту функцию. Свойства целевого объекта <LANG>_VISIBILITY_PRESET и VISIBILITY_INLINES_HIDDEN добавляют флаги для скрытой видимости, если это поддерживается компилятором.
Кросс-компиляция
Если cmake(1) вызывается с параметром командной строки --toolchain path/to/file или -DCMAKE_TOOLCHAIN_FILE=path/to/file, файл будет загружен в самом начале для установки значений компиляторов. Переменная CMAKE_CROSSCOMPILING устанавливается в true, когда CMake выполняет кросс-компиляцию.
Обратите внимание, что использование переменных CMAKE_SOURCE_DIR или CMAKE_BINARY_DIR внутри файла инструментальной цепочки обычно нежелательно. Файл инструментальной цепочки используется в контекстах, где эти переменные имеют разные значения, когда они используются в разных местах (например, в качестве части вызова try_compile()). В большинстве случаев, когда нужно вычислить пути внутри файла инструментальной цепочки, более подходящей переменной для использования будет CMAKE_CURRENT_LIST_DIR, так как она всегда имеет однозначное и предсказуемое значение.
Кросс-компиляция для Linux
Типичная инструментальная цепочка для кросс-компиляции для Linux содержит, например:
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)
Переменная CMAKE_SYSTEM_NAME — это идентификатор CMake целевой платформы для сборки.
Переменная CMAKE_SYSTEM_PROCESSOR — это идентификатор CMake целевой архитектуры для сборки.
Переменная CMAKE_SYSROOT необязательна и может быть указана, если доступен sysroot.
Переменная CMAKE_STAGING_PREFIX также является необязательной. Она может быть использована для указания пути на хост-системе для установки. Переменная CMAKE_INSTALL_PREFIX всегда указывает на расположение места установки для выполнения, даже при кросс-компиляции.
Переменные CMAKE_<LANG>_COMPILER могут быть установлены в полные пути или в имена компиляторов для поиска в стандартных расположениях. Для инструментальных цепочек, которые не поддерживают связывание библиотек без пользовательских флагов или скриптов, можно установить переменную CMAKE_TRY_COMPILE_TARGET_TYPE в значение STATIC_LIBRARY, чтобы указать CMake не пытаться связывать исполняемые файлы во время проверок.
Команды CMake find_* по умолчанию будут искать в sysroot и в записях CMAKE_FIND_ROOT_PATH во всех случаях, а также искать в корневом префиксе хост-системы. Хотя это можно контролировать в каждом конкретном случае, при кросс-компиляции может быть полезно исключить поиск определённых артефактов как на хосте, так и на целевой системе. Обычно, заголовки, библиотеки и пакеты следует искать в префиксах целевой системы, в то время как исполняемые файлы, которые должны быть запущены в рамках сборки, следует искать только на хост-системе, а не на целевой. Для этого предназначены переменные CMAKE_FIND_ROOT_PATH_MODE_*.
Кросс-компиляция для среды Cray Linux
Кросс-компиляция для вычислительных узлов в среде Cray Linux может быть выполнена без отдельного файла инструментальной цепочки. Указание -DCMAKE_SYSTEM_NAME=CrayLinuxEnvironment в командной строке CMake обеспечит конфигурацию соответствующих настроек сборки и путей поиска. Платформа будет получать свою конфигурацию из текущих переменных среды и настроит проект на использование обёртки компилятора из модулей PrgEnv-* среды Cray Programming Environment, если они присутствуют и загружены.
По умолчанию среда Cray Programming Environment поддерживает только статические библиотеки. Это можно изменить и включить динамические библиотеки, установив переменную среды CRAYPE_LINK_TYPE в значение dynamic.
Запуск CMake без указания CMAKE_SYSTEM_NAME выполнит этап конфигурации в режиме хост-системы, предполагая стандартную среду Linux. Если не переопределено, будут использоваться обёртки компилятора PrgEnv-*, что, если целевой системой является узел входа или вычислительный узел, вероятно, не является желаемым поведением. Исключением является случай, когда вы собираете программное обеспечение непосредственно на NID, а не кросс-компилируете с узла входа. Если вы пытаетесь собрать программное обеспечение для узла входа, вам необходимо либо сначала разгрузить загруженный модуль PrgEnv-*, либо явно указать CMake использовать системные компиляторы в /usr/bin вместо обёрток Cray. Если вместо этого требуется настройка для вычислительного узла, просто укажите CMAKE_SYSTEM_NAME, как указано выше.
Кросс-компиляция с использованием Clang
Некоторые компиляторы, такие как Clang, являются по своей природе кросс-компиляторами. Переменную CMAKE_<LANG>_COMPILER_TARGET можно установить для передачи значения поддерживаемым компиляторам при компиляции:
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})
Аналогично, некоторые компиляторы не поставляют свои вспомогательные утилиты, такие как компоновщики, но предоставляют способ указать расположение внешней инструментальной цепочки, которая будет использоваться драйвером компилятора. Переменная CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN может быть установлена в файле инструментальной цепочки для передачи пути к драйверу компилятора.
Кросс-компиляция для QNX
Как и компилятор Clang, компилятор QCC QNX по своей природе является кросс-компилятором. Переменная CMAKE_<LANG>_COMPILER_TARGET может быть установлена для передачи значения поддерживаемым компиляторам при компиляции:
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})
set(CMAKE_SYSROOT $ENV{QNX_TARGET})
Кросс-компиляция для Windows CE
Кросс-компиляция для Windows CE требует установки соответствующего SDK на вашей системе. Эти SDK обычно устанавливаются в C:/Program Files (x86)/Windows CE Tools/SDKs.
Файл инструментальной цепочки для настройки генератора Visual Studio для Windows CE может выглядеть следующим образом:
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)
Переменная CMAKE_GENERATOR_PLATFORM указывает генератору, какой SDK использовать. Дальнейшая переменная CMAKE_SYSTEM_VERSION указывает генератору, какую версию Windows CE использовать. В настоящее время поддерживается версия 8.0 (Windows Embedded Compact 2013) из коробки. Другие версии могут потребовать установки CMAKE_GENERATOR_TOOLSET в нужное значение.
Кросс-компиляция для универсальных приложений Windows 10
Файл инструментальной цепочки для настройки генератора Visual Studio для универсального приложения Windows 10 может выглядеть следующим образом:
set(CMAKE_SYSTEM_NAME WindowsStore) set(CMAKE_SYSTEM_VERSION 10.0)
Универсальное приложение Windows 10 предназначено как для Магазина Windows, так и для Windows Phone. Установите переменную CMAKE_SYSTEM_VERSION в значение 10.0, чтобы собрать приложение с последней доступной версией Windows 10 SDK. Укажите более конкретную версию (например, 10.0.10240.0 для RTM), чтобы собрать приложение с соответствующим SDK.
Кросс-компиляция для Windows Phone
Файл инструментальной цепочки для настройки генератора Visual Studio для Windows Phone может выглядеть следующим образом:
set(CMAKE_SYSTEM_NAME WindowsPhone) set(CMAKE_SYSTEM_VERSION 8.1)
Кросс-компиляция для Магазина Windows
Файл инструментальной цепочки для настройки генератора Visual Studio для Магазина Windows может выглядеть следующим образом:
set(CMAKE_SYSTEM_NAME WindowsStore) set(CMAKE_SYSTEM_VERSION 8.1)
Кросс-компиляция для Android
Файл инструментальной цепочки может настроить кросс-компиляцию для Android, установив переменную CMAKE_SYSTEM_NAME в значение Android. Дальнейшая настройка зависит от используемой среды разработки Android.
Для генераторов Visual Studio, CMake ожидает установки NVIDIA Nsight Tegra Visual Studio Edition или Инструменты Visual Studio для Android. См. соответствующие разделы для получения дополнительных данных о настройке.
Для генераторов Makefile и генератора Ninja, CMake ожидает одну из этих сред:
CMake использует следующие шаги для выбора одной из этих сред:
- Если переменная
CMAKE_ANDROID_NDKзадана, будет использован NDK по указанному пути. - В противном случае, если задана переменная
CMAKE_ANDROID_STANDALONE_TOOLCHAIN, будет использован автономный инструментарий по указанному пути. - В противном случае, если переменная
CMAKE_SYSROOTзадана с каталогом в формате<ndk>/platforms/android-<api>/arch-<arch>, часть<ndk>будет использоваться в качестве значения дляCMAKE_ANDROID_NDK, и будет использован NDK. - В противном случае, если переменная
CMAKE_SYSROOTзадана с каталогом в формате<standalone-toolchain>/sysroot, часть<standalone-toolchain>будет использоваться в качестве значения дляCMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован автономный инструментарий. - В противном случае, если задана переменная cmake
ANDROID_NDK, она будет использована в качестве значения дляCMAKE_ANDROID_NDK, и будет использован NDK. - В противном случае, если задана переменная cmake
ANDROID_STANDALONE_TOOLCHAIN, она будет использована в качестве значения дляCMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован автономный инструментарий. - В противном случае, если заданы переменные среды
ANDROID_NDK_ROOTилиANDROID_NDK, они будут использованы в качестве значения дляCMAKE_ANDROID_NDK, и будет использован NDK. - В противном случае, если задана переменная среды
ANDROID_STANDALONE_TOOLCHAIN, она будет использована в качестве значения дляCMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован автономный инструментарий. - В противном случае, будет выдано сообщение об ошибке, что ни NDK, ни автономный инструментарий не найдены.
Новое в версии 3.20: Если выбран Android NDK, его номер версии отображается в переменной CMAKE_ANDROID_NDK_VERSION.
Компиляция на Android с помощью NDK
Файл инструментария может настроить Генераторы Makefile, Генераторы Ninja или Генераторы Visual Studio для компиляции на Android.
Настройка использования Android NDK с помощью следующих переменных:
-
CMAKE_SYSTEM_NAME -
Установите значение
Android. Необходимо для включения кросс-компиляции на Android. -
CMAKE_SYSTEM_VERSION -
Установите уровень API Android. Если не указано, значение определяется следующим образом:
- Если переменная
CMAKE_ANDROID_APIзадана, её значение используется как уровень API. - Если переменная
CMAKE_SYSROOTзадана, уровень API определяется из структуры каталога NDK, содержащей sysroot. - В противном случае используется последний доступный уровень API в NDK.
- Если переменная
-
CMAKE_ANDROID_ARCH_ABI -
Установите Android ABI (архитектуру). Если не указано, по умолчанию используется первый поддерживаемый ABI в списке
armeabi,armeabi-v7aиarm64-v8a. ПеременнаяCMAKE_ANDROID_ARCHбудет вычислена изCMAKE_ANDROID_ARCH_ABIавтоматически. Также см. переменныеCMAKE_ANDROID_ARM_MODEиCMAKE_ANDROID_ARM_NEON. -
CMAKE_ANDROID_NDK -
Установите абсолютный путь к корневому каталогу Android NDK. Если не указано, значение по умолчанию будет выбрано, как указано выше.
-
CMAKE_ANDROID_NDK_DEPRECATED_HEADERS -
Установите значение true, чтобы использовать устаревшие заголовки для каждого уровня API вместо объединённых заголовков. Если не указано, значение по умолчанию будет false, если не используется NDK, который не предоставляет объединённые заголовки.
-
CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION -
Для NDK r19 или выше эта переменная должна быть не задана или установлена в
clang. Для NDK r18 и ниже установите эту переменную на версию NDK инструментария, который нужно выбрать в качестве компилятора. Если не указано, значение по умолчанию будет последней доступной цепочкой инструментов GCC. -
CMAKE_ANDROID_STL_TYPE -
Указывает, какую библиотеку стандартной C++ использовать. Если не указано, будет выбрано значение по умолчанию, как описано в документации к переменной.
Следующие переменные будут вычислены и автоматически предоставлены:
-
CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX -
Абсолютный префикс пути к binutils в цепочке инструментов NDK.
-
CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX -
Суффикс платформы хоста binutils в цепочке инструментов NDK.
Например, файл инструментария может содержать:
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)
Альтернативно можно указать значения без файла инструментария:
$ 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
Компиляция на Android с помощью автономного инструментария
Файл инструментария может настроить Генераторы Makefile или Ninja генератор для компиляции на Android с помощью автономной цепочки инструментов.
Настройка использования автономной цепочки инструментов Android с помощью следующих переменных:
-
CMAKE_SYSTEM_NAME -
Установлено в
Android. Необходимо для включения кросс-компиляции для Android. -
CMAKE_ANDROID_STANDALONE_TOOLCHAIN -
Устанавливается в абсолютный путь к корневому каталогу автономной цепочки инструментов. Должен существовать каталог
${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/sysroot. Если не указано, для этой переменной будет выбран по умолчанию значение, указанное выше. -
CMAKE_ANDROID_ARM_MODE -
Если автономная цепочка инструментов предназначена для ARM, можно установить значение
ON, чтобы настроить целевую платформу на 32-битный ARM вместо 16-битного Thumb. Подробности см. в документации по переменной. -
CMAKE_ANDROID_ARM_NEON -
Если автономная цепочка инструментов предназначена для ARM v7, можно установить это значение в
ON, чтобы настроить целевую платформу на устройства с ARM NEON. Подробности см. в документации по переменной.
Следующие переменные будут вычисляться и предоставляться автоматически:
-
CMAKE_SYSTEM_VERSION -
Уровень API Android, определенный из автономной цепочки инструментов.
-
CMAKE_ANDROID_ARCH_ABI -
ABI Android, определенный из автономной цепочки инструментов.
-
CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX -
Абсолютный префикс пути к
binutilsв автономной цепочке инструментов. -
CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX -
Суффикс хостовой платформы
binutilsв автономной цепочке инструментов.
Например, файл цепочки инструментов может содержать:
set(CMAKE_SYSTEM_NAME Android) set(CMAKE_ANDROID_STANDALONE_TOOLCHAIN /path/to/android-toolchain)
В качестве альтернативы можно указать значения без файла цепочки инструментов:
$ cmake ../src \ -DCMAKE_SYSTEM_NAME=Android \ -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=/path/to/android-toolchain
Кросс-компиляция для Android с NVIDIA Nsight Tegra Visual Studio Edition
Файл цепочки инструментов для настройки одного из генераторов Visual Studio для сборки с использованием NVIDIA Nsight Tegra, нацеленной на Android, может выглядеть следующим образом:
set(CMAKE_SYSTEM_NAME Android)
Переменная CMAKE_GENERATOR_TOOLSET может быть установлена для выбора значения "Версия цепочки инструментов" Nsight Tegra.
См. также свойства целевых объектов:
ANDROID_ANT_ADDITIONAL_OPTIONSANDROID_API_MINANDROID_APIANDROID_ARCHANDROID_ASSETS_DIRECTORIESANDROID_GUIANDROID_JAR_DEPENDENCIESANDROID_JAR_DIRECTORIESANDROID_JAVA_SOURCE_DIRANDROID_NATIVE_LIB_DEPENDENCIESANDROID_NATIVE_LIB_DIRECTORIESANDROID_PROCESS_MAXANDROID_PROGUARD_CONFIG_PATHANDROID_PROGUARDANDROID_SECURE_PROPS_PATHANDROID_SKIP_ANT_STEPANDROID_STL_TYPE
Кросс-компиляция для iOS, tvOS или watchOS
Для кросс-компиляции для iOS, tvOS или watchOS рекомендуется генератор Xcode. Генераторы Unix Makefiles или Ninja также могут быть использованы, но они требуют, чтобы проект обрабатывал такие аспекты, как выбор целевого процессора и подпись кода.
Любую из трёх платформ можно настроить, установив переменную CMAKE_SYSTEM_NAME на значение из таблицы ниже. По умолчанию выбирается последняя версия SDK устройства. Как и для всех платформ Apple, другой SDK (например, эмулятор) можно выбрать, установив переменную CMAKE_OSX_SYSROOT, хотя это обычно не требуется (см. Переключение между устройством и эмулятором ниже). Список доступных SDK можно получить, выполнив xcodebuild -showsdks.
ОС | CMAKE_SYSTEM_NAME | SDK устройства (по умолчанию) | SDK эмулятора |
|---|---|---|---|
iOS | iOS | iphoneos | iphonesimulator |
tvOS | tvOS | appletvos | appletvsimulator |
watchOS | watchOS | watchos | watchsimulator |
Например, для создания конфигурации CMake для iOS достаточно следующей команды:
cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS
Переменная CMAKE_OSX_ARCHITECTURES может использоваться для установки архитектур как для устройства, так и для эмулятора. Переменная CMAKE_OSX_DEPLOYMENT_TARGET может использоваться для установки целевой версии iOS/tvOS/watchOS.
Следующая конфигурация установит библиотеку iOS с 5 архитектурами и добавит флаги -miphoneos-version-min=9.3/-mios-simulator-version-min=9.3 к компилятору:
$ 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
Пример:
# CMakeLists.txt cmake_minimum_required(VERSION 3.14) project(foo) add_library(foo foo.cpp) install(TARGETS foo DESTINATION lib)
Установка:
$ cmake --build _builds --config Release --target install
Проверка библиотеки:
$ lipo -info _install/lib/libfoo.a Architectures in the fat file: _install/lib/libfoo.a are: i386 armv7 armv7s x86_64 arm64
$ otool -l _install/lib/libfoo.a | grep -A2 LC_VERSION_MIN_IPHONEOS
cmd LC_VERSION_MIN_IPHONEOS
cmdsize 16
version 9.3
Подпись кода
Некоторые артефакты сборки для встроенных платформ Apple требуют обязательной подписи кода. Если используется генератор Xcode, и требуется или желательна подпись кода, идентификатор команды разработки можно указать через переменную CMake CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM. Этот идентификатор команды будет затем включён в сгенерированный проект Xcode. По умолчанию CMake избегает необходимости в подписи кода во время внутренней фазы конфигурации (т.е. определение идентификатора компилятора и функций).
Переключение между устройством и эмулятором
При конфигурировании для любой из встроенных платформ можно указать как реальные устройства, так и симулятор. Оба имеют собственные отдельные SDK, но CMake поддерживает только указание одного SDK на фазе конфигурации. Это означает, что разработчик должен выбрать один или другой во время конфигурации. При использовании генератора Xcode, это ограничение менее существенно, потому что Xcode всё ещё позволяет создавать сборки как для устройства, так и для симулятора, даже если конфигурация была выполнена только для одного из двух. Внутри IDE Xcode сборки выполняются для выбранной платформы «назначения». При создании сборки из командной строки желаемый sdk можно указать напрямую, передав опцию -sdk соответствующему инструменту сборки (xcodebuild). Например:
$ cmake --build ... -- -sdk iphonesimulator
Обратите внимание, что проверки, выполненные во время конфигурации, проводились с учётом SDK времени конфигурации и могут не соответствовать другим SDK. Команды, такие как find_package(), find_library() и т. д., хранят и используют детали только для сконфигурированного SDK/платформы, поэтому они могут быть проблематичны при переключении между сборками для устройства и симулятора. Чтобы настроить работу с устройством и симулятором, следуйте следующим правилам:
- Используйте явный
-lфлаг компоновщика, напримерtarget_link_libraries(foo PUBLIC "-lz") - Используйте явный
-frameworkфлаг компоновщика, напримерtarget_link_libraries(foo PUBLIC "-framework CoreFoundation") - Используйте
find_package()только для библиотек, установленных с помощью функцииCMAKE_IOS_INSTALL_COMBINED
© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/manual/cmake-toolchains.7.html