2026-05-15 — 收尾三个遗留项,一个 PR 完成
现状:import std.compat 在语法层面被识别(is_std_module() 返回 true),会触发 std BMI 构建。但 std.compat.cppm(Clang)/ bits/std_compat.cc(GCC)从未被发现和编译,没有独立的 BMI 产出。
Clang:~/.mcpp/.../xim-x-llvm/20.1.7/share/libc++/v1/std.compat.cppm 存在。需要 --precompile 编译为 pcm.cache/std.compat.pcm + std.compat.o。
GCC:bits/std_compat.cc 在当前 xlings GCC 16.1.0 包中不存在。GCC 的 import std.compat 由 bits/std.cc 隐式覆盖(编译 std.cc 自动产出 std.compat 的 gcm)。因此 GCC 不需要额外处理。
改动点:
Toolchain新增stdCompatSource(可选路径)clang.cppm::find_libcxx_std_module_source→ 同时查找std.compat.cppm路径clang.cppm::enrich_toolchain→ 设置stdCompatSourcestdmod.cppm→ 若stdCompatSource非空,额外编译std.compat.pcm+std.compat.oBuildPlan新增stdCompatBmiPath+stdCompatObjectPathninja_backend.cppm→ 当 Clang + 有 std.compat 时,stagestd.compat.pcm和std.compat.oflags.cppm→ 若有 std.compat,加-fmodule-file=std.compat=<pcm>- E2E 测试:在
38_llvm_modules.sh或新增测试中用import std.compat验证
GCC 不变:GCC 的 import std.compat 已经通过 bits/std.cc 的隐式 gcm 工作,无需额外构建。
之前失败原因:经调查,CI 失败是 GitHub Actions 缓存 fallback restore(restore-keys 匹配到旧 commit 的 target/),导致 gtest .o 是旧的但 ninja 认为 up-to-date。与 restat 无关 — PR #35 第二次运行(无任何代码改动)就成功了。
方案:重新实现 backup-compare-restore + restat = 1,与 cxx_module 的 BMI 保留模式完全一致。
改动点:ninja_backend.cppm 的 cxx_scan rule。
改动点:增强 tests/e2e/39_llvm_incremental.sh,新增一个验证步骤:
- touch
greet.cppm但不改内容 - rebuild with verbose
- 验证 SCAN 跑了但 MOD/OBJ 没跑(restat 截断了级联)
所有改动在一个 PR 中,按以下顺序实施。
model.cppm:Toolchain加stdCompatSource字段clang.cppm:find_libcxx_std_compat_source()+enrich_toolchain填充clang.cppm:std_compat_build_commands()— 两步编译(同 std)clang.cppm:std_compat_bmi_path()/staged_std_compat_bmi_path()
plan.cppm:BuildPlan加stdCompatBmiPath+stdCompatObjectPathstdmod.cppm:若tc.stdCompatSource非空,额外编译cli.cppm:prepare_build中把StdModule的 compat 路径传入 planninja_backend.cppm:stagestd.compat.pcm+std.compat.o(cp_bmi 边)flags.cppm:Clang 时加-fmodule-file=std.compat=<staged_pcm>
ninja_backend.cppm:backup-compare-restore +restat = 1
- 新增
tests/e2e/41_llvm_std_compat.sh:import std.compat+ C 函数使用 - 增强
tests/e2e/39_llvm_incremental.sh:touch 零重编验证
- GCC std.compat 额外构建 — GCC 的
bits/std.cc隐式覆盖 - 改 E2E 04_incremental.sh(GCC) — 已有且工作正常
- macOS / Windows — 远期