cmake-generator-expressions(7)
- Введение
- Пробелы и кавычки
- Отладка
Введение
Выражения генератора оцениваются во время генерации системы сборки, чтобы получить информацию, специфичную для каждой конфигурации сборки. Они имеют вид $<...>. Например:
target_include_directories(tgt PRIVATE /opt/include/$<CXX_COMPILER_ID>)
Это расширится до /opt/include/GNU, /opt/include/Clang, и т. д., в зависимости от используемой C++ компилятора.
Выражения генератора разрешены в контексте многих свойств целевого объекта, таких как LINK_LIBRARIES, INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS и другие. Их можно использовать при использовании команд для заполнения этих свойств, таких как target_link_libraries(), target_include_directories(), target_compile_definitions() и другие. Они позволяют условную компоновку, условные определения, используемые при компиляции, условные каталоги включения и многое другое. Условия могут быть основаны на конфигурации сборки, свойствах целевого объекта, информации о платформе или любой другой запрашиваемой информации.
Выражения генератора могут быть вложены:
target_compile_definitions(tgt PRIVATE $<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,4.2.0>:OLD_COMPILER> )
Вышеприведенное расширится до OLD_COMPILER если CMAKE_CXX_COMPILER_VERSION меньше 4.2.0.
Пробелы и кавычки
Выражения генератора обычно парсятся после аргументов команд. Если выражение генератора содержит пробелы, новые строки, точки с запятой или другие символы, которые могут быть интерпретированы как разделители аргументов команд, всё выражение должно быть заключено в кавычки при передаче команде. Отсутствие этого может привести к разделению выражения, и оно может больше не распознаваться как выражение генератора.
При использовании add_custom_command() или add_custom_target(), используйте параметры VERBATIM и COMMAND_EXPAND_LISTS, чтобы обеспечить надёжное разделение и цитирование аргументов.
# WRONG: Embedded space will be treated as an argument separator. # This ends up not being seen as a generator expression at all. add_custom_target(run_some_tool COMMAND some_tool -I$<JOIN:$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>, -I> VERBATIM )
# Better, but still not robust. Quotes prevent the space from splitting the # expression. However, the tool will receive the expanded value as a single # argument. add_custom_target(run_some_tool COMMAND some_tool "-I$<JOIN:$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>, -I>" VERBATIM )
# Nearly correct. Using a semicolon to separate arguments and adding the # COMMAND_EXPAND_LISTS option means that paths with spaces will be handled # correctly. Quoting the whole expression ensures it is seen as a generator # expression. But if the target property is empty, we will get a bare -I # with nothing after it. add_custom_target(run_some_tool COMMAND some_tool "-I$<JOIN:$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>,;-I>" COMMAND_EXPAND_LISTS VERBATIM )
Использование переменных для построения более сложного выражения генератора также является хорошим способом уменьшить ошибки и улучшить читабельность. Приведённый выше пример можно улучшить следующим образом:
# The $<BOOL:...> check prevents adding anything if the property is empty,
# assuming the property value cannot be one of CMake's false constants.
set(prop "$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>")
add_custom_target(run_some_tool
COMMAND some_tool "$<$<BOOL:${prop}>:-I$<JOIN:${prop},;-I>>"
COMMAND_EXPAND_LISTS
VERBATIM
)
Наконец, вышеприведённый пример можно выразить более простым и надёжным способом с использованием альтернативного выражения генератора:
add_custom_target(run_some_tool COMMAND some_tool "$<LIST:TRANSFORM,$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>,PREPEND,-I>" COMMAND_EXPAND_LISTS VERBATIM )
Частая ошибка — это попытка разбить выражение генератора на несколько строк с отступами:
# WRONG: New lines and spaces all treated as argument separators, so the
# generator expression is split and not recognized correctly.
target_compile_definitions(tgt PRIVATE
$<$<AND:
$<CXX_COMPILER_ID:GNU>,
$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,5>
>:HAVE_5_OR_LATER>
)
Вновь используйте вспомогательные переменные с хорошо подобранными именами для создания читабельного выражения:
set(is_gnu "$<CXX_COMPILER_ID:GNU>")
set(v5_or_later "$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,5>")
set(meet_requirements "$<AND:${is_gnu},${v5_or_later}>")
target_compile_definitions(tgt PRIVATE
"$<${meet_requirements}:HAVE_5_OR_LATER>"
)
Отладка
Поскольку выражения генератора оцениваются во время генерации системы сборки, а не во время обработки файлов CMakeLists.txt, невозможно просмотреть их результат с помощью команды message(). Один из возможных способов генерации сообщений об отладке — добавление пользовательского целевого объекта:
add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")
После запуска cmake, вы можете затем собрать целевой объект genexdebug для вывода результата выражения $<...> (то есть выполнить команду cmake --build ... --target genexdebug).
Другой способ — записать сообщения об отладке в файл с помощью file(GENERATE):
file(GENERATE OUTPUT filename CONTENT "$<...>")
Справочник по выражениям генератора
Примечание
Этот справочник отличается от большей части документации CMake тем, что опускает угловые скобки <...> вокруг заглушек, таких как condition, string, target, и т. д. Это предотвращает возможность неправильной интерпретации этих заглушек как выражений генератора.
Условные выражения
Фундаментальная категория выражений генератора связана с условной логикой. Поддерживаются два вида условных выражений генератора:
-
$<condition:true_string> -
Вычисляется до
true_stringеслиconditionимеет значение1, или пустой строкой, еслиconditionвычисляется до0. Любое другое значение дляconditionприводит к ошибке.
-
$<IF:condition,true_string,false_string> -
Добавлено в версии 3.8.
Вычисляется до
true_stringеслиconditionимеет значение1, или доfalse_string, еслиconditionимеет значение0. Любое другое значение дляconditionприводит к ошибке.Добавлено в версии 3.28: Это выражение генератора выполняет короткую схему вычисления, так что выражения генератора в
false_stringне будут вычисляться, еслиconditionимеет значение1, и выражения генератора вtrue_stringне будут вычисляться, если условие равно0.
Обычно condition само по себе является выражением генератора. Например, следующее выражение расширяется до DEBUG_MODE при использовании конфигурации Debug, и до пустой строки во всех других случаях:
$<$<CONFIG:Debug>:DEBUG_MODE>
Булевы значения condition отличные от 1 или 0 могут быть обработаны с помощью выражения генератора $<BOOL:...>.
-
$<BOOL:string> -
Преобразует
stringв0или1. Вычисляется до0если выполняется любое из следующих условий:-
stringпустая, -
stringсовпадает (без учёта регистра) с0,FALSE,OFF,N,NO,IGNORE, илиNOTFOUND, или -
stringзаканчивается на суффикс-NOTFOUND(учитывая регистр).
В противном случае, вычисляется до
1. -
Выражение-генератор $<BOOL:...> часто используется, когда condition предоставляется переменной CMake:
$<$<BOOL:${HAVE_SOME_FEATURE}>:-DENABLE_SOME_FEATURE>
Логические операторы
Поддерживаются обычные логические операторы:
-
$<AND:conditions> -
где
conditions— это список логических выражений, разделённых запятыми, все из которых должны иметь значение либо1или0. Весь оператор имеет значение1, если все условия1. Если хотя бы одно условие0, то весь оператор имеет значение0.
-
$<OR:conditions> -
где
conditions— это список логических выражений, разделённых запятыми, все из которых должны иметь значение либо1или0. Весь оператор имеет значение1, если хотя бы одно изconditionsимеет значение1. Если всеconditionsимеют значение0, весь оператор имеет значение0.
-
$<NOT:condition> -
conditionдолжно иметь значение0или1. Результат выражения —0еслиconditionимеет значение1, иначе1.
Новое в версии 3.28: Логические операторы используют закорачивание, поэтому выражения-генераторы в списке аргументов не будут вычисляться, как только будет определено значение возврата.
Основные выражения сравнения
CMake поддерживает различные выражения-генераторы для сравнения значений. В этом разделе рассматриваются основные и наиболее часто используемые типы сравнений. Другие, более специфические типы сравнения описаны в отдельных разделах ниже.
Сравнения строк
-
$<STREQUAL:string1,string2> -
1еслиstring1иstring2равны, иначе0. Сравнение чувствительно к регистру. Для выполнения сравнения без учёта регистра используйте преобразование строк с помощью выражений-генераторов для преобразования строк. Например, следующее выражение имеет значение1если${foo}равно любому из значенийBAR,Bar,bar, и т.д.$<STREQUAL:$<UPPER_CASE:${foo}>,BAR>
-
$<EQUAL:value1,value2> -
1еслиvalue1иvalue2численно равны, иначе0.
Сравнения версий
-
$<VERSION_LESS:v1,v2> -
1еслиv1меньше версииv2, иначе0.
-
$<VERSION_GREATER:v1,v2> -
1еслиv1больше версииv2, иначе0.
-
$<VERSION_EQUAL:v1,v2> -
1еслиv1равна версииv2, иначе0.
-
$<VERSION_LESS_EQUAL:v1,v2> -
Новое в версии 3.7.
1еслиv1меньше или равна версииv2, иначе0.
-
$<VERSION_GREATER_EQUAL:v1,v2> -
Новое в версии 3.7.
1еслиv1больше или равна версииv2, иначе0.
Преобразования строк
-
$<LOWER_CASE:string> -
Содержимое
stringпреобразуется в нижний регистр.
-
$<UPPER_CASE:string> -
Содержимое
stringпреобразуется в верхний регистр.
-
$<MAKE_C_IDENTIFIER:...> -
Содержимое
...преобразуется в идентификатор языка C. Преобразование происходит так же, как и в командеstring(MAKE_C_IDENTIFIER).
Выражения для списков
Большинство выражений в этом разделе тесно связаны с командой list(), обеспечивая аналогичные возможности, но в форме выражений-генераторов.
В каждом из следующих выражений-генераторов, связанных со списками, list не должно содержать запятых, если выражение-генератор ожидает чего-то после list. Например, выражение $<LIST:FIND,list,value> требует value после list. Поскольку запятая используется для разделения list и value, list не может содержать запятую. Это ограничение не распространяется на команду list(), оно относится только к выражениям-генераторам для работы со списками.
Сравнения списков
-
$<IN_LIST:string,list> -
Новое в версии 3.12.
1еслиstringявляется элементом в списке, разделённом точками с запятойlist, иначе0. Используется сравнение, чувствительное к регистру.
Запросы к списку
-
$<LIST:LENGTH,list> -
Новое в версии 3.27.
Количество элементов в списке
list.
- $<LIST:GET,list,index,...>
-
Новое в версии 3.27.
Развертывается в список элементов, заданных индексами из
list.
- $<LIST:SUBLIST,list,begin,length>
-
Новое в версии 3.27.
Подсписок заданного
list. Еслиlengthравно 0, возвращается пустой список. Еслиlengthравно -1 или список меньшеbegin + length, возвращаются оставшиеся элементы списка, начиная сbegin.
- $<LIST:FIND,list,value>
-
Новое в версии 3.27.
Индекс первого элемента в
listс указаннымvalue, или -1, еслиvalueне находится вlist.
Преобразования списков
- $<LIST:JOIN,list,glue>
-
Новое в версии 3.27.
Преобразует
listв строку, вставляя содержимое строкиglueмежду каждым элементом. По концепции это аналогично операции$<JOIN:list,glue>, но у них разное поведение в отношении пустых элементов.$<LIST:JOIN,list,glue>сохраняет все пустые элементы, тогда как$<JOIN:list,glue>удаляет все пустые элементы из списка.
- $<LIST:APPEND,list,item,...>
-
Новое в версии 3.27.
Список
listс добавленными к немуitem. Несколько элементов должны быть разделены запятыми.
- $<LIST:PREPEND,list,item,...>
-
Новое в версии 3.27.
Список
listс добавленнымиitemв начале. Если несколько элементов, они должны быть разделены запятыми, и порядок добавленных элементов будет сохранён.
- $<LIST:INSERT,list,index,item,...>
-
Новое в версии 3.27.
Список
listс вставленнымиitem(или несколькими элементами) по указанномуindex. Несколько элементов должны быть разделены запятыми.Ошибка, если указан несуществующий
index. Допустимые индексы от 0 до N, где N — длина списка включительно. Длина пустого списка равна 0.
- $<LIST:POP_BACK,list>
-
Новое в версии 3.27.
Список
listс удалённым последним элементом.
- $<LIST:POP_FRONT,list>
-
Новое в версии 3.27.
Список
listс удалённым первым элементом.
- $<LIST:REMOVE_ITEM,list,value,...>
-
New in version 3.27.
Список
listсо всеми экземплярами заданныхvalue(или значений) удалены. Если задано несколько значений, они должны быть разделены запятыми.
- $<LIST:REMOVE_AT,list,index,...>
-
New in version 3.27.
Список
listс элементом в каждом заданномindexудален.
- $<LIST:REMOVE_DUPLICATES,list>
-
New in version 3.27.
Список
listсо всеми дублирующимися элементами удалены. Относительный порядок элементов сохраняется, но если встречаются дубликаты, сохраняется только первый экземпляр. Результат совпадает с$<REMOVE_DUPLICATES:list>.
- $<LIST:FILTER,list,INCLUDE|EXCLUDE,regex>
-
New in version 3.27.
Список элементов из
list, которые соответствуют (INCLUDE) или не соответствуют (EXCLUDE) регулярному выражениюregex. Результат совпадает с$<FILTER:list,INCLUDE|EXCLUDE,regex>.
- $<LIST:TRANSFORM,list,ACTION[,SELECTOR]>
-
New in version 3.27.
Список
listпреобразован путём примененияACTIONко всем или, указавSELECTOR, к выбранным элементам списка.Примечание
Подкоманда
TRANSFORMне изменяет количество элементов в списке. Если указанSELECTOR, будут изменены только некоторые элементы, остальные останутся такими же, как и до преобразования.ACTIONопределяет действие, которое должно быть применено к элементам списка. Действия имеют точно такие же семантику, как и для командыlist(TRANSFORM).ACTIONдолжен быть одним из следующих:-
APPEND,PREPEND -
Добавить, добавить в начало заданное значение к каждому элементу списка.
$<LIST:TRANSFORM,list,(APPEND|PREPEND),value[,SELECTOR]>
-
TOLOWER,TOUPPER -
Преобразовать каждый элемент списка в нижний, верхний регистр.
$<LIST:TRANSFORM,list,(TOLOWER|TOUPPER)[,SELECTOR]>
-
STRIP -
Удалить начальные и конечные пробелы из каждого элемента списка.
$<LIST:TRANSFORM,list,STRIP[,SELECTOR]>
-
REPLACE: -
Сопоставить регулярное выражение как можно больше раз и заменить выражение замены на соответствие для каждого элемента списка.
$<LIST:TRANSFORM,list,REPLACE,regular_expression,replace_expression[,SELECTOR]>
SELECTORопределяет, какие элементы списка будут преобразованы. Одновременно можно указать только один тип селектора. При указанииSELECTORдолжен быть одним из следующих:-
AT -
Указать список индексов.
$<LIST:TRANSFORM,list,ACTION,AT,index[,index...]>
-
FOR -
Указать диапазон с, необязательно, приращением, используемым для перебора диапазона.
$<LIST:TRANSFORM,list,ACTION,FOR,start,stop[,step]>
-
REGEX -
Указать регулярное выражение. Будут преобразованы только элементы, соответствующие регулярному выражению.
$<LIST:TRANSFORM,list,ACTION,REGEX,regular_expression>
-
-
$<JOIN:list,glue> -
Объединяет
listс содержимымglueстрока, вставленная между каждым элементом. Это концептуально такая же операция, как $<LIST:JOIN,list,glue>, но у двух есть разное поведение по отношению к пустым элементам. $<LIST:JOIN,list,glue> сохраняет все пустые элементы, тогда как$<JOIN,list,glue>отбрасывает все пустые элементы из списка.
-
$<REMOVE_DUPLICATES:list> -
New in version 3.15.
Удаляет дублирующие элементы в заданном
list. Относительный порядок элементов сохраняется, и если встречаются дубликаты, сохраняется только первый экземпляр. Результат совпадает с $<LIST:REMOVE_DUPLICATES,list>.
-
$<FILTER:list,INCLUDE|EXCLUDE,regex> -
New in version 3.15.
Включает или удаляет элементы из
listкоторые соответствуют регулярному выражениюregex. Результат совпадает с $<LIST:FILTER,list,INCLUDE|EXCLUDE,regex>.
Сортировка списка
- $<LIST:REVERSE,list>
-
New in version 3.27.
Список
listс элементами в обратном порядке.
- $<LIST:SORT,list[,(COMPARE:option|CASE:option|ORDER:option)]...>
-
New in version 3.27.
Список
listотсортирован в соответствии со специфицированными параметрами.Используйте один из
COMPAREпараметров для выбора метода сравнения для сортировки:-
STRING -
Сортирует список строк в алфавитном порядке. Это поведение по умолчанию, если параметр
COMPAREне задан. -
FILE_BASENAME -
Сортирует список путей к файлам по их именам файлов.
-
NATURAL -
Сортирует список строк в естественном порядке (см. справку для
strverscmp(3)), таким образом, что смежные цифры сравниваются как целые числа. Например, следующий список10.0 1.1 2.1 8.0 2.0 3.1будет отсортирован как1.1 2.0 2.1 3.1 8.0 10.0если выбран параметр сравненияNATURAL, тогда как он будет отсортирован как1.1 10.0 2.0 2.1 3.1 8.0с параметром сравненияSTRING.
Используйте один из
CASEпараметров для выбора режима сортировки, чувствительной или нечувствительной к регистру:-
SENSITIVE -
Элементы списка сортируются по регистру. Это поведение по умолчанию, если параметр
CASEне задан. -
INSENSITIVE -
Элементы списка сортируются без учёта регистра. Порядок элементов, которые различаются только регистром, не определён.
Для управления порядком сортировки можно указать один из
ORDERпараметров:-
ASCENDING -
Сортирует список в возрастающем порядке. Это поведение по умолчанию, если параметр
ORDERне задан. -
DESCENDING -
Сортирует список в убывающем порядке.
Параметры могут быть указаны в любом порядке, но указание одного и того же параметра несколько раз является ошибкой.
$<LIST:SORT,list,CASE:SENSITIVE,COMPARE:STRING,ORDER:DESCENDING>
-
Выражения путей
Большинство выражений в этом разделе тесно связаны с командой cmake_path(), предоставляя те же возможности, но в форме выражения генератора.
Для всех выражений генератора в этом разделе ожидается, что пути будут в формате CMake. Выражение генератора $<PATH:CMAKE_PATH> может быть использовано для преобразования системного пути в путь в формате CMake.
Сравнение путей
-
$<PATH_EQUAL:path1,path2> -
New in version 3.24.
Сравнивает лексические представления двух путей. Никакая нормализация не выполняется для ни одного из путей. Возвращает
1если пути равны,0в противном случае.См. cmake_path(COMPARE) для получения более подробной информации.
Запросы путей
Эти выражения предоставляют возможности генерации времени, эквивалентные параметрам запроса Query команды cmake_path(). Все пути ожидаются в формате CMake.
-
$<PATH:HAS_*,path> -
New in version 3.24.
Следующие операции возвращают
1если конкретный компонент пути присутствует,0в противном случае. См. Структура и терминология пути для значения каждого компонента пути.$<PATH:HAS_ROOT_NAME,path> $<PATH:HAS_ROOT_DIRECTORY,path> $<PATH:HAS_ROOT_PATH,path> $<PATH:HAS_FILENAME,path> $<PATH:HAS_EXTENSION,path> $<PATH:HAS_STEM,path> $<PATH:HAS_RELATIVE_PART,path> $<PATH:HAS_PARENT_PATH,path>
Обратите внимание на следующие частные случаи:
- Для
HAS_ROOT_PATH, истинный результат будет возвращён только если по крайней мере один изroot-nameилиroot-directoryнепустой. - Для
HAS_PARENT_PATH, корневой каталог также считается имеющим родительский каталог, который будет сам по себе. Результат является истинным, за исключением случая, когда путь состоит только из имени файла.
- Для
- $<PATH:IS_ABSOLUTE,path>
-
Новое в версии 3.24.
Возвращает
1если путь является абсолютным,0в противном случае.
- $<PATH:IS_RELATIVE,path>
-
Новое в версии 3.24.
Это вернёт противоположное
IS_ABSOLUTE.
- $<PATH:IS_PREFIX[,NORMALIZE],path,input>
-
Новое в версии 3.24.
Возвращает
1еслиpathявляется префиксомinput,0в противном случае.Когда указан параметр
NORMALIZE,pathиinputнормализуются перед проверкой.
Декомпозиция путей
Эти выражения предоставляют возможности генерации, эквивалентные параметрам Разложения опций команды cmake_path(). Все пути ожидаются в формате CMake.
- $<PATH:GET_*,...>
-
Новое в версии 3.24.
Следующие операции извлекают различные компоненты или группы компонентов из пути. См. Структура и терминология путей для значения каждого компонента пути.
Изменено в версии 3.27: Все операции теперь принимают список путей в качестве аргумента. При указании списка путей операция будет применена к каждому пути.
$<PATH:GET_ROOT_NAME,path...> $<PATH:GET_ROOT_DIRECTORY,path...> $<PATH:GET_ROOT_PATH,path...> $<PATH:GET_FILENAME,path...> $<PATH:GET_EXTENSION[,LAST_ONLY],path...> $<PATH:GET_STEM[,LAST_ONLY],path...> $<PATH:GET_RELATIVE_PART,path...> $<PATH:GET_PARENT_PATH,path...>
Если запрашиваемый компонент отсутствует в пути, возвращается пустая строка.
Преобразования путей
Эти выражения предоставляют возможности генерации, эквивалентные параметрам Модификации и Генерации команды cmake_path(). Все пути ожидаются в формате CMake.
Изменено в версии 3.27: Все операции теперь принимают список путей в качестве аргумента. При указании списка путей операция будет применена к каждому пути.
- $<PATH:CMAKE_PATH[,NORMALIZE],path...>
-
Новое в версии 3.24.
Возвращает
path. Еслиpathэто системный путь, он преобразуется в путь CMake со слешами вперед (/). В Windows учитывается маркер длинного имени файла.Когда указан параметр
NORMALIZE, путь нормализуется после преобразования.
- $<PATH:APPEND,path...,input,...>
-
Новое в версии 3.24.
Возвращает все аргументы
inputдобавленные кpathиспользуя/в качествеdirectory-separator. В зависимости отinput, значениеpathможет быть отброшено.См. cmake_path(APPEND) для более подробной информации.
- $<PATH:REMOVE_FILENAME,path...>
-
Новое в версии 3.24.
Возвращает
pathс удалённым компонентом имени файла (как возвращается$<PATH:GET_FILENAME>). После удаления любые завершающиеdirectory-separatorостаются без изменений, если присутствуют.См. cmake_path(REMOVE_FILENAME) для более подробной информации.
- $<PATH:REPLACE_FILENAME,path...,input>
-
Новое в версии 3.24.
Возвращает
pathс компонентом имени файла, заменённым наinput. Если уpathнет компонента имени файла (т.е.$<PATH:HAS_FILENAME>возвращает0),pathне изменяется.См. cmake_path(REPLACE_FILENAME) для более подробной информации.
- $<PATH:REMOVE_EXTENSION[,LAST_ONLY],path...>
-
Новое в версии 3.24.
Возвращает
pathс удалённым расширением, если таковое есть.См. cmake_path(REMOVE_EXTENSION) для более подробной информации.
- $<PATH:REPLACE_EXTENSION[,LAST_ONLY],path...,input>
-
Новое в версии 3.24.
Возвращает
pathс расширением, заменённым наinput, если таковое есть.См. cmake_path(REPLACE_EXTENSION) для более подробной информации.
- $<PATH:NORMAL_PATH,path...>
-
Новое в версии 3.24.
Возвращает
pathнормализованный в соответствии с шагами, описанными в Нормализации.
- $<PATH:RELATIVE_PATH,path...,base_directory>
-
Новое в версии 3.24.
Возвращает
path, изменённый для относительности к аргументуbase_directory.См. cmake_path(RELATIVE_PATH) для более подробной информации.
- $<PATH:ABSOLUTE_PATH[,NORMALIZE],path...,base_directory>
-
Новое в версии 3.24.
Возвращает
pathв виде абсолютного пути. Еслиpathявляется относительным путем ($<PATH:IS_RELATIVE>возвращает1), он вычисляется относительно заданного базового каталога, указанного аргументомbase_directory.Когда указан параметр
NORMALIZE, путь нормализуется после вычисления пути.См. cmake_path(ABSOLUTE_PATH) для более подробной информации.
Пути оболочки
-
$<SHELL_PATH:...> -
Новое в версии 3.4.
Содержимое
...преобразуется в стиль пути оболочки. Например, слэши преобразуются в обратные слэши в оболочках Windows, а буквы дисков — в пути POSIX в оболочках MSYS....должен быть абсолютным путём.Новое в версии 3.14: Аргумент
...может быть списком, разделённым точкой с запятой путей, в этом случае каждый путь преобразуется индивидуально, и результат генерируется с использованием разделителя путей оболочки (:на POSIX и;на Windows). Не забудьте заключить аргумент, содержащий этот genex, в двойные кавычки в коде CMake, чтобы;не разделил аргументы.
Выражения конфигурации
-
$<CONFIG> -
Имя конфигурации. Используйте это вместо устаревшего выражения генератора
CONFIGURATION.
- $<CONFIG:cfgs>
-
1если конфигурация совпадает с любым из элементов в списке, разделённом запятымиcfgs, иначе0. Это сравнение не учитывает регистр. Сопоставление вMAP_IMPORTED_CONFIG_<CONFIG>также учитывается при вычислении на свойстве целевогоIMPORTEDобъекта.Изменено в версии 3.19: Для
cfgsможно указать несколько конфигураций. CMake 3.18 и более ранние версии принимали только одну конфигурацию.
-
$<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, выражения генератора в...вычисляются, используя "командную конфигурацию" пользовательской команды. С другими генераторами содержимое...вычисляется в обычном режиме.
Toolchain And Language Expressions
Platform
-
$<PLATFORM_ID> -
Идентификатор платформы текущей системы CMake. Смотрите также переменную
CMAKE_SYSTEM_NAME.
- $<PLATFORM_ID:platform_ids>
-
1если идентификатор платформы CMake совпадает с любым из элементов в списке, разделённом запятымиplatform_ids, иначе0. Смотрите также переменнуюCMAKE_SYSTEM_NAME.
Compiler Version
Смотрите также переменную CMAKE_<LANG>_COMPILER_VERSION, которая тесно связана с выражениями в этом подразделе.
-
$<C_COMPILER_VERSION> -
Версия используемого компилятора C.
- $<C_COMPILER_VERSION:version>
-
1если версия компилятора C совпадает сversion, иначе0.
-
$<CXX_COMPILER_VERSION> -
Версия используемого компилятора C++.
- $<CXX_COMPILER_VERSION:version>
-
1если версия компилятора C++ совпадает сversion, иначе0.
-
$<CUDA_COMPILER_VERSION> -
Добавлено в версии 3.15.
Версия используемого компилятора CUDA.
- $<CUDA_COMPILER_VERSION:version>
-
Добавлено в версии 3.15.
1если версия компилятора C++ совпадает сversion, иначе0.
-
$<OBJC_COMPILER_VERSION> -
Добавлено в версии 3.16.
Версия используемого компилятора Objective-C.
- $<OBJC_COMPILER_VERSION:version>
-
Добавлено в версии 3.16.
1если версия компилятора Objective-C совпадает сversion, иначе0.
-
$<OBJCXX_COMPILER_VERSION> -
Добавлено в версии 3.16.
Версия используемого компилятора Objective-C++.
- $<OBJCXX_COMPILER_VERSION:version>
-
Добавлено в версии 3.16.
1если версия компилятора Objective-C++ совпадает сversion, иначе0.
-
$<Fortran_COMPILER_VERSION> -
Версия используемого компилятора Fortran.
- $<Fortran_COMPILER_VERSION:version>
-
1если версия компилятора Fortran совпадает сversion, иначе0.
-
$<HIP_COMPILER_VERSION> -
Добавлено в версии 3.21.
Версия используемого компилятора HIP.
- $<HIP_COMPILER_VERSION:version>
-
Добавлено в версии 3.21.
1если версия компилятора HIP совпадает сversion, иначе0.
-
$<ISPC_COMPILER_VERSION> -
Добавлено в версии 3.19.
Версия используемого компилятора ISPC.
- $<ISPC_COMPILER_VERSION:version>
-
Добавлено в версии 3.19.
1если версия компилятора ISPC совпадает сversion, иначе0.
Compiler Language, ID, and Frontend-Variant
Смотрите также переменные CMAKE_<LANG>_COMPILER_ID и CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT, которые тесно связаны с большинством выражений в этом подразделе.
-
$<C_COMPILER_ID> -
Идентификатор компилятора C, используемый CMake.
- $<C_COMPILER_ID:compiler_ids>
-
где
compiler_ids- список, разделённый запятыми.1если идентификатор компилятора C CMake совпадает с любым из элементов вcompiler_ids, иначе0.Изменено в версии 3.15: Можно указать несколько
compiler_ids. CMake 3.14 и более ранние версии принимали только один идентификатор компилятора.
-
$<CXX_COMPILER_ID> -
Идентификатор компилятора C++, используемый CMake.
- $<CXX_COMPILER_ID:compiler_ids>
-
где
compiler_ids- список, разделённый запятыми.1если идентификатор компилятора C++ CMake совпадает с любым из элементов вcompiler_ids, иначе0.Изменено в версии 3.15: Можно указать несколько
compiler_ids. CMake 3.14 и более ранние версии принимали только один идентификатор компилятора.
-
$<CUDA_COMPILER_ID> -
Добавлено в версии 3.15.
Идентификатор компилятора CUDA, используемый CMake.
- $<CUDA_COMPILER_ID:compiler_ids>
-
Новое в версии 3.15.
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake CUDA-компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<OBJC_COMPILER_ID> -
Новое в версии 3.16.
Идентификатор компилятора CMake используемого Objective-C компилятора.
- $<OBJC_COMPILER_ID:compiler_ids>
-
Новое в версии 3.16.
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake Objective-C компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<OBJCXX_COMPILER_ID> -
Новое в версии 3.16.
Идентификатор компилятора CMake используемого Objective-C++ компилятора.
- $<OBJCXX_COMPILER_ID:compiler_ids>
-
Новое в версии 3.16.
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake Objective-C++ компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<Fortran_COMPILER_ID> -
Идентификатор компилятора CMake используемого Fortran компилятора.
- $<Fortran_COMPILER_ID:compiler_ids>
-
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake Fortran компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.Изменено в версии 3.15: Можно указать несколько
compiler_ids. CMake 3.14 и более ранние версии принимали только один идентификатор компилятора.
-
$<HIP_COMPILER_ID> -
Новое в версии 3.21.
Идентификатор компилятора CMake используемого HIP компилятора.
- $<HIP_COMPILER_ID:compiler_ids>
-
Новое в версии 3.21.
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake HIP компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<ISPC_COMPILER_ID> -
Новое в версии 3.19.
Идентификатор компилятора CMake используемого ISPC компилятора.
- $<ISPC_COMPILER_ID:compiler_ids>
-
Новое в версии 3.19.
где
compiler_ids— это список, разделенный запятыми.1если идентификатор компилятора CMake ISPC компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<C_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Вариант фронтэнда компилятора CMake используемого C компилятора.
- $<C_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake C компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<CXX_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Вариант фронтэнда компилятора CMake используемого C++ компилятора.
- $<CXX_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake C++ компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<CUDA_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Идентификатор компилятора CMake используемого CUDA компилятора.
- $<CUDA_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake CUDA компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<OBJC_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Вариант фронтэнда компилятора CMake используемого Objective-C компилятора.
- $<OBJC_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake Objective-C компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<OBJCXX_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Вариант фронтэнда компилятора CMake используемого Objective-C++ компилятора.
- $<OBJCXX_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake Objective-C++ компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<Fortran_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Идентификатор компилятора CMake используемого Fortran компилятора.
- $<Fortran_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake Fortran компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<HIP_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Идентификатор компилятора CMake используемого HIP компилятора.
- $<HIP_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake HIP компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<ISPC_COMPILER_FRONTEND_VARIANT> -
Новое в версии 3.30.
Идентификатор компилятора CMake используемого ISPC компилятора.
- $<ISPC_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Новое в версии 3.30.
где
compiler_ids— это список, разделенный запятыми.1если вариант фронтэнда компилятора CMake ISPC компилятора совпадает с одним из элементов вcompiler_ids, в противном случае0.
-
$<COMPILE_LANGUAGE> -
Новое в версии 3.3.
Язык компиляции исходных файлов при оценке параметров компиляции. См. соответствующее булево выражение
$<COMPILE_LANGUAGE:language>для заметок о портативности этого выражения генератора.
- $<COMPILE_LANGUAGE:languages>
-
Новое в версии 3.3.
Изменено в версии 3.15: Для
languagesмогут быть указаны несколько языков. CMake 3.14 и более ранние версии принимали только один язык.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)
-
$<COMPILE_LANG_AND_ID:language,compiler_ids> -
Новое в версии 3.15.
1когда язык, используемый для компиляции блока, соответствуетlanguage, а идентификатор компилятора CMake для компилятораlanguageсоответствует одному из значений, перечисленных через запятую в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_FEATURES:features> -
Новое в версии 3.1.
где
features— список значений, разделённых запятыми. Возвращает значение1, если все указанныеfeaturesдоступны для целевого объекта 'head', и0в противном случае. Если это выражение используется при вычислении реализации ссылки целевого объекта и если какая-либо зависимость транзитивно увеличивает требуемыеC_STANDARDилиCXX_STANDARDдля целевого объекта 'head', отображается ошибка. См. руководствоcmake-compile-features(7)для получения информации о свойствах компиляции и списке поддерживаемых компиляторов.
Контекст компиляции
-
$<COMPILE_ONLY:...> -
Новое в версии 3.27.
Содержимое
..., при сборе свойств компиляции, в противном случае — пустая строка. Предназначено для использования в свойствах целевого объектаINTERFACE_LINK_LIBRARIESиLINK_LIBRARIES, обычно заполняемых с помощью командыtarget_link_libraries(). Определяет требования к компиляции без каких-либо требований к линковке.Примеры использования включают использование только заголовков, где известно, что все использования не требуют линковки (например, все библиотеки на основе заголовков или шаблонов C++).
Обратите внимание, что для правильного вычисления этого выражения требуется, чтобы политика
CMP0099была установлена в значениеNEW.
Язык и идентификатор линковки
-
$<LINK_LANGUAGE> -
Новое в версии 3.18.
Язык линковки целевого объекта при оценке опций линковки. См. соответствующее булево выражение
$<LINK_LANGUAGE:languages>для заметок о переносимости этого выражения генератора.Примечание
Это выражение генератора не поддерживается свойствами библиотек линковки, чтобы избежать побочных эффектов из-за двойной оценки этих свойств.
- $<LINK_LANGUAGE:languages>
-
Новое в версии 3.18.
1если язык, используемый для шага линковки, соответствует любому из значений, перечисленных через запятую вlanguages, в противном случае0. Это выражение может быть использовано для указания библиотек линковки, опций линковки, каталогов линковки и зависимостей линковки для конкретного языка в целевом объекте. Например:add_library(api_C ...) add_library(api_CXX ...) add_library(api INTERFACE) target_link_options(api INTERFACE $<$<LINK_LANGUAGE:C>:-opt_c> $<$<LINK_LANGUAGE:CXX>:-opt_cxx>) target_link_libraries(api INTERFACE $<$<LINK_LANGUAGE:C>:api_C> $<$<LINK_LANGUAGE:CXX>:api_CXX>) add_executable(myapp1 main.c) target_link_options(myapp1 PRIVATE api) add_executable(myapp2 main.cpp) target_link_options(myapp2 PRIVATE api)Это указывает на использование целевого объекта
apiдля линковки целевых объектовmyapp1иmyapp2. На практике,myapp1будет линковаться с целевым объектомapi_Cи опцией-opt_c, потому что он будет использоватьCв качестве языка линковки. Аmyapp2будет линковаться сapi_CXXи опцией-opt_cxx, потому чтоCXXбудет языком линковки.Примечание
Для определения языка линковки целевого объекта необходимо транзитивно собрать все целевые объекты, которые будут линковаться к нему. Поэтому для свойств библиотек линковки будет выполнена двойная оценка. Во время первой оценки выражения
$<LINK_LANGUAGE:..>всегда возвращают0. Язык линковки, вычисленный после этого первого прохода, будет использован для второго прохода. Чтобы избежать несоответствия, необходимо, чтобы второй проход не изменял язык линковки. Более того, чтобы избежать неожиданных побочных эффектов, необходимо указывать полные сущности в качестве части выражения$<LINK_LANGUAGE:..>. Например:add_library(lib STATIC file.cxx) add_library(libother STATIC file.c) # bad usage add_executable(myapp1 main.c) target_link_libraries(myapp1 PRIVATE lib$<$<LINK_LANGUAGE:C>:other>) # correct usage add_executable(myapp2 main.c) target_link_libraries(myapp2 PRIVATE $<$<LINK_LANGUAGE:C>:libother>)
В этом примере, для
myapp1, первый проход, неожиданно, определит, что язык линковки —CXX, потому что оценка выражения генератора будет пустой строкой, поэтомуmyapp1будет зависеть от целевого объектаlib, который являетсяC++. Напротив, дляmyapp2, первая оценка дастCв качестве языка линковки, поэтому второй проход правильно добавит целевой объектlibotherкак зависимость линковки.
-
$<LINK_LANG_AND_ID:language,compiler_ids> -
Новое в версии 3.18.
1когда язык, используемый для шага линковки, соответствуетlanguage, и идентификатор компилятора CMake для линковщика языка соответствует одному из значений, перечисленных через запятую вcompiler_ids, в противном случае0. Это выражение является сокращением для комбинации$<LINK_LANGUAGE:language>и$<LANG_COMPILER_ID:compiler_ids>. Это выражение может быть использовано для указания библиотек линковки, опций линковки, каталогов линковки и зависимостей линковки для определенной комбинации языка и линковщика в целевом объекте. Например:add_library(libC_Clang ...) add_library(libCXX_Clang ...) add_library(libC_Intel ...) add_library(libCXX_Intel ...) add_executable(myapp main.c) if (CXX_CONFIG) target_sources(myapp PRIVATE file.cxx) endif() target_link_libraries(myapp PRIVATE $<$<LINK_LANG_AND_ID:CXX,Clang,AppleClang>:libCXX_Clang> $<$<LINK_LANG_AND_ID:C,Clang,AppleClang>:libC_Clang> $<$<LINK_LANG_AND_ID:CXX,Intel>:libCXX_Intel> $<$<LINK_LANG_AND_ID:C,Intel>:libC_Intel>)Это указывает на использование различных библиотек линковки, основываясь на идентификаторе компилятора и языке линковки. В этом примере целевой объект
libCXX_Clangбудет зависимостью линковки, когдаClangилиAppleClangявляется линковщикомCXX, иlibCXX_Intel, когдаIntelявляется линковщикомCXX. Аналогично, когда линковщикC—ClangилиAppleClang, целевой объектlibC_Clangбудет добавлен в качестве зависимости линковки, аlibC_Intel, когдаIntelявляется линковщикомC.См. примечание, связанное с
$<LINK_LANGUAGE:language>для ограничений использования этого выражения генератора.
Свойства линковки
-
$<LINK_LIBRARY:feature,library-list> -
Новое в версии 3.24.
Укажите набор библиотек для линковки с целевым объектом, а также
feature, который предоставляет подробную информацию о том, как они должны быть слинкованы. Например:add_library(lib1 STATIC ...) add_library(lib2 ...) target_link_libraries(lib2 PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,lib1>")
Это указывает, что
lib2должен быть слинкован сlib1и использовать функциюWHOLE_ARCHIVEпри этом.Имена функций чувствительны к регистру и могут содержать только буквы, цифры и символы подчеркивания. Имена функций, определенные в верхнем регистре, зарезервированы для собственных встроенных функций CMake. Предопределенные встроенные функции библиотек:
-
DEFAULT -
Эта функция соответствует стандартной линковке, по сути, эквивалентной отсутствию функции. Обычно используется только с
LINK_LIBRARY_OVERRIDEиLINK_LIBRARY_OVERRIDE_<LIBRARY>свойствами целевого объекта. -
WHOLE_ARCHIVE -
Принудительное включение всех элементов статической библиотеки. Эта функция поддерживается только для следующих платформ с ограничениями, как указано:
- Linux.
- Все варианты BSD.
- SunOS.
- Все варианты Apple. Библиотека должна быть указана как имя целевого объекта CMake, имя файла библиотеки (например,
libfoo.a) или путь к файлу библиотеки (например,/path/to/libfoo.a). Из-за ограничения Apple linker, она не может быть указана как простое имя библиотеки, например,foo, гдеfooне является целевым объектом CMake. - Windows. При использовании MSVC или аналогичной цепочки инструментов, версия MSVC должна быть больше 1900.
- Cygwin.
- MSYS.
-
FRAMEWORK -
Этот параметр сообщает линковщику найти указанную фреймворк с помощью параметра линковщика
-framework. Он может использоваться только на платформах Apple и только с линковщиком, понимающим используемый параметр (т.е. линковщик, поставляемый с Xcode или совместимый с ним).Фреймворк может быть указан как целевой объект фреймворка CMake, простое имя фреймворка или путь к файлу. Если указан целевой объект, у этого целевого объекта должно быть установлено свойство целевого объекта
FRAMEWORKв значение true. Для пути к файлу, если он содержит часть каталога, этот каталог будет добавлен в путь поиска фреймворков.add_library(lib SHARED ...) target_link_libraries(lib PRIVATE "$<LINK_LIBRARY:FRAMEWORK,/path/to/my_framework>") # The constructed linker command line will contain: # -F/path/to -framework my_framework
Пути к файлам должны соответствовать одному из следующих шаблонов (
*- символ подстановки, а необязательные части показаны как[...]):[/path/to/]FwName[.framework][/path/to/]FwName.framework/FwName[suffix][/path/to/]FwName.framework/Versions/*/FwName[suffix]
Обратите внимание, что CMake распознает и автоматически обрабатывает целевые объекты фреймворков, даже без использования выражения
$<LINK_LIBRARY:FRAMEWORK,...>. Выражение генератора все же можно использовать с целевым объектом CMake, если проект хочет быть явным в этом, но это не обязательно. Команда линковщика может иметь некоторые различия при использовании выражения генератора или без него, но конечный результат должен быть одинаковым. С другой стороны, если указан путь к файлу, CMake будет распознавать некоторые пути автоматически, но не все случаи. Проект может использовать$<LINK_LIBRARY:FRAMEWORK,...>для путей к файлам, чтобы ожидаемое поведение было ясным.Новое в версии 3.25: Свойство целевого объекта
FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>а такжеsuffixимени библиотеки фреймворка теперь поддерживаются функциямиFRAMEWORK. -
NEEDED_FRAMEWORK -
Это аналогично функции
FRAMEWORK, за исключением того, что она принуждает линковщик к линковке с фреймворком, даже если из него не используются символы. Использует параметр-needed_frameworkи имеет те же ограничения линковщика, что иFRAMEWORK. -
REEXPORT_FRAMEWORK -
Это аналогично функции
FRAMEWORK, за исключением того, что она сообщает линковщику, что фреймворк должен быть доступен клиентам, линкованным с создаваемой библиотекой. Использует параметр-reexport_frameworkи имеет те же ограничения линковщика, что иFRAMEWORK. -
WEAK_FRAMEWORK -
Это аналогично функции
FRAMEWORK, за исключением того, что она принуждает линковщик пометить фреймворк и все ссылки на него как слабые импорты. Использует параметр-weak_frameworkи имеет те же ограничения линковщика, что иFRAMEWORK. -
NEEDED_LIBRARY -
Это аналогично функции
NEEDED_FRAMEWORK, за исключением того, что она предназначена для использования с целевыми объектами или библиотеками, не являющимися фреймворками (только платформы Apple). Использует параметр-needed_libraryили-needed-lсоответственно и имеет те же ограничения линковщика, что иNEEDED_FRAMEWORK. -
REEXPORT_LIBRARY -
Это аналогично функции
REEXPORT_FRAMEWORK, за исключением того, что она предназначена для использования с целевыми объектами или библиотеками, не являющимися фреймворками (только платформы Apple). Использует параметр-reexport_libraryили-reexport-lсоответственно и имеет те же ограничения линковщика, что иREEXPORT_FRAMEWORK. -
WEAK_LIBRARY -
Это аналогично функции
WEAK_FRAMEWORK, за исключением того, что она предназначена для использования с целевыми объектами или библиотеками, не являющимися фреймворками (только платформы Apple). Использует параметр-weak_libraryили-weak-lсоответственно и имеет те же ограничения линковщика, что иWEAK_FRAMEWORK.
Встроенные и настраиваемые функции библиотек определяются в терминах следующих переменных:
CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>_SUPPORTEDCMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>CMAKE_LINK_LIBRARY_USING_<FEATURE>_SUPPORTEDCMAKE_LINK_LIBRARY_USING_<FEATURE>
Значение, используемое для каждой из этих переменных, равно значению, установленному в конце области каталога, в которой был создан целевой объект. Использование:
- Если языковая переменная
CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>_SUPPORTEDимеет значение true, переменнаяfeatureдолжна быть определена соответствующей переменнойCMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>. - Если не поддерживается какая-либо языковая
feature, переменнаяCMAKE_LINK_LIBRARY_USING_<FEATURE>_SUPPORTEDдолжна иметь значение true, и переменнаяfeatureдолжна быть определена соответствующей переменнойCMAKE_LINK_LIBRARY_USING_<FEATURE>.
Следует обратить внимание на следующие ограничения:
-
- Выражение
library-listможет указывать на CMake-цели или библиотеки. Любая CMake-цель типа ОБЪЕКТ или ИНТЕРФЕЙС проигнорирует аспект функции выражения и вместо этого будет связана стандартным образом. - Генераторское выражение
$<LINK_LIBRARY:...>может использоваться только для указания библиотек для линковки. На практике это означает, что оно может появляться в свойствеLINK_LIBRARIES,INTERFACE_LINK_LIBRARIESиINTERFACE_LINK_LIBRARIES_DIRECTцелевого объекта, а также быть указано в командахtarget_link_libraries()иlink_libraries(). - Если генераторское выражение
$<LINK_LIBRARY:...>появляется в свойствеINTERFACE_LINK_LIBRARIESцелевого объекта, оно будет включено в импортированную цель, сгенерированную командойinstall(EXPORT). Ответственность за определение функции линковки, используемой этим выражением, лежит на среде, потребляющей этот импорт. -
Каждая цель или библиотека, участвующая в шаге линковки, должна иметь не более одного типа функциональности библиотеки. Отсутствие функциональности также несовместимо со всеми другими функциями. Например:
add_library(lib1 ...) add_library(lib2 ...) add_library(lib3 ...) # lib1 will be associated with feature1 target_link_libraries(lib2 PUBLIC "$<LINK_LIBRARY:feature1,lib1>") # lib1 is being linked with no feature here. This conflicts with the # use of feature1 in the line above and would result in an error. target_link_libraries(lib3 PRIVATE lib1 lib2)
В тех случаях, когда невозможно использовать одну и ту же функциональность на протяжении всего сборки для данной цели или библиотеки, свойства целевого объекта
LINK_LIBRARY_OVERRIDEиLINK_LIBRARY_OVERRIDE_<LIBRARY>могут использоваться для разрешения таких несовместимостей. - Генераторское выражение
$<LINK_LIBRARY:...>не гарантирует, что список указанных целей и библиотек будет сохранён вместе. Для управления конструкциями, такими как--start-groupи--end-group, поддерживаемыми GNU-линкеромld, используйте генераторское выражениеLINK_GROUPвместо этого.
- Выражение
-
$<LINK_GROUP:feature,library-list> -
Новое в версии 3.24.
Указывает группу библиотек для подключения к целевому объекту вместе с
feature, который определяет, как эта группа должна подключаться. Например:add_library(lib1 STATIC ...) add_library(lib2 ...) target_link_libraries(lib2 PRIVATE "$<LINK_GROUP:RESCAN,lib1,external>")
Это указывает, что
lib2должен подключаться кlib1иexternal, и что обе эти библиотеки должны быть включены в командной строке компоновщика в соответствии с определением функцииRESCAN.Имена функций чувствительны к регистру и могут содержать только буквы, цифры и символы подчеркивания. Имена функций, определенные в верхнем регистре, зарезервированы для собственных встроенных функций CMake. В настоящее время существует только одна предопределенная встроенная функция группы:
-
RESCAN -
Некоторые компоновщики работают только в одном проходе. Для таких компоновщиков циклические ссылки между библиотеками обычно приводят к неразрешенным символам. Эта функция инструктирует компоновщик повторять поиск указанных статических библиотек до тех пор, пока не будут созданы новые неопределенные ссылки.
Обычно статическая библиотека ищется только один раз в порядке, в котором она указана в командной строке. Если символ в этой библиотеке необходим для разрешения неопределенного символа, на который ссылается объект в библиотеке, которая появляется позже в командной строке, компоновщик не сможет разрешить эту ссылку. Сгруппировав статические библиотеки с помощью функции
RESCAN, они будут все повторяться до тех пор, пока все возможные ссылки не будут разрешены. Для этого будут использованы параметры компоновщика, такие как--start-groupи--end-group, или на SunOS,-z rescan-startи-z rescan-end.Использование этой функции имеет существенные затраты производительности. Лучше всего использовать ее только в случае неизбежных циклических ссылок между двумя или более статическими библиотеками.
Эта функция доступна при использовании компиляторов, нацеленных на Linux, BSD и SunOS. Она также может быть использована при нацеливании на платформы Windows, если используется компилятор GNU.
Встроенные и пользовательские функции группы определяются в терминах следующих переменных:
CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>_SUPPORTEDCMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>CMAKE_LINK_GROUP_USING_<FEATURE>_SUPPORTEDCMAKE_LINK_GROUP_USING_<FEATURE>
Значение, используемое для каждой из этих переменных, — это значение, заданное в конце области каталога, в котором был создан целевой объект. Использование выглядит следующим образом:
- Если языковая переменная
CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>_SUPPORTEDимеет значение true, переменнаяfeatureдолжна быть определена соответствующей переменнойCMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>. - Если ни одна языковая
featureне поддерживается, переменнаяCMAKE_LINK_GROUP_USING_<FEATURE>_SUPPORTEDдолжна иметь значение true, а переменнаяfeatureдолжна быть определена соответствующей переменнойCMAKE_LINK_GROUP_USING_<FEATURE>.
Выражение генератора
LINK_GROUPсовместимо с выражением генератораLINK_LIBRARY. Библиотеки, участвующие в группе, могут быть указаны с помощью выражения генератораLINK_LIBRARY.Каждый целевой объект или внешняя библиотека, участвующая в этапе компоновки, может быть частью нескольких групп, но только если все участвующие группы указывают одну и ту же
feature. Такие группы не будут объединены в командной строке компоновщика; отдельные группы будут сохранены. Смешение различных функций группировки для одного и того же целевого объекта или библиотеки запрещено.add_library(lib1 ...) add_library(lib2 ...) add_library(lib3 ...) add_library(lib4 ...) add_library(lib5 ...) target_link_libraries(lib3 PUBLIC "$<LINK_GROUP:feature1,lib1,lib2>") target_link_libraries(lib4 PRIVATE "$<LINK_GROUP:feature1,lib1,lib3>") # lib4 will be linked with the groups {lib1,lib2} and {lib1,lib3}. # Both groups specify the same feature, so this is fine. target_link_libraries(lib5 PRIVATE "$<LINK_GROUP:feature2,lib1,lib3>") # An error will be raised here because both lib1 and lib3 are part of two # groups with different features.Если целевой объект или внешняя библиотека участвует в этапе компоновки как часть группы и также как не являющаяся частью какой-либо группы, любое вхождение элемента компоновки, не являющегося частью группы, будет заменено группами, к которым он принадлежит.
add_library(lib1 ...) add_library(lib2 ...) add_library(lib3 ...) add_library(lib4 ...) target_link_libraries(lib3 PUBLIC lib1) target_link_libraries(lib4 PRIVATE lib3 "$<LINK_GROUP:feature1,lib1,lib2>") # lib4 will only be linked with lib3 and the group {lib1,lib2}Поскольку
lib1является частью группы, определенной дляlib4, эта группа затем применяется к использованиюlib1дляlib3. Конечный результат будет таким, как если бы взаимоотношения компоновки дляlib3были указаны следующим образом:target_link_libraries(lib3 PUBLIC "$<LINK_GROUP:feature1,lib1,lib2>")
Следует помнить, что приоритет группы над элементом компоновки, не являющимся частью группы, может привести к циклической зависимости между группами. Если это произойдет, будет выдано сообщение об ошибке, так как циклические зависимости для групп недопустимы.
add_library(lib1A ...) add_library(lib1B ...) add_library(lib2A ...) add_library(lib2B ...) add_library(lib3 ...) # Non-group linking relationships, these are non-circular so far target_link_libraries(lib1A PUBLIC lib2A) target_link_libraries(lib2B PUBLIC lib1B) # The addition of these groups creates circular dependencies target_link_libraries(lib3 PRIVATE "$<LINK_GROUP:feat,lib1A,lib1B>" "$<LINK_GROUP:feat,lib2A,lib2B>" )
Из-за групп, определенных для
lib3, отношения компоновки дляlib1Aиlib2Bфактически расширяются до эквивалента:target_link_libraries(lib1A PUBLIC "$<LINK_GROUP:feat,lib2A,lib2B>") target_link_libraries(lib2B PUBLIC "$<LINK_GROUP:feat,lib1A,lib1B>")
Это создает циклическую зависимость между группами:
lib1A --> lib2B --> lib1A.Также следует учитывать следующие ограничения:
library-listможет указывать целевые объекты или библиотеки CMake. Любой целевой объект CMake типа ОБЪЕКТ или ИНТЕРФЕЙС проигнорирует аспект функции выражения и вместо этого будет подключен стандартным способом.- Выражение генератора
$<LINK_GROUP:...>может использоваться только для указания библиотек компоновки. На практике это означает, что оно может появляться в свойствах целевого объектаLINK_LIBRARIES,INTERFACE_LINK_LIBRARIESиINTERFACE_LINK_LIBRARIES_DIRECT, а также в командахtarget_link_libraries()иlink_libraries(). - Если выражение генератора
$<LINK_GROUP:...>появляется в свойствеINTERFACE_LINK_LIBRARIESцелевого объекта, оно будет включено в импортированный целевой объект, сгенерированный командойinstall(EXPORT). Ответственность за определение функции компоновки, используемой этим выражением, лежит на среде, потребляющей этот импорт.
-
Контекст компоновки
-
$<LINK_ONLY:...> -
Новое в версии 3.1.
Содержание
..., за исключением случаев сбора требований к использованию из транзитивных свойств компиляции, в этом случае — это пустая строка. Это предназначено для использования в свойстве целевого объектаINTERFACE_LINK_LIBRARIES, обычно заполняемого с помощью командыtarget_link_libraries(), для указания частных зависимостей компоновки без других требований к использованию, таких как каталоги включения или параметры компиляции.Новое в версии 3.24:
LINK_ONLYтакже может использоваться в свойстве целевого объектаLINK_LIBRARIES. См. политикуCMP0131.
-
$<DEVICE_LINK:list> -
Новое в версии 3.18.
Возвращает список, если это этап компоновки устройства, в противном случае пустой список. Этап компоновки устройства управляется свойствами
CUDA_SEPARABLE_COMPILATIONиCUDA_RESOLVE_DEVICE_SYMBOLSи политикойCMP0105. Это выражение может использоваться только для указания параметров компоновки.
-
$<HOST_LINK:list> -
Новое в версии 3.18.
Возвращает список, если это обычный этап компоновки, в противном случае пустой список. Это выражение в основном полезно, когда также участвует этап компоновки устройства (см. выражение генератора
$<DEVICE_LINK:list>). Это выражение может использоваться только для указания параметров компоновки.
Выражения, зависящие от целевого объекта
Метаданные целевого объекта
Эти выражения ищут информацию о целевом объекте.
-
$<TARGET_EXISTS:tgt> -
Новое в версии 3.12.
1еслиtgtсуществует как целевой объект CMake, иначе0.
-
$<TARGET_NAME_IF_EXISTS:tgt> -
Новое в версии 3.12.
Имя целевого объекта
tgtесли целевой объект существует, в противном случае пустая строка.Обратите внимание, что
tgtне добавляется как зависимость целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_NAME:tgt> -
Имя целевого объекта
tgtв том виде, как оно написано. Это отмечаетtgtкак имя целевого объекта внутри более крупного выражения, что требуется при экспорте целевых объектов в несколько зависимых наборов экспорта. Текстtgtдолжен быть буквальным именем целевого объекта; он не может содержать выражения генератора. Целевой объект не обязательно должен существовать.
-
$<TARGET_POLICY:policy> -
1еслиpolicyбылNEWпри создании целевого объекта 'head', иначе0. Еслиpolicyне был задан, будет выведено сообщение об ошибке для политики. Это выражение генератора работает только для подмножества политик.
Свойства целевого объекта
Эти выражения извлекают значения свойств целевого объекта.
-
$<TARGET_PROPERTY:tgt,prop> -
Значение свойства
propцелевого объектаtgt, или пустая строка, если свойство не задано.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.Изменено в версии 3.26: При обработке во время оценки требований к использованию целевого объекта, обычно в свойстве целевого объекта
INTERFACE_*, поискtgtимени происходит в каталоге целевого объекта, указывающего требование, а не в каталоге целевого объекта, для которого вычисляется выражение.
-
$<TARGET_PROPERTY:prop> -
Значение свойства
propдля целевого объекта, для которого вычисляется выражение, или пустая строка, если свойство не задано. Обратите внимание, что для выражений генератора в требованиях к использованию целевого объекта это целевой объект, потребляющий, а не целевой объект, указывающий требование.
Выражения имеют особые правила оценки для некоторых свойств:
- Свойства спецификации сборки целевого объекта
-
Эти выражения вычисляются как список, разделённый точкой с запятой, представляющий объединение значения самого целевого объекта со значениями соответствующих требований к использованию целевого объекта для целевых объектов, названных в
LINK_LIBRARIESцелевого объекта:- Для свойств компиляции целевого объекта вычисление соответствующих требований к использованию является транзитивным для замыкания связанных целевых объектов
INTERFACE_LINK_LIBRARIESисключая записи, защищённые выражением генератораLINK_ONLY. - Для свойств компоновки целевого объекта вычисление соответствующих требований к использованию является транзитивным для замыкания связанных целевых объектов
INTERFACE_LINK_LIBRARIESвключая записи, защищённые выражением генератораLINK_ONLY. См. политикуCMP0166.
Вычисление
LINK_LIBRARIESсамо по себе не является транзитивным. - Для свойств компиляции целевого объекта вычисление соответствующих требований к использованию является транзитивным для замыкания связанных целевых объектов
- Требования к использованию целевого объекта
-
Эти выражения вычисляются как список, разделённый точкой с запятой, представляющий объединение значения самого целевого объекта со значениями тех же свойств для целевых объектов, названных в
INTERFACE_LINK_LIBRARIES:- Для транзитивных свойств компиляции вычисление является транзитивным для замыкания целевого объекта
INTERFACE_LINK_LIBRARIESисключая записи, защищённые выражением генератораLINK_ONLY. - Для транзитивных свойств компоновки вычисление является транзитивным для замыкания целевого объекта
INTERFACE_LINK_LIBRARIESвключая записи, защищённые выражением генератораLINK_ONLY. См. политикуCMP0166.
Вычисление
INTERFACE_LINK_LIBRARIESсамо по себе не является транзитивным. - Для транзитивных свойств компиляции вычисление является транзитивным для замыкания целевого объекта
- Пользовательские транзитивные свойства
-
Новое в версии 3.30.
Эти свойства обрабатываются во время вычисления следующим образом:
-
Вычисление
$<TARGET_PROPERTY:tgt,PROP>для некоторого свойстваPROP, названного без префиксаINTERFACE_, проверяет свойстваTRANSITIVE_COMPILE_PROPERTIESиTRANSITIVE_LINK_PROPERTIESна целевом объектеtgt, на целевых объектах, названных с помощьюLINK_LIBRARIES, и на транзитивном замыкании целевых объектов, названных с помощьюINTERFACE_LINK_LIBRARIESсвязанных целевых объектов.Если
PROPуказано в одном из этих свойств, то оно вычисляется как список, разделённый точкой с запятой, представляющий объединение значения на самом целевом объекте со значениями соответствующегоINTERFACE_PROPна целевых объектах, названных с помощьюLINK_LIBRARIES:- Если
PROPназвано с помощьюTRANSITIVE_COMPILE_PROPERTIES, вычисление соответствующегоINTERFACE_PROPпроисходит транзитивно по замыканию связанных целевых объектов с помощьюINTERFACE_LINK_LIBRARIES, исключая записи, защищенные генераторным выражениемLINK_ONLY. - Если
PROPназвано с помощьюTRANSITIVE_LINK_PROPERTIES, вычисление соответствующегоINTERFACE_PROPпроисходит транзитивно по замыканию связанных целевых объектов с помощьюINTERFACE_LINK_LIBRARIES, включая записи, защищенные генераторным выражениемLINK_ONLY.
- Если
-
Вычисление
$<TARGET_PROPERTY:tgt,INTERFACE_PROP>для некоторого свойстваINTERFACE_PROP, названного с префиксомINTERFACE_, проверяет свойстваTRANSITIVE_COMPILE_PROPERTIESиTRANSITIVE_LINK_PROPERTIESна целевом объектеtgt, и на транзитивном замыкании целевых объектов, названных с помощьюINTERFACE_LINK_LIBRARIES.Если соответствующее
PROPуказано в одном из этих свойств, тоINTERFACE_PROPвычисляется как список, разделённый точкой с запятой, представляющий объединение значения на самом целевом объекте со значением того же свойства на целевых объектах, названных с помощьюINTERFACE_LINK_LIBRARIES:- Если
PROPназвано с помощьюTRANSITIVE_COMPILE_PROPERTIES, вычисление соответствующегоINTERFACE_PROPпроисходит транзитивно по замыканию целевых объектов с помощьюINTERFACE_LINK_LIBRARIES, исключая записи, защищенные генераторным выражениемLINK_ONLY. - Если
PROPназвано с помощьюTRANSITIVE_LINK_PROPERTIES, вычисление соответствующегоINTERFACE_PROPпроисходит транзитивно по замыканию целевых объектов с помощьюINTERFACE_LINK_LIBRARIES, включая записи, защищенные генераторным выражениемLINK_ONLY.
- Если
Если
PROPназвано и с помощьюTRANSITIVE_COMPILE_PROPERTIES, и с помощьюTRANSITIVE_LINK_PROPERTIES, то приоритет отдается второму. -
- Совместимые свойства интерфейса
-
Эти свойства вычисляются как единственное значение, комбинируемое из самого целевого объекта, из целевых объектов, названных с помощью
LINK_LIBRARIES, и из транзитивного замыкания связанных целевых объектов с помощьюINTERFACE_LINK_LIBRARIES. Значения совместимого свойства интерфейса от нескольких целевых объектов объединяются в соответствии с типом совместимости, необходимым свойствомCOMPATIBLE_INTERFACE_*.
Артефакты целевого объекта
Эти выражения ищут информацию об артефактах, связанных с заданным целевым объектом tgt. Если не указано иное, это может быть любой артефакт времени выполнения, а именно:
- Целевой исполняемый файл, созданный с помощью
add_executable(). - Целевой файл динамической библиотеки (
.so,.dll, но не их импортируемая библиотека.lib) созданный с помощьюadd_library(). - Целевой файл статической библиотеки, созданный с помощью
add_library().
В дальнейшем фраза «имя файла tgt» означает имя файла бинарного файла tgt. Это следует отличать от фразы «имя целевого объекта», которое просто строка tgt.
-
$<TARGET_FILE:tgt> -
Полный путь к бинарному файлу
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости от целевого объекта, на котором вычисляется выражение, если выражение используется вadd_custom_command()илиadd_custom_target().
-
$<TARGET_FILE_BASE_NAME:tgt> -
Новое в версии 3.15.
Базовое имя
tgt, т.е.$<TARGET_FILE_NAME:tgt>без префикса и суффикса. Например, если имя файлаtgtравноlibbase.so, то базовое имя равноbase.См. также свойства целевого объекта
OUTPUT_NAME,ARCHIVE_OUTPUT_NAME,LIBRARY_OUTPUT_NAMEиRUNTIME_OUTPUT_NAMEи их конфигурационно-специфические вариантыOUTPUT_NAME_<CONFIG>,ARCHIVE_OUTPUT_NAME_<CONFIG>,LIBRARY_OUTPUT_NAME_<CONFIG>иRUNTIME_OUTPUT_NAME_<CONFIG>.Также можно учитывать свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_FILE_PREFIX:tgt> -
Новое в версии 3.15.
Префикс имени файла
tgt(например,lib).См. также свойство целевого объекта
PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_FILE_SUFFIX:tgt> -
Новое в версии 3.15.
Суффикс имени файла
tgt(расширение, например,.soили.exe).См. также свойство целевого объекта
SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_FILE_NAME:tgt> -
Имя файла
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение (см. политикуCMP0112).
-
$<TARGET_FILE_DIR:tgt> -
Директория бинарного файла
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение (см. политикуCMP0112).
-
$<TARGET_IMPORT_FILE:tgt> -
Новое в версии 3.27.
Полный путь к файлу импорта компоновщика. На платформах DLL это будет файл
.libДля исполняемых файлов на AIX и для общих библиотек на macOS это соответственно.impили.tbdфайл импорта, в зависимости от значения свойстваENABLE_EXPORTS.В случае отсутствия файла импорта, данное выражение вычисляется в пустую строку.
-
$<TARGET_IMPORT_FILE_BASE_NAME:tgt> -
Новое в версии 3.27.
Базовое имя файла импорта компоновщика для целевого объекта
tgtбез префикса и суффикса. Например, если имя файла целевого объекта равноlibbase.tbd, то базовое имя равноbase.См. также свойства целевого объекта
OUTPUT_NAMEиARCHIVE_OUTPUT_NAMEи их конфигурационно-специфические вариантыOUTPUT_NAME_<CONFIG>иARCHIVE_OUTPUT_NAME_<CONFIG>.Также можно учитывать свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_IMPORT_FILE_PREFIX:tgt> -
Новое в версии 3.27.
Префикс файла импорта для целевого объекта
tgt.См. также свойство целевого объекта
IMPORT_PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_IMPORT_FILE_SUFFIX:tgt> -
Новое в версии 3.27.
Суффикс файла импорта для целевого объекта
tgt.Суффикс соответствует расширению файла (например,
.libили.tbd).См. также свойство целевого объекта
IMPORT_SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_IMPORT_FILE_NAME:tgt> -
Новое в версии 3.27.
Имя файла импорта для целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_IMPORT_FILE_DIR:tgt> -
Новое в версии 3.27.
Директория файла импорта для целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется данное выражение.
-
$<TARGET_LINKER_FILE:tgt> -
Файл, используемый при компоновке с целевым объектом
tgt. Обычно это библиотека, которую представляетtgt(.a,.lib,.so). Однако для общей библиотеки на платформах DLL это будет файл импорта.libдля DLL.Новое в версии 3.27: На macOS это может быть файл импорта
.tbdдля общей библиотеки, в зависимости от значения свойстваENABLE_EXPORTS.Это выражение генератора эквивалентно
$<TARGET_LINKER_LIBRARY_FILE>или$<TARGET_LINKER_IMPORT_FILE>выражениям генератора, в зависимости от характеристик целевого объекта и платформы.
-
$<TARGET_LINKER_FILE_BASE_NAME:tgt> -
Новое в версии 3.15.
Базовое имя файла, используемого для связывания целевого объекта
tgt, т.е.$<TARGET_LINKER_FILE_NAME:tgt>без префикса и суффикса. Например, если имя файла целевого объектаlibbase.a, то базовое имяbase.См. также свойства целевого объекта
OUTPUT_NAME,ARCHIVE_OUTPUT_NAMEиLIBRARY_OUTPUT_NAMEи их конфигурационно-специфические вариантыOUTPUT_NAME_<CONFIG>,ARCHIVE_OUTPUT_NAME_<CONFIG>иLIBRARY_OUTPUT_NAME_<CONFIG>.Также можно рассмотреть свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_FILE_PREFIX:tgt> -
Новое в версии 3.15.
Префикс файла, используемого для связывания целевого объекта
tgt.См. также свойства целевого объекта
PREFIXиIMPORT_PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_FILE_SUFFIX:tgt> -
Новое в версии 3.15.
Суффикс файла, используемого для связывания, где
tgt— имя целевого объекта.Суффикс соответствует расширению файла (например, ".so" или ".lib").
См. также свойства целевого объекта
SUFFIXиIMPORT_SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_FILE_NAME:tgt> -
Имя файла, используемого для связывания целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_LINKER_FILE_DIR:tgt> -
Директория файла, используемого для связывания целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_LINKER_LIBRARY_FILE:tgt> -
Новое в версии 3.27.
Файл, используемый при связывании с целевым объектом
tgtнапрямую с библиотекой, а не с файлом импорта. Обычно это библиотека, которую представляетtgt(.a,.so,.dylib). Таким образом, на платформах DLL это будет пустая строка.
-
$<TARGET_LINKER_LIBRARY_FILE_BASE_NAME:tgt> -
Новое в версии 3.27.
Базовое имя файла библиотеки, используемого для связывания целевого объекта
tgt, т.е.$<TARGET_LINKER_LIBRARY_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_LIBRARY_FILE_PREFIX:tgt> -
Новое в версии 3.27.
Префикс файла библиотеки, используемого для связывания целевого объекта
tgt.См. также свойство целевого объекта
PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_LIBRARY_FILE_SUFFIX:tgt> -
Новое в версии 3.27.
Суффикс файла библиотеки, используемого для связывания целевого объекта
tgt.Суффикс соответствует расширению файла (например, ".a" или ".dylib").
См. также свойство целевого объекта
SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_LIBRARY_FILE_NAME:tgt> -
Новое в версии 3.27.
Имя файла библиотеки, используемого для связывания целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_LIBRARY_FILE_DIR:tgt> -
Новое в версии 3.27.
Директория файла библиотеки, используемого для связывания целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение.
-
$<TARGET_LINKER_IMPORT_FILE:tgt> -
Новое в версии 3.27.
Файл, используемый при связывании с целевым объектом
tgtс помощью файла импорта. Обычно это файл импорта, который представляетtgt(.lib,.tbd). Таким образом, когда в шаге связывания не участвует файл импорта, возвращается пустая строка.
-
$<TARGET_LINKER_IMPORT_FILE_BASE_NAME:tgt> -
Новое в версии 3.27.
Базовое имя файла импорта, используемого для связывания целевого объекта
tgt, т.е.$<TARGET_LINKER_IMPORT_FILE_NAME:tgt>без префикса и суффикса. Например, если имя целевого файлаlibbase.tbd, базовое имя равноbase.См. также свойства целевого объекта
OUTPUT_NAMEиARCHIVE_OUTPUT_NAME, и их конфигурационно-зависимые вариантыOUTPUT_NAME_<CONFIG>иARCHIVE_OUTPUT_NAME_<CONFIG>.Также можно учитывать свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<TARGET_LINKER_IMPORT_FILE_PREFIX:tgt> -
Новое в версии 3.27.
Префикс файла импорта, используемого для связывания целевого объекта
tgt.См. также свойство целевого объекта
IMPORT_PREFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<TARGET_LINKER_IMPORT_FILE_SUFFIX:tgt> -
Новое в версии 3.27.
Суффикс файла импорта, используемого для связывания целевого объекта
tgt.Суффикс соответствует расширению файла (например, ".lib" или ".tbd").
См. также свойство целевого объекта
IMPORT_SUFFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<TARGET_LINKER_IMPORT_FILE_NAME:tgt> -
Новое в версии 3.27.
Имя файла импорта, используемого для связывания целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<TARGET_LINKER_IMPORT_FILE_DIR:tgt> -
Новое в версии 3.27.
Директория файла импорта, используемого для связывания целевого объекта
tgt.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<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_SONAME_IMPORT_FILE:tgt> -
Новое в версии 3.27.
Файл импорта с soname (
.3.tbd) гдеtgt— имя целевого объекта.
-
$<TARGET_SONAME_IMPORT_FILE_NAME:tgt> -
Новое в версии 3.27.
Имя файла импорта с soname (
.3.tbd).Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<TARGET_SONAME_IMPORT_FILE_DIR:tgt> -
Новое в версии 3.27.
Директория файла импорта с soname (
.3.tbd).Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<TARGET_PDB_FILE:tgt> -
Новое в версии 3.1.
Полный путь к файлу базы данных программы, сгенерированному линковщиком (.pdb), где
tgt— имя целевого объекта.См. также свойства целевого объекта
PDB_NAMEиPDB_OUTPUT_DIRECTORY, и их конфигурационно-зависимые вариантыPDB_NAME_<CONFIG>иPDB_OUTPUT_DIRECTORY_<CONFIG>.
-
$<TARGET_PDB_FILE_BASE_NAME:tgt> -
Новое в версии 3.15.
Базовое имя файла базы данных программы, сгенерированного линковщиком (.pdb), где
tgt— имя целевого объекта.Базовое имя соответствует имени файла PDB целевого объекта (см.
$<TARGET_PDB_FILE_NAME:tgt>) без префикса и суффикса. Например, если имя целевого файлаbase.pdb, базовое имя равноbase.См. также свойство целевого объекта
PDB_NAMEи его конфигурационно-зависимый вариантPDB_NAME_<CONFIG>.Также можно учитывать свойства целевого объекта
<CONFIG>_POSTFIXиDEBUG_POSTFIX.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение.
-
$<TARGET_PDB_FILE_NAME:tgt> -
Новое в версии 3.1.
Имя файла базы данных программы, сгенерированного линковщиком (.pdb).
Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_PDB_FILE_DIR:tgt> -
Новое в версии 3.1.
Директория файла базы данных программы, сгенерированного линковщиком (.pdb).
Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_BUNDLE_DIR:tgt> -
Новое в версии 3.9.
Полный путь к каталогу пакета (
/path/to/my.app,/path/to/my.framework, или/path/to/my.bundle), гдеtgt— имя целевого объекта.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_BUNDLE_DIR_NAME:tgt> -
Новое в версии 3.24.
Имя каталога пакета (
my.app,my.framework, илиmy.bundle), гдеtgt— имя целевого объекта.Обратите внимание, что
tgtне добавляется в качестве зависимости к целевому объекту, на котором вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_BUNDLE_CONTENT_DIR:tgt> -
Новое в версии 3.9.
Полный путь к каталогу содержимого пакета, где
tgt— имя целевого объекта. Для macOS SDK он указывает на/path/to/my.app/Contents,/path/to/my.framework, или/path/to/my.bundle/Contents. Для всех других SDK (например, iOS) он указывает на/path/to/my.app,/path/to/my.framework, или/path/to/my.bundleиз-за плоской структуры пакета.Обратите внимание, что
tgtне добавляется в качестве зависимости целевого объекта, для которого вычисляется это выражение (см. политикуCMP0112).
-
$<TARGET_OBJECTS:tgt> -
Новое в версии 3.1.
Список объектов, полученных в результате построения
tgt. Обычно используется для целевых объектов типа библиотеки объектов.
-
$<TARGET_RUNTIME_DLLS:tgt> -
Новое в версии 3.21.
Список DLL, от которых зависит целевой объект во время выполнения. Это определяется расположением всех
SHAREDцелевых объектов в транзитивных зависимостях целевого объекта. Если нужны только каталоги DLL, см. выражение генератораTARGET_RUNTIME_DLL_DIRS. Использование этого выражения генератора для целевых объектов, отличных от исполняемых файлов,SHAREDбиблиотек иMODULEбиблиотек, является ошибкой. В платформах, не поддерживающих DLL, это выражение всегда возвращает пустую строку.Это выражение генератора может быть использовано для копирования всех DLL, от которых зависит целевой объект, в каталог вывода в
POST_BUILDпользовательской команде с использованием командыcmake -E copy -t. Например:find_package(foo CONFIG REQUIRED) # package generated by install(EXPORT) add_executable(exe main.c) target_link_libraries(exe PRIVATE foo::foo foo::bar) add_custom_command(TARGET exe POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:exe> $<TARGET_RUNTIME_DLLS:exe> COMMAND_EXPAND_LISTS )Примечание
Импортированные целевые объекты поддерживаются только в том случае, если они знают расположение своих файлов
.dll. ИмпортированнаяSHAREDбиблиотека должна иметь свойствоIMPORTED_LOCATION, установленное на свой файл.dll. Подробности см. в разделе add_library импортированных библиотек. Многие модули поиска Find Modules генерируют импортированные целевые объекты с типомUNKNOWN, и поэтому они будут проигнорированы.В платформах, поддерживающих пути времени выполнения (
RPATH), обратитесь к свойству целевого объектаINSTALL_RPATH. В платформах Apple обратитесь к свойству целевого объектаINSTALL_NAME_DIR.
-
$<TARGET_RUNTIME_DLL_DIRS:tgt> -
Новое в версии 3.27.
Список каталогов, содержащих DLL, от которых зависит целевой объект во время выполнения (см.
TARGET_RUNTIME_DLLS). Это определяется расположением всехSHAREDцелевых объектов в транзитивных зависимостях целевого объекта. Использование этого выражения генератора для целевых объектов, отличных от исполняемых файлов,SHAREDбиблиотек иMODULEбиблиотек, является ошибкой. В платформах, не поддерживающих DLL, это выражение всегда возвращает пустую строку.Это выражение генератора может, например, использоваться для создания командного файла с помощью
file(GENERATE), который устанавливает переменную среды PATH соответствующим образом.
Выражения экспорта и установки
-
$<INSTALL_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюinstall(EXPORT), и пустая строка в противном случае.
-
$<BUILD_INTERFACE:...> -
Содержимое
...при экспорте свойства с помощьюexport(), или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае возвращается пустая строка.
-
$<BUILD_LOCAL_INTERFACE:...> -
Новое в версии 3.26.
Содержимое
...когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае возвращается пустая строка.
-
$<INSTALL_PREFIX> -
Содержимое префикса установки, когда целевой объект экспортируется через
install(EXPORT), или когда вычисляется в свойствеINSTALL_NAME_DIRили аргументеINSTALL_NAME_DIRinstall(RUNTIME_DEPENDENCY_SET), и пустая строка в противном случае.Изменено в версии 3.27: Возвращает содержимое префикса установки в аргументе code команды
install(CODE)или аргументе file командыinstall(SCRIPT).
Вычисление выражений на нескольких уровнях
-
$<GENEX_EVAL:expr> -
Новое в версии 3.12.
Содержимое
exprвычисляется как выражение генератора в текущем контексте. Это позволяет использовать выражения генератора, результат вычисления которых также является выражением генератора.
-
$<TARGET_GENEX_EVAL:tgt,expr> -
Новое в версии 3.12.
Содержимое
exprвычисляется как выражение генератора в контексте целевого объектаtgt. Это позволяет использовать пользовательские свойства целевых объектов, которые сами содержат выражения генератора.Возможность вычисления выражений генератора очень полезна, когда вы хотите управлять пользовательскими свойствами, поддерживающими выражения генератора. Например:
add_library(foo ...) set_property(TARGET foo PROPERTY CUSTOM_KEYS $<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS> ) add_custom_target(printFooKeys COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:foo,CUSTOM_KEYS> )Эта примитивная реализация пользовательской команды
printFooKeysневерна, потому что свойство целевого объектаCUSTOM_KEYSне вычисляется, и содержимое передаётся как есть (т.е.$<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS>).Чтобы получить ожидаемый результат (т.е.
FOO_EXTRA_THINGSесли config —Debug), необходимо вычислить результат$<TARGET_PROPERTY:foo,CUSTOM_KEYS>:add_custom_target(printFooKeys COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_GENEX_EVAL:foo,$<TARGET_PROPERTY:foo,CUSTOM_KEYS>> )
Символы с экранированием
Эти выражения возвращают определённые строковые литералы. Используйте их вместо фактических строковых литералов, когда нужно предотвратить их особое значение.
-
$<ANGLE-R> -
Литеральный
>. Используется, например, для сравнения строк, содержащих>.
-
$<COMMA> -
Литеральный
,. Используется, например, для сравнения строк, содержащих,.
-
$<SEMICOLON> -
Литеральный
;. Используется для предотвращения расширения списка в аргументе с;.
-
$<QUOTE> -
Новое в версии 3.30.
Литеральный
". Используется для разрешения использования строковых литералов в выражении генератора.
Устаревшие выражения
-
$<CONFIGURATION> -
Имя конфигурации. Устарело с CMake 3.0. Используйте
CONFIGвместо него.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/manual/cmake-generator-expressions.7.html