0%

CMAKE_BUILD_TYPE and multi-config generator

首先,介绍一下CMAKE_BUILD_TYPE,在CMake的官网中有一段用来指出它是用于single-configuration generators的。

这里,区分一下single-configuration generatormulti-config generator
single-configuration generator在构建平台与环境的同时会生成构建类型,如Debug
Release,常见的在MacOSX上使用CLion时,默认情况下生成的是只有Debug构建环境的,而CLion默认使用的
是Ninja做为生成器,这里一个明显的特定是无法直接切换Debug与Release,如果要启用Release则需要
构建、执行、部署Cmake创建一个新的配置。multi-config generator则想Visual Studio一样,混合了多种
配置。

CMAKE_BUILD_TYPE只在single-configuration generator起作用,如下这一段
在MSVC下是错误的,CMAKE_BUILD_TYPE无法在MSVC中获取值。

1
2
3
4
5
6
# WARNING: This is wrong for multi-config generators because they don't use
# and typically don't even set CMAKE_BUILD_TYPE
string(TOLOWER ${CMAKE_BUILD_TYPE} build_type)
if (build_type STREQUAL debug)
target_compile_definitions(exe1 PRIVATE DEBUG_BUILD)
endif()

在multi-config generator中,只能在构建时选择构建类型,这里,
需要借助Generator expressions

1
2
3
4
# Works correctly for both single and multi-config generators
target_compile_definitions(exe1 PRIVATE
$<$<CONFIG:Debug>:DEBUG_BUILD>
)

总的来说,在multi-config generator中,因为需要在构建过程中选择构建类型,直接的提供
CMAKE_BUILD_TYPE是无效的,因为构建类型是时刻在改变,这里需要借助Generator expressions
来动态修改构建类型

链接