From d13ec11b033a0bd39d95af7827ad38fbb482b44e Mon Sep 17 00:00:00 2001 From: Marta Rybczynska <marta.rybczynska@huawei.com> Date: Thu, 25 Nov 2021 07:18:54 +0100 Subject: [PATCH] meta-oniro-staging: Update python to 3.8.12 Python 3.8.12 is a security release, including a fix for CVE-2021-29921. From the official announcement [1]: Security content in this release contains four fixes. There are also four additional fixes for bugs that might have lead to denial-of-service attacks. [1] https://www.python.org/downloads/release/python-3812/ Upstream-Status: Submitted [https://lists.openembedded.org/g/openembedded-core/message/158829] Signed-off-by: Marta Rybczynska <marta.rybczynska@huawei.com> --- ...ib-termcap-to-linker-flags-to-avoid-.patch | 25 + ...lib-as-location-for-site-packages-an.patch | 214 +++ ...hell-version-of-python-config-that-w.patch | 35 + ...-search-system-for-headers-libraries.patch | 29 + ...-fix-another-place-where-lib-is-hard.patch | 31 + ...file-do-not-compile-.pyc-in-parallel.patch | 58 + ...sue36464-parallel-build-race-problem.patch | 34 + ...-qemu-wrapper-when-gathering-profile.patch | 25 + ...FLAG_REF-always-for-interned-strings.patch | 35 + ...-detection-of-mips-architecture-for-.patch | 209 +++ .../python3/0001-configure.ac-fix-LIBPL.patch | 35 + ...fig-append-STAGING_LIBDIR-python-sys.patch | 42 + ...n3-Do-not-hardcode-lib-for-distutils.patch | 43 + ...asename-to-replace-CC-for-checking-c.patch | 121 ++ ...ssing-libraries-to-Extension-for-mul.patch | 69 + ...pes.test_find-skip-without-tools-sdk.patch | 33 + ...le.py-correct-the-test-output-format.patch | 48 + ...report-missing-dependencies-for-disa.patch | 32 + ...up.py-do-not-add-a-curses-include-pa.patch | 48 + ...tutils-prefix-is-inside-staging-area.patch | 58 + .../python3/avoid_warning_about_tkinter.patch | 31 + .../python/python3/cgi_py.patch | 32 + .../python3/check_build_completeness.py | 17 + .../python/python3/create_manifest3.py | 433 ++++++ .../python/python3/crosspythonpath.patch | 25 + .../python/python3/get_module_deps3.py | 146 ++ .../python/python3/makerace.patch | 23 + .../python/python3/python-config.patch | 54 + .../python/python3/python3-manifest.json | 1223 +++++++++++++++++ .../python/python3/reformat_sysconfig.py | 21 + .../recipes-devtools/python/python3/run-ptest | 3 + .../recipes-devtools/python/python3_3.8.12.bb | 363 +++++ 32 files changed, 3595 insertions(+) create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-add-usr-lib-termcap-to-linker-flags-to-avoid-.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-hardcode-lib-as-location-for-site-packages-an.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Don-t-search-system-for-headers-libraries.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Lib-sysconfig.py-fix-another-place-where-lib-is-hard.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-do-not-compile-.pyc-in-parallel.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-fix-Issue36464-parallel-build-race-problem.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile.pre-use-qemu-wrapper-when-gathering-profile.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-Use-FLAG_REF-always-for-interned-strings.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-bpo-36852-proper-detection-of-mips-architecture-for-.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-configure.ac-fix-LIBPL.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-distutils-sysconfig-append-STAGING_LIBDIR-python-sys.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-python3-Do-not-hardcode-lib-for-distutils.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-python3-use-cc_basename-to-replace-CC-for-checking-c.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-setup.py-pass-missing-libraries-to-Extension-for-mul.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-test_ctypes.test_find-skip-without-tools-sdk.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0001-test_locale.py-correct-the-test-output-format.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0017-setup.py-do-not-report-missing-dependencies-for-disa.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/0020-configure.ac-setup.py-do-not-add-a-curses-include-pa.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/cgi_py.patch create mode 100755 meta-oniro-staging/recipes-devtools/python/python3/check_build_completeness.py create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/create_manifest3.py create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/crosspythonpath.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/get_module_deps3.py create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/makerace.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/python-config.patch create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/python3-manifest.json create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/reformat_sysconfig.py create mode 100644 meta-oniro-staging/recipes-devtools/python/python3/run-ptest create mode 100644 meta-oniro-staging/recipes-devtools/python/python3_3.8.12.bb diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-add-usr-lib-termcap-to-linker-flags-to-avoid-.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-add-usr-lib-termcap-to-linker-flags-to-avoid-.patch new file mode 100644 index 00000000..59592821 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-add-usr-lib-termcap-to-linker-flags-to-avoid-.patch @@ -0,0 +1,25 @@ +From 039c53dd5baddec3359a05be0bff46a3b32bbb84 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Fri, 25 Jan 2019 19:04:13 +0100 +Subject: [PATCH] Do not add /usr/lib/termcap to linker flags to avoid host + contamination + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> + +--- + setup.py | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/setup.py b/setup.py +index 20d7f35..ab18ff0 100644 +--- a/setup.py ++++ b/setup.py +@@ -957,7 +957,6 @@ class PyBuildExt(build_ext): + 'termcap'): + readline_libs.append('termcap') + self.add(Extension('readline', ['readline.c'], +- library_dirs=['/usr/lib/termcap'], + extra_link_args=readline_extra_link_args, + libraries=readline_libs)) + else: diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-hardcode-lib-as-location-for-site-packages-an.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-hardcode-lib-as-location-for-site-packages-an.patch new file mode 100644 index 00000000..112c9794 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-hardcode-lib-as-location-for-site-packages-an.patch @@ -0,0 +1,214 @@ +From a078b6ff1492e848ad1055764fb9a414abaf3e12 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Tue, 5 Feb 2019 15:52:02 +0100 +Subject: [PATCH] Do not hardcode "lib" as location for modules, site-packages + and lib-dynload + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> + +--- + Include/pythonrun.h | 2 ++ + Lib/site.py | 4 ++-- + Makefile.pre.in | 5 +++-- + Modules/getpath.c | 22 ++++++++++++++-------- + Python/getplatform.c | 10 ++++++++++ + Python/sysmodule.c | 2 ++ + 6 files changed, 33 insertions(+), 12 deletions(-) + +diff --git a/Include/pythonrun.h b/Include/pythonrun.h +index 46091e0..61b2e15 100644 +--- a/Include/pythonrun.h ++++ b/Include/pythonrun.h +@@ -7,6 +7,8 @@ + extern "C" { + #endif + ++PyAPI_FUNC(const char *) Py_GetLib(void); ++ + #ifndef Py_LIMITED_API + PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); + PyAPI_FUNC(int) PyRun_AnyFileExFlags( +diff --git a/Lib/site.py b/Lib/site.py +index a065ab0..1d720ef 100644 +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -335,12 +335,12 @@ def getsitepackages(prefixes=None): + seen.add(prefix) + + if os.sep == '/': +- sitepackages.append(os.path.join(prefix, "lib", ++ sitepackages.append(os.path.join(prefix, sys.lib, + "python%d.%d" % sys.version_info[:2], + "site-packages")) + else: + sitepackages.append(prefix) +- sitepackages.append(os.path.join(prefix, "lib", "site-packages")) ++ sitepackages.append(os.path.join(prefix, sys.lib, "site-packages")) + return sitepackages + + def addsitepackages(known_paths, prefixes=None): +diff --git a/Makefile.pre.in b/Makefile.pre.in +index 65665df..be49140 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -143,7 +143,7 @@ LIBDIR= @libdir@ + MANDIR= @mandir@ + INCLUDEDIR= @includedir@ + CONFINCLUDEDIR= $(exec_prefix)/include +-SCRIPTDIR= $(prefix)/lib ++SCRIPTDIR= @libdir@ + ABIFLAGS= @ABIFLAGS@ + + # Detailed destination directories +@@ -753,6 +753,7 @@ Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + -DEXEC_PREFIX='"$(exec_prefix)"' \ + -DVERSION='"$(VERSION)"' \ + -DVPATH='"$(VPATH)"' \ ++ -DLIB='"$(LIB)"' \ + -o $@ $(srcdir)/Modules/getpath.c + + Programs/python.o: $(srcdir)/Programs/python.c +@@ -868,7 +869,7 @@ regen-symbol: $(srcdir)/Include/graminit.h + Python/compile.o Python/symtable.o Python/ast_unparse.o Python/ast.o Python/future.o Parser/parsetok.o: $(srcdir)/Include/graminit.h $(srcdir)/Include/Python-ast.h + + Python/getplatform.o: $(srcdir)/Python/getplatform.c +- $(CC) -c $(PY_CORE_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c ++ $(CC) -c $(PY_CORE_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -DLIB='"$(LIB)"' -o $@ $(srcdir)/Python/getplatform.c + + Python/importdl.o: $(srcdir)/Python/importdl.c + $(CC) -c $(PY_CORE_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c +diff --git a/Modules/getpath.c b/Modules/getpath.c +index b727f66..c003e46 100644 +--- a/Modules/getpath.c ++++ b/Modules/getpath.c +@@ -128,6 +128,7 @@ typedef struct { + wchar_t *exec_prefix; /* EXEC_PREFIX macro */ + + wchar_t *lib_python; /* "lib/pythonX.Y" */ ++ wchar_t *multilib_python; /* "lib[suffix]/pythonX.Y" */ + + int prefix_found; /* found platform independent libraries? */ + int exec_prefix_found; /* found the platform dependent libraries? */ +@@ -386,7 +387,7 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, + if (delim) { + *delim = L'\0'; + } +- status = joinpath(prefix, calculate->lib_python, prefix_len); ++ status = joinpath(prefix, calculate->multilib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -444,7 +445,7 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, + do { + /* Path: <argv0_path or substring> / <lib_python> / LANDMARK */ + size_t n = wcslen(prefix); +- status = joinpath(prefix, calculate->lib_python, prefix_len); ++ status = joinpath(prefix, calculate->multilib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -467,7 +468,7 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, + if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { + return PATHLEN_ERR(); + } +- status = joinpath(prefix, calculate->lib_python, prefix_len); ++ status = joinpath(prefix, calculate->multilib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -510,7 +511,7 @@ calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, + if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { + return PATHLEN_ERR(); + } +- status = joinpath(prefix, calculate->lib_python, prefix_len); ++ status = joinpath(prefix, calculate->multilib_python, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -635,7 +636,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, + return PATHLEN_ERR(); + } + } +- status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); ++ status = joinpath(exec_prefix, calculate->multilib_python, exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -667,7 +668,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, + do { + /* Path: <argv0_path or substring> / <lib_python> / "lib-dynload" */ + size_t n = wcslen(exec_prefix); +- status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); ++ status = joinpath(exec_prefix, calculate->multilib_python, exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -689,7 +690,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, + if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } +- status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); ++ status = joinpath(exec_prefix, calculate->multilib_python, exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -928,7 +929,7 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat + return PATHLEN_ERR(); + } + reduce(argv0_path); +- status = joinpath(argv0_path, calculate->lib_python, argv0_path_len); ++ status = joinpath(argv0_path, calculate->multilib_python, argv0_path_len); + if (_PyStatus_EXCEPTION(status)) { + PyMem_RawFree(wbuf); + return status; +@@ -1201,6 +1202,10 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config) + if (!calculate->lib_python) { + return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + } ++ calculate->multilib_python = Py_DecodeLocale(LIB "/python" VERSION, &len); ++ if (!calculate->multilib_python) { ++ return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); ++ } + + calculate->warnings = config->pathconfig_warnings; + calculate->pythonpath_env = config->pythonpath_env; +@@ -1216,6 +1221,7 @@ calculate_free(PyCalculatePath *calculate) + PyMem_RawFree(calculate->prefix); + PyMem_RawFree(calculate->exec_prefix); + PyMem_RawFree(calculate->lib_python); ++ PyMem_RawFree(calculate->multilib_python); + PyMem_RawFree(calculate->path_env); + } + +diff --git a/Python/getplatform.c b/Python/getplatform.c +index 81a0f7a..d55396b 100644 +--- a/Python/getplatform.c ++++ b/Python/getplatform.c +@@ -10,3 +10,13 @@ Py_GetPlatform(void) + { + return PLATFORM; + } ++ ++#ifndef LIB ++#define LIB "lib" ++#endif ++ ++const char * ++Py_GetLib(void) ++{ ++ return LIB; ++} +diff --git a/Python/sysmodule.c b/Python/sysmodule.c +index 5b0fb81..0dce754 100644 +--- a/Python/sysmodule.c ++++ b/Python/sysmodule.c +@@ -2668,6 +2668,8 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, + PyUnicode_FromString(Py_GetCopyright())); + SET_SYS_FROM_STRING("platform", + PyUnicode_FromString(Py_GetPlatform())); ++ SET_SYS_FROM_STRING("lib", ++ PyUnicode_FromString(Py_GetLib())); + SET_SYS_FROM_STRING("maxsize", + PyLong_FromSsize_t(PY_SSIZE_T_MAX)); + SET_SYS_FROM_STRING("float_info", diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch new file mode 100644 index 00000000..83fd52d8 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Do-not-use-the-shell-version-of-python-config-that-w.patch @@ -0,0 +1,35 @@ +From 148861fa16f2aaacd518770f337ea54b5182f981 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Tue, 29 Jan 2019 15:03:01 +0100 +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 2d2e11f..cc19942 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -1431,12 +1431,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} + LC_ALL=C 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 diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Don-t-search-system-for-headers-libraries.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Don-t-search-system-for-headers-libraries.patch new file mode 100644 index 00000000..acf8e1e9 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Don-t-search-system-for-headers-libraries.patch @@ -0,0 +1,29 @@ +From 85e8f86ad2b7dec0848cd55b8e810a5e2722b20a Mon Sep 17 00:00:00 2001 +From: Jeremy Puhlman <jpuhlman@mvista.com> +Date: Wed, 4 Mar 2020 00:06:42 +0000 +Subject: [PATCH] Don't search system for headers/libraries + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Jeremy Puhlman <jpuhlman@mvista.com> +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 9da1b3a..59782c0 100644 +--- a/setup.py ++++ b/setup.py +@@ -674,8 +674,8 @@ class PyBuildExt(build_ext): + add_dir_to_list(self.compiler.include_dirs, + sysconfig.get_config_var("INCLUDEDIR")) + +- system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib'] +- system_include_dirs = ['/usr/include'] ++ system_lib_dirs = [] ++ system_include_dirs = [] + # lib_dirs and inc_dirs are used to search for files; + # if a file is found in one of those directories, it can + # be assumed that no additional -I,-L directives are needed. +-- +2.24.1 + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Lib-sysconfig.py-fix-another-place-where-lib-is-hard.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Lib-sysconfig.py-fix-another-place-where-lib-is-hard.patch new file mode 100644 index 00000000..b9758368 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Lib-sysconfig.py-fix-another-place-where-lib-is-hard.patch @@ -0,0 +1,31 @@ +From a21f4f8fa5e5c0601898740b4ac08ec84f41e190 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Thu, 18 Apr 2019 17:11:06 +0200 +Subject: [PATCH] Lib/sysconfig.py: fix another place where 'lib' is hardcoded + as the library path + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> +--- + Lib/sysconfig.py | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py +index d15cec8..87fa5e6 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}', +- 'purelib': '{base}/lib/python{py_version_short}/site-packages', +- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages', ++ 'stdlib': '{LIBDEST}', ++ 'platstdlib': '{LIBDEST}', ++ 'purelib': '{LIBDEST}/site-packages', ++ 'platlib': '{LIBDEST}/site-packages', + 'include': + '{installed_base}/include/python{py_version_short}{abiflags}', + 'platinclude': diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-do-not-compile-.pyc-in-parallel.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-do-not-compile-.pyc-in-parallel.patch new file mode 100644 index 00000000..b1bceac5 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-do-not-compile-.pyc-in-parallel.patch @@ -0,0 +1,58 @@ +From c501e121a872cbcef8ffe626c1de173a125be9f8 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Thu, 16 Jan 2020 12:34:20 +0100 +Subject: [PATCH] Makefile: do not compile .pyc in parallel + +This was found to break reproducibility, and produce strange file ownership +races. + +The upstream commit introducing the change was: +https://github.com/python/cpython/commit/1a2dd82f56bd813aacc570e172cefe55a8a41504 + +Upstream-Status: Pending +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> +--- + Makefile.pre.in | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/Makefile.pre.in b/Makefile.pre.in +index 1241112..5dfdf44 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -1457,30 +1457,30 @@ libinstall: build_all $(srcdir)/Modules/xxmodule.c + fi + -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ + $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ +- -j0 -d $(LIBDEST) -f \ ++ -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 \ +- -j0 -d $(LIBDEST) -f \ ++ -d $(LIBDEST) -f \ + -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \ + $(DESTDIR)$(LIBDEST) + -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ + $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \ +- -j0 -d $(LIBDEST) -f \ ++ -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 \ +- -j0 -d $(LIBDEST)/site-packages -f \ ++ -d $(LIBDEST)/site-packages -f \ + -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages + -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ + $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \ +- -j0 -d $(LIBDEST)/site-packages -f \ ++ -d $(LIBDEST)/site-packages -f \ + -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages + -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ + $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \ +- -j0 -d $(LIBDEST)/site-packages -f \ ++ -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 diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-fix-Issue36464-parallel-build-race-problem.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-fix-Issue36464-parallel-build-race-problem.patch new file mode 100644 index 00000000..237645bc --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile-fix-Issue36464-parallel-build-race-problem.patch @@ -0,0 +1,34 @@ +From 840fda32c82550259d02a7a56a78a9c05162b1a1 Mon Sep 17 00:00:00 2001 +From: Changqing Li <changqing.li@windriver.com> +Date: Wed, 8 May 2019 16:10:29 +0800 +Subject: [PATCH] Makefile: fix Issue36464 (parallel build race problem) + +When using make -j with the 'install' target, it's possible for altbininstall +(which normally creates BINDIR) and libainstall (which doesn't, though it +installs python-config there) to race, resulting in a failure due to +attempting to install python-config into a nonexistent BINDIR. Ensure it also +exists in the libainstall target. + +Upstream-Status: Submitted [https://github.com/python/cpython/pull/13186] + +Signed-off-by: Changqing Li <changqing.li@windriver.com> +--- + Makefile.pre.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile.pre.in b/Makefile.pre.in +index 15f3687..7e9f173 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -1456,7 +1456,7 @@ LIBPL= @LIBPL@ + LIBPC= $(LIBDIR)/pkgconfig + + libainstall: @DEF_MAKE_RULE@ python-config +- @for i in $(LIBDIR) $(LIBPL) $(LIBPC); \ ++ @for i in $(LIBDIR) $(LIBPL) $(LIBPC) $(BINDIR); \ + do \ + if test ! -d $(DESTDIR)$$i; then \ + echo "Creating directory $$i"; \ +-- +2.7.4 + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile.pre-use-qemu-wrapper-when-gathering-profile.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile.pre-use-qemu-wrapper-when-gathering-profile.patch new file mode 100644 index 00000000..fa7735ff --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Makefile.pre-use-qemu-wrapper-when-gathering-profile.patch @@ -0,0 +1,25 @@ +From cf6a9100902484e4d028ee88742dd2487b014a98 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Wed, 30 Jan 2019 12:41:04 +0100 +Subject: [PATCH] Makefile.pre: use qemu wrapper when gathering profile data + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> +--- + Makefile.pre.in | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/Makefile.pre.in b/Makefile.pre.in +index a3a02a7..d5503dd 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -507,8 +507,7 @@ build_all_generate_profile: + $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LDFLAGS_NODIST="$(LDFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)" + + run_profile_task: +- @ # FIXME: can't run for a cross build +- $(LLVM_PROF_FILE) $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK) || true ++ ./pgo-wrapper ./python -m test.regrtest --pgo test_grammar test_opcodes test_dict test_builtin test_exceptions test_types test_support || true + + build_all_merge_profile: + $(LLVM_PROF_MERGER) diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-Use-FLAG_REF-always-for-interned-strings.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-Use-FLAG_REF-always-for-interned-strings.patch new file mode 100644 index 00000000..957839bf --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-Use-FLAG_REF-always-for-interned-strings.patch @@ -0,0 +1,35 @@ +From 6c8ea7c1dacd42f3ba00440231ec0e6b1a38300d Mon Sep 17 00:00:00 2001 +From: Inada Naoki <songofacandy@gmail.com> +Date: Sat, 14 Jul 2018 00:46:11 +0900 +Subject: [PATCH] Use FLAG_REF always for interned strings + +Upstream-Status: Submitted [https://github.com/python/cpython/pull/8226] +Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> +--- + Python/marshal.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/Python/marshal.c b/Python/marshal.c +index 6d06266c6a..51db2e3b2e 100644 +--- a/Python/marshal.c ++++ b/Python/marshal.c +@@ -275,9 +275,14 @@ w_ref(PyObject *v, char *flag, WFILE *p) + if (p->version < 3 || p->hashtable == NULL) + return 0; /* not writing object references */ + +- /* if it has only one reference, it definitely isn't shared */ +- if (Py_REFCNT(v) == 1) ++ /* If it has only one reference, it definitely isn't shared. ++ * But we use TYPE_REF always for interned string, to PYC file stable ++ * as possible. ++ */ ++ if (Py_REFCNT(v) == 1 && ++ !(PyUnicode_CheckExact(v) && PyUnicode_CHECK_INTERNED(v))) { + return 0; ++ } + + entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v); + if (entry != NULL) { +-- +2.21.0 + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-bpo-36852-proper-detection-of-mips-architecture-for-.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-bpo-36852-proper-detection-of-mips-architecture-for-.patch new file mode 100644 index 00000000..c4fae09a --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-bpo-36852-proper-detection-of-mips-architecture-for-.patch @@ -0,0 +1,209 @@ +From 1ad771d86728ee2ed30e202e9768d8d825f96467 Mon Sep 17 00:00:00 2001 +From: Matthias Schoepfer <matthias.schoepfer@ithinx.io> +Date: Fri, 31 May 2019 15:34:34 +0200 +Subject: [PATCH] bpo-36852: proper detection of mips architecture for soft + float + +When (cross) compiling for softfloat mips, __mips_hard_float will not be +defined and detection of OS triplet in configure.ac / configure will fail. + +This also has to do with the custom detection of the build triplet. Trying +to do this in a more autoconf/autotools manner. + +Upstream-Status: Submitted [https://github.com/python/cpython/pull/13196] +Signed-off-by: Matthias Schoepfer <matthias.schoepfer@ithinx.io> + +%% original patch: 0001-bpo-36852-proper-detection-of-mips-architecture-for-.patch +--- + configure.ac | 175 +++++++-------------------------------------------- + 1 file changed, 21 insertions(+), 154 deletions(-) + +diff --git a/configure.ac b/configure.ac +index ede710e..bc81b0b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -710,160 +710,27 @@ fi + MULTIARCH=$($CC --print-multiarch 2>/dev/null) + AC_SUBST(MULTIARCH) + +-AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) +-cat >> conftest.c <<EOF +-#undef bfin +-#undef cris +-#undef fr30 +-#undef linux +-#undef hppa +-#undef hpux +-#undef i386 +-#undef mips +-#undef powerpc +-#undef sparc +-#undef unix +-#if defined(__ANDROID__) +- # Android is not a multiarch system. +-#elif defined(__linux__) +-# if defined(__x86_64__) && defined(__LP64__) +- x86_64-linux-gnu +-# elif defined(__x86_64__) && defined(__ILP32__) +- x86_64-linux-gnux32 +-# elif defined(__i386__) +- i386-linux-gnu +-# elif defined(__aarch64__) && defined(__AARCH64EL__) +-# if defined(__ILP32__) +- aarch64_ilp32-linux-gnu +-# else +- aarch64-linux-gnu +-# endif +-# elif defined(__aarch64__) && defined(__AARCH64EB__) +-# if defined(__ILP32__) +- aarch64_be_ilp32-linux-gnu +-# else +- aarch64_be-linux-gnu +-# endif +-# elif defined(__alpha__) +- alpha-linux-gnu +-# elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP) +-# if defined(__ARMEL__) +- arm-linux-gnueabihf +-# else +- armeb-linux-gnueabihf +-# endif +-# elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP) +-# if defined(__ARMEL__) +- arm-linux-gnueabi +-# else +- armeb-linux-gnueabi +-# endif +-# elif defined(__hppa__) +- hppa-linux-gnu +-# elif defined(__ia64__) +- ia64-linux-gnu +-# elif defined(__m68k__) && !defined(__mcoldfire__) +- m68k-linux-gnu +-# elif defined(__mips_hard_float) && defined(__mips_isa_rev) && (__mips_isa_rev >=6) && defined(_MIPSEL) +-# if _MIPS_SIM == _ABIO32 +- mipsisa32r6el-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mipsisa64r6el-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mipsisa64r6el-linux-gnuabi64 +-# else +-# error unknown platform triplet +-# endif +-# elif defined(__mips_hard_float) && defined(__mips_isa_rev) && (__mips_isa_rev >=6) +-# if _MIPS_SIM == _ABIO32 +- mipsisa32r6-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mipsisa64r6-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mipsisa64r6-linux-gnuabi64 +-# else +-# error unknown platform triplet +-# endif +-# elif defined(__mips_hard_float) && defined(_MIPSEL) +-# if _MIPS_SIM == _ABIO32 +- mipsel-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mips64el-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mips64el-linux-gnuabi64 +-# else +-# error unknown platform triplet +-# endif +-# elif defined(__mips_hard_float) +-# if _MIPS_SIM == _ABIO32 +- mips-linux-gnu +-# elif _MIPS_SIM == _ABIN32 +- mips64-linux-gnuabin32 +-# elif _MIPS_SIM == _ABI64 +- mips64-linux-gnuabi64 +-# else +-# error unknown platform triplet +-# endif +-# elif defined(__or1k__) +- or1k-linux-gnu +-# elif defined(__powerpc__) && defined(__SPE__) +- powerpc-linux-gnuspe +-# elif defined(__powerpc64__) +-# if defined(__LITTLE_ENDIAN__) +- powerpc64le-linux-gnu +-# else +- powerpc64-linux-gnu +-# endif +-# elif defined(__powerpc__) +- powerpc-linux-gnu +-# elif defined(__s390x__) +- s390x-linux-gnu +-# elif defined(__s390__) +- s390-linux-gnu +-# elif defined(__sh__) && defined(__LITTLE_ENDIAN__) +- sh4-linux-gnu +-# elif defined(__sparc__) && defined(__arch64__) +- sparc64-linux-gnu +-# elif defined(__sparc__) +- sparc-linux-gnu +-# elif defined(__riscv) +-# if __riscv_xlen == 32 +- riscv32-linux-gnu +-# elif __riscv_xlen == 64 +- riscv64-linux-gnu +-# else +-# error unknown platform triplet +-# endif +-# else +-# error unknown platform triplet +-# endif +-#elif defined(__FreeBSD_kernel__) +-# if defined(__LP64__) +- x86_64-kfreebsd-gnu +-# elif defined(__i386__) +- i386-kfreebsd-gnu +-# else +-# error unknown platform triplet +-# endif +-#elif defined(__gnu_hurd__) +- i386-gnu +-#elif defined(__APPLE__) +- darwin +-#elif defined(__VXWORKS__) +- vxworks +-#else +-# error unknown platform triplet +-#endif +- +-EOF +- +-if $CPP $CPPFLAGS conftest.c >conftest.out 2>/dev/null; then +- PLATFORM_TRIPLET=`grep -v '^#' conftest.out | grep -v '^ *$' | tr -d ' '` +- AC_MSG_RESULT([$PLATFORM_TRIPLET]) +-else +- AC_MSG_RESULT([none]) +-fi +-rm -f conftest.c conftest.out ++AC_CANONICAL_TARGET ++## Not using $target to filter out vendor ++## Need to handle macos, vxworks and hurd special (?) :-/ ++case ${target_os} in ++ darwin*) ++ PLATFORM_TRIPLET=darwin ++ ;; ++ hurd*) ++ PLATFORM_TRIPLET=i386-gnu ++ ;; ++ vxworks*) ++ PLATFORM_TRIPLET=vxworks ++ ;; ++ *) ++ if test "${target_cpu}" != "i686"; then ++ PLATFORM_TRIPLET=${target_cpu}-${target_os} ++ else ++ PLATFORM_TRIPLET=i386-${target_os} ++ fi ++ ;; ++esac + + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then +-- +2.24.1 + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-configure.ac-fix-LIBPL.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-configure.ac-fix-LIBPL.patch new file mode 100644 index 00000000..123ce3a2 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-configure.ac-fix-LIBPL.patch @@ -0,0 +1,35 @@ +From acce3d441e7eadadd2d3ce38654155dc43f1f607 Mon Sep 17 00:00:00 2001 +From: Changqing Li <changqing.li@windriver.com> +Date: Fri, 7 Feb 2020 09:36:25 +0800 +Subject: [PATCH] configure.ac: fix LIBPL + +Use LIBDIR rather than prefix/lib, so that it would work when lib64. + +Upstream-Status: Inappropriate [oe-core specific] + +Signed-off-by: Robert Yang <liezhi.yang@windriver.com> +Signed-off-by: Li Zhou <li.zhou@windriver.c> +Signed-off-by: Changqing Li <changqing.li@windriver.com> +--- + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/configure.ac b/configure.ac +index ce04258..915f475 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4532,9 +4532,9 @@ fi + dnl define LIBPL after ABIFLAGS and LDVERSION is defined. + AC_SUBST(PY_ENABLE_SHARED) + if test x$PLATFORM_TRIPLET = x; then +- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" ++ LIBPL='$(LIBDIR)'"/python${VERSION}/config-${LDVERSION}" + else +- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" ++ LIBPL='$(LIBDIR)'"/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + fi + AC_SUBST(LIBPL) + +-- +2.7.4 + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-distutils-sysconfig-append-STAGING_LIBDIR-python-sys.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-distutils-sysconfig-append-STAGING_LIBDIR-python-sys.patch new file mode 100644 index 00000000..e7af3c6f --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-distutils-sysconfig-append-STAGING_LIBDIR-python-sys.patch @@ -0,0 +1,42 @@ +From 7ada9c749f6beb51c13a3debc850755e911548a6 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Thu, 31 Jan 2019 16:46:30 +0100 +Subject: [PATCH] distutils/sysconfig: append + STAGING_LIBDIR/python-sysconfigdata to sys.path + +So that target configuration can be used when running native python + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> + +--- + Lib/distutils/sysconfig.py | 2 ++ + Lib/sysconfig.py | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py +index b51629e..2df348c 100644 +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -438,6 +438,8 @@ def _init_posix(): + platform=sys.platform, + multiarch=getattr(sys.implementation, '_multiarch', ''), + )) ++ if 'STAGING_LIBDIR' in os.environ: ++ sys.path.append(os.environ['STAGING_LIBDIR']+'/python-sysconfigdata') + _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0) + build_time_vars = _temp.build_time_vars + global _config_vars +diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py +index b2d790b..405273c 100644 +--- a/Lib/sysconfig.py ++++ b/Lib/sysconfig.py +@@ -419,6 +419,8 @@ def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # _sysconfigdata is generated at build time, see _generate_posix_vars() + name = _get_sysconfigdata_name() ++ if 'STAGING_LIBDIR' in os.environ: ++ sys.path.append(os.environ['STAGING_LIBDIR']+'/python-sysconfigdata') + _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0) + build_time_vars = _temp.build_time_vars + vars.update(build_time_vars) diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-python3-Do-not-hardcode-lib-for-distutils.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-python3-Do-not-hardcode-lib-for-distutils.patch new file mode 100644 index 00000000..fe031b99 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-python3-Do-not-hardcode-lib-for-distutils.patch @@ -0,0 +1,43 @@ +From bb711b53f10d32a90a27ccf4b0dc51e4a701d862 Mon Sep 17 00:00:00 2001 +From: Changqing Li <changqing.li@windriver.com> +Date: Fri, 7 Feb 2020 09:42:09 +0800 +Subject: [PATCH] python3: Do not hardcode "lib" for distutils + +Get the sys.lib from python3 itself and do not use +hardcoded value of 'lib' for distutils. + +Upstream-Status: Inappropriate [oe-core specific] + +Signed-off-by: Li Zhou <li.zhou@windriver.com> +Signed-off-by: Changqing Li <changqing.li@windriver.com> +--- + Lib/distutils/command/install.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py +index c625c95..8e32f54 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 ++ + WINDOWS_SCHEME = { + 'purelib': '$base/Lib/site-packages', + 'platlib': '$base/Lib/site-packages', +@@ -29,8 +31,8 @@ WINDOWS_SCHEME = { + + INSTALL_SCHEMES = { + 'unix_prefix': { +- 'purelib': '$base/lib/python$py_version_short/site-packages', +- 'platlib': '$platbase/lib/python$py_version_short/site-packages', ++ 'purelib': '$base/' + libname + '/python$py_version_short/site-packages', ++ 'platlib': '$platbase/' + libname + '/python$py_version_short/site-packages', + 'headers': '$base/include/python$py_version_short$abiflags/$dist_name', + 'scripts': '$base/bin', + 'data' : '$base', +-- +2.7.4 + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-python3-use-cc_basename-to-replace-CC-for-checking-c.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-python3-use-cc_basename-to-replace-CC-for-checking-c.patch new file mode 100644 index 00000000..fb10ca94 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-python3-use-cc_basename-to-replace-CC-for-checking-c.patch @@ -0,0 +1,121 @@ +From 994783da5c21cab81b6589ed2d4275e665a946f9 Mon Sep 17 00:00:00 2001 +From: Changqing Li <changqing.li@windriver.com> +Date: Mon, 22 Oct 2018 15:19:51 +0800 +Subject: [PATCH] python3: use cc_basename to replace CC for checking compiler + +When working path contains "clang"/"gcc"/"icc", it might be part of $CC +because of the "--sysroot" parameter. That could cause judgement error +about clang/gcc/icc compilers. e.g. +When "icc" is containded in working path, below errors are reported when +compiling python3: +x86_64-wrs-linux-gcc: error: strict: No such file or directory +x86_64-wrs-linux-gcc: error: unrecognized command line option '-fp-model' + +Here use cc_basename to replace CC for checking compiler to avoid such +kind of issue. + +Upstream-Status: Pending + +Signed-off-by: Li Zhou <li.zhou@windriver.com> + +patch originally from Li Zhou, I just rework it to new version + +Signed-off-by: Changqing Li <changqing.li@windriver.com> + +--- + configure.ac | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +diff --git a/configure.ac b/configure.ac +index a189d42..0f85486 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -54,6 +54,7 @@ AC_CONFIG_HEADER(pyconfig.h) + AC_CANONICAL_HOST + AC_SUBST(build) + AC_SUBST(host) ++LT_INIT + + # pybuilddir.txt will be created by --generate-posix-vars in the Makefile + rm -f pybuilddir.txt +@@ -671,7 +672,7 @@ AC_MSG_RESULT($with_cxx_main) + preset_cxx="$CXX" + if test -z "$CXX" + then +- case "$CC" in ++ case "$cc_basename" in + gcc) AC_PATH_TOOL(CXX, [g++], [g++], [notfound]) ;; + cc) AC_PATH_TOOL(CXX, [c++], [c++], [notfound]) ;; + clang|*/clang) AC_PATH_TOOL(CXX, [clang++], [clang++], [notfound]) ;; +@@ -957,7 +958,7 @@ rmdir CaseSensitiveTestDir + + case $ac_sys_system in + hp*|HP*) +- case $CC in ++ case $cc_basename in + cc|*/cc) CC="$CC -Ae";; + esac;; + esac +@@ -1335,7 +1336,7 @@ else + fi], + [AC_MSG_RESULT(no)]) + if test "$Py_LTO" = 'true' ; then +- case $CC in ++ case $cc_basename in + *clang*) + AC_SUBST(LLVM_AR) + AC_PATH_TOOL(LLVM_AR, llvm-ar, '', ${llvm_path}) +@@ -1425,7 +1426,7 @@ then + fi + fi + LLVM_PROF_ERR=no +-case $CC in ++case $cc_basename in + *clang*) + # Any changes made here should be reflected in the GCC+Darwin case below + PGO_PROF_GEN_FLAG="-fprofile-instr-generate" +@@ -1486,7 +1487,7 @@ esac + # compiler and platform. BASECFLAGS tweaks need to be made even if the + # user set OPT. + +-case $CC in ++case $cc_basename in + *clang*) + cc_is_clang=1 + ;; +@@ -1622,7 +1623,7 @@ yes) + + # ICC doesn't recognize the option, but only emits a warning + ## XXX does it emit an unused result warning and can it be disabled? +- case "$CC" in ++ case "$cc_basename" in + *icc*) + ac_cv_disable_unused_result_warning=no + ;; +@@ -1943,7 +1944,7 @@ yes) + esac + + # ICC needs -fp-model strict or floats behave badly +-case "$CC" in ++case "$cc_basename" in + *icc*) + CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict" + ;; +@@ -2711,7 +2712,7 @@ then + then + LINKFORSHARED="-Wl,--export-dynamic" + fi;; +- SunOS/5*) case $CC in ++ SunOS/5*) case $cc_basename in + *gcc*) + if $CC -Xlinker --help 2>&1 | grep export-dynamic >/dev/null + then +@@ -5362,7 +5363,7 @@ if test "$have_gcc_asm_for_x87" = yes; then + # Some versions of gcc miscompile inline asm: + # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491 + # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html +- case $CC in ++ case $cc_basename in + *gcc*) + AC_MSG_CHECKING(for gcc ipa-pure-const bug) + saved_cflags="$CFLAGS" diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-setup.py-pass-missing-libraries-to-Extension-for-mul.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-setup.py-pass-missing-libraries-to-Extension-for-mul.patch new file mode 100644 index 00000000..ea0af02e --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-setup.py-pass-missing-libraries-to-Extension-for-mul.patch @@ -0,0 +1,69 @@ +From 7019ba184b828ed7253750cf409fc5760ef90a54 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Thu, 9 Jan 2020 17:44:05 +0100 +Subject: [PATCH] setup.py: pass missing libraries to Extension for + multiprocessing module + +In the following commit: +... +commit e711cafab13efc9c1fe6c5cd75826401445eb585 +Author: Benjamin Peterson <benjamin@python.org> +Date: Wed Jun 11 16:44:04 2008 +0000 + + Merged revisions 64104,64117 via svnmerge from + svn+ssh://pythondev@svn.python.org/python/trunk +... +(see diff in setup.py) +It assigned libraries for multiprocessing module according +the host_platform, but not pass it to Extension. + +In glibc, the following commit caused two definition of +sem_getvalue are different. +https://sourceware.org/git/?p=glibc.git;a=commit;h=042e1521c794a945edc43b5bfa7e69ad70420524 +(see diff in nptl/sem_getvalue.c for detail) +`__new_sem_getvalue' is the latest sem_getvalue@@GLIBC_2.1 +and `__old_sem_getvalue' is to compat the old version +sem_getvalue@GLIBC_2.0. + +To build python for embedded Linux systems: +http://www.yoctoproject.org/docs/2.3.1/yocto-project-qs/yocto-project-qs.html +If not explicitly link to library pthread (-lpthread), it will +load glibc's sem_getvalue randomly at runtime. + +Such as build python on linux x86_64 host and run the python +on linux x86_32 target. If not link library pthread, it caused +multiprocessing bounded semaphore could not work correctly. +... +>>> import multiprocessing +>>> pool_sema = multiprocessing.BoundedSemaphore(value=1) +>>> pool_sema.acquire() +True +>>> pool_sema.release() +Traceback (most recent call last): + File "<stdin>", line 1, in <module> +ValueError: semaphore or lock released too many times +... + +And the semaphore issue also caused multiprocessing.Queue().put() hung. + +Upstream-Status: Pending + +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index ec3f2a4..b0f1541 100644 +--- a/setup.py ++++ b/setup.py +@@ -1671,7 +1671,7 @@ class PyBuildExt(build_ext): + libraries=libs, + include_dirs=["Modules/_multiprocessing"])) + +- self.add(Extension('_multiprocessing', multiprocessing_srcs, ++ self.add(Extension('_multiprocessing', multiprocessing_srcs, libraries=['pthread'], + include_dirs=["Modules/_multiprocessing"])) + + def detect_uuid(self): diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-test_ctypes.test_find-skip-without-tools-sdk.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-test_ctypes.test_find-skip-without-tools-sdk.patch new file mode 100644 index 00000000..a44d3396 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-test_ctypes.test_find-skip-without-tools-sdk.patch @@ -0,0 +1,33 @@ +From 7a2bddfa437be633bb6945d0e6b7d6f27da870ad Mon Sep 17 00:00:00 2001 +From: Tim Orling <timothy.t.orling@intel.com> +Date: Fri, 18 Jun 2021 11:56:50 -0700 +Subject: [PATCH] test_ctypes.test_find: skip without tools-sdk + +These tests need full packagegroup-core-buildessential, the +easiest way to dynamically check for that is looking for +'tools-sdk' in IMAGE_FEATURES. + +Upstream-Status: Inappropriate [oe-specific] + +Signed-off-by: Tim Orling <timothy.t.orling@intel.com> +--- + Lib/ctypes/test/test_find.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Lib/ctypes/test/test_find.py b/Lib/ctypes/test/test_find.py +index 92ac184..0d009d1 100644 +--- a/Lib/ctypes/test/test_find.py ++++ b/Lib/ctypes/test/test_find.py +@@ -112,10 +112,12 @@ class FindLibraryLinux(unittest.TestCase): + # LD_LIBRARY_PATH) + self.assertEqual(find_library(libname), 'lib%s.so' % libname) + ++ @unittest.skip("Needs IMAGE_FEATURES += \"tools-sdk\"") + def test_find_library_with_gcc(self): + with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None): + self.assertNotEqual(find_library('c'), None) + ++ @unittest.skip("Needs IMAGE_FEATURES += \"tools-sdk\"") + def test_find_library_with_ld(self): + with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None), \ + unittest.mock.patch("ctypes.util._findLib_gcc", lambda *args: None): diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0001-test_locale.py-correct-the-test-output-format.patch b/meta-oniro-staging/recipes-devtools/python/python3/0001-test_locale.py-correct-the-test-output-format.patch new file mode 100644 index 00000000..f9d2eadc --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0001-test_locale.py-correct-the-test-output-format.patch @@ -0,0 +1,48 @@ +From e11787d373baa6d7b0e0d94aff8ccd373203bfb1 Mon Sep 17 00:00:00 2001 +From: Tim Orling <ticotimo@gmail.com> +Date: Wed, 16 Jun 2021 07:49:52 -0700 +Subject: [PATCH] test_locale.py: correct the test output format + +Before this patch: + # python3 -m test -v test_locale + [snip] + test_getsetlocale_issue1813 (test.test_locale.TestMiscellaneous) ... testing with ('tr_TR', 'ISO8859-9') ok + [snip] + + After this patch: + # python3 -m test -v test_locale + [snip] + test_getsetlocale_issue1813 (test.test_locale.TestMiscellaneous) ... testing with ('tr_TR', 'ISO8859-9')... ok + [snip] + + Make the test ended with "... ok" is common in python + unittest world, we should make it keep consistent + with other test cases in case it may be ignored to + record in the report if we use the common filter + "... ok". + +Upstream-Status: Submitted [https://github.com/python/cpython/pull/15132] + +Signed-off-by: Mingli Yu <mingli.yu@windriver.com> + + +Refresh patch for upstream changes in 3.8.9 + +Signed-off-by: Tim Orling <timothy.t.orling@intel.com> +--- + Lib/test/test_locale.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py +index 39091c0..5050f3d 100644 +--- a/Lib/test/test_locale.py ++++ b/Lib/test/test_locale.py +@@ -563,7 +563,7 @@ class TestMiscellaneous(unittest.TestCase): + self.skipTest('test needs Turkish locale') + loc = locale.getlocale(locale.LC_CTYPE) + if verbose: +- print('testing with %a' % (loc,), end=' ', flush=True) ++ print('testing with %a...' % (loc,), end=' ', flush=True) + try: + locale.setlocale(locale.LC_CTYPE, loc) + except locale.Error as exc: diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0017-setup.py-do-not-report-missing-dependencies-for-disa.patch b/meta-oniro-staging/recipes-devtools/python/python3/0017-setup.py-do-not-report-missing-dependencies-for-disa.patch new file mode 100644 index 00000000..4bd98f62 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0017-setup.py-do-not-report-missing-dependencies-for-disa.patch @@ -0,0 +1,32 @@ +From a2dd127b4163aff6cc35af0d0251321964232ad4 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Mon, 7 Oct 2019 13:22:14 +0200 +Subject: [PATCH] setup.py: do not report missing dependencies for disabled + modules + +Reporting those missing dependencies is misleading as the modules would not +have been built anyway. This particularly matters in oe-core's automated +build completeness checker which relies on the report. + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> + +--- + setup.py | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/setup.py b/setup.py +index 7691258..ec3f2a4 100644 +--- a/setup.py ++++ b/setup.py +@@ -408,6 +408,10 @@ class PyBuildExt(build_ext): + print("%-*s %-*s %-*s" % (longest, e, longest, f, + longest, g)) + ++ # There is no need to report missing module dependencies, ++ # if the modules have been disabled in the first place. ++ self.missing = list(set(self.missing) - set(sysconf_dis)) ++ + if self.missing: + print() + print("Python build finished successfully!") diff --git a/meta-oniro-staging/recipes-devtools/python/python3/0020-configure.ac-setup.py-do-not-add-a-curses-include-pa.patch b/meta-oniro-staging/recipes-devtools/python/python3/0020-configure.ac-setup.py-do-not-add-a-curses-include-pa.patch new file mode 100644 index 00000000..e04a9160 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/0020-configure.ac-setup.py-do-not-add-a-curses-include-pa.patch @@ -0,0 +1,48 @@ +From 863c09f640a5dfd33ff22915b0d5fee7bc5df70a Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Sun, 16 Feb 2020 17:50:25 +0100 +Subject: [PATCH] configure.ac, setup.py: do not add a curses include path from + the host + +This leads to host contamination, and particularly can cause +curses modules to fail at runtime if the host curses is configured +differently to native curses (observed on current OpenSuse Tumbleweed +as dnf failures). + +Upstream-Status: Inappropriate [oe-core specific] +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> +--- + configure.ac | 6 ------ + setup.py | 2 -- + 2 files changed, 8 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 915f475..c911011 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4828,12 +4828,6 @@ then + [Define if you have struct stat.st_mtimensec]) + fi + +-# first curses header check +-ac_save_cppflags="$CPPFLAGS" +-if test "$cross_compiling" = no; then +- CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw" +-fi +- + AC_CHECK_HEADERS(curses.h ncurses.h) + + # On Solaris, term.h requires curses.h +diff --git a/setup.py b/setup.py +index b0f1541..7208cd0 100644 +--- a/setup.py ++++ b/setup.py +@@ -973,8 +973,6 @@ class PyBuildExt(build_ext): + panel_library = 'panel' + if curses_library == 'ncursesw': + curses_defines.append(('HAVE_NCURSESW', '1')) +- if not CROSS_COMPILING: +- curses_includes.append('/usr/include/ncursesw') + # Bug 1464056: If _curses.so links with ncursesw, + # _curses_panel.so must link with panelw. + panel_library = 'panelw' diff --git a/meta-oniro-staging/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch b/meta-oniro-staging/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch new file mode 100644 index 00000000..61ac3e71 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/12-distutils-prefix-is-inside-staging-area.patch @@ -0,0 +1,58 @@ +From 251347fc970a397a9cd63ed3f87c5e6c52e15187 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] 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> + +--- + Lib/distutils/sysconfig.py | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py +index 2df348c..4f8db84 100644 +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -96,7 +96,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'. + """ +- if prefix is None: ++ if prefix is None and os.environ.get('STAGING_INCDIR', ""): ++ prefix = os.environ['STAGING_INCDIR'].rstrip('include') ++ elif prefix is None: + prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX + if os.name == "posix": + if python_build: +@@ -139,7 +141,13 @@ 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'. + """ +- if prefix is None: ++ if os.environ.get('STAGING_LIBDIR', ""): ++ lib_basename = os.environ['STAGING_LIBDIR'].split('/')[-1] ++ else: ++ lib_basename = "lib" ++ if prefix is None and os.environ.get('STAGING_LIBDIR', ""): ++ prefix = os.environ['STAGING_LIBDIR'].rstrip(lib_basename) ++ elif prefix is None: + if standard_lib: + prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX + else: +@@ -147,7 +155,7 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + + if os.name == "posix": + libpython = os.path.join(prefix, +- "lib", "python" + get_python_version()) ++ lib_basename, "python" + get_python_version()) + if standard_lib: + return libpython + else: diff --git a/meta-oniro-staging/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch b/meta-oniro-staging/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch new file mode 100644 index 00000000..184540e7 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/avoid_warning_about_tkinter.patch @@ -0,0 +1,31 @@ +From ba7202700578d435b07cfdfb7b57e83185752800 Mon Sep 17 00:00:00 2001 +From: Andrei Gherzan <andrei@gherzan.ro> +Date: Mon, 28 Jan 2019 15:57:54 +0000 +Subject: [PATCH] _tkinter module needs tk module along with tcl. tk is not yet + integrated in yocto so we skip the check for this module. 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> + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ab18ff0..7691258 100644 +--- a/setup.py ++++ b/setup.py +@@ -1706,8 +1706,8 @@ class PyBuildExt(build_ext): + self.detect_decimal() + self.detect_ctypes() + self.detect_multiprocessing() +- if not self.detect_tkinter(): +- self.missing.append('_tkinter') ++# if not self.detect_tkinter(): ++# self.missing.append('_tkinter') + self.detect_uuid() + + ## # Uncomment these lines if you want to play with xxmodule.c diff --git a/meta-oniro-staging/recipes-devtools/python/python3/cgi_py.patch b/meta-oniro-staging/recipes-devtools/python/python3/cgi_py.patch new file mode 100644 index 00000000..6c4ba543 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/cgi_py.patch @@ -0,0 +1,32 @@ +From 62336285cba38017b35cb761c03f0c7e80a671a3 Mon Sep 17 00:00:00 2001 +From: Mark Hatle <mark.hatle@windriver.com> +Date: Wed, 21 Sep 2011 20:55:33 -0500 +Subject: [PATCH] Lib/cgi.py: Update the script as mentioned in the comment + +Upstream-Status: Inappropriate [distribution] + +Signed-off-by: Mark Hatle <mark.hatle@windriver.com> + +--- + Lib/cgi.py | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +diff --git a/Lib/cgi.py b/Lib/cgi.py +index 8cf6687..094c7b4 100755 +--- a/Lib/cgi.py ++++ b/Lib/cgi.py +@@ -1,13 +1,4 @@ +-#! /usr/local/bin/python +- +-# NOTE: the above "/usr/local/bin/python" is NOT a mistake. It is +-# intentionally NOT "/usr/bin/env python". On many systems +-# (e.g. Solaris), /usr/local/bin is not in $PATH as passed to CGI +-# scripts, and /usr/local/bin is the default directory where Python is +-# installed, so /usr/bin/env would be unable to find python. Granted, +-# binary installations by Linux vendors often install Python in +-# /usr/bin. So let those vendors patch cgi.py to match their choice +-# of installation. ++#! /usr/bin/env python + + """Support module for CGI (Common Gateway Interface) scripts. + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/check_build_completeness.py b/meta-oniro-staging/recipes-devtools/python/python3/check_build_completeness.py new file mode 100755 index 00000000..a1eace3f --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/check_build_completeness.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +import sys +logfile = open(sys.argv[1]).read() + +necessary_bits = logfile.find("The necessary bits to build these optional modules were not found") +to_find_bits = logfile.find("To find the necessary bits, look in setup.py in detect_modules() for the module's name.") +if necessary_bits != -1: + print("%s" %(logfile[necessary_bits:to_find_bits])) + +failed_to_build = logfile.find("Failed to build these modules:") +if failed_to_build != -1: + failed_to_build_end = logfile.find("\n\n", failed_to_build) + print("%s" %(logfile[failed_to_build:failed_to_build_end])) + +if necessary_bits != -1 or failed_to_build != -1: + sys.exit(1) + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/create_manifest3.py b/meta-oniro-staging/recipes-devtools/python/python3/create_manifest3.py new file mode 100644 index 00000000..4da02a29 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/create_manifest3.py @@ -0,0 +1,433 @@ +# This script is used as a bitbake task to create a new python manifest +# $ bitbake python -c create_manifest +# +# Our goal is to keep python-core as small as posible and add other python +# packages only when the user needs them, hence why we split upstream python +# into several packages. +# +# In a very simplistic way what this does is: +# Launch python and see specifically what is required for it to run at a minimum +# +# Go through the python-manifest file and launch a separate task for every single +# one of the files on each package, this task will check what was required for that +# specific module to run, these modules will be called dependencies. +# The output of such task will be a list of the modules or dependencies that were +# found for that file. +# +# Such output will be parsed by this script, we will look for each dependency on the +# manifest and if we find that another package already includes it, then we will add +# that package as an RDEPENDS to the package we are currently checking; in case we dont +# find the current dependency on any other package we will add it to the current package +# as part of FILES. +# +# +# This way we will create a new manifest from the data structure that was built during +# this process, on this new manifest each package will contain specifically only +# what it needs to run. +# +# There are some caveats which we try to deal with, such as repeated files on different +# packages, packages that include folders, wildcards, and special packages. +# Its also important to note that this method only works for python files, and shared +# libraries. Static libraries, header files and binaries need to be dealt with manually. +# +# This script differs from its python2 version mostly on how shared libraries are handled +# The manifest file for python3 has an extra field which contains the cached files for +# each package. +# Tha method to handle cached files does not work when a module includes a folder which +# itself contains the pycache folder, gladly this is almost never the case. +# +# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <aehs29 at gmail dot com> + + +import sys +import subprocess +import json +import os +import collections + +# Get python version from ${PYTHON_MAJMIN} +pyversion = str(sys.argv[1]) + +# Hack to get native python search path (for folders), not fond of it but it works for now +pivot = 'recipe-sysroot-native' +for p in sys.path: + if pivot in p: + nativelibfolder = p[:p.find(pivot)+len(pivot)] + +# Empty dict to hold the whole manifest +new_manifest = collections.OrderedDict() + +# Check for repeated files, folders and wildcards +allfiles = [] +repeated = [] +wildcards = [] + +hasfolders = [] +allfolders = [] + +def isFolder(value): + value = value.replace('${PYTHON_MAJMIN}',pyversion) + if os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib')) or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib64')) or os.path.isdir(value.replace('${libdir}',nativelibfolder+'/usr/lib32')): + return True + else: + return False + +def isCached(item): + if '__pycache__' in item: + return True + else: + return False + +def prepend_comments(comments, json_manifest): + with open(json_manifest, 'r+') as manifest: + json_contents = manifest.read() + manifest.seek(0, 0) + manifest.write(comments + json_contents) + +# Read existing JSON manifest +with open('python3-manifest.json') as manifest: + # The JSON format doesn't allow comments so we hack the call to keep the comments using a marker + manifest_str = manifest.read() + json_start = manifest_str.find('# EOC') + 6 # EOC + \n + manifest.seek(0) + comments = manifest.read(json_start) + manifest_str = manifest.read() + old_manifest = json.loads(manifest_str, object_pairs_hook=collections.OrderedDict) + +# +# First pass to get core-package functionality, because we base everything on the fact that core is actually working +# Not exactly the same so it should not be a function +# + +print ('Getting dependencies for package: core') + + +# This special call gets the core dependencies and +# appends to the old manifest so it doesnt hurt what it +# currently holds. +# This way when other packages check for dependencies +# on the new core package, they will still find them +# even when checking the old_manifest + +output = subprocess.check_output([sys.executable, 'get_module_deps3.py', 'python-core-package']).decode('utf8') +for coredep in output.split(): + coredep = coredep.replace(pyversion,'${PYTHON_MAJMIN}') + if isCached(coredep): + if coredep not in old_manifest['core']['cached']: + old_manifest['core']['cached'].append(coredep) + else: + if coredep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(coredep) + + +# The second step is to loop through the existing files contained in the core package +# according to the old manifest, identify if they are modules, or some other type +# of file that we cant import (directories, binaries, configs) in which case we +# can only assume they were added correctly (manually) so we ignore those and +# pass them to the manifest directly. + +for filedep in old_manifest['core']['files']: + if isFolder(filedep): + if isCached(filedep): + if filedep not in old_manifest['core']['cached']: + old_manifest['core']['cached'].append(filedep) + else: + if filedep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(filedep) + continue + if '${bindir}' in filedep: + if filedep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(filedep) + continue + if filedep == '': + continue + if '${includedir}' in filedep: + if filedep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(filedep) + continue + + # Get actual module name , shouldnt be affected by libdir/bindir, etc. + pymodule = os.path.splitext(os.path.basename(os.path.normpath(filedep)))[0] + + + # We now know that were dealing with a python module, so we can import it + # and check what its dependencies are. + # We launch a separate task for each module for deterministic behavior. + # Each module will only import what is necessary for it to work in specific. + # The output of each task will contain each module's dependencies + + print ('Getting dependencies for module: %s' % pymodule) + output = subprocess.check_output([sys.executable, 'get_module_deps3.py', '%s' % pymodule]).decode('utf8') + print ('The following dependencies were found for module %s:\n' % pymodule) + print (output) + + + for pymodule_dep in output.split(): + pymodule_dep = pymodule_dep.replace(pyversion,'${PYTHON_MAJMIN}') + + if isCached(pymodule_dep): + if pymodule_dep not in old_manifest['core']['cached']: + old_manifest['core']['cached'].append(pymodule_dep) + else: + if pymodule_dep not in old_manifest['core']['files']: + old_manifest['core']['files'].append(pymodule_dep) + + +# At this point we are done with the core package. +# The old_manifest dictionary is updated only for the core package because +# all others will use this a base. + + +# To improve the script speed, we check which packages contain directories +# since we will be looping through (only) those later. +for pypkg in old_manifest: + for filedep in old_manifest[pypkg]['files']: + if isFolder(filedep): + print ('%s is a folder' % filedep) + if pypkg not in hasfolders: + hasfolders.append(pypkg) + if filedep not in allfolders: + allfolders.append(filedep) + + + +# This is the main loop that will handle each package. +# It works in a similar fashion than the step before, but +# we will now be updating a new dictionary that will eventually +# become the new manifest. +# +# The following loops though all packages in the manifest, +# through all files on each of them, and checks whether or not +# they are modules and can be imported. +# If they can be imported, then it checks for dependencies for +# each of them by launching a separate task. +# The output of that task is then parsed and the manifest is updated +# accordingly, wether it should add the module on FILES for the current package +# or if that module already belongs to another package then the current one +# will RDEPEND on it + +for pypkg in old_manifest: + # Use an empty dict as data structure to hold data for each package and fill it up + new_manifest[pypkg] = collections.OrderedDict() + new_manifest[pypkg]['summary'] = old_manifest[pypkg]['summary'] + new_manifest[pypkg]['rdepends'] = [] + new_manifest[pypkg]['files'] = [] + new_manifest[pypkg]['cached'] = old_manifest[pypkg]['cached'] + + # All packages should depend on core + if pypkg != 'core': + new_manifest[pypkg]['rdepends'].append('core') + new_manifest[pypkg]['cached'] = [] + + print('\n') + print('--------------------------') + print ('Handling package %s' % pypkg) + print('--------------------------') + + # Handle special cases, we assume that when they were manually added + # to the manifest we knew what we were doing. + special_packages = ['misc', 'modules', 'dev', 'tests'] + if pypkg in special_packages or 'staticdev' in pypkg: + print('Passing %s package directly' % pypkg) + new_manifest[pypkg] = old_manifest[pypkg] + continue + + for filedep in old_manifest[pypkg]['files']: + # We already handled core on the first pass, we can ignore it now + if pypkg == 'core': + if filedep not in new_manifest[pypkg]['files']: + new_manifest[pypkg]['files'].append(filedep) + continue + + # Handle/ignore what we cant import + if isFolder(filedep): + new_manifest[pypkg]['files'].append(filedep) + # Asyncio (and others) are both the package and the folder name, we should not skip those... + path,mod = os.path.split(filedep) + if mod != pypkg: + continue + if '${bindir}' in filedep: + if filedep not in new_manifest[pypkg]['files']: + new_manifest[pypkg]['files'].append(filedep) + continue + if filedep == '': + continue + if '${includedir}' in filedep: + if filedep not in new_manifest[pypkg]['files']: + new_manifest[pypkg]['files'].append(filedep) + continue + + # Get actual module name , shouldnt be affected by libdir/bindir, etc. + # We need to check if the imported module comes from another (e.g. sqlite3.dump) + path,pymodule = os.path.split(filedep) + path = os.path.basename(path) + pymodule = os.path.splitext(os.path.basename(pymodule))[0] + + # If this condition is met, it means we need to import it from another module + # or its the folder itself (e.g. unittest) + if path == pypkg: + if pymodule: + pymodule = path + '.' + pymodule + else: + pymodule = path + + + + # We now know that were dealing with a python module, so we can import it + # and check what its dependencies are. + # We launch a separate task for each module for deterministic behavior. + # Each module will only import what is necessary for it to work in specific. + # The output of each task will contain each module's dependencies + + print ('\nGetting dependencies for module: %s' % pymodule) + output = subprocess.check_output([sys.executable, 'get_module_deps3.py', '%s' % pymodule]).decode('utf8') + print ('The following dependencies were found for module %s:\n' % pymodule) + print (output) + + reportFILES = [] + reportRDEPS = [] + + for pymodule_dep in output.split(): + + # Warning: This first part is ugly + # One of the dependencies that was found, could be inside of one of the folders included by another package + # We need to check if this happens so we can add the package containing the folder as an rdependency + # e.g. Folder encodings contained in codecs + # This would be solved if no packages included any folders + + # This can be done in two ways: + # 1 - We assume that if we take out the filename from the path we would get + # the folder string, then we would check if folder string is in the list of folders + # This would not work if a package contains a folder which contains another folder + # e.g. path/folder1/folder2/filename folder_string= path/folder1/folder2 + # folder_string would not match any value contained in the list of folders + # + # 2 - We do it the other way around, checking if the folder is contained in the path + # e.g. path/folder1/folder2/filename folder_string= path/folder1/folder2 + # is folder_string inside path/folder1/folder2/filename?, + # Yes, it works, but we waste a couple of milliseconds. + + pymodule_dep = pymodule_dep.replace(pyversion,'${PYTHON_MAJMIN}') + inFolders = False + for folder in allfolders: + # The module could have a directory named after it, e.g. xml, if we take out the filename from the path + # we'll end up with ${libdir}, and we want ${libdir}/xml + if isFolder(pymodule_dep): + check_path = pymodule_dep + else: + check_path = os.path.dirname(pymodule_dep) + if folder in check_path : + inFolders = True # Did we find a folder? + folderFound = False # Second flag to break inner for + # Loop only through packages which contain folders + for pypkg_with_folder in hasfolders: + if (folderFound == False): + # print('Checking folder %s on package %s' % (pymodule_dep,pypkg_with_folder)) + for folder_dep in old_manifest[pypkg_with_folder]['files'] or folder_dep in old_manifest[pypkg_with_folder]['cached']: + if folder_dep == folder: + print ('%s folder found in %s' % (folder, pypkg_with_folder)) + folderFound = True + if pypkg_with_folder not in new_manifest[pypkg]['rdepends'] and pypkg_with_folder != pypkg: + new_manifest[pypkg]['rdepends'].append(pypkg_with_folder) + else: + break + + # A folder was found so we're done with this item, we can go on + if inFolders: + continue + + + + # No directories beyond this point + # We might already have this module on the dictionary since it could depend on a (previously checked) module + if pymodule_dep not in new_manifest[pypkg]['files'] and pymodule_dep not in new_manifest[pypkg]['cached']: + # Handle core as a special package, we already did it so we pass it to NEW data structure directly + if pypkg == 'core': + print('Adding %s to %s FILES' % (pymodule_dep, pypkg)) + if pymodule_dep.endswith('*'): + wildcards.append(pymodule_dep) + if isCached(pymodule_dep): + new_manifest[pypkg]['cached'].append(pymodule_dep) + else: + new_manifest[pypkg]['files'].append(pymodule_dep) + + # Check for repeated files + if pymodule_dep not in allfiles: + allfiles.append(pymodule_dep) + else: + if pymodule_dep not in repeated: + repeated.append(pymodule_dep) + else: + + + # Last step: Figure out if we this belongs to FILES or RDEPENDS + # We check if this module is already contained on another package, so we add that one + # as an RDEPENDS, or if its not, it means it should be contained on the current + # package, and we should add it to FILES + for possible_rdep in old_manifest: + # Debug + # print('Checking %s ' % pymodule_dep + ' in %s' % possible_rdep) + if pymodule_dep in old_manifest[possible_rdep]['files'] or pymodule_dep in old_manifest[possible_rdep]['cached']: + # Since were nesting, we need to check its not the same pypkg + if(possible_rdep != pypkg): + if possible_rdep not in new_manifest[pypkg]['rdepends']: + # Add it to the new manifest data struct as RDEPENDS since it contains something this module needs + reportRDEPS.append('Adding %s to %s RDEPENDS, because it contains %s\n' % (possible_rdep, pypkg, pymodule_dep)) + new_manifest[pypkg]['rdepends'].append(possible_rdep) + break + else: + + # Since this module wasnt found on another package, it is not an RDEP, + # so we add it to FILES for this package. + # A module shouldn't contain itself (${libdir}/python3/sqlite3 shouldnt be on sqlite3 files) + if os.path.basename(pymodule_dep) != pypkg: + reportFILES.append(('Adding %s to %s FILES\n' % (pymodule_dep, pypkg))) + if isCached(pymodule_dep): + new_manifest[pypkg]['cached'].append(pymodule_dep) + else: + new_manifest[pypkg]['files'].append(pymodule_dep) + if pymodule_dep.endswith('*'): + wildcards.append(pymodule_dep) + if pymodule_dep not in allfiles: + allfiles.append(pymodule_dep) + else: + if pymodule_dep not in repeated: + repeated.append(pymodule_dep) + + print('\n') + print('#################################') + print('Summary for module %s' % pymodule) + print('FILES found for module %s:' % pymodule) + print(''.join(reportFILES)) + print('RDEPENDS found for module %s:' % pymodule) + print(''.join(reportRDEPS)) + print('#################################') + +print('The following FILES contain wildcards, please check if they are necessary') +print(wildcards) +print('The following FILES contain folders, please check if they are necessary') +print(hasfolders) + + +# Sort it just so it looks nicer +for pypkg in new_manifest: + new_manifest[pypkg]['files'].sort() + new_manifest[pypkg]['cached'].sort() + new_manifest[pypkg]['rdepends'].sort() + +# Create the manifest from the data structure that was built +with open('python3-manifest.json.new','w') as outfile: + json.dump(new_manifest,outfile, indent=4) + outfile.write('\n') + +prepend_comments(comments,'python3-manifest.json.new') + +if (repeated): + error_msg = '\n\nERROR:\n' + error_msg += 'The following files are repeated (contained in more than one package),\n' + error_msg += 'this is likely to happen when new files are introduced after an upgrade,\n' + error_msg += 'please check which package should get it,\n modify the manifest accordingly and re-run the create_manifest task:\n' + error_msg += '\n'.join(repeated) + error_msg += '\n' + sys.exit(error_msg) + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/crosspythonpath.patch b/meta-oniro-staging/recipes-devtools/python/python3/crosspythonpath.patch new file mode 100644 index 00000000..d789ab57 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/crosspythonpath.patch @@ -0,0 +1,25 @@ +configure.ac: add CROSSPYTHONPATH into PYTHONPATH for PYTHON_FOR_BUILD + +When building x86->x86 the system will try to execute .so and related items +from the default PYTHONPATH. This will fail if the target CPU contains +instructions that the host CPU does not have, add CROSSPYTHONPATH +into PYTHONPATH so we can prepend the list to find correct libs. + +Upstream-Status: Inappropriate [OE-Core integration specific] + +Credits-to: Mark Hatle <mark.hatle@windriver.com> +Credits-to: Jackie Huang <jackie.huang@windriver.com> +Signed-off-by: Ricardo Ribalda <ricardo@ribalda.com> +diff --git a/configure.ac b/configure.ac +index 4ab19a6..7036a53 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -76,7 +76,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 _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH) '$interp ++ PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(CROSSPYTHONPATH):$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH) '$interp + fi + elif test "$cross_compiling" = maybe; then + AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH]) diff --git a/meta-oniro-staging/recipes-devtools/python/python3/get_module_deps3.py b/meta-oniro-staging/recipes-devtools/python/python3/get_module_deps3.py new file mode 100644 index 00000000..fd12baad --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/get_module_deps3.py @@ -0,0 +1,146 @@ +# This script is launched on separate task for each python module +# It checks for dependencies for that specific module and prints +# them out, the output of this execution will have all dependencies +# for a specific module, which will be parsed an dealt on create_manifest.py +# +# Author: Alejandro Enedino Hernandez Samaniego "aehs29" <aehs29@gmail.com> + +# We can get a log per module, for all the dependencies that were found, but its messy. +debug=False + +import sys + +# We can get a list of the modules which are currently required to run python +# so we run python-core and get its modules, we then import what we need +# and check what modules are currently running, if we substract them from the +# modules we had initially, we get the dependencies for the module we imported. + +# We use importlib to achieve this, so we also need to know what modules importlib needs +import importlib + +core_deps=set(sys.modules) + +def fix_path(dep_path): + import os + # We DONT want the path on our HOST system + pivot='recipe-sysroot-native' + dep_path=dep_path[dep_path.find(pivot)+len(pivot):] + + if '/usr/bin' in dep_path: + dep_path = dep_path.replace('/usr/bin''${bindir}') + + # Handle multilib, is there a better way? + if '/usr/lib32' in dep_path: + dep_path = dep_path.replace('/usr/lib32','${libdir}') + if '/usr/lib64' in dep_path: + dep_path = dep_path.replace('/usr/lib64','${libdir}') + if '/usr/lib' in dep_path: + dep_path = dep_path.replace('/usr/lib','${libdir}') + if '/usr/include' in dep_path: + dep_path = dep_path.replace('/usr/include','${includedir}') + if '__init__.' in dep_path: + dep_path = os.path.split(dep_path)[0] + return dep_path + + +# Module to import was passed as an argument +current_module = str(sys.argv[1]).rstrip() +if(debug==True): + log = open('log_%s' % current_module,'w') + log.write('Module %s generated the following dependencies:\n' % current_module) +try: + importlib.import_module('%s' % current_module) +except ImportError as e: + if (debug==True): + log.write('Module was not found') + pass + + +# Get current module dependencies, dif will contain a list of specific deps for this module +module_deps=set(sys.modules) + +# We handle the core package (1st pass on create_manifest.py) as a special case +if current_module == 'python-core-package': + dif = core_deps +else: + # We know this is not the core package, so there must be a difference. + dif = module_deps-core_deps + + +# Check where each dependency came from +for item in dif: + dep_path='' + try: + if (debug==True): + log.write('Calling: sys.modules[' + '%s' % item + '].__file__\n') + dep_path = sys.modules['%s' % item].__file__ + except AttributeError as e: + # Deals with thread (builtin module) not having __file__ attribute + if debug==True: + log.write(item + ' ') + log.write(str(e)) + log.write('\n') + pass + except NameError as e: + # Deals with NameError: name 'dep_path' is not defined + # because module is not found (wasn't compiled?), e.g. bddsm + if (debug==True): + log.write(item+' ') + log.write(str(e)) + pass + + # Site-customize is a special case since we (OpenEmbedded) put it there manually + if 'sitecustomize' in dep_path: + dep_path = '${libdir}/python${PYTHON_MAJMIN}/sitecustomize.py' + # Prints out result, which is what will be used by create_manifest + print (dep_path) + continue + + dep_path = fix_path(dep_path) + + import sysconfig + soabi=sysconfig.get_config_var('SOABI') + # Check if its a shared library and deconstruct it + if soabi in dep_path: + if (debug==True): + log.write('Shared library found in %s' % dep_path) + dep_path = dep_path.replace(soabi,'*') + print (dep_path) + continue + + if (debug==True): + log.write(dep_path+'\n') + # Prints out result, which is what will be used by create_manifest + print (dep_path) + + + import imp + cpython_tag = imp.get_tag() + cached='' + # Theres no naive way to find *.pyc files on python3 + try: + if (debug==True): + log.write('Calling: sys.modules[' + '%s' % item + '].__cached__\n') + cached = sys.modules['%s' % item].__cached__ + except AttributeError as e: + # Deals with thread (builtin module) not having __cached__ attribute + if debug==True: + log.write(item + ' ') + log.write(str(e)) + log.write('\n') + pass + except NameError as e: + # Deals with NameError: name 'cached' is not defined + if (debug==True): + log.write(item+' ') + log.write(str(e)) + pass + if cached is not None: + if (debug==True): + log.write(cached) + cached = fix_path(cached) + cached = cached.replace(cpython_tag,'*') + print (cached) + +if debug==True: + log.close() diff --git a/meta-oniro-staging/recipes-devtools/python/python3/makerace.patch b/meta-oniro-staging/recipes-devtools/python/python3/makerace.patch new file mode 100644 index 00000000..8971f28b --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/makerace.patch @@ -0,0 +1,23 @@ +libainstall installs python-config.py but the .pyc cache files are generated +by the libinstall target. This means some builds may not generate the pyc files +for python-config.py depending on the order things happen in. This means builds +are not always reproducible. + +Add a dependency to avoid the race. + +Upstream-Status: Pending +Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> + +Index: Python-3.8.11/Makefile.pre.in +=================================================================== +--- Python-3.8.11.orig/Makefile.pre.in ++++ Python-3.8.11/Makefile.pre.in +@@ -1415,7 +1415,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter + unittest unittest/test unittest/test/testmock \ + venv venv/scripts venv/scripts/common venv/scripts/posix \ + curses pydoc_data +-libinstall: build_all $(srcdir)/Modules/xxmodule.c ++libinstall: build_all $(srcdir)/Modules/xxmodule.c libainstall + @for i in $(SCRIPTDIR) $(LIBDEST); \ + do \ + if test ! -d $(DESTDIR)$$i; then \ diff --git a/meta-oniro-staging/recipes-devtools/python/python3/python-config.patch b/meta-oniro-staging/recipes-devtools/python/python3/python-config.patch new file mode 100644 index 00000000..c8a8f3d4 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/python-config.patch @@ -0,0 +1,54 @@ +From 07df0ae0d70cba6d1847fe1c24a71063930bec60 Mon Sep 17 00:00:00 2001 +From: Tyler Hall <tylerwhall@gmail.com> +Date: Sun, 4 May 2014 20:06:43 -0400 +Subject: [PATCH] python-config: Revert to using distutils.sysconfig + +The newer sysconfig module shares some code with distutils.sysconfig, but the same modifications as in + +12-distutils-prefix-is-inside-staging-area.patch makes distutils.sysconfig + +affect the native runtime as well as cross building. Use the old, patched +implementation which returns paths in the staging directory and for the target, +as appropriate. + +Upstream-Status: Inappropriate [Embedded Specific] + +Signed-off-by: Tyler Hall <tylerwhall@gmail.com> +: + +--- + Misc/python-config.in | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/Misc/python-config.in b/Misc/python-config.in +index 727c4a8..c702829 100644 +--- a/Misc/python-config.in ++++ b/Misc/python-config.in +@@ -6,7 +6,7 @@ + import getopt + import os + import sys +-import sysconfig ++from distutils import sysconfig + + valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'extension-suffix', 'help', 'abiflags', 'configdir', +@@ -35,14 +35,14 @@ if '--help' in opt_flags: + + for opt in opt_flags: + if opt == '--prefix': +- print(sysconfig.get_config_var('prefix')) ++ print(sysconfig.PREFIX) + + elif opt == '--exec-prefix': +- print(sysconfig.get_config_var('exec_prefix')) ++ print(sysconfig.EXEC_PREFIX) + + elif opt in ('--includes', '--cflags'): +- flags = ['-I' + sysconfig.get_path('include'), +- '-I' + sysconfig.get_path('platinclude')] ++ flags = ['-I' + sysconfig.get_python_inc(), ++ '-I' + sysconfig.get_python_inc(plat_specific=True)] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) diff --git a/meta-oniro-staging/recipes-devtools/python/python3/python3-manifest.json b/meta-oniro-staging/recipes-devtools/python/python3/python3-manifest.json new file mode 100644 index 00000000..3bcc9b86 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/python3-manifest.json @@ -0,0 +1,1223 @@ +# DO NOT (entirely) modify this file manually, please read. +# +# IMPORTANT NOTE: +# Please keep in mind that the create_manifest task relies on the fact the the +# target and native Python packages are the same, and it also needs to be executed +# with a fully working native package (with all the PACKAGECONFIGs enabled and all +# and all the modules should be working, check log.do_compile), otherwise the script +# will fail to find dependencies correctly, this note is valid either if you are +# upgrading to a new Python version or adding a new package. +# +# +# If you are adding a new package please follow the next steps: +# How to add a new package: +# - If a user wants to add a new package all that has to be done is: +# Modify the python3-manifest.json file, and add the required file(s) to the FILES list, +# fill up the SUMMARY section as well, the script should handle all the rest. +# +# Real example: +# We want to add a web browser package, including the file webbrowser.py +# which at the moment is on python3-misc. +# "webbrowser": { +# "files": ["${libdir}/python${PYTHON_MAJMIN}/lib-dynload/webbrowser.py"], +# "rdepends": [], +# "summary": "Python Web Browser support"} +# +# * Note that the rdepends field was left empty +# +# We run $ bitbake python3 -c create_manifest and the resulting manifest +# should be completed after a few seconds, showing something like: +# "webbrowser": { +# "files": ["${libdir}/python${PYTHON_MAJMIN}/webbrowser.py"], +# "rdepends": ["core","fcntl","io","pickle","shell","subprocess"], +# "summary": "Python Web Browser support"} +# +# +# If you are upgrading Python to a new version please follow the next steps: +# After each Python upgrade, the create_manifest task should be executed, because we +# don't control what changes on upstream Python, so, some module dependency +# might have changed without us realizing it, a certain module can either have +# more or less dependencies, or could be depending on a new file that was just +# created on the new release and for obvious reasons we wouldn't have it on our +# old manifest, all of these issues would cause runtime errors on our system. +# +# - Upgrade both the native and target Python packages to a new version +# - Run the create_manifest task for the target Python package as its shown below: +# +# $ bitbake python3 -c create_manifest +# +# This will automatically replace your manifest file located under the Python directory +# with an new one, which contains the new dependencies (if any). +# +# Several things could have gone wrong here, I will try to explain a few: +# +# a) A new file was introduced on this release, e.g. sha3*.so: +# The task will check what its needed to import every module, more than one module would +# would probably depend on sha3*.so, although only one module should contain it. +# +# After running the task, the new manifest will have the sha3*.so file on more than one +# module, you need to manually decide which one of them should get it and delete it from +# the others, for example sha3*.so should likely be on ${PN}-crypt. +# Once you have deleted from the others you need to run the create_manifest task again, +# this will populate the other module's rdepends fields, with ${PN}-crypt and you should be +# good to go. +# +# b) The native package wasn't built correctly and its missing a certain module: +# As mentioned before, you need to make sure the native package was built with all the modules +# because it is used as base to build the manifest file, you need to manually check log.do_compile +# since it won't error out the compile function if its only missing a couple of modules. +# +# e.g. missing the _uuid module, log.do_compile would show the following: +# Python build finished successfully! +# The necessary bits to build these optional modules were not found: +# _uuid +# +# What will happen here is that the new manifest would not be aware that the _uuid module exists, so +# not only we won't know of any dependencies to it, but also, the _uuid* files will be packaged on +# the misc package (which is where any file that doesn't belong anywhere else ends up). +# +# This will eventually cause runtime errors on our system if we don't include the misc package on +# on our image, because the _uuid files will be missing. +# If we build the _uuid module correctly and run the create_manifest task the _uuid files will be +# detected correctly along with its dependencies, and we will get a working manifest. +# +# This is the reason why it is important to make sure we have a fully working native build, +# so we can avoid these errors. +# +# +# +# DO NOT MODIFY THE NEXT LINE!, IT IS USED AS A MARKER FOR THE ACTUAL JSON MANIFEST +# EOC +{ + "tests": { + "summary": "Python test suite", + "rdepends": [ + "core", + "modules" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/*/test", + "${libdir}/python${PYTHON_MAJMIN}/*/tests", + "${libdir}/python${PYTHON_MAJMIN}/idlelib/idle_test/", + "${libdir}/python${PYTHON_MAJMIN}/test" + ], + "cached": [] + }, + "2to3": { + "summary": "Python automated Python 2 to 3 code translator", + "rdepends": [ + "core" + ], + "files": [ + "${bindir}/2to3*", + "${libdir}/python${PYTHON_MAJMIN}/lib2to3" + ], + "cached": [] + }, + "asyncio": { + "summary": "Python Asynchronous I/O", + "rdepends": [ + "core", + "io", + "logging", + "netclient", + "numbers", + "stringold", + "typing" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/asyncio", + "${libdir}/python${PYTHON_MAJMIN}/concurrent", + "${libdir}/python${PYTHON_MAJMIN}/concurrent/futures", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_asyncio.*.so" + ], + "cached": [] + }, + "audio": { + "summary": "Python Audio Handling", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/chunk.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/audioop.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/ossaudiodev.*.so", + "${libdir}/python${PYTHON_MAJMIN}/sndhdr.py", + "${libdir}/python${PYTHON_MAJMIN}/sunau.py", + "${libdir}/python${PYTHON_MAJMIN}/wave.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/chunk.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sndhdr.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sunau.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/wave.*.pyc" + ] + }, + "codecs": { + "summary": "Python codec", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_multibytecodec.*.so", + "${libdir}/python${PYTHON_MAJMIN}/xdrlib.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/xdrlib.*.pyc" + ] + }, + "compile": { + "summary": "Python bytecode compilation support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/compileall.py", + "${libdir}/python${PYTHON_MAJMIN}/py_compile.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/compileall.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/py_compile.*.pyc" + ] + }, + "compression": { + "summary": "Python high-level compression support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/gzip.py", + "${libdir}/python${PYTHON_MAJMIN}/tarfile.py", + "${libdir}/python${PYTHON_MAJMIN}/zipfile.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/gzip.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tarfile.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/zipfile.*.pyc" + ] + }, + "core": { + "summary": "Python interpreter and core modules", + "rdepends": [], + "files": [ + "${bindir}/python${PYTHON_MAJMIN}", + "${bindir}/python${PYTHON_MAJMIN}.real", + "${bindir}/python3", + "${includedir}/python${PYTHON_MAJMIN}/pyconfig*.h", + "${libdir}/python${PYTHON_MAJMIN}/UserDict.py", + "${libdir}/python${PYTHON_MAJMIN}/UserList.py", + "${libdir}/python${PYTHON_MAJMIN}/UserString.py", + "${libdir}/python${PYTHON_MAJMIN}/__future__.py", + "${libdir}/python${PYTHON_MAJMIN}/_abcoll.py", + "${libdir}/python${PYTHON_MAJMIN}/_bootlocale.py", + "${libdir}/python${PYTHON_MAJMIN}/_collections_abc.py", + "${libdir}/python${PYTHON_MAJMIN}/_compression.py", + "${libdir}/python${PYTHON_MAJMIN}/_markupbase.py", + "${libdir}/python${PYTHON_MAJMIN}/_sitebuiltins.py", + "${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py", + "${libdir}/python${PYTHON_MAJMIN}/_weakrefset.py", + "${libdir}/python${PYTHON_MAJMIN}/abc.py", + "${libdir}/python${PYTHON_MAJMIN}/argparse.py", + "${libdir}/python${PYTHON_MAJMIN}/ast.py", + "${libdir}/python${PYTHON_MAJMIN}/bisect.py", + "${libdir}/python${PYTHON_MAJMIN}/bz2.py", + "${libdir}/python${PYTHON_MAJMIN}/code.py", + "${libdir}/python${PYTHON_MAJMIN}/codecs.py", + "${libdir}/python${PYTHON_MAJMIN}/codeop.py", + "${libdir}/python${PYTHON_MAJMIN}/collections", + "${libdir}/python${PYTHON_MAJMIN}/collections/abc.py", + "${libdir}/python${PYTHON_MAJMIN}/configparser.py", + "${libdir}/python${PYTHON_MAJMIN}/contextlib.py", + "${libdir}/python${PYTHON_MAJMIN}/copy.py", + "${libdir}/python${PYTHON_MAJMIN}/copyreg.py", + "${libdir}/python${PYTHON_MAJMIN}/csv.py", + "${libdir}/python${PYTHON_MAJMIN}/dis.py", + "${libdir}/python${PYTHON_MAJMIN}/encodings", + "${libdir}/python${PYTHON_MAJMIN}/encodings/aliases.py", + "${libdir}/python${PYTHON_MAJMIN}/encodings/latin_1.py", + "${libdir}/python${PYTHON_MAJMIN}/encodings/utf_8.py", + "${libdir}/python${PYTHON_MAJMIN}/enum.py", + "${libdir}/python${PYTHON_MAJMIN}/fnmatch.py", + "${libdir}/python${PYTHON_MAJMIN}/functools.py", + "${libdir}/python${PYTHON_MAJMIN}/genericpath.py", + "${libdir}/python${PYTHON_MAJMIN}/getopt.py", + "${libdir}/python${PYTHON_MAJMIN}/gettext.py", + "${libdir}/python${PYTHON_MAJMIN}/heapq.py", + "${libdir}/python${PYTHON_MAJMIN}/imp.py", + "${libdir}/python${PYTHON_MAJMIN}/importlib", + "${libdir}/python${PYTHON_MAJMIN}/importlib/_bootstrap.py", + "${libdir}/python${PYTHON_MAJMIN}/importlib/_bootstrap_external.py", + "${libdir}/python${PYTHON_MAJMIN}/importlib/abc.py", + "${libdir}/python${PYTHON_MAJMIN}/importlib/machinery.py", + "${libdir}/python${PYTHON_MAJMIN}/importlib/util.py", + "${libdir}/python${PYTHON_MAJMIN}/inspect.py", + "${libdir}/python${PYTHON_MAJMIN}/io.py", + "${libdir}/python${PYTHON_MAJMIN}/keyword.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/__pycache__/_struct.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/__pycache__/binascii.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/__pycache__/time.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/__pycache__/xreadlines.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_bisect.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_bz2.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_csv.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_heapq.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_lzma.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_opcode.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_posixsubprocess.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_struct.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/array.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/binascii.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/grp.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/math.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/parser.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/readline.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/select.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/time.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/unicodedata.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/xreadlines.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/zlib.*.so", + "${libdir}/python${PYTHON_MAJMIN}/linecache.py", + "${libdir}/python${PYTHON_MAJMIN}/locale.py", + "${libdir}/python${PYTHON_MAJMIN}/lzma.py", + "${libdir}/python${PYTHON_MAJMIN}/new.py", + "${libdir}/python${PYTHON_MAJMIN}/ntpath.py", + "${libdir}/python${PYTHON_MAJMIN}/opcode.py", + "${libdir}/python${PYTHON_MAJMIN}/operator.py", + "${libdir}/python${PYTHON_MAJMIN}/optparse.py", + "${libdir}/python${PYTHON_MAJMIN}/os.py", + "${libdir}/python${PYTHON_MAJMIN}/pathlib.py", + "${libdir}/python${PYTHON_MAJMIN}/pkgutil.py", + "${libdir}/python${PYTHON_MAJMIN}/platform.py", + "${libdir}/python${PYTHON_MAJMIN}/posixpath.py", + "${libdir}/python${PYTHON_MAJMIN}/re.py", + "${libdir}/python${PYTHON_MAJMIN}/reprlib.py", + "${libdir}/python${PYTHON_MAJMIN}/rlcompleter.py", + "${libdir}/python${PYTHON_MAJMIN}/runpy.py", + "${libdir}/python${PYTHON_MAJMIN}/selectors.py", + "${libdir}/python${PYTHON_MAJMIN}/shutil.py", + "${libdir}/python${PYTHON_MAJMIN}/signal.py", + "${libdir}/python${PYTHON_MAJMIN}/site.py", + "${libdir}/python${PYTHON_MAJMIN}/sitecustomize.py", + "${libdir}/python${PYTHON_MAJMIN}/sre_compile.py", + "${libdir}/python${PYTHON_MAJMIN}/sre_constants.py", + "${libdir}/python${PYTHON_MAJMIN}/sre_parse.py", + "${libdir}/python${PYTHON_MAJMIN}/stat.py", + "${libdir}/python${PYTHON_MAJMIN}/stringprep.py", + "${libdir}/python${PYTHON_MAJMIN}/struct.py", + "${libdir}/python${PYTHON_MAJMIN}/subprocess.py", + "${libdir}/python${PYTHON_MAJMIN}/symbol.py", + "${libdir}/python${PYTHON_MAJMIN}/sysconfig.py", + "${libdir}/python${PYTHON_MAJMIN}/textwrap.py", + "${libdir}/python${PYTHON_MAJMIN}/threading.py", + "${libdir}/python${PYTHON_MAJMIN}/token.py", + "${libdir}/python${PYTHON_MAJMIN}/tokenize.py", + "${libdir}/python${PYTHON_MAJMIN}/traceback.py", + "${libdir}/python${PYTHON_MAJMIN}/types.py", + "${libdir}/python${PYTHON_MAJMIN}/warnings.py", + "${libdir}/python${PYTHON_MAJMIN}/weakref.py", + "${prefix}/lib/python${PYTHON_MAJMIN}/config*/*[!.a]" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/__future__.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_bootlocale.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_collections_abc.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_compression.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_markupbase.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_sitebuiltins.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_sysconfigdata.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_weakrefset.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/abc.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/argparse.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ast.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/bisect.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/bz2.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/code.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/codecs.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/codeop.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/configparser.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/contextlib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/copy.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/copyreg.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/csv.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/dis.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/enum.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/fnmatch.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/functools.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/genericpath.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/getopt.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/gettext.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/heapq.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/imp.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/inspect.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/io.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/keyword.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/linecache.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/locale.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/lzma.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ntpath.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/opcode.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/operator.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/optparse.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/os.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pathlib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pkgutil.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/platform.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/posixpath.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/re.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/reprlib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/rlcompleter.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/runpy.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/selectors.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/shutil.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/signal.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/site.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sre_compile.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sre_constants.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sre_parse.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/stat.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/stringprep.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/struct.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/subprocess.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/symbol.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/sysconfig.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/textwrap.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/threading.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/token.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tokenize.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/traceback.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/types.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/warnings.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/weakref.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/collections/__pycache__", + "${libdir}/python${PYTHON_MAJMIN}/collections/__pycache__/abc.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__", + "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__/aliases.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__/latin_1.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/encodings/__pycache__/utf_8.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__", + "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__/abc.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__/machinery.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/importlib/__pycache__/util.*.pyc" + ] + }, + "crypt": { + "summary": "Python basic cryptographic and hashing support", + "rdepends": [ + "core", + "math", + "stringold" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/crypt.py", + "${libdir}/python${PYTHON_MAJMIN}/hashlib.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_blake2.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_crypt.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_hashlib.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_md5.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sha1.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sha256.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sha3.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sha512.*.so" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/crypt.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/hashlib.*.pyc" + ] + }, + "ctypes": { + "summary": "Python C types support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/ctypes", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_ctypes.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_ctypes_test.*.so" + ], + "cached": [] + }, + "curses": { + "summary": "Python curses support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/curses", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_curses.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_curses_panel.*.so" + ], + "cached": [] + }, + "datetime": { + "summary": "Python calendar and time support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/_strptime.py", + "${libdir}/python${PYTHON_MAJMIN}/calendar.py", + "${libdir}/python${PYTHON_MAJMIN}/datetime.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_datetime.*.so" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_strptime.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/calendar.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/datetime.*.pyc" + ] + }, + "db": { + "summary": "Python file-based database support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/dbm", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_dbm.*.so" + ], + "cached": [] + }, + "debugger": { + "summary": "Python debugger", + "rdepends": [ + "core", + "pprint", + "shell", + "stringold" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/bdb.py", + "${libdir}/python${PYTHON_MAJMIN}/pdb.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/bdb.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pdb.*.pyc" + ] + }, + "dev": { + "cached": [], + "files": [ + "${base_libdir}/*.a", + "${base_libdir}/*.o", + "${bindir}/python*-config*", + "${datadir}/aclocal", + "${datadir}/pkgconfig", + "${includedir}", + "${libdir}/*.a", + "${libdir}/*.la", + "${libdir}/*.o", + "${libdir}/lib*${SOLIBSDEV}", + "${libdir}/pkgconfig" + ], + "rdepends": [ + "core", + "distutils" + ], + "summary": "Python development package" + }, + "difflib": { + "summary": "Python helpers for computing deltas between objects", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/difflib.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/difflib.*.pyc" + ] + }, + "distutils-windows": { + "summary": "Python distribution utilities (Windows installer stubs)", + "rdepends": [ + "core" + ], + "files": [], + "cached": [] + }, + "distutils": { + "summary": "Python Distribution Utilities", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/distutils" + ], + "cached": [] + }, + "doctest": { + "summary": "Python framework for running examples in docstrings", + "rdepends": [ + "asyncio", + "compression", + "core", + "debugger", + "difflib", + "io", + "logging", + "netclient", + "numbers", + "pprint", + "shell", + "stringold", + "typing", + "unittest" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/doctest.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/doctest.*.pyc" + ] + }, + "email": { + "summary": "Python email support", + "rdepends": [ + "core", + "crypt", + "datetime", + "io", + "math", + "netclient" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/email", + "${libdir}/python${PYTHON_MAJMIN}/imaplib.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/imaplib.*.pyc" + ] + }, + "fcntl": { + "summary": "Python's fcntl interface", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/fcntl.*.so" + ], + "cached": [] + }, + "gdbm": { + "summary": "Python GNU database support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_gdbm.*.so" + ], + "cached": [] + }, + "html": { + "summary": "Python HTML processing support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/formatter.py", + "${libdir}/python${PYTHON_MAJMIN}/html" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/formatter.*.pyc" + ] + }, + "idle": { + "summary": "Python Integrated Development Environment", + "rdepends": [ + "core" + ], + "files": [ + "${bindir}/idle*", + "${libdir}/python${PYTHON_MAJMIN}/idlelib" + ], + "cached": [] + }, + "image": { + "summary": "Python graphical image handling", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/colorsys.py", + "${libdir}/python${PYTHON_MAJMIN}/imghdr.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/colorsys.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/imghdr.*.pyc" + ] + }, + "io": { + "summary": "Python low-level I/O", + "rdepends": [ + "compression", + "core", + "crypt", + "math", + "netclient", + "shell" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/_pyio.py", + "${libdir}/python${PYTHON_MAJMIN}/ipaddress.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_socket.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_ssl.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/termios.*.so", + "${libdir}/python${PYTHON_MAJMIN}/pipes.py", + "${libdir}/python${PYTHON_MAJMIN}/socket.py", + "${libdir}/python${PYTHON_MAJMIN}/ssl.py", + "${libdir}/python${PYTHON_MAJMIN}/tempfile.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_pyio.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ipaddress.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pipes.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/socket.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ssl.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tempfile.*.pyc" + ] + }, + "json": { + "summary": "Python JSON support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/json", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_json.*.so" + ], + "cached": [] + }, + "logging": { + "summary": "Python logging support", + "rdepends": [ + "core", + "stringold" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/logging" + ], + "cached": [] + }, + "mailbox": { + "summary": "Python mailbox format support", + "rdepends": [ + "core", + "crypt", + "datetime", + "email", + "fcntl", + "io", + "math", + "mime", + "netclient", + "stringold" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/mailbox.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/mailbox.*.pyc" + ] + }, + "math": { + "summary": "Python math support", + "rdepends": [ + "core", + "crypt" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_random.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/cmath.*.so", + "${libdir}/python${PYTHON_MAJMIN}/random.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/random.*.pyc" + ] + }, + "mime": { + "summary": "Python MIME handling APIs", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/quopri.py", + "${libdir}/python${PYTHON_MAJMIN}/uu.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/quopri.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/uu.*.pyc" + ] + }, + "mmap": { + "summary": "Python memory-mapped file support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/mmap.*.so" + ], + "cached": [] + }, + "modules": { + "cached": [], + "files": [], + "rdepends": [ + "2to3", + "asyncio", + "audio", + "codecs", + "compile", + "compression", + "core", + "crypt", + "ctypes", + "curses", + "datetime", + "db", + "debugger", + "difflib", + "distutils", + "doctest", + "email", + "fcntl", + "html", + "idle", + "image", + "io", + "json", + "logging", + "mailbox", + "math", + "mime", + "mmap", + "multiprocessing", + "netclient", + "netserver", + "numbers", + "pickle", + "pkgutil", + "plistlib", + "pprint", + "profile", + "pydoc", + "resource", + "shell", + "smtpd", + "sqlite3", + "stringold", + "syslog", + "terminal", + "threading", + "tkinter", + "typing", + "unittest", + "unixadmin", + "venv", + "xml", + "xmlrpc" + ], + "rrecommends": [ + "distutils-windows" + ], + "summary": "All Python modules" + }, + "multiprocessing": { + "summary": "Python multiprocessing support", + "rdepends": [ + "core", + "io", + "pickle" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_multiprocessing.*.so", + "${libdir}/python${PYTHON_MAJMIN}/multiprocessing" + ], + "cached": [] + }, + "netclient": { + "summary": "Python Internet Protocol clients", + "rdepends": [ + "core", + "crypt", + "datetime", + "email", + "io", + "math", + "mime", + "stringold" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/base64.py", + "${libdir}/python${PYTHON_MAJMIN}/ftplib.py", + "${libdir}/python${PYTHON_MAJMIN}/hmac.py", + "${libdir}/python${PYTHON_MAJMIN}/http", + "${libdir}/python${PYTHON_MAJMIN}/http/__pycache__", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_uuid.*.so", + "${libdir}/python${PYTHON_MAJMIN}/mimetypes.py", + "${libdir}/python${PYTHON_MAJMIN}/nntplib.py", + "${libdir}/python${PYTHON_MAJMIN}/poplib.py", + "${libdir}/python${PYTHON_MAJMIN}/smtplib.py", + "${libdir}/python${PYTHON_MAJMIN}/telnetlib.py", + "${libdir}/python${PYTHON_MAJMIN}/urllib", + "${libdir}/python${PYTHON_MAJMIN}/urllib/__pycache__", + "${libdir}/python${PYTHON_MAJMIN}/uuid.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/base64.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/ftplib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/hmac.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/mimetypes.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/nntplib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/poplib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/smtplib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/telnetlib.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/uuid.*.pyc" + ] + }, + "netserver": { + "summary": "Python Internet Protocol servers", + "rdepends": [ + "compression", + "core", + "crypt", + "datetime", + "email", + "html", + "io", + "math", + "mime", + "netclient", + "stringold" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/cgi.py", + "${libdir}/python${PYTHON_MAJMIN}/socketserver.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/cgi.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/socketserver.*.pyc" + ] + }, + "numbers": { + "summary": "Python number APIs", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/_pydecimal.py", + "${libdir}/python${PYTHON_MAJMIN}/contextvars.py", + "${libdir}/python${PYTHON_MAJMIN}/decimal.py", + "${libdir}/python${PYTHON_MAJMIN}/fractions.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_contextvars.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_decimal.*.so", + "${libdir}/python${PYTHON_MAJMIN}/numbers.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_pydecimal.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/contextvars.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/decimal.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/fractions.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/numbers.*.pyc" + ] + }, + "pickle": { + "summary": "Python serialisation/persistence support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/_compat_pickle.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_pickle.*.so", + "${libdir}/python${PYTHON_MAJMIN}/pickle.py", + "${libdir}/python${PYTHON_MAJMIN}/pickletools.py", + "${libdir}/python${PYTHON_MAJMIN}/shelve.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_compat_pickle.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pickle.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pickletools.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/shelve.*.pyc" + ] + }, + "pkgutil": { + "summary": "Python package extension utility support", + "rdepends": [ + "core" + ], + "files": [], + "cached": [] + }, + "plistlib": { + "summary": "Generate and parse Mac OS X .plist files", + "rdepends": [ + "core", + "datetime", + "xml" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/plistlib.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/plistlib.*.pyc" + ] + }, + "pprint": { + "summary": "Python pretty-print support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/pprint.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pprint.*.pyc" + ] + }, + "profile": { + "summary": "Python basic performance profiling support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/cProfile.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_lsprof.*.so", + "${libdir}/python${PYTHON_MAJMIN}/profile.py", + "${libdir}/python${PYTHON_MAJMIN}/pstats.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/cProfile.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/profile.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pstats.*.pyc" + ] + }, + "pydoc": { + "summary": "Python interactive help support", + "rdepends": [ + "core", + "netclient" + ], + "files": [ + "${bindir}/pydoc*", + "${libdir}/python${PYTHON_MAJMIN}/pydoc.py", + "${libdir}/python${PYTHON_MAJMIN}/pydoc_data" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pydoc.*.pyc" + ] + }, + "resource": { + "summary": "Python resource control interface", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/resource.*.so" + ], + "cached": [] + }, + "shell": { + "summary": "Python shell-like functionality", + "rdepends": [ + "compression", + "core", + "stringold" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/cmd.py", + "${libdir}/python${PYTHON_MAJMIN}/glob.py", + "${libdir}/python${PYTHON_MAJMIN}/shlex.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/cmd.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/glob.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/shlex.*.pyc" + ] + }, + "smtpd": { + "summary": "Python Simple Mail Transport Daemon", + "rdepends": [ + "core", + "crypt", + "datetime", + "email", + "io", + "math", + "mime", + "netclient", + "stringold" + ], + "files": [ + "${bindir}/smtpd.py", + "${libdir}/python${PYTHON_MAJMIN}/asynchat.py", + "${libdir}/python${PYTHON_MAJMIN}/asyncore.py", + "${libdir}/python${PYTHON_MAJMIN}/smtpd.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/asynchat.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/asyncore.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/smtpd.*.pyc" + ] + }, + "sqlite3": { + "summary": "Python Sqlite3 database support", + "rdepends": [ + "core", + "datetime" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_sqlite3.*.so", + "${libdir}/python${PYTHON_MAJMIN}/sqlite3" + ], + "cached": [] + }, + "stringold": { + "summary": "Python string APIs [deprecated]", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/string.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/string.*.pyc" + ] + }, + "syslog": { + "summary": "Python syslog interface", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/syslog.*.so" + ], + "cached": [] + }, + "terminal": { + "summary": "Python terminal controlling support", + "rdepends": [ + "core", + "io" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/pty.py", + "${libdir}/python${PYTHON_MAJMIN}/tty.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/pty.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/tty.*.pyc" + ] + }, + "threading": { + "summary": "Python threading & synchronization support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/_dummy_thread.py", + "${libdir}/python${PYTHON_MAJMIN}/_threading_local.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_queue.*.so", + "${libdir}/python${PYTHON_MAJMIN}/queue.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_dummy_thread.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/_threading_local.*.pyc", + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/queue.*.pyc" + ] + }, + "tkinter": { + "summary": "Python Tcl/Tk bindings", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_tkinter.*.so", + "${libdir}/python${PYTHON_MAJMIN}/tkinter" + ], + "cached": [] + }, + "typing": { + "summary": "Python typing support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/typing.py" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/typing.*.pyc" + ] + }, + "unittest": { + "summary": "Python unit testing framework", + "rdepends": [ + "asyncio", + "compression", + "core", + "difflib", + "io", + "logging", + "netclient", + "numbers", + "pprint", + "stringold", + "typing" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/unittest", + "${libdir}/python${PYTHON_MAJMIN}/unittest/", + "${libdir}/python${PYTHON_MAJMIN}/unittest/__pycache__" + ], + "cached": [] + }, + "unixadmin": { + "summary": "Python Unix administration support", + "rdepends": [ + "core", + "io" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/getpass.py", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/nis.*.so" + ], + "cached": [ + "${libdir}/python${PYTHON_MAJMIN}/__pycache__/getpass.*.pyc" + ] + }, + "venv": { + "summary": "Provides support for creating lightweight virtual environments with their own site directories, optionally isolated from system site directories.", + "rdepends": [ + "compression", + "core", + "logging", + "stringold" + ], + "files": [ + "${bindir}/pyvenv*", + "${libdir}/python${PYTHON_MAJMIN}/venv" + ], + "cached": [] + }, + "xml": { + "summary": "Python basic XML support", + "rdepends": [ + "core" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/_elementtree.*.so", + "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/pyexpat.*.so", + "${libdir}/python${PYTHON_MAJMIN}/xml" + ], + "cached": [] + }, + "xmlrpc": { + "summary": "Python XML-RPC support", + "rdepends": [ + "core", + "xml" + ], + "files": [ + "${libdir}/python${PYTHON_MAJMIN}/xmlrpc", + "${libdir}/python${PYTHON_MAJMIN}/xmlrpc/__pycache__" + ], + "cached": [] + } +} diff --git a/meta-oniro-staging/recipes-devtools/python/python3/reformat_sysconfig.py b/meta-oniro-staging/recipes-devtools/python/python3/reformat_sysconfig.py new file mode 100644 index 00000000..c4164313 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/reformat_sysconfig.py @@ -0,0 +1,21 @@ +#! /usr/bin/env python3 +# +# SPDX-License-Identifier: MIT +# +# Copyright 2019 by Garmin Ltd. or its subsidiaries +# +# A script to reformat python sysconfig + +import sys +import pprint +l = {} +g = {} +with open(sys.argv[1], 'r') as f: + exec(f.read(), g, l) + +with open(sys.argv[1], 'w') as f: + for k in sorted(l.keys()): + f.write('%s = ' % k) + pprint.pprint(l[k], stream=f, width=sys.maxsize) + f.write('\n') + diff --git a/meta-oniro-staging/recipes-devtools/python/python3/run-ptest b/meta-oniro-staging/recipes-devtools/python/python3/run-ptest new file mode 100644 index 00000000..405b07f4 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3/run-ptest @@ -0,0 +1,3 @@ +#!/bin/sh + +python3 -m test -v | sed -u -e '/\.\.\. ok/ s/^/PASS: /g' -r -e '/\.\.\. (ERROR|FAIL)/ s/^/FAIL: /g' -e '/\.\.\. skipped/ s/^/SKIP: /g' -e 's/ \.\.\. ok//g' -e 's/ \.\.\. ERROR//g' -e 's/ \.\.\. FAIL//g' -e 's/ \.\.\. skipped//g' diff --git a/meta-oniro-staging/recipes-devtools/python/python3_3.8.12.bb b/meta-oniro-staging/recipes-devtools/python/python3_3.8.12.bb new file mode 100644 index 00000000..cfcc91b3 --- /dev/null +++ b/meta-oniro-staging/recipes-devtools/python/python3_3.8.12.bb @@ -0,0 +1,363 @@ +SUMMARY = "The Python Programming Language" +HOMEPAGE = "http://www.python.org" +DESCRIPTION = "Python is a programming language that lets you work more quickly and integrate your systems more effectively." +LICENSE = "PSF-2.0 & BSD-0-Clause" +SECTION = "devel/python" + +LIC_FILES_CHKSUM = "file://LICENSE;md5=c22d2438294c784731bf9dd224a467b7" + +SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \ + file://run-ptest \ + file://create_manifest3.py \ + file://get_module_deps3.py \ + file://python3-manifest.json \ + file://check_build_completeness.py \ + file://cgi_py.patch \ + file://0001-Do-not-add-usr-lib-termcap-to-linker-flags-to-avoid-.patch \ + ${@bb.utils.contains('PACKAGECONFIG', 'tk', '', 'file://avoid_warning_about_tkinter.patch', d)} \ + file://0001-Do-not-use-the-shell-version-of-python-config-that-w.patch \ + file://python-config.patch \ + file://0001-Makefile.pre-use-qemu-wrapper-when-gathering-profile.patch \ + file://0001-Do-not-hardcode-lib-as-location-for-site-packages-an.patch \ + file://0001-python3-use-cc_basename-to-replace-CC-for-checking-c.patch \ + file://0001-Lib-sysconfig.py-fix-another-place-where-lib-is-hard.patch \ + file://0001-Makefile-fix-Issue36464-parallel-build-race-problem.patch \ + file://0001-bpo-36852-proper-detection-of-mips-architecture-for-.patch \ + file://crosspythonpath.patch \ + file://reformat_sysconfig.py \ + file://0001-Use-FLAG_REF-always-for-interned-strings.patch \ + file://0001-test_locale.py-correct-the-test-output-format.patch \ + file://0017-setup.py-do-not-report-missing-dependencies-for-disa.patch \ + file://0001-setup.py-pass-missing-libraries-to-Extension-for-mul.patch \ + file://0001-Makefile-do-not-compile-.pyc-in-parallel.patch \ + file://0001-configure.ac-fix-LIBPL.patch \ + file://0001-python3-Do-not-hardcode-lib-for-distutils.patch \ + file://0020-configure.ac-setup.py-do-not-add-a-curses-include-pa.patch \ + file://makerace.patch \ + " + +SRC_URI_append_class-native = " \ + file://0001-distutils-sysconfig-append-STAGING_LIBDIR-python-sys.patch \ + file://12-distutils-prefix-is-inside-staging-area.patch \ + file://0001-Don-t-search-system-for-headers-libraries.patch \ + " + +SRC_URI[md5sum] = "9dd8f82e586b776383c82e27923f8795" +SRC_URI[sha256sum] = "b1d3a76420375343b5e8a22fceb1ac65b77193e9ed27146524f0a9db058728ea" + +# exclude pre-releases for both python 2.x and 3.x +UPSTREAM_CHECK_REGEX = "[Pp]ython-(?P<pver>\d+(\.\d+)+).tar" + +CVE_PRODUCT = "python" + +# Upstream consider this expected behaviour +CVE_CHECK_WHITELIST += "CVE-2007-4559" +# This is not exploitable when glibc has CVE-2016-10739 fixed. +CVE_CHECK_WHITELIST += "CVE-2019-18348" + +# This is windows only issue. +CVE_CHECK_WHITELIST += "CVE-2020-15523" + +PYTHON_MAJMIN = "3.8" + +S = "${WORKDIR}/Python-${PV}" + +BBCLASSEXTEND = "native nativesdk" + +inherit autotools pkgconfig qemu ptest multilib_header update-alternatives + +MULTILIB_SUFFIX = "${@d.getVar('base_libdir',1).split('/')[-1]}" + +ALTERNATIVE_${PN}-dev = "python3-config" +ALTERNATIVE_LINK_NAME[python3-config] = "${bindir}/python${PYTHON_MAJMIN}-config" +ALTERNATIVE_TARGET[python3-config] = "${bindir}/python${PYTHON_MAJMIN}-config-${MULTILIB_SUFFIX}" + + +DEPENDS = "bzip2-replacement-native libffi bzip2 openssl sqlite3 zlib virtual/libintl xz virtual/crypt util-linux libtirpc libnsl2 autoconf-archive" +DEPENDS_append_class-target = " python3-native" +DEPENDS_append_class-nativesdk = " python3-native" + +EXTRA_OECONF = " --without-ensurepip --enable-shared" +EXTRA_OECONF_append_class-native = " --bindir=${bindir}/${PN}" + +export CROSSPYTHONPATH="${STAGING_LIBDIR_NATIVE}/python${PYTHON_MAJMIN}/lib-dynload/" + +EXTRANATIVEPATH += "python3-native" + +CACHED_CONFIGUREVARS = " \ + ac_cv_file__dev_ptmx=yes \ + ac_cv_file__dev_ptc=no \ + ac_cv_working_tzset=yes \ +" +python() { + # PGO currently causes builds to not be reproducible, so disable it for + # now. See YOCTO #13407 + if bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', True, False, d) and d.getVar('BUILD_REPRODUCIBLE_BINARIES') != '1': + d.setVar('PACKAGECONFIG_PGO', 'pgo') + else: + d.setVar('PACKAGECONFIG_PGO', '') +} + +PACKAGECONFIG_class-target ??= "readline ${PACKAGECONFIG_PGO} gdbm" +PACKAGECONFIG_class-native ??= "readline gdbm" +PACKAGECONFIG_class-nativesdk ??= "readline gdbm" +PACKAGECONFIG[readline] = ",,readline" +# Use profile guided optimisation by running PyBench inside qemu-user +PACKAGECONFIG[pgo] = "--enable-optimizations,,qemu-native" +PACKAGECONFIG[tk] = ",,tk" +PACKAGECONFIG[gdbm] = ",,gdbm" + +do_configure_prepend () { + mkdir -p ${B}/Modules + cat > ${B}/Modules/Setup.local << EOF +*disabled* +${@bb.utils.contains('PACKAGECONFIG', 'gdbm', '', '_gdbm _dbm', d)} +${@bb.utils.contains('PACKAGECONFIG', 'readline', '', 'readline', d)} +EOF +} + +CPPFLAGS_append = " -I${STAGING_INCDIR}/ncursesw -I${STAGING_INCDIR}/uuid" + +EXTRA_OEMAKE = '\ + STAGING_LIBDIR=${STAGING_LIBDIR} \ + STAGING_INCDIR=${STAGING_INCDIR} \ + LIB=${baselib} \ +' + +do_compile_prepend_class-target() { + if ${@bb.utils.contains('PACKAGECONFIG', 'pgo', 'true', 'false', d)}; then + qemu_binary="${@qemu_wrapper_cmdline(d, '${STAGING_DIR_TARGET}', ['${B}', '${STAGING_DIR_TARGET}/${base_libdir}'])}" + cat >pgo-wrapper <<EOF +#!/bin/sh +cd ${B} +$qemu_binary "\$@" +EOF + chmod +x pgo-wrapper + fi +} + +do_install_prepend() { + ${WORKDIR}/check_build_completeness.py ${T}/log.do_compile +} + +do_install_append_class-target() { + oe_multilib_header python${PYTHON_MAJMIN}/pyconfig.h +} + +do_install_append_class-native() { + # Make sure we use /usr/bin/env python + for PYTHSCRIPT in `grep -rIl ${bindir}/${PN}/python ${D}${bindir}/${PN}`; do + sed -i -e '1s|^#!.*|#!/usr/bin/env python3|' $PYTHSCRIPT + done + # Add a symlink to the native Python so that scripts can just invoke + # "nativepython" and get the right one without needing absolute paths + # (these often end up too long for the #! parser in the kernel as the + # buffer is 128 bytes long). + ln -s python3-native/python3 ${D}${bindir}/nativepython3 +} + +do_install_append() { + mkdir -p ${D}${libdir}/python-sysconfigdata + sysconfigfile=`find ${D} -name _sysconfig*.py` + cp $sysconfigfile ${D}${libdir}/python-sysconfigdata/_sysconfigdata.py + + sed -i \ + -e "s,^ 'LIBDIR'.*, 'LIBDIR': '${STAGING_LIBDIR}'\,,g" \ + -e "s,^ 'INCLUDEDIR'.*, 'INCLUDEDIR': '${STAGING_INCDIR}'\,,g" \ + -e "s,^ 'CONFINCLUDEDIR'.*, 'CONFINCLUDEDIR': '${STAGING_INCDIR}'\,,g" \ + -e "/^ 'INCLDIRSTOMAKE'/{N; s,/usr/include,${STAGING_INCDIR},g}" \ + -e "/^ 'INCLUDEPY'/s,/usr/include,${STAGING_INCDIR},g" \ + ${D}${libdir}/python-sysconfigdata/_sysconfigdata.py +} + +do_install_append_class-nativesdk () { + create_wrapper ${D}${bindir}/python${PYTHON_MAJMIN} TERMINFO_DIRS='${sysconfdir}/terminfo:/etc/terminfo:/usr/share/terminfo:/usr/share/misc/terminfo:/lib/terminfo' PYTHONNOUSERSITE='1' +} + +SSTATE_SCAN_FILES += "Makefile _sysconfigdata.py" +PACKAGE_PREPROCESS_FUNCS += "py_package_preprocess" + +py_package_preprocess () { + # Remove references to buildmachine paths in target Makefile and _sysconfigdata + sed -i -e 's:--sysroot=${STAGING_DIR_TARGET}::g' -e s:'--with-libtool-sysroot=${STAGING_DIR_TARGET}'::g \ + -e 's|${DEBUG_PREFIX_MAP}||g' \ + -e 's:${HOSTTOOLS_DIR}/::g' \ + -e 's:${RECIPE_SYSROOT_NATIVE}::g' \ + -e 's:${RECIPE_SYSROOT}::g' \ + -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \ + ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/config-${PYTHON_MAJMIN}${PYTHON_ABI}*/Makefile \ + ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py \ + ${PKGD}/${bindir}/python${PYTHON_MAJMIN}-config + + # Reformat _sysconfigdata after modifying it so that it remains + # reproducible + for c in ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py; do + python3 ${WORKDIR}/reformat_sysconfig.py $c + done + + # Recompile _sysconfigdata after modifying it + cd ${PKGD} + sysconfigfile=`find . -name _sysconfigdata_*.py` + ${STAGING_BINDIR_NATIVE}/python3-native/python3 \ + -c "from py_compile import compile; compile('$sysconfigfile')" + ${STAGING_BINDIR_NATIVE}/python3-native/python3 \ + -c "from py_compile import compile; compile('$sysconfigfile', optimize=1)" + ${STAGING_BINDIR_NATIVE}/python3-native/python3 \ + -c "from py_compile import compile; compile('$sysconfigfile', optimize=2)" + cd - + + mv ${PKGD}/${bindir}/python${PYTHON_MAJMIN}-config ${PKGD}/${bindir}/python${PYTHON_MAJMIN}-config-${MULTILIB_SUFFIX} + + #Remove the unneeded copy of target sysconfig data + rm -rf ${PKGD}/${libdir}/python-sysconfigdata +} + +# We want bytecode precompiled .py files (.pyc's) by default +# but the user may set it on their own conf +INCLUDE_PYCS ?= "1" + +python(){ + import collections, json + + filename = os.path.join(d.getVar('THISDIR'), 'python3', 'python3-manifest.json') + # This python changes the datastore based on the contents of a file, so mark + # that dependency. + bb.parse.mark_dependency(d, filename) + + with open(filename) as manifest_file: + manifest_str = manifest_file.read() + json_start = manifest_str.find('# EOC') + 6 + manifest_file.seek(json_start) + manifest_str = manifest_file.read() + python_manifest = json.loads(manifest_str, object_pairs_hook=collections.OrderedDict) + + # First set RPROVIDES for -native case + # Hardcoded since it cant be python3-native-foo, should be python3-foo-native + pn = 'python3' + rprovides = d.getVar('RPROVIDES').split() + + # ${PN}-misc-native is not in the manifest + rprovides.append(pn + '-misc-native') + + for key in python_manifest: + pypackage = pn + '-' + key + '-native' + if pypackage not in rprovides: + rprovides.append(pypackage) + + d.setVar('RPROVIDES_class-native', ' '.join(rprovides)) + + # Then work on the target + include_pycs = d.getVar('INCLUDE_PYCS') + + packages = d.getVar('PACKAGES').split() + pn = d.getVar('PN') + + newpackages=[] + for key in python_manifest: + pypackage = pn + '-' + key + + if pypackage not in packages: + # We need to prepend, otherwise python-misc gets everything + # so we use a new variable + newpackages.append(pypackage) + + # "Build" python's manifest FILES, RDEPENDS and SUMMARY + d.setVar('FILES_' + pypackage, '') + for value in python_manifest[key]['files']: + d.appendVar('FILES_' + pypackage, ' ' + value) + + # Add cached files + if include_pycs == '1': + for value in python_manifest[key]['cached']: + d.appendVar('FILES_' + pypackage, ' ' + value) + + for value in python_manifest[key]['rdepends']: + # Make it work with or without $PN + if '${PN}' in value: + value=value.split('-', 1)[1] + d.appendVar('RDEPENDS_' + pypackage, ' ' + pn + '-' + value) + + for value in python_manifest[key].get('rrecommends', ()): + if '${PN}' in value: + value=value.split('-', 1)[1] + d.appendVar('RRECOMMENDS_' + pypackage, ' ' + pn + '-' + value) + + d.setVar('SUMMARY_' + pypackage, python_manifest[key]['summary']) + + # Prepending so to avoid python-misc getting everything + packages = newpackages + packages + d.setVar('PACKAGES', ' '.join(packages)) + d.setVar('ALLOW_EMPTY_${PN}-modules', '1') + d.setVar('ALLOW_EMPTY_${PN}-pkgutil', '1') +} + +# Files needed to create a new manifest + +do_create_manifest() { + # This task should be run with every new release of Python. + # We must ensure that PACKAGECONFIG enables everything when creating + # a new manifest, this is to base our new manifest on a complete + # native python build, containing all dependencies, otherwise the task + # wont be able to find the required files. + # e.g. BerkeleyDB is an optional build dependency so it may or may not + # be present, we must ensure it is. + + cd ${WORKDIR} + # This needs to be executed by python-native and NOT by HOST's python + nativepython3 create_manifest3.py ${PYTHON_MAJMIN} + cp python3-manifest.json.new ${THISDIR}/python3/python3-manifest.json +} + +# bitbake python -c create_manifest +# Make sure we have native python ready when we create a new manifest +addtask do_create_manifest after do_patch do_prepare_recipe_sysroot + +# manual dependency additions +RRECOMMENDS_${PN}-core_append_class-nativesdk = " nativesdk-python3-modules" +RRECOMMENDS_${PN}-crypt_append_class-target = " openssl ca-certificates" +RRECOMMENDS_${PN}-crypt_append_class-nativesdk = " openssl ca-certificates" + +# For historical reasons PN is empty and provided by python3-modules +FILES_${PN} = "" +RPROVIDES_${PN}-modules = "${PN}" + +FILES_${PN}-pydoc += "${bindir}/pydoc${PYTHON_MAJMIN} ${bindir}/pydoc3" +FILES_${PN}-idle += "${bindir}/idle3 ${bindir}/idle${PYTHON_MAJMIN}" + +# provide python-pyvenv from python3-venv +RPROVIDES_${PN}-venv += "python3-pyvenv" + +# package libpython3 +PACKAGES =+ "libpython3 libpython3-staticdev" +FILES_libpython3 = "${libdir}/libpython*.so.*" +FILES_libpython3-staticdev += "${libdir}/python${PYTHON_MAJMIN}/config-${PYTHON_MAJMIN}-*/libpython${PYTHON_MAJMIN}.a" +INSANE_SKIP_${PN}-dev += "dev-elf" +INSANE_SKIP_${PN}-ptest += "dev-deps" + +# catch all the rest (unsorted) +PACKAGES += "${PN}-misc" +RDEPENDS_${PN}-misc += "python3-core python3-email python3-codecs python3-pydoc python3-pickle python3-audio" +RDEPENDS_${PN}-modules_append_class-target = " python3-misc" +RDEPENDS_${PN}-modules_append_class-nativesdk = " python3-misc" +FILES_${PN}-misc = "${libdir}/python${PYTHON_MAJMIN} ${libdir}/python${PYTHON_MAJMIN}/lib-dynload" + +# catch manpage +PACKAGES += "${PN}-man" +FILES_${PN}-man = "${datadir}/man" + +# See https://bugs.python.org/issue18748 and https://bugs.python.org/issue37395 +RDEPENDS_libpython3_append_libc-glibc = " libgcc" +RDEPENDS_${PN}-ctypes_append_libc-glibc = " ${MLPREFIX}ldconfig" +RDEPENDS_${PN}-ptest = "${PN}-modules ${PN}-tests ${PN}-dev unzip bzip2 libgcc tzdata-europe coreutils sed" +RDEPENDS_${PN}-ptest_append_libc-glibc = " locale-base-tr-tr.iso-8859-9" +RDEPENDS_${PN}-tkinter += "${@bb.utils.contains('PACKAGECONFIG', 'tk', 'tk tk-lib', '', d)}" +RDEPENDS_${PN}-dev = "" + +RDEPENDS_${PN}-tests_append_class-target = " bash" +RDEPENDS_${PN}-tests_append_class-nativesdk = " bash" + +# Python's tests contain large numbers of files we don't need in the recipe sysroots +SYSROOT_PREPROCESS_FUNCS += " py3_sysroot_cleanup" +py3_sysroot_cleanup () { + rm -rf ${SYSROOT_DESTDIR}${libdir}/python${PYTHON_MAJMIN}/test +} -- GitLab