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> -
Новое в версии 3.12.
Возвращает
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> -
Новое в версии 3.7.
Возвращает
1, еслиv1меньше или равно версииv2, иначе0.
-
$<VERSION_GREATER_EQUAL:v1,v2> -
Новое в версии 3.7.
Возвращает
1, еслиv1больше или равно версииv2, иначе0.
Запросы переменных
-
$<TARGET_EXISTS:target> -
Новое в версии 3.12.
Возвращает
1, еслиtargetсуществует, иначе0.
-
$<CONFIG:cfgs> -
Возвращает
1, если конфигурация совпадает с любой из записей в списке, разделённом запятымиcfgs, иначе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, если идентификатор компилятора C CMake соответствует любой записи в спискеcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<CXX_COMPILER_ID:compiler_ids> -
где
compiler_idsпредставляет собой список, разделённый запятыми. Возвращает1, если идентификатор компилятора C++ CMake соответствует любой записи в спискеcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<CUDA_COMPILER_ID:compiler_ids> -
Новое в версии 3.15.
где
compiler_idsпредставляет собой список, разделённый запятыми. Возвращает1, если идентификатор компилятора CUDA CMake соответствует любой записи в спискеcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<OBJC_COMPILER_ID:compiler_ids> -
Новое в версии 3.16.
где
compiler_idsпредставляет собой список, разделённый запятыми. Возвращает1, если идентификатор компилятора Objective-C CMake соответствует любой записи в спискеcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<OBJCXX_COMPILER_ID:compiler_ids> -
Добавлено в версии 3.16.
где
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.
-
$<HIP_COMPILER_ID:compiler_ids> -
где
compiler_ids— список, разделённый запятыми.1если идентификатор компилятора CMake для компилятора HIP совпадает с любым из элементов вcompiler_ids, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<ISPC_COMPILER_ID:compiler_ids> -
Добавлено в версии 3.19.
где
compiler_ids— список, разделённый запятыми.1если идентификатор компилятора CMake для компилятора ISPC совпадает с любым из элементов вcompiler_ids, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<C_COMPILER_VERSION:version> -
1если версия компилятора C совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<CXX_COMPILER_VERSION:version> -
1если версия компилятора CXX совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<CUDA_COMPILER_VERSION:version> -
Добавлено в версии 3.15.
1если версия компилятора CXX совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<OBJC_COMPILER_VERSION:version> -
Добавлено в версии 3.16.
1если версия компилятора OBJC совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<OBJCXX_COMPILER_VERSION:version> -
Добавлено в версии 3.16.
1если версия компилятора OBJCXX совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<Fortran_COMPILER_VERSION:version> -
1если версия компилятора Fortran совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<HIP_COMPILER_VERSION:version> -
1если версия компилятора HIP совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<ISPC_COMPILER_VERSION:version> -
Добавлено в версии 3.19.
1если версия компилятора ISPC совпадает сversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<TARGET_POLICY:policy> -
1еслиpolicyбыло NEW при создании целевого объекта 'head', иначе0. Еслиpolicyне было установлено, будет выведено сообщение об ошибке для политики. Этот генератор выражения работает только для подмножества политик.
-
$<COMPILE_FEATURES:features> -
Добавлено в версии 3.1.
где
features— список, разделённый запятыми. Оценивается как1если всеfeaturesдоступны для целевого объекта 'head', и как0в противном случае. Если это выражение используется при оценке реализации ссылки на целевой объект, и если любой зависимости по цепочке увеличивает требуемое значениеC_STANDARDилиCXX_STANDARDдля целевого объекта 'head', то будет выдано сообщение об ошибке. См. руководствоcmake-compile-features(7)для получения информации о компиляционных функциях и списка поддерживаемых компиляторов.
-
$<COMPILE_LANG_AND_ID:language,compiler_ids> -
Добавлено в версии 3.15.
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 в качестве компилятора CXX, иCOMPILING_CXX_WITH_INTELпри использовании Intel в качестве компилятора CXX. Аналогично, когда компилятор C — Clang, будет видна только опция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> -
Добавлено в версии 3.3.
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)
-
$<LINK_LANG_AND_ID:language,compiler_ids> -
Новое в версии 3.18.
Возвращает значение «истина» если язык, используемый для шага линковки, совпадает с
language, а идентификатор компилятора CMake для линкера языка совпадает с любым из записей вcompiler_ids, в противном случае0. Данное выражение является сокращённой формой комбинации$<LINK_LANGUAGE:language>и$<LANG_COMPILER_ID:compiler_ids>. Это выражение может использоваться для указания библиотек линковки, опций линковки, директорий линковки и зависимостей линковки для конкретной комбинации языка и линкера в целевом объекте. Например:add_library(libC_Clang ...) add_library(libCXX_Clang ...) add_library(libC_Intel ...) add_library(libCXX_Intel ...) add_executable(myapp main.c) if (CXX_CONFIG) target_sources(myapp PRIVATE file.cxx) endif() target_link_libraries(myapp PRIVATE $<$<LINK_LANG_AND_ID:CXX,Clang,AppleClang>:libCXX_Clang> $<$<LINK_LANG_AND_ID:C,Clang,AppleClang>:libC_Clang> $<$<LINK_LANG_AND_ID:CXX,Intel>:libCXX_Intel> $<$<LINK_LANG_AND_ID:C,Intel>:libC_Intel>)Это указывает на использование различных библиотек линковки на основе как идентификатора компилятора, так и языка линковки. В этом примере целевой объект
libCXX_Clangбудет зависимостью линковки, когдаClangилиAppleClangявляется линковщикомCXX, иlibCXX_Intel, когдаIntelявляется линковщикомCXX. Аналогично, когда линковщикCравенClangилиAppleClang, целевой объектlibC_Clangбудет добавлен как зависимость линковки, иlibC_Intel, когдаIntelявляется линковщикомC.См. примечание по
$<LINK_LANGUAGE:language>для ограничений по использованию этого генератора выражения.
-
$<LINK_LANGUAGE:languages> -
Новое в версии 3.18.
Возвращает значение «истина», если язык, используемый для шага линковки, совпадает с любым из записей в
languages, в противном случае0. Это выражение может использоваться для указания библиотек линковки, опций линковки, директорий линковки и зависимостей линковки для конкретного языка в целевом объекте. Например:add_library(api_C ...) add_library(api_CXX ...) add_library(api INTERFACE) target_link_options(api INTERFACE $<$<LINK_LANGUAGE:C>:-opt_c> $<$<LINK_LANGUAGE:CXX>:-opt_cxx>) target_link_libraries(api INTERFACE $<$<LINK_LANGUAGE:C>:api_C> $<$<LINK_LANGUAGE:CXX>:api_CXX>) add_executable(myapp1 main.c) target_link_options(myapp1 PRIVATE api) add_executable(myapp2 main.cpp) target_link_options(myapp2 PRIVATE api)Это указывает на использование целевого объекта
apiдля линковки целевых объектовmyapp1иmyapp2. На практике,myapp1будет линковаться с целевым объектомapi_Cи опцией-opt_c, поскольку он будет использоватьCкак язык линковки. Иmyapp2будет линковаться сapi_CXXи опцией-opt_cxx, посколькуCXXбудет языком линковки.Примечание
Для определения языка линковки целевого объекта требуется собрать, транзитивно, все целевые объекты, которые будут линковаться с ним. Таким образом, для свойств библиотек линковки будет выполнено двойное вычисление. Во время первого вычисления, выражения
$<LINK_LANGUAGE:..>всегда вернут0. Язык линковки, вычисленный после этого первого прохода, будет использован для второго прохода. Для предотвращения несоответствий, необходимо, чтобы второй проход не менял язык линковки. Кроме того, для предотвращения непредвиденных побочных эффектов, требуется указывать полные сущности в качестве части выражения$<LINK_LANGUAGE:..>. Например:add_library(lib STATIC file.cxx) add_library(libother STATIC file.c) # bad usage add_executable(myapp1 main.c) target_link_libraries(myapp1 PRIVATE lib$<$<LINK_LANGUAGE:C>:other>) # correct usage add_executable(myapp2 main.c) target_link_libraries(myapp2 PRIVATE $<$<LINK_LANGUAGE:C>:libother>)
В этом примере, для
myapp1, первый проход неожиданно определит, что язык линковки — этоCXX, потому что вычисление выражения генератора будет пустой строкой, поэтомуmyapp1будет зависеть от целевого объектаlib, который являетсяC++. Напротив, дляmyapp2, первое вычисление дастCкак язык линковки, поэтому второй проход правильно добавит целевой объектlibotherкак зависимость линковки.
-
$<DEVICE_LINK:list> -
Новое в версии 3.18.
Возвращает список, если это шаг линковки устройства, в противном случае пустой список. Шаг линковки устройства управляется свойствами
CUDA_SEPARABLE_COMPILATIONиCUDA_RESOLVE_DEVICE_SYMBOLS, и политикойCMP0105. Это выражение может использоваться только для указания опций линковки.
-
$<HOST_LINK:list> -
Новое в версии 3.18.
Возвращает список, если это обычный шаг линковки, в противном случае пустой список. Это выражение полезно в основном, когда участвует и шаг линковки устройства (см. выражение генератора
$<DEVICE_LINK:list>). Это выражение может использоваться только для указания опций линковки.
Строковые выражения генераторов
Эти выражения расширяются до некоторой строки. Например,
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> -
Новое в версии 3.8.
Вычисляется как
true_stringеслиconditionравно1. В противном случае вычисляется какfalse_string.
Как правило, condition является выражением генератора булевого типа. Например,
$<$<CONFIG:Debug>:DEBUG_MODE>
расширяется до DEBUG_MODE при использовании конфигурации Debug, и в противном случае расширяется до пустой строки.
Преобразования строк
-
$<JOIN:list,string> -
Объединяет список со значением
string.
-
$<REMOVE_DUPLICATES:list> -
Новое в версии 3.15.
Удаляет повторяющиеся элементы в заданном
list.
-
$<FILTER:list,INCLUDE|EXCLUDE,regex> -
Новое в версии 3.15.
Включает или исключает элементы из
list, которые соответствуют регулярному выражениюregex.
-
$<LOWER_CASE:string> -
Содержимое
stringпреобразуется в нижний регистр.
-
$<UPPER_CASE:string> -
Содержимое
stringпреобразуется в верхний регистр.
-
$<GENEX_EVAL:expr> -
Новое в версии 3.12.
Содержимое
exprоценивается как выражение генератора в текущем контексте. Это позволяет использовать выражения генераторов, результат вычисления которых сам по себе является выражением генератора.
-
$<TARGET_GENEX_EVAL:tgt,expr> -
Новое в версии 3.12.
Содержимое
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> -
Новая в версии 3.16.
Идентификатор компилятора CMake для используемого компилятора OBJC. Смотрите также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<OBJCXX_COMPILER_ID> -
Новая в версии 3.16.
Идентификатор компилятора CMake для используемого компилятора OBJC++. Смотрите также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<Fortran_COMPILER_ID> -
Идентификатор компилятора CMake для используемого компилятора Fortran. Смотрите также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<HIP_COMPILER_ID> -
Идентификатор компилятора CMake для используемого компилятора HIP. Смотрите также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<ISPC_COMPILER_ID> -
Новая в версии 3.19.
Идентификатор компилятора CMake для используемого компилятора ISPC. Смотрите также переменную
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> -
Новая в версии 3.16.
Версия используемого компилятора OBJC. Смотрите также переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<OBJCXX_COMPILER_VERSION> -
Новая в версии 3.16.
Версия используемого компилятора OBJC++. Смотрите также переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<Fortran_COMPILER_VERSION> -
Версия используемого компилятора Fortran. Смотрите также переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<HIP_COMPILER_VERSION> -
Версия используемого компилятора HIP. Смотрите также переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<ISPC_COMPILER_VERSION> -
Новая в версии 3.19.
Версия используемого компилятора ISPC. Смотрите также переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<COMPILE_LANGUAGE> -
Новая в версии 3.3.
Язык компиляции исходных файлов при оценке опций компиляции. См. соответствующее булево выражение
$<COMPILE_LANGUAGE:language>для заметок о переносимости этого выражения генератора.
-
$<LINK_LANGUAGE> -
Новая в версии 3.18.
Язык линковки целевого объекта при оценке опций линковки. См. соответствующее булево выражение
$<LINK_LANGUAGE:language>для заметок о переносимости этого выражения генератора.Примечание
Это выражение генератора не поддерживается свойствами библиотек линковки, чтобы избежать побочных эффектов из-за двойной оценки этих свойств.
Запросы, зависящие от целевого объекта
Эти запросы относятся к целевому объекту tgt. Это может быть любой исполняемый фрагмент, а именно:
- исполняемый целевой объект, созданный с помощью
add_executable() - целевой объект разделяемой библиотеки (
.so,.dllно не их.libбиблиотека импорта) созданный с помощьюadd_library() - целевой объект статической библиотеки, созданный с помощью
add_library()
В дальнейшем "имя файла tgt" означает имя файла tgt исполняемого файла. Это необходимо отличать от "имени целевого объекта", которое просто строка tgt.
-
$<TARGET_NAME_IF_EXISTS:tgt> -
Новая в версии 3.12.
Имя целевого объекта
tgtесли целевой объект существует, пустая строка в противном случае.Обратите внимание, что
tgtне добавляется в качестве зависимости от целевого объекта, для которого оценивается это выражение.
-
$<TARGET_FILE:tgt> -
Полный путь к файлу
tgtисполняемого файла.
-
$<TARGET_FILE_BASE_NAME:tgt> -
Новая в версии 3.15.
Базовое имя файла
tgt, т.е.$<TARGET_FILE_NAME:tgt>без префикса и суффикса. Например, если имя файла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> -
Новая в версии 3.15.
Префикс имени файла
tgt(например,lib).См. также свойство целевого объекта
PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости от целевого объекта, для которого оценивается это выражение.
-
$<TARGET_FILE_SUFFIX:tgt> -
Новое в версии 3.15.
Суффикс имени файла
tgt(расширение, например.soили.exe).См. также свойство целевого объекта
SUFFIX.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_FILE_NAME:tgt> -
Имя файла
tgt.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_FILE_DIR:tgt> -
Директория исполняемого файла
tgt.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_LINKER_FILE:tgt> -
Файл, используемый при линковке с целевым объектом
tgt. Обычно это библиотека, которуюtgtпредставляет (.a,.lib,.so), но для динамической библиотеки на платформах DLL это будет импортная библиотека, связанная с DLL.
-
$<TARGET_LINKER_FILE_BASE_NAME:tgt> -
Новое в версии 3.15.
Базовое имя файла, используемого для линковки целевого объекта
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> -
Новое в версии 3.15.
Префикс файла, используемого для линковки целевого объекта
tgt.См. также свойства целевого объекта
PREFIXиIMPORT_PREFIX.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_FILE_SUFFIX:tgt> -
Новое в версии 3.15.
Суффикс файла, используемого для линковки, где
tgt- имя целевого объекта.Суффикс соответствует расширению файла (например, ".so" или ".lib").
См. также свойства целевого объекта
SUFFIXиIMPORT_SUFFIX.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_FILE_NAME:tgt> -
Имя файла, используемого для линковки целевого объекта
tgt.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_LINKER_FILE_DIR:tgt> -
Директория файла, используемого для линковки целевого объекта
tgt.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_SONAME_FILE:tgt> -
Файл с именем soname (
.so.3), гдеtgt- имя целевого объекта.
-
$<TARGET_SONAME_FILE_NAME:tgt> -
Имя файла с именем soname (
.so.3).Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_SONAME_FILE_DIR:tgt> -
Директория с именем soname (
.so.3).Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_PDB_FILE:tgt> -
Новое в версии 3.1.
Полный путь к файлу базы данных программы (.pdb), сгенерированному линковщиком, где
tgt- имя целевого объекта.См. также свойства целевого объекта
PDB_NAMEиPDB_OUTPUT_DIRECTORYи их конфигурационные вариантыPDB_NAME_<CONFIG>иPDB_OUTPUT_DIRECTORY_<CONFIG>.
-
$<TARGET_PDB_FILE_BASE_NAME:tgt> -
Новое в версии 3.15.
Базовое имя файла базы данных программы (.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> -
Новое в версии 3.1.
Имя файла базы данных программы (.pdb), сгенерированной линковщиком.
Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_PDB_FILE_DIR:tgt> -
Новое в версии 3.1.
Директория файла базы данных программы (.pdb), сгенерированной линковщиком.
Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_BUNDLE_DIR:tgt> -
Новое в версии 3.9.
Полный путь к директории пакета (
my.app,my.framework, илиmy.bundle), гдеtgt- имя целевого объекта.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_BUNDLE_CONTENT_DIR:tgt> -
Новое в версии 3.9.
Полный путь к каталогу содержимого пакета, где
tgt— имя целевого объекта. Для macOS SDK он ведет кmy.app/Contents,my.framework, илиmy.bundle/Contents. Для всех других SDK (например, iOS) он ведет кmy.app,my.framework, илиmy.bundleиз-за плоской структуры пакета.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_PROPERTY:tgt,prop> -
Значение свойства
propцелевого объектаtgt.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.
-
$<TARGET_PROPERTY:prop> -
Значение свойства
propцелевого объекта, для которого вычисляется выражение. Обратите внимание, что для выражений генератора в Требования к транзитивному использованию это целевой объект, потребляющий зависимость, а не целевой объект, определяющий требование.
-
$<TARGET_RUNTIME_DLLS:tgt> -
Новое в версии 3.21.
Список DLL, от которых зависит целевой объект во время выполнения. Это определяется расположением всех целевых объектов
SHAREDиMODULEв транзитивных зависимостях целевого объекта. Использование этого выражения генератора для целевых объектов, отличных от исполняемых файлов,SHAREDбиблиотек иMODULEбиблиотек, является ошибкой. В платформах, не использующих DLL, оно вычисляется как пустая строка.Это выражение генератора можно использовать для копирования всех DLL, от которых зависит целевой объект, в его выходной каталог с помощью пользовательской команды
POST_BUILD. Например:find_package(foo CONFIG REQUIRED) # package generated by install(EXPORT) add_executable(exe main.c) target_link_libraries(exe PRIVATE foo::foo foo::bar) add_custom_command(TARGET exe POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:exe> $<TARGET_FILE_DIR:exe> COMMAND_EXPAND_LISTS )Примечание
Импортированные целевые объекты поддерживаются только в том случае, если они знают расположение своих файлов
.dll. ИмпортированнаяSHAREDилиMODULEбиблиотека должна иметь свойствоIMPORTED_LOCATION, установленное на файл.dll. Подробности см. в разделе add_library импортированные библиотеки. Многие модули поиска Модули поиска создают импортированные целевые объекты типаUNKNOWNи поэтому будут проигнорированы.
-
$<INSTALL_PREFIX> -
Содержание префикса установки, когда целевой объект экспортируется через
install(EXPORT)или когда вычисляется в свойствеINSTALL_NAME_DIRили аргументеINSTALL_NAME_DIRкомандыinstall(RUNTIME_DEPENDENCY_SET), и пустое значение в противном случае.
Выходные выражения
-
$<TARGET_NAME:...> -
Помечает
...как имя целевого объекта. Это требуется при экспорте целевых объектов в несколько зависимых наборов экспорта....должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора.
-
$<LINK_ONLY:...> -
Новое в версии 3.1.
Содержание
...за исключением случаев вычисления в интерфейсе связи при распространении Требований к транзитивному использованию, в этом случае это пустая строка. Предназначено для использования только в свойстве целевого объектаINTERFACE_LINK_LIBRARIES, возможно, с помощью командыtarget_link_libraries()для задания частных связей без других требований к использованию.
-
$<INSTALL_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюinstall(EXPORT), и пустое значение в противном случае.
-
$<BUILD_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюexport(), или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае расширяется до пустой строки.
-
$<MAKE_C_IDENTIFIER:...> -
Содержимое
...преобразованное в идентификатор C. Преобразование выполняется так же, как вstring(MAKE_C_IDENTIFIER).
-
$<TARGET_OBJECTS:objLib> -
Новое в версии 3.1.
Список объектов, полученных в результате сборки
objLib.
-
$<SHELL_PATH:...> -
Новое в версии 3.4.
Содержимое
...преобразованное в стиль пути командной строки. Например, косые черты преобразуются в обратные косые черты в оболочках Windows, а буквенные обозначения дисков преобразуются в пути POSIX в оболочках MSYS....должно быть абсолютным путем.Новое в версии 3.14:
...может быть списком, разделенным точкой с запятой путей, в этом случае каждый путь преобразуется индивидуально, и создается результирующий список с использованием разделителя путей командной строки (:в POSIX и;в Windows). Обязательно заключите аргумент, содержащий этот genex, в двойные кавычки в исходном коде CMake, чтобы;не разделял аргументы.
-
$<OUTPUT_CONFIG:...> -
Новое в версии 3.20.
Действительно только в
add_custom_command()иadd_custom_target()как самое внешнее выражение генератора в аргументе. С генераторомNinja Multi-Configвыражения генератора в...вычисляются с использованием «конфигурации вывода» пользовательской команды. В других генераторах содержимое...вычисляется обычно.
-
$<COMMAND_CONFIG:...> -
Новое в версии 3.20.
Действительно только в
add_custom_command()иadd_custom_target()как самое внешнее выражение генератора в аргументе. С генераторомNinja Multi-Configвыражения генератора в...вычисляются с использованием «конфигурации команды» пользовательской команды. В других генераторах содержимое...вычисляется обычно.
Отладка
Поскольку выражения генератора вычисляются во время генерации системы сборки, а не во время обработки файлов CMakeLists.txt, невозможно проверить их результат с помощью команды message().
Один из способов создания сообщений отладки — добавить пользовательский целевой объект:
add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")
Команда оболочки make genexdebug (вызывается после выполнения cmake) затем выведет результат $<...>.
Другой способ — записывать сообщения отладки в файл:
file(GENERATE OUTPUT filename CONTENT "$<...>")
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.22/manual/cmake-generator-expressions.7.html