Spec-Zone.ru › CMake 3.9

cmake-generator-expressions(7)

  • Введение
  • Логические выражения
  • Информационные выражения
  • Выражения вывода

Введение

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

Выражения генератора допускаются в контексте многих свойств целей, таких как LINK_LIBRARIES, INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS и другие. Они также могут использоваться при использовании команд для заполнения этих свойств, таких как target_link_libraries(), target_include_directories(), target_compile_definitions() и другие.

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

Логические выражения

Логические выражения используются для создания условного вывода. Основные выражения — это 0 и 1 выражения. Поскольку другие логические выражения оцениваются либо в 0 или 1, они могут быть объединены для создания условного вывода:

$<$<CONFIG:Debug>:DEBUG_MODE>

расширяется до DEBUG_MODE при использовании конфигурации Debug, в противном случае расширяется до пустой строки.

Доступные логические выражения:

$<BOOL:...>
1 если ... истинно, иначе 0
$<AND:?[,?]...>

1 если все ? являются 1, иначе 0

? должно всегда быть либо 0, либо 1 в логических выражениях.

$<OR:?[,?]...>
0 если все ? являются 0, иначе 1
$<NOT:?>
0 если ? является 1, иначе 1
$<IF:?,true-value...,false-value...>`
true-value... если ? является 1, false-value... если ? является 0
$<STREQUAL:a,b>
1 если a равно b, иначе 0
$<EQUAL:a,b>
1 если a равно b в численном сравнении, иначе 0
$<CONFIG:cfg>
1 если конфигурация равна cfg, иначе 0. Это сравнение не учитывает регистр. Сопоставление в MAP_IMPORTED_CONFIG_<CONFIG> также учитывается этим выражением при оценке свойства на цели IMPORTED.
$<PLATFORM_ID:comp>
1 если идентификатор CMake платформы соответствует comp, иначе 0.
$<C_COMPILER_ID:comp>
1 если идентификатор CMake компилятора C соответствует comp, иначе 0.
$<CXX_COMPILER_ID:comp>
1 если идентификатор CMake компилятора C++ соответствует comp, иначе 0.
$<VERSION_LESS:v1,v2>
1 если v1 версия меньше v2, иначе 0.
$<VERSION_GREATER:v1,v2>
1 если v1 версия больше v2, иначе 0.
$<VERSION_EQUAL:v1,v2>
1 если v1 версия такая же, как у v2, иначе 0.
$<VERSION_LESS_EQUAL:v1,v2>
1 если v1 версия меньше или равна v2, иначе 0.
$<VERSION_GREATER_EQUAL:v1,v2>
1 если v1 версия больше или равна v2, иначе 0.
$<C_COMPILER_VERSION:ver>
1 если версия компилятора C соответствует ver, иначе 0.
$<CXX_COMPILER_VERSION:ver>
1 если версия компилятора C++ соответствует ver, иначе 0.
$<TARGET_POLICY:pol>
1 если политика pol была NEW при создании цели «head», иначе 0. Если политика не была установлена, будет выведено предупреждение для политики. Это выражение генератора работает только для подмножества политик.
$<COMPILE_FEATURES:feature[,feature]...>
1 если все возможности feature доступны для цели «head», и 0 в противном случае. Если это выражение используется при оценке реализации линковки цели, и если какая-либо зависимость транзитивно увеличивает требуемый C_STANDARD или CXX_STANDARD для цели «head», то выдаётся ошибка. См. руководство cmake-compile-features(7) для получения информации о компиляционных функциях и списка поддерживаемых компиляторов.
$<COMPILE_LANGUAGE:lang>

1 когда язык, используемый для блока компиляции, соответствует lang, иначе 0. Это выражение используется для указания опций компиляции для исходных файлов определённого языка в цели. Например, для указания использования опции компиляции -fno-exceptions (проверки идентификатора компилятора опущены):

add_executable(myapp main.cpp foo.c bar.cpp)
target_compile_options(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
)

Это выражение генератора имеет ограниченное применение, так как его нельзя использовать с генераторами Visual Studio. Переносимые системы сборки не будут использовать это выражение и будут создавать отдельные библиотеки для каждого языка исходного файла:

add_library(myapp_c foo.c)
add_library(myapp_cxx bar.cpp)
target_compile_options(myapp_cxx PUBLIC -fno-exceptions)
add_executable(myapp main.cpp)
target_link_libraries(myapp myapp_c myapp_cxx)

Генераторы на основе Makefile и Ninja также могут использовать это выражение для указания определений и каталогов включения, специфичных для языка компиляции:

add_executable(myapp main.cpp foo.c bar.cpp)
target_compile_definitions(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX>
)
target_include_directories(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/opt/foo/cxx_headers>
)

Информационные выражения

Эти выражения расширяются до некоторой информации. Информация может использоваться непосредственно, например:

include_directories(/usr/include/$<CXX_COMPILER_ID>/)

расширяется до /usr/include/GNU/ или /usr/include/Clang/ и т.д., в зависимости от Id компилятора.

Эти выражения также могут быть объединены с логическими выражениями:

$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,4.2.0>:OLD_COMPILER>

расширяется до OLD_COMPILER если CMAKE_CXX_COMPILER_VERSION меньше 4.2.0.

Доступные информационные выражения:

$<CONFIGURATION>
Имя конфигурации. Устарело. Используйте CONFIG вместо него.
$<CONFIG>
Имя конфигурации
$<PLATFORM_ID>
CMake-идентификатор платформы. См. также переменную CMAKE_SYSTEM_NAME.
$<C_COMPILER_ID>
CMake-идентификатор используемого компилятора C. См. также переменную CMAKE_<LANG>_COMPILER_ID.
$<CXX_COMPILER_ID>
CMake-идентификатор используемого компилятора C++. См. также переменную CMAKE_<LANG>_COMPILER_ID.
$<C_COMPILER_VERSION>
Версия используемого компилятора C. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.
$<CXX_COMPILER_VERSION>
Версия используемого компилятора C++. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.
$<TARGET_FILE:tgt>
Полный путь к основному файлу (.exe, .so.1.2, .a), где tgt — имя целевого объекта.
$<TARGET_FILE_NAME:tgt>
Имя основного файла (.exe, .so.1.2, .a).
$<TARGET_FILE_DIR:tgt>
Директория основного файла (.exe, .so.1.2, .a).
$<TARGET_LINKER_FILE:tgt>
Файл, используемый для линковки (.a, .lib, .so), где tgt — имя целевого объекта.
$<TARGET_LINKER_FILE_NAME:tgt>
Имя файла, используемого для линковки (.a, .lib, .so).
$<TARGET_LINKER_FILE_DIR:tgt>
Директория файла, используемого для линковки (.a, .lib, .so).
$<TARGET_SONAME_FILE:tgt>
Файл с soname (.so.3), где tgt — имя целевого объекта.
$<TARGET_SONAME_FILE_NAME:tgt>
Имя файла с soname (.so.3).
$<TARGET_SONAME_FILE_DIR:tgt>
Директория файла с soname (.so.3).
$<TARGET_PDB_FILE:tgt>

Полный путь к файлу базы данных сгенерированной линковкой (.pdb), где tgt — имя целевого объекта.

См. также целевые свойства PDB_NAME и PDB_OUTPUT_DIRECTORY и их конфигурационно-специфичные варианты PDB_NAME_<CONFIG> и PDB_OUTPUT_DIRECTORY_<CONFIG>.

$<TARGET_PDB_FILE_NAME:tgt>
Имя сгенерированного линковкой файла базы данных (.pdb).
$<TARGET_PDB_FILE_DIR:tgt>
Директория сгенерированного линковкой файла базы данных (.pdb).
$<TARGET_BUNDLE_DIR:tgt>
Полный путь к каталогу пакета (my.app, my.framework, или my.bundle) где tgt — имя целевого объекта.
$<TARGET_BUNDLE_CONTENT_DIR:tgt>
Полный путь к каталогу содержимого пакета, где tgt - имя целевого объекта. Для macOS SDK это ведёт к my.app/Contents, my.framework, или my.bundle/Contents. Для всех других SDK (например, iOS) это ведёт к my.app, my.framework, или my.bundle, из-за плоской структуры пакета.
$<TARGET_PROPERTY:tgt,prop>

Значение свойства prop для целевого объекта tgt.

Обратите внимание, что tgt не добавляется в качестве зависимости к целевому объекту, для которого вычисляется это выражение.

$<TARGET_PROPERTY:prop>
Значение свойства prop для целевого объекта, на котором вычисляется выражение генератора.
$<INSTALL_PREFIX>
Содержание префикса установки, когда целевой объект экспортируется через install(EXPORT), и пустая строка в противном случае.
$<COMPILE_LANGUAGE>
Язык компиляции исходных файлов при оценке опций компиляции. См. унарную версию для примечаний о переносимости этого выражения генератора.

Выражения вывода

Эти выражения генерируют вывод, в некоторых случаях в зависимости от входных данных. Эти выражения могут быть объединены с другими выражениями для получения информации или логического сравнения:

-I$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I>

генерирует строку элементов в свойстве целевого объекта INCLUDE_DIRECTORIES, причём каждый элемент предваряется -I. Обратите внимание, что более полное использование в этой ситуации потребовало бы предварительной проверки на то, пусто ли свойство INCLUDE_DIRECTORIES:

$<$<BOOL:${prop}>:-I$<JOIN:${prop}, -I>>

где ${prop} относится к вспомогательной переменной:

set(prop "$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>")

Доступные выражения вывода:

$<0:...>
Пустая строка (игнорирует ...)
$<1:...>
Содержимое ...
$<JOIN:list,...>
Объединяет список с содержимым ...
$<ANGLE-R>
Литеральная >. Используется для сравнения строк, содержащих >, например.
$<COMMA>
Литеральная ,. Используется для сравнения строк, содержащих ,, например.
$<SEMICOLON>
Литеральная ;. Используется для предотвращения расширения списка при аргументе с ;.
$<TARGET_NAME:...>
Помечает ... как имя целевого объекта. Это необходимо при экспорте целевых объектов в несколько зависимых наборов экспорта. ... должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора.
$<LINK_ONLY:...>
Содержимое ... за исключением случаев, когда оно вычисляется в интерфейсе линковки при распространении Требований использования зависимостей, в этом случае — пустая строка. Предназначено только для использования в свойстве целевого объекта INTERFACE_LINK_LIBRARIES, возможно, через команду target_link_libraries(), для указания приватных зависимостей линковки без других требований к использованию.
$<INSTALL_INTERFACE:...>
Содержимое ... при экспорте свойства с помощью install(EXPORT), и пустая строка в противном случае.
$<BUILD_INTERFACE:...>
Содержимое ... при экспорте свойства с помощью export() или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае расширяется до пустой строки.
$<LOWER_CASE:...>
Содержимое ... в нижнем регистре.
$<UPPER_CASE:...>
Содержимое ... в верхнем регистре.
$<MAKE_C_IDENTIFIER:...>
Содержимое ... преобразованное в идентификатор C.
$<TARGET_OBJECTS:objLib>
Список объектов, полученных в результате сборки objLib. objLib должен быть объектом типа OBJECT_LIBRARY.
$<SHELL_PATH:...>
Содержимое ... преобразованное в стиль пути оболочки. Например, слеши преобразуются в обратные слеши в оболочках Windows, а символы дисков преобразуются в пути POSIX в оболочках MSYS. ... должен быть абсолютным путём.

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

Spec-Zone.ru

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