Compare commits

...
Author SHA1 Message Date
TT 29d36dc17d Use python -V -V for Windows build diagnostics (#2832) 2026-05-03 20:10:49 +05:30
dependabot[bot] a9f58eb656 chore(deps): bump the actions group with 3 updates (#2826) 2026-04-25 16:20:36 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 545670cbf5 chore(deps): bump the actions group with 5 updates (#2823)
Bumps the actions group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) | `7.6.0` | `8.0.0` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/create-github-app-token](https://github.com/actions/create-github-app-token) | `3.0.0` | `3.1.1` |
| [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) | `8.1.0` | `8.1.1` |


Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e...cef221092ed1bacb1cc03d23a2d87d1d172e277b)

Updates `astral-sh/setup-uv` from 7.6.0 to 8.0.0
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v7.6...cec208311dfd045dd5311c1add060b2062131d57)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

Updates `actions/create-github-app-token` from 3.0.0 to 3.1.1
- [Release notes](https://github.com/actions/create-github-app-token/releases)
- [Commits](https://github.com/actions/create-github-app-token/compare/f8d387b68d61c58ab83c6c016672934102569859...1b10c78c7865c340bc4f6099eb2f838309f1e8c3)

Updates `peter-evans/create-pull-request` from 8.1.0 to 8.1.1
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/c0f553fe549906ede9cf27b5156039d195d2ece0...5f6978faf089d4d20b00c7766989d076bb2fc7f1)

---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/create-github-app-token
  dependency-version: 3.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-25 07:31:36 +02:00
cibuildwheel-bot[bot]cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>Malcolm Smithmayeut
32b0ccc560 [Bot] Update dependencies (#2818)
* Update dependencies

* revert pyodide changes

those will be handled in #2812

---------

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
Co-authored-by: Malcolm Smith <smith@chaquo.com>
Co-authored-by: mayeut <mayeut@users.noreply.github.com>
2026-04-15 07:45:31 -04:00
f86700db67 chore: add PEP 723 metadata for various bin/ scripts, drop bin dependency group (#2819)
* Add PEP 723 metadata for various `bin` scripts

* Use a subprocess to install chromium

* Regenerate image

* Update shebangs

Co-Authored-By: Henry Schreiner <HenrySchreinerIII@gmail.com>

* Add cibuildwheel local dependency for some scripts

Co-Authored-By: Henry Schreiner <HenrySchreinerIII@gmail.com>

* Remove `bin` dependency group fully

* Add CSS for styling the diagram

Co-Authored-By: Joe Rickerby <1244307+joerick@users.noreply.github.com>

* Restore image to original

* Install `uv` for PyLint to find it

* Drop setup-python too in favour of setup-uv

* Revert "Drop setup-python too in favour of setup-uv"

This reverts commit 663db5c253f18bd09229ea5dbf92f7f6aa8ebf1c.

* Make `uv` venv backend for nox optional again

---------

Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
Co-authored-by: Joe Rickerby <1244307+joerick@users.noreply.github.com>
2026-04-15 07:36:04 -04:00
Malcolm Smith 46558a4e24 Update Android to Python 3.13.13 and 3.14.4 (#2821) 2026-04-13 16:08:48 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 023f45a968 chore(deps): bump astral-sh/setup-uv from 7.6.0 to 8.0.0 in the actions group (#2820)
chore(deps): bump astral-sh/setup-uv in the actions group

Bumps the actions group with 1 update: [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv).


Updates `astral-sh/setup-uv` from 7.6.0 to 8.0.0
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v7.6...cec208311dfd045dd5311c1add060b2062131d57)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-12 06:36:53 +05:30
1d5d9be23f docs: update "How it works" diagram with details of Android, iOS, and Pyodide builds (#2816)
* Update diagram with details of Android, iOS, and Pyodide builds

* Update diagram as well

* Simplify

Co-Authored-By: Malcolm Smith <smith@chaquo.com>

* Improve WCAG for some text elements

* Update diagram snapshot

* Modernise image generation script and rerun

---------

Co-authored-by: Malcolm Smith <smith@chaquo.com>
Co-authored-by: Joe Rickerby <joerick@mac.com>
2026-04-10 13:09:28 -04:00
Henry Schreiner a42e5d3563 fix: drop Cirrus CI (going away June 1, 2026) (#2817)
* fix: drop Cirrus CI (going away June 1, 2026)

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>

* Restore missing note

* Update CI services documentation for Cirrus CI

Removed official support for Cirrus CI due to end-of-life.

---------

Signed-off-by: Henry Schreiner <henryfs@princeton.edu>
2026-04-10 13:08:09 -04:00
Agriya Khetarpal d97b262640 Add missing CHANGELOG entries for Pyodide 0.29 updates (#2814) 2026-04-08 15:18:50 -04:00
Agriya KhetarpalandMatthieu Darbois 58977c129d docs: add a Pyodide icon and misc. stuff + regenerate projects and working examples data for Android, iOS, and Pyodide (#2815)
* Create greyed-out Pyodide icon

* Add Pyodide icon to NumPy and scikit-learn

* Add new Pyodide data to projects fields

* Allow local SVG usage if missing in simple-icons

* Fix deprecated `login_or_token` argument

* Regenerate working examples with Android, iOS, and Pyodide data

* Add Pyodide to the "Usage" table

* Add ⚠️⁵ to the table indicating Pyodide being untested

* add pybase64 to the list of projects building pyodide wheels

* Update and format table + maybe this looks nicer

* Downscale Pyodide SVG to 16px width

* Reformat tables and superscript references a bit more

---------

Co-authored-by: Matthieu Darbois <mayeut@users.noreply.github.com>
2026-04-08 13:46:50 -04:00
pre-commit-ci[bot]henryiiipre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>Henry Schreiner
075b5c8881 [pre-commit.ci] pre-commit autoupdate (#2813)
Co-authored-by: henryiii <4616906+henryiii@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
2026-04-07 14:46:13 +05:30
cibuildwheel-bot[bot] 3c2956fe9b [Bot] Update dependencies (#2810) 2026-04-07 01:08:46 -05:00
Matthieu Darbois 3dcb54150e docs: add Android & iOS to working examples (#2811) 2026-04-07 01:08:14 -05:00
Matthieu Darbois e2027266cd fix: android tests using the uv frontend (#2809)
Moving the tests to run cibuildwheel with Python 3.14 allow to see the failure.
2026-04-05 22:30:52 -05:00
Matthieu Darbois 314d2268ab fix(ci): use uv to run nox in the update-dependencies workflow (#2808)
While the `wntrblm/nox` action is itself pinned, it's a composite action using an unpinned `actions/setup-python` action which is now rejected.
Let's use `astral-sh/setup-uv` instead and run `nox` using `uv`.
2026-04-05 00:37:55 -05:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> b7e8713e11 chore(deps): bump the actions group with 2 updates (#2807)
Bumps the actions group with 2 updates: [hynek/build-and-inspect-python-package](https://github.com/hynek/build-and-inspect-python-package) and [j178/prek-action](https://github.com/j178/prek-action).


Updates `hynek/build-and-inspect-python-package` from 2.14.0 to 2.17.0
- [Release notes](https://github.com/hynek/build-and-inspect-python-package/releases)
- [Changelog](https://github.com/hynek/build-and-inspect-python-package/blob/main/CHANGELOG.md)
- [Commits](https://github.com/hynek/build-and-inspect-python-package/compare/efb823f52190ad02594531168b7a2d5790e66516...fe0a0fb1925ca263d076ca4f2c13e93a6e92a33e)

Updates `j178/prek-action` from 2.0.0 to 2.0.1
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](https://github.com/j178/prek-action/compare/79f765515bd648eb4d6bb1b17277b7cb22cb6468...53276d8b0d10f8b6672aa85b4588c6921d0370cc)

---
updated-dependencies:
- dependency-name: hynek/build-and-inspect-python-package
  dependency-version: 2.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-05 02:36:22 +05:30
Henry Schreiner 2f9518f182 docs: link back to source (#2806)
* docs: add a link back to source

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

* docs: promote Agriya

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

---------

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
2026-04-03 20:06:12 -05:00
Agriya KhetarpalandJoe Rickerby 8d75eb7a82 Apply Pyodide-specific patches to our Emscripten toolchain installation (#2800)
Co-authored-by: Joe Rickerby <joerick@mac.com>
2026-04-03 11:05:57 +05:30
71 changed files with 919 additions and 942 deletions
-91
View File
@@ -1,91 +0,0 @@
only_if: changesInclude('.cirrus.yml') || ($CIRRUS_BRANCH == "main" && !changesIncludeOnly('.github/*', 'bin/*', 'docs/*', '.circleci/*', '.travis.yml', '.pre-commit-config.yaml', '.readthedocs.yml', 'azure-pipelines.yml', 'README.md', 'mkdocs.yml', 'noxfile.py')) || $CIRRUS_BRANCH =~ 'cirrus.*'
run_tests: &RUN_TESTS
install_cibuildwheel_script:
- python -m pip install -U pip
- python -m pip install -e. --group test
run_cibuildwheel_tests_script:
- python ./bin/run_tests.py
linux_x86_task:
timeout_in: 120m
compute_engine_instance:
image_project: cirrus-images
image: family/docker-builder
platform: linux
cpu: 8
memory: 8G
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script:
- docker run --rm --privileged docker.io/tonistiigi/binfmt:latest --install all
- add-apt-repository -y ppa:deadsnakes/ppa
- apt-get update
- apt-get install -y python3.12-venv
- python3.12 -m venv ${VENV_ROOT}
<<: *RUN_TESTS
linux_aarch64_task:
compute_engine_instance:
image_project: cirrus-images
image: family/docker-builder-arm64
architecture: arm64
platform: linux
cpu: 4
memory: 4G
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script:
- docker run --rm --privileged docker.io/tonistiigi/binfmt:latest --install all
- add-apt-repository -y ppa:deadsnakes/ppa
- apt-get update
- apt-get install -y python3.12-venv
- python3.12 -m venv ${VENV_ROOT}
<<: *RUN_TESTS
windows_x86_task:
# The task takes ~55 minutes while the timeout happens after 60 minutes by default,
# let's allow some wiggle room.
timeout_in: 120m
windows_container:
image: cirrusci/windowsservercore:visualstudio2022
cpu: 8
memory: 8G
install_pre_requirements_script:
- certutil -generateSSTFromWU roots.sst
- certutil -addstore -f root roots.sst
- del roots.sst
- choco install -y --no-progress python3 --version 3.12.4
- refreshenv
- powershell -Command "$cleanPath = $env:PATH -replace ';+$', ''; Add-Content -Path $env:CIRRUS_ENV -Value ('PATH=' + $cleanPath)"
<<: *RUN_TESTS
macos_arm64_task:
macos_instance:
image: ghcr.io/cirruslabs/macos-runner:sequoia
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script:
- brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
<<: *RUN_TESTS
macos_arm64_cp38_task:
macos_instance:
image: ghcr.io/cirruslabs/macos-runner:sequoia
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
PYTEST_ADDOPTS: --run-cp38-universal2 -k 'test_cp38_arm64_testing_universal2_installer or test_arch_auto or test_dummy_serial'
install_pre_requirements_script:
- brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
- curl -fsSLO https://www.python.org/ftp/python/3.8.10/python-3.8.10-macos11.pkg
- sudo installer -pkg python-3.8.10-macos11.pkg -target /
- rm python-3.8.10-macos11.pkg
- sh "/Applications/Python 3.8/Install Certificates.command"
<<: *RUN_TESTS
+2 -2
View File
@@ -17,7 +17,7 @@ jobs:
with:
persist-credentials: false
- uses: hynek/build-and-inspect-python-package@efb823f52190ad02594531168b7a2d5790e66516 # v2.14.0
- uses: hynek/build-and-inspect-python-package@fe0a0fb1925ca263d076ca4f2c13e93a6e92a33e # v2.17.0
publish:
needs: [dist]
@@ -41,6 +41,6 @@ jobs:
with:
subject-path: "dist/cibuildwheel-*"
- uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
with:
attestations: true
+11 -13
View File
@@ -43,14 +43,12 @@ jobs:
with:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
id: python
with:
python-version: "3.x"
- uses: j178/prek-action@79f765515bd648eb4d6bb1b17277b7cb22cb6468 # v2.0.0
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- uses: j178/prek-action@cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3 # v2.0.2
- name: PyLint checks
run: pipx run --python "${STEPS_PYTHON_OUTPUTS_PYTHON_PATH}" nox -s pylint -- --output-format=github
env:
STEPS_PYTHON_OUTPUTS_PYTHON_PATH: ${{ steps.python.outputs.python-path }}
run: uvx nox -s pylint -- --output-format=github
sample:
name: Generate a sample project
@@ -64,12 +62,12 @@ jobs:
name: Install Python
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- name: Install dependencies
run: uv sync --no-dev --group test
- name: Generate a sample project
run: uv run --no-sync -m test.test_projects test.test_0_basic.basic_project sample_proj
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: sample_proj
path: sample_proj
@@ -89,7 +87,7 @@ jobs:
- os: ubuntu-latest
python_version: '3.14'
- os: ubuntu-latest
python_version: '3.13'
python_version: '3.14'
test_select: android
- os: ubuntu-24.04-arm
python_version: '3.13'
@@ -128,7 +126,7 @@ jobs:
python-version: ${{ matrix.python_version }}
allow-prereleases: true
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- name: Free up disk space
if: runner.os == 'Linux' && matrix.test_select != 'android'
@@ -232,7 +230,7 @@ jobs:
run: |
test $(find wheelhouse_only -name '*.whl' | wc -l) -eq 1
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
path: wheelhouse/*.whl
@@ -255,7 +253,7 @@ jobs:
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- name: Install dependencies
run: uv sync --no-dev --group test
- name: Get qemu emulated architectures
@@ -280,7 +278,7 @@ jobs:
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- name: Install dependencies
run: uv sync --no-dev --group test
@@ -305,7 +303,7 @@ jobs:
name: Install Python 3.12
with:
python-version: '3.12'
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- name: Install dependencies
run: uv sync --no-dev --group test
+8 -6
View File
@@ -28,7 +28,7 @@ jobs:
# we use this step to grab a Github App auth token, so that PRs generated by this workflow
# run the GHA tests.
- uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
id: generate-token
if: github.ref == 'refs/heads/main' && github.repository == 'pypa/cibuildwheel'
with:
@@ -39,18 +39,20 @@ jobs:
with:
persist-credentials: false
- uses: wntrblm/nox@5a277b752f6094150e25237d47c34168e2b7526e # 2026.02.09
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "3.14"
- name: "Run update: dependencies"
run: nox --force-color -s update_constraints
run: uvx nox --force-color -s update_constraints
- name: "Run update: python configs"
run: nox --force-color -s update_pins
run: uvx nox --force-color -s update_pins
- name: "Run update: docs user projects"
run: nox --force-color -s update_proj -- --auth=${{ secrets.GITHUB_TOKEN }}
run: uvx nox --force-color -s update_proj -- --auth=${{ secrets.GITHUB_TOKEN }}
- name: Create Pull Request
if: github.ref == 'refs/heads/main' && github.repository == 'pypa/cibuildwheel'
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
commit-message: Update dependencies
title: '[Bot] Update dependencies'
+1 -1
View File
@@ -21,4 +21,4 @@ jobs:
persist-credentials: false
- name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8 # v0.5.2
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
+5 -4
View File
@@ -14,21 +14,22 @@ repos:
exclude: (cibuildwheel/resources/pinned_docker_images.cfg)|(.svg$)
- id: mixed-line-ending
- id: trailing-whitespace
exclude: ^cibuildwheel/resources/android/android.patch$
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: 4924b0e01e032fea073ad04a1c5cfa7e4add0afb # frozen: v0.15.6
rev: c60c980e561ed3e73101667fe8365c609d19a438 # frozen: v0.15.9
hooks:
- id: ruff-check
args: ["--fix"]
- id: ruff-format
- repo: https://github.com/pre-commit/mirrors-mypy
rev: a66e98df7b4aeeb3724184b332785976d062b92e # frozen: v1.19.1
rev: 8e5c80792e2ec0c87804d8ef915bf35e2caea6da # frozen: v1.20.0
hooks:
- id: mypy
name: mypy 3.11 on cibuildwheel/
args: ["--python-version=3.11"]
exclude: ^cibuildwheel/resources/_cross_venv.py$ # Requires Python 3.13 or later
exclude: ^cibuildwheel/resources/android/_cross_venv.py$ # Requires Python 3.13 or later
additional_dependencies: &mypy-dependencies
- bracex
- build
@@ -85,7 +86,7 @@ repos:
- repo: https://github.com/python-jsonschema/check-jsonschema
rev: 9f48a48aa91a6040d749ad68ec70907d907a5a7f # frozen: 0.37.0
rev: ed81924a8b1cecdaa570b072528fa80c9c4d6ccd # frozen: 0.37.1
hooks:
- id: check-dependabot
- id: check-github-actions
+5 -5
View File
@@ -1,9 +1,9 @@
This is a summary of the host Python versions and platforms covered by the different CI platforms:
| | 3.11 | 3.12 | 3.13 | 3.14 |
|---------|----------------------------------|---------------------------------|----------------|----------------|
| Linux | Azure Pipelines / GitHub Actions | CircleCI¹ / Cirrus CI / GitLab¹ | GitHub Actions | GitHub Actions |
| macOS | Azure Pipelines | CircleCI¹ / Cirrus CI / GitLab¹ | GitHub Actions | |
| Windows | Azure Pipelines | Cirrus CI / GitLab¹ | GitHub Actions | |
| | 3.11 | 3.12 | 3.13 | 3.14 |
|---------|----------------------------------|-----------------------|----------------|----------------|
| Linux | Azure Pipelines / GitHub Actions | CircleCI¹ / GitLab¹ | GitHub Actions | GitHub Actions |
| macOS | Azure Pipelines | CircleCI¹ / GitLab¹ | GitHub Actions | |
| Windows | Azure Pipelines | GitLab¹ | GitHub Actions | |
> ¹ Runs a reduced set of tests to reduce CI load
+43 -40
View File
@@ -22,30 +22,30 @@ What does it do?
While cibuildwheel itself requires a recent Python version to run (we support the last three releases), it can target the following versions to build wheels:
| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux<br/>musllinux x86_64 | manylinux<br/>musllinux i686 | manylinux<br/>musllinux aarch64 | manylinux<br/>musllinux ppc64le | manylinux<br/>musllinux s390x | manylinux<br/>musllinux armv7l | Android | iOS | Pyodide |
|--------------------|----|-----|----|-----|-----|----|-----|----|-----|-----|---|-----|-----|-----|
| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | ✅ |
| CPython 3.13³ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | ✅ | ✅ |
| CPython 3.14 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | ✅ | N/A |
| PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
| GraalPy 3.11 v24.2 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | N/A | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
| GraalPy 3.12 v25.0 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | N/A | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux<br/>musllinux x86_64 | manylinux<br/>musllinux i686 | manylinux<br/>musllinux aarch64 | manylinux<br/>musllinux ppc64le | manylinux<br/>musllinux s390x | manylinux<br/>musllinux armv7l | Android | iOS | Pyodide |
| ------------------------ | ----------- | ------------------- | ------------- | ------------- | -------------- | ------------------------------ | ---------------------------- | ------------------------------- | ------------------------------- | ----------------------------- | ------------------------------ | ------- | --- | -------------- |
| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>5</sup> | N/A | N/A | N/A |
| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>5</sup> | N/A | N/A | N/A |
| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>5</sup> | N/A | N/A | N/A |
| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>5</sup> | N/A | N/A | N/A |
| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>5</sup> | N/A | N/A | ✅<sup>4</sup> |
| CPython 3.13<sup>3</sup> | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>5</sup> | ✅ | ✅ | ✅<sup>4</sup> |
| CPython 3.14 | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>5</sup> | ✅ | ✅ | N/A |
| PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| GraalPy 3.11 v24.2 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | N/A | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
| GraalPy 3.12 v25.0 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | N/A | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
<sup>¹ PyPy & GraalPy are only supported for manylinux wheels.</sup><br>
<sup>² Windows arm64 support is experimental.</sup><br>
<sup>³ Free-threaded mode requires opt-in on 3.13 using [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).</sup><br>
<sup> Experimental, not yet supported on PyPI, but can be used directly in web deployment. Use `--platform pyodide` to build.</sup><br>
<sup> manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.</sup><br>
<sup>**1** PyPy & GraalPy are only supported for manylinux wheels.</sup><br>
<sup>**2** Windows arm64 support is experimental.</sup><br>
<sup>**3** Free-threaded mode requires opt-in on 3.13 using [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).</sup><br>
<sup>**4** Experimental, not yet supported on PyPI, but can be used directly in web deployment. Use `--platform pyodide` to build.</sup><br>
<sup>**5** manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.</sup><br>
- Builds manylinux, musllinux, macOS, and Windows wheels for CPython, PyPy, and GraalPy
- Works on GitHub Actions, Azure Pipelines, CircleCI, GitLab CI, and Cirrus CI
- Works on GitHub Actions, Azure Pipelines, CircleCI, and GitLab CI
- Bundles shared library dependencies on Linux and macOS through [auditwheel](https://github.com/pypa/auditwheel) and [delocate](https://github.com/matthew-brett/delocate)
- Runs your library's tests against the wheel-installed version of your library
@@ -56,18 +56,18 @@ Usage
`cibuildwheel` runs inside a CI service. Supported platforms depend on which service you're using:
| | Linux | macOS | Windows | Linux ARM | macOS ARM | Windows ARM | Android | iOS |
|-----------------|-------|-------|---------|-----------|-----------|-------------|---------|-----|
| GitHub Actions | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅⁴ | ✅³ |
| Azure Pipelines | ✅ | ✅ | ✅ | | ✅ | ✅² | ✅⁴ | ✅³ |
| CircleCI | ✅ | ✅ | | ✅ | ✅ | | ✅⁴ | ✅³ |
| Gitlab CI | ✅ | ✅ | ✅ | ✅¹ | ✅ | | ✅⁴ | ✅³ |
| Cirrus CI | ✅ | ✅ | ✅ | ✅ | ✅ | | ✅⁴ | |
| | Linux | macOS | Windows | Linux ARM | macOS ARM | Windows ARM | Android | iOS | Pyodide |
| --------------- | ----- | ----- | ------- | -------------- | --------- | -------------- | -------------------------- | -------------------------- | -------------- |
| GitHub Actions | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<sup>2</sup> | ✅<sup>4</sup> | ✅<sup>3</sup> | ✅ |
| Azure Pipelines | ✅ | ✅ | ✅ | | ✅ | ✅<sup>2</sup> | ✅<sup>4</sup> | ✅<sup>3</sup> | ✅<sup>5</sup> |
| CircleCI | ✅ | ✅ | | ✅ | ✅ | | ✅<sup>4</sup><sup>5</sup> | ✅<sup>3</sup><sup>5</sup> | ✅<sup>5</sup> |
| GitLab CI | ✅ | ✅ | ✅ | ✅<sup>1</sup> | ✅ | | ✅<sup>4</sup><sup>5</sup> | ✅<sup>3</sup><sup>5</sup> | ✅<sup>5</sup> |
<sup>¹ [Requires emulation](https://cibuildwheel.pypa.io/en/stable/faq/#emulation), distributed separately. Other services may also support Linux ARM through emulation or third-party build hosts, but these are not tested in our CI.</sup><br>
<sup>² [Uses cross-compilation](https://cibuildwheel.pypa.io/en/stable/faq/#windows-arm64). It is not possible to test `arm64` on this CI platform.</sup><br>
<sup>³ Requires a macOS runner; runs tests on the simulator for the runner's architecture. </sup><br>
<sup> Building for Android requires the runner to be Linux x86_64, macOS ARM64 or macOS x86_64. Testing has [additional requirements](https://cibuildwheel.pypa.io/en/stable/platforms/#android).</sup><br>
<sup>**1** [Requires emulation](https://cibuildwheel.pypa.io/en/stable/faq/#emulation), distributed separately. Other services may also support Linux ARM through emulation or third-party build hosts, but these are not tested in our CI.</sup><br>
<sup>**2** [Uses cross-compilation](https://cibuildwheel.pypa.io/en/stable/faq/#windows-arm64). It is not possible to test `arm64` on this CI platform.</sup><br>
<sup>**3** Requires a macOS runner; runs tests on the simulator for the runner's architecture. </sup><br>
<sup>**4** Building for Android requires the runner to be Linux x86_64, macOS ARM64 or macOS x86_64. Testing has [additional requirements](https://cibuildwheel.pypa.io/en/stable/platforms/#android).</sup><br>
<sup>**5** Builds may work, but are untested in cibuildwheel's CI.</sup><br>
<!--intro-end-->
@@ -185,16 +185,16 @@ Here are some repos that use cibuildwheel.
| Name | CI | OS | Notes |
|-----------------------------------|----|----|:------|
| [scikit-learn][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The machine learning library. A complex but clean config using many of cibuildwheel's features to build a large project with Cython and C++ extensions. |
| [scikit-learn][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | The machine learning library. A complex but clean config using many of cibuildwheel's features to build a large project with Cython and C++ extensions. |
| [duckdb][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | DuckDB is an analytical in-process SQL database management system |
| [pytorch-fairseq][] | ![github icon][] | ![apple icon][] ![linux icon][] | Facebook AI Research Sequence-to-Sequence Toolkit written in Python. |
| [NumPy][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The fundamental package for scientific computing with Python. |
| [NumPy][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | The fundamental package for scientific computing with Python. |
| [NCNN][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | ncnn is a high-performance neural network inference framework optimized for the mobile platform |
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The venerable Matplotlib, a Python library with C++ portions |
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | The venerable Matplotlib, a Python library with C++ portions |
| [Tornado][] | ![github icon][] | ![linux icon][] ![apple icon][] ![windows icon][] | Tornado is a Python web framework and asynchronous networking library. Uses stable ABI for a small C extension. |
| [MyPy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | The compiled version of MyPy using MyPyC. |
| [Prophet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Tool for producing high quality forecasts for time series data that has multiple seasonality with linear or non-linear growth. |
| [Kivy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS |
| [Triton][] | ![github icon][] | ![linux icon][] | Self hosted runners |
[scikit-learn]: https://github.com/scikit-learn/scikit-learn
[duckdb]: https://github.com/duckdb/duckdb
@@ -205,17 +205,19 @@ Here are some repos that use cibuildwheel.
[Tornado]: https://github.com/tornadoweb/tornado
[MyPy]: https://github.com/mypyc/mypy_mypyc-wheels
[Prophet]: https://github.com/facebook/prophet
[Kivy]: https://github.com/kivy/kivy
[Triton]: https://github.com/openai/triton
[github icon]: docs/data/readme_icons/github.svg
[azurepipelines icon]: docs/data/readme_icons/azurepipelines.svg
[circleci icon]: docs/data/readme_icons/circleci.svg
[gitlab icon]: docs/data/readme_icons/gitlab.svg
[travisci icon]: docs/data/readme_icons/travisci.svg
[cirrusci icon]: docs/data/readme_icons/cirrusci.svg
[windows icon]: docs/data/readme_icons/windows.svg
[apple icon]: docs/data/readme_icons/apple.svg
[linux icon]: docs/data/readme_icons/linux.svg
[android icon]: docs/data/readme_icons/android.svg
[ios icon]: docs/data/readme_icons/ios.svg
[pyodide icon]: docs/data/readme_icons/pyodide.svg
<!-- END bin/projects.py -->
@@ -252,6 +254,7 @@ _5 March 2026_
- 🌟 You can now build wheels using `uv` as a build frontend. This should improve performance, especially if your project has lots of build dependencies. To use, set [`build-frontend`](https://cibuildwheel.pypa.io/en/stable/options/#build-frontend) to `uv`. (#2322)
- ⚠️ We no longer support running on Travis CI. It may continue working but we don't run tests there anymore so we can't be sure. (#2682)
- ✨ Improvements to building rust wheels on Android (#2650)
- 🛠 Update Pyodide to 0.29.3 (#2719, #2733)
- 🐛 Fix bug with the GitHub Action on Windows, where PATH was getting unnecessarily changed, causing issues with meson builds. (#2723)
- ✨ Add support for quiet setting on `build` and `uv` from the cibuildwheel `build-verbosity` setting. (#2737)
- 📚 Docs updates, including guidance on using Meson on Windows (#2718)
@@ -284,7 +287,7 @@ _12 October 2025_
- 🐛 Fix the default MACOSX_DEPLOYMENT_TARGET on Python 3.14 (#2613)
- 📚 Docs improvements (#2617)
<!-- [[[end]]] (sum: NOLMd9iLDC) -->
<!-- [[[end]]] (sum: h5X+wOmWfI) -->
---
@@ -311,11 +314,11 @@ Core:
- Matthieu Darbois [@mayeut](https://github.com/mayeut)
- Henry Schreiner [@henryiii](https://github.com/henryiii)
- Grzegorz Bokota [@Czaki](https://github.com/Czaki)
- Agriya Khetarpal [@agriyakhetarpal](https://github.com/agriyakhetarpal) (also Pyodide)
Platform maintainers:
- Russell Keith-Magee [@freakboy3742](https://github.com/freakboy3742) (iOS)
- Agriya Khetarpal [@agriyakhetarpal](https://github.com/agriyakhetarpal) (Pyodide)
- Hood Chatham [@hoodmane](https://github.com/hoodmane) (Pyodide)
- Gyeongjae Choi [@ryanking13](https://github.com/ryanking13) (Pyodide)
- Tim Felgentreff [@timfel](https://github.com/timfel) (GraalPy)
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = ["click", "packaging", "prek"]
+11 -1
View File
@@ -1,4 +1,14 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
import sys
import textwrap
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env -S uv run -q
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = ["pyyaml"]
+14 -1
View File
@@ -1,4 +1,17 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "pygithub",
# "pyyaml",
# "rich",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
"""
Check known projects for usage of requires-python.
+7 -1
View File
@@ -1,4 +1,10 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# ]
# ///
import os
+14 -6
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
@@ -20,6 +20,7 @@ Suggested usage:
import builtins
import functools
import textwrap
import urllib.error
import urllib.request
import xml.dom.minidom
from collections.abc import Iterable, Mapping, Sequence
@@ -30,7 +31,7 @@ from typing import Any, Self, TextIO
import click
import yaml
from github import Github, GithubException
from github import Auth, Github, GithubException
ICONS = (
"github",
@@ -38,10 +39,12 @@ ICONS = (
"circleci",
"gitlab",
"travisci",
"cirrusci",
"windows",
"apple",
"linux",
"android",
"ios",
"pyodide",
)
@@ -130,8 +133,13 @@ class Project:
def fetch_icon(icon_name: str) -> None:
url = f"https://cdn.jsdelivr.net/npm/simple-icons@v4/icons/{icon_name}.svg"
with urllib.request.urlopen(url) as f:
original_svg_data = f.read()
try:
with urllib.request.urlopen(url) as f:
original_svg_data = f.read()
except urllib.error.HTTPError as e:
if e.code == 404 and path_for_icon(icon_name).exists():
return
raise
document = xml.dom.minidom.parseString(original_svg_data)
svgElement = document.documentElement
@@ -165,7 +173,7 @@ def get_projects(
for icon in ICONS:
fetch_icon(icon)
github = Github(auth) if online else None
github = Github(auth=Auth.Token(auth)) if (online and auth) else None
return sorted((Project(item, github) for item in config), reverse=online)
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
import re
from pathlib import Path
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
import dataclasses
import re
+7 -6
View File
@@ -1,4 +1,10 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# ]
# ///
import os
@@ -115,11 +121,6 @@ services = [
dst_config_path=".gitlab-ci.yml",
badge_md="[![Gitlab](https://gitlab.com/joerick/cibuildwheel/badges/{branch}/pipeline.svg)](https://gitlab.com/joerick/cibuildwheel/-/commits/{branch})",
),
CIService(
name="cirrus-ci",
dst_config_path=".cirrus.yml",
badge_md="[![Cirrus CI](https://api.cirrus-ci.com/github/pypa/cibuildwheel.svg?branch={branch})](https://cirrus-ci.com/github/pypa/cibuildwheel/{branch})",
),
]
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
import argparse
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
import argparse
+8 -1
View File
@@ -1,4 +1,11 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "packaging",
# "requests",
# ]
# ///
import configparser
import dataclasses
+43 -32
View File
@@ -1,49 +1,60 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "playwright",
# ]
# ///
import subprocess
import sys
import tempfile
from pathlib import Path
try:
from html2image import Html2Image # type: ignore[import-not-found]
except ImportError:
sys.exit(
"""
html2image not found. Ensure you have Chrome (on Mac/Windows) or
Chromium (on Linux) installed, and then do:
pip install html2image
"""
)
from playwright.sync_api import sync_playwright # type: ignore[import-not-found]
CSS = """
<link href="https://fonts.googleapis.com/css2?family=Lato&display=swap" rel="stylesheet">
<style>
html, body {
font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: 400;
font-size: 16px;
color: #404040;
background: white;
margin: 0;
padding: 0;
}
* {
box-sizing: border-box;
}
</style>
"""
def main() -> None:
subprocess.run(["mkdocs", "build"], check=True)
subprocess.run([sys.executable, "-m", "playwright", "install", "chromium"], check=True)
hti = Html2Image(custom_flags=["--force-device-scale-factor=2"])
html_str = Path("docs/diagram.html").read_text()
html_str = f"<html><head>{CSS}</head><body>{html_str}</body></html>"
html_str = Path("docs/diagram.md").read_text()
css_tags = f"""
<style>{Path("site/css/theme.css").read_text()}</style>
<style>{Path("site/css/theme_extra.css").read_text()}</style>
<style>{Path("site/extra.css").read_text()}</style>
<style>
body {{
background: white;
}}
</style>
"""
html_str = css_tags + html_str
with tempfile.TemporaryDirectory() as tmp_dir_str:
html_path = Path(tmp_dir_str) / "diagram_screenshot.html"
html_path.write_text(html_str)
[screenshot, *_] = hti.screenshot(
html_str=html_str,
size=(830, 405),
)
dest_path = Path("docs/data/how-it-works.png")
dest_path = Path("docs/data/how-it-works.png")
dest_path.unlink(missing_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page(device_scale_factor=2, viewport={"width": 830, "height": 600})
page.goto(html_path.as_uri())
page.wait_for_load_state("networkidle")
Path(screenshot).rename(dest_path)
height = page.evaluate("document.body.scrollHeight")
page.set_viewport_size({"width": 830, "height": height})
page.screenshot(path=str(dest_path), full_page=True)
browser.close()
if __name__ == "__main__":
+10 -1
View File
@@ -1,4 +1,13 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "packaging",
# "requests",
# "rich",
# ]
# ///
import dataclasses
+10 -1
View File
@@ -1,4 +1,13 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
import json
+14 -1
View File
@@ -1,4 +1,17 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "packaging",
# "requests",
# "rich",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
import difflib
+13 -1
View File
@@ -1,4 +1,16 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "packaging",
# "rich",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
import dataclasses
-3
View File
@@ -14,7 +14,6 @@ class CIProvider(Enum):
azure_pipelines = "azure_pipelines"
github_actions = "github_actions"
gitlab = "gitlab"
cirrus_ci = "cirrus_ci"
# unofficial support
appveyor = "appveyor"
@@ -35,8 +34,6 @@ def detect_ci_provider() -> CIProvider | None:
return CIProvider.github_actions
elif "GITLAB_CI" in os.environ:
return CIProvider.gitlab
elif "CIRRUS_CI" in os.environ:
return CIProvider.cirrus_ci
elif strtobool(os.environ.get("CI", "false")):
return CIProvider.other
else:
+14 -4
View File
@@ -36,6 +36,8 @@ from cibuildwheel.util.packaging import find_compatible_wheel
from cibuildwheel.util.python_build_standalone import create_python_build_standalone_environment
from cibuildwheel.venv import constraint_flags, find_uv, virtualenv
RESOURCES_ANDROID = resources.PATH / "android"
ANDROID_TRIPLET = {
"arm64_v8a": "aarch64-linux-android",
"x86_64": "x86_64-linux-android",
@@ -176,6 +178,11 @@ def setup_target_python(config: PythonConfiguration, build_path: Path) -> Path:
python_dir = build_path / "python"
python_dir.mkdir()
shutil.unpack_archive(python_tgz, python_dir)
# Patch a testbed bug. This code and the patch file can both be removed once we've
# updated to Python versions that include the fix.
call("patch", "-p1", "-i", RESOURCES_ANDROID / "android.patch", cwd=python_dir)
return python_dir
@@ -222,7 +229,10 @@ def setup_env(
f"or insert {command} above it."
)
raise errors.FatalError(msg)
call(command, "--version", env=build_env)
if command == "python":
call(command, "-V", "-V", env=build_env)
else:
call(command, "--version", env=build_env)
# Construct an altered environment which simulates running on Android.
android_env = setup_android_env(config, python_dir, venv_dir, build_env)
@@ -350,7 +360,7 @@ def setup_android_env(
) -> dict[str, str]:
site_packages = next(venv_dir.glob("lib/python*/site-packages"))
for suffix in ["pth", "py"]:
shutil.copy(resources.PATH / f"_cross_venv.{suffix}", site_packages)
shutil.copy(RESOURCES_ANDROID / f"_cross_venv.{suffix}", site_packages)
sysconfigdata_path = Path(
shutil.copy(
@@ -425,7 +435,7 @@ def setup_rust(
venv_bin = Path(env["VIRTUAL_ENV"]) / "bin"
for tool in ["cargo", "rustup"]:
shim_path = venv_bin / tool
shutil.copy(resources.PATH / "_rust_shim.py", shim_path)
shutil.copy(RESOURCES_ANDROID / "rust_shim.py", shim_path)
shim_path.chmod(0o755)
@@ -632,7 +642,7 @@ def test_wheel(state: BuildState, wheel: Path, *, build_frontend: str) -> None:
return
log.step("Testing wheel...")
use_uv = build_frontend == "build[uv]"
use_uv = build_frontend in {"build[uv]", "uv"}
uv_path = find_uv()
if use_uv and uv_path is None:
msg = "uv not found"
+1 -1
View File
@@ -355,7 +355,7 @@ def setup_python(
"entry or insert python above it."
)
raise errors.FatalError(msg)
call("python", "--version", env=env)
call("python", "-V", "-V", env=env)
# Check what pip version we're on
assert (venv_bin_path / "pip").exists()
+2 -2
View File
@@ -237,6 +237,7 @@ def build_in_container(
if PurePosixPath(which_python) != python_bin / "python":
msg = "python available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert python above it."
raise errors.FatalError(msg)
container.call(["python", "-V", "-V"], env=env)
if use_uv:
which_uv = container.call(["which", "uv"], env=env, capture_output=True).strip()
@@ -481,8 +482,7 @@ def build(options: Options, tmp_path: Path) -> None:
Docker or Podman is required to run Linux builds. If you're
building on Travis CI, add `services: [docker]` to your
.travis.yml. If you're building on Circle CI in Linux, add a
`setup_remote_docker` step to your .circleci/config.yml. If
you're building on Cirrus CI, use `docker_builder` task.
`setup_remote_docker` step to your .circleci/config.yml.
"""
)
raise errors.ConfigurationError(msg) from error
+1 -1
View File
@@ -270,7 +270,7 @@ def setup_python(
if which_python != str(venv_bin_path / "python"):
msg = "python available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert python above it."
raise errors.FatalError(msg)
call("python", "--version", env=env)
call("python", "-V", "-V", env=env)
# check what pip version we're on
if not use_uv:
+33 -26
View File
@@ -94,21 +94,28 @@ def ensure_node(major_version: str) -> Path:
return path
def install_emscripten(tmp: Path, version: str) -> Path:
url = f"https://github.com/emscripten-core/emsdk/archive/refs/tags/{version}.zip"
installation_path = CIBW_CACHE_PATH / f"emsdk-{version}"
emsdk_path = installation_path / f"emsdk-{version}/emsdk"
emcc_path = installation_path / f"emsdk-{version}/upstream/emscripten/emcc"
with FileLock(f"{installation_path}.lock"):
if installation_path.exists():
def install_emscripten(
env: dict[str, str], version: str, xbuildenv_cache_path: Path, pyodide_version: str
) -> Path:
"""Install Emscripten via pyodide-build, which also applies Pyodide-specific patches."""
emcc_path = (
xbuildenv_cache_path / pyodide_version / "emsdk" / "upstream" / "emscripten" / "emcc"
)
with FileLock(CIBW_CACHE_PATH / "emscripten.lock"):
if emcc_path.exists():
return emcc_path
emsdk_zip = tmp / "emsdk.zip"
download(url, emsdk_zip)
installation_path.mkdir()
extract_zip(emsdk_zip, installation_path)
call(emsdk_path, "install", version)
call(emsdk_path, "activate", version)
call(
"pyodide",
"xbuildenv",
"install-emscripten",
"--version",
version,
"--path",
str(xbuildenv_cache_path),
env=env,
cwd=CIBW_CACHE_PATH,
)
assert emcc_path.exists()
return emcc_path
@@ -180,12 +187,8 @@ def validate_pyodide_build_version(
raise errors.FatalError(msg)
def install_xbuildenv(env: dict[str, str], pyodide_build_version: str, pyodide_version: str) -> str:
def install_xbuildenv(env: dict[str, str], xbuildenv_cache_path: Path, pyodide_version: str) -> str:
"""Install a particular Pyodide xbuildenv version and set a path to the Pyodide root."""
# Since pyodide-build was unvendored from Pyodide v0.27.0, the versions of
# pyodide-build are uncoupled from the versions of Pyodide. So, we specify
# both the pyodide-build version and the Pyodide version in the temp path.
xbuildenv_cache_path = CIBW_CACHE_PATH / f"pyodide-build-{pyodide_build_version}"
pyodide_root = xbuildenv_cache_path / pyodide_version / "xbuildenv" / "pyodide-root"
with FileLock(CIBW_CACHE_PATH / "xbuildenv.lock"):
@@ -268,7 +271,7 @@ def setup_python(
if which_python != str(venv_bin_path / "python"):
msg = "python available on PATH doesn't match our venv instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert python above it."
raise errors.FatalError(msg)
call("python", "--version", env=env)
call("python", "-V", "-V", env=env)
# check what pip version we're on
assert (venv_bin_path / "pip").exists()
@@ -303,14 +306,18 @@ def setup_python(
pyodide_build_version=pyodide_build_version,
)
emscripten_version = xbuildenv_info["emscripten"]
log.step(f"Installing Emscripten version: {emscripten_version} ...")
emcc_path = install_emscripten(tmp, emscripten_version)
env["PATH"] = os.pathsep.join([str(emcc_path.parent), env["PATH"]])
xbuildenv_cache_path = CIBW_CACHE_PATH / f"pyodide-build-{pyodide_build_version}"
log.step(f"Installing Pyodide xbuildenv version: {pyodide_version} ...")
env["PYODIDE_ROOT"] = install_xbuildenv(env, pyodide_build_version, pyodide_version)
env["PYODIDE_ROOT"] = install_xbuildenv(env, xbuildenv_cache_path, pyodide_version)
emscripten_version = xbuildenv_info["emscripten"]
log.step(
f"Installing Emscripten {emscripten_version} and applying Pyodide-specific patches ..."
)
emcc_path = install_emscripten(env, emscripten_version, xbuildenv_cache_path, pyodide_version)
env["PATH"] = os.pathsep.join([str(emcc_path.parent), env["PATH"]])
return env
+1 -1
View File
@@ -306,7 +306,7 @@ def setup_python(
if where_python != str(venv_path / "Scripts" / "python.exe"):
msg = "python available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert python above it."
raise errors.FatalError(msg)
call("python", "--version", env=env)
call("python", "-V", "-V", env=env)
call("python", "-c", "\"import struct; print(struct.calcsize('P') * 8)\"", env=env)
# check what pip version we're on
@@ -0,0 +1,11 @@
--- a/android.py
+++ b/android.py
@@ -1021,7 +1021,7 @@ def main():
context = parse_args()
# Set the CROSS_BUILD_DIR if an argument was provided
- if context.cross_build_dir:
+ if getattr(context, "cross_build_dir", None):
global CROSS_BUILD_DIR
CROSS_BUILD_DIR = context.cross_build_dir.resolve()
+28 -28
View File
@@ -161,18 +161,18 @@ python_configurations = [
{ identifier = "cp312-macosx_x86_64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.10/python-3.12.10-macos11.pkg" },
{ identifier = "cp312-macosx_arm64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.10/python-3.12.10-macos11.pkg" },
{ identifier = "cp312-macosx_universal2", version = "3.12", url = "https://www.python.org/ftp/python/3.12.10/python-3.12.10-macos11.pkg" },
{ identifier = "cp313-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.12/python-3.13.12-macos11.pkg" },
{ identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.12/python-3.13.12-macos11.pkg" },
{ identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.12/python-3.13.12-macos11.pkg" },
{ identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.12/python-3.13.12-macos11.pkg" },
{ identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.12/python-3.13.12-macos11.pkg" },
{ identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.12/python-3.13.12-macos11.pkg" },
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-macos11.pkg" },
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-macos11.pkg" },
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-macos11.pkg" },
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-macos11.pkg" },
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-macos11.pkg" },
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-macos11.pkg" },
{ identifier = "cp313-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "pp38-macosx_x86_64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-macos_x86_64.tar.bz2" },
{ identifier = "pp38-macosx_arm64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-macos_arm64.tar.bz2" },
{ identifier = "pp39-macosx_x86_64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_x86_64.tar.bz2" },
@@ -199,22 +199,22 @@ python_configurations = [
{ identifier = "cp311-win_amd64", version = "3.11.9" },
{ identifier = "cp312-win32", version = "3.12.10" },
{ identifier = "cp312-win_amd64", version = "3.12.10" },
{ identifier = "cp313-win32", version = "3.13.12" },
{ identifier = "cp313t-win32", version = "3.13.12" },
{ identifier = "cp313-win_amd64", version = "3.13.12" },
{ identifier = "cp313t-win_amd64", version = "3.13.12" },
{ identifier = "cp314-win32", version = "3.14.3" },
{ identifier = "cp314t-win32", version = "3.14.3" },
{ identifier = "cp314-win_amd64", version = "3.14.3" },
{ identifier = "cp314t-win_amd64", version = "3.14.3" },
{ identifier = "cp313-win32", version = "3.13.13" },
{ identifier = "cp313t-win32", version = "3.13.13" },
{ identifier = "cp313-win_amd64", version = "3.13.13" },
{ identifier = "cp313t-win_amd64", version = "3.13.13" },
{ identifier = "cp314-win32", version = "3.14.4" },
{ identifier = "cp314t-win32", version = "3.14.4" },
{ identifier = "cp314-win_amd64", version = "3.14.4" },
{ identifier = "cp314t-win_amd64", version = "3.14.4" },
{ identifier = "cp39-win_arm64", version = "3.9.10" },
{ identifier = "cp310-win_arm64", version = "3.10.11" },
{ identifier = "cp311-win_arm64", version = "3.11.9" },
{ identifier = "cp312-win_arm64", version = "3.12.10" },
{ identifier = "cp313-win_arm64", version = "3.13.12" },
{ identifier = "cp313t-win_arm64", version = "3.13.12" },
{ identifier = "cp314-win_arm64", version = "3.14.3" },
{ identifier = "cp314t-win_arm64", version = "3.14.3" },
{ identifier = "cp313-win_arm64", version = "3.13.13" },
{ identifier = "cp313t-win_arm64", version = "3.13.13" },
{ identifier = "cp314-win_arm64", version = "3.14.4" },
{ identifier = "cp314t-win_arm64", version = "3.14.4" },
{ identifier = "pp38-win_amd64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-win64.zip" },
{ identifier = "pp39-win_amd64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip" },
{ identifier = "pp310-win_amd64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-win64.zip" },
@@ -231,10 +231,10 @@ python_configurations = [
[android]
python_configurations = [
{ identifier = "cp313-android_arm64_v8a", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.12/python-3.13.12-aarch64-linux-android.tar.gz" },
{ identifier = "cp313-android_x86_64", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.12/python-3.13.12-x86_64-linux-android.tar.gz" },
{ identifier = "cp314-android_arm64_v8a", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-aarch64-linux-android.tar.gz" },
{ identifier = "cp314-android_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.3/python-3.14.3-x86_64-linux-android.tar.gz" },
{ identifier = "cp313-android_arm64_v8a", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.13/python-3.13.13-aarch64-linux-android.tar.gz" },
{ identifier = "cp313-android_x86_64", version = "3.13", url = "https://repo.maven.apache.org/maven2/com/chaquo/python/python/3.13.13/python-3.13.13-x86_64-linux-android.tar.gz" },
{ identifier = "cp314-android_arm64_v8a", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-aarch64-linux-android.tar.gz" },
{ identifier = "cp314-android_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-x86_64-linux-android.tar.gz" },
]
[ios]
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.0
build==1.4.3
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -22,21 +22,21 @@ packaging==26.0
# delocate
pip==26.0.1
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.9.4
platformdirs==4.9.6
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
tomli==2.4.0
tomli==2.4.1
# via build
typing-extensions==4.15.0
# via
# delocate
# virtualenv
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
zipp==3.23.0
# via importlib-metadata
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.0
build==1.4.3
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -20,15 +20,15 @@ packaging==26.0
# delocate
pip==26.0.1
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.9.4
platformdirs==4.9.6
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.0
build==1.4.3
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -20,15 +20,15 @@ packaging==26.0
# delocate
pip==26.0.1
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.9.4
platformdirs==4.9.6
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.0
build==1.4.3
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -20,15 +20,15 @@ packaging==26.0
# delocate
pip==26.0.1
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.9.4
platformdirs==4.9.6
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.0
build==1.4.3
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -20,15 +20,15 @@ packaging==26.0
# delocate
pip==26.0.1
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.9.4
platformdirs==4.9.6
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
@@ -28,15 +28,15 @@ platformdirs==4.3.6
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
tomli==2.4.0
tomli==2.4.1
# via build
typing-extensions==4.13.2
# via
# delocate
# virtualenv
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
zipp==3.20.2
# via importlib-metadata
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.0
build==1.4.3
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -28,15 +28,15 @@ platformdirs==4.4.0
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
tomli==2.4.0
tomli==2.4.1
# via build
typing-extensions==4.15.0
# via
# delocate
# virtualenv
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
zipp==3.23.0
# via importlib-metadata
+4 -4
View File
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.0
build==1.4.3
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -20,15 +20,15 @@ packaging==26.0
# delocate
pip==26.0.1
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.9.4
platformdirs==4.9.6
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.2.2
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.0
virtualenv==21.2.1
# via -r cibuildwheel/resources/constraints.in
+3 -3
View File
@@ -1,4 +1,4 @@
url = "https://nodejs.org/dist/"
v24 = "v24.14.0"
v22 = "v22.22.1"
v20 = "v20.20.1"
v24 = "v24.14.1"
v22 = "v22.22.2"
v20 = "v20.20.2"
+34 -34
View File
@@ -1,54 +1,54 @@
[x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.20-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.04.08-5
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2026.04.08-5
[i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.20-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.04.08-5
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2026.04.08-5
[aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.20-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.04.08-5
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2026.04.08-5
[ppc64le]
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2026.03.20-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2026.04.08-5
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2026.04.08-5
[s390x]
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2026.03.20-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2026.04.08-5
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2026.04.08-5
[pypy_x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.04.08-5
[pypy_i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.04.08-5
[pypy_aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.20-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.20-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.20-1
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.04.08-5
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.04.08-5
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.04.08-5
[armv7l]
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2026.03.20-1
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l:2026.03.20-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2026.03.20-1
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2026.04.08-5
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l:2026.04.08-5
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2026.04.08-5
[riscv64]
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64:2026.03.20-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2026.03.20-1
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64:2026.04.08-5
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2026.04.08-5
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1 +1 @@
default = { version = "21.2.0", url = "https://github.com/pypa/get-virtualenv/releases/download/21.2.0/virtualenv.pyz" }
default = { version = "21.2.1", url = "https://github.com/pypa/get-virtualenv/releases/download/21.2.1/virtualenv.pyz" }
+1 -2
View File
@@ -38,8 +38,7 @@ class EnableGroup(StrEnum):
@classmethod
def all_groups(cls) -> frozenset[Self]:
# see https://github.com/python/mypy/issues/20434 for the reason to type: ignore[arg-type]
return frozenset(set(cls) - {cls.CPythonFreeThreading}) # type: ignore[arg-type]
return frozenset(set(cls) - {cls.CPythonFreeThreading})
@classmethod
def parse_option_value(cls, value: str) -> frozenset[Self]:
+1
View File
@@ -21,6 +21,7 @@ _5 March 2026_
- 🌟 You can now build wheels using `uv` as a build frontend. This should improve performance, especially if your project has lots of build dependencies. To use, set [`build-frontend`](https://cibuildwheel.pypa.io/en/stable/options/#build-frontend) to `uv`. (#2322)
- ⚠️ We no longer support running on Travis CI. It may continue working but we don't run tests there anymore so we can't be sure. (#2682)
- ✨ Improvements to building rust wheels on Android (#2650)
- 🛠 Update Pyodide to 0.29.3 (#2719, #2733)
- 🐛 Fix bug with the GitHub Action on Windows, where PATH was getting unnecessarily changed, causing issues with meson builds. (#2723)
- ✨ Add support for quiet setting on `build` and `uv` from the cibuildwheel `build-verbosity` setting. (#2737)
- 📚 Docs updates, including guidance on using Meson on Windows (#2718)
+4 -14
View File
@@ -103,20 +103,6 @@ Commit this file, and push to Gitlab. The pipeline should start automatically.
Gitlab will store the built wheels for you - you can access them from the Pipelines view. Check out the Gitlab [docs](https://docs.gitlab.com/ee/ci/yaml/) for more info on this config file.
### Cirrus CI [linux/mac/windows] {: #cirrus-ci}
To build Linux, Mac, and Windows wheels on Cirrus CI, create a `.cirrus.yml` file in your repo,
> .cirrus.yml
```yaml
{% include "../examples/cirrus-ci-minimal.yml" %}
```
Commit this file, enable building of your repo on Cirrus CI, and push.
Cirrus CI will store the built wheels for you - you can access them from the individual task view. Check out the Cirrus CI [docs](https://cirrus-ci.org/guide/writing-tasks/) for more info on this config file.
> ⚠️ Got an error? Check the [FAQ](faq.md).
### Other CI services
@@ -125,6 +111,10 @@ Cirrus CI will store the built wheels for you - you can access them from the ind
Appveyor official support was dropped in cibuildwheel v3.0, due to a lack of CI credits. However, it can probably still be used as-is. Check the Appveyor example from the cibuildwheel v2.0 branch: [appveyor-minimal.yml](https://github.com/pypa/cibuildwheel/blob/v2.23.3/examples/appveyor-minimal.yml).
### Cirrus CI [linux/mac/windows] {: #cirrus-ci}
Due to Cirrus CI [end-of-life](https://cirruslabs.org) on June 1, 2026, we no longer officially support this service.
## Next steps
Once you've got the wheel building successfully, you might want to set up [testing](options.md#test-command) or [automatic releases to PyPI](deliver-to-pypi.md#automatic-method).
-10
View File
@@ -53,16 +53,6 @@ cibuildwheel to run tests, add the following YAML to your CI config file:
CIBW_TEST_COMMAND: "pytest {project}/tests"
```
!!! tab "Cirrus CI"
> .cirrus.yml ([docs](https://cirrus-ci.org/guide/writing-tasks/#environment-variables))
```yaml
env:
CIBW_TEST_REQUIRES: pytest
CIBW_TEST_COMMAND: "pytest {project}/tests"
```
## Configuration file {: #configuration-file}
You can configure cibuildwheel with a config file, such as `pyproject.toml`.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 91 KiB

+1 -2
View File
@@ -20,7 +20,6 @@
"travisci",
"circleci",
"gitlab",
"cirrusci",
"azurepipelines"
]
}
@@ -28,7 +27,7 @@
"ci_config": { "type": "string" },
"os": {
"type": "array",
"items": { "enum": ["windows", "apple", "linux"] }
"items": { "enum": ["windows", "apple", "linux", "android", "ios", "pyodide"] }
}
},
"required": ["name", "gh", "ci", "os"]
+16 -16
View File
@@ -3,8 +3,8 @@
# gh: GitHub repo (eventually a url: could be added for non-github projects)
# stars: GitHub repo (optional, if different from package, such as for Twisted)
# pypi: The pypi name, if different from the GitHub package name
# os: Operating system list, [windows, apple, linux] (optional)
# ci: [github, azurepipelines, circleci, gitlab, travisci, cirrusci] (optional)
# os: Operating system list, [windows, apple, linux, android, ios, pyodide] (optional)
# ci: [github, azurepipelines, circleci, gitlab, travisci] (optional)
# notes: (text, optional)
- name: abess
@@ -17,7 +17,7 @@
gh: matplotlib/matplotlib
notes: The venerable Matplotlib, a Python library with C++ portions
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
- name: pyinstrument
gh: joerick/pyinstrument
@@ -48,8 +48,8 @@
- name: pybase64
gh: mayeut/pybase64
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, android, ios, pyodide]
notes: setuptools backend with custom CMake step for external sources. SBOM embedded via a custom repair step.
- name: KDEpy
gh: tommyod/KDEpy
@@ -144,7 +144,7 @@
- name: scikit-learn
gh: scikit-learn/scikit-learn
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
ci_config: .github/workflows/wheels.yml
notes: |
The machine learning library. A complex but clean config using many of
@@ -154,7 +154,7 @@
- name: scikit-image
gh: scikit-image/scikit-image
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
ci_config: .github/workflows/cibuildwheel.yml
notes: |
Image processing library. Uses cibuildwheel to build and test a project
@@ -173,7 +173,7 @@
- name: pyzmq
gh: zeromq/pyzmq
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, android]
ci_config: .github/workflows/wheels.yml
notes: |
Python bindings for zeromq, the networking library.
@@ -194,17 +194,17 @@
- name: pybind11 python_example
gh: pybind/python_example
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
- name: pybind11 cmake_example
gh: pybind/cmake_example
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
- name: pybind11 scikit_build_example
gh: pybind/scikit_build_example
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
- name: pybind11 cross build example
gh: wbarnha/pybind_cmake_example_crossbuild
@@ -215,7 +215,7 @@
- name: iminuit
gh: scikit-hep/iminuit
ci: [github]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
- name: pyjet
gh: scikit-hep/pyjet
@@ -230,7 +230,7 @@
- name: boost-histogram
gh: scikit-hep/boost-histogram
ci: [github, travisci]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
notes: Supports full range of wheels, including PyPy and alternate archs.
- name: Rtree
@@ -332,7 +332,7 @@
- name: sourmash
gh: sourmash-bio/sourmash
ci: [github]
os: [apple, linux, windows]
os: [apple, linux, windows, pyodide]
- name: markupsafe
gh: pallets/markupsafe
@@ -401,7 +401,7 @@
- name: pillow-heif
gh: bigcat88/pillow_heif
pypi: pillow-heif
ci: [github, cirrusci]
ci: [github]
os: [apple, linux, windows]
notes: Bindings to libheif library with third party dependencies. Fully automated CI for tests and publishing including Apple Silicon builds.
@@ -565,7 +565,7 @@
- name: NumPy
gh: numpy/numpy
ci: [github, travisci]
os: [windows, apple, linux]
os: [windows, apple, linux, pyodide]
- name: Wrapt
gh: GrahamDumpleton/wrapt
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24" width="16px" fill="#606060"><title>Android icon</title><path d="M17.523 15.3414c-.5511 0-.9993-.4486-.9993-.9997s.4483-.9993.9993-.9993c.5511 0 .9993.4483.9993.9993.0001.5511-.4482.9997-.9993.9997m-11.046 0c-.5511 0-.9993-.4486-.9993-.9997s.4482-.9993.9993-.9993c.5511 0 .9993.4483.9993.9993 0 .5511-.4483.9997-.9993.9997m11.4045-6.02l1.9973-3.4592a.416.416 0 00-.1521-.5676.416.416 0 00-.5676.1521l-2.0223 3.503C15.5902 8.2439 13.8533 7.8508 12 7.8508s-3.5902.3931-5.1367 1.0989L4.841 5.4467a.4161.4161 0 00-.5677-.1521.4157.4157 0 00-.1521.5676l1.9973 3.4592C2.6889 11.1867.3432 14.6589 0 18.761h24c-.3435-4.1021-2.6892-7.5743-6.1185-9.4396"/></svg>

After

Width:  |  Height:  |  Size: 722 B

-1
View File
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24" width="16px" fill="#606060"><title>Cirrus CI icon</title><path d="M19.422.453a1.113 1.113 0 0 0-1.113 1.115 1.113 1.113 0 0 0 1.112 1.114c1.31 0 2.35 1.042 2.35 2.363 0 1.32-1.04 2.363-2.35 2.363H1.112A1.113 1.113 0 0 0 0 8.52a1.113 1.113 0 0 0 1.113 1.117h18.31c1.308 0 2.35 1.042 2.35 2.363 0 1.32-1.042 2.363-2.35 2.363H1.112A1.113 1.113 0 0 0 0 15.48a1.113 1.113 0 0 0 1.113 1.112h18.31c1.308 0 2.35 1.042 2.35 2.363 0 1.32-1.042 2.363-2.35 2.363H1.112A1.113 1.113 0 0 0 0 22.432a1.113 1.113 0 0 0 1.113 1.115h18.31a1.113 1.113 0 0 0 .206-.022c2.42-.112 4.37-2.12 4.37-4.57 0-1.393-.642-2.634-1.63-3.478C23.356 14.632 24 13.393 24 12c0-1.393-.643-2.632-1.63-3.477C23.357 7.68 24 6.438 24 5.045c0-2.52-2.06-4.592-4.578-4.592z"/></svg>

Before

Width:  |  Height:  |  Size: 808 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24" width="16px" fill="#606060"><title>iOS icon</title><path d="M1.1 6.05C.486 6.05 0 6.53 0 7.13A1.08 1.08 0 0 0 1.1 8.21C1.72 8.21 2.21 7.73 2.21 7.13C2.21 6.53 1.72 6.05 1.1 6.05M8.71 6.07C5.35 6.07 3.25 8.36 3.25 12C3.25 15.67 5.35 17.95 8.71 17.95C12.05 17.95 14.16 15.67 14.16 12C14.16 8.36 12.05 6.07 8.71 6.07M19.55 6.07C17.05 6.07 15.27 7.45 15.27 9.5C15.27 11.13 16.28 12.15 18.4 12.64L19.89 13C21.34 13.33 21.93 13.81 21.93 14.64C21.93 15.6 20.96 16.28 19.58 16.28C18.17 16.28 17.11 15.59 17 14.53H15C15.08 16.65 16.82 17.95 19.46 17.95C22.25 17.95 24 16.58 24 14.4C24 12.69 23 11.72 20.68 11.19L19.35 10.89C17.94 10.55 17.36 10.1 17.36 9.34C17.36 8.38 18.24 7.74 19.54 7.74C20.85 7.74 21.75 8.39 21.85 9.46H23.81C23.76 7.44 22.09 6.07 19.55 6.07M8.71 7.82C10.75 7.82 12.06 9.45 12.06 12C12.06 14.57 10.75 16.2 8.71 16.2C6.65 16.2 5.35 14.57 5.35 12C5.35 9.45 6.65 7.82 8.71 7.82M.111 9.31V17.76H2.1V9.31H.11Z"/></svg>

After

Width:  |  Height:  |  Size: 996 B

+12
View File
@@ -0,0 +1,12 @@
<svg width="16px" height="16px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_101_23)">
<path d="M19.4079 13.0863C19.4079 13.0645 19.4062 11.8768 19.4045 11.8551H24.0001V23.7707H12.0828V11.8551H16.6783C16.6783 11.8768 16.675 13.0645 16.675 13.0863M22.1191 22.4962H22.9376L21.6965 18.2782H20.4519L19.4296 22.4962H20.2231L20.4302 21.5573H21.8485L22.1174 22.4962H22.1191ZM17.7708 22.4962H18.5543L19.5599 18.2782H18.7865L18.17 21.1848H18.16L17.5753 18.2782H16.837L16.1855 21.1497H16.1755L15.6359 18.2782H14.8474L15.7562 22.4962H16.5547L17.1811 19.6246H17.1911L17.7708 22.4962ZM20.9264 19.3172H21.2588L21.6547 20.8657H20.5822L20.9264 19.3172Z" fill="#606060"/>
<path d="M11.6935 5.17811C11.6935 6.94883 10.2234 8.5191 8.35247 8.5191H1.67049V11.8601H0V0.166626H8.35247C10.1399 0.166626 11.6433 1.65337 11.6935 3.50761V5.17811ZM10.023 3.50761C10.023 2.58884 9.27124 1.83712 8.35247 1.83712H1.67049V6.8486H8.35247C9.27124 6.8486 10.023 6.09688 10.023 5.17811V3.50761Z" fill="#606060"/>
<path d="M18.8766 8.185V11.8601H17.2061V8.185L12.1946 2.67237V0.166626H13.8651V1.98746L18.0413 6.58132L22.2175 1.98746V0.166626H23.888V2.67237L18.8766 8.185Z" fill="#606060"/>
</g>
<defs>
<clipPath id="clip0_101_23">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+91 -30
View File
@@ -5,6 +5,9 @@
<div class="grid-line" style="grid-row-start: 3"></div>
<div class="grid-line" style="grid-row-start: 4"></div>
<div class="grid-line" style="grid-row-start: 5"></div>
<div class="grid-line" style="grid-row-start: 6"></div>
<div class="grid-line" style="grid-row-start: 7"></div>
<div class="grid-line" style="grid-row-start: 8"></div>
<!-- the docker container outline -->
<div class="grid-outline docker">
<div class="outline">
@@ -17,11 +20,17 @@
</div>
<div class="grid-outline testVenv" style="grid-row-start: 4"><div class="outline"></div></div>
<div class="grid-outline testVenv" style="grid-row-start: 5"><div class="outline"></div></div>
<div class="grid-outline testVenv" style="grid-row-start: 6"><div class="outline"></div></div>
<div class="grid-outline testVenv" style="grid-row-start: 7"><div class="outline"></div></div>
<div class="grid-outline testVenv" style="grid-row-start: 8"><div class="outline"></div></div>
<!-- THE GRID CONTENT -->
<!-- the row labels -->
<div class="grid-row-label" style="grid-row-start: 3">Linux</div>
<div class="grid-row-label" style="grid-row-start: 4">macOS</div>
<div class="grid-row-label" style="grid-row-start: 5">Windows</div>
<div class="grid-row-label" style="grid-row-start: 6">Android</div>
<div class="grid-row-label" style="grid-row-start: 7">iOS</div>
<div class="grid-row-label" style="grid-row-start: 8">Pyodide</div>
<!-- the column labels -->
<div class="grid-column-label"
style="grid-row: 1 / span 1; grid-column: 5 / -3">
@@ -86,7 +95,7 @@
[
{
href: 'options/#before-all',
platforms: ['linux', 'macos', 'windows'],
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
style: 'dot',
tooltip: {
title: 'CIBW_BEFORE_ALL',
@@ -104,11 +113,27 @@
description: 'Install the version of Python required to build this wheel.'
},
},
{
label: 'Install Python & set up cross-compilation',
platforms: ['android', 'ios'],
style: 'block',
tooltip: {
description: 'Install Python for the build and target platforms, and set up a cross-compilation environment.'
},
},
{
label: 'Set up Pyodide xbuildenv',
platforms: ['pyodide'],
style: 'block',
tooltip: {
description: 'Install a base Python, set up a build virtualenv with pyodide-build, install the Pyodide cross-build environment and Emscripten toolchain.'
},
},
],
[
{
href: 'options/#before-build',
platforms: ['linux', 'macos', 'windows'],
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
style: 'dot',
tooltip: {
title: 'CIBW_BEFORE_BUILD',
@@ -121,12 +146,12 @@
{
label: 'Build wheel',
href: 'options/#build-frontend',
platforms: ['linux', 'macos', 'windows'],
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
style: 'block',
tooltip: {
title: 'CIBW_BUILD_FRONTEND',
tag: 'Customisable step',
description: 'Build the wheel according to your package configuration, using the frontend of your choice - pip or build.'
description: 'Build the wheel according to your package configuration, using the frontend of your choice pip, build, or uv.'
},
},
],
@@ -154,23 +179,31 @@
},
},
{
env: "CIBW_REPAIR_WHEEL_COMMAND",
label: 'Repair wheel',
href: 'options/#repair-wheel-command',
label: 'repair wheel',
platforms: ['windows'],
platforms: ['android'],
style: 'block',
tooltip: {
title: 'CIBW_REPAIR_WHEEL_COMMAND',
tag: 'Customisable step',
description: 'By default, bundles libc++ into the wheel if any shared library links against it, using patchelf. Can be overridden with a custom repair command.'
},
},
{
href: 'options/#repair-wheel-command',
platforms: ['windows', 'ios', 'pyodide'],
style: 'dot',
optional: true,
tooltip: {
title: 'CIBW_REPAIR_WHEEL_COMMAND',
tag: 'Optional step',
description: 'Execute a shell command to repair each built wheel'
description: 'Execute a shell command to repair each built wheel.'
},
},
],
[
{
href: 'options/#before-test',
platforms: ['linux', 'macos', 'windows'],
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
style: 'dot',
tooltip: {
title: 'CIBW_BEFORE_TEST',
@@ -182,10 +215,10 @@
[
{
label: 'Install wheel',
platforms: ['linux', 'macos', 'windows'],
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
style: 'block',
tooltip: {
description: 'Install the wheel we just built into the test virtualenv.'
description: 'Install the wheel we just built into the test environment.'
},
},
],
@@ -198,7 +231,40 @@
tooltip: {
title: 'CIBW_TEST_COMMAND',
tag: 'Optional step',
description: 'Execute a shell command to test each built wheel'
description: 'Execute a shell command to test each built wheel.'
},
},
{
label: 'Test on emulator',
href: 'options/#test-command',
platforms: ['android'],
style: 'block',
tooltip: {
title: 'CIBW_TEST_COMMAND',
tag: 'Optional step',
description: 'Run the test command on an Android emulator using the CPython testbed.'
},
},
{
label: 'Test on simulator',
href: 'options/#test-command',
platforms: ['ios'],
style: 'block',
tooltip: {
title: 'CIBW_TEST_COMMAND',
tag: 'Optional step',
description: 'Run the test command on an iOS simulator using the testbed app.'
},
},
{
label: 'Test in Node.js',
href: 'options/#test-command',
platforms: ['pyodide'],
style: 'block',
tooltip: {
title: 'CIBW_TEST_COMMAND',
tag: 'Optional step',
description: 'Run the test command in a Pyodide virtualenv powered by Node.js.'
},
},
],
@@ -219,26 +285,21 @@
data() {
return {
diagram,
platforms: ['linux', 'macos', 'windows'],
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
}
},
methods: {
blockStyle(action) {
let start, end
if (action.platforms.includes('linux')) {
start = 3
} else if (action.platforms.includes('macos')) {
start = 4
} else if (action.platforms.includes('windows')) {
start = 5
}
const platformOrder = ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide']
const rowOffset = 3 // first platform starts at grid row 3
if (action.platforms.includes('windows')) {
end = 6
} else if (action.platforms.includes('macos')) {
end = 5
} else if (action.platforms.includes('linux')) {
end = 4
let start = null
let end = null
for (let i = 0; i < platformOrder.length; i++) {
if (action.platforms.includes(platformOrder[i])) {
if (start === null) start = rowOffset + i
end = rowOffset + i + 1
}
}
return {
@@ -413,7 +474,7 @@
.grid-outline {
grid-row-end: span 1;
position: relative;
color: #8f8f8f;
color: #666666;
}
.grid-outline.docker {
grid-row: 3 / span 1;
@@ -478,7 +539,7 @@
font-weight: 500;
text-transform: uppercase;
font-size: 0.9em;
color: #C9C9C9;
color: #888888;
}
.tooltip-description {
margin-top: 1px;
-1
View File
@@ -103,7 +103,6 @@ fragmentRedirect([
{ source: 'setup/#appveyor', destination: 'ci-services/' },
{ source: 'setup/#circleci', destination: 'ci-services/' },
{ source: 'setup/#gitlab-ci', destination: 'ci-services/' },
{ source: 'setup/#cirrus-ci', destination: 'ci-services/' },
{ source: 'faq/#linux-builds-in-containers', destination: 'platforms/#linux-containers' },
{ source: 'faq/#apple-silicon', destination: 'platforms/#macos-architectures' },
+22 -20
View File
@@ -8,17 +8,17 @@ title: Working examples
| Name | CI | OS | Notes |
|-----------------------------------|----|----|:------|
| [scikit-learn][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The machine learning library. A complex but clean config using many of cibuildwheel's features to build a large project with Cython and C++ extensions. |
| [scikit-learn][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | The machine learning library. A complex but clean config using many of cibuildwheel's features to build a large project with Cython and C++ extensions. |
| [duckdb][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | DuckDB is an analytical in-process SQL database management system |
| [pytorch-fairseq][] | ![github icon][] | ![apple icon][] ![linux icon][] | Facebook AI Research Sequence-to-Sequence Toolkit written in Python. |
| [NumPy][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The fundamental package for scientific computing with Python. |
| [NumPy][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | The fundamental package for scientific computing with Python. |
| [NCNN][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | ncnn is a high-performance neural network inference framework optimized for the mobile platform |
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The venerable Matplotlib, a Python library with C++ portions |
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | The venerable Matplotlib, a Python library with C++ portions |
| [Tornado][] | ![github icon][] | ![linux icon][] ![apple icon][] ![windows icon][] | Tornado is a Python web framework and asynchronous networking library. Uses stable ABI for a small C extension. |
| [MyPy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | The compiled version of MyPy using MyPyC. |
| [Prophet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Tool for producing high quality forecasts for time series data that has multiple seasonality with linear or non-linear growth. |
| [Kivy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS |
| [Triton][] | ![github icon][] | ![linux icon][] | Self hosted runners |
| [Kivy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS |
| [MemRay][] | ![github icon][] | ![linux icon][] | Memray is a memory profiler for Python |
| [uvloop][] | ![github icon][] | ![apple icon][] ![linux icon][] | Ultra fast asyncio event loop. |
| [psutil][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Cross-platform lib for process and system monitoring in Python |
@@ -30,7 +30,7 @@ title: Working examples
| [asyncpg][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A fast PostgreSQL Database Client Library for Python/asyncio. |
| [cmake][] | ![github icon][] ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Multitagged binary builds for all supported platforms, using cibw 2 config configuration. |
| [pyinstrument][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python profiler with a C extension. No external dependencies. |
| [scikit-image][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Image processing library. Uses cibuildwheel to build and test a project that uses Cython with platform-native code. |
| [scikit-image][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Image processing library. Uses cibuildwheel to build and test a project that uses Cython with platform-native code. |
| [cvxpy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A Python-embedded modeling language for convex optimization problems. |
| [PyOxidizer][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A modern Python application packaging and distribution tool |
| [pedalboard][] | ![github icon][] | ![windows icon][] ![linux icon][] ![apple icon][] | A Python library for working with audio data and audio plugins by wrapping the [JUCE](https://github.com/juce-framework/JUCE/) C++ framework. Uses cibuildwheel to deploy on as many operating systems and Python versions as possible with only one dependency (any NumPy). |
@@ -42,7 +42,7 @@ title: Working examples
| [Dependency Injector][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Dependency injection framework for Python, uses Windows TravisCI |
| [UltraJSON][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Ultra fast JSON decoder and encoder written in C with Python bindings |
| [CTranslate2][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes libraries from the [Intel oneAPI toolkit](https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit.html) and CUDA kernels compiled for multiple GPU architectures. |
| [pyzmq][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python bindings for zeromq, the networking library. Uses Cython on CPython and CFFI on PyPy. ARM wheels for linux are built natively on GitHub Actions. |
| [pyzmq][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![android icon][] | Python bindings for zeromq, the networking library. Uses Cython on CPython and CFFI on PyPy. ARM wheels for linux are built natively on GitHub Actions. |
| [Implicit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes GPU support for linux wheels |
| [tinyobjloader][] | ![azurepipelines icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Tiny but powerful single file wavefront obj loader |
| [vispy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Main repository for Vispy |
@@ -67,19 +67,19 @@ title: Working examples
| [Parselmouth][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels. |
| [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system |
| [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) |
| [time-machine][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Time mocking library using only the CPython C API. |
| [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) |
| [mosec][] | ![github icon][] | ![linux icon][] ![apple icon][] | A machine learning model serving framework powered by Rust |
| [Picologging][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A high-performance logging library for Python. |
| [markupsafe][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Safely add untrusted strings to HTML/XML markup. |
| [Rtree][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Rtree: spatial index for Python GIS |
| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a CMake-based build system |
| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Example pybind11 module built with a CMake-based build system |
| [KDEpy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Kernel Density Estimation in Python |
| [dd-trace-py][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Uses custom alternate arch emulation on GitHub |
| [tgcalls][] | ![github icon][] | ![apple icon][] ![windows icon][] | Python `pybind11` binding to Telegram's WebRTC library with third party dependencies like `OpenSSL`, `MozJPEG`, `FFmpeg`, etc. |
| [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. |
| [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] ![pyodide icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. |
| [python-rapidjson][] | ![travisci icon][] ![gitlab icon][] | ![windows icon][] ![linux icon][] | Python wrapper around rapidjson |
| [pybind11 python_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a Python-based build system |
| [pybind11 python_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Example pybind11 module built with a Python-based build system |
| [abess][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A fast best-subset selection library. It uses cibuildwheel to build a large project with C++ extensions. |
| [python-snappy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for the snappy google library |
| [Confluent client for Kafka][] | ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | setup in `tools/wheels/build-wheels.bat` |
@@ -87,20 +87,20 @@ title: Working examples
| [cyvcf2][] | ![github icon][] | ![apple icon][] ![linux icon][] | cython + htslib == fast VCF and BCF processing |
| [matrixprofile][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python 3 library making time series data mining tasks, utilizing matrix profile algorithms, accessible to everyone. |
| [Tokenizer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast and customizable text tokenization library with BPE and SentencePiece support |
| [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Jupyter-friendly Python interface for C++ MINUIT2 |
| [pillow-heif][] | ![github icon][] ![cirrusci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Bindings to libheif library with third party dependencies. Fully automated CI for tests and publishing including Apple Silicon builds. |
| [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Jupyter-friendly Python interface for C++ MINUIT2 |
| [pillow-heif][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Bindings to libheif library with third party dependencies. Fully automated CI for tests and publishing including Apple Silicon builds. |
| [keyvi][] | ![github icon][] | ![linux icon][] ![apple icon][] | FST based key value index highly optimized for size and lookup performance, utilizes ccache action for improved runtime |
| [PyGLM][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Fast OpenGL Mathematics (GLM) for Python |
| [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 |
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
| [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython |
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python |
| [Imagecodecs (fork)][] | ![azurepipelines icon][] | ![apple icon][] ![linux icon][] | Over 20 external dependencies in compiled libraries, custom docker image, `libomp`, `openblas` and `install_name_tool` for macOS. |
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![android icon][] ![ios icon][] ![pyodide icon][] | setuptools backend with custom CMake step for external sources. SBOM embedded via a custom repair step. |
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Supports full range of wheels, including PyPy and alternate archs. |
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. |
| [Python-WebRTC][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | a Python extension that provides bindings to WebRTC M92 |
| [pybind11 scikit_build_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | An example combining scikit-build and pybind11 |
| [pybind11 scikit_build_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | An example combining scikit-build and pybind11 |
| [fathon][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | python package for DFA (Detrended Fluctuation Analysis) and related algorithms |
| [Arbor][] | ![github icon][] | ![apple icon][] ![linux icon][] | Arbor is a multi-compartment neuron simulation library; compatible with next-generation accelerators; best-practices applied to research software; focused on community-driven development. Includes a [small script](https://github.com/arbor-sim/arbor/blob/master/scripts/patchwheel.py) patching `rpath` in bundled libraries. |
| [clang-format][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Scikit-build wrapper around LLVM's CMake, all platforms, generic wheels. |
@@ -128,8 +128,8 @@ title: Working examples
[Tornado]: https://github.com/tornadoweb/tornado
[MyPy]: https://github.com/mypyc/mypy_mypyc-wheels
[Prophet]: https://github.com/facebook/prophet
[Kivy]: https://github.com/kivy/kivy
[Triton]: https://github.com/openai/triton
[Kivy]: https://github.com/kivy/kivy
[MemRay]: https://github.com/bloomberg/memray
[uvloop]: https://github.com/MagicStack/uvloop
[psutil]: https://github.com/giampaolo/psutil
@@ -178,8 +178,8 @@ title: Working examples
[Parselmouth]: https://github.com/YannickJadoul/Parselmouth
[H3-py]: https://github.com/uber/h3-py
[AutoPy]: https://github.com/autopilot-rs/autopy
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[time-machine]: https://github.com/adamchainz/time-machine
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[mosec]: https://github.com/mosecorg/mosec
[Picologging]: https://github.com/microsoft/picologging
[markupsafe]: https://github.com/pallets/markupsafe
@@ -206,10 +206,10 @@ title: Working examples
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model
[TgCrypto]: https://github.com/pyrogram/tgcrypto
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
[pybase64]: https://github.com/mayeut/pybase64
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
[bx-python]: https://github.com/bxlab/bx-python
[pybase64]: https://github.com/mayeut/pybase64
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
[bx-python]: https://github.com/bxlab/bx-python
[Python-WebRTC]: https://github.com/MarshalX/python-webrtc
[pybind11 scikit_build_example]: https://github.com/pybind/scikit_build_example
[fathon]: https://github.com/stfbnc/fathon
@@ -235,10 +235,12 @@ title: Working examples
[circleci icon]: data/readme_icons/circleci.svg
[gitlab icon]: data/readme_icons/gitlab.svg
[travisci icon]: data/readme_icons/travisci.svg
[cirrusci icon]: data/readme_icons/cirrusci.svg
[windows icon]: data/readme_icons/windows.svg
[apple icon]: data/readme_icons/apple.svg
[linux icon]: data/readme_icons/linux.svg
[android icon]: data/readme_icons/android.svg
[ios icon]: data/readme_icons/ios.svg
[pyodide icon]: data/readme_icons/pyodide.svg
<!-- END bin/projects.py -->
-21
View File
@@ -1,21 +0,0 @@
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
install_cibuildwheel_script:
- python -m pip install cibuildwheel==3.4.1
run_cibuildwheel_script:
- cibuildwheel
wheels_artifacts:
path: "wheelhouse/*"
macos_task:
name: Build macOS x86_64 and arm64 wheels.
macos_instance:
image: ghcr.io/cirruslabs/macos-runner:sonoma
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
CIBW_ARCHS_MACOS: x86_64 arm64
install_pre_requirements_script:
- brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
<<: *BUILD_AND_STORE_WHEELS
-74
View File
@@ -1,74 +0,0 @@
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
install_cibuildwheel_script:
- python -m pip install cibuildwheel==3.4.1
run_cibuildwheel_script:
- cibuildwheel
wheels_artifacts:
path: "wheelhouse/*"
linux_x86_task:
name: Build Linux x86 wheels.
compute_engine_instance:
image_project: cirrus-images
image: family/docker-builder
platform: linux
cpu: 4
memory: 4G
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script:
- add-apt-repository -y ppa:deadsnakes/ppa
- apt-get update
- apt-get install -y python3.12-venv
- python3.12 -m venv ${VENV_ROOT}
<<: *BUILD_AND_STORE_WHEELS
linux_aarch64_task:
name: Build Linux aarch64 wheels.
compute_engine_instance:
image_project: cirrus-images
image: family/docker-builder-arm64
architecture: arm64
platform: linux
cpu: 4
memory: 4G
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script:
- add-apt-repository -y ppa:deadsnakes/ppa
- apt-get update
- apt-get install -y python3.12-venv
- python3.12 -m venv ${VENV_ROOT}
<<: *BUILD_AND_STORE_WHEELS
windows_x86_task:
name: Build Windows x86 wheels.
windows_container:
image: cirrusci/windowsservercore:visualstudio2022
cpu: 4
memory: 4G
install_pre_requirements_script:
- certutil -generateSSTFromWU roots.sst
- certutil -addstore -f root roots.sst
- del roots.sst
- choco install -y --no-progress python3 --version 3.12.4
- refreshenv
- powershell -Command "$cleanPath = $env:PATH -replace ';+$', ''; Add-Content -Path $env:CIRRUS_ENV -Value ('PATH=' + $cleanPath)"
<<: *BUILD_AND_STORE_WHEELS
macos_arm64_task:
name: Build macOS arm64 wheels.
macos_instance:
image: ghcr.io/cirruslabs/macos-runner:sequoia
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script:
- brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
<<: *BUILD_AND_STORE_WHEELS
+1
View File
@@ -34,6 +34,7 @@ nav:
- About:
- contributing.md
- changelog.md
- Source repository: https://github.com/pypa/cibuildwheel
markdown_extensions:
- md_in_html
+15 -12
View File
@@ -69,12 +69,10 @@ def update_constraints(session: nox.Session) -> None:
Update the dependencies inplace.
"""
session.install("-e.", "click")
resources = Path("cibuildwheel/resources")
if session.venv_backend != "uv":
session.install("uv>=0.1.23")
session.install("uv>=0.9")
# CUSTOM_COMPILE_COMMAND is a pip-compile option that tells users how to
# regenerate the constraints files
@@ -108,8 +106,7 @@ def update_constraints(session: nox.Session) -> None:
tmp_file = Path(session.create_tmp()) / "constraints-pyodide.in"
session.run(
"python",
session.install_and_run_script(
"bin/generate_pyodide_constraints.py",
"--output-file",
tmp_file,
@@ -135,13 +132,11 @@ def update_pins(session: nox.Session) -> None:
Update the python, docker, virtualenv, node, and python-build-standalone
version pins inplace.
"""
pyproject = nox.project.load_toml()
session.install("-e.", *nox.project.dependency_groups(pyproject, "bin"))
session.run("python", "bin/update_pythons.py", "--force")
session.run("python", "bin/update_docker.py")
session.run("python", "bin/update_virtualenv.py", "--force")
session.run("python", "bin/update_nodejs.py", "--force")
session.run("python", "bin/update_python_build_standalone.py")
session.install_and_run_script("bin/update_pythons.py", "--force")
session.install_and_run_script("bin/update_docker.py")
session.install_and_run_script("bin/update_virtualenv.py", "--force")
session.install_and_run_script("bin/update_nodejs.py", "--force")
session.install_and_run_script("bin/update_python_build_standalone.py")
@nox.session(default=False, reuse_venv=True, tags=["update"])
@@ -184,6 +179,14 @@ def docs(session: nox.Session) -> None:
session.run("mkdocs", "serve" if session.interactive else "build", "--strict", *session.posargs)
@nox.session(default=False)
def update_how_it_works_image(session: nox.Session) -> None:
"""
Generate the how it works image.
"""
session.install_and_run_script("bin/update_how_it_works_image.py")
@nox.session(default=False)
def build(session: nox.Session) -> None:
"""
-11
View File
@@ -66,15 +66,6 @@ Documentation = "https://cibuildwheel.pypa.io"
Homepage = "https://github.com/pypa/cibuildwheel"
[dependency-groups]
bin = [
"click",
"packaging>=21.0",
"pip-tools",
"pygithub",
"pyyaml",
"requests",
"rich>=9.6",
]
docs = [
"jinja2>=3.1.2",
"mkdocs-include-markdown-plugin==6.2.2",
@@ -97,7 +88,6 @@ test = [
"xdoctest",
]
dev = [
{include-group = "bin"},
{include-group = "docs"},
{include-group = "test"},
]
@@ -138,7 +128,6 @@ module = [
"setuptools._distutils.util",
"bashlex",
"bashlex.*",
"importlib_resources",
]
ignore_missing_imports = true
+1 -5
View File
@@ -42,11 +42,7 @@ if "ANDROID_HOME" not in os.environ:
# Fail if we're on a CI service which is supposed to have the Android SDK
# pre-installed; otherwise skip the module.
if (
("CIRRUS_CI" in os.environ and platform.system() == "Darwin")
or "GITHUB_ACTIONS" in os.environ
or "TF_BUILD" in os.environ
):
if "GITHUB_ACTIONS" in os.environ or "TF_BUILD" in os.environ:
pytest.fail(msg)
else:
pytest.skip(msg, allow_module_level=True)
-7
View File
@@ -7,8 +7,6 @@ from pathlib import Path
import pytest
from cibuildwheel.ci import CIProvider, detect_ci_provider
from . import test_projects, utils
pytestmark = pytest.mark.ios
@@ -36,11 +34,6 @@ def skip_if_ios_testing_not_supported() -> None:
pytest.skip("this test can only run on macOS")
if utils.get_xcode_version() < (13, 0):
pytest.skip("this test only works with Xcode 13.0 or greater")
if detect_ci_provider() == CIProvider.cirrus_ci:
pytest.skip(
"iOS testing not currently supported on Cirrus CI due to a failure "
"to start the simulator."
)
# iOS tests shouldn't be run in parallel, because they're dependent on calling
-1
View File
@@ -35,7 +35,6 @@ include_graalpy_in_expected_wheels: bool = True
_AARCH64_CAN_RUN_ARMV7: Final[bool] = Architecture.aarch64.value not in EMULATED_ARCHS and {
None: Architecture.armv7l.value not in EMULATED_ARCHS,
CIProvider.travis_ci: False,
CIProvider.cirrus_ci: False,
}.get(detect_ci_provider(), True)