Compare commits

..
Author SHA1 Message Date
cibuildwheel-bot[bot] 7e53c3d952 Update dependencies 2026-03-14 16:57:21 +00:00
152 changed files with 1493 additions and 2148 deletions
+91
View File
@@ -0,0 +1,91 @@
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
+4 -4
View File
@@ -13,11 +13,11 @@ jobs:
dist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: hynek/build-and-inspect-python-package@fe0a0fb1925ca263d076ca4f2c13e93a6e92a33e # v2.17.0
- uses: hynek/build-and-inspect-python-package@v2
publish:
needs: [dist]
@@ -31,7 +31,7 @@ jobs:
attestations: write
steps:
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
- uses: actions/download-artifact@v8
with:
name: Packages
path: dist
@@ -41,6 +41,6 @@ jobs:
with:
subject-path: "dist/cibuildwheel-*"
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
- uses: pypa/gh-action-pypi-publish@release/v1
with:
attestations: true
+32 -34
View File
@@ -39,35 +39,35 @@ jobs:
name: Linters (mypy, ruff, etc.)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
- uses: actions/setup-python@v6
id: python
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- uses: j178/prek-action@cbc2f23eb5539cf20d82d1aabd0d0ecbcc56f4e3 # v2.0.2
- uses: j178/prek-action@v1
- name: PyLint checks
run: uvx nox -s pylint -- --output-format=github
run: pipx run --python "${{ steps.python.outputs.python-path }}" nox -s pylint -- --output-format=github
sample:
name: Generate a sample project
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
- uses: actions/setup-python@v6
name: Install Python
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- uses: astral-sh/setup-uv@v7
- 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@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
- uses: actions/upload-artifact@v7
with:
name: sample_proj
path: sample_proj
@@ -87,7 +87,7 @@ jobs:
- os: ubuntu-latest
python_version: '3.14'
- os: ubuntu-latest
python_version: '3.14'
python_version: '3.13'
test_select: android
- os: ubuntu-24.04-arm
python_version: '3.13'
@@ -117,16 +117,16 @@ jobs:
test_select: android
timeout-minutes: 180
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
- uses: actions/setup-python@v6
name: Install Python ${{ matrix.python_version }}
with:
python-version: ${{ matrix.python_version }}
allow-prereleases: true
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- uses: astral-sh/setup-uv@v7
- name: Free up disk space
if: runner.os == 'Linux' && matrix.test_select != 'android'
@@ -139,7 +139,7 @@ jobs:
# for oci_container unit tests
- name: Set up QEMU
if: runner.os == 'Linux'
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
uses: docker/setup-qemu-action@v4
- name: Set up Xcode
if: ${{ startsWith(matrix.os, 'macos-15') }}
@@ -150,12 +150,12 @@ jobs:
- name: Install dependencies
run: uv sync --no-dev --group test
- uses: joerick/pr-labels-action@0543b277721e852d821c6738d449f2f4dea03d5f # v1.0.9
- uses: joerick/pr-labels-action@v1.0.9
- name: Set CIBW_ENABLE
shell: bash
run: |
if [[ "$GITHUB_REF_NAME" == "main" ]]; then
if [[ "${{ github.ref_name }}" == "main" ]]; then
CIBW_ENABLE=all
else
# get the default CIBW_ENABLE value from the test module
@@ -172,7 +172,7 @@ jobs:
echo "CIBW_ENABLE=${CIBW_ENABLE}" >> $GITHUB_ENV
- name: Download a sample project
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@v8
with:
name: sample_proj
path: sample_proj
@@ -230,7 +230,7 @@ jobs:
run: |
test $(find wheelhouse_only -name '*.whl' | wc -l) -eq 1
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
- uses: actions/upload-artifact@v7
with:
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
path: wheelhouse/*.whl
@@ -247,13 +247,13 @@ jobs:
outputs:
archs: ${{ steps.archs.outputs.archs }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
- uses: actions/setup-python@v6
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- uses: astral-sh/setup-uv@v7
- name: Install dependencies
run: uv sync --no-dev --group test
- name: Get qemu emulated architectures
@@ -272,23 +272,21 @@ jobs:
matrix:
arch: ${{ fromJSON(needs.emulated-archs.outputs.archs) }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
- uses: actions/setup-python@v6
with:
python-version: "3.x"
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- uses: astral-sh/setup-uv@v7
- name: Install dependencies
run: uv sync --no-dev --group test
- name: Set up QEMU
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
uses: docker/setup-qemu-action@v4
- name: Run the emulation tests
env:
MATRIX_ARCH: ${{ matrix.arch }}
run: uv run --no-sync pytest --run-emulation "$MATRIX_ARCH" test/test_emulation.py
run: uv run --no-sync pytest --run-emulation ${{ matrix.arch }} test/test_emulation.py
test-pyodide:
name: Test pyodide
@@ -296,20 +294,20 @@ jobs:
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
- uses: actions/setup-python@v6
name: Install Python 3.12
with:
python-version: '3.12'
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
- uses: astral-sh/setup-uv@v7
- name: Install dependencies
run: uv sync --no-dev --group test
- name: Download a sample project
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@v8
with:
name: sample_proj
path: sample_proj
@@ -346,11 +344,11 @@ jobs:
- os: macos-15
test_select: android
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download a sample project
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@v8
with:
name: sample_proj
path: sample_proj
+7 -10
View File
@@ -23,36 +23,33 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: write
environment: ${{ github.ref == 'refs/heads/main' && github.repository == 'pypa/cibuildwheel' && 'update-dependencies-workflow' || '' }}
steps:
# 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@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@v2
id: generate-token
if: github.ref == 'refs/heads/main' && github.repository == 'pypa/cibuildwheel'
with:
app-id: ${{ secrets.CIBUILDWHEEL_BOT_APP_ID }}
private-key: ${{ secrets.CIBUILDWHEEL_BOT_APP_PRIVATE_KEY }}
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
with:
python-version: "3.14"
- uses: wntrblm/nox@2026.02.09
- name: "Run update: dependencies"
run: uvx nox --force-color -s update_constraints
run: nox --force-color -s update_constraints
- name: "Run update: python configs"
run: uvx nox --force-color -s update_pins
run: nox --force-color -s update_pins
- name: "Run update: docs user projects"
run: uvx nox --force-color -s update_proj -- --auth=${{ secrets.GITHUB_TOKEN }}
run: 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@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
uses: peter-evans/create-pull-request@v8
with:
commit-message: Update dependencies
title: '[Bot] Update dependencies'
+2 -2
View File
@@ -21,12 +21,12 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Update the ${{ env.TAG_NAME }} tag
id: update-major-minor-tag
uses: joerick/update-vX.Y-tag-action@c4cefb60c33b82e4aa73a469e4acf30ee48d5812 # v1.0.2
uses: joerick/update-vX.Y-tag-action@v1.0
with:
source-tag: ${{ env.TAG_NAME }}
-24
View File
@@ -1,24 +0,0 @@
name: zizmor - GitHub Actions Security Analysis
on:
push:
branches: ["main"]
pull_request:
branches: ["**"]
permissions: {}
jobs:
zizmor:
name: Run zizmor 🌈
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
-7
View File
@@ -112,10 +112,3 @@ site/
# PyCharm
.idea/
# Lockfiles
*.lock
*.pylock
# OS files
.DS_Store
+10 -10
View File
@@ -3,7 +3,7 @@ ci:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
rev: v6.0.0
hooks:
- id: check-case-conflict
- id: check-merge-conflict
@@ -14,22 +14,21 @@ 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: c60c980e561ed3e73101667fe8365c609d19a438 # frozen: v0.15.9
rev: v0.15.5
hooks:
- id: ruff-check
args: ["--fix"]
args: ["--fix", "--show-fixes"]
- id: ruff-format
- repo: https://github.com/pre-commit/mirrors-mypy
rev: 8e5c80792e2ec0c87804d8ef915bf35e2caea6da # frozen: v1.20.0
rev: v1.19.1
hooks:
- id: mypy
name: mypy 3.11 on cibuildwheel/
args: ["--python-version=3.11"]
exclude: ^cibuildwheel/resources/android/_cross_venv.py$ # Requires Python 3.13 or later
exclude: ^cibuildwheel/resources/_cross_venv.py$ # Requires Python 3.13 or later
additional_dependencies: &mypy-dependencies
- bracex
- build
@@ -57,7 +56,7 @@ repos:
additional_dependencies: *mypy-dependencies
- repo: https://github.com/shellcheck-py/shellcheck-py
rev: 745eface02aef23e168a8afb6b5737818efbea95 # frozen: v0.11.0.1
rev: v0.11.0.1
hooks:
- id: shellcheck
@@ -78,7 +77,7 @@ repos:
additional_dependencies: [cogapp>=3.5]
- repo: https://github.com/codespell-project/codespell
rev: 2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a # frozen: v2.4.2
rev: v2.4.2
hooks:
- id: codespell
args: ["-w"]
@@ -86,13 +85,14 @@ repos:
- repo: https://github.com/python-jsonschema/check-jsonschema
rev: ed81924a8b1cecdaa570b072528fa80c9c4d6ccd # frozen: 0.37.1
rev: 0.37.0
hooks:
- id: check-dependabot
- id: check-github-actions
- id: check-github-workflows
- id: check-gitlab-ci
- id: check-readthedocs
# Disabled due to schema issue for now:
# - id: check-readthedocs
- id: check-travis
- id: check-jsonschema
name: Check projects
+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¹ / GitLab¹ | GitHub Actions | GitHub Actions |
| macOS | Azure Pipelines | CircleCI¹ / GitLab¹ | GitHub Actions | |
| Windows | Azure Pipelines | GitLab¹ | GitHub Actions | |
| | 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 | |
> ¹ Runs a reduced set of tests to reduce CI load
+52 -54
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 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅<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 |
| | 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 |
<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>
<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>
- Builds manylinux, musllinux, macOS, and Windows wheels for CPython, PyPy, and GraalPy
- Works on GitHub Actions, Azure Pipelines, CircleCI, and GitLab CI
- Works on GitHub Actions, Azure Pipelines, CircleCI, GitLab CI, and Cirrus 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 | 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> |
| | Linux | macOS | Windows | Linux ARM | macOS ARM | Windows ARM | Android | iOS |
|-----------------|-------|-------|---------|-----------|-----------|-------------|---------|-----|
| GitHub Actions | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅⁴ | ✅³ |
| Azure Pipelines | ✅ | ✅ | ✅ | | ✅ | ✅² | ✅⁴ | ✅³ |
| CircleCI | ✅ | ✅ | | ✅ | ✅ | | ✅⁴ | ✅³ |
| Gitlab CI | ✅ | ✅ | ✅ | ✅¹ | ✅ | | ✅⁴ | ✅³ |
| Cirrus CI | ✅ | ✅ | ✅ | ✅ | ✅ | | ✅⁴ | |
<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>
<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>
<!--intro-end-->
@@ -99,7 +99,7 @@ jobs:
- uses: actions/setup-python@v6
- name: Install cibuildwheel
run: python -m pip install cibuildwheel==3.4.1
run: python -m pip install cibuildwheel==3.4.0
- name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse
@@ -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][] ![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. |
| [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. |
| [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][] ![pyodide icon][] | The fundamental package for scientific computing with Python. |
| [NumPy][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux 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][] ![pyodide icon][] | The venerable Matplotlib, a Python library with C++ portions |
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux 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. |
| [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 |
[scikit-learn]: https://github.com/scikit-learn/scikit-learn
[duckdb]: https://github.com/duckdb/duckdb
@@ -205,19 +205,17 @@ 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
[Triton]: https://github.com/openai/triton
[Kivy]: https://github.com/kivy/kivy
[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 -->
@@ -237,16 +235,6 @@ Changelog
<!-- [[[cog from readme_changelog import mini_changelog; print(mini_changelog()) ]]] -->
### v3.4.1
_2 April 2026_
- ⚠️ Building for the experimental CPython 3.13 free-threading variant is now deprecated. That functionality will be removed in the next minor release. The [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable) option `cpython-freethreading` is therefore also deprecated. Builds specifying `enable = "all"` no longer select `cpython-freethreading`. CPython 3.14 free-threading support remains available without the `enable` flag. (#2787)
- 🐛 iOS builds will no longer skip `repair-wheel-command` if it's defined in config (#2761)
- 🐛 Fix bug causing `uv` to fail when environments define PYTHON_VERSION or UV_PYTHON, conflicting with our venvs (#2795)
- ✨ cibuildwheel prints the selected build identifiers at the start of the build. (#2785)
- 🔐 The GitHub Action now references other actions with a full SHA (#2744)
### v3.4.0
_5 March 2026_
@@ -254,7 +242,6 @@ _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)
@@ -287,7 +274,18 @@ _12 October 2025_
- 🐛 Fix the default MACOSX_DEPLOYMENT_TARGET on Python 3.14 (#2613)
- 📚 Docs improvements (#2617)
<!-- [[[end]]] (sum: h5X+wOmWfI) -->
### v3.2.0
_22 September 2025_
- ✨ Adds GraalPy v25 (Python 3.12) support (#2597)
- 🛠 Update to CPython 3.14.0rc3 (#2602)
- 🛠 Adds CPython 3.14.0 prerelease support for Android, and a number of improvements to Android builds (#2568, #2591)
- 🛠 Improvements to testing on Android, passing environment markers when installing the venv, and providing more debug output when build-verbosity is set (#2575)
- ⚠️ PyPy 3.10 was moved to `pypy-eol` in the `enable` option, as it is now end-of-life. (#2521)
- 📚 Docs improvements (#2574, #2601, #2598)
<!-- [[[end]]] (sum: aO1wNWSgKa) -->
---
@@ -314,11 +312,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)
+20 -46
View File
@@ -36,10 +36,9 @@ runs:
- id: cibw
run: |
# Install cibuildwheel and build the command line
"$PYTHON" -u << "EOF"
# Install cibuildwheel
"${{ steps.python.outputs.python-path }}" -u << "EOF"
import os
import shlex
import shutil
import sys
import venv
@@ -47,7 +46,7 @@ runs:
from pathlib import Path
from subprocess import run
EXTRAS = set(e.strip() for e in os.environ.get("INPUT_EXTRAS", "").split(",") if e.strip())
EXTRAS = set(e.strip() for e in "${{ inputs.extras }}".split(",") if e.strip())
class EnvBuilder(venv.EnvBuilder):
@@ -60,14 +59,14 @@ runs:
def post_setup(self, context):
super().post_setup(context)
self.bin_path = Path(context.env_exe).parent
install_spec = os.environ["GITHUB_ACTION_PATH"]
install_spec = r"${{ github.action_path }}"
if EXTRAS:
install_spec += f"[{','.join(sorted(EXTRAS))}]"
run([sys.executable, "-m", "pip", "--python", context.env_exe, "install", install_spec], check=True)
print("::group::Install cibuildwheel")
venv_path = Path(os.environ["RUNNER_TEMP"]) / "cibw"
venv_path = Path(r"${{ runner.temp }}") / "cibw"
if venv_path.exists():
shutil.rmtree(venv_path)
@@ -89,59 +88,34 @@ runs:
cibw_bin = [p for p in builder.bin_path.glob("cibuildwheel*") if p.stem == "cibuildwheel"][0]
# Build the command line
cmd_args = [str(cibw_bin), os.environ["INPUT_PACKAGE_DIR"]]
if output_dir := os.environ.get("INPUT_OUTPUT_DIR"):
cmd_args += ["--output-dir", output_dir]
if config_file := os.environ.get("INPUT_CONFIG_FILE"):
cmd_args += ["--config-file", config_file]
if only := os.environ.get("INPUT_ONLY"):
cmd_args += ["--only", only]
cmd_bash = shlex.join(cmd_args)
def pwsh_quote(text):
# Wrap in single quotes and double-up any existing single quotes
return "'" + str(text).replace("'", "''") + "'"
# Prepend '& ' so PowerShell executes the quoted binary path
cmd_pwsh = "& " + " ".join(pwsh_quote(arg) for arg in cmd_args)
with open(os.environ["GITHUB_OUTPUT"], "at") as f:
f.write(f"cibw-bin={cibw_bin}\n")
f.write(f"prepend-path={clean_bin_path}\n")
f.write(f"cmd-bash={cmd_bash}\n")
f.write(f"cmd-pwsh={cmd_pwsh}\n")
print("::endgroup::")
EOF
shell: bash
env:
PYTHON: ${{ steps.python.outputs.python-path }}
INPUT_PACKAGE_DIR: ${{ inputs.package-dir }}
INPUT_OUTPUT_DIR: ${{ inputs.output-dir }}
INPUT_CONFIG_FILE: ${{ inputs.config-file }}
INPUT_ONLY: ${{ inputs.only }}
INPUT_EXTRAS: ${{ inputs.extras }}
# Redirecting stderr to stdout to fix interleaving issue in Actions.
- run: |
export PATH="$CIBW_PREPEND_PATH:$PATH"
eval "$CIBW_CMD_BASH" 2>&1
export PATH="${{ steps.cibw.outputs.prepend-path }}:$PATH"
"${{ steps.cibw.outputs.cibw-bin }}" \
"${{ inputs.package-dir }}" \
${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}} \
${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}} \
${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}} \
2>&1
shell: bash
if: runner.os != 'Windows'
env:
CIBW_PREPEND_PATH: ${{ steps.cibw.outputs.prepend-path }}
CIBW_CMD_BASH: ${{ steps.cibw.outputs.cmd-bash }}
# Windows needs powershell to interact nicely with Meson
- run: |
$env:PATH = "$env:CIBW_PREPEND_PATH;$env:PATH"
Invoke-Expression $env:CIBW_CMD_PWSH
$env:PATH = "${{ steps.cibw.outputs.prepend-path }};$env:PATH"
& "${{ steps.cibw.outputs.cibw-bin }}" `
"${{ inputs.package-dir }}" `
${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}} `
${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}} `
${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}}
shell: pwsh
if: runner.os == 'Windows'
env:
CIBW_PREPEND_PATH: ${{ steps.cibw.outputs.prepend-path }}
CIBW_CMD_PWSH: ${{ steps.cibw.outputs.cmd-pwsh }}
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env -S uv run --script
#!/usr/bin/env python3
# /// script
# dependencies = ["click", "packaging", "prek"]
+1 -11
View File
@@ -1,14 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
#!/usr/bin/env python3
import sys
import textwrap
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env -S uv run --script
#!/usr/bin/env -S uv run -q
# /// script
# dependencies = ["pyyaml"]
+1 -14
View File
@@ -1,17 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "pygithub",
# "pyyaml",
# "rich",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
#!/usr/bin/env python3
"""
Check known projects for usage of requires-python.
+1 -7
View File
@@ -1,10 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# ]
# ///
#!/usr/bin/env python3
import os
+6 -14
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env -S uv run --script
#!/usr/bin/env python3
# /// script
# dependencies = [
@@ -20,7 +20,6 @@ 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
@@ -31,7 +30,7 @@ from typing import Any, Self, TextIO
import click
import yaml
from github import Auth, Github, GithubException
from github import Github, GithubException
ICONS = (
"github",
@@ -39,12 +38,10 @@ ICONS = (
"circleci",
"gitlab",
"travisci",
"cirrusci",
"windows",
"apple",
"linux",
"android",
"ios",
"pyodide",
)
@@ -133,13 +130,8 @@ class Project:
def fetch_icon(icon_name: str) -> None:
url = f"https://cdn.jsdelivr.net/npm/simple-icons@v4/icons/{icon_name}.svg"
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
with urllib.request.urlopen(url) as f:
original_svg_data = f.read()
document = xml.dom.minidom.parseString(original_svg_data)
svgElement = document.documentElement
@@ -173,7 +165,7 @@ def get_projects(
for icon in ICONS:
fetch_icon(icon)
github = Github(auth=Auth.Token(auth)) if (online and auth) else None
github = Github(auth) if online else None
return sorted((Project(item, github) for item in config), reverse=online)
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env -S uv run --script
#!/usr/bin/env python3
import re
from pathlib import Path
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env -S uv run --script
#!/usr/bin/env python3
import dataclasses
import re
+6 -7
View File
@@ -1,10 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# ]
# ///
#!/usr/bin/env python3
import os
@@ -121,6 +115,11 @@ 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 -S uv run --script
#!/usr/bin/env python3
import argparse
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env -S uv run --script
#!/usr/bin/env python3
import argparse
+1 -8
View File
@@ -1,11 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "packaging",
# "requests",
# ]
# ///
#!/usr/bin/env python3
import configparser
import dataclasses
+32 -43
View File
@@ -1,60 +1,49 @@
#!/usr/bin/env -S uv run --script
#!/usr/bin/env python3
# /// script
# dependencies = [
# "playwright",
# ]
# ///
import subprocess
import sys
import tempfile
from pathlib import Path
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>
"""
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
"""
)
def main() -> None:
subprocess.run([sys.executable, "-m", "playwright", "install", "chromium"], check=True)
subprocess.run(["mkdocs", "build"], check=True)
html_str = Path("docs/diagram.html").read_text()
html_str = f"<html><head>{CSS}</head><body>{html_str}</body></html>"
hti = Html2Image(custom_flags=["--force-device-scale-factor=2"])
with tempfile.TemporaryDirectory() as tmp_dir_str:
html_path = Path(tmp_dir_str) / "diagram_screenshot.html"
html_path.write_text(html_str)
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
dest_path = Path("docs/data/how-it-works.png")
[screenshot, *_] = hti.screenshot(
html_str=html_str,
size=(830, 405),
)
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")
dest_path = Path("docs/data/how-it-works.png")
dest_path.unlink(missing_ok=True)
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()
Path(screenshot).rename(dest_path)
if __name__ == "__main__":
+1 -10
View File
@@ -1,13 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "packaging",
# "requests",
# "rich",
# ]
# ///
#!/usr/bin/env python3
import dataclasses
+1 -10
View File
@@ -1,13 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
#!/usr/bin/env python3
import json
+1 -14
View File
@@ -1,17 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "packaging",
# "requests",
# "rich",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
#!/usr/bin/env python3
import difflib
+1 -13
View File
@@ -1,16 +1,4 @@
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = [
# "click",
# "packaging",
# "rich",
# "cibuildwheel",
# ]
#
# [tool.uv.sources]
# cibuildwheel = { path = ".." }
# ///
#!/usr/bin/env python3
import dataclasses
+1 -1
View File
@@ -1 +1 @@
__version__ = "3.4.1"
__version__ = "3.4.0"
+7 -13
View File
@@ -15,6 +15,7 @@ from tempfile import mkdtemp
from typing import Any, Literal, TextIO
import cibuildwheel
import cibuildwheel.util
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture, allowed_architectures_check
from cibuildwheel.ci import CIProvider, detect_ci_provider, fix_ansi_codes_for_github_actions
@@ -52,7 +53,7 @@ class Unbuffered:
self.stream.writelines(data)
self.stream.flush()
def __getattr__(self, attr: str) -> Any: # noqa: ANN401
def __getattr__(self, attr: str) -> Any:
return getattr(self.stream, attr)
@@ -431,17 +432,17 @@ def print_preamble(platform: str, options: Options, identifiers: Sequence[str])
msg = "\n".join(error_list)
raise errors.ConfigurationError(msg)
n = len(identifiers)
print(f"{n} build{'s' if n != 1 else ''} selected:")
print(", ".join(identifiers))
print()
print("Here we go!\n")
def detect_errors(*, options: Options, identifiers: Iterable[str]) -> Generator[str, None, None]:
# Check for deprecated CIBW_FREE_THREADED_SUPPORT environment variable
if "CIBW_FREE_THREADED_SUPPORT" in os.environ:
yield "CIBW_FREE_THREADED_SUPPORT environment variable is no longer supported."
yield (
"CIBW_FREE_THREADED_SUPPORT environment variable is no longer supported. "
'Use tool.cibuildwheel.enable = ["cpython-freethreading"] in pyproject.toml '
"or set CIBW_ENABLE=cpython-freethreading instead."
)
# Deprecated {python} and {pip}
for option_name in ["test_command", "before_build"]:
@@ -468,13 +469,6 @@ def detect_warnings(*, options: Options) -> Generator[str, None, None]:
build_selector = options.globals.build_selector
test_selector = options.globals.test_selector
if EnableGroup.CPythonFreeThreading in build_selector.enable:
yield (
"'cpython-freethreading' enable is deprecated and will be removed in a future version. "
"It should be removed from tool.cibuildwheel.enable in pyproject.toml "
"or CIBW_ENABLE environment variable."
)
all_valid_identifiers = [
config.identifier
for module in ALL_PLATFORM_MODULES.values()
+50 -49
View File
@@ -6,10 +6,11 @@ import sys
import typing
from collections.abc import Set
from enum import StrEnum, auto
from typing import Final, Literal, Self
from typing import Final, Literal
from cibuildwheel import errors
from cibuildwheel.typing import PlatformName
from .typing import PlatformName
PRETTY_NAMES: Final[dict[PlatformName, str]] = {
"linux": "Linux",
@@ -82,34 +83,34 @@ class Architecture(StrEnum):
arm64_iphonesimulator = auto()
x86_64_iphonesimulator = auto()
@classmethod
def parse_config(cls, config: str, platform: PlatformName) -> set[Self]:
@staticmethod
def parse_config(config: str, platform: PlatformName) -> "set[Architecture]":
result = set()
for arch_str in re.split(r"[\s,]+", config):
match arch_str:
case "auto":
result |= cls.auto_archs(platform=platform)
result |= Architecture.auto_archs(platform=platform)
case "native":
if native_arch := cls.native_arch(platform=platform):
if native_arch := Architecture.native_arch(platform=platform):
result.add(native_arch)
case "all":
result |= cls.all_archs(platform=platform)
result |= Architecture.all_archs(platform=platform)
case "auto64":
result |= cls.bitness_archs(platform=platform, bitness="64")
result |= Architecture.bitness_archs(platform=platform, bitness="64")
case "auto32":
result |= cls.bitness_archs(platform=platform, bitness="32")
result |= Architecture.bitness_archs(platform=platform, bitness="32")
case _:
try:
result.add(cls(arch_str))
result.add(Architecture(arch_str))
except ValueError as e:
msg = f"Invalid architecture '{arch_str}'"
raise errors.ConfigurationError(msg) from e
return result
@classmethod
def native_arch(cls, platform: PlatformName) -> Self | None:
@staticmethod
def native_arch(platform: PlatformName) -> "Architecture | None":
native_machine = platform_module.machine()
native_architecture = cls(native_machine)
native_architecture = Architecture(native_machine)
# Cross-platform support. Used for --print-build-identifiers or docker builds.
host_platform: PlatformName = (
@@ -119,15 +120,15 @@ class Architecture(StrEnum):
)
if platform == "pyodide":
return cls.wasm32
return Architecture.wasm32
elif platform == "ios":
# Can only build for iOS on macOS. The "native" architecture is the
# simulator for the macOS native platform.
if host_platform == "macos":
if native_architecture == cls.x86_64:
return cls.x86_64_iphonesimulator
if native_architecture == Architecture.x86_64:
return Architecture.x86_64_iphonesimulator
else:
return cls.arm64_iphonesimulator
return Architecture.arm64_iphonesimulator
else:
return None
@@ -139,64 +140,64 @@ class Architecture(StrEnum):
# can't build anything on this platform
return None
native_architecture = cls(synonym)
native_architecture = Architecture(synonym)
return native_architecture
@classmethod
def auto_archs(cls, platform: PlatformName) -> set[Self]:
native_arch = cls.native_arch(platform)
@staticmethod
def auto_archs(platform: PlatformName) -> "set[Architecture]":
native_arch = Architecture.native_arch(platform)
if native_arch is None:
return set() # can't build anything on this platform
result = {native_arch}
match platform:
case "windows" if cls.AMD64 in result:
result.add(cls.x86)
case "ios" if native_arch == cls.arm64_iphonesimulator:
case "windows" if Architecture.AMD64 in result:
result.add(Architecture.x86)
case "ios" if native_arch == Architecture.arm64_iphonesimulator:
# Also build the device wheel if we're on ARM64.
result.add(cls.arm64_iphoneos)
result.add(Architecture.arm64_iphoneos)
return result
@classmethod
def all_archs(cls, platform: PlatformName) -> set[Self]:
@staticmethod
def all_archs(platform: PlatformName) -> "set[Architecture]":
all_archs_map = {
"linux": {
cls.x86_64,
cls.i686,
cls.aarch64,
cls.ppc64le,
cls.s390x,
cls.armv7l,
cls.riscv64,
Architecture.x86_64,
Architecture.i686,
Architecture.aarch64,
Architecture.ppc64le,
Architecture.s390x,
Architecture.armv7l,
Architecture.riscv64,
},
"macos": {cls.x86_64, cls.arm64, cls.universal2},
"windows": {cls.x86, cls.AMD64, cls.ARM64},
"pyodide": {cls.wasm32},
"android": {cls.x86_64, cls.arm64_v8a},
"macos": {Architecture.x86_64, Architecture.arm64, Architecture.universal2},
"windows": {Architecture.x86, Architecture.AMD64, Architecture.ARM64},
"pyodide": {Architecture.wasm32},
"android": {Architecture.x86_64, Architecture.arm64_v8a},
"ios": {
cls.x86_64_iphonesimulator,
cls.arm64_iphonesimulator,
cls.arm64_iphoneos,
Architecture.x86_64_iphonesimulator,
Architecture.arm64_iphonesimulator,
Architecture.arm64_iphoneos,
},
}
return all_archs_map[platform]
@classmethod
def bitness_archs(cls, platform: PlatformName, bitness: Literal["64", "32"]) -> set[Self]:
@staticmethod
def bitness_archs(platform: PlatformName, bitness: Literal["64", "32"]) -> "set[Architecture]":
# This map maps 64-bit architectures to their 32-bit equivalents.
archs_map = {
cls.x86_64: cls.i686,
cls.AMD64: cls.x86,
cls.aarch64: cls.armv7l,
Architecture.x86_64: Architecture.i686,
Architecture.AMD64: Architecture.x86,
Architecture.aarch64: Architecture.armv7l,
}
native_arch = cls.native_arch(platform)
native_arch = Architecture.native_arch(platform)
if native_arch is None:
return set() # can't build anything on this platform
if native_arch == cls.wasm32:
if native_arch == Architecture.wasm32:
return {native_arch} if bitness == "32" else set()
match bitness:
@@ -206,7 +207,7 @@ class Architecture(StrEnum):
if native_arch in archs_map.values():
return {native_arch}
elif native_arch in archs_map and platform in {"linux", "windows"}:
if native_arch == cls.aarch64 and not _check_aarch32_el0():
if native_arch == Architecture.aarch64 and not _check_aarch32_el0():
# If we're on aarch64, skip if we cannot build armv7l wheels.
return set()
return {archs_map[native_arch]}
+4 -1
View File
@@ -2,7 +2,7 @@ import os
import re
from enum import Enum
from cibuildwheel.util.helpers import strtobool
from .util.helpers import strtobool
ANSI_CODE_REGEX = re.compile(r"(\033\[[0-9;]*m)")
@@ -14,6 +14,7 @@ class CIProvider(Enum):
azure_pipelines = "azure_pipelines"
github_actions = "github_actions"
gitlab = "gitlab"
cirrus_ci = "cirrus_ci"
# unofficial support
appveyor = "appveyor"
@@ -34,6 +35,8 @@ 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:
+2 -2
View File
@@ -5,7 +5,7 @@ from typing import Any, Protocol
import bashlex
import bashlex.errors
from cibuildwheel import bashlex_eval
from . import bashlex_eval
class EnvironmentParseError(Exception):
@@ -131,7 +131,7 @@ class ParsedEnvironment:
def __repr__(self) -> str:
return f"{self.__class__.__name__}({[repr(a) for a in self.assignments]!r})"
def options_summary(self) -> list[EnvironmentAssignment]:
def options_summary(self) -> Any:
return self.assignments
+1 -1
View File
@@ -62,7 +62,7 @@ def github_api_request(path: str, *, max_retries: int = 3) -> dict[str, Any]:
# pylint: disable=E1101
if (
isinstance(e, urllib.error.HTTPError)
and (e.code in {403, 429})
and (e.code == 403 or e.code == 429)
and e.headers.get("x-ratelimit-remaining") == "0"
):
reset_time = int(e.headers.get("x-ratelimit-reset", 0))
+2 -2
View File
@@ -4,8 +4,8 @@ import typing
from collections.abc import Sequence
from typing import Literal, Self, get_args
from cibuildwheel.logger import log
from cibuildwheel.util.helpers import parse_key_value_string
from .logger import log
from .util.helpers import parse_key_value_string
BuildFrontendName = Literal["pip", "build", "build[uv]", "uv"]
+2 -2
View File
@@ -15,10 +15,10 @@ from typing import IO, TYPE_CHECKING, AnyStr, Final, Literal
import humanize
from cibuildwheel.ci import CIProvider, detect_ci_provider, filter_ansi_codes
from .ci import CIProvider, detect_ci_provider, filter_ansi_codes
if TYPE_CHECKING:
from cibuildwheel.options import Options
from .options import Options
FoldPattern = tuple[str, str]
DEFAULT_FOLD_PATTERN: Final[FoldPattern] = ("{name}", "")
+7 -7
View File
@@ -16,12 +16,12 @@ from pathlib import Path, PurePath, PurePosixPath
from types import TracebackType
from typing import IO, Literal, Self, assert_never
from cibuildwheel.ci import CIProvider, detect_ci_provider
from cibuildwheel.errors import OCIEngineTooOldError
from cibuildwheel.logger import log
from cibuildwheel.typing import PathOrStr
from cibuildwheel.util.cmd import call
from cibuildwheel.util.helpers import FlexibleVersion, parse_key_value_string, strtobool
from .ci import CIProvider, detect_ci_provider
from .errors import OCIEngineTooOldError
from .logger import log
from .typing import PathOrStr
from .util.cmd import call
from .util.helpers import FlexibleVersion, parse_key_value_string, strtobool
ContainerEngineName = Literal["docker", "podman"]
@@ -37,7 +37,7 @@ class OCIPlatform(Enum):
S390X = "linux/s390x"
@classmethod
def native(cls) -> Self:
def native(cls) -> "OCIPlatform":
"""Return the current OCI platform, or raise ValueError if unknown."""
arch = platform.machine().lower()
mapping = {
+15 -17
View File
@@ -14,18 +14,18 @@ from typing import Any, Final, Literal, Self, assert_never
from packaging.specifiers import SpecifierSet
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture
from cibuildwheel.environment import EnvironmentParseError, ParsedEnvironment, parse_environment
from cibuildwheel.frontend import BuildFrontendConfig
from cibuildwheel.logger import log
from cibuildwheel.oci_container import OCIContainerEngineConfig
from cibuildwheel.projectfiles import get_requires_python_str, resolve_dependency_groups
from cibuildwheel.selector import BuildSelector, EnableGroup, TestSelector, selector_matches
from cibuildwheel.typing import PLATFORMS, PlatformName
from cibuildwheel.util import resources
from cibuildwheel.util.helpers import format_safe, parse_key_value_string, strtobool, unwrap
from cibuildwheel.util.packaging import DependencyConstraints
from . import errors
from .architecture import Architecture
from .environment import EnvironmentParseError, ParsedEnvironment, parse_environment
from .frontend import BuildFrontendConfig
from .logger import log
from .oci_container import OCIContainerEngineConfig
from .projectfiles import get_requires_python_str, resolve_dependency_groups
from .selector import BuildSelector, EnableGroup, TestSelector, selector_matches
from .typing import PLATFORMS, PlatformName
from .util import resources
from .util.helpers import format_safe, parse_key_value_string, strtobool, unwrap
from .util.packaging import DependencyConstraints
MANYLINUX_ARCHS: Final[tuple[str, ...]] = (
"x86_64",
@@ -686,8 +686,6 @@ class Options:
skip_config = ""
architectures = Architecture.all_archs(self.platform)
enable |= EnableGroup.all_groups()
if args.only.startswith("cp313t-"):
enable.add(EnableGroup.CPythonFreeThreading)
build_selector = BuildSelector(
build_config=build_config,
@@ -989,8 +987,8 @@ class Options:
def option_summary(
self,
option_name: str,
option_value: Any, # noqa: ANN401
default_value: Any, # noqa: ANN401
option_value: Any,
default_value: Any,
overrides: Mapping[str, Any] | None = None,
skip_unset: bool = False,
) -> str | None:
@@ -1042,7 +1040,7 @@ class Options:
return value
@staticmethod
def option_summary_value(option_value: Any) -> str: # noqa: ANN401
def option_summary_value(option_value: Any) -> str:
if hasattr(option_value, "options_summary"):
option_value = option_value.options_summary()
+12 -7
View File
@@ -1,14 +1,19 @@
from __future__ import annotations
import sys
from collections.abc import Sequence
from pathlib import Path
from typing import Final, Protocol
from typing import TYPE_CHECKING, Final, Protocol
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture
from cibuildwheel.options import Options
from cibuildwheel.platforms import android, ios, linux, macos, pyodide, windows
from cibuildwheel.selector import BuildSelector
from cibuildwheel.typing import GenericPythonConfiguration, PlatformName
if TYPE_CHECKING:
from collections.abc import Sequence
from pathlib import Path
from cibuildwheel.architecture import Architecture
from cibuildwheel.options import Options
from cibuildwheel.selector import BuildSelector
from cibuildwheel.typing import GenericPythonConfiguration, PlatformName
class PlatformModule(Protocol):
+17 -27
View File
@@ -22,21 +22,19 @@ from elftools.common.exceptions import ELFError
from elftools.elf.elffile import ELFFile
from filelock import FileLock
from cibuildwheel import errors, platforms # pylint: disable=cyclic-import
from cibuildwheel.architecture import Architecture, arch_synonym
from cibuildwheel.frontend import get_build_frontend_extra_flags, parse_config_settings
from cibuildwheel.logger import log
from cibuildwheel.options import BuildOptions, Options
from cibuildwheel.selector import BuildSelector
from cibuildwheel.util import resources
from cibuildwheel.util.cmd import call, shell
from cibuildwheel.util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
from cibuildwheel.util.helpers import prepare_command
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"
from .. import errors, platforms # pylint: disable=cyclic-import
from ..architecture import Architecture, arch_synonym
from ..frontend import get_build_frontend_extra_flags, parse_config_settings
from ..logger import log
from ..options import BuildOptions, Options
from ..selector import BuildSelector
from ..util import resources
from ..util.cmd import call, shell
from ..util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
from ..util.helpers import prepare_command
from ..util.packaging import find_compatible_wheel
from ..util.python_build_standalone import create_python_build_standalone_environment
from ..venv import constraint_flags, find_uv, virtualenv
ANDROID_TRIPLET = {
"arm64_v8a": "aarch64-linux-android",
@@ -178,11 +176,6 @@ 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
@@ -229,10 +222,7 @@ def setup_env(
f"or insert {command} above it."
)
raise errors.FatalError(msg)
if command == "python":
call(command, "-V", "-V", env=build_env)
else:
call(command, "--version", env=build_env)
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)
@@ -360,7 +350,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_ANDROID / f"_cross_venv.{suffix}", site_packages)
shutil.copy(resources.PATH / f"_cross_venv.{suffix}", site_packages)
sysconfigdata_path = Path(
shutil.copy(
@@ -435,7 +425,7 @@ def setup_rust(
venv_bin = Path(env["VIRTUAL_ENV"]) / "bin"
for tool in ["cargo", "rustup"]:
shim_path = venv_bin / tool
shutil.copy(RESOURCES_ANDROID / "rust_shim.py", shim_path)
shutil.copy(resources.PATH / "_rust_shim.py", shim_path)
shim_path.chmod(0o755)
@@ -642,7 +632,7 @@ def test_wheel(state: BuildState, wheel: Path, *, build_frontend: str) -> None:
return
log.step("Testing wheel...")
use_uv = build_frontend in {"build[uv]", "uv"}
use_uv = build_frontend == "build[uv]"
uv_path = find_uv()
if use_uv and uv_path is None:
msg = "uv not found"
+34 -21
View File
@@ -1,3 +1,5 @@
from __future__ import annotations
import dataclasses
import os
import platform
@@ -6,26 +8,39 @@ import shutil
import subprocess
import sys
import textwrap
from collections.abc import Sequence, Set
from pathlib import Path
from typing import assert_never
from typing import TYPE_CHECKING, assert_never
from filelock import FileLock
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture
from cibuildwheel.environment import ParsedEnvironment
from cibuildwheel.frontend import BuildFrontendName, get_build_frontend_extra_flags
from cibuildwheel.logger import log
from cibuildwheel.options import Options
from cibuildwheel.platforms.macos import install_cpython as install_build_cpython
from cibuildwheel.selector import BuildSelector
from cibuildwheel.util import resources
from cibuildwheel.util.cmd import call, shell, split_command
from cibuildwheel.util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
from cibuildwheel.util.helpers import prepare_command, unwrap_preserving_paragraphs
from cibuildwheel.util.packaging import find_compatible_wheel
from cibuildwheel.venv import constraint_flags, virtualenv
from .. import errors
from ..frontend import (
BuildFrontendName,
get_build_frontend_extra_flags,
)
from ..logger import log
from ..util import resources
from ..util.cmd import call, shell, split_command
from ..util.file import (
CIBW_CACHE_PATH,
copy_test_sources,
download,
move_file,
)
from ..util.helpers import prepare_command, unwrap_preserving_paragraphs
from ..util.packaging import (
find_compatible_wheel,
)
from ..venv import constraint_flags, virtualenv
from .macos import install_cpython as install_build_cpython
if TYPE_CHECKING:
from collections.abc import Sequence, Set
from ..architecture import Architecture
from ..environment import ParsedEnvironment
from ..options import Options
from ..selector import BuildSelector
@dataclasses.dataclass(frozen=True, kw_only=True)
@@ -269,8 +284,7 @@ def setup_python(
build_frontend: BuildFrontendName,
xbuild_tools: Sequence[str] | None,
) -> tuple[Path, dict[str, str]]:
# Not using set because mypy can't narrow it
if build_frontend == "build[uv]" or build_frontend == "uv": # noqa: PLR1714
if build_frontend == "build[uv]" or build_frontend == "uv":
msg = "uv doesn't support iOS"
raise errors.FatalError(msg)
@@ -355,7 +369,7 @@ def setup_python(
"entry or insert python above it."
)
raise errors.FatalError(msg)
call("python", "-V", "-V", env=env)
call("python", "--version", env=env)
# Check what pip version we're on
assert (venv_bin_path / "pip").exists()
@@ -427,8 +441,7 @@ def build(options: Options, tmp_path: Path) -> None:
build_options = options.build_options(config.identifier)
build_frontend = build_options.build_frontend
# uv doesn't support iOS
# Not using set because mypy can't narrow it
if build_frontend.name == "build[uv]" or build_frontend.name == "uv": # noqa: PLR1714
if build_frontend.name == "build[uv]" or build_frontend.name == "uv":
msg = "uv doesn't support iOS"
raise errors.FatalError(msg)
+14 -14
View File
@@ -8,20 +8,20 @@ from collections.abc import Iterable, Iterator, Sequence, Set
from pathlib import Path, PurePath, PurePosixPath
from typing import TYPE_CHECKING, assert_never
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture
from cibuildwheel.frontend import get_build_frontend_extra_flags
from cibuildwheel.logger import log
from cibuildwheel.oci_container import OCIContainer, OCIContainerEngineConfig, OCIPlatform
from cibuildwheel.options import BuildOptions, Options
from cibuildwheel.selector import BuildSelector
from cibuildwheel.util import resources
from cibuildwheel.util.file import copy_test_sources
from cibuildwheel.util.helpers import prepare_command, unwrap
from cibuildwheel.util.packaging import find_compatible_wheel
from .. import errors
from ..architecture import Architecture
from ..frontend import get_build_frontend_extra_flags
from ..logger import log
from ..oci_container import OCIContainer, OCIContainerEngineConfig, OCIPlatform
from ..options import BuildOptions, Options
from ..selector import BuildSelector
from ..util import resources
from ..util.file import copy_test_sources
from ..util.helpers import prepare_command, unwrap
from ..util.packaging import find_compatible_wheel
if TYPE_CHECKING:
from cibuildwheel.typing import PathOrStr
from ..typing import PathOrStr
ARCHITECTURE_OCI_PLATFORM_MAP = {
Architecture.x86_64: OCIPlatform.AMD64,
@@ -237,7 +237,6 @@ 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()
@@ -482,7 +481,8 @@ 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.
`setup_remote_docker` step to your .circleci/config.yml. If
you're building on Cirrus CI, use `docker_builder` task.
"""
)
raise errors.ConfigurationError(msg) from error
+20 -23
View File
@@ -15,20 +15,25 @@ from typing import Literal, assert_never
from filelock import FileLock
from packaging.version import Version
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture
from cibuildwheel.ci import detect_ci_provider
from cibuildwheel.environment import ParsedEnvironment
from cibuildwheel.frontend import BuildFrontendName, get_build_frontend_extra_flags
from cibuildwheel.logger import log
from cibuildwheel.options import Options
from cibuildwheel.selector import BuildSelector
from cibuildwheel.util import resources
from cibuildwheel.util.cmd import call, shell
from cibuildwheel.util.file import CIBW_CACHE_PATH, copy_test_sources, download, move_file
from cibuildwheel.util.helpers import prepare_command, unwrap
from cibuildwheel.util.packaging import find_compatible_wheel, get_pip_version
from cibuildwheel.venv import constraint_flags, find_uv, virtualenv
from .. import errors
from ..architecture import Architecture
from ..ci import detect_ci_provider
from ..environment import ParsedEnvironment
from ..frontend import BuildFrontendName, get_build_frontend_extra_flags
from ..logger import log
from ..options import Options
from ..selector import BuildSelector
from ..util import resources
from ..util.cmd import call, shell
from ..util.file import (
CIBW_CACHE_PATH,
copy_test_sources,
download,
move_file,
)
from ..util.helpers import prepare_command, unwrap
from ..util.packaging import find_compatible_wheel, get_pip_version
from ..venv import constraint_flags, find_uv, virtualenv
@functools.cache
@@ -253,10 +258,6 @@ def setup_python(
# https://github.com/pypa/virtualenv/issues/620
# Also see https://github.com/python/cpython/pull/9516
env.pop("__PYVENV_LAUNCHER__", None)
# uv uses this over the current environment's python, so remove it to avoid confusion
env.pop("PYTHON_VERSION", None)
env.pop("PYTHON_ARCH", None)
env.pop("UV_PYTHON", None)
# we version pip ourselves, so we don't care about pip version checking
env["PIP_DISABLE_PIP_VERSION_CHECK"] = "1"
@@ -270,7 +271,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", "-V", "-V", env=env)
call("python", "--version", env=env)
# check what pip version we're on
if not use_uv:
@@ -374,8 +375,6 @@ def setup_python(
uv_path,
"pip",
"install",
"--python",
which_python,
"--upgrade",
"delocate",
"build[virtualenv, uv]",
@@ -388,8 +387,6 @@ def setup_python(
uv_path,
"pip",
"install",
"--python",
which_python,
"--upgrade",
"delocate",
*constraint_flags(dependency_constraint),
+40 -46
View File
@@ -14,16 +14,16 @@ from typing import Final, TypedDict
from filelock import FileLock
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture
from cibuildwheel.environment import ParsedEnvironment
from cibuildwheel.frontend import get_build_frontend_extra_flags
from cibuildwheel.logger import log
from cibuildwheel.options import Options
from cibuildwheel.selector import BuildSelector
from cibuildwheel.util import resources
from cibuildwheel.util.cmd import call, shell
from cibuildwheel.util.file import (
from .. import errors
from ..architecture import Architecture
from ..environment import ParsedEnvironment
from ..frontend import get_build_frontend_extra_flags
from ..logger import log
from ..options import Options
from ..selector import BuildSelector
from ..util import resources
from ..util.cmd import call, shell
from ..util.file import (
CIBW_CACHE_PATH,
copy_test_sources,
download,
@@ -31,13 +31,13 @@ from cibuildwheel.util.file import (
extract_zip,
move_file,
)
from cibuildwheel.util.helpers import prepare_command, unwrap, unwrap_preserving_paragraphs
from cibuildwheel.util.packaging import find_compatible_wheel, get_pip_version
from cibuildwheel.util.python_build_standalone import (
from ..util.helpers import prepare_command, unwrap, unwrap_preserving_paragraphs
from ..util.packaging import find_compatible_wheel, get_pip_version
from ..util.python_build_standalone import (
PythonBuildStandaloneError,
create_python_build_standalone_environment,
)
from cibuildwheel.venv import constraint_flags, virtualenv
from ..venv import constraint_flags, virtualenv
IS_WIN: Final[bool] = sys.platform.startswith("win")
@@ -94,28 +94,21 @@ def ensure_node(major_version: str) -> Path:
return path
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():
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():
return emcc_path
call(
"pyodide",
"xbuildenv",
"install-emscripten",
"--version",
version,
"--path",
str(xbuildenv_cache_path),
env=env,
cwd=CIBW_CACHE_PATH,
)
assert emcc_path.exists()
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)
return emcc_path
@@ -187,8 +180,12 @@ def validate_pyodide_build_version(
raise errors.FatalError(msg)
def install_xbuildenv(env: dict[str, str], xbuildenv_cache_path: Path, pyodide_version: str) -> str:
def install_xbuildenv(env: dict[str, str], pyodide_build_version: str, 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"):
@@ -271,7 +268,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", "-V", "-V", env=env)
call("python", "--version", env=env)
# check what pip version we're on
assert (venv_bin_path / "pip").exists()
@@ -288,6 +285,7 @@ def setup_python(
"install",
"--upgrade",
"pyodide-build",
"build[virtualenv]",
*constraint_flags(constraints_path),
env=env,
)
@@ -306,19 +304,15 @@ def setup_python(
pyodide_build_version=pyodide_build_version,
)
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, 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)
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"]])
log.step(f"Installing Pyodide xbuildenv version: {pyodide_version} ...")
env["PYODIDE_ROOT"] = install_xbuildenv(env, pyodide_build_version, pyodide_version)
return env
+15 -25
View File
@@ -12,25 +12,19 @@ from typing import assert_never
from filelock import FileLock
from cibuildwheel import errors
from cibuildwheel.architecture import Architecture
from cibuildwheel.environment import ParsedEnvironment
from cibuildwheel.frontend import BuildFrontendName, get_build_frontend_extra_flags
from cibuildwheel.logger import log
from cibuildwheel.options import Options
from cibuildwheel.selector import BuildSelector
from cibuildwheel.util import resources
from cibuildwheel.util.cmd import call, shell
from cibuildwheel.util.file import (
CIBW_CACHE_PATH,
copy_test_sources,
download,
extract_zip,
move_file,
)
from cibuildwheel.util.helpers import prepare_command, unwrap
from cibuildwheel.util.packaging import find_compatible_wheel, get_pip_version
from cibuildwheel.venv import constraint_flags, find_uv, virtualenv
from .. import errors
from ..architecture import Architecture
from ..environment import ParsedEnvironment
from ..frontend import BuildFrontendName, get_build_frontend_extra_flags
from ..logger import log
from ..options import Options
from ..selector import BuildSelector
from ..util import resources
from ..util.cmd import call, shell
from ..util.file import CIBW_CACHE_PATH, copy_test_sources, download, extract_zip, move_file
from ..util.helpers import prepare_command, unwrap
from ..util.packaging import find_compatible_wheel, get_pip_version
from ..venv import constraint_flags, find_uv, virtualenv
def get_nuget_args(
@@ -293,9 +287,7 @@ def setup_python(
# set up environment variables for run_with_env
env["PYTHON_VERSION"] = python_configuration.version
env["PYTHON_ARCH"] = python_configuration.arch
env.pop("UV_PYTHON", None)
if not use_uv:
env["PIP_DISABLE_PIP_VERSION_CHECK"] = "1"
env["PIP_DISABLE_PIP_VERSION_CHECK"] = "1"
# update env with results from CIBW_ENVIRONMENT
env = environment.as_dictionary(prev_environment=env)
@@ -306,7 +298,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", "-V", "-V", env=env)
call("python", "--version", env=env)
call("python", "-c", "\"import struct; print(struct.calcsize('P') * 8)\"", env=env)
# check what pip version we're on
@@ -336,8 +328,6 @@ def setup_python(
uv_path,
"pip",
"install",
"--python",
where_python,
"--upgrade",
"build[virtualenv]",
*constraint_flags(dependency_constraint),
@@ -1,11 +0,0 @@
--- 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.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 = "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 = "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.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 = "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 = "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.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 = "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 = "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.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" },
{ 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" },
]
[ios]
@@ -10,7 +10,7 @@ build==1.2.2.post1
# pyodide-build
certifi==2026.2.25
# via requests
charset-normalizer==3.4.6
charset-normalizer==3.4.5
# via requests
click==8.1.8
# via
@@ -62,7 +62,7 @@ pyodide-lock==0.1.2
# via pyodide-build
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.1.3
# via virtualenv
requests==2.32.5
# via pyodide-build
@@ -10,7 +10,7 @@ build==1.2.2.post1
# pyodide-build
certifi==2026.2.25
# via requests
charset-normalizer==3.4.6
charset-normalizer==3.4.5
# via requests
click==8.1.8
# via
@@ -62,7 +62,7 @@ pyodide-lock==0.1.2
# via pyodide-build
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.0
python-discovery==1.1.3
# via virtualenv
requests==2.32.5
# via pyodide-build
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.3
build==1.4.0
# via -r cibuildwheel/resources/constraints.in
delocate==0.13.0
# via -r cibuildwheel/resources/constraints.in
@@ -12,7 +12,7 @@ filelock==3.25.2
# via
# python-discovery
# virtualenv
importlib-metadata==9.0.0
importlib-metadata==8.7.1
# via build
macholib==1.16.4
# via delocate
@@ -22,21 +22,21 @@ packaging==26.0
# delocate
pip==26.0.1
# via -r cibuildwheel/resources/constraints.in
platformdirs==4.9.6
platformdirs==4.9.4
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.2
python-discovery==1.1.3
# via virtualenv
tomli==2.4.1
tomli==2.4.0
# via build
typing-extensions==4.15.0
# via
# delocate
# virtualenv
virtualenv==21.2.1
virtualenv==21.2.0
# 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.3
build==1.4.0
# 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.6
platformdirs==4.9.4
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.2
python-discovery==1.1.3
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.1
virtualenv==21.2.0
# via -r cibuildwheel/resources/constraints.in
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.3
build==1.4.0
# 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.6
platformdirs==4.9.4
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.2
python-discovery==1.1.3
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.1
virtualenv==21.2.0
# via -r cibuildwheel/resources/constraints.in
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.3
build==1.4.0
# 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.6
platformdirs==4.9.4
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.2
python-discovery==1.1.3
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.1
virtualenv==21.2.0
# via -r cibuildwheel/resources/constraints.in
@@ -2,7 +2,7 @@
# nox -s update_constraints
altgraph==0.17.5
# via macholib
build==1.4.3
build==1.4.0
# 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.6
platformdirs==4.9.4
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.2
python-discovery==1.1.3
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.1
virtualenv==21.2.0
# 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.2
python-discovery==1.1.3
# via virtualenv
tomli==2.4.1
tomli==2.4.0
# via build
typing-extensions==4.13.2
# via
# delocate
# virtualenv
virtualenv==21.2.1
virtualenv==21.2.0
# 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.3
build==1.4.0
# 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.2
python-discovery==1.1.3
# via virtualenv
tomli==2.4.1
tomli==2.4.0
# via build
typing-extensions==4.15.0
# via
# delocate
# virtualenv
virtualenv==21.2.1
virtualenv==21.2.0
# 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.3
build==1.4.0
# 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.6
platformdirs==4.9.4
# via
# python-discovery
# virtualenv
pyproject-hooks==1.2.0
# via build
python-discovery==1.2.2
python-discovery==1.1.3
# via virtualenv
typing-extensions==4.15.0
# via delocate
virtualenv==21.2.1
virtualenv==21.2.0
# via -r cibuildwheel/resources/constraints.in
+3 -3
View File
@@ -1,4 +1,4 @@
url = "https://nodejs.org/dist/"
v24 = "v24.14.1"
v22 = "v22.22.2"
v20 = "v20.20.2"
v24 = "v24.14.0"
v22 = "v22.22.1"
v20 = "v20.20.1"
+34 -34
View File
@@ -1,54 +1,54 @@
[x86_64]
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
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.14-2
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2026.03.14-2
[i686]
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
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.14-2
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2026.03.14-2
[aarch64]
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
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.14-2
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2026.03.14-2
[ppc64le]
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
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2026.03.14-2
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2026.03.14-2
[s390x]
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
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2026.03.14-2
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2026.03.14-2
[pypy_x86_64]
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
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2026.03.14-2
[pypy_i686]
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
manylinux2014 = quay.io/pypa/manylinux2014_i686:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2026.03.14-2
[pypy_aarch64]
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
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2026.03.14-2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2026.03.14-2
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2026.03.14-2
[armv7l]
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
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2026.03.14-2
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l:2026.03.14-2
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2026.03.14-2
[riscv64]
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
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64:2026.03.14-2
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2026.03.14-2
@@ -1,723 +1,483 @@
{
"releases": [
{
"tag": "20260408",
"tag": "20260310",
"assets": [
{
"name": "cpython-3.10.20+20260408-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-aarch64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-aarch64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-aarch64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-i686-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-riscv64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-s390x-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.10.20+20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.10.20%2B20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.10.20+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.10.20%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-aarch64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-aarch64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-aarch64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-aarch64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-i686-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-riscv64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-s390x-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.11.15+20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.11.15%2B20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.11.15+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.11.15%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-aarch64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-aarch64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-aarch64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-aarch64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-i686-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-riscv64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-s390x-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.12.13+20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.12.13%2B20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.12.13+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.12.13%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-apple-darwin-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-apple-darwin-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-aarch64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-i686-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-i686-pc-windows-msvc-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-i686-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-riscv64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-s390x-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.13.12+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.13.12%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-apple-darwin-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-apple-darwin-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.13.13+20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.13.13%2B20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.14.3+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.14.3%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-apple-darwin-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-apple-darwin-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-apple-darwin-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-aarch64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-armv7-unknown-linux-gnueabi-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-i686-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-aarch64-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-ppc64le-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-i686-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-i686-pc-windows-msvc-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-i686-pc-windows-msvc-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-riscv64-unknown-linux-gnu-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-apple-darwin-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-apple-darwin-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.14.4+20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.14.4%2B20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-apple-darwin-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-apple-darwin-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-pc-windows-msvc-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-aarch64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-aarch64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-armv7-unknown-linux-gnueabi-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-armv7-unknown-linux-gnueabi-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-armv7-unknown-linux-gnueabihf-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-armv7-unknown-linux-gnueabihf-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-i686-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-i686-pc-windows-msvc-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-i686-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-i686-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-ppc64le-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-ppc64le-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-riscv64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-s390x-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-s390x-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-apple-darwin-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-apple-darwin-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-apple-darwin-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-pc-windows-msvc-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-pc-windows-msvc-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v2-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v2-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v2-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v3-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v3-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v3-unknown-linux-musl-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v4-unknown-linux-gnu-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v4-unknown-linux-gnu-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v4-unknown-linux-musl-freethreaded-install_only.tar.gz"
},
{
"name": "cpython-3.15.0a8+20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260408/cpython-3.15.0a8%2B20260408-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
"name": "cpython-3.15.0a7+20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20260310/cpython-3.15.0a7%2B20260310-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
}
]
}
+1 -1
View File
@@ -1 +1 @@
default = { version = "21.2.1", url = "https://github.com/pypa/get-virtualenv/releases/download/21.2.1/virtualenv.pyz" }
default = { version = "21.2.0", url = "https://github.com/pypa/get-virtualenv/releases/download/21.2.0/virtualenv.pyz" }
+1 -1
View File
@@ -1,7 +1,7 @@
import json
from typing import Any
from cibuildwheel.util import resources
from .util import resources
def get_schema(tool_name: str = "cibuildwheel") -> dict[str, Any]:
+6 -6
View File
@@ -2,7 +2,7 @@ import dataclasses
import itertools
from enum import StrEnum
from fnmatch import fnmatch
from typing import Self
from typing import Any
import bracex
from packaging.specifiers import SpecifierSet
@@ -37,11 +37,11 @@ class EnableGroup(StrEnum):
PyodidePrerelease = "pyodide-prerelease"
@classmethod
def all_groups(cls) -> frozenset[Self]:
return frozenset(set(cls) - {cls.CPythonFreeThreading})
def all_groups(cls) -> frozenset["EnableGroup"]:
return frozenset(cls)
@classmethod
def parse_option_value(cls, value: str) -> frozenset[Self]:
def parse_option_value(cls, value: str) -> frozenset["EnableGroup"]:
"""
Parses a string of space-separated values into a set of EnableGroup
members. The string may contain group names or "all".
@@ -113,7 +113,7 @@ class BuildSelector:
return should_build and not should_skip
def options_summary(self) -> dict[str, str | list[str]]:
def options_summary(self) -> Any:
return {
"build_config": self.build_config,
"skip_config": self.skip_config,
@@ -134,5 +134,5 @@ class TestSelector:
should_skip = selector_matches(self.skip_config, build_id)
return not should_skip
def options_summary(self) -> dict[str, str]:
def options_summary(self) -> Any:
return {"skip_config": self.skip_config}
+2 -2
View File
@@ -7,8 +7,8 @@ import typing
from collections.abc import Iterator, Mapping
from typing import Final, Literal
from cibuildwheel.errors import FatalError
from cibuildwheel.typing import PathOrStr
from ..errors import FatalError
from ..typing import PathOrStr
_IS_WIN: Final[bool] = sys.platform.startswith("win")
+1 -1
View File
@@ -12,7 +12,7 @@ from zipfile import ZipFile
import certifi
from platformdirs import user_cache_path
from cibuildwheel.errors import FatalError
from ..errors import FatalError
DEFAULT_CIBW_CACHE_PATH: Final[Path] = user_cache_path(appname="cibuildwheel", appauthor="pypa")
CIBW_CACHE_PATH: Final[Path] = Path(
+1 -1
View File
@@ -7,7 +7,7 @@ import textwrap
from collections import defaultdict
from collections.abc import Sequence
from cibuildwheel.typing import PathOrStr
from ..typing import PathOrStr
def format_safe(template: str, **kwargs: str | os.PathLike[str]) -> str:
+9 -8
View File
@@ -2,13 +2,13 @@ import shlex
from collections.abc import Mapping, Sequence
from dataclasses import dataclass, field
from pathlib import Path, PurePath
from typing import Literal, Self, TypeVar
from typing import Any, Literal, Self, TypeVar
from packaging.utils import parse_wheel_filename
from cibuildwheel.util import resources
from cibuildwheel.util.cmd import call
from cibuildwheel.util.helpers import parse_key_value_string, unwrap
from . import resources
from .cmd import call
from .helpers import parse_key_value_string, unwrap
@dataclass(kw_only=True)
@@ -102,7 +102,7 @@ class DependencyConstraints:
return None
def options_summary(self) -> str | dict[str, str]:
def options_summary(self) -> Any:
if self == DependencyConstraints.pinned():
return "pinned"
elif self.packages:
@@ -169,9 +169,10 @@ def find_compatible_wheel(wheels: Sequence[T], identifier: str) -> T | None:
elif platform.startswith("pyodide"):
# each Pyodide version has its own platform tag
continue
# Windows should exactly match
elif tag.platform != platform:
continue
else:
# Windows should exactly match
if tag.platform != platform:
continue
# If all the filters above pass, then the wheel is a previously built compatible wheel.
return wheel
+1 -1
View File
@@ -3,7 +3,7 @@ import tomllib
from pathlib import Path
from typing import Final
from cibuildwheel.typing import PlatformName
from ..typing import PlatformName
PATH: Final[Path] = Path(__file__).parent.parent / "resources"
INSTALL_CERTIFI_SCRIPT: Final[Path] = PATH / "install_certifi.py"
+3 -3
View File
@@ -12,9 +12,9 @@ from filelock import FileLock
from packaging.requirements import InvalidRequirement, Requirement
from packaging.version import Version
from cibuildwheel.util import resources
from cibuildwheel.util.cmd import call
from cibuildwheel.util.file import CIBW_CACHE_PATH, download
from .util import resources
from .util.cmd import call
from .util.file import CIBW_CACHE_PATH, download
_IS_WIN: Final[bool] = sys.platform.startswith("win")
-17
View File
@@ -4,16 +4,6 @@ title: Changelog
# Changelog
### v3.4.1
_2 April 2026_
- ⚠️ Building for the experimental CPython 3.13 free-threading variant is now deprecated. That functionality will be removed in the next minor release. The [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable) option `cpython-freethreading` is therefore also deprecated. Builds specifying `enable = "all"` no longer select `cpython-freethreading`. CPython 3.14 free-threading support remains available without the `enable` flag. (#2787)
- 🐛 iOS builds will no longer skip `repair-wheel-command` if it's defined in config (#2761)
- 🐛 Fix bug causing `uv` to fail when environments define PYTHON_VERSION or UV_PYTHON, conflicting with our venvs (#2795)
- ✨ cibuildwheel prints the selected build identifiers at the start of the build. (#2785)
- 🔐 The GitHub Action now references other actions with a full SHA (#2744)
### v3.4.0
_5 March 2026_
@@ -21,7 +11,6 @@ _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)
@@ -178,12 +167,6 @@ See @henryiii's [release post](https://iscinumpy.dev/post/cibuildwheel-3-0-0/) f
- 📚 Docs now primarily use the pyproject.toml name of options, rather than the environment variable name. (#2389)
- 📚 README table now matches docs and auto-updates. (#2427, #2428)
### v2.23.4
_16 March 2026_
- 🐛 Fix HTTP 429 errors while downloading virtualenv from GitHub blob URLs uses a https://bootstrap.pypa.io/ URL instead. (#2775)
### v2.23.3
_26 April 2025_
+14 -4
View File
@@ -103,6 +103,20 @@ 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
@@ -111,10 +125,6 @@ Gitlab will store the built wheels for you - you can access them from the Pipeli
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,6 +53,16 @@ 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: 91 KiB

After

Width:  |  Height:  |  Size: 67 KiB

+2 -1
View File
@@ -20,6 +20,7 @@
"travisci",
"circleci",
"gitlab",
"cirrusci",
"azurepipelines"
]
}
@@ -27,7 +28,7 @@
"ci_config": { "type": "string" },
"os": {
"type": "array",
"items": { "enum": ["windows", "apple", "linux", "android", "ios", "pyodide"] }
"items": { "enum": ["windows", "apple", "linux"] }
}
},
"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, android, ios, pyodide] (optional)
# ci: [github, azurepipelines, circleci, gitlab, travisci] (optional)
# os: Operating system list, [windows, apple, linux] (optional)
# ci: [github, azurepipelines, circleci, gitlab, travisci, cirrusci] (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, pyodide]
os: [windows, apple, linux]
- name: pyinstrument
gh: joerick/pyinstrument
@@ -48,8 +48,8 @@
- name: pybase64
gh: mayeut/pybase64
ci: [github]
os: [windows, apple, linux, android, ios, pyodide]
notes: setuptools backend with custom CMake step for external sources. SBOM embedded via a custom repair step.
os: [windows, apple, linux]
- name: KDEpy
gh: tommyod/KDEpy
@@ -144,7 +144,7 @@
- name: scikit-learn
gh: scikit-learn/scikit-learn
ci: [github]
os: [windows, apple, linux, pyodide]
os: [windows, apple, linux]
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, pyodide]
os: [windows, apple, linux]
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, android]
os: [windows, apple, linux]
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, pyodide]
os: [windows, apple, linux]
- name: pybind11 cmake_example
gh: pybind/cmake_example
ci: [github]
os: [windows, apple, linux, pyodide]
os: [windows, apple, linux]
- name: pybind11 scikit_build_example
gh: pybind/scikit_build_example
ci: [github]
os: [windows, apple, linux, pyodide]
os: [windows, apple, linux]
- 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, pyodide]
os: [windows, apple, linux]
- 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, pyodide]
os: [windows, apple, linux]
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, pyodide]
os: [apple, linux, windows]
- name: markupsafe
gh: pallets/markupsafe
@@ -401,7 +401,7 @@
- name: pillow-heif
gh: bigcat88/pillow_heif
pypi: pillow-heif
ci: [github]
ci: [github, cirrusci]
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, pyodide]
os: [windows, apple, linux]
- name: Wrapt
gh: GrahamDumpleton/wrapt
-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>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>

Before

Width:  |  Height:  |  Size: 722 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>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>

After

Width:  |  Height:  |  Size: 808 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>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>

Before

Width:  |  Height:  |  Size: 996 B

-12
View File
@@ -1,12 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 1.3 KiB

+30 -91
View File
@@ -5,9 +5,6 @@
<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">
@@ -20,17 +17,11 @@
</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">
@@ -95,7 +86,7 @@
[
{
href: 'options/#before-all',
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
platforms: ['linux', 'macos', 'windows'],
style: 'dot',
tooltip: {
title: 'CIBW_BEFORE_ALL',
@@ -113,27 +104,11 @@
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', 'android', 'ios', 'pyodide'],
platforms: ['linux', 'macos', 'windows'],
style: 'dot',
tooltip: {
title: 'CIBW_BEFORE_BUILD',
@@ -146,12 +121,12 @@
{
label: 'Build wheel',
href: 'options/#build-frontend',
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
platforms: ['linux', 'macos', 'windows'],
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, build, or uv.'
description: 'Build the wheel according to your package configuration, using the frontend of your choice - pip or build.'
},
},
],
@@ -179,31 +154,23 @@
},
},
{
label: 'Repair wheel',
env: "CIBW_REPAIR_WHEEL_COMMAND",
href: 'options/#repair-wheel-command',
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'],
label: 'repair wheel',
platforms: ['windows'],
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', 'android', 'ios', 'pyodide'],
platforms: ['linux', 'macos', 'windows'],
style: 'dot',
tooltip: {
title: 'CIBW_BEFORE_TEST',
@@ -215,10 +182,10 @@
[
{
label: 'Install wheel',
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
platforms: ['linux', 'macos', 'windows'],
style: 'block',
tooltip: {
description: 'Install the wheel we just built into the test environment.'
description: 'Install the wheel we just built into the test virtualenv.'
},
},
],
@@ -231,40 +198,7 @@
tooltip: {
title: 'CIBW_TEST_COMMAND',
tag: 'Optional step',
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.'
description: 'Execute a shell command to test each built wheel'
},
},
],
@@ -285,21 +219,26 @@
data() {
return {
diagram,
platforms: ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide'],
platforms: ['linux', 'macos', 'windows'],
}
},
methods: {
blockStyle(action) {
const platformOrder = ['linux', 'macos', 'windows', 'android', 'ios', 'pyodide']
const rowOffset = 3 // first platform starts at grid row 3
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
}
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
}
if (action.platforms.includes('windows')) {
end = 6
} else if (action.platforms.includes('macos')) {
end = 5
} else if (action.platforms.includes('linux')) {
end = 4
}
return {
@@ -474,7 +413,7 @@
.grid-outline {
grid-row-end: span 1;
position: relative;
color: #666666;
color: #8f8f8f;
}
.grid-outline.docker {
grid-row: 3 / span 1;
@@ -539,7 +478,7 @@
font-weight: 500;
text-transform: uppercase;
font-size: 0.9em;
color: #888888;
color: #C9C9C9;
}
.tooltip-description {
margin-top: 1px;
+1
View File
@@ -103,6 +103,7 @@ 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' },
+3 -6
View File
@@ -125,14 +125,11 @@ There are two suggested methods for keeping cibuildwheel up to date that instead
If you use GitHub Actions for builds, you can use cibuildwheel as an action:
```yaml
uses: pypa/cibuildwheel@v3.4.1
uses: pypa/cibuildwheel@v3.4.0
```
This is a composite step that just runs cibuildwheel using pipx. You can set command-line options as `with:` parameters, and use `env:` as normal.
!!! note "Minor version tags"
Unlike some GitHub Actions, cibuildwheel does **not** provide a floating `@v3` major-version tag, since our minor version change can add/remove wheels. You can, however, pin to a minor version such as `@v3.4` to automatically receive patch releases within that minor version. Dependabot (shown below) is the recommended way to stay up to date.
Then, your `.github/dependabot.yml` file could look like this:
```yaml
@@ -150,7 +147,7 @@ The second option, and the only one that supports other CI systems, is using a `
```bash
# requirements-cibw.txt
cibuildwheel==3.4.1
cibuildwheel==3.4.0
```
Then your install step would have `python -m pip install -r requirements-cibw.txt` in it. Your `.github/dependabot.yml` file could look like this:
@@ -315,7 +312,7 @@ Solutions to this vary, but the simplest is to use pipx:
# most runners have pipx preinstalled, but in case you don't
python3 -m pip install pipx
pipx run cibuildwheel==3.4.1 --output-dir wheelhouse
pipx run cibuildwheel==3.4.0 --output-dir wheelhouse
pipx run twine upload wheelhouse/*.whl
```
+1 -1
View File
@@ -8,7 +8,7 @@ import rich.console
import rich.text
def define_env(env: Any) -> None: # noqa: ANN401
def define_env(env: Any) -> None:
"Hook function for mkdocs-macros"
@env.macro # type: ignore[untyped-decorator]
+21 -23
View File
@@ -8,17 +8,17 @@ title: Working examples
| Name | CI | OS | Notes |
|-----------------------------------|----|----|:------|
| [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. |
| [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. |
| [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][] ![pyodide icon][] | The fundamental package for scientific computing with Python. |
| [NumPy][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux 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][] ![pyodide icon][] | The venerable Matplotlib, a Python library with C++ portions |
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux 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. |
| [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 |
| [Triton][] | ![github icon][] | ![linux icon][] | Self hosted runners |
| [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][] ![pyodide 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][] | 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][] ![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. |
| [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. |
| [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. |
| [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) |
| [time-machine][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Time mocking library using only the CPython C API. |
| [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][] ![pyodide icon][] | Example pybind11 module built with a CMake-based build system |
| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux 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][] ![pyodide icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. |
| [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows 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][] ![pyodide icon][] | Example pybind11 module built with a Python-based build system |
| [pybind11 python_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux 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][] ![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. |
| [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. |
| [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. |
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
| [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython |
| [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. |
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python |
| [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][] ![pyodide icon][] | An example combining scikit-build and pybind11 |
| [pybind11 scikit_build_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux 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
[Triton]: https://github.com/openai/triton
[Kivy]: https://github.com/kivy/kivy
[Triton]: https://github.com/openai/triton
[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
[time-machine]: https://github.com/adamchainz/time-machine
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[time-machine]: https://github.com/adamchainz/time-machine
[mosec]: https://github.com/mosecorg/mosec
[Picologging]: https://github.com/microsoft/picologging
[markupsafe]: https://github.com/pallets/markupsafe
@@ -203,13 +203,13 @@ title: Working examples
[keyvi]: https://github.com/KeyviDev/keyvi
[PyGLM]: https://github.com/Zuzu-Typ/PyGLM
[iDynTree]: https://github.com/robotology/idyntree
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model
[TgCrypto]: https://github.com/pyrogram/tgcrypto
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
[pybase64]: https://github.com/mayeut/pybase64
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
[bx-python]: https://github.com/bxlab/bx-python
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
[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,12 +235,10 @@ 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 -->
+3 -3
View File
@@ -6,7 +6,7 @@ jobs:
- bash: |
set -o errexit
python3 -m pip install --upgrade pip
pip3 install cibuildwheel==3.4.1
pip3 install cibuildwheel==3.4.0
displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels
@@ -20,7 +20,7 @@ jobs:
- bash: |
set -o errexit
python3 -m pip install --upgrade pip
python3 -m pip install cibuildwheel==3.4.1
python3 -m pip install cibuildwheel==3.4.0
displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels
@@ -34,7 +34,7 @@ jobs:
- bash: |
set -o errexit
python -m pip install --upgrade pip
pip install cibuildwheel==3.4.1
pip install cibuildwheel==3.4.0
displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels
+3 -3
View File
@@ -11,7 +11,7 @@ jobs:
- run:
name: Build the Linux wheels.
command: |
python3 -m pip install --user cibuildwheel==3.4.1
python3 -m pip install --user cibuildwheel==3.4.0
cibuildwheel --output-dir wheelhouse
- store_artifacts:
path: wheelhouse/
@@ -28,7 +28,7 @@ jobs:
- run:
name: Build the Linux aarch64 wheels.
command: |
python3 -m pip install --user cibuildwheel==3.4.1
python3 -m pip install --user cibuildwheel==3.4.0
python3 -m cibuildwheel --output-dir wheelhouse
- store_artifacts:
path: wheelhouse/
@@ -44,7 +44,7 @@ jobs:
name: Build the OS X wheels.
command: |
sudo softwareupdate --install-rosetta --agree-to-license # for python<=3.8 or x86_64/universal2 tests
pip3 install cibuildwheel==3.4.1
pip3 install cibuildwheel==3.4.0
cibuildwheel --output-dir wheelhouse
- store_artifacts:
path: wheelhouse/
+21
View File
@@ -0,0 +1,21 @@
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
install_cibuildwheel_script:
- python -m pip install cibuildwheel==3.4.0
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
@@ -0,0 +1,74 @@
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
install_cibuildwheel_script:
- python -m pip install cibuildwheel==3.4.0
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 -1
View File
@@ -53,7 +53,7 @@ jobs:
persist-credentials: false
- name: Build wheels
uses: pypa/cibuildwheel@v3.4.1
uses: pypa/cibuildwheel@v3.4.0
env:
CIBW_PLATFORM: ${{ matrix.platform || 'auto' }}
CIBW_ARCHS: ${{ matrix.archs || 'auto' }}
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
persist-credentials: false
- name: Build wheels
uses: pypa/cibuildwheel@v3.4.1
uses: pypa/cibuildwheel@v3.4.0
# env:
# CIBW_SOME_OPTION: value
# ...
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
persist-credentials: false
- name: Build wheels
run: pipx run cibuildwheel==3.4.1
run: pipx run cibuildwheel==3.4.0
- uses: actions/upload-artifact@v4
with:
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
platforms: all
- name: Build wheels
uses: pypa/cibuildwheel@v3.4.1
uses: pypa/cibuildwheel@v3.4.0
env:
# configure cibuildwheel on Linux to build native archs ('auto'),
# and to split the remaining architectures between the x86_64 and
+3 -3
View File
@@ -12,7 +12,7 @@ linux:
DOCKER_TLS_CERTDIR: ""
script:
- curl -sSL https://get.docker.com/ | sh
- python -m pip install cibuildwheel==3.4.1
- python -m pip install cibuildwheel==3.4.0
- cibuildwheel --output-dir wheelhouse
artifacts:
paths:
@@ -23,7 +23,7 @@ windows:
before_script:
- choco install python -y --allow-downgrade --version 3.12.4
- choco install git.install -y
- py -m pip install cibuildwheel==3.4.1
- py -m pip install cibuildwheel==3.4.0
script:
- py -m cibuildwheel --output-dir wheelhouse --platform windows
artifacts:
@@ -35,7 +35,7 @@ windows:
macos:
image: macos-14-xcode-15
before_script:
- python3 -m pip install cibuildwheel==3.4.1
- python3 -m pip install cibuildwheel==3.4.0
script:
- python3 -m cibuildwheel --output-dir wheelhouse
artifacts:
+1 -1
View File
@@ -14,7 +14,7 @@ linux:
- curl -sSL https://get.docker.com/ | sh
# Warning: This is extremely slow, be careful with how many wheels you build
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- python -m pip install cibuildwheel==3.4.1
- python -m pip install cibuildwheel==3.4.0
# Assuming your CI runner's default architecture is x86_64...
- cibuildwheel --output-dir wheelhouse --platform linux --archs aarch64
artifacts:
-1
View File
@@ -34,7 +34,6 @@ nav:
- About:
- contributing.md
- changelog.md
- Source repository: https://github.com/pypa/cibuildwheel
markdown_extensions:
- md_in_html
+12 -15
View File
@@ -69,10 +69,12 @@ 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.9")
session.install("uv>=0.1.23")
# CUSTOM_COMPILE_COMMAND is a pip-compile option that tells users how to
# regenerate the constraints files
@@ -106,7 +108,8 @@ def update_constraints(session: nox.Session) -> None:
tmp_file = Path(session.create_tmp()) / "constraints-pyodide.in"
session.install_and_run_script(
session.run(
"python",
"bin/generate_pyodide_constraints.py",
"--output-file",
tmp_file,
@@ -132,11 +135,13 @@ def update_pins(session: nox.Session) -> None:
Update the python, docker, virtualenv, node, and python-build-standalone
version pins inplace.
"""
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")
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")
@nox.session(default=False, reuse_venv=True, tags=["update"])
@@ -179,14 +184,6 @@ 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:
"""
+23 -11
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "cibuildwheel"
version = "3.4.1"
version = "3.4.0"
description = "Build Python wheels on CI with minimal configuration."
readme = "README.md"
license = "BSD-2-Clause"
@@ -66,6 +66,15 @@ 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",
@@ -88,6 +97,7 @@ test = [
"xdoctest",
]
dev = [
{include-group = "bin"},
{include-group = "docs"},
{include-group = "test"},
]
@@ -118,16 +128,24 @@ files = [
"noxfile.py",
]
warn_unused_configs = true
strict = true
disallow_untyped_defs = false
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
warn_unreachable = false
[[tool.mypy.overrides]]
module = "cibuildwheel.*"
disallow_untyped_defs = true
[[tool.mypy.overrides]]
module = [
"setuptools._distutils", # needed even if only directly import setuptools._distutils.util
"setuptools._distutils.util",
"bashlex",
"bashlex.*",
"importlib_resources",
]
ignore_missing_imports = true
@@ -172,7 +190,6 @@ messages_control.disable = [
]
[tool.ruff]
show-fixes = true
line-length = 100
[tool.ruff.lint]
@@ -180,7 +197,6 @@ extend-select = [
"B", # flake8-bugbear
"I", # isort
"ARG", # flake8-unused-arguments
"ANN", # flake8-annotations
"C4", # flake8-comprehensions
"EM", # flake8-errmsg
"ICN", # flake8-import-conventions
@@ -195,7 +211,6 @@ extend-select = [
"RUF", # Ruff-specific
"SIM", # flake8-simplify
"TID251", # flake8-tidy-imports.banned-api
"TID252", # flake8-tidy-imports.relative-imports
"UP", # pyupgrade
"YTT", # flake8-2020
"EXE", # flake8-executable
@@ -212,17 +227,15 @@ extend-select = [
"TC", # flake8-type-checking
]
ignore = [
"PLR09", # Design related pylint codes
"PLR2004", # Magic value in comparison
"PLR", # Design related pylint codes
"RET504", "RET505", "RET508", # else after control flow
"PT007", # Lists of tuples in Pytest
"PYI025", # Set as AbstractSet
"ISC001", # Conflicts with formatter
"EXE003", # Ruff doesn't like uv?
"PTH123", # open -> Path.open
]
flake8-unused-arguments.ignore-variadic-names = true
flake8-tidy-imports.ban-relative-imports = "all"
flake8-annotations.allow-star-arg-any = true
flake8-annotations.mypy-init-return = true
[tool.ruff.lint.flake8-tidy-imports.banned-api]
"typing.Mapping".msg = "Use collections.abc.Mapping instead."
@@ -232,8 +245,7 @@ flake8-annotations.mypy-init-return = true
"typing.Set".msg = "Use collections.abc.Set instead."
[tool.ruff.lint.per-file-ignores]
"unit_test/*" = ["PLC1901", "TID252"]
"test/*" = ["TID252"]
"unit_test/*" = ["PLC1901"]
"bin/*" = ["TID251"]
"cibuildwheel/resources/install_certifi.py" = ["PTH"]

Some files were not shown because too many files have changed in this diff Show More