forked from pool/python38
osc copypac from project:devel:languages:python:Factory package:python3 revision:376, using expand
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:Factory/python38?expand=0&rev=1
This commit is contained in:
commit
aef62c368c
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
## Default LFS
|
||||||
|
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bsp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gem filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lzma filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.obscpio filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.oxt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.rpm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.whl filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zst filter=lfs diff=lfs merge=lfs -text
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.osc
|
59
CVE-2019-5010-null-defer-x509-cert-DOS.patch
Normal file
59
CVE-2019-5010-null-defer-x509-cert-DOS.patch
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
From a37f52436f9aa4b9292878b72f3ff1480e2606c3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Heimes <christian@python.org>
|
||||||
|
Date: Tue, 15 Jan 2019 23:47:42 +0100
|
||||||
|
Subject: [PATCH] bpo-35746: Fix segfault in ssl's cert parser (GH-11569)
|
||||||
|
|
||||||
|
Fix a NULL pointer deref in ssl module. The cert parser did not handle CRL
|
||||||
|
distribution points with empty DP or URI correctly. A malicious or buggy
|
||||||
|
certificate can result into segfault.
|
||||||
|
|
||||||
|
Signed-off-by: Christian Heimes <christian@python.org>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
https://bugs.python.org/issue35746
|
||||||
|
---
|
||||||
|
Lib/test/talos-2019-0758.pem | 22 +++++++++++++++++++
|
||||||
|
Lib/test/test_ssl.py | 22 +++++++++++++++++++
|
||||||
|
.../2019-01-15-18-16-05.bpo-35746.nMSd0j.rst | 3 +++
|
||||||
|
Modules/_ssl.c | 4 ++++
|
||||||
|
4 files changed, 51 insertions(+)
|
||||||
|
create mode 100644 Lib/test/talos-2019-0758.pem
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst
|
||||||
|
|
||||||
|
--- a/Lib/test/test_ssl.py
|
||||||
|
+++ b/Lib/test/test_ssl.py
|
||||||
|
@@ -467,6 +467,27 @@ class BasicSocketTests(unittest.TestCase
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
+ def test_parse_cert_CVE_2019_5010(self):
|
||||||
|
+ p = ssl._ssl._test_decode_cert(TALOS_INVALID_CRLDP)
|
||||||
|
+ if support.verbose:
|
||||||
|
+ sys.stdout.write("\n" + pprint.pformat(p) + "\n")
|
||||||
|
+ self.assertEqual(
|
||||||
|
+ p,
|
||||||
|
+ {
|
||||||
|
+ 'issuer': (
|
||||||
|
+ (('countryName', 'UK'),), (('commonName', 'cody-ca'),)),
|
||||||
|
+ 'notAfter': 'Jun 14 18:00:58 2028 GMT',
|
||||||
|
+ 'notBefore': 'Jun 18 18:00:58 2018 GMT',
|
||||||
|
+ 'serialNumber': '02',
|
||||||
|
+ 'subject': ((('countryName', 'UK'),),
|
||||||
|
+ (('commonName',
|
||||||
|
+ 'codenomicon-vm-2.test.lal.cisco.com'),)),
|
||||||
|
+ 'subjectAltName': (
|
||||||
|
+ ('DNS', 'codenomicon-vm-2.test.lal.cisco.com'),),
|
||||||
|
+ 'version': 3
|
||||||
|
+ }
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
def test_parse_cert_CVE_2013_4238(self):
|
||||||
|
p = ssl._ssl._test_decode_cert(NULLBYTECERT)
|
||||||
|
if support.verbose:
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst
|
||||||
|
@@ -0,0 +1,3 @@
|
||||||
|
+[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did
|
||||||
|
+not handle CRL distribution points with empty DP or URI correctly. A
|
||||||
|
+malicious or buggy certificate can result into segfault.
|
236
F00102-lib64.patch
Normal file
236
F00102-lib64.patch
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
From 81904771db8b112c8617a111e989b68e55af7a9c Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Malcolm <dmalcolm@redhat.com>
|
||||||
|
Date: Wed, 13 Jan 2010 21:25:18 +0000
|
||||||
|
Subject: [PATCH] 00102: Change the various install paths to use /usr/lib64/
|
||||||
|
instead or /usr/lib/
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Only used when "%{_lib}" == "lib64".
|
||||||
|
|
||||||
|
Co-authored-by: David Malcolm <dmalcolm@redhat.com>
|
||||||
|
Co-authored-by: Thomas Spura <tomspur@fedoraproject.org>
|
||||||
|
Co-authored-by: Slavek Kabrda <bkabrda@redhat.com>
|
||||||
|
Co-authored-by: Matej Stuchlik <mstuchli@redhat.com>
|
||||||
|
Co-authored-by: Tomas Orsava <torsava@redhat.com>
|
||||||
|
Co-authored-by: Charalampos Stratakis <cstratak@redhat.com>
|
||||||
|
Co-authored-by: Petr Viktorin <pviktori@redhat.com>
|
||||||
|
Co-authored-by: Miro Hrončok <miro@hroncok.cz>
|
||||||
|
Co-authored-by: Iryna Shcherbina <shcherbina.iryna@gmail.com>
|
||||||
|
---
|
||||||
|
Lib/distutils/command/install.py | 4 ++--
|
||||||
|
Lib/distutils/sysconfig.py | 6 +++++-
|
||||||
|
Lib/distutils/tests/test_install.py | 3 ++-
|
||||||
|
Lib/site.py | 4 ++++
|
||||||
|
Lib/sysconfig.py | 12 ++++++------
|
||||||
|
Lib/test/test_site.py | 4 ++--
|
||||||
|
Makefile.pre.in | 2 +-
|
||||||
|
Modules/getpath.c | 6 +++---
|
||||||
|
configure | 4 ++--
|
||||||
|
configure.ac | 4 ++--
|
||||||
|
setup.py | 6 +++---
|
||||||
|
11 files changed, 32 insertions(+), 23 deletions(-)
|
||||||
|
|
||||||
|
--- a/Lib/distutils/command/install.py
|
||||||
|
+++ b/Lib/distutils/command/install.py
|
||||||
|
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
|
||||||
|
INSTALL_SCHEMES = {
|
||||||
|
'unix_prefix': {
|
||||||
|
'purelib': '$base/lib/python$py_version_short/site-packages',
|
||||||
|
- 'platlib': '$platbase/lib/python$py_version_short/site-packages',
|
||||||
|
+ 'platlib': '$platbase/lib64/python$py_version_short/site-packages',
|
||||||
|
'headers': '$base/include/python$py_version_short$abiflags/$dist_name',
|
||||||
|
'scripts': '$base/bin',
|
||||||
|
'data' : '$base',
|
||||||
|
},
|
||||||
|
'unix_home': {
|
||||||
|
'purelib': '$base/lib/python',
|
||||||
|
- 'platlib': '$base/lib/python',
|
||||||
|
+ 'platlib': '$base/lib64/python',
|
||||||
|
'headers': '$base/include/python/$dist_name',
|
||||||
|
'scripts': '$base/bin',
|
||||||
|
'data' : '$base',
|
||||||
|
--- a/Lib/distutils/sysconfig.py
|
||||||
|
+++ b/Lib/distutils/sysconfig.py
|
||||||
|
@@ -146,8 +146,12 @@ def get_python_lib(plat_specific=0, stan
|
||||||
|
prefix = plat_specific and EXEC_PREFIX or PREFIX
|
||||||
|
|
||||||
|
if os.name == "posix":
|
||||||
|
+ if plat_specific or standard_lib:
|
||||||
|
+ lib = "lib64"
|
||||||
|
+ else:
|
||||||
|
+ lib = "lib"
|
||||||
|
libpython = os.path.join(prefix,
|
||||||
|
- "lib", "python" + get_python_version())
|
||||||
|
+ lib, "python" + get_python_version())
|
||||||
|
if standard_lib:
|
||||||
|
return libpython
|
||||||
|
else:
|
||||||
|
--- a/Lib/distutils/tests/test_install.py
|
||||||
|
+++ b/Lib/distutils/tests/test_install.py
|
||||||
|
@@ -57,8 +57,9 @@ class InstallTestCase(support.TempdirMan
|
||||||
|
self.assertEqual(got, expected)
|
||||||
|
|
||||||
|
libdir = os.path.join(destination, "lib", "python")
|
||||||
|
+ platlibdir = os.path.join(destination, "lib", "python")
|
||||||
|
check_path(cmd.install_lib, libdir)
|
||||||
|
- check_path(cmd.install_platlib, libdir)
|
||||||
|
+ check_path(cmd.install_platlib, platlibdir)
|
||||||
|
check_path(cmd.install_purelib, libdir)
|
||||||
|
check_path(cmd.install_headers,
|
||||||
|
os.path.join(destination, "include", "python", "foopkg"))
|
||||||
|
--- a/Lib/site.py
|
||||||
|
+++ b/Lib/site.py
|
||||||
|
@@ -335,11 +335,15 @@ def getsitepackages(prefixes=None):
|
||||||
|
seen.add(prefix)
|
||||||
|
|
||||||
|
if os.sep == '/':
|
||||||
|
+ sitepackages.append(os.path.join(prefix, "lib64",
|
||||||
|
+ "python" + sys.version[:3],
|
||||||
|
+ "site-packages"))
|
||||||
|
sitepackages.append(os.path.join(prefix, "lib",
|
||||||
|
"python%d.%d" % sys.version_info[:2],
|
||||||
|
"site-packages"))
|
||||||
|
else:
|
||||||
|
sitepackages.append(prefix)
|
||||||
|
+ sitepackages.append(os.path.join(prefix, "lib64", "site-packages"))
|
||||||
|
sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
|
||||||
|
return sitepackages
|
||||||
|
|
||||||
|
--- a/Lib/sysconfig.py
|
||||||
|
+++ b/Lib/sysconfig.py
|
||||||
|
@@ -20,10 +20,10 @@ __all__ = [
|
||||||
|
|
||||||
|
_INSTALL_SCHEMES = {
|
||||||
|
'posix_prefix': {
|
||||||
|
- 'stdlib': '{installed_base}/lib/python{py_version_short}',
|
||||||
|
- 'platstdlib': '{platbase}/lib/python{py_version_short}',
|
||||||
|
+ 'stdlib': '{installed_base}/lib64/python{py_version_short}',
|
||||||
|
+ 'platstdlib': '{platbase}/lib64/python{py_version_short}',
|
||||||
|
'purelib': '{base}/lib/python{py_version_short}/site-packages',
|
||||||
|
- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages',
|
||||||
|
+ 'platlib': '{platbase}/lib64/python{py_version_short}/site-packages',
|
||||||
|
'include':
|
||||||
|
'{installed_base}/include/python{py_version_short}{abiflags}',
|
||||||
|
'platinclude':
|
||||||
|
@@ -62,10 +62,10 @@ _INSTALL_SCHEMES = {
|
||||||
|
'data': '{userbase}',
|
||||||
|
},
|
||||||
|
'posix_user': {
|
||||||
|
- 'stdlib': '{userbase}/lib/python{py_version_short}',
|
||||||
|
- 'platstdlib': '{userbase}/lib/python{py_version_short}',
|
||||||
|
+ 'stdlib': '{userbase}/lib64/python{py_version_short}',
|
||||||
|
+ 'platstdlib': '{userbase}/lib64/python{py_version_short}',
|
||||||
|
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
|
||||||
|
- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
|
||||||
|
+ 'platlib': '{userbase}/lib64/python{py_version_short}/site-packages',
|
||||||
|
'include': '{userbase}/include/python{py_version_short}',
|
||||||
|
'scripts': '{userbase}/bin',
|
||||||
|
'data': '{userbase}',
|
||||||
|
--- a/Lib/test/test_site.py
|
||||||
|
+++ b/Lib/test/test_site.py
|
||||||
|
@@ -266,8 +266,8 @@ class HelperFunctionsTests(unittest.Test
|
||||||
|
dirs = site.getsitepackages()
|
||||||
|
if os.sep == '/':
|
||||||
|
# OS X, Linux, FreeBSD, etc
|
||||||
|
- self.assertEqual(len(dirs), 1)
|
||||||
|
- wanted = os.path.join('xoxo', 'lib',
|
||||||
|
+ self.assertEqual(len(dirs), 2)
|
||||||
|
+ wanted = os.path.join('xoxo', 'lib64',
|
||||||
|
'python%d.%d' % sys.version_info[:2],
|
||||||
|
'site-packages')
|
||||||
|
self.assertEqual(dirs[0], wanted)
|
||||||
|
--- 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= $(prefix)/lib64
|
||||||
|
ABIFLAGS= @ABIFLAGS@
|
||||||
|
|
||||||
|
# Detailed destination directories
|
||||||
|
--- a/Modules/getpath.c
|
||||||
|
+++ b/Modules/getpath.c
|
||||||
|
@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *c
|
||||||
|
if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) {
|
||||||
|
return PATHLEN_ERR();
|
||||||
|
}
|
||||||
|
- status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len);
|
||||||
|
+ status = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len);
|
||||||
|
if (_PyStatus_EXCEPTION(status)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@@ -1067,7 +1067,7 @@ calculate_zip_path(PyCalculatePath *calc
|
||||||
|
return PATHLEN_ERR();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- status = joinpath(zip_path, L"lib/python00.zip", zip_path_len);
|
||||||
|
+ status = joinpath(zip_path, L"lib64/python00.zip", zip_path_len);
|
||||||
|
if (_PyStatus_EXCEPTION(status)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@@ -1197,7 +1197,7 @@ calculate_init(PyCalculatePath *calculat
|
||||||
|
if (!calculate->exec_prefix) {
|
||||||
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||||
|
}
|
||||||
|
- calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len);
|
||||||
|
+ calculate->lib_python = Py_DecodeLocale("lib64/python" VERSION, &len);
|
||||||
|
if (!calculate->lib_python) {
|
||||||
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||||
|
}
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -15188,9 +15188,9 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
if test x$PLATFORM_TRIPLET = x; then
|
||||||
|
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
|
||||||
|
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||||
|
else
|
||||||
|
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -4674,9 +4674,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='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||||
|
else
|
||||||
|
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
fi
|
||||||
|
AC_SUBST(LIBPL)
|
||||||
|
|
||||||
|
--- a/setup.py
|
||||||
|
+++ b/setup.py
|
||||||
|
@@ -649,7 +649,7 @@ class PyBuildExt(build_ext):
|
||||||
|
# directories (i.e. '.' and 'Include') must be first. See issue
|
||||||
|
# 10520.
|
||||||
|
if not CROSS_COMPILING:
|
||||||
|
- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
|
||||||
|
+ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib64')
|
||||||
|
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
|
||||||
|
# only change this for cross builds for 3.3, issues on Mageia
|
||||||
|
if CROSS_COMPILING:
|
||||||
|
@@ -953,11 +953,11 @@ class PyBuildExt(build_ext):
|
||||||
|
elif curses_library:
|
||||||
|
readline_libs.append(curses_library)
|
||||||
|
elif self.compiler.find_library_file(self.lib_dirs +
|
||||||
|
- ['/usr/lib/termcap'],
|
||||||
|
+ ['/usr/lib64/termcap'],
|
||||||
|
'termcap'):
|
||||||
|
readline_libs.append('termcap')
|
||||||
|
self.add(Extension('readline', ['readline.c'],
|
||||||
|
- library_dirs=['/usr/lib/termcap'],
|
||||||
|
+ library_dirs=['/usr/lib64/termcap'],
|
||||||
|
extra_link_args=readline_extra_link_args,
|
||||||
|
libraries=readline_libs))
|
||||||
|
else:
|
64
F00251-change-user-install-location.patch
Normal file
64
F00251-change-user-install-location.patch
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
From 910f38d9768d39d4d31426743ae4081ed1ab66b6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michal Cyprian <m.cyprian@gmail.com>
|
||||||
|
Date: Mon, 26 Jun 2017 16:32:56 +0200
|
||||||
|
Subject: [PATCH] 00251: Change user install location
|
||||||
|
|
||||||
|
Set values of prefix and exec_prefix in distutils install command
|
||||||
|
to /usr/local if executable is /usr/bin/python* and RPM build
|
||||||
|
is not detected to make pip and distutils install into separate location.
|
||||||
|
|
||||||
|
Fedora Change: https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||||
|
---
|
||||||
|
Lib/distutils/command/install.py | 15 +++++++++++++--
|
||||||
|
Lib/site.py | 9 ++++++++-
|
||||||
|
2 files changed, 21 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
|
||||||
|
index ae4f915669..0e4fd5b74a 100644
|
||||||
|
--- a/Lib/distutils/command/install.py
|
||||||
|
+++ b/Lib/distutils/command/install.py
|
||||||
|
@@ -418,8 +418,19 @@ class install(Command):
|
||||||
|
raise DistutilsOptionError(
|
||||||
|
"must not supply exec-prefix without prefix")
|
||||||
|
|
||||||
|
- self.prefix = os.path.normpath(sys.prefix)
|
||||||
|
- self.exec_prefix = os.path.normpath(sys.exec_prefix)
|
||||||
|
+ # self.prefix is set to sys.prefix + /local/
|
||||||
|
+ # if neither RPM build nor virtual environment is
|
||||||
|
+ # detected to make pip and distutils install packages
|
||||||
|
+ # into the separate location.
|
||||||
|
+ if (not (hasattr(sys, 'real_prefix') or
|
||||||
|
+ sys.prefix != sys.base_prefix) and
|
||||||
|
+ 'RPM_BUILD_ROOT' not in os.environ):
|
||||||
|
+ addition = "/local"
|
||||||
|
+ else:
|
||||||
|
+ addition = ""
|
||||||
|
+
|
||||||
|
+ self.prefix = os.path.normpath(sys.prefix) + addition
|
||||||
|
+ self.exec_prefix = os.path.normpath(sys.exec_prefix) + addition
|
||||||
|
|
||||||
|
else:
|
||||||
|
if self.exec_prefix is None:
|
||||||
|
diff --git a/Lib/site.py b/Lib/site.py
|
||||||
|
index 22d53fa562..9513526109 100644
|
||||||
|
--- a/Lib/site.py
|
||||||
|
+++ b/Lib/site.py
|
||||||
|
@@ -348,7 +348,14 @@ def getsitepackages(prefixes=None):
|
||||||
|
return sitepackages
|
||||||
|
|
||||||
|
def addsitepackages(known_paths, prefixes=None):
|
||||||
|
- """Add site-packages to sys.path"""
|
||||||
|
+ """Add site-packages to sys.path
|
||||||
|
+
|
||||||
|
+ '/usr/local' is included in PREFIXES if RPM build is not detected
|
||||||
|
+ to make packages installed into this location visible.
|
||||||
|
+
|
||||||
|
+ """
|
||||||
|
+ if ENABLE_USER_SITE and 'RPM_BUILD_ROOT' not in os.environ:
|
||||||
|
+ PREFIXES.insert(0, "/usr/local")
|
||||||
|
for sitedir in getsitepackages(prefixes):
|
||||||
|
if os.path.isdir(sitedir):
|
||||||
|
addsitedir(sitedir, known_paths)
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
175
OBS_dev-shm.patch
Normal file
175
OBS_dev-shm.patch
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
From 0edba4a774f8fc6867d49ebd2d9c6831901e30dd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Victor Stinner <vstinner@python.org>
|
||||||
|
Date: Wed, 17 Jun 2020 17:53:48 +0200
|
||||||
|
Subject: [PATCH] bpo-38377: Add
|
||||||
|
support.skip_if_broken_multiprocessing_synchronize()
|
||||||
|
|
||||||
|
On Linux, skip tests using multiprocessing if the current user cannot
|
||||||
|
create a file in /dev/shm/ directory. Add the
|
||||||
|
skip_if_broken_multiprocessing_synchronize() function to the
|
||||||
|
test.support module.
|
||||||
|
---
|
||||||
|
Doc/library/test.rst | 8 +++++++
|
||||||
|
Lib/test/_test_multiprocessing.py | 2 +-
|
||||||
|
Lib/test/support/__init__.py | 22 +++++++++++++++++++
|
||||||
|
Lib/test/test_asyncio/test_events.py | 4 ++--
|
||||||
|
Lib/test/test_concurrent_futures.py | 2 +-
|
||||||
|
Lib/test/test_logging.py | 8 +++----
|
||||||
|
.../test_multiprocessing_main_handling.py | 2 +-
|
||||||
|
Lib/test/test_venv.py | 8 ++++---
|
||||||
|
.../2020-06-17-18-00-21.bpo-38377.jfg4TH.rst | 4 ++++
|
||||||
|
9 files changed, 48 insertions(+), 12 deletions(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst
|
||||||
|
|
||||||
|
--- a/Doc/library/test.rst
|
||||||
|
+++ b/Doc/library/test.rst
|
||||||
|
@@ -1282,6 +1282,14 @@ The :mod:`test.support` module defines t
|
||||||
|
|
||||||
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
+.. function:: skip_if_broken_multiprocessing_synchronize()
|
||||||
|
+
|
||||||
|
+ Skip tests if the :mod:`multiprocessing.synchronize` module is missing, if
|
||||||
|
+ there is no available semaphore implementation, or if creating a lock raises
|
||||||
|
+ an :exc:`OSError`.
|
||||||
|
+
|
||||||
|
+ .. versionadded:: 3.10
|
||||||
|
+
|
||||||
|
|
||||||
|
The :mod:`test.support` module defines the following classes:
|
||||||
|
|
||||||
|
--- a/Lib/test/_test_multiprocessing.py
|
||||||
|
+++ b/Lib/test/_test_multiprocessing.py
|
||||||
|
@@ -31,7 +31,7 @@ from test import support
|
||||||
|
# Skip tests if _multiprocessing wasn't built.
|
||||||
|
_multiprocessing = test.support.import_module('_multiprocessing')
|
||||||
|
# Skip tests if sem_open implementation is broken.
|
||||||
|
-test.support.import_module('multiprocessing.synchronize')
|
||||||
|
+support.skip_if_broken_multiprocessing_synchronize()
|
||||||
|
import threading
|
||||||
|
|
||||||
|
import multiprocessing.connection
|
||||||
|
--- a/Lib/test/support/__init__.py
|
||||||
|
+++ b/Lib/test/support/__init__.py
|
||||||
|
@@ -3350,3 +3350,25 @@ class catch_threading_exception:
|
||||||
|
del self.exc_value
|
||||||
|
del self.exc_traceback
|
||||||
|
del self.thread
|
||||||
|
+
|
||||||
|
+def skip_if_broken_multiprocessing_synchronize():
|
||||||
|
+ """
|
||||||
|
+ Skip tests if the multiprocessing.synchronize module is missing, if there
|
||||||
|
+ is no available semaphore implementation, or if creating a lock raises an
|
||||||
|
+ OSError.
|
||||||
|
+ """
|
||||||
|
+
|
||||||
|
+ # Skip tests if the _multiprocessing extension is missing.
|
||||||
|
+ import_module('_multiprocessing')
|
||||||
|
+
|
||||||
|
+ # Skip tests if there is no available semaphore implementation:
|
||||||
|
+ # multiprocessing.synchronize requires _multiprocessing.SemLock.
|
||||||
|
+ synchronize = import_module('multiprocessing.synchronize')
|
||||||
|
+
|
||||||
|
+ try:
|
||||||
|
+ # bpo-38377: On Linux, creating a semaphore is the current user
|
||||||
|
+ # does not have the permission to create a file in /dev/shm.
|
||||||
|
+ # Create a semaphore to check permissions.
|
||||||
|
+ synchronize.Lock(ctx=None)
|
||||||
|
+ except OSError as exc:
|
||||||
|
+ raise unittest.SkipTest(f"broken multiprocessing SemLock: {exc!r}")
|
||||||
|
--- a/Lib/test/test_asyncio/test_events.py
|
||||||
|
+++ b/Lib/test/test_asyncio/test_events.py
|
||||||
|
@@ -2635,10 +2635,10 @@ class GetEventLoopTestsMixin:
|
||||||
|
if sys.platform != 'win32':
|
||||||
|
|
||||||
|
def test_get_event_loop_new_process(self):
|
||||||
|
- # Issue bpo-32126: The multiprocessing module used by
|
||||||
|
+ # bpo-32126: The multiprocessing module used by
|
||||||
|
# ProcessPoolExecutor is not functional when the
|
||||||
|
# multiprocessing.synchronize module cannot be imported.
|
||||||
|
- support.import_module('multiprocessing.synchronize')
|
||||||
|
+ support.skip_if_broken_multiprocessing_synchronize()
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
pool = concurrent.futures.ProcessPoolExecutor()
|
||||||
|
--- a/Lib/test/test_concurrent_futures.py
|
||||||
|
+++ b/Lib/test/test_concurrent_futures.py
|
||||||
|
@@ -3,7 +3,7 @@ import test.support
|
||||||
|
# Skip tests if _multiprocessing wasn't built.
|
||||||
|
test.support.import_module('_multiprocessing')
|
||||||
|
# Skip tests if sem_open implementation is broken.
|
||||||
|
-test.support.import_module('multiprocessing.synchronize')
|
||||||
|
+test.support.skip_if_broken_multiprocessing_synchronize()
|
||||||
|
|
||||||
|
from test.support.script_helper import assert_python_ok
|
||||||
|
|
||||||
|
--- a/Lib/test/test_logging.py
|
||||||
|
+++ b/Lib/test/test_logging.py
|
||||||
|
@@ -3621,9 +3621,9 @@ if hasattr(logging.handlers, 'QueueListe
|
||||||
|
|
||||||
|
@patch.object(logging.handlers.QueueListener, 'handle')
|
||||||
|
def test_handle_called_with_mp_queue(self, mock_handle):
|
||||||
|
- # Issue 28668: The multiprocessing (mp) module is not functional
|
||||||
|
+ # bpo-28668: The multiprocessing (mp) module is not functional
|
||||||
|
# when the mp.synchronize module cannot be imported.
|
||||||
|
- support.import_module('multiprocessing.synchronize')
|
||||||
|
+ support.skip_if_broken_multiprocessing_synchronize()
|
||||||
|
for i in range(self.repeat):
|
||||||
|
log_queue = multiprocessing.Queue()
|
||||||
|
self.setup_and_log(log_queue, '%s_%s' % (self.id(), i))
|
||||||
|
@@ -3647,9 +3647,9 @@ if hasattr(logging.handlers, 'QueueListe
|
||||||
|
indicates that messages were not registered on the queue until
|
||||||
|
_after_ the QueueListener stopped.
|
||||||
|
"""
|
||||||
|
- # Issue 28668: The multiprocessing (mp) module is not functional
|
||||||
|
+ # bpo-28668: The multiprocessing (mp) module is not functional
|
||||||
|
# when the mp.synchronize module cannot be imported.
|
||||||
|
- support.import_module('multiprocessing.synchronize')
|
||||||
|
+ support.skip_if_broken_multiprocessing_synchronize()
|
||||||
|
for i in range(self.repeat):
|
||||||
|
queue = multiprocessing.Queue()
|
||||||
|
self.setup_and_log(queue, '%s_%s' %(self.id(), i))
|
||||||
|
--- a/Lib/test/test_multiprocessing_main_handling.py
|
||||||
|
+++ b/Lib/test/test_multiprocessing_main_handling.py
|
||||||
|
@@ -23,7 +23,7 @@ import multiprocessing
|
||||||
|
AVAILABLE_START_METHODS = set(multiprocessing.get_all_start_methods())
|
||||||
|
|
||||||
|
# Issue #22332: Skip tests if sem_open implementation is broken.
|
||||||
|
-support.import_module('multiprocessing.synchronize')
|
||||||
|
+support.skip_if_broken_multiprocessing_synchronize()
|
||||||
|
|
||||||
|
verbose = support.verbose
|
||||||
|
|
||||||
|
--- a/Lib/test/test_venv.py
|
||||||
|
+++ b/Lib/test/test_venv.py
|
||||||
|
@@ -16,7 +16,8 @@ import sys
|
||||||
|
import tempfile
|
||||||
|
from test.support import (captured_stdout, captured_stderr, requires_zlib,
|
||||||
|
can_symlink, EnvironmentVarGuard, rmtree,
|
||||||
|
- import_module)
|
||||||
|
+ import_module,
|
||||||
|
+ skip_if_broken_multiprocessing_synchronize)
|
||||||
|
import threading
|
||||||
|
import unittest
|
||||||
|
import venv
|
||||||
|
@@ -324,10 +325,11 @@ class BasicTest(BaseTest):
|
||||||
|
"""
|
||||||
|
Test that the multiprocessing is able to spawn.
|
||||||
|
"""
|
||||||
|
- # Issue bpo-36342: Instanciation of a Pool object imports the
|
||||||
|
+ # bpo-36342: Instantiation of a Pool object imports the
|
||||||
|
# multiprocessing.synchronize module. Skip the test if this module
|
||||||
|
# cannot be imported.
|
||||||
|
- import_module('multiprocessing.synchronize')
|
||||||
|
+ skip_if_broken_multiprocessing_synchronize()
|
||||||
|
+
|
||||||
|
rmtree(self.env_dir)
|
||||||
|
self.run_with_capture(venv.create, self.env_dir)
|
||||||
|
envpy = os.path.join(os.path.realpath(self.env_dir),
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst
|
||||||
|
@@ -0,0 +1,4 @@
|
||||||
|
+On Linux, skip tests using multiprocessing if the current user cannot create
|
||||||
|
+a file in ``/dev/shm/`` directory. Add the
|
||||||
|
+:func:`~test.support.skip_if_broken_multiprocessing_synchronize` function to
|
||||||
|
+the :mod:`test.support` module.
|
26
PACKAGING-NOTES
Normal file
26
PACKAGING-NOTES
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Notes for packagers of Python3
|
||||||
|
==============================
|
||||||
|
|
||||||
|
0. Faster build turnaround
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
By default, python builds with profile-guided optimization. This needs
|
||||||
|
an additional run of the test suite and it is generally slow.
|
||||||
|
PGO build takes around 50 minutes.
|
||||||
|
|
||||||
|
For development, use "--without profileopt" option to disable PGO. This
|
||||||
|
shortens the build time to ~5 minutes including test suite.
|
||||||
|
|
||||||
|
1. import_failed.map
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This is a mechanism installed as part of python3-base, that places shim modules
|
||||||
|
on python's path (through a generated zzzz-import-failed-hooks.pth file, so that
|
||||||
|
it is imported as much at the end as makes sense; and an _import_failed subdir
|
||||||
|
of /usr/lib/pythonX.Y). Then when the user tries to import a module that is part
|
||||||
|
of a subpackage, the ImportError will contain a helpful message telling them
|
||||||
|
which missing subpackage to install.
|
||||||
|
|
||||||
|
This can sometimes cause problems on non-standard configurations, if the pth
|
||||||
|
gets included too early (for instance if you are using a script to include all
|
||||||
|
pths by hand in some strange order). Just something to look out for.
|
3
Python-3.8.3.tar.xz
Normal file
3
Python-3.8.3.tar.xz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:dfab5ec723c218082fe3d5d7ae17ecbdebffa9a1aea4d64aa3a2ecdd2e795864
|
||||||
|
size 17912964
|
16
Python-3.8.3.tar.xz.asc
Normal file
16
Python-3.8.3.tar.xz.asc
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQIzBAABCgAdFiEE4/8oOcBIslwITevpsmmV4xAlBWgFAl68Z1QACgkQsmmV4xAl
|
||||||
|
BWhdxQ/+PUi0er9eBEaWNaatCsEDXnBvrCs1OooL3WWJ2GC5zf3buMwj2pFOZf9D
|
||||||
|
YFFGdomhYhvRnyQCJQSXuWJXQaafzKAl1tvkgS2ycOnLvCJ/qw71SqorQxkMGK1m
|
||||||
|
TYZyLEapNkXrfDXRHfGybuVlNsHw9++abpEITqwucTWm9LiHZoF/zdK+JX/5RYQ0
|
||||||
|
bfb8819DMZEyCsF+S8Jo6ZNyEIQyQxidFFt5HbMllFwsgzu37P8RqGSIoVNFJ8n9
|
||||||
|
f7BWfXAIyGr7pIlJ+3qBYDXOeOx8iwIUxGu3Gbmiri+dlxz28Iei4mxPYHG4ji5B
|
||||||
|
3zMsqKcaVAMHzKuAwdF5ZbUg0DRRJweNoiDOsfKp0CI814pXmOLH0zi9OiLrxBzj
|
||||||
|
7v9H3dAPMC2f2zAFdNcjYVBRovCxIork/Lj3+6jGn67+8oV+eb23gnN5YpDAFAAu
|
||||||
|
ybtrt6fEi0uVJuxUl+MO5HkSmH3sLggVDskvuWPFLiuahcbSuiZoCvlB+osO9J0H
|
||||||
|
el/3Awv5TjckY/EVDt1T61aYLX0CHNcb8c/CjAf0OSd/96WxV3svtusllqcSYwiC
|
||||||
|
NxBRf0klpGn0Tpa+9hTAMc4dEKILgao1KsKiI8dj8YY3HcE0Lb3y9UdFcIDLCeqn
|
||||||
|
Sk5turYyKak7apZTY31/0eqqCUl/RlZwpmxVUUNViwR5F2ZPeAQ=
|
||||||
|
=jF/G
|
||||||
|
-----END PGP SIGNATURE-----
|
43
README.SUSE
Normal file
43
README.SUSE
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Python 3 in SUSE
|
||||||
|
==============
|
||||||
|
|
||||||
|
* Subpackages *
|
||||||
|
|
||||||
|
Python 3 is split into several subpackages, based on external dependencies.
|
||||||
|
The main package 'python3' has soft dependencies on all subpackages needed to
|
||||||
|
assemble the standard library; however, these might not all be installed by default.
|
||||||
|
|
||||||
|
If you attempt to import a module that is currently not installed, an ImportError is thrown,
|
||||||
|
with instructions to install the missing subpackage. Installing the subpackage might result
|
||||||
|
in installing libraries that the subpackage requires to function.
|
||||||
|
|
||||||
|
|
||||||
|
* ensurepip *
|
||||||
|
|
||||||
|
The 'ensurepip' module from Python 3 standard library (PEP 453) is supposed to deploy
|
||||||
|
a bundled copy of the pip installer. This makes no sense in a managed distribution like SUSE.
|
||||||
|
Instead, you need to install package 'python3-pip'. Usually this will be installed automatically
|
||||||
|
with 'python3'.
|
||||||
|
|
||||||
|
Using 'ensurepip' when pip is not installed will result in an ImportError with instructions
|
||||||
|
to install 'python3-pip'.
|
||||||
|
|
||||||
|
|
||||||
|
* Documentation *
|
||||||
|
|
||||||
|
You can find documentation in seprarate packages: python3-doc and
|
||||||
|
python3-doc-pdf. These contan following documents:
|
||||||
|
|
||||||
|
Tutorial, What's New in Python, Global Module Index, Library Reference,
|
||||||
|
Macintosh Module Reference, Installing Python Modules, Distributing Python
|
||||||
|
Modules, Language Reference, Extending and Embedding, Python/C API,
|
||||||
|
Documenting Python
|
||||||
|
|
||||||
|
The python3-doc package constains many text files from source tarball.
|
||||||
|
|
||||||
|
|
||||||
|
* Interactive mode *
|
||||||
|
|
||||||
|
Interactive mode is by default enhanced with of history and command completion.
|
||||||
|
If you don't like these features, you can unset the PYTHONSTARTUP variable
|
||||||
|
in your .profile or disable it system wide in /etc/profile.d/python.sh.
|
396
SUSE-FEDORA-multilib.patch
Normal file
396
SUSE-FEDORA-multilib.patch
Normal file
@ -0,0 +1,396 @@
|
|||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -4671,12 +4671,26 @@ else
|
||||||
|
LIBPYTHON=''
|
||||||
|
fi
|
||||||
|
|
||||||
|
+# platsubdir must be defined before LIBPL definition
|
||||||
|
+AC_MSG_CHECKING(for custom platsubdir)
|
||||||
|
+AC_ARG_WITH(custom-platsubdir,
|
||||||
|
+ [AS_HELP_STRING([--with-custom-platsubdir=<libdirname>],
|
||||||
|
+ [set the platsubdir name to a custom string])],
|
||||||
|
+ [],
|
||||||
|
+ [with_custom_platsubdir=yes])
|
||||||
|
+AS_CASE($with_custom_platsubdir,
|
||||||
|
+ [yes],[platsubdir=`basename ${libdir}`],
|
||||||
|
+ [no],[platsubdir=lib],
|
||||||
|
+ [platsubdir=$with_custom_platsubdir])
|
||||||
|
+AC_MSG_RESULT($platsubdir)
|
||||||
|
+AC_SUBST(platsubdir)
|
||||||
|
+
|
||||||
|
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
|
||||||
|
AC_SUBST(PY_ENABLE_SHARED)
|
||||||
|
if test x$PLATFORM_TRIPLET = x; then
|
||||||
|
- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||||
|
+ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}"
|
||||||
|
else
|
||||||
|
- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
+ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
fi
|
||||||
|
AC_SUBST(LIBPL)
|
||||||
|
|
||||||
|
--- a/Makefile.pre.in
|
||||||
|
+++ b/Makefile.pre.in
|
||||||
|
@@ -137,13 +137,16 @@ exec_prefix= @exec_prefix@
|
||||||
|
# Install prefix for data files
|
||||||
|
datarootdir= @datarootdir@
|
||||||
|
|
||||||
|
+# Name of "lib" directory under prefix
|
||||||
|
+platsubdir= @platsubdir@
|
||||||
|
+
|
||||||
|
# Expanded directories
|
||||||
|
BINDIR= @bindir@
|
||||||
|
LIBDIR= @libdir@
|
||||||
|
MANDIR= @mandir@
|
||||||
|
INCLUDEDIR= @includedir@
|
||||||
|
CONFINCLUDEDIR= $(exec_prefix)/include
|
||||||
|
-SCRIPTDIR= $(prefix)/lib64
|
||||||
|
+SCRIPTDIR= @libdir@
|
||||||
|
ABIFLAGS= @ABIFLAGS@
|
||||||
|
|
||||||
|
# Detailed destination directories
|
||||||
|
@@ -754,6 +757,7 @@ Modules/getpath.o: $(srcdir)/Modules/get
|
||||||
|
-DEXEC_PREFIX='"$(exec_prefix)"' \
|
||||||
|
-DVERSION='"$(VERSION)"' \
|
||||||
|
-DVPATH='"$(VPATH)"' \
|
||||||
|
+ -DPLATLIBDIR='"$(platsubdir)"' \
|
||||||
|
-o $@ $(srcdir)/Modules/getpath.c
|
||||||
|
|
||||||
|
Programs/python.o: $(srcdir)/Programs/python.c
|
||||||
|
--- a/Modules/getpath.c
|
||||||
|
+++ b/Modules/getpath.c
|
||||||
|
@@ -55,12 +55,12 @@
|
||||||
|
* pybuilddir.txt. If the landmark is found, we're done.
|
||||||
|
*
|
||||||
|
* For the remaining steps, the prefix landmark will always be
|
||||||
|
- * lib/python$VERSION/os.py and the exec_prefix will always be
|
||||||
|
- * lib/python$VERSION/lib-dynload, where $VERSION is Python's version
|
||||||
|
- * number as supplied by the Makefile. Note that this means that no more
|
||||||
|
- * build directory checking is performed; if the first step did not find
|
||||||
|
- * the landmarks, the assumption is that python is running from an
|
||||||
|
- * installed setup.
|
||||||
|
+ * $lib/python$VERSION/os.py and the exec_prefix will always be
|
||||||
|
+ * $lib/python$VERSION/lib-dynload, where $VERSION is Python's version
|
||||||
|
+ * number and $lib is PLATLIBDIR as supplied by the Makefile. Note that
|
||||||
|
+ * this means that no more build directory checking is performed; if the
|
||||||
|
+ * first step did not find the landmarks, the assumption is that python
|
||||||
|
+ * is running from an installed setup.
|
||||||
|
*
|
||||||
|
* Step 2. See if the $PYTHONHOME environment variable points to the
|
||||||
|
* installed location of the Python libraries. If $PYTHONHOME is set, then
|
||||||
|
@@ -86,7 +86,7 @@
|
||||||
|
* containing the shared library modules is appended. The environment
|
||||||
|
* variable $PYTHONPATH is inserted in front of it all. Finally, the
|
||||||
|
* prefix and exec_prefix globals are tweaked so they reflect the values
|
||||||
|
- * expected by other code, by stripping the "lib/python$VERSION/..." stuff
|
||||||
|
+ * expected by other code, by stripping the "$lib/python$VERSION/..." stuff
|
||||||
|
* off. If either points to the build directory, the globals are reset to
|
||||||
|
* the corresponding preprocessor variables (so sys.prefix will reflect the
|
||||||
|
* installation location, even though sys.path points into the build
|
||||||
|
@@ -105,8 +105,8 @@ extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
-#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH)
|
||||||
|
-#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined"
|
||||||
|
+#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) || !defined(PLATLIBDIR)
|
||||||
|
+#error "PREFIX, EXEC_PREFIX, VERSION, VPATH, and PLATLIBDIR must be constant defined"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LANDMARK
|
||||||
|
@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *c
|
||||||
|
if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) {
|
||||||
|
return PATHLEN_ERR();
|
||||||
|
}
|
||||||
|
- status = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len);
|
||||||
|
+ status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len);
|
||||||
|
if (_PyStatus_EXCEPTION(status)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@@ -1067,7 +1067,7 @@ calculate_zip_path(PyCalculatePath *calc
|
||||||
|
return PATHLEN_ERR();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- status = joinpath(zip_path, L"lib64/python00.zip", zip_path_len);
|
||||||
|
+ status = joinpath(zip_path, L"lib/python00.zip", zip_path_len);
|
||||||
|
if (_PyStatus_EXCEPTION(status)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@@ -1197,7 +1197,7 @@ calculate_init(PyCalculatePath *calculat
|
||||||
|
if (!calculate->exec_prefix) {
|
||||||
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||||
|
}
|
||||||
|
- calculate->lib_python = Py_DecodeLocale("lib64/python" VERSION, &len);
|
||||||
|
+ calculate->lib_python = Py_DecodeLocale(PLATLIBDIR "/python" VERSION, &len);
|
||||||
|
if (!calculate->lib_python) {
|
||||||
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||||
|
}
|
||||||
|
--- a/Lib/distutils/command/install.py
|
||||||
|
+++ b/Lib/distutils/command/install.py
|
||||||
|
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
|
||||||
|
INSTALL_SCHEMES = {
|
||||||
|
'unix_prefix': {
|
||||||
|
'purelib': '$base/lib/python$py_version_short/site-packages',
|
||||||
|
- 'platlib': '$platbase/lib64/python$py_version_short/site-packages',
|
||||||
|
+ 'platlib': '$platbase/$platsubdir/python$py_version_short/site-packages',
|
||||||
|
'headers': '$base/include/python$py_version_short$abiflags/$dist_name',
|
||||||
|
'scripts': '$base/bin',
|
||||||
|
'data' : '$base',
|
||||||
|
},
|
||||||
|
'unix_home': {
|
||||||
|
'purelib': '$base/lib/python',
|
||||||
|
- 'platlib': '$base/lib64/python',
|
||||||
|
+ 'platlib': '$base/lib/python',
|
||||||
|
'headers': '$base/include/python/$dist_name',
|
||||||
|
'scripts': '$base/bin',
|
||||||
|
'data' : '$base',
|
||||||
|
@@ -281,7 +281,7 @@ class install(Command):
|
||||||
|
# about needing recursive variable expansion (shudder).
|
||||||
|
|
||||||
|
py_version = sys.version.split()[0]
|
||||||
|
- (prefix, exec_prefix) = get_config_vars('prefix', 'exec_prefix')
|
||||||
|
+ (prefix, exec_prefix, platsubdir) = get_config_vars('prefix', 'exec_prefix', 'platsubdir')
|
||||||
|
try:
|
||||||
|
abiflags = sys.abiflags
|
||||||
|
except AttributeError:
|
||||||
|
@@ -298,6 +298,7 @@ class install(Command):
|
||||||
|
'sys_exec_prefix': exec_prefix,
|
||||||
|
'exec_prefix': exec_prefix,
|
||||||
|
'abiflags': abiflags,
|
||||||
|
+ 'platsubdir': platsubdir,
|
||||||
|
}
|
||||||
|
|
||||||
|
if HAS_USER_SITE:
|
||||||
|
@@ -419,12 +420,11 @@ class install(Command):
|
||||||
|
"must not supply exec-prefix without prefix")
|
||||||
|
|
||||||
|
# self.prefix is set to sys.prefix + /local/
|
||||||
|
- # if neither RPM build nor virtual environment is
|
||||||
|
- # detected to make pip and distutils install packages
|
||||||
|
- # into the separate location.
|
||||||
|
- if (not (hasattr(sys, 'real_prefix') or
|
||||||
|
- sys.prefix != sys.base_prefix) and
|
||||||
|
- 'RPM_BUILD_ROOT' not in os.environ):
|
||||||
|
+ # if the executable is /usr/bin/python* and RPM build
|
||||||
|
+ # is not detected to make pip and distutils install into
|
||||||
|
+ # the separate location.
|
||||||
|
+ if (sys.executable.startswith("/usr/bin/python")
|
||||||
|
+ and 'RPM_BUILD_ROOT' not in os.environ):
|
||||||
|
addition = "/local"
|
||||||
|
else:
|
||||||
|
addition = ""
|
||||||
|
--- a/Lib/distutils/sysconfig.py
|
||||||
|
+++ b/Lib/distutils/sysconfig.py
|
||||||
|
@@ -146,12 +146,9 @@ def get_python_lib(plat_specific=0, stan
|
||||||
|
prefix = plat_specific and EXEC_PREFIX or PREFIX
|
||||||
|
|
||||||
|
if os.name == "posix":
|
||||||
|
- if plat_specific or standard_lib:
|
||||||
|
- lib = "lib64"
|
||||||
|
- else:
|
||||||
|
- lib = "lib"
|
||||||
|
+ libdir = plat_specific and get_config_var("platsubdir") or "lib"
|
||||||
|
libpython = os.path.join(prefix,
|
||||||
|
- lib, "python" + get_python_version())
|
||||||
|
+ libdir, "python" + get_python_version())
|
||||||
|
if standard_lib:
|
||||||
|
return libpython
|
||||||
|
else:
|
||||||
|
--- a/Lib/sysconfig.py
|
||||||
|
+++ b/Lib/sysconfig.py
|
||||||
|
@@ -20,10 +20,10 @@ __all__ = [
|
||||||
|
|
||||||
|
_INSTALL_SCHEMES = {
|
||||||
|
'posix_prefix': {
|
||||||
|
- 'stdlib': '{installed_base}/lib64/python{py_version_short}',
|
||||||
|
- 'platstdlib': '{platbase}/lib64/python{py_version_short}',
|
||||||
|
+ 'stdlib': '{installed_base}/{platsubdir}/python{py_version_short}',
|
||||||
|
+ 'platstdlib': '{platbase}/{platsubdir}/python{py_version_short}',
|
||||||
|
'purelib': '{base}/lib/python{py_version_short}/site-packages',
|
||||||
|
- 'platlib': '{platbase}/lib64/python{py_version_short}/site-packages',
|
||||||
|
+ 'platlib': '{platbase}/{platsubdir}/python{py_version_short}/site-packages',
|
||||||
|
'include':
|
||||||
|
'{installed_base}/include/python{py_version_short}{abiflags}',
|
||||||
|
'platinclude':
|
||||||
|
@@ -62,10 +62,10 @@ _INSTALL_SCHEMES = {
|
||||||
|
'data': '{userbase}',
|
||||||
|
},
|
||||||
|
'posix_user': {
|
||||||
|
- 'stdlib': '{userbase}/lib64/python{py_version_short}',
|
||||||
|
- 'platstdlib': '{userbase}/lib64/python{py_version_short}',
|
||||||
|
+ 'stdlib': '{userbase}/lib/python{py_version_short}',
|
||||||
|
+ 'platstdlib': '{userbase}/lib/python{py_version_short}',
|
||||||
|
'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
|
||||||
|
- 'platlib': '{userbase}/lib64/python{py_version_short}/site-packages',
|
||||||
|
+ 'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
|
||||||
|
'include': '{userbase}/include/python{py_version_short}',
|
||||||
|
'scripts': '{userbase}/bin',
|
||||||
|
'data': '{userbase}',
|
||||||
|
--- a/Lib/site.py
|
||||||
|
+++ b/Lib/site.py
|
||||||
|
@@ -335,12 +335,18 @@ def getsitepackages(prefixes=None):
|
||||||
|
seen.add(prefix)
|
||||||
|
|
||||||
|
if os.sep == '/':
|
||||||
|
- sitepackages.append(os.path.join(prefix, "lib64",
|
||||||
|
+ from sysconfig import get_config_var
|
||||||
|
+ platsubdir = get_config_var("platsubdir")
|
||||||
|
+ sitepackages.append(os.path.join(prefix, platsubdir,
|
||||||
|
"python" + sys.version[:3],
|
||||||
|
"site-packages"))
|
||||||
|
- sitepackages.append(os.path.join(prefix, "lib",
|
||||||
|
+ sitepackages.append(os.path.join(prefix, platsubdir,
|
||||||
|
"python%d.%d" % sys.version_info[:2],
|
||||||
|
"site-packages"))
|
||||||
|
+ if platsubdir != "lib":
|
||||||
|
+ sitepackages.append(os.path.join(prefix, "lib",
|
||||||
|
+ "python%d.%d" % sys.version_info[:2],
|
||||||
|
+ "site-packages"))
|
||||||
|
else:
|
||||||
|
sitepackages.append(prefix)
|
||||||
|
sitepackages.append(os.path.join(prefix, "lib64", "site-packages"))
|
||||||
|
@@ -348,14 +354,7 @@ def getsitepackages(prefixes=None):
|
||||||
|
return sitepackages
|
||||||
|
|
||||||
|
def addsitepackages(known_paths, prefixes=None):
|
||||||
|
- """Add site-packages to sys.path
|
||||||
|
-
|
||||||
|
- '/usr/local' is included in PREFIXES if RPM build is not detected
|
||||||
|
- to make packages installed into this location visible.
|
||||||
|
-
|
||||||
|
- """
|
||||||
|
- if ENABLE_USER_SITE and 'RPM_BUILD_ROOT' not in os.environ:
|
||||||
|
- PREFIXES.insert(0, "/usr/local")
|
||||||
|
+ """Add site-packages to sys.path"""
|
||||||
|
for sitedir in getsitepackages(prefixes):
|
||||||
|
if os.path.isdir(sitedir):
|
||||||
|
addsitedir(sitedir, known_paths)
|
||||||
|
--- a/Lib/test/test_site.py
|
||||||
|
+++ b/Lib/test/test_site.py
|
||||||
|
@@ -266,8 +266,11 @@ class HelperFunctionsTests(unittest.Test
|
||||||
|
dirs = site.getsitepackages()
|
||||||
|
if os.sep == '/':
|
||||||
|
# OS X, Linux, FreeBSD, etc
|
||||||
|
- self.assertEqual(len(dirs), 2)
|
||||||
|
- wanted = os.path.join('xoxo', 'lib64',
|
||||||
|
+ self.assertTrue(len(dirs) in (1,2,3),
|
||||||
|
+ "dirs = {} has len not in (1,2,3).".format(dirs))
|
||||||
|
+
|
||||||
|
+ platsubdir = sysconfig.get_config_var('platsubdir')
|
||||||
|
+ wanted = os.path.join('xoxo', platsubdir,
|
||||||
|
'python%d.%d' % sys.version_info[:2],
|
||||||
|
'site-packages')
|
||||||
|
self.assertEqual(dirs[0], wanted)
|
||||||
|
--- a/Lib/test/test_sysconfig.py
|
||||||
|
+++ b/Lib/test/test_sysconfig.py
|
||||||
|
@@ -243,6 +243,7 @@ class TestSysConfig(unittest.TestCase):
|
||||||
|
# is similar to the global posix_prefix one
|
||||||
|
base = get_config_var('base')
|
||||||
|
user = get_config_var('userbase')
|
||||||
|
+ platsubdir = get_config_var("platsubdir")
|
||||||
|
# the global scheme mirrors the distinction between prefix and
|
||||||
|
# exec-prefix but not the user scheme, so we have to adapt the paths
|
||||||
|
# before comparing (issue #9100)
|
||||||
|
@@ -257,8 +258,19 @@ class TestSysConfig(unittest.TestCase):
|
||||||
|
# before comparing
|
||||||
|
global_path = global_path.replace(sys.base_prefix, sys.prefix)
|
||||||
|
base = base.replace(sys.base_prefix, sys.prefix)
|
||||||
|
+
|
||||||
|
+ if platsubdir != "lib":
|
||||||
|
+ platbase = os.path.join(base, platsubdir)
|
||||||
|
+ purebase = os.path.join(base, "lib")
|
||||||
|
+ userlib = os.path.join(user, "lib")
|
||||||
|
+ # replace platbase first because usually purebase is a prefix of platbase
|
||||||
|
+ # /usr/lib is prefix of /usr/lib64 and would get replaced first
|
||||||
|
+ modified_path = global_path.replace(platbase, userlib, 1).replace(purebase, userlib, 1)
|
||||||
|
+ else:
|
||||||
|
+ modified_path = global_path.replace(base, user, 1)
|
||||||
|
+
|
||||||
|
user_path = get_path(name, 'posix_user')
|
||||||
|
- self.assertEqual(user_path, global_path.replace(base, user, 1))
|
||||||
|
+ self.assertEqual(user_path, modified_path)
|
||||||
|
|
||||||
|
def test_main(self):
|
||||||
|
# just making sure _main() runs and returns things in the stdout
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -15188,9 +15188,9 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
if test x$PLATFORM_TRIPLET = x; then
|
||||||
|
- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||||
|
+ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}"
|
||||||
|
else
|
||||||
|
- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
+ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
--- a/setup.py
|
||||||
|
+++ b/setup.py
|
||||||
|
@@ -649,7 +649,7 @@ class PyBuildExt(build_ext):
|
||||||
|
# directories (i.e. '.' and 'Include') must be first. See issue
|
||||||
|
# 10520.
|
||||||
|
if not CROSS_COMPILING:
|
||||||
|
- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib64')
|
||||||
|
+ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
|
||||||
|
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
|
||||||
|
# only change this for cross builds for 3.3, issues on Mageia
|
||||||
|
if CROSS_COMPILING:
|
||||||
|
@@ -953,11 +953,11 @@ class PyBuildExt(build_ext):
|
||||||
|
elif curses_library:
|
||||||
|
readline_libs.append(curses_library)
|
||||||
|
elif self.compiler.find_library_file(self.lib_dirs +
|
||||||
|
- ['/usr/lib64/termcap'],
|
||||||
|
+ ['/usr/lib/termcap'],
|
||||||
|
'termcap'):
|
||||||
|
readline_libs.append('termcap')
|
||||||
|
self.add(Extension('readline', ['readline.c'],
|
||||||
|
- library_dirs=['/usr/lib64/termcap'],
|
||||||
|
+ library_dirs=['/usr/lib/termcap'],
|
||||||
|
extra_link_args=readline_extra_link_args,
|
||||||
|
libraries=readline_libs))
|
||||||
|
else:
|
||||||
|
--- a/Lib/test/test_embed.py
|
||||||
|
+++ b/Lib/test/test_embed.py
|
||||||
|
@@ -10,6 +10,7 @@ import re
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
+import sysconfig
|
||||||
|
import tempfile
|
||||||
|
import textwrap
|
||||||
|
|
||||||
|
@@ -1070,12 +1071,13 @@ class InitConfigTests(EmbeddingTestsMixi
|
||||||
|
return config['config']['module_search_paths']
|
||||||
|
else:
|
||||||
|
ver = sys.version_info
|
||||||
|
+ platsubdir = sysconfig.get_config_var('platsubdir')
|
||||||
|
return [
|
||||||
|
os.path.join(prefix, 'lib',
|
||||||
|
f'python{ver.major}{ver.minor}.zip'),
|
||||||
|
- os.path.join(prefix, 'lib',
|
||||||
|
+ os.path.join(prefix, platsubdir,
|
||||||
|
f'python{ver.major}.{ver.minor}'),
|
||||||
|
- os.path.join(exec_prefix, 'lib',
|
||||||
|
+ os.path.join(exec_prefix, platsubdir,
|
||||||
|
f'python{ver.major}.{ver.minor}', 'lib-dynload'),
|
||||||
|
]
|
||||||
|
|
||||||
|
@@ -1180,13 +1182,15 @@ class InitConfigTests(EmbeddingTestsMixi
|
||||||
|
def test_init_pyvenv_cfg(self):
|
||||||
|
# Test path configuration with pyvenv.cfg configuration file
|
||||||
|
|
||||||
|
+ platsubdir = sysconfig.get_config_var('platsubdir')
|
||||||
|
+
|
||||||
|
with self.tmpdir_with_python() as tmpdir, \
|
||||||
|
tempfile.TemporaryDirectory() as pyvenv_home:
|
||||||
|
ver = sys.version_info
|
||||||
|
|
||||||
|
if not MS_WINDOWS:
|
||||||
|
lib_dynload = os.path.join(pyvenv_home,
|
||||||
|
- 'lib',
|
||||||
|
+ platsubdir,
|
||||||
|
f'python{ver.major}.{ver.minor}',
|
||||||
|
'lib-dynload')
|
||||||
|
os.makedirs(lib_dynload)
|
4
_multibuild
Normal file
4
_multibuild
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<multibuild>
|
||||||
|
<package>base</package>
|
||||||
|
<package>doc</package>
|
||||||
|
</multibuild>
|
3
baselibs.conf
Normal file
3
baselibs.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
python3-base
|
||||||
|
python3
|
||||||
|
libpython3_8-1_0
|
163
bpo-31046_ensurepip_honours_prefix.patch
Normal file
163
bpo-31046_ensurepip_honours_prefix.patch
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
From 5754521af1d51aa8e445cba07a093bbc0c88596d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zackery Spytz <zspytz@gmail.com>
|
||||||
|
Date: Mon, 16 Dec 2019 18:24:08 -0700
|
||||||
|
Subject: [PATCH] bpo-31046: ensurepip does not honour the value of $(prefix)
|
||||||
|
|
||||||
|
Co-Authored-By: Xavier de Gaye <xdegaye@gmail.com>
|
||||||
|
---
|
||||||
|
Doc/library/ensurepip.rst | 9 +++++++--
|
||||||
|
Lib/ensurepip/__init__.py | 18 +++++++++++++-----
|
||||||
|
Lib/test/test_ensurepip.py | 11 +++++++++++
|
||||||
|
Makefile.pre.in | 4 ++--
|
||||||
|
.../2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst | 1 +
|
||||||
|
5 files changed, 34 insertions(+), 9 deletions(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst
|
||||||
|
|
||||||
|
--- a/Doc/library/ensurepip.rst
|
||||||
|
+++ b/Doc/library/ensurepip.rst
|
||||||
|
@@ -56,8 +56,9 @@ is at least as recent as the one bundled
|
||||||
|
By default, ``pip`` is installed into the current virtual environment
|
||||||
|
(if one is active) or into the system site packages (if there is no
|
||||||
|
active virtual environment). The installation location can be controlled
|
||||||
|
-through two additional command line options:
|
||||||
|
+through some additional command line options:
|
||||||
|
|
||||||
|
+* ``--prefix <dir>``: Installs ``pip`` using the given directory prefix.
|
||||||
|
* ``--root <dir>``: Installs ``pip`` relative to the given root directory
|
||||||
|
rather than the root of the currently active virtual environment (if any)
|
||||||
|
or the default root for the current Python installation.
|
||||||
|
@@ -89,7 +90,7 @@ Module API
|
||||||
|
Returns a string specifying the bundled version of pip that will be
|
||||||
|
installed when bootstrapping an environment.
|
||||||
|
|
||||||
|
-.. function:: bootstrap(root=None, upgrade=False, user=False, \
|
||||||
|
+.. function:: bootstrap(root=None, prefix=None, upgrade=False, user=False, \
|
||||||
|
altinstall=False, default_pip=False, \
|
||||||
|
verbosity=0)
|
||||||
|
|
||||||
|
@@ -99,6 +100,8 @@ Module API
|
||||||
|
If *root* is ``None``, then installation uses the default install location
|
||||||
|
for the current environment.
|
||||||
|
|
||||||
|
+ *prefix* specifies the directory prefix to use when installing.
|
||||||
|
+
|
||||||
|
*upgrade* indicates whether or not to upgrade an existing installation
|
||||||
|
of an earlier version of ``pip`` to the bundled version.
|
||||||
|
|
||||||
|
@@ -119,6 +122,8 @@ Module API
|
||||||
|
*verbosity* controls the level of output to :data:`sys.stdout` from the
|
||||||
|
bootstrapping operation.
|
||||||
|
|
||||||
|
+ .. versionchanged:: 3.9 the *prefix* parameter was added.
|
||||||
|
+
|
||||||
|
.. audit-event:: ensurepip.bootstrap root ensurepip.bootstrap
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
--- a/Lib/ensurepip/__init__.py
|
||||||
|
+++ b/Lib/ensurepip/__init__.py
|
||||||
|
@@ -46,27 +46,27 @@ def _disable_pip_configuration_settings(
|
||||||
|
os.environ['PIP_CONFIG_FILE'] = os.devnull
|
||||||
|
|
||||||
|
|
||||||
|
-def bootstrap(*, root=None, upgrade=False, user=False,
|
||||||
|
+def bootstrap(*, root=None, prefix=None, upgrade=False, user=False,
|
||||||
|
altinstall=False, default_pip=False,
|
||||||
|
verbosity=0):
|
||||||
|
"""
|
||||||
|
Bootstrap pip into the current Python installation (or the given root
|
||||||
|
- directory).
|
||||||
|
+ and directory prefix).
|
||||||
|
|
||||||
|
Note that calling this function will alter both sys.path and os.environ.
|
||||||
|
"""
|
||||||
|
# Discard the return value
|
||||||
|
- _bootstrap(root=root, upgrade=upgrade, user=user,
|
||||||
|
+ _bootstrap(root=root, prefix=prefix, upgrade=upgrade, user=user,
|
||||||
|
altinstall=altinstall, default_pip=default_pip,
|
||||||
|
verbosity=verbosity)
|
||||||
|
|
||||||
|
|
||||||
|
-def _bootstrap(*, root=None, upgrade=False, user=False,
|
||||||
|
+def _bootstrap(*, root=None, prefix=None, upgrade=False, user=False,
|
||||||
|
altinstall=False, default_pip=False,
|
||||||
|
verbosity=0):
|
||||||
|
"""
|
||||||
|
Bootstrap pip into the current Python installation (or the given root
|
||||||
|
- directory). Returns pip command status code.
|
||||||
|
+ and directory prefix). Returns pip command status code.
|
||||||
|
|
||||||
|
Note that calling this function will alter both sys.path and os.environ.
|
||||||
|
"""
|
||||||
|
@@ -109,6 +109,8 @@ def _bootstrap(*, root=None, upgrade=Fal
|
||||||
|
args = ["install", "--no-index", "--find-links", tmpdir]
|
||||||
|
if root:
|
||||||
|
args += ["--root", root]
|
||||||
|
+ if prefix:
|
||||||
|
+ args += ["--prefix", prefix]
|
||||||
|
if upgrade:
|
||||||
|
args += ["--upgrade"]
|
||||||
|
if user:
|
||||||
|
@@ -181,6 +183,11 @@ def _main(argv=None):
|
||||||
|
help="Install everything relative to this alternate root directory.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
+ "--prefix",
|
||||||
|
+ default=None,
|
||||||
|
+ help="Install everything using this prefix.",
|
||||||
|
+ )
|
||||||
|
+ parser.add_argument(
|
||||||
|
"--altinstall",
|
||||||
|
action="store_true",
|
||||||
|
default=False,
|
||||||
|
@@ -199,6 +206,7 @@ def _main(argv=None):
|
||||||
|
|
||||||
|
return _bootstrap(
|
||||||
|
root=args.root,
|
||||||
|
+ prefix=args.prefix,
|
||||||
|
upgrade=args.upgrade,
|
||||||
|
user=args.user,
|
||||||
|
verbosity=args.verbosity,
|
||||||
|
--- a/Lib/test/test_ensurepip.py
|
||||||
|
+++ b/Lib/test/test_ensurepip.py
|
||||||
|
@@ -61,6 +61,17 @@ class TestBootstrap(EnsurepipMixin, unit
|
||||||
|
unittest.mock.ANY,
|
||||||
|
)
|
||||||
|
|
||||||
|
+ def test_bootstrapping_with_prefix(self):
|
||||||
|
+ ensurepip.bootstrap(prefix="/foo/bar/")
|
||||||
|
+ self.run_pip.assert_called_once_with(
|
||||||
|
+ [
|
||||||
|
+ "install", "--no-index", "--find-links",
|
||||||
|
+ unittest.mock.ANY, "--prefix", "/foo/bar/",
|
||||||
|
+ "setuptools", "pip",
|
||||||
|
+ ],
|
||||||
|
+ unittest.mock.ANY,
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
def test_bootstrapping_with_user(self):
|
||||||
|
ensurepip.bootstrap(user=True)
|
||||||
|
|
||||||
|
--- a/Makefile.pre.in
|
||||||
|
+++ b/Makefile.pre.in
|
||||||
|
@@ -1188,7 +1188,7 @@ install: @FRAMEWORKINSTALLFIRST@ commoni
|
||||||
|
install|*) ensurepip="" ;; \
|
||||||
|
esac; \
|
||||||
|
$(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \
|
||||||
|
- $$ensurepip --root=$(DESTDIR)/ ; \
|
||||||
|
+ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
altinstall: commoninstall
|
||||||
|
@@ -1198,7 +1198,7 @@ altinstall: commoninstall
|
||||||
|
install|*) ensurepip="--altinstall" ;; \
|
||||||
|
esac; \
|
||||||
|
$(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \
|
||||||
|
- $$ensurepip --root=$(DESTDIR)/ ; \
|
||||||
|
+ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
commoninstall: check-clean-src @FRAMEWORKALTINSTALLFIRST@ \
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+A directory prefix can now be specified when using :mod:`ensurepip`.
|
152
bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch
Normal file
152
bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
From 2c096b513273a758b446405d9e5efe4860af1036 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Elvis Pranskevichus <elvis@magic.io>
|
||||||
|
Date: Thu, 27 Sep 2018 13:05:14 -0400
|
||||||
|
Subject: [PATCH] bpo-34022: Stop forcing of hash-based invalidation with
|
||||||
|
SOURCE_DATE_EPOCH
|
||||||
|
|
||||||
|
Unconditional forcing of ``CHECKED_HASH`` invalidation was introduced in
|
||||||
|
3.7.0 in bpo-29708. The change is bad, as it unconditionally overrides
|
||||||
|
*invalidation_mode*, even if it was passed as an explicit argument to
|
||||||
|
``py_compile.compile()`` or ``compileall``. An environment variable
|
||||||
|
should *never* override an explicit argument to a library function.
|
||||||
|
That change leads to multiple test failures if the ``SOURCE_DATE_EPOCH``
|
||||||
|
environment variable is set.
|
||||||
|
|
||||||
|
This changes ``py_compile.compile()`` to only look at
|
||||||
|
``SOURCE_DATE_EPOCH`` if no explicit *invalidation_mode* was specified.
|
||||||
|
I also made various relevant tests run with explicit control over the
|
||||||
|
value of ``SOURCE_DATE_EPOCH``.
|
||||||
|
|
||||||
|
While looking at this, I noticed that ``zipimport`` does not work
|
||||||
|
with hash-based .pycs _at all_, though I left the fixes for
|
||||||
|
subsequent commits.
|
||||||
|
---
|
||||||
|
Doc/library/compileall.rst | 11 ++--
|
||||||
|
Doc/library/py_compile.rst | 13 ++--
|
||||||
|
Lib/compileall.py | 20 ++++--
|
||||||
|
Lib/py_compile.py | 13 +++-
|
||||||
|
Lib/test/test_compileall.py | 50 ++++++++++++--
|
||||||
|
.../test_importlib/source/test_file_loader.py | 15 +++++
|
||||||
|
Lib/test/test_py_compile.py | 66 +++++++++++++++++--
|
||||||
|
.../2018-09-27-13-14-15.bpo-34022.E2cl0r.rst | 3 +
|
||||||
|
8 files changed, 161 insertions(+), 30 deletions(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Library/2018-09-27-13-14-15.bpo-34022.E2cl0r.rst
|
||||||
|
|
||||||
|
--- a/Doc/library/py_compile.rst
|
||||||
|
+++ b/Doc/library/py_compile.rst
|
||||||
|
@@ -92,6 +92,11 @@ byte-code cache files in the directory c
|
||||||
|
.. versionchanged:: 3.8
|
||||||
|
The *quiet* parameter was added.
|
||||||
|
|
||||||
|
+ .. versionchanged:: 3.7.2
|
||||||
|
+ The :envvar:`SOURCE_DATE_EPOCH` environment variable no longer
|
||||||
|
+ overrides the value of the *invalidation_mode* argument, and determines
|
||||||
|
+ its default value instead.
|
||||||
|
+
|
||||||
|
|
||||||
|
.. class:: PycInvalidationMode
|
||||||
|
|
||||||
|
--- a/Lib/test/test_compileall.py
|
||||||
|
+++ b/Lib/test/test_compileall.py
|
||||||
|
@@ -209,6 +209,21 @@ class CompileallTestsWithoutSourceEpoch(
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
+
|
||||||
|
+class CompileallTestsWithSourceEpoch(CompileallTestsBase,
|
||||||
|
+ unittest.TestCase,
|
||||||
|
+ metaclass=SourceDateEpochTestMeta,
|
||||||
|
+ source_date_epoch=True):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class CompileallTestsWithoutSourceEpoch(CompileallTestsBase,
|
||||||
|
+ unittest.TestCase,
|
||||||
|
+ metaclass=SourceDateEpochTestMeta,
|
||||||
|
+ source_date_epoch=False):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
class EncodingTest(unittest.TestCase):
|
||||||
|
"""Issue 6716: compileall should escape source code when printing errors
|
||||||
|
to stdout."""
|
||||||
|
@@ -579,6 +594,21 @@ class CommandLineTestsBase:
|
||||||
|
|
||||||
|
|
||||||
|
class CommmandLineTestsWithSourceEpoch(CommandLineTestsBase,
|
||||||
|
+ unittest.TestCase,
|
||||||
|
+ metaclass=SourceDateEpochTestMeta,
|
||||||
|
+ source_date_epoch=True):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class CommmandLineTestsNoSourceEpoch(CommandLineTestsBase,
|
||||||
|
+ unittest.TestCase,
|
||||||
|
+ metaclass=SourceDateEpochTestMeta,
|
||||||
|
+ source_date_epoch=False):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class CommmandLineTestsWithSourceEpoch(CommandLineTestsBase,
|
||||||
|
unittest.TestCase,
|
||||||
|
metaclass=SourceDateEpochTestMeta,
|
||||||
|
source_date_epoch=True):
|
||||||
|
--- a/Lib/test/test_importlib/source/test_file_loader.py
|
||||||
|
+++ b/Lib/test/test_importlib/source/test_file_loader.py
|
||||||
|
@@ -22,6 +22,9 @@ from test.support import make_legacy_pyc
|
||||||
|
from test.test_py_compile import without_source_date_epoch
|
||||||
|
from test.test_py_compile import SourceDateEpochTestMeta
|
||||||
|
|
||||||
|
+from test.test_py_compile import without_source_date_epoch
|
||||||
|
+from test.test_py_compile import SourceDateEpochTestMeta
|
||||||
|
+
|
||||||
|
|
||||||
|
class SimpleTest(abc.LoaderTests):
|
||||||
|
|
||||||
|
@@ -363,6 +366,17 @@ class SimpleTest(abc.LoaderTests):
|
||||||
|
|
||||||
|
|
||||||
|
class SourceDateEpochTestMeta(SourceDateEpochTestMeta,
|
||||||
|
+ type(Source_SimpleTest)):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class SourceDateEpoch_SimpleTest(Source_SimpleTest,
|
||||||
|
+ metaclass=SourceDateEpochTestMeta,
|
||||||
|
+ source_date_epoch=True):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class SourceDateEpochTestMeta(SourceDateEpochTestMeta,
|
||||||
|
type(Source_SimpleTest)):
|
||||||
|
pass
|
||||||
|
|
||||||
|
--- a/Lib/test/test_py_compile.py
|
||||||
|
+++ b/Lib/test/test_py_compile.py
|
||||||
|
@@ -216,5 +216,19 @@ class PyCompileTestsWithoutSourceEpoch(P
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
+class PyCompileTestsWithSourceEpoch(PyCompileTestsBase,
|
||||||
|
+ unittest.TestCase,
|
||||||
|
+ metaclass=SourceDateEpochTestMeta,
|
||||||
|
+ source_date_epoch=True):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class PyCompileTestsWithoutSourceEpoch(PyCompileTestsBase,
|
||||||
|
+ unittest.TestCase,
|
||||||
|
+ metaclass=SourceDateEpochTestMeta,
|
||||||
|
+ source_date_epoch=False):
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Library/2018-09-27-13-14-15.bpo-34022.E2cl0r.rst
|
||||||
|
@@ -0,0 +1,3 @@
|
||||||
|
+The :envvar:`SOURCE_DATE_EPOCH` environment variable no longer overrides the
|
||||||
|
+value of the *invalidation_mode* argument to :func:`py_compile.compile`, and
|
||||||
|
+determines its default value instead.
|
49
bpo36302-sort-module-sources.patch
Normal file
49
bpo36302-sort-module-sources.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
From ca04974425c84f306ddcebe88d6b31442e34e89d Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Bernhard M. Wiedemann" <bwiedemann@suse.de>
|
||||||
|
Date: Mon, 5 Jun 2017 17:33:33 +0200
|
||||||
|
Subject: [PATCH] bpo-36302: Sort list of sources
|
||||||
|
|
||||||
|
when building packages (e.g. for openSUSE Linux)
|
||||||
|
(random) filesystem order of input files
|
||||||
|
influences ordering of functions in the output .so files.
|
||||||
|
Thus without the patch, builds (in disposable VMs) would usually differ.
|
||||||
|
|
||||||
|
Without this patch, all callers have to be patched individually
|
||||||
|
https://github.com/dugsong/libdnet/pull/42
|
||||||
|
https://github.com/sass/libsass-python/pull/212
|
||||||
|
https://github.com/tahoe-lafs/pycryptopp/pull/41
|
||||||
|
https://github.com/yt-project/yt/pull/2206
|
||||||
|
https://github.com/pyproj4/pyproj/pull/142
|
||||||
|
https://github.com/pytries/datrie/pull/49
|
||||||
|
https://github.com/Roche/pyreadstat/pull/37
|
||||||
|
but that is an infinite effort.
|
||||||
|
|
||||||
|
See https://reproducible-builds.org/ for why this matters.
|
||||||
|
---
|
||||||
|
Lib/distutils/command/build_ext.py | 3 ++-
|
||||||
|
.../next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst | 2 ++
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst
|
||||||
|
|
||||||
|
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
|
||||||
|
index 2d7cdf063f01..38bb8fd93c27 100644
|
||||||
|
--- a/Lib/distutils/command/build_ext.py
|
||||||
|
+++ b/Lib/distutils/command/build_ext.py
|
||||||
|
@@ -490,7 +490,8 @@ def build_extension(self, ext):
|
||||||
|
"in 'ext_modules' option (extension '%s'), "
|
||||||
|
"'sources' must be present and must be "
|
||||||
|
"a list of source filenames" % ext.name)
|
||||||
|
- sources = list(sources)
|
||||||
|
+ # sort to make the resulting .so file build reproducible
|
||||||
|
+ sources = sorted(sources)
|
||||||
|
|
||||||
|
ext_path = self.get_ext_fullpath(ext.name)
|
||||||
|
depends = sources + ext.depends
|
||||||
|
diff --git a/Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst b/Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..fe01b5915d5d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst
|
||||||
|
@@ -0,0 +1,2 @@
|
||||||
|
+distutils sorts source file lists so that Extension .so files
|
||||||
|
+build more reproducibly by default
|
79
bpo40784-Fix-sqlite3-deterministic-test.patch
Normal file
79
bpo40784-Fix-sqlite3-deterministic-test.patch
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
From 00a240bf7f95bbd220f1cfbf9eb58484a5f9681a Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Miss Islington (bot)"
|
||||||
|
<31488909+miss-islington@users.noreply.github.com>
|
||||||
|
Date: Fri, 29 May 2020 05:46:34 -0700
|
||||||
|
Subject: [PATCH] bpo-40784: Fix sqlite3 deterministic test (GH-20448)
|
||||||
|
|
||||||
|
(cherry picked from commit c610d970f5373b143bf5f5900d4645e6a90fb460)
|
||||||
|
|
||||||
|
Co-authored-by: Erlend Egeberg Aasland <erlend.aasland@innova.no>
|
||||||
|
---
|
||||||
|
Lib/sqlite3/test/userfunctions.py | 36 +++++++++++++++++++++++--------
|
||||||
|
1 file changed, 27 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py
|
||||||
|
index 9501f535c4999..c11c82e127577 100644
|
||||||
|
--- a/Lib/sqlite3/test/userfunctions.py
|
||||||
|
+++ b/Lib/sqlite3/test/userfunctions.py
|
||||||
|
@@ -1,8 +1,7 @@
|
||||||
|
-#-*- coding: iso-8859-1 -*-
|
||||||
|
# pysqlite2/test/userfunctions.py: tests for user-defined functions and
|
||||||
|
# aggregates.
|
||||||
|
#
|
||||||
|
-# Copyright (C) 2005-2007 Gerhard Häring <gh@ghaering.de>
|
||||||
|
+# Copyright (C) 2005-2007 Gerhard Häring <gh@ghaering.de>
|
||||||
|
#
|
||||||
|
# This file is part of pysqlite.
|
||||||
|
#
|
||||||
|
@@ -158,6 +157,7 @@ def setUp(self):
|
||||||
|
self.con.create_function("isblob", 1, func_isblob)
|
||||||
|
self.con.create_function("islonglong", 1, func_islonglong)
|
||||||
|
self.con.create_function("spam", -1, func)
|
||||||
|
+ self.con.execute("create table test(t text)")
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.con.close()
|
||||||
|
@@ -276,18 +276,36 @@ def CheckAnyArguments(self):
|
||||||
|
val = cur.fetchone()[0]
|
||||||
|
self.assertEqual(val, 2)
|
||||||
|
|
||||||
|
+ # Regarding deterministic functions:
|
||||||
|
+ #
|
||||||
|
+ # Between 3.8.3 and 3.15.0, deterministic functions were only used to
|
||||||
|
+ # optimize inner loops, so for those versions we can only test if the
|
||||||
|
+ # sqlite machinery has factored out a call or not. From 3.15.0 and onward,
|
||||||
|
+ # deterministic functions were permitted in WHERE clauses of partial
|
||||||
|
+ # indices, which allows testing based on syntax, iso. the query optimizer.
|
||||||
|
+ @unittest.skipIf(sqlite.sqlite_version_info < (3, 8, 3), "Requires SQLite 3.8.3 or higher")
|
||||||
|
def CheckFuncNonDeterministic(self):
|
||||||
|
mock = unittest.mock.Mock(return_value=None)
|
||||||
|
- self.con.create_function("deterministic", 0, mock, deterministic=False)
|
||||||
|
- self.con.execute("select deterministic() = deterministic()")
|
||||||
|
- self.assertEqual(mock.call_count, 2)
|
||||||
|
-
|
||||||
|
- @unittest.skipIf(sqlite.sqlite_version_info < (3, 8, 3), "deterministic parameter not supported")
|
||||||
|
+ self.con.create_function("nondeterministic", 0, mock, deterministic=False)
|
||||||
|
+ if sqlite.sqlite_version_info < (3, 15, 0):
|
||||||
|
+ self.con.execute("select nondeterministic() = nondeterministic()")
|
||||||
|
+ self.assertEqual(mock.call_count, 2)
|
||||||
|
+ else:
|
||||||
|
+ with self.assertRaises(sqlite.OperationalError):
|
||||||
|
+ self.con.execute("create index t on test(t) where nondeterministic() is not null")
|
||||||
|
+
|
||||||
|
+ @unittest.skipIf(sqlite.sqlite_version_info < (3, 8, 3), "Requires SQLite 3.8.3 or higher")
|
||||||
|
def CheckFuncDeterministic(self):
|
||||||
|
mock = unittest.mock.Mock(return_value=None)
|
||||||
|
self.con.create_function("deterministic", 0, mock, deterministic=True)
|
||||||
|
- self.con.execute("select deterministic() = deterministic()")
|
||||||
|
- self.assertEqual(mock.call_count, 1)
|
||||||
|
+ if sqlite.sqlite_version_info < (3, 15, 0):
|
||||||
|
+ self.con.execute("select deterministic() = deterministic()")
|
||||||
|
+ self.assertEqual(mock.call_count, 1)
|
||||||
|
+ else:
|
||||||
|
+ try:
|
||||||
|
+ self.con.execute("create index t on test(t) where deterministic() is not null")
|
||||||
|
+ except sqlite.OperationalError:
|
||||||
|
+ self.fail("Unexpected failure while creating partial index")
|
||||||
|
|
||||||
|
@unittest.skipIf(sqlite.sqlite_version_info >= (3, 8, 3), "SQLite < 3.8.3 needed")
|
||||||
|
def CheckFuncDeterministicNotSupported(self):
|
75
bsc1167501-invalid-alignment.patch
Normal file
75
bsc1167501-invalid-alignment.patch
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
From e6f4de57ffd175870e513ffa387fa6e7eaaeaed2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andreas Schneider <asn@cryptomilk.org>
|
||||||
|
Date: Tue, 24 Mar 2020 07:55:00 +0100
|
||||||
|
Subject: [PATCH] bpo-40052: Fix alignment issue in PyVectorcall_Function()
|
||||||
|
|
||||||
|
In file included from /usr/include/python3.8/Python.h:147:
|
||||||
|
In file included from /usr/include/python3.8/abstract.h:837:
|
||||||
|
/usr/include/python3.8/cpython/abstract.h:91:11: error: cast from 'char *' to 'vectorcallfunc *'
|
||||||
|
(aka 'struct _object *(**)(struct _object *, struct _object *const *, unsigned long, struct _object *)')
|
||||||
|
increases required alignment from 1 to 8 [-Werror,-Wcast-align]
|
||||||
|
|
||||||
|
ptr = (vectorcallfunc*)(((char *)callable) + offset);
|
||||||
|
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
1 error generated.
|
||||||
|
|
||||||
|
Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
|
||||||
|
---
|
||||||
|
Include/cpython/abstract.h | 9 ++++++---
|
||||||
|
.../next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst | 1 +
|
||||||
|
Objects/call.c | 7 ++++++-
|
||||||
|
3 files changed, 13 insertions(+), 4 deletions(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst
|
||||||
|
|
||||||
|
--- a/Include/cpython/abstract.h
|
||||||
|
+++ b/Include/cpython/abstract.h
|
||||||
|
@@ -82,14 +82,17 @@ _PyVectorcall_Function(PyObject *callabl
|
||||||
|
{
|
||||||
|
PyTypeObject *tp = Py_TYPE(callable);
|
||||||
|
Py_ssize_t offset = tp->tp_vectorcall_offset;
|
||||||
|
- vectorcallfunc *ptr;
|
||||||
|
+ union {
|
||||||
|
+ char *data;
|
||||||
|
+ vectorcallfunc *ptr;
|
||||||
|
+ } vc;
|
||||||
|
if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
assert(PyCallable_Check(callable));
|
||||||
|
assert(offset > 0);
|
||||||
|
- ptr = (vectorcallfunc*)(((char *)callable) + offset);
|
||||||
|
- return *ptr;
|
||||||
|
+ vc.data = (char *)callable + offset;
|
||||||
|
+ return *vc.ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call the callable object 'callable' with the "vectorcall" calling
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+Fix an alignment build warning/error in function ``PyVectorcall_Function()`` publicly exposed by ``abstract.h``.
|
||||||
|
\ No newline at end of file
|
||||||
|
--- a/Objects/call.c
|
||||||
|
+++ b/Objects/call.c
|
||||||
|
@@ -173,6 +173,11 @@ _PyObject_MakeTpCall(PyObject *callable,
|
||||||
|
PyObject *
|
||||||
|
PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs)
|
||||||
|
{
|
||||||
|
+ union {
|
||||||
|
+ char *data;
|
||||||
|
+ vectorcallfunc *ptr;
|
||||||
|
+ } vc;
|
||||||
|
+
|
||||||
|
/* get vectorcallfunc as in _PyVectorcall_Function, but without
|
||||||
|
* the _Py_TPFLAGS_HAVE_VECTORCALL check */
|
||||||
|
Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset;
|
||||||
|
@@ -181,7 +186,8 @@ PyVectorcall_Call(PyObject *callable, Py
|
||||||
|
Py_TYPE(callable)->tp_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
- vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset);
|
||||||
|
+ vc.data = (char *)callable + offset;
|
||||||
|
+ vectorcallfunc func = *vc.ptr;
|
||||||
|
if (func == NULL) {
|
||||||
|
PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall",
|
||||||
|
Py_TYPE(callable)->tp_name);
|
11
distutils-reproducible-compile.patch
Normal file
11
distutils-reproducible-compile.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- a/Lib/distutils/util.py
|
||||||
|
+++ b/Lib/distutils/util.py
|
||||||
|
@@ -432,7 +432,7 @@ byte_compile(files, optimize=%r, force=%
|
||||||
|
else:
|
||||||
|
from py_compile import compile
|
||||||
|
|
||||||
|
- for file in py_files:
|
||||||
|
+ for file in sorted(py_files):
|
||||||
|
if file[-3:] != ".py":
|
||||||
|
# This lets us be lazy and not filter filenames in
|
||||||
|
# the "install_lib" command.
|
35
idle3.appdata.xml
Normal file
35
idle3.appdata.xml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright 2017 Zbigniew Jędrzejewski-Szmek -->
|
||||||
|
<application>
|
||||||
|
<id type="desktop">idle3.desktop</id>
|
||||||
|
<name>IDLE3</name>
|
||||||
|
<metadata_licence>CC0</metadata_licence>
|
||||||
|
<project_license>Python-2.0</project_license>
|
||||||
|
<summary>Python 3 Integrated Development and Learning Environment</summary>
|
||||||
|
<description>
|
||||||
|
<p>
|
||||||
|
IDLE is Python’s Integrated Development and Learning Environment.
|
||||||
|
The GUI is uniform between Windows, Unix, and Mac OS X.
|
||||||
|
IDLE provides an easy way to start writing, running, and debugging
|
||||||
|
Python code.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
IDLE is written in pure Python, and uses the tkinter GUI toolkit.
|
||||||
|
It provides:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>a Python shell window (interactive interpreter) with colorizing of code input, output, and error messages,</li>
|
||||||
|
<li>a multi-window text editor with multiple undo, Python colorizing, smart indent, call tips, auto completion, and other features,</li>
|
||||||
|
<li>search within any window, replace within editor windows, and search through multiple files (grep),</li>
|
||||||
|
<li>a debugger with persistent breakpoints, stepping, and viewing of global and local namespaces.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
<url type="homepage">https://docs.python.org/3/library/idle.html</url>
|
||||||
|
<screenshots>
|
||||||
|
<screenshot type="default">http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-main-window.png</screenshot>
|
||||||
|
<screenshot>http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-class-browser.png</screenshot>
|
||||||
|
<screenshot>http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-code-viewer.png</screenshot>
|
||||||
|
</screenshots>
|
||||||
|
<update_contact>zbyszek@in.waw.pl</update_contact>
|
||||||
|
</application>
|
12
idle3.desktop
Normal file
12
idle3.desktop
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Version=1.0
|
||||||
|
Name=IDLE 3
|
||||||
|
GenericName=Python 3 IDE
|
||||||
|
Comment=Python 3 Integrated Development and Learning Environment
|
||||||
|
Exec=idle3 %F
|
||||||
|
TryExec=idle3
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Icon=idle3
|
||||||
|
Categories=Development;IDE;
|
||||||
|
MimeType=text/x-python;
|
7
import_failed.map
Normal file
7
import_failed.map
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
python3-curses: curses _curses _curses_panel
|
||||||
|
python3-dbm: dbm _dbm _gdbm
|
||||||
|
python3-idle: idlelib
|
||||||
|
python3-testsuite: test _ctypes_test _testbuffer _testcapi _testinternalcapi _testimportmultiple _testmultiphase xxlimited
|
||||||
|
python3-tk: tkinter _tkinter
|
||||||
|
python3-tools: turtledemo
|
||||||
|
python3: sqlite3 readline _sqlite3 nis
|
22
import_failed.py
Normal file
22
import_failed.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import sys, os
|
||||||
|
from sysconfig import get_path
|
||||||
|
|
||||||
|
failed_map_path = os.path.join(get_path('stdlib'), '_import_failed', 'import_failed.map')
|
||||||
|
|
||||||
|
if __spec__:
|
||||||
|
failed_name = __spec__.name
|
||||||
|
else:
|
||||||
|
failed_name = __name__
|
||||||
|
|
||||||
|
for line in open(failed_map_path):
|
||||||
|
package = line.split(':')[0]
|
||||||
|
imports = line.split(':')[1]
|
||||||
|
if failed_name in imports:
|
||||||
|
raise ImportError(f"""Module '{failed_name}' is not installed.
|
||||||
|
Use:
|
||||||
|
sudo zypper install {package}
|
||||||
|
to install it.""")
|
||||||
|
|
||||||
|
raise ImportError(f"""Module '{failed_name}' is not installed.
|
||||||
|
It is supposed to be part of python3 distribution, but missing from failed import map.
|
||||||
|
Please file a bug on the SUSE Bugzilla.""")
|
28
macros.python3
Normal file
28
macros.python3
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
%have_python3 1
|
||||||
|
|
||||||
|
# commented out legacy macro definitions
|
||||||
|
#py3_prefix /usr
|
||||||
|
#py3_incdir /usr/include/python3.5m
|
||||||
|
#py3_ver 3.5
|
||||||
|
|
||||||
|
# these should now be provided by macros.python_all
|
||||||
|
#python3_sitearch /usr/lib64/python3.5/site-packages
|
||||||
|
#python3_sitelib /usr/lib/python3.5/site-packages
|
||||||
|
#python3_version 3.5
|
||||||
|
|
||||||
|
# hard to say if anyone ever used these?
|
||||||
|
#py3_soflags cpython-35m-x86_64-linux-gnu
|
||||||
|
#py3_abiflags m
|
||||||
|
%cpython3_soabi %(python3 -c "import sysconfig; print(sysconfig.get_config_var('SOABI'))")
|
||||||
|
%py3_soflags %cpython3_soabi
|
||||||
|
|
||||||
|
# compilation macros that might be in use somewhere
|
||||||
|
%py3_compile(O) \
|
||||||
|
find %1 -name '*.pyc' -exec rm -f {} ";"\
|
||||||
|
python3 -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\
|
||||||
|
%{-O:\
|
||||||
|
find %1 -name '*.pyo' -exec rm -f {} ";"\
|
||||||
|
python3 -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\
|
||||||
|
}
|
||||||
|
|
||||||
|
|
78
pre_checkin.sh
Normal file
78
pre_checkin.sh
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
export LC_ALL=C
|
||||||
|
|
||||||
|
master=python*.spec
|
||||||
|
|
||||||
|
# create import_failed.map from package definitions
|
||||||
|
pkgname=$(grep python_pkg_name $master |grep define |awk -F' ' '{print $3}')
|
||||||
|
MAPFILE=import_failed.map
|
||||||
|
function new_map_line () {
|
||||||
|
package=$1
|
||||||
|
package=$(echo $1 |sed -e "s:%{python_pkg_name}:$pkgname:")
|
||||||
|
modules=$2
|
||||||
|
if [ -z "$package" -o -z "$modules" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if [ "$package" == "python3-base" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
echo "$package:$modules" >> $MAPFILE.tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
for spec in *.spec; do
|
||||||
|
basename=${spec%.spec}
|
||||||
|
package=
|
||||||
|
modules=
|
||||||
|
while read line; do
|
||||||
|
case $line in
|
||||||
|
"%files -n "*)
|
||||||
|
new_map_line $package "$modules"
|
||||||
|
package=${line#"%files -n "}
|
||||||
|
modules=
|
||||||
|
;;
|
||||||
|
"%files "*)
|
||||||
|
new_map_line $package "$modules"
|
||||||
|
package=$basename-${line#"%files "}
|
||||||
|
modules=
|
||||||
|
;;
|
||||||
|
"%files")
|
||||||
|
new_map_line $package "$modules"
|
||||||
|
package=$basename
|
||||||
|
modules=
|
||||||
|
;;
|
||||||
|
"%{sitedir}/config-"*)
|
||||||
|
# ignore
|
||||||
|
;;
|
||||||
|
"%{sitedir}/"*)
|
||||||
|
word=${line#"%{sitedir}/"}
|
||||||
|
if ! echo $word | grep -q /; then
|
||||||
|
modules="$modules $word"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"%{dynlib "*"}")
|
||||||
|
word=${line#"%{dynlib "}
|
||||||
|
word=${word%"}"}
|
||||||
|
modules="$modules $word"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done < $spec
|
||||||
|
new_map_line $package "$modules"
|
||||||
|
done
|
||||||
|
|
||||||
|
cat $MAPFILE.tmp |sort -u > $MAPFILE
|
||||||
|
rm $MAPFILE.tmp
|
||||||
|
|
||||||
|
# run test inclusion check
|
||||||
|
tar xJf Python-*.xz
|
||||||
|
python3 skipped_tests.py
|
||||||
|
|
||||||
|
# generate baselibs.conf
|
||||||
|
VERSION=$(grep ^Version $master|awk -F':' '{print $2}' |sed -e 's/ //g')
|
||||||
|
python_version=${VERSION:0:3} # 3.3
|
||||||
|
python_version_abitag=${python_version//./} # 33
|
||||||
|
python_version_soname=${python_version//./_} # 3_3
|
||||||
|
echo "$pkgname-base" > baselibs.conf
|
||||||
|
echo "$pkgname" >> baselibs.conf
|
||||||
|
echo "libpython$python_version_soname-1_0" >> baselibs.conf
|
||||||
|
|
21
python-3.3.0b1-fix_date_time_compiler.patch
Normal file
21
python-3.3.0b1-fix_date_time_compiler.patch
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
--- a/Makefile.pre.in
|
||||||
|
+++ b/Makefile.pre.in
|
||||||
|
@@ -746,11 +746,18 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \
|
||||||
|
$(DTRACE_OBJS) \
|
||||||
|
$(srcdir)/Modules/getbuildinfo.c
|
||||||
|
$(CC) -c $(PY_CORE_CFLAGS) \
|
||||||
|
+ -DDATE="\"`date -u -r Makefile.pre.in +"%b %d %Y"`\"" \
|
||||||
|
+ -DTIME="\"`date -u -r Makefile.pre.in +"%T"`\"" \
|
||||||
|
-DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \
|
||||||
|
-DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \
|
||||||
|
-DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \
|
||||||
|
-o $@ $(srcdir)/Modules/getbuildinfo.c
|
||||||
|
|
||||||
|
+Python/getcompiler.o: $(srcdir)/Python/getcompiler.c Makefile
|
||||||
|
+ $(CC) -c $(PY_CORE_CFLAGS) \
|
||||||
|
+ -DCOMPILER='"[GCC]"' \
|
||||||
|
+ -o $@ $(srcdir)/Python/getcompiler.c
|
||||||
|
+
|
||||||
|
Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile
|
||||||
|
$(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \
|
||||||
|
-DPREFIX='"$(prefix)"' \
|
11
python-3.3.0b1-localpath.patch
Normal file
11
python-3.3.0b1-localpath.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- a/Lib/site.py
|
||||||
|
+++ b/Lib/site.py
|
||||||
|
@@ -76,7 +76,7 @@ import _sitebuiltins
|
||||||
|
import io
|
||||||
|
|
||||||
|
# Prefixes for site-packages; add additional prefixes like /usr/local here
|
||||||
|
-PREFIXES = [sys.prefix, sys.exec_prefix]
|
||||||
|
+PREFIXES = [sys.prefix, sys.exec_prefix, '/usr/local']
|
||||||
|
# Enable per user site-packages directory
|
||||||
|
# set it to False to disable the feature or True to force the feature
|
||||||
|
ENABLE_USER_SITE = None
|
11
python-3.3.0b1-test-posix_fadvise.patch
Normal file
11
python-3.3.0b1-test-posix_fadvise.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- a/Lib/test/test_posix.py
|
||||||
|
+++ b/Lib/test/test_posix.py
|
||||||
|
@@ -421,7 +421,7 @@ class PosixTester(unittest.TestCase):
|
||||||
|
def test_posix_fadvise(self):
|
||||||
|
fd = os.open(support.TESTFN, os.O_RDONLY)
|
||||||
|
try:
|
||||||
|
- posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
|
||||||
|
+ posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_RANDOM)
|
||||||
|
finally:
|
||||||
|
os.close(fd)
|
||||||
|
|
1055
python.keyring
Normal file
1055
python.keyring
Normal file
File diff suppressed because it is too large
Load Diff
53
python3-imp-returntype.patch
Normal file
53
python3-imp-returntype.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
From 7bd6f0e5500f778e940374237b94651f60ae1990 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Miss Islington (bot)"
|
||||||
|
<31488909+miss-islington@users.noreply.github.com>
|
||||||
|
Date: Fri, 6 Jul 2018 21:00:45 -0700
|
||||||
|
Subject: [PATCH] closes bpo-34056: Always return bytes from
|
||||||
|
_HackedGetData.get_data(). (GH-8130)
|
||||||
|
|
||||||
|
* Always return bytes from _HackedGetData.get_data().
|
||||||
|
|
||||||
|
Ensure the imp.load_source shim always returns bytes by reopening the file in
|
||||||
|
binary mode if needed. Hash-based pycs have to receive the source code in bytes.
|
||||||
|
|
||||||
|
It's tempting to change imp.get_suffixes() to always return 'rb' as a mode, but
|
||||||
|
that breaks some stdlib tests and likely 3rdparty code, too.
|
||||||
|
(cherry picked from commit b0274f2cddd36b49fe5080efbe160277ef546471)
|
||||||
|
|
||||||
|
Co-authored-by: Benjamin Peterson <benjamin@python.org>
|
||||||
|
---
|
||||||
|
Lib/imp.py | 13 ++++++-------
|
||||||
|
Lib/test/test_imp.py | 15 +++++++++++++++
|
||||||
|
.../2018-07-05-22-45-46.bpo-34056.86isrU.rst | 3 +++
|
||||||
|
3 files changed, 24 insertions(+), 7 deletions(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst
|
||||||
|
|
||||||
|
--- a/Lib/test/test_imp.py
|
||||||
|
+++ b/Lib/test/test_imp.py
|
||||||
|
@@ -376,6 +376,20 @@ class ImportTests(unittest.TestCase):
|
||||||
|
mod = imp.load_module('mymod', file, path, description)
|
||||||
|
self.assertEqual(mod.x, 42)
|
||||||
|
|
||||||
|
+ def test_find_and_load_checked_pyc(self):
|
||||||
|
+ # issue 34056
|
||||||
|
+ with support.temp_cwd():
|
||||||
|
+ with open('mymod.py', 'wb') as fp:
|
||||||
|
+ fp.write(b'x = 42\n')
|
||||||
|
+ py_compile.compile(
|
||||||
|
+ 'mymod.py',
|
||||||
|
+ doraise=True,
|
||||||
|
+ invalidation_mode=py_compile.PycInvalidationMode.CHECKED_HASH,
|
||||||
|
+ )
|
||||||
|
+ file, path, description = imp.find_module('mymod', path=['.'])
|
||||||
|
+ mod = imp.load_module('mymod', file, path, description)
|
||||||
|
+ self.assertEqual(mod.x, 42)
|
||||||
|
+
|
||||||
|
|
||||||
|
class ReloadTests(unittest.TestCase):
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst
|
||||||
|
@@ -0,0 +1,3 @@
|
||||||
|
+Ensure the loader shim created by ``imp.load_module`` always returns bytes
|
||||||
|
+from its ``get_data()`` function. This fixes using ``imp.load_module`` with
|
||||||
|
+:pep:`552` hash-based pycs.
|
1663
python3.changes
Normal file
1663
python3.changes
Normal file
File diff suppressed because it is too large
Load Diff
906
python3.spec
Normal file
906
python3.spec
Normal file
@ -0,0 +1,906 @@
|
|||||||
|
#
|
||||||
|
# spec file for package python3
|
||||||
|
#
|
||||||
|
# Copyright (c) 2020 SUSE LLC
|
||||||
|
#
|
||||||
|
# All modifications and additions to the file contributed by third parties
|
||||||
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
|
# upon. The license for this file, and modifications and additions to the
|
||||||
|
# file, is the same license as for the pristine package itself (unless the
|
||||||
|
# license for the pristine package is not an Open Source License, in which
|
||||||
|
# case the license is the MIT License). An "Open Source License" is a
|
||||||
|
# license that conforms to the Open Source Definition (Version 1.9)
|
||||||
|
# published by the Open Source Initiative.
|
||||||
|
|
||||||
|
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
%global flavor @BUILD_FLAVOR@%{nil}
|
||||||
|
%if "%{flavor}" == "doc"
|
||||||
|
%define psuffix -documentation
|
||||||
|
%bcond_without doc
|
||||||
|
%bcond_with base
|
||||||
|
%bcond_with general
|
||||||
|
%endif
|
||||||
|
%if "%{flavor}" == "base"
|
||||||
|
%define psuffix -core
|
||||||
|
%bcond_with doc
|
||||||
|
%bcond_without base
|
||||||
|
%bcond_with general
|
||||||
|
%endif
|
||||||
|
%if "%{flavor}" == ""
|
||||||
|
%define psuffix %{nil}
|
||||||
|
%bcond_with doc
|
||||||
|
%bcond_with base
|
||||||
|
%bcond_without general
|
||||||
|
%endif
|
||||||
|
%define _version %(c=%{version}; echo ${c/[a-z]*/})
|
||||||
|
%define tar_suffix %(c=%{_version}; echo ${c#%{_version}})
|
||||||
|
%define python_version %(c=%{_version}; echo ${c:0:3})
|
||||||
|
# the versions are autogenerated from pre_checkin.sh
|
||||||
|
# based on the current source tarball
|
||||||
|
%define python_version_abitag %(c=%{python_version}; echo ${c//./})
|
||||||
|
# FIXME %%define python_version_soname %%(c=%%{python_version}; echo ${c//./_})
|
||||||
|
%define python_version_soname 3_8
|
||||||
|
%if 0%(test -n "%{tar_suffix}" && echo 1)
|
||||||
|
%define _version %(echo "%{_version}~%{tar_suffix}")
|
||||||
|
%define tarversion %{version}
|
||||||
|
%else
|
||||||
|
%define tarversion %{version}
|
||||||
|
%endif
|
||||||
|
%define python_pkg_name python3
|
||||||
|
%define folderversion %{tarversion}
|
||||||
|
%define tarname Python-%{tarversion}
|
||||||
|
%define sitedir %{_libdir}/python%{python_version}
|
||||||
|
# three possible ABI kinds: m - pymalloc, d - debug build; see PEP 3149
|
||||||
|
%define abi_kind %{nil}
|
||||||
|
# python ABI version - used in some file names
|
||||||
|
%define python_abi %{python_version}%{abi_kind}
|
||||||
|
# soname ABI tag defined in PEP 3149
|
||||||
|
%define abi_tag %{python_version_abitag}%{abi_kind}
|
||||||
|
# version part of "libpython" package
|
||||||
|
%define so_major 1
|
||||||
|
%define so_minor 0
|
||||||
|
%define so_version %{python_version_soname}%{abi_kind}-%{so_major}_%{so_minor}
|
||||||
|
# rpm and python have different ideas about what is an arch-dependent name, so:
|
||||||
|
%if %{__isa_name} == ppc
|
||||||
|
%define archname %(echo %{_arch} | sed s/ppc/powerpc/)
|
||||||
|
%else
|
||||||
|
%define archname %{_arch}
|
||||||
|
%endif
|
||||||
|
# our arm has Hardware-Floatingpoint
|
||||||
|
%if %{_arch} == arm
|
||||||
|
%define armsuffix hf
|
||||||
|
%endif
|
||||||
|
# pyexpat.cpython-35m-x86_64-linux-gnu
|
||||||
|
# pyexpat.cpython-35m-powerpc64le-linux-gnu
|
||||||
|
# pyexpat.cpython-35m-armv7-linux-gnueabihf
|
||||||
|
# _md5.cpython-38m-x86_64-linux-gnu.so
|
||||||
|
%define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}.so
|
||||||
|
%if 0%{?qemu_user_space_build}
|
||||||
|
%bcond_with profileopt
|
||||||
|
%else
|
||||||
|
%bcond_without profileopt
|
||||||
|
%endif
|
||||||
|
Name: %{python_pkg_name}%{psuffix}
|
||||||
|
Version: 3.8.3
|
||||||
|
Release: 0
|
||||||
|
Summary: Python 3 Interpreter
|
||||||
|
License: Python-2.0
|
||||||
|
URL: https://www.python.org/
|
||||||
|
Source0: http://www.python.org/ftp/python/%{folderversion}/%{tarname}.tar.xz
|
||||||
|
Source1: http://www.python.org/ftp/python/%{folderversion}/%{tarname}.tar.xz.asc
|
||||||
|
Source2: baselibs.conf
|
||||||
|
Source3: README.SUSE
|
||||||
|
Source7: macros.python3
|
||||||
|
Source8: import_failed.py
|
||||||
|
Source9: import_failed.map
|
||||||
|
Source10: pre_checkin.sh
|
||||||
|
Source11: skipped_tests.py
|
||||||
|
Source19: idle3.desktop
|
||||||
|
Source20: idle3.appdata.xml
|
||||||
|
Source99: python.keyring
|
||||||
|
# The following files are not used in the build.
|
||||||
|
# They are listed here to work around missing functionality in rpmbuild,
|
||||||
|
# which would otherwise exclude them from distributed src.rpm files.
|
||||||
|
Source100: PACKAGING-NOTES
|
||||||
|
# First series of patches supportin lib-vs-lib64 distinction
|
||||||
|
# PATCH-FEATURE-UPSTREAM F00102-lib64.patch bsc#[0-9]+ mcepl@suse.com
|
||||||
|
# Change the various install paths to use /usr/lib64/ instead or /usr/lib/
|
||||||
|
Patch01: F00102-lib64.patch
|
||||||
|
# PATCH-FEATURE-UPSTREAM F00251-change-user-install-location.patch bsc#[0-9]+ mcepl@suse.com
|
||||||
|
# Fix installation in /usr/local (boo#1071941), originally from Fedora
|
||||||
|
# https://src.fedoraproject.org/rpms/python3/blob/master/f/00251-change-user-install-location.patch
|
||||||
|
# Set values of prefix and exec_prefix in distutils install command
|
||||||
|
# to /usr/local if executable is /usr/bin/python* and RPM build
|
||||||
|
# is not detected to make pip and distutils install into separate location
|
||||||
|
Patch02: F00251-change-user-install-location.patch
|
||||||
|
# PATCH-FEATURE-UPSTREAM SUSE-FEDORA-multilib.patch bsc#[0-9]+ mcepl@suse.com
|
||||||
|
# Add support for platlib variable
|
||||||
|
Patch03: SUSE-FEDORA-multilib.patch
|
||||||
|
# PATCH-FIX-OPENSUSE OBS_dev-shm.patch bpo#38377 mcepl@suse.com
|
||||||
|
# _multiprocessing.SemLock depends on proper /dev/shm which is not available in OBS
|
||||||
|
Patch04: OBS_dev-shm.patch
|
||||||
|
#
|
||||||
|
# PATCH-FEATURE-UPSTREAM distutils-reproducible-compile.patch gh#python/cpython#8057 mcepl@suse.com
|
||||||
|
# Improve reproduceability
|
||||||
|
Patch06: distutils-reproducible-compile.patch
|
||||||
|
# support finding packages in /usr/local, install to /usr/local by default
|
||||||
|
Patch07: python-3.3.0b1-localpath.patch
|
||||||
|
# replace DATE, TIME and COMPILER by fixed definitions to aid reproducible builds
|
||||||
|
Patch08: python-3.3.0b1-fix_date_time_compiler.patch
|
||||||
|
# POSIX_FADV_WILLNEED throws EINVAL. Use a different constant in test
|
||||||
|
Patch09: python-3.3.0b1-test-posix_fadvise.patch
|
||||||
|
# Raise timeout value for test_subprocess
|
||||||
|
Patch15: subprocess-raise-timeout.patch
|
||||||
|
# skip some tests only for PowerPC
|
||||||
|
Patch23: skip_random_failing_tests.patch
|
||||||
|
# Fix SOURCE_DATE_EPOCH problems (bpo#34022, bpo#29708)
|
||||||
|
# gh#python/cpython#10775 gh#python/cpython#10327
|
||||||
|
Patch24: bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch
|
||||||
|
Patch25: python3-imp-returntype.patch
|
||||||
|
# PATCH-FIX-UPSTREAM CVE-2019-5010-null-defer-x509-cert-DOS.patch bnc#1122191 mcepl@suse.com
|
||||||
|
# https://github.com/python/cpython/pull/11569
|
||||||
|
# Fix segfault in ssl's cert parser
|
||||||
|
Patch27: CVE-2019-5010-null-defer-x509-cert-DOS.patch
|
||||||
|
# PATCH-FIX-UPSTREAM bpo36302-sort-module-sources.patch bsc#1041090 bwiedemann@suse.com
|
||||||
|
# Sort list of sources to have stable order in the compiled .so library.
|
||||||
|
Patch28: bpo36302-sort-module-sources.patch
|
||||||
|
# PATCH-FEATURE-UPSTREAM bpo-31046_ensurepip_honours_prefix.patch bpo#31046 mcepl@suse.com
|
||||||
|
# ensurepip should honour the value of $(prefix)
|
||||||
|
Patch29: bpo-31046_ensurepip_honours_prefix.patch
|
||||||
|
# PATCH-FIX-UPSTREAM bsc1167501-invalid-alignment.patch gh#python/cpython#19133 mcepl@suse.com
|
||||||
|
# Fix wrong misalignment of pointer to vectorcallfunc
|
||||||
|
Patch31: bsc1167501-invalid-alignment.patch
|
||||||
|
# PATCH-FIX-UPSTREAM bpo40784-Fix-sqlite3-deterministic-test.patch bpo#40784 Andreas.Stieger@gmx.de
|
||||||
|
# Fix tests with SQLite 3.32
|
||||||
|
Patch32: bpo40784-Fix-sqlite3-deterministic-test.patch
|
||||||
|
BuildRequires: automake
|
||||||
|
BuildRequires: fdupes
|
||||||
|
BuildRequires: gmp-devel
|
||||||
|
BuildRequires: libbz2-devel
|
||||||
|
BuildRequires: libexpat-devel
|
||||||
|
BuildRequires: libffi-devel
|
||||||
|
BuildRequires: libuuid-devel
|
||||||
|
BuildRequires: lzma-devel
|
||||||
|
BuildRequires: netcfg
|
||||||
|
BuildRequires: openssl-devel
|
||||||
|
BuildRequires: pkgconfig
|
||||||
|
BuildRequires: timezone
|
||||||
|
BuildRequires: xz
|
||||||
|
BuildRequires: zlib-devel
|
||||||
|
#!BuildIgnore: gdk-pixbuf-loader-rsvg
|
||||||
|
%if 0%{?suse_version} >= 1500
|
||||||
|
BuildRequires: libnsl-devel
|
||||||
|
BuildRequires: libtirpc-devel
|
||||||
|
%endif
|
||||||
|
%if %{with doc}
|
||||||
|
BuildRequires: %{python_pkg_name}-Sphinx < 3.0
|
||||||
|
BuildRequires: %{python_pkg_name}-python-docs-theme
|
||||||
|
BuildRequires: %{python_pkg_name}-sphinxcontrib-qthelp >= 1.0.2
|
||||||
|
%endif
|
||||||
|
%if %{with general}
|
||||||
|
# required for idle3 (.desktop and .appdata.xml files)
|
||||||
|
BuildRequires: appstream-glib
|
||||||
|
BuildRequires: gcc-c++
|
||||||
|
BuildRequires: gdbm-devel
|
||||||
|
BuildRequires: gettext
|
||||||
|
BuildRequires: ncurses-devel
|
||||||
|
BuildRequires: readline-devel
|
||||||
|
BuildRequires: sqlite-devel
|
||||||
|
BuildRequires: tk-devel
|
||||||
|
BuildRequires: update-desktop-files
|
||||||
|
BuildRequires: pkgconfig(x11)
|
||||||
|
Requires: %{python_pkg_name}-base = %{version}
|
||||||
|
Recommends: %{python_pkg_name}-curses
|
||||||
|
Recommends: %{python_pkg_name}-dbm
|
||||||
|
Recommends: %{python_pkg_name}-pip
|
||||||
|
Provides: python = %{python_version}
|
||||||
|
%if 0%{?suse_version} >= 1500
|
||||||
|
BuildRequires: libnsl-devel
|
||||||
|
BuildRequires: libtirpc-devel
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
Python 3 is modern interpreted, object-oriented programming language,
|
||||||
|
often compared to Tcl, Perl, Scheme, or Java. You can find an overview
|
||||||
|
of Python in the documentation and tutorials included in the python3-doc
|
||||||
|
package.
|
||||||
|
|
||||||
|
This package supplies rich command line features provided by readline,
|
||||||
|
and sqlite3 support for the interpreter core, thus forming a so called
|
||||||
|
"extended" runtime.
|
||||||
|
Installing "python3" is sufficient for the vast majority of usecases.
|
||||||
|
In addition, recommended packages provide UI toolkit support (python3-curses,
|
||||||
|
python3-tk), legacy UNIX database bindings (python3-dbm), and the IDLE
|
||||||
|
development environment (python3-idle).
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-tk
|
||||||
|
Summary: TkInter, a Python Tk Interface
|
||||||
|
Requires: %{python_pkg_name} = %{version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-tk
|
||||||
|
Python interface to Tk. Tk is the GUI toolkit that comes with Tcl.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-curses
|
||||||
|
Summary: Python Interface to the (N)Curses Library
|
||||||
|
Requires: %{python_pkg_name} = %{version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-curses
|
||||||
|
An easy to use interface to the (n)curses CUI library. CUI stands for
|
||||||
|
Console User Interface.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-dbm
|
||||||
|
Summary: Python Interface to the GDBM Library
|
||||||
|
Requires: %{python_pkg_name} = %{version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-dbm
|
||||||
|
An easy to use interface for Unix DBM databases, and more specifically,
|
||||||
|
the GNU implementation GDBM.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-idle
|
||||||
|
Summary: An Integrated Development Environment for Python
|
||||||
|
Requires: %{python_pkg_name} = %{version}
|
||||||
|
Requires: %{python_pkg_name}-tk
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-idle
|
||||||
|
IDLE is a Tkinter based integrated development environment for Python.
|
||||||
|
It features a multi-window text editor with multiple undo, Python
|
||||||
|
colorizing, and many other things, as well as a Python shell window and
|
||||||
|
a debugger.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-doc
|
||||||
|
Summary: Package Documentation for Python 3
|
||||||
|
Enhances: %{python_pkg_name} = %{python_version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-doc
|
||||||
|
Tutorial, Global Module Index, Language Reference, Library Reference,
|
||||||
|
Extending and Embedding Reference, Python/C API Reference, Documenting
|
||||||
|
Python, and Macintosh Module Reference in HTML format.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-doc-devhelp
|
||||||
|
Summary: Additional Package Documentation for Python 3 in devhelp format
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-doc-devhelp
|
||||||
|
Tutorial, Global Module Index, Language Reference, Library Reference,
|
||||||
|
Extending and Embedding Reference, Python/C API Reference, Documenting
|
||||||
|
Python, and Macintosh Module Reference in format for devhelp.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-base
|
||||||
|
Summary: Python 3 Interpreter and Stdlib Core
|
||||||
|
Requires: libpython%{so_version} = %{version}-%{release}
|
||||||
|
Requires: python-rpm-macros
|
||||||
|
Recommends: %{python_pkg_name} = %{version}
|
||||||
|
#Recommends: python3-ensurepip
|
||||||
|
# python 3.1 didn't have a separate python-base, so it is wrongly
|
||||||
|
# not a conflict to have python3-3.1 and python3-base > 3.1
|
||||||
|
Obsoletes: python3 < 3.2
|
||||||
|
# no Provides, because python3 is obviously provided by package python3
|
||||||
|
# python 3.4 provides asyncio
|
||||||
|
Provides: python3-asyncio = %{version}
|
||||||
|
Obsoletes: python3-asyncio < %{version}
|
||||||
|
# python 3.6 provides typing
|
||||||
|
Provides: python3-typing = %{version}
|
||||||
|
Obsoletes: python3-typing < %{version}
|
||||||
|
# python3-xml was merged into python3, now moved into -base
|
||||||
|
Provides: python3-xml = %{version}
|
||||||
|
Obsoletes: python3-xml < %{version}
|
||||||
|
# python-importlib-metadata was specifical project which was merged into 3.8
|
||||||
|
Provides: python3-importlib-metadata = %{version}
|
||||||
|
Obsoletes: python3-importlib-metadata < %{version}
|
||||||
|
# python-importlib_resources is a backport of 3.7 behaviour into older pythons
|
||||||
|
Provides: python3-importlib_resources = %{version}
|
||||||
|
Obsoletes: python3-importlib_resources < %{version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-base
|
||||||
|
Python is an interpreted, object-oriented programming language, and is
|
||||||
|
often compared to Tcl, Perl, Scheme, or Java. You can find an overview
|
||||||
|
of Python in the documentation and tutorials included in the python-doc
|
||||||
|
package.
|
||||||
|
|
||||||
|
This package contains the interpreter core and most commonly used modules
|
||||||
|
from the standard library. This is sufficient for many usecases, but it
|
||||||
|
excludes components that depend on external libraries, most notably XML,
|
||||||
|
database and UI toolkits support.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-tools
|
||||||
|
Summary: Python Utility and Demonstration Scripts
|
||||||
|
Requires: %{python_pkg_name}-base = %{version}
|
||||||
|
Obsoletes: python3-demo < %{version}
|
||||||
|
Provides: %{python_pkg_name}-demo = %{version}
|
||||||
|
Obsoletes: python3-2to3 < %{version}
|
||||||
|
Provides: %{python_pkg_name}-2to3 = %{version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-tools
|
||||||
|
A number of scripts that are useful for building, testing or extending Python,
|
||||||
|
and a set of demonstration programs.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-devel
|
||||||
|
Summary: Include Files and Libraries Mandatory for Building Python Modules
|
||||||
|
Requires: %{python_pkg_name}-base = %{version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-devel
|
||||||
|
The Python programming language's interpreter can be extended with
|
||||||
|
dynamically loaded extensions and can be embedded in other programs.
|
||||||
|
|
||||||
|
This package contains header files, a static library, and development
|
||||||
|
tools for building Python modules, extending the Python interpreter or
|
||||||
|
embedding Python in applications.
|
||||||
|
|
||||||
|
This also includes the Python distutils, which were in the Python
|
||||||
|
package up to version 2.2.2.
|
||||||
|
|
||||||
|
%package -n %{python_pkg_name}-testsuite
|
||||||
|
Summary: Unit tests for Python and its standard library
|
||||||
|
Requires: %{python_pkg_name} = %{version}
|
||||||
|
Requires: %{python_pkg_name}-tk = %{version}
|
||||||
|
|
||||||
|
%description -n %{python_pkg_name}-testsuite
|
||||||
|
Unit tests that are useful for verifying integrity and functionality
|
||||||
|
of the installed Python interpreter and standard library.
|
||||||
|
They are a documented part of stdlib, as a module 'test'.
|
||||||
|
|
||||||
|
%package -n libpython%{so_version}
|
||||||
|
Summary: Python Interpreter shared library
|
||||||
|
Requires: %{python_pkg_name}-base >= %{version}
|
||||||
|
|
||||||
|
%description -n libpython%{so_version}
|
||||||
|
Python is an interpreted, object-oriented programming language, and is
|
||||||
|
often compared to Tcl, Perl, Scheme, or Java. You can find an overview
|
||||||
|
of Python in the documentation and tutorials included in the python-doc
|
||||||
|
(HTML) or python-doc-pdf (PDF) packages.
|
||||||
|
|
||||||
|
This package contains libpython3.2 shared library for embedding in
|
||||||
|
other applications.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q -n %{tarname}
|
||||||
|
%if "%{_lib}" == "lib64"
|
||||||
|
%patch01 -p1
|
||||||
|
%endif
|
||||||
|
%patch02 -p1
|
||||||
|
%if "%{_lib}" == "lib64"
|
||||||
|
%patch03 -p1
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%patch04 -p1
|
||||||
|
%patch06 -p1
|
||||||
|
%patch07 -p1
|
||||||
|
%patch08 -p1
|
||||||
|
%patch09 -p1
|
||||||
|
# %%patch12 -p1
|
||||||
|
%patch15 -p1
|
||||||
|
%ifarch ppc ppc64 ppc64le
|
||||||
|
%patch23 -p1
|
||||||
|
%endif
|
||||||
|
%patch24 -p1
|
||||||
|
%patch25 -p1
|
||||||
|
%patch27 -p1
|
||||||
|
%patch28 -p1
|
||||||
|
%patch29 -p1
|
||||||
|
%patch31 -p1
|
||||||
|
%patch32 -p1
|
||||||
|
|
||||||
|
# drop Autoconf version requirement
|
||||||
|
sed -i 's/^AC_PREREQ/dnl AC_PREREQ/' configure.ac
|
||||||
|
|
||||||
|
# fix shebangs - convert /usr/local/bin/python and /usr/bin/env/python to /usr/bin/python3
|
||||||
|
for dir in Lib Tools; do
|
||||||
|
# find *.py, filter to files that contain bad shebangs
|
||||||
|
# break up "/""usr" like this to prevent replacing with %%{_prefix}
|
||||||
|
find $dir -name '*.py' -type f -print0 \
|
||||||
|
| xargs -0 grep -lE '^#! *(/''usr/.*bin/(env +)?)?python' \
|
||||||
|
| xargs sed -r -i -e '1s@^#![[:space:]]*(/''usr/(local/)?bin/(env +)?)?python([0-9]+(\.[0-9]+)?)?@#!%{_bindir}/python3@'
|
||||||
|
done
|
||||||
|
|
||||||
|
# drop in-tree libffi and expat
|
||||||
|
rm -r Modules/_ctypes/libffi* Modules/_ctypes/darwin
|
||||||
|
rm -r Modules/expat
|
||||||
|
|
||||||
|
# drop duplicate README from site-packages
|
||||||
|
rm Lib/site-packages/README.txt
|
||||||
|
|
||||||
|
%build
|
||||||
|
%if %{with doc}
|
||||||
|
TODAY_DATE=`date -r %{SOURCE0} "+%%B %%d, %%Y"`
|
||||||
|
# TODO use not date of tarball but date of latest patch
|
||||||
|
|
||||||
|
cd Doc
|
||||||
|
sed -i "s/^today = .*/today = '$TODAY_DATE'/" conf.py
|
||||||
|
%make_build -j1 html
|
||||||
|
|
||||||
|
# Build also devhelp files
|
||||||
|
sphinx-build -a -b devhelp . build/devhelp
|
||||||
|
rm -rfv build/devhelp/.doctrees
|
||||||
|
%else
|
||||||
|
%define _lto_cflags %{nil}
|
||||||
|
# use rpm_opt_flags
|
||||||
|
export OPT="%{optflags} -DOPENSSL_LOAD_CONF -fwrapv $(pkg-config --cflags-only-I libffi) -fno-semantic-interposition"
|
||||||
|
|
||||||
|
touch -r %{SOURCE0} Makefile.pre.in
|
||||||
|
|
||||||
|
autoreconf -fvi
|
||||||
|
|
||||||
|
%if 0%{?sles_version}
|
||||||
|
sed -e 's/-fprofile-correction//' -i Makefile.pre.in
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%configure \
|
||||||
|
--docdir=%{_docdir}/python \
|
||||||
|
--enable-ipv6 \
|
||||||
|
--enable-shared \
|
||||||
|
--with-ensurepip=no \
|
||||||
|
--with-system-ffi \
|
||||||
|
--with-system-expat \
|
||||||
|
--with-lto \
|
||||||
|
%if %{with profileopt}
|
||||||
|
--enable-optimizations \
|
||||||
|
%endif
|
||||||
|
--enable-loadable-sqlite-extensions
|
||||||
|
|
||||||
|
# prevent make from trying to rebuild PYTHON_FOR_GEN stuff
|
||||||
|
%make_build -t Python/Python-ast.c \
|
||||||
|
Include/Python-ast.h \
|
||||||
|
Objects/typeslots.inc \
|
||||||
|
Python/opcode_targets.h \
|
||||||
|
Include/opcode.h
|
||||||
|
|
||||||
|
%if %{with general}
|
||||||
|
%make_build
|
||||||
|
%endif
|
||||||
|
%if %{with base}
|
||||||
|
%if %{with profileopt}
|
||||||
|
target=profile-opt
|
||||||
|
%else
|
||||||
|
target=all
|
||||||
|
%endif
|
||||||
|
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH \
|
||||||
|
%make_build $target
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%check
|
||||||
|
%if %{with general}
|
||||||
|
# exclude test_gdb -- it doesn't run in buildservice anyway, and fails on missing debuginfos
|
||||||
|
# when you install gdb into your test env
|
||||||
|
EXCLUDE="test_gdb"
|
||||||
|
# we patch out the message to recommend zypper in and thus this would fail
|
||||||
|
EXCLUDE="$EXCLUDE test_pydoc"
|
||||||
|
|
||||||
|
%ifarch %{arm} s390x
|
||||||
|
# test_multiprocessing_forkserver is racy
|
||||||
|
EXCLUDE="$EXCLUDE test_multiprocessing_forkserver"
|
||||||
|
%endif
|
||||||
|
%ifarch ppc ppc64 ppc64le
|
||||||
|
# exclue test_faulthandler due to bnc#831629
|
||||||
|
EXCLUDE="$EXCLUDE test_faulthandler"
|
||||||
|
%endif
|
||||||
|
# some tests break in QEMU
|
||||||
|
%if 0%{?qemu_user_space_build}
|
||||||
|
EXCLUDE="$EXCLUDE test_multiprocessing_forkserver test_multiprocessing_spawn test_os test_posix test_signal test_socket test_subprocess"
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# This test (part of test_uuid) requires real network interfaces
|
||||||
|
# so that ifconfig output has "HWaddr <something>". Some kvm instances
|
||||||
|
# done have any such interface breaking the uuid module.
|
||||||
|
EXCLUDE="$EXCLUDE test_uuid"
|
||||||
|
|
||||||
|
# TEMPORARILY EXCLUDE test_capi bpo#37169
|
||||||
|
EXCLUDE="$EXCLUDE test_capi"
|
||||||
|
|
||||||
|
# Limit virtual memory to avoid spurious failures
|
||||||
|
if test $(ulimit -v) = unlimited || test $(ulimit -v) -gt 10000000; then
|
||||||
|
ulimit -v 10000000 || :
|
||||||
|
fi
|
||||||
|
|
||||||
|
export PYTHONPATH="$(pwd -P)/Lib"
|
||||||
|
# Use timeout, like make target buildbottest
|
||||||
|
# We cannot run tests parallel, because osc build environment doesn’t
|
||||||
|
# have /dev/shm
|
||||||
|
%make_build -j1 test TESTOPTS="-u curses -v -x $EXCLUDE --timeout=1200"
|
||||||
|
# use network, be verbose:
|
||||||
|
#make test TESTOPTS="-l -u network -v"
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%install
|
||||||
|
%if %{with doc}
|
||||||
|
export PDOCS=%{buildroot}%{_docdir}/python3
|
||||||
|
mkdir -p $PDOCS
|
||||||
|
# generated docs
|
||||||
|
rm Doc/build/*/.buildinfo
|
||||||
|
cp -r Doc/build/html $PDOCS
|
||||||
|
# misc
|
||||||
|
install -d -m 755 $PDOCS/Misc
|
||||||
|
rm Misc/README.AIX
|
||||||
|
for i in Misc/* ; do
|
||||||
|
[ -f $i ] && install -c -m 644 $i $PDOCS/Misc/
|
||||||
|
done
|
||||||
|
# devhelp
|
||||||
|
mkdir -p %{buildroot}%{_datadir}/gtk-doc/html/python3
|
||||||
|
cp -r Doc/build/devhelp %{buildroot}%{_datadir}/gtk-doc/html/Python
|
||||||
|
rm -rf %{buildroot}%{_datadir}/gtk-doc/html/Python/.doctrees
|
||||||
|
%endif
|
||||||
|
%if %{with general}
|
||||||
|
%make_install
|
||||||
|
|
||||||
|
# clean out stuff that is in python-base and subpackages
|
||||||
|
|
||||||
|
find %{buildroot}%{_bindir} -mindepth 1 -not -name "*idle3*" -print -delete
|
||||||
|
rm %{buildroot}%{_libdir}/lib*
|
||||||
|
rm -r %{buildroot}%{_libdir}/pkgconfig
|
||||||
|
rm -r %{buildroot}%{_mandir}/*
|
||||||
|
rm -r %{buildroot}%{_includedir}/*
|
||||||
|
|
||||||
|
rm -r %{buildroot}%{sitedir}/config*
|
||||||
|
find %{buildroot}%{sitedir} -name "*.egg-info" -delete
|
||||||
|
rm -r %{buildroot}%{sitedir}/__pycache__
|
||||||
|
rm -r %{buildroot}%{sitedir}/site-packages
|
||||||
|
rm %{buildroot}%{sitedir}/*.*
|
||||||
|
|
||||||
|
for module in \
|
||||||
|
asyncio ctypes collections concurrent distutils email encodings \
|
||||||
|
ensurepip html http \
|
||||||
|
importlib json logging multiprocessing pydoc_data unittest \
|
||||||
|
urllib venv wsgiref lib2to3 test turtledemo \
|
||||||
|
xml xmlrpc
|
||||||
|
do
|
||||||
|
rm -r %{buildroot}%{sitedir}/$module
|
||||||
|
done
|
||||||
|
|
||||||
|
for library in \
|
||||||
|
array _asyncio audioop binascii _bisect _bz2 cmath _codecs_* \
|
||||||
|
_contextvars _crypt _csv _ctypes _datetime _decimal fcntl grp \
|
||||||
|
_hashlib _heapq _json _lsprof _lzma math mmap _multibytecodec \
|
||||||
|
_multiprocessing _opcode ossaudiodev parser _pickle _posixshmem \
|
||||||
|
_posixsubprocess _queue _random resource select _ssl _socket spwd \
|
||||||
|
_statistics _struct syslog termios _testbuffer _testimportmultiple \
|
||||||
|
_testmultiphase unicodedata zlib _ctypes_test _testinternalcapi _testcapi xxlimited \
|
||||||
|
_xxtestfuzz _xxsubinterpreters _elementtree pyexpat _md5 _sha1 \
|
||||||
|
_sha256 _sha512 _blake2 _sha3 _uuid
|
||||||
|
do
|
||||||
|
eval rm "%{buildroot}%{sitedir}/lib-dynload/$library.*"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Idle is not packaged in base due to the appstream-glib dependency
|
||||||
|
# move idle config into /etc
|
||||||
|
install -d -m 755 %{buildroot}%{_sysconfdir}/idle3
|
||||||
|
(
|
||||||
|
cd %{buildroot}/%{sitedir}/idlelib/
|
||||||
|
for file in *.def ; do
|
||||||
|
mv $file %{buildroot}%{_sysconfdir}/idle3/
|
||||||
|
ln -sf %{_sysconfdir}/idle3/$file %{buildroot}/%{sitedir}/idlelib/
|
||||||
|
done
|
||||||
|
)
|
||||||
|
|
||||||
|
# install idle icons
|
||||||
|
for size in 16 32 48 ; do
|
||||||
|
install -m 644 -D Lib/idlelib/Icons/idle_${size}.png \
|
||||||
|
%{buildroot}%{_datadir}/icons/hicolor/${size}x${size}/apps/idle3.png
|
||||||
|
done
|
||||||
|
|
||||||
|
# install idle desktop file
|
||||||
|
install -m 644 -D -t %{buildroot}%{_datadir}/applications %{SOURCE19}
|
||||||
|
%suse_update_desktop_file idle3
|
||||||
|
|
||||||
|
install -m 644 -D -t %{buildroot}%{_datadir}/metainfo %{SOURCE20}
|
||||||
|
appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/idle3.appdata.xml
|
||||||
|
|
||||||
|
%fdupes %{buildroot}/%{_libdir}/python%{python_version}
|
||||||
|
%endif
|
||||||
|
%if %{with base}
|
||||||
|
%make_install
|
||||||
|
|
||||||
|
# remove .a
|
||||||
|
find %{buildroot} -name "*.a" -delete
|
||||||
|
|
||||||
|
# install "site-packages" and __pycache__ for third parties
|
||||||
|
install -d -m 755 %{buildroot}%{sitedir}/site-packages
|
||||||
|
install -d -m 755 %{buildroot}%{sitedir}/site-packages/__pycache__
|
||||||
|
# and their 32bit counterparts explicitly
|
||||||
|
mkdir -p %{buildroot}%{_prefix}/lib/python%{python_version}/site-packages/__pycache__
|
||||||
|
|
||||||
|
# cleanup parts that don't belong
|
||||||
|
for dir in curses dbm sqlite3 tkinter idlelib; do
|
||||||
|
find "%{buildroot}/%{sitedir}/$dir"/* -maxdepth 0 -name "test" -o -exec rm -rf {} +
|
||||||
|
done
|
||||||
|
rm -fv %{buildroot}%{dynlib nis}
|
||||||
|
|
||||||
|
# overwrite the copied binary with a link
|
||||||
|
ln -sf python%{python_version} %{buildroot}%{_bindir}/python3
|
||||||
|
|
||||||
|
# link shared library instead of static library that tools expect
|
||||||
|
ln -s ../../libpython%{python_abi}.so %{buildroot}%{_libdir}/python%{python_version}/config-%{python_abi}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}/libpython%{python_abi}.so
|
||||||
|
|
||||||
|
# delete idle3, which has to many packaging dependencies for base
|
||||||
|
rm %{buildroot}%{_bindir}/idle3*
|
||||||
|
|
||||||
|
# replace duplicate .pyo/.pyc with hardlinks
|
||||||
|
%fdupes %{buildroot}/%{sitedir}
|
||||||
|
|
||||||
|
# documentation
|
||||||
|
export PDOCS=%{buildroot}%{_docdir}/%{name}
|
||||||
|
install -d -m 755 $PDOCS
|
||||||
|
install -c -m 644 %{SOURCE3} $PDOCS/
|
||||||
|
install -c -m 644 README.rst $PDOCS/
|
||||||
|
|
||||||
|
# tools
|
||||||
|
for x in `find Tools/ \( -not -name Makefile \) -print | sort` ; do
|
||||||
|
test -d $x && ( install -c -m 755 -d $PDOCS/$x ) \
|
||||||
|
|| ( install -c -m 644 $x $PDOCS/$x )
|
||||||
|
done
|
||||||
|
# gdb script is shipped with devel subpackage
|
||||||
|
rm -r $PDOCS/Tools/gdb
|
||||||
|
# clean up the bat files
|
||||||
|
find "$PDOCS" -name "*.bat" -delete
|
||||||
|
|
||||||
|
# put gdb helper script into place
|
||||||
|
install -m 755 -D Tools/gdb/libpython.py %{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py
|
||||||
|
|
||||||
|
# install devel files to /config
|
||||||
|
#cp Makefile Makefile.pre.in Makefile.pre $RPM_BUILD_ROOT%{sitedir}/config-%{python_abi}/
|
||||||
|
|
||||||
|
# RPM macros
|
||||||
|
mkdir -p %{buildroot}%{_rpmconfigdir}/macros.d/
|
||||||
|
install -m 644 %{SOURCE7} %{buildroot}%{_rpmconfigdir}/macros.d/ # macros.python3
|
||||||
|
|
||||||
|
# import_failed hooks
|
||||||
|
FAILDIR=%{buildroot}/%{sitedir}/_import_failed
|
||||||
|
mkdir $FAILDIR
|
||||||
|
install -m 644 %{SOURCE8} %{SOURCE9} $FAILDIR # import_failed.*
|
||||||
|
LD_LIBRARY_PATH=. ./python -c "from py_compile import compile; compile('$FAILDIR/import_failed.py', dfile='%{sitedir}/_import_failed/import_failed.py')"
|
||||||
|
LD_LIBRARY_PATH=. ./python -O -c "from py_compile import compile; compile('$FAILDIR/import_failed.py', dfile='%{sitedir}/_import_failed/import_failed.py')"
|
||||||
|
(
|
||||||
|
cd $FAILDIR
|
||||||
|
while read package modules; do
|
||||||
|
for module in $modules; do
|
||||||
|
ln import_failed.py $module.py
|
||||||
|
pushd __pycache__
|
||||||
|
for i in import_failed*; do
|
||||||
|
ln $i "$module${i#import_failed}"
|
||||||
|
done
|
||||||
|
popd
|
||||||
|
done
|
||||||
|
done < %{SOURCE9}
|
||||||
|
)
|
||||||
|
echo %{sitedir}/_import_failed > %{buildroot}/%{sitedir}/site-packages/zzzz-import-failed-hooks.pth
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with general}
|
||||||
|
%files -n %{python_pkg_name}-tk
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%{sitedir}/tkinter
|
||||||
|
%exclude %{sitedir}/tkinter/test
|
||||||
|
%{dynlib _tkinter}
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-curses
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%{sitedir}/curses
|
||||||
|
%{dynlib _curses}
|
||||||
|
%{dynlib _curses_panel}
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-dbm
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%{sitedir}/dbm
|
||||||
|
%{dynlib _dbm}
|
||||||
|
%{dynlib _gdbm}
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%dir %{sitedir}
|
||||||
|
%dir %{sitedir}/lib-dynload
|
||||||
|
%{sitedir}/sqlite3
|
||||||
|
%exclude %{sitedir}/sqlite3/test
|
||||||
|
%{dynlib readline}
|
||||||
|
%{dynlib _sqlite3}
|
||||||
|
%{dynlib nis}
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-idle
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%{sitedir}/idlelib
|
||||||
|
%dir %{_sysconfdir}/idle3
|
||||||
|
%config %{_sysconfdir}/idle3/*
|
||||||
|
%doc Lib/idlelib/NEWS.txt
|
||||||
|
%doc Lib/idlelib/README.txt
|
||||||
|
%doc Lib/idlelib/TODO.txt
|
||||||
|
%doc Lib/idlelib/extend.txt
|
||||||
|
%doc Lib/idlelib/ChangeLog
|
||||||
|
%{_bindir}/idle3
|
||||||
|
%{_datadir}/applications/idle3.desktop
|
||||||
|
%{_datadir}/metainfo/idle3.appdata.xml
|
||||||
|
%{_datadir}/icons/hicolor/*/apps/idle3.png
|
||||||
|
%dir %{_datadir}/icons/hicolor
|
||||||
|
%dir %{_datadir}/icons/hicolor/16x16
|
||||||
|
%dir %{_datadir}/icons/hicolor/32x32
|
||||||
|
%dir %{_datadir}/icons/hicolor/48x48
|
||||||
|
%dir %{_datadir}/icons/hicolor/*/apps
|
||||||
|
%attr(755, root, root) %{_bindir}/idle%{python_version}
|
||||||
|
# endif for if general
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with doc}
|
||||||
|
%files -n %{python_pkg_name}-doc
|
||||||
|
%dir %{_docdir}/python3
|
||||||
|
%doc %{_docdir}/python3/Misc
|
||||||
|
%doc %{_docdir}/python3/html
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-doc-devhelp
|
||||||
|
%dir %{_datadir}/gtk-doc
|
||||||
|
%dir %{_datadir}/gtk-doc/html
|
||||||
|
%doc %{_datadir}/gtk-doc/html/Python
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with base}
|
||||||
|
%post -n libpython%{so_version} -p /sbin/ldconfig
|
||||||
|
%postun -n libpython%{so_version} -p /sbin/ldconfig
|
||||||
|
|
||||||
|
%files -n libpython%{so_version}
|
||||||
|
%defattr(644, root,root)
|
||||||
|
%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor}
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-tools
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%{sitedir}/turtledemo
|
||||||
|
%{_bindir}/2to3
|
||||||
|
%attr(755, root, root)%{_bindir}/2to3-%{python_version}
|
||||||
|
%doc %{_docdir}/%{name}/Tools
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-devel
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%{_libdir}/libpython%{python_abi}.so
|
||||||
|
%{_libdir}/libpython3.so
|
||||||
|
%{_libdir}/pkgconfig/*
|
||||||
|
%{_includedir}/python%{python_abi}
|
||||||
|
%{sitedir}/config-%{python_abi}-*
|
||||||
|
%defattr(755, root, root)
|
||||||
|
%{_bindir}/python%{python_abi}-config
|
||||||
|
# %%{_bindir}/python%%{python_version}-config
|
||||||
|
%{_bindir}/python3-config
|
||||||
|
# Own these directories to not depend on gdb
|
||||||
|
%dir %{_datadir}/gdb
|
||||||
|
%dir %{_datadir}/gdb/auto-load
|
||||||
|
%dir %{_datadir}/gdb/auto-load%{_prefix}
|
||||||
|
%dir %{_datadir}/gdb/auto-load%{_libdir}
|
||||||
|
%{_datadir}/gdb/auto-load/%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-testsuite
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
%{sitedir}/test
|
||||||
|
%{sitedir}/*/test
|
||||||
|
%{sitedir}/*/tests
|
||||||
|
%{dynlib _ctypes_test}
|
||||||
|
%{dynlib _testbuffer}
|
||||||
|
%{dynlib _testcapi}
|
||||||
|
%{dynlib _testinternalcapi}
|
||||||
|
%{dynlib _testimportmultiple}
|
||||||
|
%{dynlib _testmultiphase}
|
||||||
|
%{dynlib xxlimited}
|
||||||
|
# workaround for missing packages
|
||||||
|
%dir %{sitedir}/sqlite3
|
||||||
|
%dir %{sitedir}/tkinter
|
||||||
|
|
||||||
|
%files -n %{python_pkg_name}-base
|
||||||
|
%defattr(644, root, root, 755)
|
||||||
|
# docs
|
||||||
|
%dir %{_docdir}/%{name}
|
||||||
|
%doc %{_docdir}/%{name}/README.rst
|
||||||
|
%license LICENSE
|
||||||
|
%doc %{_docdir}/%{name}/README.SUSE
|
||||||
|
%{_mandir}/man1/python3.1%{?ext_man}
|
||||||
|
%{_mandir}/man1/python%{python_version}.1%{?ext_man}
|
||||||
|
# license text, not a doc because the code can use it at run-time
|
||||||
|
%{sitedir}/LICENSE.txt
|
||||||
|
# RPM macros
|
||||||
|
%{_rpmconfigdir}/macros.d/macros.python3
|
||||||
|
|
||||||
|
# binary parts
|
||||||
|
%dir %{sitedir}/lib-dynload
|
||||||
|
%{dynlib array}
|
||||||
|
%{dynlib _asyncio}
|
||||||
|
%{dynlib audioop}
|
||||||
|
%{dynlib binascii}
|
||||||
|
%{dynlib _bisect}
|
||||||
|
%{dynlib _bz2}
|
||||||
|
%{dynlib cmath}
|
||||||
|
%{dynlib _codecs_cn}
|
||||||
|
%{dynlib _codecs_hk}
|
||||||
|
%{dynlib _codecs_iso2022}
|
||||||
|
%{dynlib _codecs_jp}
|
||||||
|
%{dynlib _codecs_kr}
|
||||||
|
%{dynlib _codecs_tw}
|
||||||
|
%{dynlib _contextvars}
|
||||||
|
%{dynlib _crypt}
|
||||||
|
%{dynlib _csv}
|
||||||
|
%{dynlib _ctypes}
|
||||||
|
%{dynlib _datetime}
|
||||||
|
%{dynlib _decimal}
|
||||||
|
%{dynlib _elementtree}
|
||||||
|
%{dynlib fcntl}
|
||||||
|
%{dynlib grp}
|
||||||
|
%{dynlib _hashlib}
|
||||||
|
%{dynlib _heapq}
|
||||||
|
%{dynlib _json}
|
||||||
|
%{dynlib _lsprof}
|
||||||
|
%{dynlib _lzma}
|
||||||
|
%{dynlib math}
|
||||||
|
%{dynlib mmap}
|
||||||
|
%{dynlib _multibytecodec}
|
||||||
|
%{dynlib _multiprocessing}
|
||||||
|
%{dynlib _opcode}
|
||||||
|
%{dynlib ossaudiodev}
|
||||||
|
%{dynlib parser}
|
||||||
|
%{dynlib _pickle}
|
||||||
|
%{dynlib _posixshmem}
|
||||||
|
%{dynlib _posixsubprocess}
|
||||||
|
%{dynlib pyexpat}
|
||||||
|
%{dynlib _queue}
|
||||||
|
%{dynlib _random}
|
||||||
|
%{dynlib resource}
|
||||||
|
%{dynlib select}
|
||||||
|
%{dynlib _socket}
|
||||||
|
%{dynlib spwd}
|
||||||
|
%{dynlib _ssl}
|
||||||
|
%{dynlib _statistics}
|
||||||
|
%{dynlib _struct}
|
||||||
|
%{dynlib syslog}
|
||||||
|
%{dynlib termios}
|
||||||
|
%{dynlib unicodedata}
|
||||||
|
%{dynlib _uuid}
|
||||||
|
%{dynlib _xxsubinterpreters}
|
||||||
|
%{dynlib _xxtestfuzz}
|
||||||
|
%{dynlib zlib}
|
||||||
|
# hashlib fallback modules
|
||||||
|
%{dynlib _blake2}
|
||||||
|
%{dynlib _md5}
|
||||||
|
%{dynlib _sha1}
|
||||||
|
%{dynlib _sha256}
|
||||||
|
%{dynlib _sha512}
|
||||||
|
%{dynlib _sha3}
|
||||||
|
# python parts
|
||||||
|
%dir %{_prefix}/lib/python%{python_version}
|
||||||
|
%dir %{_prefix}/lib/python%{python_version}/site-packages
|
||||||
|
%dir %{_prefix}/lib/python%{python_version}/site-packages/__pycache__
|
||||||
|
%dir %{sitedir}
|
||||||
|
%dir %{sitedir}/site-packages
|
||||||
|
%dir %{sitedir}/site-packages/__pycache__
|
||||||
|
%exclude %{sitedir}/*/test
|
||||||
|
%exclude %{sitedir}/*/tests
|
||||||
|
%{sitedir}/*.py
|
||||||
|
%{sitedir}/asyncio
|
||||||
|
%{sitedir}/ctypes
|
||||||
|
%{sitedir}/collections
|
||||||
|
%{sitedir}/concurrent
|
||||||
|
%{sitedir}/distutils
|
||||||
|
%{sitedir}/email
|
||||||
|
%{sitedir}/encodings
|
||||||
|
%{sitedir}/ensurepip
|
||||||
|
%{sitedir}/html
|
||||||
|
%{sitedir}/http
|
||||||
|
%{sitedir}/importlib
|
||||||
|
%{sitedir}/json
|
||||||
|
%{sitedir}/lib2to3
|
||||||
|
%{sitedir}/logging
|
||||||
|
%{sitedir}/multiprocessing
|
||||||
|
%{sitedir}/pydoc_data
|
||||||
|
%{sitedir}/unittest
|
||||||
|
%{sitedir}/urllib
|
||||||
|
%{sitedir}/venv
|
||||||
|
%{sitedir}/wsgiref
|
||||||
|
%{sitedir}/xml
|
||||||
|
%{sitedir}/xmlrpc
|
||||||
|
%{sitedir}/__pycache__
|
||||||
|
# import-failed hooks
|
||||||
|
%{sitedir}/_import_failed
|
||||||
|
%{sitedir}/site-packages/zzzz-import-failed-hooks.pth
|
||||||
|
# symlinks
|
||||||
|
%{_bindir}/python3
|
||||||
|
%{_bindir}/pydoc3
|
||||||
|
# executables
|
||||||
|
%attr(755, root, root) %{_bindir}/pydoc%{python_version}
|
||||||
|
# %%attr(755, root, root) %%{_bindir}/python%%{python_abi}
|
||||||
|
%attr(755, root, root) %{_bindir}/python%{python_version}
|
||||||
|
# endif for if base
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%changelog
|
145
skip_random_failing_tests.patch
Normal file
145
skip_random_failing_tests.patch
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
From: Michel Normand <normand@linux.vnet.ibm.com>
|
||||||
|
Subject: skip random failing tests
|
||||||
|
Date: Thu, 18 Jan 2018 15:48:52 +0100
|
||||||
|
|
||||||
|
skip random failing tests:
|
||||||
|
in _test_multiprocessing.py:
|
||||||
|
test_async_timeout
|
||||||
|
test_waitfor_timeout
|
||||||
|
test_wait_integer
|
||||||
|
in test_events.py:
|
||||||
|
test_run_until_complete
|
||||||
|
test_signal_handling_args
|
||||||
|
test_call_later
|
||||||
|
|
||||||
|
Reported to fail on ppc64le host on multiple osc build trials:
|
||||||
|
(all failed for ppc64le, except one for ppc)
|
||||||
|
===
|
||||||
|
[michel@abanc:~/work/home:michel_mno:branches:devel:languages:python:Factory/python3]
|
||||||
|
$idx=1; while test 1; do echo "trial $idx:"; osc build \
|
||||||
|
--vm-type kvm -j 8 --threads 4 openSUSE_Factory_PowerPC ppc64le \
|
||||||
|
>/tmp/python3_trialx_${idx}.log 2>&1 || break; ((idx++)); done
|
||||||
|
===
|
||||||
|
FAIL: test_async_timeout (test.test_multiprocessing_fork.WithProcessesTestPool)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/_test_multiprocessing.py", line 2017, in test_async_timeout
|
||||||
|
self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2)
|
||||||
|
AssertionError: TimeoutError not raised by <test._test_multiprocessing.TimingWrapper object at 0x7fff89b45f28>
|
||||||
|
===
|
||||||
|
FAIL: test_waitfor_timeout (test.test_multiprocessing_spawn.WithManagerTestCondition)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/_test_multiprocessing.py", line 1169, in test_waitfor_timeout
|
||||||
|
self.assertTrue(success.value)
|
||||||
|
AssertionError: False is not true
|
||||||
|
===
|
||||||
|
FAIL: test_run_until_complete (test.test_asyncio.test_events.SelectEventLoopTests)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 285, in test_run_until_complete
|
||||||
|
self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0)
|
||||||
|
AssertionError: False is not true : 3.966844968999993
|
||||||
|
===
|
||||||
|
FAIL: test_signal_handling_args (test.test_asyncio.test_events.SelectEventLoopTests)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 566, in test_signal_handling_args
|
||||||
|
self.assertEqual(caught, 1)
|
||||||
|
AssertionError: 0 != 1
|
||||||
|
=== (ppc)
|
||||||
|
FAIL: test_wait_integer (test.test_multiprocessing_spawn.TestWait)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/_test_multiprocessing.py", line 3762, in test_wait_integer
|
||||||
|
self.assertLess(delta, expected + 2)
|
||||||
|
AssertionError: 5.576360702514648 not less than 5
|
||||||
|
===
|
||||||
|
===
|
||||||
|
======================================================================
|
||||||
|
FAIL: test_call_later (test.test_asyncio.test_events.PollEventLoopTests)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 309, in test_call_later
|
||||||
|
self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0)
|
||||||
|
AssertionError: False is not true : 2.7154626529999746
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
FAIL: test_call_later (test.test_asyncio.test_events.SelectEventLoopTests)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 309, in test_call_later
|
||||||
|
self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0)
|
||||||
|
AssertionError: False is not true : 4.137590406000015
|
||||||
|
===
|
||||||
|
|
||||||
|
|
||||||
|
Signed-off-by: Michel Normand <normand@linux.vnet.ibm.com>
|
||||||
|
---
|
||||||
|
Lib/test/_test_multiprocessing.py | 3 +++
|
||||||
|
Lib/test/test_asyncio/test_events.py | 4 +++-
|
||||||
|
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/Lib/test/_test_multiprocessing.py
|
||||||
|
+++ b/Lib/test/_test_multiprocessing.py
|
||||||
|
@@ -1521,6 +1521,7 @@ class _TestCondition(BaseTestCase):
|
||||||
|
success.value = True
|
||||||
|
|
||||||
|
@unittest.skipUnless(HAS_SHAREDCTYPES, 'needs sharedctypes')
|
||||||
|
+ @unittest.skip("transient failure on PowerPC")
|
||||||
|
def test_waitfor_timeout(self):
|
||||||
|
# based on test in test/lock_tests.py
|
||||||
|
cond = self.Condition()
|
||||||
|
@@ -2411,6 +2412,7 @@ class _TestPool(BaseTestCase):
|
||||||
|
self.assertEqual(get(), 49)
|
||||||
|
self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1)
|
||||||
|
|
||||||
|
+ @unittest.skip("transient failure on PowerPC")
|
||||||
|
def test_async_timeout(self):
|
||||||
|
res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 1.0))
|
||||||
|
get = TimingWrapper(res.get)
|
||||||
|
@@ -4564,6 +4566,7 @@ class TestWait(unittest.TestCase):
|
||||||
|
sem.release()
|
||||||
|
time.sleep(period)
|
||||||
|
|
||||||
|
+ @unittest.skip("transient failure on PowerPC")
|
||||||
|
def test_wait_integer(self):
|
||||||
|
from multiprocessing.connection import wait
|
||||||
|
|
||||||
|
--- a/Lib/test/test_asyncio/test_events.py
|
||||||
|
+++ b/Lib/test/test_asyncio/test_events.py
|
||||||
|
@@ -266,6 +266,7 @@ class EventLoopTestsMixin:
|
||||||
|
# Note: because of the default Windows timing granularity of
|
||||||
|
# 15.6 msec, we use fairly long sleep times here (~100 msec).
|
||||||
|
|
||||||
|
+ @unittest.skip("transient failure on PowerPC")
|
||||||
|
def test_run_until_complete(self):
|
||||||
|
t0 = self.loop.time()
|
||||||
|
self.loop.run_until_complete(asyncio.sleep(0.1))
|
||||||
|
@@ -293,7 +294,7 @@ class EventLoopTestsMixin:
|
||||||
|
self.loop.run_forever()
|
||||||
|
t1 = time.monotonic()
|
||||||
|
self.assertEqual(results, ['hello world'])
|
||||||
|
- self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0)
|
||||||
|
+ self.assertTrue(0.08 <= t1-t0 <= 5.0, t1-t0)
|
||||||
|
|
||||||
|
def test_call_soon(self):
|
||||||
|
results = []
|
||||||
|
@@ -478,6 +479,7 @@ class EventLoopTestsMixin:
|
||||||
|
self.assertEqual(caught, 1)
|
||||||
|
|
||||||
|
@unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM')
|
||||||
|
+ @unittest.skip("transient failure on PowerPC")
|
||||||
|
def test_signal_handling_args(self):
|
||||||
|
some_args = (42,)
|
||||||
|
caught = 0
|
||||||
|
--- a/Lib/test/test_buffer.py
|
||||||
|
+++ b/Lib/test/test_buffer.py
|
||||||
|
@@ -2504,6 +2504,7 @@ class TestBufferProtocol(unittest.TestCa
|
||||||
|
a = ndarray(items, shape=[2, 2, 2], format="b")
|
||||||
|
check(memoryview(a), vsize(base_struct + 3 * per_dim))
|
||||||
|
|
||||||
|
+ @unittest.skip("transient failure on PowerPC")
|
||||||
|
def test_memoryview_struct_module(self):
|
||||||
|
|
||||||
|
class INT(object):
|
69
skipped_tests.py
Normal file
69
skipped_tests.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Simple regexp-based skipped test checker.
|
||||||
|
It lists tests that are mentioned (presumably for exclusion)
|
||||||
|
in BASE, and in MAIN (presumably for inclusion)
|
||||||
|
and reports discrepancies.
|
||||||
|
|
||||||
|
This will have a number of
|
||||||
|
"""
|
||||||
|
|
||||||
|
MAIN = "python3.spec"
|
||||||
|
|
||||||
|
import glob
|
||||||
|
import re
|
||||||
|
from os.path import basename
|
||||||
|
|
||||||
|
alltests = set()
|
||||||
|
qemu_exclusions = set()
|
||||||
|
|
||||||
|
for item in glob.glob("Python-*/Lib/test/test_*"):
|
||||||
|
testname = basename(item)
|
||||||
|
if testname.endswith(".py"):
|
||||||
|
testname = testname[:-3]
|
||||||
|
alltests.add(testname)
|
||||||
|
|
||||||
|
testre = re.compile(r'[\s"](test_\w+)\b')
|
||||||
|
|
||||||
|
def find_tests_in_spec(specname):
|
||||||
|
global qemu_exclusions
|
||||||
|
|
||||||
|
found_tests = set()
|
||||||
|
with open(specname) as spec:
|
||||||
|
in_qemu = False
|
||||||
|
for line in spec:
|
||||||
|
line = line.strip()
|
||||||
|
if "#" in line:
|
||||||
|
line = line[:line.index("#")]
|
||||||
|
tests = set(testre.findall(line))
|
||||||
|
found_tests |= tests
|
||||||
|
if line == "%if 0%{?qemu_user_space_build} > 0":
|
||||||
|
in_qemu = True
|
||||||
|
if in_qemu:
|
||||||
|
if line == "%endif":
|
||||||
|
in_qemu = False
|
||||||
|
qemu_exclusions |= tests
|
||||||
|
return found_tests
|
||||||
|
|
||||||
|
excluded = find_tests_in_spec(MAIN)
|
||||||
|
|
||||||
|
#print("--- excluded tests:", " ".join(sorted(excluded)))
|
||||||
|
#print("--- included tests:", " ".join(sorted(included)))
|
||||||
|
|
||||||
|
mentioned = excluded
|
||||||
|
nonexistent = mentioned - alltests
|
||||||
|
missing = excluded - qemu_exclusions
|
||||||
|
|
||||||
|
print("--- the following tests are excluded for QEMU and not tested in python")
|
||||||
|
print("--- (that probably means we don't need to worry about them)")
|
||||||
|
for test in sorted(qemu_exclusions - excluded):
|
||||||
|
print(test)
|
||||||
|
|
||||||
|
print("--- the following tests might be excluded in python:")
|
||||||
|
for test in sorted(missing):
|
||||||
|
print(test)
|
||||||
|
|
||||||
|
if nonexistent:
|
||||||
|
print("--- the following tests don't exist:")
|
||||||
|
for test in sorted(nonexistent):
|
||||||
|
print(test)
|
12
subprocess-raise-timeout.patch
Normal file
12
subprocess-raise-timeout.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
--- a/Lib/test/test_subprocess.py
|
||||||
|
+++ b/Lib/test/test_subprocess.py
|
||||||
|
@@ -1124,7 +1124,8 @@ class ProcessTestCase(BaseTestCase):
|
||||||
|
self.assertIn("0.0001", str(c.exception)) # For coverage of __str__.
|
||||||
|
# Some heavily loaded buildbots (sparc Debian 3.x) require this much
|
||||||
|
# time to start.
|
||||||
|
- self.assertEqual(p.wait(timeout=3), 0)
|
||||||
|
+ # OBS might require even more
|
||||||
|
+ self.assertEqual(p.wait(timeout=10), 0)
|
||||||
|
|
||||||
|
def test_invalid_bufsize(self):
|
||||||
|
# an invalid type of the bufsize argument should raise
|
Loading…
Reference in New Issue
Block a user