Spec-Zone.ru › CMake 3.15

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 в соответствии с правилами команды if(). Вычисляется к 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.

$<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.

$<Fortran_COMPILER_VERSION:version>

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

$<TARGET_POLICY:policy>

1 если policy был новым при создании целевого объекта ‘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.

$<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.

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

Output-Related Expressions

$<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.15/manual/cmake-generator-expressions.7.html

Spec-Zone.ru

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