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
=========================
for name in (
'ABIFLAGS',
+ 'ALT_SOABI',
'ANDROID_API_LEVEL',
'CC',
'CCSHARED',
'Py_REMOTE_DEBUG',
'SHELL',
'SOABI',
+ 'SOABI_PLATFORM',
'TEST_MODULES',
'VAPTH',
'abs_builddir',
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
collect_zstd,
collect_libregrtest_utils,
collect_system,
+ collect_importlib,
# Collecting from tests should be last as they have side effects.
collect_test_socket,
import unittest
import sys
+import sysconfig
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))
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
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')
--- /dev/null
+Allow importing stable ABI C extensions that include a multiarch tuple in their filename, e.g. ``foo.abi3-x86-64-linux-gnu.so``.
"." 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__ */
;;
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
[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
/* 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