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,...>
-
Добавлен в версии 3.27.
Список
listсо всеми вхождениями заданныхvalue(или значений) удалены. Если указано несколько значений, они должны быть разделены запятыми.
- $<LIST:REMOVE_AT,list,index,...>
-
Добавлен в версии 3.27.
Список
listс удаленными элементами по заданнымindex.
- $<LIST:REMOVE_DUPLICATES,list>
-
Добавлен в версии 3.27.
Список
listсо всеми дублирующимися элементами удалены. Относительный порядок элементов сохраняется, но если встречаются дубликаты, сохраняется только первое вхождение. Результат такой же, как у$<REMOVE_DUPLICATES:list>.
- $<LIST:FILTER,list,INCLUDE|EXCLUDE,regex>
-
Добавлен в версии 3.27.
Список элементов из
list, которые соответствуют (INCLUDE) или не соответствуют (EXCLUDE) регулярному выражениюregex. Результат такой же, как у$<FILTER:list,INCLUDE|EXCLUDE,regex>.
- $<LIST:TRANSFORM,list,ACTION[,SELECTOR]>
-
Добавлен в версии 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> -
Добавлен в версии 3.15.
Удаляет дублирующиеся элементы в заданном
list. Относительный порядок элементов сохраняется, и если встречаются дубликаты, сохраняется только первое вхождение. Результат такой же, как у $<LIST:REMOVE_DUPLICATES,list>.
-
$<FILTER:list,INCLUDE|EXCLUDE,regex> -
Добавлен в версии 3.15.
Включает или исключает элементы из
list, которые соответствуют регулярному выражениюregex. Результат такой же, как у $<LIST:FILTER,list,INCLUDE|EXCLUDE,regex>.
Сортировка списков
- $<LIST:REVERSE,list>
-
Добавлен в версии 3.27.
Список
listс элементами в обратном порядке.
- $<LIST:SORT,list[,(COMPARE:option|CASE:option|ORDER:option)]...>
-
Добавлен в версии 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> -
Добавлен в версии 3.24.
Сравнивает лексические представления двух путей. Никакая нормализация путей не выполняется. Возвращает
1если пути равны,0в противном случае.См. cmake_path(COMPARE) для более подробной информации.
Запросы к пути
Эти выражения предоставляют возможности генерации, эквивалентные параметрам запроса Запрос команды cmake_path(). Все пути должны быть в формате CMake.
-
$<PATH:HAS_*,path> -
Добавлен в версии 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выражения генератора в...вычисляются с использованием "командной конфигурации" пользовательской команды. С другими генераторами содержимое...вычисляется стандартным образом.
Выражения для инструментальных цепочек и языков
Платформа
-
$<PLATFORM_ID> -
Идентификатор платформы текущей системы CMake. См. также переменную
CMAKE_SYSTEM_NAME.
- $<PLATFORM_ID:platform_ids>
-
1если идентификатор платформы CMake соответствует одному из значений в списке, разделенном запятымиplatform_ids, иначе0. См. также переменнуюCMAKE_SYSTEM_NAME.
Версия компилятора
См. также переменную 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.
Язык компилятора, идентификатор и вариант фронтального эндина
См. также переменные 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если идентификатор компилятора CUDA, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<OBJC_COMPILER_ID> -
Добавлена в версии 3.16.
Идентификатор компилятора Objective-C, используемого CMake.
- $<OBJC_COMPILER_ID:compiler_ids>
-
Добавлена в версии 3.16.
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора Objective-C, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<OBJCXX_COMPILER_ID> -
Добавлена в версии 3.16.
Идентификатор компилятора Objective-C++, используемого CMake.
- $<OBJCXX_COMPILER_ID:compiler_ids>
-
Добавлена в версии 3.16.
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора Objective-C++, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<Fortran_COMPILER_ID> -
Идентификатор компилятора Fortran, используемого CMake.
- $<Fortran_COMPILER_ID:compiler_ids>
-
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора Fortran, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.Изменено в версии 3.15: Можно указать несколько
compiler_ids. CMake 3.14 и более ранние версии поддерживали только один идентификатор компилятора.
-
$<HIP_COMPILER_ID> -
Добавлена в версии 3.21.
Идентификатор компилятора HIP, используемого CMake.
- $<HIP_COMPILER_ID:compiler_ids>
-
Добавлена в версии 3.21.
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора HIP, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<ISPC_COMPILER_ID> -
Добавлена в версии 3.19.
Идентификатор компилятора ISPC, используемого CMake.
- $<ISPC_COMPILER_ID:compiler_ids>
-
Добавлена в версии 3.19.
где
compiler_ids— список, разделенный запятыми.1если идентификатор компилятора ISPC, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<C_COMPILER_FRONTEND_VARIANT> -
Добавлена в версии 3.30.
Вариант фронтального эндина компилятора C, используемого CMake.
- $<C_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделенный запятыми.1если вариант фронтального эндина компилятора C, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<CXX_COMPILER_FRONTEND_VARIANT> -
Добавлена в версии 3.30.
Вариант фронтального эндина компилятора C++, используемого CMake.
- $<CXX_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделенный запятыми.1если вариант фронтального эндина компилятора C++, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<CUDA_COMPILER_FRONTEND_VARIANT> -
Добавлена в версии 3.30.
Идентификатор компилятора CUDA, используемого CMake.
- $<CUDA_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделенный запятыми.1если вариант фронтального эндина компилятора CUDA, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<OBJC_COMPILER_FRONTEND_VARIANT> -
Добавлена в версии 3.30.
Вариант фронтального эндина компилятора Objective-C, используемого CMake.
- $<OBJC_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделенный запятыми.1если вариант фронтального эндина компилятора Objective-C, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<OBJCXX_COMPILER_FRONTEND_VARIANT> -
Добавлена в версии 3.30.
Вариант фронтального эндина компилятора Objective-C++, используемого CMake.
- $<OBJCXX_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделенный запятыми.1если вариант фронтального эндина компилятора Objective-C++, используемого CMake, соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<Fortran_COMPILER_FRONTEND_VARIANT> -
Added in version 3.30.
Идентификатор компилятора Fortran, используемый CMake.
- $<Fortran_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Added in version 3.30.
где
compiler_idsявляется списком, разделённым запятыми.1если вариант интерфейса фронтенда компилятора Fortran CMake соответствует любому из элементов вcompiler_ids, в противном случае0.
-
$<HIP_COMPILER_FRONTEND_VARIANT> -
Added in version 3.30.
Идентификатор компилятора HIP, используемый CMake.
- $<HIP_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Added in version 3.30.
где
compiler_idsявляется списком, разделённым запятыми.1если вариант интерфейса фронтенда компилятора HIP CMake соответствует любому из элементов вcompiler_ids, в противном случае0.
-
$<ISPC_COMPILER_FRONTEND_VARIANT> -
Added in version 3.30.
Идентификатор компилятора ISPC, используемый CMake.
- $<ISPC_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Added in version 3.30.
где
compiler_idsявляется списком, разделённым запятыми.1если вариант интерфейса фронтенда компилятора ISPC CMake соответствует любому из элементов вcompiler_ids, в противном случае0.
-
$<COMPILE_LANGUAGE> -
Added in version 3.3.
Язык компиляции исходных файлов при оценке опций компиляции. См. соответствующее булево выражение
$<COMPILE_LANGUAGE:language>для заметок о портативности этого генератора выражений.
- $<COMPILE_LANGUAGE:languages>
-
Added in version 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> -
Added in version 3.15.
1если язык, используемый для компиляции блока, совпадает сlanguageи идентификатор компилятора CMakelanguageсоответствует любому из элементов в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
-
$<COMPILE_FEATURES:features> -
Added in version 3.1.
где
featuresявляется списком, разделённым запятыми. Принимает значение1если всеfeaturesдоступны для целевого объекта 'head', и0в противном случае. Если это выражение используется при оценке реализации связывания целевого объекта и если какая-либо зависимость транзитивно увеличивает требуемыйC_STANDARDилиCXX_STANDARDдля целевого объекта 'head', выводится ошибка. См. руководствоcmake-compile-features(7)для получения информации о функциях компиляции и списке поддерживаемых компиляторов.
Compile Context
-
$<COMPILE_ONLY:...> -
Added in version 3.27.
Содержимое
..., при сборе транзитивных свойств компиляции, в противном случае пустая строка. Предназначено для использования в свойствах целевого объектаINTERFACE_LINK_LIBRARIESиLINK_LIBRARIES, обычно заполняемых с помощью командыtarget_link_libraries(). Обеспечивает требования к использованию компиляции без каких-либо требований к связыванию.Случаи использования включают использование только заголовков, где известно, что все использования не имеют требований к связыванию (например, все-
inlineили C++ шаблонные библиотеки).Обратите внимание, что для правильной оценки этого выражения требуется, чтобы политика
CMP0099была установлена в значениеNEW.
Linker Language And ID
-
$<LINK_LANGUAGE> -
Added in version 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-цель типа OBJECT или INTERFACE проигнорирует аспект функции выражения и вместо этого будет связана стандартным способом. - Генераторское выражение
$<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, поддерживаемыми линковщиком GNUld, используйте вместо этого генераторское выражение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происходит в каталоге целевого объекта, задающего требование, а не в каталоге целевого объекта, для которого вычисляется выражение.Изменено в версии 3.31: Выражения генератора для транзитивных свойств интерфейса, таких как
$<TARGET_PROPERTY:target,INTERFACE_*>, теперь правильно обрабатывают повторные вычисления внутри вложенных выражений генератора. Ранее эти повторные вычисления возвращали пустые значения из-за оптимизации для транзитивных замыканий. Это изменение обеспечивает согласованное вычисление для операций, не являющихся объединениями.
-
$<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 это будет импортная библиотека.libDLL.Добавлен в версии 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 импортированные библиотеки.Многие модули нахождения (
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_DIRкомандыinstall(RUNTIME_DEPENDENCY_SET), и пустая строка в противном случае.Изменено в версии 3.27: Возвращает содержание префикса установки в аргументе кода команды
install(CODE)или в аргументе файла команды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если конфигурация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/latest/manual/cmake-generator-expressions.7.html