提高 Apple 平台最低支持版本

2023年9月25日 · BlackHoleFox

从 Rust 1.74 版本(将于2023年11月16日发布)开始,Rust 工具链支持的 Apple 平台(iOS、macOS 和 tvOS)的最低版本将被提高至新的基线。这些变化会影响 Rust 编译器本身 (rustc)、其他主机工具,以及最重要的是,标准库和任何使用它的生成二进制文件。实施这些变化后,任何生成的二进制文件将停止在旧版本上加载,或者表现出其他未指定的行为。

新的最低版本现在是

  • macOS: 10.12 Sierra (首次发布于 2016)
  • iOS: 10 (首次发布于 2016)
  • tvOS: 10 (首次发布于 2016)

如果您的应用程序尚未针对或支持 macOS 10.7-10.11 或 iOS 7-9,则这些变化很可能不会影响您。

受影响的目标平台

以下包含每个受影响的目标平台及其全面影响

  • x86_64-apple-darwin (最低操作系统版本提高)
  • aarch64-apple-ios (最低操作系统版本提高)
  • aarch64-apple-ios-sim (最低 iOS *和 macOS* 版本提高。)
  • x86_64-apple-ios (最低 iOS *和 macOS* 版本提高。这也是一个模拟器目标平台。)
  • aarch64-apple-tvos (最低操作系统版本提高)
  • armv7-apple-ios (目标平台已移除。兼容 iOS 10 的最旧设备使用 ARMv7s。)
  • armv7s-apple-ios (最低操作系统版本提高)
  • i386-apple-ios (最低操作系统版本提高)
  • i686-apple-darwin (最低操作系统版本提高)
  • x86_64-apple-tvos (最低 tvOS *和 macOS* 版本提高。这也是一个模拟器目标平台。)

在这些变化中,只有一个目标平台被完全移除:armv7-apple-ios。它曾是 tier 3 目标平台。

请注意,Mac Catalyst 和 M1/M2 (aarch64) Mac 目标平台不受影响,因为它们的最低操作系统版本已经有更高的基线。有关更多信息,请参阅平台支持指南

受影响的系统

这些变化移除了对多个旧款移动设备 (iDevices) 和更多 Mac 系统的支持。感谢 @madsmtm 整理此列表

截至本次更新,以下设备型号不再受最新 Rust 工具链支持

iOS

  • iPhone 4S (发布于 2011)
  • iPad 2 (发布于 2011)
  • iPad,第3代 (发布于 2012)
  • iPad Mini,第1代 (发布于 2012)
  • iPod Touch,第5代 (发布于 2012)

macOS

共计 27 款 Mac 系统型号,发布于 2007 至 2009 年间,不再受支持。

受影响的系统型号在此处未完整列出,但外部资源包含了确切型号的列表。例如,可以在Apple 官方网站Yama-Mac上找到。

tvOS

第三代 AppleTV(发布于 2012-2013 年)不再受支持。

为什么会更改要求?

在此之前,Rust 声称支持非常旧的 Apple 操作系统版本,但许多版本从未获得被动测试或支持。这对工具链来说是一个困难的处境,因为它阻碍了改进的机会,而换来的支持级别是许多人甚至所有人永远不会利用的。对于 Apple 的移动平台,许多旧版本甚至由于 App Store 的发布限制而无法接收新软件。

此外,过去两年的情况清楚地表明,Apple 对这些目标平台的工具链拥有严格控制,正使其越来越难以支持这些旧版本。从去年的工具链版本 XCode 14 开始,针对许多旧操作系统版本进行构建已不再受支持。XCode 15 延续了这一趋势。足够长时间后,继续使用旧版工具链甚至可能导致其他用户的构建问题。

我们希望 Rust 成为在 Apple 平台上开发软件的一流选择,但为了继续实现这一目标,我们必须设定一个更容易、更现实的兼容性基线。新的要求是在调查了 Apple 和第三方提供的统计数据后确定的,并在兼容性与 Rust 的需求和限制之间找到了一个折衷点。

我需要做什么吗?

如果您或您开发的应用程序受此变化影响,有一些可能有用的选项

  • 如果可能,请提高您的最低支持操作系统版本。本文讨论的所有操作系统版本均未获得供应商的支持。甚至包括安全更新。
  • 如果您正在运行 Rust 编译器或其他先前支持的主机工具,请考虑从较新的主机进行交叉编译。您可能也无法再依赖 Rust 标准库。
  • 如果这些选项都不起作用,您可能需要冻结项目构建所使用的 Rust 工具链版本。或者,您也可以维护一个自定义工具链,以支持您在其中的任何子组件(例如 libstd)中的要求。

如果您的项目不直接支持某个特定的操作系统版本,而是依赖于 Rust 之前使用的默认版本,您可以采取一些措施来帮助改善未来的兼容性。例如,生态系统中的许多 crate 都硬编码了 Rust 之前支持的操作系统基线版本,因为它们长时间没有变化

  • 如果您使用 cc crate 在项目中包含其他语言,未来的更新将透明地处理此问题。
  • 如果您需要其他任何东西的最低操作系统版本,使用 Rust 1.71 或更高版本的工具链上的 crate 应该查询新的 rustc --print deployment-target 选项以获取默认值或用户设置(如果可用)。硬编码的默认值仅应在旧版本工具链上使用,因为该选项不可用。