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, компилятор QNX QCC по своей сути является кросс-компилятором. Переменная 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 для сборки с помощью последней доступной версии SDK Windows 10. Установите более конкретную версию (например, 10.0.10240.0 для RTM) для сборки с соответствующим SDK.
Кросс-компиляция для Windows Phone
Файл инструментальной цепочки для настройки генератора Visual Studio для Windows Phone может выглядеть следующим образом:
set(CMAKE_SYSTEM_NAME WindowsPhone) set(CMAKE_SYSTEM_VERSION 8.1)
Кросс-компиляция для Windows Store
Файл инструментальной цепочки для настройки генератора Visual Studio для Windows Store может выглядеть следующим образом:
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 -
Установить ABI (архитектуру) Android. Если не указано, эта переменная будет по умолчанию установлена на первую поддерживаемую 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 -
Установить в истинное значение, чтобы использовать устаревшие заголовки по уровням 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 все равно позволяет вам собирать либо для устройства, либо для симулятора, даже если конфигурация была выполнена только для одного из двух. Внутри среды разработки 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–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/manual/cmake-toolchains.7.html