Spec-Zone.ru › CMake 3.30

cmake-generator-expressions(7)

  • Введение
  • Пробелы и кавычки
  • Отладка
  • Справочник по выражениям генератора

    • Условные выражения
    • Логические операторы
    • Основные сравнения выражений

      • Сравнения строк
      • Сравнения версий
    • Преобразования строк
    • Выражения списков

      • Сравнения списков
      • Запросы к спискам
      • Преобразования списков
      • Сортировка списков
    • Выражения путей

      • Сравнения путей
      • Запросы к путям
      • Разложение путей
      • Преобразования путей
      • Пути командной оболочки
    • Выражения конфигурации
    • Выражения инструментальной цепочки и языка

      • Платформа
      • Версия компилятора
      • Язык компилятора, идентификатор и вариант фронтального модуля
      • Возможности компиляции
      • Контекст компиляции
      • Язык и идентификатор линкера
      • Возможности компоновки
      • Контекст компоновки
    • Выражения, зависящие от целевого объекта

      • Метаданные целевого объекта
      • Свойства целевого объекта
      • Артефакты целевого объекта
    • Выражения экспорта и установки
    • Многоуровневая оценка выражений
    • Экранированные символы
    • Устаревшие выражения

Введение

Выражения генератора оцениваются во время генерации системы сборки, чтобы получить информацию, специфичную для каждой конфигурации сборки. Они имеют вид $<...>. Например:

target_include_directories(tgt PRIVATE /opt/include/$<CXX_COMPILER_ID>)

Это расширится до /opt/include/GNU, /opt/include/Clang, и т. д., в зависимости от используемой C++ компилятора.

Выражения генератора разрешены в контексте многих свойств целевого объекта, таких как LINK_LIBRARIES, INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS и другие. Их можно использовать при использовании команд для заполнения этих свойств, таких как target_link_libraries(), target_include_directories(), target_compile_definitions() и другие. Они позволяют условную компоновку, условные определения, используемые при компиляции, условные каталоги включения и многое другое. Условия могут быть основаны на конфигурации сборки, свойствах целевого объекта, информации о платформе или любой другой запрашиваемой информации.

Выражения генератора могут быть вложены:

target_compile_definitions(tgt PRIVATE
  $<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,4.2.0>:OLD_COMPILER>
)

Вышеприведенное расширится до OLD_COMPILER если CMAKE_CXX_COMPILER_VERSION меньше 4.2.0.

Пробелы и кавычки

Выражения генератора обычно парсятся после аргументов команд. Если выражение генератора содержит пробелы, новые строки, точки с запятой или другие символы, которые могут быть интерпретированы как разделители аргументов команд, всё выражение должно быть заключено в кавычки при передаче команде. Отсутствие этого может привести к разделению выражения, и оно может больше не распознаваться как выражение генератора.

При использовании add_custom_command() или add_custom_target(), используйте параметры VERBATIM и COMMAND_EXPAND_LISTS, чтобы обеспечить надёжное разделение и цитирование аргументов.

# WRONG: Embedded space will be treated as an argument separator.
# This ends up not being seen as a generator expression at all.
add_custom_target(run_some_tool
  COMMAND some_tool -I$<JOIN:$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>, -I>
  VERBATIM
)
# Better, but still not robust. Quotes prevent the space from splitting the
# expression. However, the tool will receive the expanded value as a single
# argument.
add_custom_target(run_some_tool
  COMMAND some_tool "-I$<JOIN:$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>, -I>"
  VERBATIM
)
# Nearly correct. Using a semicolon to separate arguments and adding the
# COMMAND_EXPAND_LISTS option means that paths with spaces will be handled
# correctly. Quoting the whole expression ensures it is seen as a generator
# expression. But if the target property is empty, we will get a bare -I
# with nothing after it.
add_custom_target(run_some_tool
  COMMAND some_tool "-I$<JOIN:$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>,;-I>"
  COMMAND_EXPAND_LISTS
  VERBATIM
)

Использование переменных для построения более сложного выражения генератора также является хорошим способом уменьшить ошибки и улучшить читабельность. Приведённый выше пример можно улучшить следующим образом:

# The $<BOOL:...> check prevents adding anything if the property is empty,
# assuming the property value cannot be one of CMake's false constants.
set(prop "$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>")
add_custom_target(run_some_tool
  COMMAND some_tool "$<$<BOOL:${prop}>:-I$<JOIN:${prop},;-I>>"
  COMMAND_EXPAND_LISTS
  VERBATIM
)

Наконец, вышеприведённый пример можно выразить более простым и надёжным способом с использованием альтернативного выражения генератора:

add_custom_target(run_some_tool
  COMMAND some_tool "$<LIST:TRANSFORM,$<TARGET_PROPERTY:tgt,INCLUDE_DIRECTORIES>,PREPEND,-I>"
  COMMAND_EXPAND_LISTS
  VERBATIM
)

Частая ошибка — это попытка разбить выражение генератора на несколько строк с отступами:

# WRONG: New lines and spaces all treated as argument separators, so the
# generator expression is split and not recognized correctly.
target_compile_definitions(tgt PRIVATE
  $<$<AND:
      $<CXX_COMPILER_ID:GNU>,
      $<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,5>
    >:HAVE_5_OR_LATER>
)

Вновь используйте вспомогательные переменные с хорошо подобранными именами для создания читабельного выражения:

set(is_gnu "$<CXX_COMPILER_ID:GNU>")
set(v5_or_later "$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,5>")
set(meet_requirements "$<AND:${is_gnu},${v5_or_later}>")
target_compile_definitions(tgt PRIVATE
  "$<${meet_requirements}:HAVE_5_OR_LATER>"
)

Отладка

Поскольку выражения генератора оцениваются во время генерации системы сборки, а не во время обработки файлов CMakeLists.txt, невозможно просмотреть их результат с помощью команды message(). Один из возможных способов генерации сообщений об отладке — добавление пользовательского целевого объекта:

add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")

После запуска cmake, вы можете затем собрать целевой объект genexdebug для вывода результата выражения $<...> (то есть выполнить команду cmake --build ... --target genexdebug).

Другой способ — записать сообщения об отладке в файл с помощью file(GENERATE):

file(GENERATE OUTPUT filename CONTENT "$<...>")

Справочник по выражениям генератора

Примечание

Этот справочник отличается от большей части документации CMake тем, что опускает угловые скобки <...> вокруг заглушек, таких как condition, string, target, и т. д. Это предотвращает возможность неправильной интерпретации этих заглушек как выражений генератора.

Условные выражения

Фундаментальная категория выражений генератора связана с условной логикой. Поддерживаются два вида условных выражений генератора:

$<condition:true_string>

Вычисляется до true_string если condition имеет значение 1, или пустой строкой, если condition вычисляется до 0. Любое другое значение для condition приводит к ошибке.

$<IF:condition,true_string,false_string>

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

Вычисляется до true_string если condition имеет значение 1, или до false_string, если condition имеет значение 0. Любое другое значение для condition приводит к ошибке.

Добавлено в версии 3.28: Это выражение генератора выполняет короткую схему вычисления, так что выражения генератора в false_string не будут вычисляться, если condition имеет значение 1, и выражения генератора в true_string не будут вычисляться, если условие равно 0.

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

$<$<CONFIG:Debug>:DEBUG_MODE>

Булевы значения condition отличные от 1 или 0 могут быть обработаны с помощью выражения генератора $<BOOL:...>.

$<BOOL:string>

Преобразует string в 0 или 1. Вычисляется до 0 если выполняется любое из следующих условий:

  • string пустая,
  • string совпадает (без учёта регистра) с 0, FALSE, OFF, N, NO, IGNORE, или NOTFOUND, или
  • string заканчивается на суффикс -NOTFOUND (учитывая регистр).

В противном случае, вычисляется до 1.

Выражение-генератор $<BOOL:...> часто используется, когда condition предоставляется переменной CMake:

$<$<BOOL:${HAVE_SOME_FEATURE}>:-DENABLE_SOME_FEATURE>

Логические операторы

Поддерживаются обычные логические операторы:

$<AND:conditions>

где conditions — это список логических выражений, разделённых запятыми, все из которых должны иметь значение либо 1 или 0. Весь оператор имеет значение 1, если все условия 1. Если хотя бы одно условие 0, то весь оператор имеет значение 0.

$<OR:conditions>

где conditions — это список логических выражений, разделённых запятыми, все из которых должны иметь значение либо 1 или 0. Весь оператор имеет значение 1, если хотя бы одно из conditions имеет значение 1. Если все conditions имеют значение 0, весь оператор имеет значение 0.

$<NOT:condition>

condition должно иметь значение 0 или 1. Результат выражения — 0 если condition имеет значение 1, иначе 1.

Новое в версии 3.28: Логические операторы используют закорачивание, поэтому выражения-генераторы в списке аргументов не будут вычисляться, как только будет определено значение возврата.

Основные выражения сравнения

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

Сравнения строк

$<STREQUAL:string1,string2>

1 если string1 и string2 равны, иначе 0. Сравнение чувствительно к регистру. Для выполнения сравнения без учёта регистра используйте преобразование строк с помощью выражений-генераторов для преобразования строк. Например, следующее выражение имеет значение 1 если ${foo} равно любому из значений BAR, Bar, bar, и т.д.

$<STREQUAL:$<UPPER_CASE:${foo}>,BAR>
$<EQUAL:value1,value2>

1 если value1 и value2 численно равны, иначе 0.

Сравнения версий

$<VERSION_LESS:v1,v2>

1 если v1 меньше версии v2, иначе 0.

$<VERSION_GREATER:v1,v2>

1 если v1 больше версии v2, иначе 0.

$<VERSION_EQUAL:v1,v2>

1 если v1 равна версии v2, иначе 0.

$<VERSION_LESS_EQUAL:v1,v2>

Новое в версии 3.7.

1 если v1 меньше или равна версии v2, иначе 0.

$<VERSION_GREATER_EQUAL:v1,v2>

Новое в версии 3.7.

1 если v1 больше или равна версии v2, иначе 0.

Преобразования строк

$<LOWER_CASE:string>

Содержимое string преобразуется в нижний регистр.

$<UPPER_CASE:string>

Содержимое string преобразуется в верхний регистр.

$<MAKE_C_IDENTIFIER:...>

Содержимое ... преобразуется в идентификатор языка C. Преобразование происходит так же, как и в команде string(MAKE_C_IDENTIFIER).

Выражения для списков

Большинство выражений в этом разделе тесно связаны с командой list(), обеспечивая аналогичные возможности, но в форме выражений-генераторов.

В каждом из следующих выражений-генераторов, связанных со списками, list не должно содержать запятых, если выражение-генератор ожидает чего-то после list. Например, выражение $<LIST:FIND,list,value> требует value после list. Поскольку запятая используется для разделения list и value, list не может содержать запятую. Это ограничение не распространяется на команду list(), оно относится только к выражениям-генераторам для работы со списками.

Сравнения списков

$<IN_LIST:string,list>

Новое в версии 3.12.

1 если string является элементом в списке, разделённом точками с запятой list, иначе 0. Используется сравнение, чувствительное к регистру.

Запросы к списку

$<LIST:LENGTH,list>

Новое в версии 3.27.

Количество элементов в списке list.

$<LIST:GET,list,index,...>

Новое в версии 3.27.

Развертывается в список элементов, заданных индексами из list.

$<LIST:SUBLIST,list,begin,length>

Новое в версии 3.27.

Подсписок заданного list . Если length равно 0, возвращается пустой список. Если length равно -1 или список меньше begin + length, возвращаются оставшиеся элементы списка, начиная с begin.

$<LIST:FIND,list,value>

Новое в версии 3.27.

Индекс первого элемента в list с указанным value, или -1, если value не находится в list.

Преобразования списков

$<LIST:JOIN,list,glue>

Новое в версии 3.27.

Преобразует list в строку, вставляя содержимое строки glue между каждым элементом. По концепции это аналогично операции $<JOIN:list,glue>, но у них разное поведение в отношении пустых элементов. $<LIST:JOIN,list,glue> сохраняет все пустые элементы, тогда как $<JOIN:list,glue> удаляет все пустые элементы из списка.

$<LIST:APPEND,list,item,...>

Новое в версии 3.27.

Список list с добавленными к нему item. Несколько элементов должны быть разделены запятыми.

$<LIST:PREPEND,list,item,...>

Новое в версии 3.27.

Список list с добавленными item в начале. Если несколько элементов, они должны быть разделены запятыми, и порядок добавленных элементов будет сохранён.

$<LIST:INSERT,list,index,item,...>

Новое в версии 3.27.

Список list с вставленными item (или несколькими элементами) по указанному index. Несколько элементов должны быть разделены запятыми.

Ошибка, если указан несуществующий index. Допустимые индексы от 0 до N, где N — длина списка включительно. Длина пустого списка равна 0.

$<LIST:POP_BACK,list>

Новое в версии 3.27.

Список list с удалённым последним элементом.

$<LIST:POP_FRONT,list>

Новое в версии 3.27.

Список list с удалённым первым элементом.

$<LIST:REMOVE_ITEM,list,value,...>

New in version 3.27.

Список list со всеми экземплярами заданных value (или значений) удалены. Если задано несколько значений, они должны быть разделены запятыми.

$<LIST:REMOVE_AT,list,index,...>

New in version 3.27.

Список list с элементом в каждом заданном index удален.

$<LIST:REMOVE_DUPLICATES,list>

New in version 3.27.

Список list со всеми дублирующимися элементами удалены. Относительный порядок элементов сохраняется, но если встречаются дубликаты, сохраняется только первый экземпляр. Результат совпадает с $<REMOVE_DUPLICATES:list>.

$<LIST:FILTER,list,INCLUDE|EXCLUDE,regex>

New in version 3.27.

Список элементов из list, которые соответствуют (INCLUDE) или не соответствуют (EXCLUDE) регулярному выражению regex. Результат совпадает с $<FILTER:list,INCLUDE|EXCLUDE,regex>.

$<LIST:TRANSFORM,list,ACTION[,SELECTOR]>

New in version 3.27.

Список list преобразован путём применения ACTION ко всем или, указав SELECTOR, к выбранным элементам списка.

Примечание

Подкоманда TRANSFORM не изменяет количество элементов в списке. Если указан SELECTOR, будут изменены только некоторые элементы, остальные останутся такими же, как и до преобразования.

ACTION определяет действие, которое должно быть применено к элементам списка. Действия имеют точно такие же семантику, как и для команды list(TRANSFORM). ACTION должен быть одним из следующих:

APPEND, PREPEND

Добавить, добавить в начало заданное значение к каждому элементу списка.

$<LIST:TRANSFORM,list,(APPEND|PREPEND),value[,SELECTOR]>
TOLOWER, TOUPPER

Преобразовать каждый элемент списка в нижний, верхний регистр.

$<LIST:TRANSFORM,list,(TOLOWER|TOUPPER)[,SELECTOR]>
STRIP

Удалить начальные и конечные пробелы из каждого элемента списка.

$<LIST:TRANSFORM,list,STRIP[,SELECTOR]>
REPLACE:

Сопоставить регулярное выражение как можно больше раз и заменить выражение замены на соответствие для каждого элемента списка.

$<LIST:TRANSFORM,list,REPLACE,regular_expression,replace_expression[,SELECTOR]>

SELECTOR определяет, какие элементы списка будут преобразованы. Одновременно можно указать только один тип селектора. При указании SELECTOR должен быть одним из следующих:

AT

Указать список индексов.

$<LIST:TRANSFORM,list,ACTION,AT,index[,index...]>
FOR

Указать диапазон с, необязательно, приращением, используемым для перебора диапазона.

$<LIST:TRANSFORM,list,ACTION,FOR,start,stop[,step]>
REGEX

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

$<LIST:TRANSFORM,list,ACTION,REGEX,regular_expression>
$<JOIN:list,glue>

Объединяет list с содержимым glue строка, вставленная между каждым элементом. Это концептуально такая же операция, как $<LIST:JOIN,list,glue>, но у двух есть разное поведение по отношению к пустым элементам. $<LIST:JOIN,list,glue> сохраняет все пустые элементы, тогда как $<JOIN,list,glue> отбрасывает все пустые элементы из списка.

$<REMOVE_DUPLICATES:list>

New in version 3.15.

Удаляет дублирующие элементы в заданном list. Относительный порядок элементов сохраняется, и если встречаются дубликаты, сохраняется только первый экземпляр. Результат совпадает с $<LIST:REMOVE_DUPLICATES,list>.

$<FILTER:list,INCLUDE|EXCLUDE,regex>

New in version 3.15.

Включает или удаляет элементы из list которые соответствуют регулярному выражению regex. Результат совпадает с $<LIST:FILTER,list,INCLUDE|EXCLUDE,regex>.

Сортировка списка

$<LIST:REVERSE,list>

New in version 3.27.

Список list с элементами в обратном порядке.

$<LIST:SORT,list[,(COMPARE:option|CASE:option|ORDER:option)]...>

New in version 3.27.

Список list отсортирован в соответствии со специфицированными параметрами.

Используйте один из COMPARE параметров для выбора метода сравнения для сортировки:

STRING

Сортирует список строк в алфавитном порядке. Это поведение по умолчанию, если параметр COMPARE не задан.

FILE_BASENAME

Сортирует список путей к файлам по их именам файлов.

NATURAL

Сортирует список строк в естественном порядке (см. справку для strverscmp(3)), таким образом, что смежные цифры сравниваются как целые числа. Например, следующий список 10.0 1.1 2.1 8.0 2.0 3.1 будет отсортирован как 1.1 2.0 2.1 3.1 8.0 10.0 если выбран параметр сравнения NATURAL, тогда как он будет отсортирован как 1.1 10.0 2.0 2.1 3.1 8.0 с параметром сравнения STRING.

Используйте один из CASE параметров для выбора режима сортировки, чувствительной или нечувствительной к регистру:

SENSITIVE

Элементы списка сортируются по регистру. Это поведение по умолчанию, если параметр CASE не задан.

INSENSITIVE

Элементы списка сортируются без учёта регистра. Порядок элементов, которые различаются только регистром, не определён.

Для управления порядком сортировки можно указать один из ORDER параметров:

ASCENDING

Сортирует список в возрастающем порядке. Это поведение по умолчанию, если параметр ORDER не задан.

DESCENDING

Сортирует список в убывающем порядке.

Параметры могут быть указаны в любом порядке, но указание одного и того же параметра несколько раз является ошибкой.

$<LIST:SORT,list,CASE:SENSITIVE,COMPARE:STRING,ORDER:DESCENDING>

Выражения путей

Большинство выражений в этом разделе тесно связаны с командой cmake_path(), предоставляя те же возможности, но в форме выражения генератора.

Для всех выражений генератора в этом разделе ожидается, что пути будут в формате CMake. Выражение генератора $<PATH:CMAKE_PATH> может быть использовано для преобразования системного пути в путь в формате CMake.

Сравнение путей

$<PATH_EQUAL:path1,path2>

New in version 3.24.

Сравнивает лексические представления двух путей. Никакая нормализация не выполняется для ни одного из путей. Возвращает 1 если пути равны, 0 в противном случае.

См. cmake_path(COMPARE) для получения более подробной информации.

Запросы путей

Эти выражения предоставляют возможности генерации времени, эквивалентные параметрам запроса Query команды cmake_path(). Все пути ожидаются в формате CMake.

$<PATH:HAS_*,path>

New in version 3.24.

Следующие операции возвращают 1 если конкретный компонент пути присутствует, 0 в противном случае. См. Структура и терминология пути для значения каждого компонента пути.

$<PATH:HAS_ROOT_NAME,path>
$<PATH:HAS_ROOT_DIRECTORY,path>
$<PATH:HAS_ROOT_PATH,path>
$<PATH:HAS_FILENAME,path>
$<PATH:HAS_EXTENSION,path>
$<PATH:HAS_STEM,path>
$<PATH:HAS_RELATIVE_PART,path>
$<PATH:HAS_PARENT_PATH,path>

Обратите внимание на следующие частные случаи:

  • Для HAS_ROOT_PATH, истинный результат будет возвращён только если по крайней мере один из root-name или root-directory непустой.
  • Для HAS_PARENT_PATH, корневой каталог также считается имеющим родительский каталог, который будет сам по себе. Результат является истинным, за исключением случая, когда путь состоит только из имени файла.
$<PATH:IS_ABSOLUTE,path>

Новое в версии 3.24.

Возвращает 1 если путь является абсолютным, 0 в противном случае.

$<PATH:IS_RELATIVE,path>

Новое в версии 3.24.

Это вернёт противоположное IS_ABSOLUTE.

$<PATH:IS_PREFIX[,NORMALIZE],path,input>

Новое в версии 3.24.

Возвращает 1 если path является префиксом input, 0 в противном случае.

Когда указан параметр NORMALIZE, path и input нормализуются перед проверкой.

Декомпозиция путей

Эти выражения предоставляют возможности генерации, эквивалентные параметрам Разложения опций команды cmake_path(). Все пути ожидаются в формате CMake.

$<PATH:GET_*,...>

Новое в версии 3.24.

Следующие операции извлекают различные компоненты или группы компонентов из пути. См. Структура и терминология путей для значения каждого компонента пути.

Изменено в версии 3.27: Все операции теперь принимают список путей в качестве аргумента. При указании списка путей операция будет применена к каждому пути.

$<PATH:GET_ROOT_NAME,path...>
$<PATH:GET_ROOT_DIRECTORY,path...>
$<PATH:GET_ROOT_PATH,path...>
$<PATH:GET_FILENAME,path...>
$<PATH:GET_EXTENSION[,LAST_ONLY],path...>
$<PATH:GET_STEM[,LAST_ONLY],path...>
$<PATH:GET_RELATIVE_PART,path...>
$<PATH:GET_PARENT_PATH,path...>

Если запрашиваемый компонент отсутствует в пути, возвращается пустая строка.

Преобразования путей

Эти выражения предоставляют возможности генерации, эквивалентные параметрам Модификации и Генерации команды cmake_path(). Все пути ожидаются в формате CMake.

Изменено в версии 3.27: Все операции теперь принимают список путей в качестве аргумента. При указании списка путей операция будет применена к каждому пути.

$<PATH:CMAKE_PATH[,NORMALIZE],path...>

Новое в версии 3.24.

Возвращает path. Если path это системный путь, он преобразуется в путь CMake со слешами вперед (/). В Windows учитывается маркер длинного имени файла.

Когда указан параметр NORMALIZE, путь нормализуется после преобразования.

$<PATH:APPEND,path...,input,...>

Новое в версии 3.24.

Возвращает все аргументы input добавленные к path используя / в качестве directory-separator. В зависимости от input, значение path может быть отброшено.

См. cmake_path(APPEND) для более подробной информации.

$<PATH:REMOVE_FILENAME,path...>

Новое в версии 3.24.

Возвращает path с удалённым компонентом имени файла (как возвращается $<PATH:GET_FILENAME>). После удаления любые завершающие directory-separator остаются без изменений, если присутствуют.

См. cmake_path(REMOVE_FILENAME) для более подробной информации.

$<PATH:REPLACE_FILENAME,path...,input>

Новое в версии 3.24.

Возвращает path с компонентом имени файла, заменённым на input. Если у path нет компонента имени файла (т.е. $<PATH:HAS_FILENAME> возвращает 0), path не изменяется.

См. cmake_path(REPLACE_FILENAME) для более подробной информации.

$<PATH:REMOVE_EXTENSION[,LAST_ONLY],path...>

Новое в версии 3.24.

Возвращает path с удалённым расширением, если таковое есть.

См. cmake_path(REMOVE_EXTENSION) для более подробной информации.

$<PATH:REPLACE_EXTENSION[,LAST_ONLY],path...,input>

Новое в версии 3.24.

Возвращает path с расширением, заменённым на input, если таковое есть.

См. cmake_path(REPLACE_EXTENSION) для более подробной информации.

$<PATH:NORMAL_PATH,path...>

Новое в версии 3.24.

Возвращает path нормализованный в соответствии с шагами, описанными в Нормализации.

$<PATH:RELATIVE_PATH,path...,base_directory>

Новое в версии 3.24.

Возвращает path, изменённый для относительности к аргументу base_directory.

См. cmake_path(RELATIVE_PATH) для более подробной информации.

$<PATH:ABSOLUTE_PATH[,NORMALIZE],path...,base_directory>

Новое в версии 3.24.

Возвращает path в виде абсолютного пути. Если path является относительным путем ($<PATH:IS_RELATIVE> возвращает 1), он вычисляется относительно заданного базового каталога, указанного аргументом base_directory.

Когда указан параметр NORMALIZE, путь нормализуется после вычисления пути.

См. cmake_path(ABSOLUTE_PATH) для более подробной информации.

Пути оболочки

$<SHELL_PATH:...>

Новое в версии 3.4.

Содержимое ... преобразуется в стиль пути оболочки. Например, слэши преобразуются в обратные слэши в оболочках Windows, а буквы дисков — в пути POSIX в оболочках MSYS. ... должен быть абсолютным путём.

Новое в версии 3.14: Аргумент ... может быть списком, разделённым точкой с запятой путей, в этом случае каждый путь преобразуется индивидуально, и результат генерируется с использованием разделителя путей оболочки (: на POSIX и ; на Windows). Не забудьте заключить аргумент, содержащий этот genex, в двойные кавычки в коде CMake, чтобы ; не разделил аргументы.

Выражения конфигурации

$<CONFIG>

Имя конфигурации. Используйте это вместо устаревшего выражения генератора CONFIGURATION.

END_OF_DOCUMENT_MARKER
$<CONFIG:cfgs>

1 если конфигурация совпадает с любым из элементов в списке, разделённом запятыми cfgs, иначе 0. Это сравнение не учитывает регистр. Сопоставление в MAP_IMPORTED_CONFIG_<CONFIG> также учитывается при вычислении на свойстве целевого IMPORTED объекта.

Изменено в версии 3.19: Для cfgs можно указать несколько конфигураций. CMake 3.18 и более ранние версии принимали только одну конфигурацию.

$<OUTPUT_CONFIG:...>

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

Допустимо только в add_custom_command() и add_custom_target() как внешнее выражение генератора в аргументе. С генератором Ninja Multi-Config, выражения генератора в ... вычисляются, используя "выходную конфигурацию" пользовательской команды. С другими генераторами содержимое ... вычисляется в обычном режиме.

$<COMMAND_CONFIG:...>

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

Допустимо только в add_custom_command() и add_custom_target() как внешнее выражение генератора в аргументе. С генератором Ninja Multi-Config, выражения генератора в ... вычисляются, используя "командную конфигурацию" пользовательской команды. С другими генераторами содержимое ... вычисляется в обычном режиме.

Toolchain And Language Expressions

Platform

$<PLATFORM_ID>

Идентификатор платформы текущей системы CMake. Смотрите также переменную CMAKE_SYSTEM_NAME.

$<PLATFORM_ID:platform_ids>

1 если идентификатор платформы CMake совпадает с любым из элементов в списке, разделённом запятыми platform_ids, иначе 0. Смотрите также переменную CMAKE_SYSTEM_NAME.

Compiler Version

Смотрите также переменную CMAKE_<LANG>_COMPILER_VERSION, которая тесно связана с выражениями в этом подразделе.

$<C_COMPILER_VERSION>

Версия используемого компилятора C.

$<C_COMPILER_VERSION:version>

1 если версия компилятора C совпадает с version, иначе 0.

$<CXX_COMPILER_VERSION>

Версия используемого компилятора C++.

$<CXX_COMPILER_VERSION:version>

1 если версия компилятора C++ совпадает с version, иначе 0.

$<CUDA_COMPILER_VERSION>

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

Версия используемого компилятора CUDA.

$<CUDA_COMPILER_VERSION:version>

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

1 если версия компилятора C++ совпадает с version, иначе 0.

$<OBJC_COMPILER_VERSION>

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

Версия используемого компилятора Objective-C.

$<OBJC_COMPILER_VERSION:version>

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

1 если версия компилятора Objective-C совпадает с version, иначе 0.

$<OBJCXX_COMPILER_VERSION>

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

Версия используемого компилятора Objective-C++.

$<OBJCXX_COMPILER_VERSION:version>

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

1 если версия компилятора Objective-C++ совпадает с version, иначе 0.

$<Fortran_COMPILER_VERSION>

Версия используемого компилятора Fortran.

$<Fortran_COMPILER_VERSION:version>

1 если версия компилятора Fortran совпадает с version, иначе 0.

$<HIP_COMPILER_VERSION>

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

Версия используемого компилятора HIP.

$<HIP_COMPILER_VERSION:version>

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

1 если версия компилятора HIP совпадает с version, иначе 0.

$<ISPC_COMPILER_VERSION>

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

Версия используемого компилятора ISPC.

$<ISPC_COMPILER_VERSION:version>

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

1 если версия компилятора ISPC совпадает с version, иначе 0.

Compiler Language, ID, and Frontend-Variant

Смотрите также переменные CMAKE_<LANG>_COMPILER_ID и CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT, которые тесно связаны с большинством выражений в этом подразделе.

$<C_COMPILER_ID>

Идентификатор компилятора C, используемый CMake.

$<C_COMPILER_ID:compiler_ids>

где compiler_ids - список, разделённый запятыми. 1 если идентификатор компилятора C CMake совпадает с любым из элементов в compiler_ids, иначе 0.

Изменено в версии 3.15: Можно указать несколько compiler_ids. CMake 3.14 и более ранние версии принимали только один идентификатор компилятора.

$<CXX_COMPILER_ID>

Идентификатор компилятора C++, используемый CMake.

$<CXX_COMPILER_ID:compiler_ids>

где compiler_ids - список, разделённый запятыми. 1 если идентификатор компилятора C++ CMake совпадает с любым из элементов в compiler_ids, иначе 0.

Изменено в версии 3.15: Можно указать несколько compiler_ids. CMake 3.14 и более ранние версии принимали только один идентификатор компилятора.

$<CUDA_COMPILER_ID>

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

Идентификатор компилятора CUDA, используемый CMake.

END_OF_DOCUMENT_MARKER
$<CUDA_COMPILER_ID:compiler_ids>

Новое в версии 3.15.

где compiler_ids — это список, разделенный запятыми. 1 если идентификатор компилятора CMake CUDA-компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<OBJC_COMPILER_ID>

Новое в версии 3.16.

Идентификатор компилятора CMake используемого Objective-C компилятора.

$<OBJC_COMPILER_ID:compiler_ids>

Новое в версии 3.16.

где compiler_ids — это список, разделенный запятыми. 1 если идентификатор компилятора CMake Objective-C компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<OBJCXX_COMPILER_ID>

Новое в версии 3.16.

Идентификатор компилятора CMake используемого Objective-C++ компилятора.

$<OBJCXX_COMPILER_ID:compiler_ids>

Новое в версии 3.16.

где compiler_ids — это список, разделенный запятыми. 1 если идентификатор компилятора CMake Objective-C++ компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<Fortran_COMPILER_ID>

Идентификатор компилятора CMake используемого Fortran компилятора.

$<Fortran_COMPILER_ID:compiler_ids>

где compiler_ids — это список, разделенный запятыми. 1 если идентификатор компилятора CMake Fortran компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

Изменено в версии 3.15: Можно указать несколько compiler_ids. CMake 3.14 и более ранние версии принимали только один идентификатор компилятора.

$<HIP_COMPILER_ID>

Новое в версии 3.21.

Идентификатор компилятора CMake используемого HIP компилятора.

$<HIP_COMPILER_ID:compiler_ids>

Новое в версии 3.21.

где compiler_ids — это список, разделенный запятыми. 1 если идентификатор компилятора CMake HIP компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<ISPC_COMPILER_ID>

Новое в версии 3.19.

Идентификатор компилятора CMake используемого ISPC компилятора.

$<ISPC_COMPILER_ID:compiler_ids>

Новое в версии 3.19.

где compiler_ids — это список, разделенный запятыми. 1 если идентификатор компилятора CMake ISPC компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<C_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Вариант фронтэнда компилятора CMake используемого C компилятора.

$<C_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake C компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<CXX_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Вариант фронтэнда компилятора CMake используемого C++ компилятора.

$<CXX_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake C++ компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<CUDA_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Идентификатор компилятора CMake используемого CUDA компилятора.

$<CUDA_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake CUDA компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<OBJC_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Вариант фронтэнда компилятора CMake используемого Objective-C компилятора.

$<OBJC_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake Objective-C компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<OBJCXX_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Вариант фронтэнда компилятора CMake используемого Objective-C++ компилятора.

$<OBJCXX_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake Objective-C++ компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<Fortran_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Идентификатор компилятора CMake используемого Fortran компилятора.

$<Fortran_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake Fortran компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<HIP_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Идентификатор компилятора CMake используемого HIP компилятора.

$<HIP_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake HIP компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<ISPC_COMPILER_FRONTEND_VARIANT>

Новое в версии 3.30.

Идентификатор компилятора CMake используемого ISPC компилятора.

$<ISPC_COMPILER_FRONTEND_VARIANT:compiler_ids>

Новое в версии 3.30.

где compiler_ids — это список, разделенный запятыми. 1 если вариант фронтэнда компилятора CMake ISPC компилятора совпадает с одним из элементов в compiler_ids, в противном случае 0.

$<COMPILE_LANGUAGE>

Новое в версии 3.3.

Язык компиляции исходных файлов при оценке параметров компиляции. См. соответствующее булево выражение $<COMPILE_LANGUAGE:language> для заметок о портативности этого выражения генератора.

$<COMPILE_LANGUAGE:languages>

Новое в версии 3.3.

Изменено в версии 3.15: Для languages могут быть указаны несколько языков. CMake 3.14 и более ранние версии принимали только один язык.

1 если язык, используемый для компиляции блока, совпадает с любым из значений, перечисленных через запятую в languages, в противном случае 0. Данное выражение может быть использовано для указания опций компиляции, определений компиляции и каталогов включения для исходных файлов определенного языка в целевом объекте. Например:

add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
target_compile_options(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
)
target_compile_definitions(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX>
          $<$<COMPILE_LANGUAGE:CUDA>:COMPILING_CUDA>
)
target_include_directories(myapp
  PRIVATE $<$<COMPILE_LANGUAGE:CXX,CUDA>:/opt/foo/headers>
)

Это указывает на использование опции компиляции -fno-exceptions, определения компиляции COMPILING_CXX и каталога включения cxx_headers только для C++. Также указано определение компиляции COMPILING_CUDA для CUDA.

Обратите внимание, что в генераторах Visual Studio и Xcode нет способа представить определения компиляции или каталоги включения для всего целевого объекта отдельно для языков C и CXX. Также в генераторах Visual Studio нет способа представить флаги целевого объекта отдельно для языков C и CXX. В этих генераторах выражения для файлов исходных кодов C и C++ будут вычисляться с использованием CXX, если есть какие-либо файлы исходных кодов C++, и в противном случае с использованием C. Решением является создание отдельных библиотек для каждого языка исходных файлов:

add_library(myapp_c foo.c)
add_library(myapp_cxx bar.cpp)
target_compile_options(myapp_cxx PUBLIC -fno-exceptions)
add_executable(myapp main.cpp)
target_link_libraries(myapp myapp_c myapp_cxx)
$<COMPILE_LANG_AND_ID:language,compiler_ids>

Новое в версии 3.15.

1 когда язык, используемый для компиляции блока, соответствует language, а идентификатор компилятора CMake для компилятора language соответствует одному из значений, перечисленных через запятую в compiler_ids, в противном случае 0. Это выражение является сокращённой формой комбинации $<COMPILE_LANGUAGE:language> и $<LANG_COMPILER_ID:compiler_ids>. Данное выражение может быть использовано для указания опций компиляции, определений компиляции и каталогов включения для исходных файлов определенной комбинации языка и компилятора в целевом объекте. Например:

add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
target_compile_definitions(myapp
  PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:COMPILING_CXX_WITH_CLANG>
          $<$<COMPILE_LANG_AND_ID:CXX,Intel>:COMPILING_CXX_WITH_INTEL>
          $<$<COMPILE_LANG_AND_ID:C,Clang>:COMPILING_C_WITH_CLANG>
)

Это указывает на использование различных определений компиляции, основываясь как на идентификаторе компилятора, так и на языке компиляции. В этом примере будет использоваться определение COMPILING_CXX_WITH_CLANG, когда Clang является CXX компилятором, и COMPILING_CXX_WITH_INTEL, когда Intel является CXX компилятором. Аналогично, когда C компилятором является Clang, будет видно только определение COMPILING_C_WITH_CLANG.

Без выражения генератора COMPILE_LANG_AND_ID, та же логика выражается как:

target_compile_definitions(myapp
  PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:AppleClang,Clang>>:COMPILING_CXX_WITH_CLANG>
          $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:Intel>>:COMPILING_CXX_WITH_INTEL>
          $<$<AND:$<COMPILE_LANGUAGE:C>,$<C_COMPILER_ID:Clang>>:COMPILING_C_WITH_CLANG>
)

Свойства компиляции

$<COMPILE_FEATURES:features>

Новое в версии 3.1.

где features — список значений, разделённых запятыми. Возвращает значение 1, если все указанные features доступны для целевого объекта 'head', и 0 в противном случае. Если это выражение используется при вычислении реализации ссылки целевого объекта и если какая-либо зависимость транзитивно увеличивает требуемые C_STANDARD или CXX_STANDARD для целевого объекта 'head', отображается ошибка. См. руководство cmake-compile-features(7) для получения информации о свойствах компиляции и списке поддерживаемых компиляторов.

Контекст компиляции

$<COMPILE_ONLY:...>

Новое в версии 3.27.

Содержимое ..., при сборе свойств компиляции, в противном случае — пустая строка. Предназначено для использования в свойствах целевого объекта INTERFACE_LINK_LIBRARIES и LINK_LIBRARIES, обычно заполняемых с помощью команды target_link_libraries(). Определяет требования к компиляции без каких-либо требований к линковке.

Примеры использования включают использование только заголовков, где известно, что все использования не требуют линковки (например, все библиотеки на основе заголовков или шаблонов C++).

Обратите внимание, что для правильного вычисления этого выражения требуется, чтобы политика CMP0099 была установлена в значение NEW.

Язык и идентификатор линковки

$<LINK_LANGUAGE>

Новое в версии 3.18.

Язык линковки целевого объекта при оценке опций линковки. См. соответствующее булево выражение $<LINK_LANGUAGE:languages> для заметок о переносимости этого выражения генератора.

Примечание

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

$<LINK_LANGUAGE:languages>

Новое в версии 3.18.

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

add_library(api_C ...)
add_library(api_CXX ...)
add_library(api INTERFACE)
target_link_options(api   INTERFACE $<$<LINK_LANGUAGE:C>:-opt_c>
                                    $<$<LINK_LANGUAGE:CXX>:-opt_cxx>)
target_link_libraries(api INTERFACE $<$<LINK_LANGUAGE:C>:api_C>
                                    $<$<LINK_LANGUAGE:CXX>:api_CXX>)

add_executable(myapp1 main.c)
target_link_options(myapp1 PRIVATE api)

add_executable(myapp2 main.cpp)
target_link_options(myapp2 PRIVATE api)

Это указывает на использование целевого объекта api для линковки целевых объектов myapp1 и myapp2. На практике, myapp1 будет линковаться с целевым объектом api_C и опцией -opt_c, потому что он будет использовать C в качестве языка линковки. А myapp2 будет линковаться с api_CXX и опцией -opt_cxx, потому что CXX будет языком линковки.

Примечание

Для определения языка линковки целевого объекта необходимо транзитивно собрать все целевые объекты, которые будут линковаться к нему. Поэтому для свойств библиотек линковки будет выполнена двойная оценка. Во время первой оценки выражения $<LINK_LANGUAGE:..> всегда возвращают 0. Язык линковки, вычисленный после этого первого прохода, будет использован для второго прохода. Чтобы избежать несоответствия, необходимо, чтобы второй проход не изменял язык линковки. Более того, чтобы избежать неожиданных побочных эффектов, необходимо указывать полные сущности в качестве части выражения $<LINK_LANGUAGE:..>. Например:

add_library(lib STATIC file.cxx)
add_library(libother STATIC file.c)

# bad usage
add_executable(myapp1 main.c)
target_link_libraries(myapp1 PRIVATE lib$<$<LINK_LANGUAGE:C>:other>)

# correct usage
add_executable(myapp2 main.c)
target_link_libraries(myapp2 PRIVATE $<$<LINK_LANGUAGE:C>:libother>)

В этом примере, для myapp1, первый проход, неожиданно, определит, что язык линковки — CXX, потому что оценка выражения генератора будет пустой строкой, поэтому myapp1 будет зависеть от целевого объекта lib, который является C++. Напротив, для myapp2, первая оценка даст C в качестве языка линковки, поэтому второй проход правильно добавит целевой объект libother как зависимость линковки.

$<LINK_LANG_AND_ID:language,compiler_ids>

Новое в версии 3.18.

1 когда язык, используемый для шага линковки, соответствует language, и идентификатор компилятора CMake для линковщика языка соответствует одному из значений, перечисленных через запятую в compiler_ids, в противном случае 0. Это выражение является сокращением для комбинации $<LINK_LANGUAGE:language> и $<LANG_COMPILER_ID:compiler_ids>. Это выражение может быть использовано для указания библиотек линковки, опций линковки, каталогов линковки и зависимостей линковки для определенной комбинации языка и линковщика в целевом объекте. Например:

add_library(libC_Clang ...)
add_library(libCXX_Clang ...)
add_library(libC_Intel ...)
add_library(libCXX_Intel ...)

add_executable(myapp main.c)
if (CXX_CONFIG)
  target_sources(myapp PRIVATE file.cxx)
endif()
target_link_libraries(myapp
  PRIVATE $<$<LINK_LANG_AND_ID:CXX,Clang,AppleClang>:libCXX_Clang>
          $<$<LINK_LANG_AND_ID:C,Clang,AppleClang>:libC_Clang>
          $<$<LINK_LANG_AND_ID:CXX,Intel>:libCXX_Intel>
          $<$<LINK_LANG_AND_ID:C,Intel>:libC_Intel>)

Это указывает на использование различных библиотек линковки, основываясь на идентификаторе компилятора и языке линковки. В этом примере целевой объект libCXX_Clang будет зависимостью линковки, когда Clang или AppleClang является линковщиком CXX, и libCXX_Intel, когда Intel является линковщиком CXX. Аналогично, когда линковщик C — Clang или AppleClang, целевой объект libC_Clang будет добавлен в качестве зависимости линковки, а libC_Intel, когда Intel является линковщиком C.

См. примечание, связанное с $<LINK_LANGUAGE:language> для ограничений использования этого выражения генератора.

Свойства линковки

$<LINK_LIBRARY:feature,library-list>

Новое в версии 3.24.

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

add_library(lib1 STATIC ...)
add_library(lib2 ...)
target_link_libraries(lib2 PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,lib1>")

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

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

DEFAULT

Эта функция соответствует стандартной линковке, по сути, эквивалентной отсутствию функции. Обычно используется только с LINK_LIBRARY_OVERRIDE и LINK_LIBRARY_OVERRIDE_<LIBRARY> свойствами целевого объекта.

WHOLE_ARCHIVE

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

  • Linux.
  • Все варианты BSD.
  • SunOS.
  • Все варианты Apple. Библиотека должна быть указана как имя целевого объекта CMake, имя файла библиотеки (например, libfoo.a) или путь к файлу библиотеки (например, /path/to/libfoo.a). Из-за ограничения Apple linker, она не может быть указана как простое имя библиотеки, например, foo, где foo не является целевым объектом CMake.
  • Windows. При использовании MSVC или аналогичной цепочки инструментов, версия MSVC должна быть больше 1900.
  • Cygwin.
  • MSYS.
FRAMEWORK

Этот параметр сообщает линковщику найти указанную фреймворк с помощью параметра линковщика -framework. Он может использоваться только на платформах Apple и только с линковщиком, понимающим используемый параметр (т.е. линковщик, поставляемый с Xcode или совместимый с ним).

Фреймворк может быть указан как целевой объект фреймворка CMake, простое имя фреймворка или путь к файлу. Если указан целевой объект, у этого целевого объекта должно быть установлено свойство целевого объекта FRAMEWORK в значение true. Для пути к файлу, если он содержит часть каталога, этот каталог будет добавлен в путь поиска фреймворков.

add_library(lib SHARED ...)
target_link_libraries(lib PRIVATE "$<LINK_LIBRARY:FRAMEWORK,/path/to/my_framework>")

# The constructed linker command line will contain:
#   -F/path/to -framework my_framework

Пути к файлам должны соответствовать одному из следующих шаблонов (* - символ подстановки, а необязательные части показаны как [...]):

  • [/path/to/]FwName[.framework]
  • [/path/to/]FwName.framework/FwName[suffix]
  • [/path/to/]FwName.framework/Versions/*/FwName[suffix]

Обратите внимание, что CMake распознает и автоматически обрабатывает целевые объекты фреймворков, даже без использования выражения $<LINK_LIBRARY:FRAMEWORK,...>. Выражение генератора все же можно использовать с целевым объектом CMake, если проект хочет быть явным в этом, но это не обязательно. Команда линковщика может иметь некоторые различия при использовании выражения генератора или без него, но конечный результат должен быть одинаковым. С другой стороны, если указан путь к файлу, CMake будет распознавать некоторые пути автоматически, но не все случаи. Проект может использовать $<LINK_LIBRARY:FRAMEWORK,...> для путей к файлам, чтобы ожидаемое поведение было ясным.

Новое в версии 3.25: Свойство целевого объекта FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG> а также suffix имени библиотеки фреймворка теперь поддерживаются функциями FRAMEWORK.

NEEDED_FRAMEWORK

Это аналогично функции FRAMEWORK, за исключением того, что она принуждает линковщик к линковке с фреймворком, даже если из него не используются символы. Использует параметр -needed_framework и имеет те же ограничения линковщика, что и FRAMEWORK.

REEXPORT_FRAMEWORK

Это аналогично функции FRAMEWORK, за исключением того, что она сообщает линковщику, что фреймворк должен быть доступен клиентам, линкованным с создаваемой библиотекой. Использует параметр -reexport_framework и имеет те же ограничения линковщика, что и FRAMEWORK.

WEAK_FRAMEWORK

Это аналогично функции FRAMEWORK, за исключением того, что она принуждает линковщик пометить фреймворк и все ссылки на него как слабые импорты. Использует параметр -weak_framework и имеет те же ограничения линковщика, что и FRAMEWORK.

NEEDED_LIBRARY

Это аналогично функции NEEDED_FRAMEWORK, за исключением того, что она предназначена для использования с целевыми объектами или библиотеками, не являющимися фреймворками (только платформы Apple). Использует параметр -needed_library или -needed-l соответственно и имеет те же ограничения линковщика, что и NEEDED_FRAMEWORK.

REEXPORT_LIBRARY

Это аналогично функции REEXPORT_FRAMEWORK, за исключением того, что она предназначена для использования с целевыми объектами или библиотеками, не являющимися фреймворками (только платформы Apple). Использует параметр -reexport_library или -reexport-l соответственно и имеет те же ограничения линковщика, что и REEXPORT_FRAMEWORK.

WEAK_LIBRARY

Это аналогично функции WEAK_FRAMEWORK, за исключением того, что она предназначена для использования с целевыми объектами или библиотеками, не являющимися фреймворками (только платформы Apple). Использует параметр -weak_library или -weak-l соответственно и имеет те же ограничения линковщика, что и WEAK_FRAMEWORK.

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

  • CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>_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-цель типа ОБЪЕКТ или ИНТЕРФЕЙС проигнорирует аспект функции выражения и вместо этого будет связана стандартным образом.
  • Генераторское выражение $<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 имени происходит в каталоге целевого объекта, указывающего требование, а не в каталоге целевого объекта, для которого вычисляется выражение.

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

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

$<TARGET_BUNDLE_DIR_NAME:tgt>

Новое в версии 3.24.

Имя каталога пакета (my.app, my.framework, или my.bundle), где tgt — имя целевого объекта.

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

END_OF_DOCUMENT_MARKER
$<TARGET_BUNDLE_CONTENT_DIR:tgt>

Новое в версии 3.9.

Полный путь к каталогу содержимого пакета, где tgt — имя целевого объекта. Для macOS SDK он указывает на /path/to/my.app/Contents, /path/to/my.framework, или /path/to/my.bundle/Contents. Для всех других SDK (например, iOS) он указывает на /path/to/my.app, /path/to/my.framework, или /path/to/my.bundle из-за плоской структуры пакета.

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

$<TARGET_OBJECTS:tgt>

Новое в версии 3.1.

Список объектов, полученных в результате построения tgt. Обычно используется для целевых объектов типа библиотеки объектов.

$<TARGET_RUNTIME_DLLS:tgt>

Новое в версии 3.21.

Список DLL, от которых зависит целевой объект во время выполнения. Это определяется расположением всех SHARED целевых объектов в транзитивных зависимостях целевого объекта. Если нужны только каталоги DLL, см. выражение генератора TARGET_RUNTIME_DLL_DIRS. Использование этого выражения генератора для целевых объектов, отличных от исполняемых файлов, SHARED библиотек и MODULE библиотек, является ошибкой. В платформах, не поддерживающих DLL, это выражение всегда возвращает пустую строку.

Это выражение генератора может быть использовано для копирования всех DLL, от которых зависит целевой объект, в каталог вывода в POST_BUILD пользовательской команде с использованием команды cmake -E copy -t. Например:

find_package(foo CONFIG REQUIRED) # package generated by install(EXPORT)

add_executable(exe main.c)
target_link_libraries(exe PRIVATE foo::foo foo::bar)
add_custom_command(TARGET exe POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:exe> $<TARGET_RUNTIME_DLLS:exe>
  COMMAND_EXPAND_LISTS
)

Примечание

Импортированные целевые объекты поддерживаются только в том случае, если они знают расположение своих файлов .dll. Импортированная SHARED библиотека должна иметь свойство IMPORTED_LOCATION, установленное на свой файл .dll. Подробности см. в разделе add_library импортированных библиотек. Многие модули поиска Find Modules генерируют импортированные целевые объекты с типом UNKNOWN, и поэтому они будут проигнорированы.

В платформах, поддерживающих пути времени выполнения (RPATH), обратитесь к свойству целевого объекта INSTALL_RPATH. В платформах Apple обратитесь к свойству целевого объекта INSTALL_NAME_DIR.

$<TARGET_RUNTIME_DLL_DIRS:tgt>

Новое в версии 3.27.

Список каталогов, содержащих DLL, от которых зависит целевой объект во время выполнения (см. TARGET_RUNTIME_DLLS). Это определяется расположением всех SHARED целевых объектов в транзитивных зависимостях целевого объекта. Использование этого выражения генератора для целевых объектов, отличных от исполняемых файлов, SHARED библиотек и MODULE библиотек, является ошибкой. В платформах, не поддерживающих DLL, это выражение всегда возвращает пустую строку.

Это выражение генератора может, например, использоваться для создания командного файла с помощью file(GENERATE), который устанавливает переменную среды PATH соответствующим образом.

Выражения экспорта и установки

$<INSTALL_INTERFACE:...>

Содержимое ... при экспорте свойства с помощью install(EXPORT), и пустая строка в противном случае.

$<BUILD_INTERFACE:...>

Содержимое ... при экспорте свойства с помощью export(), или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае возвращается пустая строка.

$<BUILD_LOCAL_INTERFACE:...>

Новое в версии 3.26.

Содержимое ... когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае возвращается пустая строка.

$<INSTALL_PREFIX>

Содержимое префикса установки, когда целевой объект экспортируется через install(EXPORT), или когда вычисляется в свойстве INSTALL_NAME_DIR или аргументе INSTALL_NAME_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 если config — Debug), необходимо вычислить результат $<TARGET_PROPERTY:foo,CUSTOM_KEYS>:

add_custom_target(printFooKeys
  COMMAND ${CMAKE_COMMAND} -E
    echo $<TARGET_GENEX_EVAL:foo,$<TARGET_PROPERTY:foo,CUSTOM_KEYS>>
)

Символы с экранированием

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

$<ANGLE-R>

Литеральный >. Используется, например, для сравнения строк, содержащих >.

$<COMMA>

Литеральный ,. Используется, например, для сравнения строк, содержащих ,.

$<SEMICOLON>

Литеральный ;. Используется для предотвращения расширения списка в аргументе с ;.

$<QUOTE>

Новое в версии 3.30.

Литеральный ". Используется для разрешения использования строковых литералов в выражении генератора.

Устаревшие выражения

$<CONFIGURATION>

Имя конфигурации. Устарело с CMake 3.0. Используйте CONFIG вместо него.

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/manual/cmake-generator-expressions.7.html

Spec-Zone.ru

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