Каковы преимущества использования выражения генератора в CMake? - PullRequest
0 голосов
/ 08 февраля 2020

Недавно я узнал, как использовать выражение генератора в CMake для условных ссылок и условных определений.

Однако, на мой взгляд, я также могу использовать синтаксис управления потоком в CMake, чтобы сделать то же самое предмет. Я не знаю, каковы преимущества выражения генератора в CMake. Например, я могу использовать следующий синтаксис выражения генератора:

$<STREQUAL:string1,string2> 
$<EQUAL:number1,number2> 
$<VERSION_EQUAL:version1,version2> 
$<VERSION_GREATER:version1,version2> 
$<VERSION_LESS:version1,version2>

Но я также могу использовать if() elseif() endif() для достижения той же цели. Большое вам спасибо.

1 Ответ

2 голосов
/ 08 февраля 2020

Используя выражения генератора можно настроить проект по-разному для разных типов сборки в мультиконфигурации генераторы . Для таких генераторов проект настроен (с запуском cmake) один раз , но может быть build для нескольких типов сборки после этого , Примером таких генераторов является Visual Studio.

Для многоконфигурационных генераторов CMAKE_BUILD_TYPE неизвестно на этапе настройки. Из-за этого использование if - else переключение не работает:

# Doesn't work for multi-configuration generators:
#   CMAKE_BUILD_TYPE is not defined
#
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    add_compile_definitions("-DDEBUG_LEVEL=2")
elif(CMAKE_BUILD_TYPE STREQUAL "Release")
    add_compile_definitions("-DDEBUG_LEVEL=0")
endif()

Но использование выражений условного генератора работает:

add_compile_definitions(
    $<$<CONFIG:Debug>:-DDEBUG_LEVEL=2>
    $<$<CONFIG:Release>:-DDEBUG_LEVEL=0>
    )

CMake не расширяет выражение генератора немедленно , когда они объявлены в CMakeLists.txt. Вместо этого они остаются упакованными , пока все CMakeLists.txt не будут обработаны. В то время CMake знает все цели, созданные проектом, и свойства для этих целей, которые могут содержать выражения генератора.

Только при создании специфичных для генератора файлов сборки c (например, .sln файл для Visual Studio ), CMake расширяет выражения генератора в свойствах целей: при создании экземпляра для сборки "Debug" свойства целей оцениваются с $<CONFIG>, равным "Debug", при создании экземпляра для сборки "Release" цели оцениваются с $<CONFIG>, равным " Release »и т. Д.

Поскольку выражения генератора вычисляются только в конце процесса конфигурации, их нельзя распечатать командой message() (Точнее, можно вызвать message() для строки, содержащей выражение генератора, но эта строка будет напечатана без расширений).

Обычно выражения генератора можно использовать только в тех командах CMake и целевых свойствах, , которые явно документируют это использование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...