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 -
$<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_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была NEW при создании цели ‘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:...> - Помечает
...как имя целевого объекта. Это необходимо при экспорте целевых объектов в несколько зависимых наборов экспорта....должно быть буквальным именем целевого объекта — оно не может содержать выражения генератора. -
$<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. -
$<SHELL_PATH:...> - Содержимое
...преобразованное в стиле пути оболочки. Например, косые черты преобразуются в обратные косые черты в оболочках Windows, а имена дисков преобразуются в пути POSIX в оболочках MSYS....должно быть абсолютным путем.
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.11/manual/cmake-generator-expressions.7.html