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. Это сравнение нечувствительно к регистру. При оценке на свойстве целевогоIMPORTEDобъекта также учитывается отображение вMAP_IMPORTED_CONFIG_<CONFIG>.Изменено в версии 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если идентификатор компилятора 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> -
Добавлена в версии 3.30.
Идентификатор компилятора Fortran, используемый CMake.
- $<Fortran_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделённый запятыми.1если вариант фронтенда компилятора Fortran CMake соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<HIP_COMPILER_FRONTEND_VARIANT> -
Добавлена в версии 3.30.
Идентификатор компилятора HIP, используемый CMake.
- $<HIP_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделённый запятыми.1если вариант фронтенда компилятора HIP CMake соответствует одному из элементов вcompiler_ids, в противном случае0.
-
$<ISPC_COMPILER_FRONTEND_VARIANT> -
Добавлена в версии 3.30.
Идентификатор компилятора ISPC, используемый CMake.
- $<ISPC_COMPILER_FRONTEND_VARIANT:compiler_ids>
-
Добавлена в версии 3.30.
где
compiler_ids— список, разделённый запятыми.1если вариант фронтенда компилятора ISPC CMake соответствует одному из элементов в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-компонователя, его нельзя указать как простое имя библиотеки, например,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 типа OBJECT или INTERFACE проигнорирует аспект функции выражения и вместо этого будет слинкован стандартным способом.- Выражение генератора
$<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: Возвращает содержимое префикса установки в аргументе `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если конфигурация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.31/manual/cmake-generator-expressions.7.html