|
3 | 3 | > 本文件追踪 `mcpp-community/mcpp` 公开仓的版本演进。 |
4 | 4 | > 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。 |
5 | 5 |
|
| 6 | +## [2026.9.27.1] - 2026-09-27 |
| 7 | + |
| 8 | +### 缺陷修复(#704、#705、#710、#712 至 #716) |
| 9 | + |
| 10 | +- **宿主构建读取宿主三元组的行(#704)。** 不带 `--target` 的构建此前不读取 |
| 11 | + `[target.<宿主三元组>]`,其中的 `cxx_runtime` 没有效果。现在宿主构建应用这一行,与 |
| 12 | + `--target <宿主三元组>` 相同,行的查找与拼写无关;`--toolchain` 仍优先于行的 `toolchain` |
| 13 | + (SPEC-004 §4.6)。 |
| 14 | +- **`xpkg_dir` 回答 xlings 装下的载荷(#712、#716)。** 版本位按 xlings 的版本文法求值, |
| 15 | + `libglvnd@1.7` 回答 `1.7.0.1`。xlings 在 `install_targets` 事件中报告每个请求解析到的载荷, |
| 16 | + mcpp 按地址记录并优先读取。安装记录仍在而载荷已被删除时,联网构建重新安装,离线构建拒绝并 |
| 17 | + 点名缺失的地址;构建缓存记录读取过的载荷目录,任一目录缺失时快路径不复用缓存。mcpp 以 |
| 18 | + xlings 发布的版本选择向量测试同一规则(SPEC-001 §10.1)。 |
| 19 | +- **宿主工具的工具链由请求方决定一次(#710)。** 顺序为 `--toolchain`、工具包自己的声明(工作 |
| 20 | + 空间成员先继承根位置的键)、请求方的宿主工具链;结果传给子构建并写入工具库的键。工具包的源树 |
| 21 | + 摘要跳过带自己 `mcpp.toml` 的子目录,并以 UTF-8 计算路径(#705)。 |
| 22 | +- **工作空间(#713、#714)。** 成员隐式继承根的 `[xlings.workspace]` 条目与条件行,自己声明的 |
| 23 | + 同一个包优先。未解析的 `workspace = true` 在根包、`-p` 成员与各类依赖处都被点名拒绝;带 |
| 24 | + `[package]` 的工作空间根解析自己的条目。`[build] sources = []` 不再推断库目标。 |
| 25 | +- **规则只经其声明的扩展名到达(#715)。** 一个规则只在包含它声明的设备源扩展名时进入包的合成 |
| 26 | + 构建程序;状态行只列出实际生效的规则。 |
| 27 | + |
| 28 | +### 规划不构建宿主工具(#707) |
| 29 | + |
| 30 | +`mcpp emit build-database` 不再构建依赖提供的宿主工具。工具库中已有的工具照常使用;没有的工具被 |
| 31 | +推迟,报告为 note `MCPP_BUILD_DATABASE_HOST_TOOL_DEFERRED`,请求它的构建程序收到该工具将被发布的 |
| 32 | +路径。它取代 2026.9.26.2 的警告 `MCPP_BUILD_DATABASE_HOST_TOOL_UNBUILT`(SPEC-005 v1.4 R2.5)。 |
| 33 | +`mcpp build` 不受影响。 |
| 34 | + |
| 35 | +### 构建程序与依赖边(#708、#709、#711) |
| 36 | + |
| 37 | +- **action 的 `env` 与 `cwd`(协议 13,#708)。** `mcpp::action::env(name, value)` 与 |
| 38 | + `cwd(dir)` 由引擎的 action 包装器应用;`cwd` 按包根解析,声明的输入、输出与 stamp 不随它 |
| 39 | + 移动;变量值改变时 action 重新运行。两者都未声明的 action 命令行与协议 12 逐字节相同。 |
| 40 | +- **特性的 `tools`(#709)。** `[features.<f>] tools = ["<bin>"]` 陈述特性需要本包的程序在 |
| 41 | + 构建机器上运行;启用该特性的消费方得到该工具,与边上写 `tools` 相同。 |
| 42 | +- **`artifacts` 依赖边(#711)。** `x = { path = "...", artifacts = ["<bin>"] }` 以消费方的 |
| 43 | + 目标与 profile 构建依赖的程序,输出到消费方的 `bin/`,不链接依赖的代码;action 以 |
| 44 | + `${mcpp.artifact:<x>/<bin>}` 引用它;`mcpp pack` 把它放在程序旁(SPEC-004 §10、 |
| 45 | + SPEC-007 R6.4)。 |
| 46 | + |
| 47 | +### 载荷的打包修订与自包含的 locale(xlings#620、#621) |
| 48 | + |
| 49 | +- 依赖的索引条目的 `revision` 进入依赖完整性判断:修订号不同的已安装依赖按未安装处理。修订号 |
| 50 | + 大于 0 的运行时载荷进入运行时契约(`revision=<n>`),修订号变化使依赖它的产物重新链接;修订号 |
| 51 | + 为 0 时契约文本不变(SPEC-001 §10.2)。 |
| 52 | +- `mcpp pack` 的 bundle-all 形态随 glibc 载荷复制 `lib/locale` 与 `lib/gconv`,启动脚本设置 |
| 53 | + `LOCPATH` 与 `GCONV_PATH`(用户已设置时保留用户的值)。 |
| 54 | + |
| 55 | +### 兼容性 |
| 56 | + |
| 57 | +以下变化对已有工程可见: |
| 58 | + |
| 59 | +- 未解析的 `workspace = true` 此前静默成为空版本依赖,现在在加载时报错并点名条目(#714)。 |
| 60 | + 修正方法是在工作空间根的 `[workspace.dependencies]` 中声明该包,或在条目上写明版本。 |
| 61 | +- `[build] sources = []` 不再推断库目标。依赖这一推断的包在 `[targets]` 中声明库目标。 |
| 62 | +- note 代码 `MCPP_BUILD_DATABASE_HOST_TOOL_UNBUILT` 由 `MCPP_BUILD_DATABASE_HOST_TOOL_DEFERRED` |
| 63 | + 取代,不保留旧代码。 |
| 64 | + |
| 65 | +### 其他 |
| 66 | + |
| 67 | +- 测试:e2e 804 覆盖不属于任何工作空间的路径宿主工具包的工具链选择(#710);e2e 802 固定 gcc |
| 68 | + 工具链,使其断言不依赖机器的默认工具链;单元测试 `test_prepare_helpers` 覆盖各阶段共用的纯函数 |
| 69 | + (`--features` 请求语法、宏名、git 远端是否本地等)。 |
| 70 | +- ELF 检查以一次读取载入文件。此前逐字节读入,`mcpp test` 的链接后检查在测试程序较多时耗时 |
| 71 | + 数十分钟。 |
| 72 | +- **`src/build/prepare.cppm` 的内部分解。** 原文件 16,105 行,其中函数 `prepare_build` 占 85%。 |
| 73 | + 它拆为按阶段划分的函数,跨阶段的状态集中在 `PrepareState`(取代原来约 180 个共用一个栈帧的 |
| 74 | + 局部变量)。主接口 `prepare.cppm` 只保留导出的类型、内联函数与声明;实现位于 `src/build/prepare/` 下的 |
| 75 | + 实现单元与实现分区 `:state`,各单元只导入自己用到的模块,每个文件不超过 2,500 行,由 CI 检查。 |
| 76 | + 代码逐段移动,不重排语句;公开接口、导出符号与默认参数不变,七个场景的规划输出与分解前逐字节 |
| 77 | + 一致。修改一个阶段只重新编译该实现单元:本机修改 P13 中的一处字符串,增量构建 12 s,分解前 |
| 78 | + 71 s。模块组织受 GCC 16.1 的内部编译器错误约束,见 #721。 |
| 79 | +- 规范:SPEC-001 v1.5、SPEC-004 v1.8、SPEC-005 v1.4、SPEC-007 v0.3。 |
| 80 | + |
6 | 81 | ## [2026.9.26.2] - 2026-09-26 |
7 | 82 |
|
8 | 83 | ### 编译数据库:一个配置一个数据库(#699 的报告;#397 C-1、#677 B1) |
|
0 commit comments