Skip to content

Support macOS 27 (Golden Gate) - #34

Merged
coatless merged 2 commits into
mainfrom
support-macos-27
Sep 16, 2026
Merged

coatless merged 2 commits into
mainfrom
support-macos-27

Conversation

@coatless

@coatless coatless commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

The problem

macrtools is hard-broken on macOS 27, not merely missing support for it. is_macos_r_supported() compared against an exclusive upper bound of "27.0", so sw_vers returning 27.0 evaluated to FALSE:

macrtools: Your macOS version "27.0" is not supported.
macrtools: Supported versions: macOS High Sierra (10.13) through macOS Tahoe (26.x).

That aborts macos_rtools_install(), gfortran_install() and openmp_install().

This is the third occurrence of the same off-by-one: #27 shipped it for Tahoe, #28 fixed it, and the fixed value then went stale one release later. The mental model is "the bound is the newest version I support"; the contract is "the bound is the oldest version I reject."

The fix

  • Centralized the window behind minimum_supported_macos_version() / first_unsupported_macos_version(), mirroring the R version window from 0.0.7. The ceiling is now named for the first version it rejects.
  • macos_support_range() derives the advertised major from that bound, so the abort and startup messages cannot drift from the check. They were previously two independent literals that had already diverged in wording.
  • Added is_macos_golden_gate() for [27.0, 28.0).

Second bug

sw_vers emits only two components for a .0 release ("27.0", never "27.0.0"), and compareVersion() ranks a shorter string below an otherwise-equal longer one. Against the older three-component bounds, every .0 release fell into the previous release's range:

sw_vers matched should be
"12.0" is_macos_big_sur Monterey
"11.0" nothing Big Sur
"10.13" nothing, rejected as unsupported High Sierra

The last case produced an error naming 10.13 as supported while refusing it. pad_version() now normalizes the version and both bounds before comparison.

Also corrects the recipes documentation, which said the darwin repository is chosen by comparing against the macOS version. It is chosen by comparing against the Darwin kernel version, and the two are no longer a fixed offset apart: Darwin stayed on 25 for macOS 26, then realigned to 27 for macOS 27, skipping 26.

macrtools was hard-broken on macOS 27. is_macos_r_supported() compared
against an exclusive upper bound of "27.0", so sw_vers reporting "27.0"
returned FALSE and aborted macos_rtools_install(), gfortran_install() and
openmp_install(). This is the third occurrence of the same off-by-one:
#27 shipped it for Tahoe, #28 fixed it, and the fixed value then went
stale one release later.

Centralize the window behind minimum_supported_macos_version() and
first_unsupported_macos_version(), naming the ceiling for the first
version it rejects rather than the newest it accepts, and render the
advertised range from that bound via macos_support_range() so the abort
and startup messages cannot drift from the check they describe. Add
is_macos_golden_gate() for 27.x.

Also fix version comparison for .0 releases. sw_vers emits only two
components for a .0 release, and compareVersion() ranks a shorter string
below an otherwise-equal longer one, so every .0 release landed in the
previous release's range: "12.0" read as Big Sur, "11.0" matched no
predicate at all, and "10.13" was rejected by an error message that
named 10.13 as supported. pad_version() now normalizes both the version
and the bounds before comparison.

The suite previously passed 136/136 on a macOS 27 machine the package
refused to run on, because the upper bound had never been tested. Add
boundary, contiguity and .0-form coverage, verified by mutation.
@coatless
coatless merged commit 07cb4fc into main Sep 16, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant