From 521621c3520b59ef9e606aa169ff2feb0053f586 Mon Sep 17 00:00:00 2001 From: Decoder Date: Mon, 31 Aug 2026 14:56:11 -0700 Subject: [PATCH] ci: pin macOS wheel runners to macos-15 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub rolled macos-latest forward to macOS 26 (Tahoe) in July 2026. Homebrew's bottled protobuf/abseil are now built with a minimum target of 26.0, but both workflows set the wheel's MACOSX_DEPLOYMENT_TARGET to 15.0. delocate refuses to bundle dylibs whose min target is newer than the wheel's, so the macOS wheel build has failed since: delocate.libsana.DelocationError: Library dependencies do not satisfy target MacOS version 15.0: .../libprotobuf.35.1.0.dylib has a minimum target of 26.0 .../libabsl_*.2601.0.0.dylib has a minimum target of 26.0 Pin the two wheel-building matrices to macos-15 so the runner image and the deployment target agree again. This keeps the published wheel's macOS support floor exactly where it is; bumping the target to 26.0 instead would drop every macOS user below 26, which is a release decision rather than a CI fix. Both halves are fixed, not just the visible one. publish.yml carried the identical pin on the release path — latent only because no tag has been pushed since it broke; the next release would have failed the same way. ci.yml's test matrix stays on macos-latest: it installs editable and never runs delocate, so it is unaffected and keeps testing newest-macOS. The stale "macos-latest = 15" comments are replaced with ones stating that the runner image and the deployment target are a single decision, so the next reader changes them together or not at all. Fixes #18 Claude-Session: https://claude.ai/code/session_01EshKcwQsY1Mf6qhrckL95u --- .github/workflows/ci.yml | 18 ++++++++++++++---- .github/workflows/publish.yml | 16 +++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc262c5..4131f82 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -123,7 +123,11 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + # macOS is pinned, not -latest: the wheel's deployment target and + # the runner's Homebrew bottles must agree. See MACOSX_DEPLOYMENT_TARGET + # below. The test matrix above stays on macos-latest — it installs + # editable and never runs delocate, so it is unaffected. + os: [ubuntu-latest, macos-15, windows-latest] steps: - uses: actions/checkout@v7 @@ -159,9 +163,15 @@ jobs: # its default Windows repair command — once we override # CIBW_REPAIR_WHEEL_COMMAND_WINDOWS we have to install it. CIBW_BEFORE_BUILD_WINDOWS: pip install delvewheel - # macOS: 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. + # macOS: Homebrew's bottled dylibs are built for the runner's OS, + # and delocate refuses to bundle dylibs whose min target is newer + # than the wheel's. So this value and the runner image are ONE + # decision: keep it equal to the pinned macos-15 in the matrix + # above. Do not switch that runner to macos-latest — GitHub rolled + # macos-latest to macOS 26 in July 2026, whose bottles target 26.0, + # which broke this job for six weeks (#18). Raising both together + # is a support-floor change: it drops every macOS user below the + # new value, so it is a release decision, not a CI tweak. MACOSX_DEPLOYMENT_TARGET: "15.0" CIBW_ENVIRONMENT_WINDOWS: >- CMAKE_TOOLCHAIN_FILE="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0871226..7cb9603 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -54,11 +54,17 @@ jobs: # macOS users fall back to a source build via the published # sdist for now; we'll add the x86_64 wheel back via # universal2 (or a self-hosted runner) in a follow-up. - # Deployment target must match the runner: Homebrew's bottled - # protobuf/abseil dylibs are built for the runner's macOS - # version (macos-latest = 15), and delocate refuses to bundle - # dylibs whose min target is newer than the wheel's. - - os: macos-latest + # The runner image and macosx_deployment_target below are ONE + # decision, not two: Homebrew's bottled protobuf/abseil dylibs are + # built for the runner's macOS version, and delocate refuses to + # bundle dylibs whose min target is newer than the wheel's. So the + # runner is pinned rather than -latest. GitHub rolled macos-latest + # to macOS 26 in July 2026, whose bottles target 26.0, silently + # breaking the macOS wheel against the 15.0 target here (#18). + # Raising this pair sets the published wheel's macOS support floor + # — it drops every macOS user below the new value — so it is a + # release decision. Keep the two values equal. + - os: macos-15 archs: "arm64" macosx_deployment_target: "15.0" - os: windows-latest