Spec-Zone.ru › CMake

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) для более подробной информации.

END_OF_DOCUMENT_MARKER
$<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.

END_OF_DOCUMENT_MARKER
$<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.

END_OF_DOCUMENT_MARKER
$<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 и идентификатор компилятора 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

$<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> для заметок о портативности этого генератора выражений.

Примечание

Это генераторское выражение не поддерживается свойствами связывания библиотек, чтобы избежать побочных эффектов из-за двойной оценки этих свойств.

END_OF_DOCUMENT_MARKER
$<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>_SUPPORTED
  • CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>
  • CMAKE_LINK_LIBRARY_USING_<FEATURE>_SUPPORTED
  • CMAKE_LINK_LIBRARY_USING_<FEATURE>

Значение, используемое для каждой из этих переменных, является значением, установленным в конце области директории, в которой был создан целевой объект. Использование следующее:

  1. Если языковая переменная CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>_SUPPORTED равна true, то feature должна быть определена соответствующей переменной CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>.
  2. Если какая-либо языковая 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, поддерживаемыми линковщиком GNU ld, используйте вместо этого генераторское выражение LINK_GROUP.
$<LINK_GROUP:feature,library-list>

Добавлен в версии 3.24.

Укажите группу библиотек, которые нужно связать с целевым объектом, а также feature, определяющую, как эта группа должна быть связана. Например:

add_library(lib1 STATIC ...)
add_library(lib2 ...)
target_link_libraries(lib2 PRIVATE "$<LINK_GROUP:RESCAN,lib1,external>")

Это указывает, что lib2 должно быть связано с lib1 и external, и что обе эти библиотеки должны быть включены в командной строке компоновщика в соответствии с определением RESCAN функции.

Имена функций чувствительны к регистру и могут содержать только буквы, цифры и символы подчеркивания. Имена функций, определенные в верхнем регистре, зарезервированы для собственных встроенных функций CMake. В настоящее время существует только одна предопределенная встроенная функция группы:

RESCAN

Некоторые компоновщики работают только в одном проходе. В таких компоновщиках циклические ссылки между библиотеками обычно приводят к неразрешенным символам. Эта функция инструктирует компоновщик многократно искать указанные статические библиотеки до тех пор, пока не будет создано ни одной новой неопределенной ссылки.

Как правило, статическая библиотека ищется только один раз в том порядке, в котором она указана в командной строке. Если для разрешения неопределенного символа, на который ссылается объект в библиотеке, которая появляется позже в командной строке, требуется символ из этой библиотеки, компоновщик не сможет разрешить эту ссылку. Сгруппировав статические библиотеки с помощью функции RESCAN, они все будут многократно искаться до тех пор, пока не будут разрешены все возможные ссылки. Для этого будут использоваться такие опции компоновщика, как --start-group и --end-group, или на SunOS, -z rescan-start и -z rescan-end.

Использование этой функции имеет значительную производительность. Лучше всего использовать ее только в случае неизбежных циклических ссылок между двумя или более статическими библиотеками.

Эта функция доступна при использовании инструментов, нацеленных на Linux, BSD и SunOS. Она также может быть использована при нацеливании на платформы Windows, если используется GNU инструмент.

Встроенные и настраиваемые функции группы определяются в терминах следующих переменных:

  • CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>_SUPPORTED
  • CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>
  • CMAKE_LINK_GROUP_USING_<FEATURE>_SUPPORTED
  • CMAKE_LINK_GROUP_USING_<FEATURE>

Значение, используемое для каждой из этих переменных, - это значение, установленное в конце области каталога, в которой был создан целевой объект. Использование:

  1. Если языковая переменная CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>_SUPPORTED имеет значение true, переменная feature должна быть определена соответствующей переменной CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>.
  2. Если какая-либо языковая 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 это будет импортная библиотека .lib DLL.

Добавлен в версии 3.27: На macOS это может быть файл импорта .tbd связанной общей библиотеки, в зависимости от значения свойства ENABLE_EXPORTS.

Это генераторское выражение эквивалентно генераторским выражениям $<TARGET_LINKER_LIBRARY_FILE> или $<TARGET_LINKER_IMPORT_FILE>, в зависимости от характеристик цели и платформы.

$<TARGET_LINKER_FILE_BASE_NAME:tgt>

Добавлен в версии 3.15.

Базовое имя файла, используемого для линковки целевого объекта tgt, т.е. $<TARGET_LINKER_FILE_NAME:tgt> без префикса и суффикса. Например, если имя целевого файла libbase.a, то базовое имя base.

См. также свойства целевого объекта OUTPUT_NAME, ARCHIVE_OUTPUT_NAME, и LIBRARY_OUTPUT_NAME и их конфигурационно-зависимые варианты OUTPUT_NAME_<CONFIG>, ARCHIVE_OUTPUT_NAME_<CONFIG> и LIBRARY_OUTPUT_NAME_<CONFIG>.

Также можно учитывать свойства целевого объекта <CONFIG>_POSTFIX и DEBUG_POSTFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_FILE_PREFIX:tgt>

Добавлен в версии 3.15.

Префикс файла, используемого для линковки целевого объекта tgt.

См. также свойства целевого объекта PREFIX и IMPORT_PREFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_FILE_SUFFIX:tgt>

Добавлен в версии 3.15.

Суффикс файла, используемого для линковки, где tgt — имя целевого объекта.

Суффикс соответствует расширению файла (например, ".so" или ".lib").

См. также свойства целевого объекта SUFFIX и IMPORT_SUFFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_FILE_NAME:tgt>

Имя файла, используемого для линковки целевого объекта tgt.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение (см. политику CMP0112).

$<TARGET_LINKER_FILE_DIR:tgt>

Директория файла, используемого для линковки целевого объекта tgt.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение (см. политику CMP0112).

$<TARGET_LINKER_LIBRARY_FILE:tgt>

Добавлен в версии 3.27.

Файл, используемый при линковке целевого объекта tgt непосредственно с помощью библиотеки, а не файла импорта. Обычно это библиотека, которую представляет tgt (.a, .so, .dylib). Таким образом, на платформах DLL это будет пустая строка.

$<TARGET_LINKER_LIBRARY_FILE_BASE_NAME:tgt>

Добавлен в версии 3.27.

Базовое имя файла библиотеки, используемого для линковки целевого объекта tgt, т.е. $<TARGET_LINKER_LIBRARY_FILE_NAME:tgt> без префикса и суффикса. Например, если имя целевого файла libbase.a, то базовое имя base.

См. также свойства целевого объекта OUTPUT_NAME, ARCHIVE_OUTPUT_NAME, и LIBRARY_OUTPUT_NAME и их конфигурационно-зависимые варианты OUTPUT_NAME_<CONFIG>, ARCHIVE_OUTPUT_NAME_<CONFIG> и LIBRARY_OUTPUT_NAME_<CONFIG>.

Также можно учитывать свойства целевого объекта <CONFIG>_POSTFIX и DEBUG_POSTFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_LIBRARY_FILE_PREFIX:tgt>

Добавлен в версии 3.27.

Префикс файла библиотеки, используемого для линковки целевого объекта tgt.

См. также свойство целевого объекта PREFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_LIBRARY_FILE_SUFFIX:tgt>

Добавлен в версии 3.27.

Суффикс файла библиотеки, используемого для линковки целевого объекта tgt.

Суффикс соответствует расширению файла (например, ".a" или ".dylib").

См. также свойство целевого объекта SUFFIX.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_LIBRARY_FILE_NAME:tgt>

Добавлен в версии 3.27.

Имя файла библиотеки, используемого для линковки целевого объекта tgt.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_LIBRARY_FILE_DIR:tgt>

Добавлен в версии 3.27.

Директория файла библиотеки, используемого для линковки целевого объекта tgt.

Обратите внимание, что tgt не добавляется в качестве зависимости целевого объекта, на котором вычисляется это выражение.

$<TARGET_LINKER_IMPORT_FILE:tgt>

Добавлен в версии 3.27.

Файл, используемый при линковке к целевому объекту tgt с использованием файла импорта. Обычно это файл импорта, который представляет tgt (.lib, .tbd). Таким образом, если при шаге линковки файл импорта не используется, возвращается пустая строка.

END_OF_DOCUMENT_MARKER
$<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).

END_OF_DOCUMENT_MARKER
$<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 вместо него.

END_OF_DOCUMENT_MARKER

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API