diff options
author | Mike Gilbert <floppym@gentoo.org> | 2016-10-27 20:02:42 -0400 |
---|---|---|
committer | Mike Gilbert <floppym@gentoo.org> | 2016-10-27 20:02:42 -0400 |
commit | 97459af323867deeab8981cc82066be4a2631808 (patch) | |
tree | 970882bc9efedca7185130539284b34753076111 | |
parent | dev-lang/python: import 2.6 with some cleanup (still broken) (diff) | |
download | python-97459af323867deeab8981cc82066be4a2631808.tar.gz python-97459af323867deeab8981cc82066be4a2631808.tar.bz2 python-97459af323867deeab8981cc82066be4a2631808.zip |
dev-lang/python: add 3.3.5
Package-Manager: portage-2.3.2
18 files changed, 1910 insertions, 0 deletions
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 <benjamin@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 <hasufell@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.stinner@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>python@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 +} |