8000 gh-122907: Fix Builds Without HAVE_DYNAMIC_LOADING Set by ericsnowcurrently · Pull Request #122952 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-122907: Fix Builds Without HAVE_DYNAMIC_LOADING Set #122952

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Include/internal/pycore_importdl.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,11 @@ extern int _Py_ext_module_loader_info_init_for_core(
extern int _Py_ext_module_loader_info_init_for_builtin(
struct _Py_ext_module_loader_info *p_info,
PyObject *name);
#ifdef HAVE_DYNAMIC_LOADING
extern int _Py_ext_module_loader_info_init_from_spec(
struct _Py_ext_module_loader_info *info,
PyObject *spec);
#endif

/* The result from running an extension module's init function. */
struct _Py_ext_module_loader_result {
Expand Down Expand Up @@ -87,9 +89,11 @@ extern void _Py_ext_module_loader_result_apply_error(

/* The module init function. */
typedef PyObject *(*PyModInitFunction)(void);
#ifdef HAVE_DYNAMIC_LOADING
extern PyModInitFunction _PyImport_GetModInitFunc(
struct _Py_ext_module_loader_info *info,
FILE *fp);
#endif
extern int _PyImport_RunModInitFunc(
PyModInitFunction p0,
struct _Py_ext_module_loader_info *info,
Expand Down
16 changes: 8 additions & 8 deletions Lib/importlib/_bootstrap_external.py
Original file line number Diff line number Diff line change
Expand Up @@ -1523,14 +1523,14 @@ def _get_supported_file_loaders():

Each item is a tuple (loader, suffixes).
"""
if sys.platform in {"ios", "tvos", "watchos"}:
extension_loaders = [(AppleFrameworkLoader, [
suffix.replace(".so", ".fwork")
for suffix in _imp.extension_suffixes()
])]
else:
extension_loaders = []
extension_loaders.append((ExtensionFileLoader, _imp.extension_suffixes()))
extension_loaders = []
if hasattr(_imp, 'create_dynamic'):
if sys.platform in {"ios", "tvos", "watchos"}:
extension_loaders = [(AppleFrameworkLoader, [
suffix.replace(".so", ".fwork")
for suffix in _imp.extension_suffixes()
])]
extension_loaders.append((ExtensionFileLoader, _imp.extension_suffixes()))
source = SourceFileLoader, SOURCE_SUFFIXES
bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
return extension_loaders + [source, bytecode]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Building with ``HAVE_DYNAMIC_LOADING`` now works as well as it did in 3.12.
Existing deficiences will be addressed separately.
(See https://github.com/python/cpython/issues/122950.)
12 changes: 8 additions & 4 deletions Python/importdl.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
#include "pycore_pystate.h"
#include "pycore_runtime.h"

#include "pycore_importdl.h"

/* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
supported on this platform. configure will then compile and link in one
of the dynload_*.c files, as appropriate. We will call a function in
those modules to get a function pointer to the module's init function.
*/
#ifdef HAVE_DYNAMIC_LOADING

#include "pycore_importdl.h"

#ifdef MS_WINDOWS
extern dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
const char *shortname,
Expand All @@ -28,6 +28,8 @@ extern dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix,
const char *pathname, FILE *fp);
#endif

#endif /* HAVE_DYNAMIC_LOADING */


/***********************************/
/* module info to use when loading */
Expand Down Expand Up @@ -205,6 +207,7 @@ _Py_ext_module_loader_info_init_for_core(
return 0;
}

#ifdef HAVE_DYNAMIC_LOADING
int
_Py_ext_module_loader_info_init_from_spec(
struct _Py_ext_module_loader_info *p_info,
Expand All @@ -226,6 +229,7 @@ _Py_ext_module_loader_info_init_from_spec(
Py_DECREF(filename);
return err;
}
#endif /* HAVE_DYNAMIC_LOADING */


/********************************/
Expand Down Expand Up @@ -372,6 +376,7 @@ _Py_ext_module_loader_result_apply_error(
/* getting/running the module init function */
/********************************************/

#ifdef HAVE_DYNAMIC_LOADING
PyModInitFunction
_PyImport_GetModInitFunc(struct _Py_ext_module_loader_info *info,
FILE *fp)
Expand Down Expand Up @@ -406,6 +411,7 @@ _PyImport_GetModInitFunc(struct _Py_ext_module_loader_info *info,

return (PyModInitFunction)exportfunc;
}
#endif /* HAVE_DYNAMIC_LOADING */

int
_PyImport_RunModInitFunc(PyModInitFunction p0,
Expand Down Expand Up @@ -513,5 +519,3 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
p_res->err = &p_res->_err;
return -1;
}

#endif /* HAVE_DYNAMIC_LOADING */
9 changes: 9 additions & 0 deletions Tools/build/check_extension_modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import sys
import sysconfig
import warnings
import _imp

from importlib._bootstrap import _load as bootstrap_load
from importlib.machinery import BuiltinImporter, ExtensionFileLoader, ModuleSpec
Expand Down Expand Up @@ -153,6 +154,11 @@ def __init__(self, cross_compiling: bool = False, strict: bool = False):
self.notavailable = []

def check(self):
if not hasattr(_imp, 'create_dynamic'):
logger.warning(
('Dynamic extensions not supported '
'(HAVE_DYNAMIC_LOADING not defined)'),
)
for modinfo in self.modules:
logger.debug("Checking '%s' (%s)", modinfo.name, self.get_location(modinfo))
if modinfo.state == ModuleState.DISABLED:
Expand Down Expand Up @@ -414,6 +420,9 @@ def check_module_import(self, modinfo: ModuleInfo):
logger.error("%s failed to import: %s", modinfo.name, e)
raise
except Exception as e:
if not hasattr(_imp, 'create_dynamic'):
logger.warning("Dynamic extension '%s' ignored", modinfo.name)
return
logger.exception("Importing extension '%s' failed!", modinfo.name)
raise

Expand Down
Loading
0