| diff -urN a/configure.in b/configure.in |
| --- a/configure.in 2012-06-30 13:55:03.293615455 +0100 |
| +++ b/configure.in 2012-06-30 13:55:21.634756095 +0100 |
| @@ -522,6 +522,27 @@ |
| fi |
| AC_MSG_RESULT($MACHDEP) |
| |
| +# Windows uses ; to separate paths, everything else uses : |
| +AC_MSG_CHECKING(DELIM) |
| +DELIM=: |
| +if test "$MACHDEP" = "win" |
| +then |
| + DELIM=\; |
| +fi |
| +AC_MSG_RESULT([$DELIM]) |
| +AC_SUBST(DELIM) |
| + |
| +# MSYS make uses a 'virtual' VPATH, but getpath.c uses |
| +# GetModuleFileNameW (replacing \ with /). This allows the user to |
| +# define the 'actual 'real' value. Note, it should contain / not \, |
| +# which is what is returned by "pwd -W". |
| +AC_ARG_VAR(MSYSVPATH, |
| + For MSYS, allows specifying the real VPATH. Use / not \) |
| +if test -z "$MSYSVPATH"; then |
| + MSYSVPATH=$srcdir |
| +fi |
| +AC_SUBST(MSYSVPATH) |
| + |
| AC_MSG_CHECKING([for init system calls]) |
| AC_SUBST(INITSYS) |
| case $host in |
| @@ -2965,7 +2986,7 @@ |
| AC_MSG_CHECKING(MACHDEP_OBJS) |
| case $host in |
| *-*-mingw*) |
| - extra_machdep_objs="PC/dl_nt.o PC/getpathp.o PC/import_nt.o" |
| + extra_machdep_objs="PC/dl_nt.o Modules/getpath.o PC/import_nt.o" |
| ;; |
| esac |
| if test -z "$MACHDEP_OBJS" |
| @@ -4170,6 +4191,28 @@ |
| # check for endianness |
| AC_C_BIGENDIAN |
| |
| +# REPARSE_DATA_BUFFER is in winnt.h on mingw32 and (unusably) ddk/ntifs.h on mingw64. |
| +case $host in |
| + *-*-mingw*) |
| +AC_CACHE_CHECK([if struct REPARSE_DATA_BUFFER is in winnt.h], |
| +[ac_cv_struct_reparse_data_buffer_in_winnt_h], |
| + [AC_COMPILE_IFELSE( |
| + [AC_LANG_PROGRAM( |
| + [#include <windows.h> |
| + #include <winnt.h>], |
| + [REPARSE_DATA_BUFFER rdb], |
| + )], |
| + [ac_cv_struct_reparse_data_buffer_in_winnt_h=yes], |
| + [ac_cv_struct_reparse_data_buffer_in_winnt_h=no] |
| + ) |
| +]) |
| +if test "x${ac_cv_struct_reparse_data_buffer_in_winnt_h}" = xyes; then |
| + AC_DEFINE([REPARSE_DATA_BUFFER_IN_WINNT], [], [REPARSE_DATA_BUFFER in winnt.h]) |
| + AC_SUBST(REPARSE_DATA_BUFFER_IN_WINNT) |
| +fi |
| + ;; |
| +esac |
| + |
| # Check whether right shifting a negative integer extends the sign bit |
| # or fills with zeros (like the Cray J90, according to Tim Peters). |
| AC_MSG_CHECKING(whether right shift extends the sign bit) |
| @@ -4706,7 +4749,8 @@ |
| # FIXME: why windows builds don't use PC/frozen_dllmain.o ? |
| PYTHON_OBJS_FROZENMAIN="" |
| # default sys.path calculations for windows platforms |
| - MODULE_GETPATH=PC/getpathp.o |
| + # MODULE_GETPATH=PC/getpathp.o |
| + MODULE_GETPATH=Modules/getpath.o |
| ;; |
| esac |
| |
| diff -urN a/Include/osdefs.h b/Include/osdefs.h |
| --- a/Include/osdefs.h 2012-04-10 00:07:29.000000000 +0100 |
| +++ b/Include/osdefs.h 2012-06-30 13:55:21.636756112 +0100 |
| @@ -10,7 +10,7 @@ |
| /* Mod by chrish: QNX has WATCOM, but isn't DOS */ |
| #if !defined(__QNX__) |
| #if defined(MS_WINDOWS) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__DJGPP__) || defined(PYOS_OS2) |
| -#if defined(PYOS_OS2) && defined(PYCC_GCC) |
| +#if (defined(PYOS_OS2) && defined(PYCC_GCC)) || defined(__MINGW32__) |
| #define MAXPATHLEN 260 |
| #define SEP '/' |
| #define ALTSEP '\\' |
| diff -urN a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py |
| --- a/Lib/distutils/cygwinccompiler.py 2012-06-30 13:55:03.298615492 +0100 |
| +++ b/Lib/distutils/cygwinccompiler.py 2012-06-30 13:55:21.636756112 +0100 |
| @@ -55,6 +55,7 @@ |
| from distutils.file_util import write_file |
| from distutils.errors import DistutilsExecError, CompileError, UnknownFileError |
| from distutils import log |
| +from subprocess import Popen, PIPE |
| |
| def get_msvcr(): |
| """Include the appropriate MSVC runtime library if Python was built |
| @@ -442,7 +443,13 @@ |
| from distutils.spawn import find_executable |
| import re |
| |
| - gcc_exe = find_executable('gcc') |
| + gcc_exe = os.environ.get('CC') or find_executable('gcc') |
| + ld_exe = find_executable('ld') |
| + out = Popen(gcc_exe+' --print-prog-name ld', shell=True, stdout=PIPE).stdout |
| + try: |
| + ld_exe = str(out.read()).strip() |
| + finally: |
| + out.close() |
| if gcc_exe: |
| out = os.popen(gcc_exe + ' -dumpversion','r') |
| out_string = out.read() |
| @@ -454,7 +461,6 @@ |
| gcc_version = None |
| else: |
| gcc_version = None |
| - ld_exe = find_executable('ld') |
| if ld_exe: |
| out = os.popen(ld_exe + ' -v','r') |
| out_string = out.read() |
| @@ -466,7 +472,7 @@ |
| ld_version = None |
| else: |
| ld_version = None |
| - dllwrap_exe = find_executable('dllwrap') |
| + dllwrap_exe = os.environ.get('DLLWRAP') or find_executable('dllwrap') |
| if dllwrap_exe: |
| out = os.popen(dllwrap_exe + ' --version','r') |
| out_string = out.read() |
| diff -urN a/Lib/plat-generic/regen b/Lib/plat-generic/regen |
| --- a/Lib/plat-generic/regen 2012-04-10 00:07:30.000000000 +0100 |
| +++ b/Lib/plat-generic/regen 2012-06-30 13:55:21.636756112 +0100 |
| @@ -1,3 +1,9 @@ |
| #! /bin/sh |
| set -v |
| -python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/netinet/in.h |
| +if [ -n $1 ]; then |
| + CCINSTALL=$($1 -print-search-dirs | head -1 | cut -d' ' -f2) |
| + REGENHEADER=$CCINSTALL/include/stddef.h |
| +else |
| + REGENHEADER=/usr/include/netinet/in.h |
| +fi |
| +python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' $REGENHEADER |
| diff -urN a/Makefile.pre.in b/Makefile.pre.in |
| --- a/Makefile.pre.in 2012-06-30 13:55:03.303615532 +0100 |
| +++ b/Makefile.pre.in 2012-06-30 14:02:09.315869117 +0100 |
| @@ -27,6 +27,7 @@ |
| VERSION= @VERSION@ |
| srcdir= @srcdir@ |
| VPATH= @srcdir@ |
| +MSYSVPATH= @MSYSVPATH@ |
| |
| CC= @CC@ |
| CXX= @CXX@ |
| @@ -78,7 +79,8 @@ |
| # C flags used for building the interpreter object files |
| PY_CFLAGS= $(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE |
| |
| - |
| +# ; on Windows otherwise : |
| +DELIM= @DELIM@ |
| # Machine-dependent subdirectories |
| MACHDEP= @MACHDEP@ |
| |
| @@ -541,7 +543,7 @@ |
| -DPREFIX='"$(prefix)"' \ |
| -DEXEC_PREFIX='"$(exec_prefix)"' \ |
| -DVERSION='"$(VERSION)"' \ |
| - -DVPATH='"$(VPATH)"' \ |
| + -DVPATH='"$(MSYSVPATH)"' \ |
| -o $@ $(srcdir)/Modules/getpath.c |
| |
| # default sys.path calculations for windows platforms |
| @@ -838,6 +840,7 @@ |
| if test -f $(LDLIBRARY); then \ |
| if test -n "$(DLLLIBRARY)" ; then \ |
| $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \ |
| + mkdir -p $(DESTDIR)$(LIBPL); $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBPL); \ |
| else \ |
| $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ |
| if test $(LDLIBRARY) != $(INSTSONAME); then \ |
| @@ -982,7 +985,7 @@ |
| export PYTHONPATH; PYTHONPATH="`pwd`/Lib"; \ |
| export DYLD_FRAMEWORK_PATH; DYLD_FRAMEWORK_PATH="`pwd`"; \ |
| export EXE; EXE="$(BUILDEXE)"; \ |
| - cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen |
| + cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen $(CC) |
| |
| python-config: $(srcdir)/Misc/python-config.in |
| # Substitution happens here, as the completely-expanded BINDIR |
| diff -urN a/Modules/getpath.c b/Modules/getpath.c |
| --- a/Modules/getpath.c 2012-04-10 00:07:34.000000000 +0100 |
| +++ b/Modules/getpath.c 2012-06-30 13:55:21.637756119 +0100 |
| @@ -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 |
| @@ -128,6 +132,10 @@ |
| static char prefix[MAXPATHLEN+1]; |
| static char exec_prefix[MAXPATHLEN+1]; |
| static char progpath[MAXPATHLEN+1]; |
| +#ifdef MS_WINDOWS |
| +static char dllpath[MAXPATHLEN+1]; |
| +extern HANDLE PyWin_DLLhModule; |
| +#endif |
| static char *module_search_path = NULL; |
| static char lib_python[] = "lib/python" VERSION; |
| |
| @@ -137,7 +145,7 @@ |
| size_t i = strlen(dir); |
| while (i > 0 && dir[i] != SEP) |
| --i; |
| - dir[i] = '\0'; |
| + dir[i] = 0; |
| } |
| |
| |
| @@ -208,7 +216,11 @@ |
| joinpath(char *buffer, char *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 = strlen(buffer); |
| @@ -229,7 +241,11 @@ |
| static void |
| copy_absolute(char *path, char *p) |
| { |
| +#ifdef MS_WINDOWS |
| + if (p[0] == SEP || (p[0] != 0 && p[1] == ':')) |
| +#else |
| if (p[0] == SEP) |
| +#endif |
| strcpy(path, p); |
| else { |
| if (!getcwd(path, MAXPATHLEN)) { |
| @@ -249,7 +265,11 @@ |
| { |
| char 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); |
| strcpy(path, buffer); |
| @@ -367,6 +387,35 @@ |
| } |
| |
| |
| +#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) |
| { |
| @@ -418,6 +467,10 @@ |
| else if(0 == _NSGetExecutablePath(progpath, &nsexeclength) && progpath[0] == SEP) |
| ; |
| #endif /* __APPLE__ */ |
| +#ifdef MS_WINDOWS |
| + else if(GetWindowsModulePaths()) { |
| + } |
| +#endif /* MS_WINDOWS */ |
| else if (path) { |
| while (1) { |
| char *delim = strchr(path, DELIM); |
| @@ -445,7 +498,11 @@ |
| } |
| else |
| progpath[0] = '\0'; |
| +#ifdef MS_WINDOWS |
| + if (progpath[0] != '\0' && progpath[0] != SEP && progpath[1] != ':') |
| +#else |
| if (progpath[0] != SEP && progpath[0] != '\0') |
| +#endif |
| absolutize(progpath); |
| strncpy(argv0_path, progpath, MAXPATHLEN); |
| argv0_path[MAXPATHLEN] = '\0'; |
| @@ -691,8 +748,6 @@ |
| return progpath; |
| } |
| |
| - |
| #ifdef __cplusplus |
| } |
| #endif |
| - |
| diff -urN a/Modules/posixmodule.c b/Modules/posixmodule.c |
| --- a/Modules/posixmodule.c 2012-06-30 13:55:03.309615577 +0100 |
| +++ b/Modules/posixmodule.c 2012-06-30 13:55:21.638756126 +0100 |
| @@ -2180,7 +2180,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(d); |
| win32_error_unicode("FindNextFileW", wnamebuf); |
| FindClose(hFindFile); |
| @@ -2248,7 +2248,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(d); |
| win32_error("FindNextFile", namebuf); |
| FindClose(hFindFile); |
| diff -urN a/Modules/Setup.config.in b/Modules/Setup.config.in |
| --- a/Modules/Setup.config.in 2012-06-30 13:55:03.310615585 +0100 |
| +++ b/Modules/Setup.config.in 2012-06-30 13:55:21.639756133 +0100 |
| @@ -18,6 +18,9 @@ |
| @BUILDIN_WIN32_MODULE@operator operator.c # operator.add() and similar goodies |
| @BUILDIN_WIN32_MODULE@_locale _localemodule.c # -lintl |
| @BUILDIN_WIN32_MODULE@_winreg ../PC/_winreg.c |
| +@BUILDIN_WIN32_MODULE@time timemodule.c |
| +@BUILDIN_WIN32_MODULE@_subprocess ../PC/_subprocess.c |
| +@BUILDIN_WIN32_MODULE@msvcrt ../PC/msvcrtmodule.c |
| |
| |
| # The rest of the modules previously listed in this file are built |
| diff -urN a/Modules/Setup.dist b/Modules/Setup.dist |
| --- a/Modules/Setup.dist 2012-06-30 13:55:03.311615593 +0100 |
| +++ b/Modules/Setup.dist 2012-06-30 13:55:21.639756133 +0100 |
| @@ -84,14 +84,14 @@ |
| # Empty since this is now just the runtime prefix. |
| DESTPATH= |
| |
| -# Site specific path components -- should begin with : if non-empty |
| +# Site specific path components -- should begin with $(DELIM) if non-empty |
| SITEPATH= |
| |
| # Standard path components for test modules |
| TESTPATH= |
| |
| # Path components for machine- or system-dependent modules and shared libraries |
| -MACHDEPPATH=:plat-$(MACHDEP) |
| +MACHDEPPATH=$(DELIM)plat-$(MACHDEP) |
| EXTRAMACHDEPPATH= |
| |
| # Path component for the Tkinter-related modules |
| diff -urN a/Modules/socketmodule.h b/Modules/socketmodule.h |
| --- a/Modules/socketmodule.h 2012-06-30 13:55:03.312615601 +0100 |
| +++ b/Modules/socketmodule.h 2012-06-30 13:55:21.639756133 +0100 |
| @@ -28,7 +28,7 @@ |
| * I use SIO_GET_MULTICAST_FILTER to detect a decent SDK. |
| */ |
| # ifdef SIO_GET_MULTICAST_FILTER |
| -# include <MSTcpIP.h> /* for SIO_RCVALL */ |
| +# include <mstcpip.h> /* for SIO_RCVALL */ |
| # define HAVE_ADDRINFO |
| # define HAVE_SOCKADDR_STORAGE |
| # define HAVE_GETADDRINFO |
| diff -urN a/Parser/metagrammar.c b/Parser/metagrammar.c |
| --- a/Parser/metagrammar.c 2012-04-10 00:07:35.000000000 +0100 |
| +++ b/Parser/metagrammar.c 2012-06-30 13:55:21.639756133 +0100 |
| @@ -139,7 +139,7 @@ |
| {7, 0}, |
| {8, 0}, |
| }; |
| -static grammar _PyParser_Grammar = { |
| +static grammar _PyParser_MetaGrammar = { |
| 6, |
| dfas, |
| {19, labels}, |
| @@ -149,7 +149,7 @@ |
| grammar * |
| meta_grammar(void) |
| { |
| - return &_PyParser_Grammar; |
| + return &_PyParser_MetaGrammar; |
| } |
| |
| grammar * |
| diff -urN a/Python/pythonrun.c b/Python/pythonrun.c |
| --- a/Python/pythonrun.c 2012-04-10 00:07:35.000000000 +0100 |
| +++ b/Python/pythonrun.c 2012-06-30 13:55:21.640756141 +0100 |
| @@ -18,6 +18,9 @@ |
| #include "eval.h" |
| #include "marshal.h" |
| #include "abstract.h" |
| +#ifdef __MINGW32__ |
| +#include "osdefs.h" |
| +#endif |
| |
| #ifdef HAVE_SIGNAL_H |
| #include <signal.h> |
| @@ -666,6 +669,13 @@ |
| void |
| Py_SetProgramName(char *pn) |
| { |
| +#ifdef __MINGW32__ |
| + char* seps = strchr(pn, ALTSEP); |
| + while(seps) { |
| + *seps = SEP; |
| + seps = strchr(seps, ALTSEP); |
| + } |
| +#endif |
| if (pn && *pn) |
| progname = pn; |
| } |
| diff -urN a/setup.py b/setup.py |
| --- a/setup.py 2012-06-30 13:55:03.315615622 +0100 |
| +++ b/setup.py 2012-06-30 13:55:21.641756149 +0100 |
| @@ -923,7 +923,8 @@ |
| for p in ['msvcrtmodule.c']]) ) |
| |
| exts.append( Extension('_msi', [os.path.join(pc_srcdir, p) |
| - for p in ['_msi.c']]) ) |
| + for p in ['_msi.c']], |
| + libraries=['msi','cabinet','rpcrt4']) ) # To link with lib(msi|cabinet|rpcrt4).a |
| |
| exts.append( Extension('_subprocess', [os.path.join(pc_srcdir, p) |
| for p in ['_subprocess.c']]) ) |