aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2015-08-08 22:55:32 +0200
committerMichał Górny <mgorny@gentoo.org>2015-08-08 22:55:32 +0200
commit63a2d3dcab039f0a4b0a3d4858a6540f2b3f24c0 (patch)
treed514bd3240d8ed8fe64ad7617f01e9968fc44e76 /dev-lang
parentRemove duplicate README from version control (diff)
downloadpython-63a2d3dcab039f0a4b0a3d4858a6540f2b3f24c0.tar.gz
python-63a2d3dcab039f0a4b0a3d4858a6540f2b3f24c0.tar.bz2
python-63a2d3dcab039f0a4b0a3d4858a6540f2b3f24c0.zip
dev-lang/python: Import 3.2 along with patches and bump to 3.2.6
Diffstat (limited to 'dev-lang')
-rw-r--r--dev-lang/python/Manifest1
-rw-r--r--dev-lang/python/files/3.2/01_all_static_library_location.patch70
-rw-r--r--dev-lang/python/files/3.2/02_all_disable_modules_and_ssl.patch89
-rw-r--r--dev-lang/python/files/3.2/03_all_libdir.patch174
-rw-r--r--dev-lang/python/files/3.2/04_all_non-zero_exit_status_on_failure.patch31
-rw-r--r--dev-lang/python/files/3.2/05_all_regenerate_platform-specific_modules.patch112
-rw-r--r--dev-lang/python/files/3.2/21_all_distutils_c++.patch262
-rw-r--r--dev-lang/python/files/3.2/22_all_tests_environment.patch183
-rw-r--r--dev-lang/python/files/3.2/23_all_h2py_encoding.patch173
-rw-r--r--dev-lang/python/files/3.2/41_all_crosscompile.patch94
-rw-r--r--dev-lang/python/files/3.2/81_all_use_new_readline_function_types__closes__20374_.patch28
-rw-r--r--dev-lang/python/files/3.2/82_all_new_plan__just_remove_typecasts__closes__20374_.patch37
-rw-r--r--dev-lang/python/files/3.2/83_all_Issue__20374__Avoid_compiler_warnings_when_compiling_readline_with_libedit_.patch37
-rw-r--r--dev-lang/python/files/pydoc.conf7
-rwxr-xr-xdev-lang/python/files/pydoc.init25
-rw-r--r--dev-lang/python/python-3.2.6.ebuild344
16 files changed, 1667 insertions, 0 deletions
diff --git a/dev-lang/python/Manifest b/dev-lang/python/Manifest
new file mode 100644
index 0000000..513d54c
--- /dev/null
+++ b/dev-lang/python/Manifest
@@ -0,0 +1 @@
+DIST Python-3.2.6.tar.xz 9243292 SHA256 1d12b501819fd26afafbf8459be1aa279b56f032b4c15412de0a713ce0de7bdc SHA512 514b46029dd5b07f2d287a1f00c6716970197186a38e3f2e1ec60c2292cf03a2dc45165ba9c217e5219c7cb6d96a09f790f5b3bdcc8d11db53f927297fe4ddc9 WHIRLPOOL b34f215e0f50123c5b2969e615ffbab99b631433de8f13cbbca525bf57cbc1bb9a159fba02616b3772be9b249be3cec36d6fd1856a678880674b828eb4ab08ed
diff --git a/dev-lang/python/files/3.2/01_all_static_library_location.patch b/dev-lang/python/files/3.2/01_all_static_library_location.patch
new file mode 100644
index 0000000..82ee2cd
--- /dev/null
+++ b/dev-lang/python/files/3.2/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
+@@ -901,6 +901,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)/$(PYTHON)3$(EXE) -o -h $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
+@@ -1103,18 +1116,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.2/02_all_disable_modules_and_ssl.patch b/dev-lang/python/files/3.2/02_all_disable_modules_and_ssl.patch
new file mode 100644
index 0000000..51bc0da
--- /dev/null
+++ b/dev-lang/python/files/3.2/02_all_disable_modules_and_ssl.patch
@@ -0,0 +1,89 @@
+--- setup.py
++++ setup.py
+@@ -21,7 +21,17 @@
+ COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
+
+ # 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
+
+ # File which contains the directory for shared mods (for sys.path fixup
+ # when running from the build dir, see Modules/getpath.c)
+@@ -410,6 +420,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.
+@@ -699,7 +710,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:
+@@ -710,7 +721,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,
+@@ -743,7 +755,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)
+
+@@ -761,20 +773,17 @@
+ openssl_ver)
+ missing.append('_hashlib')
+
+- min_sha2_openssl_ver = 0x00908000
+- if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
+- # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
+- exts.append( Extension('_sha256', ['sha256module.c'],
+- depends=['hashlib.h']) )
+- exts.append( Extension('_sha512', ['sha512module.c'],
+- depends=['hashlib.h']) )
+-
+- if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
+- # no openssl at all, use our own md5 and sha1
+- exts.append( Extension('_md5', ['md5module.c'],
+- depends=['hashlib.h']) )
+- exts.append( Extension('_sha1', ['sha1module.c'],
+- depends=['hashlib.h']) )
++ ### Build these unconditionally so emerge won't fail
++ ### when openssl is dropped/broken etc.
++ exts.append( Extension('_sha256', ['sha256module.c'],
++ depends=['hashlib.h']) )
++ exts.append( Extension('_sha512', ['sha512module.c'],
++ depends=['hashlib.h']) )
++
++ exts.append( Extension('_md5', ['md5module.c'],
++ depends=['hashlib.h']) )
++ exts.append( Extension('_sha1', ['sha1module.c'],
++ depends=['hashlib.h']) )
+
+ # 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/3.2/03_all_libdir.patch b/dev-lang/python/files/3.2/03_all_libdir.patch
new file mode 100644
index 0000000..613114a
--- /dev/null
+++ b/dev-lang/python/files/3.2/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
+@@ -123,7 +123,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
+@@ -285,10 +285,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': '{base}/lib/python{py_version_short}',
+- 'platstdlib': '{platbase}/lib/python{py_version_short}',
+- 'purelib': '{base}/lib/python{py_version_short}/site-packages',
+- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
++ 'stdlib': '{base}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++ 'platstdlib': '{platbase}/@@GENTOO_LIBDIR@@/python{py_version_short}',
++ 'purelib': '{base}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
++ 'platlib': '{platbase}/@@GENTOO_LIBDIR@@/python{py_version_short}/site-packages',
+ 'include':
+ '{base}/include/python{py_version_short}{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
+@@ -237,10 +237,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)
+@@ -583,7 +583,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];
+@@ -593,7 +593,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
+@@ -352,7 +352,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
+@@ -477,8 +477,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 = []
+@@ -675,11 +674,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.2/04_all_non-zero_exit_status_on_failure.patch b/dev-lang/python/files/3.2/04_all_non-zero_exit_status_on_failure.patch
new file mode 100644
index 0000000..8b7ccd8
--- /dev/null
+++ b/dev-lang/python/files/3.2/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
+@@ -37,6 +37,8 @@
+ # when running from the build dir, see Modules/getpath.c)
+ _BUILDDIR_COOKIE = "pybuilddir.txt"
+
++exit_status = 0
++
+ def add_dir_to_list(dirlist, dir):
+ """Add the directory 'dir' to the list 'dirlist' (after any relative
+ directories) if:
+@@ -284,6 +286,8 @@
+ print()
+
+ if self.failed:
++ global exit_status
++ exit_status = 1
+ failed = self.failed[:]
+ print()
+ print("Failed to build these modules:")
+@@ -1946,6 +1950,7 @@
+ scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
+ "Tools/scripts/2to3"]
+ )
++ sys.exit(exit_status)
+
+ # --install-platlib
+ if __name__ == '__main__':
diff --git a/dev-lang/python/files/3.2/05_all_regenerate_platform-specific_modules.patch b/dev-lang/python/files/3.2/05_all_regenerate_platform-specific_modules.patch
new file mode 100644
index 0000000..0bc3fe6
--- /dev/null
+++ b/dev-lang/python/files/3.2/05_all_regenerate_platform-specific_modules.patch
@@ -0,0 +1,112 @@
+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
+@@ -408,7 +408,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:
+@@ -457,6 +457,27 @@
+ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
+ ./$(BUILDPYTHON) -E $(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; \
++ 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)
+@@ -983,7 +1004,7 @@
+ multiprocessing multiprocessing/dummy \
+ unittest unittest/test \
+ 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 \
+@@ -1066,17 +1087,6 @@
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+ ./$(BUILDPYTHON) -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; \
+- 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
+@@ -1373,7 +1383,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/3.2/21_all_distutils_c++.patch b/dev-lang/python/files/3.2/21_all_distutils_c++.patch
new file mode 100644
index 0000000..c5aec72
--- /dev/null
+++ b/dev-lang/python/files/3.2/21_all_distutils_c++.patch
@@ -0,0 +1,262 @@
+http://bugs.python.org/issue1222585
+
+--- Lib/distutils/cygwinccompiler.py
++++ Lib/distutils/cygwinccompiler.py
+@@ -136,9 +136,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":
+@@ -162,8 +166,12 @@
+ raise CompileError(msg)
+ else: # for other files use the C-compiler
+ try:
+- self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
+- extra_postargs)
++ if self.detect_language(src) == 'c++':
++ self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] +
++ extra_postargs)
++ else:
++ self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
++ extra_postargs)
+ except DistutilsExecError as msg:
+ raise CompileError(msg)
+
+@@ -294,10 +302,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
+@@ -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
+@@ -170,9 +170,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 = ''
+
+ newcc = None
+ if 'CC' in os.environ:
+@@ -181,19 +184,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:
+@@ -202,13 +213,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
+@@ -454,7 +454,7 @@
+ *\ -s*|s*) quiet="-q";; \
+ *) quiet="";; \
+ esac; \
+- $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
++ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \
+ ./$(BUILDPYTHON) -E $(srcdir)/setup.py $$quiet build
+
+ # Build the platform-specific modules
diff --git a/dev-lang/python/files/3.2/22_all_tests_environment.patch b/dev-lang/python/files/3.2/22_all_tests_environment.patch
new file mode 100644
index 0000000..c3b990c
--- /dev/null
+++ b/dev-lang/python/files/3.2/22_all_tests_environment.patch
@@ -0,0 +1,183 @@
+http://bugs.python.org/issue1674555
+
+--- Lib/site.py
++++ Lib/site.py
+@@ -514,8 +514,9 @@
+ known_paths = removeduppaths()
+ if ENABLE_USER_SITE is None:
+ ENABLE_USER_SITE = check_enableusersite()
+- known_paths = addusersitepackages(known_paths)
+- known_paths = addsitepackages(known_paths)
++ if os.environ.get("_PYTHONNOSITEPACKAGES") is None:
++ known_paths = addusersitepackages(known_paths)
++ known_paths = addsitepackages(known_paths)
+ if sys.platform == 'os2emx':
+ setBEGINLIBPATH()
+ setquit()
+--- Lib/test/regrtest.py
++++ Lib/test/regrtest.py
+@@ -174,6 +174,7 @@
+ import unittest
+ import warnings
+ from inspect import isabstract
++from subprocess import Popen, PIPE
+
+ try:
+ import threading
+@@ -510,6 +511,57 @@
+ 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):
++ 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)
++ )
++
++ def _runtest(test, verbose, quiet, huntrleaks=False, debug=False,
++ use_resources=None, output_on_failure=False, failfast=False,
++ match_tests=None):
++ if test == "test_site":
++ args_tuple = get_args_tuple(test, verbose, quiet, huntrleaks, debug,
++ use_resources, output_on_failure,
++ failfast, match_tests)
++ env = os.environ.copy()
++ try:
++ del env["_PYTHONNOSITEPACKAGES"]
++ except KeyError:
++ pass
++ popen = Popen(base_cmd + ['--slaveargs', json.dumps(args_tuple)],
++ stdout=PIPE, stderr=PIPE,
++ universal_newlines=True,
++ close_fds=(os.name != 'nt'),
++ env=env)
++ stdout, stderr = popen.communicate()
++ # Strip last refcount output line if it exists, since it
++ # comes from the shutdown of the interpreter in the subcommand.
++ stderr = debug_output_pat.sub("", stderr)
++ stdout, _, result = stdout.strip().rpartition("\n")
++ result = json.loads(result)
++ if stdout:
++ print(stdout)
++ if stderr:
++ print(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)
++
+ def accumulate_result(test, result):
+ ok, test_time = result
+ test_times.append((test_time, test))
+@@ -547,12 +599,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:
+@@ -562,12 +610,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,
+- failfast=failfast, match_tests=match_tests)
+- )
++ args_tuple = get_args_tuple(test, verbose, quiet, huntrleaks,
++ debug, use_resources, verbose3,
++ failfast, match_tests)
+ # -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
+@@ -632,13 +677,13 @@
+ if trace:
+ # If we're tracing code coverage, then we don't exit with status
+ # if on a false return value from main.
+- tracer.runctx('runtest(test, verbose, quiet)',
++ tracer.runctx('_runtest(test, verbose, quiet)',
+ globals=globals(), locals=vars())
+ else:
+ try:
+- result = runtest(test, verbose, quiet, huntrleaks, debug,
+- output_on_failure=verbose3,
+- failfast=failfast, match_tests=match_tests)
++ result = _runtest(test, verbose, quiet, huntrleaks, debug,
++ output_on_failure=verbose3,
++ failfast=failfast, match_tests=match_tests)
+ accumulate_result(test, result)
+ except KeyboardInterrupt:
+ interrupted = True
+@@ -709,7 +754,7 @@
+ sys.stdout.flush()
+ try:
+ verbose = True
+- ok = runtest(test, True, quiet, huntrleaks, debug)
++ ok = _runtest(test, True, quiet, huntrleaks, debug)
+ except KeyboardInterrupt:
+ # print a newline separate from the ^C
+ print()
+@@ -1077,8 +1122,9 @@
+ for name, get, restore in self.resource_info():
+ current = get()
+ original = saved_values.pop(name)
+- # Check for changes to the resource's value
+- if current != original:
++ # Check for changes to the resource's value. test_site is always run
++ # in a subprocess and is allowed to change os.environ and sys.path.
++ if current != original and self.testname != "test_site":
+ self.changed = True
+ restore(original)
+ if not self.quiet:
+--- Lib/test/test_site.py
++++ Lib/test/test_site.py
+@@ -8,6 +8,7 @@
+ from test.support import run_unittest, TESTFN, EnvironmentVarGuard
+ from test.support import captured_stderr
+ import builtins
++import imp
+ import os
+ import sys
+ import re
+@@ -21,6 +22,9 @@
+ # already.
+ if "site" in sys.modules:
+ import site
++ if "_PYTHONNOSITEPACKAGES" in os.environ:
++ del os.environ["_PYTHONNOSITEPACKAGES"]
++ imp.reload(site)
+ else:
+ raise unittest.SkipTest("importation of site.py suppressed")
+
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -814,7 +814,7 @@
+
+ TESTOPTS= -l $(EXTRATESTOPTS)
+ TESTPROG= $(srcdir)/Lib/test/regrtest.py
+-TESTPYTHON= $(RUNSHARED) ./$(BUILDPYTHON) -Wd -E -R -bb $(TESTPYTHONOPTS)
++TESTPYTHON= _PYTHONNOSITEPACKAGES=1 $(RUNSHARED) ./$(BUILDPYTHON) -Wd -E -R -bb $(TESTPYTHONOPTS)
+ test: all platform
+ -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
+ -$(TESTPYTHON) $(TESTPROG) $(TESTOPTS)
diff --git a/dev-lang/python/files/3.2/23_all_h2py_encoding.patch b/dev-lang/python/files/3.2/23_all_h2py_encoding.patch
new file mode 100644
index 0000000..d594f56
--- /dev/null
+++ b/dev-lang/python/files/3.2/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.2/41_all_crosscompile.patch b/dev-lang/python/files/3.2/41_all_crosscompile.patch
new file mode 100644
index 0000000..c35d2ba
--- /dev/null
+++ b/dev-lang/python/files/3.2/41_all_crosscompile.patch
@@ -0,0 +1,94 @@
+Crosscompile
+
+--- Makefile.pre.in
++++ Makefile.pre.in
+@@ -202,6 +202,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
+@@ -244,6 +245,7 @@
+ ##########################################################################
+ # Parser
+ PGEN= Parser/pgen$(EXE)
++HOSTPGEN= $(PGEN)
+
+ POBJS= \
+ Parser/acceler.o \
+@@ -455,7 +457,7 @@
+ *) quiet="";; \
+ esac; \
+ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' CFLAGS='$(PY_CFLAGS)' \
+- ./$(BUILDPYTHON) -E $(srcdir)/setup.py $$quiet build
++ ./$(HOSTPYTHON) -E $(srcdir)/setup.py $$quiet build
+
+ # Build the platform-specific modules
+ platformspecificmods: $(BUILDPYTHON) sharedmods
+@@ -635,9 +637,9 @@
+
+ # Use a stamp file to prevent make -j invoking pgen twice
+ $(GRAMMAR_H) $(GRAMMAR_C): Parser/pgen.stamp
+-Parser/pgen.stamp: $(PGEN) $(GRAMMAR_INPUT)
++Parser/pgen.stamp: $(HOSTPGEN) $(GRAMMAR_INPUT)
+ -@$(INSTALL) -d Include
+- $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
++ $(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
+ -touch Parser/pgen.stamp
+
+ $(PGEN): $(PGENOBJS)
+@@ -1065,27 +1067,27 @@
+ $(DESTDIR)$(LIBDEST)/distutils/tests ; \
+ fi
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+- ./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
++ ./$(HOSTPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST) -f \
+ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
+ $(DESTDIR)$(LIBDEST)
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+- ./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
++ ./$(HOSTPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST) -f \
+ -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
+ $(DESTDIR)$(LIBDEST)
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+- ./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
++ ./$(HOSTPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST)/site-packages -f \
+ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+- ./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
++ ./$(HOSTPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
+ -d $(LIBDEST)/site-packages -f \
+ -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+- ./$(BUILDPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
++ ./$(HOSTPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+- ./$(BUILDPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
++ ./$(HOSTPYTHON) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
+
+ python-config: $(srcdir)/Misc/python-config.in
+ # Substitution happens here, as the completely-expanded BINDIR
+@@ -1157,7 +1159,7 @@
+ # Install the dynamically loadable modules
+ # This goes into $(exec_prefix)
+ sharedinstall: sharedmods
+- $(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
+@@ -345,6 +345,7 @@
+ try:
+ imp.load_dynamic(ext.name, ext_filename)
+ except ImportError as 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/3.2/81_all_use_new_readline_function_types__closes__20374_.patch b/dev-lang/python/files/3.2/81_all_use_new_readline_function_types__closes__20374_.patch
new file mode 100644
index 0000000..419f7a0
--- /dev/null
+++ b/dev-lang/python/files/3.2/81_all_use_new_readline_function_types__closes__20374_.patch
@@ -0,0 +1,28 @@
+# HG changeset patch
+# User Benjamin Peterson <benjamin@python.org>
+# Date 1390541532 18000
+# Fri Jan 24 00:32:12 2014 -0500
+# Branch 3.3
+# Node ID fb2259d9f6b4104be0015068e3293b3abb68dce7
+# Parent fed5d501a179138e3b214e463a0bc13943de7ce5
+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
+@@ -936,12 +936,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/3.2/82_all_new_plan__just_remove_typecasts__closes__20374_.patch b/dev-lang/python/files/3.2/82_all_new_plan__just_remove_typecasts__closes__20374_.patch
new file mode 100644
index 0000000..d0716f9
--- /dev/null
+++ b/dev-lang/python/files/3.2/82_all_new_plan__just_remove_typecasts__closes__20374_.patch
@@ -0,0 +1,37 @@
+# HG changeset patch
+# User Benjamin Peterson <benjamin@python.org>
+# Date 1390581856 18000
+# Fri Jan 24 11:44:16 2014 -0500
+# Branch 3.3
+# Node ID fc62fcd8e990d80b15177716437f20da49b9dccf
+# Parent b3eaeb4bdf84a8f89afaf24c0308bd0d13987844
+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
+@@ -877,7 +877,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';
+@@ -936,12 +936,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/3.2/83_all_Issue__20374__Avoid_compiler_warnings_when_compiling_readline_with_libedit_.patch b/dev-lang/python/files/3.2/83_all_Issue__20374__Avoid_compiler_warnings_when_compiling_readline_with_libedit_.patch
new file mode 100644
index 0000000..232e666
--- /dev/null
+++ b/dev-lang/python/files/3.2/83_all_Issue__20374__Avoid_compiler_warnings_when_compiling_readline_with_libedit_.patch
@@ -0,0 +1,37 @@
+# HG changeset patch
+# User Ned Deily <nad@acm.org>
+# Date 1391647990 28800
+# Wed Feb 05 16:53:10 2014 -0800
+# Branch 3.3
+# Node ID 9131a9edcac4880b2759c82fb38f13f6f871a73e
+# Parent b5fe07d39e163240aed04f71ae7862c7cf36c1e7
+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
+@@ -773,15 +773,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/pydoc.conf b/dev-lang/python/files/pydoc.conf
new file mode 100644
index 0000000..20e3628
--- /dev/null
+++ b/dev-lang/python/files/pydoc.conf
@@ -0,0 +1,7 @@
+# /etc/init.d/pydoc.conf
+# $Header: /var/cvsroot/gentoo-x86/dev-lang/python/files/pydoc.conf,v 1.3 2011/10/27 13:56:55 neurogeek Exp $
+
+# This file contains the configuration for pydoc's internal webserver.
+
+# Default port for Python's pydoc server.
+@PYDOC_PORT_VARIABLE@="7464"
diff --git a/dev-lang/python/files/pydoc.init b/dev-lang/python/files/pydoc.init
new file mode 100755
index 0000000..3f02ae9
--- /dev/null
+++ b/dev-lang/python/files/pydoc.init
@@ -0,0 +1,25 @@
+#!/sbin/runscript
+# Copyright 1999-2014 Gentoo Technologies, Inc.
+# Distributed under the terms of the GNU General Public Licence v2
+# $Header: /var/cvsroot/gentoo-x86/dev-lang/python/files/pydoc.init,v 1.5 2014/10/12 12:37:07 djc Exp $
+
+start() {
+ local pydoc_port="${@PYDOC_PORT_VARIABLE@-${PYDOC_PORT}}"
+
+ if [ -z "${pydoc_port}" ]; then
+ eerror "Port not set"
+ return 1
+ fi
+
+ ebegin "Starting pydoc server on port ${pydoc_port}"
+ start-stop-daemon --start --background --make-pidfile \
+ --pidfile /var/run/@PYDOC@.pid \
+ --exec /usr/bin/@PYDOC@ -- -p "${pydoc_port}"
+ eend $?
+}
+
+stop() {
+ ebegin "Stopping pydoc server"
+ start-stop-daemon --stop --quiet --pidfile /var/run/@PYDOC@.pid
+ eend $?
+}
diff --git a/dev-lang/python/python-3.2.6.ebuild b/dev-lang/python/python-3.2.6.ebuild
new file mode 100644
index 0000000..cf91e29
--- /dev/null
+++ b/dev-lang/python/python-3.2.6.ebuild
@@ -0,0 +1,344 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/dev-lang/python/python-3.2.5-r6.ebuild,v 1.11 2015/03/31 18:46:33 ulm Exp $
+
+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_REVISION="1"
+
+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.2"
+KEYWORDS=""
+IUSE="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? (
+ gdbm? ( sys-libs/gdbm[berkdb] )
+ ncurses? (
+ >=sys-libs/ncurses-5.2
+ readline? ( >=sys-libs/readline-4.1 )
+ )
+ sqlite? ( >=dev-db/sqlite-3.3.8:3 )
+ ssl? ( dev-libs/openssl )
+ tk? (
+ >=dev-lang/tk-8.0
+ dev-tcltk/blt
+ dev-tcltk/tix
+ )
+ xml? ( >=dev-libs/expat-2.1 )
+ )"
+DEPEND="${RDEPEND}
+ virtual/pkgconfig
+ >=sys-devel/autoconf-2.65
+ !sys-devel/gcc[libffi]"
+RDEPEND+=" !build? ( app-misc/mime-types )
+ doc? ( dev-python/python-docs:${SLOT} )"
+
+S="${WORKDIR}/${MY_P}"
+
+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}/3.2"
+
+ 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@@"
+
+ # Disable ABI flags.
+ sed -e "s/ABIFLAGS=\"\${ABIFLAGS}.*\"/:/" -i configure.ac || die "sed failed"
+
+ 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
+
+ [[ "${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
+
+ # The configure script assumes it's buggy when cross-compiling.
+ export ac_cv_buggy_getaddrinfo=no
+ export ac_cv_have_long_long_format=yes
+ 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
+
+ cd "${WORKDIR}"/${CHOST}
+ ECONF_SOURCE=${S} OPT="" \
+ econf \
+ --with-fpectl \
+ --enable-shared \
+ $(use_enable ipv6) \
+ $(use_with threads) \
+ $(use_with wide-unicode) \
+ --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
+
+ 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
+ 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 "${WORKDIR}/${CHOST}" || die
+
+ # Skip failing tests.
+ local skipped_tests="gdb"
+
+ 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" CPPFLAGS="" CFLAGS="" LDFLAGS="" < /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
+
+ sed \
+ -e "s/\(CONFIGURE_LDFLAGS=\).*/\1/" \
+ -e "s/\(PY_LDFLAGS=\).*/\1/" \
+ -i "${libdir}/config-${SLOT}/Makefile" || die "sed failed"
+
+ # Backwards compat with Gentoo divergence.
+ dosym python${SLOT}-config /usr/bin/python-config-${SLOT}
+
+ # Fix collisions between different slots of Python.
+ rm "${ED}usr/$(get_libdir)/libpython3.so" || die
+
+ if use build; then
+ rm -fr "${ED}usr/bin/idle${SLOT}" "${libdir}/"{idlelib,sqlite3,test,tkinter} || die
+ else
+ use elibc_uclibc && { rm -fr "${libdir}/test" || die; }
+ use sqlite || { rm -fr "${libdir}/"{sqlite3,test/test_sqlite*} || die; }
+ use tk || { rm -fr "${ED}usr/bin/idle${SLOT}" "${libdir}/"{idlelib,tkinter,test/test_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
+ find "${S}"/Tools -name __pycache__ -exec rm -fr {} + || die
+ dodoc -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-${SLOT}
+ newinitd "${FILESDIR}/pydoc.init" pydoc-${SLOT}
+ 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 well 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."
+}