Skip to content

两处只写不读/不生效的死字段:CompileFlags::contractByRole 与 TargetEntry::cxxRuntimeTests #418

Description

@speak-agent

两处结构体字段存在、被填、但没有任何消费方。都是既有的,#414 review 时撞见,
当时没顺手清理 —— 删公开结构体字段不该混进一个修缺陷的 PR。

1. CompileFlags::contractByRole 只写不读

src/build/flags.cppm:

:62   std::array<mcpp::build::dist::Contract, kRoleCount> contractByRole{};
:862  f.contractByRole[i] = r.effective;      ← 唯一一次出现,是写

全仓再无读取点(grep -rn 'contractByRole' src/ tests/ 只有这两行)。

它记录的是"每个角色实际拿到的契约(降级之后)",是个有价值的观测量 —— 所以
这里有两条路,不是只能删:

  • 删掉,等真有消费方时再加回来;或
  • 接出去:写进 resolution.json,让 mcpp why / doctor 能回答"这个产物到底
    是不是 self-contained"。目前用户只能靠 readelf 自己看。

倾向后者 —— #414 之后共享库的契约按格式分档,"我这个 .so 到底拿到了哪一档"是个
用户会真的问的问题。

2. TargetEntry::cxxRuntimeTests 既不解析也不生效

src/manifest/types.cppm:622 声明了它,但:

  • src/manifest/toml.cppm:1358 的 [target.<triple>] 解析只读 cxx_runtime
    (标量),从不读 cxx_runtime_tests / 表形式
  • src/build/prepare.cppm:1472-1473 应用时也只应用 cxxRuntime

即:写在 manifest 里的 per-target tests 契约不会有任何效果,而字段的存在让人以为可以。

注:#414 给 [build].cxx_runtime 加 shared 键时刻意没有往 TargetEntry 里
再塞一个同样的死字段;per-target 通道目前只支持标量拼写,而标量已经覆盖所有角色
(它会成为 project-wide explicit)。

建议:删掉 TargetEntry::cxxRuntimeTests,或把 [target.<triple>].cxx_runtime
的表形式解析补全(与 [build].cxx_runtime 对齐,含 default/tests/shared)。
两者都行,当前状态不行 —— 一个不生效的配置项比没有更糟。

判据

  • 要么该字段有真实消费方并被测试覆盖
  • 要么它不存在

背景

Activity

  1. speak-agent commented on Aug 31, 2026

    @speak-agent
    MemberAuthor

    两条都已处理,随 2026.8.15.1(commit c459cf2)发布 —— 关闭得晚了,补记在此。

    判据是 issue 自己写的那两行:「要么该字段有真实消费方并被测试覆盖,要么它不存在」。两条各按 issue 倾向的方案落地,不是统一删掉。

    1. CompileFlags::contractByRole —— 接出去

    写进 resolution.json 的 runtime.cxx_runtime_by_role(src/build/prepare.cppm:9694 起)。记的是降级之后的解析值,因为「请求被降级了」正是值得被看见的那一格。另有第二个消费方 src/pack/pipeline.cppm:167。

    理由与 issue 一致:#414 之后共享库角色可以合法地落在与旁边的可执行文件不同的档位上,「我这个 .so 到底拿到了哪一档」是用户会问的问题,而在此之前唯一的答案是自己跑 readelf 去推。

    2. TargetEntry::cxxRuntimeTests —— 删

    已删除。modules/manifest/src/types.cppm:826 留了一句说明,写清楚这里没有 per-role 字段以及为什么:per-target 通道只承载标量契约,[build].cxx_runtime 的表形式已经覆盖角色拆分。

    顺带补上了这条 issue 没有要求、但让删除成立所必需的一半:[target.<triple>] 此前没有任何未知键检查,所以删掉字段之后写 cxx_runtime_tests 仍然会被静默吞掉 —— 那是同一个缺陷换了个位置。现在它被报出来,单测在 tests/unit/test_manifest.cpp:3679。

    实施时确认过 issue 提醒的那一点:cxxRuntimeTests 这个名字下有两个字段,BuildConfig::cxxRuntimeTests 是活的(toml.cppm 解析、flags.cppm 读),没有被误删。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions