Spec-Zone.ru › CMake 3.13

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 равно 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. См. также переменную CMAKE_SYSTEM_NAME.
$<C_COMPILER_ID:comp>
1 если идентификатор компилятора C CMake соответствует comp, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.
$<CXX_COMPILER_ID:comp>
1 если идентификатор компилятора C++ CMake соответствует comp, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.
$<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. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.
$<CXX_COMPILER_VERSION:ver>
1 если версия компилятора C++ соответствует ver, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.
$<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>
Файл с именем сонаме (.so.3), где tgt — имя целевого объекта.
$<TARGET_SONAME_FILE_NAME:tgt>
Имя файла с именем сонаме (.so.3).
$<TARGET_SONAME_FILE_DIR:tgt>
Директория файла с именем сонаме (.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 — имя целевого объекта. Для SDK macOS он указывает на 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.13/manual/cmake-generator-expressions.7.html

Spec-Zone.ru

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