September 25, 2023·5 min read·engineeringrustplatformsappletoolchain

Rust announces higher Apple deployment baselines for 1.74

Rust plans macOS 10.12 and iOS and tvOS 10 as its next Apple baselines. The change affects generated programs as well as compiler hosts, making deployment targets part of the toolchain upgrade decision.

Moving a build to a newer machine does not necessarily preserve support for an older deployment target. Rust's September 25 announcement makes that distinction explicit. The Apple platform baseline changes planned for Rust 1.74 affect the compiler and host tools, but also the standard library and programs built with it.

The announced baselines are macOS 10.12 Sierra, iOS 10 and tvOS 10. Rust 1.74 is scheduled for November 16. These are future release requirements as of today's announcement, so existing builds should not be described as already having changed simply because the plan is public.

I see Rust as a serious option for systems work, where deployment constraints can matter as much as language features. An operating-system minimum is part of an executable's compatibility contract. A compiler upgrade that changes that minimum needs to be evaluated against where the resulting artifact must run.

Compiler hosts and generated binaries are separate concerns

The announcement warns that binaries using the changed standard library can stop loading on older systems or show unspecified behavior. That is a stronger consequence than losing the ability to launch rustc on an old laptop. Cross-compiling from a newer host addresses only part of the problem.

A host is where the toolchain executes. A deployment target is where the produced program is expected to run. Those versions can differ. A project can modernize the first while still needing the second to remain old, which is why a successful build on a supported host does not settle deployment compatibility.

The implementation pull request states the same baseline for rustc and the standard library. Its changes also remove armv7-apple-ios, previously a tier-three target. The explanation is that the oldest device supporting the new iOS minimum uses ARMv7s, so retaining the older target is not a workable compatibility shim.

Other targets receive a raised minimum rather than removal. The announcement includes x86-64 macOS and several iOS and tvOS device and simulator targets. Simulator entries can involve both the simulated platform version and the macOS host baseline, another reason to avoid treating every target triple as one simple device requirement.

The change does not affect every Apple target equally

Mac Catalyst and Apple Silicon Mac targets already have higher minimum versions, according to the announcement. They are not affected by this baseline increase. A project targeting only those configurations therefore has a different exposure from one still promising older Intel Mac or iOS compatibility.

The post identifies several older mobile devices that will leave the supported set, including the iPhone 4S and first-generation iPad Mini. Their relevance is the operating-system baseline those devices can support. The target change is not an arbitrary preference for a newer device name.

An accurate compatibility statement should consequently name the operating-system versions and target configurations the application supports. Saying that an application supports Apple platforms in general hides the distinction the announcement is making. The support contract exists at a more specific level than vendor name.

I prefer explicit deployment requirements because they make this kind of transition reviewable. A project that inherited a compiler default without recording it has a harder time explaining whether the new default is acceptable. An intentional minimum can be compared directly with the announced toolchain baseline.

Claimed support had exceeded practical validation

The Rust announcement says many of the oldest claimed platform versions did not receive even passive testing or support. Maintaining that claim constrained improvements while offering uncertain value. The new baseline is intended to be more realistic about the versions the toolchain can support.

Apple's own toolchain changes contribute to that constraint. The post identifies Xcode 14's reduced support for building older operating-system versions and says Xcode 15 continues the trend. Mobile App Store publishing restrictions also limit distribution to some older versions. Rust cannot independently preserve every surrounding platform capability.

This is a tradeoff between compatibility breadth and a support promise that can be maintained. Retaining a low version number does not create evidence that the generated program works there. The announcement's rationale is that a narrower, supportable baseline is preferable to nominal compatibility that obstructs work without meaningful validation.

That reasoning still leaves real costs for applications with older users. The source does not claim that every affected project can abandon those users easily. It lists alternatives precisely because a toolchain's platform policy and an application's deployment obligations may diverge.

Native build helpers should obtain the compiler's target value

The post also identifies crates with hardcoded historical defaults. A Rust project can compile native code through another tool, and that tool may choose its own minimum platform value. If each component embeds an old constant independently, the build can disagree about its intended deployment version.

The announcement recommends querying rustc --print deployment-target on Rust 1.71 or later instead of hardcoding defaults. The linked cc crate change describes checking explicit environment overrides and then asking rustc for its default before falling back to constants for older compilers.

This makes the compiler's selected target a shared input to native compilation. It also preserves an explicit user override where available. The aim is consistency across the parts of the build, rather than assuming that every component should independently guess the current Rust baseline.

Older deployment commitments require an explicit choice

The announcement lists raising an application's minimum version as one response. For host-tool constraints, cross-compilation from a newer system can help. Other possibilities include avoiding the standard library, freezing the toolchain version or maintaining a custom toolchain component that preserves the needed support.

Those alternatives solve different constraints and carry different ownership. A newer host does not lower the standard library's announced target minimum. A frozen toolchain keeps an older implementation in use, while a custom standard library transfers support work to whoever maintains it. The source presents options without claiming they are interchangeable.

For a project that already requires newer operating systems, the announcement may need no deployment change. For one that still supports the affected versions, the scheduled toolchain release becomes a concrete compatibility decision. The build's selected compiler and native deployment settings need to agree with the operating systems promised to users.