Spec-Zone.ru › CMake 3.23

cmake-generator-expressions(7)

  • Введение
  • Булевы выражения генератора

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

    • Экранированные символы
    • Условные выражения
    • Преобразования строк
    • Запросы к переменным
    • Запросы, зависящие от целевых объектов
    • Выражения, связанные с выводом
  • Отладка

Введение

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

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

Они позволяют условную компоновку, условные определения, используемые при компиляции, условные каталоги включения и многое другое. Условия могут основываться на конфигурации сборки, свойствах целевых объектов, информации о платформе или любой другой запрошиваемой информации.

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

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

Булевы выражения генератора

Булевы выражения вычисляются либо как 0 либо как 1 . Они обычно используются для построения условия в условном выражении генератора.

Доступные булевы выражения:

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

$<BOOL:string>

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

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

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

$<AND:conditions>

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

$<OR:conditions>

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

$<NOT:condition>

0 если condition равно 1, иначе 1.

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

$<STREQUAL:string1,string2>

1 если string1 и string2 равны, иначе 0. Сравнение чувствительно к регистру. Для сравнения, нечувствительного к регистру, используйте выражение генератора для преобразования строк.

$<STREQUAL:$<UPPER_CASE:${foo}>,"BAR"> # "1" if ${foo} is any of "BAR", "Bar", "bar", ...
$<EQUAL:value1,value2>

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

$<IN_LIST:string,list>

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

1 если string является элементом полученного через разделитель ";" списка list, иначе 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.

Запросы к переменным

$<TARGET_EXISTS:target>

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

1 если target существует, иначе 0.

$<CONFIG:cfgs>

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

$<PLATFORM_ID:platform_ids>

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

$<C_COMPILER_ID:compiler_ids>

где compiler_ids — список через запятую. 1 если идентификатор компилятора CMake для компилятора C совпадает с одним из элементов в compiler_ids, иначе 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<CXX_COMPILER_ID:compiler_ids>

где compiler_ids — список через запятую. 1 если идентификатор компилятора CMake для компилятора C++ совпадает с одним из элементов в compiler_ids, иначе 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

END_OF_DOCUMENT_MARKER
$<CUDA_COMPILER_ID:compiler_ids>

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

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake CUDA соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<OBJC_COMPILER_ID:compiler_ids>

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

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

$<OBJCXX_COMPILER_ID:compiler_ids>

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

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

$<Fortran_COMPILER_ID:compiler_ids>

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake Fortran соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<HIP_COMPILER_ID:compiler_ids>

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

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake HIP соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<ISPC_COMPILER_ID:compiler_ids>

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

где compiler_ids — список, разделенный запятыми. 1 если идентификатор компилятора CMake ISPC соответствует одному из элементов в compiler_ids, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_ID.

$<C_COMPILER_VERSION:version>

1 если версия компилятора C соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CXX_COMPILER_VERSION:version>

1 если версия компилятора CXX соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CUDA_COMPILER_VERSION:version>

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

1 если версия компилятора CXX соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJC_COMPILER_VERSION:version>

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

1 если версия компилятора OBJC соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJCXX_COMPILER_VERSION:version>

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

1 если версия компилятора OBJCXX соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<Fortran_COMPILER_VERSION:version>

1 если версия компилятора Fortran соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<HIP_COMPILER_VERSION:version>

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

1 если версия компилятора HIP соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<ISPC_COMPILER_VERSION:version>

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

1 если версия компилятора ISPC соответствует version, в противном случае 0. См. также переменную CMAKE_<LANG>_COMPILER_VERSION.

$<TARGET_POLICY:policy>

1 если policy было NEW при создании целевого объекта 'head', иначе 0. Если policy не установлено, будет выведено сообщение об ошибке для политики. Данное выражение генератора работает только для подмножества политик.

$<COMPILE_FEATURES:features>

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

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

$<COMPILE_LANG_AND_ID:language,compiler_ids>

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

1 если язык, используемый для компиляции модуля, соответствует language и идентификатор компилятора CMake для языка соответствует одному из элементов в 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>
)
END_OF_DOCUMENT_MARKER
$<COMPILE_LANGUAGE:languages>

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

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)
$<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_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 в качестве зависимости компоновки.

$<DEVICE_LINK:list>

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

Возвращает список, если это шаг компоновки устройства, в противном случае пустой список. Шаг компоновки устройства управляется свойствами CUDA_SEPARABLE_COMPILATION и CUDA_RESOLVE_DEVICE_SYMBOLS и политикой CMP0105. Это выражение может использоваться только для указания параметров компоновки.

$<HOST_LINK:list>

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

Возвращает список, если это обычный шаг компоновки, в противном случае пустой список. Это выражение в основном полезно, когда также участвует шаг компоновки устройства (см. выражение генератора $<DEVICE_LINK:list>). Это выражение может использоваться только для указания параметров компоновки.

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

Эти выражения расширяются до некоторой строки. Например,

include_directories(/usr/include/$<CXX_COMPILER_ID>/)

расширяется до /usr/include/GNU/ или /usr/include/Clang/ и т. д. в зависимости от идентификатора компилятора.

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

$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,4.2.0>:OLD_COMPILER>

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

И вот два вложенных строковых выражения:

-I$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I>

генерирует строку элементов свойства целевого объекта INCLUDE_DIRECTORIES, при этом каждый элемент предваряется -I.

Продолжая предыдущий пример, если сначала нужно проверить, является ли свойство INCLUDE_DIRECTORIES непустым, рекомендуется ввести вспомогательную переменную для удобочитаемости кода:

set(prop "$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>") # helper variable
$<$<BOOL:${prop}>:-I$<JOIN:${prop}, -I>>

Доступны следующие строковые выражения генератора:

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

Строковые литералы для экранирования специального значения, которое символ имел бы в противном случае:

$<ANGLE-R>

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

$<COMMA>

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

$<SEMICOLON>

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

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

Условные выражения генератора зависят от булевого условия, которое должно быть 0 или 1.

$<condition:true_string>

Вычисляется как true_string если condition - 1. В противном случае вычисляется как пустая строка.

$<IF:condition,true_string,false_string>

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

Вычисляется как true_string если condition - 1. В противном случае вычисляется как false_string.

Обычно condition является булевым выражением генератора. Например,

$<$<CONFIG:Debug>:DEBUG_MODE>

расширяется до DEBUG_MODE при конфигурации Debug, и в противном случае расширяется до пустой строки.

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

$<JOIN:list,string>

Объединяет список с содержимым string.

$<REMOVE_DUPLICATES:list>

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

Удаляет дублируемые элементы в данном list.

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

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

Включает или удаляет элементы из list, которые соответствуют регулярному выражению regex.

$<LOWER_CASE:string>

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

$<UPPER_CASE:string>

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

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

Запросы к переменным

$<CONFIG>

Имя конфигурации.

$<CONFIGURATION>

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

$<PLATFORM_ID>

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

$<C_COMPILER_ID>

Идентификатор компилятора C, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<CXX_COMPILER_ID>

Идентификатор компилятора C++, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<CUDA_COMPILER_ID>

Идентификатор компилятора CUDA, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<OBJC_COMPILER_ID>

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

Идентификатор компилятора OBJC, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<OBJCXX_COMPILER_ID>

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

Идентификатор компилятора OBJC++, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<Fortran_COMPILER_ID>

Идентификатор компилятора Fortran, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<HIP_COMPILER_ID>

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

Идентификатор компилятора HIP, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<ISPC_COMPILER_ID>

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

Идентификатор компилятора ISPC, используемого CMake. Также см. переменную CMAKE_<LANG>_COMPILER_ID.

$<C_COMPILER_VERSION>

Версия используемого компилятора C. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CXX_COMPILER_VERSION>

Версия используемого компилятора C++. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<CUDA_COMPILER_VERSION>

Версия используемого компилятора CUDA. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJC_COMPILER_VERSION>

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

Версия используемого компилятора OBJC. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<OBJCXX_COMPILER_VERSION>

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

Версия используемого компилятора OBJC++. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<Fortran_COMPILER_VERSION>

Версия используемого компилятора Fortran. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<HIP_COMPILER_VERSION>

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

Версия используемого компилятора HIP. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<ISPC_COMPILER_VERSION>

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

Версия используемого компилятора ISPC. Также см. переменную CMAKE_<LANG>_COMPILER_VERSION.

$<COMPILE_LANGUAGE>

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

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

$<LINK_LANGUAGE>

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

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

Примечание

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

Запросы, зависящие от целевого объекта

Эти запросы относятся к целевому tgt. Это может быть любой исполняемый артефакт, а именно:

  • исполняемый целевой объект, созданный с помощью add_executable()
  • целевой объект динамической библиотеки (.so, .dll но не их .lib библиотека импорта) созданный с помощью add_library()
  • целевой объект статической библиотеки, созданный с помощью add_library()

В дальнейшем, «имя файла целевого объекта» означает имя двоичного файла целевого объекта. Это необходимо отличать от «имени целевого объекта», которое просто представляет собой строку tgt.

$<TARGET_NAME_IF_EXISTS:tgt>

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

Имя целевого объекта tgt если целевой объект существует, в противном случае пустая строка.

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

$<TARGET_FILE:tgt>

Полный путь к двоичному файлу целевого объекта.

$<TARGET_FILE_BASE_NAME:tgt>

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

Базовое имя целевого объекта tgt, т.е. $<TARGET_FILE_NAME: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.

Префикс имени файла целевого объекта (например, lib).

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

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

$<TARGET_FILE_SUFFIX:tgt>

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

Суффикс имени файла целевого объекта (расширение, например, .so или .exe).

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

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

$<TARGET_FILE_NAME:tgt>

Имя файла целевого объекта.

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

$<TARGET_FILE_DIR:tgt>

Директория двоичного файла целевого объекта.

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

$<TARGET_LINKER_FILE:tgt>

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

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

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

Полный путь к директории пакета (my.app, my.framework, или my.bundle), где tgt — имя целевого объекта.

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

$<TARGET_BUNDLE_CONTENT_DIR:tgt>

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

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

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

$<TARGET_PROPERTY:tgt,prop>

Значение свойства prop для целевого объекта tgt.

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

$<TARGET_PROPERTY:prop>

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

$<TARGET_RUNTIME_DLLS:tgt>

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

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

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

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 $<TARGET_RUNTIME_DLLS:exe> $<TARGET_FILE_DIR:exe>
  COMMAND_EXPAND_LISTS
  )

Примечание

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

$<INSTALL_PREFIX>

Содержимое префикса установки, когда целевой объект экспортируется через install(EXPORT), или когда вычисляется в свойстве INSTALL_NAME_DIR или аргументе INSTALL_NAME_DIR команды install(RUNTIME_DEPENDENCY_SET), в противном случае пустое.

Выходные выражения

$<TARGET_NAME:...>

Помечает ... как имя целевого объекта. Это необходимо при экспорте целевых объектов в несколько зависимых наборов экспорта. ... должно быть буквальным именем целевого объекта — оно не может содержать генераторские выражения.

$<LINK_ONLY:...>

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

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

$<INSTALL_INTERFACE:...>

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

$<BUILD_INTERFACE:...>

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

$<MAKE_C_IDENTIFIER:...>

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

$<TARGET_OBJECTS:objLib>

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

Список объектов, полученных в результате сборки objLib.

$<SHELL_PATH:...>

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

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

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

$<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, генераторные выражения в ... вычисляются с использованием "настроек команды" пользовательской команды. С другими генераторами содержимое ... вычисляется обычным способом.

Отладка

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

Один из возможных способов вывести отладочные сообщения – добавить пользовательскую цель:

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

Командный файл make genexdebug (выполняемый после выполнения cmake) затем выведет результат $<...>.

Другой способ – записать отладочные сообщения в файл:

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

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

Spec-Zone.ru

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