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:cfg> -
1если конфигурация равнаcfg, иначе0. Это сравнение не учитывает регистр. При оценке свойства на объектеIMPORTEDтакже учитывается отображение вMAP_IMPORTED_CONFIG_<CONFIG>. -
$<PLATFORM_ID:platform_ids> -
где
platform_ids— это список, разделенный запятыми.1если идентификатор платформы CMake соответствует одному из значений вplatform_ids, иначе0. См. также переменнуюCMAKE_SYSTEM_NAME. -
$<C_COMPILER_ID:compiler_ids> -
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake компилятора C соответствует одному из значений вcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<CXX_COMPILER_ID:compiler_ids> -
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake компилятора C++ соответствует одному из значений вcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<CUDA_COMPILER_ID:compiler_ids> -
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake компилятора CUDA соответствует одному из значений вcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<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если идентификатор компилятора 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. -
$<C_COMPILER_VERSION:version> -
1если версия компилятора C соответствуетversion, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION. -
$<CXX_COMPILER_VERSION:version> -
1если версия компилятора C++ соответствуетversion, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION. -
$<CUDA_COMPILER_VERSION:version> -
1если версия компилятора C++ соответствуетversion, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION. -
$<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. -
$<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 как компилятор C++, иCOMPILING_CXX_WITH_INTELпри Intel как компилятор C++. Аналогично, когда компилятор 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. -
$<C_COMPILER_VERSION> -
Версия используемого компилятора C. См. также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<CXX_COMPILER_VERSION> -
Версия используемого компилятора CXX. См. также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<CUDA_COMPILER_VERSION> -
Версия используемого компилятора CUDA. См. также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<OBJC_COMPILER_VERSION> -
Версия используемого компилятора OBJC. См. также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<OBJCXX_COMPILER_VERSION> -
Версия используемого компилятора OBJCXX. См. также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<Fortran_COMPILER_VERSION> -
Версия используемого компилятора Fortran. См. также переменную
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» означает имя бинарного файла tgt. Это следует отличать от «имени целевого объекта», которое просто строка tgt.
-
$<TARGET_NAME_IF_EXISTS:tgt> -
Имя целевого объекта
tgt, если такой объект существует, в противном случае пустая строка. -
$<TARGET_FILE:tgt> -
Полный путь к двоичному файлу
tgt. -
$<TARGET_FILE_BASE_NAME:tgt> -
Базовое имя
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> -
Префикс имени файла
tgt(например,lib).См. также свойство целевого объекта
PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, для которого вычисляется это выражение. -
$<TARGET_FILE_SUFFIX:tgt> -
Суффикс имени файла
tgt(расширение, например,.soили.exe).См. также свойство целевого объекта
SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, для которого вычисляется это выражение. -
$<TARGET_FILE_NAME:tgt> -
Имя файла
tgt. -
$<TARGET_FILE_DIR:tgt> -
Директория двоичного файла
tgt. -
$<TARGET_LINKER_FILE:tgt> -
Файл, используемый при ссылке на целевой объект
tgt. Обычно это библиотека, которуюtgtпредставляет (.a,.lib,.so). Однако для динамической библиотеки (DLL) на платформах DLL это будет библиотека импорта 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. -
$<TARGET_LINKER_FILE_DIR:tgt> -
Директория файла, используемого для ссылки на целевой объект
tgt. -
$<TARGET_SONAME_FILE:tgt> -
Файл с именем soname (
.so.3), гдеtgt— имя целевого объекта. -
$<TARGET_SONAME_FILE_NAME:tgt> -
Имя файла с именем soname (
.so.3). -
$<TARGET_SONAME_FILE_DIR:tgt> -
Директория файла с именем soname (
.so.3). -
$<TARGET_PDB_FILE:tgt> -
Полный путь к файлу базы данных программы, сгенерированной линковщиком (.pdb), где
tgt— имя целевого объекта.См. также свойства целевого объекта
PDB_NAMEиPDB_OUTPUT_DIRECTORYи их конфигурационные вариантыPDB_NAME_<CONFIG>иPDB_OUTPUT_DIRECTORY_<CONFIG>. -
$<TARGET_PDB_FILE_BASE_NAME:tgt> -
Базовое имя файла базы данных программы, сгенерированной линковщиком (.pdb), где
tgt— имя целевого объекта.Базовое имя соответствует имени файла PDB целевого объекта (см.
$<TARGET_PDB_FILE_NAME:tgt>) без префикса и суффикса. Например, если имя файла целевого объекта равноbase.pdb, базовое имя равноbase.См. также свойство целевого объекта
PDB_NAMEи его конфигурационный вариантPDB_NAME_<CONFIG>.Также можно учитывать свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, для которого вычисляется это выражение. -
$<TARGET_PDB_FILE_NAME:tgt> -
Имя файла базы данных программы, сгенерированной линковщиком (.pdb).
-
$<TARGET_PDB_FILE_DIR:tgt> -
Директория файла базы данных программы, сгенерированной линковщиком (.pdb).
-
$<TARGET_BUNDLE_DIR:tgt> -
Полный путь к каталогу пакета (
my.app,my.framework, илиmy.bundle), гдеtgt— имя целевого объекта. -
$<TARGET_BUNDLE_CONTENT_DIR:tgt> -
Полный путь к каталогу содержимого пакета, где
tgt— имя целевого объекта. Для SDK macOS он указывает наmy.app/Contents,my.framework, илиmy.bundle/Contents. Для всех остальных SDK (например, iOS) он указывает наmy.app,my.framework, илиmy.bundleиз-за плоской структуры пакета. -
$<TARGET_PROPERTY:tgt,prop> -
Значение свойства
propдля целевого объектаtgt.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, для которого вычисляется это выражение. -
$<TARGET_PROPERTY:prop> -
Значение свойства
propдля целевого объекта, для которого вычисляется выражение. Обратите внимание, что для выражений генератора в Требования к использованию зависимостей это целевой объект, который потребляет зависимость, а не целевой объект, определяющий требование. -
$<INSTALL_PREFIX>
-
Содержимое префикса установки, когда целевой объект экспортируется через
install(EXPORT), или когда вычисляется вINSTALL_NAME_DIR, и пустое в противном случае.
Выражения, связанные с выводом
-
$<TARGET_NAME:...> -
Помечает
...как имя целевого объекта. Это необходимо, если целевые объекты экспортируются в несколько зависимых наборов экспорта....должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора. -
$<LINK_ONLY:...> -
Содержимое
...за исключением случаев, когда оно вычисляется в интерфейсе связи при распространении Требований к использованию зависимостей, в этом случае оно является пустой строкой. Предназначено для использования только в свойстве целевого объектаINTERFACE_LINK_LIBRARIES, возможно, через командуtarget_link_libraries(), для указания частных зависимостей от ссылок без других требований к использованию. -
$<INSTALL_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюinstall(EXPORT), и пустое в противном случае. -
$<BUILD_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюexport(), или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае раскрывается как пустая строка. -
$<MAKE_C_IDENTIFIER:...> -
Содержимое
..., преобразованное в идентификатор C. Преобразование следует тому же поведению, что иstring(MAKE_C_IDENTIFIER). -
$<TARGET_OBJECTS:objLib> -
Список объектов, полученных в результате сборки
objLib. -
$<SHELL_PATH:...> -
Содержимое
..., преобразованное в стиль пути оболочки. Например, косые черты преобразуются в обратные косые черты в оболочках Windows, а буквы дисков преобразуются в пути POSIX в оболочках MSYS....должно быть абсолютным путем....может быть списком путей, разделенных точкой с запятой, в этом случае каждый путь преобразуется индивидуально, и список результатов генерируется с использованием разделителя путей оболочки (:в POSIX и;в Windows). Обязательно заключите аргумент, содержащий этот genex, в двойные кавычки в исходном коде CMake, чтобы;не разделял аргументы.
Отладка
Поскольку выражения генератора вычисляются во время генерации системы сборки, а не во время обработки файлов CMakeLists.txt, невозможно проверить их результат с помощью команды message().
Один из возможных способов создания сообщений об отладке — добавление пользовательского целевого объекта,
add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")
Команда оболочки make genexdebug (вызываемая после выполнения cmake) затем выведет результат $<...>.
Другой способ — запись сообщений об отладке в файл:
file(GENERATE OUTPUT filename CONTENT "$<...>")
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.18/manual/cmake-generator-expressions.7.html