Spec-Zone.ru › CMake 3.22

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 , если все условия 1. В противном случае возвращает 0.

$<OR:conditions>

где conditions представляет собой список булевых выражений, разделенных запятыми. Возвращает 1 , если выполняется хотя бы одно из условий 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. При оценке свойства целевого объекта IMPORTED также учитывается отображение в MAP_IMPORTED_CONFIG_<CONFIG>. Сравнение регистронезависимое.

$<PLATFORM_ID:platform_ids>

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

$<C_COMPILER_ID:compiler_ids>

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

$<CXX_COMPILER_ID:compiler_ids>

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

$<CUDA_COMPILER_ID:compiler_ids>

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

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

$<OBJC_COMPILER_ID:compiler_ids>

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

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

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

где 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>

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

Возвращает значение «истина» если язык, используемый для шага линковки, совпадает с 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.

Возвращает значение «истина», если язык, используемый для шага линковки, совпадает с любым из записей в 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>

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

$<CXX_COMPILER_ID>

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

$<CUDA_COMPILER_ID>

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

$<OBJC_COMPILER_ID>

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

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

$<OBJCXX_COMPILER_ID>

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

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

$<Fortran_COMPILER_ID>

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

$<HIP_COMPILER_ID>

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

$<ISPC_COMPILER_ID>

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

Идентификатор компилятора CMake для используемого компилятора ISPC. Смотрите также переменную 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>

Версия используемого компилятора 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" означает имя файла tgt исполняемого файла. Это необходимо отличать от "имени целевого объекта", которое просто строка tgt.

$<TARGET_NAME_IF_EXISTS:tgt>

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

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

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

$<TARGET_FILE:tgt>

Полный путь к файлу tgt исполняемого файла.

$<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_LINKER_FILE:tgt>

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

$<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 и MODULE в транзитивных зависимостях целевого объекта. Использование этого выражения генератора для целевых объектов, отличных от исполняемых файлов, 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 или MODULE библиотека должна иметь свойство 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–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.22/manual/cmake-generator-expressions.7.html

Spec-Zone.ru

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