Spec-Zone.ru › CMake 3.21

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.

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

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

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

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.

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

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

Версия используемого компилятора 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, связанная с 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 и MODULE в транзитивных зависимостях целевого объекта. Использование этого выражения генератора для целевых объектов, отличных от исполняемых файлов, библиотек SHARED и библиотек MODULE — ошибка. На платформах, не использующих DLL, оно возвращает пустую строку.

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

find_package(foo REQUIRED)

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
  )
$<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.21/manual/cmake-generator-expressions.7.html

Spec-Zone.ru

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