|
1 | 1 | # 一个包一个版本:xlings 地址的身份,以及 2026.9.6.5 之后的文档对齐 |
2 | 2 |
|
3 | | -> 状态:设计,未实现。本文的每一条「现状」都标注了它是**读**出来的还是**跑**出来的。 |
| 3 | +> 状态:**已实现**(mcpp 2026.9.6.6 / mcpp-plugins 0.2.4)。§10 是实现期的实测回填, |
| 4 | +> 其中三条推翻了本文正文。原文保留,不回改——被推翻的判断本身是这份记录的一部分。本文的每一条「现状」都标注了它是**读**出来的还是**跑**出来的。 |
4 | 5 | > 伴随文档:`2026-09-07-general-build-infrastructure-gaps-design.md`(§15 记录了本轮 |
5 | 6 | > 五处缺口),本文处理它遗留的第六处,以及随之而来的文档与生态对齐。 |
6 | 7 |
|
@@ -256,3 +257,88 @@ pin 让这条依赖变成一个没人核过的假设。 |
256 | 257 | 第四处形状不同:**我把「这里有真实的复杂度」读成了「这里应该保持现状」。** 12.9 与 |
257 | 258 | 13.x 的驱动下界差异是真的,但它论证的是「工程要能覆盖」,而我拿它论证了「规则不该有 |
258 | 259 | 默认」——同一个事实支持的是相反的结论。 |
| 260 | + |
| 261 | +## 10. 实现期的实测回填 |
| 262 | + |
| 263 | +写下来的四条里,有三条改了正文的结论。 |
| 264 | + |
| 265 | +### 10.1 `xpkg_dir` 根本回答不了范围 —— 方案漏了这条 |
| 266 | + |
| 267 | +§1.1 只测了「范围被**供给**」,没测「范围被**回答**」。实现时才发现 |
| 268 | +`xpkg_payload_at` 把整个版本位当目录名比对:`>=8.5.0` 装上了载荷,然后回答 |
| 269 | +`nullopt`。 |
| 270 | + |
| 271 | +**这是让规则包无法声明下界的那道缝,而整份 §6 建立在它之上。** 少了这一处修复, |
| 272 | +`[feature-xlings]` 里写 `>=` 的规则会「声明、装上、然后找不到」。 |
| 273 | + |
| 274 | +形状是熟悉的一种:**判据只走了一半的路**。供给与查询是同一条链的两端,而 §1.1 的两个 |
| 275 | +方向都落在供给那一端 —— 反向腿(`>=2099.1` 被拒)证明了范围被求解,却完全不涉及求解 |
| 276 | +之后谁去读它。 |
| 277 | + |
| 278 | +修法:版本位是常量就先按目录名精确匹配(保留「钉了就是钉了」,也保留 `8.0.RC1` 这类 |
| 279 | +解析不了的拼法可寻址),是约束就在已安装的版本里挑满足它的最高一个。判据里有一条 |
| 280 | +**双侧有界**的范围 —— 只用下界的话,一个忽略约束直接取最新的实现照样通过。 |
| 281 | + |
| 282 | +### 10.2 落败的精确钉不是「违反」,只有被陈述的**要求**才是 |
| 283 | + |
| 284 | +正文 §2.3 写「赢家必须满足其余每一条**约束**」。按字面实现,两条互不相同的精确钉会 |
| 285 | +互相「违反」,于是**每一个「依赖钉了某工具、工程也钉了」的组合都在升级当天变成硬 |
| 286 | +失败** —— 而那个分歧正是 §2.2 的裁决存在的理由。 |
| 287 | + |
| 288 | +改成:`>=` / `^` / `~` / 逗号组合是**要求**,可以被违反;不带运算符的裸版本是**选择**, |
| 289 | +由裁决处理并被报告。§2.3 的例子本来就是「钉 vs 下界」,所以这是把正文的措辞收紧到它 |
| 290 | +自己的例子上。 |
| 291 | + |
| 292 | +**这条不对称随后成了机制。** 规则包写精确版本 = 提供一个默认;写 `>=` = 陈述一条要求。 |
| 293 | +同一个字段承载两种意图,而使用侧看到的行为恰好不同:覆盖默认是安静的,击穿要求是被 |
| 294 | +拒绝的。 |
| 295 | + |
| 296 | +### 10.3 默认的形状是「耦合判断」,不是风格 —— §6.1 的通篇 `>=` 是错的 |
| 297 | + |
| 298 | +§6.1 写 `"xim:cuda-nvcc" = ">=12.9.86"`。实测:索引里有 12.9.86 与 13.3.33,`>=` 取 |
| 299 | +最高,于是**默认变成 13.3.33** —— 而 13.x 把驱动下界抬到 r580,本轮实测的机器是 12.4。 |
| 300 | +一条本意为「至少这么新」的下界,把整条 lane 换成了没验证过的那条。 |
| 301 | + |
| 302 | +规则:**版本耦合着规则看不见的东西时,默认写精确版本;不耦合时写下界。** CUDA / HIP |
| 303 | +的运行时耦合驱动 → 钉 12.9 线;glslang / dpcpp / CANN 不耦合 → `>=`。 |
| 304 | + |
| 305 | +### 10.4 边界:规则声明它**编译时**用的,工程声明它**运行时**跑在上面的 |
| 306 | + |
| 307 | +`xim:mesa-lavapipe` 是一个软件 Vulkan 设备。把它挪进 `rules-spirv` 会给每一个消费者 |
| 308 | +强加一个软件渲染器,包括有 GPU 的那些。它留在工程里。 |
| 309 | + |
| 310 | +同理 `compat:cuda-runtime` / `compat:sycl-runtime` / `compat:vulkan-runtime`:它们是 |
| 311 | +产物的运行期适配器,而且有一条结构性理由 —— 插件包是一条 `[build-dependencies]` 边, |
| 312 | +它自己的 `[dependencies]` **有意**不到达消费者的 target。 |
| 313 | + |
| 314 | +所以「插件自带环境」覆盖的是 xim 载荷那一半,不是全部。这条写进 plugins 的 README 与 |
| 315 | +manifest 注释,因为它是唯一能回答「为什么这个还要我写」的地方。 |
| 316 | + |
| 317 | +### 10.5 修好一处判据,第一批红的是自己的夹具 |
| 318 | + |
| 319 | +把 plugins CI 的 `MCPP_VERSION` 从 2026.9.6.1 抬到 2026.9.6.6 之后,`hip-consumer` |
| 320 | +当场变红:它的 glob 写 `accel = "hip, cuda12.9+{sm_89}"`,而 `[package] accelerators` |
| 321 | +只有 `["hip"]`。`sycl-consumer` 与 mcpp 自己的 `examples/09-heterogeneous/{hip,sycl}` |
| 322 | +同形。 |
| 323 | + |
| 324 | +**两边的 CI 都看不见它。** mcpp 侧那两个示例在 `build_examples.sh` 里是 SKIP;plugins |
| 325 | +侧的引擎 pin 停在检查出现之前。这是一条只有**跨仓库、且两边都动**才会暴露的缺陷。 |
| 326 | + |
| 327 | +### 10.6 告警码:新开一个,不复用 |
| 328 | + |
| 329 | +正文 §2.2 说跨包这一趟复用 `xlings/axis-override`。没有采纳:那个码的含义写在它自己的 |
| 330 | +注释里,是「同一份 manifest 的两条**轴**」。跨包的版本分歧是另一件事,而告警码是给机器 |
| 331 | +读的分类。新码是 `xlings/version-override`。 |
| 332 | + |
| 333 | +### 10.7 落地顺序(不可交换) |
| 334 | + |
| 335 | +| # | 仓库 | 内容 | 前置 | |
| 336 | +|---|---|---|---| |
| 337 | +| 1 | mcpp | 引擎 + 文档 + 判据 + 2026.9.6.6 | 无 | |
| 338 | +| 2 | — | 发布 2026.9.6.6 | 1 合入 | |
| 339 | +| 3 | mcpp-plugins | 五条规则自带环境 + 0.2.4 | 2(CI 要下载这个引擎) | |
| 340 | +| 4 | — | 0.2.4 进索引 | 3 合入 | |
| 341 | +| 5 | mcpp | 示例瘦身到 0.2.4 | 4(示例从索引解析 plugins) | |
| 342 | + |
| 343 | +第 5 步是 mcpp 的**第二个** PR。它不是拆分,是两次跨仓库发布夹在中间的必然结果: |
| 344 | +示例引用的是已发布的 plugins,而那一版依赖第 1 步的引擎。 |
0 commit comments