|
3 | 3 | > 本文件追踪 `mcpp-community/mcpp` 公开仓的版本演进。 |
4 | 4 | > 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。 |
5 | 5 |
|
| 6 | +## [2026.9.25.1] - 2026-09-25 |
| 7 | + |
| 8 | +### 工作空间成员在每种位置上以相同方式编译(#690) |
| 9 | + |
| 10 | +`[workspace.build]` 的继承此前在把清单固定进构建图的那一步执行,晚于 `defines` 的展开。 |
| 11 | +作为兄弟成员 `path` 依赖被编译的成员因此收不到工作空间的 `defines`(#690 报告的情形), |
| 12 | +而被命令选中的根成员收到两份工作空间的 `cflags`、`cxxflags` 与 `ldflags`。现在成员在自己的 |
| 13 | +加载处继承,顺序与根包相同:先继承,再合并条件节,最后展开 `defines`;固定进构建图的一步只读取 |
| 14 | +结果,遇到未展开的 `defines` 时报告内部错误。 |
| 15 | + |
| 16 | +同一处还补上了两件同形的缺口: |
| 17 | + |
| 18 | +- 作为依赖出现的成员解析自己的 `x.workspace = true` 条目。此前该条目以既无版本也无路径的形式 |
| 19 | + 进入解析,报出的是「no readable index entry」。 |
| 20 | +- 通过 `git` 引用的、托管在 git 上的工作空间的成员,除 `[workspace.package]` 外,也继承所在仓库 |
| 21 | + 的 `[workspace.build]` 与 `[workspace.dependencies]`,相对路径以仓库根为锚点。同一个提交在它 |
| 22 | + 自己的检出中与在使用方的依赖图中以相同方式编译。 |
| 23 | +- 索引描述符以 `mcpp = "<子目录>/mcpp.toml"` 指向归档内的成员时,该成员以同样方式取得归档中的 |
| 24 | + 工作空间;在归档内查找工作空间根不越出该版本的安装根。本机已安装的 22 个带工作空间根的索引包 |
| 25 | + 都没有声明可继承的表,这一变化不改变任何现有包。 |
| 26 | + |
| 27 | +`[workspace.build] ios_deployment_target` 此前被解析、被继承,却被已知键检查拒绝;可继承键现在 |
| 28 | +只在一张表里陈述,解析、已知键检查与报错文本都取自这张表。 |
| 29 | + |
| 30 | +### `defines` 按宏名构成集合 |
| 31 | + |
| 32 | +`defines` 的条目按包接收它们的顺序合并:`[workspace.build]`、包自己的 `[build]`、命中的 |
| 33 | +`[target.<selector>.build]`。同一宏名的后一个条目在原位替换前一个,条目 `!NAME` 移除该宏名, |
| 34 | +每个宏名只以一个 `-D` 词到达编译器。成员因此可以覆盖或移除继承来的宏,而不再产生重定义诊断 |
| 35 | +(`-Werror` 下是错误)。`defines` 条目同样取代同一个包的 `cflags`、`cxxflags` 中同名的 `-D` 词。 |
| 36 | +更早的 mcpp 会把 `!NAME` 作为 `-D!NAME` 交给编译器,使用它的包需要 mcpp 2026.9.25.1 或更新版本。 |
| 37 | + |
| 38 | +### 使用方的头文件目录不再进入依赖 |
| 39 | + |
| 40 | +根包的 `include_dirs` 与 `include_dirs_after`(包括 `private_include_dirs`)此前被写进 |
| 41 | +`build.ninja` 的文件级编译标志,图中每个编译单元都读到它们:根包目录中与系统头或依赖头同名的 |
| 42 | +文件会在依赖内部遮蔽它们。依赖缓存键不含这些目录,于是按一个工程的根包头文件编译出的依赖对象 |
| 43 | +会被另一个无关工程取用(实测:`compat.cjson` 的 `cJSON_Compare(1.0, 1.2)` 在未写任何头文件的 |
| 44 | +工程中答 1)。现在每个编译单元只收到自己的包的目录,以及它的依赖公开的目录;根包自己的编译单元 |
| 45 | +中每个目录只出现一次。 |
| 46 | + |
| 47 | +**行为变化。** 依赖若曾依靠使用方的头文件目录才能编译,现在报告缺少头文件;mcpp 在编译器报错 |
| 48 | +之后指出该头文件所在的使用方目录。依赖需要通过自己的 `include_dirs` 或它的某个依赖找到头文件。 |
| 49 | +依赖缓存的 epoch 由 3 升为 4,升级后首次构建重建一次依赖缓存,不需要任何操作。 |
| 50 | + |
| 51 | +### 成员清单只有一种读法 |
| 52 | + |
| 53 | +`mcpp publish`、`mcpp pack`、`mcpp emit xpkg`、`mcpp toolchain list`、`mcpp sbom`、`mcpp index list`/`update`、 |
| 54 | +`mcpp update` 的索引刷新、快路径的身份判定与测试发现,此前直接读取成员目录中的原始清单:省略 |
| 55 | +`version` 的成员被拒绝,未写 `[toolchain]` 的成员在 `toolchain list` 中显示全局默认工具链,而同一 |
| 56 | +目录下的 `mcpp build` 用的是工作空间的工具链。现在它们与 `prepare_build` 经同一个函数读取继承后的 |
| 57 | +清单。 |
| 58 | + |
| 59 | +### 工作空间成员的发布形态自包含 |
| 60 | + |
| 61 | +在成员目录中执行 `mcpp publish` 或 `mcpp emit xpkg` 时,归档只包含成员自己的目录,此前其中的 |
| 62 | +`mcpp.toml` 原样照搬:继承的 `version`、`[build]` 标志不在其中,兄弟成员之间的 `path` 依赖原样保留 |
| 63 | +而使用方无法解析,描述符的 `deps` 静默略去这些依赖。现在发布的清单是归一化后的:继承来的值被写出, |
| 64 | +`x.workspace = true` 条目取得解析后的来源,兄弟依赖以版本依赖发布,原清单以 `mcpp.toml.orig` 保留, |
| 65 | +归一化后的文件同时写到 `target/dist/<name>-<version>.mcpp.toml`。归档由 git 对象按提交日期构建, |
| 66 | +两次运行逐字节相同。不带 `version` 的兄弟 `path` 依赖、包外非成员的 `path` 依赖、位于成员目录之外的 |
| 67 | +继承头文件目录会被拒绝,报错给出应写的内容。不是工作空间成员的包与此前一样原样归档。 |
| 68 | +归一化后的清单只使用 2026.9.24.1 已接受的键,实测该版本的客户端可以构建它。 |
| 69 | + |
| 70 | +### xlings 2026.9.20.1 |
| 71 | + |
| 72 | +内置的 xlings 由 2026.9.16.1 升为 2026.9.20.1(openxlings/xlings#610):项目 subos 中执行的命令 |
| 73 | +不再从项目的 subos 读取全局工作空间并据此删除全局 shim;下载失败的安装不再报告 `installed`。 |
| 74 | + |
| 75 | +### 测试基础设施 |
| 76 | + |
| 77 | +e2e 辅助脚本 `_inherit_toolchain.sh` 改为按版本链接开发者的载荷。此前它链接整个包目录,测试 |
| 78 | +新装的版本穿过链接写进开发者的 `~/.mcpp`,链接脚本指向测试结束后即被删除的临时目录(#293 的 |
| 79 | +第二种形态;实测 `31_transitive_deps.sh` 写出了这样的 `xim-x-glibc/2.44.3`)。 |
| 80 | + |
6 | 81 | ## [2026.9.24.1] - 2026-09-24 |
7 | 82 |
|
8 | 83 | ### MSVC ABI 上的 toolset:只选一次,可以指定,记录在案 |
|
0 commit comments