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 -
$<STREQUAL:a,b> -
1еслиaравноb, иначе0 -
$<EQUAL:a,b> -
1еслиaравноbв числовом сравнении, иначе0 -
$<CONFIG:cfg> -
1если конфигурацияcfg, иначе0. Это сравнение регистронезависимое. Карта вMAP_IMPORTED_CONFIG_<CONFIG>также учитывается этим выражением при оценке свойства на целевом объектеIMPORTED. -
$<PLATFORM_ID:comp> -
1если идентификатор платформы CMake совпадает сcomp, иначе0. -
$<C_COMPILER_ID:comp> -
1если идентификатор компилятора C CMake совпадает сcomp, иначе0. -
$<CXX_COMPILER_ID:comp> -
1если идентификатор компилятора C++ CMake совпадает с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. Это выражение используется для указания параметров компиляции для исходных файлов определённого языка в целевом объекте. Например, чтобы указать использование параметра компиляции-fno-exceptions(проверка идентификатора компилятора опущена):add_executable(myapp main.cpp foo.c bar.cpp) target_compile_options(myapp PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions> )
Это выражение генератора имеет ограниченное применение, поскольку его нельзя использовать с генераторами Visual Studio. Переносимые системы сборки не будут использовать это выражение и создадут отдельные библиотеки для каждого исходного файла каждого языка вместо этого:
add_library(myapp_c foo.c) add_library(myapp_cxx foo.c) target_compile_options(myapp_cxx PUBLIC -fno-exceptions) add_executable(myapp main.cpp) target_link_libraries(myapp myapp_c myapp_cxx)
Генераторы, основанные на
MakefileиNinja, также могут использовать это выражение для указания параметров компиляции и каталогов включаемых файлов, специфичных для языка компиляции:add_executable(myapp main.cpp foo.c bar.cpp) target_compile_definitions(myapp PRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX> ) target_include_directories(myapp PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/opt/foo/cxx_headers> )
Информационные выражения
Эти выражения расширяются до некоторой информации. Информация может быть использована напрямую, например:
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_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:...> - Помечает
...как имя целевого объекта. Это необходимо при экспорте целевых объектов в несколько зависимых наборов экспорта....должно быть буквенно-цифровым именем целевого объекта — оно не может содержать выражений генератора. -
$<LINK_ONLY:...> - Содержимое
...за исключением случаев, когда оно оценивается в интерфейсе связи, при распространении Требований к использованию целевых объектов, в этом случае это пустая строка. Предназначено для использования только в свойстве целевого объектаINTERFACE_LINK_LIBRARIES, возможно, с помощью командыtarget_link_libraries(), для указания частных зависимостей связи без других требований к использованию. -
$<INSTALL_INTERFACE:...> - Содержимое
...при экспорте свойства с помощьюinstall(EXPORT), и пустая строка в противном случае. -
$<BUILD_INTERFACE:...> - Содержимое
...при экспорте свойства с помощьюexport()или когда целевой объект используется другим целевым объектом в той же системе сборки. В противном случае расширяется до пустой строки. -
$<LOWER_CASE:...> - Содержимое
..., преобразованное в нижний регистр. -
$<UPPER_CASE:...> - Содержимое
..., преобразованное в верхний регистр. -
$<MAKE_C_IDENTIFIER:...> - Содержимое
..., преобразованное в идентификатор C. -
$<TARGET_OBJECTS:objLib> - Список объектов, полученных в результате сборки
objLib.objLibдолжен быть объектом типаOBJECT_LIBRARY. Это выражение может использоваться только в источниках командadd_library()иadd_executable(). -
$<SHELL_PATH:...> - Содержимое
..., преобразованное в стиль пути оболочки. Например, слеши преобразуются в обратные слеши в оболочках Windows, а буквы дисков преобразуются в пути POSIX в оболочках MSYS....должен быть абсолютным путем.
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.7/manual/cmake-generator-expressions.7.html