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> -
1еслиstringявляется элементом разделителя точкой с запятойlist, иначе0. Использует сравнение, учитывающее регистр.
-
$<VERSION_LESS:v1,v2> -
1еслиv1меньше версииv2, иначе0.
-
$<VERSION_GREATER:v1,v2> -
1еслиv1больше версииv2, иначе0.
-
$<VERSION_EQUAL:v1,v2> -
1еслиv1имеет ту же версию, что иv2, иначе0.
-
$<VERSION_LESS_EQUAL:v1,v2> -
1еслиv1меньше или равно версииv2, иначе0.
-
$<VERSION_GREATER_EQUAL:v1,v2> -
1еслиv1больше или равно версииv2, иначе0.
Запросы к переменным
-
$<TARGET_EXISTS:target> -
1еслиtargetсуществует, иначе0.
-
$<CONFIG: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> -
где
compiler_ids- это список, разделённый запятыми.1если идентификатор компилятора CMake для компилятора CUDA совпадает с одним из элементов вcompiler_ids, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<OBJC_COMPILER_ID:compiler_ids> -
где
compiler_ids- это список, разделённый запятыми.1если идентификатор компилятора CMake для компилятора Objective-C совпадает с одним из элементов вcompiler_ids, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<OBJCXX_COMPILER_ID:compiler_ids> -
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора Objective-C++ в CMake соответствует одному из значений вcompiler_ids, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<Fortran_COMPILER_ID:compiler_ids> -
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора Fortran в CMake соответствует одному из значений вcompiler_ids, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID.
-
$<ISPC_COMPILER_ID:compiler_ids> -
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора ISPC в CMake соответствует одному из значений в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> -
1если версия компилятора CXX соответствуетversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<OBJC_COMPILER_VERSION:version> -
1если версия компилятора OBJC соответствуетversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<OBJCXX_COMPILER_VERSION:version> -
1если версия компилятора OBJCXX соответствуетversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<Fortran_COMPILER_VERSION:version> -
1если версия компилятора Fortran соответствуетversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<ISPC_COMPILER_VERSION:version> -
1если версия компилятора ISPC соответствуетversion, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION.
-
$<TARGET_POLICY:policy> -
1еслиpolicyбыло NEW при создании целевого объекта 'head', в противном случае0. Еслиpolicyне было установлено, будет выведено сообщение об ошибке для политики. Данное выражение генератора работает только для подмножества политик.
-
$<COMPILE_FEATURES:features> -
где
features— список, разделенный запятыми. Принимает значение1если всеfeaturesдоступны для целевого объекта 'head', и0в противном случае. Если это выражение используется при оценке реализации связи целевого объекта, и если какой-либо зависимый объект увеличивает требуемыеC_STANDARDилиCXX_STANDARDдля целевого объекта 'head', выдается сообщение об ошибке. См. руководствоcmake-compile-features(7)для получения информации о возможностях компиляции и списка поддерживаемых компиляторов.
-
$<COMPILE_LANG_AND_ID:language,compiler_ids> -
1если язык, используемый для компиляции модуля, соответствуетlanguageи идентификатор компилятора языка в CMake соответствует одному из значений вcompiler_ids, в противном случае0. Это выражение — сокращенная форма комбинации$<COMPILE_LANGUAGE:language>и$<LANG_COMPILER_ID:compiler_ids>. Это выражение можно использовать для указания параметров компиляции, определений компиляции и каталогов заголовочных файлов для файлов исходного кода конкретной комбинации языка и компилятора в целевом объекте. Например:add_executable(myapp main.cpp foo.c bar.cpp zot.cu) target_compile_definitions(myapp PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:COMPILING_CXX_WITH_CLANG> $<$<COMPILE_LANG_AND_ID:CXX,Intel>:COMPILING_CXX_WITH_INTEL> $<$<COMPILE_LANG_AND_ID:C,Clang>:COMPILING_C_WITH_CLANG> )Это указывает на использование различных определений компиляции на основе как идентификатора компилятора, так и языка компиляции. В данном примере будет использоваться определение компиляции
COMPILING_CXX_WITH_CLANGкогда Clang является компилятором 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> -
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> -
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> -
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> -
Возвращает список, если это шаг линковки устройства, в противном случае пустой список. Шаг линковки устройства контролируется свойствами
CUDA_SEPARABLE_COMPILATIONиCUDA_RESOLVE_DEVICE_SYMBOLSи политикойCMP0105. Это выражение может быть использовано только для указания опций линковки.
-
$<HOST_LINK:list> -
Возвращает список, если это обычный шаг линковки, в противном случае пустой список. Это выражение полезно в основном, когда участвует также шаг линковки устройства (см.
$<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> -
Вычисляется как
true_stringеслиconditionявляется1. В противном случае вычисляется какfalse_string.
Обычно, condition является булевым генераторным выражением. Например,
$<$<CONFIG:Debug>:DEBUG_MODE>
расширяется до DEBUG_MODE при использовании конфигурации Debug, и в противном случае расширяется до пустой строки.
Преобразования строк
-
$<JOIN:list,string> -
Объединяет список с содержимым
string.
-
$<REMOVE_DUPLICATES:list> -
Удаляет дублирующиеся элементы в данном
list.
-
$<FILTER:list,INCLUDE|EXCLUDE,regex> -
Включает или удаляет элементы из
listкоторые соответствуют регулярному выражениюregex.
-
$<LOWER_CASE:string> -
Содержимое
stringпреобразуется в нижний регистр.
-
$<UPPER_CASE:string> -
Содержимое
stringпреобразуется в верхний регистр.
-
$<GENEX_EVAL:expr> -
Содержимое
exprвычисляется как генераторное выражение в текущем контексте. Это позволяет использовать генераторные выражения, чьи результаты вычисления сами являются генераторными выражениями.
-
$<TARGET_GENEX_EVAL:tgt,expr> -
Содержимое
exprвычисляется как генераторное выражение в контексте целевого объектаtgt. Это позволяет использовать пользовательские свойства целевых объектов, которые сами содержат генераторные выражения.Возможность вычисления генераторных выражений очень полезна, когда нужно управлять пользовательскими свойствами, поддерживающими генераторные выражения. Например:
add_library(foo ...) set_property(TARGET foo PROPERTY CUSTOM_KEYS $<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS> ) add_custom_target(printFooKeys COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:foo,CUSTOM_KEYS> )Это наивное реализация пользовательской команды
printFooKeysневерна, потому что свойство целевого объектаCUSTOM_KEYSне вычисляется, и содержимое передается как есть (т.е.$<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS>).Чтобы получить ожидаемый результат (т.е.
FOO_EXTRA_THINGSесли конфигурацияDebug), требуется вычислить результат$<TARGET_PROPERTY:foo,CUSTOM_KEYS>:add_custom_target(printFooKeys COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_GENEX_EVAL:foo,$<TARGET_PROPERTY:foo,CUSTOM_KEYS>> )
Запросы к переменным
-
$<CONFIG> -
Имя конфигурации.
-
$<CONFIGURATION> -
Имя конфигурации. Устарело начиная с CMake 3.0. Используйте
CONFIGвместо этого.
-
$<PLATFORM_ID> -
Идентификатор платформы CMake текущей системы. См. также переменную
CMAKE_SYSTEM_NAME.
-
$<C_COMPILER_ID> -
Идентификатор компилятора CMake C-компилятора. См. также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<CXX_COMPILER_ID> -
Идентификатор компилятора CMake CXX-компилятора. См. также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<CUDA_COMPILER_ID> -
Идентификатор компилятора CMake CUDA-компилятора. См. также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<OBJC_COMPILER_ID> -
Идентификатор компилятора CMake OBJC-компилятора. См. также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<OBJCXX_COMPILER_ID> -
Идентификатор компилятора CMake OBJCXX-компилятора. См. также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<Fortran_COMPILER_ID> -
Идентификатор компилятора CMake Fortran-компилятора. См. также переменную
CMAKE_<LANG>_COMPILER_ID.
-
$<ISPC_COMPILER_ID> -
Идентификатор компилятора 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> -
Версия используемого компилятора OBJC. Также см. переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<OBJCXX_COMPILER_VERSION> -
Версия используемого компилятора OBJC++. Также см. переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<Fortran_COMPILER_VERSION> -
Версия используемого компилятора Fortran. Также см. переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<ISPC_COMPILER_VERSION> -
Версия используемого компилятора ISPC. Также см. переменную
CMAKE_<LANG>_COMPILER_VERSION.
-
$<COMPILE_LANGUAGE> -
Язык компиляции исходных файлов при оценке опций компиляции. См. соответствующее булево выражение
$<COMPILE_LANGUAGE:language>для примечаний о переносимости этого генераторного выражения.
-
$<LINK_LANGUAGE> -
Язык компоновки целевого объекта при оценке опций компоновки. См. соответствующее булево выражение
$<LINK_LANGUAGE:language>для примечаний о переносимости этого генераторного выражения.Примечание
Это генераторное выражение не поддерживается свойствами компоновщиков библиотек для предотвращения побочных эффектов из-за двойной оценки этих свойств.
Зависимые от цели запросы
Эти запросы относятся к цели tgt. Это может быть любой артефакт времени выполнения, а именно:
- целевой исполняемый файл, созданный с помощью
add_executable() - целевой объект общей библиотеки (
.so,.dllно не их.libимпортной библиотеки) созданной с помощьюadd_library() - целевой объект статической библиотеки, созданной с помощью
add_library()
В дальнейшем «имя файла бинарного файла» означает имя бинарного файла целевого объекта. Это следует отличать от «имени целевого объекта», которое представляет собой просто строку tgt.
-
$<TARGET_NAME_IF_EXISTS:tgt> -
Имя целевого объекта
tgtесли целевой объект существует, пустая строка в противном случае.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором оценивается это выражение.
-
$<TARGET_FILE:tgt> -
Полный путь к бинарному файлу целевого объекта.
-
$<TARGET_FILE_BASE_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> -
Префикс имени файла бинарного файла (например,
lib).См. также свойство целевого объекта
PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, на котором оценивается это выражение.
-
$<TARGET_FILE_SUFFIX:tgt> -
Суффикс имени файла бинарного файла (расширение, например,
.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.
-
$<TARGET_LINKER_FILE_BASE_NAME:tgt> -
Базовое имя файла, используемого для компоновки целевого объекта
tgt, т.е.$<TARGET_LINKER_FILE_NAME:tgt>без префикса и суффикса. Например, если имя целевого файлаlibbase.a, базовое имя будетbase.См. также свойства целевого объекта
OUTPUT_NAME,ARCHIVE_OUTPUT_NAMEиLIBRARY_OUTPUT_NAMEи их конфигурационно-зависимые вариантыOUTPUT_NAME_<CONFIG>,ARCHIVE_OUTPUT_NAME_<CONFIG>иLIBRARY_OUTPUT_NAME_<CONFIG>.Также можно учесть свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.
-
$<TARGET_LINKER_FILE_PREFIX:tgt> -
Префикс файла, используемого для компоновки целевого объекта
tgt.См. также свойства целевого объекта
PREFIXиIMPORT_PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.
-
$<TARGET_LINKER_FILE_SUFFIX:tgt> -
Суффикс файла, используемого для компоновки, где
tgt— имя целевого объекта.Суффикс соответствует расширению файла (например, ".so" или ".lib").
См. также свойства целевого объекта
SUFFIXиIMPORT_SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.
-
$<TARGET_LINKER_FILE_NAME:tgt> -
Имя файла, используемого для компоновки целевого объекта
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> -
Полный путь к файлу базы данных программы компоновщика (.pdb), где
tgt— имя целевого объекта.См. также свойства целевого объекта
PDB_NAMEиPDB_OUTPUT_DIRECTORYи их конфигурационно-зависимые вариантыPDB_NAME_<CONFIG>иPDB_OUTPUT_DIRECTORY_<CONFIG>.
-
$<TARGET_PDB_FILE_BASE_NAME:tgt> -
Базовое имя файла базы данных программы компоновщика (.pdb), где
tgt— имя целевого объекта.Базовое имя соответствует имени файла PDB целевого объекта (см.
$<TARGET_PDB_FILE_NAME:tgt>) без префикса и суффикса. Например, если имя целевого файлаbase.pdb, базовое имя будетbase.См. также свойство целевого объекта
PDB_NAMEи его конфигурационно-зависимый вариантPDB_NAME_<CONFIG>.Также можно учесть свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение.
-
$<TARGET_PDB_FILE_NAME:tgt> -
Имя файла базы данных программы компоновщика (.pdb).
Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение (см. политикуCMP0112).
-
$<TARGET_PDB_FILE_DIR:tgt> -
Директория файла базы данных программы компоновщика (.pdb).
Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение (см. политикуCMP0112).
-
$<TARGET_BUNDLE_DIR:tgt> -
Полный путь к каталогу пакета (
my.app,my.framework, илиmy.bundle) гдеtgt— имя целевого объекта.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется данное выражение (см. политикуCMP0112).
-
$<TARGET_BUNDLE_CONTENT_DIR:tgt> -
Полный путь к каталогу содержимого пакета, где
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для целевого объекта, для которого вычисляется выражение. Обратите внимание, что для выражений генератора в Требования к использованию зависимостей это целевой объект, использующий зависимость, а не целевой объект, определяющий требование.
-
$<INSTALL_PREFIX> -
Содержимое префикса установки, когда целевой объект экспортируется через
install(EXPORT), или когда вычисляется вINSTALL_NAME_DIR, в противном случае пустая строка.
Output-Related Expressions
-
$<TARGET_NAME:...> -
Помечает
...как имя целевого объекта. Это необходимо, если целевые объекты экспортируются в несколько зависимых наборов экспорта....должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора.
-
$<LINK_ONLY:...> -
Содержимое
...за исключением случаев оценки в интерфейсе связи при распространении Требований к транзитивному использованию, в этом случае оно является пустой строкой. Предназначено только для использования в свойстве целевого объектаINTERFACE_LINK_LIBRARIES, возможно, с помощью командыtarget_link_libraries(), для указания частных зависимостей связи без других требований к использованию.
-
$<INSTALL_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюinstall(EXPORT), и пустая строка в противном случае.
-
$<BUILD_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюexport()или при использовании целевого объекта другим целевым объектом в той же системе сборки. В противном случае расширяется до пустой строки.
-
$<MAKE_C_IDENTIFIER:...> -
Содержимое
...преобразованное в идентификатор C. Преобразование соответствует поведению командыstring(MAKE_C_IDENTIFIER).
-
$<TARGET_OBJECTS:objLib> -
Список объектов, полученных в результате сборки
objLib.
-
$<SHELL_PATH:...> -
Содержимое
...преобразованное в стиле пути оболочки. Например, косые черты преобразуются в обратные слэши в оболочках Windows, а буквы дисков преобразуются в пути POSIX в оболочках MSYS....должен быть абсолютным путем....может быть списком, разделенным точкой с запятой путей, в этом случае каждый путь преобразуется индивидуально, и список результатов генерируется с помощью разделителя путей оболочки (:в POSIX и;в Windows). Убедитесь, что аргумент, содержащий эту genex, заключен в двойные кавычки в исходном коде CMake, чтобы;не разделял аргументы.
-
$<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.20/manual/cmake-generator-expressions.7.html