gh-122931: Allow stable abi3 API extensions to include a multiarch tuple in the filename (GH-152461)

This permits stable ABI extensions for multiple architectures to be
co-installed into the same directory, without clashing with each other,
the same way (non-stable ABI) regular extensions can.

It is listed before the current platform-less suffixes since it's more
specific.

The platform is stored in a new pyconfig.h define & sysconfig
variable, SOABI_PLATFORM.
On some known architectures (FreeBSD, Windows), this
will be undefined/zero; these won't have the new tag (yet).

Add SOABI_PLATFORM & ALT_SOABI the info to
`make pythoninfo` as well.

Co-authored-by: Petr Viktorin <encukou@gmail.com>
Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
authored and GitHub committed 2026-07-27 15:05:40 +02:00
1 parent 58d9c78d6a
commit 7961bbf2bb
9 files changed
+55

No files matched your search

+8
View File
@@ -873,6 +873,14 @@ Other language changes
imports ``pkg.sub.mod``.
(Contributed by Gregory P. Smith in :gh:`83065`.)
* File names of Stable ABI extensions that use the ``.so`` suffix may now
include a multiarch tuple, for example, ``foo.abi3-x86-64-linux-gnu.so``.
This permits stable ABI extensions for multiple architectures to be
co-installed into the same directory, without clashing with each
other, as regular dynamic extensions do.
(Contributed by Stefano Rivera in :gh:`122931`.)
Default interactive shell
=========================
+9
View File
@@ -570,6 +570,7 @@ def collect_sysconfig(info_add):
for name in (
'ABIFLAGS',
'ALT_SOABI',
'ANDROID_API_LEVEL',
'CC',
'CCSHARED',
@@ -595,6 +596,7 @@ def collect_sysconfig(info_add):
'Py_REMOTE_DEBUG',
'SHELL',
'SOABI',
'SOABI_PLATFORM',
'TEST_MODULES',
'VAPTH',
'abs_builddir',
@@ -1315,6 +1317,12 @@ def collect_system(info_add):
info_add('system.hardware', hardware)
def collect_importlib(info_add):
import importlib.machinery
info_add('importlib.extension_suffixes',
importlib.machinery.EXTENSION_SUFFIXES)
def collect_info(info):
error = False
info_add = info.add
@@ -1357,6 +1365,7 @@ def collect_info(info):
collect_zstd,
collect_libregrtest_utils,
collect_system,
collect_importlib,
# Collecting from tests should be last as they have side effects.
collect_test_socket,
@@ -5,6 +5,7 @@ machinery = util.import_importlib('importlib.machinery')
import unittest
import sys
import sysconfig
class FinderTests(abc.FinderTests):
@@ -61,6 +62,7 @@ class FinderTests(abc.FinderTests):
def test_abi3_extension_suffixes(self):
suffixes = self.machinery.EXTENSION_SUFFIXES
platform = sysconfig.get_config_var("SOABI_PLATFORM")
if 'win32' in sys.platform:
# Either "_d.pyd" or ".pyd" must be in suffixes
self.assertTrue({"_d.pyd", ".pyd"}.intersection(suffixes))
@@ -73,6 +75,13 @@ class FinderTests(abc.FinderTests):
self.assertIn(".abi3.so", suffixes)
self.assertIn(".abi3t.so", suffixes)
if platform:
if Py_GIL_DISABLED:
self.assertNotIn(f".abi3-{platform}.so", suffixes)
else:
self.assertIn(f".abi3-{platform}.so", suffixes)
self.assertIn(f".abi3t-{platform}.so", suffixes)
(Frozen_FinderTests,
Source_FinderTests
+9
View File
@@ -457,6 +457,15 @@ class TestSysConfig(unittest.TestCase, VirtualEnvironmentMixin):
soabi = sysconfig.get_config_var('SOABI')
self.assertIn(soabi, _imp.extension_suffixes()[0])
@unittest.skipIf(not _imp.extension_suffixes(), "stub loader has no suffixes")
@unittest.skipIf(sys.platform == "win32", "Does not apply to Windows")
@unittest.skipIf(sysconfig.get_config_var('SOABI_PLATFORM') == 0,
"SOABI_PLATFORM is undefined")
def test_soabi_platform(self):
soabi_platform = sysconfig.get_config_var('SOABI_PLATFORM')
soabi = sysconfig.get_config_var('SOABI')
self.assertIn(soabi_platform, soabi)
def test_library(self):
library = sysconfig.get_config_var('LIBRARY')
ldlibrary = sysconfig.get_config_var('LDLIBRARY')
@@ -0,0 +1 @@
Allow importing stable ABI C extensions that include a multiarch tuple in their filename, e.g. ``foo.abi3-x86-64-linux-gnu.so``.
+6
View File
@@ -46,8 +46,14 @@ const char *_PyImport_DynLoadFiletab[] = {
"." ALT_SOABI ".so",
#endif
#ifndef Py_GIL_DISABLED
#ifdef SOABI_PLATFORM
".abi" PYTHON_ABI_STRING "-" SOABI_PLATFORM ".so",
#endif /* SOABI_PLATFORM */
".abi" PYTHON_ABI_STRING ".so",
#endif /* Py_GIL_DISABLED */
#ifdef SOABI_PLATFORM
".abi" PYTHON_ABI_STRING "t-" SOABI_PLATFORM ".so",
#endif /* SOABI_PLATFORM */
".abi" PYTHON_ABI_STRING "t.so",
".so",
#endif /* __CYGWIN__ */
Generated Vendored
+6
View File
@@ -7395,6 +7395,12 @@ case $ac_sys_system in #(
;;
esac
if test x$SOABI_PLATFORM != x; then
printf "%s\n" "#define SOABI_PLATFORM \"${SOABI_PLATFORM}\"" >>confdefs.h
fi
if test x$MULTIARCH != x; then
MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
fi
+4
View File
@@ -1221,6 +1221,10 @@ AS_CASE([$ac_sys_system],
[SOABI_PLATFORM=$PLATFORM_TRIPLET]
)
if test x$SOABI_PLATFORM != x; then
AC_DEFINE_UNQUOTED([SOABI_PLATFORM], ["${SOABI_PLATFORM}"], [Platform tag, used in binary module extension filenames.])
fi
if test x$MULTIARCH != x; then
MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\""
fi
+3
View File
@@ -1968,6 +1968,9 @@
/* The size of '_Bool', as computed by sizeof. */
#undef SIZEOF__BOOL
/* Platform tag, used in binary module extension filenames. */
#undef SOABI_PLATFORM
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS