diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml
index db5510269..7ae7b9b9b 100644
--- a/.github/workflows/update-dependencies.yml
+++ b/.github/workflows/update-dependencies.yml
@@ -24,7 +24,7 @@ jobs:
- uses: wntrblm/nox@2023.04.22
with:
- python-versions: "3.7, 3.8, 3.9, 3.10, 3.11"
+ python-versions: "3.7, 3.8, 3.9, 3.10, 3.11, 3.12-dev"
- name: "Run update: dependencies"
run: nox --force-color -s update_constraints
diff --git a/README.md b/README.md
index cec9e9734..2b0050dca 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,7 @@ What does it do?
| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅³ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
+| CPython 3.12⁵ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ |
| 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 |
| PyPy 3.9 v7.3 | ✅ | ✅⁴ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A |
@@ -39,6 +40,7 @@ What does it do?
² 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.
⁴ Cross-compilation not supported with PyPy - to build these wheels you need to run cibuildwheel on an Apple Silicon machine.
+⁵ CPython 3.12 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, GitLab CI, and Cirrus CI
diff --git a/cibuildwheel/resources/build-platforms.toml b/cibuildwheel/resources/build-platforms.toml
index 776606341..ca5e251b9 100644
--- a/cibuildwheel/resources/build-platforms.toml
+++ b/cibuildwheel/resources/build-platforms.toml
@@ -6,12 +6,14 @@ python_configurations = [
{ identifier = "cp39-manylinux_x86_64", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-manylinux_x86_64", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-manylinux_x86_64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-manylinux_x86_64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp36-manylinux_i686", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
{ identifier = "cp37-manylinux_i686", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
{ identifier = "cp38-manylinux_i686", version = "3.8", path_str = "/opt/python/cp38-cp38" },
{ identifier = "cp39-manylinux_i686", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-manylinux_i686", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-manylinux_i686", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-manylinux_i686", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "pp37-manylinux_x86_64", version = "3.7", path_str = "/opt/python/pp37-pypy37_pp73" },
{ identifier = "pp38-manylinux_x86_64", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" },
{ identifier = "pp39-manylinux_x86_64", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" },
@@ -21,18 +23,21 @@ python_configurations = [
{ identifier = "cp39-manylinux_aarch64", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-manylinux_aarch64", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-manylinux_aarch64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-manylinux_aarch64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp36-manylinux_ppc64le", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
{ identifier = "cp37-manylinux_ppc64le", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
{ identifier = "cp38-manylinux_ppc64le", version = "3.8", path_str = "/opt/python/cp38-cp38" },
{ identifier = "cp39-manylinux_ppc64le", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-manylinux_ppc64le", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-manylinux_ppc64le", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-manylinux_ppc64le", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp36-manylinux_s390x", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
{ identifier = "cp37-manylinux_s390x", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
{ identifier = "cp38-manylinux_s390x", version = "3.8", path_str = "/opt/python/cp38-cp38" },
{ identifier = "cp39-manylinux_s390x", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-manylinux_s390x", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-manylinux_s390x", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-manylinux_s390x", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "pp37-manylinux_aarch64", version = "3.7", path_str = "/opt/python/pp37-pypy37_pp73" },
{ identifier = "pp38-manylinux_aarch64", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" },
{ identifier = "pp39-manylinux_aarch64", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" },
@@ -45,30 +50,35 @@ python_configurations = [
{ identifier = "cp39-musllinux_x86_64", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-musllinux_x86_64", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-musllinux_x86_64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-musllinux_x86_64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp36-musllinux_i686", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
{ identifier = "cp37-musllinux_i686", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
{ identifier = "cp38-musllinux_i686", version = "3.8", path_str = "/opt/python/cp38-cp38" },
{ identifier = "cp39-musllinux_i686", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-musllinux_i686", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-musllinux_i686", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-musllinux_i686", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp36-musllinux_aarch64", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
{ identifier = "cp37-musllinux_aarch64", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
{ identifier = "cp38-musllinux_aarch64", version = "3.8", path_str = "/opt/python/cp38-cp38" },
{ identifier = "cp39-musllinux_aarch64", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-musllinux_aarch64", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-musllinux_aarch64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-musllinux_aarch64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp36-musllinux_ppc64le", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
{ identifier = "cp37-musllinux_ppc64le", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
{ identifier = "cp38-musllinux_ppc64le", version = "3.8", path_str = "/opt/python/cp38-cp38" },
{ identifier = "cp39-musllinux_ppc64le", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-musllinux_ppc64le", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-musllinux_ppc64le", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-musllinux_ppc64le", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp36-musllinux_s390x", version = "3.6", path_str = "/opt/python/cp36-cp36m" },
{ identifier = "cp37-musllinux_s390x", version = "3.7", path_str = "/opt/python/cp37-cp37m" },
{ identifier = "cp38-musllinux_s390x", version = "3.8", path_str = "/opt/python/cp38-cp38" },
{ identifier = "cp39-musllinux_s390x", version = "3.9", path_str = "/opt/python/cp39-cp39" },
{ identifier = "cp310-musllinux_s390x", version = "3.10", path_str = "/opt/python/cp310-cp310" },
{ identifier = "cp311-musllinux_s390x", version = "3.11", path_str = "/opt/python/cp311-cp311" },
+ { identifier = "cp312-musllinux_s390x", version = "3.12", path_str = "/opt/python/cp312-cp312" },
]
[macos]
@@ -87,6 +97,9 @@ python_configurations = [
{ identifier = "cp311-macosx_x86_64", version = "3.11", url = "https://www.python.org/ftp/python/3.11.3/python-3.11.3-macos11.pkg" },
{ identifier = "cp311-macosx_arm64", version = "3.11", url = "https://www.python.org/ftp/python/3.11.3/python-3.11.3-macos11.pkg" },
{ identifier = "cp311-macosx_universal2", version = "3.11", url = "https://www.python.org/ftp/python/3.11.3/python-3.11.3-macos11.pkg" },
+ { identifier = "cp312-macosx_x86_64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.0/python-3.12.0b1-macos11.pkg" },
+ { identifier = "cp312-macosx_arm64", version = "3.12", url = "https://www.python.org/ftp/python/3.12.0/python-3.12.0b1-macos11.pkg" },
+ { identifier = "cp312-macosx_universal2", version = "3.12", url = "https://www.python.org/ftp/python/3.12.0/python-3.12.0b1-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.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" },
@@ -108,9 +121,12 @@ python_configurations = [
{ identifier = "cp310-win_amd64", version = "3.10.11", arch = "64" },
{ identifier = "cp311-win32", version = "3.11.3", arch = "32" },
{ identifier = "cp311-win_amd64", version = "3.11.3", arch = "64" },
+ { identifier = "cp312-win32", version = "3.12.0-b1", arch = "32" },
+ { identifier = "cp312-win_amd64", version = "3.12.0-b1", arch = "64" },
{ identifier = "cp39-win_arm64", version = "3.9.10", arch = "ARM64" },
{ identifier = "cp310-win_arm64", version = "3.10.11", arch = "ARM64" },
{ identifier = "cp311-win_arm64", version = "3.11.3", arch = "ARM64" },
+ { identifier = "cp312-win_arm64", version = "3.12.0-b1", 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.11-win64.zip" },
{ identifier = "pp39-win_amd64", version = "3.9", arch = "64", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.11-win64.zip" },
diff --git a/cibuildwheel/resources/constraints-python310.txt b/cibuildwheel/resources/constraints-python310.txt
index 4308bac8d..8c9754a1e 100644
--- a/cibuildwheel/resources/constraints-python310.txt
+++ b/cibuildwheel/resources/constraints-python310.txt
@@ -14,7 +14,7 @@ packaging==23.1
# via delocate
platformdirs==3.5.1
# via virtualenv
-typing-extensions==4.5.0
+typing-extensions==4.6.2
# via delocate
virtualenv==20.23.0
# via -r cibuildwheel/resources/constraints.in
@@ -24,5 +24,5 @@ wheel==0.40.0
# The following packages are considered to be unsafe in a requirements file:
pip==23.1.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==67.7.2
+setuptools==67.8.0
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python311.txt b/cibuildwheel/resources/constraints-python311.txt
index 64f9c1882..defbaa8e0 100644
--- a/cibuildwheel/resources/constraints-python311.txt
+++ b/cibuildwheel/resources/constraints-python311.txt
@@ -14,7 +14,7 @@ packaging==23.1
# via delocate
platformdirs==3.5.1
# via virtualenv
-typing-extensions==4.5.0
+typing-extensions==4.6.2
# via delocate
virtualenv==20.23.0
# via -r cibuildwheel/resources/constraints.in
@@ -24,5 +24,5 @@ wheel==0.40.0
# The following packages are considered to be unsafe in a requirements file:
pip==23.1.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==67.7.2
+setuptools==67.8.0
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python312.txt b/cibuildwheel/resources/constraints-python312.txt
new file mode 100644
index 000000000..ee298f290
--- /dev/null
+++ b/cibuildwheel/resources/constraints-python312.txt
@@ -0,0 +1,28 @@
+#
+# This file is autogenerated by pip-compile with Python 3.12
+# by the following command:
+#
+# nox -s update_constraints-3.12
+#
+delocate==0.10.4
+ # via -r cibuildwheel/resources/constraints.in
+distlib==0.3.6
+ # via virtualenv
+filelock==3.12.0
+ # via virtualenv
+packaging==23.1
+ # via delocate
+platformdirs==3.5.1
+ # via virtualenv
+typing-extensions==4.6.2
+ # via delocate
+virtualenv==20.23.0
+ # via -r cibuildwheel/resources/constraints.in
+wheel==0.40.0
+ # via -r cibuildwheel/resources/constraints.in
+
+# The following packages are considered to be unsafe in a requirements file:
+pip==23.1.2
+ # via -r cibuildwheel/resources/constraints.in
+setuptools==67.8.0
+ # via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python37.txt b/cibuildwheel/resources/constraints-python37.txt
index 57950e954..f0c9f544b 100644
--- a/cibuildwheel/resources/constraints-python37.txt
+++ b/cibuildwheel/resources/constraints-python37.txt
@@ -16,7 +16,7 @@ packaging==23.1
# via delocate
platformdirs==3.5.1
# via virtualenv
-typing-extensions==4.5.0
+typing-extensions==4.6.2
# via
# delocate
# importlib-metadata
@@ -31,5 +31,5 @@ zipp==3.15.0
# The following packages are considered to be unsafe in a requirements file:
pip==23.1.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==67.7.2
+setuptools==67.8.0
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python38.txt b/cibuildwheel/resources/constraints-python38.txt
index 1f9a70fe4..57d163755 100644
--- a/cibuildwheel/resources/constraints-python38.txt
+++ b/cibuildwheel/resources/constraints-python38.txt
@@ -14,7 +14,7 @@ packaging==23.1
# via delocate
platformdirs==3.5.1
# via virtualenv
-typing-extensions==4.5.0
+typing-extensions==4.6.2
# via delocate
virtualenv==20.23.0
# via -r cibuildwheel/resources/constraints.in
@@ -24,5 +24,5 @@ wheel==0.40.0
# The following packages are considered to be unsafe in a requirements file:
pip==23.1.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==67.7.2
+setuptools==67.8.0
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints-python39.txt b/cibuildwheel/resources/constraints-python39.txt
index df10555b2..561742665 100644
--- a/cibuildwheel/resources/constraints-python39.txt
+++ b/cibuildwheel/resources/constraints-python39.txt
@@ -14,7 +14,7 @@ packaging==23.1
# via delocate
platformdirs==3.5.1
# via virtualenv
-typing-extensions==4.5.0
+typing-extensions==4.6.2
# via delocate
virtualenv==20.23.0
# via -r cibuildwheel/resources/constraints.in
@@ -24,5 +24,5 @@ wheel==0.40.0
# The following packages are considered to be unsafe in a requirements file:
pip==23.1.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==67.7.2
+setuptools==67.8.0
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/constraints.txt b/cibuildwheel/resources/constraints.txt
index 64f9c1882..ee298f290 100644
--- a/cibuildwheel/resources/constraints.txt
+++ b/cibuildwheel/resources/constraints.txt
@@ -1,8 +1,8 @@
#
-# This file is autogenerated by pip-compile with Python 3.11
+# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
-# nox -s update_constraints-3.11
+# nox -s update_constraints-3.12
#
delocate==0.10.4
# via -r cibuildwheel/resources/constraints.in
@@ -14,7 +14,7 @@ packaging==23.1
# via delocate
platformdirs==3.5.1
# via virtualenv
-typing-extensions==4.5.0
+typing-extensions==4.6.2
# via delocate
virtualenv==20.23.0
# via -r cibuildwheel/resources/constraints.in
@@ -24,5 +24,5 @@ wheel==0.40.0
# The following packages are considered to be unsafe in a requirements file:
pip==23.1.2
# via -r cibuildwheel/resources/constraints.in
-setuptools==67.7.2
+setuptools==67.8.0
# via -r cibuildwheel/resources/constraints.in
diff --git a/cibuildwheel/resources/pinned_docker_images.cfg b/cibuildwheel/resources/pinned_docker_images.cfg
index d36239948..a29dd5aee 100644
--- a/cibuildwheel/resources/pinned_docker_images.cfg
+++ b/cibuildwheel/resources/pinned_docker_images.cfg
@@ -1,49 +1,49 @@
[x86_64]
manylinux1 = quay.io/pypa/manylinux1_x86_64:2023-05-01-496eb35
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
-manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2023-05-24-3bf828e
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:2023-04-30-c9c30dc
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2023-04-30-c9c30dc
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2023-05-24-3bf828e
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2023-05-24-3bf828e
[i686]
manylinux1 = quay.io/pypa/manylinux1_i686:2023-05-01-496eb35
manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
-manylinux2014 = quay.io/pypa/manylinux2014_i686:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_i686:2023-05-24-3bf828e
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2023-04-30-c9c30dc
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2023-05-24-3bf828e
[pypy_x86_64]
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
-manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2023-05-24-3bf828e
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:2023-04-30-c9c30dc
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2023-05-24-3bf828e
[pypy_i686]
manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
-manylinux2014 = quay.io/pypa/manylinux2014_i686:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_i686:2023-05-24-3bf828e
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463
[aarch64]
-manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2023-05-24-3bf828e
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2023-04-30-c9c30dc
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2023-04-30-c9c30dc
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2023-05-24-3bf828e
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2023-05-24-3bf828e
[ppc64le]
-manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2023-05-24-3bf828e
manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-12-26-0d38463
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2023-04-30-c9c30dc
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2023-04-30-c9c30dc
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2023-05-24-3bf828e
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2023-05-24-3bf828e
[s390x]
-manylinux2014 = quay.io/pypa/manylinux2014_s390x:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_s390x:2023-05-24-3bf828e
manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-12-26-0d38463
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2023-04-30-c9c30dc
-musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2023-04-30-c9c30dc
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2023-05-24-3bf828e
+musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2023-05-24-3bf828e
[pypy_aarch64]
-manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2023-04-30-c9c30dc
+manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2023-05-24-3bf828e
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463
-manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2023-04-30-c9c30dc
+manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2023-05-24-3bf828e
diff --git a/cibuildwheel/util.py b/cibuildwheel/util.py
index 79b8bd951..dfc6e65cf 100644
--- a/cibuildwheel/util.py
+++ b/cibuildwheel/util.py
@@ -252,7 +252,7 @@ class BuildSelector:
requires_python: SpecifierSet | None = None
# a pattern that skips prerelease versions, when include_prereleases is False.
- PRERELEASE_SKIP: ClassVar[str] = ""
+ PRERELEASE_SKIP: ClassVar[str] = "cp312-*"
prerelease_pythons: bool = False
def __call__(self, build_id: str) -> bool:
diff --git a/docs/options.md b/docs/options.md
index e7872bb12..e5f9fe0f9 100644
--- a/docs/options.md
+++ b/docs/options.md
@@ -226,6 +226,7 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat
| Python 3.9 | cp39-macosx_x86_64
cp39-macosx_universal2
cp39-macosx_arm64 | cp39-win_amd64
cp39-win32
cp39-win_arm64 | cp39-manylinux_x86_64
cp39-manylinux_i686
cp39-musllinux_x86_64
cp39-musllinux_i686 | cp39-manylinux_aarch64
cp39-manylinux_ppc64le
cp39-manylinux_s390x
cp39-musllinux_aarch64
cp39-musllinux_ppc64le
cp39-musllinux_s390x |
| Python 3.10 | cp310-macosx_x86_64
cp310-macosx_universal2
cp310-macosx_arm64 | cp310-win_amd64
cp310-win32
cp310-win_arm64 | cp310-manylinux_x86_64
cp310-manylinux_i686
cp310-musllinux_x86_64
cp310-musllinux_i686 | cp310-manylinux_aarch64
cp310-manylinux_ppc64le
cp310-manylinux_s390x
cp310-musllinux_aarch64
cp310-musllinux_ppc64le
cp310-musllinux_s390x |
| Python 3.11 | cp311-macosx_x86_64
cp311-macosx_universal2
cp311-macosx_arm64 | cp311-win_amd64
cp311-win32
cp311-win_arm64 | cp311-manylinux_x86_64
cp311-manylinux_i686
cp311-musllinux_x86_64
cp311-musllinux_i686 | cp311-manylinux_aarch64
cp311-manylinux_ppc64le
cp311-manylinux_s390x
cp311-musllinux_aarch64
cp311-musllinux_ppc64le
cp311-musllinux_s390x |
+| Python 3.12 | cp312-macosx_x86_64
cp312-macosx_universal2
cp312-macosx_arm64 | cp312-win_amd64
cp312-win32
cp312-win_arm64 | cp312-manylinux_x86_64
cp312-manylinux_i686
cp312-musllinux_x86_64
cp312-musllinux_i686 | cp312-manylinux_aarch64
cp312-manylinux_ppc64le
cp312-manylinux_s390x
cp312-musllinux_aarch64
cp312-musllinux_ppc64le
cp312-musllinux_s390x |
| PyPy3.7 v7.3 | pp37-macosx_x86_64 | pp37-win_amd64 | pp37-manylinux_x86_64
pp37-manylinux_i686 | pp37-manylinux_aarch64 |
| PyPy3.8 v7.3 | pp38-macosx_x86_64
pp38-macosx_arm64 | pp38-win_amd64 | pp38-manylinux_x86_64
pp38-manylinux_i686 | pp38-manylinux_aarch64 |
| PyPy3.9 v7.3 | pp39-macosx_x86_64
pp39-macosx_arm64 | pp39-win_amd64 | pp39-manylinux_x86_64
pp39-manylinux_i686 | pp39-manylinux_aarch64 |
diff --git a/noxfile.py b/noxfile.py
index 40c673110..0e66647cd 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -9,7 +9,7 @@
nox.options.sessions = ["lint", "pylint", "check_manifest", "tests"]
-PYTHON_ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"]
+PYTHON_ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
DIR = Path(__file__).parent.resolve()
diff --git a/test/test_abi_variants.py b/test/test_abi_variants.py
index 114736553..131b1ee9f 100644
--- a/test/test_abi_variants.py
+++ b/test/test_abi_variants.py
@@ -47,7 +47,7 @@ def test_abi3(tmp_path):
expected_wheels = [
w.replace("cp38-cp38", "cp38-abi3")
for w in utils.expected_wheels("spam", "0.1.0")
- if "-pp" not in w and "-cp39" not in w and "-cp310" not in w and "-cp311" not in w
+ if "-pp" not in w and "-cp39" not in w and "-cp31" not in w
]
assert set(actual_wheels) == set(expected_wheels)
diff --git a/test/test_dependency_versions.py b/test/test_dependency_versions.py
index 269952e53..a95a4631d 100644
--- a/test/test_dependency_versions.py
+++ b/test/test_dependency_versions.py
@@ -120,10 +120,10 @@ def test_dependency_constraints_file(tmp_path, build_frontend_env):
project_with_expected_version_checks.generate(project_dir)
tool_versions = {
- "pip": "20.0.2",
- "setuptools": "53.0.0",
- "wheel": "0.36.2",
- "virtualenv": "20.11.2",
+ "pip": "23.1.2",
+ "setuptools": "67.7.2",
+ "wheel": "0.38.3",
+ "virtualenv": "20.23.0",
}
constraints_file = tmp_path / "constraints file.txt"
@@ -155,11 +155,12 @@ def test_dependency_constraints_file(tmp_path, build_frontend_env):
add_env={
"CIBW_ENVIRONMENT": cibw_environment_option,
"CIBW_DEPENDENCY_VERSIONS": str(constraints_file),
+ "CIBW_SKIP": "cp36-*",
**build_frontend_env,
},
)
# also check that we got the right wheels
- expected_wheels = utils.expected_wheels("spam", "0.1.0")
+ expected_wheels = [w for w in utils.expected_wheels("spam", "0.1.0") if "-cp36" not in w]
assert set(actual_wheels) == set(expected_wheels)
diff --git a/test/test_manylinuxXXXX_only.py b/test/test_manylinuxXXXX_only.py
index d2e91b1d2..d6309c796 100644
--- a/test/test_manylinuxXXXX_only.py
+++ b/test/test_manylinuxXXXX_only.py
@@ -84,8 +84,11 @@ def test(manylinux_image, tmp_path):
# We don't have a manylinux1 image for PyPy & CPython 3.10 and above
add_env["CIBW_SKIP"] = "pp* cp31*"
if manylinux_image in {"manylinux2010"}:
- # We don't have a manylinux2010 image for PyPy 3.9, CPython 3.11
- add_env["CIBW_SKIP"] = "pp39* cp311*"
+ # We don't have a manylinux2010 image for PyPy 3.9, CPython 3.11+
+ add_env["CIBW_SKIP"] = "pp39* cp311* cp312*"
+ if manylinux_image in {"manylinux_2_24"}:
+ # We don't have a manylinux_2_24 image for CPython 3.12+
+ add_env["CIBW_SKIP"] = "cp312*"
if manylinux_image == "manylinux_2_28" and platform.machine() == "x86_64":
# We don't have a manylinux_2_28 image for i686
add_env["CIBW_ARCHS"] = "x86_64"
@@ -109,7 +112,15 @@ def test(manylinux_image, tmp_path):
if manylinux_image in {"manylinux2010"}:
# remove PyPy 3.9 & CPython 3.11
- expected_wheels = [w for w in expected_wheels if "-pp39" not in w and "-cp311" not in w]
+ expected_wheels = [
+ w
+ for w in expected_wheels
+ if "-pp39" not in w and "-cp311" not in w and "-cp312" not in w
+ ]
+
+ if manylinux_image in {"manylinux_2_24"}:
+ # remove CPython 3.11 and above
+ expected_wheels = [w for w in expected_wheels if "-cp312" not in w]
if manylinux_image == "manylinux_2_28" and platform.machine() == "x86_64":
# We don't have a manylinux_2_28 image for i686
diff --git a/test/test_pep518.py b/test/test_pep518.py
index 557ead469..c88953ce8 100644
--- a/test/test_pep518.py
+++ b/test/test_pep518.py
@@ -9,7 +9,7 @@
"""
# Will fail if PEP 518 does work
import requests
- assert requests.__version__ == "2.23.0", "Requests found but wrong version ({0})".format(requests.__version__)
+ assert requests.__version__ == "2.27.0", "Requests found but wrong version ({0})".format(requests.__version__)
# Just making sure environment is still set
import os
@@ -27,7 +27,7 @@
"setuptools >= 42",
"setuptools_scm[toml]>=4.1.2",
"wheel",
- "requests==2.23.0"
+ "requests==2.27.0"
]
build-backend = "setuptools.build_meta"
diff --git a/test/utils.py b/test/utils.py
index 0e2b7a7fc..4b3853185 100644
--- a/test/utils.py
+++ b/test/utils.py
@@ -170,6 +170,7 @@ def expected_wheels(
"cp39-cp39",
"cp310-cp310",
"cp311-cp311",
+ "cp312-cp312",
]
if machine_arch in ["x86_64", "AMD64", "x86", "aarch64"]:
@@ -182,6 +183,7 @@ def expected_wheels(
"cp39-cp39",
"cp310-cp310",
"cp311-cp311",
+ "cp312-cp312",
"pp38-pypy38_pp73",
"pp39-pypy39_pp73",
]
diff --git a/unit_test/build_selector_test.py b/unit_test/build_selector_test.py
index 3e544900c..b4c6e96a4 100644
--- a/unit_test/build_selector_test.py
+++ b/unit_test/build_selector_test.py
@@ -12,6 +12,7 @@ def test_build():
assert build_selector("cp37-manylinux_x86_64")
assert build_selector("cp310-manylinux_x86_64")
assert build_selector("cp311-manylinux_x86_64")
+ assert not build_selector("cp312-manylinux_x86_64")
assert build_selector("pp36-manylinux_x86_64")
assert build_selector("pp37-manylinux_x86_64")
assert build_selector("cp36-manylinux_i686")
@@ -31,6 +32,7 @@ def test_build():
assert build_selector("cp37-win_amd64")
assert build_selector("cp310-win_amd64")
assert build_selector("cp311-win_amd64")
+ assert not build_selector("cp312-win_amd64")
assert not build_selector("pp36-win_amd64")
assert not build_selector("pp37-win_amd64")
@@ -43,9 +45,9 @@ def test_build_filter_pre():
)
assert build_selector("cp37-manylinux_x86_64")
- assert build_selector("cp311-manylinux_x86_64")
+ assert build_selector("cp312-manylinux_x86_64")
assert build_selector("cp37-win_amd64")
- assert build_selector("cp311-win_amd64")
+ assert build_selector("cp312-win_amd64")
def test_skip():