--- /dev/null
+#ifndef Py_INTERNAL_IMPORTDL_H
+#define Py_INTERNAL_IMPORTDL_H
+
+#include "patchlevel.h" // PY_MAJOR_VERSION
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+
+extern const char *_PyImport_DynLoadFiletab[];
+
+extern PyObject *_PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *);
+
+typedef PyObject *(*PyModInitFunction)(void);
+
+/* Max length of module suffix searched for -- accommodates "module.slb" */
+#define MAXSUFFIXSIZE 12
+
+#ifdef MS_WINDOWS
+#include <windows.h>
+typedef FARPROC dl_funcptr;
+
+#ifdef _DEBUG
+# define PYD_DEBUG_SUFFIX "_d"
+#else
+# define PYD_DEBUG_SUFFIX ""
+#endif
+
+#ifdef Py_NOGIL
+# define PYD_THREADING_TAG "t"
+#else
+# define PYD_THREADING_TAG ""
+#endif
+
+#ifdef PYD_PLATFORM_TAG
+# define PYD_SOABI "cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG "-" PYD_PLATFORM_TAG
+#else
+# define PYD_SOABI "cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG
+#endif
+
+#define PYD_TAGGED_SUFFIX PYD_DEBUG_SUFFIX "." PYD_SOABI ".pyd"
+#define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd"
+
+#else
+typedef void (*dl_funcptr)(void);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_IMPORTDL_H */
def _init_non_posix(vars):
"""Initialize the module as appropriate for NT"""
# set basic install directories
- import _imp
+ import _winapi
+ import _sysconfig
vars['LIBDEST'] = get_path('stdlib')
vars['BINLIBDEST'] = get_path('platstdlib')
vars['INCLUDEPY'] = get_path('include')
- try:
- # GH-99201: _imp.extension_suffixes may be empty when
- # HAVE_DYNAMIC_LOADING is not set. In this case, don't set EXT_SUFFIX.
- vars['EXT_SUFFIX'] = _imp.extension_suffixes()[0]
- except IndexError:
- pass
+
+ # Add EXT_SUFFIX, SOABI, and Py_NOGIL
+ vars.update(_sysconfig.config_vars())
+
+ vars['LIBDIR'] = _safe_realpath(os.path.join(get_config_var('installed_base'), 'libs'))
+ if hasattr(sys, 'dllhandle'):
+ dllhandle = _winapi.GetModuleFileName(sys.dllhandle)
+ vars['LIBRARY'] = os.path.basename(_safe_realpath(dllhandle))
+ vars['LDLIBRARY'] = vars['LIBRARY']
vars['EXE'] = '.exe'
vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable))
get_path, get_path_names, _INSTALL_SCHEMES,
get_default_scheme, get_scheme_names, get_config_var,
_expand_vars, _get_preferred_schemes, _main)
+import _imp
import _osx_support
+import _sysconfig
HAS_USER_BASE = sysconfig._HAS_USER_BASE
self.assertIn(ldflags, ldshared)
+ @unittest.skipIf(not _imp.extension_suffixes(), "stub loader has no suffixes")
+ def test_soabi(self):
+ soabi = sysconfig.get_config_var('SOABI')
+ self.assertIn(soabi, _imp.extension_suffixes()[0])
+
+ def test_library(self):
+ library = sysconfig.get_config_var('LIBRARY')
+ ldlibrary = sysconfig.get_config_var('LDLIBRARY')
+ major, minor = sys.version_info[:2]
+ if sys.platform == 'win32':
+ self.assertTrue(library.startswith(f'python{major}{minor}'))
+ self.assertTrue(library.endswith('.dll'))
+ self.assertEqual(library, ldlibrary)
+ else:
+ self.assertTrue(library.startswith(f'libpython{major}.{minor}'))
+ self.assertTrue(library.endswith('.a'))
+ self.assertTrue(ldlibrary.startswith(f'libpython{major}.{minor}'))
+
@unittest.skipUnless(sys.platform == "darwin", "test only relevant on MacOSX")
@requires_subprocess()
def test_platform_in_subprocess(self):
@unittest.skipIf(sysconfig.get_config_var('EXT_SUFFIX') is None,
'EXT_SUFFIX required for this test')
+ @unittest.skipIf(not _imp.extension_suffixes(), "stub loader has no suffixes")
def test_EXT_SUFFIX_in_vars(self):
- import _imp
- if not _imp.extension_suffixes():
- self.skipTest("stub loader has no suffixes")
vars = sysconfig.get_config_vars()
self.assertEqual(vars['EXT_SUFFIX'], _imp.extension_suffixes()[0])
--- /dev/null
+Add new variables to :py:meth:`sysconfig.get_config_vars` on Windows:
+``LIBRARY``, ``LDLIBRARY``, ``LIBDIR``, ``SOABI``, and ``Py_NOGIL``.
#math mathmodule.c
#mmap mmapmodule.c
#select selectmodule.c
+#_sysconfig _sysconfig.c
# XML
#_elementtree _elementtree.c
_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c
itertools itertoolsmodule.c
_sre _sre/sre.c
+_sysconfig _sysconfig.c
_thread _threadmodule.c
time timemodule.c
_typing _typingmodule.c
--- /dev/null
+// _sysconfig provides data for the Python sysconfig module
+
+#ifndef Py_BUILD_CORE_BUILTIN
+# define Py_BUILD_CORE_MODULE 1
+#endif
+
+#include "Python.h"
+
+#include "pycore_importdl.h" // _PyImport_DynLoadFiletab
+#include "pycore_long.h" // _PyLong_GetZero, _PyLong_GetOne
+
+
+/*[clinic input]
+module _sysconfig
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=0a7c02d3e212ac97]*/
+
+#include "clinic/_sysconfig.c.h"
+
+#ifdef MS_WINDOWS
+static int
+add_string_value(PyObject *dict, const char *key, const char *str_value)
+{
+ PyObject *value = PyUnicode_FromString(str_value);
+ if (value == NULL) {
+ return -1;
+ }
+ int err = PyDict_SetItemString(dict, key, value);
+ Py_DECREF(value);
+ return err;
+}
+#endif
+
+/*[clinic input]
+_sysconfig.config_vars
+
+Returns a dictionary containing build variables intended to be exposed by sysconfig.
+[clinic start generated code]*/
+
+static PyObject *
+_sysconfig_config_vars_impl(PyObject *module)
+/*[clinic end generated code: output=9c41cdee63ea9487 input=391ff42f3af57d01]*/
+{
+ PyObject *config = PyDict_New();
+ if (config == NULL) {
+ return NULL;
+ }
+
+#ifdef MS_WINDOWS
+ if (add_string_value(config, "EXT_SUFFIX", PYD_TAGGED_SUFFIX) < 0) {
+ Py_DECREF(config);
+ return NULL;
+ }
+ if (add_string_value(config, "SOABI", PYD_SOABI) < 0) {
+ Py_DECREF(config);
+ return NULL;
+ }
+#endif
+
+#ifdef Py_NOGIL
+ PyObject *py_nogil = _PyLong_GetOne();
+#else
+ PyObject *py_nogil = _PyLong_GetZero();
+#endif
+ if (PyDict_SetItemString(config, "Py_NOGIL", py_nogil) < 0) {
+ Py_DECREF(config);
+ return NULL;
+ }
+
+ return config;
+}
+
+PyDoc_STRVAR(sysconfig__doc__,
+"A helper for the sysconfig module.");
+
+static struct PyMethodDef sysconfig_methods[] = {
+ _SYSCONFIG_CONFIG_VARS_METHODDEF
+ {NULL, NULL}
+};
+
+static PyModuleDef_Slot sysconfig_slots[] = {
+ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {0, NULL}
+};
+
+static PyModuleDef sysconfig_module = {
+ .m_base = PyModuleDef_HEAD_INIT,
+ .m_name = "_sysconfig",
+ .m_doc = sysconfig__doc__,
+ .m_methods = sysconfig_methods,
+ .m_slots = sysconfig_slots,
+};
+
+PyMODINIT_FUNC
+PyInit__sysconfig(void)
+{
+ return PyModuleDef_Init(&sysconfig_module);
+}
--- /dev/null
+/*[clinic input]
+preserve
+[clinic start generated code]*/
+
+PyDoc_STRVAR(_sysconfig_config_vars__doc__,
+"config_vars($module, /)\n"
+"--\n"
+"\n"
+"Returns a dictionary containing build variables intended to be exposed by sysconfig.");
+
+#define _SYSCONFIG_CONFIG_VARS_METHODDEF \
+ {"config_vars", (PyCFunction)_sysconfig_config_vars, METH_NOARGS, _sysconfig_config_vars__doc__},
+
+static PyObject *
+_sysconfig_config_vars_impl(PyObject *module);
+
+static PyObject *
+_sysconfig_config_vars(PyObject *module, PyObject *Py_UNUSED(ignored))
+{
+ return _sysconfig_config_vars_impl(module);
+}
+/*[clinic end generated code: output=25d395cf02eced1f input=a9049054013a1b77]*/
extern PyObject* PyInit__sha2(void);
extern PyObject* PyInit__sha3(void);
extern PyObject* PyInit__statistics(void);
+extern PyObject* PyInit__sysconfig(void);
extern PyObject* PyInit__typing(void);
extern PyObject* PyInit__blake2(void);
extern PyObject* PyInit_time(void);
{"_sha2", PyInit__sha2},
{"_sha3", PyInit__sha3},
{"_blake2", PyInit__blake2},
+ {"_sysconfig", PyInit__sysconfig},
{"time", PyInit_time},
{"_thread", PyInit__thread},
{"_tokenize", PyInit__tokenize},
<ClInclude Include="..\Include\internal\pycore_hashtable.h" />
<ClInclude Include="..\Include\internal\pycore_identifier.h" />
<ClInclude Include="..\Include\internal\pycore_import.h" />
+ <ClInclude Include="..\Include\internal\pycore_importdl.h" />
<ClInclude Include="..\Include\internal\pycore_initconfig.h" />
<ClInclude Include="..\Include\internal\pycore_interp.h" />
<ClInclude Include="..\Include\internal\pycore_intrinsics.h" />
<ClInclude Include="..\PC\errmap.h" />
<ClInclude Include="..\PC\pyconfig.h" />
<ClInclude Include="..\Python\condvar.h" />
- <ClInclude Include="..\Python\importdl.h" />
<ClInclude Include="..\Python\stdlib_module_names.h" />
<ClInclude Include="..\Python\thread_nt.h" />
</ItemGroup>
<ClCompile Include="..\Modules\signalmodule.c" />
<ClCompile Include="..\Modules\_statisticsmodule.c" />
<ClCompile Include="..\Modules\symtablemodule.c" />
+ <ClCompile Include="..\Modules\_sysconfig.c" />
<ClCompile Include="..\Modules\_threadmodule.c" />
<ClCompile Include="..\Modules\_tracemalloc.c" />
<ClCompile Include="..\Modules\_typingmodule.c" />
<ClInclude Include="..\PC\pyconfig.h">
<Filter>PC</Filter>
</ClInclude>
- <ClInclude Include="..\Python\importdl.h">
- <Filter>Python</Filter>
- </ClInclude>
<ClInclude Include="..\Python\stdlib_module_names.h">
<Filter>Python</Filter>
</ClInclude>
<ClInclude Include="..\Include\internal\pycore_import.h">
<Filter>Include\internal</Filter>
</ClInclude>
+ <ClInclude Include="..\Include\internal\pycore_importdl.h">
+ <Filter>Include\internal</Filter>
+ </ClInclude>
<ClInclude Include="..\Include\internal\pycore_initconfig.h">
<Filter>Include\internal</Filter>
</ClInclude>
<ClCompile Include="..\Modules\symtablemodule.c">
<Filter>Modules</Filter>
</ClCompile>
+ <ClCompile Include="..\Modules\_sysconfig.c">
+ <Filter>Modules</Filter>
+ </ClCompile>
<ClCompile Include="..\Modules\_threadmodule.c">
<Filter>Modules</Filter>
</ClCompile>
#include <errno.h>
#include "Python.h"
-#include "importdl.h"
+#include "pycore_importdl.h"
#if defined(__hp9000s300)
#define FUNCNAME_PATTERN "_%.20s_%.200s"
#include "Python.h"
#include "pycore_interp.h" // _PyInterpreterState.dlopenflags
#include "pycore_pystate.h" // _PyInterpreterState_GET()
-#include "importdl.h"
+#include "pycore_importdl.h"
#include <sys/types.h>
#include <sys/stat.h>
not present. */
#include "Python.h"
-#include "importdl.h"
+#include "pycore_importdl.h"
const char *_PyImport_DynLoadFiletab[] = {NULL};
#include "pycore_fileutils.h" // _Py_add_relfile()
#include "pycore_pystate.h" // _PyInterpreterState_GET()
-#include "importdl.h" // dl_funcptr
+#include "pycore_importdl.h" // dl_funcptr
#include "patchlevel.h" // PY_MAJOR_VERSION
#include <windows.h>
-#ifdef _DEBUG
-#define PYD_DEBUG_SUFFIX "_d"
-#else
-#define PYD_DEBUG_SUFFIX ""
-#endif
-
-#ifdef Py_NOGIL
-# define PYD_THREADING_TAG "t"
-#else
-# define PYD_THREADING_TAG ""
-#endif
-
-#ifdef PYD_PLATFORM_TAG
-#define PYD_TAGGED_SUFFIX PYD_DEBUG_SUFFIX ".cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG "-" PYD_PLATFORM_TAG ".pyd"
-#else
-#define PYD_TAGGED_SUFFIX PYD_DEBUG_SUFFIX ".cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG ".pyd"
-#endif
-
-#define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd"
-
const char *_PyImport_DynLoadFiletab[] = {
PYD_TAGGED_SUFFIX,
PYD_UNTAGGED_SUFFIX,
#include "pycore_weakref.h" // _PyWeakref_GET_REF()
#include "marshal.h" // PyMarshal_ReadObjectFromString()
-#include "importdl.h" // _PyImport_DynLoadFiletab
+#include "pycore_importdl.h" // _PyImport_DynLoadFiletab
#include "pydtrace.h" // PyDTrace_IMPORT_FIND_LOAD_START_ENABLED()
#include <stdbool.h> // bool
*/
#ifdef HAVE_DYNAMIC_LOADING
-#include "importdl.h"
+#include "pycore_importdl.h"
#ifdef MS_WINDOWS
extern dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
+++ /dev/null
-#ifndef Py_IMPORTDL_H
-#define Py_IMPORTDL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-extern const char *_PyImport_DynLoadFiletab[];
-
-extern PyObject *_PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *);
-
-typedef PyObject *(*PyModInitFunction)(void);
-
-/* Max length of module suffix searched for -- accommodates "module.slb" */
-#define MAXSUFFIXSIZE 12
-
-#ifdef MS_WINDOWS
-#include <windows.h>
-typedef FARPROC dl_funcptr;
-#else
-typedef void (*dl_funcptr)(void);
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* !Py_IMPORTDL_H */
"_strptime",
"_struct",
"_symtable",
+"_sysconfig",
"_thread",
"_threading_local",
"_tkinter",
# XXX Fix the analyzer.
## forward/extern references
+Include/internal/pycore_importdl.h - _PyImport_DynLoadFiletab -
Include/py_curses.h - PyCurses_API -
Include/pydecimal.h - _decimal_api -
Modules/_blake2/blake2module.c - blake2b_type_spec -
Objects/object.c - _PyPositionsIterator -
Python/perf_trampoline.c - _Py_trampoline_func_start -
Python/perf_trampoline.c - _Py_trampoline_func_end -
-Python/importdl.h - _PyImport_DynLoadFiletab -
Modules/expat/xmlrole.c - prolog0 -
Modules/expat/xmlrole.c - prolog1 -
Modules/expat/xmlrole.c - prolog2 -