cmake-toolchains(7)
- Введение
- Языки
- Переменные и свойства
- Функции инструментальной цепочки
-
- Перекрёстная компиляция для Linux
- Перекрёстная компиляция для среды Cray Linux
- Перекрёстная компиляция с использованием Clang
- Перекрёстная компиляция для QNX
- Перекрёстная компиляция для Windows CE
- Перекрёстная компиляция для универсальных приложений Windows 10
- Перекрёстная компиляция для Windows Phone
- Перекрёстная компиляция для магазина Windows
Введение
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) вызывается с параметром командной строки -DCMAKE_TOOLCHAIN_FILE=path/to/file, файл будет загружен на ранней стадии для установки значений компиляторов. Переменная CMAKE_CROSSCOMPILING устанавливается в true при перекрёстной компиляции.
Обратите внимание, что использование переменных 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})
Кросс-компиляция для 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 Store, так и на 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. Смотрите этот раздел для получения дополнительных сведений о настройке.
Для генераторов 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, ни автономная цепочка инструментов не найдены.
Компиляция для Android с использованием NDK
Файл цепочки инструментов может настроить Генераторы Makefile или генератор Ninja для компиляции для 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 (архитектуру). Если не указано, по умолчанию будет
armeabi. ПеременнаяCMAKE_ANDROID_ARCHбудет вычислена автоматически изCMAKE_ANDROID_ARCH_ABI. Также см. переменныеCMAKE_ANDROID_ARM_MODEиCMAKE_ANDROID_ARM_NEON. -
CMAKE_ANDROID_NDK -
Установите абсолютный путь к корневому каталогу Android NDK. Должен существовать каталог
${CMAKE_ANDROID_NDK}/platforms. Если не указано, значение этой переменной будет выбрано по умолчанию, как указано выше. -
CMAKE_ANDROID_NDK_DEPRECATED_HEADERS -
Установите в истинное значение, чтобы использовать устаревшие заголовки для каждого уровня API вместо унифицированных. Если не указано, значение по умолчанию будет ложным, за исключением использования 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 на значение из таблицы ниже. По умолчанию выбирается последняя версия Device SDK. Что касается всех платформ Apple, другой SDK (например, эмулятор) можно выбрать, установив переменную CMAKE_OSX_SYSROOT, хотя это редко необходимо (см. Переключение между устройством и эмулятором ниже). Список доступных SDK можно получить, выполнив xcodebuild -showsdks.
ОС | CMAKE_SYSTEM_NAME | Device 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–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.16/manual/cmake-toolchains.7.html