public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/python:master commit in: dev-lang/python/files/2.6/, dev-lang/python/
@ 2015-08-09  8:56 Michał Górny
  0 siblings, 0 replies; only message in thread
From: Michał Górny @ 2015-08-09  8:56 UTC (permalink / raw
  To: gentoo-commits

commit:     7054cd4ff456e6ab5eab6e3b51f32dd1e1f413dd
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sun Aug  9 08:55:54 2015 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sun Aug  9 08:55:54 2015 +0000
URL:        https://gitweb.gentoo.org/proj/python.git/commit/?id=7054cd4f

dev-lang/python: import 2.6 with some cleanup (still broken)

 dev-lang/python/Manifest                           |   1 +
 dev-lang/python/files/2.6/.gitattributes           |   1 +
 .../files/2.6/01_all_static_library_location.patch |  68 ++++
 .../files/2.6/02_all_disable_modules_and_ssl.patch |  92 +++++
 .../files/2.6/03_all_add_portage_search_path.patch |  10 +
 dev-lang/python/files/2.6/04_all_libdir.patch      | 119 ++++++
 .../05_all_verbose_building_of_extensions.patch    |  10 +
 .../python/files/2.6/06_all_dbm_automagic.patch    |  52 +++
 .../python/files/2.6/07_all_internal_expat.patch   |  33 ++
 .../08_all_non-zero_exit_status_on_failure.patch   |  31 ++
 .../files/2.6/09_all_use_external_libffi.patch     |  51 +++
 .../files/2.6/10_all_sys.platform_linux2.patch     |  13 +
 ..._all_regenerate_platform-specific_modules.patch | 110 ++++++
 .../python/files/2.6/21_all_distutils_c++.patch    | 426 +++++++++++++++++++++
 .../python/files/2.6/22_all_turkish_locale.patch   | 128 +++++++
 dev-lang/python/files/2.6/23_all_arm_OABI.patch    | 185 +++++++++
 .../python/files/2.6/24_all_ctypes_mmap_wx.patch   | 124 ++++++
 dev-lang/python/files/2.6/25_all_gdbm-1.9.patch    |  14 +
 dev-lang/python/files/2.6/26_all_expat-2.1.patch   |  15 +
 .../python/files/2.6/41_all_crosscompile.patch     | 113 ++++++
 .../python/files/2.6/62_all_xml.use_pyxml.patch    |  41 ++
 ...w_readline_function_types__closes__20374_.patch |  28 ++
 ...an__just_remove_typecasts__closes__20374_.patch |  37 ++
 ...ngs_when_compiling_readline_with_libedit_.patch |  37 ++
 dev-lang/python/files/2.6/99_all_tcl86.patch       |  11 +
 dev-lang/python/python-2.6.9.ebuild                | 340 ++++++++++++++++
 26 files changed, 2090 insertions(+)

diff --git a/dev-lang/python/Manifest b/dev-lang/python/Manifest
index 513d54c..0e0bd0d 100644
--- a/dev-lang/python/Manifest
+++ b/dev-lang/python/Manifest
@@ -1 +1,2 @@
+DIST Python-2.6.9.tar.xz 9333664 SHA256 cae7bb995006ea5b703d9d28446f694894c441fe4bfb95d561c0ac908cd06e41 SHA512 bcd9286b6af3bfa2017f0b32c6c0f9b934224ece496d2d897ab3a61a936d306a5f61a580c060ce501034a614da374d17831a9c9be9f947b01d977b56437c023b WHIRLPOOL 0b9feb710f0c5c8726522465f26ac6fa17e8f87c0e5cda4ef0b130e5d8e213d32aad0143e0ec909c677a7b515ed63ed9e9d50a33890f22068b820a5f15ba47fd
 DIST Python-3.2.6.tar.xz 9243292 SHA256 1d12b501819fd26afafbf8459be1aa279b56f032b4c15412de0a713ce0de7bdc SHA512 514b46029dd5b07f2d287a1f00c6716970197186a38e3f2e1ec60c2292cf03a2dc45165ba9c217e5219c7cb6d96a09f790f5b3bdcc8d11db53f927297fe4ddc9 WHIRLPOOL b34f215e0f50123c5b2969e615ffbab99b631433de8f13cbbca525bf57cbc1bb9a159fba02616b3772be9b249be3cec36d6fd1856a678880674b828eb4ab08ed

diff --git a/dev-lang/python/files/2.6/.gitattributes b/dev-lang/python/files/2.6/.gitattributes
new file mode 100644
index 0000000..5e5a56d
--- /dev/null
+++ b/dev-lang/python/files/2.6/.gitattributes
@@ -0,0 +1 @@
+Makefile export-ignore

diff --git a/dev-lang/python/files/2.6/01_all_static_library_location.patch b/dev-lang/python/files/2.6/01_all_static_library_location.patch
new file mode 100644
index 0000000..83231c9
--- /dev/null
+++ b/dev-lang/python/files/2.6/01_all_static_library_location.patch
@@ -0,0 +1,68 @@
+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
+@@ -788,6 +788,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 manual page
+ maninstall:
+@@ -946,18 +959,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
+@@ -45,9 +45,4 @@
+ 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' and not getvar('Py_ENABLE_SHARED'):
+-        libs.insert(0, '-L' + getvar('LIBPL'))
+     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

diff --git a/dev-lang/python/files/2.6/02_all_disable_modules_and_ssl.patch b/dev-lang/python/files/2.6/02_all_disable_modules_and_ssl.patch
new file mode 100644
index 0000000..c5de56d
--- /dev/null
+++ b/dev-lang/python/files/2.6/02_all_disable_modules_and_ssl.patch
@@ -0,0 +1,92 @@
+--- setup.py
++++ setup.py
+@@ -18,7 +18,18 @@
+ from distutils.spawn import find_executable
+ 
+ # 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
+@@ -355,6 +366,7 @@
+         return sys.platform
+ 
+     def detect_modules(self):
++        global disable_ssl
+         # Ensure that /usr/local is always used
+         add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
+         add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+@@ -697,7 +709,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:
+@@ -708,7 +720,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,
+@@ -742,6 +755,7 @@
+ 
+         if (ssl_incs is not None and
+             ssl_libs is not None and
++            not disable_ssl and
+             openssl_ver >= 0x00907000):
+             # The _hashlib module wraps optimized implementations
+             # of hash functions from the OpenSSL library.
+@@ -752,20 +766,22 @@
+             # these aren't strictly missing since they are unneeded.
+             #missing.extend(['_sha', '_md5'])
+         else:
+-            # 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']) )
+             missing.append('_hashlib')
+ 
+-        if (openssl_ver < 0x00908000):
+-            # 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

diff --git a/dev-lang/python/files/2.6/03_all_add_portage_search_path.patch b/dev-lang/python/files/2.6/03_all_add_portage_search_path.patch
new file mode 100644
index 0000000..029284c
--- /dev/null
+++ b/dev-lang/python/files/2.6/03_all_add_portage_search_path.patch
@@ -0,0 +1,10 @@
+--- Lib/site.py
++++ Lib/site.py
+@@ -269,6 +269,7 @@
+                                         "python" + sys.version[:3],
+                                         "site-packages"))
+             sitedirs.append(os.path.join(prefix, "lib", "site-python"))
++            sitedirs.append(os.path.join(prefix, "lib", "portage", "pym"))
+         else:
+             sitedirs.append(prefix)
+             sitedirs.append(os.path.join(prefix, "lib", "site-packages"))

diff --git a/dev-lang/python/files/2.6/04_all_libdir.patch b/dev-lang/python/files/2.6/04_all_libdir.patch
new file mode 100644
index 0000000..af61191
--- /dev/null
+++ b/dev-lang/python/files/2.6/04_all_libdir.patch
@@ -0,0 +1,119 @@
+--- 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,8 @@
+ 
+     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
+@@ -265,11 +265,11 @@
+         if sys.platform in ('os2emx', 'riscos'):
+             sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
+         elif os.sep == '/':
+-            sitedirs.append(os.path.join(prefix, "lib",
++            sitedirs.append(os.path.join(prefix, "@@GENTOO_LIBDIR@@",
+                                         "python" + sys.version[:3],
+                                         "site-packages"))
+-            sitedirs.append(os.path.join(prefix, "lib", "site-python"))
+-            sitedirs.append(os.path.join(prefix, "lib", "portage", "pym"))
++            sitedirs.append(os.path.join(prefix, "@@GENTOO_LIBDIR@@", "site-python"))
++            sitedirs.append(os.path.join(prefix, "@@GENTOO_LIBDIR@@", "portage", "pym"))
+         else:
+             sitedirs.append(prefix)
+             sitedirs.append(os.path.join(prefix, "lib", "site-packages"))
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -91,7 +91,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)
+@@ -524,7 +524,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];
+@@ -534,7 +534,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
+@@ -460,7 +460,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
+@@ -420,8 +420,7 @@
+         # if a file is found in one of those directories, it can
+         # be assumed that no additional -I,-L directives are needed.
+         lib_dirs = self.compiler.library_dirs + [
+-            '/lib64', '/usr/lib64',
+-            '/lib', '/usr/lib',
++            '/@@GENTOO_LIBDIR@@', '/usr/@@GENTOO_LIBDIR@@',
+             ]
+         inc_dirs = self.compiler.include_dirs + ['/usr/include']
+         exts = []
+@@ -674,11 +673,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:

diff --git a/dev-lang/python/files/2.6/05_all_verbose_building_of_extensions.patch b/dev-lang/python/files/2.6/05_all_verbose_building_of_extensions.patch
new file mode 100644
index 0000000..de852be
--- /dev/null
+++ b/dev-lang/python/files/2.6/05_all_verbose_building_of_extensions.patch
@@ -0,0 +1,10 @@
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -395,7 +395,6 @@
+ # Build the shared modules
+ sharedmods: $(BUILDPYTHON)
+ 	@case $$MAKEFLAGS in \
+-	*s*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py -q build;; \
+ 	*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ 	esac
+ 

diff --git a/dev-lang/python/files/2.6/06_all_dbm_automagic.patch b/dev-lang/python/files/2.6/06_all_dbm_automagic.patch
new file mode 100644
index 0000000..9fc1031
--- /dev/null
+++ b/dev-lang/python/files/2.6/06_all_dbm_automagic.patch
@@ -0,0 +1,52 @@
+--- setup.py
++++ setup.py
+@@ -1137,16 +1137,11 @@
+ 
+         # The standard Unix dbm module:
+         if platform not in ['cygwin']:
+-            if find_file("ndbm.h", inc_dirs, []) is not None:
+-                # Some systems have -lndbm, others don't
+-                if self.compiler.find_library_file(lib_dirs, 'ndbm'):
+-                    ndbm_libs = ['ndbm']
+-                else:
+-                    ndbm_libs = []
+-                exts.append( Extension('dbm', ['dbmmodule.c'],
+-                                       define_macros=[('HAVE_NDBM_H',None)],
+-                                       libraries = ndbm_libs ) )
+-            elif self.compiler.find_library_file(lib_dirs, 'gdbm'):
++            # To prevent automagic dependencies check for relevant modules in
++            # disabled_module_list.
++            if (self.compiler.find_library_file(lib_dirs, 'gdbm')
++                    and find_file("gdbm/ndbm.h", inc_dirs, []) is not None
++                    and 'gdbm' not in disabled_module_list):
+                 gdbm_libs = ['gdbm']
+                 if self.compiler.find_library_file(lib_dirs, 'gdbm_compat'):
+                     gdbm_libs.append('gdbm_compat')
+@@ -1162,7 +1157,7 @@
+                         libraries = gdbm_libs ) )
+                 else:
+                     missing.append('dbm')
+-            elif db_incs is not None:
++            elif db_incs is not None and 'bsddb' not in disabled_module_list:
+                 exts.append( Extension('dbm', ['dbmmodule.c'],
+                                        library_dirs=dblib_dir,
+                                        runtime_library_dirs=dblib_dir,
+@@ -1170,6 +1165,18 @@
+                                        define_macros=[('HAVE_BERKDB_H',None),
+                                                       ('DB_DBM_HSEARCH',None)],
+                                        libraries=dblibs))
++            # Check for ndbm.h here after checking berkdb because ndbm.h is
++            # only provided by db-1*
++            elif (find_file("ndbm.h", inc_dirs, []) is not None
++                     and 'bsddb' not in disabled_module_list):
++                # Some systems have -lndbm, others don't
++                if self.compiler.find_library_file(lib_dirs, 'ndbm'):
++                    ndbm_libs = ['ndbm']
++                else:
++                    ndbm_libs = []
++                exts.append( Extension('dbm', ['dbmmodule.c'],
++                                        define_macros=[('HAVE_NDBM_H',None)],
++                                        libraries = ndbm_libs ) )
+             else:
+                 missing.append('dbm')
+ 

diff --git a/dev-lang/python/files/2.6/07_all_internal_expat.patch b/dev-lang/python/files/2.6/07_all_internal_expat.patch
new file mode 100644
index 0000000..3ffdae2
--- /dev/null
+++ b/dev-lang/python/files/2.6/07_all_internal_expat.patch
@@ -0,0 +1,33 @@
+--- setup.py
++++ setup.py
+@@ -1326,18 +1326,15 @@
+         #
+         # More information on Expat can be found at www.libexpat.org.
+         #
+-        expatinc = os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')
+-        define_macros = [
+-            ('HAVE_EXPAT_CONFIG_H', '1'),
+-        ]
++        # Use system expat
++        expatinc = '/usr/include'
++        define_macros = []
+ 
+         exts.append(Extension('pyexpat',
+                               define_macros = define_macros,
+                               include_dirs = [expatinc],
++                              libraries = ['expat'],
+                               sources = ['pyexpat.c',
+-                                         'expat/xmlparse.c',
+-                                         'expat/xmlrole.c',
+-                                         'expat/xmltok.c',
+                                          ],
+                               ))
+ 
+@@ -1349,6 +1346,7 @@
+             exts.append(Extension('_elementtree',
+                                   define_macros = define_macros,
+                                   include_dirs = [expatinc],
++                                  libraries = ['expat'],
+                                   sources = ['_elementtree.c'],
+                                   ))
+         else:

diff --git a/dev-lang/python/files/2.6/08_all_non-zero_exit_status_on_failure.patch b/dev-lang/python/files/2.6/08_all_non-zero_exit_status_on_failure.patch
new file mode 100644
index 0000000..8d0ebe8
--- /dev/null
+++ b/dev-lang/python/files/2.6/08_all_non-zero_exit_status_on_failure.patch
@@ -0,0 +1,31 @@
+https://bugs.gentoo.org/show_bug.cgi?id=281968
+http://bugs.python.org/issue6731
+
+--- setup.py
++++ setup.py
+@@ -31,6 +31,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'
+@@ -279,6 +281,8 @@
+             print
+ 
+         if self.failed:
++            global exit_status
++            exit_status = 1
+             failed = self.failed[:]
+             print
+             print "Failed to build these modules:"
+@@ -2050,6 +2054,7 @@
+                      'Tools/scripts/2to3',
+                      'Lib/smtpd.py']
+         )
++    sys.exit(exit_status)
+ 
+ # --install-platlib
+ if __name__ == '__main__':

diff --git a/dev-lang/python/files/2.6/09_all_use_external_libffi.patch b/dev-lang/python/files/2.6/09_all_use_external_libffi.patch
new file mode 100644
index 0000000..0c54246
--- /dev/null
+++ b/dev-lang/python/files/2.6/09_all_use_external_libffi.patch
@@ -0,0 +1,51 @@
+http://bugs.python.org/issue6943
+http://hg.python.org/cpython/rev/f02881332342
+http://hg.python.org/cpython/rev/6d9be1a97c17
+
+--- configure.in
++++ configure.in
+@@ -2046,11 +2046,20 @@
+ ],
+ [AC_MSG_RESULT(no)])
+ 
++AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
++
+ # Check for use of the system libffi library
+ AC_MSG_CHECKING(for --with-system-ffi)
+ AC_ARG_WITH(system_ffi,
+             AC_HELP_STRING(--with-system-ffi, build _ctypes module using an installed ffi library))
+ 
++if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
++    LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
++else
++    LIBFFI_INCLUDEDIR=""
++fi
++AC_SUBST(LIBFFI_INCLUDEDIR)
++
+ AC_MSG_RESULT($with_system_ffi)
+ 
+ # Determine if signalmodule should be used.
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -202,6 +202,8 @@
+ GRAMMAR_INPUT=	$(srcdir)/Grammar/Grammar
+ 
+ 
++LIBFFI_INCLUDEDIR=	@LIBFFI_INCLUDEDIR@
++
+ ##########################################################################
+ # Parser
+ PGEN=		Parser/pgen$(EXE)
+--- setup.py
++++ setup.py
+@@ -1929,7 +1929,9 @@
+             # in /usr/include/ffi
+             inc_dirs.append('/usr/include/ffi')
+ 
+-        ffi_inc = find_file('ffi.h', [], inc_dirs)
++        ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
++        if not ffi_inc:
++            ffi_inc = find_file('ffi.h', [], inc_dirs)
+         if ffi_inc is not None:
+             ffi_h = ffi_inc[0] + '/ffi.h'
+             fp = open(ffi_h)

diff --git a/dev-lang/python/files/2.6/10_all_sys.platform_linux2.patch b/dev-lang/python/files/2.6/10_all_sys.platform_linux2.patch
new file mode 100644
index 0000000..40e4080
--- /dev/null
+++ b/dev-lang/python/files/2.6/10_all_sys.platform_linux2.patch
@@ -0,0 +1,13 @@
+http://bugs.python.org/issue12326
+http://hg.python.org/cpython/rev/c816479f6aaf
+
+--- configure.in
++++ configure.in
+@@ -260,6 +260,7 @@
+ 	MACHDEP="$ac_md_system$ac_md_release"
+ 
+ 	case $MACHDEP in
++	linux*) MACHDEP="linux2";;
+ 	cygwin*) MACHDEP="cygwin";;
+ 	darwin*) MACHDEP="darwin";;
+ 	atheos*) MACHDEP="atheos";;

diff --git a/dev-lang/python/files/2.6/11_all_regenerate_platform-specific_modules.patch b/dev-lang/python/files/2.6/11_all_regenerate_platform-specific_modules.patch
new file mode 100644
index 0000000..425e149
--- /dev/null
+++ b/dev-lang/python/files/2.6/11_all_regenerate_platform-specific_modules.patch
@@ -0,0 +1,110 @@
+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
+@@ -355,7 +355,7 @@
+ 
+ # Default target
+ all:		build_all
+-build_all:	$(BUILDPYTHON) oldsharedmods sharedmods
++build_all:	$(BUILDPYTHON) oldsharedmods sharedmods platformspecificmods
+ 
+ # Compile a binary with gcc profile guided optimization.
+ profile-opt:
+@@ -400,6 +400,26 @@
+ 	*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ 	esac
+ 
++# 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="`pwd`/Lib"; export PYTHONPATH; \
++	cd $(srcdir)/Lib/$(PLATDIR); \
++	$(RUNSHARED) ./regen || exit 1; \
++	for module in *.py; do \
++		$(RUNSHARED) $(BUILDPYTHON) -c "import py_compile; py_compile.compile('$$module', cfile='/dev/null', doraise=True)" || exit 1; \
++	done
++
+ # Build static library
+ # avoid long command lines, same as LIBRARY_OBJS
+ $(LIBRARY): $(LIBRARY_OBJS)
+@@ -845,7 +865,7 @@
+ 		multiprocessing multiprocessing/dummy \
+ 		lib-old \
+ 		curses pydoc_data $(MACHDEPS)
+-libinstall:	build_all $(srcdir)/Lib/$(PLATDIR)
++libinstall:	build_all
+ 	@for i in $(SCRIPTDIR) $(LIBDEST); \
+ 	do \
+ 		if test ! -d $(DESTDIR)$$i; then \
+@@ -920,16 +940,6 @@
+ 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+ 		./$(BUILDPYTHON) -Wi -t -c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"
+ 
+-# 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="`pwd`/Lib"; \
+-	export DYLD_FRAMEWORK_PATH; DYLD_FRAMEWORK_PATH="`pwd`"; \
+-	export EXE; EXE="$(BUILDEXE)"; \
+-	cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen
+-
+ # Install the include files
+ INCLDIRSTOMAKE=$(INCLUDEDIR) $(CONFINCLUDEDIR) $(INCLUDEPY) $(CONFINCLUDEPY)
+ inclinstall:
+@@ -1212,7 +1222,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

diff --git a/dev-lang/python/files/2.6/21_all_distutils_c++.patch b/dev-lang/python/files/2.6/21_all_distutils_c++.patch
new file mode 100644
index 0000000..7e1e89a
--- /dev/null
+++ b/dev-lang/python/files/2.6/21_all_distutils_c++.patch
@@ -0,0 +1,426 @@
+http://bugs.python.org/issue1222585
+
+--- configure.in
++++ configure.in
+@@ -1723,6 +1723,7 @@
+ # Set info about shared libraries.
+ AC_SUBST(SO)
+ AC_SUBST(LDSHARED)
++AC_SUBST(LDCXXSHARED)
+ AC_SUBST(BLDSHARED)
+ AC_SUBST(CCSHARED)
+ AC_SUBST(LINKFORSHARED)
+@@ -1775,36 +1776,47 @@
+ 	IRIX/5*) LDSHARED="ld -shared";;
+ 	IRIX*/6*) LDSHARED="ld ${SGI_ABI} -shared -all";;
+ 	SunOS/5*) 
+-		if test "$GCC" = "yes"
+-		then LDSHARED='$(CC) -shared'
+-		else LDSHARED='$(CC) -G';
++		if test "$GCC" = "yes" ; then
++			LDSHARED='$(CC) -shared'
++			LDCXXSHARED='$(CXX) -shared'
++		else
++			LDSHARED='$(CC) -G'
++			LDCXXSHARED='$(CXX) -G'
+ 		fi ;;
+ 	hp*|HP*)
+-		if test "$GCC" = "yes"
+-		then LDSHARED='$(CC) -shared'
+-		else LDSHARED='ld -b';
++		if test "$GCC" = "yes" ; then
++			LDSHARED='$(CC) -shared'
++			LDCXXSHARED='$(CXX) -shared'
++		else
++			LDSHARED='ld -b'
+ 		fi ;;
+ 	OSF*) LDSHARED="ld -shared -expect_unresolved \"*\"";;
+ 	Darwin/1.3*)
+ 		LDSHARED='$(CC) $(LDFLAGS) -bundle'
++		LDCXXSHARED='$(CXX) $(LDFLAGS) -bundle'
+ 		if test "$enable_framework" ; then
+ 			# Link against the framework. All externals should be defined.
+ 			BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+ 			LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
++			LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+ 		else
+ 			# No framework. Ignore undefined symbols, assuming they come from Python
+ 			LDSHARED="$LDSHARED -undefined suppress"
++			LDCXXSHARED="$LDCXXSHARED -undefined suppress"
+ 		fi ;;
+ 	Darwin/1.4*|Darwin/5.*|Darwin/6.*)
+ 		LDSHARED='$(CC) $(LDFLAGS) -bundle'
++		LDCXXSHARED='$(CXX) $(LDFLAGS) -bundle'
+ 		if test "$enable_framework" ; then
+ 			# Link against the framework. All externals should be defined.
+ 			BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+ 			LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
++			LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+ 		else
+ 			# No framework, use the Python app as bundle-loader
+ 			BLDSHARED="$LDSHARED "'-bundle_loader $(BUILDPYTHON)'
+ 			LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
++			LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
+ 		fi ;;
+ 	Darwin/*)
+ 		# Use -undefined dynamic_lookup whenever possible (10.3 and later).
+@@ -1816,26 +1828,35 @@
+ 				LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}"
+ 			fi
+ 			LDSHARED='$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup'
++			LDCXXSHARED='$(CXX) $(LDFLAGS) -bundle -undefined dynamic_lookup'
+ 			BLDSHARED="$LDSHARED"
+ 		else
+ 			LDSHARED='$(CC) $(LDFLAGS) -bundle'
++			LDCXXSHARED='$(CXX) $(LDFLAGS) -bundle'
+ 			if test "$enable_framework" ; then
+ 				# Link against the framework. All externals should be defined.
+ 				BLDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+ 				LDSHARED="$LDSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
++				LDCXXSHARED="$LDCXXSHARED "'$(PYTHONFRAMEWORKPREFIX)/$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
+ 			else
+ 				# No framework, use the Python app as bundle-loader
+ 				BLDSHARED="$LDSHARED "'-bundle_loader $(BUILDPYTHON)'
+ 				LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
++				LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)'
+ 			fi
+ 		fi
+ 		;;
+-	Linux*|GNU*|QNX*) LDSHARED='$(CC) -shared';;
+-	BSD/OS*/4*) LDSHARED="gcc -shared";;
++	Linux*|GNU*|QNX*)
++		LDSHARED='$(CC) -shared'
++		LDCXXSHARED='$(CXX) -shared';;
++	BSD/OS*/4*)
++		LDSHARED="gcc -shared"
++		LDCXXSHARED="g++ -shared";;
+ 	FreeBSD*)
+ 		if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
+ 		then
+ 			LDSHARED='$(CC) -shared ${LDFLAGS}'
++			LDCXXSHARED='$(CXX) -shared ${LDFLAGS}'
+ 		else
+ 			LDSHARED="ld -Bshareable ${LDFLAGS}"
+ 		fi;;
+@@ -1843,6 +1864,7 @@
+ 		if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
+ 		then
+ 				LDSHARED='$(CC) -shared $(CCSHARED) ${LDFLAGS}'
++				LDCXXSHARED='$(CXX) -shared $(CCSHARED) ${LDFLAGS}'
+ 		else
+ 				case `uname -r` in
+ 				[[01]].* | 2.[[0-7]] | 2.[[0-7]].*)
+@@ -1850,23 +1872,36 @@
+ 				   ;;
+ 				*)
+ 				   LDSHARED='$(CC) -shared $(CCSHARED) ${LDFLAGS}'
++				   LDCXXSHARED='$(CXX) -shared $(CCSHARED) ${LDFLAGS}'
+ 				   ;;
+ 				esac
+ 		fi;;
+-	NetBSD*|DragonFly*) LDSHARED="cc -shared ${LDFLAGS}";;
++	NetBSD*|DragonFly*)
++		LDSHARED="cc -shared ${LDFLAGS}"
++		LDCXXSHARED="c++ -shared ${LDFLAGS}";;
+ 	OpenUNIX*|UnixWare*)
+-		if test "$GCC" = "yes"
+-		then LDSHARED='$(CC) -shared'
+-		else LDSHARED='$(CC) -G'
++		if test "$GCC" = "yes" ; then
++			LDSHARED='$(CC) -shared'
++			LDCXXSHARED='$(CXX) -shared'
++		else
++			LDSHARED='$(CC) -G'
++			LDCXXSHARED='$(CXX) -G'
+ 		fi;;
+-	SCO_SV*) LDSHARED='$(CC) -Wl,-G,-Bexport';;
++	SCO_SV*)
++		LDSHARED='$(CC) -Wl,-G,-Bexport'
++		LDCXXSHARED='$(CXX) -Wl,-G,-Bexport';;
+ 	Monterey*) LDSHARED="cc -G -dy -Bdynamic -Bexport -L/usr/lib/ia64l64";;
+-	CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base";;
+-	atheos*) LDSHARED="gcc -shared";;
++	CYGWIN*)
++		LDSHARED="gcc -shared -Wl,--enable-auto-image-base"
++		LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";;
++	atheos*)
++		LDSHARED="gcc -shared"
++		LDCXXSHARED="g++ -shared";;
+ 	*)	LDSHARED="ld";;
+ 	esac
+ fi
+ AC_MSG_RESULT($LDSHARED)
++LDCXXSHARED=${LDCXXSHARED-$LDSHARED}
+ BLDSHARED=${BLDSHARED-$LDSHARED}
+ # CCSHARED are the C *flags* used to create objects to go into a shared
+ # library (module) -- this is only needed for a few systems
+--- Lib/distutils/cygwinccompiler.py
++++ Lib/distutils/cygwinccompiler.py
+@@ -132,9 +132,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, shared_option)))
+ 
+         # cygwin and mingw32 need different sets of libraries
+         if self.gcc_version == "2.91.57":
+@@ -160,8 +164,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
+ 
+@@ -322,10 +330,15 @@
+         self.set_executables(compiler='gcc -mno-cygwin -O -Wall',
+                              compiler_so='gcc -mno-cygwin -mdll -O -Wall',
+                              compiler_cxx='g++ -mno-cygwin -O -Wall',
++                             compiler_so_cxx='g++ -mno-cygwin -mdll -O -Wall',
+                              linker_exe='gcc -mno-cygwin',
+                              linker_so='%s -mno-cygwin %s %s'
+                                         % (self.linker_dll, shared_option,
+-                                           entry_point))
++                                           entry_point),
++                             linker_exe_cxx='g++ -mno-cygwin',
++                             linker_so_cxx='%s -mno-cygwin %s %s'
++                                            % (self.linker_dll, shared_option,
++                                               entry_point))
+         # Maybe we should also append -mthreads, but then the finished
+         # dlls need another dll (mingwm10.dll see Mingw32 docs)
+         # (-mthreads: Support thread-safe exception handling on `Mingw32')
+--- 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
+@@ -167,9 +167,12 @@
+     varies across Unices and is stored in Python's Makefile.
+     """
+     if compiler.compiler_type == "unix":
+-        (cc, cxx, opt, cflags, ccshared, ldshared, so_ext) = \
+-            get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
+-                            'CCSHARED', 'LDSHARED', 'SO')
++        (cc, cxx, ccshared, ldshared, ldcxxshared, so_ext) = \
++            get_config_vars('CC', 'CXX', 'CCSHARED', 'LDSHARED',
++                            'LDCXXSHARED', 'SO')
++
++        cflags = ''
++        cxxflags = ''
+ 
+         if 'CC' in os.environ:
+             cc = os.environ['CC']
+@@ -177,28 +180,40 @@
+             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']
+ 
+         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_exe=cc,
++            linker_so_cxx=ldcxxshared,
++            linker_exe_cxx=cxx)
+ 
+         compiler.shared_lib_extension = so_ext
+ 
+@@ -546,7 +561,7 @@
+                 for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
+                         # a number of derived variables. These need to be
+                         # patched up as well.
+-                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
++                        'CFLAGS', 'CXXFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+                     flags = _config_vars[key]
+                     flags = re.sub('-arch\s+\w+\s', ' ', flags)
+                     flags = re.sub('-isysroot [^ \t]*', ' ', flags)
+@@ -565,7 +580,7 @@
+                     for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
+                         # a number of derived variables. These need to be
+                         # patched up as well.
+-                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
++                        'CFLAGS', 'CXXFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+ 
+                         flags = _config_vars[key]
+                         flags = re.sub('-arch\s+\w+\s', ' ', flags)
+@@ -589,7 +604,7 @@
+                         for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
+                              # a number of derived variables. These need to be
+                              # patched up as well.
+-                            'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
++                            'CFLAGS', 'CXXFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
+ 
+                             flags = _config_vars[key]
+                             flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags)
+--- Lib/distutils/unixccompiler.py
++++ Lib/distutils/unixccompiler.py
+@@ -114,14 +114,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":
+@@ -171,11 +174,18 @@
+ 
+     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 = _darwin_compiler_fixup(compiler_so, cc_args + extra_postargs)
++            compiler_so_cxx = _darwin_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
+ 
+@@ -232,23 +242,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 = _darwin_compiler_fixup(linker, ld_args)
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -104,6 +104,7 @@
+ SO=		@SO@
+ LDSHARED=	@LDSHARED@
+ BLDSHARED=	@BLDSHARED@
++LDCXXSHARED=	@LDCXXSHARED@
+ DESTSHARED=	$(BINLIBDEST)/lib-dynload
+ 
+ # Executable suffix (.exe on Windows and Mac OS X)
+@@ -397,7 +398,7 @@
+ # Build the shared modules
+ sharedmods: $(BUILDPYTHON)
+ 	@case $$MAKEFLAGS in \
+-	*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
++	*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' CFLAGS='$(CFLAGS)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ 	esac
+ 
+ # Build the platform-specific modules

diff --git a/dev-lang/python/files/2.6/22_all_turkish_locale.patch b/dev-lang/python/files/2.6/22_all_turkish_locale.patch
new file mode 100644
index 0000000..1321c3c
--- /dev/null
+++ b/dev-lang/python/files/2.6/22_all_turkish_locale.patch
@@ -0,0 +1,128 @@
+https://bugs.gentoo.org/show_bug.cgi?id=250075
+http://bugs.python.org/issue1813
+
+--- Lib/decimal.py
++++ Lib/decimal.py
+@@ -153,6 +153,13 @@
+ ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
+ ROUND_05UP = 'ROUND_05UP'
+ 
++import string
++
++def ascii_upper(s):
++    trans_table = string.maketrans(string.ascii_lowercase, string.ascii_uppercase)
++    return s.translate(trans_table)
++
++
+ # Errors
+ 
+ class DecimalException(ArithmeticError):
+@@ -3645,7 +3652,7 @@
+                                     if name.startswith('_round_')]
+ for name in rounding_functions:
+     # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
+-    globalname = name[1:].upper()
++    globalname = ascii_upper(name[1:])
+     val = globals()[globalname]
+     Decimal._pick_rounding_function[val] = name
+ 
+--- 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)
+--- Lib/locale.py
++++ Lib/locale.py
+@@ -313,6 +313,14 @@
+ # overridden below)
+ _setlocale = setlocale
+ 
++# Avoid relying on the locale-dependent .lower() method
++# (see bug #1813).
++_ascii_lower_map = ''.join(
++    chr(x + 32 if x >= ord('A') and x <= ord('Z') else x)
++    for x in range(256)
++)
++
++
+ def normalize(localename):
+ 
+     """ Returns a normalized locale code for the given locale
+@@ -330,7 +338,7 @@
+ 
+     """
+     # Normalize the locale name and extract the encoding
+-    fullname = localename.lower()
++    fullname = localename.encode('ascii').translate(_ascii_lower_map)
+     if ':' in fullname:
+         # ':' is sometimes used as encoding delimiter.
+         fullname = fullname.replace(':', '.')
+--- Lib/test/test_codecs.py
++++ Lib/test/test_codecs.py
+@@ -1,5 +1,6 @@
+ from test import test_support
+ import unittest
++import locale
+ import codecs
+ import sys, StringIO, _testcapi
+ 
+@@ -1133,6 +1134,16 @@
+         self.assertRaises(LookupError, codecs.lookup, "__spam__")
+         self.assertRaises(LookupError, codecs.lookup, " ")
+ 
++    def test_lookup_with_locale(self):
++        # Bug #1813: when normalizing codec name, lowercasing must be locale
++        # agnostic, otherwise the looked up codec name might end up wrong.
++        try:
++            locale.setlocale(locale.LC_CTYPE, 'tr')
++        except locale.Error:
++            # SKIPped test
++            return
++        codecs.lookup('ISO8859_1')
++
+     def test_getencoder(self):
+         self.assertRaises(TypeError, codecs.getencoder)
+         self.assertRaises(LookupError, codecs.getencoder, "__spam__")
+--- Python/codecs.c
++++ Python/codecs.c
+@@ -45,6 +45,12 @@
+     return -1;
+ }
+ 
++/* isupper() forced into the ASCII locale */
++#define ascii_isupper(x) (((x) >= 0x41) && ((x) <= 0x5A))
++/* tolower() forced into the ASCII locale */
++#define ascii_tolower(x) (ascii_isupper(x) ? ((x) + 0x20) : (x))
++
++
+ /* Convert a string to a normalized Python string: all characters are
+    converted to lower case, spaces are replaced with underscores. */
+ 
+@@ -70,7 +76,7 @@
+         if (ch == ' ')
+             ch = '-';
+         else
+-            ch = tolower(Py_CHARMASK(ch));
++            ch = ascii_tolower(Py_CHARMASK(ch));
+         p[i] = ch;
+     }
+     return v;

diff --git a/dev-lang/python/files/2.6/23_all_arm_OABI.patch b/dev-lang/python/files/2.6/23_all_arm_OABI.patch
new file mode 100644
index 0000000..e373281
--- /dev/null
+++ b/dev-lang/python/files/2.6/23_all_arm_OABI.patch
@@ -0,0 +1,185 @@
+https://bugs.gentoo.org/show_bug.cgi?id=266703
+http://bugs.python.org/issue1762561
+
+--- Objects/floatobject.c
++++ Objects/floatobject.c
+@@ -1691,9 +1691,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;
+ 
+@@ -1730,6 +1739,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;
+@@ -1743,8 +1754,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)
+@@ -1782,11 +1794,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;
+ 
+     }
+@@ -1809,8 +1825,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"
+ "Overrides the automatic determination of C-level floating point type.\n"
+ "This affects how floats are converted to and from binary strings.");
+@@ -2005,7 +2023,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
+     {
+@@ -2014,6 +2036,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;
+     }
+@@ -2353,17 +2377,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;
+     }
+@@ -2522,22 +2560,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;
+     }
+ }

diff --git a/dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch b/dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch
new file mode 100644
index 0000000..918d97c
--- /dev/null
+++ b/dev-lang/python/files/2.6/24_all_ctypes_mmap_wx.patch
@@ -0,0 +1,124 @@
+https://bugs.gentoo.org/show_bug.cgi?id=329499
+http://bugs.python.org/issue5504
+http://hg.python.org/cpython/rev/e13ea83e2edb
+
+--- Modules/_ctypes/callbacks.c
++++ Modules/_ctypes/callbacks.c
+@@ -21,8 +21,8 @@
+     Py_XDECREF(self->converters);
+     Py_XDECREF(self->callable);
+     Py_XDECREF(self->restype);
+-    if (self->pcl)
+-        FreeClosure(self->pcl);
++    if (self->pcl_write)
++        ffi_closure_free(self->pcl_write);
+     PyObject_GC_Del(self);
+ }
+ 
+@@ -373,7 +373,8 @@
+         return NULL;
+     }
+ 
+-    p->pcl = NULL;
++    p->pcl_exec = NULL;
++    p->pcl_write = NULL;
+     memset(&p->cif, 0, sizeof(p->cif));
+     p->converters = NULL;
+     p->callable = NULL;
+@@ -403,8 +404,9 @@
+ 
+     assert(CThunk_CheckExact(p));
+ 
+-    p->pcl = MallocClosure();
+-    if (p->pcl == NULL) {
++    p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure),
++                                     &p->pcl_exec);
++    if (p->pcl_write == NULL) {
+         PyErr_NoMemory();
+         goto error;
+     }
+@@ -449,7 +451,9 @@
+                      "ffi_prep_cif failed with %d", result);
+         goto error;
+     }
+-    result = ffi_prep_closure(p->pcl, &p->cif, closure_fcn, p);
++    result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn,
++                                  p,
++                                  p->pcl_exec);
+     if (result != FFI_OK) {
+         PyErr_Format(PyExc_RuntimeError,
+                      "ffi_prep_closure failed with %d", result);
+--- Modules/_ctypes/_ctypes.c
++++ Modules/_ctypes/_ctypes.c
+@@ -3443,7 +3443,7 @@
+     self->callable = callable;
+ 
+     self->thunk = thunk;
+-    *(void **)self->b_ptr = (void *)thunk->pcl;
++    *(void **)self->b_ptr = (void *)thunk->pcl_exec;
+ 
+     Py_INCREF((PyObject *)thunk); /* for KeepRef */
+     if (-1 == KeepRef((CDataObject *)self, 0, (PyObject *)thunk)) {
+--- Modules/_ctypes/ctypes.h
++++ Modules/_ctypes/ctypes.h
+@@ -95,7 +95,8 @@
+ 
+ typedef struct {
+     PyObject_VAR_HEAD
+-    ffi_closure *pcl; /* the C callable */
++    ffi_closure *pcl_write; /* the C callable, writeable */
++    void *pcl_exec;         /* the C callable, executable */
+     ffi_cif cif;
+     int flags;
+     PyObject *converters;
+@@ -427,9 +428,6 @@
+ 
+ #endif
+ 
+-extern void FreeClosure(void *);
+-extern void *MallocClosure(void);
+-
+ extern void _AddTraceback(char *, char *, int);
+ 
+ extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);
+--- Modules/_ctypes/malloc_closure.c
++++ Modules/_ctypes/malloc_closure.c
+@@ -93,7 +93,7 @@
+ /******************************************************************/
+ 
+ /* put the item back into the free list */
+-void FreeClosure(void *p)
++void ffi_closure_free(void *p)
+ {
+     ITEM *item = (ITEM *)p;
+     item->next = free_list;
+@@ -101,7 +101,7 @@
+ }
+ 
+ /* return one item from the free list, allocating more if needed */
+-void *MallocClosure(void)
++void *ffi_closure_alloc(size_t ignored, void** codeloc)
+ {
+     ITEM *item;
+     if (!free_list)
+@@ -110,5 +110,7 @@
+         return NULL;
+     item = free_list;
+     free_list = item->next;
+-    return item;
++	*codeloc = (void *)item;
++    return (void *)item;
+ }
++
+--- setup.py
++++ setup.py
+@@ -1885,8 +1885,7 @@
+                    '_ctypes/callbacks.c',
+                    '_ctypes/callproc.c',
+                    '_ctypes/stgdict.c',
+-                   '_ctypes/cfield.c',
+-                   '_ctypes/malloc_closure.c']
++                   '_ctypes/cfield.c']
+         depends = ['_ctypes/ctypes.h']
+ 
+         if sys.platform == 'darwin':

diff --git a/dev-lang/python/files/2.6/25_all_gdbm-1.9.patch b/dev-lang/python/files/2.6/25_all_gdbm-1.9.patch
new file mode 100644
index 0000000..85c991b
--- /dev/null
+++ b/dev-lang/python/files/2.6/25_all_gdbm-1.9.patch
@@ -0,0 +1,14 @@
+http://bugs.python.org/issue13007
+http://hg.python.org/cpython/rev/14cafb8d1480
+
+--- Lib/whichdb.py
++++ Lib/whichdb.py
+@@ -91,7 +91,7 @@
+         return ""
+ 
+     # Check for GNU dbm
+-    if magic == 0x13579ace:
++    if magic in (0x13579ace, 0x13579acd, 0x13579acf):
+         return "gdbm"
+ 
+     # Check for old Berkeley db hash file format v2

diff --git a/dev-lang/python/files/2.6/26_all_expat-2.1.patch b/dev-lang/python/files/2.6/26_all_expat-2.1.patch
new file mode 100644
index 0000000..9872136
--- /dev/null
+++ b/dev-lang/python/files/2.6/26_all_expat-2.1.patch
@@ -0,0 +1,15 @@
+http://bugs.python.org/issue9054
+http://hg.python.org/cpython/rev/5b536c90ca36
+
+--- Modules/pyexpat.c
++++ Modules/pyexpat.c
+@@ -456,6 +456,9 @@
+     PyObject *args;
+     PyObject *temp;
+ 
++    if (!have_handler(self, CharacterData))
++        return -1;
++
+     args = PyTuple_New(1);
+     if (args == NULL)
+         return -1;

diff --git a/dev-lang/python/files/2.6/41_all_crosscompile.patch b/dev-lang/python/files/2.6/41_all_crosscompile.patch
new file mode 100644
index 0000000..a398769
--- /dev/null
+++ b/dev-lang/python/files/2.6/41_all_crosscompile.patch
@@ -0,0 +1,113 @@
+--- configure.in
++++ configure.in
+@@ -3905,7 +3905,7 @@
+   AC_MSG_RESULT(no)
+ fi
+ 
+-AC_MSG_CHECKING(for %zd printf() format support)
++AC_CACHE_CHECK([for %zd printf() format support], [py_cv_has_zd_printf], [dnl
+ AC_TRY_RUN([#include <stdio.h>
+ #include <stddef.h>
+ #include <string.h>
+@@ -3939,10 +3939,13 @@
+ 	return 1;
+ 
+     return 0;
+-}],
+-[AC_MSG_RESULT(yes)
+- AC_DEFINE(PY_FORMAT_SIZE_T, "z", [Define to printf format modifier for Py_ssize_t])],
+- AC_MSG_RESULT(no))
++}], [py_cv_has_zd_printf="yes"],
++    [py_cv_has_zd_printf="no"],
++    [py_cv_has_zd_printf="cross -- assuming yes"]
++)])
++if test "$py_cv_has_zd_printf" != "no" ; then
++  AC_DEFINE(PY_FORMAT_SIZE_T, "z", [Define to printf format modifier for Py_ssize_t])
++fi
+ 
+ AC_CHECK_TYPE(socklen_t,,
+   AC_DEFINE(socklen_t,int,
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -176,6 +176,7 @@
+ 
+ PYTHON=		python$(EXE)
+ BUILDPYTHON=	python$(BUILDEXE)
++HOSTPYTHON=    $(BUILDPYTHON)
+ 
+ # The task to run while instrument when building the profile-opt target
+ PROFILE_TASK=	$(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
+@@ -209,6 +210,7 @@
+ # Parser
+ PGEN=		Parser/pgen$(EXE)
+ 
++HOSTPGEN=      $(PGEN)$(EXE)
+ POBJS=		\
+ 		Parser/acceler.o \
+ 		Parser/grammar1.o \
+@@ -398,7 +400,7 @@
+ # Build the shared modules
+ sharedmods: $(BUILDPYTHON)
+ 	@case $$MAKEFLAGS in \
+-	*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' CFLAGS='$(CFLAGS)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
++	*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' CFLAGS='$(CFLAGS)' ./$(HOSTPYTHON) -E $(srcdir)/setup.py build;; \
+ 	esac
+ 
+ # Build the platform-specific modules
+@@ -540,7 +542,7 @@
+ 
+ $(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
+ 		-@$(INSTALL) -d Include
+-		-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
++		-$(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
+ 
+ $(PGEN):	$(PGENOBJS)
+ 		$(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
+@@ -923,23 +925,23 @@
+ 	done
+ 	$(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
+ 	PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
+-		./$(BUILDPYTHON) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \
++		./$(HOSTPYTHON) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \
+ 		-d $(LIBDEST) -f \
+ 		-x 'bad_coding|badsyntax|site-packages' $(DESTDIR)$(LIBDEST)
+ 	PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+-		./$(BUILDPYTHON) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \
++		./$(HOSTPYTHON) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ 		-d $(LIBDEST) -f \
+ 		-x 'bad_coding|badsyntax|site-packages' $(DESTDIR)$(LIBDEST)
+ 	-PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
+-		./$(BUILDPYTHON) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \
++		./$(HOSTPYTHON) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \
+ 		-d $(LIBDEST)/site-packages -f \
+ 		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+ 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+-		./$(BUILDPYTHON) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \
++		./$(HOSTPYTHON) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ 		-d $(LIBDEST)/site-packages -f \
+ 		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+ 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+-		./$(BUILDPYTHON) -Wi -t -c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"
++		./$(HOSTPYTHON) -Wi -t -c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"
+ 
+ # Install the include files
+ INCLDIRSTOMAKE=$(INCLUDEDIR) $(CONFINCLUDEDIR) $(INCLUDEPY) $(CONFINCLUDEPY)
+@@ -1015,7 +1017,7 @@
+ # Install the dynamically loadable modules
+ # This goes into $(exec_prefix)
+ sharedinstall:
+-	$(RUNSHARED) ./$(BUILDPYTHON) -E $(srcdir)/setup.py install \
++	$(RUNSHARED) ./$(HOSTPYTHON) -E $(srcdir)/setup.py install \
+ 	   	--prefix=$(prefix) \
+ 		--install-scripts=$(BINDIR) \
+ 		--install-platlib=$(DESTSHARED) \
+--- setup.py
++++ setup.py
+@@ -334,6 +334,7 @@
+         try:
+             imp.load_dynamic(ext.name, ext_filename)
+         except ImportError, why:
++            return
+             self.failed.append(ext.name)
+             self.announce('*** WARNING: renaming "%s" since importing it'
+                           ' failed: %s' % (ext.name, why), level=3)

diff --git a/dev-lang/python/files/2.6/62_all_xml.use_pyxml.patch b/dev-lang/python/files/2.6/62_all_xml.use_pyxml.patch
new file mode 100644
index 0000000..757299b
--- /dev/null
+++ b/dev-lang/python/files/2.6/62_all_xml.use_pyxml.patch
@@ -0,0 +1,41 @@
+--- Lib/xml/__init__.py
++++ Lib/xml/__init__.py
+@@ -28,20 +28,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))

diff --git a/dev-lang/python/files/2.6/81_all_use_new_readline_function_types__closes__20374_.patch b/dev-lang/python/files/2.6/81_all_use_new_readline_function_types__closes__20374_.patch
new file mode 100644
index 0000000..b63f4c7
--- /dev/null
+++ b/dev-lang/python/files/2.6/81_all_use_new_readline_function_types__closes__20374_.patch
@@ -0,0 +1,28 @@
+# HG changeset patch
+# User Benjamin Peterson <benjamin@python.org>
+# Date 1390541532 18000
+#      Fri Jan 24 00:32:12 2014 -0500
+# Branch 2.7
+# Node ID 79b82ebc4fd17fda401c32840da1da0577e3c73e
+# Parent  f28b60141c5c417111670a22b223f0c411136c7b
+use new readline function types (closes #20374)
+
+diff --git a/Modules/readline.c b/Modules/readline.c
+--- a/Modules/readline.c
++++ b/Modules/readline.c
+@@ -911,12 +911,12 @@
+     rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
+     rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
+     /* Set our hook functions */
+-    rl_startup_hook = (Function *)on_startup_hook;
++    rl_startup_hook = (rl_hook_func_t *)on_startup_hook;
+ #ifdef HAVE_RL_PRE_INPUT_HOOK
+-    rl_pre_input_hook = (Function *)on_pre_input_hook;
++    rl_pre_input_hook = (rl_hook_func_t *)on_pre_input_hook;
+ #endif
+     /* Set our completion function */
+-    rl_attempted_completion_function = (CPPFunction *)flex_complete;
++    rl_attempted_completion_function = (rl_completion_func_t *)flex_complete;
+     /* Set Python word break characters */
+     completer_word_break_characters =
+         rl_completer_word_break_characters =

diff --git a/dev-lang/python/files/2.6/82_all_new_plan__just_remove_typecasts__closes__20374_.patch b/dev-lang/python/files/2.6/82_all_new_plan__just_remove_typecasts__closes__20374_.patch
new file mode 100644
index 0000000..71ac4b1
--- /dev/null
+++ b/dev-lang/python/files/2.6/82_all_new_plan__just_remove_typecasts__closes__20374_.patch
@@ -0,0 +1,37 @@
+# HG changeset patch
+# User Benjamin Peterson <benjamin@python.org>
+# Date 1390581856 18000
+#      Fri Jan 24 11:44:16 2014 -0500
+# Branch 2.7
+# Node ID 5e42e5764ac6277d61c0af231d402f59c223c91a
+# Parent  79b82ebc4fd17fda401c32840da1da0577e3c73e
+new plan: just remove typecasts (closes #20374)
+
+diff --git a/Modules/readline.c b/Modules/readline.c
+--- a/Modules/readline.c
++++ b/Modules/readline.c
+@@ -852,7 +852,7 @@
+  * before calling the normal completer */
+ 
+ static char **
+-flex_complete(char *text, int start, int end)
++flex_complete(const char *text, int start, int end)
+ {
+ #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER
+     rl_completion_append_character ='\0';
+@@ -911,12 +911,12 @@
+     rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
+     rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
+     /* Set our hook functions */
+-    rl_startup_hook = (rl_hook_func_t *)on_startup_hook;
++    rl_startup_hook = on_startup_hook;
+ #ifdef HAVE_RL_PRE_INPUT_HOOK
+-    rl_pre_input_hook = (rl_hook_func_t *)on_pre_input_hook;
++    rl_pre_input_hook = on_pre_input_hook;
+ #endif
+     /* Set our completion function */
+-    rl_attempted_completion_function = (rl_completion_func_t *)flex_complete;
++    rl_attempted_completion_function = flex_complete;
+     /* Set Python word break characters */
+     completer_word_break_characters =
+         rl_completer_word_break_characters =

diff --git a/dev-lang/python/files/2.6/83_all_Issue__20374__Avoid_compiler_warnings_when_compiling_readline_with_libedit_.patch b/dev-lang/python/files/2.6/83_all_Issue__20374__Avoid_compiler_warnings_when_compiling_readline_with_libedit_.patch
new file mode 100644
index 0000000..9934b80
--- /dev/null
+++ b/dev-lang/python/files/2.6/83_all_Issue__20374__Avoid_compiler_warnings_when_compiling_readline_with_libedit_.patch
@@ -0,0 +1,37 @@
+# HG changeset patch
+# User Ned Deily <nad@acm.org>
+# Date 1391647946 28800
+#      Wed Feb 05 16:52:26 2014 -0800
+# Branch 2.7
+# Node ID 0b5b0bfcc7b1dba77ee70ec6abba9037abf93acb
+# Parent  48c5c18110ae810c09b176f4cedf228cc3487451
+Issue #20374: Avoid compiler warnings when compiling readline with libedit.
+
+diff --git a/Modules/readline.c b/Modules/readline.c
+--- a/Modules/readline.c
++++ b/Modules/readline.c
+@@ -749,15 +749,24 @@
+     return result;
+ }
+ 
++
+ static int
++#if defined(_RL_FUNCTION_TYPEDEF)
+ on_startup_hook(void)
++#else
++on_startup_hook()
++#endif
+ {
+     return on_hook(startup_hook);
+ }
+ 
+ #ifdef HAVE_RL_PRE_INPUT_HOOK
+ static int
++#if defined(_RL_FUNCTION_TYPEDEF)
+ on_pre_input_hook(void)
++#else
++on_pre_input_hook()
++#endif
+ {
+     return on_hook(pre_input_hook);
+ }

diff --git a/dev-lang/python/files/2.6/99_all_tcl86.patch b/dev-lang/python/files/2.6/99_all_tcl86.patch
new file mode 100644
index 0000000..2362e98
--- /dev/null
+++ b/dev-lang/python/files/2.6/99_all_tcl86.patch
@@ -0,0 +1,11 @@
+--- a/setup.py
++++ b/setup.py
+@@ -1518,7 +1518,7 @@
+         # The versions with dots are used on Unix, and the versions without
+         # dots on Windows, for detection by cygwin.
+         tcllib = tklib = tcl_includes = tk_includes = None
+-        for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2',
++        for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', '8.2',
+                         '82', '8.1', '81', '8.0', '80']:
+             tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version)
+             tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version)

diff --git a/dev-lang/python/python-2.6.9.ebuild b/dev-lang/python/python-2.6.9.ebuild
new file mode 100644
index 0000000..4fab57d
--- /dev/null
+++ b/dev-lang/python/python-2.6.9.ebuild
@@ -0,0 +1,340 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI="5"
+WANT_AUTOMAKE="none"
+WANT_LIBTOOL="none"
+
+inherit autotools eutils flag-o-matic multilib pax-utils python-utils-r1 toolchain-funcs multiprocessing
+
+MY_P="Python-${PV}"
+
+DESCRIPTION="An interpreted, interactive, object-oriented programming language"
+HOMEPAGE="http://www.python.org/"
+SRC_URI="http://www.python.org/ftp/python/${PV}/${MY_P}.tar.xz"
+
+LICENSE="PSF-2"
+SLOT="2.6"
+KEYWORDS=""
+IUSE="-berkdb build doc elibc_uclibc examples gdbm hardened ipv6 +ncurses +readline sqlite +ssl +threads tk +wide-unicode wininst +xml"
+
+# Do not add a dependency on dev-lang/python to this ebuild.
+# If you need to apply a patch which requires python for bootstrapping, please
+# run the bootstrap code on your dev box and include the results in the
+# patchset. See bug 447752.
+
+RDEPEND="app-arch/bzip2
+	>=sys-libs/zlib-1.1.3
+	virtual/libffi
+	virtual/libintl
+	!build? (
+		berkdb? ( || (
+			sys-libs/db:4.7
+			sys-libs/db:4.6
+			sys-libs/db:4.5
+			sys-libs/db:4.4
+			sys-libs/db:4.3
+			sys-libs/db:4.2
+		) )
+		gdbm? ( sys-libs/gdbm[berkdb] )
+		ncurses? (
+			>=sys-libs/ncurses-5.2
+			readline? ( >=sys-libs/readline-4.1 )
+		)
+		sqlite? ( >=dev-db/sqlite-3.3.3:3 )
+		ssl? ( dev-libs/openssl )
+		tk? (
+			>=dev-lang/tk-8.0
+			dev-tcltk/blt
+		)
+		xml? ( >=dev-libs/expat-2.1 )
+	)
+	!!<sys-apps/portage-2.1.9"
+DEPEND="${RDEPEND}
+	virtual/pkgconfig
+	>=sys-devel/autoconf-2.61
+	!sys-devel/gcc[libffi]"
+RDEPEND+=" !build? ( app-misc/mime-types )
+	doc? ( dev-python/python-docs:${SLOT} )"
+
+S="${WORKDIR}/${MY_P}"
+
+pkg_setup() {
+	if use berkdb; then
+		ewarn "'bsddb' module is out-of-date and no longer maintained inside"
+		ewarn "dev-lang/python. 'bsddb' and 'dbhash' modules have been additionally"
+		ewarn "removed in Python 3. A maintained alternative of 'bsddb3' module"
+		ewarn "is provided by dev-python/bsddb3."
+	else
+		if has_version "=${CATEGORY}/${PN}-${PV%%.*}*[berkdb]"; then
+			ewarn "You are migrating from =${CATEGORY}/${PN}-${PV%%.*}*[berkdb]"
+			ewarn "to =${CATEGORY}/${PN}-${PV%%.*}*[-berkdb]."
+			ewarn "You might need to migrate your databases."
+		fi
+	fi
+}
+
+src_prepare() {
+	# Ensure that internal copies of expat, libffi and zlib are not used.
+	rm -r Modules/expat || die
+	rm -r Modules/_ctypes/libffi* || die
+	rm -r Modules/zlib || die
+
+	local excluded_patches
+	if ! tc-is-cross-compiler; then
+		excluded_patches="*_all_crosscompile.patch"
+	fi
+
+	EPATCH_EXCLUDE="${excluded_patches}" EPATCH_SUFFIX="patch" \
+		epatch "${FILESDIR}/${SLOT}"
+
+	sed -i -e "s:@@GENTOO_LIBDIR@@:$(get_libdir):g" \
+		Lib/distutils/command/install.py \
+		Lib/distutils/sysconfig.py \
+		Lib/site.py \
+		Makefile.pre.in \
+		Modules/Setup.dist \
+		Modules/getpath.c \
+		setup.py || die "sed failed to replace @@GENTOO_LIBDIR@@"
+
+	epatch_user
+
+	eautoconf
+	eautoheader
+}
+
+src_configure() {
+	if use build; then
+		# Disable extraneous modules with extra dependencies.
+		export PYTHON_DISABLE_MODULES="dbm _bsddb gdbm _curses _curses_panel readline _sqlite3 _tkinter _elementtree pyexpat"
+		export PYTHON_DISABLE_SSL="1"
+	else
+		# dbm module can be linked against berkdb or gdbm.
+		# Defaults to gdbm when both are enabled, #204343.
+		local disable
+		use berkdb   || use gdbm || disable+=" dbm"
+		use berkdb   || disable+=" _bsddb"
+		use gdbm     || disable+=" gdbm"
+		use ncurses  || disable+=" _curses _curses_panel"
+		use readline || disable+=" readline"
+		use sqlite   || disable+=" _sqlite3"
+		use ssl      || export PYTHON_DISABLE_SSL="1"
+		use tk       || disable+=" _tkinter"
+		use xml      || disable+=" _elementtree pyexpat" # _elementtree uses pyexpat.
+		export PYTHON_DISABLE_MODULES="${disable}"
+
+		if ! use xml; then
+			ewarn "You have configured Python without XML support."
+			ewarn "This is NOT a recommended configuration as you"
+			ewarn "may face problems parsing any XML documents."
+		fi
+	fi
+
+	if [[ -n "${PYTHON_DISABLE_MODULES}" ]]; then
+		einfo "Disabled modules: ${PYTHON_DISABLE_MODULES}"
+	fi
+
+	if [[ "$(gcc-major-version)" -ge 4 ]]; then
+		append-flags -fwrapv
+	fi
+
+	filter-flags -malign-double
+
+	[[ "${ARCH}" == "alpha" ]] && append-flags -fPIC
+
+	# https://bugs.gentoo.org/show_bug.cgi?id=50309
+	if is-flagq -O3; then
+		is-flagq -fstack-protector-all && replace-flags -O3 -O2
+		use hardened && replace-flags -O3 -O2
+	fi
+
+	# Run the configure scripts in parallel.
+	multijob_init
+
+	mkdir -p "${WORKDIR}"/{${CBUILD},${CHOST}} || die
+
+	if tc-is-cross-compiler; then
+		(
+			multijob_child_init
+			cd "${WORKDIR}"/${CBUILD} >/dev/null || die
+			OPT="-O1" CFLAGS="" CPPFLAGS="" LDFLAGS="" CC="" \
+			"${S}"/configure \
+				--{build,host}=${CBUILD} \
+				|| die "cross-configure failed"
+		) &
+		multijob_post_fork
+	fi
+
+	# Export CXX so it ends up in /usr/lib/python2.X/config/Makefile.
+	tc-export CXX
+	# The configure script fails to use pkg-config correctly.
+	# http://bugs.python.org/issue15506
+	export ac_cv_path_PKG_CONFIG=$(tc-getPKG_CONFIG)
+
+	# Set LDFLAGS so we link modules with -lpython2.6 correctly.
+	# Needed on FreeBSD unless Python 2.6 is already installed.
+	# Please query BSD team before removing this!
+	append-ldflags "-L."
+
+	cd "${WORKDIR}"/${CHOST} || die
+	ECONF_SOURCE=${S} OPT="" \
+	econf \
+		--with-fpectl \
+		--enable-shared \
+		$(use_enable ipv6) \
+		$(use_with threads) \
+		$(usex wide-unicode "--enable-unicode=ucs4" || echo "--enable-unicode=ucs2" "") \
+		--infodir='${prefix}/share/info' \
+		--mandir='${prefix}/share/man' \
+		--with-libc="" \
+		--with-system-ffi
+
+	if use threads && grep -q "#define POSIX_SEMAPHORES_NOT_ENABLED 1" pyconfig.h; then
+		eerror "configure has detected that the sem_open function is broken."
+		eerror "Please ensure that /dev/shm is mounted as a tmpfs with mode 1777."
+		die "Broken sem_open function (bug 496328)"
+	fi
+
+	if tc-is-cross-compiler; then
+		# Modify the Makefile.pre so we don't regen for the host/ one.
+		# We need to link the host python programs into $PWD and run
+		# them from here because the distutils sysconfig module will
+		# parse Makefile/etc... from argv[0], and we need it to pick
+		# up the target settings, not the host ones.
+		sed -i \
+			-e '1iHOSTPYTHONPATH = ./hostpythonpath:' \
+			-e '/^HOSTPYTHON/s:=.*:= ./hostpython:' \
+			-e '/^HOSTPGEN/s:=.*:= ./Parser/hostpgen:' \
+			Makefile{.pre,} || die "sed failed"
+	fi
+
+	multijob_finish
+}
+
+src_compile() {
+	if tc-is-cross-compiler; then
+		cd "${WORKDIR}"/${CBUILD}
+		# Disable as many modules as possible -- but we need a few to install.
+		PYTHON_DISABLE_MODULES=$(
+			sed -n "/Extension('/{s:^.*Extension('::;s:'.*::;p}" "${S}"/setup.py | \
+				egrep -v '(unicodedata|time|cStringIO|_struct|binascii)'
+		) \
+		PTHON_DISABLE_SSL="1" \
+		SYSROOT= \
+		emake
+		# See comment in src_configure about these.
+		ln python ../${CHOST}/hostpython || die
+		ln Parser/pgen ../${CHOST}/Parser/hostpgen || die
+		ln -s ../${CBUILD}/build/lib.*/ ../${CHOST}/hostpythonpath || die
+	fi
+
+	cd "${WORKDIR}"/${CHOST} || die
+	default
+
+	# Work around bug 329499. See also bug 413751.
+	pax-mark m python
+}
+
+src_test() {
+	# Tests will not work when cross compiling.
+	if tc-is-cross-compiler; then
+		elog "Disabling tests due to crosscompiling."
+		return
+	fi
+
+	cd "${WORKDIR}/${CHOST}" || die
+
+	# Skip failing tests.
+	local skipped_tests="distutils tcl"
+
+	for test in ${skipped_tests}; do
+		mv "${S}"/Lib/test/test_${test}.py "${T}"
+	done
+
+	# Rerun failed tests in verbose mode (regrtest -w).
+	PYTHONDONTWRITEBYTECODE="" emake test EXTRATESTOPTS="-w" < /dev/tty
+	local result="$?"
+
+	for test in ${skipped_tests}; do
+		mv "${T}/test_${test}.py" "${S}"/Lib/test || die
+	done
+
+	elog "The following tests have been skipped:"
+	for test in ${skipped_tests}; do
+		elog "test_${test}.py"
+	done
+
+	elog "If you would like to run them, you may:"
+	elog "cd '${EPREFIX}/usr/$(get_libdir)/python${SLOT}/test'"
+	elog "and run the tests separately."
+
+	if [[ "${result}" -ne 0 ]]; then
+		die "emake test failed"
+	fi
+}
+
+src_install() {
+	local libdir=${ED}/usr/$(get_libdir)/python${SLOT}
+
+	cd "${WORKDIR}"/${CHOST} || die
+	emake DESTDIR="${D}" altinstall maninstall
+
+	# Fix collisions between different slots of Python.
+	mv "${ED}usr/bin/2to3" "${ED}usr/bin/2to3-${SLOT}" || die
+	mv "${ED}usr/bin/pydoc" "${ED}usr/bin/pydoc${SLOT}" || die
+	mv "${ED}usr/bin/idle" "${ED}usr/bin/idle${SLOT}" || die
+	mv "${ED}usr/share/man/man1/python.1" "${ED}usr/share/man/man1/python${SLOT}.1" || die
+	rm -f "${ED}usr/bin/smtpd.py" || die
+
+	if use build; then
+		rm -fr "${ED}usr/bin/idle${SLOT}" "${libdir}/"{bsddb,dbhash.py,idlelib,lib-tk,sqlite3,test} || die
+	else
+		use elibc_uclibc && { rm -fr "${libdir}/"{bsddb/test,test} || die; }
+		use berkdb || { rm -fr "${libdir}/"{bsddb,dbhash.py,test/test_bsddb*} || die; }
+		use sqlite || { rm -fr "${libdir}/"{sqlite3,test/test_sqlite*} || die; }
+		use tk || { rm -fr "${ED}usr/bin/idle${SLOT}" "${libdir}/"{idlelib,lib-tk} || die; }
+	fi
+
+	use threads || { rm -fr "${libdir}/multiprocessing" || die; }
+	use wininst || { rm -f "${libdir}/distutils/command/"wininst-*.exe || die; }
+
+	dodoc "${S}"/Misc/{ACKS,HISTORY,NEWS}
+
+	if use examples; then
+		docinto examples
+		dodoc -r "${S}"/Tools/.
+	fi
+
+	newconfd "${FILESDIR}/pydoc.conf" pydoc-${SLOT} || die "newconfd failed"
+	newinitd "${FILESDIR}/pydoc.init" pydoc-${SLOT} || die "newinitd failed"
+	sed \
+		-e "s:@PYDOC_PORT_VARIABLE@:PYDOC${SLOT/./_}_PORT:" \
+		-e "s:@PYDOC@:pydoc${SLOT}:" \
+		-i "${ED}etc/conf.d/pydoc-${SLOT}" "${ED}etc/init.d/pydoc-${SLOT}" || die "sed failed"
+
+	# for python-exec
+	python_export python${SLOT} EPYTHON PYTHON PYTHON_SITEDIR
+
+	# if not using a cross-compiler, use the fresh binary
+	if ! tc-is-cross-compiler; then
+		local PYTHON=./python \
+			LD_LIBRARY_PATH=${LD_LIBRARY_PATH+${LD_LIBRARY_PATH}:}.
+		export LD_LIBRARY_PATH
+	fi
+
+	echo "EPYTHON='${EPYTHON}'" > epython.py
+	python_domodule epython.py
+}
+
+pkg_postinst() {
+	ewarn "Please note that Python ${SLOT} is no longer supported in Gentoo."
+	ewarn "The interpreter is not maintained, and may contain security"
+	ewarn "vulnerabilities. Gentoo ebuilds will no longer be built with support"
+	ewarn "for Python ${SLOT}."
+	ewarn
+	ewarn "If you wish to use Python ${SLOT} for your own purposes (development,"
+	ewarn "testing), we suggest establishing a virtualenv for this interpreter,"
+	ewarn "and installing the necessary dependencies inside it. However, we also"
+	ewarn "strongly discourage using Python ${SLOT} on production systems."
+}


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2015-08-09  8:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-09  8:56 [gentoo-commits] proj/python:master commit in: dev-lang/python/files/2.6/, dev-lang/python/ Michał Górny

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox