在CMake的构建预设中,如何为Ninja Multi-Config生成器选择配置?
我正在使用CMake 3.22.1和 Ninja 1.10.1。
除非我强制使用 --config 进行配置,它总是构建 Debug,仿佛按如下规则:
如果变量 [CMAKE_DEFAULT_BUILD_TYPE] 未指定,则使用CMAKE_CONFIGURATION_TYPES的第一项。
但我确实设置了 CMAKE_DEFAULT_BUILD_TYPE!
这是我的CMakePresets.json:
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 22
},
"configurePresets": [{
"name": "default",
"binaryDir": "build",
"environment": { "CMAKE_CONFIGURATION_TYPES": "Debug;RelWithDebug" },
"generator": "Ninja Multi-Config"
}]
}
这是我的CMakeUserPresets.json:
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 22
},
"buildPresets": [{
"name": "default",
"configurePreset": "default",
"environment": { "CMAKE_CONFIGURATION_TYPES": "RelWithDebug", "CMAKE_BUILD_TYPE": "RelWithDebug", "CMAKE_DEFAULT_BUILD_TYPE": "RelWithDebug" }
},{
"name": "debug",
"environment": { "CMAKE_CONFIGURATION_TYPES": "Debug", "CMAKE_BUILD_TYPE": "Debug", "CMAKE_DEFAULT_BUILD_TYPE": "Debug" },
"inherits": "default"
}]
}
请注意,我添加的变量其实比需要的还多。—— 实际上我已经尝试了三者的所有排列组合,但都无济于事。根据手册,只有CMAKE_DEFAULT_BUILD_TYPE应该是需要的!(https://cmake.org/cmake/help/v3.22/variable/CMAKE_DEFAULT_BUILD_TYPE.html#variable:CMAKE_DEFAULT_BUILD_TYPE)
我需要做哪些修改,才能让
cmake --build --preset=default 实际构建 RelWithDebug,
并且只让
cmake --build --preset=debug 构建 Debug
?
另外,顺便提一句,当CLion 2025.2 RC解析这些预设时,总是会在调用中显式添加 --config=Debug,但我认为这是CLion的一个bug——它本来根本就不应该添加该参数,在它根据前缀创建的(只读)设置中,它声称自己不会这样做。
解决方案
CMAKE_DEFAULT_BUILD_TYPE 是三者中实际影响Ninja Multi-Config的唯一变量,但它并不被视为一个 环境变量。
必须把 configuration key 包含在 buildPresets 中:
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 22
},
"buildPresets": [{
"name": "default",
"configuration": "RelWithDebug",
"configurePreset": "default"
},{
"name": "debug",
"configuration": "Debug",
"inherits": "default"
}]
}
然后在命令行和CLion中都能工作。
(后者仍然显式设置 --config,但它会发现正确的值,所以这是多余但无害的。)