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 <benja...@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 <benja...@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 <n...@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."
+}

Reply via email to