diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 30772612..325eaac5 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -34,7 +34,7 @@ jobs:
name: artifact
path: dist
- - uses: pypa/gh-action-pypi-publish@v1.5.0
+ - uses: pypa/gh-action-pypi-publish@v1.5.1
with:
user: __token__
password: ${{ secrets.pypi_password }}
diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml
index 208b36c4..2b15fbb7 100644
--- a/.github/workflows/update-dependencies.yml
+++ b/.github/workflows/update-dependencies.yml
@@ -1,6 +1,15 @@
name: Update dependencies
on:
+ pull_request:
+ paths:
+ - '.github/workflows/update-dependencies.yml'
+ - 'bin/update_pythons.py'
+ - 'bin/update_docker.py'
+ - 'bin/update_virtualenv.py'
+ - 'bin/projects.py'
+ - 'docs/data/projects.yml'
+ - 'noxfile.py'
workflow_dispatch:
schedule:
- cron: '0 6 * * 1' # "At 06:00 on Monday."
@@ -12,10 +21,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- - uses: actions/setup-python@v4
+
+ - uses: wntrblm/nox@2022.8.7
with:
- python-version: "3.11-dev"
- - uses: excitedleigh/setup-nox@v2.1.0
+ python-versions: "3.6, 3.7, 3.8, 3.9, 3.10, 3.11-dev"
- name: "Run update: dependencies"
run: nox --force-color -s update_constraints
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c3e480da..41f2bcaa 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -14,7 +14,7 @@ repos:
- id: trailing-whitespace
- repo: https://github.com/asottile/pyupgrade
- rev: v2.37.2
+ rev: v2.37.3
hooks:
- id: pyupgrade
args: ["--py37-plus"]
@@ -22,7 +22,7 @@ repos:
# Autoremoves unused imports
- repo: https://github.com/hadialqattan/pycln
- rev: v2.0.4
+ rev: v2.1.1
hooks:
- id: pycln
args: [--all]
@@ -41,9 +41,10 @@ repos:
- id: black
- repo: https://github.com/asottile/setup-cfg-fmt
- rev: v1.20.2
+ rev: v2.0.0
hooks:
- id: setup-cfg-fmt
+ args: [--include-version-classifiers, --max-py-version=3.10]
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.971
@@ -73,14 +74,14 @@ repos:
additional_dependencies: *mypy-dependencies
- repo: https://github.com/asottile/yesqa
- rev: v1.3.0
+ rev: v1.4.0
hooks:
- id: yesqa
additional_dependencies: &flake8-dependencies
- flake8-bugbear
- repo: https://github.com/PyCQA/flake8
- rev: 4.0.1
+ rev: 5.0.4
hooks:
- id: flake8
exclude: cibuildwheel/resources/
diff --git a/README.md b/README.md
index fecef336..162ae0c6 100644
--- a/README.md
+++ b/README.md
@@ -29,7 +29,7 @@ What does it do?
| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅³ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
-| CPython 3.11⁴ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
+| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
| PyPy 3.7 v7.3 | ✅ | N/A | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A |
| PyPy 3.8 v7.3 | ✅ | N/A | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A |
| PyPy 3.9 v7.3 | ✅ | N/A | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A |
@@ -37,7 +37,6 @@ What does it do?
¹ PyPy is only supported for manylinux wheels.
² Windows arm64 support is experimental.
³ Alpine 3.14 and very briefly 3.15's default python3 [was not able to load](https://github.com/pypa/cibuildwheel/issues/934) musllinux wheels. This has been fixed; please upgrade the python package if using Alpine from before the fix.
-⁴ CPython 3.11 is available using the [CIBW_PRERELEASE_PYTHONS](https://cibuildwheel.readthedocs.io/en/stable/options/#prerelease-pythons) option.
- Builds manylinux, musllinux, macOS 10.9+, and Windows wheels for CPython and PyPy
- Works on GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, and GitLab CI
@@ -89,7 +88,7 @@ jobs:
- uses: actions/setup-python@v3
- name: Install cibuildwheel
- run: python -m pip install cibuildwheel==2.8.1
+ run: python -m pip install cibuildwheel==2.9.0
- name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse
@@ -204,6 +203,15 @@ Changelog
+### v2.9.0
+
+_11 August 2022_
+
+- 🌟 CPython 3.11 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.11.0rc1, which is guaranteed to be ABI compatible with the final release. (#1226)
+- ⚠️ Removed support for running cibuildwheel in Python 3.6. Python 3.6 is EOL. However, cibuildwheel continues to build CPython 3.6 wheels for the moment. (#1175)
+- ✨ Improved error messages when misspelling TOML options, suggesting close matches (#1205)
+- 🛠 When running on Apple Silicon (so far, an unsupported mode of operation), cibuildwheel no longer builds universal2 wheels by default - just arm64. See [#1204](https://github.com/pypa/cibuildwheel/issues/1204) for discussion. We hope to release official support for native builds on Apple Silicon soon! (#1217)
+
### v2.8.1
_18 July 2022_
@@ -241,13 +249,6 @@ _7 June 2022_
- 🛠 Update the prerelease CPython 3.11 to 3.11.0b3
-### v2.6.0
-
-_25 May 2022_
-
-- 🌟 Added the ability to test building wheels on CPython 3.11! Because CPython 3.11 is in beta, these wheels should not be distributed, because they might not be compatible with the final release, but it's available to build for testing purposes. Use the flag [`--prerelease-pythons` or `CIBW_PRERELEASE_PYTHONS`](https://cibuildwheel.readthedocs.io/en/stable/options/#prerelease-pythons) to test. This version of cibuildwheel includes CPython 3.11.0b1. (#1109)
-- 📚 Added an interactive diagram showing how cibuildwheel works to the [docs](https://cibuildwheel.readthedocs.io/en/stable/#how-it-works) (#1100)
-
---
@@ -272,6 +273,7 @@ Maintainers
- Yannick Jadoul [@YannickJadoul](https://github.com/YannickJadoul)
- Matthieu Darbois [@mayeut](https://github.com/mayeut)
- Henry Schreiner [@henryiii](https://github.com/henryiii)
+- Grzegorz Bokota [@Czaki](https://github.com/Czaki)
Credits
-------
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index f8142ce8..70275815 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -7,7 +7,7 @@ jobs:
inputs:
versionSpec: '3.8'
- bash: |
- python -m pip install -e ".[dev]" pytest-azurepipelines
+ python -m pip install -e ".[dev]"
python ./bin/run_tests.py
- job: macos_38
@@ -17,7 +17,7 @@ jobs:
inputs:
versionSpec: '3.8'
- bash: |
- python -m pip install -e ".[dev]" pytest-azurepipelines
+ python -m pip install -e ".[dev]"
python ./bin/run_tests.py
- job: windows_38
@@ -28,5 +28,5 @@ jobs:
inputs:
versionSpec: '3.8'
- bash: |
- python -m pip install -e ".[dev]" pytest-azurepipelines
+ python -m pip install -e ".[dev]"
python ./bin/run_tests.py
diff --git a/bin/update_dependencies.py b/bin/update_dependencies.py
deleted file mode 100755
index c0d7f200..00000000
--- a/bin/update_dependencies.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env python3
-
-from __future__ import annotations
-
-import os
-import shutil
-import subprocess
-import sys
-from pathlib import Path
-
-DIR = Path(__file__).parent.resolve()
-RESOURCES = DIR.parent / "cibuildwheel/resources"
-
-python_version = "".join(str(v) for v in sys.version_info[:2])
-
-env = os.environ.copy()
-
-# CUSTOM_COMPILE_COMMAND is a pip-compile option that tells users how to
-# regenerate the constraints files
-env["CUSTOM_COMPILE_COMMAND"] = "bin/update_dependencies.py"
-
-os.chdir(DIR.parent)
-
-subprocess.run(
- [
- "pip-compile",
- "--allow-unsafe",
- "--upgrade",
- "cibuildwheel/resources/constraints.in",
- f"--output-file=cibuildwheel/resources/constraints-python{python_version}.txt",
- ],
- check=True,
- env=env,
-)
-
-# default constraints.txt
-if python_version == "39":
- shutil.copyfile(
- RESOURCES / f"constraints-python{python_version}.txt",
- RESOURCES / "constraints.txt",
- )
diff --git a/cibuildwheel/__init__.py b/cibuildwheel/__init__.py
index b923f228..a4f6f370 100644
--- a/cibuildwheel/__init__.py
+++ b/cibuildwheel/__init__.py
@@ -1,3 +1,3 @@
from __future__ import annotations
-__version__ = "2.8.1"
+__version__ = "2.9.0"
diff --git a/cibuildwheel/architecture.py b/cibuildwheel/architecture.py
index 82a78b30..7b90ff94 100644
--- a/cibuildwheel/architecture.py
+++ b/cibuildwheel/architecture.py
@@ -66,10 +66,6 @@ class Architecture(Enum):
if platform == "windows" and native_architecture == Architecture.AMD64:
result.add(Architecture.x86)
- if platform == "macos" and native_architecture == Architecture.arm64:
- # arm64 can build and test both archs of a universal2 wheel.
- result.add(Architecture.universal2)
-
return result
@staticmethod
diff --git a/cibuildwheel/options.py b/cibuildwheel/options.py
index 30803604..c8d050fa 100644
--- a/cibuildwheel/options.py
+++ b/cibuildwheel/options.py
@@ -1,5 +1,6 @@
from __future__ import annotations
+import difflib
import functools
import os
import sys
@@ -188,14 +189,10 @@ class OptionsReader:
# Validate project config
for option_name in config_options:
- if not self._is_valid_global_option(option_name):
- raise ConfigOptionError(f'Option "{option_name}" not supported in a config file')
+ self._validate_global_option(option_name)
for option_name in config_platform_options:
- if not self._is_valid_platform_option(option_name):
- raise ConfigOptionError(
- f'Option "{option_name}" not supported in the "{self.platform}" section'
- )
+ self._validate_platform_option(option_name)
self.config_options = config_options
self.config_platform_options = config_platform_options
@@ -207,40 +204,51 @@ class OptionsReader:
if config_overrides is not None:
if not isinstance(config_overrides, list):
- raise ConfigOptionError('"tool.cibuildwheel.overrides" must be a list')
+ raise ConfigOptionError("'tool.cibuildwheel.overrides' must be a list")
for config_override in config_overrides:
select = config_override.pop("select", None)
if not select:
- raise ConfigOptionError('"select" must be set in an override')
+ raise ConfigOptionError("'select' must be set in an override")
if isinstance(select, list):
select = " ".join(select)
self.overrides.append(Override(select, config_override))
- def _is_valid_global_option(self, name: str) -> bool:
+ def _validate_global_option(self, name: str) -> None:
"""
- Returns True if an option with this name is allowed in the
+ Raises an error if an option with this name is not allowed in the
[tool.cibuildwheel] section of a config file.
"""
allowed_option_names = self.default_options.keys() | PLATFORMS | {"overrides"}
- return name in allowed_option_names
+ if name not in allowed_option_names:
+ msg = f"Option {name!r} not supported in a config file."
+ matches = difflib.get_close_matches(name, allowed_option_names, 1, 0.7)
+ if matches:
+ msg += f" Perhaps you meant {matches[0]!r}?"
+ raise ConfigOptionError(msg)
- def _is_valid_platform_option(self, name: str) -> bool:
+ def _validate_platform_option(self, name: str) -> None:
"""
- Returns True if an option with this name is allowed in the
+ Raises an error if an option with this name is not allowed in the
[tool.cibuildwheel.] section of a config file.
"""
disallowed_platform_options = self.disallow.get(self.platform, set())
if name in disallowed_platform_options:
- return False
+ msg = f"{name!r} is not allowed in {disallowed_platform_options}"
+ raise ConfigOptionError(msg)
allowed_option_names = self.default_options.keys() | self.default_platform_options.keys()
- return name in allowed_option_names
+ if name not in allowed_option_names:
+ msg = f"Option {name!r} not supported in the {self.platform!r} section"
+ matches = difflib.get_close_matches(name, allowed_option_names, 1, 0.7)
+ if matches:
+ msg += f" Perhaps you meant {matches[0]!r}?"
+ raise ConfigOptionError(msg)
def _load_file(self, filename: Path) -> tuple[dict[str, Any], dict[str, Any]]:
"""
@@ -290,7 +298,8 @@ class OptionsReader:
"""
if name not in self.default_options and name not in self.default_platform_options:
- raise ConfigOptionError(f"{name} must be in cibuildwheel/resources/defaults.toml file")
+ msg = f"{name!r} must be in cibuildwheel/resources/defaults.toml file to be accessed."
+ raise ConfigOptionError(msg)
# Environment variable form
envvar = f"CIBW_{name.upper().replace('-', '_')}"
@@ -314,12 +323,12 @@ class OptionsReader:
if isinstance(result, dict):
if table is None:
- raise ConfigOptionError(f"{name} does not accept a table")
+ raise ConfigOptionError(f"{name!r} does not accept a table")
return table["sep"].join(table["item"].format(k=k, v=v) for k, v in result.items())
if isinstance(result, list):
if sep is None:
- raise ConfigOptionError(f"{name} does not accept a list")
+ raise ConfigOptionError(f"{name!r} does not accept a list")
return sep.join(result)
if isinstance(result, int):
@@ -393,7 +402,7 @@ class Options:
container_engine_str = self.reader.get("container-engine")
if container_engine_str not in ["docker", "podman"]:
- msg = f"cibuildwheel: Unrecognised container_engine '{container_engine_str}', only 'docker' and 'podman' are supported"
+ msg = f"cibuildwheel: Unrecognised container_engine {container_engine_str!r}, only 'docker' and 'podman' are supported"
print(msg, file=sys.stderr)
sys.exit(2)
@@ -437,7 +446,7 @@ class Options:
elif build_frontend_str == "pip":
build_frontend = "pip"
else:
- msg = f"cibuildwheel: Unrecognised build frontend '{build_frontend_str}', only 'pip' and 'build' are supported"
+ msg = f"cibuildwheel: Unrecognised build frontend {build_frontend_str!r}, only 'pip' and 'build' are supported"
print(msg, file=sys.stderr)
sys.exit(2)
@@ -445,7 +454,7 @@ class Options:
environment = parse_environment(environment_config)
except (EnvironmentParseError, ValueError):
print(
- f'cibuildwheel: Malformed environment option "{environment_config}"',
+ f"cibuildwheel: Malformed environment option {environment_config!r}",
file=sys.stderr,
)
traceback.print_exc(None, sys.stderr)
diff --git a/cibuildwheel/resources/build-platforms.toml b/cibuildwheel/resources/build-platforms.toml
index 533c4db6..ff6b5ea7 100644
--- a/cibuildwheel/resources/build-platforms.toml
+++ b/cibuildwheel/resources/build-platforms.toml
@@ -81,12 +81,12 @@ python_configurations = [
{ identifier = "cp39-macosx_x86_64", version = "3.9", url = "https://www.python.org/ftp/python/3.9.13/python-3.9.13-macos11.pkg" },
{ identifier = "cp39-macosx_arm64", version = "3.9", url = "https://www.python.org/ftp/python/3.9.13/python-3.9.13-macos11.pkg" },
{ identifier = "cp39-macosx_universal2", version = "3.9", url = "https://www.python.org/ftp/python/3.9.13/python-3.9.13-macos11.pkg" },
- { identifier = "cp310-macosx_x86_64", version = "3.10", url = "https://www.python.org/ftp/python/3.10.5/python-3.10.5-macos11.pkg" },
- { identifier = "cp310-macosx_arm64", version = "3.10", url = "https://www.python.org/ftp/python/3.10.5/python-3.10.5-macos11.pkg" },
- { identifier = "cp310-macosx_universal2", version = "3.10", url = "https://www.python.org/ftp/python/3.10.5/python-3.10.5-macos11.pkg" },
- { identifier = "cp311-macosx_x86_64", version = "3.11", url = "https://www.python.org/ftp/python/3.11.0/python-3.11.0b4-macos11.pkg" },
- { identifier = "cp311-macosx_arm64", version = "3.11", url = "https://www.python.org/ftp/python/3.11.0/python-3.11.0b4-macos11.pkg" },
- { identifier = "cp311-macosx_universal2", version = "3.11", url = "https://www.python.org/ftp/python/3.11.0/python-3.11.0b4-macos11.pkg" },
+ { identifier = "cp310-macosx_x86_64", version = "3.10", url = "https://www.python.org/ftp/python/3.10.6/python-3.10.6-macos11.pkg" },
+ { identifier = "cp310-macosx_arm64", version = "3.10", url = "https://www.python.org/ftp/python/3.10.6/python-3.10.6-macos11.pkg" },
+ { identifier = "cp310-macosx_universal2", version = "3.10", url = "https://www.python.org/ftp/python/3.10.6/python-3.10.6-macos11.pkg" },
+ { identifier = "cp311-macosx_x86_64", version = "3.11", url = "https://www.python.org/ftp/python/3.11.0/python-3.11.0rc1-macos11.pkg" },
+ { identifier = "cp311-macosx_arm64", version = "3.11", url = "https://www.python.org/ftp/python/3.11.0/python-3.11.0rc1-macos11.pkg" },
+ { identifier = "cp311-macosx_universal2", version = "3.11", url = "https://www.python.org/ftp/python/3.11.0/python-3.11.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 = "pp38-macosx_x86_64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.9-osx64.tar.bz2" },
{ identifier = "pp39-macosx_x86_64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.9-osx64.tar.bz2" },
@@ -102,13 +102,13 @@ python_configurations = [
{ identifier = "cp38-win_amd64", version = "3.8.10", arch = "64" },
{ identifier = "cp39-win32", version = "3.9.13", arch = "32" },
{ identifier = "cp39-win_amd64", version = "3.9.13", arch = "64" },
- { identifier = "cp310-win32", version = "3.10.5", arch = "32" },
- { identifier = "cp310-win_amd64", version = "3.10.5", arch = "64" },
- { identifier = "cp311-win32", version = "3.11.0-b4", arch = "32" },
- { identifier = "cp311-win_amd64", version = "3.11.0-b4", arch = "64" },
+ { identifier = "cp310-win32", version = "3.10.6", arch = "32" },
+ { identifier = "cp310-win_amd64", version = "3.10.6", arch = "64" },
+ { identifier = "cp311-win32", version = "3.11.0-rc1", arch = "32" },
+ { identifier = "cp311-win_amd64", version = "3.11.0-rc1", arch = "64" },
{ identifier = "cp39-win_arm64", version = "3.9.10", arch = "ARM64" },
- { identifier = "cp310-win_arm64", version = "3.10.5", arch = "ARM64" },
- { identifier = "cp311-win_arm64", version = "3.11.0-b4", arch = "ARM64" },
+ { identifier = "cp310-win_arm64", version = "3.10.6", arch = "ARM64" },
+ { identifier = "cp311-win_arm64", version = "3.11.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 = "pp38-win_amd64", version = "3.8", arch = "64", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.9-win64.zip" },
{ identifier = "pp39-win_amd64", version = "3.9", arch = "64", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.9-win64.zip" },
diff --git a/cibuildwheel/resources/constraints-python310.txt b/cibuildwheel/resources/constraints-python310.txt
index f3d3b7f9..65488188 100644
--- a/cibuildwheel/resources/constraints-python310.txt
+++ b/cibuildwheel/resources/constraints-python310.txt
@@ -2,21 +2,19 @@
# This file is autogenerated by pip-compile with python 3.10
# To update, run:
#
-# bin/update_dependencies.py
+# nox -s update_constraints-3.10
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
# via virtualenv
-filelock==3.7.1
+filelock==3.8.0
# via virtualenv
platformdirs==2.5.2
# via virtualenv
-six==1.16.0
- # via virtualenv
typing-extensions==4.3.0
# via delocate
-virtualenv==20.15.1
+virtualenv==20.16.3
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,7 +22,7 @@ wheel==0.37.1
# delocate
# The following packages are considered to be unsafe in a requirements file:
-pip==22.2
+pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==63.2.0
+setuptools==63.4.2
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python311.txt b/cibuildwheel/resources/constraints-python311.txt
index 849abf49..47b2579a 100644
--- a/cibuildwheel/resources/constraints-python311.txt
+++ b/cibuildwheel/resources/constraints-python311.txt
@@ -2,21 +2,19 @@
# This file is autogenerated by pip-compile with python 3.11
# To update, run:
#
-# bin/update_dependencies.py
+# nox -s update_constraints-3.11
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
# via virtualenv
-filelock==3.7.1
+filelock==3.8.0
# via virtualenv
platformdirs==2.5.2
# via virtualenv
-six==1.16.0
- # via virtualenv
typing-extensions==4.3.0
# via delocate
-virtualenv==20.15.1
+virtualenv==20.16.3
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,7 +22,7 @@ wheel==0.37.1
# delocate
# The following packages are considered to be unsafe in a requirements file:
-pip==22.2
+pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==63.2.0
+setuptools==63.4.2
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python36.txt b/cibuildwheel/resources/constraints-python36.txt
index 8ab9294a..51328239 100644
--- a/cibuildwheel/resources/constraints-python36.txt
+++ b/cibuildwheel/resources/constraints-python36.txt
@@ -2,7 +2,7 @@
# This file is autogenerated by pip-compile with python 3.6
# To update, run:
#
-# bin/update_dependencies.py
+# nox -s update_constraints-3.6
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
@@ -16,13 +16,11 @@ importlib-resources==5.4.0
# via virtualenv
platformdirs==2.4.0
# via virtualenv
-six==1.16.0
- # via virtualenv
typing-extensions==4.1.1
# via
# delocate
# importlib-metadata
-virtualenv==20.15.1
+virtualenv==20.16.3
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
diff --git a/cibuildwheel/resources/constraints-python37.txt b/cibuildwheel/resources/constraints-python37.txt
index 78ea26b2..825991e6 100644
--- a/cibuildwheel/resources/constraints-python37.txt
+++ b/cibuildwheel/resources/constraints-python37.txt
@@ -2,25 +2,23 @@
# This file is autogenerated by pip-compile with python 3.7
# To update, run:
#
-# bin/update_dependencies.py
+# nox -s update_constraints-3.7
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
# via virtualenv
-filelock==3.7.1
+filelock==3.8.0
# via virtualenv
importlib-metadata==4.12.0
# via virtualenv
platformdirs==2.5.2
# via virtualenv
-six==1.16.0
- # via virtualenv
typing-extensions==4.3.0
# via
# delocate
# importlib-metadata
-virtualenv==20.15.1
+virtualenv==20.16.3
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -30,7 +28,7 @@ zipp==3.8.1
# via importlib-metadata
# The following packages are considered to be unsafe in a requirements file:
-pip==22.2
+pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==63.2.0
+setuptools==63.4.2
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python38.txt b/cibuildwheel/resources/constraints-python38.txt
index aa06de6e..a9c99ed0 100644
--- a/cibuildwheel/resources/constraints-python38.txt
+++ b/cibuildwheel/resources/constraints-python38.txt
@@ -2,21 +2,19 @@
# This file is autogenerated by pip-compile with python 3.8
# To update, run:
#
-# bin/update_dependencies.py
+# nox -s update_constraints-3.8
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
# via virtualenv
-filelock==3.7.1
+filelock==3.8.0
# via virtualenv
platformdirs==2.5.2
# via virtualenv
-six==1.16.0
- # via virtualenv
typing-extensions==4.3.0
# via delocate
-virtualenv==20.15.1
+virtualenv==20.16.3
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,7 +22,7 @@ wheel==0.37.1
# delocate
# The following packages are considered to be unsafe in a requirements file:
-pip==22.2
+pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==63.2.0
+setuptools==63.4.2
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python39.txt b/cibuildwheel/resources/constraints-python39.txt
index 0aed606e..7f49670e 100644
--- a/cibuildwheel/resources/constraints-python39.txt
+++ b/cibuildwheel/resources/constraints-python39.txt
@@ -2,21 +2,19 @@
# This file is autogenerated by pip-compile with python 3.9
# To update, run:
#
-# bin/update_dependencies.py
+# nox -s update_constraints-3.9
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
# via virtualenv
-filelock==3.7.1
+filelock==3.8.0
# via virtualenv
platformdirs==2.5.2
# via virtualenv
-six==1.16.0
- # via virtualenv
typing-extensions==4.3.0
# via delocate
-virtualenv==20.15.1
+virtualenv==20.16.3
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,7 +22,7 @@ wheel==0.37.1
# delocate
# The following packages are considered to be unsafe in a requirements file:
-pip==22.2
+pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==63.2.0
+setuptools==63.4.2
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints.txt b/cibuildwheel/resources/constraints.txt
index 0aed606e..47b2579a 100644
--- a/cibuildwheel/resources/constraints.txt
+++ b/cibuildwheel/resources/constraints.txt
@@ -1,22 +1,20 @@
#
-# This file is autogenerated by pip-compile with python 3.9
+# This file is autogenerated by pip-compile with python 3.11
# To update, run:
#
-# bin/update_dependencies.py
+# nox -s update_constraints-3.11
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
# via virtualenv
-filelock==3.7.1
+filelock==3.8.0
# via virtualenv
platformdirs==2.5.2
# via virtualenv
-six==1.16.0
- # via virtualenv
typing-extensions==4.3.0
# via delocate
-virtualenv==20.15.1
+virtualenv==20.16.3
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,7 +22,7 @@ wheel==0.37.1
# delocate
# The following packages are considered to be unsafe in a requirements file:
-pip==22.2
+pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==63.2.0
+setuptools==63.4.2
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/pinned_docker_images.cfg b/cibuildwheel/resources/pinned_docker_images.cfg
index 1fe4bf41..8fdb63fb 100644
--- a/cibuildwheel/resources/pinned_docker_images.cfg
+++ b/cibuildwheel/resources/pinned_docker_images.cfg
@@ -1,48 +1,48 @@
[x86_64]
-manylinux1 = quay.io/pypa/manylinux1_x86_64:2022-07-17-f8ddacc
-manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-07-21-947f13c
-manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-07-21-947f13c
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-07-21-947f13c
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2022-07-21-947f13c
+manylinux1 = quay.io/pypa/manylinux1_x86_64:2022-08-08-7292f33
+manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
+manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-08-09-51a01be
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-08-09-51a01be
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2022-08-09-51a01be
[i686]
-manylinux1 = quay.io/pypa/manylinux1_i686:2022-07-17-f8ddacc
-manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-07-21-947f13c
-manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-07-21-947f13c
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2022-07-21-947f13c
+manylinux1 = quay.io/pypa/manylinux1_i686:2022-08-08-7292f33
+manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
+manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-08-09-51a01be
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2022-08-09-51a01be
[pypy_x86_64]
-manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-07-21-947f13c
-manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-07-21-947f13c
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-07-21-947f13c
+manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
+manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-08-09-51a01be
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-08-09-51a01be
[pypy_i686]
-manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-07-21-947f13c
-manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-07-21-947f13c
+manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
+manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-08-09-51a01be
[aarch64]
-manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-07-21-947f13c
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-07-21-947f13c
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2022-07-21-947f13c
+manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-08-09-51a01be
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-08-09-51a01be
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2022-08-09-51a01be
[ppc64le]
-manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-07-21-947f13c
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2022-07-21-947f13c
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2022-07-21-947f13c
+manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-08-09-51a01be
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2022-08-09-51a01be
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2022-08-09-51a01be
[s390x]
-manylinux2014 = quay.io/pypa/manylinux2014_s390x:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-07-21-947f13c
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2022-07-21-947f13c
+manylinux2014 = quay.io/pypa/manylinux2014_s390x:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-08-09-51a01be
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2022-08-09-51a01be
[pypy_aarch64]
-manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-07-21-947f13c
-manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-07-21-947f13c
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-07-21-947f13c
+manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-08-09-51a01be
+manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-08-09-51a01be
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-08-09-51a01be
diff --git a/cibuildwheel/resources/virtualenv.toml b/cibuildwheel/resources/virtualenv.toml
index c9ae14af..c14592cd 100644
--- a/cibuildwheel/resources/virtualenv.toml
+++ b/cibuildwheel/resources/virtualenv.toml
@@ -1,2 +1,2 @@
-version = "20.15.1"
-url = "https://github.com/pypa/get-virtualenv/blob/20.15.1/public/virtualenv.pyz?raw=true"
+version = "20.16.3"
+url = "https://github.com/pypa/get-virtualenv/blob/20.16.3/public/virtualenv.pyz?raw=true"
diff --git a/cibuildwheel/util.py b/cibuildwheel/util.py
index 6a6a6e2a..62422201 100644
--- a/cibuildwheel/util.py
+++ b/cibuildwheel/util.py
@@ -242,7 +242,7 @@ class BuildSelector:
requires_python: SpecifierSet | None = None
# a pattern that skips prerelease versions, when include_prereleases is False.
- PRERELEASE_SKIP: ClassVar[str] = "cp311-*"
+ PRERELEASE_SKIP: ClassVar[str] = ""
prerelease_pythons: bool = False
def __call__(self, build_id: str) -> bool:
diff --git a/docs/changelog.md b/docs/changelog.md
index 6f1da5e4..1bce05a9 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -2,6 +2,15 @@
title: Changelog
---
+### v2.9.0
+
+_11 August 2022_
+
+- 🌟 CPython 3.11 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.11.0rc1, which is guaranteed to be ABI compatible with the final release. (#1226)
+- ⚠️ Removed support for running cibuildwheel in Python 3.6. Python 3.6 is EOL. However, cibuildwheel continues to build CPython 3.6 wheels for the moment. (#1175)
+- ✨ Improved error messages when misspelling TOML options, suggesting close matches (#1205)
+- 🛠 When running on Apple Silicon (so far, an unsupported mode of operation), cibuildwheel no longer builds universal2 wheels by default - just arm64. See [#1204](https://github.com/pypa/cibuildwheel/issues/1204) for discussion. We hope to release official support for native builds on Apple Silicon soon! (#1217)
+
### v2.8.1
_18 July 2022_
diff --git a/docs/data/projects.yml b/docs/data/projects.yml
index b08d6fc4..19b6d525 100644
--- a/docs/data/projects.yml
+++ b/docs/data/projects.yml
@@ -594,3 +594,15 @@
gh: SciTools/cf-units
ci: [github]
os: [apple, linux]
+
+- name: envd
+ gh: tensorchord/envd
+ ci: [github]
+ os: [apple, linux, windows]
+ note: A machine learning development environment build toool
+
+- name: mosec
+ gh: mosecorg/mosec
+ ci: [github]
+ os: [linux, apple]
+ note: A machine learning model serving framework powered by Rust
diff --git a/docs/faq.md b/docs/faq.md
index 07c5397e..85314cd3 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -53,11 +53,11 @@ to load on Apple Silicon.
available.
Generally speaking, because Pip 20.3 is required for the `universal2` wheel,
-most packages should provide both `x86_64` and `universal2` wheels for now.
-Once Pip 20.3+ is common on macOS, then it should be possible to ship only the
-`universal2` wheel.
+most packages should provide both `x86_64` and one of `universal2`/`arm64`
+wheels for now. When Pip 20.3+ is common on macOS, then it might be possible
+to ship only the `universal2` wheel.
-**Apple Silicon wheels are not built by default**, but can be enabled by adding extra archs to the [`CIBW_ARCHS_MACOS` option](options.md#archs) - e.g. `x86_64 arm64 universal2`. Cross-compilation is provided by the Xcode toolchain.
+**Apple Silicon wheels are not built by default on Intel runners**, but can be enabled by adding extra archs to the [`CIBW_ARCHS_MACOS` option](options.md#archs) - e.g. `x86_64 arm64`. Cross-compilation is provided by the Xcode toolchain.
!!! important
When cross-compiling on Intel, it is not possible to test `arm64` and the `arm64` part of a `universal2` wheel.
@@ -66,8 +66,7 @@ Once Pip 20.3+ is common on macOS, then it should be possible to ship only the
Hopefully, cross-compilation is a temporary situation. Once we have widely
available Apple Silicon CI runners, we can build and test `arm64` and
-`universal2` wheels natively. That's why `universal2` wheels are not yet built
-by default, and require opt-in by setting `CIBW_ARCHS_MACOS`.
+`universal2` wheels natively. That's why `universal2`/`arm64` wheels require opt-in by setting `CIBW_ARCHS_MACOS`.
!!! note
Your runner needs Xcode Command Line Tools 12.2 or later to build `universal2` or `arm64`.
@@ -133,7 +132,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:
```yaml
-uses: pypa/cibuildwheel@v2.8.1
+uses: pypa/cibuildwheel@v2.9.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.
@@ -155,7 +154,7 @@ The second option, and the only one that supports other CI systems, is using a `
```bash
# requirements-cibw.txt
-cibuildwheel==2.8.1
+cibuildwheel==2.9.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:
diff --git a/docs/options.md b/docs/options.md
index 75c2fd80..b6e0b0c5 100644
--- a/docs/options.md
+++ b/docs/options.md
@@ -351,7 +351,7 @@ Default: `auto`
| Linux / Intel | `x86_64` | `x86_64` `i686` | `x86_64` | `i686` |
| Windows / Intel | `AMD64` | `AMD64` `x86` | `AMD64` | `x86` |
| macOS / Intel | `x86_64` | `x86_64` | `x86_64` | |
-| macOS / Apple Silicon | `arm64` | `arm64` `universal2` | `arm64` `universal2`| |
+| macOS / Apple Silicon | `arm64` | `arm64` | `arm64` | |
If not listed above, `auto` is the same as `native`.
diff --git a/docs/setup.md b/docs/setup.md
index 91d44960..2dce1f5b 100644
--- a/docs/setup.md
+++ b/docs/setup.md
@@ -182,7 +182,7 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
- uses: actions/checkout@v3
- name: Build wheels
- run: pipx run cibuildwheel==2.8.1
+ run: pipx run cibuildwheel==2.9.0
- uses: actions/upload-artifact@v3
with:
@@ -217,7 +217,7 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
- uses: actions/setup-python@v3
- name: Install cibuildwheel
- run: python -m pip install cibuildwheel==2.8.1
+ run: python -m pip install cibuildwheel==2.9.0
- name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse
diff --git a/docs/working-examples.md b/docs/working-examples.md
index 63b34bb8..eb68e50d 100644
--- a/docs/working-examples.md
+++ b/docs/working-examples.md
@@ -23,16 +23,16 @@ title: Working examples
| [psutil][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Cross-platform lib for process and system monitoring in Python |
| [vaex][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Out-of-Core hybrid Apache Arrow/NumPy DataFrame for Python, ML, visualization and exploration of big tabular data at a billion rows per second 🚀 |
| [Google Benchmark][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A microbenchmark support library |
-| [Apache Beam][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Apache Beam is a unified programming model for Batch and Streaming data processing. |
| [duckdb][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | DuckDB is an in-process SQL OLAP Database Management System |
+| [Apache Beam][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Apache Beam is a unified programming model for Batch and Streaming data processing. |
| [asyncpg][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A fast PostgreSQL Database Client Library for Python/asyncio. |
| [PyGame][] | ![github icon][] | ![apple icon][] ![linux icon][] | pygame (the library) is a Free and Open Source python programming language library for making multimedia applications like games built on top of the excellent SDL library. C, Python, Native, OpenGL. |
| [scikit-image][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Image processing library. Uses cibuildwheel to build and test a project that uses Cython with platform-native code. |
| [cmake][] | ![github icon][] ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Multitagged binary builds for all supported platforms, using cibw 2 config configuration. |
| [twisted-iocpsupport][] | ![github icon][] | ![windows icon][] | A submodule of Twisted that hooks into native C APIs using Cython. |
| [websockets][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Library for building WebSocket servers and clients. Mostly written in Python, with a small C 'speedups' extension module. |
-| [cvxpy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A Python-embedded modeling language for convex optimization problems. |
| [PyOxidizer][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A modern Python application packaging and distribution tool |
+| [cvxpy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A Python-embedded modeling language for convex optimization problems. |
| [Triton][] | ![github icon][] | ![linux icon][] | Self hosted runners |
| [UltraJSON][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Ultra fast JSON decoder and encoder written in C with Python bindings |
| [River][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | 🌊 Online machine learning in Python |
@@ -40,8 +40,8 @@ title: Working examples
| [pyzmq][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python bindings for zeromq, the networking library. Uses Cython and CFFI. |
| [aiortc][] | ![github icon][] | ![apple icon][] ![linux icon][] | WebRTC and ORTC implementation for Python using asyncio. |
| [vispy][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Main repository for Vispy |
-| [Confluent client for Kafka][] | ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | setup in `tools/wheels/build-wheels.bat` |
| [Implicit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes GPU support for linux wheels |
+| [Confluent client for Kafka][] | ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | setup in `tools/wheels/build-wheels.bat` |
| [tinyobjloader][] | ![azurepipelines icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Tiny but powerful single file wavefront obj loader |
| [Dependency Injector][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Dependency injection framework for Python, uses Windows TravisCI |
| [coverage.py][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The coverage tool for Python |
@@ -60,8 +60,8 @@ title: Working examples
| [aioquic][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | QUIC and HTTP/3 implementation in Python |
| [ruptures][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Extensive Cython + NumPy [pyproject.toml](https://github.com/deepcharles/ruptures/blob/master/pyproject.toml) example. |
| [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) |
-| [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric data |
| [Psycopg 3][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A modern implementation of a PostgreSQL adapter for Python |
+| [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. |
| [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 |
@@ -74,12 +74,12 @@ title: Working examples
| [tgcalls][] | ![github icon][] | ![apple icon][] ![windows icon][] | Python `pybind11` binding to Telegram's WebRTC library with third party dependencies like `OpenSSL`, `MozJPEG`, `FFmpeg`, etc. |
| [dd-trace-py][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Uses custom alternate arch emulation on GitHub |
| [pybind11 python_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a Python-based build system |
-| [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. |
| [time-machine][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Time mocking library using only the CPython C API. |
+| [sourmash][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Quickly search, compare, and analyze genomic and metagenomic data sets. |
| [CTranslate2][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes libraries from the [Intel oneAPI toolkit](https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit.html) and CUDA kernels compiled for multiple GPU architectures. |
| [cyvcf2][] | ![github icon][] | ![apple icon][] ![linux icon][] | cython + htslib == fast VCF and BCF processing |
-| [matrixprofile][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python 3 library making time series data mining tasks, utilizing matrix profile algorithms, accessible to everyone. |
| [abess][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A fast best-subset selection library. It uses cibuildwheel to build a large project with C++ extensions. |
+| [matrixprofile][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python 3 library making time series data mining tasks, utilizing matrix profile algorithms, accessible to everyone. |
| [jq.py][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Python bindings for jq |
| [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Jupyter-friendly Python interface for C++ MINUIT2 |
| [Tokenizer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast and customizable text tokenization library with BPE and SentencePiece support |
@@ -96,9 +96,9 @@ title: Working examples
| [polaroid][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Full range of wheels for setuptools rust, with auto release and PyPI deploy. |
| [cf-units][] | ![github icon][] | ![apple icon][] ![linux icon][] | Units of measure as required by the Climate and Forecast (CF) Metadata Conventions |
| [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. |
-| [clang-format][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Scikit-build wrapper around LLVM's CMake, all platforms, generic wheels. |
| [pillow-heif][] | ![github icon][] | ![apple icon][] ![linux icon][] | Python CFFI binding to libheif library with third party dependencies like `libde265`, `x265`, `libaom` with test & publishing on PyPi. |
| [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis |
+| [clang-format][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Scikit-build wrapper around LLVM's CMake, all platforms, generic wheels. |
| [numpythia][] | ![github icon][] | ![apple icon][] ![linux icon][] | The interface between PYTHIA and NumPy |
| [pyjet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The interface between FastJet and NumPy |
| [pybind11 scikit_build_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | An example combining scikit-build and pybind11 |
@@ -124,16 +124,16 @@ title: Working examples
[psutil]: https://github.com/giampaolo/psutil
[vaex]: https://github.com/vaexio/vaex
[Google Benchmark]: https://github.com/google/benchmark
-[Apache Beam]: https://github.com/apache/beam
[duckdb]: https://github.com/duckdb/duckdb
+[Apache Beam]: https://github.com/apache/beam
[asyncpg]: https://github.com/MagicStack/asyncpg
[PyGame]: https://github.com/pygame/pygame
[scikit-image]: https://github.com/scikit-image/scikit-image
[cmake]: https://github.com/scikit-build/cmake-python-distributions
[twisted-iocpsupport]: https://github.com/twisted/twisted-iocpsupport
[websockets]: https://github.com/aaugustin/websockets
-[cvxpy]: https://github.com/cvxpy/cvxpy
[PyOxidizer]: https://github.com/indygreg/PyOxidizer
+[cvxpy]: https://github.com/cvxpy/cvxpy
[Triton]: https://github.com/openai/triton
[UltraJSON]: https://github.com/ultrajson/ultrajson
[River]: https://github.com/online-ml/river
@@ -141,8 +141,8 @@ title: Working examples
[pyzmq]: https://github.com/zeromq/pyzmq
[aiortc]: https://github.com/aiortc/aiortc
[vispy]: https://github.com/vispy/vispy
-[Confluent client for Kafka]: https://github.com/confluentinc/confluent-kafka-python
[Implicit]: https://github.com/benfred/implicit
+[Confluent client for Kafka]: https://github.com/confluentinc/confluent-kafka-python
[tinyobjloader]: https://github.com/tinyobjloader/tinyobjloader
[Dependency Injector]: https://github.com/ets-labs/python-dependency-injector
[coverage.py]: https://github.com/nedbat/coveragepy
@@ -161,8 +161,8 @@ title: Working examples
[aioquic]: https://github.com/aiortc/aioquic
[ruptures]: https://github.com/deepcharles/ruptures
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
-[google neuroglancer]: https://github.com/google/neuroglancer
[Psycopg 3]: https://github.com/psycopg/psycopg
+[google neuroglancer]: https://github.com/google/neuroglancer
[Parselmouth]: https://github.com/YannickJadoul/Parselmouth
[AutoPy]: https://github.com/autopilot-rs/autopy
[H3-py]: https://github.com/uber/h3-py
@@ -175,12 +175,12 @@ title: Working examples
[tgcalls]: https://github.com/MarshalX/tgcalls
[dd-trace-py]: https://github.com/DataDog/dd-trace-py
[pybind11 python_example]: https://github.com/pybind/python_example
-[sourmash]: https://github.com/dib-lab/sourmash
[time-machine]: https://github.com/adamchainz/time-machine
+[sourmash]: https://github.com/dib-lab/sourmash
[CTranslate2]: https://github.com/OpenNMT/CTranslate2
[cyvcf2]: https://github.com/brentp/cyvcf2
-[matrixprofile]: https://github.com/matrix-profile-foundation/matrixprofile
[abess]: https://github.com/abess-team/abess
+[matrixprofile]: https://github.com/matrix-profile-foundation/matrixprofile
[jq.py]: https://github.com/mwilliamson/jq.py
[iminuit]: https://github.com/scikit-hep/iminuit
[Tokenizer]: https://github.com/OpenNMT/Tokenizer
@@ -197,9 +197,9 @@ title: Working examples
[polaroid]: https://github.com/daggy1234/polaroid
[cf-units]: https://github.com/SciTools/cf-units
[Imagecodecs (fork)]: https://github.com/czaki/imagecodecs_build
-[clang-format]: https://github.com/ssciwr/clang-format-wheel
[pillow-heif]: https://github.com/bigcat88/pillow_heif
[power-grid-model]: https://github.com/alliander-opensource/power-grid-model
+[clang-format]: https://github.com/ssciwr/clang-format-wheel
[numpythia]: https://github.com/scikit-hep/numpythia
[pyjet]: https://github.com/scikit-hep/pyjet
[pybind11 scikit_build_example]: https://github.com/pybind/scikit_build_example
@@ -220,106 +220,106 @@ title: Working examples
[apple icon]: data/readme_icons/apple.svg
[linux icon]: data/readme_icons/linux.svg
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/appveyor-minimal.yml b/examples/appveyor-minimal.yml
index cd47745d..99e4f91b 100644
--- a/examples/appveyor-minimal.yml
+++ b/examples/appveyor-minimal.yml
@@ -12,7 +12,7 @@ stack: python 3.7
init:
- cmd: set PATH=C:\Python37;C:\Python37\Scripts;%PATH%
-install: python -m pip install cibuildwheel==2.8.1
+install: python -m pip install cibuildwheel==2.9.0
build_script: python -m cibuildwheel --output-dir wheelhouse
diff --git a/examples/azure-pipelines-minimal.yml b/examples/azure-pipelines-minimal.yml
index d9f837f9..46ee3959 100644
--- a/examples/azure-pipelines-minimal.yml
+++ b/examples/azure-pipelines-minimal.yml
@@ -6,7 +6,7 @@ jobs:
- bash: |
set -o errexit
python3 -m pip install --upgrade pip
- pip3 install cibuildwheel==2.8.1
+ pip3 install cibuildwheel==2.9.0
displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels
@@ -20,7 +20,7 @@ jobs:
- bash: |
set -o errexit
python3 -m pip install --upgrade pip
- python3 -m pip install cibuildwheel==2.8.1
+ python3 -m pip install cibuildwheel==2.9.0
displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels
@@ -34,7 +34,7 @@ jobs:
- bash: |
set -o errexit
python -m pip install --upgrade pip
- pip install cibuildwheel==2.8.1
+ pip install cibuildwheel==2.9.0
displayName: Install dependencies
- bash: cibuildwheel --output-dir wheelhouse .
displayName: Build wheels
diff --git a/examples/circleci-minimal.yml b/examples/circleci-minimal.yml
index 3162ceb5..a1478974 100644
--- a/examples/circleci-minimal.yml
+++ b/examples/circleci-minimal.yml
@@ -11,7 +11,7 @@ jobs:
- run:
name: Build the Linux wheels.
command: |
- pip3 install --user cibuildwheel==2.8.1
+ pip3 install --user cibuildwheel==2.9.0
cibuildwheel --output-dir wheelhouse
- store_artifacts:
path: wheelhouse/
@@ -25,7 +25,7 @@ jobs:
- run:
name: Build the OS X wheels.
command: |
- pip3 install cibuildwheel==2.8.1
+ pip3 install cibuildwheel==2.9.0
cibuildwheel --output-dir wheelhouse
- store_artifacts:
path: wheelhouse/
diff --git a/examples/github-apple-silicon.yml b/examples/github-apple-silicon.yml
index 95154a33..c212bfd7 100644
--- a/examples/github-apple-silicon.yml
+++ b/examples/github-apple-silicon.yml
@@ -10,9 +10,9 @@ jobs:
- uses: actions/checkout@v3
- name: Build wheels
- uses: pypa/cibuildwheel@v2.8.1
+ uses: pypa/cibuildwheel@v2.9.0
env:
- CIBW_ARCHS_MACOS: x86_64 universal2
+ CIBW_ARCHS_MACOS: x86_64 arm64
- uses: actions/upload-artifact@v3
with:
diff --git a/examples/github-deploy.yml b/examples/github-deploy.yml
index 75b8cd1c..8ef91573 100644
--- a/examples/github-deploy.yml
+++ b/examples/github-deploy.yml
@@ -22,7 +22,7 @@ jobs:
- uses: actions/checkout@v3
- name: Build wheels
- uses: pypa/cibuildwheel@v2.8.1
+ uses: pypa/cibuildwheel@v2.9.0
- uses: actions/upload-artifact@v3
with:
diff --git a/examples/github-minimal.yml b/examples/github-minimal.yml
index e1e1f99b..f5ba352d 100644
--- a/examples/github-minimal.yml
+++ b/examples/github-minimal.yml
@@ -14,7 +14,7 @@ jobs:
- uses: actions/checkout@v3
- name: Build wheels
- uses: pypa/cibuildwheel@v2.8.1
+ uses: pypa/cibuildwheel@v2.9.0
# env:
# CIBW_SOME_OPTION: value
# ...
diff --git a/examples/github-with-qemu.yml b/examples/github-with-qemu.yml
index 1ba744d2..f70add94 100644
--- a/examples/github-with-qemu.yml
+++ b/examples/github-with-qemu.yml
@@ -13,19 +13,14 @@ jobs:
steps:
- uses: actions/checkout@v3
- - uses: actions/setup-python@v3
- name: Install Python
- with:
- python-version: '3.7'
-
- name: Set up QEMU
if: runner.os == 'Linux'
- uses: docker/setup-qemu-action@v1
+ uses: docker/setup-qemu-action@v2
with:
platforms: all
- name: Build wheels
- uses: pypa/cibuildwheel@v2.8.1
+ uses: pypa/cibuildwheel@v2.9.0
env:
# configure cibuildwheel to build native archs ('auto'), and some
# emulated ones
diff --git a/examples/gitlab-minimal.yml b/examples/gitlab-minimal.yml
index 5c987965..7e9aa516 100644
--- a/examples/gitlab-minimal.yml
+++ b/examples/gitlab-minimal.yml
@@ -12,7 +12,7 @@ linux:
DOCKER_TLS_CERTDIR: ""
script:
- curl -sSL https://get.docker.com/ | sh
- - python -m pip install cibuildwheel==2.8.1
+ - python -m pip install cibuildwheel==2.9.0
- cibuildwheel --output-dir wheelhouse
artifacts:
paths:
diff --git a/examples/travis-ci-deploy.yml b/examples/travis-ci-deploy.yml
index 663080ab..3aac30e7 100644
--- a/examples/travis-ci-deploy.yml
+++ b/examples/travis-ci-deploy.yml
@@ -19,7 +19,7 @@ jobs:
- ln -s /c/Python38/python.exe /c/Python38/python3.exe
install:
- - python3 -m pip install cibuildwheel==2.8.1
+ - python3 -m pip install cibuildwheel==2.9.0
script:
# build the wheels, put them into './dist'
diff --git a/examples/travis-ci-minimal.yml b/examples/travis-ci-minimal.yml
index 9ca1fee1..010f3c8c 100644
--- a/examples/travis-ci-minimal.yml
+++ b/examples/travis-ci-minimal.yml
@@ -25,7 +25,7 @@ jobs:
- ln -s /c/Python38/python.exe /c/Python38/python3.exe
install:
- - python3 -m pip install cibuildwheel==2.8.1
+ - python3 -m pip install cibuildwheel==2.9.0
script:
# build the wheels, put them into './wheelhouse'
diff --git a/examples/travis-ci-test-and-deploy.yml b/examples/travis-ci-test-and-deploy.yml
index 42a27954..7271bdaa 100644
--- a/examples/travis-ci-test-and-deploy.yml
+++ b/examples/travis-ci-test-and-deploy.yml
@@ -54,7 +54,7 @@ jobs:
- stage: deploy
name: Build and deploy Linux wheels
services: docker
- install: python3 -m pip install cibuildwheel==2.8.1 twine
+ install: python3 -m pip install cibuildwheel==2.9.0 twine
script: python3 -m cibuildwheel --output-dir wheelhouse
after_success: python3 -m twine upload --skip-existing wheelhouse/*.whl
# Deploy on windows
@@ -62,7 +62,7 @@ jobs:
name: Build and deploy Windows wheels
os: windows
language: shell
- install: python3 -m pip install cibuildwheel==2.8.1 twine
+ install: python3 -m pip install cibuildwheel==2.9.0 twine
script: python3 -m cibuildwheel --output-dir wheelhouse
after_success: python3 -m twine upload --skip-existing wheelhouse/*.whl
diff --git a/noxfile.py b/noxfile.py
index 659e7ff5..142ea3fe 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -65,8 +65,27 @@ def update_constraints(session: nox.Session) -> None:
"""
Update the dependencies inplace.
"""
- session.install("requests", "pip-tools")
- session.run("python", "bin/update_dependencies.py")
+ session.install("pip-tools")
+ assert isinstance(session.python, str)
+ python_version = session.python.replace(".", "")
+ env = os.environ.copy()
+ # CUSTOM_COMPILE_COMMAND is a pip-compile option that tells users how to
+ # regenerate the constraints files
+ env["CUSTOM_COMPILE_COMMAND"] = f"nox -s {session.name}"
+ session.run(
+ "pip-compile",
+ "--allow-unsafe",
+ "--upgrade",
+ "cibuildwheel/resources/constraints.in",
+ f"--output-file=cibuildwheel/resources/constraints-python{python_version}.txt",
+ env=env,
+ )
+ if session.python == PYTHON_ALL_VERSIONS[-1]:
+ RESOURCES = DIR / "cibuildwheel" / "resources"
+ shutil.copyfile(
+ RESOURCES / f"constraints-python{python_version}.txt",
+ RESOURCES / "constraints.txt",
+ )
@nox.session
diff --git a/setup.cfg b/setup.cfg
index 51718be9..06ce771f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
[metadata]
name = cibuildwheel
-version = 2.8.1
+version = 2.9.0
description = Build Python wheels on CI with minimal configuration.
long_description = file: README.md
long_description_content_type = text/markdown
diff --git a/test/test_macos_archs.py b/test/test_macos_archs.py
index d3a56fb7..fdd665c0 100644
--- a/test/test_macos_archs.py
+++ b/test/test_macos_archs.py
@@ -11,7 +11,7 @@ basic_project = test_projects.new_c_project()
ALL_MACOS_WHEELS = {
*utils.expected_wheels("spam", "0.1.0", machine_arch="x86_64"),
- *utils.expected_wheels("spam", "0.1.0", machine_arch="arm64"),
+ *utils.expected_wheels("spam", "0.1.0", machine_arch="arm64", include_universal2=True),
}
diff --git a/test/utils.py b/test/utils.py
index 947c8968..5d610516 100644
--- a/test/utils.py
+++ b/test/utils.py
@@ -116,6 +116,7 @@ def expected_wheels(
macosx_deployment_target="10.9",
machine_arch=None,
python_abi_tags=None,
+ include_universal2=False,
):
"""
Returns a list of expected wheels from a run of cibuildwheel.
@@ -199,14 +200,14 @@ def expected_wheels(
arm64_macosx_deployment_target = _get_arm64_macosx_deployment_target(
macosx_deployment_target
)
- platform_tags = [
- f'macosx_{macosx_deployment_target.replace(".", "_")}_universal2',
- f'macosx_{arm64_macosx_deployment_target.replace(".", "_")}_arm64',
- ]
+ platform_tags = [f'macosx_{arm64_macosx_deployment_target.replace(".", "_")}_arm64']
else:
- platform_tags = [
- f'macosx_{macosx_deployment_target.replace(".", "_")}_x86_64',
- ]
+ platform_tags = [f'macosx_{macosx_deployment_target.replace(".", "_")}_x86_64']
+
+ if include_universal2:
+ platform_tags.append(
+ f'macosx_{macosx_deployment_target.replace(".", "_")}_universal2',
+ )
else:
raise Exception("unsupported platform")
diff --git a/unit_test/build_selector_test.py b/unit_test/build_selector_test.py
index 14ff8da6..3e544900 100644
--- a/unit_test/build_selector_test.py
+++ b/unit_test/build_selector_test.py
@@ -11,7 +11,7 @@ def test_build():
assert build_selector("cp36-manylinux_x86_64")
assert build_selector("cp37-manylinux_x86_64")
assert build_selector("cp310-manylinux_x86_64")
- assert not build_selector("cp311-manylinux_x86_64")
+ assert build_selector("cp311-manylinux_x86_64")
assert build_selector("pp36-manylinux_x86_64")
assert build_selector("pp37-manylinux_x86_64")
assert build_selector("cp36-manylinux_i686")
@@ -30,7 +30,7 @@ def test_build():
assert build_selector("cp36-win_amd64")
assert build_selector("cp37-win_amd64")
assert build_selector("cp310-win_amd64")
- assert not build_selector("cp311-win_amd64")
+ assert build_selector("cp311-win_amd64")
assert not build_selector("pp36-win_amd64")
assert not build_selector("pp37-win_amd64")
diff --git a/unit_test/linux_build_steps_test.py b/unit_test/linux_build_steps_test.py
index 809cdf65..8423d423 100644
--- a/unit_test/linux_build_steps_test.py
+++ b/unit_test/linux_build_steps_test.py
@@ -60,8 +60,12 @@ def test_linux_container_split(tmp_path: Path, monkeypatch):
pprint(build_steps)
assert build_steps[0].container_image == "normal_container_image"
- assert identifiers(build_steps[0]) == ["cp36-manylinux_x86_64", "cp37-manylinux_x86_64"]
- assert before_alls(build_steps[0]) == ["", ""]
+ assert identifiers(build_steps[0]) == [
+ "cp36-manylinux_x86_64",
+ "cp37-manylinux_x86_64",
+ "cp311-manylinux_x86_64",
+ ]
+ assert before_alls(build_steps[0]) == ["", "", ""]
assert build_steps[1].container_image == "other_container_image"
assert identifiers(build_steps[1]) == ["cp38-manylinux_x86_64", "cp310-manylinux_x86_64"]
diff --git a/unit_test/option_prepare_test.py b/unit_test/option_prepare_test.py
index bc01317b..9b21d329 100644
--- a/unit_test/option_prepare_test.py
+++ b/unit_test/option_prepare_test.py
@@ -13,7 +13,7 @@ import pytest
from cibuildwheel import linux, util
from cibuildwheel.__main__ import main
-ALL_IDS = {"cp36", "cp37", "cp38", "cp39", "cp310", "pp37", "pp38", "pp39"}
+ALL_IDS = {"cp36", "cp37", "cp38", "cp39", "cp310", "cp311", "pp37", "pp38", "pp39"}
@pytest.fixture
@@ -137,7 +137,8 @@ before-all = "true"
identifiers = {x.identifier for x in kwargs["platform_configs"]}
assert identifiers == {
- f"{x}-manylinux_x86_64" for x in ALL_IDS - {"cp36", "cp310", "pp37", "pp38", "pp39"}
+ f"{x}-manylinux_x86_64"
+ for x in ALL_IDS - {"cp36", "cp310", "cp311", "pp37", "pp38", "pp39"}
}
assert kwargs["options"].build_options("cp37-manylinux_x86_64").before_all == ""
@@ -147,10 +148,7 @@ before-all = "true"
assert not kwargs["container"]["simulate_32_bit"]
identifiers = {x.identifier for x in kwargs["platform_configs"]}
assert identifiers == {
- "cp310-manylinux_x86_64",
- "pp37-manylinux_x86_64",
- "pp38-manylinux_x86_64",
- "pp39-manylinux_x86_64",
+ f"{x}-manylinux_x86_64" for x in {"cp310", "cp311", "pp37", "pp38", "pp39"}
}
kwargs = build_in_container.call_args_list[3][1]
diff --git a/unit_test/options_toml_test.py b/unit_test/options_toml_test.py
index a3fab2cc..a0a1705d 100644
--- a/unit_test/options_toml_test.py
+++ b/unit_test/options_toml_test.py
@@ -160,9 +160,28 @@ repairs-wheel-command = "repair-project-linux"
"""
)
- with pytest.raises(ConfigOptionError):
+ with pytest.raises(ConfigOptionError) as excinfo:
OptionsReader(pyproject_toml, platform="linux")
+ assert "repair-wheel-command" in str(excinfo.value)
+
+
+def test_underscores_in_key(tmp_path):
+ # Note that platform contents are only checked when running
+ # for that platform.
+ pyproject_toml = tmp_path / "pyproject.toml"
+ pyproject_toml.write_text(
+ """
+[tool.cibuildwheel]
+repair_wheel_command = "repair-project-linux"
+"""
+ )
+
+ with pytest.raises(ConfigOptionError) as excinfo:
+ OptionsReader(pyproject_toml, platform="linux")
+
+ assert "repair-wheel-command" in str(excinfo.value)
+
def test_unexpected_table(tmp_path):
pyproject_toml = tmp_path / "pyproject.toml"