cmake-toolchains(7)
- Введение
- Языки
- Переменные и свойства
- Функции цепочки инструментов
Введение
CMake использует цепочку инструментов для компиляции, компоновки библиотек, создания архивов и других задач для управления сборкой. Доступные инструменты цепочки инструментов определяются активированными языками. В обычных сборках CMake автоматически определяет цепочку инструментов для хост-сборок на основе системного анализа и значений по умолчанию. В сценариях кросс-компиляции может быть указан файл цепочки инструментов с информацией о путях компилятора и утилит.
Языки
Языки активируются командой project(). Языковые встроенные переменные, такие как CMAKE_CXX_COMPILER, CMAKE_CXX_COMPILER_ID и т. д., устанавливаются с помощью команды project(). Если в файле CMakeLists верхнего уровня нет команды project, она будет сгенерирована неявно. По умолчанию активированными языками являются C и CXX:
project(C_Only C)
Также с командой project() можно использовать специальное значение NONE для отключения всех языков:
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 выполняет кросс-компиляцию.
Обратите внимание, что использование переменных 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, если они присутствуют и загружены.
По умолчанию среда программирования Cray поддерживает только статические библиотеки. Это можно изменить и включить динамические библиотеки, установив переменную среды 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 Store, так и на Windows Phone. Установите переменную CMAKE_SYSTEM_VERSION в значение 10.0, чтобы собрать с помощью последней доступной Windows 10 SDK. Для сборки с соответствующим SDK укажите более конкретную версию (например, 10.0.10240.0 для RTM).
Кросс-компиляция для 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 -
Установите значение в 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–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.17/manual/cmake-toolchains.7.html