Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
355c5a46b2 | ||
|
|
bc79c16a71 |
+91
@@ -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
|
||||
@@ -9,5 +9,3 @@ updates:
|
||||
actions:
|
||||
patterns:
|
||||
- "*"
|
||||
cooldown:
|
||||
default-days: 7
|
||||
|
||||
@@ -7,17 +7,13 @@ on:
|
||||
types:
|
||||
- published
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
dist:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- uses: hynek/build-and-inspect-python-package@fe0a0fb1925ca263d076ca4f2c13e93a6e92a33e # v2.17.0
|
||||
- uses: hynek/build-and-inspect-python-package@v2
|
||||
|
||||
publish:
|
||||
needs: [dist]
|
||||
@@ -31,16 +27,16 @@ jobs:
|
||||
attestations: write
|
||||
|
||||
steps:
|
||||
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: Packages
|
||||
path: dist
|
||||
|
||||
- name: Generate artifact attestation for sdist and wheel
|
||||
uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
|
||||
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
|
||||
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
|
||||
|
||||
+38
-114
@@ -28,8 +28,6 @@ on:
|
||||
workflow_dispatch:
|
||||
# allow manual runs on branches without a PR
|
||||
|
||||
permissions: {}
|
||||
|
||||
concurrency:
|
||||
group: test-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
@@ -39,42 +37,18 @@ jobs:
|
||||
name: Linters (mypy, ruff, etc.)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/checkout@v6
|
||||
- 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: pre-commit/action@v3.0.1
|
||||
- name: PyLint checks
|
||||
run: uvx 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
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
name: Install Python
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
- name: Install dependencies
|
||||
run: uv sync --no-dev --group test
|
||||
- name: Generate a sample project
|
||||
run: uv run --no-sync -m test.test_projects test.test_0_basic.basic_project sample_proj
|
||||
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
run: pipx run --python "${{ steps.python.outputs.python-path }}" nox -s pylint -- --output-format=github
|
||||
|
||||
test:
|
||||
name: Test on ${{ matrix.os }} (${{ matrix.python_version }}) ${{ matrix.test_select }}
|
||||
needs: sample
|
||||
needs: lint
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -87,7 +61,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 +91,14 @@ jobs:
|
||||
test_select: android
|
||||
timeout-minutes: 180
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/checkout@v6
|
||||
- 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 +111,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@v3
|
||||
|
||||
- name: Set up Xcode
|
||||
if: ${{ startsWith(matrix.os, 'macos-15') }}
|
||||
@@ -148,14 +120,15 @@ jobs:
|
||||
sudo xcode-select --switch /Applications/Xcode_16.4.app
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --no-dev --group test
|
||||
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
|
||||
@@ -171,11 +144,9 @@ jobs:
|
||||
fi
|
||||
echo "CIBW_ENABLE=${CIBW_ENABLE}" >> $GITHUB_ENV
|
||||
|
||||
- name: Download a sample project
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
- name: Generate a sample project
|
||||
run: |
|
||||
uv run --no-sync -m test.test_projects test.test_0_basic.basic_project sample_proj
|
||||
|
||||
- name: Run a sample build (GitHub Action)
|
||||
uses: ./
|
||||
@@ -230,7 +201,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@v6
|
||||
with:
|
||||
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
|
||||
path: wheelhouse/*.whl
|
||||
@@ -238,7 +209,8 @@ jobs:
|
||||
- name: Test cibuildwheel
|
||||
env:
|
||||
CIBW_TEST_RUNTIME: ${{ matrix.test_runtime }}
|
||||
run: uv run --no-sync bin/run_tests.py --test-select=${{ matrix.test_select || 'native' }} ${{ (runner.os == 'Linux' && runner.arch == 'X64') && '--run-podman' || '' }}
|
||||
run: |
|
||||
uv run --no-sync bin/run_tests.py --test-select=${{ matrix.test_select || 'native' }} ${{ (runner.os == 'Linux' && runner.arch == 'X64') && '--run-podman' || '' }}
|
||||
|
||||
emulated-archs:
|
||||
name: Get qemu emulated architectures
|
||||
@@ -247,13 +219,11 @@ jobs:
|
||||
outputs:
|
||||
archs: ${{ steps.archs.outputs.archs }}
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/checkout@v6
|
||||
- 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,47 +242,39 @@ jobs:
|
||||
matrix:
|
||||
arch: ${{ fromJSON(needs.emulated-archs.outputs.archs) }}
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/checkout@v6
|
||||
- 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@v3
|
||||
|
||||
- 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
|
||||
needs: sample
|
||||
needs: lint
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 180
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/checkout@v6
|
||||
- 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
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
- name: Generate a sample project
|
||||
run: |
|
||||
uv run --no-sync -m test.test_projects test.test_0_basic.basic_project sample_proj
|
||||
|
||||
- name: Run a sample build (GitHub Action)
|
||||
uses: ./
|
||||
@@ -323,45 +285,7 @@ jobs:
|
||||
CIBW_PLATFORM: pyodide
|
||||
|
||||
- name: Run tests with 'CIBW_PLATFORM' set to 'pyodide'
|
||||
run: uv run --no-sync ./bin/run_tests.py
|
||||
run: |
|
||||
uv run --no-sync ./bin/run_tests.py
|
||||
env:
|
||||
CIBW_PLATFORM: pyodide
|
||||
|
||||
test-uv-extras:
|
||||
name: Test uv extra on ${{ matrix.os }} ${{ matrix.test_select }}
|
||||
needs: sample
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
test_select: android
|
||||
- os: windows-latest
|
||||
- os: windows-11-arm
|
||||
- os: macos-15-intel
|
||||
- os: macos-15
|
||||
- os: macos-15-intel
|
||||
test_select: android
|
||||
- os: macos-15
|
||||
test_select: android
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Download a sample project
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: sample_proj
|
||||
path: sample_proj
|
||||
- name: Run a sample build (GitHub Action)
|
||||
uses: ./
|
||||
with:
|
||||
extras: uv
|
||||
package-dir: sample_proj
|
||||
output-dir: wheelhouse
|
||||
env:
|
||||
CIBW_ARCHS_MACOS: x86_64 universal2 arm64
|
||||
CIBW_BUILD: cp314-*
|
||||
CIBW_BUILD_FRONTEND: 'build[uv]'
|
||||
CIBW_PLATFORM: ${{ matrix.test_select }}
|
||||
|
||||
@@ -14,45 +14,36 @@ on:
|
||||
schedule:
|
||||
- cron: '0 6 * * 1' # "At 06:00 on Monday."
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
update-dependencies:
|
||||
name: Update dependencies
|
||||
if: github.repository_owner == 'pypa' || github.event_name != 'schedule'
|
||||
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
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
python-version: "3.14"
|
||||
- uses: wntrblm/nox@2025.11.12
|
||||
|
||||
- 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'
|
||||
|
||||
@@ -21,12 +21,10 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- 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 }}
|
||||
|
||||
@@ -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
|
||||
@@ -112,10 +112,3 @@ site/
|
||||
|
||||
# PyCharm
|
||||
.idea/
|
||||
|
||||
# Lockfiles
|
||||
*.lock
|
||||
*.pylock
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
|
||||
+11
-13
@@ -1,9 +1,7 @@
|
||||
ci:
|
||||
autoupdate_schedule: monthly
|
||||
|
||||
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 +12,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.14.9
|
||||
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 +54,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 +75,7 @@ repos:
|
||||
additional_dependencies: [cogapp>=3.5]
|
||||
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
rev: 2ccb47ff45ad361a21071a7eedda4c37e6ae8c5a # frozen: v2.4.2
|
||||
rev: v2.4.1
|
||||
hooks:
|
||||
- id: codespell
|
||||
args: ["-w"]
|
||||
@@ -86,13 +83,14 @@ repos:
|
||||
|
||||
|
||||
- repo: https://github.com/python-jsonschema/check-jsonschema
|
||||
rev: ed81924a8b1cecdaa570b072528fa80c9c4d6ccd # frozen: 0.37.1
|
||||
rev: 0.36.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
|
||||
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
os: linux
|
||||
dist: jammy
|
||||
language: python
|
||||
|
||||
branches:
|
||||
only:
|
||||
- main
|
||||
|
||||
# only build the main branch or PR that explicitely want to test with Travis CI
|
||||
if: (type = "push") OR (commit_message =~ /travis-ci/)
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- name: Linux | x86_64 + i686 | Python 3.12
|
||||
python: 3.12
|
||||
services: docker
|
||||
env:
|
||||
- PYTHON=python
|
||||
# a build using CIBW_ENABLE=all does not fit into Travis' time limit,
|
||||
# so only the defaults are tested
|
||||
|
||||
- name: Linux | arm64 | Python 3.12
|
||||
python: 3.12
|
||||
services: docker
|
||||
arch: arm64
|
||||
env:
|
||||
- PYTHON=python
|
||||
- CIBW_ENABLE=all
|
||||
|
||||
- name: Linux | ppc64le | Python 3.12
|
||||
python: 3.12
|
||||
services: docker
|
||||
arch: ppc64le
|
||||
allow_failure: True
|
||||
env:
|
||||
- PYTHON=python
|
||||
# skip test_manylinuxXXXX_only, it uses too much disk space
|
||||
# c.f. https://travis-ci.community/t/running-out-of-disk-space-quota-when-using-docker-on-ppc64le/11634
|
||||
- PYTEST_ADDOPTS='-k "not test_manylinuxXXXX_only"'
|
||||
- CIBW_ENABLE=all
|
||||
|
||||
- name: Windows | x86_64 | Python 3.12
|
||||
os: windows
|
||||
language: shell
|
||||
before_install:
|
||||
# http://woshub.com/updating-trusted-root-certificates-in-windows-10
|
||||
- certutil -generateSSTFromWU roots.sst
|
||||
- powershell -Command 'Get-ChildItem -Path roots.sst | Import-Certificate -CertStoreLocation Cert:\LocalMachine\Root'
|
||||
- rm -f roots.sst
|
||||
- choco upgrade python3 -y --version 3.12.8 --limit-output --params "/InstallDir:C:\\Python312"
|
||||
env:
|
||||
- PYTHON=C:\\Python312\\python
|
||||
# a build using CIBW_ENABLE=all does not fit into Travis' time limit,
|
||||
# so only the defaults are tested
|
||||
|
||||
- name: Linux | s390x | Python 3.12
|
||||
python: 3.12
|
||||
services: docker
|
||||
arch: s390x
|
||||
allow_failure: True
|
||||
env:
|
||||
- PYTHON=python
|
||||
- CIBW_ENABLE=all
|
||||
|
||||
install:
|
||||
- if [ "${TRAVIS_OS_NAME}" == "linux" ]; then docker run --rm --privileged docker.io/tonistiigi/binfmt:latest --install all; fi
|
||||
- $PYTHON -m pip install -U pip
|
||||
- $PYTHON -m pip install -e. --group test
|
||||
|
||||
script: |
|
||||
# travis_wait disable the output while waiting
|
||||
# use the same kind of tricks as in multibuild
|
||||
(while true; do echo "travis_keep_alive"; sleep 300; done) &
|
||||
SPINNER_PID=$!
|
||||
disown
|
||||
result=0
|
||||
$PYTHON ./bin/run_tests.py --num-processes 2 || result=1
|
||||
kill -9 ${SPINNER_PID}
|
||||
test ${result} -eq 0
|
||||
@@ -1,9 +1,11 @@
|
||||
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 |
|
||||
|---------|----------------------------------|---------------------------------------------|----------------|
|
||||
| Linux | Azure Pipelines / GitHub Actions | CircleCI¹ / Cirrus CI / GitLab¹ / Travis CI | GitHub Actions |
|
||||
| macOS | Azure Pipelines | CircleCI¹ / Cirrus CI / GitLab¹ | GitHub Actions |
|
||||
| Windows | Azure Pipelines | Cirrus CI / GitLab¹ / Travis CI | GitHub Actions |
|
||||
|
||||
> ¹ Runs a reduced set of tests to reduce CI load
|
||||
|
||||
Non-x86 architectures are covered on Travis CI using Python 3.12.
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
Copyright 2017, Joe Rickerby and contributors. All rights reserved.
|
||||
This project is licensed under the 'BSD 2-clause license'.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
Copyright (c) 2017-2025, Joe Rickerby and contributors. All rights reserved.
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
@@ -4,6 +4,7 @@ cibuildwheel
|
||||
[](https://pypi.python.org/pypi/cibuildwheel)
|
||||
[](https://cibuildwheel.pypa.io/en/stable/?badge=stable)
|
||||
[](https://github.com/pypa/cibuildwheel/actions)
|
||||
[](https://travis-ci.com/github/pypa/cibuildwheel)
|
||||
[](https://circleci.com/gh/pypa/cibuildwheel)
|
||||
[](https://dev.azure.com/joerick0429/cibuildwheel/_build/latest?definitionId=4&branchName=main)
|
||||
|
||||
@@ -14,7 +15,7 @@ cibuildwheel
|
||||
|
||||
Python wheels are great. Building them across **Mac, Linux, Windows**, on **multiple versions of Python**, is not.
|
||||
|
||||
`cibuildwheel` is here to help. `cibuildwheel` runs on your CI server - currently it supports GitHub Actions, Azure Pipelines, CircleCI, and GitLab CI - and it builds and tests your wheels across all of your platforms.
|
||||
`cibuildwheel` is here to help. `cibuildwheel` runs on your CI server - currently it supports GitHub Actions, Azure Pipelines, Travis CI, CircleCI, and GitLab CI - and it builds and tests your wheels across all of your platforms.
|
||||
|
||||
|
||||
What does it do?
|
||||
@@ -22,30 +23,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, Travis CI, 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 +57,19 @@ 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 | ✅ | ✅ | ✅ | | ✅ | ✅² | ✅⁴ | ✅³ |
|
||||
| Travis CI | ✅ | | ✅ | ✅ | | | ✅⁴ | |
|
||||
| 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-->
|
||||
|
||||
@@ -91,15 +93,13 @@ jobs:
|
||||
os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm, macos-15-intel, macos-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
# Used to host cibuildwheel
|
||||
- uses: actions/setup-python@v6
|
||||
- uses: actions/setup-python@v5
|
||||
|
||||
- name: Install cibuildwheel
|
||||
run: python -m pip install cibuildwheel==3.4.1
|
||||
run: python -m pip install cibuildwheel==3.3.0
|
||||
|
||||
- name: Build wheels
|
||||
run: python -m cibuildwheel --output-dir wheelhouse
|
||||
@@ -108,7 +108,7 @@ jobs:
|
||||
# CIBW_SOME_OPTION: value
|
||||
# ...
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
|
||||
path: ./wheelhouse/*.whl
|
||||
@@ -126,11 +126,6 @@ The following diagram summarises the steps that cibuildwheel takes on each platf
|
||||
|
||||
<sup>Explore an interactive version of this diagram [in the docs](https://cibuildwheel.pypa.io/en/stable/#how-it-works).</sup>
|
||||
|
||||
> [!WARNING]
|
||||
> Building and testing wheels executes arbitrary code from your project and its dependencies. Although cibuildwheel uses OCI containers and Pyodide for some builds, these provide no security guarantees - the code you're building and testing has full access to the environment that's invoking cibuildwheel.
|
||||
>
|
||||
> If you cannot trust all the code that's pulled in, maintain good security hygiene: keep the job that builds distributions separate from the job that uploads them to PyPI, handle secrets and credentials with care and rotate them regularly, and follow the principle of least privilege when granting permissions. Do not store sensitive data on CI runners.
|
||||
|
||||
|
||||
<!--[[[cog from readme_options_table import get_table; print(get_table()) ]]]-->
|
||||
|
||||
@@ -185,39 +180,37 @@ 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 |
|
||||
| [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. |
|
||||
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The venerable Matplotlib, a Python library with C++ portions |
|
||||
| [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
|
||||
[pytorch-fairseq]: https://github.com/facebookresearch/fairseq
|
||||
[NumPy]: https://github.com/numpy/numpy
|
||||
[NCNN]: https://github.com/Tencent/ncnn
|
||||
[Matplotlib]: https://github.com/matplotlib/matplotlib
|
||||
[Tornado]: https://github.com/tornadoweb/tornado
|
||||
[Matplotlib]: https://github.com/matplotlib/matplotlib
|
||||
[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,34 +230,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_
|
||||
|
||||
- 🌟 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)
|
||||
|
||||
### v3.3.1
|
||||
|
||||
_5 January 2026_
|
||||
|
||||
- 🛠 Update dependencies and container pins, including updating to CPython 3.14.2. (#2708)
|
||||
|
||||
### v3.3.0
|
||||
|
||||
_12 November 2025_
|
||||
@@ -287,7 +252,45 @@ _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)
|
||||
|
||||
### v3.1.4
|
||||
|
||||
_19 August 2025_
|
||||
|
||||
- ✨ Add a `--clean-cache` command to clean up our cache (#2489)
|
||||
- 🛠 Update Python to 3.14rc2 and other patch version bumps (#2542, #2556)
|
||||
- 🛠 Update Pyodide to 0.28.2 (#2562, #2558)
|
||||
- 🐛 Fix resolution with `pyodide-build` when `dependency-versions` is set (#2548)
|
||||
- 🐛 Set `CMAKE_FIND_ROOT_PATH_MODE_PACKAGE` to `BOTH` on Android (#2547)
|
||||
- 🐛 Add `patchelf` dependency for platforms that can build Android wheels (#2552)
|
||||
- 🐛 Ignore empty values for `CIBW_ARCHS` like most other environment variables (#2541)
|
||||
- 💼 The `color` and `suggest_on_error` argparse options are now default in 3.14rc1+ (#2554)
|
||||
- 💼 Use the virtualenv release URL instead of blob URL (should be more robust) (#2555)
|
||||
- 🧪 For iOS, lowering to macos-14 is needed for now due to issues with GitHub's runner images (#2557)
|
||||
- 🧪 Split out platforms iOS and Android in our tests (#2519)
|
||||
- 🧪 Fix and enable doctests (#2546)
|
||||
- 📚 Improve our docs on free-threading (#2549)
|
||||
|
||||
|
||||
### v3.1.3
|
||||
|
||||
_1 August 2025_
|
||||
|
||||
- 🐛 Fix bug where "latest" dependencies couldn't update to pip 25.2 on Windows (#2537)
|
||||
- 🧪 Use pytest-rerunfailures to improve some of our iOS/Android tests (#2527, #2539)
|
||||
- 🧪 Remove some GraalPy Windows workarounds in our tests (#2501)
|
||||
|
||||
<!-- [[[end]]] (sum: vS54piNR4b) -->
|
||||
|
||||
---
|
||||
|
||||
@@ -314,11 +317,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)
|
||||
|
||||
+28
-64
@@ -28,18 +28,17 @@ branding:
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
- uses: actions/setup-python@v6
|
||||
id: python
|
||||
with:
|
||||
python-version: "3.11 - 3.14"
|
||||
python-version: "3.11 - 3.13"
|
||||
update-environment: false
|
||||
|
||||
- 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,88 +59,53 @@ 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)
|
||||
|
||||
builder = EnvBuilder()
|
||||
builder.create(venv_path)
|
||||
exposed_binaries = {"cibuildwheel"}
|
||||
|
||||
if "uv" in EXTRAS:
|
||||
exposed_binaries.add("uv")
|
||||
clean_bin_path = builder.bin_path.parent / f"{builder.bin_path.name}.clean"
|
||||
clean_bin_path.mkdir()
|
||||
|
||||
for path in list(builder.bin_path.iterdir()):
|
||||
if path.stem in exposed_binaries:
|
||||
try:
|
||||
os.symlink(path, clean_bin_path / path.name)
|
||||
except OSError:
|
||||
shutil.copy2(path, clean_bin_path / path.name)
|
||||
|
||||
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"prepend-path={clean_bin_path}\n")
|
||||
f.write(f"cmd-bash={cmd_bash}\n")
|
||||
f.write(f"cmd-pwsh={cmd_pwsh}\n")
|
||||
f.write(f"cibw-bin={cibw_bin}\n")
|
||||
f.write(f"prepend-path={builder.bin_path if 'uv' in EXTRAS else ''}\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
|
||||
prepend_path="${{ steps.cibw.outputs.prepend-path }}"
|
||||
if [ -n "$prepend_path" ]; then
|
||||
export PATH="$prepend_path:$PATH"
|
||||
fi
|
||||
"${{ 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
|
||||
$PrependPath = "${{ steps.cibw.outputs.prepend-path }}"
|
||||
if ($PrependPath) {
|
||||
$env:PATH = "$PrependPath;$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 }}
|
||||
|
||||
+4
-4
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# /// script
|
||||
# dependencies = ["click", "packaging", "prek"]
|
||||
# dependencies = ["click", "packaging"]
|
||||
# ///
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ def bump_version() -> None:
|
||||
# run pre-commit to update the README changelog
|
||||
subprocess.run(
|
||||
[
|
||||
"prek",
|
||||
"pre-commit",
|
||||
"run",
|
||||
"--files=docs/changelog.md",
|
||||
],
|
||||
@@ -149,7 +149,7 @@ def bump_version() -> None:
|
||||
# run pre-commit to check that no errors occurred on the second run
|
||||
subprocess.run(
|
||||
[
|
||||
"prek",
|
||||
"pre-commit",
|
||||
"run",
|
||||
"--files=docs/changelog.md",
|
||||
],
|
||||
|
||||
@@ -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,4 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
#!/usr/bin/env -S uv run -q
|
||||
|
||||
# /// script
|
||||
# dependencies = ["pyyaml"]
|
||||
@@ -28,6 +28,7 @@ $defs:
|
||||
description: How to inherit the parent's value.
|
||||
enable:
|
||||
enum:
|
||||
- cpython-experimental-riscv64
|
||||
- cpython-freethreading
|
||||
- cpython-prerelease
|
||||
- graalpy
|
||||
@@ -57,23 +58,21 @@ properties:
|
||||
type: string_array
|
||||
build-frontend:
|
||||
default: default
|
||||
description: Set the tool to use to build, either "build" (default), "build[uv]", "uv", or "pip"
|
||||
description: Set the tool to use to build, either "build" (default), "build[uv]", or "pip"
|
||||
oneOf:
|
||||
- enum: [pip, build, "build[uv]", uv, default]
|
||||
- enum: [pip, build, "build[uv]", default]
|
||||
- type: string
|
||||
pattern: '^pip; ?args:'
|
||||
- type: string
|
||||
pattern: '^build; ?args:'
|
||||
- type: string
|
||||
pattern: '^build\\[uv\\]; ?args:'
|
||||
- type: string
|
||||
pattern: '^uv; ?args:'
|
||||
- type: object
|
||||
additionalProperties: false
|
||||
required: [name]
|
||||
properties:
|
||||
name:
|
||||
enum: [pip, build, "build[uv]", uv]
|
||||
enum: [pip, build, "build[uv]"]
|
||||
args:
|
||||
type: array
|
||||
items:
|
||||
|
||||
@@ -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,10 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "click",
|
||||
# ]
|
||||
# ///
|
||||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
import os
|
||||
|
||||
+6
-14
@@ -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,4 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import dataclasses
|
||||
import re
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "click",
|
||||
# ]
|
||||
# ///
|
||||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
import os
|
||||
@@ -22,8 +16,6 @@ import click
|
||||
|
||||
DIR = Path(__file__).parent.parent.resolve()
|
||||
|
||||
BuildBackend = typing.Literal["setuptools", "meson"]
|
||||
|
||||
|
||||
def shell(cmd: str, *, check: bool, **kwargs: object) -> subprocess.CompletedProcess[str]:
|
||||
return subprocess.run([cmd], shell=True, check=check, **kwargs) # type: ignore[call-overload, no-any-return]
|
||||
@@ -35,17 +27,11 @@ def git_repo_has_changes() -> bool:
|
||||
return unstaged_changes or staged_changes
|
||||
|
||||
|
||||
def generate_project(path: Path, build_backend: BuildBackend) -> None:
|
||||
def generate_basic_project(path: Path) -> None:
|
||||
sys.path.insert(0, "")
|
||||
match build_backend:
|
||||
case "meson":
|
||||
from test.test_projects.meson import new_meson_project as new_project # noqa: PLC0415
|
||||
case "setuptools":
|
||||
from test.test_projects.setuptools import new_c_project as new_project # noqa: PLC0415
|
||||
case _:
|
||||
typing.assert_never(build_backend)
|
||||
from test.test_projects.c import new_c_project # noqa: PLC0415
|
||||
|
||||
project = new_project()
|
||||
project = new_c_project()
|
||||
project.generate(path)
|
||||
|
||||
|
||||
@@ -53,10 +39,10 @@ class CIService(typing.NamedTuple):
|
||||
name: str
|
||||
dst_config_path: str
|
||||
badge_md: str
|
||||
config_file_transform: typing.Callable[[str, str], str] = lambda x, _: x # identity by default
|
||||
config_file_transform: typing.Callable[[str], str] = lambda x: x # identity by default
|
||||
|
||||
|
||||
def github_config_file_transform(content: str, git_ref: str) -> str:
|
||||
def github_config_file_transform(content: str) -> str:
|
||||
# one of the the github configs only builds on main, so we need to remove that restriction
|
||||
# so our example build will run on the test branch.
|
||||
#
|
||||
@@ -75,22 +61,6 @@ def github_config_file_transform(content: str, git_ref: str) -> str:
|
||||
"push:",
|
||||
content,
|
||||
)
|
||||
|
||||
# use the version of cibuildwheel from the current commit, not the latest
|
||||
# release
|
||||
# replace:
|
||||
# """
|
||||
# uses: pypa/cibuildwheel@v3.3.1
|
||||
# """
|
||||
# with:
|
||||
# """
|
||||
# uses: pypa/cibuildwheel@<latest commit hash>
|
||||
# """
|
||||
content = re.sub(
|
||||
r"uses: pypa/cibuildwheel@v.*",
|
||||
f"uses: pypa/cibuildwheel@{git_ref}",
|
||||
content,
|
||||
)
|
||||
return content
|
||||
|
||||
|
||||
@@ -121,6 +91,11 @@ services = [
|
||||
dst_config_path=".gitlab-ci.yml",
|
||||
badge_md="[](https://gitlab.com/joerick/cibuildwheel/-/commits/{branch})",
|
||||
),
|
||||
CIService(
|
||||
name="cirrus-ci",
|
||||
dst_config_path=".cirrus.yml",
|
||||
badge_md="[](https://cirrus-ci.com/github/pypa/cibuildwheel/{branch})",
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@@ -135,23 +110,20 @@ def ci_service_for_config_file(config_file: Path) -> CIService:
|
||||
|
||||
@click.command()
|
||||
@click.argument("config_files", nargs=-1, type=click.Path())
|
||||
@click.option("--build-backend", type=click.Choice(["setuptools", "meson"]), default="setuptools")
|
||||
def run_example_ci_configs(
|
||||
config_files: list[str], build_backend: BuildBackend = "setuptools"
|
||||
) -> None:
|
||||
def run_example_ci_configs(config_files=None):
|
||||
"""
|
||||
Test the example configs. If no files are specified, will test
|
||||
examples/*-minimal.yml
|
||||
"""
|
||||
|
||||
if len(config_files) == 0:
|
||||
config_file_paths = list(Path("examples").glob("*-minimal.yml"))
|
||||
config_files = Path("examples").glob("*-minimal.yml")
|
||||
else:
|
||||
config_file_paths = [Path(f) for f in config_files]
|
||||
config_files = [Path(f) for f in config_files]
|
||||
|
||||
# check each CI service has at most 1 config file
|
||||
configs_by_service = set()
|
||||
for config_file in config_file_paths:
|
||||
for config_file in config_files:
|
||||
service = ci_service_for_config_file(config_file)
|
||||
if service.name in configs_by_service:
|
||||
msg = "You cannot specify more than one config per CI service"
|
||||
@@ -165,9 +137,6 @@ def run_example_ci_configs(
|
||||
previous_branch = shell(
|
||||
"git rev-parse --abbrev-ref HEAD", check=True, capture_output=True, encoding="utf8"
|
||||
).stdout.strip()
|
||||
git_ref = shell(
|
||||
"git rev-parse HEAD", check=True, capture_output=True, encoding="utf8"
|
||||
).stdout.strip()
|
||||
|
||||
timestamp = time.strftime("%Y-%m-%dT%H-%M-%S", time.gmtime())
|
||||
branch_name = f"example-config-test---{previous_branch}-{timestamp}"
|
||||
@@ -176,16 +145,16 @@ def run_example_ci_configs(
|
||||
shell(f"git checkout --orphan {branch_name}", check=True)
|
||||
|
||||
example_project = Path("example_root")
|
||||
generate_project(example_project, build_backend=build_backend)
|
||||
generate_basic_project(example_project)
|
||||
|
||||
for config_file in config_file_paths:
|
||||
for config_file in config_files:
|
||||
service = ci_service_for_config_file(config_file)
|
||||
dst_config_file = example_project / service.dst_config_path
|
||||
|
||||
dst_config_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
contents = config_file.read_text(encoding="utf8")
|
||||
contents = service.config_file_transform(contents, git_ref)
|
||||
contents = service.config_file_transform(contents)
|
||||
dst_config_file.write_text(contents, encoding="utf8")
|
||||
|
||||
subprocess.run(["git", "add", example_project], check=True)
|
||||
@@ -209,14 +178,14 @@ def run_example_ci_configs(
|
||||
print("> ")
|
||||
print("> | Service | Config | Status |")
|
||||
print("> |---|---|---|")
|
||||
for config_file in config_file_paths:
|
||||
for config_file in config_files:
|
||||
service = ci_service_for_config_file(config_file)
|
||||
badge = service.badge_md.format(
|
||||
branch=branch_name, branch_escaped=quote(branch_name, safe="")
|
||||
)
|
||||
print(f"> | {service.name} | `{config_file}` | {badge} |")
|
||||
print("> ")
|
||||
print(f"> Generated by `{' '.join(sys.argv)}`")
|
||||
print("> Generated by `bin/run_example_ci_config.py`")
|
||||
print()
|
||||
print("---")
|
||||
finally:
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
import argparse
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
import argparse
|
||||
|
||||
@@ -1,11 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "packaging",
|
||||
# "requests",
|
||||
# ]
|
||||
# ///
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import configparser
|
||||
import dataclasses
|
||||
|
||||
@@ -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
@@ -1,13 +1,4 @@
|
||||
#!/usr/bin/env -S uv run --script
|
||||
|
||||
# /// script
|
||||
# dependencies = [
|
||||
# "click",
|
||||
# "packaging",
|
||||
# "requests",
|
||||
# "rich",
|
||||
# ]
|
||||
# ///
|
||||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
import dataclasses
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+22
-37
@@ -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
|
||||
@@ -130,7 +117,7 @@ class GraalPyVersions:
|
||||
|
||||
self.releases = [r for r in releases if "graalpy_version" in r and "python_version" in r]
|
||||
|
||||
def update_version(self, identifier: str, spec: Specifier) -> ConfigUrl | None:
|
||||
def update_version(self, identifier: str, spec: Specifier) -> ConfigUrl:
|
||||
if "x86_64" in identifier or "amd64" in identifier:
|
||||
arch = "x86_64"
|
||||
elif "arm64" in identifier or "aarch64" in identifier:
|
||||
@@ -139,14 +126,14 @@ class GraalPyVersions:
|
||||
msg = f"{identifier} not supported yet on GraalPy"
|
||||
raise RuntimeError(msg)
|
||||
|
||||
gpspec_str = identifier.split("-", maxsplit=1)[0].split("_")[1]
|
||||
gpspec_str = identifier.split("-")[0].split("_")[1]
|
||||
if "." not in gpspec_str and len(gpspec_str) == 3:
|
||||
gpspec_str = gpspec_str[:2] + "." + gpspec_str[-1]
|
||||
gpspec = Specifier(f"=={gpspec_str}.*")
|
||||
|
||||
releases_tmp = (r for r in self.releases if spec.contains(r["python_version"]))
|
||||
releases_tmp = (r for r in releases_tmp if gpspec.contains(r["graalpy_version"]))
|
||||
releases = sorted(releases_tmp, key=lambda r: r["graalpy_version"])
|
||||
releases = [r for r in self.releases if spec.contains(r["python_version"])]
|
||||
releases = [r for r in self.releases if gpspec.contains(r["graalpy_version"])]
|
||||
releases = sorted(releases, key=lambda r: r["graalpy_version"])
|
||||
|
||||
if not releases:
|
||||
msg = f"GraalPy {arch} not found for {spec}!"
|
||||
@@ -168,20 +155,18 @@ class GraalPyVersions:
|
||||
|
||||
arch = "amd64" if arch == "x86_64" else "aarch64"
|
||||
ext = "zip" if "win" in identifier else "tar.gz"
|
||||
urls = [
|
||||
(url,) = (
|
||||
rf["browser_download_url"]
|
||||
for rf in release["assets"]
|
||||
if rf["name"].endswith(f"{platform}-{arch}.{ext}")
|
||||
and rf["name"].startswith(f"graalpy-{gpversion.major}")
|
||||
]
|
||||
if urls:
|
||||
(url,) = urls
|
||||
return ConfigUrl(
|
||||
identifier=identifier,
|
||||
version=f"{version.major}.{version.minor}",
|
||||
url=url,
|
||||
)
|
||||
return None
|
||||
)
|
||||
|
||||
return ConfigUrl(
|
||||
identifier=identifier,
|
||||
version=f"{version.major}.{version.minor}",
|
||||
url=url,
|
||||
)
|
||||
|
||||
|
||||
class PyPyVersions:
|
||||
@@ -279,11 +264,9 @@ class CPythonVersions:
|
||||
|
||||
# Removing the prefix
|
||||
version = Version(release["name"].removeprefix("Python "))
|
||||
self.versions_dict[version] = release["resource_uri"]
|
||||
|
||||
files_response = requests.get("https://www.python.org/api/v2/downloads/release_file/")
|
||||
files_response.raise_for_status()
|
||||
self.files_info = files_response.json()
|
||||
uri = int(release["resource_uri"].rstrip("/").split("/")[-1])
|
||||
self.versions_dict[version] = uri
|
||||
|
||||
def update_version(self, identifier: str, spec: Specifier, file_ident: str) -> ConfigUrl | None:
|
||||
# see note above on Specifier.filter
|
||||
@@ -293,9 +276,13 @@ class CPythonVersions:
|
||||
for new_version in sorted_versions:
|
||||
# Find the first patch version that contains the requested file
|
||||
uri = self.versions_dict[new_version]
|
||||
files = [rf for rf in self.files_info if rf["release"] == uri]
|
||||
response = requests.get(
|
||||
f"https://www.python.org/api/v2/downloads/release_file/?release={uri}"
|
||||
)
|
||||
response.raise_for_status()
|
||||
file_info = response.json()
|
||||
|
||||
urls = [rf["url"] for rf in files if file_ident in rf["url"]]
|
||||
urls = [rf["url"] for rf in file_info if file_ident in rf["url"]]
|
||||
if urls:
|
||||
return ConfigUrl(
|
||||
identifier=identifier,
|
||||
@@ -462,8 +449,6 @@ class AllVersions:
|
||||
elif "macosx_arm64" in identifier:
|
||||
config_update = self.macos_pypy_arm64.update_version_macos(spec)
|
||||
elif identifier.startswith("gp"):
|
||||
if "macosx_x86_64" in identifier:
|
||||
return
|
||||
config_update = self.graalpy.update_version(identifier, spec)
|
||||
elif "t-win32" in identifier and identifier.startswith("cp"):
|
||||
config_update = self.windows_t_32.update_version_windows(spec)
|
||||
|
||||
@@ -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 @@
|
||||
__version__ = "3.4.1"
|
||||
__version__ = "3.3.0"
|
||||
|
||||
+10
-15
@@ -1,7 +1,6 @@
|
||||
import argparse
|
||||
import contextlib
|
||||
import dataclasses
|
||||
import functools
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
@@ -15,6 +14,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 +52,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)
|
||||
|
||||
|
||||
@@ -78,13 +78,8 @@ def main_inner(global_options: GlobalOptions) -> None:
|
||||
`main_inner` is the same as `main`, but it raises FatalError exceptions
|
||||
rather than exiting directly.
|
||||
"""
|
||||
# Default in 3.15+, only needed on 3.14
|
||||
if sys.version_info >= (3, 14):
|
||||
arg_parser = functools.partial(argparse.ArgumentParser, suggest_on_error=True)
|
||||
else:
|
||||
arg_parser = argparse.ArgumentParser
|
||||
|
||||
parser = arg_parser(
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Build wheels for all the platforms.",
|
||||
epilog="""
|
||||
Most options are supplied via environment variables or in
|
||||
@@ -431,17 +426,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,9 +463,9 @@ 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:
|
||||
if EnableGroup.CPythonExperimentalRiscV64 in build_selector.enable:
|
||||
yield (
|
||||
"'cpython-freethreading' enable is deprecated and will be removed in a future version. "
|
||||
"'cpython-experimental-riscv64' 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."
|
||||
)
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
+11
-11
@@ -4,10 +4,10 @@ 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"]
|
||||
BuildFrontendName = Literal["pip", "build", "build[uv]"]
|
||||
|
||||
|
||||
@dataclasses.dataclass(frozen=True)
|
||||
@@ -36,13 +36,13 @@ class BuildFrontendConfig:
|
||||
return {"name": self.name, "args": repr(self.args)}
|
||||
|
||||
|
||||
def _get_verbosity_flags(level: int, frontend: BuildFrontendName, *, py38: bool) -> list[str]:
|
||||
def _get_verbosity_flags(level: int, frontend: BuildFrontendName) -> list[str]:
|
||||
if level < 0:
|
||||
if frontend.startswith("build") and py38:
|
||||
msg = f"build_verbosity {level} is not supported for {frontend} frontend. Ignoring."
|
||||
log.warning(msg)
|
||||
return []
|
||||
return ["-" + -level * "q"]
|
||||
if frontend == "pip":
|
||||
return ["-" + -level * "q"]
|
||||
|
||||
msg = f"build_verbosity {level} is not supported for {frontend} frontend. Ignoring."
|
||||
log.warning(msg)
|
||||
|
||||
if level > 0:
|
||||
if frontend == "pip":
|
||||
@@ -75,10 +75,10 @@ def parse_config_settings(config_settings_str: str) -> dict[str, str | list[str]
|
||||
|
||||
|
||||
def get_build_frontend_extra_flags(
|
||||
build_frontend: BuildFrontendConfig, verbosity_level: int, config_settings: str, *, py38: bool
|
||||
build_frontend: BuildFrontendConfig, verbosity_level: int, config_settings: str
|
||||
) -> list[str]:
|
||||
return [
|
||||
*_split_config_settings(config_settings),
|
||||
*build_frontend.args,
|
||||
*_get_verbosity_flags(verbosity_level, build_frontend.name, py38=py38),
|
||||
*_get_verbosity_flags(verbosity_level, build_frontend.name),
|
||||
]
|
||||
|
||||
@@ -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}", "")
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -7,7 +7,7 @@ import shlex
|
||||
import shutil
|
||||
import subprocess
|
||||
import sysconfig
|
||||
from collections.abc import Iterable, Iterator, MutableMapping
|
||||
from collections.abc import Iterable, Iterator
|
||||
from dataclasses import dataclass
|
||||
from os.path import relpath
|
||||
from pathlib import Path
|
||||
@@ -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, ensure_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
|
||||
|
||||
|
||||
@@ -197,12 +190,10 @@ def setup_env(
|
||||
"""
|
||||
log.step("Setting up build environment...")
|
||||
build_frontend = build_options.build_frontend.name
|
||||
use_uv = build_frontend in {"build[uv]", "uv"}
|
||||
uv_path = find_uv()
|
||||
if use_uv and uv_path is None:
|
||||
msg = "uv not found"
|
||||
raise AssertionError(msg)
|
||||
pip = ["pip"] if not use_uv else [str(uv_path), "pip"]
|
||||
use_uv = build_frontend == "build[uv]"
|
||||
if use_uv:
|
||||
ensure_uv()
|
||||
pip = ["pip"] if not use_uv else ["uv", "pip"]
|
||||
|
||||
# Create virtual environment
|
||||
python_exe = create_python_build_standalone_environment(
|
||||
@@ -229,17 +220,14 @@ 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)
|
||||
|
||||
# Install build tools
|
||||
if build_frontend not in {"build", "build[uv]", "uv"}:
|
||||
msg = "Android requires the build frontend to be 'build' or 'uv'"
|
||||
if build_frontend not in {"build", "build[uv]"}:
|
||||
msg = "Android requires the build frontend to be 'build'"
|
||||
raise errors.FatalError(msg)
|
||||
call(*pip, "install", "build", *constraint_flags(dependency_constraint), env=build_env)
|
||||
|
||||
@@ -360,7 +348,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(
|
||||
@@ -400,9 +388,6 @@ def setup_android_env(
|
||||
for key in ["CFLAGS", "CXXFLAGS"]:
|
||||
android_env[key] += " " + opt
|
||||
|
||||
# Cargo target linker needs to be specified after CC is set
|
||||
setup_rust(config, python_dir, android_env)
|
||||
|
||||
# Format the environment so it can be pasted into a shell when debugging.
|
||||
for key, value in sorted(android_env.items()):
|
||||
if os.environ.get(key) != value:
|
||||
@@ -411,34 +396,6 @@ def setup_android_env(
|
||||
return android_env
|
||||
|
||||
|
||||
def setup_rust(
|
||||
config: PythonConfiguration,
|
||||
python_dir: Path,
|
||||
env: MutableMapping[str, str],
|
||||
) -> None:
|
||||
cargo_target = android_triplet(config.identifier)
|
||||
|
||||
# CARGO_BUILD_TARGET is the variable used by Cargo and setuptools_rust
|
||||
env["CARGO_BUILD_TARGET"] = cargo_target
|
||||
|
||||
# The linker needs to be specified after CC is set by android-env.sh
|
||||
cargo_target_linker_env_name = f"CARGO_TARGET_{cargo_target.upper().replace('-', '_')}_LINKER"
|
||||
# CC has already been set by calling android.py (it calls android-env.sh)
|
||||
env[cargo_target_linker_env_name] = env["CC"]
|
||||
|
||||
# All Python extension modules must be explicitly linked against libpython3.x.so when building for Android.
|
||||
# See: https://peps.python.org/pep-0738/#linkage
|
||||
# For projects using PyO3, this requires setting PYO3_CROSS_LIB_DIR to the directory containing libpython3.x.so.
|
||||
# See: https://pyo3.rs/v0.27.1/building-and-distribution.html#cross-compiling
|
||||
env["PYO3_CROSS_LIB_DIR"] = str(python_dir / "prefix" / "lib")
|
||||
|
||||
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)
|
||||
shim_path.chmod(0o755)
|
||||
|
||||
|
||||
def before_build(state: BuildState) -> None:
|
||||
if state.options.before_build:
|
||||
log.step("Running before_build...")
|
||||
@@ -452,46 +409,22 @@ def before_build(state: BuildState) -> None:
|
||||
def build_wheel(state: BuildState) -> Path:
|
||||
log.step("Building wheel...")
|
||||
built_wheel_dir = state.build_path / "built_wheel"
|
||||
match state.options.build_frontend.name:
|
||||
case "build" | "build[uv]":
|
||||
call(
|
||||
"python",
|
||||
"-m",
|
||||
"build",
|
||||
state.options.package_dir,
|
||||
"--wheel",
|
||||
"--no-isolation",
|
||||
"--skip-dependency-check",
|
||||
f"--outdir={built_wheel_dir}",
|
||||
*get_build_frontend_extra_flags(
|
||||
state.options.build_frontend,
|
||||
state.options.build_verbosity,
|
||||
state.options.config_settings,
|
||||
py38=False,
|
||||
),
|
||||
env=state.android_env,
|
||||
)
|
||||
case "uv":
|
||||
uv_path = find_uv()
|
||||
assert uv_path is not None
|
||||
call(
|
||||
uv_path,
|
||||
"build",
|
||||
state.options.package_dir,
|
||||
"--wheel",
|
||||
"--no-build-isolation",
|
||||
f"--out-dir={built_wheel_dir}",
|
||||
*get_build_frontend_extra_flags(
|
||||
state.options.build_frontend,
|
||||
state.options.build_verbosity,
|
||||
state.options.config_settings,
|
||||
py38=False,
|
||||
),
|
||||
env=state.android_env,
|
||||
)
|
||||
case x:
|
||||
msg = f"Invalid build backend {x!r}"
|
||||
raise AssertionError(msg)
|
||||
call(
|
||||
"python",
|
||||
"-m",
|
||||
"build",
|
||||
state.options.package_dir,
|
||||
"--wheel",
|
||||
"--no-isolation",
|
||||
"--skip-dependency-check",
|
||||
f"--outdir={built_wheel_dir}",
|
||||
*get_build_frontend_extra_flags(
|
||||
state.options.build_frontend,
|
||||
state.options.build_verbosity,
|
||||
state.options.config_settings,
|
||||
),
|
||||
env=state.android_env,
|
||||
)
|
||||
|
||||
built_wheels = list(built_wheel_dir.glob("*.whl"))
|
||||
if len(built_wheels) != 1:
|
||||
@@ -642,12 +575,10 @@ def test_wheel(state: BuildState, wheel: Path, *, build_frontend: str) -> None:
|
||||
return
|
||||
|
||||
log.step("Testing wheel...")
|
||||
use_uv = build_frontend in {"build[uv]", "uv"}
|
||||
uv_path = find_uv()
|
||||
if use_uv and uv_path is None:
|
||||
msg = "uv not found"
|
||||
raise AssertionError(msg)
|
||||
pip = ["pip"] if not use_uv else [str(uv_path), "pip"]
|
||||
use_uv = build_frontend == "build[uv]"
|
||||
if use_uv:
|
||||
ensure_uv()
|
||||
pip = ["pip"] if not use_uv else ["uv", "pip"]
|
||||
|
||||
native_arch = arch_synonym(platform.machine(), platforms.native_platform(), "android")
|
||||
if state.config.arch != native_arch:
|
||||
@@ -699,7 +630,7 @@ def test_wheel(state: BuildState, wheel: Path, *, build_frontend: str) -> None:
|
||||
)
|
||||
|
||||
# Android doesn't support placeholders in the test command.
|
||||
if any(("{" + placeholder + "}") in test_command for placeholder in ("project", "package")):
|
||||
if any(("{" + placeholder + "}") in test_command for placeholder in ["project", "package"]):
|
||||
msg = (
|
||||
f"Test command {test_command!r} with a "
|
||||
"'{project}' or '{package}' placeholder is not supported on Android, "
|
||||
@@ -709,12 +640,12 @@ def test_wheel(state: BuildState, wheel: Path, *, build_frontend: str) -> None:
|
||||
|
||||
# Parse test-command.
|
||||
test_args = shlex.split(test_command)
|
||||
if test_args[0] in {"python", "python3"} and any(arg in test_args for arg in ("-c", "-m")):
|
||||
if test_args[0] in ["python", "python3"] and any(arg in test_args for arg in ["-c", "-m"]):
|
||||
# Forward the args to the CPython testbed script. We require '-c' or '-m'
|
||||
# to be in the command, because without those flags, the testbed script
|
||||
# will prepend '-m test', which will run Python's own test suite.
|
||||
del test_args[0]
|
||||
elif test_args[0] == "pytest":
|
||||
elif test_args[0] in ["pytest"]:
|
||||
# We transform some commands into the `python -m` form, but this is deprecated.
|
||||
msg = (
|
||||
f"Test command {test_command!r} is not supported on Android. "
|
||||
|
||||
@@ -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]":
|
||||
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]":
|
||||
msg = "uv doesn't support iOS"
|
||||
raise errors.FatalError(msg)
|
||||
|
||||
@@ -437,7 +450,6 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
identifier_tmp_dir = tmp_path / config.identifier
|
||||
identifier_tmp_dir.mkdir()
|
||||
built_wheel_dir = identifier_tmp_dir / "built_wheel"
|
||||
repaired_wheel_dir = identifier_tmp_dir / "repaired_wheel"
|
||||
|
||||
constraints_path = build_options.dependency_constraints.get_for_python_version(
|
||||
version=config.version, tmp_dir=identifier_tmp_dir
|
||||
@@ -475,10 +487,7 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
built_wheel_dir.mkdir()
|
||||
|
||||
extra_flags = get_build_frontend_extra_flags(
|
||||
build_frontend,
|
||||
build_options.build_verbosity,
|
||||
build_options.config_settings,
|
||||
py38=False,
|
||||
build_frontend, build_options.build_verbosity, build_options.config_settings
|
||||
)
|
||||
|
||||
match build_frontend.name:
|
||||
@@ -511,36 +520,11 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
case _:
|
||||
assert_never(build_frontend)
|
||||
|
||||
built_wheel = next(built_wheel_dir.glob("*.whl"))
|
||||
test_wheel = built_wheel = next(built_wheel_dir.glob("*.whl"))
|
||||
|
||||
if built_wheel.name.endswith("none-any.whl"):
|
||||
raise errors.NonPlatformWheelError()
|
||||
|
||||
repaired_wheel_dir.mkdir()
|
||||
if build_options.repair_command:
|
||||
log.step("Repairing wheel...")
|
||||
|
||||
repair_command_prepared = prepare_command(
|
||||
build_options.repair_command,
|
||||
wheel=built_wheel,
|
||||
dest_dir=repaired_wheel_dir,
|
||||
package=build_options.package_dir,
|
||||
project=".",
|
||||
)
|
||||
shell(repair_command_prepared, env=env)
|
||||
else:
|
||||
shutil.move(str(built_wheel), repaired_wheel_dir)
|
||||
|
||||
try:
|
||||
repaired_wheel = next(repaired_wheel_dir.glob("*.whl"))
|
||||
except StopIteration:
|
||||
raise errors.RepairStepProducedNoWheelError() from None
|
||||
|
||||
if repaired_wheel.name in {wheel.name for wheel in built_wheels}:
|
||||
raise errors.AlreadyBuiltWheelError(repaired_wheel.name)
|
||||
|
||||
test_wheel = repaired_wheel
|
||||
|
||||
log.step_end()
|
||||
|
||||
if build_options.test_command and build_options.test_selector(config.identifier):
|
||||
@@ -708,11 +692,11 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
# We're all done here; move it to output (overwrite existing)
|
||||
output_wheel: Path | None = None
|
||||
if compatible_wheel is None:
|
||||
output_wheel = build_options.output_dir.joinpath(repaired_wheel.name)
|
||||
moved_wheel = move_file(repaired_wheel, output_wheel)
|
||||
output_wheel = build_options.output_dir.joinpath(built_wheel.name)
|
||||
moved_wheel = move_file(built_wheel, output_wheel)
|
||||
if moved_wheel != output_wheel.resolve():
|
||||
log.warning(
|
||||
f"{repaired_wheel} was moved to {moved_wheel} instead of {output_wheel}"
|
||||
f"{built_wheel} was moved to {moved_wheel} instead of {output_wheel}"
|
||||
)
|
||||
built_wheels.append(output_wheel)
|
||||
|
||||
|
||||
@@ -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,
|
||||
@@ -207,7 +207,7 @@ def build_in_container(
|
||||
local_identifier_tmp_dir = local_tmp_dir / config.identifier
|
||||
build_options = options.build_options(config.identifier)
|
||||
build_frontend = build_options.build_frontend
|
||||
use_uv = build_frontend.name in {"build[uv]", "uv"}
|
||||
use_uv = build_frontend.name == "build[uv]"
|
||||
pip = ["uv", "pip"] if use_uv else ["pip"]
|
||||
|
||||
log.step("Setting up build environment...")
|
||||
@@ -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()
|
||||
@@ -275,10 +274,7 @@ def build_in_container(
|
||||
container.call(["mkdir", "-p", built_wheel_dir])
|
||||
|
||||
extra_flags = get_build_frontend_extra_flags(
|
||||
build_frontend,
|
||||
build_options.build_verbosity,
|
||||
build_options.config_settings,
|
||||
py38=config.identifier[1:].startswith("p38"),
|
||||
build_frontend, build_options.build_verbosity, build_options.config_settings
|
||||
)
|
||||
|
||||
match build_frontend.name:
|
||||
@@ -311,19 +307,6 @@ def build_in_container(
|
||||
],
|
||||
env=env,
|
||||
)
|
||||
case "uv":
|
||||
container.call(
|
||||
[
|
||||
"uv",
|
||||
"build",
|
||||
f"--python={python_bin / 'python'}",
|
||||
container_package_dir,
|
||||
"--wheel",
|
||||
f"--out-dir={built_wheel_dir}",
|
||||
*extra_flags,
|
||||
],
|
||||
env=env,
|
||||
)
|
||||
case _:
|
||||
assert_never(build_frontend)
|
||||
|
||||
@@ -482,7 +465,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
|
||||
@@ -525,7 +509,6 @@ def _matches_prepared_command(error_cmd: Sequence[str], command_template: str) -
|
||||
def troubleshoot(options: Options, error: Exception) -> None:
|
||||
if isinstance(error, subprocess.CalledProcessError) and (
|
||||
error.cmd[0:4] == ["python", "-m", "pip", "wheel"]
|
||||
or error.cmd[0:2] == ["uv", "build"]
|
||||
or error.cmd[0:3] == ["python", "-m", "build"]
|
||||
or _matches_prepared_command(
|
||||
error.cmd, options.build_options(None).repair_command
|
||||
|
||||
@@ -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, ensure_uv, virtualenv
|
||||
|
||||
|
||||
@functools.cache
|
||||
@@ -146,7 +151,7 @@ def install_cpython(_tmp: Path, version: str, url: str, free_threading: bool) ->
|
||||
"""
|
||||
)
|
||||
raise errors.FatalError(msg)
|
||||
python_filename = url.rsplit("/", maxsplit=1)[-1]
|
||||
python_filename = url.split("/")[-1]
|
||||
pkg_path = CIBW_CACHE_PATH / "cpython-installer" / python_filename
|
||||
if not pkg_path.exists():
|
||||
download(url, pkg_path)
|
||||
@@ -212,8 +217,9 @@ def setup_python(
|
||||
environment: ParsedEnvironment,
|
||||
build_frontend: BuildFrontendName,
|
||||
) -> tuple[Path, dict[str, str]]:
|
||||
uv_path = find_uv()
|
||||
use_uv = build_frontend in {"build[uv]", "uv"}
|
||||
use_uv = build_frontend == "build[uv]"
|
||||
if use_uv:
|
||||
ensure_uv()
|
||||
|
||||
tmp.mkdir()
|
||||
implementation_id = python_configuration.identifier.split("-")[0]
|
||||
@@ -253,10 +259,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 +272,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:
|
||||
@@ -369,29 +371,13 @@ def setup_python(
|
||||
env=env,
|
||||
)
|
||||
case "build[uv]":
|
||||
assert uv_path is not None
|
||||
call(
|
||||
uv_path,
|
||||
"uv",
|
||||
"pip",
|
||||
"install",
|
||||
"--python",
|
||||
which_python,
|
||||
"--upgrade",
|
||||
"delocate",
|
||||
"build[virtualenv, uv]",
|
||||
*constraint_flags(dependency_constraint),
|
||||
env=env,
|
||||
)
|
||||
case "uv":
|
||||
assert uv_path is not None
|
||||
call(
|
||||
uv_path,
|
||||
"pip",
|
||||
"install",
|
||||
"--python",
|
||||
which_python,
|
||||
"--upgrade",
|
||||
"delocate",
|
||||
"build",
|
||||
*constraint_flags(dependency_constraint),
|
||||
env=env,
|
||||
)
|
||||
@@ -427,12 +413,10 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
for config in python_configurations:
|
||||
build_options = options.build_options(config.identifier)
|
||||
build_frontend = build_options.build_frontend
|
||||
use_uv = build_frontend.name in {"build[uv]", "uv"}
|
||||
uv_path = find_uv()
|
||||
if use_uv and uv_path is None:
|
||||
msg = "uv not found"
|
||||
raise AssertionError(msg)
|
||||
pip = ["pip"] if not use_uv else [str(uv_path), "pip"]
|
||||
use_uv = build_frontend.name == "build[uv]"
|
||||
if use_uv:
|
||||
ensure_uv()
|
||||
pip = ["pip"] if not use_uv else ["uv", "pip"]
|
||||
log.build_start(config.identifier)
|
||||
|
||||
identifier_tmp_dir = tmp_path / config.identifier
|
||||
@@ -475,10 +459,7 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
built_wheel_dir.mkdir()
|
||||
|
||||
extra_flags = get_build_frontend_extra_flags(
|
||||
build_frontend,
|
||||
build_options.build_verbosity,
|
||||
build_options.config_settings,
|
||||
py38=config.identifier[1:].startswith("p38"),
|
||||
build_frontend, build_options.build_verbosity, build_options.config_settings
|
||||
)
|
||||
|
||||
build_env = env.copy()
|
||||
@@ -515,18 +496,6 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
*extra_flags,
|
||||
env=build_env,
|
||||
)
|
||||
case "uv":
|
||||
assert uv_path is not None
|
||||
call(
|
||||
uv_path,
|
||||
"build",
|
||||
f"--python={base_python}",
|
||||
build_options.package_dir,
|
||||
"--wheel",
|
||||
f"--out-dir={built_wheel_dir}",
|
||||
*extra_flags,
|
||||
env=build_env,
|
||||
)
|
||||
case _:
|
||||
assert_never(build_frontend)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -422,10 +416,7 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
log.step("Building wheel...")
|
||||
|
||||
extra_flags = get_build_frontend_extra_flags(
|
||||
build_frontend,
|
||||
build_options.build_verbosity,
|
||||
build_options.config_settings,
|
||||
py38=False,
|
||||
build_frontend, build_options.build_verbosity, build_options.config_settings
|
||||
)
|
||||
|
||||
call(
|
||||
|
||||
@@ -5,32 +5,26 @@ import platform as platform_module
|
||||
import shutil
|
||||
import subprocess
|
||||
import textwrap
|
||||
from collections.abc import MutableMapping, Sequence, Set
|
||||
from collections.abc import MutableMapping, Set
|
||||
from functools import cache
|
||||
from pathlib import Path
|
||||
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, ensure_uv, virtualenv
|
||||
|
||||
|
||||
def get_nuget_args(
|
||||
@@ -277,8 +271,9 @@ def setup_python(
|
||||
if build_frontend == "build[uv]" and not can_use_uv(python_configuration):
|
||||
build_frontend = "build"
|
||||
|
||||
use_uv = build_frontend in {"build[uv]", "uv"}
|
||||
uv_path = find_uv()
|
||||
use_uv = build_frontend == "build[uv]"
|
||||
if use_uv:
|
||||
ensure_uv()
|
||||
|
||||
log.step("Setting up build environment...")
|
||||
venv_path = tmp / "venv"
|
||||
@@ -293,9 +288,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 +299,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
|
||||
@@ -331,15 +324,12 @@ def setup_python(
|
||||
env=env,
|
||||
)
|
||||
case "build[uv]":
|
||||
assert uv_path is not None
|
||||
call(
|
||||
uv_path,
|
||||
"uv",
|
||||
"pip",
|
||||
"install",
|
||||
"--python",
|
||||
where_python,
|
||||
"--upgrade",
|
||||
"build[virtualenv]",
|
||||
"build",
|
||||
*constraint_flags(dependency_constraint),
|
||||
env=env,
|
||||
)
|
||||
@@ -396,8 +386,6 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
if not python_configurations:
|
||||
return
|
||||
|
||||
uv_path = find_uv()
|
||||
|
||||
try:
|
||||
before_all_options_identifier = python_configurations[0].identifier
|
||||
before_all_options = options.build_options(before_all_options_identifier)
|
||||
@@ -415,7 +403,8 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
for config in python_configurations:
|
||||
build_options = options.build_options(config.identifier)
|
||||
build_frontend = build_options.build_frontend
|
||||
use_uv = build_frontend.name in {"build[uv]", "uv"} and can_use_uv(config)
|
||||
|
||||
use_uv = build_frontend.name == "build[uv]" and can_use_uv(config)
|
||||
log.build_start(config.identifier)
|
||||
|
||||
identifier_tmp_dir = tmp_path / config.identifier
|
||||
@@ -460,10 +449,7 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
built_wheel_dir.mkdir()
|
||||
|
||||
extra_flags = get_build_frontend_extra_flags(
|
||||
build_frontend,
|
||||
build_options.build_verbosity,
|
||||
build_options.config_settings,
|
||||
py38=config.identifier[1:].startswith("p38"),
|
||||
build_frontend, build_options.build_verbosity, build_options.config_settings
|
||||
)
|
||||
|
||||
if (
|
||||
@@ -515,18 +501,6 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
*extra_flags,
|
||||
env=env,
|
||||
)
|
||||
case "uv":
|
||||
assert uv_path is not None
|
||||
call(
|
||||
uv_path,
|
||||
"build",
|
||||
f"--python={base_python}",
|
||||
build_options.package_dir,
|
||||
"--wheel",
|
||||
f"--out-dir={built_wheel_dir}",
|
||||
*extra_flags,
|
||||
env=env,
|
||||
)
|
||||
case _:
|
||||
assert_never(build_frontend)
|
||||
|
||||
@@ -601,12 +575,7 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
)
|
||||
shell(before_test_prepared, env=virtualenv_env)
|
||||
|
||||
pip: Sequence[Path | str]
|
||||
if use_uv:
|
||||
assert uv_path is not None
|
||||
pip = [uv_path, "pip"]
|
||||
else:
|
||||
pip = ["pip"]
|
||||
pip = ["uv", "pip"] if use_uv else ["pip"]
|
||||
|
||||
# install the wheel
|
||||
call(
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def main() -> None:
|
||||
# CIBW_HOST_TRIPLET is set in the android_env to the Android target triplet.
|
||||
target = os.environ.get("CIBW_HOST_TRIPLET")
|
||||
|
||||
cmd_name = Path(sys.argv[0]).name
|
||||
|
||||
# Find the real command in PATH, excluding the current script's directory
|
||||
path_env = os.environ.get("PATH", "")
|
||||
script_dir = Path(__file__).resolve().parent
|
||||
|
||||
paths = path_env.split(os.pathsep)
|
||||
# Filter out the script directory to avoid recursion
|
||||
filtered_paths = [p for p in paths if Path(p).resolve() != script_dir]
|
||||
filtered_path_env = os.pathsep.join(filtered_paths)
|
||||
|
||||
real_cmd = shutil.which(cmd_name, path=filtered_path_env)
|
||||
|
||||
if not real_cmd:
|
||||
sys.stderr.write(f"cibuildwheel: Error: Could not find system {cmd_name}\n")
|
||||
sys.exit(1)
|
||||
|
||||
# If we have a target (i.e. we are in the android_env), try to install it.
|
||||
if target:
|
||||
# Check if rustup is available to install the target
|
||||
rustup_path = shutil.which("rustup", path=filtered_path_env)
|
||||
|
||||
if rustup_path:
|
||||
try:
|
||||
# We call rustup to ensure the target is installed.
|
||||
subprocess.run(
|
||||
[rustup_path, "target", "add", target],
|
||||
check=True,
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True,
|
||||
)
|
||||
except subprocess.CalledProcessError as e:
|
||||
sys.stderr.write(
|
||||
f"cibuildwheel: Error: Failed to install Rust target {target}: {e.stderr}\n"
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
# Execute the real command
|
||||
os.execv(real_cmd, [real_cmd, *sys.argv[1:]])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -161,30 +161,30 @@ 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.11/python-3.13.11-macos11.pkg" },
|
||||
{ identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.11/python-3.13.11-macos11.pkg" },
|
||||
{ identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.11/python-3.13.11-macos11.pkg" },
|
||||
{ identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.11/python-3.13.11-macos11.pkg" },
|
||||
{ identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.11/python-3.13.11-macos11.pkg" },
|
||||
{ identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.11/python-3.13.11-macos11.pkg" },
|
||||
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-macos11.pkg" },
|
||||
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-macos11.pkg" },
|
||||
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-macos11.pkg" },
|
||||
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-macos11.pkg" },
|
||||
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-macos11.pkg" },
|
||||
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-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" },
|
||||
{ identifier = "pp39-macosx_arm64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_arm64.tar.bz2" },
|
||||
{ identifier = "pp310-macosx_x86_64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-macos_x86_64.tar.bz2" },
|
||||
{ identifier = "pp310-macosx_arm64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-macos_arm64.tar.bz2" },
|
||||
{ identifier = "pp311-macosx_x86_64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.21-macos_x86_64.tar.bz2" },
|
||||
{ identifier = "pp311-macosx_arm64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.21-macos_arm64.tar.bz2" },
|
||||
{ identifier = "pp311-macosx_x86_64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.20-macos_x86_64.tar.bz2" },
|
||||
{ identifier = "pp311-macosx_arm64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.20-macos_arm64.tar.bz2" },
|
||||
{ identifier = "gp311_242-macosx_x86_64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.2/graalpy-24.2.2-macos-amd64.tar.gz" },
|
||||
{ identifier = "gp311_242-macosx_arm64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.2/graalpy-24.2.2-macos-aarch64.tar.gz" },
|
||||
{ identifier = "gp312_250-macosx_x86_64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.1/graalpy-25.0.1-macos-amd64.tar.gz" },
|
||||
{ identifier = "gp312_250-macosx_arm64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.2/graalpy-25.0.2-macos-aarch64.tar.gz" },
|
||||
{ identifier = "gp312_250-macosx_arm64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.1/graalpy-25.0.1-macos-aarch64.tar.gz" },
|
||||
]
|
||||
|
||||
[windows]
|
||||
@@ -199,50 +199,50 @@ 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.11" },
|
||||
{ identifier = "cp313t-win32", version = "3.13.11" },
|
||||
{ identifier = "cp313-win_amd64", version = "3.13.11" },
|
||||
{ identifier = "cp313t-win_amd64", version = "3.13.11" },
|
||||
{ identifier = "cp314-win32", version = "3.14.2" },
|
||||
{ identifier = "cp314t-win32", version = "3.14.2" },
|
||||
{ identifier = "cp314-win_amd64", version = "3.14.2" },
|
||||
{ identifier = "cp314t-win_amd64", version = "3.14.2" },
|
||||
{ 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.11" },
|
||||
{ identifier = "cp313t-win_arm64", version = "3.13.11" },
|
||||
{ identifier = "cp314-win_arm64", version = "3.14.2" },
|
||||
{ identifier = "cp314t-win_arm64", version = "3.14.2" },
|
||||
{ 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" },
|
||||
{ identifier = "pp311-win_amd64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.21-win64.zip" },
|
||||
{ identifier = "pp311-win_amd64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.20-win64.zip" },
|
||||
{ identifier = "gp311_242-win_amd64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.2/graalpy-24.2.2-windows-amd64.zip" },
|
||||
{ identifier = "gp312_250-win_amd64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.2/graalpy-25.0.2-windows-amd64.zip" },
|
||||
{ identifier = "gp312_250-win_amd64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.1/graalpy-25.0.1-windows-amd64.zip" },
|
||||
]
|
||||
|
||||
[pyodide]
|
||||
python_configurations = [
|
||||
{ identifier = "cp312-pyodide_wasm32", version = "3.12", default_pyodide_version = "0.27.7", node_version = "v22" },
|
||||
{ identifier = "cp313-pyodide_wasm32", version = "3.13", default_pyodide_version = "0.29.3", node_version = "v22" },
|
||||
{ identifier = "cp313-pyodide_wasm32", version = "3.13", default_pyodide_version = "0.29.0", node_version = "v22" },
|
||||
]
|
||||
|
||||
[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.11/python-3.13.11-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.11/python-3.13.11-x86_64-linux-android.tar.gz" },
|
||||
{ identifier = "cp314-android_arm64_v8a", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-aarch64-linux-android.tar.gz" },
|
||||
{ identifier = "cp314-android_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.2/python-3.14.2-x86_64-linux-android.tar.gz" },
|
||||
]
|
||||
|
||||
[ios]
|
||||
python_configurations = [
|
||||
{ identifier = "cp313-ios_arm64_iphoneos", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b13/Python-3.13-iOS-support.b13.tar.gz" },
|
||||
{ identifier = "cp313-ios_x86_64_iphonesimulator", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b13/Python-3.13-iOS-support.b13.tar.gz" },
|
||||
{ identifier = "cp313-ios_arm64_iphonesimulator", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b13/Python-3.13-iOS-support.b13.tar.gz" },
|
||||
{ identifier = "cp314-ios_arm64_iphoneos", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b9/Python-3.14-iOS-support.b9.tar.gz" },
|
||||
{ identifier = "cp314-ios_x86_64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b9/Python-3.14-iOS-support.b9.tar.gz" },
|
||||
{ identifier = "cp314-ios_arm64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b9/Python-3.14-iOS-support.b9.tar.gz" },
|
||||
{ identifier = "cp313-ios_arm64_iphoneos", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b12/Python-3.13-iOS-support.b12.tar.gz" },
|
||||
{ identifier = "cp313-ios_x86_64_iphonesimulator", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b12/Python-3.13-iOS-support.b12.tar.gz" },
|
||||
{ identifier = "cp313-ios_arm64_iphonesimulator", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b12/Python-3.13-iOS-support.b12.tar.gz" },
|
||||
{ identifier = "cp314-ios_arm64_iphoneos", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b8/Python-3.14-iOS-support.b8.tar.gz" },
|
||||
{ identifier = "cp314-ios_x86_64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b8/Python-3.14-iOS-support.b8.tar.gz" },
|
||||
{ identifier = "cp314-ios_arm64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b8/Python-3.14-iOS-support.b8.tar.gz" },
|
||||
]
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
},
|
||||
"enable": {
|
||||
"enum": [
|
||||
"cpython-experimental-riscv64",
|
||||
"cpython-freethreading",
|
||||
"cpython-prerelease",
|
||||
"graalpy",
|
||||
@@ -107,14 +108,13 @@
|
||||
},
|
||||
"build-frontend": {
|
||||
"default": "default",
|
||||
"description": "Set the tool to use to build, either \"build\" (default), \"build[uv]\", \"uv\", or \"pip\"",
|
||||
"description": "Set the tool to use to build, either \"build\" (default), \"build[uv]\", or \"pip\"",
|
||||
"oneOf": [
|
||||
{
|
||||
"enum": [
|
||||
"pip",
|
||||
"build",
|
||||
"build[uv]",
|
||||
"uv",
|
||||
"default"
|
||||
]
|
||||
},
|
||||
@@ -130,10 +130,6 @@
|
||||
"type": "string",
|
||||
"pattern": "^build\\[uv\\]; ?args:"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^uv; ?args:"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
@@ -145,8 +141,7 @@
|
||||
"enum": [
|
||||
"pip",
|
||||
"build",
|
||||
"build[uv]",
|
||||
"uv"
|
||||
"build[uv]"
|
||||
]
|
||||
},
|
||||
"args": {
|
||||
|
||||
@@ -2,47 +2,57 @@
|
||||
# nox -s update_constraints
|
||||
annotated-types==0.7.0
|
||||
# via pydantic
|
||||
auditwheel-emscripten==0.2.3
|
||||
anyio==4.12.0
|
||||
# via httpx
|
||||
auditwheel-emscripten==0.2.0
|
||||
# via pyodide-build
|
||||
build==1.2.2.post1
|
||||
# via
|
||||
# -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
# pyodide-build
|
||||
certifi==2026.2.25
|
||||
# via requests
|
||||
charset-normalizer==3.4.6
|
||||
certifi==2025.11.12
|
||||
# via
|
||||
# httpcore
|
||||
# httpx
|
||||
# requests
|
||||
charset-normalizer==3.4.4
|
||||
# via requests
|
||||
click==8.1.8
|
||||
# via
|
||||
# -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
# pyodide-build
|
||||
# pyodide-cli
|
||||
# typer
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
h11==0.16.0
|
||||
# via httpcore
|
||||
httpcore==1.0.9
|
||||
# via httpx
|
||||
httpx==0.28.1
|
||||
# via unearth
|
||||
idna==3.11
|
||||
# via requests
|
||||
leb128==1.0.9
|
||||
# via
|
||||
# anyio
|
||||
# httpx
|
||||
# requests
|
||||
leb128==1.0.8
|
||||
# via auditwheel-emscripten
|
||||
markdown-it-py==4.0.0
|
||||
# via rich
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# build
|
||||
# pyodide-build
|
||||
# wheel
|
||||
pip==26.0.1
|
||||
# unearth
|
||||
pip==25.3
|
||||
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
platformdirs==4.9.4
|
||||
platformdirs==4.5.1
|
||||
# via
|
||||
# pyodide-build
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
pydantic==2.12.5
|
||||
# via
|
||||
@@ -52,40 +62,54 @@ pydantic-core==2.41.5
|
||||
# via pydantic
|
||||
pygments==2.19.2
|
||||
# via rich
|
||||
pyodide-build==0.33.0
|
||||
pyodide-build==0.30.9
|
||||
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
pyodide-cli==0.5.0
|
||||
pyodide-cli==0.4.0
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# pyodide-build
|
||||
pyodide-lock==0.1.2
|
||||
pyodide-lock==0.1.0
|
||||
# via pyodide-build
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
# via virtualenv
|
||||
requests==2.32.5
|
||||
# via pyodide-build
|
||||
rich==14.3.3
|
||||
resolvelib==1.2.1
|
||||
# via pyodide-build
|
||||
rich==14.2.0
|
||||
# via
|
||||
# pyodide-build
|
||||
# pyodide-cli
|
||||
ruamel-yaml==0.19.1
|
||||
# typer
|
||||
ruamel-yaml==0.18.16
|
||||
# via pyodide-build
|
||||
ruamel-yaml-clib==0.2.15
|
||||
# via ruamel-yaml
|
||||
shellingham==1.5.4
|
||||
# via typer
|
||||
typer==0.20.0
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# pyodide-build
|
||||
# pyodide-cli
|
||||
typing-extensions==4.15.0
|
||||
# via
|
||||
# anyio
|
||||
# pydantic
|
||||
# pydantic-core
|
||||
# typer
|
||||
# typing-inspection
|
||||
typing-inspection==0.4.2
|
||||
# via pydantic
|
||||
urllib3==2.6.3
|
||||
unearth==0.18.1
|
||||
# via pyodide-build
|
||||
urllib3==2.6.2
|
||||
# via requests
|
||||
virtualenv==21.2.0
|
||||
virtualenv==20.35.4
|
||||
# via
|
||||
# build
|
||||
# pyodide-build
|
||||
wheel==0.46.3
|
||||
wheel==0.45.1
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# pyodide-build
|
||||
|
||||
@@ -2,47 +2,57 @@
|
||||
# nox -s update_constraints
|
||||
annotated-types==0.7.0
|
||||
# via pydantic
|
||||
auditwheel-emscripten==0.2.3
|
||||
anyio==4.12.0
|
||||
# via httpx
|
||||
auditwheel-emscripten==0.2.0
|
||||
# via pyodide-build
|
||||
build==1.2.2.post1
|
||||
# via
|
||||
# -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
# pyodide-build
|
||||
certifi==2026.2.25
|
||||
# via requests
|
||||
charset-normalizer==3.4.6
|
||||
certifi==2025.11.12
|
||||
# via
|
||||
# httpcore
|
||||
# httpx
|
||||
# requests
|
||||
charset-normalizer==3.4.4
|
||||
# via requests
|
||||
click==8.1.8
|
||||
# via
|
||||
# -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
# pyodide-build
|
||||
# pyodide-cli
|
||||
# typer
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
h11==0.16.0
|
||||
# via httpcore
|
||||
httpcore==1.0.9
|
||||
# via httpx
|
||||
httpx==0.28.1
|
||||
# via unearth
|
||||
idna==3.11
|
||||
# via requests
|
||||
leb128==1.0.9
|
||||
# via
|
||||
# anyio
|
||||
# httpx
|
||||
# requests
|
||||
leb128==1.0.8
|
||||
# via auditwheel-emscripten
|
||||
markdown-it-py==4.0.0
|
||||
# via rich
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# build
|
||||
# pyodide-build
|
||||
# wheel
|
||||
pip==26.0.1
|
||||
# unearth
|
||||
pip==25.3
|
||||
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
platformdirs==4.9.4
|
||||
platformdirs==4.5.1
|
||||
# via
|
||||
# pyodide-build
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
pydantic==2.12.5
|
||||
# via
|
||||
@@ -52,40 +62,53 @@ pydantic-core==2.41.5
|
||||
# via pydantic
|
||||
pygments==2.19.2
|
||||
# via rich
|
||||
pyodide-build==0.33.0
|
||||
pyodide-build==0.30.9
|
||||
# via -r .nox/update_constraints/tmp/constraints-pyodide.in
|
||||
pyodide-cli==0.5.0
|
||||
pyodide-cli==0.4.0
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# pyodide-build
|
||||
pyodide-lock==0.1.2
|
||||
pyodide-lock==0.1.0
|
||||
# via pyodide-build
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.0
|
||||
# via virtualenv
|
||||
requests==2.32.5
|
||||
# via pyodide-build
|
||||
rich==14.3.3
|
||||
resolvelib==1.2.1
|
||||
# via pyodide-build
|
||||
rich==14.2.0
|
||||
# via
|
||||
# pyodide-build
|
||||
# pyodide-cli
|
||||
ruamel-yaml==0.19.1
|
||||
# typer
|
||||
ruamel-yaml==0.18.16
|
||||
# via pyodide-build
|
||||
ruamel-yaml-clib==0.2.15
|
||||
# via ruamel-yaml
|
||||
shellingham==1.5.4
|
||||
# via typer
|
||||
typer==0.20.0
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# pyodide-build
|
||||
# pyodide-cli
|
||||
typing-extensions==4.15.0
|
||||
# via
|
||||
# pydantic
|
||||
# pydantic-core
|
||||
# typer
|
||||
# typing-inspection
|
||||
typing-inspection==0.4.2
|
||||
# via pydantic
|
||||
urllib3==2.6.3
|
||||
unearth==0.18.1
|
||||
# via pyodide-build
|
||||
urllib3==2.6.2
|
||||
# via requests
|
||||
virtualenv==21.2.0
|
||||
virtualenv==20.35.4
|
||||
# via
|
||||
# build
|
||||
# pyodide-build
|
||||
wheel==0.46.3
|
||||
wheel==0.45.1
|
||||
# via
|
||||
# auditwheel-emscripten
|
||||
# pyodide-build
|
||||
|
||||
@@ -2,41 +2,35 @@
|
||||
# nox -s update_constraints
|
||||
altgraph==0.17.5
|
||||
# via macholib
|
||||
build==1.4.3
|
||||
build==1.3.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
delocate==0.13.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
importlib-metadata==9.0.0
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
importlib-metadata==8.7.0
|
||||
# via build
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==26.0.1
|
||||
pip==25.3
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.9.6
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
platformdirs==4.5.1
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
tomli==2.4.1
|
||||
tomli==2.3.0
|
||||
# via build
|
||||
typing-extensions==4.15.0
|
||||
# via
|
||||
# delocate
|
||||
# virtualenv
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
zipp==3.23.0
|
||||
# via importlib-metadata
|
||||
|
||||
@@ -2,33 +2,27 @@
|
||||
# nox -s update_constraints
|
||||
altgraph==0.17.5
|
||||
# via macholib
|
||||
build==1.4.3
|
||||
build==1.3.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
delocate==0.13.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==26.0.1
|
||||
pip==25.3
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.9.6
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
platformdirs==4.5.1
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
|
||||
@@ -2,33 +2,27 @@
|
||||
# nox -s update_constraints
|
||||
altgraph==0.17.5
|
||||
# via macholib
|
||||
build==1.4.3
|
||||
build==1.3.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
delocate==0.13.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==26.0.1
|
||||
pip==25.3
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.9.6
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
platformdirs==4.5.1
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
|
||||
@@ -2,33 +2,27 @@
|
||||
# nox -s update_constraints
|
||||
altgraph==0.17.5
|
||||
# via macholib
|
||||
build==1.4.3
|
||||
build==1.3.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
delocate==0.13.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==26.0.1
|
||||
pip==25.3
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.9.6
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
platformdirs==4.5.1
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
|
||||
@@ -2,33 +2,27 @@
|
||||
# nox -s update_constraints
|
||||
altgraph==0.17.5
|
||||
# via macholib
|
||||
build==1.4.3
|
||||
build==1.3.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
delocate==0.13.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==26.0.1
|
||||
pip==25.3
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.9.6
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
platformdirs==4.5.1
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
|
||||
@@ -9,34 +9,28 @@ delocate==0.12.0
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.16.1
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
# via virtualenv
|
||||
importlib-metadata==8.5.0
|
||||
# via build
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==25.0.1
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.3.6
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
tomli==2.4.1
|
||||
tomli==2.3.0
|
||||
# via build
|
||||
typing-extensions==4.13.2
|
||||
# via
|
||||
# delocate
|
||||
# virtualenv
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
zipp==3.20.2
|
||||
# via importlib-metadata
|
||||
|
||||
@@ -2,41 +2,35 @@
|
||||
# nox -s update_constraints
|
||||
altgraph==0.17.5
|
||||
# via macholib
|
||||
build==1.4.3
|
||||
build==1.3.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
delocate==0.13.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.19.1
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
importlib-metadata==8.7.1
|
||||
# via virtualenv
|
||||
importlib-metadata==8.7.0
|
||||
# via build
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==26.0.1
|
||||
pip==25.3
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.4.0
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
tomli==2.4.1
|
||||
tomli==2.3.0
|
||||
# via build
|
||||
typing-extensions==4.15.0
|
||||
# via
|
||||
# delocate
|
||||
# virtualenv
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
zipp==3.23.0
|
||||
# via importlib-metadata
|
||||
|
||||
@@ -2,33 +2,27 @@
|
||||
# nox -s update_constraints
|
||||
altgraph==0.17.5
|
||||
# via macholib
|
||||
build==1.4.3
|
||||
build==1.3.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
delocate==0.13.0
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
filelock==3.25.2
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
filelock==3.20.0
|
||||
# via virtualenv
|
||||
macholib==1.16.4
|
||||
# via delocate
|
||||
packaging==26.0
|
||||
packaging==25.0
|
||||
# via
|
||||
# build
|
||||
# delocate
|
||||
pip==26.0.1
|
||||
pip==25.3
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
platformdirs==4.9.6
|
||||
# via
|
||||
# python-discovery
|
||||
# virtualenv
|
||||
platformdirs==4.5.1
|
||||
# via virtualenv
|
||||
pyproject-hooks==1.2.0
|
||||
# via build
|
||||
python-discovery==1.2.2
|
||||
# via virtualenv
|
||||
typing-extensions==4.15.0
|
||||
# via delocate
|
||||
virtualenv==21.2.1
|
||||
virtualenv==20.35.4
|
||||
# via -r cibuildwheel/resources/constraints.in
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
url = "https://nodejs.org/dist/"
|
||||
v24 = "v24.14.1"
|
||||
v22 = "v22.22.2"
|
||||
v20 = "v20.20.2"
|
||||
v24 = "v24.12.0"
|
||||
v22 = "v22.21.1"
|
||||
v20 = "v20.19.6"
|
||||
|
||||
@@ -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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.12.13-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2025.12.13-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.12.13-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2025.12.13-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2025.12.13-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.12.13-1
|
||||
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
manylinux_2_35 = quay.io/pypa/manylinux_2_35_armv7l:2025.12.13-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2025.12.13-1
|
||||
|
||||
[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:2025.12.13-1
|
||||
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2025.12.13-1
|
||||
|
||||
|
||||
@@ -1,723 +1,483 @@
|
||||
{
|
||||
"releases": [
|
||||
{
|
||||
"tag": "20260408",
|
||||
"tag": "20251209",
|
||||
"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.19+20251209-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.19+20251209-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.10.19%2B20251209-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.14+20251209-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.14+20251209-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.11.14%2B20251209-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.12+20251209-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.12+20251209-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.12.12%2B20251209-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.11+20251209-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.11+20251209-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.13.11%2B20251209-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.2+20251209-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.2+20251209-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.14.2%2B20251209-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.0a2+20251209-aarch64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-aarch64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-aarch64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-aarch64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-armv7-unknown-linux-gnueabi-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-armv7-unknown-linux-gnueabihf-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-i686-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-ppc64le-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-riscv64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-s390x-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64-apple-darwin-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64-pc-windows-msvc-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64_v2-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64_v3-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64_v4-unknown-linux-gnu-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-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.0a2+20251209-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
|
||||
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20251209/cpython-3.15.0a2%2B20251209-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
default = { version = "21.2.1", url = "https://github.com/pypa/get-virtualenv/releases/download/21.2.1/virtualenv.pyz" }
|
||||
default = { version = "20.35.4", url = "https://github.com/pypa/get-virtualenv/releases/download/20.35.4/virtualenv.pyz" }
|
||||
|
||||
@@ -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]:
|
||||
|
||||
@@ -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
|
||||
@@ -29,6 +29,7 @@ class EnableGroup(StrEnum):
|
||||
Groups of build selectors that are not enabled by default.
|
||||
"""
|
||||
|
||||
CPythonExperimentalRiscV64 = "cpython-experimental-riscv64"
|
||||
CPythonFreeThreading = "cpython-freethreading"
|
||||
CPythonPrerelease = "cpython-prerelease"
|
||||
GraalPy = "graalpy"
|
||||
@@ -37,11 +38,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(set(cls) - {cls.CPythonExperimentalRiscV64})
|
||||
|
||||
@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".
|
||||
@@ -75,7 +76,7 @@ class BuildSelector:
|
||||
def __call__(self, build_id: str) -> bool:
|
||||
# Filter build selectors by python_requires if set
|
||||
if self.requires_python is not None:
|
||||
py_ver_str = build_id.split("-", maxsplit=1)[0].split("_", maxsplit=1)[0]
|
||||
py_ver_str = build_id.split("-")[0].split("_")[0]
|
||||
py_ver_str = py_ver_str.removesuffix("t")
|
||||
major = int(py_ver_str[2])
|
||||
minor = int(py_ver_str[3:])
|
||||
@@ -113,7 +114,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 +135,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}
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
+18
-15
@@ -1,4 +1,3 @@
|
||||
import contextlib
|
||||
import functools
|
||||
import os
|
||||
import shutil
|
||||
@@ -12,9 +11,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")
|
||||
|
||||
@@ -108,9 +107,8 @@ def virtualenv(
|
||||
assert python.exists()
|
||||
|
||||
if use_uv:
|
||||
uv_path = find_uv()
|
||||
assert uv_path is not None
|
||||
call(uv_path, "venv", venv_path, "--python", python)
|
||||
ensure_uv()
|
||||
call("uv", "venv", venv_path, "--python", python)
|
||||
else:
|
||||
virtualenv_app, virtualenv_version = _ensure_virtualenv(version)
|
||||
if pip_version is None:
|
||||
@@ -158,12 +156,17 @@ def virtualenv(
|
||||
return venv_env
|
||||
|
||||
|
||||
def find_uv() -> Path | None:
|
||||
# Prefer uv in our environment
|
||||
with contextlib.suppress(ImportError, FileNotFoundError):
|
||||
from uv import find_uv_bin # noqa: PLC0415
|
||||
def ensure_uv() -> None:
|
||||
"""
|
||||
Ensures uv is available on PATH. Raises an error with a helpful message if not found.
|
||||
|
||||
return Path(find_uv_bin())
|
||||
|
||||
uv_on_path = shutil.which("uv")
|
||||
return Path(uv_on_path) if uv_on_path else None
|
||||
When using build-frontend=build[uv], callers must ensure uv is available
|
||||
on PATH before invoking cibuildwheel.
|
||||
"""
|
||||
if shutil.which("uv") is None:
|
||||
msg = (
|
||||
"uv not found on PATH. When using build-frontend=build[uv], "
|
||||
"ensure uv is installed and available on PATH. "
|
||||
"You can install it with 'pip install uv' or see https://docs.astral.sh/uv/getting-started/installation/"
|
||||
)
|
||||
raise FileNotFoundError(msg)
|
||||
|
||||
@@ -4,34 +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_
|
||||
|
||||
- 🌟 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)
|
||||
|
||||
### v3.3.1
|
||||
|
||||
_5 January 2026_
|
||||
|
||||
- 🛠 Update dependencies and container pins, including updating to CPython 3.14.2. (#2708)
|
||||
|
||||
### v3.3.0
|
||||
|
||||
_12 November 2025_
|
||||
@@ -178,12 +150,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_
|
||||
|
||||
+31
-5
@@ -25,7 +25,7 @@ To build Linux, macOS, and Windows wheels using GitHub Actions, create a `.githu
|
||||
`package-dir: .`, `output-dir: wheelhouse` and `config-file: ''`
|
||||
locations (those values are the defaults). You can also pass a
|
||||
comma-separated list of extras to install additional packages.
|
||||
For example, `extras: "uv"` to install UV into the virtual environment.
|
||||
For example, `extras: "uv"` to make uv available for cibuildwheel to use.
|
||||
|
||||
!!! tab "pipx"
|
||||
The GitHub Actions runners have pipx installed, so you can easily build in
|
||||
@@ -72,6 +72,22 @@ Commit this file, enable building of your repo on Azure Pipelines, and push.
|
||||
|
||||
Wheels will be stored for you and available through the Pipelines interface. For more info on this file, check out the [docs](https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema).
|
||||
|
||||
### Travis CI [linux/windows] {: #travis-ci}
|
||||
|
||||
To build Linux and Windows wheels on Travis CI, create a `.travis.yml` file in your repo.
|
||||
|
||||
> .travis.yml
|
||||
|
||||
```yaml
|
||||
{% include "../examples/travis-ci-minimal.yml" %}
|
||||
```
|
||||
|
||||
Commit this file, enable building of your repo on Travis CI, and push.
|
||||
|
||||
Then setup a deployment method by following the [Travis CI deployment docs](https://docs.travis-ci.com/user/deployment/), or see [Delivering to PyPI](deliver-to-pypi.md). For more info on `.travis.yml`, check out the [docs](https://docs.travis-ci.com/).
|
||||
|
||||
[`examples/travis-ci-deploy.yml`](https://github.com/pypa/cibuildwheel/blob/main/examples/travis-ci-deploy.yml) extends this minimal example with a demonstration of how to automatically upload the built wheels to PyPI.
|
||||
|
||||
### CircleCI [linux/mac] {: #circleci}
|
||||
|
||||
To build Linux and Mac wheels on CircleCI, create a `.circleci/config.yml` file in your repo,
|
||||
@@ -103,6 +119,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 +141,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).
|
||||
|
||||
@@ -30,6 +30,17 @@ cibuildwheel to run tests, add the following YAML to your CI config file:
|
||||
CIBW_TEST_COMMAND: "pytest {project}/tests"
|
||||
```
|
||||
|
||||
!!! tab "Travis CI"
|
||||
|
||||
> .travis.yml ([docs](https://docs.travis-ci.com/user/environment-variables/))
|
||||
|
||||
```yaml
|
||||
env:
|
||||
global:
|
||||
- CIBW_TEST_REQUIRES=pytest
|
||||
- CIBW_TEST_COMMAND="pytest {project}/tests"
|
||||
```
|
||||
|
||||
!!! tab "CircleCI"
|
||||
|
||||
> .circleci/config.yml ([docs](https://circleci.com/docs/2.0/configuration-reference/#environment))
|
||||
@@ -53,6 +64,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 |
@@ -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
@@ -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 +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 |
@@ -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 +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 |
@@ -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 |
@@ -29,11 +29,10 @@ GitHub actions has pipx in all the runners as a supported package manager, as we
|
||||
name: Make SDist
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0 # Optional, use if you use setuptools_scm
|
||||
submodules: true # Optional, use if you have submodules
|
||||
persist-credentials: false # Highly recommended as a good security practice to not store credentials in disk, unless you need this for your specific use case
|
||||
|
||||
- name: Build SDist
|
||||
run: pipx run build --sdist
|
||||
@@ -72,6 +71,12 @@ for an example configuration that automatically uploads wheels to PyPI. Also see
|
||||
[scikit-hep.org/developer/gha_wheels](https://scikit-hep.org/developer/gha_wheels)
|
||||
for a complete guide.
|
||||
|
||||
### TravisCI
|
||||
|
||||
See
|
||||
[`examples/travis-ci-deploy.yml`](https://github.com/pypa/cibuildwheel/blob/main/examples/travis-ci-deploy.yml)
|
||||
for an example configuration.
|
||||
|
||||
## Manual method
|
||||
|
||||
On your development machine, install [pipx](https://pipx.pypa.io/) and do the following:
|
||||
|
||||
+30
-91
@@ -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;
|
||||
|
||||
@@ -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
-21
@@ -99,21 +99,6 @@ Second, there might be platforms you want to ship for that NumPy (or some other
|
||||
|
||||
(Note the `*_ONLY_BINARY` variable also supports `":all:"`, and you don't need both that and `*_PREFER_BINARY`, you can use either one, depending on if you want a missing wheel to be a failure or an attempt to build in CI.)
|
||||
|
||||
### Building with Meson-Python on Windows
|
||||
|
||||
Meson generally works well with cibuildwheel, but there are a few things to be aware of:
|
||||
|
||||
- On GitHub Actions, the compiler that's chosen by default on Windows is often the MinGW compiler, rather than the MSVC toolchain that Python was compiled with.
|
||||
|
||||
The simplest fix for this is to configure cibuildwheel to pass the `--vsenv` flag to meson, like this:
|
||||
|
||||
```toml
|
||||
[tool.cibuildwheel.windows]
|
||||
config-settings = { "setup-args" = "--vsenv" }
|
||||
```
|
||||
|
||||
- If you need to build 32-bit Windows wheels, you need to activate a 32-bit compiler toolchain before starting cibuildwheel. Many users use [ilammy/msvc-dev-cmd](https://github.com/ilammy/msvc-dev-cmd) for this purpose.
|
||||
|
||||
### Automatic updates using Dependabot {: #automatic-updates}
|
||||
|
||||
Selecting a moving target (like the latest release) is generally a bad idea in CI. If something breaks, you can't tell whether it was your code or an upstream update that caused the breakage, and in a worst-case scenario, it could occur during a release.
|
||||
@@ -125,14 +110,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.3.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 +132,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.3.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 +297,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.3.0 --output-dir wheelhouse
|
||||
pipx run twine upload wheelhouse/*.whl
|
||||
```
|
||||
|
||||
|
||||
@@ -22,8 +22,3 @@ This diagram summarises the steps that cibuildwheel takes on each platform to bu
|
||||
%}
|
||||
|
||||
This isn't exhaustive, for a full list of the things cibuildwheel can do, check the [options](options.md) page.
|
||||
|
||||
!!! warning "A note on security"
|
||||
Building and testing wheels executes arbitrary code from your project and its dependencies. Although cibuildwheel uses OCI containers and Pyodide for some builds, these provide no security guarantees - the code you're building and testing has full access to the environment that's invoking cibuildwheel.
|
||||
|
||||
If you cannot trust all the code that's pulled in, maintain good security hygiene: keep the job that builds distributions separate from the job that uploads them to PyPI, handle secrets and credentials with care and rotate them regularly, and follow the principle of least privilege when granting permissions. Do not store sensitive data on CI runners.
|
||||
|
||||
+1
-1
@@ -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]
|
||||
|
||||
+29
-39
@@ -465,27 +465,25 @@ Options:
|
||||
- `build[;args: ...]`
|
||||
- `build[uv][;args: ...]`
|
||||
- `pip[;args: ...]`
|
||||
- `uv[;args: ...]`
|
||||
|
||||
Default: `build`
|
||||
|
||||
Choose which build frontend to use.
|
||||
|
||||
You can use "build\[uv\]", which will use an external [uv][] everywhere
|
||||
possible, both through `--installer=uv` passed to build, as well as when making
|
||||
all build and test environments. This will generally speed up cibuildwheel.
|
||||
Make sure you have an external uv on Windows and macOS, either by
|
||||
pre-installing it, or installing cibuildwheel with the `uv` extra, which is
|
||||
possible by manually passing `cibuildwheel[uv]` to installers or by using the
|
||||
`extras` option in the [cibuildwheel action](ci-services.md#github-actions).
|
||||
uv currently does not support iOS or musllinux on s390x, ppc64le and riscv64.
|
||||
You can also use the `uv` backend directly; though currently multiple output
|
||||
files (from workspaces) are not supported.
|
||||
You can use "build\[uv\]", which will use [uv][] everywhere possible, both
|
||||
through `--installer=uv` passed to build, as well as when making all build and
|
||||
test environments. This will generally speed up cibuildwheel.
|
||||
|
||||
!!! note
|
||||
There is currently a compatibility issue between GraalPy and uv. If you
|
||||
are building GraalPy wheels, use `build` or `pip` as the build frontend
|
||||
instead of `build[uv]` or `uv`.
|
||||
When using `build[uv]`, ensure uv is available on PATH. You can do this by:
|
||||
|
||||
- Pre-installing uv (e.g., via `pip install uv` or using `astral-sh/setup-uv`
|
||||
in GitHub Actions)
|
||||
- Installing cibuildwheel with the `uv` extra by manually passing
|
||||
`cibuildwheel[uv]` to installers
|
||||
- Using the `extras: "uv"` option in the [cibuildwheel action](ci-services.md#github-actions),
|
||||
which installs uv in an isolated environment
|
||||
|
||||
uv currently does not support iOS or musllinux on s390x, ppc64le and riscv64.
|
||||
|
||||
On Android and Pyodide, the "pip" frontend is not supported.
|
||||
|
||||
@@ -519,9 +517,6 @@ optional `args` option.
|
||||
|
||||
# Use uv and build with an argument
|
||||
build-frontend = { name = "build[uv]", args = ["--no-isolation"] }
|
||||
|
||||
# Use uv directly
|
||||
build-frontend = "uv"
|
||||
```
|
||||
|
||||
!!! tab examples "Environment variables"
|
||||
@@ -538,9 +533,6 @@ optional `args` option.
|
||||
|
||||
# Use uv and build with an argument
|
||||
CIBW_BUILD_FRONTEND: "build[uv]; args: --no-isolation"
|
||||
|
||||
# Use uv directly
|
||||
CIBW_BUILD_FRONTEND: "uv"
|
||||
```
|
||||
|
||||
|
||||
@@ -634,8 +626,6 @@ Platform-specific environment variables are also available:<br/>
|
||||
|
||||
In configuration files, you can use a [TOML][] table instead of a raw string as shown above.
|
||||
|
||||
[TOML]: https://toml.io/en/
|
||||
|
||||
!!! tab examples "Environment variables"
|
||||
|
||||
```yaml
|
||||
@@ -911,10 +901,6 @@ Default:
|
||||
- on macOS: `'delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}'`
|
||||
- on Android: There is no default command, but cibuildwheel will add `libc++` to the
|
||||
wheel if anything links against it. Setting a command will replace this behavior.
|
||||
- on Pyodide: You can use `pyodide auditwheel repair --libdir /path/to/libraries --output-dir {dest_dir} {wheel}` command to repair the wheel.
|
||||
Unlike other platforms, this command is not set by default as you need to explicitly
|
||||
specify the library directory. You might not want to use the libraries in the system
|
||||
directory, as they are not built for WASM and will not work.
|
||||
- on other platforms: `''`
|
||||
|
||||
A shell command to repair a built wheel by copying external library dependencies into the wheel tree and relinking them.
|
||||
@@ -942,6 +928,12 @@ Platform-specific environment variables are also available:<br/>
|
||||
|
||||
[Delvewheel]: https://github.com/adang1345/delvewheel
|
||||
|
||||
!!! tip
|
||||
When using `--platform pyodide`, `pyodide build` is used to do the build,
|
||||
which already uses `auditwheel-emscripten` to repair the wheel, so the default
|
||||
repair command is empty. If there is a way to do this in two steps in the future,
|
||||
this could change.
|
||||
|
||||
#### Examples
|
||||
|
||||
!!! tab examples "pyproject.toml"
|
||||
@@ -1255,7 +1247,7 @@ Platform-specific environment variables are also available:<br/>
|
||||
|
||||
[tool.cibuildwheel.pyodide]
|
||||
# Choose a specific pyodide-build version
|
||||
dependency-versions = { packages = ["pyodide-build==0.31.2"] }
|
||||
dependency-versions = { packages = ["pyodide-build==0.29.1"] }
|
||||
```
|
||||
|
||||
!!! tab examples "Environment variables"
|
||||
@@ -1274,7 +1266,7 @@ Platform-specific environment variables are also available:<br/>
|
||||
CIBW_DEPENDENCY_VERSIONS: "packages: auditwheel==6.2.0"
|
||||
|
||||
# Choose a specific pyodide-build version
|
||||
CIBW_DEPENDENCY_VERSIONS_PYODIDE: "packages: pyodide-build==0.31.2"
|
||||
CIBW_DEPENDENCY_VERSIONS_PYODIDE: "packages: pyodide-build==0.29.1"
|
||||
|
||||
# Use shell-style quoting around spaces package specifiers
|
||||
CIBW_DEPENDENCY_VERSIONS: "packages: 'pip >=16.0.0, !=17'"
|
||||
@@ -1765,16 +1757,14 @@ will not produce more logging about the build itself. Other levels only affect
|
||||
the build frontend output, which is usually things like resolving and
|
||||
downloading dependencies. The settings are:
|
||||
|
||||
| | build | pip | uv | desc |
|
||||
|-------------|-------|--------|-------|----------------------------------|
|
||||
| -2 | `-qq`[^1] | `-qq` | `-qq` | even more quiet, where supported |
|
||||
| -1 | `-q`[^1] | `-q` | `-q` | quiet mode, where supported |
|
||||
| 0 (default) | | | | default for build tool |
|
||||
| 1 | | `-v` | | print backend output |
|
||||
| 2 | `-v` | `-vv` | `-v` | print log messages e.g. resolving info |
|
||||
| 3 | `-vv` | `-vvv` | `-vv` | print even more debug info |
|
||||
|
||||
[^1]: Not supported on Python 3.8, will be ignored with a warning.
|
||||
| | build | pip | desc |
|
||||
|-------------|-------|--------|----------------------------------|
|
||||
| -2 | N/A | `-qq` | even more quiet, where supported |
|
||||
| -1 | N/A | `-q` | quiet mode, where supported |
|
||||
| 0 (default) | | | default for build tool |
|
||||
| 1 | | `-v` | print backend output |
|
||||
| 2 | `-v` | `-vv` | print log messages e.g. resolving info |
|
||||
| 3 | `-vv` | `-vvv` | print even more debug info |
|
||||
|
||||
Settings that are not supported for a specific frontend will log a warning.
|
||||
The default build frontend is `build`, which does show build backend output by
|
||||
|
||||
+7
-16
@@ -179,24 +179,13 @@ If there are pre-releases available for a newer Pyodide version, the `pyodide-pr
|
||||
|
||||
Currently, it's recommended to run tests using a `python -m` entrypoint, rather than a command line entrypoint, or a shell script. This is because custom entrypoints have some issues in the Pyodide virtual environment. For example, `pytest` may not work as a command line entrypoint, but will work as a `python -m pytest` entrypoint.
|
||||
|
||||
### Repairing wheels
|
||||
|
||||
Unlike other platforms, cibuildwheel does not set a default [`repair-wheel-command`](options.md#repair-wheel-command) for Pyodide. If your package links shared libraries, you need to explicitly configure the repair command using [`pyodide auditwheel`](https://github.com/pyodide/auditwheel-emscripten):
|
||||
|
||||
```toml
|
||||
[tool.cibuildwheel.pyodide]
|
||||
repair-wheel-command = "pyodide auditwheel repair --libdir /path/to/libraries --output-dir {dest_dir} {wheel}"
|
||||
```
|
||||
|
||||
The `--libdir` option specifies the directory containing cross-compiled shared libraries for WASM. You should not use the system library directories (e.g. `/usr/lib`), as those libraries are not built for WebAssembly.
|
||||
|
||||
|
||||
## Android {: android}
|
||||
|
||||
### Prerequisites
|
||||
|
||||
cibuildwheel can build Android wheels on any POSIX platform supported by the Android
|
||||
development tools, which currently means Linux `x86_64`, macOS `ARM64` or macOS `x86_64`. Any
|
||||
development tools, which currently means Linux x86_64, macOS ARM64 or macOS x86_64. Any
|
||||
of these platforms can be used to build wheels for any Android architecture supported by
|
||||
Python. However, *testing* wheels has additional requirements: see the section below.
|
||||
|
||||
@@ -232,8 +221,10 @@ Python 3.13.
|
||||
|
||||
### Build frontend support
|
||||
|
||||
Android builds do not support the `pip` frontend. The `build`, `build[uv]`, and
|
||||
`uv` frontends work.
|
||||
Android builds only support the `build` frontend. In principle, support for the
|
||||
`build[uv]` frontend should be possible, but `uv` [doesn't currently have support for
|
||||
cross-platform builds](https://github.com/astral-sh/uv/issues/7957), and [doesn't have
|
||||
support for iOS or Android wheel tags](https://github.com/astral-sh/uv/issues/8029).
|
||||
|
||||
### Tests
|
||||
|
||||
@@ -247,7 +238,7 @@ Any arguments specified using [`test-runtime`](options.md#test-runtime) will be
|
||||
Running an emulator requires the build machine to either be bare-metal or support
|
||||
nested virtualization. CI platforms known to meet this requirement are:
|
||||
|
||||
* GitHub Actions Linux `x86_64`
|
||||
* GitHub Actions Linux x86_64
|
||||
|
||||
On Linux, the emulator needs access to the KVM virtualization interface. This may
|
||||
require adding your user to a group, or changing your udev rules. On GitHub
|
||||
@@ -317,7 +308,7 @@ iOS builds are *cross platform builds*, as it not possible to run compilers and
|
||||
|
||||
### Build frontend support
|
||||
|
||||
iOS builds support both the `pip` and `build` build frontends. In principle, support for `uv` and `build[uv]` frontends should be possible, but `uv` [doesn't support iOS fully yet](https://github.com/astral-sh/uv/issues/16724).
|
||||
iOS builds support both the `pip` and `build` build frontends. In principle, support for `uv` with the `build[uv]` frontend should be possible, but `uv` [doesn't currently have support for cross-platform builds](https://github.com/astral-sh/uv/issues/7957), and [doesn't have support for iOS (or Android) tags](https://github.com/astral-sh/uv/issues/8029).
|
||||
|
||||
### Build environment
|
||||
|
||||
|
||||
+44
-46
@@ -8,53 +8,53 @@ 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 |
|
||||
| [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. |
|
||||
| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The venerable Matplotlib, a Python library with C++ portions |
|
||||
| [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 |
|
||||
| [Google Benchmark][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A microbenchmark support library |
|
||||
| [falcon][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Falcon is a no-magic ASGI/WSGI API and microservices framework; it uses cibuildwheel for (optional) Cython extensions. |
|
||||
| [PyGame][] | ![github icon][] | ![apple icon][] ![linux icon][] | 🐍🎮 pygame (the library) is a Free and Open Source python programming language library for making multimedia applications like games built on top of the excellent SDL library. C, Python, Native, OpenGL. |
|
||||
| [Apache Beam][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Apache Beam is a unified programming model for Batch and Streaming data processing. |
|
||||
| [vaex][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Out-of-Core hybrid Apache Arrow/NumPy DataFrame for Python, ML, visualization and exploration of big tabular data at a billion rows per second 🚀 |
|
||||
| [Apache Beam][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Apache Beam is a unified programming model for Batch and Streaming data processing. |
|
||||
| [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. |
|
||||
| [cvxpy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A Python-embedded modeling language for convex optimization problems. |
|
||||
| [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. |
|
||||
| [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). |
|
||||
| [cvxpy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A Python-embedded modeling language for convex optimization problems. |
|
||||
| [twisted-iocpsupport][] | ![github icon][] | ![windows icon][] | A submodule of Twisted that hooks into native C APIs using Cython. |
|
||||
| [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). |
|
||||
| [River][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | 🌊 Online machine learning in Python |
|
||||
| [websockets][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Library for building WebSocket servers and clients. Mostly written in Python, with a small C 'speedups' extension module. |
|
||||
| [OpenSpiel][] | ![github icon][] | ![apple icon][] ![linux icon][] | OpenSpiel is a collection of environments and algorithms for research in general reinforcement learning and search/planning in games. |
|
||||
| [aiortc][] | ![github icon][] | ![apple icon][] ![linux icon][] | WebRTC and ORTC implementation for Python using asyncio. |
|
||||
| [OpenSpiel][] | ![github icon][] | ![apple icon][] ![linux icon][] | OpenSpiel is a collection of environments and algorithms for research in general reinforcement learning and search/planning in games. |
|
||||
| [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 |
|
||||
| [coverage.py][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The coverage tool for Python |
|
||||
| [Line Profiler][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Line-by-line profiling for Python |
|
||||
| [PyCryptodome][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A self-contained cryptographic library for Python |
|
||||
| [Line Profiler][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Line-by-line profiling for Python |
|
||||
| [PyAV][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Pythonic bindings for FFmpeg's libraries. |
|
||||
| [PyYAML][] | ![github icon][] | ![apple icon][] | Canonical source repository for PyYAML |
|
||||
| [pikepdf][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python library for reading and writing PDF, powered by QPDF |
|
||||
| [numexpr][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast numerical array expression evaluator for Python, NumPy, Pandas, PyTables and more |
|
||||
| [Psycopg 3][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A modern implementation of a PostgreSQL adapter for Python |
|
||||
| [Wrapt][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python module for decorators, wrappers and monkey patching. |
|
||||
| [Psycopg 3][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A modern implementation of a PostgreSQL adapter for Python |
|
||||
| [h5py][] | ![azurepipelines icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | HDF5 for Python -- The h5py package is a Pythonic interface to the HDF5 binary data format. |
|
||||
| [envd][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A machine learning development environment build tool |
|
||||
| [OpenColorIO][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A color management framework for visual effects and animation. |
|
||||
@@ -65,42 +65,42 @@ title: Working examples
|
||||
| [PyTables][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python package to manage extremely large amounts of data |
|
||||
| [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric data |
|
||||
| [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. |
|
||||
| [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system |
|
||||
| [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. |
|
||||
| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a CMake-based build system |
|
||||
| [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 |
|
||||
| [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` |
|
||||
| [jq.py][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Python bindings for jq |
|
||||
| [cyvcf2][] | ![github icon][] | ![apple icon][] ![linux icon][] | cython + htslib == fast VCF and BCF processing |
|
||||
| [Confluent client for Kafka][] | ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | setup in `tools/wheels/build-wheels.bat` |
|
||||
| [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 |
|
||||
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python |
|
||||
| [Imagecodecs (fork)][] | ![azurepipelines icon][] | ![apple icon][] ![linux icon][] | Over 20 external dependencies in compiled libraries, custom docker image, `libomp`, `openblas` and `install_name_tool` for macOS. |
|
||||
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![android icon][] ![ios icon][] ![pyodide icon][] | setuptools backend with custom CMake step for external sources. SBOM embedded via a custom repair step. |
|
||||
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![pyodide icon][] | Supports full range of wheels, including PyPy and alternate archs. |
|
||||
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
|
||||
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. |
|
||||
| [Python-WebRTC][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | a Python extension that provides bindings to WebRTC M92 |
|
||||
| [pybind11 scikit_build_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] ![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. |
|
||||
@@ -108,11 +108,11 @@ title: Working examples
|
||||
| [ninja][] | ![github icon][] ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Multitagged binary builds for all supported platforms, using cibw 2 config configuration. |
|
||||
| [etebase-py][] | ![travisci icon][] | ![linux icon][] | Python bindings to a Rust library using `setuptools-rust`, and `sccache` for improved speed. |
|
||||
| [cf-units][] | ![github icon][] | ![apple icon][] ![linux icon][] | Units of measure as required by the Climate and Forecast (CF) Metadata Conventions |
|
||||
| [SiPM][] | ![github icon][] | ![apple icon][] ![linux icon][] | High performance library for SiPM detectors simulation using C++17, OpenMP and AVX2 intrinsics. |
|
||||
| [numpythia][] | ![github icon][] | ![apple icon][] ![linux icon][] | The interface between PYTHIA and NumPy |
|
||||
| [aalink][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Async Python interface for Ableton Link. |
|
||||
| [pyjet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The interface between FastJet and NumPy |
|
||||
| [SiPM][] | ![github icon][] | ![apple icon][] ![linux icon][] | High performance library for SiPM detectors simulation using C++17, OpenMP and AVX2 intrinsics. |
|
||||
| [ril][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A python binding to Rust Imaging library using maturin and Pyo3, utilizes Github Action cache to improve speed. Builds abi3 wheels. |
|
||||
| [aalink][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Async Python interface for Ableton Link. |
|
||||
| [GSD][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Cython and NumPy project with 64-bit wheels. |
|
||||
| [werpy][] | ![github icon][] | ![windows icon][] ![linux icon][] ![apple icon][] | An ultra-fast python package using optimized dynamic programming to compute the Word Error Rate (WER). |
|
||||
| [CorrectionLib][] | ![github icon][] | ![apple icon][] ![linux icon][] | Structured JSON powered correction library for HEP, designed for the CMS experiment at CERN. |
|
||||
@@ -124,32 +124,32 @@ title: Working examples
|
||||
[pytorch-fairseq]: https://github.com/facebookresearch/fairseq
|
||||
[NumPy]: https://github.com/numpy/numpy
|
||||
[NCNN]: https://github.com/Tencent/ncnn
|
||||
[Matplotlib]: https://github.com/matplotlib/matplotlib
|
||||
[Tornado]: https://github.com/tornadoweb/tornado
|
||||
[Matplotlib]: https://github.com/matplotlib/matplotlib
|
||||
[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
|
||||
[Google Benchmark]: https://github.com/google/benchmark
|
||||
[falcon]: https://github.com/falconry/falcon
|
||||
[PyGame]: https://github.com/pygame/pygame
|
||||
[Apache Beam]: https://github.com/apache/beam
|
||||
[vaex]: https://github.com/vaexio/vaex
|
||||
[Apache Beam]: https://github.com/apache/beam
|
||||
[asyncpg]: https://github.com/MagicStack/asyncpg
|
||||
[cmake]: https://github.com/scikit-build/cmake-python-distributions
|
||||
[pyinstrument]: https://github.com/joerick/pyinstrument
|
||||
[scikit-image]: https://github.com/scikit-image/scikit-image
|
||||
[cvxpy]: https://github.com/cvxpy/cvxpy
|
||||
[PyOxidizer]: https://github.com/indygreg/PyOxidizer
|
||||
[pedalboard]: https://github.com/spotify/pedalboard
|
||||
[cvxpy]: https://github.com/cvxpy/cvxpy
|
||||
[twisted-iocpsupport]: https://github.com/twisted/twisted-iocpsupport
|
||||
[pedalboard]: https://github.com/spotify/pedalboard
|
||||
[River]: https://github.com/online-ml/river
|
||||
[websockets]: https://github.com/python-websockets/websockets
|
||||
[OpenSpiel]: https://github.com/google-deepmind/open_spiel
|
||||
[aiortc]: https://github.com/aiortc/aiortc
|
||||
[OpenSpiel]: https://github.com/google-deepmind/open_spiel
|
||||
[Dependency Injector]: https://github.com/ets-labs/python-dependency-injector
|
||||
[UltraJSON]: https://github.com/ultrajson/ultrajson
|
||||
[CTranslate2]: https://github.com/OpenNMT/CTranslate2
|
||||
@@ -158,14 +158,14 @@ title: Working examples
|
||||
[tinyobjloader]: https://github.com/tinyobjloader/tinyobjloader
|
||||
[vispy]: https://github.com/vispy/vispy
|
||||
[coverage.py]: https://github.com/nedbat/coveragepy
|
||||
[Line Profiler]: https://github.com/pyutils/line_profiler
|
||||
[PyCryptodome]: https://github.com/Legrandin/pycryptodome
|
||||
[Line Profiler]: https://github.com/pyutils/line_profiler
|
||||
[PyAV]: https://github.com/PyAV-Org/PyAV
|
||||
[PyYAML]: https://github.com/yaml/pyyaml
|
||||
[pikepdf]: https://github.com/pikepdf/pikepdf
|
||||
[numexpr]: https://github.com/pydata/numexpr
|
||||
[Psycopg 3]: https://github.com/psycopg/psycopg
|
||||
[Wrapt]: https://github.com/GrahamDumpleton/wrapt
|
||||
[Psycopg 3]: https://github.com/psycopg/psycopg
|
||||
[h5py]: https://github.com/h5py/h5py
|
||||
[envd]: https://github.com/tensorchord/envd
|
||||
[OpenColorIO]: https://github.com/AcademySoftwareFoundation/OpenColorIO
|
||||
@@ -176,15 +176,15 @@ title: Working examples
|
||||
[PyTables]: https://github.com/PyTables/PyTables
|
||||
[google neuroglancer]: https://github.com/google/neuroglancer
|
||||
[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
|
||||
[H3-py]: https://github.com/uber/h3-py
|
||||
[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
|
||||
[Rtree]: https://github.com/Toblerity/rtree
|
||||
[pybind11 cmake_example]: https://github.com/pybind/cmake_example
|
||||
[Rtree]: https://github.com/Toblerity/rtree
|
||||
[KDEpy]: https://github.com/tommyod/KDEpy
|
||||
[dd-trace-py]: https://github.com/DataDog/dd-trace-py
|
||||
[tgcalls]: https://github.com/MarshalX/tgcalls
|
||||
@@ -193,9 +193,9 @@ title: Working examples
|
||||
[pybind11 python_example]: https://github.com/pybind/python_example
|
||||
[abess]: https://github.com/abess-team/abess
|
||||
[python-snappy]: https://github.com/intake/python-snappy
|
||||
[Confluent client for Kafka]: https://github.com/confluentinc/confluent-kafka-python
|
||||
[jq.py]: https://github.com/mwilliamson/jq.py
|
||||
[cyvcf2]: https://github.com/brentp/cyvcf2
|
||||
[Confluent client for Kafka]: https://github.com/confluentinc/confluent-kafka-python
|
||||
[matrixprofile]: https://github.com/matrix-profile-foundation/matrixprofile
|
||||
[Tokenizer]: https://github.com/OpenNMT/Tokenizer
|
||||
[iminuit]: https://github.com/scikit-hep/iminuit
|
||||
@@ -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
|
||||
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
|
||||
[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
|
||||
@@ -219,11 +219,11 @@ title: Working examples
|
||||
[ninja]: https://github.com/scikit-build/ninja-python-distributions
|
||||
[etebase-py]: https://github.com/etesync/etebase-py
|
||||
[cf-units]: https://github.com/SciTools/cf-units
|
||||
[SiPM]: https://github.com/EdoPro98/SimSiPM
|
||||
[numpythia]: https://github.com/scikit-hep/numpythia
|
||||
[aalink]: https://github.com/artfwo/aalink
|
||||
[pyjet]: https://github.com/scikit-hep/pyjet
|
||||
[SiPM]: https://github.com/EdoPro98/SimSiPM
|
||||
[ril]: https://github.com/Cryptex-github/ril-py
|
||||
[aalink]: https://github.com/artfwo/aalink
|
||||
[GSD]: https://github.com/glotzerlab/gsd
|
||||
[werpy]: https://github.com/analyticsinmotion/werpy
|
||||
[CorrectionLib]: https://github.com/cms-nanoAOD/correctionlib
|
||||
@@ -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 -->
|
||||
|
||||
|
||||
@@ -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.3.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.3.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.3.0
|
||||
displayName: Install dependencies
|
||||
- bash: cibuildwheel --output-dir wheelhouse .
|
||||
displayName: Build wheels
|
||||
|
||||
@@ -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.3.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.3.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.3.0
|
||||
cibuildwheel --output-dir wheelhouse
|
||||
- store_artifacts:
|
||||
path: wheelhouse/
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
|
||||
install_cibuildwheel_script:
|
||||
- python -m pip install cibuildwheel==3.3.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
|
||||
@@ -0,0 +1,74 @@
|
||||
build_and_store_wheels: &BUILD_AND_STORE_WHEELS
|
||||
install_cibuildwheel_script:
|
||||
- python -m pip install cibuildwheel==3.3.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
|
||||
@@ -48,12 +48,10 @@ jobs:
|
||||
platform: pyodide
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Build wheels
|
||||
uses: pypa/cibuildwheel@v3.4.1
|
||||
uses: pypa/cibuildwheel@v3.3.0
|
||||
env:
|
||||
CIBW_PLATFORM: ${{ matrix.platform || 'auto' }}
|
||||
CIBW_ARCHS: ${{ matrix.archs || 'auto' }}
|
||||
@@ -72,9 +70,7 @@ jobs:
|
||||
name: Build source distribution
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Build sdist
|
||||
run: pipx run build --sdist
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user