Spec-Zone.ru › CMake 3.6

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

Spec-Zone.ru

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