cmake-toolchains(7)
- Введение
- Языки
- Переменные и свойства
- Функции инструментальной цепочки
-
- Кросс-компиляция для Linux
- Кросс-компиляция для среды Cray Linux
- Кросс-компиляция с использованием Clang
- Кросс-компиляция для QNX
- Кросс-компиляция для Windows CE
- Кросс-компиляция для универсальных приложений Windows 10
- Кросс-компиляция для Windows Phone
- Кросс-компиляция для магазина Windows
- Кросс-компиляция для ADSP SHARC/Blackfin
Введение
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 может быть выполнена без отдельного файла инструментальной цепочки. Указание -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 или выше.
CMake выбирает Windows SDK, как описано в документации переменной CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION.
Кросс-компиляция для 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)
Кросс-компиляция для 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
Файл инструментальной цепочки может настроить кросс-компиляцию для Android, установив переменную CMAKE_SYSTEM_NAME в значение Android. Дальнейшая конфигурация зависит от используемой среды разработки Android.
Для генераторов Visual Studio CMake ожидает установки NVIDIA Nsight Tegra Visual Studio Edition или Инструментов Visual Studio для Android. См. эти разделы для получения дополнительных подробностей о настройке.
Для генераторов 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, ни Автономная цепочка инструментов не найдены.
Добавлено в версии 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 -
Установите 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 цепочки инструментов, которая будет выбрана в качестве компилятора. Если не указано, по умолчанию будет использоваться последняя доступная цепочка инструментов GCC. -
CMAKE_ANDROID_STL_TYPE -
Установите значение для указания используемой библиотеки стандартной C++ (STL). Если не указано, значение по умолчанию будет выбрано, как описано в документации переменной.
Следующие переменные будут вычислены и предоставлены автоматически:
-
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, visionOS или watchOS
Для кросс-компиляции на iOS, tvOS, visionOS или watchOS рекомендуется генератор Xcode. Генераторы Unix Makefiles или Ninja также могут быть использованы, но они требуют от проекта обработки дополнительных областей, таких как выбор целевого процессора и подписи кода.
Любую из платформ устройств Apple можно нацелить, установив переменную 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 |
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 всё ещё позволяет создавать приложения для устройства или симулятора, даже если конфигурация была выполнена только для одного из двух. Внутри среды разработки 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.30/manual/cmake-toolchains.7.html