Spec-Zone.ru › CMake 3.6

cmake-toolchains(7)

  • Введение
  • Языки
  • Переменные и свойства
  • Функциональные возможности инструментальной цепочки
  • Кросс-компиляция
    • Кросс-компиляция для Linux
    • Кросс-компиляция для среды Cray Linux
    • Кросс-компиляция с использованием Clang
    • Кросс-компиляция для QNX
    • Кросс-компиляция для Windows CE
    • Кросс-компиляция для универсальных приложений Windows 10
    • Кросс-компиляция для Windows Phone
    • Кросс-компиляция для магазина Windows
    • Кросс-компиляция с использованием NVIDIA Nsight Tegra

Введение

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

Языки

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

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

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

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

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

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

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

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

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

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

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

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

Переменная CMAKE_SYSTEM_NAME — это идентификатор CMake целевой платформы, для которой выполняется сборка.

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

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

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

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

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

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

Компиляция для вычислительных узлов в среде Cray Linux может выполняться без необходимости отдельного файла toolchain. Указание -DCMAKE_SYSTEM_NAME=CrayLinuxEnvironment в командной строке CMake обеспечит конфигурацию соответствующих настроек сборки и путей поиска. Платформа будет получать конфигурацию из текущих переменных окружения и будет настраивать проект для использования обёртки компилятора из модулей PrgEnv-* среды программирования Cray, если они присутствуют и загружены.

По умолчанию среда программирования 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})

Аналогично, некоторые компиляторы не поставляют собственных дополнительных утилит, таких как компоновщики, но предоставляют способ указать расположение внешнего toolchain, который будет использоваться драйвером компилятора. Переменная CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN может быть установлена в файле 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})

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

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

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

set(CMAKE_SYSTEM_NAME WindowsCE)

set(CMAKE_SYSTEM_VERSION 8.0)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_GENERATOR_TOOLSET CE800) # Can be omitted for 8.0
set(CMAKE_GENERATOR_PLATFORM SDK_AM335X_SK_WEC2013_V310)

Переменная CMAKE_GENERATOR_PLATFORM сообщает генератору, какой SDK использовать. Далее CMAKE_SYSTEM_VERSION сообщает генератору, какую версию Windows CE использовать. В настоящее время поддерживается версия 8.0 (Windows Embedded Compact 2013) «из коробки». Для других версий может потребоваться установить CMAKE_GENERATOR_TOOLSET в нужное значение.

Кросс-компиляция для универсальных приложений Windows 10

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

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 10.0)

Универсальное приложение Windows 10 нацелено как на магазин Windows, так и на Windows Phone. Установите переменную CMAKE_SYSTEM_VERSION в значение 10.0, чтобы собрать с последней доступной версией Windows 10 SDK. Укажите более конкретную версию (например, 10.0.10240.0 для RTM), чтобы собрать с соответствующим SDK.

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

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

set(CMAKE_SYSTEM_NAME WindowsPhone)
set(CMAKE_SYSTEM_VERSION 8.1)

Кросс-компиляция для магазина Windows

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

set(CMAKE_SYSTEM_NAME WindowsStore)
set(CMAKE_SYSTEM_VERSION 8.1)

Кросс-компиляция с использованием NVIDIA Nsight Tegra

Файл toolchain для настройки генератора Visual Studio для сборки с использованием NVIDIA Nsight Tegra, нацеленного на Android, может выглядеть так:

set(CMAKE_SYSTEM_NAME Android)

Переменная CMAKE_GENERATOR_TOOLSET может быть установлена для выбора значения «Версия toolchain» Nsight Tegra.

См. также свойства целевых объектов:

  • ANDROID_ANT_ADDITIONAL_OPTIONS
  • ANDROID_API_MIN
  • ANDROID_API
  • ANDROID_ARCH
  • ANDROID_ASSETS_DIRECTORIES
  • ANDROID_GUI
  • ANDROID_JAR_DEPENDENCIES
  • ANDROID_JAR_DIRECTORIES
  • ANDROID_JAVA_SOURCE_DIR
  • ANDROID_NATIVE_LIB_DEPENDENCIES
  • ANDROID_NATIVE_LIB_DIRECTORIES
  • ANDROID_PROCESS_MAX
  • ANDROID_PROGUARD_CONFIG_PATH
  • ANDROID_PROGUARD
  • ANDROID_SECURE_PROPS_PATH
  • ANDROID_SKIP_ANT_STEP
  • ANDROID_STL_TYPE

© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.6/manual/cmake-toolchains.7.html

Spec-Zone.ru

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