Files
MINGW-packages/mingw-w64-python3/0560-mingw-use-posix-getpath.patch
2013-12-27 11:17:12 +04:00

248 lines
7.0 KiB
Diff

diff -urN a/configure.ac b/configure.ac
--- a/configure.ac 2013-12-26 18:47:26.256785700 +0000
+++ b/configure.ac 2013-12-26 18:47:31.337076200 +0000
@@ -4900,7 +4900,7 @@
case $host in
*-*-mingw*)
dnl default sys.path calculations for windows platforms
- MODULE_GETPATH=PC/getpathp.o
+ MODULE_GETPATH=Modules/getpath.o
;;
esac
diff -urN a/Include/fileutils.h b/Include/fileutils.h
--- a/Include/fileutils.h 2013-12-26 18:47:26.533801500 +0000
+++ b/Include/fileutils.h 2013-12-26 18:47:31.339076300 +0000
@@ -15,7 +15,7 @@
const wchar_t *text,
size_t *error_pos);
-#if defined(HAVE_STAT) && !defined(MS_WINDOWS)
+#if defined(HAVE_STAT) && (!defined(MS_WINDOWS) || defined(__MINGW32__))
PyAPI_FUNC(int) _Py_wstat(
const wchar_t* path,
struct stat *buf);
diff -urN a/Modules/getpath.c b/Modules/getpath.c
--- a/Modules/getpath.c 2013-12-26 18:47:27.589861900 +0000
+++ b/Modules/getpath.c 2013-12-26 18:47:31.342076500 +0000
@@ -10,6 +10,10 @@
#include <mach-o/dyld.h>
#endif
+#ifdef MS_WINDOWS
+#include <windows.h>
+#endif
+
/* Search in some common locations for the associated Python libraries.
*
* Two directories must be found, the platform independent directory
@@ -130,9 +134,17 @@
#define LANDMARK L"os.py"
#endif
+#ifdef __MINGW32__
+#define wcstok(line, delim, pointer) wcstok(line, delim)
+#endif
+
static wchar_t prefix[MAXPATHLEN+1];
static wchar_t exec_prefix[MAXPATHLEN+1];
static wchar_t progpath[MAXPATHLEN+1];
+#ifdef MS_WINDOWS
+static wchar_t dllpath[MAXPATHLEN+1];
+extern HANDLE PyWin_DLLhModule;
+#endif
static wchar_t *module_search_path = NULL;
static int module_search_path_malloced = 0;
static wchar_t *lib_python = L"lib/python" VERSION;
@@ -143,7 +155,7 @@
size_t i = wcslen(dir);
while (i > 0 && dir[i] != SEP)
--i;
- dir[i] = '\0';
+ dir[i] = 0;
}
static int
@@ -213,7 +225,11 @@
joinpath(wchar_t *buffer, wchar_t *stuff)
{
size_t n, k;
+#ifdef MS_WINDOWS
+ if (stuff[0] == SEP || (stuff[0] != 0 && stuff[1] == L':'))
+#else
if (stuff[0] == SEP)
+#endif
n = 0;
else {
n = wcslen(buffer);
@@ -234,7 +250,11 @@
static void
copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen)
{
+#ifdef MS_WINDOWS
+ if (p[0] == SEP || (p[0] != 0 && p[1] == L':'))
+#else
if (p[0] == SEP)
+#endif
wcscpy(path, p);
else {
if (!_Py_wgetcwd(path, pathlen)) {
@@ -254,7 +274,11 @@
{
wchar_t buffer[MAXPATHLEN+1];
+#ifdef MS_WINDOWS
+ if (path[0] == SEP || (path[0] != 0 && path[1] == L':'))
+#else
if (path[0] == SEP)
+#endif
return;
copy_absolute(buffer, path, MAXPATHLEN+1);
wcscpy(path, buffer);
@@ -459,6 +483,35 @@
return 0;
}
+#ifdef MS_WINDOWS
+/* Calculates dllpath and progpath, replacing \\ with / */
+int GetWindowsModulePaths()
+{
+ int result = 0;
+ wchar_t* seps;
+ result = GetModuleFileNameW(NULL, progpath, MAXPATHLEN);
+ seps = wcschr(progpath, L'\\');
+ while(seps) {
+ *seps = L'/';
+ seps = wcschr(seps, L'\\');
+ }
+ dllpath[0] = 0;
+#ifdef Py_ENABLE_SHARED
+ if (PyWin_DLLhModule) {
+ if((GetModuleFileNameW(PyWin_DLLhModule, dllpath, MAXPATHLEN) > 0)) {
+ result = 1;
+ seps = wcschr(dllpath, L'\\');
+ while(seps) {
+ *seps = L'/';
+ seps = wcschr(seps, L'\\');
+ }
+ }
+ }
+#endif
+ return result;
+}
+#endif /* MS_WINDOWS */
+
static void
calculate_path(void)
{
@@ -535,6 +588,10 @@
}
}
#endif /* __APPLE__ */
+#ifdef MS_WINDOWS
+ else if(GetWindowsModulePaths()) {
+ }
+#endif /* MS_WINDOWS */
else if (path) {
while (1) {
wchar_t *delim = wcschr(path, DELIM);
@@ -564,7 +621,11 @@
progpath[0] = '\0';
if (path_buffer != NULL)
PyMem_Free(path_buffer);
+#ifdef MS_WINDOWS
+ if (progpath[0] != '\0' && progpath[0] != SEP && progpath[1] != L':')
+#else
if (progpath[0] != SEP && progpath[0] != '\0')
+#endif
absolutize(progpath);
wcsncpy(argv0_path, progpath, MAXPATHLEN);
argv0_path[MAXPATHLEN] = '\0';
@@ -881,7 +942,43 @@
}
-#ifdef __cplusplus
+#ifdef MS_WINDOWS
+/* Load python3.dll before loading any extension module that might refer
+ to it. That way, we can be sure that always the python3.dll corresponding
+ to this python DLL is loaded, not a python3.dll that might be on the path
+ by chance.
+ Return whether the DLL was found.
+*/
+static int python3_checked = 0;
+static HANDLE hPython3;
+int
+_Py_CheckPython3()
+{
+ wchar_t py3path[MAXPATHLEN+1];
+ wchar_t *s;
+ if (python3_checked)
+ return hPython3 != NULL;
+ python3_checked = 1;
+
+ /* If there is a python3.dll next to the python3y.dll,
+ assume this is a build tree; use that DLL */
+ wcscpy(py3path, dllpath);
+ s = wcsrchr(py3path, L'\\');
+ if (!s)
+ s = py3path;
+ wcscpy(s, L"\\python3.dll");
+ hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+ if (hPython3 != NULL)
+ return 1;
+
+ /* Check sys.prefix\DLLs\python3.dll */
+ wcscpy(py3path, Py_GetPrefix());
+ wcscat(py3path, L"\\DLLs\\python3.dll");
+ hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+ return hPython3 != NULL;
}
#endif
+#ifdef __cplusplus
+}
+#endif
diff -urN a/Modules/posixmodule.c b/Modules/posixmodule.c
--- a/Modules/posixmodule.c 2013-12-26 18:47:27.599862500 +0000
+++ b/Modules/posixmodule.c 2013-12-26 18:47:31.349076900 +0000
@@ -934,7 +934,7 @@
}
/* A helper used by a number of POSIX-only functions */
-#ifndef MS_WINDOWS
+#if !defined(MS_WINDOWS) || defined(__MINGW32__)
static int
_parse_off_t(PyObject* arg, void* addr)
{
@@ -3585,7 +3585,7 @@
Py_END_ALLOW_THREADS
/* FindNextFile sets error to ERROR_NO_MORE_FILES if
it got to the end of the directory. */
- if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
+ if (!result && GetLastError() != 0 && GetLastError() != ERROR_NO_MORE_FILES) {
Py_DECREF(list);
list = win32_error_unicode("FindNextFileW", wnamebuf);
goto exit;
@@ -3640,7 +3640,7 @@
Py_END_ALLOW_THREADS
/* FindNextFile sets error to ERROR_NO_MORE_FILES if
it got to the end of the directory. */
- if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
+ if (!result && GetLastError() != 0 && GetLastError() != ERROR_NO_MORE_FILES) {
Py_DECREF(list);
list = win32_error("FindNextFile", namebuf);
goto exit;
diff -urN a/Python/fileutils.c b/Python/fileutils.c
--- a/Python/fileutils.c 2013-12-26 18:47:28.326904100 +0000
+++ b/Python/fileutils.c 2013-12-26 18:47:31.352077100 +0000
@@ -491,7 +491,7 @@
Not sure whether the MS_WINDOWS guards are necessary:
perhaps for cygwin/mingw builds?
*/
-#if defined(HAVE_STAT) && !defined(MS_WINDOWS)
+#if defined(HAVE_STAT) && (!defined(MS_WINDOWS) || defined(__MINGW32__))
/* Get file status. Encode the path to the locale encoding. */