|
3 | 3 | > 本文件追踪 `mcpp-community/mcpp` 公开仓的版本演进。 |
4 | 4 | > 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。 |
5 | 5 |
|
| 6 | +## [2026.8.27.1] — 2026-08-27 |
| 7 | + |
| 8 | +目标侧被解析出来了,只发给了一个编译单元。完整分析见 |
| 9 | +[`.agents/docs/2026-08-27-openkal-native-path-three-issues.md`](.agents/docs/2026-08-27-openkal-native-path-three-issues.md)。 |
| 10 | + |
| 11 | +⭐ **与 `2026.8.25.x`/`2026.8.26.1` 是同一族的下一层。** 那两批修的是「谓词问错了」 |
| 12 | +与「答案没接到决定上」;这一批里,答案**接上了一个消费者,而它有五个**。 |
| 13 | + |
| 14 | +### 修复 |
| 15 | + |
| 16 | +- **⭐⭐ 编译侧的谓词,是 `2026.8.26.1` 在链接侧修掉的那条的孪生兄弟。** |
| 17 | + |
| 18 | + `hostflags.cppm` 问的是 `!crossTargetFlag.empty()` ——「命令行上有没有 |
| 19 | + `--target=`」——而它的注释写的是「目标侧来自图」。同一台机器、同一个编译器、 |
| 20 | + 同一个目标,只差写不写 `--target`,编译线少了**六个 token**: |
| 21 | + |
| 22 | + ``` |
| 23 | + --no-default-config -nostdinc++ |
| 24 | + -isystem <payload>/include/c++/v1 |
| 25 | + -isystem <payload>/include/<triple>/c++/v1 |
| 26 | + -isystem <glibc>/include |
| 27 | + -isystem <linux-headers>/include |
| 28 | + ``` |
| 29 | + |
| 30 | + ⇒ 头文件来自一个库,目标文件链自另一个库。两侧现在读同一个 |
| 31 | + `plan.targetSide.cAbi.prebuilt()`。⚠️ `--no-default-config` 从这个条件里 |
| 32 | + **拆了出来无条件发** —— 它不是载荷头文件集合的一部分,而 cfg 文件按 |
| 33 | + `post_install.cppm` 自己的说法是「per-machine, per-install-path artifact」。 |
| 34 | + |
| 35 | + ⚠️ `e2e 295` 写的就是这条恒等式,而它只比对 `^ldflags`,所以恒等式在**下一行** |
| 36 | + 不成立而测试看不见。现在两条都比。 |
| 37 | + |
| 38 | +- **⭐⭐ 载荷目录名是 LLVM 词汇,而查找用的是 mcpp 词汇 —— 而且失配是静默的。** |
| 39 | + |
| 40 | + `include/<triple>/c++/v1` 与 `lib/<triple>` 由 LLVM 的构建写下,带的是 |
| 41 | + `x86_64-unknown-linux-gnu`;`tc.targetTriple` 是 mcpp 的 |
| 42 | + `x86_64-linux-gnu`。两者只在三元组是**探测来的**时候恰好相同。查找是 |
| 43 | + `if (exists) push_back`,所以找不到就什么也不发生 —— 而那个目录里只有一个文件, |
| 44 | + `__config_site`,它的缺席产生的报错读起来像载荷坏了。两种拼法现在都试。 |
| 45 | + |
| 46 | +- **⭐⭐ 由图供给的目标侧,只到达了一个编译单元(mcpp#514 §A)。** |
| 47 | + |
| 48 | + 提供 `mcpp:` 层的包发布的是**整个目标**编译时所依据的头文件集合,而它今天以 |
| 49 | + `publicUsage` 的形态**沿依赖边**传播。于是根与 provider 自己的单元拿得到,而 |
| 50 | + **兄弟依赖包**拿不到 —— `nlohmann.json` 不在 `openkal-llvm-runtime` 的下游, |
| 51 | + 它在它旁边。结果是一次构建里两种口味的 BMI,任何同时导入两者的 TU 在第一个 |
| 52 | + 模板实例化处炸掉(`reference to 'space' is ambiguous`)。 |
| 53 | + |
| 54 | + ⭐ 目标侧解析之后,`fromGraph()` 的层的 `publicUsage` 并入**每一个**包的 |
| 55 | + `privateBuild`;`std` 模块的命令行也改读同一个集合,不再自己推一遍。 |
| 56 | + |
| 57 | +- **⭐⭐ 缓存键描述了编译器,没有描述它被指向的头文件集合(mcpp#514 §B)。** |
| 58 | + |
| 59 | + A 轴上的每一项都在描述**编译器**,没有一项描述它编译时所依据的**库** —— |
| 60 | + 而两者是分开安装的。`driverIdentity` 按设计也覆盖不了它: |
| 61 | + `normalize_driver_output` **故意**抹掉路径,好让一个条目能被两个 home 共享。 |
| 62 | + 新增 `targetHeaderSet` 轴,取自已经解析好的 `linkmodel`,并**分两档相对化**: |
| 63 | + `<store>` 与 `<home>`。⚠️ 只做 `<store>` 一档不够 —— 最常见的那台机器走 |
| 64 | + `CLibMode::Sysroot`,它唯一的编译 token 是 `--sysroot=<home>/registry/subos/default`, |
| 65 | + 在 HOME 底下而不在 store 底下,于是每个条目都会带上这台机器的 home。分得开什么: |
| 66 | + 两个载荷(路径里带版本号)⇒ 两个键;一个 home 下的两个 subos ⇒ 两个键; |
| 67 | + 两个 home 下同名的 subos ⇒ 仍是一个键(由整工程指纹的第 11 项区分)。 |
| 68 | + ⚠️ 不 bump `kCacheEpoch` —— 旧条目是 miss 而不是不可用。 |
| 69 | + |
| 70 | +- **⭐⭐ 请求的版本和载荷目录的版本是两套词汇,而每个查找都按请求那套拼。** |
| 71 | + |
| 72 | + RuntimeBinding 带的是**声明的**版本(`glibc@2.44`),而 xlings 把载荷目录按这个 |
| 73 | + 请求**解析成**的版本命名(`2.44.2`)。索引在同一序列内挪动一次包,所有按声明版本 |
| 74 | + 拼目录名的查找就同时失效 —— 在每一台**新**机器上,在任何已存在的机器上都不出现。 |
| 75 | + |
| 76 | + 两个查找点各自拼过一遍,所以修好一个还剩另一个,而第二处的失败**根本不提版本**: |
| 77 | + glibc 的 include 目录只是没被加上,用户读到的是 libstdc++ 头文件里的 |
| 78 | + `features.h: No such file`。⇒ 收敛到一个 `payload_dir_for_version`。 |
| 79 | + |
| 80 | + ⭐ **判据是「精化」,不是「按目录序挑一个」**:`2.44.2` 的版本**分量**以请求的分量 |
| 81 | + 开头。`2.4` 回答不了 `2.44`(逐分量比,不是逐字符)。两个载荷都精化同一个请求时 |
| 82 | + 返回**空** —— 「这个请求的解析结果」得是唯一一个才配叫答案,而按目录序挑正是这里 |
| 83 | + 每个调用者都拒绝做的猜测。反方向(拿更旧的载荷回答更新的请求)不接受。 |
| 84 | + |
| 85 | +- **⭐ home 发现有第四份拷贝,而且会伸到别的 home 里去。** |
| 86 | + |
| 87 | + `active_home_xpkgs()` 自己重推了一遍 home(漏掉自包含安装那一档); |
| 88 | + `find_sibling_package` 找不到时**无条件回落** `~/.xlings/data/xpkgs`。 |
| 89 | + 后者意味着一次密闭构建可以从**另一棵树**取载荷,而结果直接进每条编译命令的 |
| 90 | + `-isystem`。前者改为 `mcpp::home::root()`,后者删除 —— 找不到会说话,找错了不会。 |
| 91 | + |
| 92 | +### 新增 |
| 93 | + |
| 94 | +- **`[build] private_include_dirs`** —— 指出 `include_dirs` 中在本包边界处停住的 |
| 95 | + 条目。`publicUsage` 此前整份接过 `privateBuild` 的目录,于是一个内嵌了带内部头 |
| 96 | + 覆盖层的库(musl 的 `src/include` 定义 `hidden`/`weak`/`weak_alias`)会把那些宏 |
| 97 | + 发给每一个消费者。⚠️ 它是 `include_dirs` 的**子集**而不是第二个列表:两类目录的 |
| 98 | + 相对顺序是承重的,而两个 TOML 数组表达不了一个顺序。 |
| 99 | + |
6 | 100 | ## [2026.8.26.2] — 2026-08-26 |
7 | 101 |
|
8 | 102 | 已经解析出的答案,没有被用来做决定。完整分析见 |
|
0 commit comments