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(). Если команда project отсутствует в файле CMakeLists верхнего уровня, она будет неявно сгенерирована. По умолчанию включены языки C и CXX:
project(C_Only C)
Также с командой project() можно использовать специальное значение NONE для отключения языков:
project(MyProject NONE)
Команда enable_language() может быть использована для включения языков после команды project():
enable_language(CXX)
При включении языка CMake находит компилятор для этого языка и определяет информацию, такую как поставщик и версия компилятора, целевая архитектура и разрядность, местоположение соответствующих утилит и т. д.
Глобальное свойство ENABLED_LANGUAGES содержит языки, которые в настоящее время включены.
Переменные и свойства
Несколько переменных относятся к языковым компонентам включенной цепочки инструментов:
-
CMAKE_<LANG>_COMPILER -
Полный путь к компилятору, используемому для
<LANG> -
CMAKE_<LANG>_COMPILER_ID -
Идентификатор компилятора, используемый CMake
-
CMAKE_<LANG>_COMPILER_VERSION -
Версия компилятора.
-
CMAKE_<LANG>_FLAGS -
Переменные и аналогичные свойства в зависимости от конфигурации содержат флаги, которые будут добавлены к команде компиляции при компиляции файла определённого языка.
CMake необходимо определить, какой компилятор использовать для вызова компоновщика. Это определяется свойством LANGUAGE файлов исходного кода 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, если они присутствуют и загружены.
По умолчанию среда программирования Cray поддерживает только статические библиотеки. Это можно изменить и включить динамические библиотеки, установив переменную среды 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 -
Установить 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 сборки выполняются для выбранной платформы «назначения». При сборке из командной строки требуемый 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/latest/manual/cmake-toolchains.7.html