Skip to content

ci: macOS wheel build broken — macos-latest moved to macOS 26, MACOSX_DEPLOYMENT_TARGET pinned to 15.0 #18

Closed

Description

@trendvidia

Problem

macos-latest has rolled forward to macOS 26 (Tahoe). Homebrew's bottled
protobuf/abseil dylibs are now built with a minimum target of 26.0, but both
workflows hardcode MACOSX_DEPLOYMENT_TARGET: "15.0". delocate refuses to bundle
dylibs whose min target is newer than the wheel's, so the macOS wheel build fails.

The assumption is stated explicitly in both files and has expired:

  • .github/workflows/ci.yml:164-166 — "Homebrew's bottled dylibs are built for the runner's OS (macos-latest = 15). Set the wheel's deployment target to match so delocate accepts them."
  • .github/workflows/publish.yml:58-63 — "Deployment target must match the runner: … (macos-latest = 15) …"

Evidence

cibuildwheel smoke / macos-latest on main @ 954e9b0 — run 33439745254:

delocate.libsana.DelocationError: Library dependencies do not satisfy target MacOS version 15.0:
  .../protowire/.dylibs/libprotobuf.35.1.0.dylib has a minimum target of 26.0
  .../protowire/.dylibs/libabsl_log_severity.2601.0.0.dylib has a minimum target of 26.0
  .../protowire/.dylibs/libabsl_base.2601.0.0.dylib has a minimum target of 26.0
  ... (all bundled absl dylibs, 2601.0.0)

##[error]cibuildwheel: Command delocate-wheel --require-archs arm64 -w .../repaired_wheel
  .../protowire_python-1.0.0-cp312-cp312-macosx_11_0_arm64.whl failed with code 1.

Identical failure, same job, on both open dependabot PRs — #15 (setup-python 6→7) and
#17 (cibuildwheel 3.4.1→4.2.0). Neither PR causes it; both inherit it from main.
Every other leg is green on all three (Linux, Windows, all four Python versions, CodeQL).

When it broke — ci.yml run history:

date branch result
2026-06-22 actions/checkout-7 (#13) success
2026-07-20 setup-python-7 (#15) failure
2026-07-27 cibuildwheel-4.1.1 (#16) failure
2026-08-10 cibuildwheel-4.2.0 (#17) failure
2026-08-31 main @ 954e9b0 failure

Broke between 2026-06-22 and 2026-07-20. main had no pushes between 2026-05-30 and
2026-08-31, so main never went visibly red — the dependabot PRs were the only canary,
and their red X read as "the bump is broken" rather than "main is broken."

Blast radius

publish.yml:61-63 carries the same hardcoded macosx_deployment_target: "15.0" on
the macos-latest / arm64 leg. This is latent, not yet live — no tag has been
pushed since it broke. The next release would fail the macOS wheel leg the same way.

The smoke job did its job here: it exists to "exercise the wheel-publishing path on
every PR so packaging regressions surface before release time," and it caught one.

Options

fix effect cost
a bump target to 26.0 wheels install only on macOS 26+ silently guts the published support matrix
b pin runner to macos-15 keeps 15.0 target + current support matrix, restores green one-line, reversible; macos-15 deprecates eventually
c build protobuf/absl from source on macOS at the chosen target (as the Linux leg already does via scripts/cibw_install_protobuf_linux.sh) decouples the wheel's support floor from the runner image entirely most work; stops the recurrence

Open decision — needs a call

Which of the above. This sets the published wheel's macOS support floor, so it is
not an implementation detail: (a) drops every macOS user below 26.

Recommendation: (b) now to unblock main and both PRs, (c) filed as follow-up as
the durable fix — (b) restores green without touching the support matrix, and (c) is the
only option that stops this recurring each time GitHub rolls the runner image.

Done-when

  • cibuildwheel smoke / macos-latest green on main
  • publish.yml's macOS leg carries the same fix (the latent half)
  • the runner-version assumption is either removed or restated where it is pinned,
    so the next image roll fails loudly against a stated assumption rather than
    silently against a stale comment
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions