Spec-Zone.ru › CMake 3.11

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
$<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_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. Это выражение можно использовать для указания опций компиляции, определений компиляции и каталогов включения для исходных файлов определенного языка в цели. Например:

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:...>
Помечает ... как имя целевого объекта. Это необходимо при экспорте целевых объектов в несколько зависимых наборов экспорта. ... должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора.
$<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.11/manual/cmake-generator-expressions.7.html

Spec-Zone.ru

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