135 lines
4.5 KiB
Diff
135 lines
4.5 KiB
Diff
From 6070b1f28a0c6861dbb5ff6ccbdc14b880627485 Mon Sep 17 00:00:00 2001
|
|
From: Naveen M K <naveen521kk@gmail.com>
|
|
Date: Sat, 5 Aug 2023 14:10:27 +0530
|
|
Subject: [PATCH 099/N] Search DLLs only on paths added using
|
|
`add_dll_directory()`.
|
|
|
|
This is the default behavior on upstream Python. We previously
|
|
reverted this behavior because it broke some use cases.
|
|
|
|
The old behavior can be restored by setting the environment variable
|
|
PYTHONLEGACYWINDOWSDLLLOADING to 1.
|
|
|
|
Fixes https://github.com/msys2-contrib/cpython-mingw/issues/48
|
|
Also fixes https://github.com/msys2-contrib/cpython-mingw/issues/141
|
|
|
|
Signed-off-by: Naveen M K <naveen521kk@gmail.com>
|
|
---
|
|
.github/workflows/mingw.yml | 10 +++++-----
|
|
Lib/test/__main__.py | 8 ++++++++
|
|
Python/dynload_win.c | 16 ++++++++++++++--
|
|
Tools/build/check_extension_modules.py | 4 ++++
|
|
mingw_smoketests.py | 3 +++
|
|
5 files changed, 34 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml
|
|
index 0cb48e0..5d6097e 100644
|
|
--- a/.github/workflows/mingw.yml
|
|
+++ b/.github/workflows/mingw.yml
|
|
@@ -126,15 +126,15 @@ jobs:
|
|
cp "${pkgdir}${MINGW_PREFIX}"/bin/idle3 "${pkgdir}${MINGW_PREFIX}"/bin/idle
|
|
cp "${pkgdir}${MINGW_PREFIX}"/bin/pydoc3 "${pkgdir}${MINGW_PREFIX}"/bin/pydoc
|
|
|
|
+ # copy to /
|
|
+ cp -rf "${pkgdir}"/* /
|
|
+
|
|
- name: Run Smoke Test (installed)
|
|
shell: msys2 {0}
|
|
run: |
|
|
- export PYTHONTZPATH="${MINGW_PREFIX}/share/zoneinfo"
|
|
SMOKETESTS="$(pwd)/mingw_smoketests.py"
|
|
- cd _build
|
|
- cd python_pkgdir/${MINGW_PREFIX}/bin
|
|
- ./python.exe "$SMOKETESTS"
|
|
- MSYSTEM= ./python.exe "$SMOKETESTS"
|
|
+ ${MINGW_PREFIX}/bin/python.exe "$SMOKETESTS"
|
|
+ MSYSTEM= ${MINGW_PREFIX}/bin/python.exe "$SMOKETESTS"
|
|
|
|
- name: Compress
|
|
if: always()
|
|
diff --git a/Lib/test/__main__.py b/Lib/test/__main__.py
|
|
index 82b50ad..25bac39 100644
|
|
--- a/Lib/test/__main__.py
|
|
+++ b/Lib/test/__main__.py
|
|
@@ -1,2 +1,10 @@
|
|
+import os
|
|
+import sys
|
|
+
|
|
from test.libregrtest.main import main
|
|
+
|
|
+if sys.platform == "win32":
|
|
+ # Enable DLL loading from PATH.
|
|
+ os.environ["PYTHONLEGACYWINDOWSDLLLOADING"] = "1"
|
|
+
|
|
main(_add_python_opts=True)
|
|
diff --git a/Python/dynload_win.c b/Python/dynload_win.c
|
|
index 1f90e21..db79687 100644
|
|
--- a/Python/dynload_win.c
|
|
+++ b/Python/dynload_win.c
|
|
@@ -4,6 +4,7 @@
|
|
#include "Python.h"
|
|
#include "pycore_fileutils.h" // _Py_add_relfile()
|
|
#include "pycore_pystate.h" // _PyInterpreterState_GET()
|
|
+#include "pycore_initconfig.h"
|
|
|
|
#ifdef HAVE_DIRECT_H
|
|
#include <direct.h>
|
|
@@ -225,6 +226,18 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
|
|
dl_funcptr p;
|
|
char funcname[258], *import_python;
|
|
|
|
+ int use_legacy = 0;
|
|
+ DWORD load_library_flags = 0;
|
|
+
|
|
+ _Py_get_env_flag(1, &use_legacy, "PYTHONLEGACYWINDOWSDLLLOADING");
|
|
+
|
|
+ if (use_legacy) {
|
|
+ load_library_flags = LOAD_WITH_ALTERED_SEARCH_PATH;
|
|
+ } else {
|
|
+ load_library_flags = LOAD_LIBRARY_SEARCH_DEFAULT_DIRS |
|
|
+ LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR;
|
|
+ }
|
|
+
|
|
#ifdef _MSC_VER
|
|
_Py_CheckPython3();
|
|
#endif /* _MSC_VER */
|
|
@@ -249,8 +262,7 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
|
|
AddDllDirectory function. We add SEARCH_DLL_LOAD_DIR to
|
|
ensure DLLs adjacent to the PYD are preferred. */
|
|
Py_BEGIN_ALLOW_THREADS
|
|
- hDLL = LoadLibraryExW(wpathname, NULL,
|
|
- LOAD_WITH_ALTERED_SEARCH_PATH);
|
|
+ hDLL = LoadLibraryExW(wpathname, NULL, load_library_flags);
|
|
Py_END_ALLOW_THREADS
|
|
PyMem_Free(wpathname);
|
|
|
|
diff --git a/Tools/build/check_extension_modules.py b/Tools/build/check_extension_modules.py
|
|
index aa1ade7..7ded0f4 100644
|
|
--- a/Tools/build/check_extension_modules.py
|
|
+++ b/Tools/build/check_extension_modules.py
|
|
@@ -61,6 +61,10 @@ WINDOWS_MODULES = {
|
|
"winsound",
|
|
}
|
|
|
|
+if sys.platform == "win32":
|
|
+ # Enable DLL loading from PATH.
|
|
+ os.environ["PYTHONLEGACYWINDOWSDLLLOADING"] = "1"
|
|
+
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
diff --git a/mingw_smoketests.py b/mingw_smoketests.py
|
|
index 516005c..ca1f652 100644
|
|
--- a/mingw_smoketests.py
|
|
+++ b/mingw_smoketests.py
|
|
@@ -34,6 +34,9 @@ if os.environ.get("MSYSTEM", ""):
|
|
else:
|
|
SEP = "\\"
|
|
|
|
+if sysconfig.is_python_build():
|
|
+ os.environ["PYTHONLEGACYWINDOWSDLLLOADING"] = "1"
|
|
+
|
|
_UCRT = sysconfig.get_platform() not in ('mingw_x86_64', 'mingw_i686')
|
|
|
|
|