Spec-Zone.ru › CMake 3.8

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 равно STREQUAL b, иначе 0
$<EQUAL:a,b>
1 если a равно EQUAL b в числовом сравнении, иначе 0
$<CONFIG:cfg>
1 если конфигурация равна cfg, иначе 0. Это сравнение нечувствительно к регистру. Сопоставление в MAP_IMPORTED_CONFIG_<CONFIG> также учитывается этим выражением при оценке свойства на целевом объекте IMPORTED.
$<PLATFORM_ID:comp>
1 если идентификатор платформы CMake соответствует comp, в противном случае 0.
$<C_COMPILER_ID:comp>
1 если идентификатор компилятора C CMake соответствует comp, в противном случае 0.
$<CXX_COMPILER_ID:comp>
1 если идентификатор компилятора C++ CMake соответствует 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 foo.c)
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/ и т.д., в зависимости от идентификатора компилятора.

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

$<$<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_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>
Литеральная строка ,. Используется для сравнения строк, которые содержат, например, ,.
,
Литеральная строка ;. Используется для предотвращения расширения списка для аргумента с ;.
$<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. Это выражение может использоваться только в источниках команд add_library() и add_executable().
$<SHELL_PATH:...>
Содержание ... преобразованное в стиль пути оболочки. Например, косые черты преобразуются в обратные косые черты в оболочках Windows, а буквенные обозначения дисков преобразуются в пути POSIX в оболочках MSYS. ... должен быть абсолютным путем.

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

Spec-Zone.ru

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