cmake-generator-expressions(7)
Введение
Генераторные выражения вычисляются во время генерации системы сборки для получения информации, специфичной для каждой конфигурации сборки.
Генераторные выражения допускаются в контексте многих свойств цели, таких как LINK_LIBRARIES, INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS и другие. Они также могут использоваться при использовании команд для заполнения этих свойств, таких как target_link_libraries(), target_include_directories(), target_compile_definitions() и другие.
Они позволяют условную компоновку, условные определения, используемые при компиляции, условные каталоги include и многое другое. Условия могут быть основаны на конфигурации сборки, свойствах цели, информации о платформе или любой другой информации, доступной для запроса.
Генераторные выражения имеют вид $<...>. Во избежание путаницы, эта страница отклоняется от большей части документации 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. Это сравнение без учёта регистра. Сопоставление вMAP_IMPORTED_CONFIG_<CONFIG>также учитывается этим выражением, когда оно вычисляется для свойства в целевом объектеIMPORTED. -
$<PLATFORM_ID:platform_ids> -
где
platform_ids— это список, разделённый запятыми.1если идентификатор платформы CMake совпадает с одним из элементов вplatform_ids, иначе0. См. также переменнуюCMAKE_SYSTEM_NAME. -
$<C_COMPILER_ID:compiler_ids> -
где
compiler_ids— это список, разделённый запятыми.1если идентификатор компилятора C CMake совпадает с одним из элементов вcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<CXX_COMPILER_ID:compiler_ids> -
где
compiler_ids— это список, разделённый запятыми.1если идентификатор компилятора C++ CMake совпадает с одним из элементов вcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<CUDA_COMPILER_ID:compiler_ids> -
где
compiler_ids— это список, разделённый запятыми.1если идентификатор компилятора CUDA CMake совпадает с одним из элементов вcompiler_ids, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<OBJC_COMPILER_ID:compiler_ids> -
где
compiler_ids— это список, разделённый запятыми.1если идентификатор компилятора Objective-C CMake совпадает с одним из элементов в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. -
$<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 Generators и
Xcodeнет возможности представлять определения компиляции или директории включения для всего целевого объекта отдельно для языковCиCXX. Кроме того, с Visual Studio Generators нет возможности представлять флаги для всего целевого объекта отдельно для языков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)
Генераторные выражения со строковыми значениями
Эти выражения раскрываются в некоторую строку. Например,
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 для используемого C++-компилятора. См. также переменную
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> -
Версия используемого C++-компилятора. См. также переменную
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>для примечаний о переносимости этого генераторного выражения.
Запросы, зависящие от цели
-
$<TARGET_NAME_IF_EXISTS:tgt> -
Развертывается в
tgt, если заданная цель существует, в противном случае — в пустую строку. -
$<TARGET_FILE:tgt> -
Полный путь к главному файлу (.exe, .so.1.2, .a), где
tgt— имя цели. -
$<TARGET_FILE_BASE_NAME:tgt> -
Базовое имя главного файла, где
tgt— имя цели.Базовое имя соответствует имени целевого файла (см.
$<TARGET_FILE_NAME:tgt>) без префикса и суффикса. Например, если имя целевого файла —libbase.so, базовое имя —base.См. также свойства цели
OUTPUT_NAME,ARCHIVE_OUTPUT_NAME,LIBRARY_OUTPUT_NAMEиRUNTIME_OUTPUT_NAMEи их варианты, зависящие от конфигурацииOUTPUT_NAME_<CONFIG>,ARCHIVE_OUTPUT_NAME_<CONFIG>,LIBRARY_OUTPUT_NAME_<CONFIG>иRUNTIME_OUTPUT_NAME_<CONFIG>.Также можно рассмотреть свойства цели
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости цели, для которой вычисляется это выражение. -
$<TARGET_FILE_PREFIX:tgt> -
Префикс главного файла, где
tgt— имя цели.См. также свойство цели
PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости цели, для которой вычисляется это выражение. -
$<TARGET_FILE_SUFFIX:tgt> -
Суффикс главного файла, где
tgt— имя цели.Суффикс соответствует расширению файла (например, “.so” или “.exe”).
См. также свойство цели
SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости цели, для которой вычисляется это выражение. -
$<TARGET_FILE_NAME:tgt> -
Имя главного файла (.exe, .so.1.2, .a).
-
$<TARGET_FILE_DIR:tgt> -
Каталог главного файла (.exe, .so.1.2, .a).
-
$<TARGET_LINKER_FILE:tgt> -
Файл, используемый для компоновки (.a, .lib, .so), где
tgt— имя цели. -
$<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> -
Имя файла, используемого для компоновки (.a, .lib, .so).
-
$<TARGET_LINKER_FILE_DIR:tgt> -
Каталог файла, используемого для компоновки (.a, .lib, .so).
-
$<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— имя цели. Для macOS SDK это ведёт к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для цели, на которой вычисляется выражение генератора. Обратите внимание, что для выражений генератора в Transitive Usage Requirements это значение свойства для потребляющей цели, а не для цели, указывающей требование. -
$<INSTALL_PREFIX> -
Содержимое префикса установки, когда цель экспортируется через
install(EXPORT), и пустое в противном случае.
Выражения, связанные с выводом
-
$<TARGET_NAME:...> -
Помечает
...как имя цели. Это необходимо при экспорте целей в несколько зависимых наборов экспорта....должно быть литеральным именем цели — оно не может содержать выражений генератора. -
$<LINK_ONLY:...> -
Содержимое
..., за исключением случаев оценки в интерфейсе ссылки при распространении Transitive Usage Requirements, в котором случае это пустая строка. Предназначено для использования только в свойстве цели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.16/manual/cmake-generator-expressions.7.html