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']]) )