commit:     97459af323867deeab8981cc82066be4a2631808
Author:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
AuthorDate: Fri Oct 28 00:02:42 2016 +0000
Commit:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
CommitDate: Fri Oct 28 00:02:42 2016 +0000
URL:        https://gitweb.gentoo.org/proj/python.git/commit/?id=97459af3

dev-lang/python: add 3.3.5

Package-Manager: portage-2.3.2

 dev-lang/python/Manifest                           |   1 +
 dev-lang/python/files/3.3/.gitattributes           |   1 +
 .../files/3.3/01_all_static_library_location.patch |  70 ++++
 .../files/3.3/02_all_disable_modules_and_ssl.patch |  57 ++++
 dev-lang/python/files/3.3/03_all_libdir.patch      | 174 ++++++++++
 .../04_all_non-zero_exit_status_on_failure.patch   |  31 ++
 ..._all_regenerate_platform-specific_modules.patch | 123 +++++++
 .../python/files/3.3/21_all_distutils_c++.patch    | 271 +++++++++++++++
 .../files/3.3/22_all_tests_environment.patch       | 192 +++++++++++
 .../python/files/3.3/23_all_h2py_encoding.patch    | 173 ++++++++++
 .../python/files/3.3/24_all_sqlite-3.8.4.patch     |  14 +
 .../python/files/3.3/61_all_process_data.patch     | 166 ++++++++++
 .../python/files/python-3.3-CVE-2014-4616.patch    |  52 +++
 dev-lang/python/files/python-3.3-libressl.patch    | 127 +++++++
 .../files/python-3.3.5-ncurses-pkg-config.patch    |  40 +++
 dev-lang/python/files/python-3.4-gcc-5.patch       |  37 +++
 dev-lang/python/metadata.xml                       |  13 +
 dev-lang/python/python-3.3.5.ebuild                | 368 +++++++++++++++++++++
 18 files changed, 1910 insertions(+)

diff --git a/dev-lang/python/Manifest b/dev-lang/python/Manifest
index 0e0bd0d..38fe597 100644
--- a/dev-lang/python/Manifest
+++ b/dev-lang/python/Manifest
@@ -1,2 +1,3 @@
 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
+DIST Python-3.3.5.tar.xz 12116308 SHA256 
abe99b484434503d8b23be0f243ec27139e743a4798cd71c1dce3cf40e63b6e5 SHA512 
562ebd85291f29ff18d37f05682763fc45aa9d070688006f4ef5c89392a48022357c3ca9ee1d795e9e863bdef413e6bab77b8d65581d374a76dbe7cacec65550
 WHIRLPOOL 
f4b6010d32b28b7bb038cbb7c5f98d325cc4253fd1be9a0a1089ed6fd7dd414c5169931d21ef819137d5c1084517a650828f260cf2a1d8ce871bc67aeef3fff8

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

diff --git a/dev-lang/python/files/3.3/01_all_static_library_location.patch 
b/dev-lang/python/files/3.3/01_all_static_library_location.patch
new file mode 100644
index 0000000..36ac67a
--- /dev/null
+++ b/dev-lang/python/files/3.3/01_all_static_library_location.patch
@@ -0,0 +1,70 @@
+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
+@@ -965,6 +965,19 @@
+               fi; \
+       else    true; \
+       fi
++      @if test -f $(LIBRARY) && test $(LIBRARY) != $(LDLIBRARY); then \
++              if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
++                      if test "$(SHLIB_SUFFIX)" = .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
+ 
+ bininstall: altbininstall
+       -if test -f $(DESTDIR)$(BINDIR)/python3$(EXE) -o -h 
$(DESTDIR)$(BINDIR)/python3$(EXE); \
+@@ -1200,18 +1213,6 @@
+               else    true; \
+               fi; \
+       done
+-      @if test -d $(LIBRARY); then :; else \
+-              if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+-                      if test "$(SHLIB_SUFFIX)" = .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
+@@ -47,11 +47,7 @@
+     elif opt in ('--libs', '--ldflags'):
+         libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
+         libs.append('-lpython' + pyver + sys.abiflags)
+-        # add the prefix/lib/pythonX.Y/config dir, but only if there is no
+-        # shared library in prefix/lib/.
+         if opt == '--ldflags':
+-            if not getvar('Py_ENABLE_SHARED'):
+-                libs.insert(0, '-L' + getvar('LIBPL'))
+             if not getvar('PYTHONFRAMEWORK'):
+                 libs.extend(getvar('LINKFORSHARED').split())
+         print(' '.join(libs))
+--- Modules/makesetup
++++ Modules/makesetup
+@@ -89,7 +89,7 @@
+        then
+               ExtraLibDir=.
+        else
+-              ExtraLibDir='$(LIBPL)'
++              ExtraLibDir='$(LIBDIR)'
+        fi
+        ExtraLibs="-L$ExtraLibDir -lpython\$(VERSION)";;
+ esac

diff --git a/dev-lang/python/files/3.3/02_all_disable_modules_and_ssl.patch 
b/dev-lang/python/files/3.3/02_all_disable_modules_and_ssl.patch
new file mode 100644
index 0000000..af735be
--- /dev/null
+++ b/dev-lang/python/files/3.3/02_all_disable_modules_and_ssl.patch
@@ -0,0 +1,57 @@
+--- setup.py
++++ setup.py
+@@ -31,7 +31,17 @@
+ COMPILED_WITH_PYDEBUG = ('--with-pydebug' in 
sysconfig.get_config_var("CONFIG_ARGS"))
+ 
+ # This global variable is used to hold the list of modules to be disabled.
+-disabled_module_list = []
++pdm_env = "PYTHON_DISABLE_MODULES"
++if pdm_env in os.environ:
++    disabled_module_list = os.environ[pdm_env].split()
++else:
++    disabled_module_list = []
++
++pds_env = "PYTHON_DISABLE_SSL"
++if pds_env in os.environ:
++    disable_ssl = os.environ[pds_env]
++else:
++    disable_ssl = 0
+ 
+ def add_dir_to_list(dirlist, dir):
+     """Add the directory 'dir' to the list 'dirlist' (after any relative
+@@ -435,6 +445,7 @@
+             os.unlink(tmpfile)
+ 
+     def detect_modules(self):
++        global disable_ssl
+         # Ensure that /usr/local is always used, but the local build
+         # directories (i.e. '.' and 'Include') must be first.  See issue
+         # 10520.
+@@ -747,7 +758,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:
+@@ -758,7 +769,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,
+@@ -791,7 +803,7 @@
+ 
+         #print('openssl_ver = 0x%08x' % openssl_ver)
+         min_openssl_ver = 0x00907000
+-        have_any_openssl = ssl_incs is not None and ssl_libs is not None
++        have_any_openssl = ssl_incs is not None and ssl_libs is not None and 
not disable_ssl
+         have_usable_openssl = (have_any_openssl and
+                                openssl_ver >= min_openssl_ver)
+ 

diff --git a/dev-lang/python/files/3.3/03_all_libdir.patch 
b/dev-lang/python/files/3.3/03_all_libdir.patch
new file mode 100644
index 0000000..052c51d
--- /dev/null
+++ b/dev-lang/python/files/3.3/03_all_libdir.patch
@@ -0,0 +1,174 @@
+--- Lib/distutils/command/install.py
++++ Lib/distutils/command/install.py
+@@ -44,8 +44,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$abiflags/$dist_name',
+         'scripts': '$base/bin',
+         'data'   : '$base',
+--- Lib/distutils/sysconfig.py
++++ Lib/distutils/sysconfig.py
+@@ -144,7 +144,7 @@
+ 
+     if os.name == "posix":
+         libpython = os.path.join(prefix,
+-                                 "lib", "python" + get_python_version())
++                                 "@@GENTOO_LIBDIR@@", "python" + 
get_python_version())
+         if standard_lib:
+             return libpython
+         else:
+--- Lib/site.py
++++ Lib/site.py
+@@ -303,10 +303,10 @@
+         if sys.platform in ('os2emx', 'riscos'):
+             sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
+         elif os.sep == '/':
+-            sitepackages.append(os.path.join(prefix, "lib",
++            sitepackages.append(os.path.join(prefix, "@@GENTOO_LIBDIR@@",
+                                         "python" + sys.version[:3],
+                                         "site-packages"))
+-            sitepackages.append(os.path.join(prefix, "lib", "site-python"))
++            sitepackages.append(os.path.join(prefix, "@@GENTOO_LIBDIR@@", 
"site-python"))
+         else:
+             sitepackages.append(prefix)
+             sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
+--- Lib/sysconfig.py
++++ Lib/sysconfig.py
+@@ -21,10 +21,10 @@
+ 
+ _INSTALL_SCHEMES = {
+     'posix_prefix': {
+-        'stdlib': '{installed_base}/lib/python{py_version_short}',
+-        'platstdlib': '{platbase}/lib/python{py_version_short}',
+-        'purelib': '{base}/lib/python{py_version_short}/site-packages',
+-        'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
++        'stdlib': 
'{installed_base}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'platstdlib': '{platbase}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'purelib': 
'{base}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
++        'platlib': 
'{platbase}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
+         'include':
+             '{installed_base}/include/python{py_version_short}{abiflags}',
+         'platinclude':
+@@ -81,10 +81,10 @@
+         'data': '{userbase}',
+         },
+     'posix_user': {
+-        'stdlib': '{userbase}/lib/python{py_version_short}',
+-        'platstdlib': '{userbase}/lib/python{py_version_short}',
+-        'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
+-        'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
++        'stdlib': '{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'platstdlib': '{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++        'purelib': 
'{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
++        'platlib': 
'{userbase}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
+         'include': '{userbase}/include/python{py_version_short}',
+         'scripts': '{userbase}/bin',
+         'data': '{userbase}',
+--- Lib/test/test_site.py
++++ Lib/test/test_site.py
+@@ -248,10 +248,10 @@
+         elif os.sep == '/':
+             # OS X non-framwework builds, Linux, FreeBSD, etc
+             self.assertEqual(len(dirs), 2)
+-            wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3],
++            wanted = os.path.join('xoxo', '@@GENTOO_LIBDIR@@', 'python' + 
sys.version[:3],
+                                   'site-packages')
+             self.assertEqual(dirs[0], wanted)
+-            wanted = os.path.join('xoxo', 'lib', 'site-python')
++            wanted = os.path.join('xoxo', '@@GENTOO_LIBDIR@@', 'site-python')
+             self.assertEqual(dirs[1], wanted)
+         else:
+             # other platforms
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -115,7 +115,7 @@
+ MANDIR=               @mandir@
+ INCLUDEDIR=   @includedir@
+ CONFINCLUDEDIR=       $(exec_prefix)/include
+-SCRIPTDIR=    $(prefix)/lib
++SCRIPTDIR=    $(prefix)/@@GENTOO_LIBDIR@@
+ ABIFLAGS=     @ABIFLAGS@
+ 
+ # Detailed destination directories
+--- Modules/getpath.c
++++ Modules/getpath.c
+@@ -122,8 +122,8 @@
+ #endif
+ 
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+-              EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/@@GENTOO_LIBDIR@@/python" VERSION ":" \
++              EXEC_PREFIX "/@@GENTOO_LIBDIR@@/python" VERSION "/lib-dynload"
+ #endif
+ 
+ #ifndef LANDMARK
+@@ -135,7 +135,7 @@
+ static wchar_t progpath[MAXPATHLEN+1];
+ static wchar_t *module_search_path = NULL;
+ static int module_search_path_malloced = 0;
+-static wchar_t *lib_python = L"lib/python" VERSION;
++static wchar_t *lib_python = L"@@GENTOO_LIBDIR@@/python" VERSION;
+ 
+ static void
+ reduce(wchar_t *dir)
+@@ -685,7 +685,7 @@
+     }
+     else
+         wcsncpy(zip_path, _prefix, MAXPATHLEN);
+-    joinpath(zip_path, L"lib/python00.zip");
++    joinpath(zip_path, L"@@GENTOO_LIBDIR@@/python00.zip");
+     bufsz = wcslen(zip_path);   /* Replace "00" with version */
+     zip_path[bufsz - 6] = VERSION[0];
+     zip_path[bufsz - 5] = VERSION[2];
+@@ -695,7 +695,7 @@
+             fprintf(stderr,
+                 "Could not find platform dependent libraries 
<exec_prefix>\n");
+         wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
+-        joinpath(exec_prefix, L"lib/lib-dynload");
++        joinpath(exec_prefix, L"@@GENTOO_LIBDIR@@/lib-dynload");
+     }
+     /* If we found EXEC_PREFIX do *not* reduce it!  (Yet.) */
+ 
+--- Modules/Setup.dist
++++ Modules/Setup.dist
+@@ -354,7 +354,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
+@@ -507,8 +507,7 @@
+         # be assumed that no additional -I,-L directives are needed.
+         if not cross_compiling:
+             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']
+         else:
+@@ -723,11 +722,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/3.3/04_all_non-zero_exit_status_on_failure.patch 
b/dev-lang/python/files/3.3/04_all_non-zero_exit_status_on_failure.patch
new file mode 100644
index 0000000..58b839f
--- /dev/null
+++ b/dev-lang/python/files/3.3/04_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
+@@ -43,6 +43,8 @@
+ else:
+     disable_ssl = 0
+ 
++exit_status = 0
++
+ def add_dir_to_list(dirlist, dir):
+     """Add the directory 'dir' to the list 'dirlist' (after any relative
+     directories) if:
+@@ -277,6 +279,8 @@
+             print()
+ 
+         if self.failed:
++            global exit_status
++            exit_status = 1
+             failed = self.failed[:]
+             print()
+             print("Failed to build these modules:")
+@@ -2213,6 +2217,7 @@
+           scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
+                      "Tools/scripts/2to3", "Tools/scripts/pyvenv"]
+         )
++    sys.exit(exit_status)
+ 
+ # --install-platlib
+ if __name__ == '__main__':

diff --git 
a/dev-lang/python/files/3.3/05_all_regenerate_platform-specific_modules.patch 
b/dev-lang/python/files/3.3/05_all_regenerate_platform-specific_modules.patch
new file mode 100644
index 0000000..68f33f7
--- /dev/null
+++ 
b/dev-lang/python/files/3.3/05_all_regenerate_platform-specific_modules.patch
@@ -0,0 +1,123 @@
+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-linux/regen
++++ Lib/plat-linux/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
+@@ -444,7 +444,7 @@
+ 
+ # Default target
+ all:          build_all
+-build_all:    $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks 
Modules/_testembed
++build_all:    $(BUILDPYTHON) oldsharedmods sharedmods platformspecificmods 
gdbhooks Modules/_testembed
+ 
+ # Compile a binary with gcc profile guided optimization.
+ profile-opt:
+@@ -500,6 +500,32 @@
+               _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' 
\
+               $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
+ 
++# Build the platform-specific modules
++platformspecificmods: $(BUILDPYTHON) sharedmods
++      @PLATDIR=$(PLATDIR); \
++      if test ! -f $(srcdir)/Lib/$(PLATDIR)/regen; then \
++              $(INSTALL) -d $(srcdir)/Lib/$(PLATDIR); \
++              if test -f $(srcdir)/Lib/$${PLATDIR%?}/regen; then \
++                      cp $(srcdir)/Lib/$${PLATDIR%?}/regen 
$(srcdir)/Lib/$(PLATDIR)/regen; \
++              else \
++                      cp $(srcdir)/Lib/plat-generic/regen 
$(srcdir)/Lib/$(PLATDIR)/regen; \
++              fi \
++      fi
++      @EXE="$(BUILDEXE)"; export EXE; \
++      PATH="`pwd`:$$PATH"; export PATH; \
++      PYTHONPATH="`pwd`/Lib"; export PYTHONPATH; \
++      if [ -n "$(MULTIARCH)" ]; then MULTIARCH=$(MULTIARCH); export 
MULTIARCH; fi; \
++      if [ "$(BUILD_GNU_TYPE)" = "$(HOST_GNU_TYPE)" ]; then \
++        PYTHON_FOR_BUILD="$(BUILDPYTHON)"; \
++      else \
++        PYTHON_FOR_BUILD="$(PYTHON_FOR_BUILD)"; \
++      fi; export PYTHON_FOR_BUILD; \
++      cd $(srcdir)/Lib/$(PLATDIR); \
++      $(RUNSHARED) ./regen || exit 1; \
++      for module in *.py; do \
++              $(RUNSHARED) $(BUILDPYTHON) -c "with open('$$module', 'rb') as 
module: compile(module.read(), '$$module', 'exec')" || exit 1; \
++      done
++
+ # Build static library
+ # avoid long command lines, same as LIBRARY_OBJS
+ $(LIBRARY): $(LIBRARY_OBJS)
+@@ -1074,7 +1100,7 @@
+               unittest unittest/test unittest/test/testmock \
+               venv venv/scripts venv/scripts/posix \
+               curses pydoc_data $(MACHDEPS)
+-libinstall:   build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
++libinstall:   build_all $(srcdir)/Modules/xxmodule.c
+       @for i in $(SCRIPTDIR) $(LIBDEST); \
+       do \
+               if test ! -d $(DESTDIR)$$i; then \
+@@ -1157,23 +1183,6 @@
+       -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+               $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver 
$(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
+ 
+-# Create the PLATDIR source directory, if one wasn't distributed..
+-$(srcdir)/Lib/$(PLATDIR):
+-      mkdir $(srcdir)/Lib/$(PLATDIR)
+-      cp $(srcdir)/Lib/plat-generic/regen $(srcdir)/Lib/$(PLATDIR)/regen
+-      export PATH; PATH="`pwd`:$$PATH"; \
+-      export PYTHONPATH; PYTHONPATH="`pwd`/Lib"; \
+-      export DYLD_FRAMEWORK_PATH; DYLD_FRAMEWORK_PATH="`pwd`"; \
+-      export EXE; EXE="$(BUILDEXE)"; \
+-      if [ -n "$(MULTIARCH)" ]; then export MULTIARCH; 
MULTIARCH=$(MULTIARCH); fi; \
+-      export PYTHON_FOR_BUILD; \
+-      if [ "$(BUILD_GNU_TYPE)" = "$(HOST_GNU_TYPE)" ]; then \
+-        PYTHON_FOR_BUILD="$(BUILDPYTHON)"; \
+-      else \
+-        PYTHON_FOR_BUILD="$(PYTHON_FOR_BUILD)"; \
+-      fi; \
+-      cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen
+-
+ python-config: $(srcdir)/Misc/python-config.in
+       # Substitution happens here, as the completely-expanded BINDIR
+       # is not available in configure
+@@ -1476,7 +1485,7 @@
+ Python/thread.o: @THREADHEADERS@
+ 
+ # Declare targets that aren't real files
+-.PHONY: all build_all sharedmods oldsharedmods test quicktest
++.PHONY: all build_all sharedmods oldsharedmods platformspecificmods test 
quicktest
+ .PHONY: install altinstall oldsharedinstall bininstall altbininstall
+ .PHONY: maninstall libinstall inclinstall libainstall sharedinstall
+ .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure

diff --git a/dev-lang/python/files/3.3/21_all_distutils_c++.patch 
b/dev-lang/python/files/3.3/21_all_distutils_c++.patch
new file mode 100644
index 0000000..1f6c19a
--- /dev/null
+++ b/dev-lang/python/files/3.3/21_all_distutils_c++.patch
@@ -0,0 +1,271 @@
+http://bugs.python.org/issue1222585
+
+--- Lib/distutils/cygwinccompiler.py
++++ Lib/distutils/cygwinccompiler.py
+@@ -124,8 +124,10 @@
+         # dllwrap 2.10.90 is buggy
+         if self.ld_version >= "2.10.90":
+             self.linker_dll = "gcc"
++            self.linker_dll_cxx = "g++"
+         else:
+             self.linker_dll = "dllwrap"
++            self.linker_dll_cxx = "dllwrap"
+ 
+         # ld_version >= "2.13" support -shared so use it instead of
+         # -mdll -static
+@@ -139,9 +141,13 @@
+         self.set_executables(compiler='gcc -mcygwin -O -Wall',
+                              compiler_so='gcc -mcygwin -mdll -O -Wall',
+                              compiler_cxx='g++ -mcygwin -O -Wall',
++                             compiler_so_cxx='g++ -mcygwin -mdll -O -Wall',
+                              linker_exe='gcc -mcygwin',
+                              linker_so=('%s -mcygwin %s' %
+-                                        (self.linker_dll, shared_option)))
++                                        (self.linker_dll, shared_option)),
++                             linker_exe_cxx='g++ -mcygwin',
++                             linker_so_cxx=('%s -mcygwin %s' %
++                                            (self.linker_dll_cxx, 
shared_option)))
+ 
+         # cygwin and mingw32 need different sets of libraries
+         if self.gcc_version == "2.91.57":
+@@ -165,8 +171,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 as msg:
+                 raise CompileError(msg)
+ 
+@@ -302,9 +312,14 @@
+         self.set_executables(compiler='gcc%s -O -Wall' % no_cygwin,
+                              compiler_so='gcc%s -mdll -O -Wall' % no_cygwin,
+                              compiler_cxx='g++%s -O -Wall' % no_cygwin,
++                             compiler_so_cxx='g++%s -mdll -O -Wall' % 
no_cygwin,
+                              linker_exe='gcc%s' % no_cygwin,
+                              linker_so='%s%s %s %s'
+                                     % (self.linker_dll, no_cygwin,
++                                       shared_option, entry_point),
++                             linker_exe_cxx='g++%s' % no_cygwin,
++                             linker_so_cxx='%s%s %s %s'
++                                    % (self.linker_dll_cxx, no_cygwin,
+                                        shared_option, entry_point))
+         # Maybe we should also append -mthreads, but then the finished
+         # dlls need another dll (mingwm10.dll see Mingw32 docs)
+--- Lib/distutils/emxccompiler.py
++++ Lib/distutils/emxccompiler.py
+@@ -63,8 +63,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)
+@@ -81,8 +85,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 as msg:
+                 raise CompileError(msg)
+ 
+--- Lib/distutils/sysconfig.py
++++ Lib/distutils/sysconfig.py
+@@ -191,9 +191,12 @@
+                 _osx_support.customize_compiler(_config_vars)
+                 _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
+ 
+-        (cc, cxx, opt, cflags, ccshared, ldshared, shlib_suffix, ar, 
ar_flags) = \
+-            get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
+-                            'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 
'ARFLAGS')
++        (cc, cxx, ccshared, ldshared, ldcxxshared, shlib_suffix, ar, 
ar_flags) = \
++            get_config_vars('CC', 'CXX', 'CCSHARED', 'LDSHARED', 
'LDCXXSHARED',
++                            'SHLIB_SUFFIX', 'AR', 'ARFLAGS')
++
++        cflags = ''
++        cxxflags = ''
+ 
+         if 'CC' in os.environ:
+             newcc = os.environ['CC']
+@@ -208,19 +211,27 @@
+             cxx = os.environ['CXX']
+         if 'LDSHARED' in os.environ:
+             ldshared = os.environ['LDSHARED']
++        if 'LDCXXSHARED' in os.environ:
++            ldcxxshared = os.environ['LDCXXSHARED']
+         if 'CPP' in os.environ:
+             cpp = os.environ['CPP']
+         else:
+             cpp = cc + " -E"           # not always
+         if 'LDFLAGS' in os.environ:
+             ldshared = ldshared + ' ' + os.environ['LDFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS']
+         if 'CFLAGS' in os.environ:
+-            cflags = opt + ' ' + os.environ['CFLAGS']
++            cflags = os.environ['CFLAGS']
+             ldshared = ldshared + ' ' + os.environ['CFLAGS']
++        if 'CXXFLAGS' in os.environ:
++            cxxflags = os.environ['CXXFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS']
+         if 'CPPFLAGS' in os.environ:
+             cpp = cpp + ' ' + os.environ['CPPFLAGS']
+             cflags = cflags + ' ' + os.environ['CPPFLAGS']
++            cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS']
+             ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS']
+         if 'AR' in os.environ:
+             ar = os.environ['AR']
+         if 'ARFLAGS' in os.environ:
+@@ -229,13 +240,17 @@
+             archiver = ar + ' ' + ar_flags
+ 
+         cc_cmd = cc + ' ' + cflags
++        cxx_cmd = cxx + ' ' + cxxflags
+         compiler.set_executables(
+             preprocessor=cpp,
+             compiler=cc_cmd,
+             compiler_so=cc_cmd + ' ' + ccshared,
+-            compiler_cxx=cxx,
++            compiler_cxx=cxx_cmd,
++            compiler_so_cxx=cxx_cmd + ' ' + ccshared,
+             linker_so=ldshared,
+             linker_exe=cc,
++            linker_so_cxx=ldcxxshared,
++            linker_exe_cxx=cxx,
+             archiver=archiver)
+ 
+         compiler.shared_lib_extension = shlib_suffix
+--- Lib/distutils/unixccompiler.py
++++ Lib/distutils/unixccompiler.py
+@@ -52,14 +52,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":
+@@ -108,12 +111,19 @@
+ 
+     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
+         compiler_so = self.compiler_so
++        compiler_so_cxx = self.compiler_so_cxx
+         if sys.platform == 'darwin':
+             compiler_so = _osx_support.compiler_fixup(compiler_so,
+                                                     cc_args + extra_postargs)
++            compiler_so_cxx = _osx_support.compiler_fixup(compiler_so_cxx,
++                                                    cc_args + extra_postargs)
+         try:
+-            self.spawn(compiler_so + cc_args + [src, '-o', obj] +
+-                       extra_postargs)
++            if self.detect_language(src) == 'c++':
++                self.spawn(compiler_so_cxx + cc_args + [src, '-o', obj] +
++                           extra_postargs)
++            else:
++                self.spawn(compiler_so + cc_args + [src, '-o', obj] +
++                           extra_postargs)
+         except DistutilsExecError as msg:
+             raise CompileError(msg)
+ 
+@@ -171,22 +181,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 += 1
+-                    linker[i] = self.compiler_cxx[i]
++                    if target_desc == CCompiler.EXECUTABLE:
++                        linker = self.linker_exe[:]
++                    else:
++                        linker = self.linker_so[:]
+ 
+                 if sys.platform == 'darwin':
+                     linker = _osx_support.compiler_fixup(linker, ld_args)
+--- Lib/_osx_support.py
++++ Lib/_osx_support.py
+@@ -14,13 +14,13 @@
+ # configuration variables that may contain universal build flags,
+ # like "-arch" or "-isdkroot", that may need customization for
+ # the user environment
+-_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS',
+-                            'BLDSHARED', 'LDSHARED', 'CC', 'CXX',
+-                            'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS',
+-                            'PY_CORE_CFLAGS')
++_UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CPPFLAGS',
++                          'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 
'LDCXXSHARED',
++                          'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS',
++                          'PY_CPPFLAGS', 'PY_CORE_CFLAGS')
+ 
+ # configuration variables that may contain compiler calls
+-_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX')
++_COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'LDCXXSHARED', 'CC', 'CXX')
+ 
+ # prefix added to original configuration variable names
+ _INITPRE = '_OSX_SUPPORT_INITIAL_'
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -496,7 +496,7 @@
+           *\ -s*|s*) quiet="-q";; \
+           *) quiet="";; \
+       esac; \
+-      $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
++      $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \
+               _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' 
\
+               $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
+ 

diff --git a/dev-lang/python/files/3.3/22_all_tests_environment.patch 
b/dev-lang/python/files/3.3/22_all_tests_environment.patch
new file mode 100644
index 0000000..edb3351
--- /dev/null
+++ b/dev-lang/python/files/3.3/22_all_tests_environment.patch
@@ -0,0 +1,192 @@
+http://bugs.python.org/issue1674555
+
+--- Lib/site.py
++++ Lib/site.py
+@@ -587,8 +587,9 @@
+     known_paths = venv(known_paths)
+     if ENABLE_USER_SITE is None:
+         ENABLE_USER_SITE = check_enableusersite()
+-    known_paths = addusersitepackages(known_paths)
+-    known_paths = addsitepackages(known_paths)
++    if os.environ.get("_PYTHONNOSITEPACKAGES") is None:
++        known_paths = addusersitepackages(known_paths)
++        known_paths = addsitepackages(known_paths)
+     if sys.platform == 'os2emx':
+         setBEGINLIBPATH()
+     setquit()
+--- Lib/test/regrtest.py
++++ Lib/test/regrtest.py
+@@ -188,6 +188,7 @@
+ import unittest
+ import warnings
+ from inspect import isabstract
++from subprocess import Popen, PIPE
+ 
+ try:
+     import threading
+@@ -578,6 +579,62 @@
+     support.use_resources = use_resources
+     save_modules = sys.modules.keys()
+ 
++    opt_args = support.args_from_interpreter_flags()
++    base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
++    debug_output_pat = re.compile(r"\[\d+ refs\]$")
++
++    def get_args_tuple(test, verbose, quiet, huntrleaks, debug, use_resources,
++                       output_on_failure, failfast, match_tests, timeout):
++        return (
++            (test, verbose, quiet),
++            dict(huntrleaks=huntrleaks, debug=debug,
++                 use_resources=use_resources,
++                 output_on_failure=output_on_failure, failfast=failfast,
++                 match_tests=match_tests, timeout=timeout)
++        )
++
++    def _runtest(test, verbose, quiet, huntrleaks=False, debug=False,
++                 use_resources=None, output_on_failure=False, failfast=False,
++                 match_tests=None, timeout=None):
++        if test == "test_site":
++            args_tuple = get_args_tuple(test, verbose, quiet, huntrleaks, 
debug,
++                                        use_resources, output_on_failure,
++                                        failfast, match_tests, timeout)
++            env = os.environ.copy()
++            try:
++                del env["_PYTHONNOSITEPACKAGES"]
++            except KeyError:
++                pass
++            popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
++                          stdout=PIPE, stderr=PIPE,
++                          universal_newlines=True,
++                          close_fds=(os.name != 'nt'),
++                          env=env)
++            stdout, stderr = popen.communicate()
++            retcode = popen.wait()
++            # Strip last refcount output line if it exists, since it
++            # comes from the shutdown of the interpreter in the subcommand.
++            stderr = debug_output_pat.sub("", stderr)
++            stdout, _, result = stdout.strip().rpartition("\n")
++            if retcode != 0:
++                result = (CHILD_ERROR, "Exit code %s" % retcode)
++            else:
++                result = json.loads(result)
++            if stdout:
++                print(stdout)
++            if stderr:
++                print(stderr, file=sys.stderr)
++            if result[0] == INTERRUPTED:
++                assert result[1] == 'KeyboardInterrupt'
++                raise KeyboardInterrupt
++            return result
++        else:
++            return runtest(test, verbose, quiet, huntrleaks=huntrleaks,
++                           debug=debug, use_resources=use_resources,
++                           output_on_failure=output_on_failure,
++                           failfast=failfast, match_tests=match_tests,
++                           timeout=timeout)
++
+     def accumulate_result(test, result):
+         ok, test_time = result
+         test_times.append((test_time, test))
+@@ -615,12 +672,8 @@
+             print("Multiprocess option requires thread support")
+             sys.exit(2)
+         from queue import Queue
+-        from subprocess import Popen, PIPE
+-        debug_output_pat = re.compile(r"\[\d+ refs\]$")
+         output = Queue()
+         pending = MultiprocessTests(tests)
+-        opt_args = support.args_from_interpreter_flags()
+-        base_cmd = [sys.executable] + opt_args + ['-m', 'test.regrtest']
+         def work():
+             # A worker thread.
+             try:
+@@ -630,13 +683,9 @@
+                     except StopIteration:
+                         output.put((None, None, None, None))
+                         return
+-                    args_tuple = (
+-                        (test, verbose, quiet),
+-                        dict(huntrleaks=huntrleaks, 
use_resources=use_resources,
+-                             debug=debug, output_on_failure=verbose3,
+-                             timeout=timeout, failfast=failfast,
+-                             match_tests=match_tests)
+-                    )
++                    args_tuple = get_args_tuple(test, verbose, quiet, 
huntrleaks,
++                                                debug, use_resources, 
verbose3,
++                                                failfast, match_tests, 
timeout)
+                     # -E is needed by some tests, e.g. test_import
+                     # Running the child from the same working directory 
ensures
+                     # that TEMPDIR for the child is the same when
+@@ -707,14 +756,14 @@
+             if trace:
+                 # If we're tracing code coverage, then we don't exit with 
status
+                 # if on a false return value from main.
+-                tracer.runctx('runtest(test, verbose, quiet, 
timeout=timeout)',
++                tracer.runctx('_runtest(test, verbose, quiet, 
timeout=timeout)',
+                               globals=globals(), locals=vars())
+             else:
+                 try:
+-                    result = runtest(test, verbose, quiet, huntrleaks, debug,
+-                                     output_on_failure=verbose3,
+-                                     timeout=timeout, failfast=failfast,
+-                                     match_tests=match_tests)
++                    result = _runtest(test, verbose, quiet, huntrleaks, debug,
++                                      output_on_failure=verbose3,
++                                      timeout=timeout, failfast=failfast,
++                                      match_tests=match_tests)
+                     accumulate_result(test, result)
+                 except KeyboardInterrupt:
+                     interrupted = True
+@@ -785,7 +834,7 @@
+             sys.stdout.flush()
+             try:
+                 verbose = True
+-                ok = runtest(test, True, quiet, huntrleaks, debug, 
timeout=timeout)
++                ok = _runtest(test, True, quiet, huntrleaks, debug, 
timeout=timeout)
+             except KeyboardInterrupt:
+                 # print a newline separate from the ^C
+                 print()
+@@ -1182,8 +1231,9 @@
+         for name, get, restore in self.resource_info():
+             current = get()
+             original = saved_values.pop(name)
+-            # Check for changes to the resource's value
+-            if current != original:
++            # Check for changes to the resource's value. test_site is always 
run
++            # in a subprocess and is allowed to change os.environ and 
sys.path.
++            if current != original and self.testname != "test_site":
+                 self.changed = True
+                 restore(original)
+                 if not self.quiet:
+--- Lib/test/test_site.py
++++ Lib/test/test_site.py
+@@ -8,6 +8,7 @@
+ import test.support
+ from test.support import captured_stderr, TESTFN, EnvironmentVarGuard
+ import builtins
++import imp
+ import os
+ import sys
+ import re
+@@ -26,6 +27,10 @@
+ 
+ import site
+ 
++if "_PYTHONNOSITEPACKAGES" in os.environ:
++    del os.environ["_PYTHONNOSITEPACKAGES"]
++    imp.reload(site)
++
+ if site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE):
+     # need to add user site directory for tests
+     os.makedirs(site.USER_SITE)
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -883,7 +883,7 @@
+ ######################################################################
+ 
+ TESTOPTS=     $(EXTRATESTOPTS)
+-TESTPYTHON=   $(RUNSHARED) ./$(BUILDPYTHON) $(TESTPYTHONOPTS)
++TESTPYTHON=   _PYTHONNOSITEPACKAGES=1 $(RUNSHARED) ./$(BUILDPYTHON) 
$(TESTPYTHONOPTS)
+ TESTRUNNER=   $(TESTPYTHON) $(srcdir)/Tools/scripts/run_tests.py
+ TESTTIMEOUT=  3600
+ 

diff --git a/dev-lang/python/files/3.3/23_all_h2py_encoding.patch 
b/dev-lang/python/files/3.3/23_all_h2py_encoding.patch
new file mode 100644
index 0000000..d594f56
--- /dev/null
+++ b/dev-lang/python/files/3.3/23_all_h2py_encoding.patch
@@ -0,0 +1,173 @@
+http://bugs.python.org/issue13032
+
+--- Tools/scripts/h2py.py
++++ Tools/scripts/h2py.py
+@@ -23,36 +23,36 @@
+ 
+ import sys, re, getopt, os
+ 
+-p_define = re.compile('^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)[\t ]+')
++p_define = re.compile(b'^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)[\t ]+')
+ 
+ p_macro = re.compile(
+-  '^[\t ]*#[\t ]*define[\t ]+'
+-  '([a-zA-Z0-9_]+)\(([_a-zA-Z][_a-zA-Z0-9]*)\)[\t ]+')
++  b'^[\t ]*#[\t ]*define[\t ]+'
++  b'([a-zA-Z0-9_]+)\(([_a-zA-Z][_a-zA-Z0-9]*)\)[\t ]+')
+ 
+-p_include = re.compile('^[\t ]*#[\t ]*include[\t ]+<([a-zA-Z0-9_/\.]+)')
++p_include = re.compile(b'^[\t ]*#[\t ]*include[\t ]+<([a-zA-Z0-9_/\.]+)')
+ 
+-p_comment = re.compile(r'/\*([^*]+|\*+[^/])*(\*+/)?')
+-p_cpp_comment = re.compile('//.*')
++p_comment = re.compile(br'/\*([^*]+|\*+[^/])*(\*+/)?')
++p_cpp_comment = re.compile(b'//.*')
+ 
+ ignores = [p_comment, p_cpp_comment]
+ 
+-p_char = re.compile(r"'(\\.[^\\]*|[^\\])'")
++p_char = re.compile(br"'(\\.[^\\]*|[^\\])'")
+ 
+-p_hex = re.compile(r"0x([0-9a-fA-F]+)L?")
++p_hex = re.compile(br"0x([0-9a-fA-F]+)L?")
+ 
+ filedict = {}
+ importable = {}
+ 
+ try:
+-    searchdirs=os.environ['include'].split(';')
++    searchdirs=os.environb[b'include'].split(b';')
+ except KeyError:
+     try:
+-        searchdirs=os.environ['INCLUDE'].split(';')
++        searchdirs=os.environb[b'INCLUDE'].split(b';')
+     except KeyError:
+-        searchdirs=['/usr/include']
++        searchdirs=[b'/usr/include']
+         try:
+-            searchdirs.insert(0, os.path.join('/usr/include',
+-                                              os.environ['MULTIARCH']))
++            searchdirs.insert(0, os.path.join(b'/usr/include',
++                                              os.environb[b'MULTIARCH']))
+         except KeyError:
+             pass
+ 
+@@ -61,22 +61,23 @@
+     opts, args = getopt.getopt(sys.argv[1:], 'i:')
+     for o, a in opts:
+         if o == '-i':
+-            ignores.append(re.compile(a))
++            ignores.append(re.compile(a.encode()))
+     if not args:
+         args = ['-']
+     for filename in args:
+         if filename == '-':
+             sys.stdout.write('# Generated by h2py from stdin\n')
+-            process(sys.stdin, sys.stdout)
++            process(sys.stdin.buffer, sys.stdout.buffer)
+         else:
+-            fp = open(filename, 'r')
++            filename = filename.encode()
++            fp = open(filename, 'rb')
+             outfile = os.path.basename(filename)
+-            i = outfile.rfind('.')
++            i = outfile.rfind(b'.')
+             if i > 0: outfile = outfile[:i]
+             modname = outfile.upper()
+-            outfile = modname + '.py'
+-            outfp = open(outfile, 'w')
+-            outfp.write('# Generated by h2py from %s\n' % filename)
++            outfile = modname + b'.py'
++            outfp = open(outfile, 'wb')
++            outfp.write(b'# Generated by h2py from ' + filename + b'\n')
+             filedict = {}
+             for dir in searchdirs:
+                 if filename[:len(dir)] == dir:
+@@ -90,9 +91,9 @@
+ def pytify(body):
+     # replace ignored patterns by spaces
+     for p in ignores:
+-        body = p.sub(' ', body)
++        body = p.sub(b' ', body)
+     # replace char literals by ord(...)
+-    body = p_char.sub("ord('\\1')", body)
++    body = p_char.sub(b"ord('\\1')", body)
+     # Compute negative hexadecimal constants
+     start = 0
+     UMAX = 2*(sys.maxsize+1)
+@@ -103,7 +104,7 @@
+         val = int(body[slice(*m.span(1))], 16)
+         if val > sys.maxsize:
+             val -= UMAX
+-            body = body[:s] + "(" + str(val) + ")" + body[e:]
++            body = body[:s] + b"(" + str(val).encode() + b")" + body[e:]
+         start = s + 1
+     return body
+ 
+@@ -116,7 +117,7 @@
+         match = p_define.match(line)
+         if match:
+             # gobble up continuation lines
+-            while line[-2:] == '\\\n':
++            while line[-2:] == b'\\\n':
+                 nextline = fp.readline()
+                 if not nextline: break
+                 lineno = lineno + 1
+@@ -125,11 +126,11 @@
+             body = line[match.end():]
+             body = pytify(body)
+             ok = 0
+-            stmt = '%s = %s\n' % (name, body.strip())
++            stmt = name + b' = ' + body.strip() + b'\n'
+             try:
+                 exec(stmt, env)
+             except:
+-                sys.stderr.write('Skipping: %s' % stmt)
++                sys.stderr.buffer.write(b'Skipping: ' + stmt)
+             else:
+                 outfp.write(stmt)
+         match = p_macro.match(line)
+@@ -137,11 +138,11 @@
+             macro, arg = match.group(1, 2)
+             body = line[match.end():]
+             body = pytify(body)
+-            stmt = 'def %s(%s): return %s\n' % (macro, arg, body)
++            stmt = b'def ' + macro + b'(' + arg + b'): return ' + body + b'\n'
+             try:
+                 exec(stmt, env)
+             except:
+-                sys.stderr.write('Skipping: %s' % stmt)
++                sys.stderr.buffer.write(b'Skipping: ' + stmt)
+             else:
+                 outfp.write(stmt)
+         match = p_include.match(line)
+@@ -150,23 +151,24 @@
+             a, b = regs[1]
+             filename = line[a:b]
+             if filename in importable:
+-                outfp.write('from %s import *\n' % importable[filename])
++                outfp.write(b'from ' + importable[filename] + b' import *\n')
+             elif filename not in filedict:
+                 filedict[filename] = None
+                 inclfp = None
+                 for dir in searchdirs:
+                     try:
+-                        inclfp = open(dir + '/' + filename)
++                        inclfp = open(dir + b'/' + filename, 'rb')
+                         break
+                     except IOError:
+                         pass
+                 if inclfp:
+                     outfp.write(
+-                            '\n# Included from %s\n' % filename)
++                            b'\n# Included from ' + filename + b'\n')
+                     process(inclfp, outfp, env)
++                    inclfp.close()
+                 else:
+-                    sys.stderr.write('Warning - could not find file %s\n' %
+-                                     filename)
++                    sys.stderr.buffer.write(b'Warning - could not find file ' 
+
++                                            filename + b'\n')
+ 
+ if __name__ == '__main__':
+     main()

diff --git a/dev-lang/python/files/3.3/24_all_sqlite-3.8.4.patch 
b/dev-lang/python/files/3.3/24_all_sqlite-3.8.4.patch
new file mode 100644
index 0000000..d6af2eb
--- /dev/null
+++ b/dev-lang/python/files/3.3/24_all_sqlite-3.8.4.patch
@@ -0,0 +1,14 @@
+http://bugs.python.org/issue20901
+http://hg.python.org/cpython/rev/dbc9e3ed5e9f
+
+--- Lib/sqlite3/test/hooks.py
++++ Lib/sqlite3/test/hooks.py
+@@ -162,7 +162,7 @@
+             create table bar (a, b)
+             """)
+         second_count = len(progress_calls)
+-        self.assertGreater(first_count, second_count)
++        self.assertGreaterEqual(first_count, second_count)
+ 
+     def CheckCancelOperation(self):
+         """

diff --git a/dev-lang/python/files/3.3/61_all_process_data.patch 
b/dev-lang/python/files/3.3/61_all_process_data.patch
new file mode 100644
index 0000000..b7738c7
--- /dev/null
+++ b/dev-lang/python/files/3.3/61_all_process_data.patch
@@ -0,0 +1,166 @@
+GENTOO_PYTHON_PROCESS_NAME environmental variable is set by python-wrapper and 
wrapper scripts generated by
+python_generate_wrapper_scripts() and specifies process name.
+GENTOO_PYTHON_WRAPPER_SCRIPT_PATH environmental variable is set by wrapper 
scripts generated by
+python_generate_wrapper_scripts() and specifies sys.argv[0] in target 
executables.
+GENTOO_PYTHON_TARGET_SCRIPT_PATH environmental variable is set by wrapper 
scripts generated by
+python_generate_wrapper_scripts() and specifies paths to actually executed 
scripts.
+GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION environmental variable is used 
by wrapper scripts generated by
+python_generate_wrapper_scripts() to check if Python supports 
GENTOO_PYTHON_TARGET_SCRIPT_PATH environmental variable.
+
+--- Modules/main.c
++++ Modules/main.c
+@@ -331,6 +331,7 @@
+     int version = 0;
+     int saw_unbuffered_flag = 0;
+     PyCompilerFlags cf;
++    char *target_script_name = getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
+ 
+     cf.cf_flags = 0;
+ 
+@@ -551,7 +552,17 @@
+             filename = argv[_PyOS_optind];
+ 
+ #else
+-        filename = argv[_PyOS_optind];
++        if (target_script_name != NULL && *target_script_name != '\0') {
++            size_t length = strlen(target_script_name);
++            wchar_t *wcs_target_script_name = (wchar_t *) calloc(length + 1, 
sizeof(wchar_t));
++            char *old_locale = setlocale(LC_CTYPE, NULL);
++            setlocale(LC_CTYPE, "");
++            if (mbstowcs(wcs_target_script_name, target_script_name, length) 
>= 0)
++                filename = wcs_target_script_name;
++            setlocale(LC_CTYPE, old_locale);
++        }
++        if (filename == NULL)
++            filename = argv[_PyOS_optind];
+ #endif
+     }
+ 
+--- Modules/posixmodule.c
++++ Modules/posixmodule.c
+@@ -1157,6 +1157,10 @@
+         char *p = strchr(*e, '=');
+         if (p == NULL)
+             continue;
++        if ((strlen("GENTOO_PYTHON_PROCESS_NAME") == (int)(p-*e) && 
strncmp("GENTOO_PYTHON_PROCESS_NAME", *e, (int)(p-*e)) == 0) ||
++            (strlen("GENTOO_PYTHON_TARGET_SCRIPT_PATH") == (int)(p-*e) && 
strncmp("GENTOO_PYTHON_TARGET_SCRIPT_PATH", *e, (int)(p-*e)) == 0) ||
++            (strlen("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH") == (int)(p-*e) && 
strncmp("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH", *e, (int)(p-*e)) == 0))
++            continue;
+         k = PyBytes_FromStringAndSize(*e, (int)(p-*e));
+         if (k == NULL) {
+             PyErr_Clear();
+--- Modules/python.c
++++ Modules/python.c
+@@ -7,6 +7,14 @@
+ #include <floatingpoint.h>
+ #endif
+ 
++#ifdef __linux__
++#include <linux/prctl.h>
++#include <sys/prctl.h>
++#ifndef PR_SET_NAME
++#define PR_SET_NAME 15
++#endif
++#endif
++
+ #ifdef MS_WINDOWS
+ int
+ wmain(int argc, wchar_t **argv)
+@@ -18,6 +26,11 @@
+ int
+ main(int argc, char **argv)
+ {
++    if (getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION")) {
++        printf("GENTOO_PYTHON_TARGET_SCRIPT_PATH supported\n");
++        return 0;
++    }
++
+     wchar_t **argv_copy;
+     /* We need a second copy, as Python might modify the first one. */
+     wchar_t **argv_copy2;
+@@ -59,6 +72,16 @@
+ 
+     setlocale(LC_ALL, oldloc);
+     free(oldloc);
++
++#ifdef __linux__
++    char *process_name = getenv("GENTOO_PYTHON_PROCESS_NAME");
++#ifdef HAVE_UNSETENV
++    unsetenv("GENTOO_PYTHON_PROCESS_NAME");
++#endif
++    if (process_name != NULL && *process_name != '\0')
++        prctl(PR_SET_NAME, process_name);
++#endif
++
+     res = Py_Main(argc, argv_copy);
+     for (i = 0; i < argc; i++) {
+         PyMem_Free(argv_copy2[i]);
+--- Python/sysmodule.c
++++ Python/sysmodule.c
+@@ -1778,6 +1778,10 @@
+ makeargvobject(int argc, wchar_t **argv)
+ {
+     PyObject *av;
++    char *wrapper_script_name = getenv("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH");
++#ifdef HAVE_UNSETENV
++    unsetenv("GENTOO_PYTHON_WRAPPER_SCRIPT_PATH");
++#endif
+     if (argc <= 0 || argv == NULL) {
+         /* Ensure at least one (empty) argument is seen */
+         static wchar_t *empty_argv[1] = {L""};
+@@ -1802,7 +1806,16 @@
+             } else
+                 v = PyUnicode_FromString(argv[i]);
+ #else
+-            PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
++            PyObject *v = NULL;
++            if (i == 0 && wrapper_script_name != NULL && *wrapper_script_name 
!= '\0') {
++                size_t length = strlen(wrapper_script_name);
++                wchar_t *wcs_wrapper_script_name = (wchar_t *) calloc(length 
+ 1, sizeof(wchar_t));
++                if (mbstowcs(wcs_wrapper_script_name, wrapper_script_name, 
length) >= 0)
++                    v = PyUnicode_FromWideChar(wcs_wrapper_script_name, -1);
++                free(wcs_wrapper_script_name);
++            }
++            if (v == NULL)
++                v = PyUnicode_FromWideChar(argv[i], -1);
+ #endif
+             if (v == NULL) {
+                 Py_DECREF(av);
+@@ -1822,7 +1835,12 @@
+ static void
+ sys_update_path(int argc, wchar_t **argv)
+ {
+-    wchar_t *argv0;
++    char *target_script_name = getenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
++#ifdef HAVE_UNSETENV
++    unsetenv("GENTOO_PYTHON_TARGET_SCRIPT_PATH");
++#endif
++    wchar_t *wcs_target_script_name = NULL;
++    wchar_t *argv0 = NULL;
+     wchar_t *p = NULL;
+     Py_ssize_t n = 0;
+     PyObject *a;
+@@ -1842,7 +1860,14 @@
+     if (path == NULL)
+         return;
+ 
+-    argv0 = argv[0];
++    if (target_script_name != NULL && *target_script_name != '\0') {
++        size_t length = strlen(target_script_name);
++        wcs_target_script_name = (wchar_t *) calloc(length + 1, 
sizeof(wchar_t));
++        if (mbstowcs(wcs_target_script_name, target_script_name, length) >= 0)
++            argv0 = wcs_target_script_name;
++    }
++    if (argv0 == NULL)
++        argv0 = argv[0];
+ 
+ #ifdef HAVE_READLINK
+     if (_HAVE_SCRIPT_ARGUMENT(argc, argv))
+@@ -1919,6 +1944,7 @@
+     if (PyList_Insert(path, 0, a) < 0)
+         Py_FatalError("sys.path.insert(0) failed");
+     Py_DECREF(a);
++    free(wcs_target_script_name);
+ }
+ 
+ void

diff --git a/dev-lang/python/files/python-3.3-CVE-2014-4616.patch 
b/dev-lang/python/files/python-3.3-CVE-2014-4616.patch
new file mode 100644
index 0000000..c67b2e5
--- /dev/null
+++ b/dev-lang/python/files/python-3.3-CVE-2014-4616.patch
@@ -0,0 +1,52 @@
+# HG changeset patch
+# User Benjamin Peterson <benja...@python.org>
+# Date 1397441438 14400
+# Node ID 50c07ed1743da9cd4540d83de0c30bd17aeb41b0
+# Parent  218e28a935ab4494d05215c243e2129625a71893
+in scan_once, prevent the reading of arbitrary memory when passed a negative 
index
+
+Bug reported by Guido Vranken.
+
+Index: Python-3.3.5/Lib/json/tests/test_decode.py
+===================================================================
+--- Python-3.3.5.orig/Lib/test/test_json/test_decode.py        2014-06-26 
18:40:10.825269130 +0200
++++ Python-3.3.5/Lib/test/test_json/test_decode.py     2014-06-26 
18:40:21.962323035 +0200
+@@ -60,5 +60,10 @@
+         msg = 'escape'
+         self.assertRaisesRegexp(ValueError, msg, self.loads, s)
+ 
++    def test_negative_index(self):
++        d = self.json.JSONDecoder()
++        self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000)
++        self.assertRaises(ValueError, d.raw_decode, u'a'*42, -50000)
++
+ class TestPyDecode(TestDecode, PyTest): pass
+ class TestCDecode(TestDecode, CTest): pass
+Index: Python-3.3.5/Misc/ACKS
+===================================================================
+--- Python-3.3.5.orig/Misc/ACKS        2014-06-26 18:40:10.826269135 +0200
++++ Python-3.3.5/Misc/ACKS     2014-06-26 18:40:21.962323035 +0200
+@@ -1085,6 +1085,7 @@
+ Frank Visser
+ Johannes Vogel
+ Alex Volkov
++Guido Vranken
+ Martijn Vries
+ Niki W. Waibel
+ Wojtek Walczak
+Index: Python-3.3.5/Modules/_json.c
+===================================================================
+--- a/Modules/_json.c
++++ b/Modules/_json.c
+@@ -975,7 +975,10 @@ scan_once_unicode(PyScannerObject *s, Py
+     kind = PyUnicode_KIND(pystr);
+     length = PyUnicode_GET_LENGTH(pystr);
+ 
+-    if (idx >= length) {
++    if (idx < 0)
++        /* Compatibility with Python version. */
++        idx += length;
++    if (idx < 0 || idx >= length) {
+         PyErr_SetNone(PyExc_StopIteration);
+         return NULL;
+     }

diff --git a/dev-lang/python/files/python-3.3-libressl.patch 
b/dev-lang/python/files/python-3.3-libressl.patch
new file mode 100644
index 0000000..816704e
--- /dev/null
+++ b/dev-lang/python/files/python-3.3-libressl.patch
@@ -0,0 +1,127 @@
+From eed8d3b553e00e04c1f97c87ea02723630fb15a4 Mon Sep 17 00:00:00 2001
+From: hasufell <hasuf...@gentoo.org>
+Date: Sun, 20 Sep 2015 14:25:43 +0200
+Subject: [PATCH] Backport upstream libressl patches to python-3.3
+
+https://hg.python.org/cpython/raw-rev/7f82f50fdad0
+https://hg.python.org/cpython/raw-rev/4dac45f88d45
+---
+ Lib/ssl.py           |  7 ++++++-
+ Lib/test/test_ssl.py | 21 +++++++++++++--------
+ Modules/_ssl.c       |  4 ++++
+ configure            | 42 ++++++++++++++++++++++++++++++++++++++++++
+ configure.ac         |  3 +++
+ pyconfig.h.in        |  3 +++
+ 6 files changed, 71 insertions(+), 9 deletions(-)
+
+diff --git a/Lib/ssl.py b/Lib/ssl.py
+index cd8d6b4..445ae87 100644
+--- a/Lib/ssl.py
++++ b/Lib/ssl.py
+@@ -78,7 +78,12 @@ try:
+     from _ssl import OP_SINGLE_ECDH_USE
+ except ImportError:
+     pass
+-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, 
RAND_pseudo_bytes
++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes
++try:
++    from _ssl import RAND_egd
++except ImportError:
++    # LibreSSL does not provide RAND_egd
++    pass
+ from _ssl import (
+     SSL_ERROR_ZERO_RETURN,
+     SSL_ERROR_WANT_READ,
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+index 9fc6027..879f791 100644
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -130,8 +130,9 @@ class BasicSocketTests(unittest.TestCase):
+         self.assertRaises(ValueError, ssl.RAND_bytes, -5)
+         self.assertRaises(ValueError, ssl.RAND_pseudo_bytes, -5)
+ 
+-        self.assertRaises(TypeError, ssl.RAND_egd, 1)
+-        self.assertRaises(TypeError, ssl.RAND_egd, 'foo', 1)
++        if hasattr(ssl, 'RAND_egd'):
++            self.assertRaises(TypeError, ssl.RAND_egd, 1)
++            self.assertRaises(TypeError, ssl.RAND_egd, 'foo', 1)
+         ssl.RAND_add("this is a random string", 75.0)
+ 
+     @unittest.skipUnless(os.name == 'posix', 'requires posix')
+@@ -250,11 +251,11 @@ class BasicSocketTests(unittest.TestCase):
+         # Some sanity checks follow
+         # >= 0.9
+         self.assertGreaterEqual(n, 0x900000)
+-        # < 2.0
+-        self.assertLess(n, 0x20000000)
++        # < 3.0
++        self.assertLess(n, 0x30000000)
+         major, minor, fix, patch, status = t
+         self.assertGreaterEqual(major, 0)
+-        self.assertLess(major, 2)
++        self.assertLess(major, 3)
+         self.assertGreaterEqual(minor, 0)
+         self.assertLess(minor, 256)
+         self.assertGreaterEqual(fix, 0)
+@@ -263,9 +264,13 @@ class BasicSocketTests(unittest.TestCase):
+         self.assertLessEqual(patch, 26)
+         self.assertGreaterEqual(status, 0)
+         self.assertLessEqual(status, 15)
+-        # Version string as returned by OpenSSL, the format might change
+-        self.assertTrue(s.startswith("OpenSSL {:d}.{:d}.{:d}".format(major, 
minor, fix)),
+-                        (s, t))
++        # Version string as returned by {Open,Libre}SSL, the format might 
change
++        if "LibreSSL" in s:
++            self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major, 
minor)),
++                            (s, t))
++        else:
++            self.assertTrue(s.startswith("OpenSSL 
{:d}.{:d}.{:d}".format(major, minor, fix)),
++                            (s, t))
+ 
+     @support.cpython_only
+     def test_refcycle(self):
+diff --git a/Modules/_ssl.c b/Modules/_ssl.c
+index 499e8ba..cb151ba 100644
+--- a/Modules/_ssl.c
++++ b/Modules/_ssl.c
+@@ -2559,6 +2559,7 @@ Returns 1 if the OpenSSL PRNG has been seeded with 
enough data and 0 if not.\n\
+ It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
+ using the ssl() function.");
+ 
++#ifdef HAVE_RAND_EGD
+ static PyObject *
+ PySSL_RAND_egd(PyObject *self, PyObject *args)
+ {
+@@ -2586,6 +2587,7 @@ PyDoc_STRVAR(PySSL_RAND_egd_doc,
+ Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
+ Returns number of bytes read.  Raises SSLError if connection to EGD\n\
+ fails or if it does not provide enough data to seed PRNG.");
++#endif /* HAVE_RAND_EGD */
+ 
+ #endif /* HAVE_OPENSSL_RAND */
+ 
+@@ -2604,8 +2606,10 @@ static PyMethodDef PySSL_methods[] = {
+      PySSL_RAND_bytes_doc},
+     {"RAND_pseudo_bytes",   PySSL_RAND_pseudo_bytes, METH_VARARGS,
+      PySSL_RAND_pseudo_bytes_doc},
++#ifdef HAVE_RAND_EGD
+     {"RAND_egd",            PySSL_RAND_egd, METH_VARARGS,
+      PySSL_RAND_egd_doc},
++#endif
+     {"RAND_status",         (PyCFunction)PySSL_RAND_status, METH_NOARGS,
+      PySSL_RAND_status_doc},
+ #endif
+diff --git a/configure.ac b/configure.ac
+index 6a64bff..90f315a 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2181,6 +2181,9 @@ AC_MSG_RESULT($SHLIBS)
+ AC_CHECK_LIB(sendfile, sendfile)
+ AC_CHECK_LIB(dl, dlopen)      # Dynamic linking for SunOS/Solaris and SYSV
+ AC_CHECK_LIB(dld, shl_load)   # Dynamic linking for HP-UX
++AC_CHECK_LIB(crypto, RAND_egd,
++             AC_DEFINE(HAVE_RAND_EGD, 1,
++             [Define if the libcrypto has RAND_egd]))
+ 
+ # only check for sem_init if thread support is requested
+ if test "$with_threads" = "yes" -o -z "$with_threads"; then

diff --git a/dev-lang/python/files/python-3.3.5-ncurses-pkg-config.patch 
b/dev-lang/python/files/python-3.3.5-ncurses-pkg-config.patch
new file mode 100644
index 0000000..d963b9e
--- /dev/null
+++ b/dev-lang/python/files/python-3.3.5-ncurses-pkg-config.patch
@@ -0,0 +1,40 @@
+do not hardcode /usr/include paths
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -668,6 +668,8 @@ AC_ARG_WITH(cxx_main,
+ ])
+ AC_MSG_RESULT($with_cxx_main)
+ 
++AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
++
+ preset_cxx="$CXX"
+ if test -z "$CXX"
+ then
+@@ -1513,7 +1515,7 @@ dnl AC_MSG_RESULT($cpp_type)
+ # checks for header files
+ AC_HEADER_STDC
+ ac_save_cppflags="$CPPFLAGS"
+-CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw"
++CPPFLAGS="$CPPFLAGS `$PKG_CONFIG --cflags ncursesw`"
+ AC_CHECK_HEADERS(asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \
+ fcntl.h grp.h \
+ ieeefp.h io.h langinfo.h libintl.h ncurses.h process.h pthread.h \
+@@ -2225,8 +2227,6 @@ LIBS="$withval $LIBS"
+ ],
+ [AC_MSG_RESULT(no)])
+ 
+-AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+-
+ # Check for use of the system expat library
+ AC_MSG_CHECKING(for --with-system-expat)
+ AC_ARG_WITH(system_expat,
+@@ -4273,7 +4273,7 @@ then
+ fi
+ 
+ ac_save_cppflags="$CPPFLAGS"
+-CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw"
++CPPFLAGS="$CPPFLAGS `$PKG_CONFIG --cflags ncursesw`"
+ # On HP/UX 11.0, mvwdelch is a block with a return statement
+ AC_MSG_CHECKING(whether mvwdelch is an expression)
+ AC_CACHE_VAL(ac_cv_mvwdelch_is_expression,

diff --git a/dev-lang/python/files/python-3.4-gcc-5.patch 
b/dev-lang/python/files/python-3.4-gcc-5.patch
new file mode 100644
index 0000000..80afbd1
--- /dev/null
+++ b/dev-lang/python/files/python-3.4-gcc-5.patch
@@ -0,0 +1,37 @@
+changeset:   94583:689092296ad3
+branch:      3.4
+parent:      94579:645f3d750be1
+user:        Victor Stinner <victor.stin...@gmail.com>
+date:        Wed Feb 11 14:23:35 2015 +0100
+summary:     Issue #23433: Fix faulthandler._stack_overflow()
+
+diff -r 645f3d750be1 -r 689092296ad3 Modules/faulthandler.c
+--- a/Modules/faulthandler.c   Tue Feb 10 14:49:32 2015 +0100
++++ b/Modules/faulthandler.c   Wed Feb 11 14:23:35 2015 +0100
+@@ -911,12 +911,12 @@
+ }
+ 
+ #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
+-static void*
+-stack_overflow(void *min_sp, void *max_sp, size_t *depth)
++static Py_uintptr_t
++stack_overflow(Py_uintptr_t min_sp, Py_uintptr_t max_sp, size_t *depth)
+ {
+     /* allocate 4096 bytes on the stack at each call */
+     unsigned char buffer[4096];
+-    void *sp = &buffer;
++    Py_uintptr_t sp = (Py_uintptr_t)&buffer;
+     *depth += 1;
+     if (sp < min_sp || max_sp < sp)
+         return sp;
+@@ -929,7 +929,8 @@
+ faulthandler_stack_overflow(PyObject *self)
+ {
+     size_t depth, size;
+-    char *sp = (char *)&depth, *stop;
++    Py_uintptr_t sp = (Py_uintptr_t)&depth;
++    Py_uintptr_t stop;
+ 
+     depth = 0;
+     stop = stack_overflow(sp - STACK_OVERFLOW_MAX_SIZE,
+

diff --git a/dev-lang/python/metadata.xml b/dev-lang/python/metadata.xml
new file mode 100644
index 0000000..6a4ebd8
--- /dev/null
+++ b/dev-lang/python/metadata.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd";>
+<pkgmetadata>
+<maintainer type="project">
+       <email>pyt...@gentoo.org</email>
+       <name>Python</name>
+</maintainer>
+<use>
+       <flag name="threads">Enable threading support. (DON'T DISABLE THIS 
UNLESS YOU KNOW WHAT YOU'RE DOING)</flag>
+       <flag name="wide-unicode">Enable wide Unicode implementation which uses 
4-byte Unicode characters. Switching of this USE flag changes ABI of Python and 
requires reinstallation of many Python modules. (DON'T DISABLE THIS UNLESS YOU 
KNOW WHAT YOU'RE DOING)</flag>
+       <flag name="wininst">Install Windows executables required to create an 
executable installer for MS Windows.</flag>
+</use>
+</pkgmetadata>

diff --git a/dev-lang/python/python-3.3.5.ebuild 
b/dev-lang/python/python-3.3.5.ebuild
new file mode 100644
index 0000000..896721e
--- /dev/null
+++ b/dev-lang/python/python-3.3.5.ebuild
@@ -0,0 +1,368 @@
+# Copyright 1999-2016 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}"
+PATCHSET_VERSION="${PV}-0"
+
+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="3.3/3.3m"
+KEYWORDS=""
+IUSE="build doc elibc_uclibc examples gdbm hardened ipv6 libressl +ncurses 
+readline sqlite +ssl +threads tk 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.
+
+PYVER=${SLOT%/*}
+
+RDEPEND="app-arch/bzip2:0=
+       app-arch/xz-utils:0=
+       >=sys-libs/zlib-1.1.3:0=
+       virtual/libffi
+       virtual/libintl
+       !build? (
+               gdbm? ( sys-libs/gdbm:0=[berkdb] )
+               ncurses? (
+                       >=sys-libs/ncurses-5.2:0=
+                       readline? ( >=sys-libs/readline-4.1:0= )
+               )
+               sqlite? ( >=dev-db/sqlite-3.3.8:3= )
+               ssl? (
+                       !libressl? ( dev-libs/openssl:0= )
+                       libressl? ( dev-libs/libressl:= )
+               )
+               tk? (
+                       >=dev-lang/tcl-8.0:0=
+                       >=dev-lang/tk-8.0:0=
+                       dev-tcltk/blt:0=
+                       dev-tcltk/tix
+               )
+               xml? ( >=dev-libs/expat-2.1:0= )
+       )
+       !!<sys-apps/sandbox-2.6-r1"
+DEPEND="${RDEPEND}
+       virtual/pkgconfig
+       >=sys-devel/autoconf-2.65
+       !sys-devel/gcc[libffi(-)]"
+RDEPEND+=" !build? ( app-misc/mime-types )
+       doc? ( dev-python/python-docs:${PYVER} )"
+PDEPEND=">=app-eselect/eselect-python-20140125-r1"
+
+S="${WORKDIR}/${MY_P}"
+
+src_prepare() {
+       # Ensure that internal copies of expat, libffi and zlib are not used.
+       rm -fr Modules/expat
+       rm -fr Modules/_ctypes/libffi*
+       rm -fr Modules/zlib
+
+       if tc-is-cross-compiler; then
+               # Invokes BUILDPYTHON, which is built for the host arch
+               local 
EPATCH_EXCLUDE="*_regenerate_platform-specific_modules.patch"
+       fi
+
+       EPATCH_SUFFIX="patch" EPATCH_EXCLUDE="61_all_process_data.patch" \
+               epatch "${FILESDIR}/3.3"
+       epatch "${FILESDIR}/${PN}-3.3.5-ncurses-pkg-config.patch"
+       epatch "${FILESDIR}/${PN}-3.4-gcc-5.patch" #547626
+
+       sed -i -e "s:@@GENTOO_LIBDIR@@:$(get_libdir):g" \
+               Lib/distutils/command/install.py \
+               Lib/distutils/sysconfig.py \
+               Lib/site.py \
+               Lib/sysconfig.py \
+               Lib/test/test_site.py \
+               Makefile.pre.in \
+               Modules/Setup.dist \
+               Modules/getpath.c \
+               setup.py || die "sed failed to replace @@GENTOO_LIBDIR@@"
+
+       # bug #514686
+       epatch "${FILESDIR}/${PN}-3.3-CVE-2014-4616.patch"
+
+       epatch "${FILESDIR}"/${PN}-3.3-libressl.patch
+
+       epatch_user
+
+       eautoconf
+       eautoheader
+}
+
+src_configure() {
+       if use build; then
+               # Disable extraneous modules with extra dependencies.
+               export PYTHON_DISABLE_MODULES="gdbm _curses _curses_panel 
readline _sqlite3 _tkinter _elementtree pyexpat"
+               export PYTHON_DISABLE_SSL="1"
+       else
+               local disable
+               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
+
+       # 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
+
+       # Export CXX so it ends up in /usr/lib/python3.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 -lpython3.2 correctly.
+       # Needed on FreeBSD unless Python 3.2 is already installed.
+       # Please query BSD team before removing this!
+       append-ldflags "-L."
+
+       local dbmliborder
+       if use gdbm; then
+               dbmliborder+="${dbmliborder:+:}gdbm"
+       fi
+
+       BUILD_DIR="${WORKDIR}/${CHOST}"
+       mkdir -p "${BUILD_DIR}" || die
+       cd "${BUILD_DIR}" || die
+
+       ECONF_SOURCE="${S}" OPT="" \
+       econf \
+               --with-fpectl \
+               --enable-shared \
+               $(use_enable ipv6) \
+               $(use_with threads) \
+               --infodir='${prefix}/share/info' \
+               --mandir='${prefix}/share/man' \
+               --with-computed-gotos \
+               --with-dbmliborder="${dbmliborder}" \
+               --with-libc="" \
+               --enable-loadable-sqlite-extensions \
+               --with-system-expat \
+               --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
+}
+
+src_compile() {
+       # Avoid invoking pgen for cross-compiles.
+       touch Include/graminit.h Python/graminit.c || die
+
+       cd "${BUILD_DIR}" || die
+       emake CPPFLAGS="" CFLAGS="" LDFLAGS=""
+
+       # Work around bug 329499. See also bug 413751 and 457194.
+       if has_version dev-libs/libffi[pax_kernel]; then
+               pax-mark E python
+       else
+               pax-mark m python
+       fi
+}
+
+src_test() {
+       # Tests will not work when cross compiling.
+       if tc-is-cross-compiler; then
+               elog "Disabling tests due to crosscompiling."
+               return
+       fi
+
+       cd "${BUILD_DIR}" || die
+
+       # Skip failing tests.
+       local skipped_tests="gdb"
+
+       for test in ${skipped_tests}; do
+               mv "${S}"/Lib/test/test_${test}.py "${T}"
+       done
+
+       PYTHONDONTWRITEBYTECODE="" emake test EXTRATESTOPTS="-u -network" 
FLAGS="" CFLAGS="" LDFLAGS="" < /dev/tty
+       local result="$?"
+
+       for test in ${skipped_tests}; do
+               mv "${T}/test_${test}.py" "${S}"/Lib/test
+       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${PYVER}/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${PYVER}
+
+       cd "${BUILD_DIR}" || die
+
+       emake DESTDIR="${D}" altinstall
+
+       sed \
+               -e "s/\(CONFIGURE_LDFLAGS=\).*/\1/" \
+               -e "s/\(PY_LDFLAGS=\).*/\1/" \
+               -i "${libdir}/config-${PYVER}"*/Makefile || die "sed failed"
+
+       # Fix collisions between different slots of Python.
+       rm -f "${ED}usr/$(get_libdir)/libpython3.so"
+
+       # Cheap hack to get version with ABIFLAGS
+       local abiver=$(cd "${ED}usr/include"; echo python*)
+       if [[ ${abiver} != python${PYVER} ]]; then
+               # Replace python3.X with a symlink to python3.Xm
+               rm "${ED}usr/bin/python${PYVER}" || die
+               dosym "${abiver}" "/usr/bin/python${PYVER}"
+               # Create python3.X-config symlink
+               dosym "${abiver}-config" "/usr/bin/python${PYVER}-config"
+               # Create python-3.5m.pc symlink
+               dosym "python-${PYVER}.pc" 
"/usr/$(get_libdir)/pkgconfig/${abiver/${PYVER}/-${PYVER}}.pc"
+       fi
+
+       if use build; then
+               rm -fr "${ED}usr/bin/idle${PYVER}" 
"${libdir}/"{idlelib,sqlite3,test,tkinter}
+       else
+               use elibc_uclibc && rm -fr "${libdir}/test"
+               use sqlite || rm -fr "${libdir}/"{sqlite3,test/test_sqlite*}
+               use tk || rm -fr "${ED}usr/bin/idle${PYVER}" 
"${libdir}/"{idlelib,tkinter,test/test_tk*}
+       fi
+
+       use threads || rm -fr "${libdir}/multiprocessing"
+       use wininst || rm -f "${libdir}/distutils/command/"wininst-*.exe
+
+       dodoc "${S}"/Misc/{ACKS,HISTORY,NEWS}
+
+       if use examples; then
+               insinto /usr/share/doc/${PF}/examples
+               find "${S}"/Tools -name __pycache__ -print0 | xargs -0 rm -fr
+               doins -r "${S}"/Tools
+       fi
+       insinto /usr/share/gdb/auto-load/usr/$(get_libdir) #443510
+       local libname=$(printf 'e:\n\t@echo $(INSTSONAME)\ninclude Makefile\n' 
| \
+               emake --no-print-directory -s -f - 2>/dev/null)
+       newins "${S}"/Tools/gdb/libpython.py "${libname}"-gdb.py
+
+       newconfd "${FILESDIR}/pydoc.conf" pydoc-${PYVER}
+       newinitd "${FILESDIR}/pydoc.init" pydoc-${PYVER}
+       sed \
+               -e "s:@PYDOC_PORT_VARIABLE@:PYDOC${PYVER/./_}_PORT:" \
+               -e "s:@PYDOC@:pydoc${PYVER}:" \
+               -i "${ED}etc/conf.d/pydoc-${PYVER}" 
"${ED}etc/init.d/pydoc-${PYVER}" || die "sed failed"
+
+       # for python-exec
+       local vars=( EPYTHON PYTHON_SITEDIR PYTHON_SCRIPTDIR )
+
+       # if not using a cross-compiler, use the fresh binary
+       if ! tc-is-cross-compiler; then
+               local -x PYTHON=./python
+               local -x LD_LIBRARY_PATH=${LD_LIBRARY_PATH+${LD_LIBRARY_PATH}:}.
+       else
+               vars=( PYTHON "${vars[@]}" )
+       fi
+
+       python_export "python${PYVER}" "${vars[@]}"
+       echo "EPYTHON='${EPYTHON}'" > epython.py || die
+       python_domodule epython.py
+
+       # python-exec wrapping support
+       local pymajor=${PYVER%.*}
+       mkdir -p "${D}${PYTHON_SCRIPTDIR}" || die
+       # python and pythonX
+       ln -s "../../../bin/${abiver}" \
+               "${D}${PYTHON_SCRIPTDIR}/python${pymajor}" || die
+       ln -s "python${pymajor}" \
+               "${D}${PYTHON_SCRIPTDIR}/python" || die
+       # python-config and pythonX-config
+       # note: we need to create a wrapper rather than symlinking it due
+       # to some random dirname(argv[0]) magic performed by python-config
+       cat > "${D}${PYTHON_SCRIPTDIR}/python${pymajor}-config" <<-EOF || die
+               #!/bin/sh
+               exec "${abiver}-config" "\${@}"
+       EOF
+       chmod +x "${D}${PYTHON_SCRIPTDIR}/python${pymajor}-config" || die
+       ln -s "python${pymajor}-config" \
+               "${D}${PYTHON_SCRIPTDIR}/python-config" || die
+       # 2to3, pydoc, pyvenv
+       ln -s "../../../bin/2to3-${PYVER}" \
+               "${D}${PYTHON_SCRIPTDIR}/2to3" || die
+       ln -s "../../../bin/pydoc${PYVER}" \
+               "${D}${PYTHON_SCRIPTDIR}/pydoc" || die
+       ln -s "../../../bin/pyvenv-${PYVER}" \
+               "${D}${PYTHON_SCRIPTDIR}/pyvenv" || die
+       # idle
+       if use tk; then
+               ln -s "../../../bin/idle${PYVER}" \
+                       "${D}${PYTHON_SCRIPTDIR}/idle" || die
+       fi
+}
+
+pkg_preinst() {
+       if has_version "<${CATEGORY}/${PN}-${PYVER}" && ! has_version 
">=${CATEGORY}/${PN}-${PYVER}_alpha"; then
+               python_updater_warning="1"
+       fi
+}
+
+eselect_python_update() {
+       if [[ -z "$(eselect python show)" || ! -f "${EROOT}usr/bin/$(eselect 
python show)" ]]; then
+               eselect python update
+       fi
+
+       if [[ -z "$(eselect python show --python${PV%%.*})" || ! -f 
"${EROOT}usr/bin/$(eselect python show --python${PV%%.*})" ]]; then
+               eselect python update --python${PV%%.*}
+       fi
+}
+
+pkg_postinst() {
+       eselect_python_update
+
+       if [[ "${python_updater_warning}" == "1" ]]; then
+               ewarn "You have just upgraded from an older version of Python."
+               ewarn
+               ewarn "Please adjust PYTHON_TARGETS (if so desired), and run 
emerge with the --newuse or --changed-use option to rebuild packages installing 
python modules."
+       fi
+}
+
+pkg_postrm() {
+       eselect_python_update
+}

Reply via email to