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в соответствии с правилами командыif(). Вычисляется как0, если выполняется хотя бы одно из следующих условий:-
stringпустая, -
stringявляется регистронезависимым равенством0,FALSE,OFF,N,NO,IGNORE, илиNOTFOUND, или -
stringзаканчивается на суффиксе-NOTFOUND(чувствительность к регистру).
В противном случае вычисляется как
1. -
-
$<AND:conditions> -
где
conditions— это список логических выражений, разделённых запятыми. Вычисляется как1, если все условия истинны. В противном случае вычисляется как0. -
$<OR:conditions> -
где
conditions— это список логических выражений, разделённых запятыми. Вычисляется как1, если хотя бы одно из условий истинно. В противном случае вычисляется как0. -
$<NOT:condition> -
0, еслиconditionравно1, иначе1.
Сравнения строк
-
$<STREQUAL:string1,string2> -
1, еслиstring1иstring2равны, иначе0. Сравнение чувствительно к регистру. Для регистронезависимого сравнения объедините с выражением генератора преобразования строк,$<STREQUAL:$<UPPER_CASE:${foo}>,"BAR"> # "1" if ${foo} is any of "BAR", "Bar", "bar", ... -
$<EQUAL:value1,value2> -
1, еслиvalue1иvalue2численно равны, иначе0. -
$<IN_LIST:string,list> -
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_id> -
1если идентификатор CMake платформы совпадает сplatform_id, иначе0. См. также переменнуюCMAKE_SYSTEM_NAME. -
$<C_COMPILER_ID:compiler_id> -
1если идентификатор CMake компилятора C совпадает сcompiler_id, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<CXX_COMPILER_ID:compiler_id> -
1если идентификатор CMake компилятора C++ совпадает сcompiler_id, иначе0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<Fortran_COMPILER_ID:compiler_id> -
1если идентификатор CMake компилятора Fortran совпадает сcompiler_id, иначе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. -
$<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_LANGUAGE:language> -
1когда язык, используемый для компиляции блока, совпадает сlanguage, иначе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>:/opt/foo/cxx_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-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.$<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> -
Идентификатор компилятора C, используемого CMake. Смотрите также переменную
CMAKE_<LANG>_COMPILER_ID. -
$<CXX_COMPILER_ID> -
Идентификатор компилятора C++, используемого CMake. Смотрите также переменную
CMAKE_<LANG>_COMPILER_ID. -
$<Fortran_COMPILER_ID> -
Идентификатор компилятора Fortran, используемого CMake. Смотрите также переменную
CMAKE_<LANG>_COMPILER_ID. -
$<C_COMPILER_VERSION> -
Версия используемого компилятора C. Смотрите также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<CXX_COMPILER_VERSION> -
Версия используемого компилятора C++. Смотрите также переменную
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_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_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_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— имя цели. Для SDK macOS он указывает на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для цели, для которой вычисляется генераторное выражение. Обратите внимание, что для генераторных выражений в Требования к использованию зависимых целей это значение свойства для потребляющей цели, а не для цели, указывающей требование. -
$<INSTALL_PREFIX> -
Содержимое префикса установки, когда цель экспортируется с помощью
install(EXPORT), и пустая строка в противном случае.
Выражения, связанные с выводом
-
$<TARGET_NAME:...> -
Помечает
...как имя цели. Это необходимо, если цели экспортируются в несколько зависимых наборов экспорта....должно быть буквальным именем цели — оно не может содержать генераторные выражения. -
$<LINK_ONLY:...> -
Содержимое
..., за исключением случаев, когда оно вычисляется в интерфейсе компоновки при распространении Требований к использованию зависимых целей, в этом случае это пустая строка. Предназначено только для использования в свойстве цели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.objLibдолжен быть объектом типаOBJECT_LIBRARY. -
$<SHELL_PATH:...> -
Содержимое
..., преобразованное в стиле пути оболочки. Например, косые черты преобразуются в обратные слеши в оболочках Windows, а буквы дисков преобразуются в пути POSIX в оболочках MSYS....должен быть абсолютным путем.
Отладка
Поскольку генераторные выражения вычисляются во время генерации системы сборки, а не во время обработки файлов 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.14/manual/cmake-generator-expressions.7.html