feat: remove GraalPy 3.11 (gp311) support (#2895)
Drops the GraalPy 3.11 / GraalPy 24.2 builds (gp311_242) as agreed in pypa/cibuildwheel#2741: a ~6-month overlap after the GraalPy 25 (gp312) release. GraalPy 3.12 (gp312_250) stays. This also removes the GraalPy 24-only workarounds that were explicitly marked "Remove when GraalPy 24.x is dropped": - the Visual Studio compiler-discovery (vswhere) and build-isolation (graalpython#491) workarounds in the Windows backend - the issue-491 Windows skip/filter hacks in test_pep518 and test_dependency_versions (added in the original GraalPy PR #1538 and unneeded since GraalPy 25 per #2597) The uv-doesn't-support-graalpy skip (#2754), the `graalpy` enable group, and the generated constraints pins apply to all GraalPy and are kept. Assisted-by: ClaudeCode:claude-opus-4.8
This commit is contained in:
@@ -34,7 +34,6 @@ While cibuildwheel itself requires a recent Python version to run (we support th
|
||||
| PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
|
||||
| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
|
||||
| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | ✅<sup>1</sup> | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
|
||||
| GraalPy 3.11 v24.2 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | N/A | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
|
||||
| GraalPy 3.12 v25.0 | ✅ | ✅ | ✅ | N/A | N/A | ✅<sup>1</sup> | N/A | ✅<sup>1</sup> | N/A | N/A | N/A | N/A | N/A | N/A |
|
||||
|
||||
<sup>**1** PyPy & GraalPy are only supported for manylinux wheels.</sup><br>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import dataclasses
|
||||
import json
|
||||
import os
|
||||
import platform as platform_module
|
||||
import shutil
|
||||
@@ -390,42 +389,6 @@ def setup_python(
|
||||
setup_setuptools_cross_compile(tmp, python_configuration, python_libs_base, env)
|
||||
setup_rust_cross_compile(tmp, python_configuration, python_libs_base, env)
|
||||
|
||||
if implementation_id.startswith("gp311"):
|
||||
# GraalPy 24 fails to discover compilers, setup the relevant environment
|
||||
# variables. Adapted from
|
||||
# https://github.com/microsoft/vswhere/wiki/Start-Developer-Command-Prompt
|
||||
# Remove when GraalPy 24.x is dropped.
|
||||
vcpath = call(
|
||||
Path(os.environ["PROGRAMFILES(X86)"])
|
||||
/ "Microsoft Visual Studio"
|
||||
/ "Installer"
|
||||
/ "vswhere.exe",
|
||||
"-products",
|
||||
"*",
|
||||
"-latest",
|
||||
"-property",
|
||||
"installationPath",
|
||||
capture_stdout=True,
|
||||
).strip()
|
||||
log.notice(f"Discovering Visual Studio for GraalPy at {vcpath}")
|
||||
vcvars_file = tmp / "vcvars.json"
|
||||
call(
|
||||
f"{vcpath}\\Common7\\Tools\\vsdevcmd.bat",
|
||||
"-no_logo",
|
||||
"-arch=amd64",
|
||||
"-host_arch=amd64",
|
||||
"&&",
|
||||
"python",
|
||||
"-c",
|
||||
# this command needs to be one line for Windows reasons
|
||||
"import sys, json, pathlib, os; pathlib.Path(sys.argv[1]).write_text(json.dumps(dict(os.environ)))",
|
||||
vcvars_file,
|
||||
env=env,
|
||||
)
|
||||
with open(vcvars_file, encoding="utf-8") as f:
|
||||
vcvars = json.load(f)
|
||||
env.update(vcvars)
|
||||
|
||||
return base_python, env
|
||||
|
||||
|
||||
@@ -511,22 +474,6 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
),
|
||||
)
|
||||
|
||||
if (
|
||||
config.identifier.startswith("gp311")
|
||||
and build_frontend.name == "build"
|
||||
and "--no-isolation" not in extra_flags
|
||||
and "-n" not in extra_flags
|
||||
):
|
||||
# GraalPy 24 fails to discover its standard library when a venv is created
|
||||
# from a virtualenv seeded executable. See
|
||||
# https://github.com/oracle/graalpython/issues/491 and remove this once
|
||||
# GraalPy 24 is dropped.
|
||||
log.notice(
|
||||
"Disabling build isolation to workaround GraalPy bug. If the build fails, consider using pip or build[uv] as build frontend."
|
||||
)
|
||||
shell("graalpy -m pip install setuptools wheel", env=env)
|
||||
extra_flags = [*extra_flags, "-n"]
|
||||
|
||||
match build_frontend.name:
|
||||
case "pip":
|
||||
# Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org
|
||||
|
||||
@@ -21,7 +21,6 @@ python_configurations = [
|
||||
{ identifier = "pp39-manylinux_x86_64", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" },
|
||||
{ identifier = "pp310-manylinux_x86_64", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" },
|
||||
{ identifier = "pp311-manylinux_x86_64", version = "3.11", path_str = "/opt/python/pp311-pypy311_pp73" },
|
||||
{ identifier = "gp311_242-manylinux_x86_64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" },
|
||||
{ identifier = "gp312_250-manylinux_x86_64", version = "3.12", path_str = "/opt/python/graalpy312-graalpy250_312_native" },
|
||||
{ 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" },
|
||||
@@ -71,7 +70,6 @@ python_configurations = [
|
||||
{ identifier = "pp39-manylinux_aarch64", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" },
|
||||
{ identifier = "pp310-manylinux_aarch64", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" },
|
||||
{ identifier = "pp311-manylinux_aarch64", version = "3.11", path_str = "/opt/python/pp311-pypy311_pp73" },
|
||||
{ identifier = "gp311_242-manylinux_aarch64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" },
|
||||
{ identifier = "gp312_250-manylinux_aarch64", version = "3.12", path_str = "/opt/python/graalpy312-graalpy250_312_native" },
|
||||
{ identifier = "pp39-manylinux_i686", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" },
|
||||
{ identifier = "pp310-manylinux_i686", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" },
|
||||
@@ -176,8 +174,6 @@ python_configurations = [
|
||||
{ identifier = "pp310-macosx_arm64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-macos_arm64.tar.bz2", sha256 = "3db8a03fc496164801646844d7f3b12baa0adb3ad9a0b7cb124521bc2e168a36" },
|
||||
{ identifier = "pp311-macosx_x86_64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.23-macos_x86_64.tar.bz2", sha256 = "c95363c4e87235d11a6cec8128239c291b1eb67a752778fbcfe029a71da82b5e" },
|
||||
{ identifier = "pp311-macosx_arm64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.23-macos_arm64.tar.bz2", sha256 = "4747b3aceba4c1c6104cddc0fe5ea302101d32955f0957347b9ecc4fbd7aed05" },
|
||||
{ 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", sha256 = "2f4d5e7dbdf90e38778dfcb8ca3e1ec7eee257ef726b1937d5bc91b54cdddf9b" },
|
||||
{ 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", sha256 = "f4a2ae01bae0fa53ec0d19f86d73c6dcc2a162d245552030183b84bfdd8f7635" },
|
||||
{ identifier = "gp312_250-macosx_x86_64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.1/graalpy-25.0.1-macos-amd64.tar.gz", sha256 = "10b0721d52397f0cc85f038900318da2203711cbcfae7899e3faed49d3dc6221" },
|
||||
{ identifier = "gp312_250-macosx_arm64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.3/graalpy-25.0.3-macos-aarch64.tar.gz", sha256 = "387d9f5b376860842bea4d55aae5820974f3f3b68fc36c77ae863a061a888857" },
|
||||
]
|
||||
@@ -214,7 +210,6 @@ python_configurations = [
|
||||
{ identifier = "pp39-win_amd64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip", sha256 = "06ec12a5e964dc0ad33e6f380185a4d295178dce6d6df512f508e7aee00a1323" },
|
||||
{ identifier = "pp310-win_amd64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-win64.zip", sha256 = "c0d07bba6c8fb4e5804f4a8b3f8ef07cc3d89f6ad1db42a45ffb9be60bbb7cc2" },
|
||||
{ identifier = "pp311-win_amd64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.23-win64.zip", sha256 = "948b8ea58dea5b9917210fe4afd242c788fbfaba1c3f1a25e696a404f703389a" },
|
||||
{ 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", sha256 = "9606134284d4d95b2f9d69c3087cd3e9e488f46355b419f5e66588a3281df6a3" },
|
||||
{ identifier = "gp312_250-win_amd64", version = "3.12", url = "https://github.com/oracle/graalpython/releases/download/graal-25.0.3/graalpy-25.0.3-windows-amd64.zip", sha256 = "2ae5c42b93e08d9e106a017634a3442b272ccae6d08ace157244de0449e937d4" },
|
||||
]
|
||||
|
||||
|
||||
@@ -69,7 +69,6 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat
|
||||
| PyPy3.9 v7.3 | pp39-macosx_x86_64<br/>pp39-macosx_arm64 | pp39-win_amd64 | pp39-manylinux_x86_64<br/>pp39-manylinux_i686 | pp39-manylinux_aarch64 | | | |
|
||||
| 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 | | | |
|
||||
| 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 | | | |
|
||||
| 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 | | |
|
||||
| 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 | | |
|
||||
|
||||
The list of supported and currently selected build identifiers can also be retrieved by passing the `--print-build-identifiers` flag to cibuildwheel.
|
||||
|
||||
@@ -179,19 +179,6 @@ def test_dependency_constraints(
|
||||
msg = f"Unknown method: {method}"
|
||||
raise ValueError(msg)
|
||||
|
||||
skip = ""
|
||||
|
||||
if (
|
||||
utils.get_platform() == "windows"
|
||||
and method == "file"
|
||||
and build_frontend_env_nouv["CIBW_BUILD_FRONTEND"] == "build"
|
||||
):
|
||||
# GraalPy 24 fails to discover its standard library when a venv is created
|
||||
# from a virtualenv seeded executable. See
|
||||
# https://github.com/oracle/graalpython/issues/491 and remove this once
|
||||
# GraalPy 24 is dropped
|
||||
skip = "gp311*"
|
||||
|
||||
# cross-platform Python script for dependency constraint checks
|
||||
before_build_script = project_dir / "check_versions.py"
|
||||
before_build_script.write_text(CHECK_VERSIONS_SCRIPT)
|
||||
@@ -200,7 +187,6 @@ def test_dependency_constraints(
|
||||
actual_wheels = utils.cibuildwheel_run(
|
||||
project_dir,
|
||||
add_env={
|
||||
"CIBW_SKIP": skip,
|
||||
"CIBW_DEPENDENCY_VERSIONS": dependency_version_option,
|
||||
"CIBW_BEFORE_BUILD": f"python {before_build_script.name}",
|
||||
"EXPECTED_VERSIONS": json.dumps(tool_versions),
|
||||
@@ -212,9 +198,4 @@ def test_dependency_constraints(
|
||||
# also check that we got the right wheels
|
||||
expected_wheels = utils.expected_wheels("spam", "0.1.0", single_python=True)
|
||||
|
||||
if skip == "gp*":
|
||||
# See reference to https://github.com/oracle/graalpython/issues/491
|
||||
# above
|
||||
expected_wheels = [w for w in expected_wheels if "graalpy311" not in w]
|
||||
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
@@ -40,26 +40,12 @@ def test_pep518(tmp_path: Path, build_frontend_env: dict[str, str]) -> None:
|
||||
project_dir = tmp_path / "project"
|
||||
basic_project.generate(project_dir)
|
||||
|
||||
# GraalPy fails to discover its standard library when a venv is created
|
||||
# from a virtualenv seeded executable. See
|
||||
# https://github.com/oracle/graalpython/issues/491 and remove this once
|
||||
# fixed upstream.
|
||||
if build_frontend_env["CIBW_BUILD_FRONTEND"] == "build" and utils.get_platform() == "windows":
|
||||
build_frontend_env["CIBW_SKIP"] = "gp*"
|
||||
|
||||
# build the wheels
|
||||
actual_wheels = utils.cibuildwheel_run(project_dir, add_env=build_frontend_env)
|
||||
|
||||
# check that the expected wheels are produced
|
||||
expected_wheels = utils.expected_wheels("spam", "0.1.0")
|
||||
|
||||
# GraalPy fails to discover its standard library when a venv is created
|
||||
# from a virtualenv seeded executable. See
|
||||
# https://github.com/oracle/graalpython/issues/491 and remove this once
|
||||
# fixed upstream.
|
||||
if build_frontend_env["CIBW_BUILD_FRONTEND"] == "build" and utils.get_platform() == "windows":
|
||||
expected_wheels = [w for w in expected_wheels if "graalpy" not in w]
|
||||
|
||||
assert set(actual_wheels) == set(expected_wheels)
|
||||
|
||||
# These checks ensure an extra file is not created when using custom
|
||||
|
||||
+1
-5
@@ -319,7 +319,6 @@ def _expected_wheels(
|
||||
|
||||
if EnableGroup.GraalPy in enable_groups and include_graalpy_in_expected_wheels:
|
||||
python_abi_tags += [
|
||||
"graalpy311-graalpy242_311_native",
|
||||
"graalpy312-graalpy250_312_native",
|
||||
]
|
||||
|
||||
@@ -376,10 +375,7 @@ def _expected_wheels(
|
||||
else:
|
||||
min_macosx = _floor_macosx(macosx_deployment_target, "10.15")
|
||||
elif python_abi_tag.startswith("graalpy"):
|
||||
if python_abi_tag.startswith("graalpy311"):
|
||||
min_macosx = macosx_deployment_target
|
||||
else:
|
||||
min_macosx = _floor_macosx(macosx_deployment_target, "10.13")
|
||||
min_macosx = _floor_macosx(macosx_deployment_target, "10.13")
|
||||
else:
|
||||
min_macosx = macosx_deployment_target
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ def test_build_limited_python() -> None:
|
||||
assert build_selector("cp37-win32")
|
||||
assert build_selector("cp38-win32")
|
||||
assert build_selector("pp37-win_amd64")
|
||||
assert build_selector("gp311_242-win_amd64")
|
||||
assert build_selector("gp312_250-win_amd64")
|
||||
|
||||
|
||||
def test_build_limited_python_partial() -> None:
|
||||
|
||||
@@ -14,7 +14,7 @@ from cibuildwheel.oci_container import OCIPlatform
|
||||
from cibuildwheel.util import file
|
||||
|
||||
DEFAULT_IDS = {"cp39", "cp310", "cp311", "cp312", "cp313", "cp314", "cp314t"}
|
||||
ALL_IDS = DEFAULT_IDS | {"pp39", "pp310", "pp311", "gp311_242", "gp312_250"}
|
||||
ALL_IDS = DEFAULT_IDS | {"pp39", "pp310", "pp311", "gp312_250"}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -158,7 +158,6 @@ before-all = "true"
|
||||
"pp39",
|
||||
"pp310",
|
||||
"pp311",
|
||||
"gp311_242",
|
||||
"gp312_250",
|
||||
}
|
||||
}
|
||||
@@ -180,7 +179,6 @@ before-all = "true"
|
||||
"pp39",
|
||||
"pp310",
|
||||
"pp311",
|
||||
"gp311_242",
|
||||
"gp312_250",
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user