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.
Сравнения строк
-
$<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если идентификатор компилятора 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если идентификатор компилятора 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> -
где
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.
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>
-
Идентификатор компилятора 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>
-
Версия используемого компилятора 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, связанная с 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 REQUIRED) 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 )
-
$<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.21/manual/cmake-generator-expressions.7.html