Skip to content

docs: 四项未完成事项的方案 - #471

Merged
Sunrisepeak merged 2 commits into
mainfrom
docs/outstanding-four-plan
Aug 20, 2026
Merged

docs: 四项未完成事项的方案#471
Sunrisepeak merged 2 commits into
mainfrom
docs/outstanding-four-plan

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

对象是 2026-08-20 那批实施之后仍然敞开的四件事。每项给出修法、判据与代价。

⚠️ 先纠正一处不成立的测量

前一份文档写着「Windows 的 LLVM 载荷不带 libc++,已由 CI 测量」。该测量不成立:那一步打印的 payload: .../xim-x-llvm/*/ 里 glob 没有展开,说明我拼的 home 路径在 Windows 上就是错的。已成立的只有「构建死于 'algorithm' file not found」。载荷内容至今没被列出过。

四项结论

结论
Windows libc++ 选「加进现有载荷」。头加导出表 xz 后 0.9 MB,载荷解包 893 MB——独立成包所解决的问题在这里不存在,却引入索引表达不了的跨包版本约束。不改默认 STL
feature 源不一致 三次修法全部被测量证伪。判据不是字符串比较而是 glob 展开。给两条路线,建议引擎内展开
openarch 四接口 按「最可能证伪接口」排序。⭐ 时钟先作调研:若 riscv 的可移植时钟必须经 SBI,它就属于 openkal 而非 openarch,这会改变分层
x86_64 裸机 QEMU 可从源码单目标构建;难点在五个宿主,Windows 最难。沿用 xPack 公开脚本只换 --target-list 更省。分三阶段,阶段一不破例收录

纯文档。

对象是 2026-08-20 那批实施之后仍然敞开的四件事。每一项给出修法、判据与
代价,四项之间无依赖,可并行也可只做其一。

⚠️ **第 0 节纠正一处记录。** 前一份文档与若干提交信息写着「Windows 的
LLVM 载荷不带 libc++ 头,已由 CI 测量」。该测量不成立:那一步打印的
`payload: .../xim-x-llvm/*/` 里 glob **没有展开**,说明我在脚本里拼的
home 路径在 Windows 上就是错的。它测到的是「路径猜错了」,不是「头不在」。
已经成立的只有一条:该行死于 `'algorithm' file not found`,即 clang 解析
到了而头不在 mcpp 给出的 include 路径上。载荷内容至今没被列出过,所以
第 2 节的第一步是补测量,而不是直接动载荷。

四项的结论:

**Windows libc++** —— 选「加进现有载荷」而不是「独立成包」,理由是体积:
头加导出表 xz 压缩后 **0.9 MB**,而载荷解包后 893 MB;独立成包所解决的
问题在这里不存在,却会引入一条索引表达不了的跨包版本约束。且不改 Windows
宿主的默认 STL。

**feature 源不一致** —— 三次修法全部被测量证伪的记录写进文档。三次失败
指向同一结论:判据不是「glob 字符串在不在 base 里」,而是「base 的任何一条
glob 是否匹配这条 feature glob 匹配的文件」,需要 glob 展开。给出引擎内
展开与清单显式表达两条路线,建议前者,因为后者在每个包补键之前不修复任何
现存的包。

**openarch 的四个接口** —— 按「哪一个最可能证伪接口」排序而非按完整性。
⭐ 时钟那一条建议先作为**调研**:riscv 的可移植时钟要经 SBI,若如此它属于
openkal 的实现方而不是 openarch,这会改变分层——调研比实现便宜得多。

**x86_64 裸机** —— QEMU 可从源码构建且可只构建单目标,难点在五个宿主
而非构建本身,其中 Windows 最难。更省的路是沿用 xPack 公开的构建脚本,
只换 `--target-list`。分三阶段,阶段一只做 linux x64 供 openkal-uefi 用,
但**不破例收录**——收录门槛是五个宿主,破例一次门槛就降成注释。

三项与外部有关,排期要当外部依赖:载荷打包脚本不在本仓库、qemu-x86 要进
xim-pkgindex、五宿主构建需与 xPack 协调。
**⚠️ 收回一条论证。** 第一版反对把 libc++ 头独立成包,理由是「索引没有表达
跨包版本约束的机制」。那个前提是错的:一条带版本要求的依赖边**就是**那个
机制,而 `std-freestanding` 自己已经在用(`[feature-deps]` 里的 `^0.2.0`)。
我把「描述符里的注释」与「依赖边」混成了一件事。

收回之后取舍**相反**:改选独立成包。决定性的不是体积(0.9 MB 对 893 MB 两边
都不痛),而是另外两点——它是我们自己能做完的(载荷打包脚本不在本仓库),
并且它把这件事放回了本次实施已证明正确的位置:**目标需要什么由目标解析,
而不由宿主的编译器顺带提供**,与 C 库经 `[target.X].sysroot` 解析同构。

顺带回答了「freestanding 支持应当与标准库无关」:拆成接口 / 配置 / 头从哪来
三层之后,只有中间一层与实现有关,而且很小(libc++ 合成 `__config_site`,
libstdc++ 一个宏、实测 29/34)。Windows 的问题在第三层,与用哪个标准库无关。

**openarch 第 3 节改为已完成**:trap 与 cpu 两个接口连同两个后端已实现
(0.3.1),并补上三层目录树(abi / spec / backends)与它逼出的接口变化。
⭐ 记下门槛产出的第三条发现:`trap_frame` 必须带 `instr_len`——rv64gc 的
`c.ebreak` 是两字节,按 4 推进会落进下一条指令中间,而 aarch64 只有一种指令
宽度、永远暴露不了它。

**x86_64 采纳「先在临时 PR 的 CI 上跑通五条腿再收录」**:GitHub 托管的 runner
恰好覆盖本索引服务的五个宿主,可以在同一个 PR 的矩阵里一次跑出来。构建失败
在那里只是一个红叉,而不是一个已发布却装不上的包;而且它把 Windows 那条最难
的腿的风险前置。
@Sunrisepeak
Sunrisepeak merged commit a278f25 into main Aug 20, 2026
20 checks passed
@Sunrisepeak
Sunrisepeak deleted the docs/outstanding-four-plan branch August 20, 2026 18:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants