diff --git a/src/scikit_build_core/builder/_load_provider.py b/src/scikit_build_core/builder/_load_provider.py index cc6862f82..aea242bc0 100644 --- a/src/scikit_build_core/builder/_load_provider.py +++ b/src/scikit_build_core/builder/_load_provider.py @@ -125,7 +125,8 @@ def __iter__(self) -> Iterator[str]: yield from self.project # Iterate over the keys of the dynamic metadata providers - yield from self.providers + # GraalPy needs it to be a copy + yield from list(self.providers) def __len__(self) -> int: return len(self.project) + len(self.providers) diff --git a/src/scikit_build_core/builder/sysconfig.py b/src/scikit_build_core/builder/sysconfig.py index fffe7be47..781681862 100644 --- a/src/scikit_build_core/builder/sysconfig.py +++ b/src/scikit_build_core/builder/sysconfig.py @@ -193,12 +193,18 @@ def get_abi_flags() -> str: Return the ABI flags for the current Python interpreter. Derived from ``packaging.tags.sys_tags()`` since that works on Windows. """ - - most_compatible = next(iter(packaging.tags.sys_tags())) - full_abi = most_compatible.abi - vers = packaging.tags.interpreter_version() - abi_flags = full_abi[full_abi.find(vers) + len(vers) :] - return "".join(sorted(abi_flags)) + abi_flags: str | None = sysconfig.get_config_var("ABIFLAGS") + if abi_flags: + return abi_flags + + if sys.implementation.name == "cpython" and sys.platform.startswith("win32"): + most_compatible = next(iter(packaging.tags.sys_tags())) + full_abi = most_compatible.abi + vers = packaging.tags.interpreter_version() + abi_flags = full_abi[full_abi.find(vers) + len(vers) :] + return "".join(sorted(abi_flags)) + + return "" def info_print( diff --git a/src/scikit_build_core/file_api/model/codemodel.py b/src/scikit_build_core/file_api/model/codemodel.py index 958d3b4a2..3c067e98f 100644 --- a/src/scikit_build_core/file_api/model/codemodel.py +++ b/src/scikit_build_core/file_api/model/codemodel.py @@ -94,14 +94,16 @@ class Sysroot: @dataclasses.dataclass(frozen=True) class Link: language: str - commandFragments: List[CommandFragment] + commandFragments: Optional[List[CommandFragment]] lto: Optional[bool] = None sysroot: Optional[Sysroot] = None @dataclasses.dataclass(frozen=True) class Archive: - commandFragments: List[CommandFragment] = dataclasses.field(default_factory=list) + commandFragments: Optional[List[CommandFragment]] = dataclasses.field( + default_factory=list + ) lto: Optional[bool] = None diff --git a/tests/test_setuptools_abi3.py b/tests/test_setuptools_abi3.py index 61dd70c3b..4086239a4 100644 --- a/tests/test_setuptools_abi3.py +++ b/tests/test_setuptools_abi3.py @@ -20,6 +20,9 @@ @pytest.mark.skipif( sys.implementation.name == "pypy", reason="pypy does not support abi3" ) +@pytest.mark.skipif( + sys.implementation.name == "graalpy", reason="graalpy does not support abi3" +) @pytest.mark.skipif( sysconfig.get_config_var("Py_GIL_DISABLED"), reason="Free-threaded Python does not support abi3",