Skip to content

<arch>-<os> is a complete target on every platform - #500

Merged
Sunrisepeak merged 1 commit into
mainfrom
feat/env-segment-omittable-everywhere
Aug 24, 2026
Merged

<arch>-<os> is a complete target on every platform#500
Sunrisepeak merged 1 commit into
mainfrom
feat/env-segment-omittable-everywhere

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

x86_64-linux 可写而 x86_64-windows 被拒:error: unknown target

2026.8.24.3 立的规矩是「三元组既是身份也是请求,而请求必须能什么都不说」,而它只在 Linux 与 macOS 上成立⚠️ 被强制写出第三段的两个平台(windows、none),恰恰是构建期体系最常用的两个。

⭐ 真正的分界是两种体系,不是平台

传统预构建体系 构建期体系
目标侧来自 工具链载荷 依赖,从源码构建
第三段 挑选载荷,解析期承重 不选中任何东西,图已决定
该不该写 该写,它是作出选择的方式 不该写,它陈述一个不被查询的请求

在构建期体系下 x86_64-windows 不只是更短,它更准确:那次构建里编译器是 clang、链接器是 lld、compiler-runtime 是 compiler-rt、C 库是 musl、C++ 运行时是 libc++、平台是 openkal —— 没有任何东西是 GNU 的

实测

--target x86_64-windows      Target x86_64-windows → x86_64-w64-windows-gnu     无加注
--target x86_64-windows-gnu  Target x86_64-windows-gnu → …  (gnu selects …)     有加注
--target riscv64-none        Target riscv64-none → riscv64-none-elf             无加注
--target riscv64-none-elf    Target riscv64-none-elf  (elf selects …)           有加注

省略即无加注,写出才解释 —— 加注退化为「使用者主动提问时的回答」。

⚠️ gnu 而不是宿主自己的 env。 host_triple() 在 Windows 上答 msvc,按它填会让同一条命令在不同宿主上产生不同的输出目录与缓存键 —— 目标的身份不允许依赖于它在哪里被构建。

判据是一个指纹,不是「能构建」。 同一个二进制、干净的 target/,两种拼法都落进 target/x86_64-windows-gnu/a9519e720fa9cd0b/,第二次构建 0.10s 全缓存命中。e2e 284 守这一条,在未修复的 2026.8.24.4 上实测为红。

两张表的一致性由机器保证

kKnownTargetsfreestanding::kTable 用同一个键,此前没有任何东西检查两份描述覆盖同一批行。只在前者里的行会一路走到代码生成才失败,错误信息谈的是 flag;只在后者里的行是读起来像支持的死数据。实测删掉 kTable 任意一行,新增测试立刻转红。

文档

新增 docs/16 — 目标三元组(中英双份),以及 .agents/docs/2026-08-25-target-system-analysis.md 的完整分析。顺带修掉 CHANGELOG 里一句已被推翻的话(它真正对应的是 c++-abi),它与下一段的正确说法直接矛盾地并排着。

单元测试 +7,93 通过 / 0 失败。

`x86_64-linux` 可写而 `x86_64-windows` 被拒:

    error: unknown target 'x86_64-windows'

2026.8.24.3 立的规矩是「三元组既是身份也是请求,而请求必须能什么都不说」,
**而它只在 Linux 与 macOS 上成立**。⚠️ 被强制写出第三段的两个平台
(windows、none),恰恰是构建期体系最常用的两个。

── ⭐ 真正的分界是两种体系,不是平台 ──────────────────────

    传统预构建体系   目标侧来自工具链**载荷**
                     第三段**挑选载荷** —— 解析期承重,该写
    构建期体系       目标侧来自依赖**图**,从源码构建
                     第三段**不选中任何东西** —— 图已决定,不该写

在构建期体系下 `x86_64-windows` 不只是比 `x86_64-windows-gnu` 短,
它**更准确**:那次构建里编译器是 clang、链接器是 lld、compiler-runtime
是 compiler-rt、C 库是 musl、C++ 运行时是 libc++、平台是 openkal ——
**没有任何东西是 GNU 的**。`gnu` 是 LLVM 继承自 MinGW 的历史标签,
clang 需要这个拼写来选内部工具链,mcpp 改不了它 ——
**但可以不要求使用者写它**。

⚠️ **填 `gnu` 而不是宿主自己的 env。** `host_triple()` 在 Windows 上答
`msvc`,按它填会让同一条命令在不同宿主上产生不同的输出目录与缓存键 ——
目标的身份不允许依赖于它在哪里被构建。

⭐ **判据是一个指纹,不是「能构建」。** 同一个二进制、干净的 `target/`,
两种拼法都落进 `target/x86_64-windows-gnu/a9519e720fa9cd0b/`,
第二次构建 0.10s 全缓存命中。若各自产生一个指纹,短拼法就只是
「少打四个字符、多编译一遍」,而两份产物还会各自漂移。
e2e `284` 守的正是这一条,在未修复的 2026.8.24.4 上实测为红。

连带:2026.8.24.5 的加注退化为**只在使用者主动写出第三段时出现**。

── 两张按三元组索引的表,一致性由机器保证 ────────────────

`kKnownTargets` 说某行存在、属于哪一档、C 库由谁供给;
`freestanding::kTable` 说它的 ISA 档与链接如何驱动。此前**没有任何东西
检查这两份描述覆盖同一批行**:只在前者里的行会一路走到代码生成才失败,
错误信息谈的是 flag 而不是缺行;只在后者里的行是读起来像支持的死数据。
实测删掉 `kTable` 任意一行,新增的两条测试立刻转红。

── 顺带修掉 CHANGELOG 里一句已被推翻的话 ──────────────────

`它真正对应的是 c++-abi` 与它下面那段的正确说法直接矛盾地并排着 ——
代码注释与 docs/15 已改,CHANGELOG 漏了。

新增 docs/16(中英双份):三段各是什么、第三段在每个平台上是不同的轴、
两种体系的分界、该用哪种拼法。单元测试 +7,93 通过 / 0 失败。
@Sunrisepeak
Sunrisepeak merged commit 784a299 into main Aug 24, 2026
26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants