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