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если config совпадает с одним из элементов в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если идентификатор компилятора 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. -
$<ISPC_COMPILER_ID:compiler_ids> -
где
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если версия компилятора 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. -
$<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 является компилятором 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.Обратите внимание, что в Визуальные студии генераторы и
Xcodeнет возможности представить определения компиляции или каталоги включения для целевых объектов отдельно для языковCиCXX. Также, с Визуальные студии генераторы нет возможности представить флаги для целевых объектов отдельно для языков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> -
Версия используемого 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. -
$<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» означает имя файла бинарника tgt . Это нужно отличать от «имени целевого объекта», которое просто строка tgt.
-
$<TARGET_NAME_IF_EXISTS:tgt> -
Имя целевого объекта
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.Обратите внимание, что
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, и пустая строка в противном случае.
Выражения, связанные с выводом
-
$<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.19/manual/cmake-generator-expressions.7.html