cmake-toolchains(7)
- Введение
- Языки
- Переменные и свойства
- Функции инструментальной цепочки
-
- Кросс-компиляция для Linux
- Кросс-компиляция для среды Cray Linux
- Кросс-компиляция с использованием Clang
- Кросс-компиляция для QNX
- Кросс-компиляция для Windows CE
- Кросс-компиляция для универсальных приложений Windows 10
- Кросс-компиляция для Windows Phone
- Кросс-компиляция для Windows Store
- Кросс-компиляция для 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, так и Windows Phone. Установите переменную CMAKE_SYSTEM_VERSION в значение 10.0 или выше.
CMake выбирает SDK Windows, как описано в документации по CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION переменной.
Кросс-компиляция для 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)
Кросс-компиляция для 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 vs. ccblkfn) выбирается автоматически на основе предоставленного значения CMAKE_SYSTEM_PROCESSOR.
Кросс-компиляция для Android
Файл инструментальной цепочки может настроить кросс-компиляцию для Android, установив переменную CMAKE_SYSTEM_NAME в значение Android. Дальнейшая настройка зависит от используемой среды разработки Android.
Для генераторов Visual Studio CMake ожидает установку NVIDIA Nsight Tegra Visual Studio Edition или Visual Studio tools for 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 -
Установите значение Android ABI (архитектура). Если не указано, эта переменная будет по умолчанию установлена в первую поддерживаемую 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++ использовать. Если не указано, будет выбран значение по умолчанию, как описано в документации к переменной.
Следующие переменные будут вычислены и предоставлены автоматически:
-
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 симулятора | SDK Catalyst |
|---|---|---|---|---|
iOS | iOS | iphoneos | iphonesimulator | macosx |
tvOS | tvOS | appletvos | appletvsimulator | N/A |
visionOS | visionOS | xros | xrsimulator | N/A |
watchOS | watchOS | watchos | watchsimulator | N/A |
Например, для создания конфигурации 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 IDE выполняется построение для выбранной целевой платформы. При построении из командной строки желаемый 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.31/manual/cmake-toolchains.7.html