Spec-Zone.ru › CMake 3.17

cmake-generator-expressions(7)

  • Введение
  • Логические выражения генератора

    • Логические операторы
    • Сравнения строк
    • Запросы переменных
  • Строковые выражения генератора

    • Экранированные символы
    • Условные выражения
    • Преобразования строк
    • Запросы переменных
    • Запросы, зависящие от целевых объектов
    • Выражения, связанные с выводом
  • Отладка

Введение

Выражения генератора вычисляются во время генерации системы сборки, чтобы получить информацию, специфичную для каждой конфигурации сборки.

Выражения генератора разрешены в контексте многих свойств целевых объектов, таких как LINK_LIBRARIES, INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS и другие. Они также могут использоваться при использовании команд для заполнения этих свойств, таких как target_link_libraries(), target_include_directories(), target_compile_definitions() и другие.

Они позволяют условную компоновку, условные определения, используемые при компиляции, условные директории включения и многое другое. Условия могут основываться на конфигурации сборки, свойствах целевых объектов, информации о платформе или любой другой запрошиваемой информации.

Выражения генератора имеют вид $<...>. Чтобы избежать путаницы, эта страница отклоняется от большей части документации CMake, опуская угловые скобки <...> вокруг заготовок, таких как condition, string, target, среди прочих.

Выражения генератора могут быть вложенными, как показано в большинстве примеров ниже.

Логические выражения генератора

Логические выражения вычисляются либо как 0 или 1. Они обычно используются для построения условия в условном выражении генератора.

Доступные логические выражения:

Логические операторы

$<BOOL:string>

Преобразует string в 0 или 1. Вычисляется как 0 в случае, если истинно хотя бы одно из следующего:

  • string пусто,
  • string совпадает (без учёта регистра) с 0, FALSE, OFF, N, NO, IGNORE, или NOTFOUND, или
  • string оканчивается на суффикс -NOTFOUND (учитывая регистр).

В противном случае вычисляется как 1.

$<AND:conditions>

где conditions — список логических выражений, разделённых запятыми. Вычисляется как 1 если все условия — 1. В противном случае вычисляется как 0.

$<OR:conditions>

где conditions — список логических выражений, разделённых запятыми. Вычисляется как 1 если хотя бы одно из условий — 1. В противном случае вычисляется как 0.

$<NOT:condition>

0 если condition — 1, иначе 1.

Сравнения строк

$<STREQUAL:string1,string2>

1 если string1 и string2 равны, иначе 0. Сравнение учитывает регистр. Для сравнения без учёта регистра комбинируйте с выражением преобразования строки,

$<STREQUAL:$<UPPER_CASE:${foo}>,"BAR"> # "1" if ${foo} is any of "BAR", "Bar", "bar", ...
$<EQUAL:value1,value2>

1 если value1 и value2 численно равны, иначе 0.

$<IN_LIST:string,list>

1 если string является членом разнесённого по точкам с запятой списка list, иначе 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.

Запросы переменных

$<TARGET_EXISTS:target>

1 если target существует, иначе 0.

$<CONFIG:cfg>

1 если конфигурация равна cfg, иначе 0. Это сравнение не учитывает регистр. При вычислении выражения на свойстве объекта IMPORTED также учитывается отображение в MAP_IMPORTED_CONFIG_<CONFIG>.

$<PLATFORM_ID:platform_ids>

где platform_ids — список, разделенный запятыми. 1 если идентификатор платформы CMake совпадает с одним из элементов в platform_ids, в противном случае 0. См. также переменную CMAKE_SYSTEM_NAME.

$<C_COMPILER_ID:compiler_ids>

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake для компилятора C соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<CXX_COMPILER_ID:compiler_ids>

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake для компилятора C++ соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<CUDA_COMPILER_ID:compiler_ids>

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake для компилятора CUDA соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<OBJC_COMPILER_ID:compiler_ids>

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake для компилятора Objective-C соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<OBJCXX_COMPILER_ID:compiler_ids>

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake для компилятора Objective-C++ соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<Fortran_COMPILER_ID:compiler_ids>

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake для компилятора Fortran соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<C_COMPILER_VERSION:version>

1 если версия компилятора C соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CXX_COMPILER_VERSION:version>

1 если версия компилятора C++ соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CUDA_COMPILER_VERSION:version>

1 если версия компилятора C++ соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJC_COMPILER_VERSION:version>

1 если версия компилятора OBJC соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJCXX_COMPILER_VERSION:version>

1 если версия компилятора OBJCXX соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<Fortran_COMPILER_VERSION:version>

1 если версия компилятора Fortran соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<TARGET_POLICY:policy>

1 если policy был NEW при создании целевого объекта ‘head’, иначе 0. Если policy не задано, выведется сообщение об ошибке для политики. Это выражение генератора работает только для подмножества политик.

$<COMPILE_FEATURES:features>

где features — список, разделенный запятыми. Принимает значение 1 если все features доступны для целевого объекта ‘head’, и 0 в противном случае. Если это выражение используется при оценке реализации ссылки целевого объекта и если любой зависимый объект увеличивает требуемый C_STANDARD или CXX_STANDARD для целевого объекта ‘head’, выводится сообщение об ошибке. См. руководство cmake-compile-features(7) для получения информации о функциях компиляции и списка поддерживаемых компиляторов.

$<COMPILE_LANG_AND_ID:language,compiler_ids>

1 когда язык, используемый для компиляции модуля, соответствует language и идентификатор компилятора CMake для компилятора языка соответствует одному из элементов в compiler_ids, в противном случае 0. Это выражение является сокращенной формой комбинации $<COMPILE_LANGUAGE:language> и $<LANG_COMPILER_ID:compiler_ids>. Это выражение можно использовать для задания опций компиляции, определений компиляции и каталогов включения для исходных файлов конкретной комбинации языка и компилятора в целевом объекте. Например:

add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
target_compile_definitions(myapp
  PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:COMPILING_CXX_WITH_CLANG>
          $<$<COMPILE_LANG_AND_ID:CXX,Intel>:COMPILING_CXX_WITH_INTEL>
          $<$<COMPILE_LANG_AND_ID:C,Clang>:COMPILING_C_WITH_CLANG>
)

Это задаёт использование разных определений компиляции, основанных на идентификаторе компилятора и языке компиляции. В этом примере будет определено COMPILING_CXX_WITH_CLANG при использовании Clang как компилятора C++, и COMPILING_CXX_WITH_INTEL при использовании Intel как компилятора C++. Аналогично, при использовании Clang как компилятора C, будет видно только определение COMPILING_C_WITH_CLANG.

Без выражения генератора COMPILE_LANG_AND_ID тот же самый логический оператор был бы выражен как:

target_compile_definitions(myapp
  PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:AppleClang,Clang>>:COMPILING_CXX_WITH_CLANG>
          $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:Intel>>:COMPILING_CXX_WITH_INTEL>
          $<$<AND:$<COMPILE_LANGUAGE:C>,$<C_COMPILER_ID:Clang>>:COMPILING_C_WITH_CLANG>
)
$<COMPILE_LANGUAGE:languages>

1 когда язык, используемый для компиляции модуля, соответствует одному из элементов в languages, в противном случае 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,CUDA>:/opt/foo/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.

И вот два вложенных строковых выражения:

-I$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I>

генерирует строку записей в целевом свойстве INCLUDE_DIRECTORIES с каждой записью, предваряемой -I.

Развивая предыдущий пример, если сначала нужно проверить, является ли свойство INCLUDE_DIRECTORIES непустым, то рекомендуется ввести вспомогательную переменную для удобочитаемости кода:

set(prop "$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>") # helper variable
$<$<BOOL:${prop}>:-I$<JOIN:${prop}, -I>>

Доступны следующие генераторные выражения со строковым значением:

Символы с эскейпом

Строковые литералы для экранирования специального значения, которое символ может иметь в противном случае:

$<ANGLE-R>

Литеральный >. Используется, например, для сравнения строк, содержащих >.

$<COMMA>

Литеральный ,. Используется, например, для сравнения строк, содержащих ,.

$<SEMICOLON>

Литеральный ;. Используется для предотвращения расширения списка для аргумента с ;.

Условные выражения

Условные генераторные выражения зависят от булевого условия, которое должно быть 0 или 1.

$<condition:true_string>

Оценивается как true_string если condition является 1. В противном случае оценивается как пустая строка.

$<IF:condition,true_string,false_string>

Оценивается как true_string если condition является 1. В противном случае оценивается как false_string.

Обычно condition является генераторным выражением булевого типа. Например,

$<$<CONFIG:Debug>:DEBUG_MODE>

расширяется до DEBUG_MODE при использовании конфигурации Debug, и в противном случае расширяется до пустой строки.

Преобразования строк

$<JOIN:list,string>

Объединяет список с содержимым string.

$<REMOVE_DUPLICATES:list>

Удаляет повторяющиеся элементы в заданном list.

$<FILTER:list,INCLUDE|EXCLUDE,regex>

Включает или исключает элементы из list, которые соответствуют регулярному выражению regex.

$<LOWER_CASE:string>

Содержимое string преобразуется в нижний регистр.

$<UPPER_CASE:string>

Содержимое string преобразуется в верхний регистр.

$<GENEX_EVAL:expr>

Содержимое expr оценивается как генераторное выражение в текущем контексте. Это позволяет использовать генераторные выражения, результаты оценки которых сами являются генераторными выражениями.

$<TARGET_GENEX_EVAL:tgt,expr>

Содержимое expr оценивается как генераторное выражение в контексте целевого свойства 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>>
)

Запросы к переменным

$<CONFIG>

Имя конфигурации.

$<CONFIGURATION>

Имя конфигурации. Устарело начиная с CMake 3.0. Используйте 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.

$<CUDA_COMPILER_ID>

Идентификатор компилятора CMake используемого CUDA компилятора. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<OBJC_COMPILER_ID>

Идентификатор компилятора CMake используемого OBJC компилятора. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<OBJCXX_COMPILER_ID>

Идентификатор компилятора CMake используемого OBJC++ компилятора. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<Fortran_COMPILER_ID>

Идентификатор компилятора CMake используемого Fortran компилятора. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<C_COMPILER_VERSION>

Версия используемого C компилятора. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CXX_COMPILER_VERSION>

Версия используемого C++ компилятора. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CUDA_COMPILER_VERSION>

Версия используемого CUDA компилятора. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJC_COMPILER_VERSION>

Версия используемого OBJC компилятора. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJCXX_COMPILER_VERSION>

Версия используемого OBJC++ компилятора. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<Fortran_COMPILER_VERSION>

Версия используемого Fortran компилятора. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<COMPILE_LANGUAGE>

Язык компиляции файлов исходного кода при оценке опций компиляции. См. соответствующее булево выражение $<COMPILE_LANGUAGE:language> для заметок о переносимости этого генераторного выражения.

Запросы, зависящие от цели

$<TARGET_NAME_IF_EXISTS:tgt>

Расширяется до tgt , если заданный целевой объект существует, и до пустой строки в противном случае.

$<TARGET_FILE:tgt>

Полный путь к основному файлу (.exe, .so.1.2, .a), где tgt — имя целевого объекта.

$<TARGET_FILE_BASE_NAME:tgt>

Базовое имя основного файла, где tgt — имя целевого объекта.

Базовое имя соответствует имени файла целевого объекта (см. $<TARGET_FILE_NAME:tgt>) без префикса и суффикса. Например, если имя файла целевого объекта — libbase.so, базовое имя — base.

См. также свойства целевого объекта OUTPUT_NAME, ARCHIVE_OUTPUT_NAME, LIBRARY_OUTPUT_NAME и RUNTIME_OUTPUT_NAME и их конфигурационно-зависимые варианты OUTPUT_NAME_<CONFIG>, ARCHIVE_OUTPUT_NAME_<CONFIG>, LIBRARY_OUTPUT_NAME_<CONFIG> и RUNTIME_OUTPUT_NAME_<CONFIG>.

Также можно учитывать свойства целевого объекта <CONFIG>_POSTFIX и DEBUG_POSTFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.

$<TARGET_FILE_PREFIX:tgt>

Префикс основного файла, где tgt — имя целевого объекта.

См. также свойство целевого объекта PREFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.

$<TARGET_FILE_SUFFIX:tgt>

Суффикс основного файла, где tgt — имя целевого объекта.

Суффикс соответствует расширению файла (например, «.so» или «.exe»).

См. также свойство целевого объекта SUFFIX.

Обратите внимание, что 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_BASE_NAME:tgt>

Базовое имя файла, используемого для компоновки, где tgt — имя целевого объекта.

Базовое имя соответствует имени файла компоновщика целевого объекта (см. $<TARGET_LINKER_FILE_NAME:tgt>) без префикса и суффикса. Например, если имя файла целевого объекта — libbase.a, базовое имя — base.

См. также свойства целевого объекта OUTPUT_NAME, ARCHIVE_OUTPUT_NAME и LIBRARY_OUTPUT_NAME и их конфигурационно-зависимые варианты OUTPUT_NAME_<CONFIG>, ARCHIVE_OUTPUT_NAME_<CONFIG> и LIBRARY_OUTPUT_NAME_<CONFIG>.

Также можно учитывать свойства целевого объекта <CONFIG>_POSTFIX и DEBUG_POSTFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.

$<TARGET_LINKER_FILE_PREFIX:tgt>

Префикс файла, используемого для компоновки, где tgt — имя целевого объекта.

См. также свойства целевого объекта PREFIX и IMPORT_PREFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.

$<TARGET_LINKER_FILE_SUFFIX:tgt>

Суффикс файла, используемого для компоновки, где tgt — имя целевого объекта.

Суффикс соответствует расширению файла (например, «.so» или «.lib»).

См. также свойства целевого объекта SUFFIX и IMPORT_SUFFIX.

Обратите внимание, что 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_BASE_NAME:tgt>

Базовое имя файла базы данных программы компоновщика (.pdb), где tgt — имя целевого объекта.

Базовое имя соответствует имени файла PDB целевого объекта (см. $<TARGET_PDB_FILE_NAME:tgt>) без префикса и суффикса. Например, если имя файла целевого объекта — base.pdb, базовое имя — base.

См. также свойство целевого объекта PDB_NAME и его конфигурационно-зависимый вариант PDB_NAME_<CONFIG>.

Также можно учитывать свойства целевого объекта <CONFIG>_POSTFIX и DEBUG_POSTFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.

$<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), или когда вычисляется в INSTALL_NAME_DIR, и пустая в противном случае.

Выражения, связанные с выводом

$<TARGET_NAME:...>

Помечает ... как имя целевого объекта. Это необходимо при экспорте целевых объектов в несколько зависимых наборов экспорта. ... должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора.

$<LINK_ONLY:...>

Содержимое ... за исключением случаев вычисления в интерфейсе связи при распространении Требований к использованию зависимостей, в котором случае оно пустое. Предназначено для использования только в свойстве целевого объекта INTERFACE_LINK_LIBRARIES, возможно, через команду target_link_libraries(), для указания частных зависимостей привязки без других требований к использованию.

$<INSTALL_INTERFACE:...>

Содержимое ... при экспорте свойства с помощью install(EXPORT), и пустое в противном случае.

$<BUILD_INTERFACE:...>

Содержимое ... при экспорте свойства с помощью export(), или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае расширяется до пустой строки.

$<MAKE_C_IDENTIFIER:...>

Содержимое ... преобразованное в идентификатор языка C. Преобразование соответствует поведению команды string(MAKE_C_IDENTIFIER).

$<TARGET_OBJECTS:objLib>

Список объектов, полученных в результате сборки objLib.

$<SHELL_PATH:...>

Содержимое ... преобразованное в стиль пути оболочки. Например, слеши преобразуются в обратные слеши в оболочках Windows, а буквенные обозначения дисков преобразуются в пути POSIX в оболочках MSYS. ... должно быть абсолютным путем. ... может быть списком, разделенным точкой с запятой путей, в этом случае каждый путь преобразуется индивидуально, а результирующий список генерируется с использованием разделителя путей оболочки (: в POSIX и ; в Windows). Убедитесь, что аргумент, содержащий этот genex, заключён в двойные кавычки в коде CMake, чтобы ; не разделял аргументы.

Отладка

Поскольку выражения генератора вычисляются во время генерации системы сборки, а не во время обработки файлов CMakeLists.txt, невозможно просмотреть их результат с помощью команды message().

Один из возможных способов генерирования сообщений отладки — добавление пользовательского целевого объекта,

add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")

Команда оболочки make genexdebug (выполняемая после выполнения cmake) затем выведет результат $<...>.

Другой способ — запись сообщений отладки в файл:

file(GENERATE OUTPUT filename CONTENT "$<...>")

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

Spec-Zone.ru

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