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еслиaSTREQUALb, иначе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. См. также переменнуюCMAKE_SYSTEM_NAME. -
$<C_COMPILER_ID:comp> -
1если идентификатор компилятора C CMake соответствуетcomp, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<CXX_COMPILER_ID:comp> -
1если идентификатор компилятора C++ CMake соответствуетcomp, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_ID. -
$<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. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION. -
$<CXX_COMPILER_VERSION:ver> -
1если версия компилятора C++ соответствуетver, в противном случае0. См. также переменнуюCMAKE_<LANG>_COMPILER_VERSION. -
$<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> - Файл с именем сонаме (.so.3), где
tgt— имя целевого объекта. -
$<TARGET_SONAME_FILE_NAME:tgt> - Имя файла с именем сонаме (.so.3).
-
$<TARGET_SONAME_FILE_DIR:tgt> - Директория файла с именем сонаме (.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), и пустая строка в противном случае. -
$<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.13/manual/cmake-generator-expressions.7.html