Spec-Zone.ru › CMake 3.5

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
$<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 если идентификатор CMake компилятора C соответствует comp, иначе 0.
$<CXX_COMPILER_ID:comp>
1 если идентификатор CMake компилятора C++ соответствует comp, иначе 0.
$<VERSION_GREATER:v1,v2>
1 если v1 — версия больше, чем v2, иначе 0.
$<VERSION_LESS:v1,v2>
1 если v1 — версия меньше, чем v2, иначе 0.
$<VERSION_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 была новой при создании целевого объекта «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. Это выражение используется для указания опций компиляции для исходных файлов определенного языка в целевом объекте. Например, для указания использования опции компиляции %%%CODE_BLOCK_101%% (проверки идентификатора компилятора опущены):

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>
Литеральная строка ,. Используется для сравнения строк, которые содержат, например, ,
$<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. Это выражение может быть использовано только в источниках команд 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.5/manual/cmake-generator-expressions.7.html

Spec-Zone.ru

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