Commit d4a8324
authored
2026.9.8.1: a package's host modules are ordered by what they import, and the design document aligned with what shipped (#589)
* 2026.9.8.1: a package's host modules are ordered by what they import
一个 host-module 包贡献的那些单元,过去按**路径**排序:lib root 在前,其余按
`std::set<path>` 的字母序。而 `build_program.cppm` 是一边编译一边累积模块旗标的,
每个单元只看得见排在它前面的那些 BMI。于是 `rules/spirv.cppm` 排在
`src/declare.cppm` 之前,一个 import 了本包共享单元的成员先被编译,失败于:
failed to read compiled module: No such file or directory
note: imports must be built before being imported
**两个方向都复现过**:把共享单元改个名让它的路径排在前面,同一个包就构建通过。所以
成因是那次排序,不是别的。
它的代价不是一次失败,而是一个基于误读的设计决定
------------------------------------------------
`mcpp:plugins` 把这个失败读成「第二个单元根本不会被编译成 host module」,于是把成员
共享的一切都折进 lib root,让它从约二十行涨到约七百行(该包设计文档 §13.1.1 把这笔
代价记了下来,连同那个错误的成因)。真正的成因是一次排序。
修法
----
按 import 图拓扑排序,并以**路径序做稳定次序**:没有包内 import 时结果与今天逐字相同,
只有在今天已经坏掉的情形下才不同 —— 对既有包严格更安全。
`declared_imports` 与它旁边的 `declared_interface_name` 同形:按行、认注释、刻意浅。
它回答的是「本包哪些单元必须排在这个之前」,任何不是本包单元的名字由调用方丢弃。它不是
模块扫描器的替代品。
环留给编译器报。那是 ill-formed C++,编译器会点名那两个单元;在这里拒绝只会把同一个
事实报在更差的位置,而顺序错这件事无论如何已经不可能发生了。
判据
----
e2e 633 两条腿:
1. 一条**完全逆序**的链 —— 三个单元的 import 序与路径序恰好相反。路径排序下每一个
都排在它 import 的东西前面;import 排序下每一个都排在后面。除了顺序没有别的东西
决定它建不建得起来。判据是三个模块共同算出的那个值,经 `mcpp::warning` 输出 ——
那是构建成功时唯一会被打印的构建程序通道。
2. 包内无 import 的情形必须保持原次序。不是装饰:一个忽略原次序的拓扑排序可以吐出
任意合法序,于是今天能用的包会被无理由重排,而且是静默的。
把修复退回路径排序,第一条腿如实变红。
* device_extensions and rule_module are read, and were reported as unsupported
同一个解析器往上约四十行就把这两个键读进 `featureDeviceExtensions` 与
`featureRuleModule`,prepare 在消费者激活该 feature 时会读它们 —— 它们正是「新增一门
设备语言不需要引擎发版」的全部依据。它们只是没被加进 `kKnownFeatureKeys`,于是引擎对
一个它刚刚用过的键打印:
[features].rules-spirv has unsupported key 'rule_module' (ignored).
Supported keys: defines, flags, forward, implies, provides, requires, sources.
比消息错更坏:它在**建议包作者删掉让规则生效的那两行**。
没被发现,是因为规则包平时走的 host-module 路径不打印 schema 警告;而**普通**构建会
打印。当一个规则包开始产出 `tools = [...]` 要的二进制,它的普通构建就成了常态,这条
噪音于是浮到每个用户面前。
* docs(plan): the design document, aligned with what shipped
`.agents/docs/2026-09-07-module-first-heterogeneous-surface.md` 已经变成一个标题下的
**四份文档**:第 1–12 节是写在早于发布的 base commit 上的设计,第 13 节是计划与实施
记录,第 14 节是现状登记。读到前面就停下的人会被误导,而这份文档正是别人理解这套设计
的入口。
十四处就地更正,分三类
----------------------
**被设计后撤回的语法。** `[rules]` 这张 manifest 表从未实现也不打算实现(该文 13.1.2
给了论证,`grep '"rules"' modules/manifest/src/toml.cppm` 为空),而 §5.2、§5.5、§6、
§8.D 仍在按它写。指向真正发布的形状:`options::module_name`、`options::surface`、
读 `MCPP_LANGUAGE_MODULES` 的 `default_surface()`。
**以不同形状发布的机制。** §4.1 提的是「给 embed 一个由图调起的宿主工具二进制」;
发布的是在 build.mcpp 里调用的库形态 —— 而它在 plan 期写 `.S`,正是 14.1 那条边存在
的原因。§4.3 写下了正确的要求,又加了「与 depfile 那一项共用同一个修法」,而那五个字
是错的:实测三条通道,只有 GNU as 报 `.incbin`,clang 的集成汇编器根本没有依赖输出。
**已关闭却仍列为 open 的条目。** §1 的三条里两条已发布;§3.5 还在断言那个字段不存在;
§7 的四条里三条已解决;§12 描述的 Slang 规则已经发布。
不删掉,因为一个论证被否决也是它记录的一部分,一个设计在接触现实时变的形,同样是。
状态只在一处陈述:「哪些规则传了 depfile」活在 §14.2,不在别处 —— 三份拷贝就是它变化
时要记得改的三处。
§14 是唯一的现状登记表
----------------------
14.1 与 14.2 标为 CLOSED 并保留分析(14.1 的两半是可迁移的:一条要求被写下然后丢失,
以及第一次测量问错了工具)。新增 14.7(§5.6 承诺、§8.C 说要在同一次改动里加、结果既
没做也没登记的 `--no-accel` 诊断)与 14.8(L0 的现状,以及它的代价为什么是引擎侧的)。
新增 13.2.1 记这一批的跨仓波次。
14.1 按最终形态重写:缺陷在已发布生态里的沙箱复现、它为什么不是新发现、问错工具那次
测量、以及为什么最后**不需要**新引擎通道 —— 成因是生成跑在错误的时刻,不是引擎表达
不了那条边。
---------
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>1 parent 716cce1 commit d4a8324
8 files changed
Lines changed: 837 additions & 36 deletions
File tree
- .agents/docs
- modules
- buildmcpp/src
- manifest/src
- versioning/src
- src/build
- tests/e2e
Lines changed: 449 additions & 32 deletions
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
8 | 60 | | |
9 | 61 | | |
10 | 62 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
357 | 357 | | |
358 | 358 | | |
359 | 359 | | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
360 | 422 | | |
361 | 423 | | |
362 | 424 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
837 | 837 | | |
838 | 838 | | |
839 | 839 | | |
| 840 | + | |
| 841 | + | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
| 850 | + | |
| 851 | + | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
840 | 859 | | |
841 | 860 | | |
842 | 861 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7634 | 7634 | | |
7635 | 7635 | | |
7636 | 7636 | | |
| 7637 | + | |
| 7638 | + | |
| 7639 | + | |
| 7640 | + | |
| 7641 | + | |
| 7642 | + | |
| 7643 | + | |
| 7644 | + | |
| 7645 | + | |
| 7646 | + | |
| 7647 | + | |
| 7648 | + | |
| 7649 | + | |
| 7650 | + | |
| 7651 | + | |
| 7652 | + | |
| 7653 | + | |
| 7654 | + | |
| 7655 | + | |
| 7656 | + | |
| 7657 | + | |
| 7658 | + | |
7637 | 7659 | | |
7638 | 7660 | | |
7639 | 7661 | | |
7640 | 7662 | | |
7641 | 7663 | | |
7642 | 7664 | | |
7643 | 7665 | | |
7644 | | - | |
| 7666 | + | |
| 7667 | + | |
7645 | 7668 | | |
7646 | | - | |
| 7669 | + | |
7647 | 7670 | | |
| 7671 | + | |
| 7672 | + | |
| 7673 | + | |
| 7674 | + | |
| 7675 | + | |
| 7676 | + | |
| 7677 | + | |
| 7678 | + | |
| 7679 | + | |
| 7680 | + | |
| 7681 | + | |
| 7682 | + | |
| 7683 | + | |
| 7684 | + | |
| 7685 | + | |
| 7686 | + | |
| 7687 | + | |
| 7688 | + | |
| 7689 | + | |
| 7690 | + | |
| 7691 | + | |
| 7692 | + | |
| 7693 | + | |
| 7694 | + | |
| 7695 | + | |
| 7696 | + | |
| 7697 | + | |
| 7698 | + | |
| 7699 | + | |
| 7700 | + | |
| 7701 | + | |
| 7702 | + | |
| 7703 | + | |
| 7704 | + | |
| 7705 | + | |
| 7706 | + | |
| 7707 | + | |
| 7708 | + | |
| 7709 | + | |
| 7710 | + | |
| 7711 | + | |
| 7712 | + | |
7648 | 7713 | | |
7649 | 7714 | | |
7650 | 7715 | | |
| |||
0 commit comments