blob: 6c3b74ef49c1dbe855a21f7580958f7874866583 [file] [log] [blame] [edit]
diff -Naur Python-2.7.9-orig/configure.ac Python-2.7.9/configure.ac
--- Python-2.7.9-orig/configure.ac 2014-12-11 13:49:48.175400000 +0300
+++ Python-2.7.9/configure.ac 2014-12-11 13:49:48.331400000 +0300
@@ -4895,8 +4895,21 @@
THREADHEADERS="$THREADHEADERS \$(srcdir)/$h"
done
+dnl getpath module - default sys.path calculations
+AC_SUBST(MODULE_GETPATH)
+MODULE_GETPATH=Modules/getpath.o
+case $host in
+ *-*-mingw*)
+ dnl default sys.path calculations for windows platforms
+ MODULE_GETPATH=PC/getpathp.o
+ ;;
+esac
+
AC_SUBST(SRCDIRS)
SRCDIRS="Parser Objects Python Modules Modules/_io"
+case $host in
+ *-*-mingw*) SRCDIRS="$SRCDIRS PC";;
+esac
AC_MSG_CHECKING(for build directories)
for dir in $SRCDIRS; do
if test ! -d $dir; then
diff -Naur Python-2.7.9-orig/Makefile.pre.in Python-2.7.9/Makefile.pre.in
--- Python-2.7.9-orig/Makefile.pre.in 2014-12-10 18:59:50.000000000 +0300
+++ Python-2.7.9/Makefile.pre.in 2014-12-11 13:49:48.331400000 +0300
@@ -214,7 +214,7 @@
# Modules
MODULE_OBJS= \
Modules/config.o \
- Modules/getpath.o \
+ @MODULE_GETPATH@ \
Modules/main.o \
Modules/gcmodule.o
@@ -591,6 +591,7 @@
-DHGBRANCH="\"`LC_ALL=C $(HGBRANCH)`\"" \
-o $@ $(srcdir)/Modules/getbuildinfo.c
+# default sys.path calculations for posix platforms
Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile
$(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \
-DPREFIX='"$(prefix)"' \
@@ -599,6 +600,13 @@
-DVPATH='"$(VPATH)"' \
-o $@ $(srcdir)/Modules/getpath.c
+# default sys.path calculations for windows platforms
+PC/getpathp.o: $(srcdir)/PC/getpathp.c Makefile
+ $(CC) -c $(PY_CORE_CFLAGS) \
+ -DVERSION='"$(VERSION)"' \
+ -DSRCDIR='"$(srcdir)"' \
+ -o $@ $(srcdir)/PC/getpathp.c
+
Modules/python.o: $(srcdir)/Modules/python.c
$(MAINCC) -c $(PY_CFLAGS) -o $@ $(srcdir)/Modules/python.c
diff -Naur Python-2.7.9-orig/PC/getpathp.c Python-2.7.9/PC/getpathp.c
--- Python-2.7.9-orig/PC/getpathp.c 2014-12-10 18:59:58.000000000 +0300
+++ Python-2.7.9/PC/getpathp.c 2014-12-11 13:49:48.331400000 +0300
@@ -81,10 +81,26 @@
* information sources.
*/
+#ifndef PYTHONPATH
+# define PYTHONPATH ".\\DLLs;.\\lib"
+#endif
+
#ifndef LANDMARK
#define LANDMARK "lib\\os.py"
#endif
+#ifdef __MINGW32__
+
+static char *lib_python = "lib\\python" VERSION;
+
+# undef LANDMARK
+# define LANDMARK "os.py"
+
+# define USE_POSIX_PREFIX
+
+#endif
+
+
static char prefix[MAXPATHLEN+1];
static char progpath[MAXPATHLEN+1];
static char dllpath[MAXPATHLEN+1];
@@ -168,6 +184,69 @@
buffer[n+k] = '\0';
}
+#ifdef USE_POSIX_PREFIX
+
+/* based on getpath.c but with paths relative to executable */
+/* search_for_prefix requires that path be no more than MAXPATHLEN
+ bytes long.
+ return: 1 if found; -1 if found build directory
+*/
+static int
+search_for_posix_prefix(char *argv0_path, char *home, char *_prefix)
+{
+ size_t n;
+
+ /* If PYTHONHOME is set, we believe it unconditionally */
+ if (home) {
+ char *delim;
+ strncpy(prefix, home, MAXPATHLEN);
+ delim = strchr(prefix, DELIM);
+ if (delim)
+ *delim = '\0';
+ join(prefix, lib_python);
+ join(prefix, LANDMARK);
+ return 1;
+ }
+
+ /* Check to see if argv[0] is in the build directory */
+ strcpy(prefix, argv0_path);
+ join(prefix, "Modules\\Setup");
+ if (exists(prefix)) {
+ char *vpath;
+ /* Check source directory if argv0_path is in the build directory. */
+ vpath = _Py_char2wchar(SRCDIR, NULL);
+ if (vpath != NULL) {
+ strcpy(prefix, argv0_path);
+ join(prefix, vpath);
+ PyMem_Free(vpath);
+ join(prefix, "Lib");
+ join(prefix, LANDMARK);
+ if (ismodule(prefix))
+ return -1;
+ }
+ }
+
+ /* Search from argv0_path, until root is found */
+ strcpy(prefix, argv0_path);
+ do {
+ n = strlen(prefix);
+ join(prefix, lib_python);
+ join(prefix, LANDMARK);
+ if (ismodule(prefix))
+ return 1;
+ prefix[n] = '\0';
+ reduce(prefix);
+ } while (prefix[0]);
+
+ /* Configure prefix is unused */
+ (void)_prefix;
+
+ /* Fail */
+ return 0;
+}
+
+#endif /*def USE_POSIX_PREFIX */
+
/* gotlandmark only called by search_for_prefix, which ensures
'prefix' is null terminated in bounds. join() ensures
'landmark' can not overflow prefix if too long.
@@ -467,6 +546,9 @@
size_t bufsz;
char *pythonhome = Py_GetPythonHome();
char *envpath = Py_GETENV("PYTHONPATH");
+#ifdef USE_POSIX_PREFIX
+ int pfound;
+#endif
#ifdef MS_WINDOWS
int skiphome, skipdefault;
@@ -480,6 +562,17 @@
/* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */
strcpy(argv0_path, progpath);
reduce(argv0_path);
+
+#ifdef USE_POSIX_PREFIX
+ pfound = search_for_posix_prefix(argv0_path, pythonhome, NULL);
+ if (!pfound) {
+ strncpy(prefix, argv0_path, MAXPATHLEN);
+ reduce(prefix);
+ join(prefix, lib_python);
+ }
+ else
+ reduce(prefix);
+#else
if (pythonhome == NULL || *pythonhome == '\0') {
if (search_for_prefix(argv0_path, LANDMARK))
pythonhome = prefix;
@@ -488,11 +581,11 @@
}
else
strncpy(prefix, pythonhome, MAXPATHLEN);
+#endif
if (envpath && *envpath == '\0')
envpath = NULL;
-
#ifdef MS_WINDOWS
/* Calculate zip archive path */
if (dllpath[0]) /* use name of python DLL */
@@ -546,6 +639,9 @@
}
else
bufsz = 0;
+#ifdef USE_POSIX_PREFIX
+ bufsz += strlen(prefix) + 1;
+#endif
bufsz += strlen(PYTHONPATH) + 1;
bufsz += strlen(argv0_path) + 1;
#ifdef MS_WINDOWS
@@ -590,6 +686,11 @@
buf = strchr(buf, '\0');
*buf++ = DELIM;
}
+#ifdef USE_POSIX_PREFIX
+ strcpy(buf, prefix);
+ buf = strchr(buf, '\0');
+ *buf++ = DELIM;
+#endif
if (userpath) {
strcpy(buf, userpath);
buf = strchr(buf, '\0');
@@ -652,6 +753,12 @@
on the path, and that our 'prefix' directory is
the parent of that.
*/
+#ifdef USE_POSIX_PREFIX
+ if (pfound > 0) {
+ reduce(prefix);
+ reduce(prefix);
+ }
+#endif
if (*prefix=='\0') {
char lookBuf[MAXPATHLEN+1];
char *look = buf - 1; /* 'buf' is at the end of the buffer */