Compare commits

...
12 Commits
Author SHA1 Message Date
Henry Schreiner 3c5ff09888 Bump version: v3.0.0rc3 2025-06-11 00:57:01 -04:00
cibuildwheel-bot[bot] 1b9a56e014 [Bot] Update dependencies (#2455) 2025-06-10 21:06:51 -04:00
Henry Schreiner aa9fe2a24e ci: use uv python for docs (binary b1) (#2462)
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
2025-06-10 18:28:34 -04:00
Henry SchreinerandJoe Rickerby e188d9e260 feat: remove 32-bit linux from auto arch, fix auto32 on linux aarch64 (#2458)
* feat: remove 32-bit linux from auto arch, fix auto32 on linux aarch64

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

* Apply suggestions from code review

Co-authored-by: Joe Rickerby <joerick@mac.com>

* Update cibuildwheel/architecture.py

---------

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
Co-authored-by: Joe Rickerby <joerick@mac.com>
2025-06-10 17:57:41 -04:00
Henry Schreiner 3fa7bd1e72 ci: fix cirrus and reduce rebuilds (#2460)
* ci: fix Cirrus CI on Windows

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

* ci: skip unrelated changes more often

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

---------

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
2025-06-10 17:57:25 -04:00
Joe Rickerby c6368be701 Move to the OS-latest image tags on Azure Pipelines (#2461) 2025-06-10 16:48:53 -04:00
Henry Schreiner dcecda6962 chore: handle update of cog to 3.5 (#2459)
chore: handle update of cog

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
2025-06-10 01:54:45 -04:00
Henry Schreiner adc58e93d1 Revert "ci: update example too"
This reverts commit 487154abbb.
2025-06-09 23:39:56 -04:00
Henry Schreiner 487154abbb ci: update example too 2025-06-09 23:15:34 -04:00
Henry Schreiner 0fe82c5882 chore: order python-standalone releases for stability (#2456)
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
2025-06-09 18:32:32 -04:00
pre-commit-ci[bot]andpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> 0b6c7d0aff [pre-commit.ci] pre-commit autoupdate (#2457)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.11.12 → v0.11.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.12...v0.11.13)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-06-09 19:37:40 +01:00
Henry Schreiner 38dab4b641 docs: warning about pyodide-version (#2450) 2025-06-06 09:57:58 -04:00
39 changed files with 269 additions and 162 deletions
+7 -4
View File
@@ -1,9 +1,9 @@
only_if: changesInclude('.cirrus.yml') || ($CIRRUS_BRANCH == "main" && !changesIncludeOnly('docs/*', '.pre-commit-config.yaml')) || $CIRRUS_BRANCH =~ 'cirrus.*' 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 run_tests: &RUN_TESTS
install_cibuildwheel_script: install_cibuildwheel_script:
- python -m pip install dependency-groups - python -m pip install -U pip
- python -m dependency_groups test | xargs python -m pip install -e. - python -m pip install -e. --group test
run_cibuildwheel_tests_script: run_cibuildwheel_tests_script:
- python ./bin/run_tests.py - python ./bin/run_tests.py
@@ -55,9 +55,12 @@ windows_x86_task:
memory: 8G memory: 8G
install_pre_requirements_script: 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 - choco install -y --no-progress python3 --version 3.12.4
- refreshenv - refreshenv
- echo PATH=%PATH% >> "%CIRRUS_ENV%" - powershell -Command "$cleanPath = $env:PATH -replace ';+$', ''; Add-Content -Path $env:CIRRUS_ENV -Value ('PATH=' + $cleanPath)"
<<: *RUN_TESTS <<: *RUN_TESTS
macos_arm64_task: macos_arm64_task:
+12 -1
View File
@@ -12,8 +12,19 @@ on:
- reopened - reopened
- labeled - labeled
paths-ignore: paths-ignore:
- 'docs/**' - .ci*
- bin/*
- docs/**
- examples/azure-pipelines-*
- examples/ci*
- examples/travis-ci-*
- .pre-commit-config.yaml - .pre-commit-config.yaml
- .readthedocs.yml
- .travis.yml
- README.md
- azure-pipelines.yml
- mkdocs.yml
- noxfile.py
workflow_dispatch: workflow_dispatch:
# allow manual runs on branches without a PR # allow manual runs on branches without a PR
+2 -2
View File
@@ -14,7 +14,7 @@ repos:
- id: trailing-whitespace - id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.11.12 rev: v0.11.13
hooks: hooks:
- id: ruff - id: ruff
args: ["--fix", "--show-fixes"] args: ["--fix", "--show-fixes"]
@@ -69,7 +69,7 @@ repos:
pass_filenames: false pass_filenames: false
entry: cog -c -P -r -I ./bin README.md entry: cog -c -P -r -I ./bin README.md
files: '^(README\.md|docs/changelog\.md|docs/options\.md|bin/readme.*)$' files: '^(README\.md|docs/changelog\.md|docs/options\.md|bin/readme.*)$'
additional_dependencies: [cogapp] additional_dependencies: [cogapp>=3.5]
- repo: https://github.com/codespell-project/codespell - repo: https://github.com/codespell-project/codespell
rev: v2.4.1 rev: v2.4.1
+1 -3
View File
@@ -5,9 +5,7 @@ version: 2
build: build:
os: ubuntu-24.04 os: ubuntu-24.04
commands: commands:
- asdf install python 3.14-dev
- asdf global python 3.14-dev
- asdf plugin add uv - asdf plugin add uv
- asdf install uv latest - asdf install uv latest
- asdf global uv latest - asdf global uv latest
- NO_COLOR=1 uv run --no-dev --group docs mkdocs build --strict --site-dir $READTHEDOCS_OUTPUT/html - NO_COLOR=1 uv run --python 3.14 --managed-python --no-dev --group docs mkdocs build --strict --site-dir $READTHEDOCS_OUTPUT/html
+12 -11
View File
@@ -97,7 +97,7 @@ jobs:
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
- name: Install cibuildwheel - name: Install cibuildwheel
run: python -m pip install cibuildwheel==3.0.0rc2 run: python -m pip install cibuildwheel==3.0.0rc3
- name: Build wheels - name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse run: python -m cibuildwheel --output-dir wheelhouse
@@ -162,7 +162,7 @@ The following diagram summarises the steps that cibuildwheel takes on each platf
| | [`build-verbosity`](https://cibuildwheel.pypa.io/en/stable/options/#build-verbosity) | Increase/decrease the output of the build | | | [`build-verbosity`](https://cibuildwheel.pypa.io/en/stable/options/#build-verbosity) | Increase/decrease the output of the build |
<!--[[[end]]] (checksum: 4d6a8418630e9ed43251973d93798a1b) --> <!--[[[end]]] (sum: TWqEGGMOnt) -->
These options can be specified in a pyproject.toml file, or as environment variables, see [configuration docs](https://cibuildwheel.pypa.io/en/latest/configuration/). These options can be specified in a pyproject.toml file, or as environment variables, see [configuration docs](https://cibuildwheel.pypa.io/en/latest/configuration/).
@@ -241,6 +241,15 @@ If you've used previous versions of the beta:
- ⚠️ Previous betas of v3.0 changed the working directory for tests. This has been rolled back to the v2.x behaviour, so you might need to change configs if you adapted to the beta 1 or 2 behaviour. See [issue #2406](https://github.com/pypa/cibuildwheel/issues/2406) for more information. - ⚠️ Previous betas of v3.0 changed the working directory for tests. This has been rolled back to the v2.x behaviour, so you might need to change configs if you adapted to the beta 1 or 2 behaviour. See [issue #2406](https://github.com/pypa/cibuildwheel/issues/2406) for more information.
- ⚠️ GraalPy shipped with the identifier `gp242-*` in previous betas, this has been changed to `gp311_242-*` to be consistent with other interpreters, and to fix a bug with GraalPy and project requires-python detection. If you were using GraalPy, you might need to update your config to use the new identifier. - ⚠️ GraalPy shipped with the identifier `gp242-*` in previous betas, this has been changed to `gp311_242-*` to be consistent with other interpreters, and to fix a bug with GraalPy and project requires-python detection. If you were using GraalPy, you might need to update your config to use the new identifier.
- ⚠️ `test-sources` now uses `project` directory instead of the `package` directory (matching the docs). - ⚠️ `test-sources` now uses `project` directory instead of the `package` directory (matching the docs).
- ⚠️ 32-bit linux builds were removed from `"auto"` (the default), now require `"auto32"` or explicit archs, as modern manylinux images (including our new default) do not support them.
#### v3.0.0rc3
_11 June 2025_
- 🛠 32-bit linux builds removed from `"auto"`, requires explicit `"auto32"`. (#2458)
- 📚 Warn that `pyodide-version` is experimental. (#2450)
#### v3.0.0rc2 #### v3.0.0rc2
@@ -265,15 +274,7 @@ _3 June 2025_
- 🛠 Use the standard Schema line for the integrated JSONSchema. (#2433) - 🛠 Use the standard Schema line for the integrated JSONSchema. (#2433)
- 📚 Use Python 3.14 color output in docs CLI output. (#2407) - 📚 Use Python 3.14 color output in docs CLI output. (#2407)
#### v3.0.0b4 <!-- [[[end]]] (sum: c1HE9PQmvW) -->
_29 May 2025_
- 🛠 Dependency updates, including Python 3.14.0b2. (#2371)
- 🛠 Remove the addition of `PYTHONSAFEPATH` to `test-environment`. (#2429)
- 📚 README table now matches docs and auto-updates. (#2427, #2428)
<!-- [[[end]]] (checksum: 48d3233c1809c1d7a93dc7291752b4d4) -->
--- ---
+15 -4
View File
@@ -1,13 +1,24 @@
pr: pr:
paths: paths:
exclude: exclude:
- docs/* - .github/**
- bin/*
- docs/**
- examples/github-*
- examples/ci*
- examples/travis-ci-*
- .ci*
- .pre-commit-config.yaml - .pre-commit-config.yaml
- .readthedocs.yml
- .travis.yml
- README.md
- mkdocs.yml
- noxfile.py
jobs: jobs:
- job: linux_311 - job: linux_311
timeoutInMinutes: 180 timeoutInMinutes: 180
pool: {vmImage: 'Ubuntu-22.04'} pool: {vmImage: 'ubuntu-latest'}
steps: steps:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
inputs: inputs:
@@ -25,7 +36,7 @@ jobs:
python ./bin/run_tests.py python ./bin/run_tests.py
- job: macos_311 - job: macos_311
pool: {vmImage: 'macOS-13'} pool: {vmImage: 'macOS-latest'}
timeoutInMinutes: 120 timeoutInMinutes: 120
steps: steps:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
@@ -43,7 +54,7 @@ jobs:
python ./bin/run_tests.py python ./bin/run_tests.py
- job: windows_311 - job: windows_311
pool: {vmImage: 'windows-2019'} pool: {vmImage: 'windows-latest'}
timeoutInMinutes: 180 timeoutInMinutes: 180
steps: steps:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
+10 -10
View File
@@ -25,25 +25,25 @@ def main() -> None:
f"repos/astral-sh/python-build-standalone/releases/tags/{latest_tag}" f"repos/astral-sh/python-build-standalone/releases/tags/{latest_tag}"
)["assets"] )["assets"]
assets: list[PythonBuildStandaloneAsset] = [] assets = [
PythonBuildStandaloneAsset(name=ga["name"], url=ga["browser_download_url"])
for ga in github_assets
if ga["name"].endswith("install_only.tar.gz")
]
for github_asset in github_assets: # Try to keep output order stable
name = github_asset["name"] assets = sorted(assets, key=lambda x: x["name"])
if not name.endswith("install_only.tar.gz"):
continue
url = github_asset["browser_download_url"]
assets.append({"name": name, "url": url})
# Write the assets to the JSON file. One day, we might need to support # Write the assets to the JSON file. One day, we might need to support
# multiple releases, but for now, we only support the latest one # multiple releases, but for now, we only support the latest one
json_file_contents: PythonBuildStandaloneReleaseData = { json_file_contents = PythonBuildStandaloneReleaseData(
"releases": [ releases=[
{ {
"tag": latest_tag, "tag": latest_tag,
"assets": assets, "assets": assets,
} }
] ]
} )
with PYTHON_BUILD_STANDALONE_RELEASES.open("w", encoding="utf-8") as f: with PYTHON_BUILD_STANDALONE_RELEASES.open("w", encoding="utf-8") as f:
json.dump(json_file_contents, f, indent=2) json.dump(json_file_contents, f, indent=2)
+1 -1
View File
@@ -1 +1 @@
__version__ = "3.0.0rc2" __version__ = "3.0.0rc3"
+52 -38
View File
@@ -75,24 +75,24 @@ class Architecture(StrEnum):
def parse_config(config: str, platform: PlatformName) -> "set[Architecture]": def parse_config(config: str, platform: PlatformName) -> "set[Architecture]":
result = set() result = set()
for arch_str in re.split(r"[\s,]+", config): for arch_str in re.split(r"[\s,]+", config):
if arch_str == "auto": match arch_str:
result |= Architecture.auto_archs(platform=platform) case "auto":
elif arch_str == "native": result |= Architecture.auto_archs(platform=platform)
native_arch = Architecture.native_arch(platform=platform) case "native":
if native_arch: if native_arch := Architecture.native_arch(platform=platform):
result.add(native_arch) result.add(native_arch)
elif arch_str == "all": case "all":
result |= Architecture.all_archs(platform=platform) result |= Architecture.all_archs(platform=platform)
elif arch_str == "auto64": case "auto64":
result |= Architecture.bitness_archs(platform=platform, bitness="64") result |= Architecture.bitness_archs(platform=platform, bitness="64")
elif arch_str == "auto32": case "auto32":
result |= Architecture.bitness_archs(platform=platform, bitness="32") result |= Architecture.bitness_archs(platform=platform, bitness="32")
else: case _:
try: try:
result.add(Architecture(arch_str)) result.add(Architecture(arch_str))
except ValueError as e: except ValueError as e:
msg = f"Invalid architecture '{arch_str}'" msg = f"Invalid architecture '{arch_str}'"
raise errors.ConfigurationError(msg) from e raise errors.ConfigurationError(msg) from e
return result return result
@staticmethod @staticmethod
@@ -142,19 +142,12 @@ class Architecture(StrEnum):
return set() # can't build anything on this platform return set() # can't build anything on this platform
result = {native_arch} result = {native_arch}
if platform == "linux": match platform:
if Architecture.x86_64 in result: case "windows" if Architecture.AMD64 in result:
# x86_64 machines can run i686 containers result.add(Architecture.x86)
result.add(Architecture.i686) case "ios" if native_arch == Architecture.arm64_iphonesimulator:
elif Architecture.aarch64 in result and _check_aarch32_el0(): # Also build the device wheel if we're on ARM64.
result.add(Architecture.armv7l) result.add(Architecture.arm64_iphoneos)
elif platform == "windows" and Architecture.AMD64 in result:
result.add(Architecture.x86)
elif platform == "ios" and native_arch == Architecture.arm64_iphonesimulator:
# Also build the device wheel if we're on ARM64.
result.add(Architecture.arm64_iphoneos)
return result return result
@@ -183,14 +176,35 @@ class Architecture(StrEnum):
@staticmethod @staticmethod
def bitness_archs(platform: PlatformName, bitness: Literal["64", "32"]) -> "set[Architecture]": def bitness_archs(platform: PlatformName, bitness: Literal["64", "32"]) -> "set[Architecture]":
archs_32 = {Architecture.i686, Architecture.x86, Architecture.armv7l} # This map maps 64-bit architectures to their 32-bit equivalents.
auto_archs = Architecture.auto_archs(platform) archs_map = {
Architecture.x86_64: Architecture.i686,
Architecture.AMD64: Architecture.x86,
Architecture.aarch64: Architecture.armv7l,
}
native_arch = Architecture.native_arch(platform)
if bitness == "64": if native_arch is None:
return auto_archs - archs_32 return set() # can't build anything on this platform
if bitness == "32":
return auto_archs & archs_32 if native_arch == Architecture.wasm32:
typing.assert_never(bitness) return {native_arch} if bitness == "32" else set()
match bitness:
case "64":
return {native_arch} if native_arch not in archs_map.values() else set()
case "32":
if native_arch in archs_map.values():
return {native_arch}
elif native_arch in archs_map and platform in {"linux", "windows"}:
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]}
else:
return set()
case _:
typing.assert_never(bitness)
def allowed_architectures_check( def allowed_architectures_check(
@@ -72,7 +72,7 @@ pyodide-lock==0.1.0a7
# via pyodide-build # via pyodide-build
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
requests==2.32.3 requests==2.32.4
# via pyodide-build # via pyodide-build
resolvelib==1.1.0 resolvelib==1.1.0
# via pyodide-build # via pyodide-build
@@ -81,7 +81,7 @@ rich==14.0.0
# pyodide-build # pyodide-build
# pyodide-cli # pyodide-cli
# typer # typer
ruamel-yaml==0.18.12 ruamel-yaml==0.18.14
# via pyodide-build # via pyodide-build
ruamel-yaml-clib==0.2.12 ruamel-yaml-clib==0.2.12
# via ruamel-yaml # via ruamel-yaml
@@ -72,7 +72,7 @@ pyodide-lock==0.1.0a7
# via pyodide-build # via pyodide-build
pyproject-hooks==1.2.0 pyproject-hooks==1.2.0
# via build # via build
requests==2.32.3 requests==2.32.4
# via pyodide-build # via pyodide-build
resolvelib==1.1.0 resolvelib==1.1.0
# via pyodide-build # via pyodide-build
@@ -81,7 +81,7 @@ rich==14.0.0
# pyodide-build # pyodide-build
# pyodide-cli # pyodide-cli
# typer # typer
ruamel-yaml==0.18.12 ruamel-yaml==0.18.14
# via pyodide-build # via pyodide-build
ruamel-yaml-clib==0.2.12 ruamel-yaml-clib==0.2.12
# via ruamel-yaml # via ruamel-yaml
@@ -30,5 +30,5 @@ typing-extensions==4.14.0
# via delocate # via delocate
virtualenv==20.31.2 virtualenv==20.31.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
zipp==3.22.0 zipp==3.23.0
# via importlib-metadata # via importlib-metadata
@@ -30,5 +30,5 @@ typing-extensions==4.14.0
# via delocate # via delocate
virtualenv==20.31.2 virtualenv==20.31.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
zipp==3.22.0 zipp==3.23.0
# via importlib-metadata # via importlib-metadata
+27 -27
View File
@@ -1,47 +1,47 @@
[x86_64] [x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.06.08-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.06.04-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.06.08-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.06.04-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.06.08-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.06.04-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.06.08-1
[i686] [i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.06.08-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2025.06.04-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2025.06.08-1
[aarch64] [aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.06.08-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.06.04-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.06.08-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.06.04-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.06.08-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2025.06.04-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2025.06.08-1
[ppc64le] [ppc64le]
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2025.06.08-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2025.06.04-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2025.06.08-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2025.06.04-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2025.06.08-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2025.06.04-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2025.06.08-1
[s390x] [s390x]
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_s390x:2025.06.08-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2025.06.04-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2025.06.08-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2025.06.04-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2025.06.08-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2025.06.04-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2025.06.08-1
[pypy_x86_64] [pypy_x86_64]
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.06.08-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.06.04-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.06.08-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.06.04-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.06.08-1
[pypy_i686] [pypy_i686]
manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.06.08-1
[pypy_aarch64] [pypy_aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.06.04-1 manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.06.08-1
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.06.04-1 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.06.08-1
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.06.04-1 manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.06.08-1
[armv7l] [armv7l]
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2025.06.04-1 manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2025.06.08-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2025.06.04-1 musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2025.06.08-1
[riscv64] [riscv64]
@@ -179,6 +179,10 @@
"name": "cpython-3.12.11+20250604-s390x-unknown-linux-gnu-install_only.tar.gz", "name": "cpython-3.12.11+20250604-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-s390x-unknown-linux-gnu-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-s390x-unknown-linux-gnu-install_only.tar.gz"
}, },
{
"name": "cpython-3.12.11+20250604-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64-apple-darwin-install_only.tar.gz"
},
{ {
"name": "cpython-3.12.11+20250604-x86_64-pc-windows-msvc-install_only.tar.gz", "name": "cpython-3.12.11+20250604-x86_64-pc-windows-msvc-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64-pc-windows-msvc-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64-pc-windows-msvc-install_only.tar.gz"
@@ -199,10 +203,6 @@
"name": "cpython-3.12.11+20250604-x86_64_v2-unknown-linux-musl-install_only.tar.gz", "name": "cpython-3.12.11+20250604-x86_64_v2-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64_v2-unknown-linux-musl-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64_v2-unknown-linux-musl-install_only.tar.gz"
}, },
{
"name": "cpython-3.12.11+20250604-x86_64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64-apple-darwin-install_only.tar.gz"
},
{ {
"name": "cpython-3.12.11+20250604-x86_64_v3-unknown-linux-gnu-install_only.tar.gz", "name": "cpython-3.12.11+20250604-x86_64_v3-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64_v3-unknown-linux-gnu-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.12.11%2B20250604-x86_64_v3-unknown-linux-gnu-install_only.tar.gz"
@@ -315,6 +315,10 @@
"name": "cpython-3.14.0b1+20250604-ppc64le-unknown-linux-gnu-install_only.tar.gz", "name": "cpython-3.14.0b1+20250604-ppc64le-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-ppc64le-unknown-linux-gnu-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-ppc64le-unknown-linux-gnu-install_only.tar.gz"
}, },
{
"name": "cpython-3.14.0b1+20250604-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{ {
"name": "cpython-3.14.0b1+20250604-s390x-unknown-linux-gnu-install_only.tar.gz", "name": "cpython-3.14.0b1+20250604-s390x-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-s390x-unknown-linux-gnu-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-s390x-unknown-linux-gnu-install_only.tar.gz"
@@ -359,10 +363,6 @@
"name": "cpython-3.14.0b1+20250604-x86_64_v4-unknown-linux-musl-install_only.tar.gz", "name": "cpython-3.14.0b1+20250604-x86_64_v4-unknown-linux-musl-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-x86_64_v4-unknown-linux-musl-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-x86_64_v4-unknown-linux-musl-install_only.tar.gz"
}, },
{
"name": "cpython-3.14.0b1+20250604-riscv64-unknown-linux-gnu-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.14.0b1%2B20250604-riscv64-unknown-linux-gnu-install_only.tar.gz"
},
{ {
"name": "cpython-3.9.23+20250604-aarch64-apple-darwin-install_only.tar.gz", "name": "cpython-3.9.23+20250604-aarch64-apple-darwin-install_only.tar.gz",
"url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.9.23%2B20250604-aarch64-apple-darwin-install_only.tar.gz" "url": "https://github.com/astral-sh/python-build-standalone/releases/download/20250604/cpython-3.9.23%2B20250604-aarch64-apple-darwin-install_only.tar.gz"
+9
View File
@@ -18,6 +18,15 @@ If you've used previous versions of the beta:
- ⚠️ Previous betas of v3.0 changed the working directory for tests. This has been rolled back to the v2.x behaviour, so you might need to change configs if you adapted to the beta 1 or 2 behaviour. See [issue #2406](https://github.com/pypa/cibuildwheel/issues/2406) for more information. - ⚠️ Previous betas of v3.0 changed the working directory for tests. This has been rolled back to the v2.x behaviour, so you might need to change configs if you adapted to the beta 1 or 2 behaviour. See [issue #2406](https://github.com/pypa/cibuildwheel/issues/2406) for more information.
- ⚠️ GraalPy shipped with the identifier `gp242-*` in previous betas, this has been changed to `gp311_242-*` to be consistent with other interpreters, and to fix a bug with GraalPy and project requires-python detection. If you were using GraalPy, you might need to update your config to use the new identifier. - ⚠️ GraalPy shipped with the identifier `gp242-*` in previous betas, this has been changed to `gp311_242-*` to be consistent with other interpreters, and to fix a bug with GraalPy and project requires-python detection. If you were using GraalPy, you might need to update your config to use the new identifier.
- ⚠️ `test-sources` now uses `project` directory instead of the `package` directory (matching the docs). - ⚠️ `test-sources` now uses `project` directory instead of the `package` directory (matching the docs).
- ⚠️ 32-bit linux builds were removed from `"auto"` (the default), now require `"auto32"` or explicit archs, as modern manylinux images (including our new default) do not support them.
#### v3.0.0rc3
_11 June 2025_
- 🛠 32-bit linux builds removed from `"auto"`, requires explicit `"auto32"`. (#2458)
- 📚 Warn that `pyodide-version` is experimental. (#2450)
#### v3.0.0rc2 #### v3.0.0rc2
+3 -3
View File
@@ -60,7 +60,7 @@ 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: If you use GitHub Actions for builds, you can use cibuildwheel as an action:
```yaml ```yaml
uses: pypa/cibuildwheel@v3.0.0rc2 uses: pypa/cibuildwheel@v3.0.0rc3
``` ```
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. 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.
@@ -82,7 +82,7 @@ The second option, and the only one that supports other CI systems, is using a `
```bash ```bash
# requirements-cibw.txt # requirements-cibw.txt
cibuildwheel==3.0.0rc2 cibuildwheel==3.0.0rc3
``` ```
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: 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:
@@ -247,7 +247,7 @@ Solutions to this vary, but the simplest is to use pipx:
# most runners have pipx preinstalled, but in case you don't # most runners have pipx preinstalled, but in case you don't
python3 -m pip install pipx python3 -m pip install pipx
pipx run cibuildwheel==3.0.0rc2 --output-dir wheelhouse pipx run cibuildwheel==3.0.0rc3 --output-dir wheelhouse
pipx run twine upload wheelhouse/*.whl pipx run twine upload wheelhouse/*.whl
``` ```
+37 -8
View File
@@ -191,10 +191,10 @@ Options:
- Windows: `AMD64` `x86` `ARM64` - Windows: `AMD64` `x86` `ARM64`
- Pyodide: `wasm32` - Pyodide: `wasm32`
- iOS: `arm64_iphoneos` `arm64_iphonesimulator` `x86_64_iphonesimulator` - iOS: `arm64_iphoneos` `arm64_iphonesimulator` `x86_64_iphonesimulator`
- `auto`: The default archs for your machine - see the table below. - `auto`: The recommended archs for your machine - see the table below.
- `auto64`: Just the 64-bit auto archs - `auto64`: The 64-bit arch(s) supported by your machine (includes device and simulator for iOS)
- `auto32`: Just the 32-bit auto archs - `auto32`: The 32-bit arch supported by your machine
- `native`: the native arch of the build machine - Matches [`platform.machine()`](https://docs.python.org/3/library/platform.html#platform.machine). - `native`: the native arch of the build machine - matches [`platform.machine()`](https://docs.python.org/3/library/platform.html#platform.machine).
- `all` : expands to all the architectures supported on this OS. You may want - `all` : expands to all the architectures supported on this OS. You may want
to use [`build`](#build-skip) with this option to target specific to use [`build`](#build-skip) with this option to target specific
architectures via build selectors. architectures via build selectors.
@@ -205,16 +205,34 @@ Default: `auto`
| Runner | `native` | `auto` | `auto64` | `auto32` | | Runner | `native` | `auto` | `auto64` | `auto32` |
|---|---|---|---|---| |---|---|---|---|---|
| Linux / Intel | `x86_64` | `x86_64` `i686` | `x86_64` | `i686` | | Linux / Intel 64-bit | `x86_64` | `x86_64` | `x86_64` | `i686` |
| Windows / Intel | `AMD64` | `AMD64` `x86` | `AMD64` | `x86` | | Linux / Intel 32-bit | `i686` | `i686` | | `i686` |
| Linux / Arm 64-bit | `aarch64` | `aarch64` | `aarch64` | `armv7l`¹ |
| Linux / Arm 32-bit | `armv7l` | `armv7l` | | `armv7l` |
| Windows / Intel 64-bit | `AMD64` | `AMD64` `x86` | `AMD64` | `x86` |
| Windows / Intel 32-bit | `x86` | `x86` | | `x86` |
| Windows / ARM64 | `ARM64` | `ARM64` | `ARM64` | | | Windows / ARM64 | `ARM64` | `ARM64` | `ARM64` | |
| macOS / Intel | `x86_64` | `x86_64` | `x86_64` | | | macOS / Intel | `x86_64` | `x86_64` | `x86_64` | |
| macOS / Apple Silicon | `arm64` | `arm64` | `arm64` | | | macOS / Apple Silicon | `arm64` | `arm64` | `arm64` | |
| iOS on macOS / Intel | `x86_64_iphonesimulator` | `x86_64_iphonesimulator` | `x86_64_iphonesimulator` | | | iOS on macOS / Intel | `x86_64_iphonesimulator` | `x86_64_iphonesimulator` | `x86_64_iphonesimulator` | |
| iOS on macOS / Apple Silicon | `arm64_iphonesimulator` | `arm64_iphoneos` `arm64_iphonesimulator` | `arm64_iphoneos` `arm64_iphonesimulator` | | iOS on macOS / Apple Silicon | `arm64_iphonesimulator` | `arm64_iphoneos` `arm64_iphonesimulator` | `arm64_iphoneos` `arm64_iphonesimulator` |
¹: This will only be included if the runner supports it.
If not listed above, `auto` is the same as `native`. If not listed above, `auto` is the same as `native`.
!!! warning
The `auto` option only includes 32-bit architectures if they are
commonly built. `cibuildwheel` 3.0 removed 32-bit Linux builds from `auto`,
and a future release may remove 32-bit Windows builds from `auto` as well.
If you know you need them, please include `auto32`. Note that modern
manylinux image do not support 32-bit builds. If you want to avoid 32-bit
Windows builds today, feel free to use `auto64`.
!!! note
Pyodide currently ignores the architecture setting, as it always builds for
`wasm32`.
[setup-qemu-action]: https://github.com/docker/setup-qemu-action [setup-qemu-action]: https://github.com/docker/setup-qemu-action
[binfmt]: https://hub.docker.com/r/tonistiigi/binfmt [binfmt]: https://hub.docker.com/r/tonistiigi/binfmt
@@ -238,6 +256,10 @@ This option can also be set using the [command-line option](#command-line)
# On an Linux Intel runner with qemu installed, build Intel and ARM wheels # On an Linux Intel runner with qemu installed, build Intel and ARM wheels
[tool.cibuildwheel.linux] [tool.cibuildwheel.linux]
archs = ["auto", "aarch64"] archs = ["auto", "aarch64"]
# Build all 32-bit and 64-bit wheels natively buildable on the image
[tool.cibuildwheel]
archs = ["auto64", "auto32"]
``` ```
!!! tab examples "Environment variables" !!! tab examples "Environment variables"
@@ -250,12 +272,13 @@ This option can also be set using the [command-line option](#command-line)
# On an Linux Intel runner with qemu installed, build Intel and ARM wheels # On an Linux Intel runner with qemu installed, build Intel and ARM wheels
CIBW_ARCHS_LINUX: "auto aarch64" CIBW_ARCHS_LINUX: "auto aarch64"
# Build all 32-bit and 64-bit wheels natively buildable on the image
CIBW_ARCHS: "auto64 auto32"
``` ```
Separate multiple archs with a space. Separate multiple archs with a space.
It is generally recommended to use the environment variable or It is generally recommended to use the environment variable or
command-line option for Linux, as selecting archs often depends command-line option for Linux, as selecting archs often depends
on your specific runner having qemu installed. on your specific runner having qemu installed.
@@ -1253,6 +1276,12 @@ The available Pyodide versions are determined by the version of `pyodide-build`
!!! tip !!! tip
You can set the version of `pyodide-build` using the [`dependency-versions`](#dependency-versions) option. You can set the version of `pyodide-build` using the [`dependency-versions`](#dependency-versions) option.
!!! warning
This option is considered experimental, and might be converted to a more general mechanism in a future minor cibuildwheel release.
!!! warning
Make sure to scope it to one specific pyodide identifier with overrides if using the `pyodide-prerelease` enable.
#### Examples #### Examples
!!! tab examples "pyproject.toml" !!! tab examples "pyproject.toml"
+6 -6
View File
@@ -71,8 +71,8 @@ title: Working examples
| [mosec][] | ![github icon][] | ![linux icon][] ![apple icon][] | A machine learning model serving framework powered by Rust | | [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. | | [Picologging][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A high-performance logging library for Python. |
| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a CMake-based build system | | [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | 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 |
| [markupsafe][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Safely add untrusted strings to HTML/XML markup. | | [markupsafe][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Safely add untrusted strings to HTML/XML markup. |
| [Rtree][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Rtree: spatial index for Python GIS |
| [KDEpy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Kernel Density Estimation in Python | | [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 | | [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. | | [tgcalls][] | ![github icon][] | ![apple icon][] ![windows icon][] | Python `pybind11` binding to Telegram's WebRTC library with third party dependencies like `OpenSSL`, `MozJPEG`, `FFmpeg`, etc. |
@@ -81,8 +81,8 @@ title: Working examples
| [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. | | [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. |
| [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. | | [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 | | [python-snappy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for the snappy google library |
| [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 | | [cyvcf2][] | ![github icon][] | ![apple icon][] ![linux icon][] | cython + htslib == fast VCF and BCF processing |
| [jq.py][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Python bindings for jq |
| [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. | | [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 | | [Tokenizer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast and customizable text tokenization library with BPE and SentencePiece support |
| [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Jupyter-friendly Python interface for C++ MINUIT2 | | [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Jupyter-friendly Python interface for C++ MINUIT2 |
@@ -94,8 +94,8 @@ title: Working examples
| [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 | | [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 |
| [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython | | [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython |
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis | | [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python | | [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python |
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. | | [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. |
| [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. | | [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. |
| [Python-WebRTC][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | a Python extension that provides bindings to WebRTC M92 | | [Python-WebRTC][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | a Python extension that provides bindings to WebRTC M92 |
@@ -181,8 +181,8 @@ title: Working examples
[mosec]: https://github.com/mosecorg/mosec [mosec]: https://github.com/mosecorg/mosec
[Picologging]: https://github.com/microsoft/picologging [Picologging]: https://github.com/microsoft/picologging
[pybind11 cmake_example]: https://github.com/pybind/cmake_example [pybind11 cmake_example]: https://github.com/pybind/cmake_example
[Rtree]: https://github.com/Toblerity/rtree
[markupsafe]: https://github.com/pallets/markupsafe [markupsafe]: https://github.com/pallets/markupsafe
[Rtree]: https://github.com/Toblerity/rtree
[KDEpy]: https://github.com/tommyod/KDEpy [KDEpy]: https://github.com/tommyod/KDEpy
[dd-trace-py]: https://github.com/DataDog/dd-trace-py [dd-trace-py]: https://github.com/DataDog/dd-trace-py
[tgcalls]: https://github.com/MarshalX/tgcalls [tgcalls]: https://github.com/MarshalX/tgcalls
@@ -191,8 +191,8 @@ title: Working examples
[sourmash]: https://github.com/sourmash-bio/sourmash [sourmash]: https://github.com/sourmash-bio/sourmash
[abess]: https://github.com/abess-team/abess [abess]: https://github.com/abess-team/abess
[python-snappy]: https://github.com/intake/python-snappy [python-snappy]: https://github.com/intake/python-snappy
[jq.py]: https://github.com/mwilliamson/jq.py
[cyvcf2]: https://github.com/brentp/cyvcf2 [cyvcf2]: https://github.com/brentp/cyvcf2
[jq.py]: https://github.com/mwilliamson/jq.py
[matrixprofile]: https://github.com/matrix-profile-foundation/matrixprofile [matrixprofile]: https://github.com/matrix-profile-foundation/matrixprofile
[Tokenizer]: https://github.com/OpenNMT/Tokenizer [Tokenizer]: https://github.com/OpenNMT/Tokenizer
[iminuit]: https://github.com/scikit-hep/iminuit [iminuit]: https://github.com/scikit-hep/iminuit
@@ -204,8 +204,8 @@ title: Working examples
[iDynTree]: https://github.com/robotology/idyntree [iDynTree]: https://github.com/robotology/idyntree
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data [streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model [power-grid-model]: https://github.com/PowerGridModel/power-grid-model
[bx-python]: https://github.com/bxlab/bx-python
[pybase64]: https://github.com/mayeut/pybase64 [pybase64]: https://github.com/mayeut/pybase64
[bx-python]: https://github.com/bxlab/bx-python
[boost-histogram]: https://github.com/scikit-hep/boost-histogram [boost-histogram]: https://github.com/scikit-hep/boost-histogram
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build [Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
[Python-WebRTC]: https://github.com/MarshalX/python-webrtc [Python-WebRTC]: https://github.com/MarshalX/python-webrtc
+6 -6
View File
@@ -1,12 +1,12 @@
jobs: jobs:
- job: linux - job: linux
pool: {vmImage: 'Ubuntu-20.04'} pool: {vmImage: 'ubuntu-latest'}
steps: steps:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
- bash: | - bash: |
set -o errexit set -o errexit
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
pip3 install cibuildwheel==3.0.0rc2 pip3 install cibuildwheel==3.0.0rc3
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
@@ -14,13 +14,13 @@ jobs:
inputs: {pathtoPublish: 'wheelhouse'} inputs: {pathtoPublish: 'wheelhouse'}
- job: macos - job: macos
pool: {vmImage: 'macOS-13'} pool: {vmImage: 'macOS-latest'}
steps: steps:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
- bash: | - bash: |
set -o errexit set -o errexit
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
python3 -m pip install cibuildwheel==3.0.0rc2 python3 -m pip install cibuildwheel==3.0.0rc3
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
@@ -28,13 +28,13 @@ jobs:
inputs: {pathtoPublish: wheelhouse} inputs: {pathtoPublish: wheelhouse}
- job: windows - job: windows
pool: {vmImage: 'windows-2019'} pool: {vmImage: 'windows-latest'}
steps: steps:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
- bash: | - bash: |
set -o errexit set -o errexit
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install cibuildwheel==3.0.0rc2 pip install cibuildwheel==3.0.0rc3
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
+3 -3
View File
@@ -11,7 +11,7 @@ jobs:
- run: - run:
name: Build the Linux wheels. name: Build the Linux wheels.
command: | command: |
python3 -m pip install --user cibuildwheel==3.0.0rc2 python3 -m pip install --user cibuildwheel==3.0.0rc3
cibuildwheel --output-dir wheelhouse cibuildwheel --output-dir wheelhouse
- store_artifacts: - store_artifacts:
path: wheelhouse/ path: wheelhouse/
@@ -28,7 +28,7 @@ jobs:
- run: - run:
name: Build the Linux aarch64 wheels. name: Build the Linux aarch64 wheels.
command: | command: |
python3 -m pip install --user cibuildwheel==3.0.0rc2 python3 -m pip install --user cibuildwheel==3.0.0rc3
python3 -m cibuildwheel --output-dir wheelhouse python3 -m cibuildwheel --output-dir wheelhouse
- store_artifacts: - store_artifacts:
path: wheelhouse/ path: wheelhouse/
@@ -44,7 +44,7 @@ jobs:
name: Build the OS X wheels. name: Build the OS X wheels.
command: | command: |
sudo softwareupdate --install-rosetta --agree-to-license # for python<=3.8 or x86_64/universal2 tests sudo softwareupdate --install-rosetta --agree-to-license # for python<=3.8 or x86_64/universal2 tests
pip3 install cibuildwheel==3.0.0rc2 pip3 install cibuildwheel==3.0.0rc3
cibuildwheel --output-dir wheelhouse cibuildwheel --output-dir wheelhouse
- store_artifacts: - store_artifacts:
path: wheelhouse/ path: wheelhouse/
+1 -1
View File
@@ -1,6 +1,6 @@
build_and_store_wheels: &BUILD_AND_STORE_WHEELS build_and_store_wheels: &BUILD_AND_STORE_WHEELS
install_cibuildwheel_script: install_cibuildwheel_script:
- python -m pip install cibuildwheel==3.0.0rc2 - python -m pip install cibuildwheel==3.0.0rc3
run_cibuildwheel_script: run_cibuildwheel_script:
- cibuildwheel - cibuildwheel
wheels_artifacts: wheels_artifacts:
+6 -2
View File
@@ -1,6 +1,6 @@
build_and_store_wheels: &BUILD_AND_STORE_WHEELS build_and_store_wheels: &BUILD_AND_STORE_WHEELS
install_cibuildwheel_script: install_cibuildwheel_script:
- python -m pip install cibuildwheel==3.0.0rc2 - python -m pip install cibuildwheel==3.0.0rc3
run_cibuildwheel_script: run_cibuildwheel_script:
- cibuildwheel - cibuildwheel
wheels_artifacts: wheels_artifacts:
@@ -52,9 +52,13 @@ windows_x86_task:
memory: 4G memory: 4G
install_pre_requirements_script: 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 - choco install -y --no-progress python3 --version 3.12.4
- refreshenv - refreshenv
- echo PATH=%PATH% >> "%CIRRUS_ENV%" - powershell -Command "$cleanPath = $env:PATH -replace ';+$', ''; Add-Content -Path $env:CIRRUS_ENV -Value ('PATH=' + $cleanPath)"
<<: *BUILD_AND_STORE_WHEELS <<: *BUILD_AND_STORE_WHEELS
macos_arm64_task: macos_arm64_task:
+1 -1
View File
@@ -44,7 +44,7 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v3.0.0rc2 uses: pypa/cibuildwheel@v3.0.0rc3
env: env:
CIBW_PLATFORM: ${{ matrix.platform }} CIBW_PLATFORM: ${{ matrix.platform }}
CIBW_ARCHS: ${{ matrix.archs }} CIBW_ARCHS: ${{ matrix.archs }}
+1 -1
View File
@@ -15,7 +15,7 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v3.0.0rc2 uses: pypa/cibuildwheel@v3.0.0rc3
# env: # env:
# CIBW_SOME_OPTION: value # CIBW_SOME_OPTION: value
# ... # ...
+1 -1
View File
@@ -15,7 +15,7 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build wheels - name: Build wheels
run: pipx run cibuildwheel==3.0.0rc2 run: pipx run cibuildwheel==3.0.0rc3
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
platforms: all platforms: all
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v3.0.0rc2 uses: pypa/cibuildwheel@v3.0.0rc3
env: env:
# configure cibuildwheel on Linux to build native archs ('auto'), # configure cibuildwheel on Linux to build native archs ('auto'),
# and to split the remaining architectures between the x86_64 and # and to split the remaining architectures between the x86_64 and
+3 -3
View File
@@ -12,7 +12,7 @@ linux:
DOCKER_TLS_CERTDIR: "" DOCKER_TLS_CERTDIR: ""
script: script:
- curl -sSL https://get.docker.com/ | sh - curl -sSL https://get.docker.com/ | sh
- python -m pip install cibuildwheel==3.0.0rc2 - python -m pip install cibuildwheel==3.0.0rc3
- cibuildwheel --output-dir wheelhouse - cibuildwheel --output-dir wheelhouse
artifacts: artifacts:
paths: paths:
@@ -23,7 +23,7 @@ windows:
before_script: before_script:
- choco install python -y --allow-downgrade --version 3.12.4 - choco install python -y --allow-downgrade --version 3.12.4
- choco install git.install -y - choco install git.install -y
- py -m pip install cibuildwheel==3.0.0rc2 - py -m pip install cibuildwheel==3.0.0rc3
script: script:
- py -m cibuildwheel --output-dir wheelhouse --platform windows - py -m cibuildwheel --output-dir wheelhouse --platform windows
artifacts: artifacts:
@@ -35,7 +35,7 @@ windows:
macos: macos:
image: macos-14-xcode-15 image: macos-14-xcode-15
before_script: before_script:
- python3 -m pip install cibuildwheel==3.0.0rc2 - python3 -m pip install cibuildwheel==3.0.0rc3
script: script:
- python3 -m cibuildwheel --output-dir wheelhouse - python3 -m cibuildwheel --output-dir wheelhouse
artifacts: artifacts:
+1 -1
View File
@@ -14,7 +14,7 @@ linux:
- curl -sSL https://get.docker.com/ | sh - curl -sSL https://get.docker.com/ | sh
# Warning: This is extremely slow, be careful with how many wheels you build # Warning: This is extremely slow, be careful with how many wheels you build
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- python -m pip install cibuildwheel==3.0.0rc2 - python -m pip install cibuildwheel==3.0.0rc3
# Assuming your CI runner's default architecture is x86_64... # Assuming your CI runner's default architecture is x86_64...
- cibuildwheel --output-dir wheelhouse --platform linux --archs aarch64 - cibuildwheel --output-dir wheelhouse --platform linux --archs aarch64
artifacts: artifacts:
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
- ln -s /c/Python312/python.exe /c/Python312/python3.exe - ln -s /c/Python312/python.exe /c/Python312/python3.exe
install: install:
- python3 -m pip install cibuildwheel==3.0.0rc2 - python3 -m pip install cibuildwheel==3.0.0rc3
script: script:
# build the wheels, put them into './dist' # build the wheels, put them into './dist'
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
- ln -s /c/Python312/python.exe /c/Python312/python3.exe - ln -s /c/Python312/python.exe /c/Python312/python3.exe
install: install:
- python3 -m pip install cibuildwheel==3.0.0rc2 - python3 -m pip install cibuildwheel==3.0.0rc3
script: script:
# build the wheels, put them into './wheelhouse' # build the wheels, put them into './wheelhouse'
+2 -2
View File
@@ -52,7 +52,7 @@ jobs:
- stage: deploy - stage: deploy
name: Build and deploy Linux wheels name: Build and deploy Linux wheels
services: docker services: docker
install: python3 -m pip install cibuildwheel==3.0.0rc2 twine install: python3 -m pip install cibuildwheel==3.0.0rc3 twine
script: python3 -m cibuildwheel --output-dir wheelhouse script: python3 -m cibuildwheel --output-dir wheelhouse
after_success: python3 -m twine upload --skip-existing wheelhouse/*.whl after_success: python3 -m twine upload --skip-existing wheelhouse/*.whl
# Deploy on windows # Deploy on windows
@@ -60,7 +60,7 @@ jobs:
name: Build and deploy Windows wheels name: Build and deploy Windows wheels
os: windows os: windows
language: shell language: shell
install: python3 -m pip install cibuildwheel==3.0.0rc2 twine install: python3 -m pip install cibuildwheel==3.0.0rc3 twine
script: python3 -m cibuildwheel --output-dir wheelhouse script: python3 -m cibuildwheel --output-dir wheelhouse
after_success: python3 -m twine upload --skip-existing wheelhouse/*.whl after_success: python3 -m twine upload --skip-existing wheelhouse/*.whl
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project] [project]
name = "cibuildwheel" name = "cibuildwheel"
version = "3.0.0rc2" version = "3.0.0rc3"
description = "Build Python wheels on CI with minimal configuration." description = "Build Python wheels on CI with minimal configuration."
readme = "README.md" readme = "README.md"
license = "BSD-2-Clause" license = "BSD-2-Clause"
+4
View File
@@ -1,3 +1,4 @@
import socket
import textwrap import textwrap
from . import test_projects, utils from . import test_projects, utils
@@ -24,6 +25,9 @@ def test(tmp_path):
project_dir = tmp_path / "project" project_dir = tmp_path / "project"
project_with_ssl_tests.generate(project_dir) project_with_ssl_tests.generate(project_dir)
# warm up connection
socket.getaddrinfo("tls-v1-2.badssl.com", 443)
actual_wheels = utils.cibuildwheel_run(project_dir) actual_wheels = utils.cibuildwheel_run(project_dir)
expected_wheels = utils.expected_wheels("spam", "0.1.0") expected_wheels = utils.expected_wheels("spam", "0.1.0")
+2 -1
View File
@@ -175,6 +175,7 @@ def expected_wheels(
include_universal2: bool = False, include_universal2: bool = False,
single_python: bool = False, single_python: bool = False,
single_arch: bool = False, single_arch: bool = False,
full_auto: bool = False,
) -> list[str]: ) -> list[str]:
""" """
Returns the expected wheels from a run of cibuildwheel. Returns the expected wheels from a run of cibuildwheel.
@@ -194,7 +195,7 @@ def expected_wheels(
architectures = [machine_arch] architectures = [machine_arch]
if not single_arch: if not single_arch:
if platform == "linux": if platform == "linux" and full_auto:
if machine_arch == "x86_64": if machine_arch == "x86_64":
architectures.append("i686") architectures.append("i686")
elif ( elif (
+22 -3
View File
@@ -34,8 +34,8 @@ def test_arch_auto(platform_machine):
arch_set = Architecture.auto_archs("linux") arch_set = Architecture.auto_archs("linux")
expected = { expected = {
"32": {Architecture.i686}, "32": {Architecture.i686},
"64": {Architecture.x86_64, Architecture.i686}, "64": {Architecture.x86_64},
"arm": {Architecture.aarch64, Architecture.armv7l}, "arm": {Architecture.aarch64},
} }
assert arch_set == expected[machine_name] assert arch_set == expected[machine_name]
@@ -94,5 +94,24 @@ def test_arch_auto_no_aarch32(monkeypatch):
arch_set = Architecture.parse_config("auto64", "linux") arch_set = Architecture.parse_config("auto64", "linux")
assert arch_set == {Architecture.aarch64} assert arch_set == {Architecture.aarch64}
monkeypatch.setattr(cibuildwheel.architecture, "_check_aarch32_el0", lambda: True)
arch_set = Architecture.parse_config("auto32", "linux") arch_set = Architecture.parse_config("auto32", "linux")
assert len(arch_set) == 0 assert arch_set == {Architecture.armv7l}
monkeypatch.setattr(cibuildwheel.architecture, "_check_aarch32_el0", lambda: False)
arch_set = Architecture.parse_config("auto32", "linux")
assert arch_set == set()
def test_arch_native_on_ios(monkeypatch):
monkeypatch.setattr(sys, "platform", "darwin")
monkeypatch.setattr(platform_module, "machine", lambda: "arm64")
arch_set = Architecture.parse_config("native", platform="ios")
assert arch_set == {Architecture.arm64_iphonesimulator}
def test_arch_auto_on_ios(monkeypatch):
monkeypatch.setattr(sys, "platform", "darwin")
monkeypatch.setattr(platform_module, "machine", lambda: "arm64")
arch_set = Architecture.parse_config("auto", platform="ios")
assert arch_set == {Architecture.arm64_iphonesimulator, Architecture.arm64_iphoneos}
+1 -1
View File
@@ -79,7 +79,7 @@ def test_archs_default(platform, intercepted_build_args):
options = intercepted_build_args.args[0] options = intercepted_build_args.args[0]
if platform == "linux": if platform == "linux":
assert options.globals.architectures == {Architecture.x86_64, Architecture.i686} assert options.globals.architectures == {Architecture.x86_64}
elif platform == "windows": elif platform == "windows":
assert options.globals.architectures == {Architecture.AMD64, Architecture.x86} assert options.globals.architectures == {Architecture.AMD64, Architecture.x86}
else: else:
+2
View File
@@ -51,6 +51,7 @@ def mock_build_container(monkeypatch):
@pytest.mark.usefixtures("mock_build_container", "fake_package_dir") @pytest.mark.usefixtures("mock_build_container", "fake_package_dir")
def test_build_default_launches(monkeypatch): def test_build_default_launches(monkeypatch):
monkeypatch.setattr(sys, "argv", [*sys.argv, "--platform=linux"]) monkeypatch.setattr(sys, "argv", [*sys.argv, "--platform=linux"])
monkeypatch.setenv("CIBW_ARCHS", "auto64 auto32")
monkeypatch.delenv("CIBW_ENABLE", raising=False) monkeypatch.delenv("CIBW_ENABLE", raising=False)
main() main()
@@ -105,6 +106,7 @@ def test_build_with_override_launches(monkeypatch, tmp_path):
manylinux-x86_64-image = "manylinux_2_28" manylinux-x86_64-image = "manylinux_2_28"
musllinux-x86_64-image = "musllinux_1_2" musllinux-x86_64-image = "musllinux_1_2"
enable = ["pypy", "pypy-eol", "graalpy", "cpython-freethreading"] enable = ["pypy", "pypy-eol", "graalpy", "cpython-freethreading"]
archs = ["auto64", "auto32"]
# Before Python 3.10, use manylinux2014 # Before Python 3.10, use manylinux2014
[[tool.cibuildwheel.overrides]] [[tool.cibuildwheel.overrides]]
+1
View File
@@ -25,6 +25,7 @@ PYPROJECT_1 = """
[tool.cibuildwheel] [tool.cibuildwheel]
build = ["cp38-*", "cp313-*"] build = ["cp38-*", "cp313-*"]
skip = ["*musllinux*"] skip = ["*musllinux*"]
archs = ["auto64", "auto32"]
environment = {FOO="BAR"} environment = {FOO="BAR"}
test-command = "pyproject" test-command = "pyproject"