diff --git a/README.md b/README.md index 2de5577d..8d260da7 100644 --- a/README.md +++ b/README.md @@ -23,20 +23,20 @@ What does it do? While cibuildwheel itself requires a recent Python version to run (we support the last three releases), it can target the following versions to build wheels: -| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux
musllinux x86_64 | manylinux
musllinux i686 | manylinux
musllinux aarch64 | manylinux
musllinux ppc64le | manylinux
musllinux s390x | manylinux
musllinux armv7l | iOS | Pyodide | -|----------------|----|-----|-----|-----|-----|----|-----|----|-----|-----|---|-----|-----| -| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | -| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | -| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | -| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | -| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | ✅⁴ | -| CPython 3.13³ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | N/A | -| CPython 3.14³ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | N/A | -| PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | 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 | N/A | N/A | -| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | -| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | -| GraalPy 24.2 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | N/A | ✅¹ | N/A | N/A | N/A | N/A | N/A | +| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux
musllinux x86_64 | manylinux
musllinux i686 | manylinux
musllinux aarch64 | manylinux
musllinux ppc64le | manylinux
musllinux s390x | manylinux
musllinux armv7l | iOS | Pyodide | +|--------------------|----|-----|-----|-----|-----|----|-----|----|-----|-----|---|-----|-----| +| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | +| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | +| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | +| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | +| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | ✅⁴ | +| CPython 3.13³ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | N/A | +| CPython 3.14³ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | N/A | +| PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | 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 | N/A | N/A | +| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | +| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | +| GraalPy 3.11 v24.2 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | N/A | ✅¹ | N/A | N/A | N/A | N/A | N/A | ¹ PyPy & GraalPy are only supported for manylinux wheels.
² Windows arm64 support is experimental.
diff --git a/bin/update_pythons.py b/bin/update_pythons.py index 60b99f2a..fa346281 100755 --- a/bin/update_pythons.py +++ b/bin/update_pythons.py @@ -147,7 +147,11 @@ class GraalPyVersions: msg = f"{identifier} not supported yet on GraalPy" raise RuntimeError(msg) + gpspec_str = identifier.split("-")[0].split("_")[1] + gpspec = Specifier("==24.2.*") if gpspec_str == "242" else Specifier(f"=={gpspec_str}.*") + releases = [r for r in self.releases if spec.contains(r["python_version"])] + releases = [r for r in self.releases if gpspec.contains(r["graalpy_version"])] releases = sorted(releases, key=lambda r: r["graalpy_version"]) if not releases: diff --git a/cibuildwheel/logger.py b/cibuildwheel/logger.py index 80c2fb02..cee94d66 100644 --- a/cibuildwheel/logger.py +++ b/cibuildwheel/logger.py @@ -237,7 +237,8 @@ def build_description_from_identifier(identifier: str) -> str: build_description = "" python_interpreter = python_identifier[0:2] - python_version = python_identifier[2:] + version_parts = python_identifier[2:].split("_") + python_version = version_parts[0] if python_interpreter == "cp": build_description += "CPython" @@ -250,6 +251,8 @@ def build_description_from_identifier(identifier: str) -> str: raise Exception(msg) build_description += f" {python_version[0]}.{python_version[1:]} " + if len(version_parts) > 1: + build_description += f"(ABI {version_parts[1]}) " try: build_description += PLATFORM_IDENTIFIER_DESCRIPTIONS[platform_identifier] diff --git a/cibuildwheel/resources/build-platforms.toml b/cibuildwheel/resources/build-platforms.toml index 2875f9f2..10af0928 100644 --- a/cibuildwheel/resources/build-platforms.toml +++ b/cibuildwheel/resources/build-platforms.toml @@ -22,7 +22,7 @@ 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 = "gp242-manylinux_x86_64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" }, + { identifier = "gp311_242-manylinux_x86_64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" }, { identifier = "cp38-manylinux_aarch64", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { 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" }, @@ -72,7 +72,7 @@ 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 = "gp242-manylinux_aarch64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" }, + { identifier = "gp311_242-manylinux_aarch64", version = "3.11", path_str = "/opt/python/graalpy311-graalpy242_311_native" }, { identifier = "pp38-manylinux_i686", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" }, { 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" }, @@ -179,8 +179,8 @@ python_configurations = [ { identifier = "pp310-macosx_arm64", version = "3.10", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-macos_arm64.tar.bz2" }, { identifier = "pp311-macosx_x86_64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.19-macos_x86_64.tar.bz2" }, { identifier = "pp311-macosx_arm64", version = "3.11", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.19-macos_arm64.tar.bz2" }, - { identifier = "gp242-macosx_x86_64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.1/graalpy-24.2.1-macos-amd64.tar.gz" }, - { identifier = "gp242-macosx_arm64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.1/graalpy-24.2.1-macos-aarch64.tar.gz" }, + { identifier = "gp311_242-macosx_x86_64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.1/graalpy-24.2.1-macos-amd64.tar.gz" }, + { identifier = "gp311_242-macosx_arm64", version = "3.11", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.1/graalpy-24.2.1-macos-aarch64.tar.gz" }, ] [windows] @@ -215,7 +215,7 @@ python_configurations = [ { identifier = "pp39-win_amd64", version = "3.9", arch = "64", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip" }, { identifier = "pp310-win_amd64", version = "3.10", arch = "64", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.19-win64.zip" }, { identifier = "pp311-win_amd64", version = "3.11", arch = "64", url = "https://downloads.python.org/pypy/pypy3.11-v7.3.19-win64.zip" }, - { identifier = "gp242-win_amd64", version = "3.11", arch = "64", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.1/graalpy-24.2.1-windows-amd64.zip" }, + { identifier = "gp311_242-win_amd64", version = "3.11", arch = "64", url = "https://github.com/oracle/graalpython/releases/download/graal-24.2.1/graalpy-24.2.1-windows-amd64.zip" }, ] [pyodide] diff --git a/cibuildwheel/selector.py b/cibuildwheel/selector.py index c3f9dea4..25f61176 100644 --- a/cibuildwheel/selector.py +++ b/cibuildwheel/selector.py @@ -75,7 +75,7 @@ class BuildSelector: def __call__(self, build_id: str) -> bool: # Filter build selectors by python_requires if set if self.requires_python is not None: - py_ver_str = build_id.split("-")[0] + py_ver_str = build_id.split("-")[0].split("_")[0] py_ver_str = py_ver_str.removesuffix("t") major = int(py_ver_str[2]) minor = int(py_ver_str[3:]) diff --git a/cibuildwheel/util/packaging.py b/cibuildwheel/util/packaging.py index 31077819..b13ebc6b 100644 --- a/cibuildwheel/util/packaging.py +++ b/cibuildwheel/util/packaging.py @@ -135,6 +135,7 @@ def find_compatible_wheel(wheels: Sequence[T], identifier: str) -> T | None: """ interpreter, platform = identifier.split("-", 1) + interpreter = interpreter.split("_")[0] free_threaded = interpreter.endswith("t") if free_threaded: interpreter = interpreter[:-1] diff --git a/docs/options.md b/docs/options.md index 3ade43d9..89e782bf 100644 --- a/docs/options.md +++ b/docs/options.md @@ -64,7 +64,7 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat | PyPy3.9 v7.3 | pp39-macosx_x86_64
pp39-macosx_arm64 | pp39-win_amd64 | pp39-manylinux_x86_64
pp39-manylinux_i686 | pp39-manylinux_aarch64 | | | | PyPy3.10 v7.3 | pp310-macosx_x86_64
pp310-macosx_arm64 | pp310-win_amd64 | pp310-manylinux_x86_64
pp310-manylinux_i686 | pp310-manylinux_aarch64 | | | | PyPy3.11 v7.3 | pp311-macosx_x86_64
pp311-macosx_arm64 | pp311-win_amd64 | pp311-manylinux_x86_64
pp311-manylinux_i686 | pp311-manylinux_aarch64 | | | -| GraalPy v24.2 | gp242-macosx_x86_64
gp242-macosx_arm64 | gp242-win_amd64 | gp242-manylinux_x86_64 | gp242-manylinux_aarch64 | | | +| GraalPy 3.11 v24.2 | gp311_242-macosx_x86_64
gp311_242-macosx_arm64 | gp311_242-win_amd64 | gp311_242-manylinux_x86_64 | gp311_242-manylinux_aarch64 | | | The list of supported and currently selected build identifiers can also be retrieved by passing the `--print-build-identifiers` flag to cibuildwheel. The format is `python_tag-platform_tag`, with tags similar to those in [PEP 425](https://www.python.org/dev/peps/pep-0425/#details). diff --git a/test/test_abi_variants.py b/test/test_abi_variants.py index d3734ae6..f64f4248 100644 --- a/test/test_abi_variants.py +++ b/test/test_abi_variants.py @@ -41,7 +41,7 @@ def test_abi3(tmp_path): add_env={ # free_threaded, GraalPy, and PyPy do not have a Py_LIMITED_API equivalent, just build one of those # also limit the number of builds for test performance reasons - "CIBW_BUILD": "cp39-* cp310-* pp310-* gp242-* cp312-* cp313t-*", + "CIBW_BUILD": "cp39-* cp310-* pp310-* gp311_242-* cp312-* cp313t-*", "CIBW_ENABLE": "all", }, ) diff --git a/unit_test/build_selector_test.py b/unit_test/build_selector_test.py index 6da657fc..1c87c426 100644 --- a/unit_test/build_selector_test.py +++ b/unit_test/build_selector_test.py @@ -152,7 +152,7 @@ def test_build_limited_python(): build_config="*", skip_config="", requires_python=SpecifierSet(">=3.7"), - enable=frozenset([EnableGroup.PyPy, EnableGroup.PyPyEoL]), + enable=frozenset([EnableGroup.PyPy, EnableGroup.PyPyEoL, EnableGroup.GraalPy]), ) assert not build_selector("cp36-manylinux_x86_64") @@ -165,6 +165,7 @@ def test_build_limited_python(): assert build_selector("cp37-win32") assert build_selector("cp38-win32") assert build_selector("pp37-win_amd64") + assert build_selector("gp311_242-win_amd64") def test_build_limited_python_partial(): diff --git a/unit_test/option_prepare_test.py b/unit_test/option_prepare_test.py index 2f87044a..34f26eee 100644 --- a/unit_test/option_prepare_test.py +++ b/unit_test/option_prepare_test.py @@ -14,7 +14,7 @@ from cibuildwheel.oci_container import OCIPlatform from cibuildwheel.util import file DEFAULT_IDS = {"cp38", "cp39", "cp310", "cp311", "cp312", "cp313"} -ALL_IDS = DEFAULT_IDS | {"cp313t", "pp38", "pp39", "pp310", "pp311", "gp242"} +ALL_IDS = DEFAULT_IDS | {"cp313t", "pp38", "pp39", "pp310", "pp311", "gp311_242"} @pytest.fixture @@ -157,7 +157,7 @@ before-all = "true" "pp39", "pp310", "pp311", - "gp242", + "gp311_242", } } assert kwargs["options"].build_options("cp39-manylinux_x86_64").before_all == "" @@ -179,7 +179,7 @@ before-all = "true" "pp39", "pp310", "pp311", - "gp242", + "gp311_242", ] }