提高最低支持的 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。它是一个三级目标。

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

受影响的系统

这些更改删除了对多个旧移动设备(iDevices)和更多 Mac 系统的支持。感谢 @madsmtm编译列表

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

iOS

  • iPhone 4S(发布于 2011 年)
  • iPad 2(发布于 2011 年)
  • iPad,第三代(发布于 2012 年)
  • iPad Mini,第一代(发布于 2012 年)
  • iPod Touch,第五代(发布于 2012 年)

macOS

共有 27 款 Mac 系统型号,发布日期在 2007 年至 2009 年之间,不再受支持。

受影响的系统在此处没有全面列出,但存在包含确切型号列表的外部资源。例如,它们可以从AppleYama-Mac 找到。

tvOS

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

为什么更改要求?

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

此外,过去两年清楚地表明,Apple 对这些目标的工具链拥有严格的控制,这使得它们越来越难以支持。从去年的工具链版本 XCode 14 开始,针对许多旧 OS 版本的构建变得不受支持。XCode 15 延续了这一趋势。经过足够长的时间后,继续使用旧的工具链甚至会导致其他人遇到构建问题。

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

我需要做些什么吗?

如果您或您开发的应用程序受到此更改的影响,有一些不同的选项可能会有所帮助

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

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

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