<arch>-<os> is a complete target on every platform - #500
Merged
Conversation
`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 失败。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 的。实测
省略即无加注,写出才解释 —— 加注退化为「使用者主动提问时的回答」。
gnu而不是宿主自己的 env。host_triple()在 Windows 上答msvc,按它填会让同一条命令在不同宿主上产生不同的输出目录与缓存键 —— 目标的身份不允许依赖于它在哪里被构建。⭐ 判据是一个指纹,不是「能构建」。 同一个二进制、干净的
target/,两种拼法都落进target/x86_64-windows-gnu/a9519e720fa9cd0b/,第二次构建 0.10s 全缓存命中。e2e284守这一条,在未修复的 2026.8.24.4 上实测为红。两张表的一致性由机器保证
kKnownTargets与freestanding::kTable用同一个键,此前没有任何东西检查两份描述覆盖同一批行。只在前者里的行会一路走到代码生成才失败,错误信息谈的是 flag;只在后者里的行是读起来像支持的死数据。实测删掉kTable任意一行,新增测试立刻转红。文档
新增 docs/16 — 目标三元组(中英双份),以及
.agents/docs/2026-08-25-target-system-analysis.md的完整分析。顺带修掉 CHANGELOG 里一句已被推翻的话(它真正对应的是 c++-abi),它与下一段的正确说法直接矛盾地并排着。单元测试 +7,93 通过 / 0 失败。