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, если все условия истинны. В противном случае вычисляется как0.
-
$<OR:conditions> -
где
conditions— список булевых выражений через запятую. Вычисляется как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. Это сравнение нечувствительно к регистру. Сопоставление вMAP_IMPORTED_CONFIG_<CONFIG>также учитывается этим выражением при оценке свойства на целевом объектеIMPORTED.
-
$<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> -
Новое в версии 3.15.
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора CMake CUDA соответствует одному из элементов вcompiler_ids, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<OBJC_COMPILER_ID:compiler_ids> -
Новое в версии 3.16.
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора CMake Objective-C соответствует одному из элементов в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> -
Новое в версии 3.21.
где
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> -
Новое в версии 3.21.
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.
1если язык, используемый для шага компоновки, совпадает с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.
1если язык, используемый для шага компоновки, совпадает с любым из элементов в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>
-
Идентификатор компилятора C, используемого CMake. Также см. переменную
CMAKE_<LANG>_COMPILER_ID.
- $<CXX_COMPILER_ID>
-
Идентификатор компилятора C++, используемого CMake. Также см. переменную
CMAKE_<LANG>_COMPILER_ID.
- $<CUDA_COMPILER_ID>
-
Идентификатор компилятора CUDA, используемого CMake. Также см. переменную
CMAKE_<LANG>_COMPILER_ID.
- $<OBJC_COMPILER_ID>
-
Новое в версии 3.16.
Идентификатор компилятора OBJC, используемого CMake. Также см. переменную
CMAKE_<LANG>_COMPILER_ID.
- $<OBJCXX_COMPILER_ID>
-
Новое в версии 3.16.
Идентификатор компилятора OBJC++, используемого CMake. Также см. переменную
CMAKE_<LANG>_COMPILER_ID.
- $<Fortran_COMPILER_ID>
-
Идентификатор компилятора Fortran, используемого CMake. Также см. переменную
CMAKE_<LANG>_COMPILER_ID.
- $<HIP_COMPILER_ID>
-
Новое в версии 3.21.
Идентификатор компилятора HIP, используемого CMake. Также см. переменную
CMAKE_<LANG>_COMPILER_ID.
- $<ISPC_COMPILER_ID>
-
Новое в версии 3.19.
Идентификатор компилятора ISPC, используемого CMake. Также см. переменную
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>
-
Новое в версии 3.21.
Версия используемого компилятора 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.
-
$<TARGET_NAME_IF_EXISTS:tgt> -
Новое в версии 3.12.
Имя целевого объекта
tgtесли целевой объект существует, в противном случае пустая строка.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором оценивается это выражение.
-
$<TARGET_FILE:tgt> -
Полный путь к двоичному файлу целевого объекта.
-
$<TARGET_FILE_BASE_NAME:tgt> -
Новое в версии 3.15.
Базовое имя целевого объекта
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> -
Новое в версии 3.15.
Префикс имени файла целевого объекта (например,
lib).См. также свойство целевого объекта
PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором оценивается это выражение.
-
$<TARGET_FILE_SUFFIX:tgt> -
Новое в версии 3.15.
Суффикс имени файла целевого объекта (расширение, например,
.soили.exe).См. также свойство целевого объекта
SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором оценивается это выражение.
-
$<TARGET_FILE_NAME:tgt> -
Имя файла целевого объекта.
Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором оценивается это выражение (см. политикуCMP0112).
-
$<TARGET_FILE_DIR:tgt> -
Директория двоичного файла целевого объекта.
Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором оценивается это выражение (см. политикуCMP0112).
-
$<TARGET_LINKER_FILE:tgt> -
Файл, используемый при линковке с целевым объектом
tgt. Обычно это библиотека, которуюtgtпредставляет (.a,.lib,.so), но для динамической библиотеки на платформах DLL это будет библиотека импорта 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в транзитивных зависимостях целевого объекта. Использование этого генераторского выражения для целевых объектов, отличных от исполняемых файлов,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библиотека должна иметь свойство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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/manual/cmake-generator-expressions.7.html