Spec-Zone.ru › CMake 3.12

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
$<IN_LIST:a,b>
1 если a находится в списке b, иначе 0
$<TARGET_EXISTS:tgt>
1 если tgt является существующим именем целевого объекта, иначе 0.
$<CONFIG:cfg>
1 если конфигурация cfg, иначе 0. Это сравнение регистронезависимое. Сопоставление в MAP_IMPORTED_CONFIG_<CONFIG> также учитывается этим выражением при оценке свойства на целевом объекте IMPORTED.
$<PLATFORM_ID:comp>
1 если идентификатор платформы CMake соответствует comp, в противном случае 0.
$<C_COMPILER_ID:comp>
1 если идентификатор компилятора C соответствует comp, в противном случае 0.
$<CXX_COMPILER_ID:comp>
1 если идентификатор компилятора 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 была новой при создании целевого объекта «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. Это выражение может быть использовано для указания параметров компиляции, определений компиляции и каталогов включения для исходных файлов определённого языка в целевом объекте. Например:

add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
target_compile_options(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
)
target_compile_definitions(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX>
          $<$<COMPILE_LANGUAGE:CUDA>:COMPILING_CUDA>
)
target_include_directories(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/opt/foo/cxx_headers>
)

Это задаёт использование параметра компиляции -fno-exceptions, определение компиляции COMPILING_CXX и каталог включения cxx_headers только для C++. Также задано определение компиляции COMPILING_CUDA для CUDA.

Обратите внимание, что с Генераторами Visual Studio и Xcode нет способа представить определения компиляции или каталоги включения для всего целевого объекта отдельно для C и CXX языков. Также с Генераторами Visual Studio нет способа представить флаги для всего целевого объекта отдельно для C и CXX языков. В этих генераторах выражения для исходных файлов C и C++ будут вычислены с использованием CXX если есть какие-либо исходные файлы C++, в противном случае с использованием C. Обходной путь - создать отдельные библиотеки для каждого языка исходных файлов:

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)

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

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

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_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:...>
Помечает ... как имя целевого объекта. Это необходимо, если целевые объекты экспортируются в несколько зависимых наборов экспорта. ... должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора.
$<TARGET_NAME_IF_EXISTS:...>
Расширяется до ... , если целевой объект существует, и до пустой строки в противном случае.
$<LINK_ONLY:...>
Содержимое ..., за исключением случаев, когда оно оценивается в интерфейсе компоновки при распространении Требований к использованию зависимых объектов, в этом случае это пустая строка. Предназначено только для использования в свойстве целевого объекта INTERFACE_LINK_LIBRARIES, возможно, с помощью команды target_link_libraries(), для указания частных зависимостей компоновки без других требований к использованию.
$<INSTALL_INTERFACE:...>
Содержимое ... при экспорте свойства с помощью install(EXPORT), и пустое значение в противном случае.
$<BUILD_INTERFACE:...>
Содержимое ... при экспорте свойства с помощью export() или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае расширяется до пустой строки.
$<LOWER_CASE:...>
Содержимое ... в нижнем регистре.
$<UPPER_CASE:...>
Содержимое ... в верхнем регистре.
$<MAKE_C_IDENTIFIER:...>
Содержимое ... преобразованное в идентификатор C. Преобразование происходит по тому же принципу, что и в string(MAKE_C_IDENTIFIER).
$<TARGET_OBJECTS:objLib>
Список объектов, полученных в результате сборки objLib. objLib должен быть объектом типа OBJECT_LIBRARY.
$<SHELL_PATH:...>
Содержимое ... преобразованное в стиль пути оболочки. Например, косые черты преобразуются в обратные косые черты в оболочках Windows, а имена дисков преобразуются в пути POSIX в оболочках MSYS. ... должен быть абсолютным путем.
$<GENEX_EVAL:...>
Содержимое ... вычисленное как выражение генератора в текущем контексте. Это позволяет использовать выражения генератора, результаты вычисления которых сами по себе являются выражениями генератора.
$<TARGET_GENEX_EVAL:tgt,...>

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

Возможность вычисления выражений генератора очень полезна, когда вы хотите управлять пользовательскими свойствами, поддерживающими выражения генератора. Например:

add_library(foo ...)

set_property(TARGET foo PROPERTY
  CUSTOM_KEYS $<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS>
)

add_custom_target(printFooKeys
  COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:foo,CUSTOM_KEYS>
)

Эта примитивная реализация пользовательской команды printFooKeys неверна, потому что свойство целевого объекта CUSTOM_KEYS не вычисляется и содержимое передается как есть (т.е. $<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS>).

Чтобы получить ожидаемый результат (т.е. FOO_EXTRA_THINGS, если конфигурация Debug ), необходимо вычислить вывод $<TARGET_PROPERTY:foo,CUSTOM_KEYS>:

add_custom_target(printFooKeys
  COMMAND ${CMAKE_COMMAND} -E
    echo $<TARGET_GENEX_EVAL:foo,$<TARGET_PROPERTY:foo,CUSTOM_KEYS>>
)

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

Spec-Zone.ru

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