Skip to content

Commit 10c727e

Browse files
feat: Python 3.14rc1 build by default (#2507)
1 parent f628c9d commit 10c727e

File tree

9 files changed

+63
-53
lines changed

9 files changed

+63
-53
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ While cibuildwheel itself requires a recent Python version to run (we support th
3131
| CPython 3.11 ||||| ✅² |||||| ✅⁵ | N/A | N/A | N/A |
3232
| CPython 3.12 ||||| ✅² |||||| ✅⁵ | N/A | N/A | ✅⁴ |
3333
| CPython 3.13³ ||||| ✅² |||||| ✅⁵ ||| N/A |
34-
| CPython 3.14³ ||||| ✅² |||||| ✅⁵ | N/A | N/A | N/A |
34+
| CPython 3.14 ||||| ✅² |||||| ✅⁵ | N/A | N/A | N/A |
3535
| PyPy 3.8 v7.3 |||| N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
3636
| PyPy 3.9 v7.3 |||| N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
3737
| PyPy 3.10 v7.3 |||| N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
@@ -40,7 +40,7 @@ While cibuildwheel itself requires a recent Python version to run (we support th
4040

4141
<sup>¹ PyPy & GraalPy are only supported for manylinux wheels.</sup><br>
4242
<sup>² Windows arm64 support is experimental.</sup><br>
43-
<sup>³ Free-threaded mode requires opt-in using [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).</sup><br>
43+
<sup>³ Free-threaded mode requires opt-in on 3.13 using [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).</sup><br>
4444
<sup>⁴ Experimental, not yet supported on PyPI, but can be used directly in web deployment. Use `--platform pyodide` to build.</sup><br>
4545
<sup>⁵ manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.</sup><br>
4646

cibuildwheel/resources/build-platforms.toml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,12 @@ python_configurations = [
165165
{ identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.5/python-3.13.5-macos11.pkg" },
166166
{ identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.5/python-3.13.5-macos11.pkg" },
167167
{ identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.5/python-3.13.5-macos11.pkg" },
168-
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0b4-macos11.pkg" },
169-
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0b4-macos11.pkg" },
170-
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0b4-macos11.pkg" },
171-
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0b4-macos11.pkg" },
172-
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0b4-macos11.pkg" },
173-
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0b4-macos11.pkg" },
168+
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-macos11.pkg" },
169+
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-macos11.pkg" },
170+
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-macos11.pkg" },
171+
{ identifier = "cp314t-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-macos11.pkg" },
172+
{ identifier = "cp314t-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-macos11.pkg" },
173+
{ identifier = "cp314t-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.0/python-3.14.0rc1-macos11.pkg" },
174174
{ identifier = "pp38-macosx_x86_64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-macos_x86_64.tar.bz2" },
175175
{ identifier = "pp38-macosx_arm64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-macos_arm64.tar.bz2" },
176176
{ identifier = "pp39-macosx_x86_64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_x86_64.tar.bz2" },
@@ -199,18 +199,18 @@ python_configurations = [
199199
{ identifier = "cp313t-win32", version = "3.13.5", arch = "32" },
200200
{ identifier = "cp313-win_amd64", version = "3.13.5", arch = "64" },
201201
{ identifier = "cp313t-win_amd64", version = "3.13.5", arch = "64" },
202-
{ identifier = "cp314-win32", version = "3.14.0-b4", arch = "32" },
203-
{ identifier = "cp314t-win32", version = "3.14.0-b4", arch = "32" },
204-
{ identifier = "cp314-win_amd64", version = "3.14.0-b4", arch = "64" },
205-
{ identifier = "cp314t-win_amd64", version = "3.14.0-b4", arch = "64" },
202+
{ identifier = "cp314-win32", version = "3.14.0-rc1", arch = "32" },
203+
{ identifier = "cp314t-win32", version = "3.14.0-rc1", arch = "32" },
204+
{ identifier = "cp314-win_amd64", version = "3.14.0-rc1", arch = "64" },
205+
{ identifier = "cp314t-win_amd64", version = "3.14.0-rc1", arch = "64" },
206206
{ identifier = "cp39-win_arm64", version = "3.9.10", arch = "ARM64" },
207207
{ identifier = "cp310-win_arm64", version = "3.10.11", arch = "ARM64" },
208208
{ identifier = "cp311-win_arm64", version = "3.11.9", arch = "ARM64" },
209209
{ identifier = "cp312-win_arm64", version = "3.12.10", arch = "ARM64" },
210210
{ identifier = "cp313-win_arm64", version = "3.13.5", arch = "ARM64" },
211211
{ identifier = "cp313t-win_arm64", version = "3.13.5", arch = "ARM64" },
212-
{ identifier = "cp314-win_arm64", version = "3.14.0-b4", arch = "ARM64" },
213-
{ identifier = "cp314t-win_arm64", version = "3.14.0-b4", arch = "ARM64" },
212+
{ identifier = "cp314-win_arm64", version = "3.14.0-rc1", arch = "ARM64" },
213+
{ identifier = "cp314t-win_arm64", version = "3.14.0-rc1", arch = "ARM64" },
214214
{ identifier = "pp38-win_amd64", version = "3.8", arch = "64", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-win64.zip" },
215215
{ identifier = "pp39-win_amd64", version = "3.9", arch = "64", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip" },
216216
{ identifier = "pp310-win_amd64", version = "3.10", arch = "64", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-win64.zip" },
Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,53 @@
11
[x86_64]
2-
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.07.20-2
3-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.07.20-2
4-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.07.20-2
5-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.07.20-2
2+
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.07.23-1
3+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.07.23-1
4+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.07.23-1
5+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.07.23-1
66

77
[i686]
8-
manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.07.20-2
9-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2025.07.20-2
10-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2025.07.20-2
11-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2025.07.20-2
8+
manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.07.23-1
9+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2025.07.23-1
10+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2025.07.23-1
11+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2025.07.23-1
1212

1313
[aarch64]
14-
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.07.20-2
15-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.07.20-2
16-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.07.20-2
17-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2025.07.20-2
14+
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.07.23-1
15+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.07.23-1
16+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.07.23-1
17+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2025.07.23-1
1818

1919
[ppc64le]
20-
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2025.07.20-2
21-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2025.07.20-2
22-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2025.07.20-2
23-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2025.07.20-2
20+
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2025.07.23-1
21+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2025.07.23-1
22+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2025.07.23-1
23+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2025.07.23-1
2424

2525
[s390x]
26-
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2025.07.20-2
27-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2025.07.20-2
28-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2025.07.20-2
29-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2025.07.20-2
26+
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2025.07.23-1
27+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2025.07.23-1
28+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2025.07.23-1
29+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2025.07.23-1
3030

3131
[pypy_x86_64]
32-
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.07.20-2
33-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.07.20-2
34-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.07.20-2
32+
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.07.23-1
33+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.07.23-1
34+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.07.23-1
3535

3636
[pypy_i686]
37-
manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.07.20-2
38-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2025.07.20-2
39-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2025.07.20-2
37+
manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.07.23-1
38+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_i686:2025.07.23-1
39+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_i686:2025.07.23-1
4040

4141
[pypy_aarch64]
42-
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.07.20-2
43-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.07.20-2
44-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.07.20-2
42+
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.07.23-1
43+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.07.23-1
44+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.07.23-1
4545

4646
[armv7l]
47-
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2025.07.20-2
48-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2025.07.20-2
47+
manylinux_2_31 = quay.io/pypa/manylinux_2_31_armv7l:2025.07.23-1
48+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2025.07.23-1
4949

5050
[riscv64]
51-
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64:2025.07.20-2
52-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2025.07.20-2
51+
manylinux_2_39 = quay.io/pypa/manylinux_2_39_riscv64:2025.07.23-1
52+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_riscv64:2025.07.23-1
5353

cibuildwheel/selector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def __call__(self, build_id: str) -> bool:
8787
# filter out groups that are not enabled
8888
if EnableGroup.CPythonFreeThreading not in self.enable and fnmatch(build_id, "cp313t-*"):
8989
return False
90-
if EnableGroup.CPythonPrerelease not in self.enable and fnmatch(build_id, "cp314*"):
90+
if EnableGroup.CPythonPrerelease not in self.enable and fnmatch(build_id, "cp315*"):
9191
return False
9292
if EnableGroup.PyPy not in self.enable and fnmatch(build_id, "pp31*"):
9393
return False

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ py-version = "3.11"
148148
jobs = "0"
149149
fail-on = ["E", "F"]
150150
fail-under = "9.8"
151+
max-positional-arguments = "7"
151152
reports.output-format = "colorized"
152153
messages_control.enable = [
153154
"useless-suppression",

test/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,16 @@ def _expected_wheels(
272272
"cp311-cp311",
273273
"cp312-cp312",
274274
"cp313-cp313",
275+
"cp314-cp314",
276+
"cp314-cp314t",
275277
]
276278

277279
enable_groups = get_enable_groups()
278280
if EnableGroup.CPythonFreeThreading in enable_groups:
279281
python_abi_tags.append("cp313-cp313t")
280282

281283
if EnableGroup.CPythonPrerelease in enable_groups:
282-
python_abi_tags.append("cp314-cp314")
283-
python_abi_tags.append("cp314-cp314t")
284+
... # Add cp315 here when available
284285

285286
if EnableGroup.PyPyEoL in enable_groups:
286287
python_abi_tags += [

unit_test/build_selector_test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def test_build():
1515
assert build_selector("cp311-manylinux_x86_64")
1616
assert build_selector("cp312-manylinux_x86_64")
1717
assert build_selector("cp313-manylinux_x86_64")
18+
assert build_selector("cp314-manylinux_x86_64")
1819
assert build_selector("pp310-manylinux_x86_64")
1920
assert build_selector("pp311-manylinux_x86_64")
2021
assert build_selector("cp36-manylinux_i686")
@@ -36,6 +37,7 @@ def test_build():
3637
assert build_selector("cp311-win_amd64")
3738
assert build_selector("cp312-win_amd64")
3839
assert build_selector("cp313-win_amd64")
40+
assert build_selector("cp314-win_amd64")
3941
assert not build_selector("pp310-win_amd64")
4042
assert not build_selector("pp311-win_amd64")
4143

unit_test/linux_build_steps_test.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ def container_engines(
9090
"cp311-manylinux_x86_64",
9191
"cp312-manylinux_x86_64",
9292
"cp313-manylinux_x86_64",
93+
"cp314-manylinux_x86_64",
94+
"cp314t-manylinux_x86_64",
9395
]
94-
assert before_alls(build_steps[3]) == [""] * 3
95-
assert container_engines(build_steps[3]) == [default_container_engine] * 3
96+
assert before_alls(build_steps[3]) == [""] * 5
97+
assert container_engines(build_steps[3]) == [default_container_engine] * 5

unit_test/option_prepare_test.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from cibuildwheel.oci_container import OCIPlatform
1414
from cibuildwheel.util import file
1515

16-
DEFAULT_IDS = {"cp38", "cp39", "cp310", "cp311", "cp312", "cp313"}
16+
DEFAULT_IDS = {"cp38", "cp39", "cp310", "cp311", "cp312", "cp313", "cp314", "cp314t"}
1717
ALL_IDS = DEFAULT_IDS | {"cp313t", "pp38", "pp39", "pp310", "pp311", "gp311_242"}
1818

1919

@@ -155,6 +155,8 @@ def test_build_with_override_launches(monkeypatch, tmp_path):
155155
"cp312",
156156
"cp313",
157157
"cp313t",
158+
"cp314",
159+
"cp314t",
158160
"pp38",
159161
"pp39",
160162
"pp310",
@@ -177,6 +179,8 @@ def test_build_with_override_launches(monkeypatch, tmp_path):
177179
"cp312",
178180
"cp313",
179181
"cp313t",
182+
"cp314",
183+
"cp314t",
180184
"pp38",
181185
"pp39",
182186
"pp310",

0 commit comments

Comments
 (0)