File Python-2.7.18-cross.patch of Package mingw64-python

diff -ubBr Python-2.7.18.orig/configure.ac Python-2.7.18/configure.ac
--- Python-2.7.18.orig/configure.ac	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/configure.ac	2021-08-21 15:42:17.997177096 +0200
@@ -340,6 +340,9 @@
 	*-*-cygwin*)
 		ac_sys_system=Cygwin
 		;;
+	*-*-mingw32*)
+		ac_sys_system=mingw
+		;;
 	*)
 		# for now, limit cross builds to known configurations
 		MACHDEP="unknown"
@@ -364,6 +367,7 @@
     case $MACHDEP in
 	linux*) MACHDEP="linux2";;
 	cygwin*) MACHDEP="cygwin";;
+	mingw*) MACHDEP="mingw";;
 	darwin*) MACHDEP="darwin";;
 	atheos*) MACHDEP="atheos";;
         irix646) MACHDEP="irix6";;
@@ -386,6 +390,9 @@
 	*-*-cygwin*)
 		_host_cpu=
 		;;
+	*-*-mingw32*)
+		_host_cpu=
+		;;
 	*)
 		# for now, limit cross builds to known configurations
 		MACHDEP="unknown"
@@ -514,7 +521,7 @@
 AC_SUBST(PLATDIR)
 PLATDIR=plat-$MACHDEP
 
-# And add extra plat-mac for darwin
+# And add extra plat-mac for Darwin
 AC_SUBST(EXTRAPLATDIR)
 AC_SUBST(EXTRAMACHDEPPATH)
 AC_MSG_CHECKING(EXTRAPLATDIR)
@@ -533,6 +540,23 @@
 fi
 AC_MSG_RESULT($EXTRAPLATDIR)
 
+AC_MSG_CHECKING(posix flavour)
+if test -z "$POSIX"
+then
+	case $ac_sys_system/$ac_sys_release in
+	mingw*)
+		DELIM=';'
+		POSIX=nt
+		;;
+	*)
+		DELIM=':'
+		POSIX=posix
+ 		;;
+	esac
+ fi	
+AC_SUBST(DELIM)
+AC_MSG_RESULT($POSIX)
+
 # Record the configure-time value of MACOSX_DEPLOYMENT_TARGET,
 # it may influence the way we can build extensions, so distutils
 # needs to check it
@@ -749,9 +773,11 @@
 then
     AC_MSG_RESULT(yes)
     BUILDEXEEXT=.exe
+    case_sensitive=no
 else
 	AC_MSG_RESULT(no)
 	BUILDEXEEXT=$EXEEXT
+    case_sensitive=yes
 fi
 rmdir CaseSensitiveTestDir
 
@@ -861,7 +887,7 @@
 if test -z "$enable_shared"
 then 
   case $ac_sys_system in
-  CYGWIN* | atheos*)
+  CYGWIN* | atheos* | mingw*)
     enable_shared="yes";;
   *)
     enable_shared="no";;
@@ -917,6 +943,10 @@
           LDLIBRARY='libpython$(VERSION).dll.a'
           DLLLIBRARY='libpython$(VERSION).dll'
           ;;
+    mingw*)
+          LDLIBRARY='libpython$(VERSION).dll.a'
+          DLLLIBRARY='libpython$(VERSION).dll'
+          ;;
     SunOS*)
 	  LDLIBRARY='libpython$(VERSION).so'
 	  BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(VERSION)'
@@ -973,6 +1003,10 @@
           BLDLIBRARY='$(LIBRARY)'
           LDLIBRARY='libpython$(VERSION).dll.a'
           ;;
+    mingw*)
+          BLDLIBRARY='$(LIBRARY)'
+          LDLIBRARY='libpython$(VERSION).dll.a'
+          ;;
   esac
 fi
 
@@ -1281,6 +1315,9 @@
 	OSF*)
 	    BASECFLAGS="$BASECFLAGS -mieee"
 	    ;;
+	mingw*)
+	    OPT="-DMS_WINDOWS -DPy_WIN_WIDE_FILENAMES $OPT"
+	    ;;
     esac
     ;;
 
@@ -1337,7 +1374,7 @@
 if test $ac_cv_opt_olimit_ok = yes; then
     case $ac_sys_system in
 	# XXX is this branch needed? On MacOSX 10.2.2 the result of the
-	# olimit_ok test is "no".  Is it "yes" in some other Darwin-esque
+	# olimit_ok test is "no".  Is it "yes" in some other darwin-esque
 	# environment?
         Darwin*)
 	    ;;
@@ -2130,6 +2167,7 @@
 		esac
 		;;
 	CYGWIN*)   SO=.dll;;
+	mingw*)    SO=.dll;;
 	*)	   SO=.so;;
 	esac
 else
@@ -2290,6 +2328,9 @@
 	atheos*)
 		LDSHARED="gcc -shared"
 		LDCXXSHARED="g++ -shared";;
+	mingw*)
+		LDSHARED='$(CC) -mdll'
+		BLDSHARED='$(CC) -mdll libpython$(VERSION).dll';;
 	*)	LDSHARED="ld";;
 	esac
 fi
@@ -2381,6 +2422,11 @@
 		then
 			LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)'
 		fi;;
+	mingw*)
+ 		if test $enable_shared = "no"
+ 		then
+ 			LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)'
+ 		fi;;
 	QNX*)
 		# -Wl,-E causes the symbols to be added to the dynamic
 		# symbol table so that they can be found when a module
@@ -2465,6 +2511,16 @@
 # BeOS' sockets are stashed in libnet.
 AC_CHECK_LIB(nsl, t_open, [LIBS="-lnsl $LIBS"]) # SVR4
 AC_CHECK_LIB(socket, socket, [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets
+AC_CHECK_HEADER(winsock2.h)
+AC_CHECK_LIB(wsock32, select, [LIBS="-lws2_32 -lwsock32 $LIBS"], [], $LIBS) # Mingw32 select
+save_LIBS="$LIBS"
+LIBS="-lws2_32 -lwsock32 $LIBS"
+AC_MSG_CHECKING([for include <winsock2.h> select in libwinsock32])
+AC_TRY_LINK([#include <winsock2.h>],
+            [select (1,2,3,4,5);],
+ 	    [AC_MSG_RESULT(yes)],
+	    [AC_MSG_RESULT(no)]
+	    [LIBS="$save_LIBS"])
 
 case "$ac_sys_system" in
 BeOS*)
@@ -3093,6 +3149,7 @@
 	# Use dynload_next.c only on 10.2 and below, which don't have native dlopen()
 	Darwin/@<:@0156@:>@\..*) DYNLOADFILE="dynload_next.o";;
 	atheos*) DYNLOADFILE="dynload_atheos.o";;
+	mingw*) DYNLOADFILE="dynload_win.o";;
 	*)
 	# use dynload_shlib.c and dlopen() if we have it; otherwise stub
 	# out any dynamic loading
@@ -3421,6 +3478,8 @@
     ])
 )
 
+AC_CHECK_FUNCS(cwait fsync pipe popen spawnv system)
+
 AC_MSG_CHECKING(for major, minor, and makedev)
 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
 #if defined(MAJOR_IN_MKDEV)
@@ -4847,6 +4906,9 @@
 #ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
 #endif
+#ifdef _WIN32
+#include <ws2tcpip.h>
+#endif
 ])
 
 case $ac_sys_system in
@@ -4938,6 +5000,67 @@
 AC_MSG_RESULT($ENSUREPIP)
 AC_SUBST(ENSUREPIP)
 
+# Cross compiling
+AC_SUBST(cross_compiling)
+
+if test "$cross_compiling" = "yes"; then
+    AC_MSG_CHECKING(cc for build)
+    ## /usr/bin/cc still uses wrong assembler
+    ## CC_FOR_BUILD="${CC_FOR_BUILD-/usr/bin/cc}"
+    CC_FOR_BUILD="${CC_FOR_BUILD-PATH=/usr/bin:$PATH cc}"
+else
+    CC_FOR_BUILD="${CC_FOR_BUILD-$CC}"
+fi   
+     
+if test "$cross_compiling" = "yes"; then
+   AC_MSG_RESULT($CC_FOR_BUILD)
+fi
+
+AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler (default: cc)])
+	
+if test "$cross_compiling" = "yes"; then
+    AC_MSG_CHECKING(python for build)
+    PYTHON_FOR_BUILD="${PYTHON_FOR_BUILD-python}"
+else
+    PYTHON_FOR_BUILD='$(BUILDPYTHON)'
+fi   
+
+if test "$cross_compiling" = "yes"; then
+    AC_MSG_RESULT($PYTHON_FOR_BUILD)
+fi
+AC_ARG_VAR(PYTHON_FOR_BUILD,[build system python (default: python)])
+AC_SUBST(PYTHON_FOR_BUILD)
+  			
+if test "$cross_compiling" = "yes"; then
+    CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD-}
+    changequote(<<, >>)#dnl
+    python_include=`$PYTHON_FOR_BUILD -c 'import sys; sys.stdout.write ("%s/include/python%s" % (sys.prefix, sys.version[:3]))'`
+    changequote([, ])#dnl
+    CPPFLAGS_FOR_BUILD=${CPPFLAGS_FOR_BUILD-"-I$python_include"}
+    CROSS_COMMENT=#
+    if test "$case_sensitive" = "yes"
+    then
+        EXEEXT_FOR_BUILD=
+    else
+        EXEEXT_FOR_BUILD=.exe
+    fi
+    LDFLAGS_FOR_BUILD=${LDFLAGS_FOR_BUILD-}
+    LIBS_FOR_BUILD=${LIBS_FOR_BUILD-}
+    O_FOR_BUILD=x
+    RUNSHARED="CROSS_TARGET=$ac_sys_system SRCDIR=$srcdir SO=${SO}"
+else
+    CROSS_COMMENT=
+    EXEEXT_FOR_BUILD=$BUILDEXEEXT
+    O_FOR_BUILD=o
+fi
+AC_SUBST(CFLAGS_FOR_BUILD)
+AC_SUBST(CPPFLAGS_FOR_BUILD)
+AC_SUBST(CROSS_COMMENT)
+AC_SUBST(EXEEXT_FOR_BUILD)
+AC_SUBST(LDFLAGS_FOR_BUILD)
+AC_SUBST(LIBS_FOR_BUILD)
+AC_SUBST(O_FOR_BUILD)
+
 # generate output files
 AC_CONFIG_FILES(Makefile.pre Modules/Setup.config Misc/python.pc)
 AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix])
@@ -4948,6 +5071,9 @@
 then
 	cp $srcdir/Modules/Setup.dist Modules/Setup
 fi
+mv Modules/Setup Modules/Setup~
+sed -e "s/@POSIX@/$POSIX/g" < Modules/Setup~ > Modules/Setup
+
 
 echo "creating Modules/Setup.local"
 if test ! -f Modules/Setup.local
diff -ubBr Python-2.7.18.orig/Include/osdefs.h Python-2.7.18/Include/osdefs.h
--- Python-2.7.18.orig/Include/osdefs.h	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Include/osdefs.h	2021-08-21 15:42:17.997177096 +0200
@@ -9,7 +9,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(MS_WINDOWS) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__DJGPP__) || defined(PYOS_OS2) || defined(__MINGW32__) 
 #if defined(PYOS_OS2) && defined(PYCC_GCC)
 #define MAXPATHLEN 260
 #define SEP '/'
@@ -18,6 +18,7 @@
 #define SEP '\\'
 #define ALTSEP '/'
 #define MAXPATHLEN 256
+#define ROOTSEP ':'
 #endif
 #define DELIM ';'
 #endif
diff -ubBr Python-2.7.18.orig/Include/pyport.h Python-2.7.18/Include/pyport.h
--- Python-2.7.18.orig/Include/pyport.h	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Include/pyport.h	2021-08-21 15:42:17.997177096 +0200
@@ -203,10 +203,6 @@
 /* Smallest negative value of type Py_ssize_t. */
 #define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
 
-#if SIZEOF_PID_T > SIZEOF_LONG
-#   error "Python doesn't support sizeof(pid_t) > sizeof(long)"
-#endif
-
 /* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf
  * format to convert an argument with the width of a size_t or Py_ssize_t.
  * C99 introduced "z" for this purpose, but not all platforms support that;
@@ -237,6 +233,8 @@
 #       define PY_FORMAT_SIZE_T "l"
 #   elif defined(MS_WINDOWS)
 #       define PY_FORMAT_SIZE_T "I"
+#   elif defined(__MINGW32__)
+#       define PY_FORMAT_SIZE_T "z"
 #   else
 #       error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T"
 #   endif
@@ -760,19 +758,19 @@
   BeOS and cygwin are the only other autoconf platform requiring special
   linkage handling and both of these use __declspec().
 */
-#if defined(__CYGWIN__) || defined(__BEOS__)
+#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BEOS__)
 #       define HAVE_DECLSPEC_DLL
 #endif
 
 /* only get special linkage if built as shared or platform is Cygwin */
-#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__)
+#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) || defined(__MINGW32__)
 #       if defined(HAVE_DECLSPEC_DLL)
 #               ifdef Py_BUILD_CORE
 #                       define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE
 #                       define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE
         /* module init functions inside the core need no external linkage */
         /* except for Cygwin to handle embedding (FIXME: BeOS too?) */
-#                       if defined(__CYGWIN__)
+#                       if defined(__CYGWIN__) || defined(__MINGW32__)
 #                               define PyMODINIT_FUNC __declspec(dllexport) void
 #                       else /* __CYGWIN__ */
 #                               define PyMODINIT_FUNC void
@@ -783,7 +781,7 @@
         /* Under Cygwin, auto-import functions to prevent compilation */
         /* failures similar to those described at the bottom of 4.1: */
         /* http://docs.python.org/extending/windows.html#a-cookbook-approach */
-#                       if !defined(__CYGWIN__)
+#                       if !defined(__CYGWIN__) && !defined(__MINGW32__)
 #                               define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE
 #                       endif /* !__CYGWIN__ */
 #                       define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE
diff -ubBr Python-2.7.18.orig/Lib/distutils/command/build_ext.py Python-2.7.18/Lib/distutils/command/build_ext.py
--- Python-2.7.18.orig/Lib/distutils/command/build_ext.py	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Lib/distutils/command/build_ext.py	2021-08-21 15:42:17.997177096 +0200
@@ -675,6 +675,8 @@
             ext_path[len(ext_path) - 1] = ext_path[len(ext_path) - 1][:8]
         # extensions in debug_mode are named 'module_d.pyd' under windows
         so_ext = get_config_var('SO')
+        if os.environ.get('CROSS_COMPILING') == 'yes':
+            so_ext = os.environ.get('SO')
         if os.name == 'nt' and self.debug:
             return os.path.join(*ext_path) + '_d' + so_ext
         return os.path.join(*ext_path) + so_ext
@@ -726,7 +728,7 @@
             # don't extend ext.libraries, it may be shared with other
             # extensions, it is a reference to the original list
             return ext.libraries + [pythonlib]
-        elif sys.platform[:6] == "cygwin":
+        elif sys.platform[:6] == "cygwin" or sys.platform[:5] == "mingw":
             template = "python%d.%d"
             pythonlib = (template %
                    (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
diff -ubBr Python-2.7.18.orig/Lib/test/test_future5.py Python-2.7.18/Lib/test/test_future5.py
--- Python-2.7.18.orig/Lib/test/test_future5.py	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Lib/test/test_future5.py	2021-08-21 15:42:17.997177096 +0200
@@ -13,7 +13,7 @@
 
     def test_print_function(self):
         with test_support.captured_output("stderr") as s:
-            print("foo", file=sys.stderr)
+            print >> sys.stderr, "foo"
         self.assertEqual(s.getvalue(), "foo\n")
 
 
diff -ubBr Python-2.7.18.orig/Makefile.pre.in Python-2.7.18/Makefile.pre.in
--- Python-2.7.18.orig/Makefile.pre.in	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Makefile.pre.in	2021-08-21 15:42:17.997177096 +0200
@@ -18,6 +18,8 @@
 #
 # See also the section "Build instructions" in the README file.
 
+DELIM=@DELIM@
+
 # === Variables set by makesetup ===
 
 MODOBJS=        _MODOBJS_
@@ -88,6 +90,16 @@
 # C flags used for building the interpreter object files
 PY_CFLAGS=	$(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE
 
+# For cross compile: build compiler options
+CC_FOR_BUILD=	@CC_FOR_BUILD@
+CROSS_COMPILING=	@cross_compiling@
+EXEEXT_FOR_BUILD=	@EXEEXT_FOR_BUILD@
+O_FOR_BUILD=	@O_FOR_BUILD@
+
+CFLAGS_FOR_BUILD=	@CFLAGS_FOR_BUILD@
+CPPFLAGS_FOR_BUILD=	@CPPFLAGS_FOR_BUILD@ -I$(srcdir)/Include
+LDFLAGS_FOR_BUILD=	@LDFLAGS_FOR_BUILD@
+LIBS_FOR_BUILD=	@LIBS_FOR_BUILD@
 
 # Machine-dependent subdirectories
 MACHDEP=	@MACHDEP@
@@ -126,6 +138,10 @@
 LDCXXSHARED=	@LDCXXSHARED@
 DESTSHARED=	$(BINLIBDEST)/lib-dynload
 
+comma=,
+BLDFLAGS=$(subst -Wl$(comma),,$(LDFLAGS))
+
+
 # Executable suffix (.exe on Windows and Mac OS X)
 EXE=		@EXEEXT@
 BUILDEXE=	@BUILDEXEEXT@
@@ -197,7 +213,8 @@
 UNICODE_OBJS=   @UNICODE_OBJS@
 
 PYTHON=		python$(EXE)
-BUILDPYTHON=	python$(BUILDEXE)
+BUILDPYTHON=	python$(EXE)
+PYTHON_FOR_BUILD=	@PYTHON_FOR_BUILD@
 
 PYTHON_FOR_REGEN=@PYTHON_FOR_REGEN@
 PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
@@ -239,7 +256,7 @@
 
 ##########################################################################
 # Parser
-PGEN=		Parser/pgen$(EXE)
+PGEN_FOR_BUILD=	Parser/pgen$(EXEEXT_FOR_BUILD)
 
 PSRCS=		\
 		Parser/acceler.c \
@@ -277,20 +294,29 @@
 		Parser/printgrammar.c \
 		Parser/pgenmain.c
 
-PGOBJS=		\
-		Objects/obmalloc.o \
-		Python/mysnprintf.o \
-		Python/pyctype.o \
-		Parser/tokenizer_pgen.o \
-		Parser/printgrammar.o \
-		Parser/pgenmain.o
-
-PARSER_HEADERS= \
-		Parser/parser.h \
-		Parser/tokenizer.h
+POBJS_FOR_BUILD=		\
+		Parser/acceler.$(O_FOR_BUILD) \
+		Parser/grammar1.$(O_FOR_BUILD) \
+		Parser/listnode.$(O_FOR_BUILD) \
+		Parser/node.$(O_FOR_BUILD) \
+		Parser/parser.$(O_FOR_BUILD) \
+		Parser/parsetok.$(O_FOR_BUILD) \
+		Parser/bitset.$(O_FOR_BUILD) \
+		Parser/metagrammar.$(O_FOR_BUILD) \
+		Parser/firstsets.$(O_FOR_BUILD) \
+		Parser/grammar.$(O_FOR_BUILD) \
+		Parser/pgen.$(O_FOR_BUILD)
+ 
+PGOBJS_FOR_BUILD=		\
+		Objects/obmalloc.$(O_FOR_BUILD) \
+		Python/mysnprintf.$(O_FOR_BUILD) \
+		Python/pyctype.$(O_FOR_BUILD) \
+		Parser/tokenizer_pgen.$(O_FOR_BUILD) \
+		Parser/printgrammar.$(O_FOR_BUILD) \
+		Parser/pgenmain.$(O_FOR_BUILD)
 
 PGENSRCS=	$(PSRCS) $(PGSRCS)
-PGENOBJS=	$(POBJS) $(PGOBJS)
+PGENOBJS=	$(POBJS_FOR_BUILD) $(PGOBJS_FOR_BUILD)
 
 ##########################################################################
 PYTHON_OBJS=	\
@@ -662,10 +688,14 @@
 
 Modules/grpmodule.o: $(srcdir)/Modules/grpmodule.c $(srcdir)/Modules/posixmodule.h
 
-Modules/pwdmodule.o: $(srcdir)/Modules/pwdmodule.c $(srcdir)/Modules/posixmodule.h
+$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN_FOR_BUILD) $(GRAMMAR_INPUT)
+		-@$(INSTALL) -d Include
+		-$(PGEN_FOR_BUILD) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
+
+$(PGEN_FOR_BUILD): $(PGENOBJS)
+		$(CC_FOR_BUILD) $(OPT) $(LDFLAGS_FOR_BUILD) $(PGENOBJS) $(LIBS_FOR_BUILD) -o $(PGEN_FOR_BUILD)
 
-$(PGEN):	$(PGENOBJS)
-		$(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
+Modules/pwdmodule.o: $(srcdir)/Modules/pwdmodule.c $(srcdir)/Modules/posixmodule.h
 
 .PHONY: regen-grammar
 regen-grammar: $(PGEN)
@@ -749,6 +779,13 @@
 				$(STRINGLIB_HEADERS)
 
 ############################################################################
+# Cross compile rules
+
+.SUFFIXES: .x
+.c.x:
+	$(CC_FOR_BUILD) -c $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -o $@ $<
+				
+############################################################################
 # Header files
 
 PYTHON_HEADERS= \
@@ -854,7 +891,7 @@
 
 TESTOPTS=	-l $(EXTRATESTOPTS)
 TESTPROG=	$(srcdir)/Lib/test/regrtest.py
-TESTPYTHON=	$(RUNSHARED) ./$(BUILDPYTHON) -Wd -3 -E -tt $(TESTPYTHONOPTS)
+TESTPYTHON=	$(RUNSHARED) $(PYTHON_FOR_BUILD) -Wd -3 -E -tt $(TESTPYTHONOPTS)
 
 # Remove "test_python_*" directories of previous failed test jobs.
 # Pass TESTOPTS options because it can contain --tempdir option.
@@ -1077,7 +1114,7 @@
 		unittest unittest/test \
 		lib-old \
 		curses pydoc_data $(MACHDEPS)
-libinstall:	build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
+libinstall:	build_all $(srcdir)/Lib/$(PLATDIR) @CROSS_COMMENT@ $(srcdir)/Modules/xxmodule.c
 	@for i in $(SCRIPTDIR) $(LIBDEST); \
 	do \
 		if test ! -d $(DESTDIR)$$i; then \
@@ -1164,9 +1201,9 @@
 $(srcdir)/Lib/$(PLATDIR):
 	mkdir $(srcdir)/Lib/$(PLATDIR)
 	cp $(srcdir)/Lib/plat-generic/regen $(srcdir)/Lib/$(PLATDIR)/regen
-	export PATH; PATH="`pwd`:$$PATH"; \
-	export PYTHONPATH; PYTHONPATH="$(srcdir)/Lib:$(abs_builddir)/`cat pybuilddir.txt`"; \
-	export DYLD_FRAMEWORK_PATH; DYLD_FRAMEWORK_PATH="`pwd`"; \
+	@CROSS_COMMENT@ export PATH; PATH="`pwd`:$$PATH"; \
+	@CROSS_COMMENT@ export PYTHONPATH; PYTHONPATH="$(srcdir)/Lib:$(abs_builddir)/`cat pybuilddir.txt`"; \
+	@CROSS_COMMENT@ export DYLD_FRAMEWORK_PATH; DYLD_FRAMEWORK_PATH="`pwd`"; \
 	export EXE; EXE="$(BUILDEXE)"; \
 	if [ -n "$(MULTIARCH)" ]; then export MULTIARCH; MULTIARCH=$(MULTIARCH); fi; \
 	export PYTHON_FOR_BUILD; \
@@ -1270,6 +1307,7 @@
 # Install the dynamically loadable modules
 # This goes into $(exec_prefix)
 sharedinstall: sharedmods
+	CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' CROSS_COMPILING='$(CROSS_COMPILING)' \
 	$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \
 	   	--prefix=$(prefix) \
 		--install-scripts=$(BINDIR) \
@@ -1415,11 +1453,12 @@
 	find . -name '*.dyn' -exec rm -f {} ';'
 
 clobber: clean profile-removal
-	-rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \
+	-rm -f $(BUILDPYTHON) $(PGEN_FOR_BUILD) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \
 		tags TAGS \
 		config.cache config.log pyconfig.h Modules/config.c
 	-rm -rf build platform
 	-rm -rf $(PYTHONFRAMEWORKDIR)
+	-rm -rf buildpython
 
 # Make things extra clean, before making a distribution:
 # remove all generated files, even Makefile[.pre]
diff -ubBr Python-2.7.18.orig/Modules/addrinfo.h Python-2.7.18/Modules/addrinfo.h
--- Python-2.7.18.orig/Modules/addrinfo.h	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/addrinfo.h	2021-08-21 15:42:17.997177096 +0200
@@ -123,7 +123,7 @@
 
 #endif /* !HAVE_GETNAMEINFO */
 
-#ifndef HAVE_ADDRINFO
+#if !defined(HAVE_ADDRINFO) && !defined(_WIN32)
 struct addrinfo {
     int         ai_flags;       /* AI_PASSIVE, AI_CANONNAME */
     int         ai_family;      /* PF_xxx */
@@ -136,7 +136,7 @@
 };
 #endif /* !HAVE_ADDRINFO */
 
-#ifndef HAVE_SOCKADDR_STORAGE
+#if !defined(HAVE_SOCKADDR_STORAGE) && !defined(_WIN32)
 /*
  * RFC 2553: protocol-independent placeholder for socket addresses
  */
diff -ubBr Python-2.7.18.orig/Modules/_ctypes/libffi/fficonfig.py.in Python-2.7.18/Modules/_ctypes/libffi/fficonfig.py.in
--- Python-2.7.18.orig/Modules/_ctypes/libffi/fficonfig.py.in	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/_ctypes/libffi/fficonfig.py.in	2021-08-21 15:42:38.333165470 +0200
@@ -9,6 +9,7 @@
     'X86': ['src/x86/ffi.c', 'src/x86/sysv.S', 'src/x86/win32.S'],
     'X86_FREEBSD': ['src/x86/ffi.c', 'src/x86/freebsd.S'],
     'X86_WIN32': ['src/x86/ffi.c', 'src/x86/win32.S'],
+    'X86_WIN64': ['src/x86/ffi.c', 'src/x86/win64.S'],
     'SPARC': ['src/sparc/ffi.c', 'src/sparc/v8.S', 'src/sparc/v9.S'],
     'ALPHA': ['src/alpha/ffi.c', 'src/alpha/osf.S'],
     'IA64': ['src/ia64/ffi.c', 'src/ia64/unix.S'],
diff -ubBr Python-2.7.18.orig/Modules/datetimemodule.c Python-2.7.18/Modules/datetimemodule.c
--- Python-2.7.18.orig/Modules/datetimemodule.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/datetimemodule.c	2021-08-21 15:42:17.997177096 +0200
@@ -10,6 +10,10 @@
 
 #include <time.h>
 
+#ifdef MS_WINDOWS
+#include <winsock2.h>
+#endif
+
 #include "timefuncs.h"
 
 /* Differentiate between building the core module and building extension
diff -ubBr Python-2.7.18.orig/Modules/getpath.c Python-2.7.18/Modules/getpath.c
--- Python-2.7.18.orig/Modules/getpath.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/getpath.c	2021-08-21 15:42:18.001177094 +0200
@@ -104,6 +104,14 @@
 #define LANDMARK "os.py"
 #endif
 
+#ifndef __MINGW32__
+#define IS_ABSOLUTE(x) (x[0] == SEP)
+#else /* __MINGW32__ */
+#define IS_ABSOLUTE(x) (x[0] == SEP || x[0] == ALTSEP\
+			|| (x[1] && x[1] == ROOTSEP\
+			    && x[2] && (x[2] == SEP || x[2] == ALTSEP)))
+#endif /* __MINGW32__ */
+
 static char prefix[MAXPATHLEN+1];
 static char exec_prefix[MAXPATHLEN+1];
 static char progpath[MAXPATHLEN+1];
@@ -114,7 +122,12 @@
 reduce(char *dir)
 {
     size_t i = strlen(dir);
-    while (i > 0 && dir[i] != SEP)
+    while (i > 0
+	   && dir[i] != SEP
+#ifdef ALTSEP
+	   && dir[i] != ALTSEP
+#endif /* ALTSEP */
+	   )
         --i;
     dir[i] = '\0';
 }
@@ -187,11 +200,16 @@
 joinpath(char *buffer, char *stuff)
 {
     size_t n, k;
-    if (stuff[0] == SEP)
+    if (IS_ABSOLUTE(stuff))
         n = 0;
     else {
         n = strlen(buffer);
-        if (n > 0 && buffer[n-1] != SEP && n < MAXPATHLEN)
+        if (n > 0
+	    && buffer[n-1] != SEP
+#ifdef ALTSEP
+	    && buffer[n-1] != ALTSEP
+#endif /* ALTSEP */
+	    && n < MAXPATHLEN)
             buffer[n++] = SEP;
     }
     if (n > MAXPATHLEN)
@@ -208,7 +226,7 @@
 static void
 copy_absolute(char *path, char *p)
 {
-    if (p[0] == SEP)
+    if (IS_ABSOLUTE(p))
         strcpy(path, p);
     else {
         if (!getcwd(path, MAXPATHLEN)) {
@@ -216,7 +234,11 @@
             strcpy(path, p);
             return;
         }
+#ifdef ALTSEP
+        if (p[0] == '.' && (p[1] == SEP || p[1] == ALTSEP))
+#else
         if (p[0] == '.' && p[1] == SEP)
+#endif
             p += 2;
         joinpath(path, p);
     }
@@ -228,7 +250,7 @@
 {
     char buffer[MAXPATHLEN + 1];
 
-    if (path[0] == SEP)
+    if (IS_ABSOLUTE(path))
         return;
     copy_absolute(buffer, path);
     strcpy(path, buffer);
@@ -389,13 +411,23 @@
 #endif
 #endif
 
-        /* If there is no slash in the argv0 path, then we have to
-         * assume python is on the user's $PATH, since there's no
-         * other way to find a directory to start the search from.  If
-         * $PATH isn't exported, you lose.
+    /* If PROG is an absolute name, then we're done.  If PROG is not
+     * an absolute name and contains SEP/ALTSEP, then it must be
+     * reachable from CWD.  Otherwise, python is on the user's $PATH,
+     * since there's no other way to find a directory to start the
+     * search from.  If $PATH isn't exported, you lose.
          */
-        if (strchr(prog, SEP))
+    if (IS_ABSOLUTE(prog))
                 strncpy(progpath, prog, MAXPATHLEN);
+    else if (strchr(prog, SEP)
+#ifdef ALTSEP
+	     || strchr(prog, ALTSEP)
+#endif /* ALTSEP */
+	     )
+      {
+    	getcwd(progpath, MAXPATHLEN);
+	joinpath(progpath, prog);
+      }
 #ifdef __APPLE__
      /* On Mac OS X, if a script uses an interpreter of the form
       * "#!/opt/python2.3/bin/python", the kernel only passes "python"
@@ -411,6 +443,9 @@
        ;
 #endif /* __APPLE__ */
         else if (path) {
+#ifdef __MINGW32__
+                char const *ext = strchr(prog, '.') ? "" : ".exe";
+#endif
                 while (1) {
                         char *delim = strchr(path, DELIM);
 
@@ -425,6 +460,9 @@
                                 strncpy(progpath, path, MAXPATHLEN);
 
                         joinpath(progpath, prog);
+#ifdef __MINGW32__
+                        strcat(progpath, ext);
+#endif
                         if (isxfile(progpath))
                                 break;
 
@@ -483,7 +521,7 @@
         while (linklen != -1) {
             /* It's not null terminated! */
             tmpbuffer[linklen] = '\0';
-            if (tmpbuffer[0] == SEP)
+            if (IS_ABSOLUTE(tmpbuffer))
                 /* tmpbuffer should never be longer than MAXPATHLEN,
                    but extra check does not hurt */
                 strncpy(argv0_path, tmpbuffer, MAXPATHLEN + 1);
@@ -550,7 +588,7 @@
     while (1) {
         char *delim = strchr(defpath, DELIM);
 
-        if (defpath[0] != SEP)
+        if (!IS_ABSOLUTE(defpath))
             /* Paths are relative to prefix */
             bufsz += prefixsz;
 
@@ -595,7 +633,7 @@
         while (1) {
             char *delim = strchr(defpath, DELIM);
 
-            if (defpath[0] != SEP) {
+            if (!IS_ABSOLUTE(defpath)) {
                 strcat(buf, prefix);
                 if (prefixsz >= 2 && prefix[prefixsz - 2] != SEP &&
                     defpath[0] != (delim ? DELIM : L'\0')) {  /* not empty */
diff -ubBr Python-2.7.18.orig/Modules/posixmodule.c Python-2.7.18/Modules/posixmodule.c
--- Python-2.7.18.orig/Modules/posixmodule.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/posixmodule.c	2021-08-21 15:42:18.001177094 +0200
@@ -102,6 +102,11 @@
 #include <sys/loadavg.h>
 #endif
 
+/* Additional defines for the mingw32 build */
+#if defined(__MINGW32__)
+#undef HAVE_DEV_PTMX
+#endif
+
 /* Various compilers have only certain posix functions */
 /* XXX Gosh I wish these were all moved into pyconfig.h */
 #if defined(PYCC_VACPP) && defined(PYOS_OS2)
@@ -136,6 +141,9 @@
 #define HAVE_CWAIT      1
 #define HAVE_FSYNC      1
 #define fsync _commit
+#elif defined(__MINGW32__)             /* MINGW32 (cross-)compiler*/
+#define HAVE_FSYNC      1
+#define fsync _commit
 #else
 #if defined(PYOS_OS2) && defined(PYCC_GCC) || defined(__VMS)
 /* Everything needed is defined in PC/os2emx/pyconfig.h or vms/pyconfig.h */
@@ -162,12 +170,12 @@
 #define HAVE_WAIT       1
 #define HAVE_TTYNAME    1
 #endif  /* PYOS_OS2 && PYCC_GCC && __VMS */
-#endif  /* _MSC_VER */
+#endif  /* __MINGW32__ */
 #endif  /* __BORLANDC__ */
 #endif  /* ! __WATCOMC__ || __QNX__ */
 #endif /* ! __IBMC__ */
 
-#ifndef _MSC_VER
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
 
 #if defined(__sgi)&&_COMPILER_VERSION>=700
 /* declare ctermid_r if compiling with MIPSPro 7.x in ANSI C mode
@@ -179,7 +187,7 @@
 #if defined(PYCC_VACPP)
 extern int mkdir(char *);
 #else
-#if ( defined(__WATCOMC__) || defined(_MSC_VER) ) && !defined(__QNX__)
+#if ( defined(__WATCOMC__) || defined(_MSC_VER) || defined(__MINGW32__)) && !defined(__QNX__)
 extern int mkdir(const char *);
 #else
 extern int mkdir(const char *, mode_t);
@@ -219,7 +227,7 @@
 #endif /* HAVE_LSTAT */
 #endif /* !HAVE_UNISTD_H */
 
-#endif /* !_MSC_VER */
+#endif /* !_MSC_VER && !__MINGW32__ */
 
 #ifdef HAVE_UTIME_H
 #include <utime.h>
@@ -264,7 +272,7 @@
 #endif
 #endif
 
-#ifdef _MSC_VER
+#if defined (_MSC_VER) || defined (__MINGW32__)
 #ifdef HAVE_DIRECT_H
 #include <direct.h>
 #endif
@@ -280,7 +288,7 @@
 #include <shellapi.h>   /* for ShellExecute() */
 #define popen   _popen
 #define pclose  _pclose
-#endif /* _MSC_VER */
+#endif /* _MSC_VER || __MINGW32__ */
 
 #if defined(PYCC_VACPP) && defined(PYOS_OS2)
 #include <io.h>
@@ -1019,7 +1027,7 @@
 #undef STAT
 #undef FSTAT
 #undef STRUCT_STAT
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#if defined(MS_WIN64) || defined(MS_WINDOWS) || defined(__MINGW32__)
 #       define STAT win32_stat
 #       define FSTAT win32_fstat
 #       define STRUCT_STAT struct win32_stat
@@ -1029,7 +1037,7 @@
 #       define STRUCT_STAT struct stat
 #endif
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
 /* The CRT of Windows has a number of flaws wrt. its stat() implementation:
    - time stamps are restricted to second resolution
    - file modification times suffer from forth-and-back conversions between
@@ -1275,7 +1283,7 @@
     return 0;
 }
 
-#endif /* MS_WINDOWS */
+#endif /* MS_WINDOWS and __MINGW32__ */
 
 PyDoc_STRVAR(stat_result__doc__,
 "stat_result: Result from stat or lstat.\n\n\
@@ -1487,7 +1495,7 @@
 #else
     PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long)st->st_ino));
 #endif
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS)
     PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev));
 #else
     PyStructSequence_SET_ITEM(v, 2, _PyInt_FromDev(st->st_dev));
@@ -1574,7 +1582,7 @@
     return v;
 }
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
 
 /* IsUNCRoot -- test whether the supplied path is of the form \\SERVER\SHARE\,
    where / can be used in place of \ and the trailing slash is optional.
@@ -1632,7 +1640,7 @@
 
     #undef ISSLASH
 }
-#endif /* MS_WINDOWS */
+#endif /* MS_WINDOWS and __MINGW32__ */
 
 static PyObject *
 posix_do_stat(PyObject *self, PyObject *args,
@@ -1677,7 +1685,7 @@
     Py_END_ALLOW_THREADS
 
     if (res != 0) {
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
         result = win32_error("stat", pathfree);
 #else
         result = posix_error_with_filename(pathfree);
@@ -1821,7 +1829,7 @@
 static PyObject *
 posix_chdir(PyObject *self, PyObject *args)
 {
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     return win32_1str(args, "chdir", "s:chdir", win32_chdir, "U:chdir", win32_wchdir);
 #elif defined(PYOS_OS2) && defined(PYCC_GCC)
     return posix_1str(args, "et:chdir", _chdir2);
@@ -2289,7 +2297,7 @@
 {
     /* XXX Should redo this putting the (now four) versions of opendir
        in separate files instead of having them all here... */
-#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
+#if (defined(MS_WINDOWS) || defined(__MINGW32__)) && !defined(HAVE_OPENDIR)
 
     PyObject *d, *v;
     HANDLE hFindFile;
@@ -2602,7 +2610,7 @@
 #endif /* which OS */
 }  /* end of posix_listdir */
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
 /* A helper function for abspath on win32 */
 static PyObject *
 posix__getfullpathname(PyObject *self, PyObject *args)
@@ -2654,7 +2662,7 @@
     }
     return PyString_FromString(outbuf);
 } /* end of posix__getfullpathname */
-#endif /* MS_WINDOWS */
+#endif /* MS_WINDOWS and __MINGW32__ */
 
 PyDoc_STRVAR(posix_mkdir__doc__,
 "mkdir(path [, mode=0777])\n\n\
@@ -2765,7 +2773,7 @@
 static PyObject *
 posix_rename(PyObject *self, PyObject *args)
 {
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     PyObject *o1, *o2;
     char *p1, *p2;
     BOOL result;
@@ -2811,7 +2819,7 @@
 static PyObject *
 posix_rmdir(PyObject *self, PyObject *args)
 {
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     return win32_1str(args, "rmdir", "s:rmdir", RemoveDirectoryA, "U:rmdir", RemoveDirectoryW);
 #else
     return posix_1str(args, "et:rmdir", rmdir);
@@ -2826,7 +2834,7 @@
 static PyObject *
 posix_stat(PyObject *self, PyObject *args)
 {
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     return posix_do_stat(self, args, "et:stat", STAT, "u:stat", win32_wstat);
 #else
     return posix_do_stat(self, args, "et:stat", STAT, NULL, NULL);
@@ -2882,7 +2890,7 @@
 static PyObject *
 posix_unlink(PyObject *self, PyObject *args)
 {
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     return win32_1str(args, "remove", "s:remove", DeleteFileA, "U:remove", DeleteFileW);
 #else
     return posix_1str(args, "et:remove", unlink);
@@ -5195,7 +5203,7 @@
 
 #endif /* PYCC_??? */
 
-#elif defined(MS_WINDOWS)
+#elif defined(MS_WINDOWS) || defined(__MINGW32__)
 
 /*
  * Portable 'popen' replacement for Win32.
@@ -6335,7 +6343,7 @@
 #ifdef HAVE_LSTAT
     return posix_do_stat(self, args, "et:lstat", lstat, NULL, NULL);
 #else /* !HAVE_LSTAT */
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     return posix_do_stat(self, args, "et:lstat", STAT, "u:lstat", win32_wstat);
 #else
     return posix_do_stat(self, args, "et:lstat", STAT, NULL, NULL);
@@ -6468,7 +6476,7 @@
 #endif /* HAVE_TIMES */
 
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
 #define HAVE_TIMES      /* so the method table will pick it up */
 static PyObject *
 posix_times(PyObject *self, PyObject *noargs)
@@ -6492,7 +6500,7 @@
         (double)0,
         (double)0);
 }
-#endif /* MS_WINDOWS */
+#endif /* MS_WINDOWS and __MINGW32__ */
 
 #ifdef HAVE_TIMES
 PyDoc_STRVAR(posix_times__doc__,
@@ -6609,7 +6617,7 @@
     int mode = 0777;
     int fd;
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     Py_UNICODE *wpath;
     if (PyArg_ParseTuple(args, "ui|i:mkdir", &wpath, &flag, &mode)) {
         Py_BEGIN_ALLOW_THREADS
@@ -6736,7 +6744,7 @@
 posix_lseek(PyObject *self, PyObject *args)
 {
     int fd, how;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#if defined(MS_WIN64) || defined(MS_WINDOWS) || defined(__MINGW32__)
     PY_LONG_LONG pos, res;
 #else
     off_t pos, res;
@@ -6765,7 +6773,7 @@
     if (!_PyVerify_fd(fd))
         return posix_error();
     Py_BEGIN_ALLOW_THREADS
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
+#if defined(MS_WIN64) || defined(MS_WINDOWS) || defined(__MINGW32__)
     res = _lseeki64(fd, pos, how);
 #else
     res = lseek(fd, pos, how);
@@ -6873,7 +6881,7 @@
     res = FSTAT(fd, &st);
     Py_END_ALLOW_THREADS
     if (res != 0) {
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
         return win32_error("fstat", NULL);
 #else
         return posix_error();
@@ -6941,7 +6949,7 @@
         return NULL;
     }
     Py_BEGIN_ALLOW_THREADS
-#if !defined(MS_WINDOWS) && defined(HAVE_FCNTL_H)
+#if !defined(MS_WINDOWS) || !defined(__MINGW32__) && defined(HAVE_FCNTL_H)
     if (mode[0] == 'a') {
         /* try to make sure the O_APPEND flag is set */
         int flags;
@@ -7006,7 +7014,7 @@
 
     return Py_BuildValue("(ii)", read, write);
 #else
-#if !defined(MS_WINDOWS)
+#if !defined(MS_WINDOWS) || !defined(__MINGW32__)
     int fds[2];
     int res;
     Py_BEGIN_ALLOW_THREADS
@@ -7015,7 +7023,7 @@
     if (res != 0)
         return posix_error();
     return Py_BuildValue("(ii)", fds[0], fds[1]);
-#else /* MS_WINDOWS */
+#else /* MS_WINDOWS and __MINGW32__ */
     HANDLE read, write;
     int read_fd, write_fd;
     BOOL ok;
@@ -7589,7 +7597,7 @@
                        "use the tempfile module", 1) < 0)
         return NULL;
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__) 
     name = _tempnam(dir, pfx);
 #else
     name = tempnam(dir, pfx);
@@ -8655,7 +8663,7 @@
     return NULL;
 }
 
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
 PyDoc_STRVAR(win32_startfile__doc__,
 "startfile(filepath [, operation]) - Start a file with its associated\n\
 application.\n\
@@ -8990,7 +8998,7 @@
 #endif /* HAVE_PLOCK */
 #ifdef HAVE_POPEN
     {"popen",           posix_popen, METH_VARARGS, posix_popen__doc__},
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     {"popen2",          win32_popen2, METH_VARARGS},
     {"popen3",          win32_popen3, METH_VARARGS},
     {"popen4",          win32_popen4, METH_VARARGS},
@@ -9159,7 +9167,7 @@
     {"pathconf",        posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
 #endif
     {"abort",           posix_abort, METH_NOARGS, posix_abort__doc__},
-#ifdef MS_WINDOWS
+#if defined(MS_WINDOWS) || defined(__MINGW32__)
     {"_getfullpathname",        posix__getfullpathname, METH_VARARGS, NULL},
     {"_isdir",                  posix__isdir, METH_VARARGS, posix__isdir__doc__},
 #endif
@@ -9464,7 +9472,7 @@
 }
 
 
-#if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__)) && !defined(__QNX__)
+#if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) || defined(__MINGW32__)) && !defined(__QNX__)
 #define INITFUNC initnt
 #define MODNAME "nt"
 
diff -ubBr Python-2.7.18.orig/Modules/pwdmodule.c Python-2.7.18/Modules/pwdmodule.c
--- Python-2.7.18.orig/Modules/pwdmodule.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/pwdmodule.c	2021-08-21 15:42:18.001177094 +0200
@@ -1,10 +1,12 @@
-
 /* UNIX password file access module */
 
 #include "Python.h"
 #include "structseq.h"
 #include "posixmodule.h"
 
+#ifndef __MINGW32__
+
+#include <sys/types.h>
 #include <pwd.h>
 
 static PyStructSequence_Field struct_pwd_type_fields[] = {
@@ -206,3 +208,9 @@
     PyModule_AddObject(m, "struct_pwent", (PyObject *) &StructPwdType);
     initialized = 1;
 }
+#else
+PyMODINIT_FUNC
+initpwd(void)
+{
+}
+#endif // !__MINGW32__
diff -ubBr Python-2.7.18.orig/Modules/readline.c Python-2.7.18/Modules/readline.c
--- Python-2.7.18.orig/Modules/readline.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/readline.c	2021-08-21 15:42:18.001177094 +0200
@@ -11,6 +11,14 @@
 #include <errno.h>
 #include <sys/time.h>
 
+#ifdef MS_WINDOWS
+# include <winsock2.h>
+#endif
+
+#ifndef SIGWINCH
+#define  SIGWINCH 28
+#endif
+
 #if defined(HAVE_SETLOCALE)
 /* GNU readline() mistakenly sets the LC_CTYPE locale.
  * This is evil.  Only the user or the app's main() should do this!
diff -ubBr Python-2.7.18.orig/Modules/Setup.dist Python-2.7.18/Modules/Setup.dist
--- Python-2.7.18.orig/Modules/Setup.dist	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/Setup.dist	2021-08-21 15:42:18.001177094 +0200
@@ -91,12 +91,12 @@
 TESTPATH=
 
 # Path components for machine- or system-dependent modules and shared libraries
-MACHDEPPATH=:$(PLATDIR)
+MACHDEPPATH=$(DELIM)plat-$(MACHDEP)
 EXTRAMACHDEPPATH=
 
 # Path component for the Tkinter-related modules
 # The TKPATH variable is always enabled, to save you the effort.
-TKPATH=:lib-tk
+TKPATH=$(DELIM)lib-tk
 
 # Path component for old modules.
 OLDPATH=:lib-old
@@ -112,7 +112,7 @@
 # This only contains the minimal set of modules required to run the 
 # setup.py script in the root of the Python source tree.
 
-posix posixmodule.c		# posix (UNIX) system calls
+@POSIX@ posixmodule.c		# posix (UNIX) system calls
 errno errnomodule.c		# posix (UNIX) errno values
 pwd pwdmodule.c			# this is needed to find out the user's home dir
 				# if $HOME is not set
@@ -163,33 +163,34 @@
 # it, depending on your system -- see the GNU readline instructions.
 # It's okay for this to be a shared library, too.
 
-#readline readline.c -lreadline -ltermcap
+readline readline.c -lreadline -ltermcap
 
 
 # Modules that should always be present (non UNIX dependent):
 
-#array arraymodule.c	# array objects
-#cmath cmathmodule.c _math.c # -lm # complex math library functions
-#math mathmodule.c _math.c # -lm # math library functions, e.g. sin()
-#_struct _struct.c	# binary structure packing/unpacking
-#time timemodule.c # -lm # time operations and variables
-#operator operator.c	# operator.add() and similar goodies
-#_testcapi _testcapimodule.c    # Python C API test module
-#_random _randommodule.c	# Random number generator
-#_collections _collectionsmodule.c # Container types
-#_heapq _heapqmodule.c		# Heapq type
-#itertools itertoolsmodule.c	# Functions creating iterators for efficient looping 
-#strop stropmodule.c		# String manipulations
-#_functools _functoolsmodule.c	# Tools for working with functions and callable objects
-#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c	# elementtree accelerator
+array arraymodule.c	# array objects
+cmath cmathmodule.c _math.c # -lm # complex math library functions
+math mathmodule.c _math.c # -lm # math library functions, e.g. sin()
+_struct _struct.c	# binary structure packing/unpacking
+time timemodule.c # -lm # time operations and variables
+operator operator.c	# operator.add() and similar goodies
+_weakref _weakref.c	# basic weak reference support
+_testcapi _testcapimodule.c    # Python C API test module
+_random _randommodule.c	# Random number generator
+_collections _collectionsmodule.c # Container types
+_heapq _heapqmodule.c		# Heapq type
+itertools itertoolsmodule.c	# Functions creating iterators for efficient looping 
+strop stropmodule.c		# String manipulations
+_functools _functoolsmodule.c	# Tools for working with functions and callable objects
+_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c	# elementtree accelerator
 #_pickle _pickle.c	# pickle accelerator
-#datetime datetimemodule.c	# date/time type
-#_bisect _bisectmodule.c	# Bisection algorithms
+datetime datetimemodule.c	# date/time type
+_bisect _bisectmodule.c	# Bisection algorithms
 
-#unicodedata unicodedata.c    # static Unicode character database
+unicodedata unicodedata.c    # static Unicode character database
 
 # access to ISO C locale support
-#_locale _localemodule.c  # -lintl
+_locale _localemodule.c  -lintl
 
 # Standard I/O baseline
 #_io -I$(srcdir)/Modules/_io _io/bufferedio.c _io/bytesio.c _io/fileio.c _io/iobase.c _io/_iomodule.c _io/stringio.c _io/textio.c
@@ -202,16 +203,16 @@
 #fcntl fcntlmodule.c	# fcntl(2) and ioctl(2)
 #spwd spwdmodule.c		# spwd(3) 
 #grp grpmodule.c		# grp(3)
-#select selectmodule.c	# select(2); not on ancient System V
+select selectmodule.c -lws2_32 -lwsock32	# select(2); not on ancient System V
 
 # Memory-mapped files (also works on Win32).
-#mmap mmapmodule.c
+mmap mmapmodule.c
 
 # CSV file helper
-#_csv _csv.c
+_csv _csv.c
 
 # Socket module helper for socket(2)
-#_socket socketmodule.c timemodule.c
+_socket socketmodule.c timemodule.c  -lws2_32 -lwsock32
 
 # Socket module helper for SSL support; you must comment out the other
 # socket line above, and possibly edit the SSL variable:
@@ -252,14 +253,14 @@
 # Message-Digest Algorithm, described in RFC 1321.  The necessary files
 # md5.c and md5.h are included here.
 
-#_md5 md5module.c md5.c
+_md5 md5module.c md5.c
 
 
 # The _sha module implements the SHA checksum algorithms.
 # (NIST's Secure Hash Algorithms.)
-#_sha shamodule.c
-#_sha256 sha256module.c
-#_sha512 sha512module.c
+_sha shamodule.c
+_sha256 sha256module.c
+_sha512 sha512module.c
 
 
 # SGI IRIX specific modules -- off by default.
@@ -311,7 +312,7 @@
 
 # George Neville-Neil's timing module:
 
-#timing timingmodule.c
+timing timingmodule.c
 
 
 # The _tkinter module.
@@ -415,11 +416,11 @@
 #
 # Edit the variables DB and DBLIBVERto point to the db top directory
 # and the subdirectory of PORT where you built it.
-#DB=/usr/local/BerkeleyDB.4.0
-#DBLIBVER=4.0
-#DBINC=$(DB)/include
-#DBLIB=$(DB)/lib
-#_bsddb _bsddb.c -I$(DBINC) -L$(DBLIB) -ldb-$(DBLIBVER)
+DB=$(prefix)
+DBLIBVER=6.0
+DBINC=$(DB)/include
+DBLIB=$(DB)/lib
+_bsddb _bsddb.c -I$(DBINC) -L$(DBLIB) -ldb-$(DBLIBVER)
 
 # Historical Berkeley DB 1.85
 #
@@ -434,14 +435,14 @@
 
 
 # Helper module for various ascii-encoders
-#binascii binascii.c
+binascii binascii.c
 
 # Fred Drake's interface to the Python parser
-#parser parsermodule.c
+parser parsermodule.c
 
 # cStringIO and cPickle
-#cStringIO cStringIO.c
-#cPickle cPickle.c
+cStringIO cStringIO.c
+cPickle cPickle.c
 
 
 # Lee Busby's SIGFPE modules.
@@ -464,25 +465,24 @@
 # Andrew Kuchling's zlib module.
 # This require zlib 1.1.3 (or later).
 # See http://www.gzip.org/zlib/
-#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
+zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
 
 # Interface to the Expat XML parser
 # More information on Expat can be found at www.libexpat.org.
-#
 #pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI
 
 
 # Hye-Shik Chang's CJKCodecs
 
 # multibytecodec is required for all the other CJK codec modules
-#_multibytecodec cjkcodecs/multibytecodec.c
+_multibytecodec cjkcodecs/multibytecodec.c
 
-#_codecs_cn cjkcodecs/_codecs_cn.c
-#_codecs_hk cjkcodecs/_codecs_hk.c
-#_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
-#_codecs_jp cjkcodecs/_codecs_jp.c
-#_codecs_kr cjkcodecs/_codecs_kr.c
-#_codecs_tw cjkcodecs/_codecs_tw.c
+_codecs_cn cjkcodecs/_codecs_cn.c
+_codecs_hk cjkcodecs/_codecs_hk.c
+_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
+_codecs_jp cjkcodecs/_codecs_jp.c
+_codecs_kr cjkcodecs/_codecs_kr.c
+_codecs_tw cjkcodecs/_codecs_tw.c
 
 # Example -- included for reference only:
 # xx xxmodule.c
diff -ubBr Python-2.7.18.orig/Modules/signalmodule.c Python-2.7.18/Modules/signalmodule.c
--- Python-2.7.18.orig/Modules/signalmodule.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/signalmodule.c	2021-08-21 15:42:18.001177094 +0200
@@ -7,7 +7,7 @@
 #include "intrcheck.h"
 
 #ifdef MS_WINDOWS
-#include <Windows.h>
+#include <windows.h>
 #ifdef HAVE_PROCESS_H
 #include <process.h>
 #endif
diff -ubBr Python-2.7.18.orig/Modules/socketmodule.c Python-2.7.18/Modules/socketmodule.c
--- Python-2.7.18.orig/Modules/socketmodule.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/socketmodule.c	2021-08-21 15:42:18.001177094 +0200
@@ -3355,7 +3355,11 @@
     if (h->h_addrtype != af) {
         /* Let's get real error message to return */
         PyErr_SetString(socket_error,
+#ifdef _WIN32
+                        (char *)strerror(WSAEAFNOSUPPORT));
+#else
                         (char *)strerror(EAFNOSUPPORT));
+#endif
 
         return NULL;
     }
diff -ubBr Python-2.7.18.orig/Modules/socketmodule.h Python-2.7.18/Modules/socketmodule.h
--- Python-2.7.18.orig/Modules/socketmodule.h	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/socketmodule.h	2021-08-21 15:42:18.001177094 +0200
@@ -21,7 +21,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 -ubBr Python-2.7.18.orig/Modules/_testcapimodule.c Python-2.7.18/Modules/_testcapimodule.c
--- Python-2.7.18.orig/Modules/_testcapimodule.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/_testcapimodule.c	2021-08-21 15:42:18.001177094 +0200
@@ -8,6 +8,7 @@
 #include "Python.h"
 #include <float.h>
 #include "structmember.h"
+#undef Py_BUILD_CORE
 #include "datetime.h"
 #include "marshal.h"
 #include <signal.h>
@@ -1961,7 +1962,6 @@
     PyDateTime_IMPORT;
     if (PyDateTimeAPI)
         Py_RETURN_NONE;
-    else
         return NULL;
 }
 #endif
diff -ubBr Python-2.7.18.orig/Modules/timemodule.c Python-2.7.18/Modules/timemodule.c
--- Python-2.7.18.orig/Modules/timemodule.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/timemodule.c	2021-08-21 15:42:18.001177094 +0200
@@ -42,6 +42,10 @@
 #include <windows.h>
 #include "pythread.h"
 
+#ifdef MS_WINDOWS
+#include <winsock2.h>
+#endif
+
 /* helper to allow us to interrupt sleep() on Windows*/
 static HANDLE hInterruptEvent = NULL;
 static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
@@ -973,7 +977,9 @@
        If Ctrl+C event delivered while not sleeping
        it will be ignored.
     */
+#ifdef WITH_THREAD
     main_thread = PyThread_get_thread_ident();
+#endif
     hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
     SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
 #endif /* MS_WINDOWS */
@@ -1075,8 +1081,11 @@
          * by Guido, only the main thread can be interrupted.
          */
         ul_millis = (unsigned long)millisecs;
-        if (ul_millis == 0 ||
-            main_thread != PyThread_get_thread_ident())
+        if (ul_millis == 0
+#ifdef WITH_THREAD
+            || main_thread != PyThread_get_thread_ident()
+#endif
+           )
             Sleep(ul_millis);
         else {
             DWORD rc;
diff -ubBr Python-2.7.18.orig/Modules/xxsubtype.c Python-2.7.18/Modules/xxsubtype.c
--- Python-2.7.18.orig/Modules/xxsubtype.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Modules/xxsubtype.c	2021-08-21 15:42:18.001177094 +0200
@@ -1,6 +1,10 @@
 #include "Python.h"
 #include "structmember.h"
 
+#ifndef CLOCKS_PER_SEC
+#include <bits/time.h>
+#endif
+
 PyDoc_STRVAR(xxsubtype__doc__,
 "xxsubtype is an example module showing how to subtype builtin types from C.\n"
 "test_descr.py in the standard test suite requires it in order to complete.\n"
diff -ubBr Python-2.7.18.orig/Objects/exceptions.c Python-2.7.18/Objects/exceptions.c
--- Python-2.7.18.orig/Objects/exceptions.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Objects/exceptions.c	2021-08-21 15:42:18.001177094 +0200
@@ -818,7 +818,7 @@
  *    WindowsError extends OSError
  */
 #ifdef MS_WINDOWS
-#include "errmap.h"
+#include "PC/errmap.h"
 
 static int
 WindowsError_clear(PyWindowsErrorObject *self)
diff -ubBr Python-2.7.18.orig/Python/dynload_shlib.c Python-2.7.18/Python/dynload_shlib.c
--- Python-2.7.18.orig/Python/dynload_shlib.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Python/dynload_shlib.c	2021-08-21 15:42:18.005177091 +0200
@@ -32,7 +32,7 @@
 
 
 const struct filedescr _PyImport_DynLoadFiletab[] = {
-#ifdef __CYGWIN__
+#if defined(__CYGWIN__) || defined(__MINGW32__)
     {".dll", "rb", C_EXTENSION},
     {"module.dll", "rb", C_EXTENSION},
 #else
diff -ubBr Python-2.7.18.orig/Python/dynload_win.c Python-2.7.18/Python/dynload_win.c
--- Python-2.7.18.orig/Python/dynload_win.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Python/dynload_win.c	2021-08-21 15:42:18.005177091 +0200
@@ -1,7 +1,112 @@
 
 /* Support for dynamic loading of extension modules */
 
+/*
+Entry point for the Windows NT DLL.
+
+About the only reason for having this, is so initall() can automatically
+be called, removing that burden (and possible source of frustration if 
+forgotten) from the programmer.
+
+*/
+
 #include "Python.h"
+#include "windows.h"
+
+#ifdef Py_ENABLE_SHARED
+char dllVersionBuffer[16] = ""; // a private buffer
+
+// Python Globals
+HMODULE PyWin_DLLhModule = NULL;
+const char *PyWin_DLLVersionString = dllVersionBuffer;
+
+// Windows "Activation Context" work:
+// Our .pyd extension modules are generally built without a manifest (ie,
+// those included with Python and those built with a default distutils.
+// This requires we perform some "activation context" magic when loading our
+// extensions.  In summary:
+// * As our DLL loads we save the context being used.
+// * Before loading our extensions we re-activate our saved context.
+// * After extension load is complete we restore the old context.
+// As an added complication, this magic only works on XP or later - we simply
+// use the existence (or not) of the relevant function pointers from kernel32.
+// See bug 4566 (http://python.org/sf/4566) for more details.
+
+typedef BOOL (WINAPI * PFN_GETCURRENTACTCTX)(HANDLE *);
+typedef BOOL (WINAPI * PFN_ACTIVATEACTCTX)(HANDLE, ULONG_PTR *);
+typedef BOOL (WINAPI * PFN_DEACTIVATEACTCTX)(DWORD, ULONG_PTR);
+typedef BOOL (WINAPI * PFN_ADDREFACTCTX)(HANDLE);
+typedef BOOL (WINAPI * PFN_RELEASEACTCTX)(HANDLE);
+
+// locals and function pointers for this activation context magic.
+static HANDLE PyWin_DLLhActivationContext = NULL; // one day it might be public
+static PFN_GETCURRENTACTCTX pfnGetCurrentActCtx = NULL;
+static PFN_ACTIVATEACTCTX pfnActivateActCtx = NULL;
+static PFN_DEACTIVATEACTCTX pfnDeactivateActCtx = NULL;
+static PFN_ADDREFACTCTX pfnAddRefActCtx = NULL;
+static PFN_RELEASEACTCTX pfnReleaseActCtx = NULL;
+
+void _LoadActCtxPointers()
+{
+	HINSTANCE hKernel32 = GetModuleHandleW(L"kernel32.dll");
+	if (hKernel32)
+		pfnGetCurrentActCtx = (PFN_GETCURRENTACTCTX) GetProcAddress(hKernel32, "GetCurrentActCtx");
+	// If we can't load GetCurrentActCtx (ie, pre XP) , don't bother with the rest.
+	if (pfnGetCurrentActCtx) {
+		pfnActivateActCtx = (PFN_ACTIVATEACTCTX) GetProcAddress(hKernel32, "ActivateActCtx");
+		pfnDeactivateActCtx = (PFN_DEACTIVATEACTCTX) GetProcAddress(hKernel32, "DeactivateActCtx");
+		pfnAddRefActCtx = (PFN_ADDREFACTCTX) GetProcAddress(hKernel32, "AddRefActCtx");
+		pfnReleaseActCtx = (PFN_RELEASEACTCTX) GetProcAddress(hKernel32, "ReleaseActCtx");
+	}
+}
+
+ULONG_PTR _Py_ActivateActCtx()
+{
+	ULONG_PTR ret = 0;
+	if (PyWin_DLLhActivationContext && pfnActivateActCtx)
+		if (!(*pfnActivateActCtx)(PyWin_DLLhActivationContext, &ret)) {
+			OutputDebugString("Python failed to activate the activation context before loading a DLL\n");
+			ret = 0; // no promise the failing function didn't change it!
+		}
+	return ret;
+}
+
+void _Py_DeactivateActCtx(ULONG_PTR cookie)
+{
+	if (cookie && pfnDeactivateActCtx)
+		if (!(*pfnDeactivateActCtx)(0, cookie))
+			OutputDebugString("Python failed to de-activate the activation context\n");
+}
+
+BOOL	WINAPI	DllMain (HANDLE hInst, 
+						ULONG ul_reason_for_call,
+						LPVOID lpReserved)
+{
+	switch (ul_reason_for_call)
+	{
+		case DLL_PROCESS_ATTACH:
+			PyWin_DLLhModule = hInst;
+			// 1000 is a magic number I picked out of the air.  Could do with a #define, I spose...
+			LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer));
+
+			// and capture our activation context for use when loading extensions.
+			_LoadActCtxPointers();
+			if (pfnGetCurrentActCtx && pfnAddRefActCtx)
+				if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext))
+					if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext))
+						OutputDebugString("Python failed to load the default activation context\n");
+			break;
+
+		case DLL_PROCESS_DETACH:
+			if (pfnReleaseActCtx)
+				(*pfnReleaseActCtx)(PyWin_DLLhActivationContext);
+			break;
+	}
+	return TRUE;
+}
+
+#endif /* Py_ENABLE_SHARED */
+
 
 #ifdef HAVE_DIRECT_H
 #include <direct.h>
@@ -28,6 +133,9 @@
 /* Case insensitive string compare, to avoid any dependencies on particular
    C RTL implementations */
 
+#ifdef __MINGW32__
+#define strcasecmp py_strcasecmp
+#endif
 static int strcasecmp (char *string1, char *string2)
 {
     int first, second;
diff -ubBr Python-2.7.18.orig/Python/frozenmain.c Python-2.7.18/Python/frozenmain.c
--- Python-2.7.18.orig/Python/frozenmain.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Python/frozenmain.c	2021-08-21 15:42:18.005177091 +0200
@@ -3,7 +3,7 @@
 
 #include "Python.h"
 
-#ifdef MS_WINDOWS
+#if defined (MS_WINDOWS) && ! defined (__MINGW32__)
 extern void PyWinFreeze_ExeInit(void);
 extern void PyWinFreeze_ExeTerm(void);
 extern int PyInitFrozenExtensions(void);
@@ -32,13 +32,13 @@
         setbuf(stderr, (char *)NULL);
     }
 
-#ifdef MS_WINDOWS
+#if defined (MS_WINDOWS) && ! defined (__MINGW32__)
     PyInitFrozenExtensions();
 #endif /* MS_WINDOWS */
     if (argc >= 1)
         Py_SetProgramName(argv[0]);
     Py_Initialize();
-#ifdef MS_WINDOWS
+#if defined (MS_WINDOWS) && ! defined (__MINGW32__)
     PyWinFreeze_ExeInit();
 #endif
 
@@ -61,7 +61,7 @@
     if (inspect && isatty((int)fileno(stdin)))
         sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
 
-#ifdef MS_WINDOWS
+#if defined (MS_WINDOWS) && ! defined (__MINGW32__)
     PyWinFreeze_ExeTerm();
 #endif
     Py_Finalize();
diff -ubBr Python-2.7.18.orig/Python/pythonrun.c Python-2.7.18/Python/pythonrun.c
--- Python-2.7.18.orig/Python/pythonrun.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Python/pythonrun.c	2021-08-21 15:42:18.005177091 +0200
@@ -37,6 +37,16 @@
 #include "windows.h"
 #endif
 
+#ifdef __MINGW32__
+#include <minwindef.h>
+#include <libloaderapi.h>
+#endif
+
+#ifdef __MINGW32__
+#include <minwindef.h>
+#include <libloaderapi.h>
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -698,12 +708,43 @@
     default_home = home;
 }
 
+#ifdef __MINGW32__
+static char *
+get_home_path(void)
+{
+    static char path[MAX_PATH*2];
+    HMODULE hm = NULL;
+
+    if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | 
+        GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+       (LPCSTR) &Py_SetPythonHome, &hm) == 0)
+    {
+        return NULL;
+    }
+    if (GetModuleFileName(hm, path, sizeof(path)) == 0)
+    {
+        return NULL;
+    }
+    char *p = strstr(path, "\\bin\\");
+    if (p)
+        *p = '\0';
+    return path;
+}
+#endif
+
 char *
 Py_GetPythonHome(void)
 {
     char *home = default_home;
     if (home == NULL && !Py_IgnoreEnvironmentFlag)
         home = Py_GETENV("PYTHONHOME");
+#ifdef __MINGW32__
+    if (home == NULL) {
+        char *path = get_home_path();
+        if (path)
+            home = path;
+    }
+#endif
     return home;
 }
 
diff -ubBr Python-2.7.18.orig/Python/thread.c Python-2.7.18/Python/thread.c
--- Python-2.7.18.orig/Python/thread.c	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/Python/thread.c	2021-08-21 15:42:18.005177091 +0200
@@ -61,6 +61,13 @@
 
 #endif /* _POSIX_THREADS */
 
+#ifdef __MINGW32__
+#ifdef _POSIX_THREADS
+#undef _POSIX_THREADS
+#endif
+#define NT_THREADS
+#endif
+
 
 #ifdef Py_DEBUG
 static int thread_debug = 0;
diff -ubBr Python-2.7.18.orig/README Python-2.7.18/README
--- Python-2.7.18.orig/README	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/README	2021-08-21 15:42:18.005177091 +0200
@@ -1177,6 +1177,37 @@
 do this.
 
 
+Cross Compiling
+---------------
+
+Python can be cross compiled by supplying different --build and --host
+parameters to configure.  Python is compiled on the "build" system and
+executed on the "host" system.  Cross compiling python requires a
+native Python on the build host, and a natively compiled tool `Pgen'.
+
+Before cross compiling, Python must first be compiled and installed on
+the build host.  The configure script will use `cc' and `python', or
+environment variables CC_FOR_BUILD or PYTHON_FOR_BUILD, eg:
+
+   CC_FOR_BUILD=gcc-3.3 \
+   PYTHON_FOR_BUILD=python2.4 \
+   .../configure --build=i686-linux --host=i586-mingw32
+
+Cross compiling has been tested under linux, mileage may vary for
+other platforms.
+
+A few reminders on using configure to cross compile:
+- Cross compile tools must be in PATH,
+- Cross compile tools must be prefixed with the host type
+  (ie i586-mingw32-gcc, i586-mingw32-ranlib, ...),
+- CC, CXX, AR, and RANLIB must be undefined when running configure,
+  they will be auto-detected.
+
+If you need a cross compiler, Debian ships several several (eg: avr,
+m68hc1x, mingw32), while dpkg-cross easily creates others.  Otherwise,
+check out Dan Kegel's crosstool: http://www.kegel.com/crosstool .
+
+
 Miscellaneous issues
 ====================
 
diff -ubBr Python-2.7.18.orig/setup.py Python-2.7.18/setup.py
--- Python-2.7.18.orig/setup.py	2020-04-19 23:13:39.000000000 +0200
+++ Python-2.7.18/setup.py	2021-08-21 15:49:52.540963628 +0200
@@ -35,6 +35,10 @@
 # This global variable is used to hold the list of modules to be disabled.
 disabled_module_list = []
 
+import sysconfig
+sysconfig.get_config_vars().update(os.environ)
+
+
 def add_dir_to_list(dirlist, dir):
     """Add the directory 'dir' to the list 'dirlist' (at the front) if
     1) 'dir' is not already in 'dirlist'
@@ -240,6 +244,8 @@
         # Fix up the autodetected modules, prefixing all the source files
         # with Modules/ and adding Python's include directory to the path.
         (srcdir,) = sysconfig.get_config_vars('srcdir')
+        if os.environ.get('CROSS_COMPILING') == 'yes':
+            srcdir = os.environ.get('SRCDIR')
         if not srcdir:
             # Maybe running on Windows but not using CYGWIN?
             raise ValueError("No source directory; cannot proceed.")
@@ -382,6 +388,10 @@
             self.announce('WARNING: skipping import check for Cygwin-based "%s"'
                 % ext.name)
             return
+        if os.environ.get('CROSS_COMPILING') == 'yes':
+            self.announce('WARNING: skipping import check for cross compiled "%s"'
+                % ext.name)
+            return
         ext_filename = os.path.join(
             self.build_lib,
             self.get_ext_filename(self.get_ext_fullname(ext.name)))
@@ -499,6 +509,16 @@
         finally:
             os.unlink(tmpfile)
 
+    def get_platform(self):
+        # Get value of target's sys.platform
+        p = sys.platform
+        if os.environ.get('CROSS_COMPILING') == 'yes':
+            p = os.environ.get('CROSS_TARGET')
+        for platform in ['cygwin', 'mingw', 'beos', 'darwin', 'atheos', 'osf1']:
+            if p.startswith(platform):
+                return platform
+        return p
+
     def detect_modules(self):
         # Ensure that /usr/local is always used
         if not cross_compiling:
@@ -2148,6 +2168,8 @@
 
         elif host_platform.startswith('hp-ux'):
             extra_link_args.append('-fPIC')
+        elif host_platform.startswith('mingw'):
+            extra_link_args.append('-ldl')
 
         ext = Extension('_ctypes',
                         include_dirs=include_dirs,
@@ -2260,6 +2282,8 @@
     # mode 755. All installed directories will get mode 755.
 
     so_ext = sysconfig.get_config_var("SO")
+    if os.environ.get('CROSS_COMPILING') == 'yes':
+        so_ext = os.environ.get('SO')
 
     def install(self):
         outfiles = install_lib.install(self)
openSUSE Build Service is sponsored by