Rust 编译器平台支持体系详解:Target 三级分层、目标三元组与 rustc_target 源码实现
【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust
本文基于 rustc 官方文档src/doc/rustc/src/platform-support.md及其配套的 Target Tier Policy 展开,系统讲解 Rust 平台支持的三级(Tier)保障模型、target triple 命名机制、各层级目标的完整清单与基线要求,并结合 rustc_target 的源码结构剖析目标规格(Target spec)在编译器中的落地方式,帮助读者准确判断“我的目标平台能编译吗、能跑测试吗、能作为开发平台吗”这三个核心问题。
一、总体模型:三个 Tier 与 target triple
rustc 的平台支持文档将不同平台("targets")划分为三个层级(tier),每个层级对应不同的保障承诺(guarantees)。这是理解整篇文档的骨架:
| 层级 | 保障语义 | 官方构建产物 | 自动化验证 |
|---|---|---|---|
| Tier 1 | "guaranteed to work"(保证可用) | 为每个 Tier 1 目标构建官方二进制发布 | 每次变更都会自动构建并跑测试,保证 Tier 1 目标构建成功且测试通过 |
| Tier 2 | "guaranteed to build"(保证能构建) | 为每个 Tier 2 目标构建标准库(个别情况仅core)官方二进制 | 自动构建保证目标仍可作为构建目标;但不总是跑测试,因此不保证一定产出可工作的构建 |
| Tier 3 | 代码库中存在支持,但 Rust 项目不自动构建或测试 | 无官方构建 | 可能工作也可能不工作 |
目标由target triple(目标三元组)唯一标识——即告诉编译器"应产生何种输出"的字符串,例如x86_64-unknown-linux-gnu、aarch64-apple-darwin。在仓库中,每个内置目标的完整规格都对应一个源码文件,位于 compiler/rustc_target/src/spec/targets 目录,文件名即目标三元组(-换成_),例如 aarch64_apple_darwin.rs、x86_64_unknown_linux_gnu.rs。
原文档还提到:组件(如 rust-std、rustc、cargo 各组件)在各平台上的可用性历史可通过 rustup-components-history 页面查询(该链接为外部站点,此处不赘述),实际选型时可结合 platform-support.md 中的层级判断。
"Host Tools" 的额外含义
Tier 1 和 Tier 2 都可能额外支持host tools:即在目标上原生运行rustc、cargo等工具。带 host tools 的目标不仅可以作为交叉编译目标,还可以作为开发平台使用,并且自动化测试/构建会同时覆盖 host tools。所有 Tier 1(with host tools)与 Tier 2(with host tools)目标都支持完整标准库。
二、Tier 1 with Host Tools:保证可用的核心平台清单
文档给出的 Tier 1 with host tools 完整清单如下(含基线要求与已知 ABI 限制脚注):
| target | 说明 |
|---|---|
aarch64-apple-darwin | ARM64 macOS(11.0+,Big Sur+) |
aarch64-pc-windows-msvc | ARM64 Windows MSVC |
aarch64-unknown-linux-gnu | ARM64 Linux(内核 4.1+,glibc 2.17+) |
i686-pc-windows-msvc | 32 位 MSVC(Windows 10+、Windows Server 2016+、Pentium 4)23 |
i686-unknown-linux-gnu | 32 位 Linux(内核 3.2+,glibc 2.17+,Pentium 4)2 |
x86_64-pc-windows-gnu | 64 位 MinGW(Windows 10+、Windows Server 2016+) |
x86_64-pc-windows-msvc | 64 位 MSVC(Windows 10+、Windows Server 2016+) |
x86_64-unknown-linux-gnu | 64 位 Linux(内核 3.2+,glibc 2.17+) |
原文档同时声明:目前所有 Tier 1 目标都带有 host tools("At this time, all Tier 1 targets are Tier 1 with Host Tools"),因此独立的 "Tier 1" 小节当前没有单独列出目标。
从源码结构看,这些目标的规格文件集中在 compiler/rustc_target/src/spec/targets,例如 x86_64_pc_windows_msvc.rs、aarch64_unknown_linux_gnu.rs。而跨目标共享的 OS/工具链级配置(如 MSVC、MinGW、musl 链接行为)抽象在 compiler/rustc_target/src/spec/base 中,如 msvc.rs、windows_gnu.rs、linux_musl.rs,这解释了为何同名 OS 后缀(-windows-msvc、-linux-musl)的多个目标可以复用同一套链接器与运行时假设。
三、Tier 2 with Host Tools:可作为开发平台的次级清单
Tier 2 目标"保证能构建":Rust 项目会为每个 Tier 2 目标构建标准库(个别情况仅core)的官方二进制,自动化构建确保目标每次变更后仍可作为构建目标;但由于不总是运行测试,不能保证产出一定可工作的构建——不过 Tier 2 目标往往也能工作得相当好,社区补丁始终欢迎。
另外两点与 Tier 3 相同的治理说明:
- Tier 2 的目标特定代码在修改时不会被 Rust 团队严格审查,bug 是可能存在的,质量控制水平预期更低;
- 注意:
rust-docs组件通常不为 Tier 2 目标构建,rustup 可能会安装相似 Tier 1 目标的文档作为替代。
Tier 2 with host tools 目标同样支持完整标准库。完整清单:
| target | 说明 |
|---|---|
aarch64-pc-windows-gnullvm | ARM64 MinGW(Windows 10+),LLVM ABI |
aarch64-unknown-freebsd | ARM64 FreeBSD |
aarch64-unknown-linux-musl | ARM64 Linux,musl 1.2.5 |
aarch64-unknown-linux-ohos | ARM64 OpenHarmony |
arm-unknown-linux-gnueabi | Armv6 Linux(内核 3.2+,glibc 2.17) |
arm-unknown-linux-gnueabihf | Armv6 Linux,hardfloat(内核 3.2+,glibc 2.17) |
armv7-unknown-linux-gnueabihf | Armv7-A Linux,hardfloat(内核 3.2+,glibc 2.17) |
armv7-unknown-linux-ohos | Armv7-A OpenHarmony |
loongarch64-unknown-linux-gnu | LoongArch64 Linux,LP64D ABI(内核 5.19+,glibc 2.36),要求 LSX |
loongarch64-unknown-linux-musl | LoongArch64 Linux,LP64D ABI(内核 5.19+,musl 1.2.5),要求 LSX |
powerpc-unknown-linux-gnu | PowerPC Linux(内核 3.2+,glibc 2.17) |
powerpc64-unknown-linux-gnu | PPC64 Linux(内核 3.2+,glibc 2.17) |
powerpc64-unknown-linux-musl | PPC64 Linux(内核 4.19+,musl 1.2.5) |
powerpc64le-unknown-linux-gnu | PPC64LE Linux(内核 3.10+,glibc 2.17) |
powerpc64le-unknown-linux-musl | PPC64LE Linux(内核 4.19+,musl 1.2.5) |
riscv64gc-unknown-linux-gnu | RISC-V Linux(内核 4.20+,glibc 2.29) |
riscv64gc-unknown-linux-musl | RISC-V Linux(内核 4.20+,musl 1.2.5) |
s390x-unknown-linux-gnu | S390x Linux(内核 3.2+,glibc 2.17) |
x86_64-apple-darwin | 64 位 macOS(10.12+,Sierra+) |
x86_64-pc-windows-gnullvm | 64 位 x86 MinGW(Windows 10+),LLVM ABI |
x86_64-unknown-freebsd | 64 位 x86 FreeBSD |
x86_64-unknown-illumos | illumos |
x86_64-unknown-linux-musl | 64 位 Linux,musl 1.2.5 |
x86_64-unknown-linux-ohos | x86_64 OpenHarmony |
x86_64-unknown-netbsd | NetBSD/amd64 |
x86_64-pc-solaris | 64 位 x86 Solaris 11.4 |
sparcv9-sun-solaris | SPARC V9 Solaris 11.4 |
从源码结构看,"带 host tools" 与 "仅编译目标" 的差异体现在目标规格的多个选项上(如链接器、动态库扩展、panic 策略等)。以 x86_64_apple_darwin.rs 这类 Tier 1 目标为例,其规格直接内联了完整的Target定义;而 spec/mod.rs 中提供了load_builtin、load_all_builtins、expect_builtin等函数,说明内置目标是通过"按三元组查表"的方式被rustc加载的——这也解释了为什么目标命名必须与既有目标保持一致(命名即 API)。
四、Tier 2 without Host Tools:编译目标全景(含 std 支持列)
该层级同样是"保证能构建",但不提供在目标上原生运行rustc/cargo的保证(个别目标仍可在 host 列 标记,见下文 Tier 3)。表格中std列的取值含义(这是选型时最关键的信号):
- ✓:完整标准库可用;
- *:目标仅支持
no_std开发; - ?:标准库支持是 work-in-progress(进行中)。
完整清单(按原文档分组,覆盖 Apple 移动平台、Android、裸机、WebAssembly、UEFI、SGX 等类别):
Apple 生态(iOS / tvOS / visionOS / watchOS / Mac Catalyst)
| target | std | 说明 |
|---|---|---|
aarch64-apple-ios | ✓ | ARM64 iOS |
aarch64-apple-ios-macabi | ✓ | ARM64 Mac Catalyst |
aarch64-apple-ios-sim | ✓ | ARM64 iOS 模拟器 |
aarch64-apple-tvos | ✓ | ARM64 tvOS |
aarch64-apple-tvos-sim | ✓ | ARM64 tvOS 模拟器 |
aarch64-apple-visionos | ✓ | ARM64 visionOS |
aarch64-apple-visionos-sim | ✓ | ARM64 visionOS 模拟器 |
aarch64-apple-watchos | ✓ | ARM64 watchOS |
aarch64-apple-watchos-sim | ✓ | ARM64 watchOS 模拟器 |
x86_64-apple-ios | ✓ | 64 位 x86 iOS |
x86_64-apple-ios-macabi | ✓ | x86_64 Mac Catalyst |
Android 与 Fuchsia
| target | std | 说明 |
|---|---|---|
aarch64-linux-android | ✓ | ARM64 Android |
arm-linux-androideabi | ✓ | Armv6 Android |
armv7-linux-androideabi | ✓ | Armv7-A Android |
thumbv7neon-linux-androideabi | ✓ | Thumb2 模式 Armv7-A Android,带 NEON |
x86_64-linux-android | ✓ | 64 位 x86 Android |
i686-linux-android | ✓ | 32 位 x86 Android(Pentium 4 及若干扩展)2 |
aarch64-unknown-fuchsia | ✓ | ARM64 Fuchsia |
x86_64-unknown-fuchsia | ✓ | 64 位 x86 Fuchsia |
裸机(no_std)目标
| target | std | 说明 |
|---|---|---|
aarch64-unknown-none | * | 裸机 ARM64,hardfloat |
aarch64-unknown-none-softfloat | * | 裸机 ARM64,softfloat |
armv7a-none-eabi/armv7a-none-eabihf | * | 裸机 Armv7-A(hardfloat 变体) |
armv7r-none-eabi/armv7r-none-eabihf | * | 裸机 Armv7-R |
armv8r-none-eabihf | * | 裸机 Armv8-R,hardfloat |
thumbv7a-none-eabi/thumbv7a-none-eabihf | * | Thumb 模式裸机 Armv7-A |
thumbv7r-none-eabi/thumbv7r-none-eabihf | * | Thumb 模式裸机 Armv7-R |
thumbv8r-none-eabihf | * | Thumb 模式裸机 Armv8-R,hardfloat |
thumbv6m-none-eabi | * | 裸机 Armv6-M |
thumbv7em-none-eabi/thumbv7em-none-eabihf | * | 裸机 Armv7E-M |
thumbv7m-none-eabi | * | 裸机 Armv7-M |
thumbv8m.base-none-eabi | * | 裸机 Armv8-M Baseline |
thumbv8m.main-none-eabi/thumbv8m.main-none-eabihf | * | 裸机 Armv8-M Mainline |
loongarch32-unknown-none/loongarch32-unknown-none-softfloat | * | LoongArch32 裸机(ILP32D / ILP32S ABI) |
loongarch64-unknown-none/loongarch64-unknown-none-softfloat | * | LoongArch64 裸机(LP64D / LP64S ABI) |
s390x-unknown-none-softfloat | * | 裸机 S390x(softfloat ABI) |
x86_64-unknown-none | * | Freestanding/裸机 x86_64,softfloat |
RISC-V 裸机
| target | std | 说明 |
|---|---|---|
riscv32i-unknown-none-elf | * | 裸机 RISC-V(RV32I) |
riscv32im-unknown-none-elf | * | 裸机 RISC-V(RV32IM) |
riscv32imac-unknown-none-elf | * | 裸机 RISC-V(RV32IMAC) |
riscv32imafc-unknown-none-elf | * | 裸机 RISC-V(RV32IMAFC) |
riscv32imc-unknown-none-elf | * | 裸机 RISC-V(RV32IMC) |
riscv64gc-unknown-none-elf | * | 裸机 RISC-V(RV64IMAFDC) |
riscv64im-unknown-none-elf | * | 裸机 RISC-V(RV64IM) |
riscv64imac-unknown-none-elf | * | 裸机 RISC-V(RV64IMAC) |
32 位 x86 Linux 与其他系统目标
| target | std | 说明 |
|---|---|---|
i586-unknown-linux-gnu | ✓ | 32 位 Linux(内核 3.2+,glibc 2.17,初代 Pentium)1 |
i586-unknown-linux-musl | ✓ | 32 位 Linux(musl 1.2.5,初代 Pentium)1 |
arm-unknown-linux-musleabi/arm-unknown-linux-musleabihf | ✓ | Armv6 Linux,musl 1.2.5(hardfloat 变体) |
armv5te-unknown-linux-gnueabi/armv5te-unknown-linux-musleabi | ✓ | Armv5TE Linux(内核 4.4+,glibc 2.23;或 musl 1.2.5) |
armv7-unknown-linux-gnueabi/armv7-unknown-linux-musleabi/armv7-unknown-linux-musleabihf | ✓ | Armv7-A Linux(内核 4.15+,glibc 2.27;或 musl 1.2.5) |
i686-unknown-freebsd | ✓ | 32 位 x86 FreeBSD(Pentium 4)2 |
i686-unknown-linux-musl | ✓ | 32 位 Linux,musl 1.2.5(Pentium 4)2 |
i686-pc-windows-gnu/i686-pc-windows-gnullvm | ✓ | 32 位 MinGW(Windows 10+,Pentium 4)2(后者为 LLVM ABI) |
sparc64-unknown-linux-gnu | ✓ | SPARC Linux(内核 4.4+,glibc 2.23) |
thumbv7neon-unknown-linux-gnueabihf | ✓ | Thumb2 模式 Armv7-A Linux,带 NEON(内核 4.4+,glibc 2.23) |
riscv64a23-unknown-linux-gnu | ✓ | RISC-V Linux(内核 6.8.0+,glibc 2.39),见 riscv64a23-unknown-linux-gnu.md |
x86_64-unknown-linux-gnux32 | ✓ | 64 位 Linux(x32 ABI,内核 4.15+,glibc 2.27) |
x86_64-unknown-redox | ✓ | Redox OS |
x86_64-fortanix-unknown-sgx | ✓ | 64 位 Intel SGX,Fortanix ABI |
特殊用途目标(UEFI、WASM、GPU、Sanitizer)
| target | std | 说明 |
|---|---|---|
aarch64-unknown-uefi | ? | ARM64 UEFI |
i686-unknown-uefi | ? | 32 位 UEFI(Pentium 4,softfloat)3 |
x86_64-unknown-uefi | ? | 64 位 UEFI |
wasm32-unknown-unknown | ✓ | WebAssembly |
wasm32-unknown-emscripten | ✓ | 经由 Emscripten 的 WebAssembly |
wasm32-wasip1/wasm32-wasip1-threads | ✓ | WASI Preview 1(线程变体) |
wasm32-wasip2/wasm32-wasip3 | ✓ | WASIp2 / WASIp3 |
wasm32v1-none | * | 限制为 WebAssembly 1.0 特性且无 imports |
arm64ec-pc-windows-msvc | ✓ | Arm64EC Windows MSVC |
nvptx64-nvidia-cuda | * | --emit=asm生成可在 NVIDIA GPU 上运行的 PTX 代码 |
x86_64-unknown-linux-gnuasan | ✓ | 64 位 Linux(内核 3.2+,glibc 2.17+),默认开启 ASAN |
x86_64-unknown-linux-gnumsan | ✓ | 同上,默认开启 MSAN |
x86_64-unknown-linux-gnutsan | ✓ | 同上,默认开启 TSAN |
五、Tier 3:代码库中存在但不保证构建与测试
Tier 3 目标是 rustc 代码库中存在支持、但 Rust 项目不自动构建或测试的目标——"may or may not work",也没有官方构建。其表格比 Tier 2 多一列host,标记代码库是否包含为这些目标构建 host tools(即在本机运行rustc/cargo)的支持。该层级的目标清单覆盖非常广,此处按类别摘录代表性条目(完整清单见原文档):
操作系统类(QNX、FreeBSD/OpenBSD/NetBSD 变体、Redox、NuttX、VxWorks 等)
| target | std | host | 说明 |
|---|---|---|---|
aarch64-unknown-nto-qnx700/aarch64-unknown-nto-qnx710/aarch64-unknown-qnx | ?/✓/✓ | QNX SDP 7.0 / 7.1(io-pkt / io-sock 网络栈)/ 8.0+ | |
aarch64-unknown-openbsd | ✓ | ✓ | ARM64 OpenBSD |
x86_64-unknown-openbsd | ✓ | ✓ | 64 位 OpenBSD |
x86_64-unknown-dragonfly/x86_64-unknown-haiku/x86_64-unknown-hurd-gnu | ✓ | ✓ | DragonFlyBSD / Haiku / GNU/Hurd |
x86_64-unknown-redox/aarch64-unknown-redox/riscv64gc-unknown-redox | ✓ | Redox OS | |
aarch64-unknown-nuttx及各 ARM/Thumb 变体 | ✓ | NuttX 嵌入式 OS | |
x86_64-wrs-vxworks/aarch64-wrs-vxworks等 | ✓ | VxWorks | |
x86_64-pc-cygwin | ✓ | 64 位 x86 Cygwin | |
powerpc64-ibm-aix | ? | 64 位 AIX(7.2 及以上) |
主机工具可用(host ✓)的例子:aarch64-unknown-linux-gnu_ilp32、aarch64_be-unknown-linux-gnu、i686-apple-darwin、mips-unknown-linux-gnu、mips64-unknown-linux-gnuabi64等——从表格可见 host 列与 Tier 2 的 host tools 是两套独立的标注:Tier 3 的host ✓仅表示"代码库包含构建 host tools 的支持",并不附带 Tier 2/1 的 CI 保障。
裸机/微控制器与游戏机
| target | std | 说明 |
|---|---|---|
avr-none | * | AVR 微控制器,需要-Zbuild-std=core与-Ctarget-cpu=... |
bpfel-unknown-none/bpfeb-unknown-none | * | BPF(小端/大端) |
[msp430-none-elf](msp430-none-elf) | * | 16 位 MSP430 微控制器 |
mipsel-sony-psp同类 /mipsel-sony-psx/powerpc64-sony-ps3/armv6k-nintendo-3ds/aarch64-nintendo-switch-freestanding | */? | 游戏机目标(PSP、PSX、PS3、3DS、Switch Horizon) |
armv7-sony-vita-newlibeabihf | ✓ | PS Vita(需 VITASDK 工具链) |
xtensa-esp32-espidf/xtensa-esp32s2-espidf/xtensa-esp32s3-espidf | ✓ | Xtensa ESP32 系列(ESP-IDF) |
xtensa-esp32-none-elf等 | * | Xtensa 裸机变体 |
riscv32imac-esp-espidf/riscv32imafc-esp-espidf等 | ✓ | RISC-V ESP-IDF |
amdgcn-amd-amdhsa | * | AMD GPU,用-Ctarget-cpu=gfx...指定具体 GPU |
MIPS 家族(含 sNaN 限制脚注)
| target | std | 说明 |
|---|---|---|
mips-unknown-linux-gnu/mips-unknown-linux-musl/mips-unknown-linux-uclibc | ✓ | MIPS Linux(内核 4.4,glibc 2.23 等)4 |
mips64-unknown-linux-gnuabi64/mips64el-unknown-linux-gnuabi64 | ✓ | MIPS64 N64 ABI Linux(内核 4.4,glibc 2.23)4 |
mipsel-unknown-linux-gnu/mipsel-unknown-linux-musl/mipsel-unknown-linux-uclibc | ✓ | MIPS 小端 Linux 各 libc 变体4 |
mipsel-sony-psx/mipsel-none(mipsel-unknown-none) | * | 裸机/游戏机 MIPS(LE)4 |
mips-mti-none-elf/mipsel-mti-none-elf | * | 裸机 MIPS32r2(BE/LE)softfloat4 |
mipsisa32r6-unknown-linux-gnu等 MIPS Release 6 变体 | ?/✓ | MIPS R6 Linux |
从源码结构看,Tier 3 目标与 Tier 1/2 目标在rustc_target中的地位是相同的——都在 spec/targets 下有一等公民的规格文件(如 avr_none.rs、bpfel_unknown_none.rs、xtensa_esp32_espidf.rs),层级差异体现在CI 构建/测试配置而非编译器代码本身。此外,rustc_target还支持以 JSON 形式外部提供目标规格(见 spec/json.rs),这是rustc --print target-list之外的第三方目标扩展通道,也是--target指定 JSON 文件时走的路径。
六、各目标专项文档的入口
每个有专项文档的目标,其说明页位于 src/doc/rustc/src/platform-support 目录,由 TEMPLATE.md 统一模板生成。典型的入口页包括:
- apple-darwin.md:macOS(含
aarch64-apple-darwin与x86_64-apple-darwin) - windows-msvc.md / windows-gnu.md / windows-gnullvm.md:Windows 三种工具链
- freebsd.md、netbsd.md、openbsd.md
- android.md:Android NDK 各 ABI
- riscv64gc-unknown-linux-gnu.md / riscv64gc-unknown-linux-musl.md:RISC-V Linux
- wasm32-unknown-unknown.md、wasm32-wasip1.md 等 WASM 系列
- unknown-uefi.md:UEFI 驱动开发(注意 UEFI 目标的 std 仍标为
?,即标准库支持进行中)
七、层级如何落地:源码视角的三层证据链
把文档与仓库对应起来,可以形成一条清晰的证据链:
- 目标规格定义:每个内置目标在 compiler/rustc_target/src/spec/targets 有一个
.rs文件,按三元组命名;OS/工具链级共享逻辑(MSVC 链接、MinGW、musl、FreeBSD、WASM 等)抽到 spec/base 中复用。 - 规格加载:spec/mod.rs 提供
load_builtin(按目标名查找内置规格)、load_all_builtins(枚举全部内置目标)与expect_builtin(要求必须存在的内置目标,供构建系统使用)等入口;文件头注释即说明目标来源之一是"checking builtin targets for${TUPLE}"。 - 一致性校验:spec/consistency.rs 对规格做约束检查,spec/tuple.rs 定义了
TargetTuple(即三元组的结构化解析),这也是平台支持文档中"命名必须与既有目标一致"这一政策得以在编译层面执行的机制。 - 调用约定与 ABI 细节:callconv/ 目录承载各架构的调用约定实现,abi_map.rs 描述目标 ABI 映射——这正是文档脚注中"x87 浮点返回"、"MSVC 对齐"等 ABI 限制在编译器中的对应位置。
- 构建系统:src/bootstrap 驱动整个发行版构建,其 defaults 目录提供
x.py的默认配置(bootstrap.dist.toml 等),各 Tier 目标在 CI 中"是否构建、是否跑测试"正是由这一层配置决定的,而非由rustc_target的规格决定。
八、新增/提升目标的操作路径
如果读者需要为自己的平台争取 Tier 2 支持或引入 Tier 3 目标,Target Tier Policy 给出了明确的流程与要求摘要:
- 新目标一律从 Tier 3 起步,在
rust-lang/rust提交 PR:在 PR 描述中引用 Tier 3 政策逐条响应;在 src/doc/rustc/src/platform-support 下用模板 TEMPLATE.md 新增目标说明页;把目标加入文档 SUMMARY 与 platform-support.md(后者必须逐字列出所有目标名),并链接新建的说明页;最后通过r? compiler把 PR 指派给编译器团队。 - 命名即承诺:Tier 3 要求目标命名与既有目标保持一致(同一 CPU/OS 用同一名字)、尽量避免易产生误解的名字、优先只使用字母/数字/连字符/下划线(点号会在 Cargo 中引发问题)。
- 渐进式引入技巧:若新目标想支持
std,会传递性地需要cc与libc的支持。建议先加入一个最小的#![no_core]目标规格让rustc认识该目标,待cc、libc支持到位后再跟进std支持,以打破循环依赖。 - 升级(promotion)要求:目标必须先获得下一低层级的批准,并在该层级"度过合理时间"(通常至少跨越多个 stable 发布)才能提出升级提案;Tier 2 需要至少 2 名维护人、CI 可靠构建、文档说明交叉编译与(尽量通过模拟)运行测试的方法、基线期望(CPU/OS/库版本)文档化;Tier 1 需要至少 3 名维护人、CI 中构建并全量通过测试、完整(或尽可能完整)的标准库、以及跨组织生产级使用需求。
- 降级与移除:不达标目标可被降级或移除,提案会广泛通告;历史上在目标维护方无法及时适配新语言特性时(例如引入
u128/i128时),Rust 团队也可能临时在 nightly 中禁用相关目标。
九、选型速查:如何读这张平台支持表
- 看 Tier:需要"改了 Rust 也不会坏"的保证 → Tier 1;只需要标准库官方构建 → Tier 2;试验性/自托管 → Tier 3。
- 看 host tools:要在目标机器上跑
rustc/cargo做本地开发 → 选带 host tools 的层级(当前所有 Tier 1 均含 host tools)。 - 看 std 列:
✓完整标准库;*仅no_std(配合 no_std 生态 中的裸机目标使用,通常需要-Zbuild-std);?进行中(如 UEFI、AIX、Managarm 等)。 - 看基线脚注:内核/glibc/musl 版本基线(如 LoongArch64 要求内核 5.19+ 且LSX 扩展、
riscv64a23-unknown-linux-gnu要求内核 6.8.0+);以及 ABI 脚注(i686 浮点返回走 x87、MSVC 32 位对齐、MIPS sNaN 反转、i586 x87 舍入不合规)——这些直接决定 unsafe 代码与 C 互操作的边界。 - 验证手段:用
rustc --print target-list可列出当前编译器内置的全部目标(对应 spec/mod.rs 中的load_all_builtins);构建 Rust 自身时的目标选择由 x.py 驱动,默认配置见 src/bootstrap/defaults。
参考路径汇总
- 平台支持总表(本文主体来源):src/doc/rustc/src/platform-support.md
- 目标层级政策:src/doc/rustc/src/target-tier-policy.md
- 目标规格源码:compiler/rustc_target/src/spec/mod.rs、compiler/rustc_target/src/spec/targets、compiler/rustc_target/src/spec/base
- 专项目标文档目录:src/doc/rustc/src/platform-support
- 构建默认配置:src/bootstrap/defaults/README.md
适用前提:本文内容对应**当前仓库(rust 主干)**中的平台支持状态,层级与目标清单随版本演进(例如目标升降级会在稳定版之间生效);引用第三方组件可用性历史、issue 编号时请以 rustup-components-history 与对应 issue 页面为准。
i586 浮点限制:
↩ ↩i586目标使用的 x87 寄存器与指令不提供 IEEE-754 合规行为,尤其在舍入和 NaN payload 位方面。i686 浮点返回 ABI 限制:受 C ABI 限制,
↩ ↩ ↩ ↩ ↩ ↩i686目标的浮点支持不合规——浮点返回值通过 x87 寄存器传递,NaN 的 payload 位可能丢失。使用默认 Rust ABI 的函数不受影响。win32 MSVC 对齐限制:由于 MSVC 的非标准行为,该目标上的原生 C 代码可能将对齐要求超过 4 字节的类型(如
↩ ↩u64/i64)错误地对齐为仅 4 字节。Rust 应用了若干缓解措施,但依赖"引用一定正确对齐"这一假设的 unsafe 代码仍可能因此出现 unsoundness。sNaN 位表示反转:在这些 MIPS 目标上,signaling NaN 的位表示与 Rust 的预期相反,期望返回 quiet NaN 的操作可能返回 signaling NaN。
↩ ↩ ↩ ↩ ↩
【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考