从 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 目标不受影响,因为它们的最低操作系统版本已经具有更高的基线。有关更多信息,请参阅平台支持指南。
受影响的系统
这些更改取消了对多个旧移动设备 (iDevice) 和更多 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 在您的项目中包含其他语言,则未来的更新将透明地处理此问题。 - 如果您的任何其他内容需要最低操作系统版本,则 crate 应查询新的
rustc --print deployment-target
选项,以获取默认值或用户在可用的情况下设置的值,并在使用 Rust 1.71 或更高版本的工具链上继续使用。硬编码的默认值应仅用于较旧的工具链,因为这些工具链不可用。