|
43 | 43 | 选的工具链——不加区分地永不取消 pin 也能让前一半通过,而那正是这个谓词当初要 |
44 | 44 | 防的替换。 |
45 | 45 |
|
| 46 | +## [2026.8.25.2] — 2026-08-25 |
| 47 | + |
| 48 | +一个谓词族的收尾。`2026.8.25.1` 修了其中四条,本次修余下三条,并补上让它们 |
| 49 | +存活至今的两个 CI 空洞。完整分析见 |
| 50 | +[`.agents/docs/2026-08-25-the-two-layer-predicate-family.md`](.agents/docs/2026-08-25-the-two-layer-predicate-family.md)。 |
| 51 | + |
| 52 | +### 修复 |
| 53 | + |
| 54 | +- **⭐⭐ 一个包声明「我供给哪一层」,让裸机目标丢掉了唯一能产出它的编译器。** |
| 55 | + |
| 56 | + 三行清单即可复现: |
| 57 | + |
| 58 | + ```toml |
| 59 | + provides = ["mcpp:kernel-abi=openkal"] |
| 60 | + ``` |
| 61 | + ``` |
| 62 | + $ mcpp build --target riscv64-none-elf |
| 63 | + Resolved gcc@16.1.0 → riscv64-none-elf → …/bin/g++ |
| 64 | + g++: error: unrecognized argument in option '-mabi=lp64d' |
| 65 | + g++: error: unrecognized command-line option '--target=riscv64-none-elf' |
| 66 | + ``` |
| 67 | + |
| 68 | + `graphSuppliesSystem`(跨 kernel-abi ∪ c-abi 的 OR)取消目标行的编译器 pin。 |
| 69 | + **对宿主行这是对的**——那一行说的是「哪个载荷供给这个目标的 C 库」。**对裸机 |
| 70 | + 行不是**——目标表自己写着「pin 是 llvm,因为 clang/lld 按构造就是交叉编译器」。 |
| 71 | + 宿主 g++ 发不出 riscv64,图里有什么都不改变这件事。 |
| 72 | + |
| 73 | + ⭐ pin 有两种:一种是**约定**(哪个载荷供给 C 库),一种是**能力陈述**(哪个 |
| 74 | + 编译器能发出这个目标)。区分记在读取那一行的同一处,不在决定点重新推导。 |
| 75 | + |
| 76 | +- **⭐⭐ 图供给了 C 库,不等于目标平台的 SDK 不再需要。** |
| 77 | + |
| 78 | + ``` |
| 79 | + kernel-abi openkal (openkal-macos@0.3.4, graph) |
| 80 | + c-abi musl (openkal-musl@0.3.5, graph) |
| 81 | + ld64.lld: error: library not found for -lSystem |
| 82 | + ld64.lld: error: undefined symbol: clock_gettime_nsec_np |
| 83 | + ``` |
| 84 | + |
| 85 | + macOS 分支给链接线加 `-isysroot`,它自己的注释写明了为什么(「否则 ld64.lld |
| 86 | + 会死在 library not found for -lSystem」);而 80 行之后的图分支把整条 `f.ld` |
| 87 | + 换掉,`-isysroot` 随之消失——**注释预言的那个失败,由它下面的代码造成**。 |
| 88 | + |
| 89 | + ⭐ **Linux 上二者恰好重合而 Darwin 上不重合**:Linux 的内核接口是一条指令 |
| 90 | + (`syscall`),所以自足的 musl 真的替换了一切;Darwin 的内核接口**本身就是一个 |
| 91 | + 库**(libSystem),所以 Mach-O 链接无论 libc 从哪来都要 SDK。新增 |
| 92 | + `platformAnchor`:写一次、读一次,两个分支不可能对「什么该活下来」有分歧。 |
| 93 | + |
| 94 | +- **⭐⭐ 请求的目标与解析出的目标必须是同一个操作系统。** |
| 95 | + |
| 96 | + ``` |
| 97 | + Target x86_64-windows-gnu → x86_64-unknown-linux-gnu |
| 98 | + … |
| 99 | + src/stream.cpp:68:9: error: 'GetFileType' was not declared in this scope |
| 100 | + ``` |
| 101 | + |
| 102 | + 一行里两个操作系统,而没有任何提示。交叉载荷缺席时解析回落到宿主编译器, |
| 103 | + Windows 源码被按 Linux 编译,失败在一百行之后——报出的是一个 Win32 函数名, |
| 104 | + 不是做出这个决定的那一处。openkal-uefi 撞在链接器上: |
| 105 | + `ld: unrecognized option '--subsystem'`。 |
| 106 | + |
| 107 | + ⭐ **报告里早就有证据,现在对它下断言**,而不是把问题重新推导一遍。范围刻意 |
| 108 | + 只取 OS:`x86_64-windows-gnu → x86_64-w64-windows-gnu` 的差异正是这一行要报告 |
| 109 | + 的归一化,拿整个三元组比会拒掉每一次正确的交叉构建。 |
| 110 | + |
| 111 | +- **`toolchain list` 漏掉了本机能构建的目标。** |
| 112 | + |
| 113 | + 它用 `host_can_serve`(问的是「有没有预制载荷」)去回答「能不能构建」。实测 |
| 114 | + Linux 上 `x86_64-windows-musl` 不在列表里,而同一台机器能产出真正的 PE32+。 |
| 115 | + |
| 116 | + ⚠️ **而不是每一行缺席都是这样**:`x86_64-windows-msvc` 与 `aarch64-macos` 在 |
| 117 | + Linux 上缺席是**对的**,MSVC 与 macOS SDK 是宿主专有的,依赖替代不了。判据不 |
| 118 | + 需要新字段——**一行若指向本宿主装得上的编译器,那它缺的只是系统,而系统可以 |
| 119 | + 由图供给**。第三种状态:`via dependency graph`。 |
| 120 | + |
| 121 | +- **镜像完整性门:一个没有重试的 GET 判掉整条发布。** |
| 122 | + |
| 123 | + `2026.8.25.1` 的发布红了两次,两次都报 16 个资产「already mirrored」,然后因 |
| 124 | + 其中一个的 502 判失败。手工抓下来:5,772,395 字节,sha256 与发布的校验和逐位 |
| 125 | + 相同。补 `--retry-all-errors`(不是 `--retry`,后者盖不住这条路径也会遇到的 |
| 126 | + 传输层错误);并修掉 `502ERR` 拼接(`|| echo ERR` 是追加不是替换)。 |
| 127 | + |
| 128 | +### 测试 |
| 129 | + |
| 130 | +- **e2e 292/293/294**,每条两向断言,且**都在修复前的二进制上验证过会失败**: |
| 131 | + 292 声明一层后裸机目标仍解析到同一编译器 + 宿主行不得顶掉项目自己的工具链; |
| 132 | + 293 拒绝跨 OS 的解析 + 四个正确交叉目标零误伤;294 列出图供给的目标 + 宿主 |
| 133 | + 专有的仍然缺席。 |
| 134 | + |
| 135 | +- **⚠️ `285`–`289` 此前一条都没在 CI 跑过。** 它们声明 `# requires: llvm`,而两个 |
| 136 | + linux e2e shard 的能力行里没有 `llvm`,`run_all.sh` 在 skip 时退 0。新增 |
| 137 | + `openkal-cross.yml` 的 `ecosystem-e2e`:装 gcc + llvm + 两个模拟器,直跑六条, |
| 138 | + **逐条断言 PASS 行**,并对 287/288 **额外断言运行阶段那一行**(实测它们会降级 |
| 139 | + 成 SKIP 而 OK 行照印)。 |
| 140 | + |
| 141 | +- **判据的「否」与「没测成」同读数**:一次会话里我自己新写的六条 e2e 有四条犯了 |
| 142 | + 它(宿主 objdump 反汇编外架构得零指令零报错、`readelf` 读不了的文件输出零行、 |
| 143 | + CI 自己的 PATH 本就以 subos/bin 开头)。判据一律带分母 |
| 144 | + (`7 LSE instructions out of 148906`),工具取自产生该产物的工具链。 |
| 145 | + |
46 | 146 | ## [2026.8.25.1] — 2026-08-25 |
47 | 147 |
|
48 | 148 | ### 修复 |
|
0 commit comments