在已写好 CMake 的 C++11–C++23 工程上配置、构建和检查时使用:Ninja、compile_commands.json、clang-format、clang-tidy、clangd、environment.json 与 running-build.sh。不用于只改源码语义、文档、Python 或与 C++ 无关的文件。
Resources
5Install
npx skillscat add chengzhao-dev/dsh-cpp-workflow/building-cpp Install via the SkillsCat registry.
building-cpp
适用场景
本技能处理环境声明、构建入口与工具配置:environment.json、running-build.sh、.clang-format、.clang-tidy、.clangd、.vscode/、构建命令、编译数据库、CTest 和运行。CMakeLists.txt 与 cmake/ 下的 target、属性、标准和模块由 configuring-cmake 负责;本技能只读它们来配置和检查,不在这一步改 target 图。函数体、类型、命名、异常和源码注释只开 developing-cpp。
一次改动同时碰到源码和构建文件时,先打开 developing-cpp 定行为、边界与实现;需要新增或移动源文件、改库与程序的边界、补测试 target 时,转到 configuring-cmake 把文件写进 CMake;最后回到本技能做定工具配置与通过检查。只改函数体、命名、异常或注释且入口命令可运行时,定实现后只开本技能的「通过检查」。
存在项目技能 cpp-workflow-project 时先读它的 SKILL.md、environment.json 和 stages/stage-table.md。三个环境轴为空、standard 非法或组合非法时停在定构建,不猜 WSL、Clang 或构建目录;windows + native 直接拒绝,提示「本版本不能在 Windows 原生壳里构建」,不要给出补 PowerShell 的路线。
编译失败先分因:诊断指向函数体,回 developing-cpp 的定实现;诊断是找不到头、链接失败、target 不存在或标准不对,转 configuring-cmake 的对应步骤;诊断是没有编译数据库、format/tidy 不在 PATH 或配置不生效,留在本技能的定工具配置。
源码和构建文件用 UTF-8 无 BOM、检出 LF;.bat / .cmd 用 CRLF;.clang-format 写 LineEnding: LF。MSVC 原生构建优先加 /utf-8,不要靠 BOM 过关。完整规则见 references/encoding.md,检查脚本是 scripts/checking-encoding.mjs,机器规则以仓库根 .gitattributes 与 .editorconfig 为准。
三种操作
一次只选一种,范围(单点、整段)是任务属性。操作与域的判据、边界和交接见 ../developing-cpp/references/change-model.md;四类改动是域,不是操作。
| 操作 | 什么时候用 | 从哪步进 |
|---|---|---|
| 写作(起稿) | 改环境轴、入口脚本或构建流程 | 第 1 步;新工程走到第 3 步 |
| 改写 | 环境轴与 target 契约不变,工具配置位置或流程顺序不对 | 从第 2 步重走,可到第 3 步 |
| 润色 | 只改诊断措辞或失败分流说明 | 第 3 步 |
三种操作共用这些约束:不发明项目没有声明的环境轴、命令和 target;只改格式或配置时不改可观察行为;不覆盖已有源码、CMakeLists.txt 和 .clang-*;不安装工具链;代理侧不写 wsl 或 bash -lc。后一步发现前一步没做完,退回那一步。拿不准先用单点修正;发现环境轴、编译器、构建目录或 target 契约需要改,退回整段,并转 configuring-cmake。
步骤
| 步 | 名称 | 文件 | 一句话 |
|---|---|---|---|
| 1 | 定构建 | steps/01-build.md |
读环境声明,固定 Ninja 与单一编译器,产出编译数据库 |
| 2 | 定工具配置 | steps/02-tooling.md |
格式化、静态检查、clangd 各管一段,互不越界 |
| 3 | 通过检查 | steps/03-check.md |
按编码 → 声明校验 → 活动校验 → 项目入口的次序跑,前一步失败就停 |
每步只打开同号的一个步骤文件。判不准才打开 examples/ 里与该步对应的案例;references/ 保存完整条文,只在排错、整目录重构,或步骤里明确指向某一条文时按需打开。链接、rpath 与产物布局读 references/linking.md;测试设计、断言与 CTest 注册读 references/testing.md;CMake 的 target、标准和函数写法读 ../configuring-cmake/references/,可复用片段在 ../configuring-cmake/assets/cmake/。
入口脚本只做配置、构建、CTest 与最小运行;clang-format 与 clang-tidy 的手动检查留在定工具配置,不塞进入口脚本。environment.json 的三个环境轴与 standard 是唯一来源,缺项就停。
本轮激活按三条上限走:
- 只开当前步对应的一个步骤文件;同一改动域内不同时展开两个技能的步骤。跨域按
源码 → configuring-cmake → building-cpp的顺序逐段进入,前一段结论落下再开下一段。 - 条文只开该步点名的一份;同号案例留到下一次激活。
- 标准档只打开项目技能声明的那一档,没有声明时用本技能已有的新工程默认,不把其余标准档读进来。
项目技能列出了检查命令时只跑那一条,没有时跑本技能自己的 scripts/checking-environment.mjs 与 scripts/checking-encoding.mjs;退出码为 0 后在同一轮结束 goal,不再继续走没有失败的步骤。
四类改动
四类改动是操作内部的域:操作定入口,域定层次。四域的定义、边界与次序见 ../developing-cpp/references/change-model.md;一次改动混了两类时,按「写作 → 布局 → 排版 → 润色」拆开做,前一类落定并经检查再进下一类。
| 类型 | 典型请求 | 入口步骤 |
|---|---|---|
| 写作 | 改环境轴、入口脚本或构建流程 | steps/01-build.md |
| 布局 | 移动工具配置文件、补 .vscode/ |
steps/02-tooling.md |
| 排版 | 只改编码、行尾或 clang-format | steps/02-tooling.md |
| 润色 | 只改诊断措辞、失败分流说明 | steps/03-check.md |
完成判据
- 项目
environment.json的三个环境轴齐全且是合法组合,standard在c++11–c++23内;新工程默认c++23,没有靠猜。 - 配置命令固定 Ninja 和单一编译器,
build/<compiler>/compile_commands.json存在,根build/compile_commands.json指向当前编译器。 - target 契约已经成立:程序
app、库 target、公共 include、标准与输出目录都已由configuring-cmake写好;本技能没有偷偷改 CMake 来绕过失败。 -
clang-format --dry-run --Werror与clang-tidy在项目源码上零告警;只扫描项目源码和项目头。 - CTest 全绿,程序从该编译器的构建目录启动;有测试时注册用
gtest_discover_tests或项目既有机制,运行带--output-on-failure --no-tests=error,失败时报告的是具体角色和原因。 - 没有改源码语义,没有覆盖已有工程文件,也没有安装或下载任何工具。