Skip to content

Commit c29e53d

Browse files
committed
test: admit native GNU and ARM64 openkal cross consumers
1 parent 0ea64e7 commit c29e53d

21 files changed

Lines changed: 779 additions & 58 deletions

‎.agents/docs/2026-10-08-llvm-2313-linux-aarch64-ecosystem-part2-design.md‎

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,3 +461,161 @@ Windows 后续失败现场的驱动搜索目录含 `15.2.0` 和全局 registry
461461
维护者本次 review 的重点为默认组合、完整 glibc 运行数据、必要客户端
462462
修复、原生 GNU 支持范围及上述准入顺序。原生 GNU 行在未通过门之前
463463
维持 preview;本补记不授予发布准入,也不将计划中的测试计为通过。
464+
465+
### 12.4 Windows 驱动证据更正
466+
467+
同日进一步核查确认,第 12.2 节所引用的搜索目录来自诊断循环中的
468+
xlings shim,不能证明冷载荷驱动选择错误。循环依次枚举 payload 与
469+
SubOS 的两个 `g++.exe`,后者覆盖了前者的单文件报告;两轮 CI 的文件
470+
清单都包含这两个文件。此处撤回“实际载荷驱动版本不一致”的推断。
471+
472+
run 37690944669 的新摘要证明冷载荷 g++.exe 与已验证的 16.1.0
473+
归档逐字节一致,cc1plus 同样一致。后续诊断按 driver 分开记录,并
474+
加入 cc1plus 对真实 C++ 源的编译探针。`--version` 静默退出 0 不足以
475+
证明该辅助前端可以完成编译;Windows 根因仍未确定。
476+
477+
## 13. 2026-10-08 Part 2 维护者评审摘要
478+
479+
本节是本次综合方案的评审入口。第 1–10 节保留初始设计快照,后续
480+
具名补记更新前提;实现进展不能替代原生消费与发布验收。
481+
482+
### 13.1 推荐裁决与跨仓库职责
483+
484+
| 裁决项 | 推荐方案 | 所属交付 |
485+
|---|---|---|
486+
| 新安装默认 | Linux aarch64 选择 `llvm@23.1.3` 与 `aarch64-linux-gnu`,两轴一起验证 | mcpp 默认钉点、首次使用与迁移文档 |
487+
| LLVM 来源 | 复用已核验摘要的上游 ARM64 全量包,carve 为 llvm 与 llvm-tools | xim-pkgindex 构建、来源清单与不可变资产 |
488+
| glibc 世界 | glibc 2.44.3-r1、UAPI 5.11.1、gcc-runtime 15.1.0、zlib 1.3.1、libxml2 2.13.5 | xim-pkgindex 架构配方、runtime exports、冷安装 |
489+
| C++ 标准库 | 生成程序使用 libc++、libc++abi、libunwind 与 compiler-rt;gcc-runtime 服务工具自身的 GNU 运行依赖 | 两仓库分别验证工具进程和产物的 ELF 闭包 |
490+
| 架构选择 | metadata 与 install 使用一致的客户端进程 ABI;新增 ARM64 不宣称旧 LLVM 版本具有资产 | 必要 xlings 修复、索引能力下界、mcpp 可用性过滤 |
491+
| 原生支持等级 | GNU 行完成实际编译、模块、运行、自举与 pack 后才提升为 verified | mcpp 原生 ARM64 准入与 matrix 实测 |
492+
| 已有配置 | 保留用户选择;musl 到 GNU 的迁移显式修改工具链及 target | mcpp 配置优先级与迁移复验 |
493+
494+
完整 glibc 包同时交付 loader、核心库、CRT、开发头、linker scripts、
495+
gconv、locale 和时区数据。NSS 使用受管实现,宿主身份与网络配置仍是
496+
明确输入。不能用只有 libc 的归档作为完整生态交付。
497+
498+
Linux x86_64 保留 GCC 默认,其他 Linux 架构保留既有选择,显式
499+
aarch64-musl 静态发布继续验证。本阶段必要消费者包括 C ABI 库、
500+
mcpp 自举、代表性 mcpp-index 成员及 openkal;完整 GUI 栈、native
501+
GCC、跨宿主 GNU sysroot、llvm-dev/SPIRV 和 latest 语法另行立项。
502+
503+
### 13.2 发布与验收顺序
504+
505+
1. 冻结来源与包版本,在原生 ARM64 上构建并验证资源。归档、GLOBAL
506+
重下载与 CN 重下载的摘要逐文件一致后,才启用公开索引路由。
507+
2. 发布必要客户端修复,验证架构上下文、旧索引回退及新客户端下界。
508+
两仓库用候选索引联测,避免依赖公开默认提前切换。
509+
3. 验证工具启动、C/C++、`import std`/`std.compat`、异常、线程、原子、
510+
冷 home 默认、自举单测、host tool、系统 C ABI、pack 与 openkal。
511+
头文件搜索、INTERP 和 loader 实际路径须证明使用受管闭包。
512+
4. 最终提交完成原平台回归与全部必要准入;原生 GNU 行依据实测提升,
513+
然后合入并发布。失败、挂起与 SKIP 均不能作为该门通过。
514+
5. 使用发布版执行 GLOBAL/CN 冷消费与 `xlings subos … --sandbox --cmd …`
515+
复验,记录隔离后端及有效索引。随后按 SPEC-009 §10.7 移动 latest。
516+
517+
若准入失败,保留候选精确版本用于诊断,不发布新的默认承诺。已发布
518+
内容发生错误时使用新版本或具名 revision 修复,保持原资产摘要不变。
519+
520+
### 13.3 当前证据边界
521+
522+
以下状态于本次写入前通过 GitHub API 核查,不表示整体验收通过。
523+
524+
| 对象 | 已核查状态 | 仍需闭合 |
525+
|---|---|---|
526+
| [xlings #647](https://github.com/openxlings/xlings/pull/647) | 已合入;[v2026.10.8.1](https://github.com/openxlings/xlings/releases/tag/v2026.10.8.1) 已公开发布 | 生态最终消费与索引兼容链复验 |
527+
| [原生资源构建 37689904325](https://github.com/openxlings/xim-pkgindex/actions/runs/37689904325) | completed / success | 最新准入逻辑、最终公开资产及双镜像消费 |
528+
| [xim-pkgindex #938](https://github.com/openxlings/xim-pkgindex/pull/938) | draft/open,头 `d0e4af9d` | ARM64 公开路由与最终消费验收 |
529+
| [mcpp #781](https://github.com/mcpp-community/mcpp/pull/781) | draft/open,公开头 `bed48766`;[该头 CI](https://github.com/mcpp-community/mcpp/actions/runs/37690944669) 为 failure | Windows 失败根因、候选原生 GNU 全链与最终头回归 |
530+
531+
Windows 驱动与辅助前端的现场摘要已经证明与钉住的归档一致。
532+
此前单文件诊断被 shim 覆盖,第 12.4 节已撤回版本不一致的推断。
533+
后续按 payload 和 shim 分开记录,并比较真实编译及长路径/8.3 路径;
534+
Defender 排除和资产重发均不作为缺乏证据时的默认修法。
535+
536+
维护者重点评审三项:是否接受上述原生 GNU 默认组合、是否接受完整
537+
glibc 依赖范围、是否接受以原生生态消费及发布后 CN 复验作为准入条件。
538+
539+
## 14. 2026-10-08 aarch64 LLVM 宿主与 openkal 跨平台生态补充
540+
541+
本节响应维护者新增要求:原生 ARM64 LLVM 就绪后,以 Linux aarch64
542+
作为开发宿主,使用 mcpp 与 openkal 从源码构建目标运行时及应用,覆盖
543+
Windows、macOS 与 x86_64 Linux。该范围补充第 9 节的边界:本轮纳入
544+
openkal 图供应的交叉链,普通 payload GNU cross sysroot 仍另行验收。
545+
546+
### 14.1 宿主 glibc 与目标运行时的关系
547+
548+
这条路线在架构上成立,但 LLVM 可启动只是前置条件。aarch64 LLVM
549+
23.1.3 的 glibc、libstdc++、libgcc_s 等运行依赖服务编译器进程;目标
550+
程序的内核接口、C 库、C++ 运行时由依赖图独立供应。宿主 glibc
551+
不会因此成为 Windows、macOS 或 openkal-musl 产物的运行依赖。
552+
553+
```mermaid
554+
flowchart TD
555+
A[Linux aarch64 受管 glibc] --> B[宿主 LLVM 23.1.3 与构建工具]
556+
B --> C[mcpp 解析目标和依赖图]
557+
C --> D[按目标构建 openkal 平台实现]
558+
C --> E[按目标构建 openkal-musl]
559+
C --> F[按目标构建 openkal-llvm-runtime]
560+
D --> G[目标应用编译与链接]
561+
E --> G
562+
F --> G
563+
G --> H[Windows PE]
564+
G --> I[macOS Mach-O]
565+
G --> J[Linux ELF]
566+
H --> K[对应目标系统运行验证]
567+
I --> K
568+
J --> K
569+
```
570+
571+
已检查的 mcpp-index 配方将 openkal-llvm-runtime 描述为源码包,其
572+
manifest 依赖 openkal-musl,再由后者按目标选择平台实现。mcpp 在
573+
目标图解析与构建计划中编译这些来源,不要求先安装每种目标的完整
574+
GCC 工具链。用户仍须声明该依赖并选择目标;安装普通 LLVM 不会为
575+
所有项目自动改用 openkal,也不会将项目全部依赖自动变为可移植。
576+
577+
host tool 与 build.mcpp 在 aarch64 宿主运行,运行时和应用对象按
578+
target 编译。生成程序需要的 loader、CRT、链接符号与系统导入来自
579+
目标图或明确目标系统契约,不能由宿主 glibc、头文件或 SDK 偶然补齐。
580+
Clang 后端、lld 格式支持与依赖构建脚本也分别检查,不能仅凭
581+
`clang --version` 宣告整条交叉链可用。
582+
583+
### 14.2 目标范围与支持声明
584+
585+
| ARM64 Linux 开发宿主上的目标 | 目标侧供应 | 本轮验收与声明边界 |
586+
|---|---|---|
587+
| 原生 aarch64 Linux openkal | openkal-linux、openkal-musl、openkal-llvm-runtime | 原生构建与运行;独立于默认 GNU/glibc 产物验收 |
588+
| x86_64 Linux openkal | 相应 x86_64 平台接口、musl 与 C++ runtime | ARM64 上交叉构建;x86_64 Linux runner 实际运行并检查闭包 |
589+
| x86_64 Windows openkal | openkal-windows、musl、C++ runtime 与目标导入库 | PE、x64 machine、异常与 TLS/线程;Windows runner 实际运行 |
590+
| aarch64 macOS openkal | openkal-macos、musl、C++ runtime 与目标启动/系统契约 | Mach-O、arm64、依赖清单;macOS ARM64 runner 实际运行 |
591+
| x86_64 macOS 或其他架构 | 需要相应平台实现、汇编、ABI 与运行时覆盖 | 不从 ARM64 macOS 成功推导;逐目标新增实测后公布 |
592+
593+
Windows 的新推荐公开目标名为 `x86_64-windows-musl`,沿用旧
594+
`x86_64-windows-gnu` 的示例属于兼容路径,不表示链接了 MinGW CRT。
595+
同理,历史 `x86_64-linux-gnu` 名称的示例若报告 c-abi 来自图中的
596+
musl,应按实际解析层描述,不能计作普通 glibc cross 支持。
597+
macOS 生成 Mach-O 不等于任意 Apple 框架、SDK 或所有 POSIX 功能可用;
598+
程序可用接口以 openkal 实现与依赖的能力声明为准。
599+
600+
### 14.3 跨仓库任务依赖与原生证明
601+
602+
1. xim-pkgindex 完成 ARM64 LLVM 工具、受管宿主 glibc 与配套依赖
603+
的安装准入;这是编译器及宿主构建程序运行的前置条件。
604+
2. mcpp 的 ARM64 原生门验证 openkal-linux/musl/C++ runtime 从图
605+
构建并实际运行,报告 kernel-abi、c-abi、c++-abi 的供应者。
606+
3. 在现有 openkal-cross 工作流增加 Linux aarch64 构建宿主,保持
607+
同一应用源码,生成既有 Windows、macOS、x86_64 Linux 三种产物。
608+
使用本 PR 当前提交的 mcpp 和精确 LLVM 23.1.3,记录生态来源 SHA。
609+
4. 将这三个交叉产物送到对应 Windows、macOS ARM64、Linux x86_64
610+
runner 运行;运行 job 不安装编译器或额外 C/C++ runtime。检查输出、
611+
架构、异常展开与目标依赖,构建成功和目标运行成功分别计数。
612+
5. 对代表性 mcpp-index 软件重复原生与所承诺交叉路径,记录不满足
613+
openkal 能力契约的库。缺失平台接口和目标运行能力不得变成绿色 SKIP。
614+
6. 发布后在 CN SubOS sandbox 中重做 ARM64 原生与交叉构建,并以
615+
对应目标系统运行证据完成闭环;本地不能运行某目标时保留外部 runner
616+
证据,不将文件格式检查代替实际执行。
617+
618+
已有三宿主 openkal-cross 证明的是原来的宿主集合,不覆盖新增的
619+
Linux aarch64 编译器进程和宿主构建程序。286 的单个原生 Linux
620+
静态程序也不证明 ARM64 到 Windows/macOS/x86 Linux 的交叉链。
621+
只有新增宿主列及目标系统运行全部通过后,才能公布这条开发路线已验证。

‎.agents/docs/2026-10-08-llvm-2313-part2-execution-and-dependencies.md‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,65 @@ overlay、本地校验和安装复用同一进程 ABI 上下文。PR 已 squash
116116
[2026.10.8.1 发布工作流](https://github.com/openxlings/xlings/actions/runs/37690643833)
117117
已经启动。发版成功、CN 补传、索引传播和 mcpp bootstrap pin 前移仍须
118118
以公开资源与消费证据证明。
119+
120+
## 7. 2026-10-08 客户端就绪与候选消费准入
121+
122+
xlings v2026.10.8.1 已公开发布,四平台构建及候选发布物检查通过。
123+
本地补传 CN 后,四个平台的 GLOBAL/CN 二进制重下载摘要均与发布
124+
sidecar 一致。必要索引收尾 [#939](https://github.com/openxlings/xim-pkgindex/pull/939)
125+
在 17 个检查通过、1 个版本变更门按契约跳过后合入 `f8ad78a0`。
126+
mcpp 的客户端钉点与全部当前 CI/release 读取者前移至这个已发布版本;
127+
mcpp 自举 pin 仍保持已发布的 2026.9.24.1。版本钉点检查通过。
128+
129+
第 6 节关于 Windows 驱动版本不一致的推断在此撤回。两轮诊断循环
130+
枚举了 payload 和 SubOS shim,却使用同名报告,shim 覆盖了 payload
131+
结果。`bed48766` 的现场摘要证明 payload g++ 与 cc1plus 均与钉住的
132+
GCC 16.1.0 归档一致。新诊断分别保存驱动与 shim,并执行真实 C++
133+
编译及 PowerShell 长路径/8.3 路径对照;根因尚未确定。
134+
135+
`bed48766` CI 的 Linux 第三分片、两镜像 macOS 第一分片与 Windows
136+
第三分片共同失败于 233:benchmark 常量为 LLVM 23.1.3,而 matrix
137+
仍钉旧版本。当前 matrix 两个 LLVM 钉点同步,检查器支持现有常量
138+
引用;完整 233 本地通过。历史测量与历史源码 pin 保持原记录。
139+
140+
受管 Clang 头文件策略增加 `-nostdlibinc`,同时覆盖 driver config
141+
与 mcpp 显式 compile tokens,修复 revision 为 hermetic-5-managed-headers。
142+
本地真实 compile database 与预处理追踪确认 glibc、UAPI、resource
143+
来自受管路径;宿主 sqlite3.h 存在,受管策略拒绝,而 ambient 控制
144+
可读。linkmodel 17/17、133 freestanding、804 host helper 和 GCC musl
145+
编译运行通过。该证据属于本地 x86_64,不能替代原生 ARM64 准入。
146+
147+
为解除候选索引与 mcpp 合入的依赖环,已有 ARM64 fresh-install
148+
workflow 增加手动候选入口:使用明确索引 ref 和当前 mcpp 提交的成功
149+
原生 build artifact。入口验证来源仓库、完整 commit、workflow、原生
150+
成功 job 与唯一未过期 artifact,分别为外层 home 和冷 home 注入候选
151+
索引并核对有效 registry。5 个合同测试通过。普通发布版 cold-install
152+
入口继续消费公开索引;手动候选证据不能替代发布后的冷消费。
153+
154+
索引原生来源构建 [37689904325](https://github.com/openxlings/xim-pkgindex/actions/runs/37689904325)
155+
已成功。最新准入首次执行在九份归档摘要全部通过后发现检查清单错误:
156+
要求了 Unix carve 未交付的 llvm-strings。该工具属于现有 Windows
157+
manifest,已修正准入清单而保持来源构建和资源字节不变。后续使用
158+
同一成功来源构建重跑准入;公开上传仍依赖全部原生门通过。
159+
160+
## 8. 2026-10-08 原生资源准入与 openkal 宿主扩展
161+
162+
[37695531148](https://github.com/openxlings/xim-pkgindex/actions/runs/37695531148)
163+
的 native-assets job 已通过,准入提交为 `984d468b`,来源提交为
164+
`6ebe2179`。九份归档摘要核验,13 个工具进程的受管依赖、宿主头文件
165+
负向门、默认 Tokyo/UTC、C.UTF-8、GBK、NSS、CRT,以及 std/std.compat
166+
编译和程序运行均通过。上次数据门失败来自准入脚本误拼预留前缀;
167+
这次匹配源码与配方实际的 255 字节占位串,并断言替换发生。原归档
168+
字节保持不变。该成功 job 已触发 GLOBAL 上传;尚不构成公开索引启用。
169+
170+
候选 mcpp 原生入口继续增加真实 GNU 自举:当前头 ARM64 build artifact
171+
编译 LLVM 23.1.3 GNU mcpp,再由该新二进制运行完整单测、LLVM path
172+
host helper、四个真实索引成员和 openkal。消费者命令显式带工具链
173+
与 GNU target;6 个合同测试通过。本地当前代码自举 93.57 秒成功。
174+
以上 workflow 内容尚须原生 runner 执行,不能将配置检查计为生态消费通过。
175+
176+
维护者新增 aarch64 开发宿主的 openkal 交叉路线,已加入方案第 14 节。
177+
既有 openkal-cross 扩为四宿主乘三目标,新增 ARM64 Linux 构建列,
178+
目标系统分别运行全部四宿主产物;运行 job 不安装工具链或 C/C++ runtime。
179+
源码 SHA、候选 LLVM 与输出架构均留下证据,原生 286 仍单独验收。
180+
12 个构建和运行组合尚未实跑,不从旧三宿主结果推导新增列已通过。

‎.github/actions/bootstrap-mcpp/action.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ inputs:
3333
# `package.name`, so one of the two was simply unreachable — and which one
3434
# depended on the machine, which is why CI failed on `compat:lua` on
3535
# Windows and `mcpplibs.capi:lua` on Linux. Never pin below that.
36-
default: '2026.9.30.1'
36+
default: '2026.10.8.1'
3737

3838
outputs:
3939
sandbox-key:

‎.github/actions/setup-macos-llvm/action.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ inputs:
1515
# Floor imposed by the index, not a routine bump — see
1616
# .github/actions/bootstrap-mcpp/action.yml for why 0.4.69 is required
1717
# (two packages named `lua` in one repo need openxlings/xlings#381).
18-
default: '2026.9.30.1'
18+
default: '2026.10.8.1'
1919
image:
2020
description: >
2121
The runner label the job runs on (macos-15, xcode-27). It is part of the

‎.github/tools/check_aarch64_llvm_payload.sh‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,19 @@ set -euo pipefail
55
echo 'FAIL: this gate requires a native Linux aarch64 host'; exit 1;
66
}
77
MCPP="${MCPP:-mcpp}"
8+
index_seed="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/seed_native_xim_index.py"
9+
seed_candidate() {
10+
[[ -n "${MCPP_NATIVE_XIM_INDEX:-}" ]] || return 0
11+
python3 "$index_seed" "${MCPP_HOME:-$HOME/.mcpp}" "$MCPP_NATIVE_XIM_INDEX"
12+
}
13+
verify_candidate() {
14+
[[ -n "${MCPP_NATIVE_XIM_INDEX:-}" ]] || return 0
15+
python3 "$index_seed" --verify "${MCPP_HOME:-$HOME/.mcpp}" "$MCPP_NATIVE_XIM_INDEX"
16+
}
17+
# Optional only for manual cross-repository admission; normal CI keeps main.
18+
seed_candidate
819
"$MCPP" toolchain install llvm 23.1.3
20+
verify_candidate
921
MCPP_E2E_LLVM_VERSION=23.1.3 source tests/e2e/_toolchain_env.sh
1022
[[ -x "$LLVM_ROOT/bin/clang++" ]] || { echo 'FAIL: LLVM frontend missing'; exit 1; }
1123
file -L "$LLVM_ROOT/bin/clang++" | grep -q 'ARM aarch64' || {
@@ -17,8 +29,10 @@ report="${MCPP_NATIVE_REPORT_DIR:-${RUNNER_TEMP:-$work}/native-llvm-arm64}"
1729
mkdir -p "$report"
1830
trap 'rm -rf "$work"' EXIT
1931
export MCPP_HOME="$work/mcpp-home"
32+
seed_candidate
2033
"$MCPP" self config --mirror "${MCPP_E2E_MIRROR:-GLOBAL}"
2134
"$MCPP" self env --format json | python3 -c 'import json,sys; d=json.load(sys.stdin); assert d["data"]["defaultToolchain"] == "llvm@23.1.3", d'
35+
verify_candidate
2236
"$MCPP" new "$work/native-probe"
2337
mkdir -p "$work/nativeabi/src"
2438
cat > "$work/nativeabi/mcpp.toml" <<'TOML'

0 commit comments

Comments
 (0)