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если идентификатор CMake компилятора C соответствуетcomp, в противном случае0. -
$<CXX_COMPILER_ID:comp> -
1если идентификатор CMake компилятора C++ соответствуетcomp, в противном случае0. -
$<VERSION_GREATER:v1,v2> -
1еслиv1больше версииv2, иначе0. -
$<VERSION_LESS:v1,v2> -
1еслиv1меньше версииv2, иначе0. -
$<VERSION_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.6/manual/cmake-generator-expressions.7.html