From cdb02a28b7cd019a05d205e0f1952ab29eacbb35 Mon Sep 17 00:00:00 2001 From: David Seddon Date: Fri, 23 Oct 2026 17:46:13 +0100 Subject: [PATCH 1/2] Make missing Python 3.15 Linux wheels explicit instead of silent The cross-compilation Docker images used for Linux aarch64/armv7/s390x/ ppc64le, and all musllinux targets, don't yet bundle Python 3.15/3.15t. `--find-interpreter` was silently skipping those wheels; pin explicit interpreter lists per target instead so the gap is visible in the workflow and will resolve itself once those images add 3.15 support. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/release.yml | 40 +++++++++++++++++------------------ CHANGELOG.rst | 3 +++ 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 08cf2781..76d95fe8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,35 +22,36 @@ jobs: platform: - runner: ubuntu-latest target: x86_64 + interpreters: &full-interpreters '["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t", "3.15", "3.15t"]' - runner: ubuntu-latest target: x86 + interpreters: *full-interpreters + # ghcr.io/rust-cross/manylinux2014-cross (used for these targets, since there's no + # official manylinux2014 image for them) doesn't yet bundle Python 3.15/3.15t - it + # only goes up to 3.14/3.14t. - runner: ubuntu-latest target: aarch64 + interpreters: &cross-interpreters '["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"]' - runner: ubuntu-latest target: armv7 + interpreters: *cross-interpreters - runner: ubuntu-latest target: s390x + interpreters: *cross-interpreters - runner: ubuntu-latest target: ppc64le + interpreters: *cross-interpreters steps: - uses: actions/checkout@v5 - uses: actions/setup-python@v6 with: - python-version: | - 3.10 - 3.11 - 3.12 - 3.13 - 3.14 - 3.14t - 3.15 - 3.15t + python-version: ${{ join(fromJSON(matrix.platform.interpreters), fromJSON('"\n"')) }} allow-prereleases: true - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} - args: --release --out dist --find-interpreter + args: --release --out dist --interpreter ${{ join(fromJSON(matrix.platform.interpreters), ' ') }} sccache: 'true' manylinux: auto - name: Upload wheels @@ -64,33 +65,32 @@ jobs: strategy: matrix: platform: + # Unlike the `linux` job, all musllinux targets build inside + # ghcr.io/rust-cross/rust-musl-cross images (there's no official musllinux image), + # which don't yet bundle Python 3.15/3.15t - they only go up to 3.14/3.14t. - runner: ubuntu-latest target: x86_64 + interpreters: *cross-interpreters - runner: ubuntu-latest target: x86 + interpreters: *cross-interpreters - runner: ubuntu-latest target: aarch64 + interpreters: *cross-interpreters - runner: ubuntu-latest target: armv7 + interpreters: *cross-interpreters steps: - uses: actions/checkout@v5 - uses: actions/setup-python@v6 with: - python-version: | - 3.10 - 3.11 - 3.12 - 3.13 - 3.14 - 3.14t - 3.15 - 3.15t + python-version: ${{ join(fromJSON(matrix.platform.interpreters), fromJSON('"\n"')) }} allow-prereleases: true - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} - args: --release --out dist --find-interpreter + args: --release --out dist --interpreter ${{ join(fromJSON(matrix.platform.interpreters), ' ') }} sccache: 'true' manylinux: musllinux_1_2 - name: Upload wheels diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 64c244bc..c26d7d57 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,9 @@ latest * Fix missing macOS wheels for regular (non-freethreaded) Python 3.14+ (https://github.com/python-grimp/grimp/issues/317). +* No Python 3.15 wheels are published for Linux aarch64, armv7, s390x or ppc64le, or for any + musllinux target, since the Docker images used to build those don't yet support Python 3.15. + Previously the release workflow silently skipped these wheels; now it does so explicitly. * Fix imports in the ``else`` (or non-type checking ``elif``) branch of an ``if TYPE_CHECKING:`` statement being excluded by ``exclude_type_checking_imports``, even though they run at runtime. * Fix panic when a module declares its encoding using a name that Python accepts but that isn't a From 7777dd6b17c3bfb89fc657d5d6786ce0ec9b39d7 Mon Sep 17 00:00:00 2001 From: David Seddon Date: Fri, 23 Oct 2026 18:03:01 +0100 Subject: [PATCH 2/2] Build Linux aarch64 wheels on a native arm64 runner maturin-action uses the official quay.io/pypa/manylinux2014_aarch64 image for native arm64 builds, which already supports Python 3.15 - unlike the ghcr.io/rust-cross/manylinux2014-cross image used for cross-compiled aarch64 builds from an x86_64 runner. Switching the linux job's aarch64 target to ubuntu-24.04-arm lets it build the full interpreter set, closing that part of the gap left by the previous commit. musllinux aarch64 is unaffected, since maturin-action always uses rust-musl-cross for musl targets regardless of runner architecture. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/release.yml | 24 +++++++++++++++--------- CHANGELOG.rst | 7 ++++--- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 76d95fe8..8eb33066 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,15 +26,20 @@ jobs: - runner: ubuntu-latest target: x86 interpreters: *full-interpreters - # ghcr.io/rust-cross/manylinux2014-cross (used for these targets, since there's no - # official manylinux2014 image for them) doesn't yet bundle Python 3.15/3.15t - it - # only goes up to 3.14/3.14t. - - runner: ubuntu-latest + # A native arm64 runner, so maturin-action uses the official + # quay.io/pypa/manylinux2014_aarch64 image (same as x86_64/x86 above), rather than + # the ghcr.io/rust-cross/manylinux2014-cross cross-compilation image used for the + # remaining targets below, which doesn't yet bundle Python 3.15/3.15t. + - runner: ubuntu-24.04-arm target: aarch64 - interpreters: &cross-interpreters '["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"]' + interpreters: *full-interpreters + # ghcr.io/rust-cross/manylinux2014-cross (used for these targets, since there's no + # official manylinux2014 image for them, and no native GitHub-hosted runner for + # their architectures) doesn't yet bundle Python 3.15/3.15t - it only goes up to + # 3.14/3.14t. - runner: ubuntu-latest target: armv7 - interpreters: *cross-interpreters + interpreters: &cross-interpreters '["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"]' - runner: ubuntu-latest target: s390x interpreters: *cross-interpreters @@ -65,9 +70,10 @@ jobs: strategy: matrix: platform: - # Unlike the `linux` job, all musllinux targets build inside - # ghcr.io/rust-cross/rust-musl-cross images (there's no official musllinux image), - # which don't yet bundle Python 3.15/3.15t - they only go up to 3.14/3.14t. + # Unlike the `linux` job, all musllinux targets - including aarch64, even on a + # native arm64 runner - build inside ghcr.io/rust-cross/rust-musl-cross images + # (there's no official musllinux image for maturin-action to use natively), which + # don't yet bundle Python 3.15/3.15t - they only go up to 3.14/3.14t. - runner: ubuntu-latest target: x86_64 interpreters: *cross-interpreters diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c26d7d57..9b34bf94 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,9 +7,10 @@ latest * Fix missing macOS wheels for regular (non-freethreaded) Python 3.14+ (https://github.com/python-grimp/grimp/issues/317). -* No Python 3.15 wheels are published for Linux aarch64, armv7, s390x or ppc64le, or for any - musllinux target, since the Docker images used to build those don't yet support Python 3.15. - Previously the release workflow silently skipped these wheels; now it does so explicitly. +* Fix missing Linux aarch64 wheels for Python 3.15 by building on a native arm64 runner. +* No Python 3.15 wheels are published for Linux armv7, s390x or ppc64le, or for any musllinux + target, since the Docker images used to build those don't yet support Python 3.15. Previously + the release workflow silently skipped these wheels; now it does so explicitly. * Fix imports in the ``else`` (or non-type checking ``elif``) branch of an ``if TYPE_CHECKING:`` statement being excluded by ``exclude_type_checking_imports``, even though they run at runtime. * Fix panic when a module declares its encoding using a name that Python accepts but that isn't a