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(). Если команда project отсутствует в файле CMakeLists верхнего уровня, она будет неявно сгенерирована. По умолчанию включены языки 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() и макросы-обёртки, такие как CheckCXXSourceCompiles, 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, чтобы выполнить сборку с использованием последней доступной версии SDK Windows 10. Укажите более конкретную версию (например, 10.0.10240.0 для RTM), чтобы выполнить сборку с соответствующим SDK.
Кросс-компиляция для Windows Phone
Файл инструментальной цепочки для настройки генератора Visual Studio для Windows Phone может выглядеть так:
set(CMAKE_SYSTEM_NAME WindowsPhone) set(CMAKE_SYSTEM_VERSION 8.1)
Кросс-компиляция для Магазина Windows
Файл инструментальной цепочки для настройки генератора Visual Studio для Магазина Windows может выглядеть так:
set(CMAKE_SYSTEM_NAME WindowsStore) set(CMAKE_SYSTEM_VERSION 8.1)
Кросс-компиляция для 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 для Android. См. соответствующие разделы для получения дополнительных сведений о настройке.
Для генераторов Makefile и генератора Ninja, CMake ожидает одну из этих сред:
CMake использует следующие шаги для выбора одной из сред:
- Если переменная
CMAKE_ANDROID_NDKзадана, будет использован NDK по указанному пути. - В противном случае, если задана переменная
CMAKE_ANDROID_STANDALONE_TOOLCHAIN, будет использован Standalone Toolchain по указанному пути. - В противном случае, если переменная
CMAKE_SYSROOTзадана и имеет вид<ndk>/platforms/android-<api>/arch-<arch>, часть<ndk>будет использована как значение дляCMAKE_ANDROID_NDK, и будет использован NDK. - В противном случае, если переменная
CMAKE_SYSROOTзадана и имеет вид<standalone-toolchain>/sysroot, часть<standalone-toolchain>будет использована как значение дляCMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован Standalone Toolchain. - В противном случае, если задана переменная CMake
ANDROID_NDK, она будет использована как значение дляCMAKE_ANDROID_NDK, и будет использован NDK. - В противном случае, если задана переменная CMake
ANDROID_STANDALONE_TOOLCHAIN, она будет использована как значение дляCMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован Standalone Toolchain. - В противном случае, если заданы переменные среды
ANDROID_NDK_ROOTилиANDROID_NDK, они будут использованы как значение дляCMAKE_ANDROID_NDK, и будет использован NDK. - В противном случае, если задана переменная среды
ANDROID_STANDALONE_TOOLCHAIN, она будет использована как значение дляCMAKE_ANDROID_STANDALONE_TOOLCHAIN, и будет использован Standalone Toolchain. - В противном случае, будет выдано сообщение об ошибке, что ни NDK, ни Standalone Toolchain не найдены.
Новое в версии 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 -
Установите в истинное значение, чтобы использовать устаревшие заголовки для каждого уровня 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 или watchOS
Для кросс-компиляции на iOS, tvOS или watchOS рекомендуется генератор Xcode. Генераторы Unix Makefiles или Ninja также могут быть использованы, но они требуют от проекта обработки дополнительных областей, таких как выбор целевого процессора и подписи кода.
Любая из трех систем может быть целевой путем установки переменной CMAKE_SYSTEM_NAME на значение из таблицы ниже. По умолчанию выбирается последняя версия Device SDK. Как и для всех платформ Apple, другую SDK (например, симулятор) можно выбрать, установив переменную CMAKE_OSX_SYSROOT, хотя это вряд ли потребуется (см. Переключение между устройством и симулятором ниже). Список доступных SDK можно получить, запустив xcodebuild -showsdks.
ОС | CMAKE_SYSTEM_NAME | Device SDK (по умолчанию) | SDK симулятора |
|---|---|---|---|
iOS | iOS | iphoneos | iphonesimulator |
tvOS | tvOS | appletvos | appletvsimulator |
watchOS | watchOS | watchos | watchsimulator |
Например, для создания конфигурации CMake для iOS достаточно следующей команды:
cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS
Переменная CMAKE_OSX_ARCHITECTURES может быть использована для установки архитектур как для устройства, так и для симулятора. Переменная CMAKE_OSX_DEPLOYMENT_TARGET может быть использована для установки целевого значения iOS/tvOS/watchOS.
Следующая конфигурация установит библиотеку iOS с 5 архитектурами и добавит флаги -miphoneos-version-min=9.3/-mios-simulator-version-min=9.3 к компилятору:
$ cmake -S. -B_builds -GXcode \
-DCMAKE_SYSTEM_NAME=iOS \
"-DCMAKE_OSX_ARCHITECTURES=armv7;armv7s;arm64;i386;x86_64" \
-DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \
-DCMAKE_INSTALL_PREFIX=`pwd`/_install \
-DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO \
-DCMAKE_IOS_INSTALL_COMBINED=YES
Пример:
# CMakeLists.txt cmake_minimum_required(VERSION 3.14) project(foo) add_library(foo foo.cpp) install(TARGETS foo DESTINATION lib)
Установка:
$ cmake --build _builds --config Release --target install
Проверка библиотеки:
$ lipo -info _install/lib/libfoo.a Architectures in the fat file: _install/lib/libfoo.a are: i386 armv7 armv7s x86_64 arm64
$ otool -l _install/lib/libfoo.a | grep -A2 LC_VERSION_MIN_IPHONEOS
cmd LC_VERSION_MIN_IPHONEOS
cmdsize 16
version 9.3
Подпись кода
Некоторые служебные файлы для платформ Apple требуют обязательной подписи кода. Если используется генератор Xcode, и подпись кода требуется или желательна, идентификатор разработчика можно указать через переменную CMake CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM. Этот идентификатор команды затем будет включён в сгенерированный проект Xcode. По умолчанию CMake избегает необходимости подписи кода во время внутренней фазы конфигурации (т. е. определение идентификатора компилятора и функций).
Переключение между устройством и симулятором
При конфигурировании для любой из встроенных платформ можно указать как реальные устройства, так и симулятор. Оба имеют свои отдельные SDK, но CMake поддерживает указание только одного SDK на стадии конфигурации. Это означает, что разработчик должен выбрать один из них во время конфигурации. При использовании генератора Xcode, это ограничение менее существенно, поскольку Xcode по-прежнему позволяет создавать приложения как для устройства, так и для симулятора, даже если конфигурация была выполнена только для одного из них. Внутри IDE Xcode сборка выполняется для выбранной платформы «назначения». При сборке из командной строки желаемый sdk можно указать напрямую, передав параметр -sdk в основному инструменту сборки (xcodebuild). Например:
$ cmake --build ... -- -sdk iphonesimulator
Обратите внимание, что проверки, выполненные во время конфигурации, проводились относительно SDK, используемого в момент конфигурации, и могут не выполняться для других SDK. Команды, такие как find_package(), find_library() и т.д., хранят и используют детали только для настроенного SDK/платформы, поэтому могут создавать проблемы при переключении между сборками для устройства и симулятора. Вы можете следовать следующим правилам, чтобы обеспечить совместную работу конфигурации для устройства и симулятора:
- Используйте явное
-lфлаг компоновщика, напримерtarget_link_libraries(foo PUBLIC "-lz") - Используйте явное
-frameworkфлаг компоновщика, напримерtarget_link_libraries(foo PUBLIC "-framework CoreFoundation") - Используйте
find_package()только для библиотек, установленных с помощью функцииCMAKE_IOS_INSTALL_COMBINED
© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.25/manual/cmake-toolchains.7.html