CMake 从入门到精通:完整教程 / 第 12 章:CMake 预设
第 12 章:CMake 预设
12.1 概述
CMake Presets(CMake 3.19+)通过 JSON 文件定义配置、构建和测试预设,实现团队标准化的构建配置。
CMakePresets.json ← 版本控制(团队共享)
CMakeUserPresets.json ← 个人配置(gitignore)
12.2 文件结构
{
"version": 6,
"cmakeMinimumRequired": {
"major": 3,
"minor": 21,
"patch": 0
},
"configurePresets": [],
"buildPresets": [],
"testPresets": [],
"packagePresets": [],
"workflowPresets": []
}
版本对照表
| Preset 版本 | CMake 版本 | 新增特性 |
|---|
| 1 | 3.19 | 基础 configurePresets |
| 2 | 3.20 | buildPresets, testPresets |
| 3 | 3.21 | 包含其他预设文件 |
| 4 | 3.23 | packagePresets, workflowPresets |
| 5 | 3.24 | 环境变量 INCLUDE |
| 6 | 3.25 | 更多缓存变量类型 |
12.3.1 基础预设
{
"version": 6,
"configurePresets": [
{
"name": "default",
"displayName": "默认配置",
"description": "默认 Debug 构建",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
}
]
}
12.3.2 多配置预设
{
"version": 6,
"configurePresets": [
{
"name": "base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
"name": "debug",
"displayName": "Debug",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"ENABLE_SANITIZERS": "ON"
}
},
{
"name": "release",
"displayName": "Release",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"ENABLE_LTO": "ON"
}
},
{
"name": "relwithdebinfo",
"displayName": "Release with Debug Info",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
}
}
]
}
12.3.3 条件预设
{
"version": 6,
"configurePresets": [
{
"name": "linux-gcc",
"displayName": "Linux GCC",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
},
"generator": "Ninja",
"cacheVariables": {
"CMAKE_C_COMPILER": "gcc",
"CMAKE_CXX_COMPILER": "g++"
}
},
{
"name": "macos-clang",
"displayName": "macOS Clang",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
},
"generator": "Ninja",
"cacheVariables": {
"CMAKE_C_COMPILER": "clang",
"CMAKE_CXX_COMPILER": "clang++"
}
},
{
"name": "windows-msvc",
"displayName": "Windows MSVC",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
},
"generator": "Visual Studio 17 2022",
"architecture": {
"value": "x64"
}
}
]
}
12.3.4 工具链预设
{
"version": 6,
"configurePresets": [
{
"name": "arm-cross",
"displayName": "ARM Cross Compile",
"toolchainFile": "${sourceDir}/cmake/arm-toolchain.cmake",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build-arm",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "vcpkg",
"displayName": "vcpkg Toolchain",
"toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build-vcpkg"
}
]
}
12.3.5 配置预设属性
| 属性 | 类型 | 说明 |
|---|
name | string | 预设名称(必选) |
hidden | bool | 是否隐藏 |
inherits | string/array | 继承的预设 |
condition | object | 执行条件 |
displayName | string | 显示名称 |
description | string | 描述 |
generator | string | 生成器 |
architecture | object | 架构 |
toolset | object | 工具集 |
binaryDir | string | 构建目录 |
cmakeExecutable | string | CMake 可执行文件路径 |
cacheVariables | object | 缓存变量 |
environment | object | 环境变量 |
toolchainFile | string | 工具链文件 |
installDir | string | 安装目录 |
12.4 构建预设(Build Presets)
12.4.1 基础构建预设
{
"version": 6,
"buildPresets": [
{
"name": "default",
"configurePreset": "debug"
},
{
"name": "release",
"configurePreset": "release"
},
{
"name": "release-parallel",
"configurePreset": "release",
"jobs": 8,
"verbose": false
}
]
}
12.4.2 构建预设属性
| 属性 | 类型 | 说明 |
|---|
name | string | 预设名称 |
inherits | string/array | 继承的预设 |
configurePreset | string | 关联的配置预设 |
inheritConfigureEnvironment | bool | 继承配置环境 |
jobs | int | 并行任务数 |
targets | string/array | 构建目标 |
configuration | string | 构建配置 |
cleanFirst | bool | 先清理 |
verbose | bool | 详细输出 |
nativeToolOptions | array | 原生工具选项 |
12.4.3 目标特定预设
{
"version": 6,
"buildPresets": [
{
"name": "libs-only",
"configurePreset": "debug",
"targets": ["mylib", "mylib2"]
},
{
"name": "docs",
"configurePreset": "debug",
"targets": "docs"
},
{
"name": "tests-only",
"configurePreset": "debug",
"targets": "all"
}
]
}
12.5 测试预设(Test Presets)
12.5.1 基础测试预设
{
"version": 6,
"testPresets": [
{
"name": "default",
"configurePreset": "debug",
"output": {
"outputOnFailure": true,
"verbosity": "verbose"
}
},
{
"name": "quick",
"configurePreset": "debug",
"filter": {
"include": {
"label": "fast"
},
"exclude": {
"label": "slow"
}
}
},
{
"name": "ci",
"configurePreset": "release",
"output": {
"outputOnFailure": true,
"outputJUnitFile": "${sourceDir}/test-results.xml"
}
}
]
}
12.5.2 测试预设属性
| 属性 | 类型 | 说明 |
|---|
name | string | 预设名称 |
configurePreset | string | 关联的配置预设 |
filter | object | 测试过滤器 |
output | object | 输出选项 |
execution | object | 执行选项 |
12.6 包预设(Package Presets)
{
"version": 6,
"packagePresets": [
{
"name": "default",
"configurePreset": "release",
"generators": ["TGZ", "DEB"],
"variables": {
"CPACK_PACKAGE_CONTACT": "dev@example.com"
}
}
]
}
12.7 工作流预设(Workflow Presets)
{
"version": 6,
"workflowPresets": [
{
"name": "full",
"steps": [
{ "type": "configure", "name": "release" },
{ "type": "build", "name": "release" },
{ "type": "test", "name": "ci" }
]
}
]
}
12.8 变量展开
12.8.1 支持的变量
| 变量 | 说明 |
|---|
${sourceDir} | 源码目录 |
${sourceParentDir} | 父目录 |
${sourceDirName} | 源码目录名 |
${presetName} | 当前预设名 |
${generator} | 生成器名称 |
${hostSystemName} | 主机系统名 |
${env:VAR} | 环境变量 |
$penv{VAR} | 路径环境变量 |
12.8.2 环境变量
{
"version": 6,
"configurePresets": [
{
"name": "custom-env",
"generator": "Ninja",
"environment": {
"CC": "gcc-13",
"CXX": "g++-13",
"MY_CUSTOM_PATH": "/opt/custom",
"PATH": "$penv{PATH}:/opt/tools/bin"
},
"cacheVariables": {
"CMAKE_PREFIX_PATH": "$env{MY_CUSTOM_PATH}"
}
}
]
}
12.9 条件系统
12.9.1 条件类型
{
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
}
| 类型 | 说明 |
|---|
const | 常量布尔值 |
equals | 字符串相等 |
notEquals | 字符串不等 |
inList | 在列表中 |
notInList | 不在列表中 |
matches | 正则匹配 |
notMatches | 正则不匹配 |
anyOf | 任一条件为真 |
allOf | 所有条件为真 |
not | 取反 |
12.9.2 复合条件
{
"name": "linux-debug",
"condition": {
"type": "allOf",
"conditions": [
{
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
},
{
"type": "equals",
"lhs": "$env{CI}",
"rhs": "true"
}
]
}
}
12.10 使用命令
# 列出所有预设
cmake --list-presets
cmake --list-presets=all # 包括隐藏的
cmake --list-build-presets
cmake --list-test-presets
# 使用配置预设
cmake --preset debug
# 使用构建预设
cmake --build --preset release
# 使用测试预设
cmake --test --preset quick
# 覆盖预设参数
cmake --preset debug -DENABLE_TESTS=ON
12.11 CMakeUserPresets.json
{
"version": 6,
"configurePresets": [
{
"name": "local-dev",
"inherits": "debug",
"binaryDir": "${sourceDir}/build-local",
"cacheVariables": {
"ENABLE_CCACHE": "ON"
},
"environment": {
"CCACHE_DIR": "/home/user/.ccache"
}
}
]
}
CMakeUserPresets.json 应加入 .gitignore。
12.12 业务场景
场景:完整的 CI 预设配置
{
"version": 6,
"configurePresets": [
{
"name": "ci-base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"BUILD_TESTING": "ON"
}
},
{
"name": "ci-linux",
"inherits": "ci-base",
"condition": { "type": "equals", "lhs": "${hostSystemName}", "rhs": "Linux" },
"cacheVariables": { "CMAKE_BUILD_TYPE": "Release" }
},
{
"name": "ci-windows",
"inherits": "ci-base",
"condition": { "type": "equals", "lhs": "${hostSystemName}", "rhs": "Windows" },
"generator": "Visual Studio 17 2022"
}
],
"buildPresets": [
{ "name": "ci-build", "configurePreset": "ci-linux", "jobs": 4 }
],
"testPresets": [
{
"name": "ci-test",
"configurePreset": "ci-linux",
"output": { "outputOnFailure": true }
}
],
"workflowPresets": [
{
"name": "ci",
"steps": [
{ "type": "configure", "name": "ci-linux" },
{ "type": "build", "name": "ci-build" },
{ "type": "test", "name": "ci-test" }
]
}
]
}
12.13 注意事项
| 问题 | 说明 |
|---|
| 版本兼容性 | 确保 CMake 版本支持 preset 版本 |
| CMakeUserPresets.json | 加入 .gitignore |
| 变量展开 | $env{} 在配置时展开 |
| generator 必须匹配 | build preset 必须与 configure preset 生成器一致 |
| hidden 预设 | 不能直接使用,只能被继承 |
12.14 扩展阅读
上一章:第 11 章 — 安装与打包 | 下一章:第 13 章 — 高级特性 →