Spec-Zone.ru › CMake 3.28

cmake-toolchains(7)

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

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

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

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

Введение

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

Новое в версии 3.19: Можно использовать cmake-presets(7) для указания файлов инструментальной цепочки.

Языки

Языки включаются командой 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 файлов исходного кода target, а в случае статических библиотек — свойством LANGUAGE зависимых библиотек. Выбор, сделанный CMake, может быть изменён свойством целевой переменной LINKER_LANGUAGE.

Функции инструментальной цепочки

CMake предоставляет команду try_compile() и макросы-обёртки, такие как CheckSourceCompiles, CheckCXXSymbolExists и CheckIncludeFile, для проверки возможностей и доступности различных функций инструментальной цепочки. Эти API проверяют инструментальную цепочку каким-либо образом и кэшируют результат, чтобы тест не выполнялся повторно при следующем запуске CMake.

Некоторые функции инструментальной цепочки имеют встроенную обработку в CMake и не требуют проверки компиляции. Например, POSITION_INDEPENDENT_CODE позволяет указать, что целевой объект должен быть скомпилирован как позиционно-независимый код, если компилятор поддерживает эту функцию. Целевые свойства <LANG>_VISIBILITY_PRESET и VISIBILITY_INLINES_HIDDEN добавляют флаги для скрытой видимости, если это поддерживается компилятором.

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

Если cmake(1) вызывается с параметром командной строки --toolchain path/to/file или -DCMAKE_TOOLCHAIN_FILE=path/to/file, файл загружается предварительно, чтобы установить значения для компиляторов. Переменная CMAKE_CROSSCOMPILING устанавливается в значение true, когда CMake выполняет кросс-компиляцию.

Обратите внимание, что использование переменных CMAKE_SOURCE_DIR или CMAKE_BINARY_DIR внутри файла инструментальной цепочки обычно нежелательно. Файл инструментальной цепочки используется в контекстах, где эти переменные имеют разные значения при использовании в разных местах (например, как часть вызова try_compile()). В большинстве случаев, когда требуется вычислить пути внутри файла инструментальной цепочки, более подходящей переменной для использования является CMAKE_CURRENT_LIST_DIR, так как она всегда имеет однозначное, предсказуемое значение.

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

Типичная инструментальная цепочка кросс-компиляции для Linux содержит содержимое, такое как:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
set(CMAKE_STAGING_PREFIX /home/devel/stage)

set(tools /home/devel/gcc-4.7-linaro-rpi-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

Где:

CMAKE_SYSTEM_NAME

является идентификатором CMake целевой платформы, для которой будет выполняться компиляция.

CMAKE_SYSTEM_PROCESSOR

является идентификатором CMake целевой архитектуры.

CMAKE_SYSROOT

является необязательным и может быть указан, если доступен sysroot.

CMAKE_STAGING_PREFIX

также является необязательным. Он может использоваться для указания пути на хост-системе для установки. CMAKE_INSTALL_PREFIX всегда является расположением установки для работы, даже при кросс-компиляции.

CMAKE_<LANG>_COMPILER

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

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

Кросс-компиляция для среды Cray Linux

Кросс-компиляция для вычислительных узлов в среде Cray Linux может быть выполнена без необходимости отдельного файла toolchain. Указание -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 может быть установлена в файле 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})

set(CMAKE_SYSROOT $ENV{QNX_TARGET})

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

Для кросс-компиляции для Windows CE необходимо установить соответствующий SDK на вашей системе. Обычно эти SDK устанавливаются в C:/Program Files (x86)/Windows CE Tools/SDKs.

Файл toolchain для настройки генератора 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

Файл toolchain для настройки генераторов 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 или выше.

CMake выбирает Windows SDK, как описано в документации переменной CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION.

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

Файл toolchain для настройки генератора Visual Studio для Windows Phone может выглядеть так:

set(CMAKE_SYSTEM_NAME WindowsPhone)
set(CMAKE_SYSTEM_VERSION 8.1)

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

Файл toolchain для настройки генератора Visual Studio для Windows Store может выглядеть так:

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 8.1)

Кросс-компиляция для ADSP SHARC/Blackfin

Кросс-компиляция для ADSP SHARC или Blackfin может быть настроена путём установки переменной CMAKE_SYSTEM_NAME в значение ADSP и переменной CMAKE_SYSTEM_PROCESSOR в "номер детали", исключая префикс ADSP-, например, 21594, SC589, и т.д. Это значение нечувствительно к регистру.

CMake автоматически ищет установленные CCES или VDSP++ в их стандартных расположениях и выбирает последнюю найденную версию. CCES будет выбран вместо VDSP++, если оба установлены. Пользовательские пути установки могут быть заданы с помощью переменной CMAKE_ADSP_ROOT или переменной среды ADSP_ROOT.

Компилятор (cc21k против ccblkfn) выбирается автоматически в зависимости от предоставленного значения CMAKE_SYSTEM_PROCESSOR.

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

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

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

Для генераторов Makefile и генератора Ninja CMake ожидает наличие одной из этих сред:

  • NDK
  • Standalone Toolchain

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

  • Если переменная CMAKE_ANDROID_NDK установлена, будет использоваться NDK по указанному пути.
  • В противном случае, если установлена переменная CMAKE_ANDROID_STANDALONE_TOOLCHAIN, будет использоваться Standalone Toolchain по указанному пути.
  • В противном случае, если переменная CMAKE_SYSROOT установлена на каталог вида <ndk>/platforms/android-<api>/arch-<arch>, часть <standalone-toolchain> будет использоваться в качестве значения 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 не найдены.

Новое в версии 3.20: Если выбран Android NDK, его номер версии отображается в переменной CMAKE_ANDROID_NDK_VERSION.

Компиляция для Android с использованием NDK

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

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

CMAKE_SYSTEM_NAME

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

CMAKE_SYSTEM_VERSION

Установите уровень API Android. Если не указано, значение определяется следующим образом:

  • Если переменная CMAKE_ANDROID_API установлена, её значение используется в качестве уровня API.
  • Если переменная CMAKE_SYSROOT установлена, уровень API определяется из структуры каталога NDK, содержащей sysroot.
  • В противном случае используется самый последний доступный уровень API в NDK.
CMAKE_ANDROID_ARCH_ABI

Установите Android ABI (архитектуру). Если не указано, эта переменная по умолчанию будет иметь первое поддерживаемое значение в списке armeabi, armeabi-v7a и arm64-v8a. Переменная CMAKE_ANDROID_ARCH будет вычислена из CMAKE_ANDROID_ARCH_ABI автоматически. Также см. переменные CMAKE_ANDROID_ARM_MODE и CMAKE_ANDROID_ARM_NEON.

CMAKE_ANDROID_NDK

Установите абсолютный путь к корневому каталогу Android NDK. Если не указано, значение по умолчанию будет выбрано как указано выше.

CMAKE_ANDROID_NDK_DEPRECATED_HEADERS

Установите значение в true, чтобы использовать устаревшие заголовки для каждого уровня API вместо унифицированных заголовков. Если не указано, значение по умолчанию будет false, за исключением случаев использования NDK, который не предоставляет унифицированные заголовки.

CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION

Для NDK r19 и выше эта переменная должна быть не задана или иметь значение clang. Для NDK r18 и ниже установите её значение на версию NDK toolchain, который нужно выбрать в качестве компилятора. Если не указано, по умолчанию будет использоваться последняя доступная GCC toolchain.

CMAKE_ANDROID_STL_TYPE

Установите значение, чтобы указать, какую библиотеку стандартных C++ использовать. Если не указано, по умолчанию будет выбран вариант, как описано в документации к переменной.

Следующие переменные будут вычислены и предоставлены автоматически:

CMAKE_<LANG>_ANDROID_TOOLCHAIN_PREFIX

Абсолютный префикс пути к binutils в NDK toolchain.

CMAKE_<LANG>_ANDROID_TOOLCHAIN_SUFFIX

Суффикс хостовой платформы binutils в NDK toolchain.

Например, файл конфигурации инструментария может содержать:

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

Установлено в абсолютный путь к корневому каталогу автономной цепочки инструментов. Должен существовать каталог ${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_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, visionOS или watchOS

Для кросс-компиляции в iOS, tvOS, visionOS или watchOS рекомендуется генератор Xcode. Генераторы Unix Makefiles или Ninja также могут быть использованы, но они требуют от проекта обработки большего количества областей, таких как выбор целевого процессора и кодирование.

Любая из платформ Apple устройств может быть нацелена, установив переменную CMAKE_SYSTEM_NAME на значение из таблицы ниже. По умолчанию выбирается самая последняя SDK устройства. Как и для всех платформ Apple, другую SDK (например, симулятора) можно выбрать, установив переменную CMAKE_OSX_SYSROOT, хотя это редко необходимо (см. Переключение между устройством и симулятором ниже). Список доступных SDK можно получить, выполнив xcodebuild -showsdks.

OS

CMAKE_SYSTEM_NAME

SDK устройства (по умолчанию)

SDK симулятора

iOS

iOS

iphoneos

iphonesimulator

tvOS

tvOS

appletvos

appletvsimulator

visionOS

visionOS

xros

xrsimulator

watchOS

watchOS

watchos

watchsimulator

Например, для создания конфигурации CMake для iOS достаточно следующей команды:

cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS

Переменная CMAKE_OSX_ARCHITECTURES может быть использована для установки архитектур как для устройства, так и для симулятора. Переменная CMAKE_OSX_DEPLOYMENT_TARGET может быть использована для установки целевой версии iOS/tvOS/visionOS/watchOS.

Следующий пример устанавливает пять архитектур в универсальном двоичном файле для библиотеки iOS. Он добавляет соответствующую -miphoneos-version-min=9.3 или -mios-simulator-version-min=9.3 компилятора, где это необходимо. Обратите внимание, что переменная CMAKE_IOS_INSTALL_COMBINED, использованная в примере, теперь устарела, поэтому этот подход больше не рекомендуется.

$ 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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.28/manual/cmake-toolchains.7.html

Spec-Zone.ru

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