Spec-Zone.ru › CMake 3.18

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(). Если в файле 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 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 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

Файл инструментальной цепочки для настройки генератора Visual Studio для магазина Windows может выглядеть следующим образом:

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 8.1)

Кросс-компиляция для Android

Файл инструментальной цепочки может настроить кросс-компиляцию для Android, установив переменную CMAKE_SYSTEM_NAME на значение Android. Дальнейшая настройка зависит от используемой среды разработки Android.

Для генераторов Visual Studio, CMake ожидает установку NVIDIA Nsight Tegra Visual Studio Edition. Смотрите этот раздел для получения дополнительных сведений о настройке.

Для генераторов 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

Устанавливается в значение 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 с помощью Standalone Toolchain

Файл конфигурации может настроить Генераторы Makefile или генератор Ninja для настройки компиляции для Android с использованием standalone toolchain.

Настройка использования Android standalone toolchain с помощью следующих переменных:

CMAKE_SYSTEM_NAME

Устанавливается в Android. Необходимо для активации кросс-компиляции для Android.

CMAKE_ANDROID_STANDALONE_TOOLCHAIN

Устанавливается в абсолютный путь к корневой директории standalone toolchain. Должен существовать каталог ${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/sysroot. Если не указано, значение этой переменной будет выбрано по умолчанию, как указано выше.

CMAKE_ANDROID_ARM_MODE

Если standalone toolchain предназначен для ARM, установите данную переменную в ON, чтобы использовать 32-битный ARM вместо 16-битного Thumb. Подробнее см. документацию переменной.

CMAKE_ANDROID_ARM_NEON

Если standalone toolchain предназначен для 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_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.

Следующая конфигурация установит бинарный файл для 5 архитектур iOS библиотеки и добавит флаги -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.18/manual/cmake-toolchains.7.html

Spec-Zone.ru

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