blob: 529c88392159e1ab21aac5ad8c3acc8241dfce52 [file] [log] [blame]
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']]) )