cmake-generator-expressions(7)
Введение
Выражения генератора оцениваются во время генерации системы сборки, чтобы получить информацию, специфичную для каждой конфигурации сборки.
Выражения генератора разрешены в контексте многих свойств целевых объектов, таких как LINK_LIBRARIES, INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS и другие. Они также могут использоваться при использовании команд для заполнения этих свойств, таких как target_link_libraries(), target_include_directories(), target_compile_definitions() и другие.
Это означает, что они позволяют условную компоновку, условные определения, используемые при компиляции, условные каталоги включения и многое другое. Условия могут быть основаны на конфигурации сборки, свойствах целевых объектов, информации о платформе или любой другой запрашиваемой информации.
Логические выражения
Логические выражения используются для создания условного вывода. Основные выражения — это 0 и 1 выражения. Поскольку другие логические выражения оцениваются либо в 0 или 1, они могут быть объединены для создания условного вывода:
$<$<CONFIG:Debug>:DEBUG_MODE>
расширяется до DEBUG_MODE при использовании конфигурации Debug, а в противном случае расширяется до ничего.
Доступные логические выражения:
-
$<BOOL:...> -
1если...истинно, иначе0 -
$<AND:?[,?]...> -
1если все?являются1, иначе0?должно всегда быть либо0или1в булевых выражениях. -
$<OR:?[,?]...> -
0если все?являются0, иначе1 -
$<NOT:?> -
0если?равно1, иначе1 -
$<IF:?,true-value...,false-value...>` -
true-value...если?равно1,false-value...если?равно0 -
$<STREQUAL:a,b> -
1еслиaравноbв сравнении строк, иначе0 -
$<EQUAL:a,b> -
1еслиaравноbв числовом сравнении, иначе0 -
$<IN_LIST:a,b> -
1еслиaнаходится в спискеb, иначе0 -
$<TARGET_EXISTS:tgt> -
1еслиtgtявляется существующим именем целевого объекта, иначе0. -
$<CONFIG:cfg> -
1если конфигурацияcfg, иначе0. Это сравнение регистронезависимое. Сопоставление вMAP_IMPORTED_CONFIG_<CONFIG>также учитывается этим выражением при оценке свойства на целевом объектеIMPORTED. -
$<PLATFORM_ID:comp> -
1если идентификатор платформы CMake соответствуетcomp, в противном случае0. -
$<C_COMPILER_ID:comp> -
1если идентификатор компилятора C соответствуетcomp, в противном случае0. -
$<CXX_COMPILER_ID:comp> -
1если идентификатор компилятора C++ соответствуетcomp, в противном случае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. -
$<C_COMPILER_VERSION:ver> -
1если версия компилятора C соответствуетver, в противном случае0. -
$<CXX_COMPILER_VERSION:ver> -
1если версия компилятора C++ соответствуетver, в противном случае0. -
$<TARGET_POLICY:pol> -
1если политикаpolбыла новой при создании целевого объекта «head», иначе0. Если политика не была установлена, будет выведено сообщение об ошибке для политики. Это выражение генератора работает только для подмножества политик. -
$<COMPILE_FEATURES:feature[,feature]...> -
1если всеfeatureфункции доступны для целевого объекта «head», и0в противном случае. Если это выражение используется при оценке реализации связи целевого объекта, и если какая-либо зависимость транзитивно увеличивает требуемыйC_STANDARDилиCXX_STANDARDдля целевого объекта «head», выводится сообщение об ошибке. См. руководствоcmake-compile-features(7)для получения информации о функциях компиляции и списка поддерживаемых компиляторов. -
$<COMPILE_LANGUAGE:lang> -
1когда язык, используемый для компиляции модуля, соответствуетlang, иначе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 и
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)
Информационные выражения
Эти выражения расширяются до какой-либо информации. Информация может быть использована непосредственно, например:
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.
Доступные информационные выражения:
-
$<CONFIGURATION> - Имя конфигурации. Устарело. Используйте
CONFIGвместо этого. -
$<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. -
$<C_COMPILER_VERSION> - Версия используемого компилятора C. См. также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<CXX_COMPILER_VERSION> - Версия используемого компилятора C++. См. также переменную
CMAKE_<LANG>_COMPILER_VERSION. -
$<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— имя целевого объекта. Для 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для целевого объекта, для которого оценивается выражение генератора. -
$<INSTALL_PREFIX> - Содержание префикса установки, когда целевой объект экспортируется с помощью
install(EXPORT), и пустое значение в противном случае. -
$<COMPILE_LANGUAGE> - Язык компиляции исходных файлов при оценке параметров компиляции. См. унарную версию для примечаний о переносимости этого выражения генератора.
Выражения вывода
Эти выражения генерируют вывод, в некоторых случаях зависящий от входных данных. Эти выражения можно комбинировать с другими выражениями для получения информации или логического сравнения:
-I$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I>
генерирует строку записей в свойстве целевого объекта INCLUDE_DIRECTORIES, где каждая запись предваряется -I. Обратите внимание, что более полное использование в этой ситуации потребовало бы предварительной проверки, не является ли свойство INCLUDE_DIRECTORIES пустым:
$<$<BOOL:${prop}>:-I$<JOIN:${prop}, -I>>
где ${prop} относится к вспомогательной переменной:
set(prop "$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>")
Доступные выражения вывода:
-
$<0:...> - Пустая строка (игнорирует
...) -
$<1:...> - Содержимое
... -
$<JOIN:list,...> - Объединяет список с содержимым
... -
$<ANGLE-R> - Буквальная
>. Используется для сравнения строк, которые содержат, например,>. -
$<COMMA> - Буквальная
,. Используется для сравнения строк, которые содержат, например,,. -
$<SEMICOLON> - Буквальная
;. Используется для предотвращения расширения списка аргумента с;. -
$<TARGET_NAME:...> - Помечает
...как имя целевого объекта. Это необходимо, если целевые объекты экспортируются в несколько зависимых наборов экспорта....должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора. -
$<TARGET_NAME_IF_EXISTS:...> - Расширяется до
..., если целевой объект существует, и до пустой строки в противном случае. -
$<LINK_ONLY:...> - Содержимое
..., за исключением случаев, когда оно оценивается в интерфейсе компоновки при распространении Требований к использованию зависимых объектов, в этом случае это пустая строка. Предназначено только для использования в свойстве целевого объектаINTERFACE_LINK_LIBRARIES, возможно, с помощью командыtarget_link_libraries(), для указания частных зависимостей компоновки без других требований к использованию. -
$<INSTALL_INTERFACE:...> - Содержимое
...при экспорте свойства с помощьюinstall(EXPORT), и пустое значение в противном случае. -
$<BUILD_INTERFACE:...> - Содержимое
...при экспорте свойства с помощьюexport()или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае расширяется до пустой строки. -
$<LOWER_CASE:...> - Содержимое
...в нижнем регистре. -
$<UPPER_CASE:...> - Содержимое
...в верхнем регистре. -
$<MAKE_C_IDENTIFIER:...> - Содержимое
...преобразованное в идентификатор C. Преобразование происходит по тому же принципу, что и вstring(MAKE_C_IDENTIFIER). -
$<TARGET_OBJECTS:objLib> - Список объектов, полученных в результате сборки
objLib.objLibдолжен быть объектом типаOBJECT_LIBRARY. -
$<SHELL_PATH:...> - Содержимое
...преобразованное в стиль пути оболочки. Например, косые черты преобразуются в обратные косые черты в оболочках Windows, а имена дисков преобразуются в пути POSIX в оболочках MSYS....должен быть абсолютным путем. -
$<GENEX_EVAL:...> - Содержимое
...вычисленное как выражение генератора в текущем контексте. Это позволяет использовать выражения генератора, результаты вычисления которых сами по себе являются выражениями генератора. -
$<TARGET_GENEX_EVAL:tgt,...> -
Содержимое
...вычисленное как выражение генератора в контексте целевого объекта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>> )
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.12/manual/cmake-generator-expressions.7.html