Spec-Zone.ru › CMake 3.15

cmake-toolchains(7)

  • Введение
  • Языки
  • Переменные и свойства
  • Возможности цепочки инструментов
  • Кросс-компиляция

    • Кросс-компиляция для Linux
    • Кросс-компиляция для среды Cray Linux
    • Кросс-компиляция с использованием Clang
    • Кросс-компиляция для QNX
    • Кросс-компиляция для Windows CE
    • Кросс-компиляция для универсальных приложений Windows 10
    • Кросс-компиляция для Windows Phone
    • Кросс-компиляция для магазина Windows
    • Кросс-компиляция для Android

      • Кросс-компиляция для Android с использованием NDK
      • Кросс-компиляция для Android с автономной цепочкой инструментов
      • Кросс-компиляция для Android с NVIDIA Nsight Tegra Visual Studio Edition
    • Кросс-компиляция для iOS, tvOS или watchOS

      • Подпись кода
      • Переключение между устройством и эмулятором

Введение

CMake использует цепочку инструментов для компиляции, линковки библиотек, создания архивов и выполнения других задач при сборке. Доступные инструменты цепочки инструментов определяются включёнными языками. В обычных сборках CMake автоматически определяет цепочку инструментов для сборки на целевой системе на основе интроспекции системы и значений по умолчанию. В сценариях кросс-компиляции может быть указан файл цепочки инструментов с информацией о путях компилятора и вспомогательных утилит.

Языки

Языки включаются с помощью команды project(). Языковые встроенные переменные, такие как CMAKE_CXX_COMPILER, CMAKE_CXX_COMPILER_ID и т.д., устанавливаются с помощью команды project(). Если команда project отсутствует в файле CMakeLists верхнего уровня, она будет сгенерирована неявно. По умолчанию включены языки 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.

END_OF_DOCUMENT_MARKER

Переменная 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})

Кросс-компиляция для 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. Укажите более конкретную версию (например, 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 ожидает одну из этих сред:

  • NDK
  • Самостоятельная инструментальная цепочка

CMake использует следующие шаги для выбора одной из сред:

  • Если переменная CMAKE_ANDROID_NDK задана, будет использоваться NDK по указанному расположению.
  • В противном случае, если задана переменная CMAKE_ANDROID_STANDALONE_TOOLCHAIN, будет использоваться 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, и будет использован Standalone Toolchain.
  • В противном случае, если переменная cmake ANDROID_NDK задана, она будет использована как значение для CMAKE_ANDROID_NDK, и будет использован NDK.
  • В противном случае, если переменная cmake ANDROID_STANDALONE_TOOLCHAIN задана, она будет использована как значение для CMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован Standalone Toolchain.
  • В противном случае, если переменная среды ANDROID_NDK_ROOT или ANDROID_NDK задана, она будет использована как значение для CMAKE_ANDROID_NDK, и будет использован NDK.
  • В противном случае, если переменная среды ANDROID_STANDALONE_TOOLCHAIN задана, она будет использована как значение для CMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован Standalone Toolchain.
  • В противном случае, будет выдано сообщение об ошибке, что ни NDK, ни Standalone Toolchain не найдены.

Компиляция для 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 инструментария, который будет выбран в качестве компилятора. Если не указано, значение по умолчанию будет последняя доступная цепочка 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

Android ABI, определённый автономной цепочкой инструментов.

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 может быть установлена для выбора значения «Toolchain Version» Nsight Tegra.

См. также свойства целевого объекта:

  • ANDROID_ANT_ADDITIONAL_OPTIONS
  • ANDROID_API_MIN
  • ANDROID_API
  • ANDROID_ARCH
  • ANDROID_ASSETS_DIRECTORIES
  • ANDROID_GUI
  • ANDROID_JAR_DEPENDENCIES
  • ANDROID_JAR_DIRECTORIES
  • ANDROID_JAVA_SOURCE_DIR
  • ANDROID_NATIVE_LIB_DEPENDENCIES
  • ANDROID_NATIVE_LIB_DIRECTORIES
  • ANDROID_PROCESS_MAX
  • ANDROID_PROGUARD_CONFIG_PATH
  • ANDROID_PROGUARD
  • ANDROID_SECURE_PROPS_PATH
  • ANDROID_SKIP_ANT_STEP
  • ANDROID_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.15/manual/cmake-toolchains.7.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API