Compare commits

...
21 Commits
Author SHA1 Message Date
Henry Schreiner bd033a4447 Bump version: v2.20.0 2024-08-03 22:37:32 -04:00
Ewout ter Hoevenpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>mayeut
9d023cf77a Build CPython 3.13 by default (#1950)
* Build CPython 3.13 by default

Enable building with CPython 3.13 by default, no longer requiring prerelease_pythons flag to be set true.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* README.md: Add note about free-threaded support

* build_selector_test.py: cp313t still behind flag

Even with 3.13 being enabled by default, cp313t is still behind a flag for now.

This commit updates the test accordingly.

* fix unit tests

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: mayeut <mayeut@users.noreply.github.com>
2024-08-03 14:46:45 -04:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> 8a69dbd9d4 [Bot] Update dependencies (#1949)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2024-08-03 12:05:10 -04:00
pre-commit-ci[bot]andpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> 147de6f4f7 [pre-commit.ci] pre-commit autoupdate (#1947)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.5.4 → v0.5.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.4...v0.5.5)
- [github.com/python-jsonschema/check-jsonschema: 0.29.0 → 0.29.1](https://github.com/python-jsonschema/check-jsonschema/compare/0.29.0...0.29.1)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-07-30 10:01:48 -04:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> e217e44661 [Bot] Update dependencies (#1946)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2024-07-29 11:02:55 -04:00
Matt Richards 871ef6b506 tests: show xfail traceback summaries again (#1943)
Revert "tests: don't print xfails (#1865)"

This reverts commit 8d86d3122b.
2024-07-23 09:14:06 -04:00
pre-commit-ci[bot]pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>Henry Schreiner
fac72f024a [pre-commit.ci] pre-commit autoupdate (#1944)
* [pre-commit.ci] pre-commit autoupdate

updates:
- [github.com/astral-sh/ruff-pre-commit: v0.5.2 → v0.5.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.2...v0.5.4)
- [github.com/pre-commit/mirrors-mypy: v1.10.1 → v1.11.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.10.1...v1.11.0)

* chore: type ignore no longer needed

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
2024-07-23 09:26:50 +01:00
Conor MacBrideandMatthieu Darbois d4c332104d feat: add CIBW_ALLOW_EMPTY environment variable (#1937)
Co-authored-by: Matthieu Darbois <mayeut@users.noreply.github.com>
2024-07-23 09:25:09 +01:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> 5af5df4e4f [Bot] Update dependencies (#1935)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2024-07-21 19:56:36 +02:00
Conor MacBride 6c5cf87871 docs: fix nox docs command (#1938) 2024-07-21 11:37:43 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 46f4108f23 chore(deps): bump actions/attest-build-provenance from 1.3.2 to 1.3.3 in the actions group (#1936)
chore(deps): bump actions/attest-build-provenance in the actions group

Bumps the actions group with 1 update: [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance).


Updates `actions/attest-build-provenance` from 1.3.2 to 1.3.3
- [Release notes](https://github.com/actions/attest-build-provenance/releases)
- [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md)
- [Commits](https://github.com/actions/attest-build-provenance/compare/bdd51370e0416ac948727f861e03c2f05d32d78e...5e9cb68e95676991667494a6a4e59b8a2f13e1d0)

---
updated-dependencies:
- dependency-name: actions/attest-build-provenance
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-21 11:29:36 +02:00
pre-commit-ci[bot]andpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> 1da439f8dc [pre-commit.ci] pre-commit autoupdate (#1939)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.5.1 → v0.5.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.1...v0.5.2)
- [github.com/python-jsonschema/check-jsonschema: 0.28.6 → 0.29.0](https://github.com/python-jsonschema/check-jsonschema/compare/0.28.6...0.29.0)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-07-21 11:29:11 +02:00
Matthieu Darbois 7af9d039fb fix: do not use uv on Windows PyPy 3.8 (#1941)
fix: do not use uv on PyPy 3.8

uv 0.2.25+ does not work with PyPy 3.8
Given PyPy 3.8 is EOL, just disable uv for this config rather than ask for it to be supported again in uv.
2024-07-21 10:51:43 +02:00
MusicalNinjaDadJoe RickerbyHenry Schreinerpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
de84624d70 fix: set VSCMD_ARG_TGT_ARCH based on targeted architecture (#1876)
* set VSCMD_ARG_TGT_ARCH based on targetted architecture

* only set VSCMD_ARG_TGT_ARCH if not already set

* add unit tests to check setuptools correctly identifies windows arch

* only run tests on windows

* arm64 fails on azure pipelines (only)

* Update windows.py

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Apply suggestions from code review

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

* update test_env_set to validate FatalError is raised on env collision

* remove noqa ARG001 (no longer needed)

---------

Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Joe Rickerby <joerick@mac.com>
2024-07-12 14:32:42 -04:00
Matthieu Darbois cac121a67d chore: update examples to use python 3.12 (#1919) 2024-07-09 09:15:44 -04:00
cibuildwheel-bot[bot]andcibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com> 604da878cb [Bot] Update dependencies (#1923)
Update dependencies

Co-authored-by: cibuildwheel-bot[bot] <83877280+cibuildwheel-bot[bot]@users.noreply.github.com>
2024-07-09 09:14:32 -04:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> eaf0051162 chore(deps): bump actions/attest-build-provenance from 1.1.2 to 1.3.2 in the actions group (#1925)
chore(deps): bump actions/attest-build-provenance in the actions group

Bumps the actions group with 1 update: [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance).


Updates `actions/attest-build-provenance` from 1.1.2 to 1.3.2
- [Release notes](https://github.com/actions/attest-build-provenance/releases)
- [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md)
- [Commits](https://github.com/actions/attest-build-provenance/compare/173725a1209d09b31f9d30a3890cf2757ebbff0d...bdd51370e0416ac948727f861e03c2f05d32d78e)

---
updated-dependencies:
- dependency-name: actions/attest-build-provenance
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-09 09:14:08 -04:00
Mike Taves 8dcf71e02d DOC: fix link to correct PR number (#1928) 2024-07-09 09:13:20 -04:00
pre-commit-ci[bot]andpre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> 92f0142a3e [pre-commit.ci] pre-commit autoupdate (#1927)
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.5.0 → v0.5.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.0...v0.5.1)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-07-09 09:13:04 -04:00
Matthieu Darbois 6c8347f465 chore: use python from setup-python step to run nox (#1921) 2024-07-08 07:59:44 +02:00
Matthieu Darbois a4d24056ef chore: move AlreadyBuiltWheelError & NonPlatformWheelError to errors.py (#1920) 2024-07-07 09:47:03 +02:00
51 changed files with 371 additions and 221 deletions
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
merge-multiple: true merge-multiple: true
- name: Generate artifact attestation for sdist and wheel - name: Generate artifact attestation for sdist and wheel
uses: actions/attest-build-provenance@173725a1209d09b31f9d30a3890cf2757ebbff0d # v1.1.2 uses: actions/attest-build-provenance@5e9cb68e95676991667494a6a4e59b8a2f13e1d0 # v1.3.3
with: with:
subject-path: "dist/cibuildwheel-*" subject-path: "dist/cibuildwheel-*"
+3 -2
View File
@@ -22,13 +22,14 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
id: python
with: with:
python-version: "3.x" python-version: "3.x"
- uses: pre-commit/action@v3.0.1 - uses: pre-commit/action@v3.0.1
- name: Check manifest - name: Check manifest
run: pipx run nox -s check_manifest run: pipx run --python "${{ steps.python.outputs.python-path }}" nox -s check_manifest
- name: PyLint checks - name: PyLint checks
run: pipx run nox -s pylint -- --output-format=github run: pipx run --python "${{ steps.python.outputs.python-path }}" nox -s pylint -- --output-format=github
test: test:
name: Test on ${{ matrix.os }} (${{ matrix.python_version }}) name: Test on ${{ matrix.os }} (${{ matrix.python_version }})
+3 -3
View File
@@ -14,14 +14,14 @@ 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.5.0 rev: v0.5.5
hooks: hooks:
- id: ruff - id: ruff
args: ["--fix", "--show-fixes"] args: ["--fix", "--show-fixes"]
- id: ruff-format - id: ruff-format
- repo: https://github.com/pre-commit/mirrors-mypy - repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.10.1 rev: v1.11.0
hooks: hooks:
- id: mypy - id: mypy
name: mypy 3.8 on cibuildwheel/ name: mypy 3.8 on cibuildwheel/
@@ -77,7 +77,7 @@ repos:
- repo: https://github.com/python-jsonschema/check-jsonschema - repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.28.6 rev: 0.29.1
hooks: hooks:
- id: check-dependabot - id: check-dependabot
- id: check-github-actions - id: check-github-actions
+13 -21
View File
@@ -39,7 +39,7 @@ What does it do?
<sup>¹ PyPy is only supported for manylinux wheels.</sup><br> <sup>¹ PyPy is only supported for manylinux wheels.</sup><br>
<sup>² Windows arm64 support is experimental.</sup><br> <sup>² Windows arm64 support is experimental.</sup><br>
<sup>³ CPython 3.13 is available using the [`CIBW_PRERELEASE_PYTHONS`](https://cibuildwheel.pypa.io/en/stable/options/#prerelease-pythons) option. Free-threaded mode requires opt-in.</sup><br> <sup>³ CPython 3.13 is built by default using Python RCs, starting with cibuildwheel 2.20. Free-threaded mode will still require opt-in using [`CIBW_FREE_THREADED_SUPPORT`](https://cibuildwheel.pypa.io/en/stable/options/#free-threaded-support).</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>⁴ Experimental, not yet supported on PyPI, but can be used directly in web deployment. Use `--platform pyodide` to build.</sup><br>
- Builds manylinux, musllinux, macOS 10.9+, and Windows wheels for CPython and PyPy - Builds manylinux, musllinux, macOS 10.9+, and Windows wheels for CPython and PyPy
@@ -94,7 +94,7 @@ jobs:
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
- name: Install cibuildwheel - name: Install cibuildwheel
run: python -m pip install cibuildwheel==2.19.2 run: python -m pip install cibuildwheel==2.20.0
- name: Build wheels - name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse run: python -m cibuildwheel --output-dir wheelhouse
@@ -211,6 +211,16 @@ Changelog
<!-- this section was generated by bin/update_readme_changelog.py -- do not edit manually --> <!-- this section was generated by bin/update_readme_changelog.py -- do not edit manually -->
### v2.20.0
- 🌟 CPython 3.13 wheels are now built by default - without the `CIBW_PRERELEASE_PYTHONS` flag. It's time to build and upload these wheels to PyPI! This release includes CPython 3.13.0rc1, which is guaranteed to be ABI compatible with the final release. Free-threading is still behind a flag/config option. (#1950)
- ✨ Provide a `CIBW_ALLOW_EMPTY` environment variable as an alternative to the command line flag. (#1937)
- 🐛 Don't use uv on PyPy3.8 on Windows, it stopped working starting in 0.2.25. Note that PyPy 3.8 is EoL. (#1868)
- 🛠 Set the `VSCMD_ARG_TGT_ARCH` variable based on target arch. (#1876)
- 🛠 Undo cleaner output on pytest 8-8.2 now that 8.3 is out. (#1943)
- 📚 Update examples to use Python 3.12 on host (cibuildwheel will require Python 3.11+ on the host machine starting in October 2024) (#1919)
### v2.19.2 ### v2.19.2
- 🐛 Update manylinux2014 pins to versions that support past-EoL CentOS 7 mirrors. (#1917) - 🐛 Update manylinux2014 pins to versions that support past-EoL CentOS 7 mirrors. (#1917)
@@ -219,7 +229,7 @@ Changelog
- 🛠 Provide CPython 3.13.0b3. (#1913) - 🛠 Provide CPython 3.13.0b3. (#1913)
- 🛠 Remove some workarounds now that pip 21.1 is available. (#1891, #1892) - 🛠 Remove some workarounds now that pip 21.1 is available. (#1891, #1892)
- 📚 Remove nosetest from our docs. (#1821) - 📚 Remove nosetest from our docs. (#1821)
- 📚 Document the macOS ARM workaround for 3.8 on GHA. (#1971) - 📚 Document the macOS ARM workaround for 3.8 on GHA. (#1871)
- 📚 GitLab CI + macOS is now a supported platform with an example. (#1911) - 📚 GitLab CI + macOS is now a supported platform with an example. (#1911)
@@ -261,24 +271,6 @@ See the [release post](https://iscinumpy.dev/post/cibuildwheel-2-19-0/) for more
- 🐛 Fix running linux tests from Windows or macOS ARM. (#1788) - 🐛 Fix running linux tests from Windows or macOS ARM. (#1788)
- 📚 Fix our documentation build. (#1821) - 📚 Fix our documentation build. (#1821)
### v2.18.0
_12 May 2024_
- ✨ Adds CPython 3.13 support, under the prerelease flag [CIBW_PRERELEASE_PYTHONS](https://cibuildwheel.pypa.io/en/stable/options/#prerelease-pythons). This version of cibuildwheel uses 3.13.0b1. Free-threading mode is not available yet (#1657), waiting on official binaries (planned for beta 2) and pip support.
_While CPython is in beta, the ABI can change, so your wheels might not be compatible with the final release. For this reason, we don't recommend distributing wheels until RC1, at which point 3.13 will be available in cibuildwheel without the flag._ (#1815)
- ✨ Musllinux now defaults to `musllinux_1_2`. You can set the older `musllinux_1_1` via config if needed. (#1817)
- 🛠 No longer pre-seed setuptools/wheel in virtual environments (#1819)
- 🛠 Respect the constraints file when building with pip, matching build (#1818)
- 🛠 Use uv to compile our pinned dependencies, 10x faster and doesn't require special setup (#1778)
- 🐛 Fix an issue with the schema (#1788)
- 📚 Document the new delocate error checking macOS versions (#1766)
- 📚 Document Rust builds (#1816)
- 📚 Speed up our readthedocs builds with uv, 26 seconds -> 6 seconds to install dependencies (#1816)
<!-- END bin/update_readme_changelog.py --> <!-- END bin/update_readme_changelog.py -->
--- ---
+1 -1
View File
@@ -1,3 +1,3 @@
from __future__ import annotations from __future__ import annotations
__version__ = "2.19.2" __version__ = "2.20.0"
+2 -2
View File
@@ -319,7 +319,7 @@ def build_in_directory(args: CommandLineArguments) -> None:
# Python is buffering by default when running on the CI platforms, giving # Python is buffering by default when running on the CI platforms, giving
# problems interleaving subprocess call output with unflushed calls to # problems interleaving subprocess call output with unflushed calls to
# 'print' # 'print'
sys.stdout = Unbuffered(sys.stdout) # type: ignore[assignment] sys.stdout = Unbuffered(sys.stdout)
# create the cache dir before it gets printed & builds performed # create the cache dir before it gets printed & builds performed
CIBW_CACHE_PATH.mkdir(parents=True, exist_ok=True) CIBW_CACHE_PATH.mkdir(parents=True, exist_ok=True)
@@ -334,7 +334,7 @@ def build_in_directory(args: CommandLineArguments) -> None:
if not identifiers: if not identifiers:
message = f"No build identifiers selected: {options.globals.build_selector}" message = f"No build identifiers selected: {options.globals.build_selector}"
if args.allow_empty: if options.globals.allow_empty:
print(f"cibuildwheel: {message}", file=sys.stderr) print(f"cibuildwheel: {message}", file=sys.stderr)
else: else:
raise errors.NothingToDoError(message) raise errors.NothingToDoError(message)
+33
View File
@@ -4,6 +4,8 @@ a different return code, by defining them all here, we can ensure that they're
semantically clear and unique. semantically clear and unique.
""" """
import textwrap
class FatalError(BaseException): class FatalError(BaseException):
""" """
@@ -25,3 +27,34 @@ class NothingToDoError(FatalError):
class DeprecationError(FatalError): class DeprecationError(FatalError):
return_code = 4 return_code = 4
class NonPlatformWheelError(FatalError):
def __init__(self) -> None:
message = textwrap.dedent(
"""
Build failed because a pure Python wheel was generated.
If you intend to build a pure-Python wheel, you don't need cibuildwheel - use
`pip wheel -w DEST_DIR .` instead.
If you expected a platform wheel, check your project configuration, or run
cibuildwheel with CIBW_BUILD_VERBOSITY=1 to view build logs.
"""
)
super().__init__(message)
self.return_code = 5
class AlreadyBuiltWheelError(FatalError):
def __init__(self, wheel_name: str) -> None:
message = textwrap.dedent(
f"""
Build failed because a wheel named {wheel_name} was already generated in the current run.
If you expected another wheel to be generated, check your project configuration, or run
cibuildwheel with CIBW_BUILD_VERBOSITY=1 to view build logs.
"""
)
super().__init__(message)
self.return_code = 6
+2 -4
View File
@@ -18,10 +18,8 @@ from .oci_container import OCIContainer, OCIContainerEngineConfig
from .options import BuildOptions, Options from .options import BuildOptions, Options
from .typing import PathOrStr from .typing import PathOrStr
from .util import ( from .util import (
AlreadyBuiltWheelError,
BuildFrontendConfig, BuildFrontendConfig,
BuildSelector, BuildSelector,
NonPlatformWheelError,
find_compatible_wheel, find_compatible_wheel,
get_build_verbosity_extra_flags, get_build_verbosity_extra_flags,
prepare_command, prepare_command,
@@ -306,7 +304,7 @@ def build_in_container(
container.call(["mkdir", "-p", repaired_wheel_dir]) container.call(["mkdir", "-p", repaired_wheel_dir])
if built_wheel.name.endswith("none-any.whl"): if built_wheel.name.endswith("none-any.whl"):
raise NonPlatformWheelError() raise errors.NonPlatformWheelError()
if build_options.repair_command: if build_options.repair_command:
log.step("Repairing wheel...") log.step("Repairing wheel...")
@@ -321,7 +319,7 @@ def build_in_container(
for repaired_wheel in repaired_wheels: for repaired_wheel in repaired_wheels:
if repaired_wheel.name in {wheel.name for wheel in built_wheels}: if repaired_wheel.name in {wheel.name for wheel in built_wheels}:
raise AlreadyBuiltWheelError(repaired_wheel.name) raise errors.AlreadyBuiltWheelError(repaired_wheel.name)
if build_options.test_command and build_options.test_selector(config.identifier): if build_options.test_command and build_options.test_selector(config.identifier):
log.step("Testing wheel...") log.step("Testing wheel...")
+2 -4
View File
@@ -25,11 +25,9 @@ from .options import Options
from .typing import PathOrStr from .typing import PathOrStr
from .util import ( from .util import (
CIBW_CACHE_PATH, CIBW_CACHE_PATH,
AlreadyBuiltWheelError,
BuildFrontendConfig, BuildFrontendConfig,
BuildFrontendName, BuildFrontendName,
BuildSelector, BuildSelector,
NonPlatformWheelError,
call, call,
combine_constraints, combine_constraints,
detect_ci_provider, detect_ci_provider,
@@ -525,7 +523,7 @@ def build(options: Options, tmp_path: Path) -> None:
repaired_wheel_dir.mkdir() repaired_wheel_dir.mkdir()
if built_wheel.name.endswith("none-any.whl"): if built_wheel.name.endswith("none-any.whl"):
raise NonPlatformWheelError() raise errors.NonPlatformWheelError()
if build_options.repair_command: if build_options.repair_command:
log.step("Repairing wheel...") log.step("Repairing wheel...")
@@ -550,7 +548,7 @@ def build(options: Options, tmp_path: Path) -> None:
repaired_wheel = next(repaired_wheel_dir.glob("*.whl")) repaired_wheel = next(repaired_wheel_dir.glob("*.whl"))
if repaired_wheel.name in {wheel.name for wheel in built_wheels}: if repaired_wheel.name in {wheel.name for wheel in built_wheels}:
raise AlreadyBuiltWheelError(repaired_wheel.name) raise errors.AlreadyBuiltWheelError(repaired_wheel.name)
log.step_end() log.step_end()
+4
View File
@@ -75,6 +75,7 @@ class GlobalOptions:
build_selector: BuildSelector build_selector: BuildSelector
test_selector: TestSelector test_selector: TestSelector
architectures: set[Architecture] architectures: set[Architecture]
allow_empty: bool
@dataclasses.dataclass(frozen=True) @dataclasses.dataclass(frozen=True)
@@ -520,6 +521,8 @@ class Options:
self.reader.get("free-threaded-support", env_plat=False, ignore_empty=True) self.reader.get("free-threaded-support", env_plat=False, ignore_empty=True)
) )
allow_empty = args.allow_empty or strtobool(self.env.get("CIBW_ALLOW_EMPTY", "0"))
prerelease_pythons = args.prerelease_pythons or strtobool( prerelease_pythons = args.prerelease_pythons or strtobool(
self.env.get("CIBW_PRERELEASE_PYTHONS", "0") self.env.get("CIBW_PRERELEASE_PYTHONS", "0")
) )
@@ -557,6 +560,7 @@ class Options:
build_selector=build_selector, build_selector=build_selector,
test_selector=test_selector, test_selector=test_selector,
architectures=architectures, architectures=architectures,
allow_empty=allow_empty,
) )
def build_options(self, identifier: str | None) -> BuildOptions: def build_options(self, identifier: str | None) -> BuildOptions:
+2 -4
View File
@@ -17,10 +17,8 @@ from .options import Options
from .typing import PathOrStr from .typing import PathOrStr
from .util import ( from .util import (
CIBW_CACHE_PATH, CIBW_CACHE_PATH,
AlreadyBuiltWheelError,
BuildFrontendConfig, BuildFrontendConfig,
BuildSelector, BuildSelector,
NonPlatformWheelError,
call, call,
combine_constraints, combine_constraints,
download, download,
@@ -299,7 +297,7 @@ def build(options: Options, tmp_path: Path) -> None:
built_wheel = next(built_wheel_dir.glob("*.whl")) built_wheel = next(built_wheel_dir.glob("*.whl"))
if built_wheel.name.endswith("none-any.whl"): if built_wheel.name.endswith("none-any.whl"):
raise NonPlatformWheelError() raise errors.NonPlatformWheelError()
if build_options.repair_command: if build_options.repair_command:
log.step("Repairing wheel...") log.step("Repairing wheel...")
@@ -316,7 +314,7 @@ def build(options: Options, tmp_path: Path) -> None:
repaired_wheel = next(repaired_wheel_dir.glob("*.whl")) repaired_wheel = next(repaired_wheel_dir.glob("*.whl"))
if repaired_wheel.name in {wheel.name for wheel in built_wheels}: if repaired_wheel.name in {wheel.name for wheel in built_wheels}:
raise AlreadyBuiltWheelError(repaired_wheel.name) raise errors.AlreadyBuiltWheelError(repaired_wheel.name)
if build_options.test_command and build_options.test_selector(config.identifier): if build_options.test_command and build_options.test_selector(config.identifier):
log.step("Testing wheel...") log.step("Testing wheel...")
+12 -12
View File
@@ -123,12 +123,12 @@ python_configurations = [
{ identifier = "cp312-macosx_x86_64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.4/python-3.12.4-macos11.pkg" }, { identifier = "cp312-macosx_x86_64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.4/python-3.12.4-macos11.pkg" },
{ identifier = "cp312-macosx_arm64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.4/python-3.12.4-macos11.pkg" }, { identifier = "cp312-macosx_arm64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.4/python-3.12.4-macos11.pkg" },
{ identifier = "cp312-macosx_universal2", version = "3.12", url = "https://www.python.org/ftp/python/3.12.4/python-3.12.4-macos11.pkg" }, { identifier = "cp312-macosx_universal2", version = "3.12", url = "https://www.python.org/ftp/python/3.12.4/python-3.12.4-macos11.pkg" },
{ identifier = "cp313-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0b3-macos11.pkg" }, { identifier = "cp313-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0rc1-macos11.pkg" },
{ identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0b3-macos11.pkg" }, { identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0rc1-macos11.pkg" },
{ identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0b3-macos11.pkg" }, { identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0rc1-macos11.pkg" },
{ identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0b3-macos11.pkg" }, { identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0rc1-macos11.pkg" },
{ identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0b3-macos11.pkg" }, { identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0rc1-macos11.pkg" },
{ identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0b3-macos11.pkg" }, { identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.0/python-3.13.0rc1-macos11.pkg" },
{ identifier = "pp37-macosx_x86_64", version = "3.7", url = "https://downloads.python.org/pypy/pypy3.7-v7.3.9-osx64.tar.bz2" }, { identifier = "pp37-macosx_x86_64", version = "3.7", url = "https://downloads.python.org/pypy/pypy3.7-v7.3.9-osx64.tar.bz2" },
{ 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_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 = "pp38-macosx_arm64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-macos_arm64.tar.bz2" },
@@ -154,16 +154,16 @@ python_configurations = [
{ identifier = "cp311-win_amd64", version = "3.11.9", arch = "64" }, { identifier = "cp311-win_amd64", version = "3.11.9", arch = "64" },
{ identifier = "cp312-win32", version = "3.12.4", arch = "32" }, { identifier = "cp312-win32", version = "3.12.4", arch = "32" },
{ identifier = "cp312-win_amd64", version = "3.12.4", arch = "64" }, { identifier = "cp312-win_amd64", version = "3.12.4", arch = "64" },
{ identifier = "cp313-win32", version = "3.13.0-b3", arch = "32" }, { identifier = "cp313-win32", version = "3.13.0-rc1", arch = "32" },
{ identifier = "cp313t-win32", version = "3.13.0-b3", arch = "32" }, { identifier = "cp313t-win32", version = "3.13.0-rc1", arch = "32" },
{ identifier = "cp313-win_amd64", version = "3.13.0-b3", arch = "64" }, { identifier = "cp313-win_amd64", version = "3.13.0-rc1", arch = "64" },
{ identifier = "cp313t-win_amd64", version = "3.13.0-b3", arch = "64" }, { identifier = "cp313t-win_amd64", version = "3.13.0-rc1", arch = "64" },
{ identifier = "cp39-win_arm64", version = "3.9.10", arch = "ARM64" }, { identifier = "cp39-win_arm64", version = "3.9.10", arch = "ARM64" },
{ identifier = "cp310-win_arm64", version = "3.10.11", arch = "ARM64" }, { identifier = "cp310-win_arm64", version = "3.10.11", arch = "ARM64" },
{ identifier = "cp311-win_arm64", version = "3.11.9", arch = "ARM64" }, { identifier = "cp311-win_arm64", version = "3.11.9", arch = "ARM64" },
{ identifier = "cp312-win_arm64", version = "3.12.4", arch = "ARM64" }, { identifier = "cp312-win_arm64", version = "3.12.4", arch = "ARM64" },
{ identifier = "cp313-win_arm64", version = "3.13.0-b3", arch = "ARM64" }, { identifier = "cp313-win_arm64", version = "3.13.0-rc1", arch = "ARM64" },
{ identifier = "cp313t-win_arm64", version = "3.13.0-b3", arch = "ARM64" }, { identifier = "cp313t-win_arm64", version = "3.13.0-rc1", arch = "ARM64" },
{ identifier = "pp37-win_amd64", version = "3.7", arch = "64", url = "https://downloads.python.org/pypy/pypy3.7-v7.3.9-win64.zip" }, { identifier = "pp37-win_amd64", version = "3.7", arch = "64", url = "https://downloads.python.org/pypy/pypy3.7-v7.3.9-win64.zip" },
{ identifier = "pp38-win_amd64", version = "3.8", arch = "64", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-win64.zip" }, { identifier = "pp38-win_amd64", version = "3.8", arch = "64", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-win64.zip" },
{ identifier = "pp39-win_amd64", version = "3.9", arch = "64", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip" }, { identifier = "pp39-win_amd64", version = "3.9", arch = "64", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip" },
@@ -4,13 +4,13 @@ annotated-types==0.7.0
# via pydantic # via pydantic
anyio==4.4.0 anyio==4.4.0
# via httpx # via httpx
auditwheel-emscripten==0.0.15 auditwheel-emscripten==0.0.16
# via pyodide-build # via pyodide-build
build==1.2.1 build==1.2.1
# via # via
# -r .nox/update_constraints/tmp/constraints-pyodide.in # -r .nox/update_constraints/tmp/constraints-pyodide.in
# pyodide-build # pyodide-build
certifi==2024.6.2 certifi==2024.7.4
# via # via
# httpcore # httpcore
# httpx # httpx
@@ -21,7 +21,7 @@ click==8.1.7
# via typer # via typer
cloudpickle==3.0.0 cloudpickle==3.0.0
# via loky # via loky
cmake==3.29.6 cmake==3.30.1
# via pyodide-build # via pyodide-build
distlib==0.3.8 distlib==0.3.8
# via virtualenv # via virtualenv
@@ -52,15 +52,15 @@ packaging==24.1
# build # build
# pyodide-build # pyodide-build
# unearth # unearth
pip==24.1.1 pip==24.2
# via -r .nox/update_constraints/tmp/constraints-pyodide.in # via -r .nox/update_constraints/tmp/constraints-pyodide.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
pydantic==2.8.0 pydantic==2.8.2
# via # via
# pyodide-build # pyodide-build
# pyodide-lock # pyodide-lock
pydantic-core==2.20.0 pydantic-core==2.20.1
# via pydantic # via pydantic
pygments==2.18.0 pygments==2.18.0
# via rich # via rich
@@ -100,14 +100,14 @@ typer==0.12.3
# auditwheel-emscripten # auditwheel-emscripten
# pyodide-build # pyodide-build
# pyodide-cli # pyodide-cli
types-requests==2.32.0.20240622 types-requests==2.32.0.20240712
# via pyodide-build # via pyodide-build
typing-extensions==4.12.2 typing-extensions==4.12.2
# via # via
# pydantic # pydantic
# pydantic-core # pydantic-core
# typer # typer
unearth==0.15.5 unearth==0.16.1
# via pyodide-build # via pyodide-build
urllib3==2.2.2 urllib3==2.2.2
# via # via
@@ -10,7 +10,7 @@ distlib==0.3.8
# via virtualenv # via virtualenv
filelock==3.15.4 filelock==3.15.4
# via virtualenv # via virtualenv
importlib-metadata==8.0.0 importlib-metadata==8.2.0
# via build # via build
macholib==1.16.3 macholib==1.16.3
# via delocate # via delocate
@@ -18,7 +18,7 @@ packaging==24.1
# via # via
# build # build
# delocate # delocate
pip==24.1.1 pip==24.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
@@ -16,7 +16,7 @@ packaging==24.1
# via # via
# build # build
# delocate # delocate
pip==24.1.1 pip==24.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
@@ -16,7 +16,7 @@ packaging==24.1
# via # via
# build # build
# delocate # delocate
pip==24.1.1 pip==24.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
@@ -16,7 +16,7 @@ packaging==24.1
# via # via
# build # build
# delocate # delocate
pip==24.1.1 pip==24.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
@@ -10,7 +10,7 @@ distlib==0.3.8
# via virtualenv # via virtualenv
filelock==3.15.4 filelock==3.15.4
# via virtualenv # via virtualenv
importlib-metadata==8.0.0 importlib-metadata==8.2.0
# via build # via build
macholib==1.16.3 macholib==1.16.3
# via delocate # via delocate
@@ -18,7 +18,7 @@ packaging==24.1
# via # via
# build # build
# delocate # delocate
pip==24.1.1 pip==24.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
@@ -10,7 +10,7 @@ distlib==0.3.8
# via virtualenv # via virtualenv
filelock==3.15.4 filelock==3.15.4
# via virtualenv # via virtualenv
importlib-metadata==8.0.0 importlib-metadata==8.2.0
# via build # via build
macholib==1.16.3 macholib==1.16.3
# via delocate # via delocate
@@ -18,7 +18,7 @@ packaging==24.1
# via # via
# build # build
# delocate # delocate
pip==24.1.1 pip==24.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
+1 -1
View File
@@ -16,7 +16,7 @@ packaging==24.1
# via # via
# build # build
# delocate # delocate
pip==24.1.1 pip==24.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
platformdirs==4.2.2 platformdirs==4.2.2
# via virtualenv # via virtualenv
+1 -1
View File
@@ -1,2 +1,2 @@
url = "https://nodejs.org/dist/" url = "https://nodejs.org/dist/"
v20 = "v20.15.0" v20 = "v20.16.0"
+24 -24
View File
@@ -1,54 +1,54 @@
[x86_64] [x86_64]
manylinux1 = quay.io/pypa/manylinux1_x86_64:2024-04-29-76807b8 manylinux1 = quay.io/pypa/manylinux1_x86_64:2024-04-29-76807b8
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-12-26-0d38463
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2024.07.02-0 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2024.08.03-1
musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2024.07.02-0 musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2024.08.03-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2024.07.02-0 musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2024.08.03-1
[i686] [i686]
manylinux1 = quay.io/pypa/manylinux1_i686:2024-04-29-76807b8 manylinux1 = quay.io/pypa/manylinux1_i686:2024-04-29-76807b8
manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_i686:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_i686:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463
musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2024.07.02-0 musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2024.08.03-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2024.07.02-0 musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2024.08.03-1
[pypy_x86_64] [pypy_x86_64]
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-12-26-0d38463
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2024.07.02-0 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2024.08.03-1
[pypy_i686] [pypy_i686]
manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_i686:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_i686:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463
[aarch64] [aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2024.07.02-0 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2024.08.03-1
musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2024.07.02-0 musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2024.08.03-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2024.07.02-0 musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2024.08.03-1
[ppc64le] [ppc64le]
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-12-26-0d38463
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2024.07.02-0 manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2024.08.03-1
musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2024.07.02-0 musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2024.08.03-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2024.07.02-0 musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2024.08.03-1
[s390x] [s390x]
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_s390x:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-12-26-0d38463
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2024.07.02-0 manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2024.08.03-1
musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2024.07.02-0 musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2024.08.03-1
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2024.07.02-0 musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2024.08.03-1
[pypy_aarch64] [pypy_aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2024.07.02-0 manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2024.08.03-1
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463 manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2024.07.02-0 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2024.08.03-1
+1 -32
View File
@@ -248,7 +248,7 @@ class BuildSelector:
requires_python: SpecifierSet | None = None requires_python: SpecifierSet | None = None
# a pattern that skips prerelease versions, when include_prereleases is False. # a pattern that skips prerelease versions, when include_prereleases is False.
PRERELEASE_SKIP: ClassVar[str] = "cp313-* cp313t-*" PRERELEASE_SKIP: ClassVar[str] = ""
prerelease_pythons: bool = False prerelease_pythons: bool = False
free_threaded_support: bool = False free_threaded_support: bool = False
@@ -462,37 +462,6 @@ class BuildFrontendConfig:
return {"name": self.name, "args": repr(self.args)} return {"name": self.name, "args": repr(self.args)}
class NonPlatformWheelError(Exception):
def __init__(self) -> None:
message = textwrap.dedent(
"""
cibuildwheel: Build failed because a pure Python wheel was generated.
If you intend to build a pure-Python wheel, you don't need cibuildwheel - use
`pip wheel -w DEST_DIR .` instead.
If you expected a platform wheel, check your project configuration, or run
cibuildwheel with CIBW_BUILD_VERBOSITY=1 to view build logs.
"""
)
super().__init__(message)
class AlreadyBuiltWheelError(Exception):
def __init__(self, wheel_name: str) -> None:
message = textwrap.dedent(
f"""
cibuildwheel: Build failed because a wheel named {wheel_name} was already generated in the current run.
If you expected another wheel to be generated, check your project configuration, or run
cibuildwheel with CIBW_BUILD_VERBOSITY=1 to view build logs.
"""
)
super().__init__(message)
def strtobool(val: str) -> bool: def strtobool(val: str) -> bool:
return val.lower() in {"y", "yes", "t", "true", "on", "1"} return val.lower() in {"y", "yes", "t", "true", "on", "1"}
+20 -8
View File
@@ -22,11 +22,9 @@ from .options import Options
from .typing import PathOrStr from .typing import PathOrStr
from .util import ( from .util import (
CIBW_CACHE_PATH, CIBW_CACHE_PATH,
AlreadyBuiltWheelError,
BuildFrontendConfig, BuildFrontendConfig,
BuildFrontendName, BuildFrontendName,
BuildSelector, BuildSelector,
NonPlatformWheelError,
call, call,
combine_constraints, combine_constraints,
download, download,
@@ -154,6 +152,16 @@ def setup_setuptools_cross_compile(
# set the platform name # set the platform name
map_plat = {"32": "win32", "64": "win-amd64", "ARM64": "win-arm64"} map_plat = {"32": "win32", "64": "win-amd64", "ARM64": "win-arm64"}
plat_name = map_plat[python_configuration.arch] plat_name = map_plat[python_configuration.arch]
# Set environment variable so that setuptools._distutils.get_platform()
# identifies the target, not the host
vscmd_arg_tgt_arch = {"32": "x86", "64": "x64", "ARM64": "arm64"}
current_tgt_arch = vscmd_arg_tgt_arch[python_configuration.arch]
if (env.get("VSCMD_ARG_TGT_ARCH") or current_tgt_arch) != current_tgt_arch:
msg = f"VSCMD_ARG_TGT_ARCH must be set to {current_tgt_arch!r}, got {env['VSCMD_ARG_TGT_ARCH']!r}. If you're setting up MSVC yourself (e.g. using vcvarsall.bat or msvc-dev-cmd), make sure to target the right architecture. Alternatively, run cibuildwheel without configuring MSVC, and let the build backend handle it."
raise errors.FatalError(msg)
env["VSCMD_ARG_TGT_ARCH"] = current_tgt_arch
# (This file must be default/locale encoding, so we can't pass 'encoding') # (This file must be default/locale encoding, so we can't pass 'encoding')
distutils_cfg.write_text( distutils_cfg.write_text(
textwrap.dedent( textwrap.dedent(
@@ -246,8 +254,10 @@ def setup_python(
raise ValueError(msg) raise ValueError(msg)
assert base_python.exists() assert base_python.exists()
use_uv = build_frontend == "build[uv]" and Version(python_configuration.version) >= Version( use_uv = (
"3.8" build_frontend == "build[uv]"
and Version(python_configuration.version) >= Version("3.8")
and not python_configuration.identifier.startswith("pp38-")
) )
uv_path = find_uv() uv_path = find_uv()
@@ -358,8 +368,10 @@ def build(options: Options, tmp_path: Path) -> None:
for config in python_configurations: for config in python_configurations:
build_options = options.build_options(config.identifier) build_options = options.build_options(config.identifier)
build_frontend = build_options.build_frontend or BuildFrontendConfig("pip") build_frontend = build_options.build_frontend or BuildFrontendConfig("pip")
use_uv = build_frontend.name == "build[uv]" and Version(config.version) >= Version( use_uv = (
"3.8" build_frontend.name == "build[uv]"
and Version(config.version) >= Version("3.8")
and not config.identifier.startswith("pp38-")
) )
log.build_start(config.identifier) log.build_start(config.identifier)
@@ -462,7 +474,7 @@ def build(options: Options, tmp_path: Path) -> None:
repaired_wheel_dir.mkdir() repaired_wheel_dir.mkdir()
if built_wheel.name.endswith("none-any.whl"): if built_wheel.name.endswith("none-any.whl"):
raise NonPlatformWheelError() raise errors.NonPlatformWheelError()
if build_options.repair_command: if build_options.repair_command:
log.step("Repairing wheel...") log.step("Repairing wheel...")
@@ -478,7 +490,7 @@ def build(options: Options, tmp_path: Path) -> None:
repaired_wheel = next(repaired_wheel_dir.glob("*.whl")) repaired_wheel = next(repaired_wheel_dir.glob("*.whl"))
if repaired_wheel.name in {wheel.name for wheel in built_wheels}: if repaired_wheel.name in {wheel.name for wheel in built_wheels}:
raise AlreadyBuiltWheelError(repaired_wheel.name) raise errors.AlreadyBuiltWheelError(repaired_wheel.name)
test_selected = options.globals.test_selector(config.identifier) test_selected = options.globals.test_selector(config.identifier)
if test_selected and config.arch == "ARM64" != platform_module.machine(): if test_selected and config.arch == "ARM64" != platform_module.machine():
+11 -1
View File
@@ -4,6 +4,16 @@ title: Changelog
# Changelog # Changelog
### v2.20.0
- 🌟 CPython 3.13 wheels are now built by default - without the `CIBW_PRERELEASE_PYTHONS` flag. It's time to build and upload these wheels to PyPI! This release includes CPython 3.13.0rc1, which is guaranteed to be ABI compatible with the final release. Free-threading is still behind a flag/config option. (#1950)
- ✨ Provide a `CIBW_ALLOW_EMPTY` environment variable as an alternative to the command line flag. (#1937)
- 🐛 Don't use uv on PyPy3.8 on Windows, it stopped working starting in 0.2.25. Note that PyPy 3.8 is EoL. (#1868)
- 🛠 Set the `VSCMD_ARG_TGT_ARCH` variable based on target arch. (#1876)
- 🛠 Undo cleaner output on pytest 8-8.2 now that 8.3 is out. (#1943)
- 📚 Update examples to use Python 3.12 on host (cibuildwheel will require Python 3.11+ on the host machine starting in October 2024) (#1919)
### v2.19.2 ### v2.19.2
- 🐛 Update manylinux2014 pins to versions that support past-EoL CentOS 7 mirrors. (#1917) - 🐛 Update manylinux2014 pins to versions that support past-EoL CentOS 7 mirrors. (#1917)
@@ -12,7 +22,7 @@ title: Changelog
- 🛠 Provide CPython 3.13.0b3. (#1913) - 🛠 Provide CPython 3.13.0b3. (#1913)
- 🛠 Remove some workarounds now that pip 21.1 is available. (#1891, #1892) - 🛠 Remove some workarounds now that pip 21.1 is available. (#1891, #1892)
- 📚 Remove nosetest from our docs. (#1821) - 📚 Remove nosetest from our docs. (#1821)
- 📚 Document the macOS ARM workaround for 3.8 on GHA. (#1971) - 📚 Document the macOS ARM workaround for 3.8 on GHA. (#1871)
- 📚 GitLab CI + macOS is now a supported platform with an example. (#1911) - 📚 GitLab CI + macOS is now a supported platform with an example. (#1911)
+1 -1
View File
@@ -109,7 +109,7 @@ You can see a list of sessions by typing `nox -l`; here are a few common ones:
```console ```console
nox -s lint # Run the linters (default) nox -s lint # Run the linters (default)
nox -s tests [-- PYTEST-ARGS] # Run the tests (default) nox -s tests [-- PYTEST-ARGS] # Run the tests (default)
nox -s docs -- serve # Build and serve the documentation nox -s docs # Build and serve the documentation
nox -s build # Make SDist and wheel nox -s build # Make SDist and wheel
``` ```
+3 -3
View File
@@ -142,7 +142,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@v2.19.2 uses: pypa/cibuildwheel@v2.20.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. 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.
@@ -164,7 +164,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==2.19.2 cibuildwheel==2.20.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: 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:
@@ -328,7 +328,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==2.19.2 --output-dir wheelhouse pipx run cibuildwheel==2.20.0 --output-dir wheelhouse
pipx run twine upload wheelhouse/*.whl pipx run twine upload wheelhouse/*.whl
``` ```
+23 -1
View File
@@ -621,6 +621,28 @@ This option can also be set using the [command-line option](#command-line) `--pr
CIBW_PRERELEASE_PYTHONS: True CIBW_PRERELEASE_PYTHONS: True
``` ```
### `CIBW_ALLOW_EMPTY` {: #allow-empty}
> Suppress the error code if no wheels match the specified build identifiers
When none of the specified build identifiers match any available versions,
cibuildwheel will typically return error code 3, indicating that there are
no wheels to build. Enabling this option will suppress this error, allowing
the build process to complete without signaling an error.
Default: Off (0). Error code 3 is returned when no builds are selected.
This option can also be set using the [command-line option](#command-line)
`--allow-empty`. This option is not available in the `pyproject.toml` config.
#### Examples
!!! tab examples "Environment variables"
```yaml
# Prevent an error code if the build does not match any wheels
CIBW_ALLOW_EMPTY: True
```
## Build customization ## Build customization
### `CIBW_BUILD_FRONTEND` {: #build-frontend} ### `CIBW_BUILD_FRONTEND` {: #build-frontend}
@@ -1667,7 +1689,7 @@ cibuildwheel exits 0 on success, or >0 if an error occurs.
Specific error codes are defined: Specific error codes are defined:
- 2 means a configuration error - 2 means a configuration error
- 3 means no builds are selected (and --allow-empty wasn't passed) - 3 means no builds are selected (and [`--allow-empty`](#allow-empty) wasn't passed)
- 4 means you specified an option that has been deprecated. - 4 means you specified an option that has been deprecated.
+2 -2
View File
@@ -161,7 +161,7 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build wheels - name: Build wheels
run: pipx run cibuildwheel==2.19.2 run: pipx run cibuildwheel==2.20.0
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
@@ -198,7 +198,7 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
- name: Install cibuildwheel - name: Install cibuildwheel
run: python -m pip install cibuildwheel==2.19.2 run: python -m pip install cibuildwheel==2.20.0
- name: Build wheels - name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse run: python -m cibuildwheel --output-dir wheelhouse
+12 -12
View File
@@ -38,7 +38,6 @@ title: Working examples
| [UltraJSON][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Ultra fast JSON decoder and encoder written in C with Python bindings | | [UltraJSON][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Ultra fast JSON decoder and encoder written in C with Python bindings |
| [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. | | [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. | | [aiortc][] | ![github icon][] | ![apple icon][] ![linux icon][] | WebRTC and ORTC implementation for Python using asyncio. |
| [Confluent client for Kafka][] | ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | setup in `tools/wheels/build-wheels.bat` |
| [Dependency Injector][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Dependency injection framework for Python, uses Windows TravisCI | | [Dependency Injector][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Dependency injection framework for Python, uses Windows TravisCI |
| [pyzmq][] | ![github icon][] ![circleci 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 CircleCI. | | [pyzmq][] | ![github icon][] ![circleci 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 CircleCI. |
| [Implicit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes GPU support for linux wheels | | [Implicit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes GPU support for linux wheels |
@@ -62,14 +61,14 @@ title: Working examples
| [ruptures][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Extensive Cython + NumPy [pyproject.toml](https://github.com/deepcharles/ruptures/blob/master/pyproject.toml) example. | | [ruptures][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Extensive Cython + NumPy [pyproject.toml](https://github.com/deepcharles/ruptures/blob/master/pyproject.toml) example. |
| [OpenTimelineIO][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Open Source API and interchange format for editorial timeline information. | | [OpenTimelineIO][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Open Source API and interchange format for editorial timeline information. |
| [PyTables][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python package to manage extremely large amounts of data | | [PyTables][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python package to manage extremely large amounts of 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. |
| [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric 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. |
| [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) | | [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) |
| [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. | | [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system | | [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system |
| [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. |
| [time-machine][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Time mocking library using only the CPython C API. | | [time-machine][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Time mocking library using only the CPython C API. |
| [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. | | [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 | | [Rtree][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Rtree: spatial index for Python GIS |
| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a CMake-based build system | | [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a CMake-based build system |
@@ -90,12 +89,12 @@ title: Working examples
| [PyGLM][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Fast OpenGL Mathematics (GLM) for Python | | [PyGLM][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Fast OpenGL Mathematics (GLM) for Python |
| [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. | | [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. |
| [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. | | [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython |
| [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 |
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. | | [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. |
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
| [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 |
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
| [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 |
| [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. |
| [fathon][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | python package for DFA (Detrended Fluctuation Analysis) and related algorithms | | [fathon][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | python package for DFA (Detrended Fluctuation Analysis) and related algorithms |
@@ -107,6 +106,7 @@ title: Working examples
| [cf-units][] | ![github icon][] | ![apple icon][] ![linux icon][] | Units of measure as required by the Climate and Forecast (CF) Metadata Conventions | | [cf-units][] | ![github icon][] | ![apple icon][] ![linux icon][] | Units of measure as required by the Climate and Forecast (CF) Metadata Conventions |
| [ninja][] | ![github icon][] ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Multitagged binary builds for all supported platforms, using cibw 2 config configuration. | | [ninja][] | ![github icon][] ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Multitagged binary builds for all supported platforms, using cibw 2 config configuration. |
| [numpythia][] | ![github icon][] | ![apple icon][] ![linux icon][] | The interface between PYTHIA and NumPy | | [numpythia][] | ![github icon][] | ![apple icon][] ![linux icon][] | The interface between PYTHIA and NumPy |
| [Confluent client for Kafka][] | ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | setup in `tools/wheels/build-wheels.bat` |
| [pyjet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The interface between FastJet and NumPy | | [pyjet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The interface between FastJet and NumPy |
| [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. | | [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. |
| [GSD][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Cython and NumPy project with 64-bit wheels. | | [GSD][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Cython and NumPy project with 64-bit wheels. |
@@ -114,8 +114,8 @@ title: Working examples
| [aalink][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Async Python interface for Ableton Link. | | [aalink][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Async Python interface for Ableton Link. |
| [CorrectionLib][] | ![github icon][] | ![apple icon][] ![linux icon][] | Structured JSON powered correction library for HEP, designed for the CMS experiment at CERN. | | [CorrectionLib][] | ![github icon][] | ![apple icon][] ![linux icon][] | Structured JSON powered correction library for HEP, designed for the CMS experiment at CERN. |
| [xmlstarlet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python 3.6+ CFFI bindings with true MSVC build. | | [xmlstarlet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python 3.6+ CFFI bindings with true MSVC build. |
| [pyinstrument_cext][] | ![travisci icon][] ![appveyor icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A simple C extension, without external dependencies |
| [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). | | [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). |
| [pyinstrument_cext][] | ![travisci icon][] ![appveyor icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A simple C extension, without external dependencies |
| [pybind11 cross build example][] | ![github icon][] ![gitlab icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Same as pybind11 cmake_example but used to demo Linux ARM + Windows + macOS builds on GitLab | | [pybind11 cross build example][] | ![github icon][] ![gitlab icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Same as pybind11 cmake_example but used to demo Linux ARM + Windows + macOS builds on GitLab |
[scikit-learn]: https://github.com/scikit-learn/scikit-learn [scikit-learn]: https://github.com/scikit-learn/scikit-learn
@@ -148,7 +148,6 @@ title: Working examples
[UltraJSON]: https://github.com/ultrajson/ultrajson [UltraJSON]: https://github.com/ultrajson/ultrajson
[OpenSpiel]: https://github.com/google-deepmind/open_spiel [OpenSpiel]: https://github.com/google-deepmind/open_spiel
[aiortc]: https://github.com/aiortc/aiortc [aiortc]: https://github.com/aiortc/aiortc
[Confluent client for Kafka]: https://github.com/confluentinc/confluent-kafka-python
[Dependency Injector]: https://github.com/ets-labs/python-dependency-injector [Dependency Injector]: https://github.com/ets-labs/python-dependency-injector
[pyzmq]: https://github.com/zeromq/pyzmq [pyzmq]: https://github.com/zeromq/pyzmq
[Implicit]: https://github.com/benfred/implicit [Implicit]: https://github.com/benfred/implicit
@@ -172,14 +171,14 @@ title: Working examples
[ruptures]: https://github.com/deepcharles/ruptures [ruptures]: https://github.com/deepcharles/ruptures
[OpenTimelineIO]: https://github.com/AcademySoftwareFoundation/OpenTimelineIO [OpenTimelineIO]: https://github.com/AcademySoftwareFoundation/OpenTimelineIO
[PyTables]: https://github.com/PyTables/PyTables [PyTables]: https://github.com/PyTables/PyTables
[Parselmouth]: https://github.com/YannickJadoul/Parselmouth
[google neuroglancer]: https://github.com/google/neuroglancer [google neuroglancer]: https://github.com/google/neuroglancer
[Parselmouth]: https://github.com/YannickJadoul/Parselmouth
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest [DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[AutoPy]: https://github.com/autopilot-rs/autopy [AutoPy]: https://github.com/autopilot-rs/autopy
[H3-py]: https://github.com/uber/h3-py [H3-py]: https://github.com/uber/h3-py
[mosec]: https://github.com/mosecorg/mosec [mosec]: https://github.com/mosecorg/mosec
[Picologging]: https://github.com/microsoft/picologging
[time-machine]: https://github.com/adamchainz/time-machine [time-machine]: https://github.com/adamchainz/time-machine
[Picologging]: https://github.com/microsoft/picologging
[markupsafe]: https://github.com/pallets/markupsafe [markupsafe]: https://github.com/pallets/markupsafe
[Rtree]: https://github.com/Toblerity/rtree [Rtree]: https://github.com/Toblerity/rtree
[pybind11 cmake_example]: https://github.com/pybind/cmake_example [pybind11 cmake_example]: https://github.com/pybind/cmake_example
@@ -200,12 +199,12 @@ title: Working examples
[PyGLM]: https://github.com/Zuzu-Typ/PyGLM [PyGLM]: https://github.com/Zuzu-Typ/PyGLM
[pillow-heif]: https://github.com/bigcat88/pillow_heif [pillow-heif]: https://github.com/bigcat88/pillow_heif
[TgCrypto]: https://github.com/pyrogram/tgcrypto [TgCrypto]: https://github.com/pyrogram/tgcrypto
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
[iDynTree]: https://github.com/robotology/idyntree [iDynTree]: https://github.com/robotology/idyntree
[streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data
[bx-python]: https://github.com/bxlab/bx-python [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
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model
[Python-WebRTC]: https://github.com/MarshalX/python-webrtc [Python-WebRTC]: https://github.com/MarshalX/python-webrtc
[power-grid-model]: https://github.com/PowerGridModel/power-grid-model
[pybase64]: https://github.com/mayeut/pybase64 [pybase64]: https://github.com/mayeut/pybase64
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build [Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
[fathon]: https://github.com/stfbnc/fathon [fathon]: https://github.com/stfbnc/fathon
@@ -217,6 +216,7 @@ title: Working examples
[cf-units]: https://github.com/SciTools/cf-units [cf-units]: https://github.com/SciTools/cf-units
[ninja]: https://github.com/scikit-build/ninja-python-distributions [ninja]: https://github.com/scikit-build/ninja-python-distributions
[numpythia]: https://github.com/scikit-hep/numpythia [numpythia]: https://github.com/scikit-hep/numpythia
[Confluent client for Kafka]: https://github.com/confluentinc/confluent-kafka-python
[pyjet]: https://github.com/scikit-hep/pyjet [pyjet]: https://github.com/scikit-hep/pyjet
[ril]: https://github.com/Cryptex-github/ril-py [ril]: https://github.com/Cryptex-github/ril-py
[GSD]: https://github.com/glotzerlab/gsd [GSD]: https://github.com/glotzerlab/gsd
@@ -224,8 +224,8 @@ title: Working examples
[aalink]: https://github.com/artfwo/aalink [aalink]: https://github.com/artfwo/aalink
[CorrectionLib]: https://github.com/cms-nanoAOD/correctionlib [CorrectionLib]: https://github.com/cms-nanoAOD/correctionlib
[xmlstarlet]: https://github.com/dimitern/xmlstarlet [xmlstarlet]: https://github.com/dimitern/xmlstarlet
[pyinstrument_cext]: https://github.com/joerick/pyinstrument_cext
[werpy]: https://github.com/analyticsinmotion/werpy [werpy]: https://github.com/analyticsinmotion/werpy
[pyinstrument_cext]: https://github.com/joerick/pyinstrument_cext
[pybind11 cross build example]: https://github.com/wbarnha/pybind_cmake_example_crossbuild [pybind11 cross build example]: https://github.com/wbarnha/pybind_cmake_example_crossbuild
[appveyor icon]: data/readme_icons/appveyor.svg [appveyor icon]: data/readme_icons/appveyor.svg
+1 -1
View File
@@ -12,7 +12,7 @@ stack: python 3.7
init: init:
- cmd: set PATH=C:\Python37;C:\Python37\Scripts;%PATH% - cmd: set PATH=C:\Python37;C:\Python37\Scripts;%PATH%
install: python -m pip install cibuildwheel==2.19.2 install: python -m pip install cibuildwheel==2.20.0
build_script: python -m cibuildwheel --output-dir wheelhouse build_script: python -m cibuildwheel --output-dir wheelhouse
+3 -3
View File
@@ -6,7 +6,7 @@ jobs:
- bash: | - bash: |
set -o errexit set -o errexit
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
pip3 install cibuildwheel==2.19.2 pip3 install cibuildwheel==2.20.0
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
@@ -20,7 +20,7 @@ jobs:
- 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==2.19.2 python3 -m pip install cibuildwheel==2.20.0
displayName: Install dependencies displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse . - bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels displayName: Build wheels
@@ -34,7 +34,7 @@ jobs:
- bash: | - bash: |
set -o errexit set -o errexit
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install cibuildwheel==2.19.2 pip install cibuildwheel==2.20.0
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==2.19.2 python3 -m pip install --user cibuildwheel==2.20.0
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==2.19.2 python3 -m pip install --user cibuildwheel==2.20.0
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==2.19.2 pip3 install cibuildwheel==2.20.0
cibuildwheel --output-dir wheelhouse cibuildwheel --output-dir wheelhouse
- store_artifacts: - store_artifacts:
path: wheelhouse/ path: wheelhouse/
+5 -4
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==2.19.2 - python -m pip install cibuildwheel==2.20.0
run_cibuildwheel_script: run_cibuildwheel_script:
- cibuildwheel - cibuildwheel
wheels_artifacts: wheels_artifacts:
@@ -11,10 +11,11 @@ macos_task:
name: Build macOS x86_64 and arm64 wheels. name: Build macOS x86_64 and arm64 wheels.
macos_instance: macos_instance:
image: ghcr.io/cirruslabs/macos-sonoma-xcode image: ghcr.io/cirruslabs/macos-sonoma-xcode
env: env:
PATH: /opt/homebrew/opt/python@3.10/libexec/bin:$PATH VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
CIBW_ARCHS_MACOS: x86_64 arm64 CIBW_ARCHS_MACOS: x86_64 arm64
install_pre_requirements_script: install_pre_requirements_script:
- brew install python@3.10 - brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
<<: *BUILD_AND_STORE_WHEELS <<: *BUILD_AND_STORE_WHEELS
+20 -9
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==2.19.2 - python -m pip install cibuildwheel==2.20.0
run_cibuildwheel_script: run_cibuildwheel_script:
- cibuildwheel - cibuildwheel
wheels_artifacts: wheels_artifacts:
@@ -15,9 +15,14 @@ linux_x86_task:
platform: linux platform: linux
cpu: 4 cpu: 4
memory: 4G memory: 4G
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script: install_pre_requirements_script:
- apt install -y python3-venv python-is-python3 - 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 <<: *BUILD_AND_STORE_WHEELS
linux_aarch64_task: linux_aarch64_task:
@@ -29,9 +34,14 @@ linux_aarch64_task:
platform: linux platform: linux
cpu: 4 cpu: 4
memory: 4G memory: 4G
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script: install_pre_requirements_script:
- apt install -y python3-venv python-is-python3 - 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 <<: *BUILD_AND_STORE_WHEELS
windows_x86_task: windows_x86_task:
@@ -42,7 +52,7 @@ windows_x86_task:
memory: 4G memory: 4G
install_pre_requirements_script: install_pre_requirements_script:
- choco install -y --no-progress python3 --version 3.10.6 - choco install -y --no-progress python3 --version 3.12.4
- refreshenv - refreshenv
- echo PATH=%PATH% >> "%CIRRUS_ENV%" - echo PATH=%PATH% >> "%CIRRUS_ENV%"
<<: *BUILD_AND_STORE_WHEELS <<: *BUILD_AND_STORE_WHEELS
@@ -51,9 +61,10 @@ macos_arm64_task:
name: Build macOS arm64 wheels. name: Build macOS arm64 wheels.
macos_instance: macos_instance:
image: ghcr.io/cirruslabs/macos-sonoma-xcode image: ghcr.io/cirruslabs/macos-sonoma-xcode
env: env:
PATH: /opt/homebrew/opt/python@3.10/libexec/bin:$PATH VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
install_pre_requirements_script: install_pre_requirements_script:
- brew install python@3.10 - brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
<<: *BUILD_AND_STORE_WHEELS <<: *BUILD_AND_STORE_WHEELS
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v2.19.2 uses: pypa/cibuildwheel@v2.20.0
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
+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@v2.19.2 uses: pypa/cibuildwheel@v2.20.0
# env: # env:
# CIBW_SOME_OPTION: value # CIBW_SOME_OPTION: value
# ... # ...
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
platforms: all platforms: all
- name: Build wheels - name: Build wheels
uses: pypa/cibuildwheel@v2.19.2 uses: pypa/cibuildwheel@v2.20.0
env: env:
# configure cibuildwheel to build native archs ('auto'), and some # configure cibuildwheel to build native archs ('auto'), and some
# emulated ones # emulated ones
+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==2.19.2 - python -m pip install cibuildwheel==2.20.0
- 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 --version 3.12.4 - choco install python -y --version 3.12.4
- choco install git.install -y - choco install git.install -y
- py -m pip install cibuildwheel==2.19.2 - py -m pip install cibuildwheel==2.20.0
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==2.19.2 - python3 -m pip install cibuildwheel==2.20.0
script: script:
- python3 -m cibuildwheel --output-dir wheelhouse - python3 -m cibuildwheel --output-dir wheelhouse
artifacts: artifacts:
+2 -2
View File
@@ -1,5 +1,5 @@
linux: linux:
image: python:3.8 image: python:3.12
# make a docker daemon available for cibuildwheel to use # make a docker daemon available for cibuildwheel to use
services: services:
- name: docker:dind - name: docker:dind
@@ -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==2.19.2 - python -m pip install cibuildwheel==2.20.0
# 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:
+5 -5
View File
@@ -4,7 +4,7 @@
os: linux os: linux
dist: focal dist: focal
language: python language: python
python: "3.9" python: "3.12"
jobs: jobs:
include: include:
@@ -14,13 +14,13 @@ jobs:
- os: windows - os: windows
language: shell language: shell
before_install: before_install:
- choco upgrade python -y --version 3.8.6 - choco upgrade python -y --version 3.12.4
- export PATH="/c/Python38:/c/Python38/Scripts:$PATH" - export PATH="/c/Python312:/c/Python312/Scripts:$PATH"
# make sure it's on PATH as 'python3' # make sure it's on PATH as 'python3'
- ln -s /c/Python38/python.exe /c/Python38/python3.exe - ln -s /c/Python312/python.exe /c/Python312/python3.exe
install: install:
- python3 -m pip install cibuildwheel==2.19.2 - python3 -m pip install cibuildwheel==2.20.0
script: script:
# build the wheels, put them into './dist' # build the wheels, put them into './dist'
+5 -5
View File
@@ -1,7 +1,7 @@
os: linux os: linux
dist: focal dist: focal
language: python language: python
python: "3.9" python: "3.12"
jobs: jobs:
include: include:
@@ -20,13 +20,13 @@ jobs:
- os: windows - os: windows
language: shell language: shell
before_install: before_install:
- choco upgrade python -y --version 3.8.6 - choco upgrade python -y --version 3.12.4
- export PATH="/c/Python38:/c/Python38/Scripts:$PATH" - export PATH="/c/Python312:/c/Python312/Scripts:$PATH"
# make sure it's on PATH as 'python3' # make sure it's on PATH as 'python3'
- ln -s /c/Python38/python.exe /c/Python38/python3.exe - ln -s /c/Python312/python.exe /c/Python312/python3.exe
install: install:
- python3 -m pip install cibuildwheel==2.19.2 - python3 -m pip install cibuildwheel==2.20.0
script: script:
# build the wheels, put them into './wheelhouse' # build the wheels, put them into './wheelhouse'
+6 -8
View File
@@ -8,17 +8,15 @@
os: linux os: linux
dist: focal dist: focal
language: python language: python
python: python: "3.12"
- 3.7
- 3.8
before_install: before_install:
- | - |
if [[ "$TRAVIS_OS_NAME" = windows ]]; then if [[ "$TRAVIS_OS_NAME" = windows ]]; then
choco upgrade python -y --version 3.8.6 choco upgrade python -y --version 3.12.4
export PATH="/c/Python38:/c/Python38/Scripts:$PATH" export PATH="/c/Python312:/c/Python312/Scripts:$PATH"
# make sure it's on PATH as 'python3' # make sure it's on PATH as 'python3'
ln -s /c/Python38/python.exe /c/Python38/python3.exe ln -s /c/Python312/python.exe /c/Python312/python3.exe
fi fi
install: install:
@@ -54,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==2.19.2 twine install: python3 -m pip install cibuildwheel==2.20.0 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
@@ -62,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==2.19.2 twine install: python3 -m pip install cibuildwheel==2.20.0 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
+5 -7
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project] [project]
name = "cibuildwheel" name = "cibuildwheel"
version = "2.19.2" version = "2.20.0"
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"
@@ -75,6 +75,7 @@ test = [
"pytest-timeout", "pytest-timeout",
"pytest-xdist", "pytest-xdist",
"pytest>=6", "pytest>=6",
"setuptools",
"tomli_w", "tomli_w",
"validate-pyproject", "validate-pyproject",
] ]
@@ -93,12 +94,7 @@ Homepage = "https://github.com/pypa/cibuildwheel"
[tool.pytest.ini_options] [tool.pytest.ini_options]
minversion = "6.0" minversion = "6.0"
addopts = [ addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
"-rfEsX", # TODO: replace with -ra when pytest > 8.2.2 is released
"--showlocals",
"--strict-markers",
"--strict-config",
]
junit_family = "xunit2" junit_family = "xunit2"
xfail_strict = true xfail_strict = true
filterwarnings = ["error"] filterwarnings = ["error"]
@@ -140,6 +136,8 @@ disallow_untyped_decorators = true
[[tool.mypy.overrides]] [[tool.mypy.overrides]]
module = [ module = [
"setuptools", "setuptools",
"setuptools._distutils", # needed even if only directly import setuptools._distutils.util
"setuptools._distutils.util",
"pytest", # ignored in pre-commit to speed up check "pytest", # ignored in pre-commit to speed up check
"bashlex", "bashlex",
"bashlex.*", "bashlex.*",
+11 -3
View File
@@ -69,7 +69,15 @@ def test_build_identifiers(tmp_path):
), f"{expected_wheels} vs {build_identifiers}" ), f"{expected_wheels} vs {build_identifiers}"
def test_allow_empty(tmp_path): @pytest.mark.parametrize(
("add_args", "env_allow_empty"),
[
(["--allow-empty"], {}),
(["--allow-empty"], {"CIBW_ALLOW_EMPTY": "0"}),
(None, {"CIBW_ALLOW_EMPTY": "1"}),
],
)
def test_allow_empty(tmp_path, add_args, env_allow_empty):
project_dir = tmp_path / "project" project_dir = tmp_path / "project"
basic_project.generate(project_dir) basic_project.generate(project_dir)
@@ -77,8 +85,8 @@ def test_allow_empty(tmp_path):
# without error # without error
actual_wheels = utils.cibuildwheel_run( actual_wheels = utils.cibuildwheel_run(
project_dir, project_dir,
add_env={"CIBW_BUILD": "BUILD_NOTHING_AT_ALL"}, add_env={"CIBW_BUILD": "BUILD_NOTHING_AT_ALL", **env_allow_empty},
add_args=["--allow-empty"], add_args=add_args,
) )
# check that nothing was built # check that nothing was built
+2 -1
View File
@@ -38,7 +38,7 @@ def test(tmp_path, capfd):
else: else:
expectation = does_not_raise() expectation = does_not_raise()
with expectation: with expectation as exc_info:
result = utils.cibuildwheel_run( result = utils.cibuildwheel_run(
project_dir, project_dir,
add_env={ add_env={
@@ -49,6 +49,7 @@ def test(tmp_path, capfd):
captured = capfd.readouterr() captured = capfd.readouterr()
if num_builds > 1: if num_builds > 1:
assert "Build failed because a wheel named" in captured.err assert "Build failed because a wheel named" in captured.err
assert exc_info.value.returncode == 6
else: else:
# We only produced one wheel (currently Pyodide) # We only produced one wheel (currently Pyodide)
# check that it has the right name # check that it has the right name
+2 -1
View File
@@ -31,10 +31,11 @@ def test(tmp_path, capfd):
project_dir = tmp_path / "project" project_dir = tmp_path / "project"
pure_python_project.generate(project_dir) pure_python_project.generate(project_dir)
with pytest.raises(subprocess.CalledProcessError): with pytest.raises(subprocess.CalledProcessError) as exc_info:
print("produced wheels:", utils.cibuildwheel_run(project_dir)) print("produced wheels:", utils.cibuildwheel_run(project_dir))
captured = capfd.readouterr() captured = capfd.readouterr()
print("out", captured.out) print("out", captured.out)
print("err", captured.err) print("err", captured.err)
assert exc_info.value.returncode == 5
assert "Build failed because a pure Python wheel was generated" in captured.err assert "Build failed because a pure Python wheel was generated" in captured.err
+2 -2
View File
@@ -13,7 +13,7 @@ def test_build():
assert build_selector("cp310-manylinux_x86_64") assert build_selector("cp310-manylinux_x86_64")
assert build_selector("cp311-manylinux_x86_64") assert build_selector("cp311-manylinux_x86_64")
assert build_selector("cp312-manylinux_x86_64") assert build_selector("cp312-manylinux_x86_64")
assert not build_selector("cp313-manylinux_x86_64") assert build_selector("cp313-manylinux_x86_64")
assert build_selector("pp36-manylinux_x86_64") assert build_selector("pp36-manylinux_x86_64")
assert build_selector("pp37-manylinux_x86_64") assert build_selector("pp37-manylinux_x86_64")
assert build_selector("cp36-manylinux_i686") assert build_selector("cp36-manylinux_i686")
@@ -34,7 +34,7 @@ def test_build():
assert build_selector("cp310-win_amd64") assert build_selector("cp310-win_amd64")
assert build_selector("cp311-win_amd64") assert build_selector("cp311-win_amd64")
assert build_selector("cp312-win_amd64") assert build_selector("cp312-win_amd64")
assert not build_selector("cp313-win_amd64") assert build_selector("cp313-win_amd64")
assert not build_selector("pp36-win_amd64") assert not build_selector("pp36-win_amd64")
assert not build_selector("pp37-win_amd64") assert not build_selector("pp37-win_amd64")
+92
View File
@@ -0,0 +1,92 @@
import contextlib
import sys
from pathlib import Path
from typing import Dict
import pytest
import setuptools._distutils.util
from cibuildwheel.errors import FatalError
from cibuildwheel.util import CIProvider, detect_ci_provider
from cibuildwheel.windows import PythonConfiguration, setup_setuptools_cross_compile
# monkeypatching os.name is too flaky. E.g. It works on my machine, but fails in pipeline
if not sys.platform.startswith("win"):
pytest.skip("Windows-only tests", allow_module_level=True)
@contextlib.contextmanager
def patched_environment(monkeypatch: pytest.MonkeyPatch, environment: Dict[str, str]):
with monkeypatch.context() as mp:
for envvar, val in environment.items():
mp.setenv(name=envvar, value=val)
yield
def test_x86(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
arch = "32"
environment: Dict[str, str] = {}
configuration = PythonConfiguration("irrelevant", arch, "irrelevant", None)
setup_setuptools_cross_compile(tmp_path, configuration, tmp_path, environment)
with patched_environment(monkeypatch, environment):
target_platform = setuptools._distutils.util.get_platform()
assert environment["VSCMD_ARG_TGT_ARCH"] == "x86"
assert target_platform == "win32"
def test_x64(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
arch = "64"
environment: Dict[str, str] = {}
configuration = PythonConfiguration("irrelevant", arch, "irrelevant", None)
setup_setuptools_cross_compile(tmp_path, configuration, tmp_path, environment)
with patched_environment(monkeypatch, environment):
target_platform = setuptools._distutils.util.get_platform()
assert environment["VSCMD_ARG_TGT_ARCH"] == "x64"
assert target_platform == "win-amd64"
@pytest.mark.skipif(
detect_ci_provider() == CIProvider.azure_pipelines, reason="arm64 not recognised on azure"
)
def test_arm(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
arch = "ARM64"
environment: Dict[str, str] = {}
configuration = PythonConfiguration("irrelevant", arch, "irrelevant", None)
setup_setuptools_cross_compile(tmp_path, configuration, tmp_path, environment)
with patched_environment(monkeypatch, environment):
target_platform = setuptools._distutils.util.get_platform()
assert environment["VSCMD_ARG_TGT_ARCH"] == "arm64"
assert target_platform == "win-arm64"
def test_env_set(tmp_path: Path):
arch = "32"
environment = {"VSCMD_ARG_TGT_ARCH": "x64"}
configuration = PythonConfiguration("irrelevant", arch, "irrelevant", None)
with pytest.raises(FatalError, match="VSCMD_ARG_TGT_ARCH"):
setup_setuptools_cross_compile(tmp_path, configuration, tmp_path, environment)
def test_env_blank(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
arch = "32"
environment = {"VSCMD_ARG_TGT_ARCH": ""}
configuration = PythonConfiguration("irrelevant", arch, "irrelevant", None)
setup_setuptools_cross_compile(tmp_path, configuration, tmp_path, environment)
with patched_environment(monkeypatch, environment):
target_platform = setuptools._distutils.util.get_platform()
assert environment["VSCMD_ARG_TGT_ARCH"] == "x86"
assert target_platform == "win32"
+3 -2
View File
@@ -71,9 +71,10 @@ def test_linux_container_split(tmp_path: Path, monkeypatch):
"cp36-manylinux_x86_64", "cp36-manylinux_x86_64",
"cp311-manylinux_x86_64", "cp311-manylinux_x86_64",
"cp312-manylinux_x86_64", "cp312-manylinux_x86_64",
"cp313-manylinux_x86_64",
] ]
assert before_alls(build_steps[0]) == [""] * 3 assert before_alls(build_steps[0]) == [""] * 4
assert container_engines(build_steps[0]) == [default_container_engine] * 3 assert container_engines(build_steps[0]) == [default_container_engine] * 4
assert build_steps[1].container_image == "other_container_image" assert build_steps[1].container_image == "other_container_image"
assert identifiers(build_steps[1]) == ["cp37-manylinux_x86_64", "cp38-manylinux_x86_64"] assert identifiers(build_steps[1]) == ["cp37-manylinux_x86_64", "cp38-manylinux_x86_64"]
+4 -2
View File
@@ -21,6 +21,7 @@ ALL_IDS = {
"cp310", "cp310",
"cp311", "cp311",
"cp312", "cp312",
"cp313",
"pp37", "pp37",
"pp38", "pp38",
"pp39", "pp39",
@@ -155,7 +156,8 @@ before-all = "true"
identifiers = {x.identifier for x in kwargs["platform_configs"]} identifiers = {x.identifier for x in kwargs["platform_configs"]}
assert identifiers == { assert identifiers == {
f"{x}-manylinux_x86_64" f"{x}-manylinux_x86_64"
for x in ALL_IDS - {"cp36", "cp310", "cp311", "cp312", "pp37", "pp38", "pp39", "pp310"} for x in ALL_IDS
- {"cp36", "cp310", "cp311", "cp312", "cp313", "pp37", "pp38", "pp39", "pp310"}
} }
assert kwargs["options"].build_options("cp37-manylinux_x86_64").before_all == "" assert kwargs["options"].build_options("cp37-manylinux_x86_64").before_all == ""
@@ -166,7 +168,7 @@ before-all = "true"
identifiers = {x.identifier for x in kwargs["platform_configs"]} identifiers = {x.identifier for x in kwargs["platform_configs"]}
assert identifiers == { assert identifiers == {
f"{x}-manylinux_x86_64" f"{x}-manylinux_x86_64"
for x in ["cp310", "cp311", "cp312", "pp37", "pp38", "pp39", "pp310"] for x in ["cp310", "cp311", "cp312", "cp313", "pp37", "pp38", "pp39", "pp310"]
} }
kwargs = build_in_container.call_args_list[3][1] kwargs = build_in_container.call_args_list[3][1]