Commit ca1d40e
committed
feat: 依赖产出的 host 工具、构建图节点、规则包(架构文档步 2–6)
实现 `.agents/docs/2026-08-05-build-mcpp-extensibility-architecture.md` 的步 2–6,
接在同一文档步 0+1 之后。核心是把 build.mcpp 里「**配置**」与「**施工**」这两件被
混在一起的事分开:程序继续回答「这次构建长什么样」,而「把这批输入变成那批输出」
交给构建图。
## 步 2 — 依赖产出的 host 工具(#355)
一个包能构建出消费者构建期需要的二进制(protoc / grpc_cpp_plugin / flatc / 转译器),
但消费者拿不到:`dep_dir()` 给的是源码树,依赖的 `kind="bin"` target 从不被构建。
**为什么不能是主图里的节点**:时序。build.mcpp 跑在 prepare 内,BuildPlan 还不存在、
build.ninja 更在其后 —— 主图产出的东西对需要它的程序永远来得太晚;叠上交叉编译连
架构都不对。所以走**嵌套的、面向 host 的子构建** + 全局 store(Cargo build-dependencies /
Bazel exec configuration / vcpkg host:true / Conan tool_requires 的形状)。
**为什么便宜**:工具是可执行文件,与主构建零 ABI 接触 ⇒ 子构建可用工具包自己的
toolchain / profile / 依赖解析,不必与消费者一致。
单一版本轴(工具版本=依赖版本,protoc 与运行时错配结构上不可表达)、默认关闭、
成本门复用已有 features+required_features、全局 store 按 版本×host 工具链×feature×
依赖闭包 缓存。逃生舱 `[tools.overrides]` / `MCPP_TOOL_*` 直接指现成二进制并**跳过
构建** —— 每个同类系统都有这一条,且**刻意不进 cache key**。
前提是**工作目录外置**:一次 build 往工程根写 5 处,而「注册表包根共享/可能只读/
绝不写入」是 build_program.cppm 自 G2 起的明文不变量。五处一起搬 —— 只搬一部分比
一处不搬更糟。
## 步 3+4 — `mcpp:action=` 构建图节点
一个原语三种接线(role 只决定输出接到哪):source 进编译集、check 产 stamp 且**默认
与编译并行**、artifact 的输入是链接产物。顺序全由 ninja 的文件依赖决定,不需要 phase
机制 —— 这也是 artifact 不会像朴素 post 钩子那样把自己重复施加一遍的原因。
**必须写出输出文件名**(INV-D):prepare 期就定死源码集/fingerprint/模块图。畸形
action 是硬错误。命令是 argv 而非 shell 字符串,插值只有封闭的四个。
## 步 5 — `host-module = true` 规则包
规则以普通 mcpp 库包分发,消费者 `import mcpp.rules.x;`。有版本、能测试、能发布,
用 **C++** 写 —— 不引入第二门语言(xmake Lua rule / Bazel Starlark)。
**关键**:规则模块与 build.mcpp **同一条命令、同一套 flag** 编译。不是优化 —— BMI 只
对与它在 standard/dialect/编译器身份上一致的编译可用,两次独立解析的构建没有理由
一致,而不一致表现为 `module X CRC mismatch` 而非清楚的错误。
## 步 6 — 生成的 .cppm
核实结论:真正的阻塞点不是 topoOrder 的**顺序**(那只是名字普查 + 发射次序),而是
未扫描的文件**根本没有 graph.units 条目**。解法用代码库已有的答案 ——「声明而非发现」:
action 的 `.provides()/.imports()` 让 mcpp 播下带该声明的占位文件,prepare 期扫描与
生成器将产出的内容一致,build 期由编译器自己的 P1689 复核。
## 顺带修
`.xlings.json` 自举 pin 指向索引已不再提供的 2026.8.3.2 —— `ci-aarch64-fresh-install`
自 2026-08-03 在 main 上就是红的。自举 pin 平时不该动,但它有一条硬约束是必须命名
可安装的版本,这条被打破时正是该 bump 的场合。
## 验证
- 单测 56/56
- e2e 19/21 通过;失败的 `07_static_library`(本机 binutils payload 的 ar 跑不起来)与
`09_path_dependency`(ninja missing dep BMI)在**已发布的 2026.8.4.1 上同样失败** ⇒
环境性,非回归
- 新增 3 个 e2e:187(host 工具:端到端 / 成本门 / 默认关闭 / 错名报可用列表 / override)、
188(三种 role + 增量 + 失败的 check 让构建失败 + 畸形 action 被拒)、
189(规则包:导入生效 / 编辑规则触发重跑 / 缺 lib root 的诊断)1 parent 3cafdb5 commit ca1d40e
18 files changed
Lines changed: 1913 additions & 16 deletions
File tree
- docs
- src
- build
- manifest
- pm
- tests/e2e
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
33 | 61 | | |
34 | 62 | | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
35 | 67 | | |
36 | 68 | | |
37 | 69 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
123 | 123 | | |
124 | 124 | | |
125 | 125 | | |
126 | | - | |
| 126 | + | |
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
| |||
964 | 964 | | |
965 | 965 | | |
966 | 966 | | |
| 967 | + | |
| 968 | + | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
967 | 1051 | | |
968 | 1052 | | |
969 | 1053 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
100 | 189 | | |
101 | 190 | | |
102 | 191 | | |
| |||
0 commit comments