Spec-Zone.ru › CMake 3.10

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 равно 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 если идентификатор компилятора 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 была NEW при создании целевого объекта ‘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 bar.cpp)
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>
Идентификатор C-компилятора CMake, используемого. См. также переменную CMAKE_<LANG>_COMPILER_ID.
$<CXX_COMPILER_ID>
Идентификатор C++-компилятора CMake, используемого. См. также переменную 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:...>
Помечает ... как имя целевого объекта. Это необходимо при экспорте целевых объектов в несколько зависимых наборов экспорта. ... должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора.
$<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.
$<SHELL_PATH:...>
Содержимое ... преобразованное в стиле пути оболочки. Например, косые черты преобразуются в обратные косые черты в оболочках Windows, а буквы диска преобразуются в пути POSIX в оболочках MSYS. ... должно быть абсолютным путем.

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

Spec-Zone.ru

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