Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit ee1b8ce

Browse filesBrowse files
gh-122907: Fix Builds Without HAVE_DYNAMIC_LOADING Set (gh-122952)
As of 529a160 (gh-118204), building with HAVE_DYNAMIC_LOADING stopped working. This is a minimal fix just to get builds working again. There are actually a number of long-standing deficiencies with HAVE_DYNAMIC_LOADING builds that need to be resolved separately.
1 parent 5f68511 commit ee1b8ce
Copy full SHA for ee1b8ce

File tree

Expand file treeCollapse file tree

5 files changed

+32
-12
lines changed
Filter options
Expand file treeCollapse file tree

5 files changed

+32
-12
lines changed

‎Include/internal/pycore_importdl.h

Copy file name to clipboardExpand all lines: Include/internal/pycore_importdl.h
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ extern int _Py_ext_module_loader_info_init_for_core(
5656
extern int _Py_ext_module_loader_info_init_for_builtin(
5757
struct _Py_ext_module_loader_info *p_info,
5858
PyObject *name);
59+
#ifdef HAVE_DYNAMIC_LOADING
5960
extern int _Py_ext_module_loader_info_init_from_spec(
6061
struct _Py_ext_module_loader_info *info,
6162
PyObject *spec);
63+
#endif
6264

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

8890
/* The module init function. */
8991
typedef PyObject *(*PyModInitFunction)(void);
92+
#ifdef HAVE_DYNAMIC_LOADING
9093
extern PyModInitFunction _PyImport_GetModInitFunc(
9194
struct _Py_ext_module_loader_info *info,
9295
FILE *fp);
96+
#endif
9397
extern int _PyImport_RunModInitFunc(
9498
PyModInitFunction p0,
9599
struct _Py_ext_module_loader_info *info,

‎Lib/importlib/_bootstrap_external.py

Copy file name to clipboardExpand all lines: Lib/importlib/_bootstrap_external.py
+8-8Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,14 +1523,14 @@ def _get_supported_file_loaders():
15231523
15241524
Each item is a tuple (loader, suffixes).
15251525
"""
1526-
if sys.platform in {"ios", "tvos", "watchos"}:
1527-
extension_loaders = [(AppleFrameworkLoader, [
1528-
suffix.replace(".so", ".fwork")
1529-
for suffix in _imp.extension_suffixes()
1530-
])]
1531-
else:
1532-
extension_loaders = []
1533-
extension_loaders.append((ExtensionFileLoader, _imp.extension_suffixes()))
1526+
extension_loaders = []
1527+
if hasattr(_imp, 'create_dynamic'):
1528+
if sys.platform in {"ios", "tvos", "watchos"}:
1529+
extension_loaders = [(AppleFrameworkLoader, [
1530+
suffix.replace(".so", ".fwork")
1531+
for suffix in _imp.extension_suffixes()
1532+
])]
1533+
extension_loaders.append((ExtensionFileLoader, _imp.extension_suffixes()))
15341534
source = SourceFileLoader, SOURCE_SUFFIXES
15351535
bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
15361536
return extension_loaders + [source, bytecode]
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Building with ``HAVE_DYNAMIC_LOADING`` now works as well as it did in 3.12.
2+
Existing deficiences will be addressed separately.
3+
(See https://github.com/python/cpython/issues/122950.)

‎Python/importdl.c

Copy file name to clipboardExpand all lines: Python/importdl.c
+8-4Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
#include "pycore_pystate.h"
99
#include "pycore_runtime.h"
1010

11+
#include "pycore_importdl.h"
12+
1113
/* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
1214
supported on this platform. configure will then compile and link in one
1315
of the dynload_*.c files, as appropriate. We will call a function in
1416
those modules to get a function pointer to the module's init function.
1517
*/
1618
#ifdef HAVE_DYNAMIC_LOADING
1719

18-
#include "pycore_importdl.h"
19-
2020
#ifdef MS_WINDOWS
2121
extern dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
2222
const char *shortname,
@@ -28,6 +28,8 @@ extern dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix,
2828
const char *pathname, FILE *fp);
2929
#endif
3030

31+
#endif /* HAVE_DYNAMIC_LOADING */
32+
3133

3234
/***********************************/
3335
/* module info to use when loading */
@@ -205,6 +207,7 @@ _Py_ext_module_loader_info_init_for_core(
205207
return 0;
206208
}
207209

210+
#ifdef HAVE_DYNAMIC_LOADING
208211
int
209212
_Py_ext_module_loader_info_init_from_spec(
210213
struct _Py_ext_module_loader_info *p_info,
@@ -226,6 +229,7 @@ _Py_ext_module_loader_info_init_from_spec(
226229
Py_DECREF(filename);
227230
return err;
228231
}
232+
#endif /* HAVE_DYNAMIC_LOADING */
229233

230234

231235
/********************************/
@@ -372,6 +376,7 @@ _Py_ext_module_loader_result_apply_error(
372376
/* getting/running the module init function */
373377
/********************************************/
374378

379+
#ifdef HAVE_DYNAMIC_LOADING
375380
PyModInitFunction
376381
_PyImport_GetModInitFunc(struct _Py_ext_module_loader_info *info,
377382
FILE *fp)
@@ -406,6 +411,7 @@ _PyImport_GetModInitFunc(struct _Py_ext_module_loader_info *info,
406411

407412
return (PyModInitFunction)exportfunc;
408413
}
414+
#endif /* HAVE_DYNAMIC_LOADING */
409415

410416
int
411417
_PyImport_RunModInitFunc(PyModInitFunction p0,
@@ -513,5 +519,3 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
513519
p_res->err = &p_res->_err;
514520
return -1;
515521
}
516-
517-
#endif /* HAVE_DYNAMIC_LOADING */

‎Tools/build/check_extension_modules.py

Copy file name to clipboardExpand all lines: Tools/build/check_extension_modules.py
+9Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import sys
2828
import sysconfig
2929
import warnings
30+
import _imp
3031

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

155156
def check(self):
157+
if not hasattr(_imp, 'create_dynamic'):
158+
logger.warning(
159+
('Dynamic extensions not supported '
160+
'(HAVE_DYNAMIC_LOADING not defined)'),
161+
)
156162
for modinfo in self.modules:
157163
logger.debug("Checking '%s' (%s)", modinfo.name, self.get_location(modinfo))
158164
if modinfo.state == ModuleState.DISABLED:
@@ -414,6 +420,9 @@ def check_module_import(self, modinfo: ModuleInfo):
414420
logger.error("%s failed to import: %s", modinfo.name, e)
415421
raise
416422
except Exception as e:
423+
if not hasattr(_imp, 'create_dynamic'):
424+
logger.warning("Dynamic extension '%s' ignored", modinfo.name)
425+
return
417426
logger.exception("Importing extension '%s' failed!", modinfo.name)
418427
raise
419428

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.