Используя выражения генератора можно настроить проект по-разному для разных типов сборки в мультиконфигурации генераторы . Для таких генераторов проект настроен (с запуском 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 и целевых свойствах, , которые явно документируют это использование.