Skip to content

Commit 86ee46c

Browse files
bashtageclaude
andcommitted
BLD: Build a single wheel in each Linux job
Each ubuntu-latest job built three wheels for its Python version in a row: manylinux x86_64, manylinux aarch64 under QEMU emulation and musllinux x86_64. One job status covered all three wheels, and the Linux jobs of the run of 5 November took 35 to 66 minutes, against at most 24 minutes for all other jobs. - Build manylinux aarch64 natively on the ubuntu-24.04-arm runner and set CIBW_ARCHS_LINUX to native, so no wheel is built under emulation. The QEMU setup step is removed. - Add a variant dimension to the matrix. The musllinux variant of ubuntu-latest builds only the musllinux x86_64 wheel and all other jobs skip musllinux wheels, as before for aarch64. The set of wheels is unchanged. Tests are still skipped for aarch64. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
1 parent be4b282 commit 86ee46c

1 file changed

Lines changed: 26 additions & 12 deletions

File tree

‎.github/workflows/build-wheels.yml‎

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,22 @@ on:
1010

1111
jobs:
1212
build_wheels:
13-
name: ${{ matrix.os }}, ${{matrix.python_impl }} ${{ matrix.python }}
13+
name: ${{ matrix.os }}, ${{matrix.python_impl }} ${{ matrix.python }}${{ matrix.variant == 'musllinux' && ', musllinux' || '' }}
1414
runs-on: ${{ matrix.os }}
1515
defaults:
1616
run:
1717
shell: bash
1818
strategy:
1919
fail-fast: false
2020
matrix:
21-
os: [ubuntu-latest, windows-latest, macos-latest, macos-15-intel, windows-11-arm]
21+
# Every job builds a single wheel. Linux x86_64 has two wheels for each
22+
# Python (manylinux and musllinux), so it has two jobs; the musllinux
23+
# job is the one with variant musllinux. Linux aarch64 is built natively
24+
# on an ARM runner. See CIBW_SKIP and CIBW_ARCHS_LINUX below.
25+
os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, macos-latest, macos-15-intel, windows-11-arm]
2226
python: [cp310, cp311, cp312, cp313, cp314, cp314t, cp315, cp315t]
2327
python_impl: [Python]
28+
variant: [default, musllinux]
2429
include:
2530
- python: cp313
2631
os: ubuntu-latest
@@ -32,15 +37,30 @@ jobs:
3237
python: cp311
3338
- os: windows-11-arm
3439
python: cp312
40+
# No musllinux wheels for aarch64 and no separate musllinux job
41+
# outside of Linux x86_64
42+
- os: ubuntu-24.04-arm
43+
variant: musllinux
44+
- os: windows-latest
45+
variant: musllinux
46+
- os: macos-latest
47+
variant: musllinux
48+
- os: macos-15-intel
49+
variant: musllinux
50+
- os: windows-11-arm
51+
variant: musllinux
3552
env:
3653
BUILD_COMMIT: "main" # or a specific version, e.g., v0.13.1
3754
CIBW_BUILD: ${{ matrix.python }}-*
3855
CIBW_ENABLE: cpython-prerelease
39-
CIBW_ARCHS_LINUX: "x86_64 aarch64"
56+
# Build only for the architecture of the runner, so each job builds a
57+
# single wheel and nothing runs under emulation
58+
CIBW_ARCHS_LINUX: native
4059
CIBW_ARCHS_MACOS: native
41-
# No support for musl or Win32 for 3.10+
42-
# Skip musl for 3.8 and 3.9 since no upstream wheels
43-
CIBW_SKIP: "*-win32 *musllinux_aarch64*"
60+
# No support for Win32 for 3.10+
61+
# The musllinux variant builds only musllinux wheels, all other jobs
62+
# build no musllinux wheel (so there is no musllinux aarch64 wheel)
63+
CIBW_SKIP: "*-win32 ${{ matrix.variant == 'musllinux' && '*manylinux*' || '*musllinux*' }}"
4464
CIBW_TEST_REQUIRES: pytest pytest-xdist pytest-randomly threadpoolctl pytest-run-parallel pandas<3.1
4565
CIBW_TEST_COMMAND: python -c "import numpy; numpy.show_runtime(); import statsmodels; statsmodels.test(['-m','(not slow and not example)','-n','2','--randomly-dont-reset-seed'], exit=True)"
4666
# Avoid testing on emulated architectures and Pyodide
@@ -59,12 +79,6 @@ jobs:
5979
submodules: recursive
6080
fetch-depth: 0
6181

62-
- name: Set up QEMU
63-
if: runner.os == 'Linux'
64-
uses: docker/setup-qemu-action@v4
65-
with:
66-
platforms: all
67-
6882
- name: Build wheels (Default)
6983
uses: pypa/cibuildwheel@v4.3
7084
if: (matrix.python_impl != 'Pyodide')

0 commit comments

Comments
 (0)