Commits

Mike Gilbert committed eadd932

Add 2.7.6 patches

  • Participants
  • Parent commits a1d73d0
  • Branches 2.7.10, 2.7.6 3
    1. 2.7.7
    2. 2.7.8
    3. 2.7.9
  • Tags 2.7.6-0

Comments (0)

Files changed (12)

File patches/01_all_static_library_location.patch

+Install libpythonX.Y.a in /usr/lib instead of /usr/lib/pythonX.Y/config.
+https://bugs.gentoo.org/show_bug.cgi?id=252372
+http://bugs.python.org/issue6103
+
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -891,6 +891,19 @@
+ 		fi; \
+ 	else	true; \
+ 	fi
++	@if test -f $(LIBRARY) && test $(LIBRARY) != $(LDLIBRARY); then \
++		if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
++			if test "$(SO)" = .dll; then \
++				$(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBDIR); \
++			else \
++				$(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBDIR); \
++				$(RANLIB) $(DESTDIR)$(LIBDIR)/$(LIBRARY); \
++			fi; \
++		else \
++			echo "Skipped install of $(LIBRARY) - use make frameworkinstall"; \
++		fi; \
++	else	true; \
++	fi
+ 
+ # Install the versioned manual page
+ altmaninstall:
+@@ -1084,18 +1097,6 @@
+ 		else	true; \
+ 		fi; \
+ 	done
+-	@if test -d $(LIBRARY); then :; else \
+-		if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+-			if test "$(SO)" = .dll; then \
+-				$(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
+-			else \
+-				$(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+-				$(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+-			fi; \
+-		else \
+-			echo Skip install of $(LIBRARY) - use make frameworkinstall; \
+-		fi; \
+-	fi
+ 	$(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
+ 	$(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ 	$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
+--- Misc/python-config.in
++++ Misc/python-config.in
+@@ -46,11 +46,7 @@
+     elif opt in ('--libs', '--ldflags'):
+         libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
+         libs.append('-lpython'+pyver)
+-        # add the prefix/lib/pythonX.Y/config dir, but only if there is no
+-        # shared library in prefix/lib/.
+         if opt == '--ldflags':
+-            if not getvar('Py_ENABLE_SHARED'):
+-                libs.insert(0, '-L' + getvar('LIBPL'))
+             if not getvar('PYTHONFRAMEWORK'):
+                 libs.extend(getvar('LINKFORSHARED').split())
+         print ' '.join(libs)
+--- Modules/makesetup
++++ Modules/makesetup
+@@ -89,7 +89,7 @@
+ 	 then
+ 	 	ExtraLibDir=.
+ 	 else
+-	 	ExtraLibDir='$(LIBPL)'
++	 	ExtraLibDir='$(LIBDIR)'
+ 	 fi
+ 	 ExtraLibs="-L$ExtraLibDir -lpython\$(VERSION)";;
+ esac

File patches/02_all_disable_modules_and_ssl.patch

+--- setup.py
++++ setup.py
+@@ -33,7 +33,18 @@
+ COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
+ 
+ # This global variable is used to hold the list of modules to be disabled.
+-disabled_module_list = []
++pdm_env = "PYTHON_DISABLE_MODULES"
++if pdm_env in os.environ:
++    disabled_module_list = os.environ[pdm_env].split()
++else:
++    disabled_module_list = []
++
++pds_env = "PYTHON_DISABLE_SSL"
++if pds_env in os.environ:
++    disable_ssl = os.environ[pds_env]
++else:
++    disable_ssl = 0
++ 
+ 
+ def add_dir_to_list(dirlist, dir):
+     """Add the directory 'dir' to the list 'dirlist' (at the front) if
+@@ -436,6 +447,7 @@
+             os.unlink(tmpfile)
+ 
+     def detect_modules(self):
++        global disable_ssl
+         # Ensure that /usr/local is always used
+         if not cross_compiling:
+             add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
+@@ -791,7 +803,7 @@
+         ssl_incs = find_file('openssl/ssl.h', inc_dirs,
+                              search_for_ssl_incs_in
+                              )
+-        if ssl_incs is not None:
++        if ssl_incs is not None and not disable_ssl:
+             krb5_h = find_file('krb5.h', inc_dirs,
+                                ['/usr/kerberos/include'])
+             if krb5_h:
+@@ -802,7 +814,8 @@
+                                      ] )
+ 
+         if (ssl_incs is not None and
+-            ssl_libs is not None):
++            ssl_libs is not None and
++            not disable_ssl):
+             exts.append( Extension('_ssl', ['_ssl.c'],
+                                    include_dirs = ssl_incs,
+                                    library_dirs = ssl_libs,
+@@ -834,7 +847,7 @@
+                 pass
+ 
+         min_openssl_ver = 0x00907000
+-        have_any_openssl = ssl_incs is not None and ssl_libs is not None
++        have_any_openssl = ssl_incs is not None and ssl_libs is not None and not disable_ssl
+         have_usable_openssl = (have_any_openssl and
+                                openssl_ver >= min_openssl_ver)
+ 
+@@ -850,21 +863,20 @@
+                 print ("warning: openssl 0x%08x is too old for _hashlib" %
+                        openssl_ver)
+                 missing.append('_hashlib')
+-        if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
+-            # The _sha module implements the SHA1 hash algorithm.
+-            exts.append( Extension('_sha', ['shamodule.c']) )
+-            # The _md5 module implements the RSA Data Security, Inc. MD5
+-            # Message-Digest Algorithm, described in RFC 1321.  The
+-            # necessary files md5.c and md5.h are included here.
+-            exts.append( Extension('_md5',
+-                            sources = ['md5module.c', 'md5.c'],
+-                            depends = ['md5.h']) )
+-
+-        min_sha2_openssl_ver = 0x00908000
+-        if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
+-            # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
+-            exts.append( Extension('_sha256', ['sha256module.c']) )
+-            exts.append( Extension('_sha512', ['sha512module.c']) )
++
++        ### Build these unconditionally so emerge won't fail
++        ### when openssl is dropped/broken etc.
++        # The _sha module implements the SHA1 hash algorithm.
++        exts.append( Extension('_sha', ['shamodule.c']) )
++        # The _md5 module implements the RSA Data Security, Inc. MD5
++        # Message-Digest Algorithm, described in RFC 1321.  The
++        # necessary files md5.c and md5.h are included here.
++        exts.append( Extension('_md5',
++                        sources = ['md5module.c', 'md5.c'],
++                        depends = ['md5.h']) )
++
++        exts.append( Extension('_sha256', ['sha256module.c']) )
++        exts.append( Extension('_sha512', ['sha512module.c']) )
+ 
+         # Modules that provide persistent dictionary-like semantics.  You will
+         # probably want to arrange for at least one of them to be available on

File patches/03_all_libdir.patch

+--- Lib/distutils/command/install.py
++++ Lib/distutils/command/install.py
+@@ -41,8 +41,8 @@
+ 
+ INSTALL_SCHEMES = {
+     'unix_prefix': {
+-        'purelib': '$base/lib/python$py_version_short/site-packages',
+-        'platlib': '$platbase/lib/python$py_version_short/site-packages',
++        'purelib': '$base/@@GENTOO_LIBDIR@@/python$py_version_short/site-packages',
++        'platlib': '$platbase/@@GENTOO_LIBDIR@@/python$py_version_short/site-packages',
+         'headers': '$base/include/python$py_version_short/$dist_name',
+         'scripts': '$base/bin',
+         'data'   : '$base',
+--- Lib/distutils/sysconfig.py
++++ Lib/distutils/sysconfig.py
+@@ -120,7 +120,7 @@
+ 
+     if os.name == "posix":
+         libpython = os.path.join(prefix,
+-                                 "lib", "python" + get_python_version())
++                                 "@@GENTOO_LIBDIR@@", "python" + get_python_version())
+         if standard_lib:
+             return libpython
+         else:
+--- Lib/site.py
++++ Lib/site.py
+@@ -288,10 +288,10 @@
+         if sys.platform in ('os2emx', 'riscos'):
+             sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
+         elif os.sep == '/':
+-            sitepackages.append(os.path.join(prefix, "lib",
++            sitepackages.append(os.path.join(prefix, "@@GENTOO_LIBDIR@@",
+                                         "python" + sys.version[:3],
+                                         "site-packages"))
+-            sitepackages.append(os.path.join(prefix, "lib", "site-python"))
++            sitepackages.append(os.path.join(prefix, "@@GENTOO_LIBDIR@@", "site-python"))
+         else:
+             sitepackages.append(prefix)
+             sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
+--- Lib/sysconfig.py
++++ Lib/sysconfig.py
+@@ -7,10 +7,10 @@
+ 
+ _INSTALL_SCHEMES = {
+     'posix_prefix': {
+-        'stdlib': '{base}/lib/python{py_version_short}',
+-        'platstdlib': '{platbase}/lib/python{py_version_short}',
+-        'purelib': '{base}/lib/python{py_version_short}/site-packages',
+-        'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
++        'stdlib': '{base}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'platstdlib': '{platbase}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'purelib': '{base}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
++        'platlib': '{platbase}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
+         'include': '{base}/include/python{py_version_short}',
+         'platinclude': '{platbase}/include/python{py_version_short}',
+         'scripts': '{base}/bin',
+@@ -65,10 +65,10 @@
+         'data'   : '{userbase}',
+         },
+     'posix_user': {
+-        'stdlib': '{userbase}/lib/python{py_version_short}',
+-        'platstdlib': '{userbase}/lib/python{py_version_short}',
+-        'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
+-        'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
++        'stdlib': '{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'platstdlib': '{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'purelib': '{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
++        'platlib': '{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
+         'include': '{userbase}/include/python{py_version_short}',
+         'scripts': '{userbase}/bin',
+         'data'   : '{userbase}',
+--- Lib/test/test_site.py
++++ Lib/test/test_site.py
+@@ -242,10 +242,10 @@
+         elif os.sep == '/':
+             # OS X non-framwework builds, Linux, FreeBSD, etc
+             self.assertEqual(len(dirs), 2)
+-            wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3],
++            wanted = os.path.join('xoxo', '@@GENTOO_LIBDIR@@', 'python' + sys.version[:3],
+                                   'site-packages')
+             self.assertEqual(dirs[0], wanted)
+-            wanted = os.path.join('xoxo', 'lib', 'site-python')
++            wanted = os.path.join('xoxo', '@@GENTOO_LIBDIR@@', 'site-python')
+             self.assertEqual(dirs[1], wanted)
+         else:
+             # other platforms
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -106,7 +106,7 @@
+ MANDIR=		@mandir@
+ INCLUDEDIR=	@includedir@
+ CONFINCLUDEDIR=	$(exec_prefix)/include
+-SCRIPTDIR=	$(prefix)/lib
++SCRIPTDIR=	$(prefix)/@@GENTOO_LIBDIR@@
+ 
+ # Detailed destination directories
+ BINLIBDEST=	$(LIBDIR)/python$(VERSION)
+--- Modules/getpath.c
++++ Modules/getpath.c
+@@ -129,7 +129,7 @@
+ static char exec_prefix[MAXPATHLEN+1];
+ static char progpath[MAXPATHLEN+1];
+ static char *module_search_path = NULL;
+-static char lib_python[] = "lib/python" VERSION;
++static char lib_python[] = "@@GENTOO_LIBDIR@@/python" VERSION;
+ 
+ static void
+ reduce(char *dir)
+@@ -543,7 +543,7 @@
+     }
+     else
+         strncpy(zip_path, PREFIX, MAXPATHLEN);
+-    joinpath(zip_path, "lib/python00.zip");
++    joinpath(zip_path, "@@GENTOO_LIBDIR@@/python00.zip");
+     bufsz = strlen(zip_path);   /* Replace "00" with version */
+     zip_path[bufsz - 6] = VERSION[0];
+     zip_path[bufsz - 5] = VERSION[2];
+@@ -553,7 +553,7 @@
+             fprintf(stderr,
+                 "Could not find platform dependent libraries <exec_prefix>\n");
+         strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN);
+-        joinpath(exec_prefix, "lib/lib-dynload");
++        joinpath(exec_prefix, "@@GENTOO_LIBDIR@@/lib-dynload");
+     }
+     /* If we found EXEC_PREFIX do *not* reduce it!  (Yet.) */
+ 
+--- Modules/Setup.dist
++++ Modules/Setup.dist
+@@ -464,7 +464,7 @@
+ # 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)/@@GENTOO_LIBDIR@@ -lz
+ 
+ # Interface to the Expat XML parser
+ #
+--- setup.py
++++ setup.py
+@@ -517,8 +517,7 @@
+                 ):
+                 add_dir_to_list(inc_dirs, d)
+             for d in (
+-                '/lib64', '/usr/lib64',
+-                '/lib', '/usr/lib',
++                '/@@GENTOO_LIBDIR@@', '/usr/@@GENTOO_LIBDIR@@',
+                 ):
+                 add_dir_to_list(lib_dirs, d)
+         exts = []
+@@ -770,11 +769,11 @@
+             elif curses_library:
+                 readline_libs.append(curses_library)
+             elif self.compiler.find_library_file(lib_dirs +
+-                                                     ['/usr/lib/termcap'],
++                                                     ['/usr/@@GENTOO_LIBDIR@@/termcap'],
+                                                      'termcap'):
+                 readline_libs.append('termcap')
+             exts.append( Extension('readline', ['readline.c'],
+-                                   library_dirs=['/usr/lib/termcap'],
++                                   library_dirs=['/usr/@@GENTOO_LIBDIR@@/termcap'],
+                                    extra_link_args=readline_extra_link_args,
+                                    libraries=readline_libs) )
+         else:

File patches/04_all_non-zero_exit_status_on_failure.patch

+https://bugs.gentoo.org/show_bug.cgi?id=281968
+http://bugs.python.org/issue6731
+
+--- setup.py
++++ setup.py
+@@ -46,6 +46,8 @@
+     disable_ssl = 0
+  
+ 
++exit_status = 0
++
+ 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'
+@@ -284,6 +286,8 @@
+             print
+ 
+         if self.failed:
++            global exit_status
++            exit_status = 1
+             failed = self.failed[:]
+             print
+             print "Failed to build these modules:"
+@@ -2237,6 +2241,7 @@
+                      'Tools/scripts/2to3',
+                      'Lib/smtpd.py']
+         )
++    sys.exit(exit_status)
+ 
+ # --install-platlib
+ if __name__ == '__main__':

File patches/05_all_loadable_sqlite_extensions.patch

+https://bugs.gentoo.org/show_bug.cgi?id=335505
+http://bugs.python.org/issue10268
+
+--- configure.ac
++++ configure.ac
+@@ -2317,6 +2317,15 @@
+   TCLTK_LIBS="$with_tcltk_libs"
+ fi
+ 
++# Check for support for loadable sqlite extensions
++AC_MSG_CHECKING(for --enable-loadable-sqlite-extensions)
++AC_ARG_ENABLE(loadable-sqlite-extensions,
++              AS_HELP_STRING([--enable-loadable-sqlite-extensions], [support loadable extensions in _sqlite module]),
++              [],
++              [enable_loadable_sqlite_extensions="no"])
++
++AC_MSG_RESULT($enable_loadable_sqlite_extensions)
++
+ # Check for --with-dbmliborder
+ AC_MSG_CHECKING(for --with-dbmliborder)
+ AC_ARG_WITH(dbmliborder,
+--- setup.py
++++ setup.py
+@@ -1184,8 +1184,10 @@
+             else:
+                 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
+ 
+-            # Comment this out if you want the sqlite3 module to be able to load extensions.
+-            sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
++            # Enable support for loadable extensions in the sqlite3 module
++            # if --enable-loadable-sqlite-extensions configure option is used.
++            if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
++                sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
+ 
+             if host_platform == 'darwin':
+                 # In every directory on the search path search for a dynamic

File patches/06_all_regenerate_platform-specific_modules.patch

+http://bugs.python.org/issue12619
+
+--- Lib/plat-aix4/regen
++++ Lib/plat-aix4/regen
+@@ -5,4 +5,4 @@
+         exit 1;;
+ esac
+ set -v
+-h2py.py -i '(u_long)' /usr/include/netinet/in.h
++python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/netinet/in.h
+--- Lib/plat-linux2/regen
++++ Lib/plat-linux2/regen
+@@ -5,4 +5,4 @@
+ 	exit 1;;
+ esac
+ set -v
+-h2py -i '(u_long)' /usr/include/sys/types.h /usr/include/netinet/in.h /usr/include/dlfcn.h
++python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/sys/types.h /usr/include/netinet/in.h /usr/include/dlfcn.h /usr/include/linux/cdrom.h
+--- Lib/plat-sunos5/regen
++++ Lib/plat-sunos5/regen
+@@ -5,5 +5,4 @@
+ 	exit 1;;
+ esac
+ set -v
+-h2py -i '(u_long)' /usr/include/sys/types.h /usr/include/netinet/in.h /usr/include/sys/stropts.h /usr/include/dlfcn.h
+-
++python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/sys/types.h /usr/include/netinet/in.h /usr/include/sys/stropts.h /usr/include/dlfcn.h
+--- Lib/plat-unixware7/regen
++++ Lib/plat-unixware7/regen
+@@ -5,5 +5,5 @@
+ 	exit 1;;
+ esac
+ set -v
+-h2py -i '(u_long)' /usr/include/netinet/in.h
+-h2py /usr/include/sys/stropts.h
++python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/netinet/in.h
++python$EXE ../../Tools/scripts/h2py.py /usr/include/sys/stropts.h
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -405,7 +405,7 @@
+ 
+ # Default target
+ all:		build_all
+-build_all:	$(BUILDPYTHON) oldsharedmods sharedmods gdbhooks
++build_all:	$(BUILDPYTHON) oldsharedmods sharedmods platformspecificmods gdbhooks
+ 
+ # Compile a binary with gcc profile guided optimization.
+ profile-opt:
+@@ -463,6 +463,32 @@
+ 		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
+ 		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
+ 
++# Build the platform-specific modules
++platformspecificmods: $(BUILDPYTHON) sharedmods
++	@PLATDIR=$(PLATDIR); \
++	if test ! -f $(srcdir)/Lib/$(PLATDIR)/regen; then \
++		$(INSTALL) -d $(srcdir)/Lib/$(PLATDIR); \
++		if test -f $(srcdir)/Lib/$${PLATDIR%?}/regen; then \
++			cp $(srcdir)/Lib/$${PLATDIR%?}/regen $(srcdir)/Lib/$(PLATDIR)/regen; \
++		else \
++			cp $(srcdir)/Lib/plat-generic/regen $(srcdir)/Lib/$(PLATDIR)/regen; \
++		fi \
++	fi
++	@EXE="$(BUILDEXE)"; export EXE; \
++	PATH="`pwd`:$$PATH"; export PATH; \
++	PYTHONPATH="$(srcdir)/Lib:$(abs_builddir)/`cat pybuilddir.txt`"; export PYTHONPATH; \
++	if [ -n "$(MULTIARCH)" ]; then MULTIARCH=$(MULTIARCH); export MULTIARCH; fi; \
++	if [ "$(build)" = "$(host)" ]; then \
++	  PYTHON_FOR_BUILD="$(BUILDPYTHON)"; \
++	else \
++	  PYTHON_FOR_BUILD="$(PYTHON_FOR_BUILD)"; \
++	fi; export PYTHON_FOR_BUILD; \
++	cd $(srcdir)/Lib/$(PLATDIR); \
++	$(RUNSHARED) ./regen || exit 1; \
++	for module in *.py; do \
++		$(RUNSHARED) $(BUILDPYTHON) -c "with open('$$module', 'rb') as module: compile(module.read(), '$$module', 'exec')" || exit 1; \
++	done
++
+ # Build static library
+ # avoid long command lines, same as LIBRARY_OBJS
+ $(LIBRARY): $(LIBRARY_OBJS)
+@@ -958,7 +984,7 @@
+ 		unittest unittest/test \
+ 		lib-old \
+ 		curses pydoc_data $(MACHDEPS)
+-libinstall:	build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
++libinstall:	build_all $(srcdir)/Modules/xxmodule.c
+ 	@for i in $(SCRIPTDIR) $(LIBDEST); \
+ 	do \
+ 		if test ! -d $(DESTDIR)$$i; then \
+@@ -1041,23 +1067,6 @@
+ 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+ 		$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
+ 
+-# Create the PLATDIR source directory, if one wasn't distributed..
+-$(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`"; \
+-	export EXE; EXE="$(BUILDEXE)"; \
+-	if [ -n "$(MULTIARCH)" ]; then export MULTIARCH; MULTIARCH=$(MULTIARCH); fi; \
+-	export PYTHON_FOR_BUILD; \
+-	if [ "$(build)" = "$(host)" ]; then \
+-	  PYTHON_FOR_BUILD="$(BUILDPYTHON)"; \
+-	else \
+-	  PYTHON_FOR_BUILD="$(PYTHON_FOR_BUILD)"; \
+-	fi; \
+-	cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen
+-
+ python-config: $(srcdir)/Misc/python-config.in
+ 	# Substitution happens here, as the completely-expanded BINDIR
+ 	# is not available in configure
+@@ -1350,7 +1359,7 @@
+ Python/thread.o: @THREADHEADERS@
+ 
+ # Declare targets that aren't real files
+-.PHONY: all build_all sharedmods oldsharedmods test quicktest memtest
++.PHONY: all build_all sharedmods oldsharedmods platformspecificmods test quicktest memtest
+ .PHONY: install altinstall oldsharedinstall bininstall altbininstall
+ .PHONY: maninstall libinstall inclinstall libainstall sharedinstall
+ .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure

File patches/21_all_distutils_c++.patch

+http://bugs.python.org/issue1222585
+
+--- Lib/distutils/cygwinccompiler.py
++++ Lib/distutils/cygwinccompiler.py
+@@ -117,8 +117,10 @@
+         # dllwrap 2.10.90 is buggy
+         if self.ld_version >= "2.10.90":
+             self.linker_dll = "gcc"
++            self.linker_dll_cxx = "g++"
+         else:
+             self.linker_dll = "dllwrap"
++            self.linker_dll_cxx = "dllwrap"
+ 
+         # ld_version >= "2.13" support -shared so use it instead of
+         # -mdll -static
+@@ -132,9 +134,13 @@
+         self.set_executables(compiler='gcc -mcygwin -O -Wall',
+                              compiler_so='gcc -mcygwin -mdll -O -Wall',
+                              compiler_cxx='g++ -mcygwin -O -Wall',
++                             compiler_so_cxx='g++ -mcygwin -mdll -O -Wall',
+                              linker_exe='gcc -mcygwin',
+                              linker_so=('%s -mcygwin %s' %
+-                                        (self.linker_dll, shared_option)))
++                                        (self.linker_dll, shared_option)),
++                             linker_exe_cxx='g++ -mcygwin',
++                             linker_so_cxx=('%s -mcygwin %s' %
++                                            (self.linker_dll_cxx, shared_option)))
+ 
+         # cygwin and mingw32 need different sets of libraries
+         if self.gcc_version == "2.91.57":
+@@ -160,8 +166,12 @@
+                 raise CompileError, msg
+         else: # for other files use the C-compiler
+             try:
+-                self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
+-                           extra_postargs)
++                if self.detect_language(src) == 'c++':
++                    self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] +
++                               extra_postargs)
++                else:
++                    self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
++                               extra_postargs)
+             except DistutilsExecError, msg:
+                 raise CompileError, msg
+ 
+@@ -327,9 +337,14 @@
+         self.set_executables(compiler='gcc%s -O -Wall' % no_cygwin,
+                              compiler_so='gcc%s -mdll -O -Wall' % no_cygwin,
+                              compiler_cxx='g++%s -O -Wall' % no_cygwin,
++                             compiler_so_cxx='g++%s -mdll -O -Wall' % no_cygwin,
+                              linker_exe='gcc%s' % no_cygwin,
+                              linker_so='%s%s %s %s'
+                                     % (self.linker_dll, no_cygwin,
++                                       shared_option, entry_point),
++                             linker_exe_cxx='g++%s' % no_cygwin,
++                             linker_so_cxx='%s%s %s %s'
++                                    % (self.linker_dll_cxx, no_cygwin,
+                                        shared_option, entry_point))
+         # Maybe we should also append -mthreads, but then the finished
+         # dlls need another dll (mingwm10.dll see Mingw32 docs)
+--- Lib/distutils/emxccompiler.py
++++ Lib/distutils/emxccompiler.py
+@@ -65,8 +65,12 @@
+         # XXX optimization, warnings etc. should be customizable.
+         self.set_executables(compiler='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
+                              compiler_so='gcc -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
++                             compiler_cxx='g++ -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
++                             compiler_so_cxx='g++ -Zomf -Zmt -O3 -fomit-frame-pointer -mprobe -Wall',
+                              linker_exe='gcc -Zomf -Zmt -Zcrtdll',
+-                             linker_so='gcc -Zomf -Zmt -Zcrtdll -Zdll')
++                             linker_so='gcc -Zomf -Zmt -Zcrtdll -Zdll',
++                             linker_exe_cxx='g++ -Zomf -Zmt -Zcrtdll',
++                             linker_so_cxx='g++ -Zomf -Zmt -Zcrtdll -Zdll')
+ 
+         # want the gcc library statically linked (so that we don't have
+         # to distribute a version dependent on the compiler we have)
+@@ -83,8 +87,12 @@
+                 raise CompileError, msg
+         else: # for other files use the C-compiler
+             try:
+-                self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
+-                           extra_postargs)
++                if self.detect_language(src) == 'c++':
++                    self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] +
++                               extra_postargs)
++                else:
++                    self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
++                               extra_postargs)
+             except DistutilsExecError, msg:
+                 raise CompileError, msg
+ 
+--- Lib/distutils/sysconfig.py
++++ Lib/distutils/sysconfig.py
+@@ -170,10 +170,12 @@
+                 _osx_support.customize_compiler(_config_vars)
+                 _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
+ 
+-        (cc, cxx, opt, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \
+-            get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
+-                            'CCSHARED', 'LDSHARED', 'SO', 'AR',
+-                            'ARFLAGS')
++        (cc, cxx, ccshared, ldshared, ldcxxshared, so_ext, ar, ar_flags) = \
++            get_config_vars('CC', 'CXX', 'CCSHARED', 'LDSHARED', 'LDCXXSHARED',
++                            'SO', 'AR', 'ARFLAGS')
++
++        cflags = ''
++        cxxflags = ''
+ 
+         if 'CC' in os.environ:
+             newcc = os.environ['CC']
+@@ -188,19 +190,27 @@
+             cxx = os.environ['CXX']
+         if 'LDSHARED' in os.environ:
+             ldshared = os.environ['LDSHARED']
++        if 'LDCXXSHARED' in os.environ:
++            ldcxxshared = os.environ['LDCXXSHARED']
+         if 'CPP' in os.environ:
+             cpp = os.environ['CPP']
+         else:
+             cpp = cc + " -E"           # not always
+         if 'LDFLAGS' in os.environ:
+             ldshared = ldshared + ' ' + os.environ['LDFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS']
+         if 'CFLAGS' in os.environ:
+-            cflags = opt + ' ' + os.environ['CFLAGS']
++            cflags = os.environ['CFLAGS']
+             ldshared = ldshared + ' ' + os.environ['CFLAGS']
++        if 'CXXFLAGS' in os.environ:
++            cxxflags = os.environ['CXXFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS']
+         if 'CPPFLAGS' in os.environ:
+             cpp = cpp + ' ' + os.environ['CPPFLAGS']
+             cflags = cflags + ' ' + os.environ['CPPFLAGS']
++            cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS']
+             ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS']
+         if 'AR' in os.environ:
+             ar = os.environ['AR']
+         if 'ARFLAGS' in os.environ:
+@@ -209,13 +219,17 @@
+             archiver = ar + ' ' + ar_flags
+ 
+         cc_cmd = cc + ' ' + cflags
++        cxx_cmd = cxx + ' ' + cxxflags
+         compiler.set_executables(
+             preprocessor=cpp,
+             compiler=cc_cmd,
+             compiler_so=cc_cmd + ' ' + ccshared,
+-            compiler_cxx=cxx,
++            compiler_cxx=cxx_cmd,
++            compiler_so_cxx=cxx_cmd + ' ' + ccshared,
+             linker_so=ldshared,
+             linker_exe=cc,
++            linker_so_cxx=ldcxxshared,
++            linker_exe_cxx=cxx,
+             archiver=archiver)
+ 
+         compiler.shared_lib_extension = so_ext
+--- Lib/distutils/unixccompiler.py
++++ Lib/distutils/unixccompiler.py
+@@ -55,14 +55,17 @@
+     # are pretty generic; they will probably have to be set by an outsider
+     # (eg. using information discovered by the sysconfig about building
+     # Python extensions).
+-    executables = {'preprocessor' : None,
+-                   'compiler'     : ["cc"],
+-                   'compiler_so'  : ["cc"],
+-                   'compiler_cxx' : ["cc"],
+-                   'linker_so'    : ["cc", "-shared"],
+-                   'linker_exe'   : ["cc"],
+-                   'archiver'     : ["ar", "-cr"],
+-                   'ranlib'       : None,
++    executables = {'preprocessor'    : None,
++                   'compiler'        : ["cc"],
++                   'compiler_so'     : ["cc"],
++                   'compiler_cxx'    : ["c++"],
++                   'compiler_so_cxx' : ["c++"],
++                   'linker_so'       : ["cc", "-shared"],
++                   'linker_exe'      : ["cc"],
++                   'linker_so_cxx'   : ["c++", "-shared"],
++                   'linker_exe_cxx'  : ["c++"],
++                   'archiver'        : ["ar", "-cr"],
++                   'ranlib'          : None,
+                   }
+ 
+     if sys.platform[:6] == "darwin":
+@@ -112,12 +115,19 @@
+ 
+     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
+         compiler_so = self.compiler_so
++        compiler_so_cxx = self.compiler_so_cxx
+         if sys.platform == 'darwin':
+             compiler_so = _osx_support.compiler_fixup(compiler_so,
+                                                     cc_args + extra_postargs)
++            compiler_so_cxx = _osx_support.compiler_fixup(compiler_so_cxx,
++                                                    cc_args + extra_postargs)
+         try:
+-            self.spawn(compiler_so + cc_args + [src, '-o', obj] +
+-                       extra_postargs)
++            if self.detect_language(src) == 'c++':
++                self.spawn(compiler_so_cxx + cc_args + [src, '-o', obj] +
++                           extra_postargs)
++            else:
++                self.spawn(compiler_so + cc_args + [src, '-o', obj] +
++                           extra_postargs)
+         except DistutilsExecError, msg:
+             raise CompileError, msg
+ 
+@@ -174,23 +184,16 @@
+                 ld_args.extend(extra_postargs)
+             self.mkpath(os.path.dirname(output_filename))
+             try:
+-                if target_desc == CCompiler.EXECUTABLE:
+-                    linker = self.linker_exe[:]
++                if target_lang == "c++":
++                    if target_desc == CCompiler.EXECUTABLE:
++                        linker = self.linker_exe_cxx[:]
++                    else:
++                        linker = self.linker_so_cxx[:]
+                 else:
+-                    linker = self.linker_so[:]
+-                if target_lang == "c++" and self.compiler_cxx:
+-                    # skip over environment variable settings if /usr/bin/env
+-                    # is used to set up the linker's environment.
+-                    # This is needed on OSX. Note: this assumes that the
+-                    # normal and C++ compiler have the same environment
+-                    # settings.
+-                    i = 0
+-                    if os.path.basename(linker[0]) == "env":
+-                        i = 1
+-                        while '=' in linker[i]:
+-                            i = i + 1
+-
+-                    linker[i] = self.compiler_cxx[i]
++                    if target_desc == CCompiler.EXECUTABLE:
++                        linker = self.linker_exe[:]
++                    else:
++                        linker = self.linker_so[:]
+ 
+                 if sys.platform == 'darwin':
+                     linker = _osx_support.compiler_fixup(linker, ld_args)
+--- Lib/_osx_support.py
++++ Lib/_osx_support.py
+@@ -14,13 +14,13 @@
+ # configuration variables that may contain universal build flags,
+ # like "-arch" or "-isdkroot", that may need customization for
+ # the user environment
+-_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS',
+-                            'BLDSHARED', 'LDSHARED', 'CC', 'CXX',
+-                            'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS',
+-                            'PY_CORE_CFLAGS')
++_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CPPFLAGS',
++                          'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'LDCXXSHARED',
++                          'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS',
++                          'PY_CPPFLAGS', 'PY_CORE_CFLAGS')
+ 
+ # configuration variables that may contain compiler calls
+-_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX')
++_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'LDCXXSHARED', 'CC', 'CXX')
+ 
+ # prefix added to original configuration variable names
+ _INITPRE = '_OSX_SUPPORT_INITIAL_'
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -459,7 +459,7 @@
+ 	    *\ -s*|s*) quiet="-q";; \
+ 	    *) quiet="";; \
+ 	esac; \
+-	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
++	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(CFLAGS)' \
+ 		_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
+ 		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
+ 

File patches/22_all_turkish_locale.patch

+--- Lib/email/__init__.py
++++ Lib/email/__init__.py
+@@ -109,15 +109,19 @@
+     'Text',
+     ]
+ 
++import string
++lower_map = string.maketrans(string.ascii_uppercase, string.ascii_lowercase)
++
++
+ for _name in _LOWERNAMES:
+-    importer = LazyImporter(_name.lower())
++    importer = LazyImporter(_name.translate(lower_map))
+     sys.modules['email.' + _name] = importer
+     setattr(sys.modules['email'], _name, importer)
+ 
+ 
+ import email.mime
+ for _name in _MIMENAMES:
+-    importer = LazyImporter('mime.' + _name.lower())
++    importer = LazyImporter('mime.' + _name.translate(lower_map))
+     sys.modules['email.MIME' + _name] = importer
+     setattr(sys.modules['email'], 'MIME' + _name, importer)
+     setattr(sys.modules['email.mime'], _name, importer)

File patches/23_all_arm_OABI.patch

+https://bugs.gentoo.org/show_bug.cgi?id=266703
+http://bugs.python.org/issue1762561
+
+--- Objects/floatobject.c
++++ Objects/floatobject.c
+@@ -1849,9 +1849,18 @@
+ /* this is for the benefit of the pack/unpack routines below */
+ 
+ typedef enum {
+-    unknown_format, ieee_big_endian_format, ieee_little_endian_format
++    unknown_format,
++    ieee_big_endian_format,
++    ieee_little_endian_format,
++    ieee_arm_mixed_endian_format
+ } float_format_type;
+ 
++/* byte order of a C double for each of the recognised IEEE formats */
++
++static const unsigned char BIG_ENDIAN_BYTEORDER[8] = {7,6,5,4,3,2,1,0};
++static const unsigned char LITTLE_ENDIAN_BYTEORDER[8] = {0,1,2,3,4,5,6,7};
++static const unsigned char ARM_MIXED_ENDIAN_BYTEORDER[8] = {4,5,6,7,0,1,2,3};
++
+ static float_format_type double_format, float_format;
+ static float_format_type detected_double_format, detected_float_format;
+ 
+@@ -1888,6 +1897,8 @@
+         return PyString_FromString("IEEE, little-endian");
+     case ieee_big_endian_format:
+         return PyString_FromString("IEEE, big-endian");
++    case ieee_arm_mixed_endian_format:
++        return PyString_FromString("IEEE, ARM mixed-endian");
+     default:
+         Py_FatalError("insane float_format or double_format");
+         return NULL;
+@@ -1901,8 +1912,9 @@
+ "used in Python's test suite.\n"
+ "\n"
+ "typestr must be 'double' or 'float'.  This function returns whichever of\n"
+-"'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n"
+-"format of floating point numbers used by the C type named by typestr.");
++"'unknown', 'IEEE, big-endian', 'IEEE, little-endian' or\n"
++"'IEEE, ARM mixed-endian' best describes the format of floating-point\n"
++"numbers used by the C type named by typestr.");
+ 
+ static PyObject *
+ float_setformat(PyTypeObject *v, PyObject* args)
+@@ -1940,11 +1952,15 @@
+     else if (strcmp(format, "IEEE, big-endian") == 0) {
+         f = ieee_big_endian_format;
+     }
++    else if (strcmp(format, "IEEE, ARM mixed-endian") == 0 &&
++             p == &double_format) {
++        f = ieee_arm_mixed_endian_format;
++    }
+     else {
+         PyErr_SetString(PyExc_ValueError,
+                         "__setformat__() argument 2 must be "
+-                        "'unknown', 'IEEE, little-endian' or "
+-                        "'IEEE, big-endian'");
++                        "'unknown', 'IEEE, little-endian', "
++                        "'IEEE, big-endian' or 'IEEE, ARM mixed-endian'");
+         return NULL;
+ 
+     }
+@@ -1967,8 +1983,10 @@
+ "used in Python's test suite.\n"
+ "\n"
+ "typestr must be 'double' or 'float'.  fmt must be one of 'unknown',\n"
+-"'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n"
+-"one of the latter two if it appears to match the underlying C reality.\n"
++"'IEEE, big-endian', 'IEEE, little-endian' or 'IEEE, ARM mixed-endian'\n"
++"and in addition can only be one of the last three if it appears to\n"
++"match the underlying C reality.  Note that the ARM mixed-endian\n"
++"format can only be set for the 'double' type, not for 'float'.\n"
+ "\n"
+ "Override the automatic determination of C-level floating point type.\n"
+ "This affects how floats are converted to and from binary strings.");
+@@ -2163,7 +2181,11 @@
+        Note that if we're on some whacked-out platform which uses
+        IEEE formats but isn't strictly little-endian or big-
+        endian, we will fall back to the portable shifts & masks
+-       method. */
++       method.
++
++       Addendum: We also attempt to detect the mixed-endian IEEE format
++       used by the ARM old ABI (OABI) and also used by the FPA
++       floating-point unit on some older ARM processors. */
+ 
+ #if SIZEOF_DOUBLE == 8
+     {
+@@ -2172,6 +2194,8 @@
+             detected_double_format = ieee_big_endian_format;
+         else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
+             detected_double_format = ieee_little_endian_format;
++        else if (memcmp(&x, "\x01\xff\x3f\x43\x05\x04\x03\x02", 8) == 0)
++            detected_double_format = ieee_arm_mixed_endian_format;
+         else
+             detected_double_format = unknown_format;
+     }
+@@ -2517,17 +2541,31 @@
+     }
+     else {
+         const char *s = (char*)&x;
+-        int i, incr = 1;
++        int i;
++        const unsigned char *byteorder;
+ 
+-        if ((double_format == ieee_little_endian_format && !le)
+-            || (double_format == ieee_big_endian_format && le)) {
+-            p += 7;
+-            incr = -1;
++        switch (double_format) {
++        case ieee_little_endian_format:
++            byteorder = LITTLE_ENDIAN_BYTEORDER;
++            break;
++        case ieee_big_endian_format:
++            byteorder = BIG_ENDIAN_BYTEORDER;
++            break;
++        case ieee_arm_mixed_endian_format:
++            byteorder = ARM_MIXED_ENDIAN_BYTEORDER;
++            break;
++        default:
++            Py_FatalError("insane float_format or double_format");
++            return -1;
+         }
+ 
+-        for (i = 0; i < 8; i++) {
+-            *p = *s++;
+-            p += incr;
++        if (le) {
++            for (i = 0; i < 8; i++)
++                p[byteorder[i]] = *s++;
++        }
++        else {
++            for (i = 0; i < 8; i++)
++                p[7-byteorder[i]] = *s++;
+         }
+         return 0;
+     }
+@@ -2686,22 +2724,33 @@
+     }
+     else {
+         double x;
++        char *s = (char*)&x;
++        const unsigned char *byteorder;
++        int i;
++
++        switch (double_format) {
++        case ieee_little_endian_format:
++            byteorder = LITTLE_ENDIAN_BYTEORDER;
++            break;
++        case ieee_big_endian_format:
++            byteorder = BIG_ENDIAN_BYTEORDER;
++            break;
++        case ieee_arm_mixed_endian_format:
++            byteorder = ARM_MIXED_ENDIAN_BYTEORDER;
++            break;
++        default:
++            Py_FatalError("insane float_format or double_format");
++            return -1.0;
++        }
+ 
+-        if ((double_format == ieee_little_endian_format && !le)
+-            || (double_format == ieee_big_endian_format && le)) {
+-            char buf[8];
+-            char *d = &buf[7];
+-            int i;
+-
+-            for (i = 0; i < 8; i++) {
+-                *d-- = *p++;
+-            }
+-            memcpy(&x, buf, 8);
++        if (le) {
++            for (i=0; i<8; i++)
++                *s++ = p[byteorder[i]];
+         }
+         else {
+-            memcpy(&x, p, 8);
++            for (i=0; i<8; i++)
++                *s++ = p[7-byteorder[i]];
+         }
+-
+         return x;
+     }
+ }

File patches/24_all_tests_environment.patch

+http://bugs.python.org/issue1674555
+
+--- Lib/site.py
++++ Lib/site.py
+@@ -527,8 +527,9 @@
+     known_paths = removeduppaths()
+     if ENABLE_USER_SITE is None:
+         ENABLE_USER_SITE = check_enableusersite()
+-    known_paths = addusersitepackages(known_paths)
+-    known_paths = addsitepackages(known_paths)
++    if os.environ.get("_PYTHONNOSITEPACKAGES") is None:
++        known_paths = addusersitepackages(known_paths)
++        known_paths = addsitepackages(known_paths)
+     if sys.platform == 'os2emx':
+         setBEGINLIBPATH()
+     setquit()
+--- Lib/test/regrtest.py
++++ Lib/test/regrtest.py
+@@ -168,6 +168,7 @@
+ import imp
+ import platform
+ import sysconfig
++from subprocess import Popen, PIPE
+ 
+ 
+ # Some times __path__ and __file__ are not absolute (e.g. while running from
+@@ -451,6 +452,49 @@
+     test_support.use_resources = use_resources
+     save_modules = sys.modules.keys()
+ 
++    opt_args = test_support.args_from_interpreter_flags()
++    base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
++    debug_output_pat = re.compile(r"\[\d+ refs\]$")
++
++    def get_args_tuple(test, verbose, quiet, huntrleaks, use_resources):
++        return (
++            (test, verbose, quiet),
++            dict(huntrleaks=huntrleaks, use_resources=use_resources)
++        )
++
++    def _runtest(test, verbose, quiet, huntrleaks=False,
++                 use_resources=None):
++        if test == "test_site":
++            args_tuple = get_args_tuple(test, verbose, quiet, huntrleaks,
++                                        use_resources)
++            env = os.environ.copy()
++            try:
++                del env["_PYTHONNOSITEPACKAGES"]
++            except KeyError:
++                pass
++            popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
++                          stdout=PIPE, stderr=PIPE,
++                          universal_newlines=True,
++                          close_fds=(os.name != 'nt'),
++                          env=env)
++            stdout, stderr = popen.communicate()
++            # Strip last refcount output line if it exists, since it
++            # comes from the shutdown of the interpreter in the subcommand.
++            stderr = debug_output_pat.sub("", stderr)
++            stdout, _, result = stdout.strip().rpartition("\n")
++            result = json.loads(result)
++            if stdout:
++                print stdout
++            if stderr:
++                print >>sys.stderr, stderr
++            if result[0] == INTERRUPTED:
++                assert result[1] == 'KeyboardInterrupt'
++                raise KeyboardInterrupt
++            return result
++        else:
++            return runtest(test, verbose, quiet, huntrleaks=False,
++                           use_resources=None)
++
+     def accumulate_result(test, result):
+         ok, test_time = result
+         test_times.append((test_time, test))
+@@ -485,19 +529,13 @@
+             print "Multiprocess option requires thread support"
+             sys.exit(2)
+         from Queue import Queue
+-        from subprocess import Popen, PIPE
+-        debug_output_pat = re.compile(r"\[\d+ refs\]$")
+         output = Queue()
+         def tests_and_args():
+             for test in tests:
+-                args_tuple = (
+-                    (test, verbose, quiet),
+-                    dict(huntrleaks=huntrleaks, use_resources=use_resources)
+-                )
++                args_tuple = get_args_tuple(test, verbose, quiet, huntrleaks,
++                                            use_resources)
+                 yield (test, args_tuple)
+         pending = tests_and_args()
+-        opt_args = test_support.args_from_interpreter_flags()
+-        base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
+         def work():
+             # A worker thread.
+             try:
+@@ -560,15 +598,15 @@
+             if trace:
+                 # If we're tracing code coverage, then we don't exit with status
+                 # if on a false return value from main.
+-                tracer.runctx('runtest(test, verbose, quiet)',
++                tracer.runctx('_runtest(test, verbose, quiet)',
+                               globals=globals(), locals=vars())
+             else:
+                 try:
+-                    result = runtest(test, verbose, quiet, huntrleaks)
++                    result = _runtest(test, verbose, quiet, huntrleaks)
+                     accumulate_result(test, result)
+                     if verbose3 and result[0] == FAILED:
+                         print "Re-running test %r in verbose mode" % test
+-                        runtest(test, True, quiet, huntrleaks)
++                        _runtest(test, True, quiet, huntrleaks)
+                 except KeyboardInterrupt:
+                     interrupted = True
+                     break
+@@ -638,7 +676,7 @@
+             sys.stdout.flush()
+             try:
+                 test_support.verbose = True
+-                ok = runtest(test, True, quiet, huntrleaks)
++                ok = _runtest(test, True, quiet, huntrleaks)
+             except KeyboardInterrupt:
+                 # print a newline separate from the ^C
+                 print
+@@ -847,8 +885,9 @@
+         for name, get, restore in self.resource_info():
+             current = get()
+             original = saved_values.pop(name)
+-            # Check for changes to the resource's value
+-            if current != original:
++            # Check for changes to the resource's value. test_site is always run
++            # in a subprocess and is allowed to change os.environ and sys.path.
++            if current != original and self.testname != "test_site":
+                 self.changed = True
+                 restore(original)
+                 if not self.quiet:
+--- Lib/test/test_site.py
++++ Lib/test/test_site.py
+@@ -8,6 +8,7 @@
+ from test.test_support import run_unittest, TESTFN, EnvironmentVarGuard
+ from test.test_support import captured_output
+ import __builtin__
++import imp
+ import os
+ import sys
+ import re
+@@ -21,6 +22,9 @@
+ # already.
+ if "site" in sys.modules:
+     import site
++    if "_PYTHONNOSITEPACKAGES" in os.environ:
++        del os.environ["_PYTHONNOSITEPACKAGES"]
++        imp.reload(site)
+ else:
+     raise unittest.SkipTest("importation of site.py suppressed")
+ 
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -793,7 +793,7 @@
+ 
+ TESTOPTS=	-l $(EXTRATESTOPTS)
+ TESTPROG=	$(srcdir)/Lib/test/regrtest.py
+-TESTPYTHON=	$(RUNSHARED) ./$(BUILDPYTHON) -Wd -3 -E -tt $(TESTPYTHONOPTS)
++TESTPYTHON=	_PYTHONNOSITEPACKAGES=1 $(RUNSHARED) ./$(BUILDPYTHON) -Wd -3 -E -tt $(TESTPYTHONOPTS)
+ test:		all platform
+ 		-find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
+ 		-$(TESTPYTHON) $(TESTPROG) $(TESTOPTS)

File patches/61_all_process_data.patch

+GENTOO_PYTHON_PROCESS_NAME environmental variable is set by python-wrapper and wrapper scripts generated by
+python_generate_wrapper_scripts() and specifies process name.
+GENTOO_PYTHON_WRAPPER_SCRIPT_PATH environmental variable is set by wrapper scripts generated by
+python_generate_wrapper_scripts() and specifies sys.argv[0] in target executables.
+GENTOO_PYTHON_TARGET_SCRIPT_PATH environmental variable is set by wrapper scripts generated by
+python_generate_wrapper_scripts() and specifies paths to actually executed scripts.
+GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION environmental variable is used by wrapper scripts generated by
+python_generate_wrapper_scripts() to check if Python supports GENTOO_PYTHON_TARGET_SCRIPT_PATH environmental variable.
+
+--- Modules/main.c
++++ Modules/main.c
+@@ -252,6 +252,7 @@
+     int version = 0;
+     int saw_unbuffered_flag = 0;
+     PyCompilerFlags cf;
++    char *target_script_name = getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
+ 
+     cf.cf_flags = 0;
+ 
+@@ -486,7 +487,10 @@
+             filename = argv[_PyOS_optind];
+ 
+ #else
+-        filename = argv[_PyOS_optind];
++        if (target_script_name != NULL && *target_script_name != '\0')
++            filename = target_script_name;
++        else
++            filename = argv[_PyOS_optind];
+ #endif
+     }
+ 
+--- Modules/posixmodule.c
++++ Modules/posixmodule.c
+@@ -604,6 +604,10 @@
+         char *p = strchr(*e, '=');
+         if (p == NULL)
+             continue;
++        if ((strlen("GENTOO_PYTHON_PROCESS_NAME") == (int)(p-*e) && strncmp("GENTOO_PYTHON_PROCESS_NAME", *e, (int)(p-*e)) == 0) ||
++            (strlen("GENTOO_PYTHON_TARGET_SCRIPT_PATH") == (int)(p-*e) && strncmp("GENTOO_PYTHON_TARGET_SCRIPT_PATH", *e, (int)(p-*e)) == 0) ||
++            (strlen("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH") == (int)(p-*e) && strncmp("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH", *e, (int)(p-*e)) == 0))
++            continue;
+         k = PyString_FromStringAndSize(*e, (int)(p-*e));
+         if (k == NULL) {
+             PyErr_Clear();
+--- Modules/python.c
++++ Modules/python.c
+@@ -6,9 +6,22 @@
+ #include <floatingpoint.h>
+ #endif
+ 
++#ifdef __linux__
++#include <linux/prctl.h>
++#include <sys/prctl.h>
++#ifndef PR_SET_NAME
++#define PR_SET_NAME 15
++#endif
++#endif
++
+ int
+ main(int argc, char **argv)
+ {
++	if (getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION")) {
++		printf("GENTOO_PYTHON_TARGET_SCRIPT_PATH supported\n");
++		return 0;
++	}
++
+ 	/* 754 requires that FP exceptions run in "no stop" mode by default,
+ 	 * and until C vendors implement C99's ways to control FP exceptions,
+ 	 * Python requires non-stop mode.  Alas, some platforms enable FP
+@@ -20,5 +33,15 @@
+ 	m = fpgetmask();
+ 	fpsetmask(m & ~FP_X_OFL);
+ #endif
++
++#ifdef __linux__
++	char *process_name = getenv("GENTOO_PYTHON_PROCESS_NAME");
++#ifdef HAVE_UNSETENV
++	unsetenv("GENTOO_PYTHON_PROCESS_NAME");
++#endif
++	if (process_name != NULL && *process_name != '\0')
++		prctl(PR_SET_NAME, process_name);
++#endif
++
+ 	return Py_Main(argc, argv);
+ }
+--- Python/sysmodule.c
++++ Python/sysmodule.c
+@@ -1560,6 +1560,10 @@
+ makeargvobject(int argc, char **argv)
+ {
+     PyObject *av;
++    char *wrapper_script_name = getenv("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH");
++#ifdef HAVE_UNSETENV
++    unsetenv("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH");
++#endif
+     if (argc <= 0 || argv == NULL) {
+         /* Ensure at least one (empty) argument is seen */
+         static char *empty_argv[1] = {""};
+@@ -1584,7 +1588,11 @@
+             } else
+                 v = PyString_FromString(argv[i]);
+ #else
+-            PyObject *v = PyString_FromString(argv[i]);
++            PyObject *v;
++            if (i == 0 && wrapper_script_name != NULL && *wrapper_script_name != '\0')
++                v = PyString_FromString(wrapper_script_name);
++            else
++                v = PyString_FromString(argv[i]);
+ #endif
+             if (v == NULL) {
+                 Py_DECREF(av);
+@@ -1612,7 +1620,15 @@
+     if (PySys_SetObject("argv", av) != 0)
+         Py_FatalError("can't assign sys.argv");
+     if (updatepath && path != NULL) {
+-        char *argv0 = argv[0];
++        char *target_script_name = getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
++#ifdef HAVE_UNSETENV
++        unsetenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
++#endif
++        char *argv0;
++        if (target_script_name != NULL && *target_script_name != '\0')
++            argv0 = target_script_name;
++        else
++            argv0 = argv[0];
+         char *p = NULL;
+         Py_ssize_t n = 0;
+         PyObject *a;

File patches/62_all_xml.use_pyxml.patch

+--- Lib/xml/__init__.py
++++ Lib/xml/__init__.py
+@@ -22,20 +22,23 @@
+ _MINIMUM_XMLPLUS_VERSION = (0, 8, 4)
+ 
+ 
+-try:
++def use_pyxml():
+     import _xmlplus
+-except ImportError:
+-    pass
+-else:
+-    try:
+-        v = _xmlplus.version_info
+-    except AttributeError:
+-        # _xmlplus is too old; ignore it
+-        pass
++    v = _xmlplus.version_info
++    if v >= _MINIMUM_XMLPLUS_VERSION:
++        import sys
++        _xmlplus.__path__.extend(__path__)
++        sys.modules[__name__] = _xmlplus
++        cleared_modules = []
++        redefined_modules = []
++        for module in sys.modules:
++            if module.startswith("xml.") and not module.startswith(("xml.marshal", "xml.schema", "xml.utils", "xml.xpath", "xml.xslt")):
++                cleared_modules.append(module)
++            if module.startswith(("xml.__init__", "xml.dom", "xml.parsers", "xml.sax")) and sys.modules[module] is not None:
++                redefined_modules.append(module)
++        for module in cleared_modules:
++            del sys.modules[module]
++        for module in sorted(redefined_modules):
++            __import__(module)
+     else:
+-        if v >= _MINIMUM_XMLPLUS_VERSION:
+-            import sys
+-            _xmlplus.__path__.extend(__path__)
+-            sys.modules[__name__] = _xmlplus
+-        else:
+-            del v
++        raise ImportError("PyXML too old: %s" % ".".join(str(x) for x in v))