|
3 | 3 | > 本文件追踪 `mcpp-community/mcpp` 公开仓的版本演进。 |
4 | 4 | > 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。 |
5 | 5 |
|
| 6 | +## [2026.9.28.3] - 2026-09-28 |
| 7 | + |
| 8 | +本版本实施 #734 设计中 mcpp 的部分:构建插件体系的三层(`mcpp.core`、官方通用库、插件)、 |
| 9 | +构建信息、工作区成员只构建一次、批量放置、`pack -p`、库接口规范的第一阶段与包的版本下限。 |
| 10 | +设计、测量、任务划分与实施记录见 |
| 11 | +`.agents/docs/2026-09-28-build-cost-foreign-toolsets-and-library-surface-design.md`,规范见 |
| 12 | +SPEC-007 §9 与新的 SPEC-008。配套的 mcpp-plugins 0.17.0 以本版本为下限。 |
| 13 | + |
| 14 | +### 行为变化 |
| 15 | + |
| 16 | +- **被其他成员以 path 依赖使用的工作区成员只构建一次(E1)。** 消费方构建之前,成员在自己的目录中 |
| 17 | + 作为自身构建的根构建一次,由它的 ninja 判断过期(包括成员根目录之外的头文件);消费方经 stage |
| 18 | + 边取得其对象与 BMI,按内容比较。条件是成员在消费方图中的构建键输入与它作为根时相等 |
| 19 | + (`package.index` 除外,它只记来源);不相等时照旧在消费方图中编译,`-v` 写出不同的输入。同时 |
| 20 | + 构建的两个消费方以文件锁轮流使用成员目录。一个五成员 Windows 工作区的核心库此前被编译三次。 |
| 21 | +- **程序旁的文件由一个进程放置(E4)。** 程序的 deploy 条目在两条及以上时成为一条 `stage_list` |
| 22 | + 边,读取规划写出的 `placements.list`;`mcpp stage --list` 对每个目的地保持单文件语义。在 |
| 23 | + Windows 首次构建上,1270 条单文件放置耗时 4.5 s,一个进程复制同样的文件耗时 0.5 s。 |
| 24 | +- **库接口的第一阶段(E6,SPEC-008)。** `mcpp pack` 写出未进入发布闭包的导出模块(W2),"Withheld" |
| 25 | + 一行列出每个未发布的单元(此前没有接口根时显示 "(nothing)",而两个导出模块既未发布也未列出); |
| 26 | + `mcpp build` 在包导入依赖(本工作区成员除外)的非公开模块时警告(W3);缺少接口根的警告写明对 `mcpp pack` 的后果 |
| 27 | + (W1)。全部为警告。 |
| 28 | +- **快路径在一次确认之后恢复。** 编辑源码后的那次构建经完整路径确认了图,却不重写内容未变的 |
| 29 | + build.ninja,而快路径以 build.ninja 的时间比较每个源码;此前编辑之后的每次构建都被拒绝,直到图的 |
| 30 | + 文本改变。现在确认时移动 build.ninja 的时间(e2e 832,2026.9.28.2 在 Linux 上同样复现)。 |
| 31 | +- **快路径看见 path 依赖的整棵源码树。** 此前只扫描依赖的 `src/`;依赖在别处的 host module |
| 32 | + (例如 mcpp-plugins 的 `deps/vcpkg.cppm`)编入消费方的构建程序,不在任何 ninja 边上,被编辑后 |
| 33 | + 构建报告"无事可做"。现在扫描依赖的整棵树,跳过隐藏目录、`target` 与嵌套的包(e2e 831)。 |
| 34 | +- **每个下载只占一行。** 非终端输出此前在开始时写一行 `Downloading <item> (<size>)`,完成时再写一行 |
| 35 | + `... done, <size> in <time>`;现在只写完成的一行,失败时写 `did not complete` 的一行。终端上进度条 |
| 36 | + 原地刷新,结束时换成同样带大小与耗时的完成行。 |
| 37 | +- **MSVC ABI 上的 clang 找不到工具集时说明原因。** 默认的 `msvc@system` 在没有带 C++ 工具的 |
| 38 | + Visual Studio 实例时,此前静默继续,随后在预编译 `mcpp` 模块时以 `'cstdio' file not found` 失败; |
| 39 | + 现在解析时给出警告,写出安装与指定托管工具集的命令(在屏蔽 Visual Studio 的 runner 上测得)。 |
| 40 | +- **`mcpp.core` 的输出不再把 `FILE` 带入模块接口。** `mcpp::report` 只经 `printf` 输出;此前 GCC |
| 41 | + 拒绝在 `import mcpp;` 之后 `#include <cstdio>` 的构建程序(e2e 651)。 |
| 42 | + |
| 43 | +### 特性 |
| 44 | + |
| 45 | +- **`mcpp.core`(E8,协议 14)。** 引擎接口以 `mcpp.core` 为名,`mcpp` 是永久等价的写法。 |
| 46 | +- **构建信息(E2,协议 14)。** `mcpp::tool(role)`、`abi_tool(role)`、`tool_env()`、 |
| 47 | + `toolset_identity()`、`msvc_instance_dir()`、`ninja_program()`、`cxx_runtime()`、 |
| 48 | + `msvc_crt_linkage()` 以事实陈述解析出的工具链与程序的 C++ 运行时契约,取自引擎自身命令行所读的 |
| 49 | + 同一来源。 |
| 50 | +- **结构化诊断(E11,协议 14)。** `mcpp::report({severity, message, impact, hint})` 以引擎的形式 |
| 51 | + 呈现,进入 JSON 输出,缓存命中时重放。 |
| 52 | +- **缺失的构建程序模块指出 feature(E7)。** 模块只在依赖未启用的 feature 之后提供时,错误写出包名、 |
| 53 | + feature 名与应加的一行。 |
| 54 | +- **插件模块的名字(E10)。** `mcpp.<自己的命名空间>.*` 不再被警告;保留的第二段(`core`、 |
| 55 | + `plugins`、`deps`、`rules`、`dist`、`tools`)只属于命名空间 `mcpp` 的包。 |
| 56 | +- **`mcpp pack -p <member>`(E3)。** 在工作区根目录打包某个成员,结果与在成员目录中打包相同。 |
| 57 | +- **包的版本下限(E9)。** `[package] mcpp = ">=<release>"` 与 `[workspace.package] mcpp`; |
| 58 | + 低于下限的引擎在其他工作之前停止,写出升级命令;只接受 `>=`。 |
| 59 | +- **`[lib]` 报告未知键(E12)。** 此前拼错的 `path` 被静默接受。 |
| 60 | +- **快路径在 macOS、Windows 与自带 sysroot 的目标上生效(E5)。** 运行期校验只含 ELF/glibc 规则,在这些目标上 |
| 61 | + 提前返回而不写校验记录,快路径因此找不到已校验的产物快照,每次构建都走完整路径(macOS 上 e2e 645、831、 |
| 62 | + 832 读出 `no validated artifact snapshot is recorded`)。现在这些目标记录产物的戳记,判定为通过(没有适用的 |
| 63 | + 规则);产物被重新链接时快路径仍交回完整路径。`-v` 下每个拒绝点以一句话写出其条件。 |
| 64 | + |
| 65 | +### 兼容性 |
| 66 | + |
| 67 | +- 协议升至 14:使用 §9 新接口的构建程序在旧引擎上编译失败并指出缺少的名字;以 |
| 68 | + `[package] mcpp` 声明下限的包在旧引擎上得到一条"不支持的键"警告。 |
| 69 | +- 升级后的第一次构建各付一次代价:每个构建程序因上下文新增变量而重新运行一次;被共享的工作区 |
| 70 | + 成员在消费方中改为暂存,其对象在成员目录中编译一次;程序旁的放置边形状改变而运行一次(内容相同 |
| 71 | + 的文件不重写)。 |
| 72 | + |
6 | 73 | ## [2026.9.28.2] - 2026-09-28 |
7 | 74 |
|
8 | 75 | 本版本实施 2026-09-28 生态设计中 mcpp 的部分(WS1、WS2、WS3、WS7、WS8、WS10 与决定 D7),关闭 |
|
0 commit comments