减少对 32 位 Apple 目标的支持

2020 年 1 月 3 日 · Pietro Albini

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

该决定是在 RFC 2837 上做出的,并得到了编译器和发布团队的认可。这篇文章解释了更改的含义、我们为什么要这样做以及您的项目将受到怎样的影响。

什么是支持层?

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

  • 第 1 层目标可以通过 rustup 下载,并在项目的自动化构建过程中进行全面测试。影响其中一个目标的错误或回归通常比只影响其他层平台的错误优先级更高。

  • 第 2 层目标也可以通过 rustup 下载,但我们的自动化构建不会为它们执行测试套件。虽然我们保证标准库构建(以及其中一些的完整编译器构建)将可用,但我们不保证它实际上可以在没有错误的情况下工作(甚至根本无法工作)。

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

哪些目标受到影响?

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

此外,以下 32 位 iOS 目标将从第 2 层降级到第 3 层

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

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

为什么这些目标被降级?

Apple 从 macOS 10.15iOS 11 开始不再支持运行 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