| 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 */ |