Spec-Zone.ru › CMake 3.7

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

Spec-Zone.ru

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