diff --git a/cmake/utils.cmake b/cmake/utils.cmake index ca0062ba4fab..5047c354ff7d 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -495,7 +495,13 @@ function (define_extension_target MOD_NAME) set(SOABI_KEYWORD "") endif() - if (ARG_USE_SABI) + run_python(IS_FREETHREADED_PYTHON + "import sysconfig; print(1 if sysconfig.get_config_var(\"Py_GIL_DISABLED\") else 0)" + "Failed to determine whether interpreter is free-threaded") + + # Free-threaded Python doesn't yet support the stable ABI (see PEP 803/809), + # so avoid using the stable ABI under free-threading only. + if (ARG_USE_SABI AND NOT IS_FREETHREADED_PYTHON) Python_add_library(${MOD_NAME} MODULE USE_SABI ${ARG_USE_SABI} ${SOABI_KEYWORD} "${ARG_SOURCES}") else() Python_add_library(${MOD_NAME} MODULE ${SOABI_KEYWORD} "${ARG_SOURCES}") diff --git a/setup.py b/setup.py index 8871b04d8fc4..0022e7fe0bf3 100644 --- a/setup.py +++ b/setup.py @@ -10,6 +10,7 @@ import shutil import subprocess import sys +import sysconfig from pathlib import Path from shutil import which @@ -74,9 +75,13 @@ def is_ninja_available() -> bool: return which("ninja") is not None +def is_freethreaded(): + return bool(sysconfig.get_config_var("Py_GIL_DISABLED")) + + class CMakeExtension(Extension): def __init__(self, name: str, cmake_lists_dir: str = ".", **kwa) -> None: - super().__init__(name, sources=[], py_limited_api=True, **kwa) + super().__init__(name, sources=[], py_limited_api=not is_freethreaded(), **kwa) self.cmake_lists_dir = os.path.abspath(cmake_lists_dir)