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