summaryrefslogtreecommitdiff
path: root/meta/recipes-devtools/python/python3
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/python/python3')
-rw-r--r--meta/recipes-devtools/python/python3/000-cross-compile.patch52
-rw-r--r--meta/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch38
-rw-r--r--meta/recipes-devtools/python/python3/020-dont-compile-python-files.patch37
-rw-r--r--meta/recipes-devtools/python/python3/04-default-is-optimized.patch58
-rw-r--r--meta/recipes-devtools/python/python3/06-ctypes-libffi-fix-configure.patch44
-rw-r--r--meta/recipes-devtools/python/python3/110-enable-zlib.patch21
-rw-r--r--meta/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch67
-rw-r--r--meta/recipes-devtools/python/python3/avoid-ncursesw-include-path.patch30
-rw-r--r--meta/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch14
-rw-r--r--meta/recipes-devtools/python/python3/configure.ac-fix-LIBPL.patch30
-rw-r--r--meta/recipes-devtools/python/python3/fix-ast.h-dependency.patch26
-rw-r--r--meta/recipes-devtools/python/python3/fix_for_using_different_libdir.patch4
-rw-r--r--meta/recipes-devtools/python/python3/makerace.patch28
-rw-r--r--meta/recipes-devtools/python/python3/python-3.3-multilib.patch393
-rw-r--r--meta/recipes-devtools/python/python3/python3-fix-CVE-2016-1000110.patch148
-rw-r--r--meta/recipes-devtools/python/python3/python3-fix-build-error-with-Readline-6.3.patch62
-rw-r--r--meta/recipes-devtools/python/python3/python3-setup.py-no-host-headers-libs.patch33
-rw-r--r--meta/recipes-devtools/python/python3/python3-use-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch28
-rw-r--r--meta/recipes-devtools/python/python3/remove_sqlite_rpath.patch19
-rw-r--r--meta/recipes-devtools/python/python3/setup.py-check-cross_compiling-when-get-FLAGS.patch50
-rw-r--r--meta/recipes-devtools/python/python3/setup.py-find-libraries-in-staging-dirs.patch30
-rw-r--r--meta/recipes-devtools/python/python3/setuptweaks.patch2
-rw-r--r--meta/recipes-devtools/python/python3/sys_platform_is_now_always_linux2.patch29
-rw-r--r--meta/recipes-devtools/python/python3/sysconfig.py-add-_PYTHON_PROJECT_SRC.patch54
-rw-r--r--meta/recipes-devtools/python/python3/tweak-MULTIARCH-for-powerpc-linux-gnuspe.patch52
-rw-r--r--meta/recipes-devtools/python/python3/unixccompiler.patch6
-rw-r--r--meta/recipes-devtools/python/python3/upstream-random-fixes.patch721
27 files changed, 1474 insertions, 602 deletions
diff --git a/meta/recipes-devtools/python/python3/000-cross-compile.patch b/meta/recipes-devtools/python/python3/000-cross-compile.patch
index 2506a590c0..2d822218f4 100644
--- a/meta/recipes-devtools/python/python3/000-cross-compile.patch
+++ b/meta/recipes-devtools/python/python3/000-cross-compile.patch
@@ -9,17 +9,19 @@ Upstream-Status: Inappropriate[Configuration Specific]
Makefile.pre.in | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -193,6 +193,7 @@ LIBOBJS= @LIBOBJS@
+Index: Python-3.5.2/Makefile.pre.in
+===================================================================
+--- Python-3.5.2.orig/Makefile.pre.in
++++ Python-3.5.2/Makefile.pre.in
+@@ -220,6 +220,7 @@ LIBOBJS= @LIBOBJS@
PYTHON= python$(EXE)
BUILDPYTHON= python$(BUILDEXE)
+HOSTPYTHON= $(BUILDPYTHON)
+ cross_compiling=@cross_compiling@
PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
- _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@
-@@ -239,6 +240,7 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@
+@@ -279,6 +280,7 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@
##########################################################################
# Parser
PGEN= Parser/pgen$(EXE)
@@ -27,25 +29,25 @@ Upstream-Status: Inappropriate[Configuration Specific]
PSRCS= \
Parser/acceler.c \
-@@ -451,7 +453,7 @@ build_all_generate_profile:
+@@ -509,7 +511,7 @@ build_all_generate_profile:
run_profile_task:
: # FIXME: can't run for a cross build
-- $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK)
-+ $(RUNSHARED) $(HOSTPYTHON) $(PROFILE_TASK)
+- $(LLVM_PROF_FILE) $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK) || true
++ $(LLVM_PROF_FILE) $(RUNSHARED) $(HOSTPYTHON) $(PROFILE_TASK) || true
- build_all_use_profile:
- $(MAKE) all CFLAGS="$(CFLAGS) -fprofile-use -fprofile-correction"
-@@ -640,7 +642,7 @@ $(IO_OBJS): $(IO_H)
- $(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS)
- @$(MKDIR_P) Include
- $(MAKE) $(PGEN)
-- $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
-+ $(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
- $(GRAMMAR_C): $(GRAMMAR_H) $(GRAMMAR_INPUT) $(PGENSRCS)
- $(MAKE) $(GRAMMAR_H)
- touch $(GRAMMAR_C)
-@@ -820,7 +822,7 @@ $(LIBRARY_OBJS) $(MODOBJS) Modules/pytho
+ build_all_merge_profile:
+ $(LLVM_PROF_MERGER)
+@@ -792,7 +794,7 @@ $(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGEN)
+ @$(MKDIR_P) Include
+ # Avoid copying the file onto itself for an in-tree build
+ if test "$(cross_compiling)" != "yes"; then \
+- $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C); \
++ $(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C); \
+ else \
+ cp $(srcdir)/Include/graminit.h $(GRAMMAR_H).tmp; \
+ mv $(GRAMMAR_H).tmp $(GRAMMAR_H); \
+@@ -990,7 +992,7 @@ $(LIBRARY_OBJS) $(MODOBJS) Programs/pyth
######################################################################
TESTOPTS= $(EXTRATESTOPTS)
@@ -54,7 +56,7 @@ Upstream-Status: Inappropriate[Configuration Specific]
TESTRUNNER= $(TESTPYTHON) $(srcdir)/Tools/scripts/run_tests.py
TESTTIMEOUT= 3600
-@@ -1229,7 +1231,7 @@ frameworkinstallstructure: $(LDLIBRARY)
+@@ -1481,7 +1483,7 @@ frameworkinstallstructure: $(LDLIBRARY)
fi; \
done
$(LN) -fsn include/python$(LDVERSION) $(DESTDIR)$(prefix)/Headers
@@ -63,7 +65,7 @@ Upstream-Status: Inappropriate[Configuration Specific]
$(LN) -fsn $(VERSION) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/Current
$(LN) -fsn Versions/Current/$(PYTHONFRAMEWORK) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/$(PYTHONFRAMEWORK)
$(LN) -fsn Versions/Current/Headers $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers
-@@ -1288,7 +1290,7 @@ config.status: $(srcdir)/configure
+@@ -1547,7 +1549,7 @@ config.status: $(srcdir)/configure
# Run reindent on the library
reindent:
@@ -72,12 +74,12 @@ Upstream-Status: Inappropriate[Configuration Specific]
# Rerun configure with the same options as it was run last time,
# provided the config.status script exists
-@@ -1414,7 +1416,7 @@ funny:
+@@ -1683,7 +1685,7 @@ funny:
# Perform some verification checks on any modified files.
- patchcheck:
+ patchcheck: all
- $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
-+ $(RUNSHARED) $(HOSTPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
++ $(RUNSHARED) ./$(HOSTPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
# Dependencies
diff --git a/meta/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch b/meta/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch
new file mode 100644
index 0000000000..b7e0ac6354
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch
@@ -0,0 +1,38 @@
+From 045c99b5f1eb6e4e0d8ad1ef9f0ba6574f738150 Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex.kanavin@gmail.com>
+Date: Fri, 23 Oct 2015 12:25:09 +0300
+Subject: [PATCH] Do not use the shell version of python-config that was
+ introduced in 3.4
+
+Revert instead to the original python version: it has our tweaks and
+outputs directories correctly.
+
+Upstream-Status: Inappropriate [oe-specific]
+Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
+---
+ Makefile.pre.in | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index d7fc9a0..47e60bc 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -1270,12 +1270,9 @@ python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh
+ sed -e "s,@EXENAME@,$(BINDIR)/python$(LDVERSION)$(EXE)," < $(srcdir)/Misc/python-config.in >python-config.py
+ # Replace makefile compat. variable references with shell script compat. ones; $(VAR) -> ${VAR}
+ sed -e 's,\$$(\([A-Za-z0-9_]*\)),\$$\{\1\},g' < Misc/python-config.sh >python-config
+- # On Darwin, always use the python version of the script, the shell
+- # version doesn't use the compiler customizations that are provided
+- # in python (_osx_support.py).
+- if test `uname -s` = Darwin; then \
+- cp python-config.py python-config; \
+- fi
++ # In OpenEmbedded, always use the python version of the script, the shell
++ # version is broken in multiple ways, and doesn't return correct directories
++ cp python-config.py python-config
+
+
+ # Install the include files
+--
+2.1.4
+
diff --git a/meta/recipes-devtools/python/python3/020-dont-compile-python-files.patch b/meta/recipes-devtools/python/python3/020-dont-compile-python-files.patch
deleted file mode 100644
index 03ef286941..0000000000
--- a/meta/recipes-devtools/python/python3/020-dont-compile-python-files.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-Dont cross compile site packages
-
--Khem
-
-Upstream-Status: Inappropriate[Embedded-Specific]
-
----
- Makefile.pre.in | 16 ----------------
- 1 file changed, 16 deletions(-)
-
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -1078,24 +1078,6 @@ libinstall: build_all $(srcdir)/Lib/$(PL
- $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
- $(DESTDIR)$(LIBDEST)/distutils/tests ; \
- fi
-- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
-- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-- -d $(LIBDEST) -f \
-- -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
-- $(DESTDIR)$(LIBDEST)
-- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
-- $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
-- -d $(LIBDEST) -f \
-- -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
-- $(DESTDIR)$(LIBDEST)
-- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
-- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
-- -d $(LIBDEST)/site-packages -f \
-- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
-- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
-- $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
-- -d $(LIBDEST)/site-packages -f \
-- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
- $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
diff --git a/meta/recipes-devtools/python/python3/04-default-is-optimized.patch b/meta/recipes-devtools/python/python3/04-default-is-optimized.patch
deleted file mode 100644
index d5afd40025..0000000000
--- a/meta/recipes-devtools/python/python3/04-default-is-optimized.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-Upstream-Status: Inappropriate [embedded specific]
-
-Updated original patch for python 2.7.3
-
-Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com>
-2012/05/01
-
-
-# when compiling for an embedded system, we need every bit of
-# performance we can get. default to optimized with the option
-# of opt-out.
-# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
-
-Index: Python-3.2.3/Python/compile.c
-===================================================================
---- Python-3.2.3.orig/Python/compile.c 2012-04-10 23:54:08.000000000 -0700
-+++ Python-3.2.3/Python/compile.c 2012-09-19 15:58:46.649123998 -0700
-@@ -30,7 +30,7 @@
- #include "symtable.h"
- #include "opcode.h"
-
--int Py_OptimizeFlag = 0;
-+int Py_OptimizeFlag = 1;
-
- #define DEFAULT_BLOCK_SIZE 16
- #define DEFAULT_BLOCKS 8
-Index: Python-3.2.3/Modules/main.c
-===================================================================
---- Python-3.2.3.orig/Modules/main.c 2012-04-10 23:54:07.000000000 -0700
-+++ Python-3.2.3/Modules/main.c 2012-09-19 16:00:32.153124053 -0700
-@@ -46,7 +46,7 @@
- static int orig_argc;
-
- /* command line options */
--#define BASE_OPTS L"bBc:dEhiJm:OqRsStuvVW:xX:?"
-+#define BASE_OPTS L"bBc:dEhiJm:NOqRsStuvVW:xX:?"
-
- #define PROGRAM_OPTS BASE_OPTS
-
-@@ -71,6 +71,7 @@
- -m mod : run library module as a script (terminates option list)\n\
- -O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
- -OO : remove doc-strings in addition to the -O optimizations\n\
-+-N : do NOT optimize generated bytecode\n\
- -q : don't print version and copyright messages on interactive startup\n\
- -R : use a pseudo-random salt to make hash() values of various types be\n\
- unpredictable between separate invocations of the interpreter, as\n\
-@@ -407,8 +408,8 @@
-
- /* case 'J': reserved for Jython */
-
-- case 'O':
-- Py_OptimizeFlag++;
-+ case 'N':
-+ Py_OptimizeFlag=0;
- break;
-
- case 'B':
diff --git a/meta/recipes-devtools/python/python3/06-ctypes-libffi-fix-configure.patch b/meta/recipes-devtools/python/python3/06-ctypes-libffi-fix-configure.patch
deleted file mode 100644
index abd63d2a96..0000000000
--- a/meta/recipes-devtools/python/python3/06-ctypes-libffi-fix-configure.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-This fixes configure issues with recent autoconf, e.g:
- autoreconf: Entering directory `Modules/_ctypes/libffi'
- autoreconf: configure.ac: not using Gettext
- autoreconf: running: aclocal --force
- configure.ac:26: error: m4_copy: won't overwrite defined macro: _AC_ARG_VAR_PRECIOUS
- configure.ac:26: the top level
-
-The problem is still present in python-2.6.5 but fixed in python-svn.
-
-Upstream-Status: Accepted [python-svn]
-
-Signed-off-by: Antonio Ospite <ospite@studenti.unina.it>
-Acked-by: Martin Jansa <Martin.Jansa@gmail.com>
-Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
-Signed-off-by: Saul Wold <sgw@linux.intel.com>
-
-
-2011/09/29
-Rebased for python 2.7.2
-Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com>
-
-
-Index: Python-2.7.2/Modules/_ctypes/libffi/Makefile.am
-===================================================================
---- Python-2.7.2.orig/Modules/_ctypes/libffi/Makefile.am
-+++ Python-2.7.2/Modules/_ctypes/libffi/Makefile.am
-@@ -2,7 +2,7 @@
-
- AUTOMAKE_OPTIONS = foreign subdir-objects
-
--SUBDIRS = include testsuite man
-+SUBDIRS = include
-
- EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
- src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \
-@@ -34,8 +34,6 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
- libtool-version ChangeLog.libffi m4/libtool.m4 \
- m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
-
--info_TEXINFOS = doc/libffi.texi
--
- ## ################################################################
-
- ##
diff --git a/meta/recipes-devtools/python/python3/110-enable-zlib.patch b/meta/recipes-devtools/python/python3/110-enable-zlib.patch
deleted file mode 100644
index fb92a19163..0000000000
--- a/meta/recipes-devtools/python/python3/110-enable-zlib.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-Enable zlib in python
-
--Khem
-
-Upstream-Status: Inappropriate [OE-Specific]
-
----
- Modules/Setup.dist | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/Modules/Setup.dist
-+++ b/Modules/Setup.dist
-@@ -354,7 +354,7 @@ _symtable symtablemodule.c
- # 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 -lz
-
- # Interface to the Expat XML parser
- #
diff --git a/meta/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch b/meta/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch
index c5846a5af8..c53ec0cfc8 100644
--- a/meta/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch
+++ b/meta/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch
@@ -1,31 +1,27 @@
+From 7630ab22578746d3d790d0598c0d279cf7afed97 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 14 May 2013 15:00:26 -0700
+Subject: [PATCH 01/20] python3: Add target and native recipes
+
Upstream-Status: Inappropriate [embedded specific]
+02/2015 Rebased for Python 3.4.2
+
# The proper prefix is inside our staging area.
# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
# Signed-off-by: Phil Blundell <philb@gnu.org>
# Signed-off-by: Khem Raj <raj.khem@gmail.com>
+# Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
-Index: Python-3.3.2/Lib/distutils/sysconfig.py
-===================================================================
---- Python-3.3.2.orig/Lib/distutils/sysconfig.py 2013-07-30 00:00:52.769749805 -0700
-+++ Python-3.3.2/Lib/distutils/sysconfig.py 2013-07-30 00:16:22.545767248 -0700
-@@ -16,10 +16,11 @@
- from .errors import DistutilsPlatformError
-
- # These are needed in a couple of spots, so just compute them once.
--PREFIX = os.path.normpath(sys.prefix)
--EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
--BASE_PREFIX = os.path.normpath(sys.base_prefix)
--BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix)
-+PREFIX = os.path.normpath(sys.prefix).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
-+EXEC_PREFIX = os.path.normpath(sys.exec_prefix).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
-+BASE_PREFIX = os.path.normpath(sys.base_prefix).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
-+BASE_EXEC_PREFIX= os.path.normpath(sys.base_exec_prefix).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
-+
-
- # Path to the base directory of the project. On Windows the binary may
- # live in project/PCBuild9. If we're dealing with an x64 Windows build,
-@@ -93,7 +94,9 @@
+---
+ Lib/distutils/sysconfig.py | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
+index 573724d..390c485 100644
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -84,7 +84,9 @@ def get_python_inc(plat_specific=0, prefix=None):
If 'prefix' is supplied, use it instead of sys.base_prefix or
sys.base_exec_prefix -- i.e., ignore 'plat_specific'.
"""
@@ -36,20 +32,18 @@ Index: Python-3.3.2/Lib/distutils/sysconfig.py
prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
if os.name == "posix":
if python_build:
-@@ -136,6 +139,12 @@
+@@ -125,6 +127,10 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
If 'prefix' is supplied, use it instead of sys.base_prefix or
sys.base_exec_prefix -- i.e., ignore 'plat_specific'.
"""
++ lib_basename = os.environ['STAGING_LIBDIR'].split('/')[-1]
+ if prefix is None and os.environ['STAGING_LIBDIR'] != "":
-+ lib_basename = os.environ['STAGING_LIBDIR'].split('/')[-1]
+ prefix = os.environ['STAGING_LIBDIR'].rstrip(lib_basename)
-+ else:
-+ lib_basename = sys.lib
+
if prefix is None:
if standard_lib:
prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
-@@ -144,7 +153,7 @@
+@@ -133,7 +139,7 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
if os.name == "posix":
libpython = os.path.join(prefix,
@@ -58,21 +52,6 @@ Index: Python-3.3.2/Lib/distutils/sysconfig.py
if standard_lib:
return libpython
else:
-@@ -249,7 +258,7 @@
- else:
- # The name of the config.h file changed in 2.2
- config_h = 'pyconfig.h'
-- return os.path.join(inc_dir, config_h)
-+ return os.path.join(inc_dir, config_h).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
-
-
- def get_makefile_filename():
-@@ -258,7 +267,7 @@
- return os.path.join(_sys_home or project_base, "Makefile")
- lib_dir = get_python_lib(plat_specific=0, standard_lib=1)
- config_file = 'config-{}{}'.format(get_python_version(), build_flags)
-- return os.path.join(lib_dir, config_file, 'Makefile')
-+ return os.path.join(lib_dir, config_file, 'Makefile').replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
-
-
- def parse_config_h(fp, g=None):
+--
+2.8.0.rc3
+
diff --git a/meta/recipes-devtools/python/python3/avoid-ncursesw-include-path.patch b/meta/recipes-devtools/python/python3/avoid-ncursesw-include-path.patch
index 054a13124c..f29ae53371 100644
--- a/meta/recipes-devtools/python/python3/avoid-ncursesw-include-path.patch
+++ b/meta/recipes-devtools/python/python3/avoid-ncursesw-include-path.patch
@@ -1,29 +1,21 @@
+Upstream-Status: Pending
+
We should make sure that sysroot is used by gcc instead of assuming
hardcoded locations for include paths
-Upstream-Status: Pending
Signed-off-by: Khem Raj <raj.khem@gmail.com>
-:
-Index: Python-3.3.3/configure.ac
+
+Index: Python-3.4.2/configure.ac
===================================================================
---- Python-3.3.3.orig/configure.ac 2014-01-29 19:00:15.245312752 -0800
-+++ Python-3.3.3/configure.ac 2014-01-29 23:27:22.938526262 -0800
-@@ -1548,7 +1548,7 @@
- # checks for header files
- AC_HEADER_STDC
- ac_save_cppflags="$CPPFLAGS"
--CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw"
-+CPPFLAGS="$CPPFLAGS -I=/usr/include/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 \
-@@ -4308,7 +4308,7 @@
- fi
+--- Python-3.4.2.orig/configure.ac
++++ Python-3.4.2/configure.ac
+@@ -4434,7 +4434,7 @@ fi
+ # first curses header check
ac_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw"
+CPPFLAGS="$CPPFLAGS -I=/usr/include/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,
+
+ AC_CHECK_HEADERS(curses.h ncurses.h)
+
diff --git a/meta/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch b/meta/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch
index 208c57c822..3347321fde 100644
--- a/meta/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch
+++ b/meta/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch
@@ -4,6 +4,7 @@ Avoid a warning by not adding this module to missing variable.
Upstream-Status: Inappropriate [distribution]
+Also simply disable the tk module since its not in DEPENDS.
Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
Index: Python-2.7.2/setup.py
@@ -23,3 +24,16 @@ Index: Python-2.7.2/setup.py
return missing
+diff --git Python-3.5.1.orig/setup.py Python-3.5.1/setup.py
+index b4633b9..d7588c0 100644
+--- Python-3.5.1.orig/setup.py
++++ Python-3.5.1/setup.py
+@@ -1536,7 +1536,7 @@ class PyBuildExt(build_ext):
+ self.extensions.extend(exts)
+
+ # Call the method for detecting whether _tkinter can be compiled
+- self.detect_tkinter(inc_dirs, lib_dirs)
++ # self.detect_tkinter(inc_dirs, lib_dirs)
+
+ # tkinter module will not be avalaible as yocto
+ # doesn't have tk integrated (yet)
diff --git a/meta/recipes-devtools/python/python3/configure.ac-fix-LIBPL.patch b/meta/recipes-devtools/python/python3/configure.ac-fix-LIBPL.patch
new file mode 100644
index 0000000000..97214f9aa4
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/configure.ac-fix-LIBPL.patch
@@ -0,0 +1,30 @@
+From 7c4f8d87473d6238c120ec6031b58f83a17a39a5 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang@windriver.com>
+Date: Mon, 28 Dec 2015 22:52:06 -0800
+Subject: [PATCH] configure.ac: fix LIBPL
+
+Use LIBDIR rather than prefix/lib, so that it would work when lib64.
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
+---
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 63aef8e..aefb27f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -4366,7 +4366,7 @@ AC_MSG_RESULT($LDVERSION)
+
+ dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
+ AC_SUBST(PY_ENABLE_SHARED)
+-LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
++LIBPL='$(LIBDIR)'"/python${VERSION}/config-${LDVERSION}"
+ AC_SUBST(LIBPL)
+
+ # Check whether right shifting a negative integer extends the sign bit
+--
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python3/fix-ast.h-dependency.patch b/meta/recipes-devtools/python/python3/fix-ast.h-dependency.patch
deleted file mode 100644
index 77c220aa82..0000000000
--- a/meta/recipes-devtools/python/python3/fix-ast.h-dependency.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-Fix a missed dependency on ast.h which can result in race condition
-at high parallel build
-
-It fixed here
-
-http://hg.python.org/cpython/rev/cfe0a293551f
-
-[YOCTO #5884]
-
-Upstream-Status: Backport
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-
-Index: Python-3.3.3/Makefile.pre.in
-===================================================================
---- Python-3.3.3.orig/Makefile.pre.in 2014-02-26 09:33:13.868288863 -0800
-+++ Python-3.3.3/Makefile.pre.in 2014-02-26 09:36:27.348292492 -0800
-@@ -853,7 +853,8 @@
- $(srcdir)/Include/warnings.h \
- $(srcdir)/Include/weakrefobject.h \
- pyconfig.h \
-- $(PARSER_HEADERS)
-+ $(PARSER_HEADERS) \
-+ $(AST_H)
-
- $(LIBRARY_OBJS) $(MODOBJS) Modules/python.o: $(PYTHON_HEADERS)
-
diff --git a/meta/recipes-devtools/python/python3/fix_for_using_different_libdir.patch b/meta/recipes-devtools/python/python3/fix_for_using_different_libdir.patch
index cd1a978eb3..0610565d3c 100644
--- a/meta/recipes-devtools/python/python3/fix_for_using_different_libdir.patch
+++ b/meta/recipes-devtools/python/python3/fix_for_using_different_libdir.patch
@@ -4,11 +4,11 @@ This patch fixes issuing with different libdir like lib64.
This patch makes the native python binary modules findable
in the install process of the host python.
-Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com>
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
Date: 2012/03/14
Updated for python 2.7.3
-Signed-Off-By: Nitin A Kamble <nitin.a.kamble@intel.com>
+Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
Date: 2012/05/01
Index: Python-3.3.0rc2/Lib/sysconfig.py
diff --git a/meta/recipes-devtools/python/python3/makerace.patch b/meta/recipes-devtools/python/python3/makerace.patch
deleted file mode 100644
index d8a68923a8..0000000000
--- a/meta/recipes-devtools/python/python3/makerace.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-There is a race due to the execution of make inside the makefile:
-
-| gcc -pthread -c -Wno-unused-result -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -I. -IInclude -I./Include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -fPIC -DPy_BUILD_CORE -o Objects/obmalloc.o Objects/obmalloc.c
-| gcc -pthread -c -Wno-unused-result -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -I. -IInclude -I./Include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -fPIC -DPy_BUILD_CORE -o Parser/pgen.o Parser/pgen.c| gcc -pthread -c -Wno-unused-result -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -I. -IInclude -I./Include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -fPIC -DPy_BUILD_CORE -o Objects/obmalloc.o Objects/obmalloc.c
-| gcc -pthread -c -Wno-unused-result -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -I. -IInclude -I./Include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -isystem/home/pokybuild/yocto-autobuilder-dev/yocto-slave/nightly-world/build/build/tmp/sysroots/x86_64-linux/usr/include -fPIC -DPy_BUILD_CORE -o Objects/obmalloc.o Objects/obmalloc.c
-| Objects/obmalloc.o: file not recognized: File truncated
-| collect2: error: ld returned 1 exit status
-| make[1]: *** [Parser/pgen] Error 1
-
-The easiest way to avoid this is to list the dependencies explictly.
-
-RP 28/2/2014
-
-Upstream-Status: Pending
-
-Index: Python-3.3.3/Makefile.pre.in
-===================================================================
---- Python-3.3.3.orig/Makefile.pre.in 2014-02-27 14:04:38.268339533 +0000
-+++ Python-3.3.3/Makefile.pre.in 2014-02-28 10:40:59.166361125 +0000
-@@ -676,7 +676,7 @@
-
- $(IO_OBJS): $(IO_H)
-
--$(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS)
-+$(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS) $(PGEN)
- @$(MKDIR_P) Include
- $(MAKE) $(PGEN)
- $(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
diff --git a/meta/recipes-devtools/python/python3/python-3.3-multilib.patch b/meta/recipes-devtools/python/python3/python-3.3-multilib.patch
index 7d66a0e00d..08c4403cbf 100644
--- a/meta/recipes-devtools/python/python3/python-3.3-multilib.patch
+++ b/meta/recipes-devtools/python/python3/python-3.3-multilib.patch
@@ -1,36 +1,58 @@
-get the sys.lib from python itself and do not use hardcoded value of 'lib'
+From 51fe6f22d0ba113674fb358bd11d75fe659bd26e Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 14 May 2013 15:00:26 -0700
+Subject: [PATCH 01/13] get the sys.lib from python itself and do not use
+ hardcoded value of 'lib'
--Khem
+02/2015 Rebased for 3.4.2
Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
-Index: Python-3.3.2/Include/pythonrun.h
-===================================================================
---- Python-3.3.2.orig/Include/pythonrun.h 2013-05-15 09:32:54.000000000 -0700
-+++ Python-3.3.2/Include/pythonrun.h 2013-07-27 16:19:54.099877246 -0700
-@@ -181,6 +181,8 @@
- /* In their own files */
- PyAPI_FUNC(const char *) Py_GetVersion(void);
- PyAPI_FUNC(const char *) Py_GetPlatform(void);
+---
+ Include/pythonrun.h | 3 +++
+ Lib/distutils/command/install.py | 4 +++-
+ Lib/pydoc.py | 2 +-
+ Lib/site.py | 4 ++--
+ Lib/sysconfig.py | 18 +++++++++---------
+ Lib/trace.py | 4 ++--
+ Makefile.pre.in | 7 +++++--
+ Modules/getpath.c | 10 +++++++++-
+ Python/getplatform.c | 20 ++++++++++++++++++++
+ Python/sysmodule.c | 4 ++++
+ configure.ac | 35 +++++++++++++++++++++++++++++++++++
+ setup.py | 9 ++++-----
+ 12 files changed, 97 insertions(+), 23 deletions(-)
+
+diff --git a/Include/pythonrun.h b/Include/pythonrun.h
+index 9c2e813..2f79cb6 100644
+--- a/Include/pythonrun.h
++++ b/Include/pythonrun.h
+@@ -23,6 +23,9 @@ typedef struct {
+ } PyCompilerFlags;
+ #endif
+
+PyAPI_FUNC(const char *) Py_GetArch(void);
+PyAPI_FUNC(const char *) Py_GetLib(void);
- PyAPI_FUNC(const char *) Py_GetCopyright(void);
- PyAPI_FUNC(const char *) Py_GetCompiler(void);
- PyAPI_FUNC(const char *) Py_GetBuildInfo(void);
-Index: Python-3.3.2/Lib/distutils/command/install.py
-===================================================================
---- Python-3.3.2.orig/Lib/distutils/command/install.py 2013-05-15 09:32:54.000000000 -0700
-+++ Python-3.3.2/Lib/distutils/command/install.py 2013-07-27 16:19:54.099877246 -0700
-@@ -25,6 +25,8 @@
- from site import USER_SITE
- HAS_USER_SITE = True
++
+ #ifndef Py_LIMITED_API
+ PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *);
+ PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *);
+diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
+index 67db007..b46b45b 100644
+--- a/Lib/distutils/command/install.py
++++ b/Lib/distutils/command/install.py
+@@ -19,6 +19,8 @@ from site import USER_BASE
+ from site import USER_SITE
+ HAS_USER_SITE = True
+libname = sys.lib
+
- if sys.version < "2.2":
- WINDOWS_SCHEME = {
- 'purelib': '$base',
-@@ -45,7 +47,7 @@
+ WINDOWS_SCHEME = {
+ 'purelib': '$base/Lib/site-packages',
+ 'platlib': '$base/Lib/site-packages',
+@@ -30,7 +32,7 @@ WINDOWS_SCHEME = {
INSTALL_SCHEMES = {
'unix_prefix': {
'purelib': '$base/lib/python$py_version_short/site-packages',
@@ -39,39 +61,31 @@ Index: Python-3.3.2/Lib/distutils/command/install.py
'headers': '$base/include/python$py_version_short$abiflags/$dist_name',
'scripts': '$base/bin',
'data' : '$base',
-Index: Python-3.3.2/Lib/pydoc.py
-===================================================================
---- Python-3.3.2.orig/Lib/pydoc.py 2013-05-15 09:32:55.000000000 -0700
-+++ Python-3.3.2/Lib/pydoc.py 2013-07-27 16:19:54.103877246 -0700
-@@ -372,7 +372,7 @@
+diff --git a/Lib/pydoc.py b/Lib/pydoc.py
+index 3ca08c9..6528730 100755
+--- a/Lib/pydoc.py
++++ b/Lib/pydoc.py
+@@ -384,7 +384,7 @@ class Doc:
+ docmodule = docclass = docroutine = docother = docproperty = docdata = fail
+
+ def getdocloc(self, object,
+- basedir=os.path.join(sys.base_exec_prefix, "lib",
++ basedir=os.path.join(sys.base_exec_prefix, sys.lib,
+ "python%d.%d" % sys.version_info[:2])):
+ """Return the location of module docs or None"""
- docloc = os.environ.get("PYTHONDOCS", self.PYTHONDOCS)
+diff --git a/Lib/site.py b/Lib/site.py
+index 3f78ef5..511931e 100644
+--- a/Lib/site.py
++++ b/Lib/site.py
+@@ -303,12 +303,12 @@ def getsitepackages(prefixes=None):
+ seen.add(prefix)
-- basedir = os.path.join(sys.base_exec_prefix, "lib",
-+ basedir = os.path.join(sys.base_exec_prefix, sys.lib,
- "python%d.%d" % sys.version_info[:2])
- if (isinstance(object, type(os)) and
- (object.__name__ in ('errno', 'exceptions', 'gc', 'imp',
-Index: Python-3.3.2/Lib/site.py
-===================================================================
---- Python-3.3.2.orig/Lib/site.py 2013-05-15 09:32:55.000000000 -0700
-+++ Python-3.3.2/Lib/site.py 2013-07-27 16:19:54.103877246 -0700
-@@ -303,13 +303,19 @@
- if sys.platform in ('os2emx', 'riscos'):
- sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
- elif os.sep == '/':
+ if os.sep == '/':
- sitepackages.append(os.path.join(prefix, "lib",
+ sitepackages.append(os.path.join(prefix, sys.lib,
"python" + sys.version[:3],
"site-packages"))
-- sitepackages.append(os.path.join(prefix, "lib", "site-python"))
-+ if sys.lib != "lib":
-+ sitepackages.append(os.path.join(prefix, "lib",
-+ "python" + sys.version[:3],
-+ "site-packages"))
-+ sitepackages.append(os.path.join(prefix, sys.lib, "site-python"))
-+ if sys.lib != "lib":
-+ sitepackages.append(os.path.join(prefix, "lib", "site-python"))
else:
sitepackages.append(prefix)
- sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
@@ -79,11 +93,57 @@ Index: Python-3.3.2/Lib/site.py
if sys.platform == "darwin":
# for framework builds *only* we add the standard Apple
# locations.
-Index: Python-3.3.2/Lib/trace.py
-===================================================================
---- Python-3.3.2.orig/Lib/trace.py 2013-05-15 09:32:56.000000000 -0700
-+++ Python-3.3.2/Lib/trace.py 2013-07-27 16:19:54.103877246 -0700
-@@ -751,10 +751,10 @@
+diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
+index 9c34be0..3d1181a 100644
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -20,10 +20,10 @@ __all__ = [
+
+ _INSTALL_SCHEMES = {
+ 'posix_prefix': {
+- 'stdlib': '{installed_base}/lib/python{py_version_short}',
+- 'platstdlib': '{platbase}/lib/python{py_version_short}',
++ 'stdlib': '{installed_base}/'+sys.lib+'/python{py_version_short}',
++ 'platstdlib': '{platbase}/'+sys.lib+'/python{py_version_short}',
+ 'purelib': '{base}/lib/python{py_version_short}/site-packages',
+- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
++ 'platlib': '{platbase}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'include':
+ '{installed_base}/include/python{py_version_short}{abiflags}',
+ 'platinclude':
+@@ -32,10 +32,10 @@ _INSTALL_SCHEMES = {
+ 'data': '{base}',
+ },
+ 'posix_home': {
+- 'stdlib': '{installed_base}/lib/python',
+- 'platstdlib': '{base}/lib/python',
++ 'stdlib': '{installed_base}/'+sys.lib+'/python',
++ 'platstdlib': '{base}/'+sys.lib+'/python',
+ 'purelib': '{base}/lib/python',
+- 'platlib': '{base}/lib/python',
++ 'platlib': '{base}/'+sys.lib+'/python',
+ 'include': '{installed_base}/include/python',
+ 'platinclude': '{installed_base}/include/python',
+ 'scripts': '{base}/bin',
+@@ -61,10 +61,10 @@ _INSTALL_SCHEMES = {
+ 'data': '{userbase}',
+ },
+ 'posix_user': {
+- 'stdlib': '{userbase}/lib/python{py_version_short}',
+- 'platstdlib': '{userbase}/lib/python{py_version_short}',
++ 'stdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
++ 'platstdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
+ 'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
+- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
++ 'platlib': '{userbase}/'+sys.lib+'/python{py_version_short}/site-packages',
+ 'include': '{userbase}/include/python{py_version_short}',
+ 'scripts': '{userbase}/bin',
+ 'data': '{userbase}',
+diff --git a/Lib/trace.py b/Lib/trace.py
+index f108266..7fd83f2 100755
+--- a/Lib/trace.py
++++ b/Lib/trace.py
+@@ -749,10 +749,10 @@ def main(argv=None):
# should I also call expanduser? (after all, could use $HOME)
s = s.replace("$prefix",
@@ -96,11 +156,11 @@ Index: Python-3.3.2/Lib/trace.py
"python" + sys.version[:3]))
s = os.path.normpath(s)
ignore_dirs.append(s)
-Index: Python-3.3.2/Makefile.pre.in
-===================================================================
---- Python-3.3.2.orig/Makefile.pre.in 2013-07-27 16:19:16.000000000 -0700
-+++ Python-3.3.2/Makefile.pre.in 2013-07-27 16:19:54.103877246 -0700
-@@ -96,6 +96,8 @@
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 109f402..61a41e2 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -106,6 +106,8 @@ PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARE
# Machine-dependent subdirectories
MACHDEP= @MACHDEP@
@@ -109,7 +169,7 @@ Index: Python-3.3.2/Makefile.pre.in
# Multiarch directory (may be empty)
MULTIARCH= @MULTIARCH@
-@@ -115,7 +117,7 @@
+@@ -125,7 +127,7 @@ LIBDIR= @libdir@
MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
@@ -118,15 +178,15 @@ Index: Python-3.3.2/Makefile.pre.in
ABIFLAGS= @ABIFLAGS@
# Detailed destination directories
-@@ -635,6 +637,7 @@
+@@ -755,6 +757,7 @@ Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile
-DEXEC_PREFIX='"$(exec_prefix)"' \
-DVERSION='"$(VERSION)"' \
-DVPATH='"$(VPATH)"' \
+ -DARCH='"$(ARCH)"' -DLIB='"$(LIB)"' \
-o $@ $(srcdir)/Modules/getpath.c
- Modules/python.o: $(srcdir)/Modules/python.c
-@@ -701,7 +704,7 @@
+ Programs/python.o: $(srcdir)/Programs/python.c
+@@ -835,7 +838,7 @@ $(OPCODE_H): $(srcdir)/Lib/opcode.py $(OPCODE_H_SCRIPT)
Python/compile.o Python/symtable.o Python/ast.o: $(GRAMMAR_H) $(AST_H)
Python/getplatform.o: $(srcdir)/Python/getplatform.c
@@ -135,38 +195,46 @@ Index: Python-3.3.2/Makefile.pre.in
Python/importdl.o: $(srcdir)/Python/importdl.c
$(CC) -c $(PY_CORE_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c
-Index: Python-3.3.2/Modules/getpath.c
-===================================================================
---- Python-3.3.2.orig/Modules/getpath.c 2013-05-15 09:32:59.000000000 -0700
-+++ Python-3.3.2/Modules/getpath.c 2013-07-27 16:19:54.107877246 -0700
-@@ -121,9 +121,11 @@
- #define EXEC_PREFIX PREFIX
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index 18deb60..a01c3f8 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -105,6 +105,13 @@
+ #error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined"
#endif
+#define LIB_PYTHON LIB "/python" VERSION
+
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#ifndef PYTHONPATH
+#define PYTHONPATH PREFIX "/" LIB_PYTHON ":" \
-+ EXEC_PREFIX "/" LIB_PYTHON "/lib-dynload"
- #endif
-
++ EXEC_PREFIX "/" LIB_PYTHON "/lib-dynload"
++#endif
++
#ifndef LANDMARK
-@@ -135,7 +137,7 @@
+ #define LANDMARK L"os.py"
+ #endif
+@@ -113,6 +120,7 @@ static wchar_t prefix[MAXPATHLEN+1];
+ static wchar_t exec_prefix[MAXPATHLEN+1];
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"" LIB_PYTHON;
- static void
- reduce(wchar_t *dir)
-Index: Python-3.3.2/Python/getplatform.c
-===================================================================
---- Python-3.3.2.orig/Python/getplatform.c 2013-05-15 09:33:00.000000000 -0700
-+++ Python-3.3.2/Python/getplatform.c 2013-07-27 16:19:54.107877246 -0700
-@@ -10,3 +10,23 @@
+ /* Get file status. Encode the path to the locale encoding. */
+
+@@ -494,7 +502,7 @@ calculate_path(void)
+ _pythonpath = Py_DecodeLocale(PYTHONPATH, NULL);
+ _prefix = Py_DecodeLocale(PREFIX, NULL);
+ _exec_prefix = Py_DecodeLocale(EXEC_PREFIX, NULL);
+- lib_python = Py_DecodeLocale("lib/python" VERSION, NULL);
++ lib_python = Py_DecodeLocale(LIB_PYTHON, NULL);
+
+ if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
+ Py_FatalError(
+diff --git a/Python/getplatform.c b/Python/getplatform.c
+index 6899140..66a49c6 100644
+--- a/Python/getplatform.c
++++ b/Python/getplatform.c
+@@ -10,3 +10,23 @@ Py_GetPlatform(void)
{
return PLATFORM;
}
@@ -190,11 +258,11 @@ Index: Python-3.3.2/Python/getplatform.c
+{
+ return LIB;
+}
-Index: Python-3.3.2/Python/sysmodule.c
-===================================================================
---- Python-3.3.2.orig/Python/sysmodule.c 2013-05-15 09:33:00.000000000 -0700
-+++ Python-3.3.2/Python/sysmodule.c 2013-07-27 16:19:54.107877246 -0700
-@@ -1612,6 +1612,10 @@
+diff --git a/Python/sysmodule.c b/Python/sysmodule.c
+index 8d7e05a..d9dee0f 100644
+--- a/Python/sysmodule.c
++++ b/Python/sysmodule.c
+@@ -1790,6 +1790,10 @@ _PySys_Init(void)
PyUnicode_FromString(Py_GetCopyright()));
SET_SYS_FROM_STRING("platform",
PyUnicode_FromString(Py_GetPlatform()));
@@ -205,96 +273,13 @@ Index: Python-3.3.2/Python/sysmodule.c
SET_SYS_FROM_STRING("executable",
PyUnicode_FromWideChar(
Py_GetProgramFullPath(), -1));
-Index: Python-3.3.2/setup.py
-===================================================================
---- Python-3.3.2.orig/setup.py 2013-07-27 16:19:17.000000000 -0700
-+++ Python-3.3.2/setup.py 2013-07-27 16:19:54.107877246 -0700
-@@ -439,7 +439,7 @@
- # directories (i.e. '.' and 'Include') must be first. See issue
- # 10520.
- if not cross_compiling:
-- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
-+ add_dir_to_list(self.compiler.library_dirs, os.path.join('/usr/local', sys.lib))
- add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
- # only change this for cross builds for 3.3, issues on Mageia
- if cross_compiling:
-@@ -497,8 +497,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',
-+ '/' + sys.lib, '/usr/' + sys.lib,
- ]
- inc_dirs = self.compiler.include_dirs + ['/usr/include']
- else:
-@@ -675,11 +674,11 @@
- elif curses_library:
- readline_libs.append(curses_library)
- elif self.compiler.find_library_file(lib_dirs +
-- ['/usr/lib/termcap'],
-+ ['/usr/'+sys.lib+'/termcap'],
- 'termcap'):
- readline_libs.append('termcap')
- exts.append( Extension('readline', ['readline.c'],
-- library_dirs=['/usr/lib/termcap'],
-+ library_dirs=['/usr/'+sys.lib+'/termcap'],
- extra_link_args=readline_extra_link_args,
- libraries=readline_libs) )
- else:
-Index: Python-3.3.2/Lib/sysconfig.py
-===================================================================
---- Python-3.3.2.orig/Lib/sysconfig.py 2013-05-15 09:32:55.000000000 -0700
-+++ Python-3.3.2/Lib/sysconfig.py 2013-07-27 16:19:54.111877246 -0700
-@@ -21,10 +21,10 @@
-
- _INSTALL_SCHEMES = {
- 'posix_prefix': {
-- 'stdlib': '{installed_base}/lib/python{py_version_short}',
-- 'platstdlib': '{platbase}/lib/python{py_version_short}',
-+ 'stdlib': '{installed_base}/'+sys.lib+'/python{py_version_short}',
-+ 'platstdlib': '{platbase}/'+sys.lib+'/python{py_version_short}',
- 'purelib': '{base}/lib/python{py_version_short}/site-packages',
-- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
-+ 'platlib': '{platbase}/'+sys.lib+'/python{py_version_short}/site-packages',
- 'include':
- '{installed_base}/include/python{py_version_short}{abiflags}',
- 'platinclude':
-@@ -33,10 +33,10 @@
- 'data': '{base}',
- },
- 'posix_home': {
-- 'stdlib': '{installed_base}/lib/python',
-- 'platstdlib': '{base}/lib/python',
-+ 'stdlib': '{installed_base}/'+sys.lib+'/python',
-+ 'platstdlib': '{base}/'+sys.lib+'/python',
- 'purelib': '{base}/lib/python',
-- 'platlib': '{base}/lib/python',
-+ 'platlib': '{base}/'+sys.lib+'/python',
- 'include': '{installed_base}/include/python',
- 'platinclude': '{installed_base}/include/python',
- 'scripts': '{base}/bin',
-@@ -81,10 +81,10 @@
- 'data': '{userbase}',
- },
- 'posix_user': {
-- 'stdlib': '{userbase}/lib/python{py_version_short}',
-- 'platstdlib': '{userbase}/lib/python{py_version_short}',
-+ 'stdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
-+ 'platstdlib': '{userbase}/'+sys.lib+'/python{py_version_short}',
- 'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
-- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
-+ 'platlib': '{userbase}/'+sys.lib+'/python{py_version_short}/site-packages',
- 'include': '{userbase}/include/python{py_version_short}',
- 'scripts': '{userbase}/bin',
- 'data': '{userbase}',
-Index: Python-3.3.2/configure.ac
-===================================================================
---- Python-3.3.2.orig/configure.ac 2013-05-15 09:33:00.000000000 -0700
-+++ Python-3.3.2/configure.ac 2013-07-27 16:19:54.111877246 -0700
-@@ -769,6 +769,41 @@
- MULTIARCH=$($CC --print-multiarch 2>/dev/null)
- AC_SUBST(MULTIARCH)
+diff --git a/configure.ac b/configure.ac
+index 707324d..e8d59a3 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -883,6 +883,41 @@ PLATDIR=plat-$MACHDEP
+ AC_SUBST(PLATDIR)
+ AC_SUBST(PLATFORM_TRIPLET)
+AC_SUBST(ARCH)
+AC_MSG_CHECKING(ARCH)
@@ -332,5 +317,45 @@ Index: Python-3.3.2/configure.ac
+esac
+AC_MSG_RESULT($LIB)
- AC_SUBST(LIBRARY)
- AC_MSG_CHECKING(LIBRARY)
+ AC_MSG_CHECKING([for -Wl,--no-as-needed])
+ save_LDFLAGS="$LDFLAGS"
+diff --git a/setup.py b/setup.py
+index 6d26deb..7b14215 100644
+--- a/setup.py
++++ b/setup.py
+@@ -495,7 +495,7 @@ class PyBuildExt(build_ext):
+ # directories (i.e. '.' and 'Include') must be first. See issue
+ # 10520.
+ if not cross_compiling:
+- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
++ add_dir_to_list(self.compiler.library_dirs, os.path.join('/usr/local', sys.lib))
+ add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+ # only change this for cross builds for 3.3, issues on Mageia
+ if cross_compiling:
+@@ -553,8 +553,7 @@ class PyBuildExt(build_ext):
+ # 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',
++ '/' + sys.lib, '/usr/' + sys.lib,
+ ]
+ inc_dirs = self.compiler.include_dirs + ['/usr/include']
+ else:
+@@ -746,11 +745,11 @@ class PyBuildExt(build_ext):
+ elif curses_library:
+ readline_libs.append(curses_library)
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/'+sys.lib+'/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( Extension('readline', ['readline.c'],
+- library_dirs=['/usr/lib/termcap'],
++ library_dirs=['/usr/'+sys.lib+'/termcap'],
+ extra_link_args=readline_extra_link_args,
+ libraries=readline_libs) )
+ else:
+--
+2.11.0
+
diff --git a/meta/recipes-devtools/python/python3/python3-fix-CVE-2016-1000110.patch b/meta/recipes-devtools/python/python3/python3-fix-CVE-2016-1000110.patch
new file mode 100644
index 0000000000..ab1b7230ea
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/python3-fix-CVE-2016-1000110.patch
@@ -0,0 +1,148 @@
+From aab3e8c432b90508ac14755128f5a687be2fdf43 Mon Sep 17 00:00:00 2001
+From: Mingli Yu <Mingli.Yu@windriver.com>
+Date: Thu, 22 Sep 2016 16:39:49 +0800
+Subject: [PATCH] python3: fix CVE-2016-1000110
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Ignore the HTTP_PROXY variable when REQUEST_METHOD environment is set, which
+indicates that the script is in CGI mode.
+
+Issue #27568 Reported and patch contributed by Rémi Rampin. [#27568]
+
+Backport patch from https://hg.python.org/cpython/rev/a0ac52ed8f79
+
+Upstream-Status: Backport
+CVE: CVE-2016-1000110
+Signed-off-by: Mingli Yu <Mingli.Yu@windriver.com>
+---
+ Doc/howto/urllib2.rst | 5 +++++
+ Doc/library/urllib.request.rst | 17 ++++++++++++++++-
+ Lib/test/test_urllib.py | 14 +++++++++++++-
+ Lib/urllib/request.py | 6 ++++++
+ Misc/NEWS | 4 ++++
+ 5 files changed, 44 insertions(+), 2 deletions(-)
+
+diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
+index 24a4156..d2c7991 100644
+--- a/Doc/howto/urllib2.rst
++++ b/Doc/howto/urllib2.rst
+@@ -538,6 +538,11 @@ setting up a `Basic Authentication`_ handler: ::
+ through a proxy. However, this can be enabled by extending urllib.request as
+ shown in the recipe [#]_.
+
++.. note::
++
++ ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; see
++ the documentation on :func:`~urllib.request.getproxies`.
++
+
+ Sockets and Layers
+ ==================
+diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
+index 1338906..1291aeb 100644
+--- a/Doc/library/urllib.request.rst
++++ b/Doc/library/urllib.request.rst
+@@ -173,6 +173,16 @@ The :mod:`urllib.request` module defines the following functions:
+ If both lowercase and uppercase environment variables exist (and disagree),
+ lowercase is preferred.
+
++ .. note::
++
++ If the environment variable ``REQUEST_METHOD`` is set, which usually
++ indicates your script is running in a CGI environment, the environment
++ variable ``HTTP_PROXY`` (uppercase ``_PROXY``) will be ignored. This is
++ because that variable can be injected by a client using the "Proxy:" HTTP
++ header. If you need to use an HTTP proxy in a CGI environment, either use
++ ``ProxyHandler`` explicitly, or make sure the variable name is in
++ lowercase (or at least the ``_proxy`` suffix).
++
+
+ The following classes are provided:
+
+@@ -280,6 +290,11 @@ The following classes are provided:
+ list of hostname suffixes, optionally with ``:port`` appended, for example
+ ``cern.ch,ncsa.uiuc.edu,some.host:8080``.
+
++ .. note::
++
++ ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set;
++ see the documentation on :func:`~urllib.request.getproxies`.
++
+
+ .. class:: HTTPPasswordMgr()
+
+@@ -1138,7 +1153,7 @@ the returned bytes object to string once it determines or guesses
+ the appropriate encoding.
+
+ The following W3C document, https://www.w3.org/International/O-charset\ , lists
+-the various ways in which a (X)HTML or a XML document could have specified its
++the various ways in which an (X)HTML or an XML document could have specified its
+ encoding information.
+
+ As the python.org website uses *utf-8* encoding as specified in its meta tag, we
+diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
+index 5d05f8d..247598a 100644
+--- a/Lib/test/test_urllib.py
++++ b/Lib/test/test_urllib.py
+@@ -1,4 +1,4 @@
+-"""Regresssion tests for what was in Python 2's "urllib" module"""
++"""Regression tests for what was in Python 2's "urllib" module"""
+
+ import urllib.parse
+ import urllib.request
+@@ -232,6 +232,18 @@ class ProxyTests(unittest.TestCase):
+ self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com:8888'))
+ self.assertTrue(urllib.request.proxy_bypass_environment('newdomain.com:1234'))
+
++ def test_proxy_cgi_ignore(self):
++ try:
++ self.env.set('HTTP_PROXY', 'http://somewhere:3128')
++ proxies = urllib.request.getproxies_environment()
++ self.assertEqual('http://somewhere:3128', proxies['http'])
++ self.env.set('REQUEST_METHOD', 'GET')
++ proxies = urllib.request.getproxies_environment()
++ self.assertNotIn('http', proxies)
++ finally:
++ self.env.unset('REQUEST_METHOD')
++ self.env.unset('HTTP_PROXY')
++
+ def test_proxy_bypass_environment_host_match(self):
+ bypass = urllib.request.proxy_bypass_environment
+ self.env.set('NO_PROXY',
+diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
+index 1731fe3..3be327d 100644
+--- a/Lib/urllib/request.py
++++ b/Lib/urllib/request.py
+@@ -2412,6 +2412,12 @@ def getproxies_environment():
+ name = name.lower()
+ if value and name[-6:] == '_proxy':
+ proxies[name[:-6]] = value
++ # CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY
++ # (non-all-lowercase) as it may be set from the web server by a "Proxy:"
++ # header from the client
++ # If "proxy" is lowercase, it will still be used thanks to the next block
++ if 'REQUEST_METHOD' in os.environ:
++ proxies.pop('http', None)
+ for name, value in os.environ.items():
+ if name[-6:] == '_proxy':
+ name = name.lower()
+diff --git a/Misc/NEWS b/Misc/NEWS
+index 4ad2551..2fcc95b 100644
+--- a/Misc/NEWS
++++ b/Misc/NEWS
+@@ -329,6 +329,10 @@ Library
+ - Issue #26644: Raise ValueError rather than SystemError when a negative
+ length is passed to SSLSocket.recv() or read().
+
++- Issue #27568: Prevent HTTPoxy attack (CVE-2016-1000110). Ignore the
++ HTTP_PROXY variable when REQUEST_METHOD environment is set, which indicates
++ that the script is in CGI mode.
++
+ - Issue #23804: Fix SSL recv(0) and read(0) methods to return zero bytes
+ instead of up to 1024.
+
+--
+2.8.1
+
diff --git a/meta/recipes-devtools/python/python3/python3-fix-build-error-with-Readline-6.3.patch b/meta/recipes-devtools/python/python3/python3-fix-build-error-with-Readline-6.3.patch
deleted file mode 100644
index 44e2b7e5f1..0000000000
--- a/meta/recipes-devtools/python/python3/python3-fix-build-error-with-Readline-6.3.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-python3: fix build error with Readline 6.3
-
-Backport two patches from upstream:
-
-use new readline function types (closes #20374)
-Issue #20374: Avoid compiler warnings when compiling readline with libedit.
-
-Upstream-Status: Backport
-
-Signed-off-by: Chong Lu <Chong.Lu@windriver.com>
----
- Modules/readline.c | 15 ++++++++++++---
- 1 file changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/Modules/readline.c b/Modules/readline.c
-index 096c6d1..1646ef8 100644
---- a/Modules/readline.c
-+++ b/Modules/readline.c
-@@ -773,15 +773,24 @@ on_hook(PyObject *func)
- 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);
- }
-@@ -936,12 +945,12 @@ setup_readline(void)
- 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 =
---
-1.7.9.5
-
diff --git a/meta/recipes-devtools/python/python3/python3-setup.py-no-host-headers-libs.patch b/meta/recipes-devtools/python/python3/python3-setup.py-no-host-headers-libs.patch
new file mode 100644
index 0000000000..2bc8b8c460
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/python3-setup.py-no-host-headers-libs.patch
@@ -0,0 +1,33 @@
+From 43238e1ac13e32984d015c92a5841f3de1fe1d15 Mon Sep 17 00:00:00 2001
+From: Jackie Huang <jackie.huang@windriver.com>
+Date: Tue, 18 Nov 2014 00:07:07 -0500
+Subject: [PATCH] setup.py: no host headers libs
+
+When we are cross-compiling, setup.py should never look in /usr
+or /usr/local to find headers or libraries.
+
+Upstream-Status: Inappropriate [Cross compile specific]
+
+Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
+---
+ setup.py | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index f020b28..e8339cd 100644
+--- a/setup.py
++++ b/setup.py
+@@ -444,10 +444,7 @@ class PyBuildExt(build_ext):
+ if not cross_compiling:
+ add_dir_to_list(self.compiler.library_dirs, os.path.join('/usr/local', sys.lib))
+ add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+- # only change this for cross builds for 3.3, issues on Mageia
+- if cross_compiling:
+ self.add_gcc_paths()
+- if not cross_compiling:
+ self.add_multiarch_paths()
+
+ # Add paths specified in the environment variables LDFLAGS and
+--
+2.0.0
+
diff --git a/meta/recipes-devtools/python/python3/python3-use-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch b/meta/recipes-devtools/python/python3/python3-use-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch
new file mode 100644
index 0000000000..74490d93a5
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/python3-use-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch
@@ -0,0 +1,28 @@
+From 53ed216d7bf70dd2a925432b6805a701e5fc3e0e Mon Sep 17 00:00:00 2001
+From: Jackie Huang <jackie.huang@windriver.com>
+Date: Mon, 17 Nov 2014 06:44:47 +0000
+Subject: [PATCH] python3 use CROSSPYTHONPATH for PYTHON_FOR_BUILD
+
+Upstream-Status: Inappropriate [Cross compile specific]
+
+Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
+---
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 989baf9..2890c96 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -67,7 +67,7 @@ if test "$cross_compiling" = yes; then
+ AC_MSG_ERROR([python$PACKAGE_VERSION interpreter not found])
+ fi
+ AC_MSG_RESULT($interp)
+- PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/$(PLATDIR) '$interp
++ PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(CROSSPYTHONPATH) '$interp
+ fi
+ elif test "$cross_compiling" = maybe; then
+ AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH])
+--
+2.0.1
+
diff --git a/meta/recipes-devtools/python/python3/remove_sqlite_rpath.patch b/meta/recipes-devtools/python/python3/remove_sqlite_rpath.patch
deleted file mode 100644
index 4ec627ea51..0000000000
--- a/meta/recipes-devtools/python/python3/remove_sqlite_rpath.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-This patch removes the RPATH setting which contains a pointer to
-the target relocated sysroot, which is incorrect.
-
-Upstream-Status: Inappropriate [Embedded Specific]
-
-Signed-off-by: Saul Wold <sgw@linux.intel.com>
-
-Index: Python-2.6.6/setup.py
-===================================================================
---- Python-2.6.6.orig/setup.py 2011-09-28 14:22:57.000000000 -0700
-+++ Python-2.6.6/setup.py 2011-09-28 16:11:25.147279633 -0700
-@@ -1079,7 +1079,6 @@
- include_dirs=["Modules/_sqlite",
- sqlite_incdir],
- library_dirs=sqlite_libdir,
-- runtime_library_dirs=sqlite_libdir,
- extra_link_args=sqlite_extra_link_args,
- libraries=["sqlite3",]))
- else:
diff --git a/meta/recipes-devtools/python/python3/setup.py-check-cross_compiling-when-get-FLAGS.patch b/meta/recipes-devtools/python/python3/setup.py-check-cross_compiling-when-get-FLAGS.patch
new file mode 100644
index 0000000000..fc2e12dfe5
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/setup.py-check-cross_compiling-when-get-FLAGS.patch
@@ -0,0 +1,50 @@
+From 8dad810f3a3d073f09ad72e1a3ee0a895eab2ca1 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang@windriver.com>
+Date: Sun, 18 Jan 2015 19:05:36 -0800
+Subject: [PATCH] setup.py:check cross_compiling when get FLAGS
+
+Fixed when compile target pythnon3:
+gcc -isystem/path/to/sysroots/x86_64-linux/usr/include \
+ -L=/path/to/sysroots/x86_64-linux/usr/lib
+
+This is incorrect, the native sysroot should not be used by target
+python3.
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
+---
+ setup.py | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index e8339cd..83fd31f 100644
+--- a/setup.py
++++ b/setup.py
+@@ -238,7 +238,10 @@ class PyBuildExt(build_ext):
+ # unfortunately, distutils doesn't let us provide separate C and C++
+ # compilers
+ if compiler is not None:
+- (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
++ if cross_compiling:
++ (ccshared,cflags) = (os.environ.get('CCSHARED') or '', os.environ.get('CFLAGS') or '')
++ else:
++ (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
+ args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
+ self.compiler.set_executables(**args)
+
+@@ -457,7 +460,10 @@ class PyBuildExt(build_ext):
+ ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
+ ('LDFLAGS', '-L', self.compiler.library_dirs),
+ ('CPPFLAGS', '-I', self.compiler.include_dirs)):
+- env_val = sysconfig.get_config_var(env_var)
++ if cross_compiling:
++ env_val = os.environ.get(env_var)
++ else:
++ env_val = sysconfig.get_config_var(env_var)
+ if env_val:
+ # To prevent optparse from raising an exception about any
+ # options in env_val that it doesn't know about we strip out
+--
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python3/setup.py-find-libraries-in-staging-dirs.patch b/meta/recipes-devtools/python/python3/setup.py-find-libraries-in-staging-dirs.patch
new file mode 100644
index 0000000000..f26bd38b02
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/setup.py-find-libraries-in-staging-dirs.patch
@@ -0,0 +1,30 @@
+Patch setup.py so that the detect_modules() function looks for required
+libraries and headers in STAGING_LIBDIR / STAGING_INCDIR.
+
+Without this patch, several extension modules are not built, even though
+their dependencies are present in the compiler's search paths.
+The result is the following warning, and ultimately incomplete packages:
+
+| The necessary bits to build these optional modules were not found:
+| _bz2 _curses_panel _dbm
+| _gdbm _lzma _sqlite3
+| nis readline zlib
+| To find the necessary bits, look in setup.py in detect_modules() for the module's name.
+
+Upstream-Status: Inappropriate [Cross compile specific]
+
+Signed-off-by: Dominic Sacré <dominic.sacre@gmx.de>
+
+Index: Python-3.4.3/setup.py
+===================================================================
+--- Python-3.4.3.orig/setup.py
++++ Python-3.4.3/setup.py
+@@ -521,6 +521,8 @@ class PyBuildExt(build_ext):
+ else:
+ lib_dirs = self.compiler.library_dirs[:]
+ inc_dirs = self.compiler.include_dirs[:]
++ lib_dirs.append(os.environ.get('STAGING_LIBDIR'))
++ inc_dirs.append(os.environ.get('STAGING_INCDIR'))
+ exts = []
+ missing = []
+
diff --git a/meta/recipes-devtools/python/python3/setuptweaks.patch b/meta/recipes-devtools/python/python3/setuptweaks.patch
index c34ef160d3..3a91b1916c 100644
--- a/meta/recipes-devtools/python/python3/setuptweaks.patch
+++ b/meta/recipes-devtools/python/python3/setuptweaks.patch
@@ -1,7 +1,7 @@
This patch removes various ways native system options can pass into the python
compilation and somehow break C modules.
-Upstream-Status: Configuration [OE Specific]
+Upstream-Status: Inappropriate [OE Specific]
RP 2012/04/23
diff --git a/meta/recipes-devtools/python/python3/sys_platform_is_now_always_linux2.patch b/meta/recipes-devtools/python/python3/sys_platform_is_now_always_linux2.patch
deleted file mode 100644
index 506210fa17..0000000000
--- a/meta/recipes-devtools/python/python3/sys_platform_is_now_always_linux2.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-Upstream-Status: Accepted [http://hg.python.org/cpython/rev/c816479f6aaf/]
-Bugtracker: http://bugs.python.org/issue12326
-
-[Removed "Misc/NEWS" hunk]
-
-Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
-
-# HG changeset patch
-# User Victor Stinner <victor.stinner@haypocalc.com>
-# Date 1313841758 -7200
-# Node ID c816479f6aaf71dbd3f3fe4b239186d60c55ce48
-# Parent 3e093590ac57fdda428c7da3f72ddf0c475ecf2b
-Issue #12326: sys.platform is now always 'linux2' on Linux
-
-Even if Python is compiled on Linux 3.
-
-Index: Python-3.3.0rc2/configure.ac
-===================================================================
---- Python-3.3.0rc2.orig/configure.ac 2012-09-09 02:11:14.000000000 -0700
-+++ Python-3.3.0rc2/configure.ac 2012-09-20 00:44:03.317124001 -0700
-@@ -366,7 +366,7 @@
- MACHDEP="$ac_md_system$ac_md_release"
-
- case $MACHDEP in
-- linux*) MACHDEP="linux";;
-+ linux*) MACHDEP="linux2";;
- cygwin*) MACHDEP="cygwin";;
- darwin*) MACHDEP="darwin";;
- irix646) MACHDEP="irix6";;
diff --git a/meta/recipes-devtools/python/python3/sysconfig.py-add-_PYTHON_PROJECT_SRC.patch b/meta/recipes-devtools/python/python3/sysconfig.py-add-_PYTHON_PROJECT_SRC.patch
new file mode 100644
index 0000000000..de07643f2b
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/sysconfig.py-add-_PYTHON_PROJECT_SRC.patch
@@ -0,0 +1,54 @@
+From fc93b3cc23b4f9698ae92a42986dbb02b6f19588 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang@windriver.com>
+Date: Sun, 18 Jan 2015 06:29:50 -0800
+Subject: [PATCH] sysconfig.py: add _PYTHON_PROJECT_SRC
+
+python3 has introduced _PYTHON_PROJECT_BASE which is used for separate B
+and S, but it doesn't work when compile Modules, the target python3 runs
+python3-native's sysconfig to get srcdir which is the native's, there
+would be errors when native's srcdir has been removed, add
+_PYTHON_PROJECT_SRC to fix the problem.
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
+---
+ Lib/distutils/sysconfig.py | 5 ++++-
+ Lib/sysconfig.py | 5 ++++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
+index a545ab9..74317d1 100644
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -554,7 +554,10 @@ def get_config_vars(*args):
+ _config_vars['exec_prefix'] = EXEC_PREFIX
+
+ # Always convert srcdir to an absolute path
+- srcdir = _config_vars.get('srcdir', project_base)
++ if "_PYTHON_PROJECT_SRC" in os.environ:
++ srcdir = os.path.abspath(os.environ["_PYTHON_PROJECT_SRC"])
++ else:
++ srcdir = _config_vars.get('srcdir', project_base)
+ if os.name == 'posix':
+ if python_build:
+ # If srcdir is a relative path (typically '.' or '..')
+diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
+index 7287f11..cc92998 100644
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -562,7 +562,10 @@ def get_config_vars(*args):
+ _CONFIG_VARS['userbase'] = _getuserbase()
+
+ # Always convert srcdir to an absolute path
+- srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE)
++ if "_PYTHON_PROJECT_SRC" in os.environ:
++ srcdir = os.path.abspath(os.environ["_PYTHON_PROJECT_SRC"])
++ else:
++ srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE)
+ if os.name == 'posix':
+ if _PYTHON_BUILD:
+ # If srcdir is a relative path (typically '.' or '..')
+--
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python3/tweak-MULTIARCH-for-powerpc-linux-gnuspe.patch b/meta/recipes-devtools/python/python3/tweak-MULTIARCH-for-powerpc-linux-gnuspe.patch
new file mode 100644
index 0000000000..8d037278bd
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/tweak-MULTIARCH-for-powerpc-linux-gnuspe.patch
@@ -0,0 +1,52 @@
+From 5d6509313198ec9b686cad50b002212e4344004b Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia@windriver.com>
+Date: Fri, 11 Mar 2016 01:15:45 -0500
+Subject: [PATCH] configure.ac: tweak MULTIARCH for powerpc-linux-gnuspe
+
+For p1022ds bsp, the MULTIARCH is powerpc-linux-gnuspev1 and
+python3 did not recognize the extra 'v1' which caused python3
+configure error for the platform triplet.
+
+Q:Why Python3 check platform triplet?
+
+A:Under Linux, GNU/KFreeBSD and the Hurd, C extensions now include
+the architecture triplet in the extension name, to make it easy to
+test builds for different ABIs in the same working tree.
+
+Here is the generated C extensions which take platform triplet into account.
+...
+|image/usr/lib/python3.5/lib-dynload/_datetime.cpython-35m-powerpc-linux-gnuspe.so
+...
+
+https://bugs.python.org/issue22980
+https://www.python.org/dev/peps/pep-3149/
+https://bugs.python.org/review/22980/patch/14593/54808
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+---
+ configure.ac | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index 9eb3d22..c34a9a0 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -724,6 +724,13 @@ fi
+
+
+ MULTIARCH=$($CC --print-multiarch 2>/dev/null)
++
++# Tweak MULTIARCH
++if test x$MULTIARCH = xpowerpc-linux-gnuspev1
++then
++ MULTIARCH="powerpc-linux-gnuspe"
++fi
++
+ AC_SUBST(MULTIARCH)
+
+ AC_MSG_CHECKING([for the platform triplet based on compiler characteristics])
+--
+1.9.1
+
diff --git a/meta/recipes-devtools/python/python3/unixccompiler.patch b/meta/recipes-devtools/python/python3/unixccompiler.patch
index 7b90f13883..3e2b1d1c2e 100644
--- a/meta/recipes-devtools/python/python3/unixccompiler.patch
+++ b/meta/recipes-devtools/python/python3/unixccompiler.patch
@@ -18,9 +18,9 @@ Index: Python-3.3.2/Lib/distutils/unixccompiler.py
def library_dir_option(self, dir):
- return "-L" + dir
-+ if dir.startswith("."):
-+ return "-L" + dir
-+ return "-L=" + dir
++ if dir.startswith("/"):
++ return "-L=" + dir
++ return "-L" + dir
def _is_gcc(self, compiler_name):
return "gcc" in compiler_name or "g++" in compiler_name
diff --git a/meta/recipes-devtools/python/python3/upstream-random-fixes.patch b/meta/recipes-devtools/python/python3/upstream-random-fixes.patch
new file mode 100644
index 0000000000..0d9152ccd7
--- /dev/null
+++ b/meta/recipes-devtools/python/python3/upstream-random-fixes.patch
@@ -0,0 +1,721 @@
+This patch updates random.c to match upstream python's code at revision
+8125d9a8152b. This addresses various issues around problems with glibc 2.24
+and 2.25 such that python would fail to start with:
+
+[rpurdie@centos7 ~]$ /tmp/t2/sysroots/x86_64-pokysdk-linux/usr/bin/python3
+Fatal Python error: getentropy() failed
+Aborted
+
+(taken from our buildtools-tarball also breaks eSDK)
+
+Upstream-Status: Backport
+
+# HG changeset patch
+# User Victor Stinner <victor.stinner@gmail.com>
+# Date 1483957133 -3600
+# Node ID 8125d9a8152b79e712cb09c7094b9129b9bcea86
+# Parent 337461574c90281630751b6095c4e1baf380cf7d
+Issue #29157: Prefer getrandom() over getentropy()
+
+Copy and then adapt Python/random.c from default branch. Difference between 3.5
+and default branches:
+
+* Python 3.5 only uses getrandom() in non-blocking mode: flags=GRND_NONBLOCK
+* If getrandom() fails with EAGAIN: py_getrandom() immediately fails and
+ remembers that getrandom() doesn't work.
+* Python 3.5 has no _PyOS_URandomNonblock() function: _PyOS_URandom()
+ works in non-blocking mode on Python 3.5
+
+RP 2017/1/22
+
+Index: Python-3.5.2/Python/random.c
+===================================================================
+--- Python-3.5.2.orig/Python/random.c
++++ Python-3.5.2/Python/random.c
+@@ -1,6 +1,9 @@
+ #include "Python.h"
+ #ifdef MS_WINDOWS
+ # include <windows.h>
++/* All sample MSDN wincrypt programs include the header below. It is at least
++ * required with Min GW. */
++# include <wincrypt.h>
+ #else
+ # include <fcntl.h>
+ # ifdef HAVE_SYS_STAT_H
+@@ -36,10 +39,9 @@ win32_urandom_init(int raise)
+ return 0;
+
+ error:
+- if (raise)
++ if (raise) {
+ PyErr_SetFromWindowsErr(0);
+- else
+- Py_FatalError("Failed to initialize Windows random API (CryptoGen)");
++ }
+ return -1;
+ }
+
+@@ -52,8 +54,9 @@ win32_urandom(unsigned char *buffer, Py_
+
+ if (hCryptProv == 0)
+ {
+- if (win32_urandom_init(raise) == -1)
++ if (win32_urandom_init(raise) == -1) {
+ return -1;
++ }
+ }
+
+ while (size > 0)
+@@ -62,11 +65,9 @@ win32_urandom(unsigned char *buffer, Py_
+ if (!CryptGenRandom(hCryptProv, (DWORD)chunk, buffer))
+ {
+ /* CryptGenRandom() failed */
+- if (raise)
++ if (raise) {
+ PyErr_SetFromWindowsErr(0);
+- else
+- Py_FatalError("Failed to initialized the randomized hash "
+- "secret using CryptoGen)");
++ }
+ return -1;
+ }
+ buffer += chunk;
+@@ -75,55 +76,29 @@ win32_urandom(unsigned char *buffer, Py_
+ return 0;
+ }
+
+-/* Issue #25003: Don't use getentropy() on Solaris (available since
+- * Solaris 11.3), it is blocking whereas os.urandom() should not block. */
+-#elif defined(HAVE_GETENTROPY) && !defined(sun)
+-#define PY_GETENTROPY 1
+-
+-/* Fill buffer with size pseudo-random bytes generated by getentropy().
+- Return 0 on success, or raise an exception and return -1 on error.
+-
+- If fatal is nonzero, call Py_FatalError() instead of raising an exception
+- on error. */
+-static int
+-py_getentropy(unsigned char *buffer, Py_ssize_t size, int fatal)
+-{
+- while (size > 0) {
+- Py_ssize_t len = Py_MIN(size, 256);
+- int res;
+-
+- if (!fatal) {
+- Py_BEGIN_ALLOW_THREADS
+- res = getentropy(buffer, len);
+- Py_END_ALLOW_THREADS
+-
+- if (res < 0) {
+- PyErr_SetFromErrno(PyExc_OSError);
+- return -1;
+- }
+- }
+- else {
+- res = getentropy(buffer, len);
+- if (res < 0)
+- Py_FatalError("getentropy() failed");
+- }
+-
+- buffer += len;
+- size -= len;
+- }
+- return 0;
+-}
+-
+-#else
++#else /* !MS_WINDOWS */
+
+ #if defined(HAVE_GETRANDOM) || defined(HAVE_GETRANDOM_SYSCALL)
+ #define PY_GETRANDOM 1
+
++/* Call getrandom() to get random bytes:
++
++ - Return 1 on success
++ - Return 0 if getrandom() is not available (failed with ENOSYS or EPERM),
++ or if getrandom(GRND_NONBLOCK) failed with EAGAIN (system urandom not
++ initialized yet).
++ - Raise an exception (if raise is non-zero) and return -1 on error:
++ if getrandom() failed with EINTR, raise is non-zero and the Python signal
++ handler raised an exception, or if getrandom() failed with a different
++ error.
++
++ getrandom() is retried if it failed with EINTR: interrupted by a signal. */
+ static int
+ py_getrandom(void *buffer, Py_ssize_t size, int raise)
+ {
+- /* Is getrandom() supported by the running kernel?
+- * Need Linux kernel 3.17 or newer, or Solaris 11.3 or newer */
++ /* Is getrandom() supported by the running kernel? Set to 0 if getrandom()
++ failed with ENOSYS or EPERM. Need Linux kernel 3.17 or newer, or Solaris
++ 11.3 or newer */
+ static int getrandom_works = 1;
+
+ /* getrandom() on Linux will block if called before the kernel has
+@@ -132,84 +107,165 @@ py_getrandom(void *buffer, Py_ssize_t si
+ * see https://bugs.python.org/issue26839. To avoid this, use the
+ * GRND_NONBLOCK flag. */
+ const int flags = GRND_NONBLOCK;
+- int n;
++ char *dest;
++ long n;
+
+- if (!getrandom_works)
++ if (!getrandom_works) {
+ return 0;
++ }
+
++ dest = buffer;
+ while (0 < size) {
+ #ifdef sun
+ /* Issue #26735: On Solaris, getrandom() is limited to returning up
+- to 1024 bytes */
++ to 1024 bytes. Call it multiple times if more bytes are
++ requested. */
+ n = Py_MIN(size, 1024);
+ #else
+- n = size;
++ n = Py_MIN(size, LONG_MAX);
+ #endif
+
+ errno = 0;
+ #ifdef HAVE_GETRANDOM
+ if (raise) {
+ Py_BEGIN_ALLOW_THREADS
+- n = getrandom(buffer, n, flags);
++ n = getrandom(dest, n, flags);
+ Py_END_ALLOW_THREADS
+ }
+ else {
+- n = getrandom(buffer, n, flags);
++ n = getrandom(dest, n, flags);
+ }
+ #else
+ /* On Linux, use the syscall() function because the GNU libc doesn't
+- * expose the Linux getrandom() syscall yet. See:
+- * https://sourceware.org/bugzilla/show_bug.cgi?id=17252 */
++ expose the Linux getrandom() syscall yet. See:
++ https://sourceware.org/bugzilla/show_bug.cgi?id=17252 */
+ if (raise) {
+ Py_BEGIN_ALLOW_THREADS
+- n = syscall(SYS_getrandom, buffer, n, flags);
++ n = syscall(SYS_getrandom, dest, n, flags);
+ Py_END_ALLOW_THREADS
+ }
+ else {
+- n = syscall(SYS_getrandom, buffer, n, flags);
++ n = syscall(SYS_getrandom, dest, n, flags);
+ }
+ #endif
+
+ if (n < 0) {
+- if (errno == ENOSYS) {
++ /* ENOSYS: the syscall is not supported by the kernel.
++ EPERM: the syscall is blocked by a security policy (ex: SECCOMP)
++ or something else. */
++ if (errno == ENOSYS || errno == EPERM) {
+ getrandom_works = 0;
+ return 0;
+ }
++
+ if (errno == EAGAIN) {
+- /* If we failed with EAGAIN, the entropy pool was
+- * uninitialized. In this case, we return failure to fall
+- * back to reading from /dev/urandom.
+- *
+- * Note: In this case the data read will not be random so
+- * should not be used for cryptographic purposes. Retaining
+- * the existing semantics for practical purposes. */
++ /* getrandom(GRND_NONBLOCK) fails with EAGAIN if the system
++ urandom is not initialiazed yet. In this case, fall back on
++ reading from /dev/urandom.
++
++ Note: In this case the data read will not be random so
++ should not be used for cryptographic purposes. Retaining
++ the existing semantics for practical purposes. */
+ getrandom_works = 0;
+ return 0;
+ }
+
+ if (errno == EINTR) {
+- if (PyErr_CheckSignals()) {
+- if (!raise)
+- Py_FatalError("getrandom() interrupted by a signal");
+- return -1;
++ if (raise) {
++ if (PyErr_CheckSignals()) {
++ return -1;
++ }
+ }
+- /* retry getrandom() */
++
++ /* retry getrandom() if it was interrupted by a signal */
+ continue;
+ }
+
+- if (raise)
++ if (raise) {
+ PyErr_SetFromErrno(PyExc_OSError);
+- else
+- Py_FatalError("getrandom() failed");
++ }
+ return -1;
+ }
+
+- buffer += n;
++ dest += n;
+ size -= n;
+ }
+ return 1;
+ }
+-#endif
++
++#elif defined(HAVE_GETENTROPY)
++#define PY_GETENTROPY 1
++
++/* Fill buffer with size pseudo-random bytes generated by getentropy():
++
++ - Return 1 on success
++ - Return 0 if getentropy() syscall is not available (failed with ENOSYS or
++ EPERM).
++ - Raise an exception (if raise is non-zero) and return -1 on error:
++ if getentropy() failed with EINTR, raise is non-zero and the Python signal
++ handler raised an exception, or if getentropy() failed with a different
++ error.
++
++ getentropy() is retried if it failed with EINTR: interrupted by a signal. */
++static int
++py_getentropy(char *buffer, Py_ssize_t size, int raise)
++{
++ /* Is getentropy() supported by the running kernel? Set to 0 if
++ getentropy() failed with ENOSYS or EPERM. */
++ static int getentropy_works = 1;
++
++ if (!getentropy_works) {
++ return 0;
++ }
++
++ while (size > 0) {
++ /* getentropy() is limited to returning up to 256 bytes. Call it
++ multiple times if more bytes are requested. */
++ Py_ssize_t len = Py_MIN(size, 256);
++ int res;
++
++ if (raise) {
++ Py_BEGIN_ALLOW_THREADS
++ res = getentropy(buffer, len);
++ Py_END_ALLOW_THREADS
++ }
++ else {
++ res = getentropy(buffer, len);
++ }
++
++ if (res < 0) {
++ /* ENOSYS: the syscall is not supported by the running kernel.
++ EPERM: the syscall is blocked by a security policy (ex: SECCOMP)
++ or something else. */
++ if (errno == ENOSYS || errno == EPERM) {
++ getentropy_works = 0;
++ return 0;
++ }
++
++ if (errno == EINTR) {
++ if (raise) {
++ if (PyErr_CheckSignals()) {
++ return -1;
++ }
++ }
++
++ /* retry getentropy() if it was interrupted by a signal */
++ continue;
++ }
++
++ if (raise) {
++ PyErr_SetFromErrno(PyExc_OSError);
++ }
++ return -1;
++ }
++
++ buffer += len;
++ size -= len;
++ }
++ return 1;
++}
++#endif /* defined(HAVE_GETENTROPY) && !defined(sun) */
++
+
+ static struct {
+ int fd;
+@@ -217,127 +273,123 @@ static struct {
+ ino_t st_ino;
+ } urandom_cache = { -1 };
+
++/* Read random bytes from the /dev/urandom device:
+
+-/* Read size bytes from /dev/urandom into buffer.
+- Call Py_FatalError() on error. */
+-static void
+-dev_urandom_noraise(unsigned char *buffer, Py_ssize_t size)
+-{
+- int fd;
+- Py_ssize_t n;
++ - Return 0 on success
++ - Raise an exception (if raise is non-zero) and return -1 on error
+
+- assert (0 < size);
++ Possible causes of errors:
+
+-#ifdef PY_GETRANDOM
+- if (py_getrandom(buffer, size, 0) == 1)
+- return;
+- /* getrandom() is not supported by the running kernel, fall back
+- * on reading /dev/urandom */
+-#endif
++ - open() failed with ENOENT, ENXIO, ENODEV, EACCES: the /dev/urandom device
++ was not found. For example, it was removed manually or not exposed in a
++ chroot or container.
++ - open() failed with a different error
++ - fstat() failed
++ - read() failed or returned 0
+
+- fd = _Py_open_noraise("/dev/urandom", O_RDONLY);
+- if (fd < 0)
+- Py_FatalError("Failed to open /dev/urandom");
++ read() is retried if it failed with EINTR: interrupted by a signal.
+
+- while (0 < size)
+- {
+- do {
+- n = read(fd, buffer, (size_t)size);
+- } while (n < 0 && errno == EINTR);
+- if (n <= 0)
+- {
+- /* stop on error or if read(size) returned 0 */
+- Py_FatalError("Failed to read bytes from /dev/urandom");
+- break;
+- }
+- buffer += n;
+- size -= (Py_ssize_t)n;
+- }
+- close(fd);
+-}
++ The file descriptor of the device is kept open between calls to avoid using
++ many file descriptors when run in parallel from multiple threads:
++ see the issue #18756.
++
++ st_dev and st_ino fields of the file descriptor (from fstat()) are cached to
++ check if the file descriptor was replaced by a different file (which is
++ likely a bug in the application): see the issue #21207.
+
+-/* Read size bytes from /dev/urandom into buffer.
+- Return 0 on success, raise an exception and return -1 on error. */
++ If the file descriptor was closed or replaced, open a new file descriptor
++ but don't close the old file descriptor: it probably points to something
++ important for some third-party code. */
+ static int
+-dev_urandom_python(char *buffer, Py_ssize_t size)
++dev_urandom(char *buffer, Py_ssize_t size, int raise)
+ {
+ int fd;
+ Py_ssize_t n;
+- struct _Py_stat_struct st;
+-#ifdef PY_GETRANDOM
+- int res;
+-#endif
+
+- if (size <= 0)
+- return 0;
++ if (raise) {
++ struct _Py_stat_struct st;
+
+-#ifdef PY_GETRANDOM
+- res = py_getrandom(buffer, size, 1);
+- if (res < 0)
+- return -1;
+- if (res == 1)
+- return 0;
+- /* getrandom() is not supported by the running kernel, fall back
+- * on reading /dev/urandom */
+-#endif
+-
+- if (urandom_cache.fd >= 0) {
+- /* Does the fd point to the same thing as before? (issue #21207) */
+- if (_Py_fstat_noraise(urandom_cache.fd, &st)
+- || st.st_dev != urandom_cache.st_dev
+- || st.st_ino != urandom_cache.st_ino) {
+- /* Something changed: forget the cached fd (but don't close it,
+- since it probably points to something important for some
+- third-party code). */
+- urandom_cache.fd = -1;
+- }
+- }
+- if (urandom_cache.fd >= 0)
+- fd = urandom_cache.fd;
+- else {
+- fd = _Py_open("/dev/urandom", O_RDONLY);
+- if (fd < 0) {
+- if (errno == ENOENT || errno == ENXIO ||
+- errno == ENODEV || errno == EACCES)
+- PyErr_SetString(PyExc_NotImplementedError,
+- "/dev/urandom (or equivalent) not found");
+- /* otherwise, keep the OSError exception raised by _Py_open() */
+- return -1;
+- }
+ if (urandom_cache.fd >= 0) {
+- /* urandom_fd was initialized by another thread while we were
+- not holding the GIL, keep it. */
+- close(fd);
+- fd = urandom_cache.fd;
++ /* Does the fd point to the same thing as before? (issue #21207) */
++ if (_Py_fstat_noraise(urandom_cache.fd, &st)
++ || st.st_dev != urandom_cache.st_dev
++ || st.st_ino != urandom_cache.st_ino) {
++ /* Something changed: forget the cached fd (but don't close it,
++ since it probably points to something important for some
++ third-party code). */
++ urandom_cache.fd = -1;
++ }
+ }
++ if (urandom_cache.fd >= 0)
++ fd = urandom_cache.fd;
+ else {
+- if (_Py_fstat(fd, &st)) {
+- close(fd);
++ fd = _Py_open("/dev/urandom", O_RDONLY);
++ if (fd < 0) {
++ if (errno == ENOENT || errno == ENXIO ||
++ errno == ENODEV || errno == EACCES) {
++ PyErr_SetString(PyExc_NotImplementedError,
++ "/dev/urandom (or equivalent) not found");
++ }
++ /* otherwise, keep the OSError exception raised by _Py_open() */
+ return -1;
+ }
++ if (urandom_cache.fd >= 0) {
++ /* urandom_fd was initialized by another thread while we were
++ not holding the GIL, keep it. */
++ close(fd);
++ fd = urandom_cache.fd;
++ }
+ else {
+- urandom_cache.fd = fd;
+- urandom_cache.st_dev = st.st_dev;
+- urandom_cache.st_ino = st.st_ino;
++ if (_Py_fstat(fd, &st)) {
++ close(fd);
++ return -1;
++ }
++ else {
++ urandom_cache.fd = fd;
++ urandom_cache.st_dev = st.st_dev;
++ urandom_cache.st_ino = st.st_ino;
++ }
+ }
+ }
+- }
+
+- do {
+- n = _Py_read(fd, buffer, (size_t)size);
+- if (n == -1)
+- return -1;
+- if (n == 0) {
+- PyErr_Format(PyExc_RuntimeError,
+- "Failed to read %zi bytes from /dev/urandom",
+- size);
++ do {
++ n = _Py_read(fd, buffer, (size_t)size);
++ if (n == -1)
++ return -1;
++ if (n == 0) {
++ PyErr_Format(PyExc_RuntimeError,
++ "Failed to read %zi bytes from /dev/urandom",
++ size);
++ return -1;
++ }
++
++ buffer += n;
++ size -= n;
++ } while (0 < size);
++ }
++ else {
++ fd = _Py_open_noraise("/dev/urandom", O_RDONLY);
++ if (fd < 0) {
+ return -1;
+ }
+
+- buffer += n;
+- size -= n;
+- } while (0 < size);
++ while (0 < size)
++ {
++ do {
++ n = read(fd, buffer, (size_t)size);
++ } while (n < 0 && errno == EINTR);
+
++ if (n <= 0) {
++ /* stop on error or if read(size) returned 0 */
++ close(fd);
++ return -1;
++ }
++
++ buffer += n;
++ size -= n;
++ }
++ close(fd);
++ }
+ return 0;
+ }
+
+@@ -349,8 +401,8 @@ dev_urandom_close(void)
+ urandom_cache.fd = -1;
+ }
+ }
++#endif /* !MS_WINDOWS */
+
+-#endif
+
+ /* Fill buffer with pseudo-random bytes generated by a linear congruent
+ generator (LCG):
+@@ -373,29 +425,98 @@ lcg_urandom(unsigned int x0, unsigned ch
+ }
+ }
+
+-/* Fill buffer with size pseudo-random bytes from the operating system random
+- number generator (RNG). It is suitable for most cryptographic purposes
+- except long living private keys for asymmetric encryption.
++/* Read random bytes:
+
+- Return 0 on success, raise an exception and return -1 on error. */
+-int
+-_PyOS_URandom(void *buffer, Py_ssize_t size)
++ - Return 0 on success
++ - Raise an exception (if raise is non-zero) and return -1 on error
++
++ Used sources of entropy ordered by preference, preferred source first:
++
++ - CryptGenRandom() on Windows
++ - getrandom() function (ex: Linux and Solaris): call py_getrandom()
++ - getentropy() function (ex: OpenBSD): call py_getentropy()
++ - /dev/urandom device
++
++ Read from the /dev/urandom device if getrandom() or getentropy() function
++ is not available or does not work.
++
++ Prefer getrandom() over getentropy() because getrandom() supports blocking
++ and non-blocking mode and Python requires non-blocking RNG at startup to
++ initialize its hash secret: see the PEP 524.
++
++ Prefer getrandom() and getentropy() over reading directly /dev/urandom
++ because these functions don't need file descriptors and so avoid ENFILE or
++ EMFILE errors (too many open files): see the issue #18756.
++
++ Only use RNG running in the kernel. They are more secure because it is
++ harder to get the internal state of a RNG running in the kernel land than a
++ RNG running in the user land. The kernel has a direct access to the hardware
++ and has access to hardware RNG, they are used as entropy sources.
++
++ Note: the OpenSSL RAND_pseudo_bytes() function does not automatically reseed
++ its RNG on fork(), two child processes (with the same pid) generate the same
++ random numbers: see issue #18747. Kernel RNGs don't have this issue,
++ they have access to good quality entropy sources.
++
++ If raise is zero:
++
++ - Don't raise an exception on error
++ - Don't call the Python signal handler (don't call PyErr_CheckSignals()) if
++ a function fails with EINTR: retry directly the interrupted function
++ - Don't release the GIL to call functions.
++*/
++static int
++pyurandom(void *buffer, Py_ssize_t size, int raise)
+ {
++#if defined(PY_GETRANDOM) || defined(PY_GETENTROPY)
++ int res;
++#endif
++
+ if (size < 0) {
+- PyErr_Format(PyExc_ValueError,
+- "negative argument not allowed");
++ if (raise) {
++ PyErr_Format(PyExc_ValueError,
++ "negative argument not allowed");
++ }
+ return -1;
+ }
+- if (size == 0)
++
++ if (size == 0) {
+ return 0;
++ }
+
+ #ifdef MS_WINDOWS
+- return win32_urandom((unsigned char *)buffer, size, 1);
+-#elif defined(PY_GETENTROPY)
+- return py_getentropy(buffer, size, 0);
++ return win32_urandom((unsigned char *)buffer, size, raise);
++#else
++
++#if defined(PY_GETRANDOM) || defined(PY_GETENTROPY)
++#ifdef PY_GETRANDOM
++ res = py_getrandom(buffer, size, raise);
+ #else
+- return dev_urandom_python((char*)buffer, size);
++ res = py_getentropy(buffer, size, raise);
+ #endif
++ if (res < 0) {
++ return -1;
++ }
++ if (res == 1) {
++ return 0;
++ }
++ /* getrandom() or getentropy() function is not available: failed with
++ ENOSYS, EPERM or EAGAIN. Fall back on reading from /dev/urandom. */
++#endif
++
++ return dev_urandom(buffer, size, raise);
++#endif
++}
++
++/* Fill buffer with size pseudo-random bytes from the operating system random
++ number generator (RNG). It is suitable for most cryptographic purposes
++ except long living private keys for asymmetric encryption.
++
++ Return 0 on success. Raise an exception and return -1 on error. */
++int
++_PyOS_URandom(void *buffer, Py_ssize_t size)
++{
++ return pyurandom(buffer, size, 1);
+ }
+
+ void
+@@ -436,13 +557,14 @@ _PyRandom_Init(void)
+ }
+ }
+ else {
+-#ifdef MS_WINDOWS
+- (void)win32_urandom(secret, secret_size, 0);
+-#elif defined(PY_GETENTROPY)
+- (void)py_getentropy(secret, secret_size, 1);
+-#else
+- dev_urandom_noraise(secret, secret_size);
+-#endif
++ int res;
++
++ /* _PyRandom_Init() is called very early in the Python initialization
++ and so exceptions cannot be used (use raise=0). */
++ res = pyurandom(secret, secret_size, 0);
++ if (res < 0) {
++ Py_FatalError("failed to get random numbers to initialize Python");
++ }
+ }
+ }
+
+@@ -454,8 +576,6 @@ _PyRandom_Fini(void)
+ CryptReleaseContext(hCryptProv, 0);
+ hCryptProv = 0;
+ }
+-#elif defined(PY_GETENTROPY)
+- /* nothing to clean */
+ #else
+ dev_urandom_close();
+ #endif