Spec-Zone.ru › CMake 3.16

cmake-generator-expressions(7)

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

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

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

Введение

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

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

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

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

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>

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

$<VERSION_GREATER_EQUAL:v1,v2>

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

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

$<TARGET_EXISTS:target>

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

$<CONFIG:cfg>

1 если конфигурация cfg, иначе 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>

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

$<OBJC_COMPILER_ID:compiler_ids>

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

$<OBJCXX_COMPILER_ID:compiler_ids>

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

$<Fortran_COMPILER_ID:compiler_ids>

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

$<C_COMPILER_VERSION:version>

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

$<CXX_COMPILER_VERSION:version>

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

$<CUDA_COMPILER_VERSION:version>

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

$<OBJC_COMPILER_VERSION:version>

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

$<OBJCXX_COMPILER_VERSION:version>

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

$<Fortran_COMPILER_VERSION:version>

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

$<TARGET_POLICY:policy>

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

$<COMPILE_FEATURES:features>

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

$<COMPILE_LANG_AND_ID:language,compiler_ids>

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 является компилятором C++, и COMPILING_CXX_WITH_INTEL когда Intel является компилятором C++. Аналогично, когда компилятором 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>

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 Generators и Xcode нет возможности представлять определения компиляции или директории включения для всего целевого объекта отдельно для языков C и CXX. Кроме того, с Visual Studio Generators нет возможности представлять флаги для всего целевого объекта отдельно для языков 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)

Генераторные выражения со строковыми значениями

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

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>

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

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

$<$<CONFIG:Debug>:DEBUG_MODE>

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

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

$<JOIN:list,string>

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

$<REMOVE_DUPLICATES:list>

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

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

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

$<LOWER_CASE:string>

Содержимое string переведено в нижний регистр.

$<UPPER_CASE:string>

Содержимое string переведено в верхний регистр.

$<GENEX_EVAL:expr>

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

$<TARGET_GENEX_EVAL:tgt,expr>

Содержимое 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>

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

$<OBJCXX_COMPILER_ID>

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

$<Fortran_COMPILER_ID>

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

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

$<OBJCXX_COMPILER_VERSION>

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

$<Fortran_COMPILER_VERSION>

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

$<COMPILE_LANGUAGE>

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

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

$<TARGET_NAME_IF_EXISTS:tgt>

Развертывается в tgt, если заданная цель существует, в противном случае — в пустую строку.

$<TARGET_FILE:tgt>

Полный путь к главному файлу (.exe, .so.1.2, .a), где tgt — имя цели.

$<TARGET_FILE_BASE_NAME:tgt>

Базовое имя главного файла, где 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>

Префикс главного файла, где tgt — имя цели.

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

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

$<TARGET_FILE_SUFFIX:tgt>

Суффикс главного файла, где tgt — имя цели.

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

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

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

$<TARGET_FILE_NAME:tgt>

Имя главного файла (.exe, .so.1.2, .a).

$<TARGET_FILE_DIR:tgt>

Каталог главного файла (.exe, .so.1.2, .a).

$<TARGET_LINKER_FILE:tgt>

Файл, используемый для компоновки (.a, .lib, .so), где tgt — имя цели.

$<TARGET_LINKER_FILE_BASE_NAME:tgt>

Базовое имя файла, используемого для компоновки, где 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>

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

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

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

$<TARGET_LINKER_FILE_SUFFIX:tgt>

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

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

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

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

$<TARGET_LINKER_FILE_NAME:tgt>

Имя файла, используемого для компоновки (.a, .lib, .so).

$<TARGET_LINKER_FILE_DIR:tgt>

Каталог файла, используемого для компоновки (.a, .lib, .so).

$<TARGET_SONAME_FILE:tgt>

Файл с soname (.so.3), где tgt — имя цели.

$<TARGET_SONAME_FILE_NAME:tgt>

Имя файла с soname (.so.3).

$<TARGET_SONAME_FILE_DIR:tgt>

Каталог с soname (.so.3).

$<TARGET_PDB_FILE:tgt>

Полный путь к файлу базы данных программы, созданному компоновщиком (.pdb), где tgt — имя цели.

См. также свойства цели PDB_NAME и PDB_OUTPUT_DIRECTORY и их варианты, зависящие от конфигурации PDB_NAME_<CONFIG> и PDB_OUTPUT_DIRECTORY_<CONFIG>.

$<TARGET_PDB_FILE_BASE_NAME:tgt>

Базовое имя файла базы данных программы, созданного компоновщиком (.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>

Имя файла базы данных программы, созданного компоновщиком (.pdb).

$<TARGET_PDB_FILE_DIR:tgt>

Каталог файла базы данных программы, созданного компоновщиком (.pdb).

$<TARGET_BUNDLE_DIR:tgt>

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

$<TARGET_BUNDLE_CONTENT_DIR:tgt>

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

$<TARGET_PROPERTY:tgt,prop>

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

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

$<TARGET_PROPERTY:prop>

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

$<INSTALL_PREFIX>

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

Выражения, связанные с выводом

$<TARGET_NAME:...>

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

$<LINK_ONLY:...>

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

$<INSTALL_INTERFACE:...>

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

$<BUILD_INTERFACE:...>

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

$<MAKE_C_IDENTIFIER:...>

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

$<TARGET_OBJECTS:objLib>

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

$<SHELL_PATH:...>

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

Отладка

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

Один из возможных способов генерации сообщений отладки — добавить пользовательскую цель,

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

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

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

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

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

Spec-Zone.ru

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