From 898f7432fb5857a33df7360d48aff9f8fcba03f8 Mon Sep 17 00:00:00 2001 From: Lumir Balhar Date: Mon, 3 Aug 2020 10:34:06 +0200 Subject: [PATCH] Add support for upstream architectures' names Pythons in RHEL/Fedora use different names for some architectures than upstream and other distros (for example ppc64 vs. powerpc64). See patch 274. That means that an extension built with the default upstream settings (on other distro or as an manylinux wheel) cannot be found by Python on RHEL/Fedora because it has a different suffix. This patch adds the original names to importlib so Python is able to import extensions with an original architecture name in its file name. --- ...or-architectures-with-different-name.patch | 79 +++++++++++++++++++ python3.9.spec | 26 +++++- 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 00353-Original-names-for-architectures-with-different-name.patch diff --git a/00353-Original-names-for-architectures-with-different-name.patch b/00353-Original-names-for-architectures-with-different-name.patch new file mode 100644 index 0000000..d3b1a28 --- /dev/null +++ b/00353-Original-names-for-architectures-with-different-name.patch @@ -0,0 +1,79 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lumir Balhar +Date: Tue, 4 Aug 2020 12:04:03 +0200 +Subject: [PATCH] 00353: Original names for architectures with different names + downstream + +Pythons in RHEL/Fedora use different names for some architectures +than upstream and other distros (for example ppc64 vs. powerpc64). +See patch 274. +That means that an extension built with the default upstream settings +(on other distro or as an manylinux wheel) cannot be found by Python +on RHEL/Fedora because it has a different suffix. +This patch adds the original names to importlib so Python is able +to import extensions with an original architecture name in its +file name. + +WARNING: This patch has no effect on Python built with bootstrap +enabled because Python/importlib_external.h is not regenerated +and therefore Python during bootstrap contains importlib from +upstream without this feature. It's possible to include +Python/importlib_external.h to this patch but it'd make rebasing +a nightmare because it's basically a binary file. +--- + Lib/importlib/_bootstrap_external.py | 31 ++++++++++++++++++++++++++-- + 1 file changed, 29 insertions(+), 2 deletions(-) + +diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py +index 25a3f8c0e0..db4bb4d02d 100644 +--- a/Lib/importlib/_bootstrap_external.py ++++ b/Lib/importlib/_bootstrap_external.py +@@ -1566,7 +1566,7 @@ def _get_supported_file_loaders(): + + Each item is a tuple (loader, suffixes). + """ +- extensions = ExtensionFileLoader, _imp.extension_suffixes() ++ extensions = ExtensionFileLoader, _alternative_architectures(_imp.extension_suffixes()) + source = SourceFileLoader, SOURCE_SUFFIXES + bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES + return [extensions, source, bytecode] +@@ -1622,7 +1622,7 @@ def _setup(_bootstrap_module): + + # Constants + setattr(self_module, '_relax_case', _make_relax_case()) +- EXTENSION_SUFFIXES.extend(_imp.extension_suffixes()) ++ EXTENSION_SUFFIXES.extend(_alternative_architectures(_imp.extension_suffixes())) + if builtin_os == 'nt': + SOURCE_SUFFIXES.append('.pyw') + if '_d.pyd' in EXTENSION_SUFFIXES: +@@ -1635,3 +1635,30 @@ def _install(_bootstrap_module): + supported_loaders = _get_supported_file_loaders() + sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)]) + sys.meta_path.append(PathFinder) ++ ++ ++_ARCH_MAP = { ++ "-arm-linux-gnueabi.": "-arm-linux-gnueabihf.", ++ "-armeb-linux-gnueabi.": "-armeb-linux-gnueabihf.", ++ "-mips64-linux-gnu.": "-mips64-linux-gnuabi64.", ++ "-mips64el-linux-gnu.": "-mips64el-linux-gnuabi64.", ++ "-ppc-linux-gnu.": "-powerpc-linux-gnu.", ++ "-ppc-linux-gnuspe.": "-powerpc-linux-gnuspe.", ++ "-ppc64-linux-gnu.": "-powerpc64-linux-gnu.", ++ "-ppc64le-linux-gnu.": "-powerpc64le-linux-gnu.", ++} ++ ++ ++def _alternative_architectures(suffixes): ++ """Add a suffix with an alternative architecture name ++ to the list of suffixes so an extension built with ++ the default (upstream) setting is loadable with our Pythons ++ """ ++ ++ for suffix in suffixes: ++ for original, alternative in _ARCH_MAP.items(): ++ if original in suffix: ++ suffixes.append(suffix.replace(original, alternative)) ++ return suffixes ++ ++ return suffixes diff --git a/python3.9.spec b/python3.9.spec index 0dba7e4..720d2fd 100644 --- a/python3.9.spec +++ b/python3.9.spec @@ -17,7 +17,7 @@ URL: https://www.python.org/ %global prerel b5 %global upstream_version %{general_version}%{?prerel} Version: %{general_version}%{?prerel:~%{prerel}} -Release: 4%{?dist} +Release: 5%{?dist} License: Python @@ -305,6 +305,27 @@ Patch274: 00274-fix-arch-names.patch # Ideally, we should talk to upstream and explain why we don't want this Patch328: 00328-pyc-timestamp-invalidation-mode.patch +# 00353 # f3c11e227c715450b3c1e945a5004e84cce41a58 +# Original names for architectures with different names downstream +# +# Pythons in RHEL/Fedora use different names for some architectures +# than upstream and other distros (for example ppc64 vs. powerpc64). +# See patch 274. +# That means that an extension built with the default upstream settings +# (on other distro or as an manylinux wheel) cannot be found by Python +# on RHEL/Fedora because it has a different suffix. +# This patch adds the original names to importlib so Python is able +# to import extensions with an original architecture name in its +# file name. +# +# WARNING: This patch has no effect on Python built with bootstrap +# enabled because Python/importlib_external.h is not regenerated +# and therefore Python during bootstrap contains importlib from +# upstream without this feature. It's possible to include +# Python/importlib_external.h to this patch but it'd make rebasing +# a nightmare because it's basically a binary file. +Patch353: 00353-Original-names-for-architectures-with-different-name.patch + # (New patches go here ^^^) # # When adding new patches to "python" and "python3" in Fedora, EL, etc., @@ -1613,6 +1634,9 @@ CheckPython optimized # ====================================================== %changelog +* Mon Aug 03 2020 Lumír Balhar - 3.9.0~b5-5 +- Add support for upstream architectures' names (patch 353) + * Thu Jul 30 2020 Miro Hrončok - 3.9.0~b5-4 - Make python3-libs installable without python3 Resolves: rhbz#1862082