减少对 32 位 Apple 目标的支持

2020 年 1 月 3 日 · Pietro Albini

Rust 团队遗憾地宣布,Rust 1.41.0(将于 2020 年 1 月 30 日发布)将是最后一个对 32 位 Apple 目标保持当前支持级别的版本。从 Rust 1.42.0 开始,这些目标将被降级为 Tier 3。

该决定是在 RFC 2837 上做出的,并已获得编译器和发布团队的批准。本文解释了此更改的含义、我们进行此更改的原因以及您的项目将受到的影响。

什么是支持层级?

Rust 编译器可以构建针对许多平台(也称为“目标”)的代码,但团队没有资源或人力为每个平台提供相同级别的支持和测试。为了明确我们的承诺,我们遵循分层支持策略(目前正在 RFC 2803 中进行正式化和修订),解释我们保证的内容。

  • Tier 1 目标可以通过 rustup 下载,并且在项目的自动化构建期间进行全面测试。影响这些目标之一的错误或回归通常比仅影响其他层级平台的错误更优先处理。

  • Tier 2 目标也可以通过 rustup 下载,但我们的自动化构建不会为它们执行测试套件。虽然我们保证可以提供标准库构建(对于其中一些目标,还会提供完整的编译器构建),但我们不保证它能真正正常工作而没有错误(甚至根本不工作)。

  • Tier 3 目标无法通过 rustup 下载,并且在我们的自动化构建期间会被忽略。您仍然可以自己从源代码构建它们的标准库以进行交叉编译(在某些情况下可以构建完整的编译器),但您可能会遇到构建错误、bug 或缺少的功能。

哪些目标受到影响?

此更改影响的主要目标是 32 位 macOS(i686-apple-darwin),它将从 Tier 1 降级为 Tier 3。这将影响在 32 位 Mac 硬件上使用编译器,以及从任何其他平台交叉编译 32 位 macOS 二进制文件。

此外,以下 32 位 iOS 目标将从 Tier 2 降级为 Tier 3

  • armv7-apple-ios
  • armv7s-apple-ios
  • i386-apple-ios

我们将继续为所有 Apple 64 位目标提供当前级别的支持。

为什么这些目标被降级?

macOS 10.15iOS 11 开始,Apple 停止了对运行 32 位二进制文件的支持。他们还从 Xcode 10(该平台的 IDE,包含 SDK)开始,阻止所有开发人员交叉编译 32 位程序和应用程序。

由于 Apple 的这些决定,这些目标对我们的用户不再有用,并且他们阻止交叉编译的选择使项目难以长期继续支持 32 位平台。

这将如何影响我的项目?

如果您不构建 32 位 Apple 二进制文件,此更改将根本不会影响您。

如果您仍然需要构建它们,您将能够继续使用 Rust 1.41.0 而不会出现问题。像往常一样,Rust 项目将提供关键的错误修复和安全补丁,直到下一个稳定版本发布(2020 年 3 月 12 日),我们计划在可预见的未来保持该版本的下载可用性(就像我们对迄今为止发布的所有版本所做的那样)。

实现这些目标的代码不会从编译器代码库中删除,因此您也可以自己从源代码构建未来的版本(请记住,它们可能存在错误或损坏,因为该代码将完全未经测试)。

夜间通道怎么样?

我们将很快在夜间通道上降级这些目标,但我们没有确切的日期。我们建议您事先固定一个夜间版本,以防止在我们应用降级后 rustup toolchain install 失败。

要固定夜间版本,您需要使用“nightly”后跟夜间版本发布的日期作为工具链名称。例如,要安装 2019 年 12 月 1 日发布的夜间版本并使用它,您可以运行

rustup toolchain install nightly-2019-12-01

# Default to this nightly system-wide...
rustup default nightly-2019-12-01

# ...or use this nightly for a single build
cargo +nightly-2019-12-01 build