Skip to content

Commit 1ce42d7

Browse files
committed
Add GraalPy 25 and remove workarounds for that version.
1 parent 77b9e35 commit 1ce42d7

File tree

10 files changed

+64
-47
lines changed

10 files changed

+64
-47
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ While cibuildwheel itself requires a recent Python version to run (we support th
3737
| PyPy 3.10 v7.3 |||| N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
3838
| PyPy 3.11 v7.3 |||| N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
3939
| GraalPy 3.11 v24.2 |||| N/A | N/A | ✅¹ | N/A | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
40+
| GraalPy 3.12 v25.0 |||| N/A | N/A | ✅¹ | N/A | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
4041

4142
<sup>¹ PyPy & GraalPy are only supported for manylinux wheels.</sup><br>
4243
<sup>² Windows arm64 support is experimental.</sup><br>

bin/update_pythons.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ def update_version(self, identifier: str, spec: Specifier) -> ConfigUrl:
127127
raise RuntimeError(msg)
128128

129129
gpspec_str = identifier.split("-")[0].split("_")[1]
130-
gpspec = Specifier("==24.2.*") if gpspec_str == "242" else Specifier(f"=={gpspec_str}.*")
130+
if "." not in gpspec_str and len(gpspec_str) == 3:
131+
gpspec_str = gpspec_str[:2] + "." + gpspec_str[-1]
132+
gpspec = Specifier(f"=={gpspec_str}.*")
131133

132134
releases = [r for r in self.releases if spec.contains(r["python_version"])]
133135
releases = [r for r in self.releases if gpspec.contains(r["graalpy_version"])]

cibuildwheel/platforms/windows.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -339,11 +339,11 @@ def setup_python(
339339
setup_setuptools_cross_compile(tmp, python_configuration, python_libs_base, env)
340340
setup_rust_cross_compile(tmp, python_configuration, python_libs_base, env)
341341

342-
if implementation_id.startswith("gp"):
343-
# GraalPy fails to discover compilers, setup the relevant environment
342+
if implementation_id.startswith("gp311"):
343+
# GraalPy 24 fails to discover compilers, setup the relevant environment
344344
# variables. Adapted from
345345
# https://github.com/microsoft/vswhere/wiki/Start-Developer-Command-Prompt
346-
# Remove when https://github.com/oracle/graalpython/issues/492 is fixed.
346+
# Remove when GraalPy 24.x is dropped.
347347
vcpath = call(
348348
Path(os.environ["PROGRAMFILES(X86)"])
349349
/ "Microsoft Visual Studio"
@@ -453,15 +453,15 @@ def build(options: Options, tmp_path: Path) -> None:
453453
)
454454

455455
if (
456-
config.identifier.startswith("gp")
456+
config.identifier.startswith("gp311")
457457
and build_frontend.name == "build"
458458
and "--no-isolation" not in extra_flags
459459
and "-n" not in extra_flags
460460
):
461-
# GraalPy fails to discover its standard library when a venv is created
461+
# GraalPy 24 fails to discover its standard library when a venv is created
462462
# from a virtualenv seeded executable. See
463463
# https://github.com/oracle/graalpython/issues/491 and remove this once
464-
# fixed upstream.
464+
# GraalPy 24 is dropped.
465465
log.notice(
466466
"Disabling build isolation to workaround GraalPy bug. If the build fails, consider using pip or build[uv] as build frontend."
467467
)

cibuildwheel/resources/build-platforms.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ python_configurations = [
2323
{ identifier = "pp310-manylinux_x86_64", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" },
2424
{ identifier = "pp311-manylinux_x86_64", version = "3.11", path_str = "/opt/python/pp311-pypy311_pp73" },
2525
{ identifier = "gp311_242-manylinux_x86_64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" },
26+
{ identifier = "gp312_250-manylinux_x86_64", version = "3.12", path_str = "/opt/python/graalpy312-graalpy250_312_native" },
2627
{ identifier = "cp38-manylinux_aarch64", version = "3.8", path_str = "/opt/python/cp38-cp38" },
2728
{ identifier = "cp39-manylinux_aarch64", version = "3.9", path_str = "/opt/python/cp39-cp39" },
2829
{ identifier = "cp310-manylinux_aarch64", version = "3.10", path_str = "/opt/python/cp310-cp310" },
@@ -73,6 +74,7 @@ python_configurations = [
7374
{ identifier = "pp310-manylinux_aarch64", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" },
7475
{ identifier = "pp311-manylinux_aarch64", version = "3.11", path_str = "/opt/python/pp311-pypy311_pp73" },
7576
{ identifier = "gp311_242-manylinux_aarch64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" },
77+
{ identifier = "gp312_250-manylinux_aarch64", version = "3.12", path_str = "/opt/python/graalpy312-graalpy250_312_native" },
7678
{ identifier = "pp38-manylinux_i686", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" },
7779
{ identifier = "pp39-manylinux_i686", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" },
7880
{ identifier = "pp310-manylinux_i686", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" },
@@ -181,6 +183,8 @@ python_configurations = [
181183
{ identifier = "pp311-macosx_arm64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.20-macos_arm64.tar.bz2" },
182184
{ identifier = "gp311_242-macosx_x86_64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.2/graalpy-24.2.2-macos-amd64.tar.gz" },
183185
{ identifier = "gp311_242-macosx_arm64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.2/graalpy-24.2.2-macos-aarch64.tar.gz" },
186+
{ identifier = "gp312_250-macosx_x86_64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.0/graalpy-25.0.0-macos-amd64.tar.gz" },
187+
{ identifier = "gp312_250-macosx_arm64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.0/graalpy-25.0.0-macos-aarch64.tar.gz" },
184188
]
185189

186190
[windows]
@@ -216,6 +220,7 @@ python_configurations = [
216220
{ identifier = "pp310-win_amd64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-win64.zip" },
217221
{ identifier = "pp311-win_amd64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.20-win64.zip" },
218222
{ identifier = "gp311_242-win_amd64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.2/graalpy-24.2.2-windows-amd64.zip" },
223+
{ identifier = "gp312_250-win_amd64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.0/graalpy-25.0.0-windows-amd64.zip" },
219224
]
220225

221226
[pyodide]
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.09.13-2
3-
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.09.13-2
4-
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.09.13-2
5-
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.09.13-2
2+
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.09.16-1
3+
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.09.16-1
4+
manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.09.16-1
5+
musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.09.16-1
66

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

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

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

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

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

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

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

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

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

docs/options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat
6666
| PyPy3.10 v7.3 | pp310-macosx_x86_64<br/>pp310-macosx_arm64 | pp310-win_amd64 | pp310-manylinux_x86_64<br/>pp310-manylinux_i686 | pp310-manylinux_aarch64 | | | |
6767
| PyPy3.11 v7.3 | pp311-macosx_x86_64<br/>pp311-macosx_arm64 | pp311-win_amd64 | pp311-manylinux_x86_64<br/>pp311-manylinux_i686 | pp311-manylinux_aarch64 | | | |
6868
| GraalPy 3.11 v24.2 | gp311_242-macosx_x86_64<br/>gp311_242-macosx_arm64 | gp311_242-win_amd64 | gp311_242-manylinux_x86_64 | gp311_242-manylinux_aarch64 | | |
69+
| GraalPy 3.12 v25.0 | gp312_250-macosx_x86_64<br/>gp312_250-macosx_arm64 | gp312_250-win_amd64 | gp312_250-manylinux_x86_64 | gp312_250-manylinux_aarch64 | | |
6970

7071
The list of supported and currently selected build identifiers can also be retrieved by passing the `--print-build-identifiers` flag to cibuildwheel.
7172
The format is `python_tag-platform_tag`, with tags similar to those in [PEP 425](https://www.python.org/dev/peps/pep-0425/#details).

test/test_abi_variants.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_abi3(tmp_path):
4141
add_env={
4242
# free_threaded, GraalPy, and PyPy do not have a Py_LIMITED_API equivalent, just build one of those
4343
# also limit the number of builds for test performance reasons
44-
"CIBW_BUILD": "cp39-* cp310-* pp310-* gp311_242-* cp312-* cp313t-*",
44+
"CIBW_BUILD": "cp39-* cp310-* pp310-* gp312_250-* cp312-* cp313t-*",
4545
"CIBW_ENABLE": "all",
4646
},
4747
)
@@ -64,7 +64,7 @@ def test_abi3(tmp_path):
6464
"cp310-abi3", # <-- ABI3, works with 3.10 and 3.12
6565
"cp313-cp313t",
6666
"pp310-pypy310_pp73",
67-
"graalpy311-graalpy242_311_native",
67+
"graalpy312-graalpy250_312_native",
6868
],
6969
)
7070

test/test_dependency_versions.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,11 @@ def test_dependency_constraints(method, tmp_path, build_frontend_env_nouv):
140140
and method == "file"
141141
and build_frontend_env_nouv["CIBW_BUILD_FRONTEND"] == "build"
142142
):
143-
# GraalPy fails to discover its standard library when a venv is created
143+
# GraalPy 24 fails to discover its standard library when a venv is created
144144
# from a virtualenv seeded executable. See
145145
# https://github.com/oracle/graalpython/issues/491 and remove this once
146-
# fixed upstream.
147-
build_frontend_env_nouv["CIBW_SKIP"] = "gp*"
146+
# GraalPy 24 is dropped
147+
build_frontend_env_nouv["CIBW_SKIP"] = "gp311*"
148148

149149
for package_name, version in tool_versions.items():
150150
env_name = f"EXPECTED_{package_name.upper()}_VERSION"
@@ -172,6 +172,6 @@ def test_dependency_constraints(method, tmp_path, build_frontend_env_nouv):
172172
):
173173
# See reference to https://github.com/oracle/graalpython/issues/491
174174
# above
175-
expected_wheels = [w for w in expected_wheels if "graalpy" not in w]
175+
expected_wheels = [w for w in expected_wheels if "graalpy311" not in w]
176176

177177
assert set(actual_wheels) == set(expected_wheels)

test/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ def _expected_wheels(
308308
if EnableGroup.GraalPy in enable_groups:
309309
python_abi_tags += [
310310
"graalpy311-graalpy242_311_native",
311+
"graalpy312-graalpy250_312_native",
311312
]
312313

313314
if machine_arch == "ARM64" and platform == "windows":
@@ -367,6 +368,11 @@ def _expected_wheels(
367368
min_macosx = macosx_deployment_target
368369
else:
369370
min_macosx = _floor_macosx(macosx_deployment_target, "10.13")
371+
elif python_abi_tag.startswith("graalpy"):
372+
if python_abi_tag.startswith("graalpy311"):
373+
min_macosx = macosx_deployment_target
374+
else:
375+
min_macosx = _floor_macosx(macosx_deployment_target, "10.13")
370376
else:
371377
min_macosx = macosx_deployment_target
372378

unit_test/option_prepare_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from cibuildwheel.util import file
1515

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

1919

2020
@pytest.fixture
@@ -162,6 +162,7 @@ def test_build_with_override_launches(monkeypatch, tmp_path):
162162
"pp310",
163163
"pp311",
164164
"gp311_242",
165+
"gp312_250",
165166
}
166167
}
167168
assert kwargs["options"].build_options("cp39-manylinux_x86_64").before_all == ""
@@ -186,6 +187,7 @@ def test_build_with_override_launches(monkeypatch, tmp_path):
186187
"pp310",
187188
"pp311",
188189
"gp311_242",
190+
"gp312_250",
189191
]
190192
}
191193

0 commit comments

Comments
 (0)