The package rpms/python39.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=e3c54b759...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=6c5169565...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=31a06df0c...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=ec5f432a6...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=9a2e4be58...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=ceb359a69...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=28391cb8f...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=486eb4351...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=4ced9a188...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=83d6e884b...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=4bc70e0cc...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=c969609df...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=cc2383541...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=aba719b9f...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=043c57400...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=a2f645393...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=901299717...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=1da74de71...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=4763ff864...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=0b33e0cf2...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=8f6e3122a...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=27c558eb6...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=64593af0d...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=0a93f9db1...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=d474ecc63...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=e7488abc3...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=0c8875f3f...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=db2797c8b...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=a3483f912...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=cdc171067...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=66cf571b6...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=a64e7f7e9...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=3dcd1e8c0...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=a7a170bba...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=2a2186c47...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=b180b3028...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=1af13838f...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=20b919fd0...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=70025c721...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=c3e3d7792...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=fb9702fb7...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=05c99bb32...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=cb1167a87...
https://src.fedoraproject.org/cgit/rpms/python39.git/commit/?id=de5e1e875....
Change:
+%ifarch %{power64}
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
+%ifarch %{ix86} x86_64 ppc ppc64 s390x
-%ifarch %{power64}
-%ifarch aarch64
+%ifarch %{ix86} x86_64 ppc ppc64
+%ifarch ppc ppc64
+%ifarch %{ix86} x86_64 ppc %{power64} s390x %{arm}
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
-%ifarch ppc %{power64}
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64}
+%ifarch ppc64 s390x x86_64 ia64 alpha sparc64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64
+%ifarch aarch64
-%ifnarch s390 %{mips} riscv64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64
+%ifnarch s390 ppc64le
+%ifarch %{power64}
+%ifarch %{ix86} x86_64 ppc
-%ifarch %{power64}
-%ifarch %{ix86} x86_64
+%ifarch %{ix86} x86_64
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64}
-%ifarch ppc %{power64}
+%ifarch ppc %{power64}
-%ifarch ppc %{power64}
-%ifarch %{sparc}
-%ifarch %{ix86} x86_64 ppc %{power64}
+%ifarch ppc64 s390x x86_64 ia64 alpha sparc64
+%ifarch %{sparc}
+%ifarch %{ix86} x86_64 ppc ppc64
+%ifarch %{valgrind_arches}
+%ifarch %{valgrind_arches}
-%ifarch %{ix86} x86_64
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64p7 s390x %{arm}
+%ifarch %{valgrind_arches}
+%ifarch ppc ppc64
-%ifarch %{arm}
+%ifnarch s390
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
-%ifarch aarch64
+%ifnarch s390 %{mips} riscv64
+%ifnarch s390 %{mips} riscv64
-%ifarch aarch64
Thanks.
Full change:
============
commit a6d1cbb1a953574d7c66eee3ecdf4eaf27c7a223
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Nov 28 10:27:28 2019 +0100
Don't remove the test.test_tools module
The test should now be properly skipped with installed Python and
some other tests import from test.test_tools.
diff --git a/python39.spec b/python39.spec
index ed58042..15eb432 100644
--- a/python39.spec
+++ b/python39.spec
@@ -17,7 +17,7 @@ URL:
https://www.python.org/
%global prerel a1
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -889,10 +889,6 @@ LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
%{buildroot}%{_bindir}/*%{pybasever}.py \
%{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
-# Remove tests for python3-tools which was removed in
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
-rm -rf %{buildroot}%{pylibdir}/test/test_tools
-
# Remove shebang lines from .py files that aren't executable, and
# remove executability from .py files that don't have a shebang line:
find %{buildroot} -name \*.py \
@@ -1529,6 +1525,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Nov 28 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.9.0~a1-2
+- Don't remove the test.test_tools module
+
* Wed Nov 20 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.9.0~a1-1
- Rebased to Python 3.9.0a1
commit 1639fefb13daa008f1b052e66fae694d36eb88b6
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Nov 28 02:42:51 2019 +0100
Fedora CI: Update the test machine before testing
This is required to fetch latest updates and test with recent packages.
diff --git a/tests/tests.yml b/tests/tests.yml
index eb39252..d2f02c6 100644
--- a/tests/tests.yml
+++ b/tests/tests.yml
@@ -1,5 +1,13 @@
---
- hosts: localhost
+ tags:
+ - classic
+ tasks:
+ - dnf:
+ name: "*"
+ state: latest
+
+- hosts: localhost
roles:
- role: standard-test-basic
tags:
commit 1a985bb5d6bafd98b98c1769a41320a42370b43e
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Nov 26 01:08:45 2019 +0100
Fix incorrectly rebased RPM wheels patch
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index e11b421..4bcc6c2 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,32 +1,35 @@
-From d8ff047b2d9c510ab81e73111999554a8e54eccb Mon Sep 17 00:00:00 2001
+From dad501bdd3ee8d8e22f66416998aeb50c0e7983e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
Subject: [PATCH] 00189: Instead of bundled wheels, use our RPM packaged wheels
We keep them in /usr/share/python-wheels
---
- Lib/ensurepip/__init__.py | 25 +++++++++++++++++--------
- 1 file changed, 17 insertions(+), 8 deletions(-)
+ Lib/ensurepip/__init__.py | 27 +++++++++++++++++----------
+ 1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index 386ed6c25c..7f5f639bde 100644
+index 386ed6c25c..19e7c8787e 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
-@@ -1,3 +1,5 @@
+@@ -1,19 +1,29 @@
+import distutils.version
+import glob
import os
import os.path
import sys
-@@ -10,10 +12,20 @@ from . import _bundled
+ import tempfile
+ from importlib import resources
- __all__ = ["version", "bootstrap"]
+-from . import _bundled
+-
-+_WHEEL_DIR = "/usr/share/python-wheels/"
--_SETUPTOOLS_VERSION = "41.2.0"
+ __all__ = ["version", "bootstrap"]
--_PIP_VERSION = "19.2.3"
++_WHEEL_DIR = "/usr/share/python-wheels/"
++
++
+def _get_most_recent_wheel_version(pkg):
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
+ suffix = "-py2.py3-none-any.whl"
@@ -34,14 +37,16 @@ index 386ed6c25c..7f5f639bde 100644
+ versions = (p[len(prefix):-len(suffix)] for p in glob.glob(pattern))
+ return str(max(versions, key=distutils.version.LooseVersion))
+
-+
+
+-_SETUPTOOLS_VERSION = "41.2.0"
+_SETUPTOOLS_VERSION = _get_most_recent_wheel_version("setuptools")
-+
+
+-_PIP_VERSION = "19.2.3"
+_PIP_VERSION = _get_most_recent_wheel_version("pip")
_PROJECTS = [
("setuptools", _SETUPTOOLS_VERSION),
-@@ -99,12 +111,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
+@@ -99,12 +109,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
additional_paths = []
for project, version in _PROJECTS:
wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
commit d126d7b2af9e394ed4adf8b0f3852fc22412a9d8
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Nov 25 20:22:21 2019 +0100
Bootstrap Python 3.9
diff --git a/python39.spec b/python39.spec
index d0c08aa..ed58042 100644
--- a/python39.spec
+++ b/python39.spec
@@ -45,7 +45,7 @@ License: Python
# IMPORTANT: When bootstrapping, it's very likely the wheels for pip and
# setuptools are not available. Turn off the rpmwheels bcond until
# the two packages are built with wheels to get around the issue.
-%bcond_with bootstrap
+%bcond_without bootstrap
# Whether to use RPM build wheels from the python-{pip,setuptools}-wheel package
# Uses upstream bundled prebuilt wheels otherwise
commit b180b3028c856ca11d1c6a9b578da196cb46d95b
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Nov 20 10:35:05 2019 +0100
Rebased to Python 3.9.0a1
Actually rebased patches: 102, 189
New patches at
https://github.com/fedora-python/cpython/tree/fedora-3.9
diff --git a/00001-rpath.patch b/00001-rpath.patch
index d9dd3ce..e2809a5 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,4 +1,4 @@
-From 8ecb6d320c03242ca94bf2e99d9d80510d5011e1 Mon Sep 17 00:00:00 2001
+From dd253c4f803a5dfa2ba7dfdb01b722e47c2b02e8 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00001: Fixup distutils/unixccompiler.py to remove standard
@@ -29,5 +29,5 @@ index d10a78da31..4df4b67810 100644
include_dirs=None, extra_preargs=None, extra_postargs=None):
fixed_args = self._fix_compile_args(None, macros, include_dirs)
--
-2.21.0
+2.23.0
diff --git a/00102-lib64.patch b/00102-lib64.patch
index f1f0c8d..0a9db42 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,4 +1,4 @@
-From b9f1dd6be195cc3b11a80e6f0dde2096dd8b9855 Mon Sep 17 00:00:00 2001
+From 25fcefdafb47ee30f4dc802742f49e501d7b2f37 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00102: Change the various install paths to use /usr/lib64/
@@ -154,7 +154,7 @@ index 41c4229919..543c88432a 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 502317aa0c..4ad3df1122 100644
+index d08c78df39..4d2f68447d 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -143,7 +143,7 @@ LIBDIR= @libdir@
@@ -167,41 +167,41 @@ index 502317aa0c..4ad3df1122 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index b727f66953..a0c5fb6139 100644
+index 8632d1fe6d..09a818609e 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
-@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig
*pathconfig,
- if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0)
{
- return PATHLEN_ERR();
+@@ -810,7 +810,7 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig
*pathconfig)
}
-- 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 *calculate, const wchar_t
*prefix,
- return PATHLEN_ERR();
+
+ calculate->exec_prefix = joinpath2(calculate->exec_prefix_macro,
+- L"lib/lib-dynload");
++ L"lib64/lib-dynload");
+ if (calculate->exec_prefix == NULL) {
+ return _PyStatus_NO_MEMORY();
}
+@@ -1284,7 +1284,7 @@ calculate_read_pyenv(PyCalculatePath *calculate)
+ static PyStatus
+ calculate_zip_path(PyCalculatePath *calculate)
+ {
+- const wchar_t *lib_python = L"lib/python00.zip";
++ const wchar_t *lib_python = L"lib64/python00.zip";
+
+ if (calculate->prefix_found > 0) {
+ /* Use the reduced prefix returned by Py_GetPrefix()
+@@ -1435,7 +1435,7 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config)
+ return DECODE_LOCALE_ERR("VPATH macro", len);
}
-- 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 *calculate, const PyConfig *config)
- 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);
+ return DECODE_LOCALE_ERR("EXEC_PREFIX macro", len);
}
diff --git a/configure b/configure
-index 2a933cdbeb..bec365124e 100755
+index 44f14c3c2c..020531594c 100755
--- a/configure
+++ b/configure
-@@ -15182,9 +15182,9 @@ fi
+@@ -15192,9 +15192,9 @@ fi
if test x$PLATFORM_TRIPLET = x; then
@@ -214,10 +214,10 @@ index 2a933cdbeb..bec365124e 100755
diff --git a/configure.ac b/configure.ac
-index a189d42c2c..154a0aa5cc 100644
+index 0b28dda44c..4fca719c71 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4668,9 +4668,9 @@ fi
+@@ -4679,9 +4679,9 @@ fi
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
AC_SUBST(PY_ENABLE_SHARED)
if test x$PLATFORM_TRIPLET = x; then
@@ -230,7 +230,7 @@ index a189d42c2c..154a0aa5cc 100644
AC_SUBST(LIBPL)
diff --git a/setup.py b/setup.py
-index 20d7f35652..024a1035c0 100644
+index 02f523c42d..559498d14b 100644
--- a/setup.py
+++ b/setup.py
@@ -649,7 +649,7 @@ class PyBuildExt(build_ext):
@@ -257,5 +257,5 @@ index 20d7f35652..024a1035c0 100644
libraries=readline_libs))
else:
--
-2.21.0
+2.23.0
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 361af70..784a281 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,4 +1,4 @@
-From f6df02cde47874f10e183ead483c90941bb8076f Mon Sep 17 00:00:00 2001
+From 796f2a2d1f213e963768e7c987fb49f8c4f47dfa Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
Subject: [PATCH] 00111: Don't try to build a libpythonMAJOR.MINOR.a
@@ -21,7 +21,7 @@ Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
1 file changed, 2 insertions(+), 19 deletions(-)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 4ad3df1122..72d202d71b 100644
+index 4d2f68447d..3cd2f25571 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -562,7 +562,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
@@ -55,7 +55,7 @@ index 4ad3df1122..72d202d71b 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
############################################################################
-@@ -1557,17 +1551,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1562,17 +1556,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
@@ -74,5 +74,5 @@ index 4ad3df1122..72d202d71b 100644
$(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o
$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
--
-2.21.0
+2.23.0
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index 349c894..e11b421 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,26 +1,24 @@
-From e5c11f104e1d2543ac3ba4b3f0a7989821e57947 Mon Sep 17 00:00:00 2001
+From d8ff047b2d9c510ab81e73111999554a8e54eccb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
Subject: [PATCH] 00189: Instead of bundled wheels, use our RPM packaged wheels
We keep them in /usr/share/python-wheels
---
- Lib/ensurepip/__init__.py | 26 +++++++++++++++++---------
- 1 file changed, 17 insertions(+), 9 deletions(-)
+ Lib/ensurepip/__init__.py | 25 +++++++++++++++++--------
+ 1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index fc0edec6e3..4d17e413db 100644
+index 386ed6c25c..7f5f639bde 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
-@@ -1,16 +1,27 @@
+@@ -1,3 +1,5 @@
+import distutils.version
+import glob
import os
import os.path
--import pkgutil
import sys
- import tempfile
-
+@@ -10,10 +12,20 @@ from . import _bundled
__all__ = ["version", "bootstrap"]
@@ -43,13 +41,13 @@ index fc0edec6e3..4d17e413db 100644
_PROJECTS = [
("setuptools", _SETUPTOOLS_VERSION),
-@@ -96,12 +107,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
+@@ -99,12 +111,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
additional_paths = []
for project, version in _PROJECTS:
wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
-- whl = pkgutil.get_data(
-- "ensurepip",
-- "_bundled/{}".format(wheel_name),
+- whl = resources.read_binary(
+- _bundled,
+- wheel_name,
- )
- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
- fp.write(whl)
@@ -60,5 +58,5 @@ index fc0edec6e3..4d17e413db 100644
additional_paths.append(os.path.join(tmpdir, wheel_name))
--
-2.21.0
+2.23.0
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 1e0ddbb..9e38dbd 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,4 +1,4 @@
-From 76330e0a8798b3b03160edc7e8d42d3dbee756fd Mon Sep 17 00:00:00 2001
+From 7438360d65b2e000440d7ee126f32d2500dbd82c Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
Subject: [PATCH] 00251: Change user install location
@@ -60,5 +60,5 @@ index 22d53fa562..9513526109 100644
if os.path.isdir(sitedir):
addsitedir(sitedir, known_paths)
--
-2.21.0
+2.23.0
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index f383a58..bbcf7f1 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,4 +1,4 @@
-From 64c67dbfa789f242e8ffd1ac88bafb4df2842401 Mon Sep 17 00:00:00 2001
+From 607b2e6099745b2c8c0d55d258ade620e6c35dbd Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
Subject: [PATCH] 00274: Upstream uses Debian-style architecture naming, change
@@ -29,7 +29,7 @@ index ba37cf99e2..52a9ec6662 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index 154a0aa5cc..273954f461 100644
+index 4fca719c71..3d06f82981 100644
--- a/configure.ac
+++ b/configure.ac
@@ -741,9 +741,9 @@ cat >> conftest.c <<EOF
@@ -82,5 +82,5 @@ index 154a0aa5cc..273954f461 100644
s390x-linux-gnu
# elif defined(__s390__)
--
-2.21.0
+2.23.0
diff --git a/00328-pyc-timestamp-invalidation-mode.patch
b/00328-pyc-timestamp-invalidation-mode.patch
index 270b076..454ace2 100644
--- a/00328-pyc-timestamp-invalidation-mode.patch
+++ b/00328-pyc-timestamp-invalidation-mode.patch
@@ -1,4 +1,4 @@
-From c706770ce2d951d9357ffc872b7e3f70ad36c264 Mon Sep 17 00:00:00 2001
+From 4c5bee74ff3d4033a60359640bac9f156fdf50ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 11 Jul 2019 13:44:13 +0200
Subject: [PATCH] 00328: Restore pyc to TIMESTAMP invalidation mode as default
@@ -51,5 +51,5 @@ index d6677ab45f..88059b127e 100644
return wrapper
--
-2.21.0
+2.23.0
diff --git a/python38.rpmlintrc b/python38.rpmlintrc
deleted file mode 100644
index 1314d45..0000000
--- a/python38.rpmlintrc
+++ /dev/null
@@ -1,80 +0,0 @@
-# KNOWN BUGS:
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
-addFilter(r'crypto-policy-non-compliance-openssl')
-
-
-# TESTS:
-addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3.\d/test')
-
-
-# OTHER DELIBERATES:
-# chroot function
-addFilter(r'missing-call-to-chdir-with-chroot')
-
-# intentionally unversioned and selfobsoleted
-addFilter(r'unversioned-explicit-obsoletes python')
-addFilter(r'self-obsoletion python3\d obsoletes python3\d')
-
-# intentionally hardcoded
-addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
-
-# intentional for our pythonXY package
-addFilter(r'python3\d\.[^:]+: (E|W): devel-file-in-non-devel-package')
-
-# we have non binary stuff, python files
-addFilter(r'only-non-binary-in-usr-lib')
-
-# some devel files that are deliberately needed
-addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
-addFilter(r'devel-file-in-non-devel-package
/usr/lib(64)?/python3\.\d/distutils/tests/xxmodule\.c')
-
-
-# SORRY, NOT SORRY:
-# manual pages
-addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix|msgfmt|pygettext)')
-addFilter(r'no-manual-page-for-binary python3.*-config$')
-addFilter(r'no-manual-page-for-binary python3.\dd?m$')
-
-# missing documentation from subpackages
-addFilter(r'^python3\d?-(debug|tkinter|test|idle)\.[^:]+: (E|W):
no-documentation')
-
-# platform python is obsoleted, but not provided
-addFilter(r'obsolete-not-provided platform-python')
-
-
-# RPMLINT IMPERFECTIONS
-#
https://github.com/rpm-software-management/rpmlint/issues/123
-addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3393')
-#
https://github.com/rpm-software-management/rpmlint/pull/133
-addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3394')
-
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1550562
-#
https://github.com/rpm-software-management/rpmlint/issues/128
-addFilter(r'python-bytecode-inconsistent-mtime .* 1970')
-
-# debugsource
-addFilter(r'^python3\d?-debugsource\.[^:]+: (E|W): no-documentation')
-
-# debuginfo
-addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(build-id\)')
-
-# this is OK for F28+
-addFilter(r'library-without-ldconfig-post')
-
-# debug package contains devel and non-devel files
-addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-package')
-
-# this goes to other subpackage, hence not actually dangling, the read error is bogus
-addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
-addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
-
-# we need this macro to evaluate, even if the line starts with #
-addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
-
-# Python modules don't need to be linked against libc
-# Since 3.8 they are no longer linked against libpython3.8.so.1.0
-addFilter(r'E: library-not-linked-against-libc
/usr/lib(64)?/python3.\d/lib-dynload/')
-addFilter(r'E: shared-lib-without-dependency-information
/usr/lib(64)?/python3.\d/lib-dynload/')
-
-# SPELLING ERRORS
-addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
diff --git a/python38.spec b/python38.spec
deleted file mode 100644
index 53bb8e7..0000000
--- a/python38.spec
+++ /dev/null
@@ -1,1575 +0,0 @@
-# ==================
-# Top-level metadata
-# ==================
-
-%global pybasever 3.8
-
-# pybasever without the dot:
-%global pyshortver 38
-
-Name: python%{pyshortver}
-Summary: Version %{pybasever} of the Python interpreter
-URL:
https://www.python.org/
-
-# WARNING When rebasing to a new Python version,
-# remember to update the python3-docs package as well
-%global general_version %{pybasever}.0
-#global prerel ...
-%global upstream_version %{general_version}%{?prerel}
-Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 1%{?dist}
-License: Python
-
-
-# ==================================
-# Conditionals controlling the build
-# ==================================
-
-# Note that the bcond macros are named for the CLI option they create.
-# "%%bcond_without" means "ENABLE by default and create a --without
option"
-
-
-# Flat package, i.e. python36, python37, python38 for tox etc.
-# warning: changes some other defaults
-# in Fedora, never turn this on for the python3 package
-# and always keep it on for python37 etc.
-# WARNING: This does not change the package name and summary above
-%bcond_without flatpackage
-
-# When bootstrapping python3, we need to build setuptools.
-# but setuptools BR python3-devel and that brings in python3-rpm-generators;
-# python3-rpm-generators needs python3-setuptools, so we cannot have it yet.
-#
-# Procedure:
https://fedoraproject.org/wiki/SIGs/Python/UpgradingPython
-#
-# IMPORTANT: When bootstrapping, it's very likely the wheels for pip and
-# setuptools are not available. Turn off the rpmwheels bcond until
-# the two packages are built with wheels to get around the issue.
-%bcond_with bootstrap
-
-# Whether to use RPM build wheels from the python-{pip,setuptools}-wheel package
-# Uses upstream bundled prebuilt wheels otherwise
-%bcond_without rpmwheels
-
-# Expensive optimizations (mainly, profile-guided optimizations)
-%bcond_without optimizations
-
-# Run the test suite in %%check
-%bcond_without tests
-
-# Extra build for debugging the interpreter or C-API extensions
-# (the -debug subpackages)
-%if %{with flatpackage}
-%bcond_with debug_build
-%else
-%bcond_without debug_build
-%endif
-
-# Support for the GDB debugger
-%bcond_without gdb_hooks
-
-# The dbm.gnu module (key-value database)
-%bcond_without gdbm
-
-# Main interpreter loop optimization
-%bcond_without computed_gotos
-
-# Support for the Valgrind debugger/profiler
-%ifarch %{valgrind_arches}
-%bcond_without valgrind
-%else
-%bcond_with valgrind
-%endif
-
-
-# =====================
-# General global macros
-# =====================
-
-%global pylibdir %{_libdir}/python%{pybasever}
-%global dynload_dir %{pylibdir}/lib-dynload
-
-# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
-# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
-%global ABIFLAGS_optimized %{nil}
-%global ABIFLAGS_debug d
-
-%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
-%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
-
-# All bytecode files are in a __pycache__ subdirectory, with a name
-# reflecting the version of the bytecode.
-# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
-# For example,
-# foo/bar.py
-# has bytecode at:
-# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
-%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
-
-# Python's configure script defines SOVERSION, and this is used in the Makefile
-# to determine INSTSONAME, the name of the libpython DSO:
-# LDLIBRARY='libpython$(VERSION).so'
-# INSTSONAME="$LDLIBRARY".$SOVERSION
-# We mirror this here in order to make it easier to add the -gdb.py hooks.
-# (if these get out of sync, the payload of the libs subpackage will fail
-# and halt the build)
-%global py_SOVERSION 1.0
-%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
-%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
-
-# Disable automatic bytecompilation. The python3 binary is not yet be
-# available in /usr/bin when Python is built. Also, the bytecompilation fails
-# on files that test invalid syntax.
-%undefine py_auto_byte_compile
-
-# For multilib support, files that are different between 32- and 64-bit arches
-# need different filenames. Use "64" or "32" according to the word
size.
-# Currently, the best way to determine an architecture's word size happens to
-# be checking %%{_lib}.
-%if "%{_lib}" == "lib64"
-%global wordsize 64
-%else
-%global wordsize 32
-%endif
-
-
-# =======================
-# Build-time requirements
-# =======================
-
-# (keep this list alphabetized)
-
-BuildRequires: autoconf
-BuildRequires: bluez-libs-devel
-BuildRequires: bzip2
-BuildRequires: bzip2-devel
-BuildRequires: desktop-file-utils
-BuildRequires: expat-devel
-
-BuildRequires: findutils
-BuildRequires: gcc-c++
-%if %{with gdbm}
-BuildRequires: gdbm-devel
-%endif
-BuildRequires: glibc-all-langpacks
-BuildRequires: glibc-devel
-BuildRequires: gmp-devel
-BuildRequires: gnupg2
-BuildRequires: libappstream-glib
-BuildRequires: libffi-devel
-BuildRequires: libnsl2-devel
-BuildRequires: libtirpc-devel
-BuildRequires: libGL-devel
-BuildRequires: libuuid-devel
-BuildRequires: libX11-devel
-BuildRequires: ncurses-devel
-
-BuildRequires: openssl-devel
-BuildRequires: pkgconfig
-BuildRequires: readline-devel
-BuildRequires: redhat-rpm-config >= 127
-BuildRequires: sqlite-devel
-BuildRequires: gdb
-
-BuildRequires: tar
-BuildRequires: tcl-devel
-BuildRequires: tix-devel
-BuildRequires: tk-devel
-
-%if %{with valgrind}
-BuildRequires: valgrind-devel
-%endif
-
-BuildRequires: xz-devel
-BuildRequires: zlib-devel
-
-BuildRequires: /usr/bin/dtrace
-
-# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
-BuildRequires: /usr/sbin/ifconfig
-
-# For %%python_provide
-BuildRequires: python-rpm-macros
-
-%if %{with rpmwheels}
-BuildRequires: python-setuptools-wheel
-BuildRequires: python-pip-wheel
-%endif
-
-%if %{without bootstrap}
-# for make regen-all and distutils.tests.test_bdist_rpm
-BuildRequires: python%{pyshortver}
-%endif
-
-# =======================
-# Source code and patches
-# =======================
-
-Source0: %{url}ftp/python/%{general_version}/Python-%{upstream_version}.tar.xz
-Source1: %{url}ftp/python/%{general_version}/Python-%{upstream_version}.tar.xz.asc
-Source2: %{url}static/files/pubkeys.txt
-
-# A simple script to check timestamps of bytecode files
-# Run in check section with Python that is currently being built
-# Originally written by bkabrda
-Source8: check-pyc-timestamps.py
-
-# Desktop menu entry for idle3
-Source10: idle3.desktop
-
-# AppData file for idle3
-Source11: idle3.appdata.xml
-
-# 00001 #
-# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
-# Was Patch0 in ivazquez' python3000 specfile:
-Patch1: 00001-rpath.patch
-
-# 00102 #
-# Change the various install paths to use /usr/lib64/ instead or /usr/lib
-# Only used when "%%{_lib}" == "lib64"
-# Not yet sent upstream.
-Patch102: 00102-lib64.patch
-
-# 00111 #
-# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
-# a libpythonMAJOR.MINOR.a
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
-# Downstream only: not appropriate for upstream
-Patch111: 00111-no-static-lib.patch
-
-# 00189 #
-# Instead of bundled wheels, use our RPM packaged wheels from
-# /usr/share/python-wheels
-# Downstream only: upstream bundles
-# We might eventually pursuit upstream support, but it's low prio
-Patch189: 00189-use-rpm-wheels.patch
-
-# 00251
-# 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
-# Downstream only: Awaiting resources to work on upstream PEP
-Patch251: 00251-change-user-install-location.patch
-
-# 00274 #
-# Upstream uses Debian-style architecture naming. Change to match Fedora.
-Patch274: 00274-fix-arch-names.patch
-
-# 00328 #
-# Restore pyc to TIMESTAMP invalidation mode as default in rpmbubild
-# See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
-# Downstream only: only used when building RPM packages
-# Ideally, we should talk to upstream and explain why we don't want this
-Patch328: 00328-pyc-timestamp-invalidation-mode.patch
-
-# (New patches go here ^^^)
-#
-# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
-# please try to keep the patch numbers in-sync between all specfiles.
-#
-# More information, and a patch number catalog, is at:
-#
-#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
-#
-# The patches are stored and rebased at:
-#
-#
https://github.com/fedora-python/cpython
-
-
-# ==========================================
-# Descriptions, and metadata for subpackages
-# ==========================================
-
-# People might want to dnf install pythonX.Y instead of pythonXY;
-# we enable this in both flat and nonflat package.
-Provides: python%{pybasever} = %{version}-%{release}
-
-%if %{without flatpackage}
-
-# Packages with Python modules in standard locations automatically
-# depend on python(abi). Provide that here.
-Provides: python(abi) = %{pybasever}
-
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-
-# In order to support multiple Python interpreters for development purposes,
-# packages with the naming scheme flatpackage (e.g. python35) exist for
-# non-default versions of Python 3.
-# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
-# these names here.
-Provides: python%{pyshortver} = %{version}-%{release}
-# Note that using Obsoletes without package version is not standard practice.
-# Here we assert that *any* version of the system's default interpreter is
-# preferable to an "extra" interpreter. For example, python3-3.6.1 will
-# replace python36-3.6.2.
-Obsoletes: python%{pyshortver}
-
-#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
-#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
-# We recommend /usr/bin/python so users get it by default
-# Versioned recommends are problematic, and we know that the package requires
-# python3 back with fixed version, so we just use the path here:
-Recommends: %{_bindir}/python
-
-# In Fedora 31, /usr/bin/pydoc was moved here from Python 2.
-# Ideally we'd have an explicit conflict with "/usr/bin/pydoc < 3",
-# but file provides aren't versioned and the file moved across packages.
-# Instead, we rely on the conflict in python3-libs.
-
-# Previously, this was required for our rewheel patch to work.
-# This is technically no longer needed, but we keep it recommended
-# for the developer experience.
-Recommends: python3-setuptools
-Recommends: python3-pip
-
-# This prevents ALL subpackages built from this spec to require
-# /usr/bin/python3*. Granularity per subpackage is impossible.
-# It's intended for the libs package not to drag in the interpreter, see
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
-# All others require %%{name} anyway.
-%global __requires_exclude ^/usr/bin/python3
-
-
-# The description used both for the SRPM and the main `python3` subpackage:
-%description
-Python is an accessible, high-level, dynamically typed, interpreted programming
-language, designed with an emphasis on code readability.
-It includes an extensive standard library, and has a vast ecosystem of
-third-party libraries.
-
-The %{name} package provides the "python3" executable: the reference
-interpreter for the Python language, version 3.
-The majority of its standard library is provided in the %{name}-libs package,
-which should be installed automatically along with %{name}.
-The remaining parts of the Python standard library are broken out into the
-%{name}-tkinter and %{name}-test packages, which may need to be installed
-separately.
-
-Documentation for Python is provided in the %{name}-docs package.
-
-Packages containing additional libraries for Python are generally named with
-the "%{name}-" prefix.
-
-
-#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
-#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
-%package -n python-unversioned-command
-Summary: The "python" command that runs Python 3
-BuildArch: noarch
-
-# In theory this could require any python3 version
-Requires: python3 == %{version}-%{release}
-# But since we want to provide versioned python, we require exact version
-Provides: python = %{version}-%{release}
-# This also save us an explicit conflict for older python3 builds
-
-%description -n python-unversioned-command
-This package contains /usr/bin/python - the "python" command that runs Python
3.
-
-
-%package libs
-Summary: Python runtime libraries
-
-%if %{with rpmwheels}
-Requires: python-setuptools-wheel
-Requires: python-pip-wheel
-%else
-Provides: bundled(python3-pip) = 19.2.3
-Provides: bundled(python3-setuptools) = 41.2.0
-%endif
-
-%{?python_provide:%python_provide python3-libs}
-
-# There are files in the standard library that have python shebang.
-# We've filtered the automatic requirement out so libs are installable without
-# the main package. This however makes it pulled in by default.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
-Recommends: %{name}%{?_isa} = %{version}-%{release}
-
-#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
-# In Fedora 31, several "unversioned" files like /usr/bin/pydoc and all the
-# "unversioned" provides were moved from python2 to python3.
-# So, newer python3 packages need to conflict with old Python 2 builds that
-# still provided unversioned Python.
-# Since all python packages, new and old, have versioned requires on
-# python?-libs, we do it here:
-Conflicts: python-libs < 3
-# (We explicitly conflict with python-libs and not python2-libs, so only the
-# old Python 2 builds that still provided unversioned Python are handled.)
-
-
-%description libs
-This package contains runtime libraries for use by Python:
-- the majority of the Python standard library
-- a dynamically linked library for use by applications that embed Python as
- a scripting language, and by the main "python3" executable
-
-
-%package devel
-Summary: Libraries and header files needed for Python development
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-BuildRequires: python-rpm-macros
-# The RPM related dependencies bring nothing to a non-RPM Python developer
-# But we want them when packages BuildRequire python3-devel
-Requires: (python-rpm-macros if rpm-build)
-Requires: (python3-rpm-macros if rpm-build)
-
-%if %{without bootstrap}
-# This is not "API" (packages that need setuptools should still BuildRequire
it)
-# However some packages apparently can build both with and without setuptools
-# producing egg-info as file or directory (depending on setuptools presence).
-# Directory-to-file updates are problematic in RPM, so we ensure setuptools is
-# installed when -devel is required.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1623914
-# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
-Requires: (python3-setuptools if rpm-build)
-
-Requires: (python3-rpm-generators if rpm-build)
-%endif
-
-%{?python_provide:%python_provide python3-devel}
-
-Provides: %{name}-2to3 = %{version}-%{release}
-Provides: 2to3 = %{version}-%{release}
-
-Conflicts: %{name} < %{version}-%{release}
-
-# In Fedora 31, several "unversioned" files were moved here from Python 2:
-# pygettext.py, msgfmt.py, python-config, python.pc
-Conflicts: python-devel < 3
-
-%description devel
-This package contains the header files and configuration needed to compile
-Python extension modules (typically written in C or C++), to embed Python
-into other programs, and to make binary distributions for Python libraries.
-
-It also contains the necessary macros to build RPM packages with Python modules
-and 2to3 tool, an automatic source converter from Python 2.X.
-
-
-%package idle
-Summary: A basic graphical development environment for Python
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-tkinter = %{version}-%{release}
-
-Provides: idle3 = %{version}-%{release}
-Provides: idle = %{version}-%{release}
-
-Provides: %{name}-tools = %{version}-%{release}
-Provides: %{name}-tools%{?_isa} = %{version}-%{release}
-Obsoletes: %{name}-tools < %{version}-%{release}
-
-# In Fedora 31, /usr/bin/idle was moved here from Python 2.
-Conflicts: python-tools < 3
-
-%{?python_provide:%python_provide python3-idle}
-
-%description idle
-IDLE is Pythons Integrated Development and Learning Environment.
-
-IDLE has the following features: Python shell window (interactive
-interpreter) with colorizing of code input, output, and error messages;
-multi-window text editor with multiple undo, Python colorizing,
-smart indent, call tips, auto completion, and other features;
-search within any window, replace within editor windows, and
-search through multiple files (grep); debugger with persistent
-breakpoints, stepping, and viewing of global and local namespaces;
-configuration, browsers, and other dialogs.
-
-
-%package tkinter
-Summary: A GUI toolkit for Python
-Requires: %{name} = %{version}-%{release}
-
-%{?python_provide:%python_provide python3-tkinter}
-
-%description tkinter
-The Tkinter (Tk interface) library is a graphical user interface toolkit for
-the Python programming language.
-
-
-%package test
-Summary: The self-test suite for the main python3 package
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-
-%{?python_provide:%python_provide python3-test}
-
-%description test
-The self-test suite for the Python interpreter.
-
-This is only useful to test Python itself. For testing general Python code,
-you should use the unittest module from %{name}-libs, or a library such as
-%{name}-pytest or %{name}-nose.
-
-
-%if %{with debug_build}
-%package debug
-Summary: Debug version of the Python runtime
-
-# The debug build is an all-in-one package version of the regular build, and
-# shares the same .py/.pyc files and directories as the regular build. Hence
-# we depend on all of the subpackages of the regular build:
-Requires: %{name}%{?_isa} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-Requires: %{name}-devel%{?_isa} = %{version}-%{release}
-Requires: %{name}-test%{?_isa} = %{version}-%{release}
-Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
-Requires: %{name}-idle%{?_isa} = %{version}-%{release}
-
-# In Fedora 31, /usr/bin/python-debug was moved here from Python 2.
-Conflicts: python-debug < 3
-
-%{?python_provide:%python_provide python3-debug}
-
-%description debug
-python3-debug provides a version of the Python runtime with numerous debugging
-features enabled, aimed at advanced Python users such as developers of Python
-extension modules.
-
-This version uses more memory and will be slower than the regular Python build,
-but is useful for tracking down reference-counting issues and other bugs.
-
-The debug build shares installation directories with the standard Python
-runtime. Python modules -- source (.py), bytecode (.pyc), and C-API extensions
-(.cpython*.so) -- are compatible between this and the standard version
-of Python.
-
-The debug runtime additionally supports debug builds of C-API extensions
-(with the "d" ABI flag) for debugging issues in those extensions.
-%endif # with debug_build
-
-%else # with flatpackage
-
-# We'll not provide this, on purpose
-# No package in Fedora shall ever depend on flatpackage via this
-%global __requires_exclude ^python\\(abi\\) = 3\\..$
-%global __provides_exclude ^python\\(abi\\) = 3\\..$
-
-%if %{with rpmwheels}
-Requires: python-setuptools-wheel
-Requires: python-pip-wheel
-%else
-Provides: bundled(python3-pip) = 19.2.3
-Provides: bundled(python3-setuptools) = 41.2.0
-%endif
-
-# The description for the flat package
-%description
-Python %{pybasever} package for developers.
-
-This package exists to allow developers to test their code against a newer
-version of Python. This is not a full Python stack and if you wish to run
-your applications with Python %{pybasever}, update your Fedora to a newer
-version once Python %{pybasever} is stable.
-
-%endif # with flatpackage
-
-# ======================================================
-# The prep phase of the build:
-# ======================================================
-
-%prep
-%gpgverify -k2 -s1 -d0
-%setup -q -n Python-%{upstream_version}
-# Remove all exe files to ensure we are not shipping prebuilt binaries
-# note that those are only used to create Microsoft Windows installers
-# and that functionality is broken on Linux anyway
-find -name '*.exe' -print -delete
-
-# Remove bundled libraries to ensure that we're using the system copy.
-rm -r Modules/expat
-
-#
-# Apply patches:
-#
-%patch1 -p1
-
-%if "%{_lib}" == "lib64"
-%patch102 -p1
-%endif
-%patch111 -p1
-
-%if %{with rpmwheels}
-%patch189 -p1
-rm Lib/ensurepip/_bundled/*.whl
-%endif
-
-%patch251 -p1
-%patch274 -p1
-%patch328 -p1
-
-
-# Remove files that should be generated by the build
-# (This is after patching, so that we can use patches directly from upstream)
-rm configure pyconfig.h.in
-
-
-# ======================================================
-# Configuring and building the code:
-# ======================================================
-
-%build
-
-# Regenerate the configure script and pyconfig.h.in
-autoconf
-autoheader
-
-# Remember the current directory (which has sources and the configure script),
-# so we can refer to it after we "cd" elsewhere.
-topdir=$(pwd)
-
-# Get proper option names from bconds
-%if %{with computed_gotos}
-%global computed_gotos_flag yes
-%else
-%global computed_gotos_flag no
-%endif
-
-%if %{with optimizations}
-%global optimizations_flag "--enable-optimizations"
-%else
-%global optimizations_flag "--disable-optimizations"
-%endif
-
-# Set common compiler/linker flags
-# We utilize the %%extension_...flags macros here so users building C/C++
-# extensions with our python won't get all the compiler/linker flags used
-# in Fedora RPMs.
-# Standard library built here will still use the %%build_...flags,
-# Fedora packages utilizing %%py3_build will use them as well
-#
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
-export CFLAGS="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
-export CFLAGS_NODIST="%{build_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
-export CXXFLAGS="%{extension_cxxflags} -D_GNU_SOURCE -fPIC -fwrapv"
-export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
-export OPT="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
-export LINKCC="gcc"
-export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
-export LDFLAGS="%{extension_ldflags} -g $(pkg-config --libs-only-L openssl)"
-export LDFLAGS_NODIST="%{build_ldflags} -g $(pkg-config --libs-only-L
openssl)"
-
-# We can build several different configurations of Python: regular and debug.
-# Define a common function that does one build:
-BuildPython() {
- ConfName=$1
- ExtraConfigArgs=$2
- MoreCFlags=$3
-
- # Each build is done in its own directory
- ConfDir=build/$ConfName
- echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
- mkdir -p $ConfDir
- pushd $ConfDir
-
- # Normally, %%configure looks for the "configure" script in the current
- # directory.
- # Since we changed directories, we need to tell %%configure where to look.
- %global _configure $topdir/configure
-
-%configure \
- --enable-ipv6 \
- --enable-shared \
- --with-computed-gotos=%{computed_gotos_flag} \
- --with-dbmliborder=gdbm:ndbm:bdb \
- --with-system-expat \
- --with-system-ffi \
- --enable-loadable-sqlite-extensions \
- --with-dtrace \
- --with-lto \
- --with-ssl-default-suites=openssl \
-%if %{with valgrind}
- --with-valgrind \
-%endif
- $ExtraConfigArgs \
- %{nil}
-
-%global flags_override EXTRA_CFLAGS="$MoreCFlags"
CFLAGS_NODIST="$CFLAGS_NODIST $MoreCFlags"
-
-%if %{without bootstrap}
- # Regenerate generated files (needs python3)
- %make_build %{flags_override} regen-all
PYTHON_FOR_REGEN="python%{pybasever}"
-%endif
-
- # Invoke the build
- %make_build %{flags_override}
-
- popd
- echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
-}
-
-# Call the above to build each configuration.
-
-%if %{with debug_build}
-BuildPython debug \
- "--without-ensurepip --with-pydebug" \
- "-Og"
-%endif # with debug_build
-
-BuildPython optimized \
- "--without-ensurepip %{optimizations_flag}" \
- ""
-
-# ======================================================
-# Installing the built code:
-# ======================================================
-
-%install
-
-# As in %%build, remember the current directory
-topdir=$(pwd)
-
-# We install a collection of hooks for gdb that make it easier to debug
-# executables linked against libpython3* (such as /usr/bin/python3 itself)
-#
-# These hooks are implemented in Python itself (though they are for the version
-# of python that gdb is linked with)
-#
-# gdb-archer looks for them in the same path as the ELF file or its .debug
-# file, with a -gdb.py suffix.
-# We put them next to the debug file, because ldconfig would complain if
-# it found non-library files directly in /usr/lib/
-# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
-#
-# We'll put these files in the debuginfo package by installing them to e.g.:
-# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
-# (note that the debug path is /usr/lib/debug for both 32/64 bit)
-#
-# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
-# information
-
-%if %{with gdb_hooks}
-DirHoldingGdbPy=%{_usr}/lib/debug/%{_libdir}
-mkdir -p %{buildroot}$DirHoldingGdbPy
-%endif # with gdb_hooks
-
-# Multilib support for pyconfig.h
-# 32- and 64-bit versions of pyconfig.h are different. For multilib support
-# (making it possible to install 32- and 64-bit versions simultaneously),
-# we need to install them under different filenames, and to make the common
-# "pyconfig.h" include the right file based on architecture.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
-# Filanames are defined here:
-%global _pyconfig32_h pyconfig-32.h
-%global _pyconfig64_h pyconfig-64.h
-%global _pyconfig_h pyconfig-%{wordsize}.h
-
-# Use a common function to do an install for all our configurations:
-InstallPython() {
-
- ConfName=$1
- PyInstSoName=$2
- MoreCFlags=$3
- LDVersion=$4
-
- # Switch to the directory with this configuration's built files
- ConfDir=build/$ConfName
- echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
- mkdir -p $ConfDir
- pushd $ConfDir
-
- make \
- DESTDIR=%{buildroot} \
- INSTALL="install -p" \
- EXTRA_CFLAGS="$MoreCFlags" \
- install
-
- popd
-
-%if %{with gdb_hooks}
- # See comment on $DirHoldingGdbPy above
- PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
- cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
-%endif # with gdb_hooks
-
- # Rename the -devel script that differs on different arches to arch specific name
- mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
- echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
- %{buildroot}%{_bindir}/python${LDVersion}-config
- echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
- %{buildroot}%{_bindir}/python${LDVersion}-config
- chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
-
- # Make python3-devel multilib-ready
- mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
- %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
- cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
-#include <bits/wordsize.h>
-
-#if __WORDSIZE == 32
-#include "%{_pyconfig32_h}"
-#elif __WORDSIZE == 64
-#include "%{_pyconfig64_h}"
-#else
-#error "Unknown word size"
-#endif
-EOF
-
- echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
-}
-
-# Install the "debug" build first; any common files will be overridden with
-# later builds
-%if %{with debug_build}
-InstallPython debug \
- %{py_INSTSONAME_debug} \
- -O0 \
- %{LDVERSION_debug}
-%endif # with debug_build
-
-# Now the optimized build:
-InstallPython optimized \
- %{py_INSTSONAME_optimized} \
- "" \
- %{LDVERSION_optimized}
-
-# Install directories for additional packages
-install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
-%if "%{_lib}" == "lib64"
-# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
-# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
-# modules).
-# Note that rpmlint will complain about hardcoded library path;
-# this is intentional.
-install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
-%endif
-
-%if %{without flatpackage}
-# add idle3 to menu
-install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
-desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
-
-# Install and validate appdata file
-mkdir -p %{buildroot}%{_metainfodir}
-cp -a %{SOURCE11} %{buildroot}%{_metainfodir}
-appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/idle3.appdata.xml
-%endif
-
-# Make sure distutils looks at the right pyconfig.h file
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
-# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
-# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
-# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
-#
-# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
-# variants:
-sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
- %{buildroot}%{pylibdir}/distutils/sysconfig.py \
- %{buildroot}%{pylibdir}/sysconfig.py
-
-# Install pathfix.py to bindir
-# See
https://github.com/fedora-python/python-rpm-porting/issues/24
-cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
-
-# Install i18n tools to bindir
-# They are also in python2, so we version them
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1571474
-for tool in pygettext msgfmt; do
- cp -p Tools/i18n/${tool}.py %{buildroot}%{_bindir}/${tool}%{pybasever}.py
- ln -s ${tool}%{pybasever}.py %{buildroot}%{_bindir}/${tool}3.py
-done
-
-# Switch all shebangs to refer to the specific Python version.
-# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
-# so handle files named using other naming scheme separately.
-LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
- Tools/scripts/pathfix.py \
- -i "%{_bindir}/python%{pybasever}" -pn \
- %{buildroot} \
- %{buildroot}%{_bindir}/*%{pybasever}.py \
- %{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
-
-# Remove tests for python3-tools which was removed in
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
-rm -rf %{buildroot}%{pylibdir}/test/test_tools
-
-# Remove shebang lines from .py files that aren't executable, and
-# remove executability from .py files that don't have a shebang line:
-find %{buildroot} -name \*.py \
- \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
- -print -exec sed -i '1d' {} \; \) -o \( \
- -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
- -exec chmod a-x {} \; \) \)
-
-# Get rid of DOS batch files:
-find %{buildroot} -name \*.bat -exec rm {} \;
-
-# Get rid of backup files:
-find %{buildroot}/ -name "*~" -exec rm -f {} \;
-find . -name "*~" -exec rm -f {} \;
-
-# Do bytecompilation with the newly installed interpreter.
-# This is similar to the script in macros.pybytecompile
-# compile *.pyc
-find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
-
-# Since we have pathfix.py in bindir, this is created, but we don't want it
-rm -rf %{buildroot}%{_bindir}/__pycache__
-
-# Fixup permissions for shared libraries from non-standard 555 to standard 755:
-find %{buildroot} -perm 555 -exec chmod 755 {} \;
-
-# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
-# avoid the user having to know the precise version and ABI flags.
-# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
-%if %{with debug_build} && %{without flatpackage}
-ln -s \
- %{_bindir}/python%{LDVERSION_debug} \
- %{buildroot}%{_bindir}/python3-debug
-%endif
-
-# There's 2to3-X.X executable and 2to3 soft link to it.
-# No reason to have both, so keep only 2to3 as an executable.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
-
-%if %{with flatpackage}
-# Remove stuff that would conflict with python3 package
-rm %{buildroot}%{_bindir}/python3
-rm %{buildroot}%{_bindir}/pydoc3
-rm %{buildroot}%{_bindir}/pathfix.py
-rm %{buildroot}%{_bindir}/pygettext3.py
-rm %{buildroot}%{_bindir}/msgfmt3.py
-rm %{buildroot}%{_bindir}/idle3
-rm %{buildroot}%{_bindir}/python3-*
-rm %{buildroot}%{_bindir}/2to3
-rm %{buildroot}%{_libdir}/libpython3.so
-rm %{buildroot}%{_mandir}/man1/python3.1*
-rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
-rm %{buildroot}%{_libdir}/pkgconfig/python3-embed.pc
-%else
-# Link the unversioned stuff
-#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
-ln -s ./python3 %{buildroot}%{_bindir}/python
-ln -s ./pydoc3 %{buildroot}%{_bindir}/pydoc
-ln -s ./pygettext3.py %{buildroot}%{_bindir}/pygettext.py
-ln -s ./msgfmt3.py %{buildroot}%{_bindir}/msgfmt.py
-ln -s ./idle3 %{buildroot}%{_bindir}/idle
-ln -s ./python3-config %{buildroot}%{_bindir}/python-config
-ln -s ./python3.1 %{buildroot}%{_mandir}/man1/python.1
-ln -s ./python3.pc %{buildroot}%{_libdir}/pkgconfig/python.pc
-%if %{with debug_build}
-ln -s ./python3-debug %{buildroot}%{_bindir}/python-debug
-%endif
-%endif
-
-
-# ======================================================
-# Checks for packaging issues
-# ======================================================
-
-%check
-
-# first of all, check timestamps of bytecode files
-find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
-
-# Ensure that the curses module was linked against libncursesw.so, rather than
-# libncurses.so
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
-ldd %{buildroot}/%{dynload_dir}/_curses*.so \
- | grep curses \
- | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
-
-# Ensure that the debug modules are linked against the debug libpython, and
-# likewise for the optimized modules and libpython:
-for Module in %{buildroot}/%{dynload_dir}/*.so ; do
- case $Module in
- *.%{SOABI_debug})
- ldd $Module | grep %{py_INSTSONAME_optimized} &&
- (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
-
- ;;
- *.%{SOABI_optimized})
- ldd $Module | grep %{py_INSTSONAME_debug} &&
- (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
- ;;
- esac
-done
-
-
-# ======================================================
-# Running the upstream test suite
-# ======================================================
-
-topdir=$(pwd)
-CheckPython() {
- ConfName=$1
- ConfDir=$(pwd)/build/$ConfName
-
- echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-
- # Note that we're running the tests using the version of the code in the
- # builddir, not in the buildroot.
-
- # Show some info, helpful for debugging test failures
- LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.pythoninfo
-
- # Run the upstream test suite
- # test_gdb skipped on s390x:
- #
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
- # test_gdb skipped everywhere:
- #
https://bugzilla.redhat.com/show_bug.cgi?id=1734327
- # test_distutils
- # distutils.tests.test_bdist_rpm tests fail when bootstraping the Python
- # package: rpmbuild requires /usr/bin/pythonX.Y to be installed
- LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- -wW --slowest -j0 \
- %if %{with bootstrap}
- -x test_distutils \
- %endif
- -x test_gdb \
- %ifarch %{mips64}
- -x test_ctypes \
- %endif
-
- echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-
-}
-
-%if %{with tests}
-
-# Check each of the configurations:
-%if %{with debug_build}
-CheckPython debug
-%endif # with debug_build
-CheckPython optimized
-
-%endif # with tests
-
-
-%files
-%doc README.rst
-
-%if %{without flatpackage}
-%{_bindir}/pydoc*
-%{_bindir}/python3
-%else
-%{_bindir}/pydoc%{pybasever}
-%endif
-
-%{_bindir}/python%{pybasever}
-%{_bindir}/python%{LDVERSION_optimized}
-%{_mandir}/*/*3*
-
-
-%if %{without flatpackage}
-%files -n python-unversioned-command
-%{_bindir}/python
-%{_mandir}/*/python.1*
-
-%files libs
-%doc README.rst
-%endif
-
-%dir %{pylibdir}
-%dir %{dynload_dir}
-
-%license %{pylibdir}/LICENSE.txt
-
-%{pylibdir}/lib2to3
-%if %{without flatpackage}
-%exclude %{pylibdir}/lib2to3/tests
-%endif
-
-%dir %{pylibdir}/unittest/
-%dir %{pylibdir}/unittest/__pycache__/
-%{pylibdir}/unittest/*.py
-%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/asyncio/
-%dir %{pylibdir}/asyncio/__pycache__/
-%{pylibdir}/asyncio/*.py
-%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/venv/
-%dir %{pylibdir}/venv/__pycache__/
-%{pylibdir}/venv/*.py
-%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/venv/scripts
-
-%{pylibdir}/wsgiref
-%{pylibdir}/xmlrpc
-
-%dir %{pylibdir}/ensurepip/
-%dir %{pylibdir}/ensurepip/__pycache__/
-%{pylibdir}/ensurepip/*.py
-%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
-
-%if %{with rpmwheels}
-%exclude %{pylibdir}/ensurepip/_bundled
-%else
-%dir %{pylibdir}/ensurepip/_bundled
-%{pylibdir}/ensurepip/_bundled/*.whl
-%endif
-
-%dir %{pylibdir}/concurrent/
-%dir %{pylibdir}/concurrent/__pycache__/
-%{pylibdir}/concurrent/*.py
-%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/concurrent/futures/
-%dir %{pylibdir}/concurrent/futures/__pycache__/
-%{pylibdir}/concurrent/futures/*.py
-%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
-
-%{pylibdir}/pydoc_data
-
-%{dynload_dir}/_blake2.%{SOABI_optimized}.so
-%{dynload_dir}/_md5.%{SOABI_optimized}.so
-%{dynload_dir}/_sha1.%{SOABI_optimized}.so
-%{dynload_dir}/_sha256.%{SOABI_optimized}.so
-%{dynload_dir}/_sha3.%{SOABI_optimized}.so
-%{dynload_dir}/_sha512.%{SOABI_optimized}.so
-
-%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
-%{dynload_dir}/_bisect.%{SOABI_optimized}.so
-%{dynload_dir}/_bz2.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
-%{dynload_dir}/_contextvars.%{SOABI_optimized}.so
-%{dynload_dir}/_crypt.%{SOABI_optimized}.so
-%{dynload_dir}/_csv.%{SOABI_optimized}.so
-%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
-%{dynload_dir}/_curses.%{SOABI_optimized}.so
-%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
-%{dynload_dir}/_dbm.%{SOABI_optimized}.so
-%{dynload_dir}/_decimal.%{SOABI_optimized}.so
-%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
-%if %{with gdbm}
-%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
-%endif
-%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
-%{dynload_dir}/_heapq.%{SOABI_optimized}.so
-%{dynload_dir}/_json.%{SOABI_optimized}.so
-%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
-%{dynload_dir}/_lzma.%{SOABI_optimized}.so
-%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
-%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
-%{dynload_dir}/_opcode.%{SOABI_optimized}.so
-%{dynload_dir}/_pickle.%{SOABI_optimized}.so
-%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
-%{dynload_dir}/_queue.%{SOABI_optimized}.so
-%{dynload_dir}/_random.%{SOABI_optimized}.so
-%{dynload_dir}/_socket.%{SOABI_optimized}.so
-%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
-%{dynload_dir}/_ssl.%{SOABI_optimized}.so
-%{dynload_dir}/_statistics.%{SOABI_optimized}.so
-%{dynload_dir}/_struct.%{SOABI_optimized}.so
-%{dynload_dir}/array.%{SOABI_optimized}.so
-%{dynload_dir}/audioop.%{SOABI_optimized}.so
-%{dynload_dir}/binascii.%{SOABI_optimized}.so
-%{dynload_dir}/cmath.%{SOABI_optimized}.so
-%{dynload_dir}/_datetime.%{SOABI_optimized}.so
-%{dynload_dir}/fcntl.%{SOABI_optimized}.so
-%{dynload_dir}/grp.%{SOABI_optimized}.so
-%{dynload_dir}/math.%{SOABI_optimized}.so
-%{dynload_dir}/mmap.%{SOABI_optimized}.so
-%{dynload_dir}/nis.%{SOABI_optimized}.so
-%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
-%{dynload_dir}/parser.%{SOABI_optimized}.so
-%{dynload_dir}/_posixshmem.%{SOABI_optimized}.so
-%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
-%{dynload_dir}/readline.%{SOABI_optimized}.so
-%{dynload_dir}/resource.%{SOABI_optimized}.so
-%{dynload_dir}/select.%{SOABI_optimized}.so
-%{dynload_dir}/spwd.%{SOABI_optimized}.so
-%{dynload_dir}/syslog.%{SOABI_optimized}.so
-%{dynload_dir}/termios.%{SOABI_optimized}.so
-%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
-%{dynload_dir}/_uuid.%{SOABI_optimized}.so
-%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
-%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
-%{dynload_dir}/zlib.%{SOABI_optimized}.so
-
-%dir %{pylibdir}/site-packages/
-%dir %{pylibdir}/site-packages/__pycache__/
-%{pylibdir}/site-packages/README.txt
-%{pylibdir}/*.py
-%dir %{pylibdir}/__pycache__/
-%{pylibdir}/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/collections/
-%dir %{pylibdir}/collections/__pycache__/
-%{pylibdir}/collections/*.py
-%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/ctypes/
-%dir %{pylibdir}/ctypes/__pycache__/
-%{pylibdir}/ctypes/*.py
-%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/ctypes/macholib
-
-%{pylibdir}/curses
-
-%dir %{pylibdir}/dbm/
-%dir %{pylibdir}/dbm/__pycache__/
-%{pylibdir}/dbm/*.py
-%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/distutils/
-%dir %{pylibdir}/distutils/__pycache__/
-%{pylibdir}/distutils/*.py
-%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/distutils/README
-%{pylibdir}/distutils/command
-
-%dir %{pylibdir}/email/
-%dir %{pylibdir}/email/__pycache__/
-%{pylibdir}/email/*.py
-%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/email/mime
-%doc %{pylibdir}/email/architecture.rst
-
-%{pylibdir}/encodings
-
-%{pylibdir}/html
-%{pylibdir}/http
-
-%dir %{pylibdir}/importlib/
-%dir %{pylibdir}/importlib/__pycache__/
-%{pylibdir}/importlib/*.py
-%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/json/
-%dir %{pylibdir}/json/__pycache__/
-%{pylibdir}/json/*.py
-%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
-
-%{pylibdir}/logging
-%{pylibdir}/multiprocessing
-
-%dir %{pylibdir}/sqlite3/
-%dir %{pylibdir}/sqlite3/__pycache__/
-%{pylibdir}/sqlite3/*.py
-%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
-
-%if %{without flatpackage}
-%exclude %{pylibdir}/turtle.py
-%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
-%endif
-
-%{pylibdir}/urllib
-%{pylibdir}/xml
-
-%if "%{_lib}" == "lib64"
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
-%endif
-
-# "Makefile" and the config-32/64.h file are needed by
-# distutils/sysconfig.py:_init_posix(), so we include them in the core
-# package, along with their parent directories (bug 531901):
-%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
-%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
-%dir %{_includedir}/python%{LDVERSION_optimized}/
-%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-
-%{_libdir}/%{py_INSTSONAME_optimized}
-%if %{without flatpackage}
-%{_libdir}/libpython3.so
-%endif
-
-
-%if %{without flatpackage}
-%files devel
-%{_bindir}/2to3
-%endif
-
-%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
-%if %{without flatpackage}
-%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
-%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-%endif
-%{_includedir}/python%{LDVERSION_optimized}/*.h
-%{_includedir}/python%{LDVERSION_optimized}/internal/
-%{_includedir}/python%{LDVERSION_optimized}/cpython/
-%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
-
-%if %{without flatpackage}
-%{_bindir}/python3-config
-%{_bindir}/python-config
-%{_libdir}/pkgconfig/python3.pc
-%{_libdir}/pkgconfig/python.pc
-%{_libdir}/pkgconfig/python3-embed.pc
-%{_bindir}/pathfix.py
-%{_bindir}/pygettext3.py
-%{_bindir}/pygettext.py
-%{_bindir}/msgfmt3.py
-%{_bindir}/msgfmt.py
-%endif
-
-%{_bindir}/pygettext%{pybasever}.py
-%{_bindir}/msgfmt%{pybasever}.py
-
-%{_bindir}/python%{pybasever}-config
-%{_bindir}/python%{LDVERSION_optimized}-config
-%{_bindir}/python%{LDVERSION_optimized}-*-config
-%{_libdir}/libpython%{LDVERSION_optimized}.so
-%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
-%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}-embed.pc
-%{_libdir}/pkgconfig/python-%{pybasever}.pc
-%{_libdir}/pkgconfig/python-%{pybasever}-embed.pc
-
-
-%if %{without flatpackage}
-%files idle
-
-%{_bindir}/idle*
-%else
-%{_bindir}/idle%{pybasever}
-%endif
-
-%{pylibdir}/idlelib
-
-%if %{without flatpackage}
-%{_metainfodir}/idle3.appdata.xml
-%{_datadir}/applications/idle3.desktop
-%{_datadir}/icons/hicolor/*/apps/idle3.*
-%endif
-
-%if %{without flatpackage}
-%files tkinter
-%endif
-
-%{pylibdir}/tkinter
-%if %{without flatpackage}
-%exclude %{pylibdir}/tkinter/test
-%endif
-%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
-%{pylibdir}/turtle.py
-%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
-%dir %{pylibdir}/turtledemo
-%{pylibdir}/turtledemo/*.py
-%{pylibdir}/turtledemo/*.cfg
-%dir %{pylibdir}/turtledemo/__pycache__/
-%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
-
-
-%if %{without flatpackage}
-%files test
-%endif
-
-%{pylibdir}/ctypes/test
-%{pylibdir}/distutils/tests
-%{pylibdir}/sqlite3/test
-%{pylibdir}/test
-%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
-%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
-%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
-%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
-%{dynload_dir}/_testinternalcapi.%{SOABI_optimized}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
-%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
-%{pylibdir}/lib2to3/tests
-%{pylibdir}/tkinter/test
-%{pylibdir}/unittest/test
-
-# We don't bother splitting the debug build out into further subpackages:
-# if you need it, you're probably a developer.
-
-# Hence the manifest is the combination of analogous files in the manifests of
-# all of the other subpackages
-
-%if %{with debug_build}
-%if %{without flatpackage}
-%files debug
-%{_bindir}/python3-debug
-%{_bindir}/python-debug
-%endif
-
-# Analog of the core subpackage's files:
-%{_bindir}/python%{LDVERSION_debug}
-
-# Analog of the -libs subpackage's files:
-# ...with debug builds of the built-in "extension" modules:
-
-%{dynload_dir}/_blake2.%{SOABI_debug}.so
-%{dynload_dir}/_md5.%{SOABI_debug}.so
-%{dynload_dir}/_sha1.%{SOABI_debug}.so
-%{dynload_dir}/_sha256.%{SOABI_debug}.so
-%{dynload_dir}/_sha3.%{SOABI_debug}.so
-%{dynload_dir}/_sha512.%{SOABI_debug}.so
-
-%{dynload_dir}/_asyncio.%{SOABI_debug}.so
-%{dynload_dir}/_bisect.%{SOABI_debug}.so
-%{dynload_dir}/_bz2.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
-%{dynload_dir}/_contextvars.%{SOABI_debug}.so
-%{dynload_dir}/_crypt.%{SOABI_debug}.so
-%{dynload_dir}/_csv.%{SOABI_debug}.so
-%{dynload_dir}/_ctypes.%{SOABI_debug}.so
-%{dynload_dir}/_curses.%{SOABI_debug}.so
-%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
-%{dynload_dir}/_dbm.%{SOABI_debug}.so
-%{dynload_dir}/_decimal.%{SOABI_debug}.so
-%{dynload_dir}/_elementtree.%{SOABI_debug}.so
-%if %{with gdbm}
-%{dynload_dir}/_gdbm.%{SOABI_debug}.so
-%endif
-%{dynload_dir}/_hashlib.%{SOABI_debug}.so
-%{dynload_dir}/_heapq.%{SOABI_debug}.so
-%{dynload_dir}/_json.%{SOABI_debug}.so
-%{dynload_dir}/_lsprof.%{SOABI_debug}.so
-%{dynload_dir}/_lzma.%{SOABI_debug}.so
-%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
-%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
-%{dynload_dir}/_opcode.%{SOABI_debug}.so
-%{dynload_dir}/_pickle.%{SOABI_debug}.so
-%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
-%{dynload_dir}/_queue.%{SOABI_debug}.so
-%{dynload_dir}/_random.%{SOABI_debug}.so
-%{dynload_dir}/_socket.%{SOABI_debug}.so
-%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
-%{dynload_dir}/_ssl.%{SOABI_debug}.so
-%{dynload_dir}/_statistics.%{SOABI_debug}.so
-%{dynload_dir}/_struct.%{SOABI_debug}.so
-%{dynload_dir}/array.%{SOABI_debug}.so
-%{dynload_dir}/audioop.%{SOABI_debug}.so
-%{dynload_dir}/binascii.%{SOABI_debug}.so
-%{dynload_dir}/cmath.%{SOABI_debug}.so
-%{dynload_dir}/_datetime.%{SOABI_debug}.so
-%{dynload_dir}/fcntl.%{SOABI_debug}.so
-%{dynload_dir}/grp.%{SOABI_debug}.so
-%{dynload_dir}/math.%{SOABI_debug}.so
-%{dynload_dir}/mmap.%{SOABI_debug}.so
-%{dynload_dir}/nis.%{SOABI_debug}.so
-%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
-%{dynload_dir}/parser.%{SOABI_debug}.so
-%{dynload_dir}/_posixshmem.%{SOABI_debug}.so
-%{dynload_dir}/pyexpat.%{SOABI_debug}.so
-%{dynload_dir}/readline.%{SOABI_debug}.so
-%{dynload_dir}/resource.%{SOABI_debug}.so
-%{dynload_dir}/select.%{SOABI_debug}.so
-%{dynload_dir}/spwd.%{SOABI_debug}.so
-%{dynload_dir}/syslog.%{SOABI_debug}.so
-%{dynload_dir}/termios.%{SOABI_debug}.so
-%{dynload_dir}/unicodedata.%{SOABI_debug}.so
-%{dynload_dir}/_uuid.%{SOABI_debug}.so
-%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
-%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
-%{dynload_dir}/zlib.%{SOABI_debug}.so
-
-# No need to split things out the "Makefile" and the config-32/64.h file as we
-# do for the regular build above (bug 531901), since they're all in one package
-# now; they're listed below, under "-devel":
-
-%{_libdir}/%{py_INSTSONAME_debug}
-
-# Analog of the -devel subpackage's files:
-%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
-%{_includedir}/python%{LDVERSION_debug}
-%{_bindir}/python%{LDVERSION_debug}-config
-%{_bindir}/python%{LDVERSION_debug}-*-config
-%{_libdir}/libpython%{LDVERSION_debug}.so
-%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
-%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
-%{_libdir}/pkgconfig/python-%{LDVERSION_debug}-embed.pc
-
-# Analog of the -tools subpackage's files:
-# None for now; we could build precanned versions that have the appropriate
-# shebang if needed
-
-# Analog of the tkinter subpackage's files:
-%{dynload_dir}/_tkinter.%{SOABI_debug}.so
-
-# Analog of the -test subpackage's files:
-%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
-%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
-%{dynload_dir}/_testcapi.%{SOABI_debug}.so
-%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
-%{dynload_dir}/_testinternalcapi.%{SOABI_debug}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
-
-%endif # with debug_build
-
-# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
-#
-# The /usr/lib/rpm/redhat/macros defines %%__debug_package to use
-# debugfiles.list, and it appears that everything below /usr/lib/debug and
-# (/usr/src/debug) gets added to this file (via LISTFILES) in
-# /usr/lib/rpm/find-debuginfo.sh
-#
-# Hence by installing it below /usr/lib/debug we ensure it is added to the
-# -debuginfo subpackage
-# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
-# payload file would be unpackaged)
-
-# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
-%undefine _debuginfo_subpackages
-
-# ======================================================
-# Finally, the changelog:
-# ======================================================
-
-%changelog
-* Mon Oct 14 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0-1
-- Update to Python 3.8.0 final
-
-* Tue Oct 01 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~rc1-1
-- Rebased to Python 3.8.0rc1
-
-* Sat Aug 31 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b4-1
-- Rebased to Python 3.8.0b4
-- Enable Profile-guided optimization for all arches, not just x86 (#1741015)
-
-* Mon Jul 29 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b3-1
-- Update to 3.8.0b3
-
-* Fri Jul 26 2019 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.8.0~b2-2
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
-
-* Fri Jul 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b2-1
-- Update to 3.8.0b2
-
-* Wed Jun 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b1-1
-- Update to 3.8.0b1
-
-* Fri May 17 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-2
-- Remove a faulty patch that resulted in invalid value of
- distutils.sysconfig.get_config_var('LIBPL') (#1710767)
-
-* Tue May 07 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-1
-- Update to 3.8.0a4
-
-* Tue Mar 26 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a3-1
-- Update to 3.8.0a3
-
-* Mon Feb 25 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a2-1
-- Update to 3.8.0a2
-
-* Mon Feb 18 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-3
-- Reduced default build flags used to build extension modules
-
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
-
-* Sun Feb 17 2019 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.8.0~a1-2
-- Rebuild for readline 8.0
-
-* Tue Feb 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-1
-- Update to 3.8.0a1
diff --git a/python39.rpmlintrc b/python39.rpmlintrc
new file mode 100644
index 0000000..1314d45
--- /dev/null
+++ b/python39.rpmlintrc
@@ -0,0 +1,80 @@
+# KNOWN BUGS:
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
+addFilter(r'crypto-policy-non-compliance-openssl')
+
+
+# TESTS:
+addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3.\d/test')
+
+
+# OTHER DELIBERATES:
+# chroot function
+addFilter(r'missing-call-to-chdir-with-chroot')
+
+# intentionally unversioned and selfobsoleted
+addFilter(r'unversioned-explicit-obsoletes python')
+addFilter(r'self-obsoletion python3\d obsoletes python3\d')
+
+# intentionally hardcoded
+addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
+
+# intentional for our pythonXY package
+addFilter(r'python3\d\.[^:]+: (E|W): devel-file-in-non-devel-package')
+
+# we have non binary stuff, python files
+addFilter(r'only-non-binary-in-usr-lib')
+
+# some devel files that are deliberately needed
+addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
+addFilter(r'devel-file-in-non-devel-package
/usr/lib(64)?/python3\.\d/distutils/tests/xxmodule\.c')
+
+
+# SORRY, NOT SORRY:
+# manual pages
+addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix|msgfmt|pygettext)')
+addFilter(r'no-manual-page-for-binary python3.*-config$')
+addFilter(r'no-manual-page-for-binary python3.\dd?m$')
+
+# missing documentation from subpackages
+addFilter(r'^python3\d?-(debug|tkinter|test|idle)\.[^:]+: (E|W):
no-documentation')
+
+# platform python is obsoleted, but not provided
+addFilter(r'obsolete-not-provided platform-python')
+
+
+# RPMLINT IMPERFECTIONS
+#
https://github.com/rpm-software-management/rpmlint/issues/123
+addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3393')
+#
https://github.com/rpm-software-management/rpmlint/pull/133
+addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3394')
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1550562
+#
https://github.com/rpm-software-management/rpmlint/issues/128
+addFilter(r'python-bytecode-inconsistent-mtime .* 1970')
+
+# debugsource
+addFilter(r'^python3\d?-debugsource\.[^:]+: (E|W): no-documentation')
+
+# debuginfo
+addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(build-id\)')
+
+# this is OK for F28+
+addFilter(r'library-without-ldconfig-post')
+
+# debug package contains devel and non-devel files
+addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-package')
+
+# this goes to other subpackage, hence not actually dangling, the read error is bogus
+addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
+addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
+
+# we need this macro to evaluate, even if the line starts with #
+addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
+
+# Python modules don't need to be linked against libc
+# Since 3.8 they are no longer linked against libpython3.8.so.1.0
+addFilter(r'E: library-not-linked-against-libc
/usr/lib(64)?/python3.\d/lib-dynload/')
+addFilter(r'E: shared-lib-without-dependency-information
/usr/lib(64)?/python3.\d/lib-dynload/')
+
+# SPELLING ERRORS
+addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
diff --git a/python39.spec b/python39.spec
new file mode 100644
index 0000000..d0c08aa
--- /dev/null
+++ b/python39.spec
@@ -0,0 +1,1578 @@
+# ==================
+# Top-level metadata
+# ==================
+
+%global pybasever 3.9
+
+# pybasever without the dot:
+%global pyshortver 39
+
+Name: python%{pyshortver}
+Summary: Version %{pybasever} of the Python interpreter
+URL:
https://www.python.org/
+
+# WARNING When rebasing to a new Python version,
+# remember to update the python3-docs package as well
+%global general_version %{pybasever}.0
+%global prerel a1
+%global upstream_version %{general_version}%{?prerel}
+Version: %{general_version}%{?prerel:~%{prerel}}
+Release: 1%{?dist}
+License: Python
+
+
+# ==================================
+# Conditionals controlling the build
+# ==================================
+
+# Note that the bcond macros are named for the CLI option they create.
+# "%%bcond_without" means "ENABLE by default and create a --without
option"
+
+
+# Flat package, i.e. python36, python37, python38 for tox etc.
+# warning: changes some other defaults
+# in Fedora, never turn this on for the python3 package
+# and always keep it on for python37 etc.
+# WARNING: This does not change the package name and summary above
+%bcond_without flatpackage
+
+# When bootstrapping python3, we need to build setuptools.
+# but setuptools BR python3-devel and that brings in python3-rpm-generators;
+# python3-rpm-generators needs python3-setuptools, so we cannot have it yet.
+#
+# Procedure:
https://fedoraproject.org/wiki/SIGs/Python/UpgradingPython
+#
+# IMPORTANT: When bootstrapping, it's very likely the wheels for pip and
+# setuptools are not available. Turn off the rpmwheels bcond until
+# the two packages are built with wheels to get around the issue.
+%bcond_with bootstrap
+
+# Whether to use RPM build wheels from the python-{pip,setuptools}-wheel package
+# Uses upstream bundled prebuilt wheels otherwise
+%bcond_without rpmwheels
+
+# Expensive optimizations (mainly, profile-guided optimizations)
+%bcond_without optimizations
+
+# Run the test suite in %%check
+%bcond_without tests
+
+# Extra build for debugging the interpreter or C-API extensions
+# (the -debug subpackages)
+%if %{with flatpackage}
+%bcond_with debug_build
+%else
+%bcond_without debug_build
+%endif
+
+# Support for the GDB debugger
+%bcond_without gdb_hooks
+
+# The dbm.gnu module (key-value database)
+%bcond_without gdbm
+
+# Main interpreter loop optimization
+%bcond_without computed_gotos
+
+# Support for the Valgrind debugger/profiler
+%ifarch %{valgrind_arches}
+%bcond_without valgrind
+%else
+%bcond_with valgrind
+%endif
+
+
+# =====================
+# General global macros
+# =====================
+
+%global pylibdir %{_libdir}/python%{pybasever}
+%global dynload_dir %{pylibdir}/lib-dynload
+
+# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
+# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
+%global ABIFLAGS_optimized %{nil}
+%global ABIFLAGS_debug d
+
+%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
+%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
+
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
+
+# All bytecode files are in a __pycache__ subdirectory, with a name
+# reflecting the version of the bytecode.
+# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
+# For example,
+# foo/bar.py
+# has bytecode at:
+# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
+%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
+
+# Python's configure script defines SOVERSION, and this is used in the Makefile
+# to determine INSTSONAME, the name of the libpython DSO:
+# LDLIBRARY='libpython$(VERSION).so'
+# INSTSONAME="$LDLIBRARY".$SOVERSION
+# We mirror this here in order to make it easier to add the -gdb.py hooks.
+# (if these get out of sync, the payload of the libs subpackage will fail
+# and halt the build)
+%global py_SOVERSION 1.0
+%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
+%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
+
+# Disable automatic bytecompilation. The python3 binary is not yet be
+# available in /usr/bin when Python is built. Also, the bytecompilation fails
+# on files that test invalid syntax.
+%undefine py_auto_byte_compile
+
+# For multilib support, files that are different between 32- and 64-bit arches
+# need different filenames. Use "64" or "32" according to the word
size.
+# Currently, the best way to determine an architecture's word size happens to
+# be checking %%{_lib}.
+%if "%{_lib}" == "lib64"
+%global wordsize 64
+%else
+%global wordsize 32
+%endif
+
+
+# =======================
+# Build-time requirements
+# =======================
+
+# (keep this list alphabetized)
+
+BuildRequires: autoconf
+BuildRequires: bluez-libs-devel
+BuildRequires: bzip2
+BuildRequires: bzip2-devel
+BuildRequires: desktop-file-utils
+BuildRequires: expat-devel
+
+BuildRequires: findutils
+BuildRequires: gcc-c++
+%if %{with gdbm}
+BuildRequires: gdbm-devel
+%endif
+BuildRequires: glibc-all-langpacks
+BuildRequires: glibc-devel
+BuildRequires: gmp-devel
+BuildRequires: gnupg2
+BuildRequires: libappstream-glib
+BuildRequires: libffi-devel
+BuildRequires: libnsl2-devel
+BuildRequires: libtirpc-devel
+BuildRequires: libGL-devel
+BuildRequires: libuuid-devel
+BuildRequires: libX11-devel
+BuildRequires: ncurses-devel
+
+BuildRequires: openssl-devel
+BuildRequires: pkgconfig
+BuildRequires: readline-devel
+BuildRequires: redhat-rpm-config >= 127
+BuildRequires: sqlite-devel
+BuildRequires: gdb
+
+BuildRequires: tar
+BuildRequires: tcl-devel
+BuildRequires: tix-devel
+BuildRequires: tk-devel
+
+%if %{with valgrind}
+BuildRequires: valgrind-devel
+%endif
+
+BuildRequires: xz-devel
+BuildRequires: zlib-devel
+
+BuildRequires: /usr/bin/dtrace
+
+# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
+BuildRequires: /usr/sbin/ifconfig
+
+# For %%python_provide
+BuildRequires: python-rpm-macros
+
+%if %{with rpmwheels}
+BuildRequires: python-setuptools-wheel
+BuildRequires: python-pip-wheel
+%endif
+
+%if %{without bootstrap}
+# for make regen-all and distutils.tests.test_bdist_rpm
+BuildRequires: python%{pyshortver}
+%endif
+
+# =======================
+# Source code and patches
+# =======================
+
+Source0: %{url}ftp/python/%{general_version}/Python-%{upstream_version}.tar.xz
+Source1: %{url}ftp/python/%{general_version}/Python-%{upstream_version}.tar.xz.asc
+Source2: %{url}static/files/pubkeys.txt
+
+# A simple script to check timestamps of bytecode files
+# Run in check section with Python that is currently being built
+# Originally written by bkabrda
+Source8: check-pyc-timestamps.py
+
+# Desktop menu entry for idle3
+Source10: idle3.desktop
+
+# AppData file for idle3
+Source11: idle3.appdata.xml
+
+# 00001 #
+# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
+# Was Patch0 in ivazquez' python3000 specfile:
+Patch1: 00001-rpath.patch
+
+# 00102 #
+# Change the various install paths to use /usr/lib64/ instead or /usr/lib
+# Only used when "%%{_lib}" == "lib64"
+# Not yet sent upstream.
+Patch102: 00102-lib64.patch
+
+# 00111 #
+# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
+# a libpythonMAJOR.MINOR.a
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
+# Downstream only: not appropriate for upstream
+Patch111: 00111-no-static-lib.patch
+
+# 00189 #
+# Instead of bundled wheels, use our RPM packaged wheels from
+# /usr/share/python-wheels
+# Downstream only: upstream bundles
+# We might eventually pursuit upstream support, but it's low prio
+Patch189: 00189-use-rpm-wheels.patch
+
+# 00251
+# 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
+# Downstream only: Awaiting resources to work on upstream PEP
+Patch251: 00251-change-user-install-location.patch
+
+# 00274 #
+# Upstream uses Debian-style architecture naming. Change to match Fedora.
+Patch274: 00274-fix-arch-names.patch
+
+# 00328 #
+# Restore pyc to TIMESTAMP invalidation mode as default in rpmbubild
+# See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
+# Downstream only: only used when building RPM packages
+# Ideally, we should talk to upstream and explain why we don't want this
+Patch328: 00328-pyc-timestamp-invalidation-mode.patch
+
+# (New patches go here ^^^)
+#
+# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
+# please try to keep the patch numbers in-sync between all specfiles.
+#
+# More information, and a patch number catalog, is at:
+#
+#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+#
+# The patches are stored and rebased at:
+#
+#
https://github.com/fedora-python/cpython
+
+
+# ==========================================
+# Descriptions, and metadata for subpackages
+# ==========================================
+
+# People might want to dnf install pythonX.Y instead of pythonXY;
+# we enable this in both flat and nonflat package.
+Provides: python%{pybasever} = %{version}-%{release}
+
+%if %{without flatpackage}
+
+# Packages with Python modules in standard locations automatically
+# depend on python(abi). Provide that here.
+Provides: python(abi) = %{pybasever}
+
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
+# In order to support multiple Python interpreters for development purposes,
+# packages with the naming scheme flatpackage (e.g. python35) exist for
+# non-default versions of Python 3.
+# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
+# these names here.
+Provides: python%{pyshortver} = %{version}-%{release}
+# Note that using Obsoletes without package version is not standard practice.
+# Here we assert that *any* version of the system's default interpreter is
+# preferable to an "extra" interpreter. For example, python3-3.6.1 will
+# replace python36-3.6.2.
+Obsoletes: python%{pyshortver}
+
+#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
+#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
+# We recommend /usr/bin/python so users get it by default
+# Versioned recommends are problematic, and we know that the package requires
+# python3 back with fixed version, so we just use the path here:
+Recommends: %{_bindir}/python
+
+# In Fedora 31, /usr/bin/pydoc was moved here from Python 2.
+# Ideally we'd have an explicit conflict with "/usr/bin/pydoc < 3",
+# but file provides aren't versioned and the file moved across packages.
+# Instead, we rely on the conflict in python3-libs.
+
+# Previously, this was required for our rewheel patch to work.
+# This is technically no longer needed, but we keep it recommended
+# for the developer experience.
+Recommends: python3-setuptools
+Recommends: python3-pip
+
+# This prevents ALL subpackages built from this spec to require
+# /usr/bin/python3*. Granularity per subpackage is impossible.
+# It's intended for the libs package not to drag in the interpreter, see
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+# All others require %%{name} anyway.
+%global __requires_exclude ^/usr/bin/python3
+
+
+# The description used both for the SRPM and the main `python3` subpackage:
+%description
+Python is an accessible, high-level, dynamically typed, interpreted programming
+language, designed with an emphasis on code readability.
+It includes an extensive standard library, and has a vast ecosystem of
+third-party libraries.
+
+The %{name} package provides the "python3" executable: the reference
+interpreter for the Python language, version 3.
+The majority of its standard library is provided in the %{name}-libs package,
+which should be installed automatically along with %{name}.
+The remaining parts of the Python standard library are broken out into the
+%{name}-tkinter and %{name}-test packages, which may need to be installed
+separately.
+
+Documentation for Python is provided in the %{name}-docs package.
+
+Packages containing additional libraries for Python are generally named with
+the "%{name}-" prefix.
+
+
+#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
+#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
+%package -n python-unversioned-command
+Summary: The "python" command that runs Python 3
+BuildArch: noarch
+
+# In theory this could require any python3 version
+Requires: python3 == %{version}-%{release}
+# But since we want to provide versioned python, we require exact version
+Provides: python = %{version}-%{release}
+# This also save us an explicit conflict for older python3 builds
+
+%description -n python-unversioned-command
+This package contains /usr/bin/python - the "python" command that runs Python
3.
+
+
+%package libs
+Summary: Python runtime libraries
+
+%if %{with rpmwheels}
+Requires: python-setuptools-wheel
+Requires: python-pip-wheel
+%else
+Provides: bundled(python3-pip) = 19.2.3
+Provides: bundled(python3-setuptools) = 41.2.0
+%endif
+
+%{?python_provide:%python_provide python3-libs}
+
+# There are files in the standard library that have python shebang.
+# We've filtered the automatic requirement out so libs are installable without
+# the main package. This however makes it pulled in by default.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+Recommends: %{name}%{?_isa} = %{version}-%{release}
+
+#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
+# In Fedora 31, several "unversioned" files like /usr/bin/pydoc and all the
+# "unversioned" provides were moved from python2 to python3.
+# So, newer python3 packages need to conflict with old Python 2 builds that
+# still provided unversioned Python.
+# Since all python packages, new and old, have versioned requires on
+# python?-libs, we do it here:
+Conflicts: python-libs < 3
+# (We explicitly conflict with python-libs and not python2-libs, so only the
+# old Python 2 builds that still provided unversioned Python are handled.)
+
+
+%description libs
+This package contains runtime libraries for use by Python:
+- the majority of the Python standard library
+- a dynamically linked library for use by applications that embed Python as
+ a scripting language, and by the main "python3" executable
+
+
+%package devel
+Summary: Libraries and header files needed for Python development
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+BuildRequires: python-rpm-macros
+# The RPM related dependencies bring nothing to a non-RPM Python developer
+# But we want them when packages BuildRequire python3-devel
+Requires: (python-rpm-macros if rpm-build)
+Requires: (python3-rpm-macros if rpm-build)
+
+%if %{without bootstrap}
+# This is not "API" (packages that need setuptools should still BuildRequire
it)
+# However some packages apparently can build both with and without setuptools
+# producing egg-info as file or directory (depending on setuptools presence).
+# Directory-to-file updates are problematic in RPM, so we ensure setuptools is
+# installed when -devel is required.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1623914
+# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
+Requires: (python3-setuptools if rpm-build)
+
+Requires: (python3-rpm-generators if rpm-build)
+%endif
+
+%{?python_provide:%python_provide python3-devel}
+
+Provides: %{name}-2to3 = %{version}-%{release}
+Provides: 2to3 = %{version}-%{release}
+
+Conflicts: %{name} < %{version}-%{release}
+
+# In Fedora 31, several "unversioned" files were moved here from Python 2:
+# pygettext.py, msgfmt.py, python-config, python.pc
+Conflicts: python-devel < 3
+
+%description devel
+This package contains the header files and configuration needed to compile
+Python extension modules (typically written in C or C++), to embed Python
+into other programs, and to make binary distributions for Python libraries.
+
+It also contains the necessary macros to build RPM packages with Python modules
+and 2to3 tool, an automatic source converter from Python 2.X.
+
+
+%package idle
+Summary: A basic graphical development environment for Python
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-tkinter = %{version}-%{release}
+
+Provides: idle3 = %{version}-%{release}
+Provides: idle = %{version}-%{release}
+
+Provides: %{name}-tools = %{version}-%{release}
+Provides: %{name}-tools%{?_isa} = %{version}-%{release}
+Obsoletes: %{name}-tools < %{version}-%{release}
+
+# In Fedora 31, /usr/bin/idle was moved here from Python 2.
+Conflicts: python-tools < 3
+
+%{?python_provide:%python_provide python3-idle}
+
+%description idle
+IDLE is Pythons Integrated Development and Learning Environment.
+
+IDLE has the following features: Python shell window (interactive
+interpreter) with colorizing of code input, output, and error messages;
+multi-window text editor with multiple undo, Python colorizing,
+smart indent, call tips, auto completion, and other features;
+search within any window, replace within editor windows, and
+search through multiple files (grep); debugger with persistent
+breakpoints, stepping, and viewing of global and local namespaces;
+configuration, browsers, and other dialogs.
+
+
+%package tkinter
+Summary: A GUI toolkit for Python
+Requires: %{name} = %{version}-%{release}
+
+%{?python_provide:%python_provide python3-tkinter}
+
+%description tkinter
+The Tkinter (Tk interface) library is a graphical user interface toolkit for
+the Python programming language.
+
+
+%package test
+Summary: The self-test suite for the main python3 package
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
+%{?python_provide:%python_provide python3-test}
+
+%description test
+The self-test suite for the Python interpreter.
+
+This is only useful to test Python itself. For testing general Python code,
+you should use the unittest module from %{name}-libs, or a library such as
+%{name}-pytest or %{name}-nose.
+
+
+%if %{with debug_build}
+%package debug
+Summary: Debug version of the Python runtime
+
+# The debug build is an all-in-one package version of the regular build, and
+# shares the same .py/.pyc files and directories as the regular build. Hence
+# we depend on all of the subpackages of the regular build:
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+Requires: %{name}-test%{?_isa} = %{version}-%{release}
+Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
+Requires: %{name}-idle%{?_isa} = %{version}-%{release}
+
+# In Fedora 31, /usr/bin/python-debug was moved here from Python 2.
+Conflicts: python-debug < 3
+
+%{?python_provide:%python_provide python3-debug}
+
+%description debug
+python3-debug provides a version of the Python runtime with numerous debugging
+features enabled, aimed at advanced Python users such as developers of Python
+extension modules.
+
+This version uses more memory and will be slower than the regular Python build,
+but is useful for tracking down reference-counting issues and other bugs.
+
+The debug build shares installation directories with the standard Python
+runtime. Python modules -- source (.py), bytecode (.pyc), and C-API extensions
+(.cpython*.so) -- are compatible between this and the standard version
+of Python.
+
+The debug runtime additionally supports debug builds of C-API extensions
+(with the "d" ABI flag) for debugging issues in those extensions.
+%endif # with debug_build
+
+%else # with flatpackage
+
+# We'll not provide this, on purpose
+# No package in Fedora shall ever depend on flatpackage via this
+%global __requires_exclude ^python\\(abi\\) = 3\\..$
+%global __provides_exclude ^python\\(abi\\) = 3\\..$
+
+%if %{with rpmwheels}
+Requires: python-setuptools-wheel
+Requires: python-pip-wheel
+%else
+Provides: bundled(python3-pip) = 19.2.3
+Provides: bundled(python3-setuptools) = 41.2.0
+%endif
+
+# The description for the flat package
+%description
+Python %{pybasever} package for developers.
+
+This package exists to allow developers to test their code against a newer
+version of Python. This is not a full Python stack and if you wish to run
+your applications with Python %{pybasever}, update your Fedora to a newer
+version once Python %{pybasever} is stable.
+
+%endif # with flatpackage
+
+# ======================================================
+# The prep phase of the build:
+# ======================================================
+
+%prep
+%gpgverify -k2 -s1 -d0
+%setup -q -n Python-%{upstream_version}
+# Remove all exe files to ensure we are not shipping prebuilt binaries
+# note that those are only used to create Microsoft Windows installers
+# and that functionality is broken on Linux anyway
+find -name '*.exe' -print -delete
+
+# Remove bundled libraries to ensure that we're using the system copy.
+rm -r Modules/expat
+
+#
+# Apply patches:
+#
+%patch1 -p1
+
+%if "%{_lib}" == "lib64"
+%patch102 -p1
+%endif
+%patch111 -p1
+
+%if %{with rpmwheels}
+%patch189 -p1
+rm Lib/ensurepip/_bundled/*.whl
+%endif
+
+%patch251 -p1
+%patch274 -p1
+%patch328 -p1
+
+
+# Remove files that should be generated by the build
+# (This is after patching, so that we can use patches directly from upstream)
+rm configure pyconfig.h.in
+
+
+# ======================================================
+# Configuring and building the code:
+# ======================================================
+
+%build
+
+# Regenerate the configure script and pyconfig.h.in
+autoconf
+autoheader
+
+# Remember the current directory (which has sources and the configure script),
+# so we can refer to it after we "cd" elsewhere.
+topdir=$(pwd)
+
+# Get proper option names from bconds
+%if %{with computed_gotos}
+%global computed_gotos_flag yes
+%else
+%global computed_gotos_flag no
+%endif
+
+%if %{with optimizations}
+%global optimizations_flag "--enable-optimizations"
+%else
+%global optimizations_flag "--disable-optimizations"
+%endif
+
+# Set common compiler/linker flags
+# We utilize the %%extension_...flags macros here so users building C/C++
+# extensions with our python won't get all the compiler/linker flags used
+# in Fedora RPMs.
+# Standard library built here will still use the %%build_...flags,
+# Fedora packages utilizing %%py3_build will use them as well
+#
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
+export CFLAGS="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
+export CFLAGS_NODIST="%{build_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
+export CXXFLAGS="%{extension_cxxflags} -D_GNU_SOURCE -fPIC -fwrapv"
+export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
+export OPT="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
+export LINKCC="gcc"
+export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
+export LDFLAGS="%{extension_ldflags} -g $(pkg-config --libs-only-L openssl)"
+export LDFLAGS_NODIST="%{build_ldflags} -g $(pkg-config --libs-only-L
openssl)"
+
+# We can build several different configurations of Python: regular and debug.
+# Define a common function that does one build:
+BuildPython() {
+ ConfName=$1
+ ExtraConfigArgs=$2
+ MoreCFlags=$3
+
+ # Each build is done in its own directory
+ ConfDir=build/$ConfName
+ echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ # Normally, %%configure looks for the "configure" script in the current
+ # directory.
+ # Since we changed directories, we need to tell %%configure where to look.
+ %global _configure $topdir/configure
+
+%configure \
+ --enable-ipv6 \
+ --enable-shared \
+ --with-computed-gotos=%{computed_gotos_flag} \
+ --with-dbmliborder=gdbm:ndbm:bdb \
+ --with-system-expat \
+ --with-system-ffi \
+ --enable-loadable-sqlite-extensions \
+ --with-dtrace \
+ --with-lto \
+ --with-ssl-default-suites=openssl \
+%if %{with valgrind}
+ --with-valgrind \
+%endif
+ $ExtraConfigArgs \
+ %{nil}
+
+%global flags_override EXTRA_CFLAGS="$MoreCFlags"
CFLAGS_NODIST="$CFLAGS_NODIST $MoreCFlags"
+
+%if %{without bootstrap}
+ # Regenerate generated files (needs python3)
+ %make_build %{flags_override} regen-all
PYTHON_FOR_REGEN="python%{pybasever}"
+%endif
+
+ # Invoke the build
+ %make_build %{flags_override}
+
+ popd
+ echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Call the above to build each configuration.
+
+%if %{with debug_build}
+BuildPython debug \
+ "--without-ensurepip --with-pydebug" \
+ "-Og"
+%endif # with debug_build
+
+BuildPython optimized \
+ "--without-ensurepip %{optimizations_flag}" \
+ ""
+
+# ======================================================
+# Installing the built code:
+# ======================================================
+
+%install
+
+# As in %%build, remember the current directory
+topdir=$(pwd)
+
+# We install a collection of hooks for gdb that make it easier to debug
+# executables linked against libpython3* (such as /usr/bin/python3 itself)
+#
+# These hooks are implemented in Python itself (though they are for the version
+# of python that gdb is linked with)
+#
+# gdb-archer looks for them in the same path as the ELF file or its .debug
+# file, with a -gdb.py suffix.
+# We put them next to the debug file, because ldconfig would complain if
+# it found non-library files directly in /usr/lib/
+# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
+#
+# We'll put these files in the debuginfo package by installing them to e.g.:
+# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
+# (note that the debug path is /usr/lib/debug for both 32/64 bit)
+#
+# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
+# information
+
+%if %{with gdb_hooks}
+DirHoldingGdbPy=%{_usr}/lib/debug/%{_libdir}
+mkdir -p %{buildroot}$DirHoldingGdbPy
+%endif # with gdb_hooks
+
+# Multilib support for pyconfig.h
+# 32- and 64-bit versions of pyconfig.h are different. For multilib support
+# (making it possible to install 32- and 64-bit versions simultaneously),
+# we need to install them under different filenames, and to make the common
+# "pyconfig.h" include the right file based on architecture.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
+# Filanames are defined here:
+%global _pyconfig32_h pyconfig-32.h
+%global _pyconfig64_h pyconfig-64.h
+%global _pyconfig_h pyconfig-%{wordsize}.h
+
+# Use a common function to do an install for all our configurations:
+InstallPython() {
+
+ ConfName=$1
+ PyInstSoName=$2
+ MoreCFlags=$3
+ LDVersion=$4
+
+ # Switch to the directory with this configuration's built files
+ ConfDir=build/$ConfName
+ echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ make \
+ DESTDIR=%{buildroot} \
+ INSTALL="install -p" \
+ EXTRA_CFLAGS="$MoreCFlags" \
+ install
+
+ popd
+
+%if %{with gdb_hooks}
+ # See comment on $DirHoldingGdbPy above
+ PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
+ cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
+%endif # with gdb_hooks
+
+ # Rename the -devel script that differs on different arches to arch specific name
+ mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
+ echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
+
+ # Make python3-devel multilib-ready
+ mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
+ %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
+ cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+#include "%{_pyconfig32_h}"
+#elif __WORDSIZE == 64
+#include "%{_pyconfig64_h}"
+#else
+#error "Unknown word size"
+#endif
+EOF
+
+ echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Install the "debug" build first; any common files will be overridden with
+# later builds
+%if %{with debug_build}
+InstallPython debug \
+ %{py_INSTSONAME_debug} \
+ -O0 \
+ %{LDVERSION_debug}
+%endif # with debug_build
+
+# Now the optimized build:
+InstallPython optimized \
+ %{py_INSTSONAME_optimized} \
+ "" \
+ %{LDVERSION_optimized}
+
+# Install directories for additional packages
+install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
+%if "%{_lib}" == "lib64"
+# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
+# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
+# modules).
+# Note that rpmlint will complain about hardcoded library path;
+# this is intentional.
+install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
+%endif
+
+%if %{without flatpackage}
+# add idle3 to menu
+install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
+desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
+
+# Install and validate appdata file
+mkdir -p %{buildroot}%{_metainfodir}
+cp -a %{SOURCE11} %{buildroot}%{_metainfodir}
+appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/idle3.appdata.xml
+%endif
+
+# Make sure distutils looks at the right pyconfig.h file
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
+# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
+# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
+# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
+#
+# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
+# variants:
+sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
+ %{buildroot}%{pylibdir}/distutils/sysconfig.py \
+ %{buildroot}%{pylibdir}/sysconfig.py
+
+# Install pathfix.py to bindir
+# See
https://github.com/fedora-python/python-rpm-porting/issues/24
+cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+
+# Install i18n tools to bindir
+# They are also in python2, so we version them
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1571474
+for tool in pygettext msgfmt; do
+ cp -p Tools/i18n/${tool}.py %{buildroot}%{_bindir}/${tool}%{pybasever}.py
+ ln -s ${tool}%{pybasever}.py %{buildroot}%{_bindir}/${tool}3.py
+done
+
+# Switch all shebangs to refer to the specific Python version.
+# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
+# so handle files named using other naming scheme separately.
+LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
+ Tools/scripts/pathfix.py \
+ -i "%{_bindir}/python%{pybasever}" -pn \
+ %{buildroot} \
+ %{buildroot}%{_bindir}/*%{pybasever}.py \
+ %{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
+
+# Remove tests for python3-tools which was removed in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+rm -rf %{buildroot}%{pylibdir}/test/test_tools
+
+# Remove shebang lines from .py files that aren't executable, and
+# remove executability from .py files that don't have a shebang line:
+find %{buildroot} -name \*.py \
+ \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
+ -print -exec sed -i '1d' {} \; \) -o \( \
+ -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
+ -exec chmod a-x {} \; \) \)
+
+# Get rid of DOS batch files:
+find %{buildroot} -name \*.bat -exec rm {} \;
+
+# Get rid of backup files:
+find %{buildroot}/ -name "*~" -exec rm -f {} \;
+find . -name "*~" -exec rm -f {} \;
+
+# Do bytecompilation with the newly installed interpreter.
+# This is similar to the script in macros.pybytecompile
+# compile *.pyc
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
+
+# Since we have pathfix.py in bindir, this is created, but we don't want it
+rm -rf %{buildroot}%{_bindir}/__pycache__
+
+# Fixup permissions for shared libraries from non-standard 555 to standard 755:
+find %{buildroot} -perm 555 -exec chmod 755 {} \;
+
+# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
+# avoid the user having to know the precise version and ABI flags.
+# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
+%if %{with debug_build} && %{without flatpackage}
+ln -s \
+ %{_bindir}/python%{LDVERSION_debug} \
+ %{buildroot}%{_bindir}/python3-debug
+%endif
+
+# There's 2to3-X.X executable and 2to3 soft link to it.
+# No reason to have both, so keep only 2to3 as an executable.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
+
+%if %{with flatpackage}
+# Remove stuff that would conflict with python3 package
+rm %{buildroot}%{_bindir}/python3
+rm %{buildroot}%{_bindir}/pydoc3
+rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/pygettext3.py
+rm %{buildroot}%{_bindir}/msgfmt3.py
+rm %{buildroot}%{_bindir}/idle3
+rm %{buildroot}%{_bindir}/python3-*
+rm %{buildroot}%{_bindir}/2to3
+rm %{buildroot}%{_libdir}/libpython3.so
+rm %{buildroot}%{_mandir}/man1/python3.1*
+rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+rm %{buildroot}%{_libdir}/pkgconfig/python3-embed.pc
+%else
+# Link the unversioned stuff
+#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
+ln -s ./python3 %{buildroot}%{_bindir}/python
+ln -s ./pydoc3 %{buildroot}%{_bindir}/pydoc
+ln -s ./pygettext3.py %{buildroot}%{_bindir}/pygettext.py
+ln -s ./msgfmt3.py %{buildroot}%{_bindir}/msgfmt.py
+ln -s ./idle3 %{buildroot}%{_bindir}/idle
+ln -s ./python3-config %{buildroot}%{_bindir}/python-config
+ln -s ./python3.1 %{buildroot}%{_mandir}/man1/python.1
+ln -s ./python3.pc %{buildroot}%{_libdir}/pkgconfig/python.pc
+%if %{with debug_build}
+ln -s ./python3-debug %{buildroot}%{_bindir}/python-debug
+%endif
+%endif
+
+
+# ======================================================
+# Checks for packaging issues
+# ======================================================
+
+%check
+
+# first of all, check timestamps of bytecode files
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
+
+# Ensure that the curses module was linked against libncursesw.so, rather than
+# libncurses.so
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
+ldd %{buildroot}/%{dynload_dir}/_curses*.so \
+ | grep curses \
+ | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
+
+# Ensure that the debug modules are linked against the debug libpython, and
+# likewise for the optimized modules and libpython:
+for Module in %{buildroot}/%{dynload_dir}/*.so ; do
+ case $Module in
+ *.%{SOABI_debug})
+ ldd $Module | grep %{py_INSTSONAME_optimized} &&
+ (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
+
+ ;;
+ *.%{SOABI_optimized})
+ ldd $Module | grep %{py_INSTSONAME_debug} &&
+ (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
+ ;;
+ esac
+done
+
+
+# ======================================================
+# Running the upstream test suite
+# ======================================================
+
+topdir=$(pwd)
+CheckPython() {
+ ConfName=$1
+ ConfDir=$(pwd)/build/$ConfName
+
+ echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+ # Note that we're running the tests using the version of the code in the
+ # builddir, not in the buildroot.
+
+ # Show some info, helpful for debugging test failures
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.pythoninfo
+
+ # Run the upstream test suite
+ # test_gdb skipped on s390x:
+ #
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
+ # test_gdb skipped everywhere:
+ #
https://bugzilla.redhat.com/show_bug.cgi?id=1734327
+ # test_distutils
+ # distutils.tests.test_bdist_rpm tests fail when bootstraping the Python
+ # package: rpmbuild requires /usr/bin/pythonX.Y to be installed
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
+ -wW --slowest -j0 \
+ %if %{with bootstrap}
+ -x test_distutils \
+ %endif
+ -x test_gdb \
+ %ifarch %{mips64}
+ -x test_ctypes \
+ %endif
+
+ echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+}
+
+%if %{with tests}
+
+# Check each of the configurations:
+%if %{with debug_build}
+CheckPython debug
+%endif # with debug_build
+CheckPython optimized
+
+%endif # with tests
+
+
+%files
+%doc README.rst
+
+%if %{without flatpackage}
+%{_bindir}/pydoc*
+%{_bindir}/python3
+%else
+%{_bindir}/pydoc%{pybasever}
+%endif
+
+%{_bindir}/python%{pybasever}
+%{_bindir}/python%{LDVERSION_optimized}
+%{_mandir}/*/*3*
+
+
+%if %{without flatpackage}
+%files -n python-unversioned-command
+%{_bindir}/python
+%{_mandir}/*/python.1*
+
+%files libs
+%doc README.rst
+%endif
+
+%dir %{pylibdir}
+%dir %{dynload_dir}
+
+%license %{pylibdir}/LICENSE.txt
+
+%{pylibdir}/lib2to3
+%if %{without flatpackage}
+%exclude %{pylibdir}/lib2to3/tests
+%endif
+
+%dir %{pylibdir}/unittest/
+%dir %{pylibdir}/unittest/__pycache__/
+%{pylibdir}/unittest/*.py
+%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/asyncio/
+%dir %{pylibdir}/asyncio/__pycache__/
+%{pylibdir}/asyncio/*.py
+%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/venv/
+%dir %{pylibdir}/venv/__pycache__/
+%{pylibdir}/venv/*.py
+%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/venv/scripts
+
+%{pylibdir}/wsgiref
+%{pylibdir}/xmlrpc
+
+%dir %{pylibdir}/ensurepip/
+%dir %{pylibdir}/ensurepip/__pycache__/
+%{pylibdir}/ensurepip/*.py
+%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+
+%if %{with rpmwheels}
+%exclude %{pylibdir}/ensurepip/_bundled
+%else
+%dir %{pylibdir}/ensurepip/_bundled
+%{pylibdir}/ensurepip/_bundled/*.whl
+%endif
+
+%dir %{pylibdir}/concurrent/
+%dir %{pylibdir}/concurrent/__pycache__/
+%{pylibdir}/concurrent/*.py
+%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/futures/
+%dir %{pylibdir}/concurrent/futures/__pycache__/
+%{pylibdir}/concurrent/futures/*.py
+%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/pydoc_data
+
+%{dynload_dir}/_blake2.%{SOABI_optimized}.so
+%{dynload_dir}/_md5.%{SOABI_optimized}.so
+%{dynload_dir}/_sha1.%{SOABI_optimized}.so
+%{dynload_dir}/_sha256.%{SOABI_optimized}.so
+%{dynload_dir}/_sha3.%{SOABI_optimized}.so
+%{dynload_dir}/_sha512.%{SOABI_optimized}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
+%{dynload_dir}/_bisect.%{SOABI_optimized}.so
+%{dynload_dir}/_bz2.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
+%{dynload_dir}/_contextvars.%{SOABI_optimized}.so
+%{dynload_dir}/_crypt.%{SOABI_optimized}.so
+%{dynload_dir}/_csv.%{SOABI_optimized}.so
+%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
+%{dynload_dir}/_curses.%{SOABI_optimized}.so
+%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
+%{dynload_dir}/_dbm.%{SOABI_optimized}.so
+%{dynload_dir}/_decimal.%{SOABI_optimized}.so
+%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
+%{dynload_dir}/_heapq.%{SOABI_optimized}.so
+%{dynload_dir}/_json.%{SOABI_optimized}.so
+%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
+%{dynload_dir}/_lzma.%{SOABI_optimized}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
+%{dynload_dir}/_opcode.%{SOABI_optimized}.so
+%{dynload_dir}/_pickle.%{SOABI_optimized}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
+%{dynload_dir}/_queue.%{SOABI_optimized}.so
+%{dynload_dir}/_random.%{SOABI_optimized}.so
+%{dynload_dir}/_socket.%{SOABI_optimized}.so
+%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
+%{dynload_dir}/_ssl.%{SOABI_optimized}.so
+%{dynload_dir}/_statistics.%{SOABI_optimized}.so
+%{dynload_dir}/_struct.%{SOABI_optimized}.so
+%{dynload_dir}/array.%{SOABI_optimized}.so
+%{dynload_dir}/audioop.%{SOABI_optimized}.so
+%{dynload_dir}/binascii.%{SOABI_optimized}.so
+%{dynload_dir}/cmath.%{SOABI_optimized}.so
+%{dynload_dir}/_datetime.%{SOABI_optimized}.so
+%{dynload_dir}/fcntl.%{SOABI_optimized}.so
+%{dynload_dir}/grp.%{SOABI_optimized}.so
+%{dynload_dir}/math.%{SOABI_optimized}.so
+%{dynload_dir}/mmap.%{SOABI_optimized}.so
+%{dynload_dir}/nis.%{SOABI_optimized}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
+%{dynload_dir}/parser.%{SOABI_optimized}.so
+%{dynload_dir}/_posixshmem.%{SOABI_optimized}.so
+%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
+%{dynload_dir}/readline.%{SOABI_optimized}.so
+%{dynload_dir}/resource.%{SOABI_optimized}.so
+%{dynload_dir}/select.%{SOABI_optimized}.so
+%{dynload_dir}/spwd.%{SOABI_optimized}.so
+%{dynload_dir}/syslog.%{SOABI_optimized}.so
+%{dynload_dir}/termios.%{SOABI_optimized}.so
+%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
+%{dynload_dir}/_uuid.%{SOABI_optimized}.so
+%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
+%{dynload_dir}/zlib.%{SOABI_optimized}.so
+
+%dir %{pylibdir}/site-packages/
+%dir %{pylibdir}/site-packages/__pycache__/
+%{pylibdir}/site-packages/README.txt
+%{pylibdir}/*.py
+%dir %{pylibdir}/__pycache__/
+%{pylibdir}/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/collections/
+%dir %{pylibdir}/collections/__pycache__/
+%{pylibdir}/collections/*.py
+%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/ctypes/
+%dir %{pylibdir}/ctypes/__pycache__/
+%{pylibdir}/ctypes/*.py
+%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/ctypes/macholib
+
+%{pylibdir}/curses
+
+%dir %{pylibdir}/dbm/
+%dir %{pylibdir}/dbm/__pycache__/
+%{pylibdir}/dbm/*.py
+%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/distutils/
+%dir %{pylibdir}/distutils/__pycache__/
+%{pylibdir}/distutils/*.py
+%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/distutils/README
+%{pylibdir}/distutils/command
+
+%dir %{pylibdir}/email/
+%dir %{pylibdir}/email/__pycache__/
+%{pylibdir}/email/*.py
+%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/email/mime
+%doc %{pylibdir}/email/architecture.rst
+
+%{pylibdir}/encodings
+
+%{pylibdir}/html
+%{pylibdir}/http
+
+%dir %{pylibdir}/importlib/
+%dir %{pylibdir}/importlib/__pycache__/
+%{pylibdir}/importlib/*.py
+%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/json/
+%dir %{pylibdir}/json/__pycache__/
+%{pylibdir}/json/*.py
+%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/logging
+%{pylibdir}/multiprocessing
+
+%dir %{pylibdir}/sqlite3/
+%dir %{pylibdir}/sqlite3/__pycache__/
+%{pylibdir}/sqlite3/*.py
+%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
+%exclude %{pylibdir}/turtle.py
+%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%endif
+
+%{pylibdir}/urllib
+%{pylibdir}/xml
+
+%if "%{_lib}" == "lib64"
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
+%endif
+
+# "Makefile" and the config-32/64.h file are needed by
+# distutils/sysconfig.py:_init_posix(), so we include them in the core
+# package, along with their parent directories (bug 531901):
+%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%dir %{_includedir}/python%{LDVERSION_optimized}/
+%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+
+%{_libdir}/%{py_INSTSONAME_optimized}
+%if %{without flatpackage}
+%{_libdir}/libpython3.so
+%endif
+
+
+%if %{without flatpackage}
+%files devel
+%{_bindir}/2to3
+%endif
+
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
+%if %{without flatpackage}
+%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+%endif
+%{_includedir}/python%{LDVERSION_optimized}/*.h
+%{_includedir}/python%{LDVERSION_optimized}/internal/
+%{_includedir}/python%{LDVERSION_optimized}/cpython/
+%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
+
+%if %{without flatpackage}
+%{_bindir}/python3-config
+%{_bindir}/python-config
+%{_libdir}/pkgconfig/python3.pc
+%{_libdir}/pkgconfig/python.pc
+%{_libdir}/pkgconfig/python3-embed.pc
+%{_bindir}/pathfix.py
+%{_bindir}/pygettext3.py
+%{_bindir}/pygettext.py
+%{_bindir}/msgfmt3.py
+%{_bindir}/msgfmt.py
+%endif
+
+%{_bindir}/pygettext%{pybasever}.py
+%{_bindir}/msgfmt%{pybasever}.py
+
+%{_bindir}/python%{pybasever}-config
+%{_bindir}/python%{LDVERSION_optimized}-config
+%{_bindir}/python%{LDVERSION_optimized}-*-config
+%{_libdir}/libpython%{LDVERSION_optimized}.so
+%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
+%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}-embed.pc
+%{_libdir}/pkgconfig/python-%{pybasever}.pc
+%{_libdir}/pkgconfig/python-%{pybasever}-embed.pc
+
+
+%if %{without flatpackage}
+%files idle
+
+%{_bindir}/idle*
+%else
+%{_bindir}/idle%{pybasever}
+%endif
+
+%{pylibdir}/idlelib
+
+%if %{without flatpackage}
+%{_metainfodir}/idle3.appdata.xml
+%{_datadir}/applications/idle3.desktop
+%{_datadir}/icons/hicolor/*/apps/idle3.*
+%endif
+
+%if %{without flatpackage}
+%files tkinter
+%endif
+
+%{pylibdir}/tkinter
+%if %{without flatpackage}
+%exclude %{pylibdir}/tkinter/test
+%endif
+%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
+%{pylibdir}/turtle.py
+%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%dir %{pylibdir}/turtledemo
+%{pylibdir}/turtledemo/*.py
+%{pylibdir}/turtledemo/*.cfg
+%dir %{pylibdir}/turtledemo/__pycache__/
+%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
+
+
+%if %{without flatpackage}
+%files test
+%endif
+
+%{pylibdir}/ctypes/test
+%{pylibdir}/distutils/tests
+%{pylibdir}/sqlite3/test
+%{pylibdir}/test
+%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
+%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
+%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
+%{dynload_dir}/_testinternalcapi.%{SOABI_optimized}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
+%{pylibdir}/lib2to3/tests
+%{pylibdir}/tkinter/test
+%{pylibdir}/unittest/test
+
+# We don't bother splitting the debug build out into further subpackages:
+# if you need it, you're probably a developer.
+
+# Hence the manifest is the combination of analogous files in the manifests of
+# all of the other subpackages
+
+%if %{with debug_build}
+%if %{without flatpackage}
+%files debug
+%{_bindir}/python3-debug
+%{_bindir}/python-debug
+%endif
+
+# Analog of the core subpackage's files:
+%{_bindir}/python%{LDVERSION_debug}
+
+# Analog of the -libs subpackage's files:
+# ...with debug builds of the built-in "extension" modules:
+
+%{dynload_dir}/_blake2.%{SOABI_debug}.so
+%{dynload_dir}/_md5.%{SOABI_debug}.so
+%{dynload_dir}/_sha1.%{SOABI_debug}.so
+%{dynload_dir}/_sha256.%{SOABI_debug}.so
+%{dynload_dir}/_sha3.%{SOABI_debug}.so
+%{dynload_dir}/_sha512.%{SOABI_debug}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_debug}.so
+%{dynload_dir}/_bisect.%{SOABI_debug}.so
+%{dynload_dir}/_bz2.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
+%{dynload_dir}/_contextvars.%{SOABI_debug}.so
+%{dynload_dir}/_crypt.%{SOABI_debug}.so
+%{dynload_dir}/_csv.%{SOABI_debug}.so
+%{dynload_dir}/_ctypes.%{SOABI_debug}.so
+%{dynload_dir}/_curses.%{SOABI_debug}.so
+%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
+%{dynload_dir}/_dbm.%{SOABI_debug}.so
+%{dynload_dir}/_decimal.%{SOABI_debug}.so
+%{dynload_dir}/_elementtree.%{SOABI_debug}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_debug}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_debug}.so
+%{dynload_dir}/_heapq.%{SOABI_debug}.so
+%{dynload_dir}/_json.%{SOABI_debug}.so
+%{dynload_dir}/_lsprof.%{SOABI_debug}.so
+%{dynload_dir}/_lzma.%{SOABI_debug}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
+%{dynload_dir}/_opcode.%{SOABI_debug}.so
+%{dynload_dir}/_pickle.%{SOABI_debug}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
+%{dynload_dir}/_queue.%{SOABI_debug}.so
+%{dynload_dir}/_random.%{SOABI_debug}.so
+%{dynload_dir}/_socket.%{SOABI_debug}.so
+%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
+%{dynload_dir}/_ssl.%{SOABI_debug}.so
+%{dynload_dir}/_statistics.%{SOABI_debug}.so
+%{dynload_dir}/_struct.%{SOABI_debug}.so
+%{dynload_dir}/array.%{SOABI_debug}.so
+%{dynload_dir}/audioop.%{SOABI_debug}.so
+%{dynload_dir}/binascii.%{SOABI_debug}.so
+%{dynload_dir}/cmath.%{SOABI_debug}.so
+%{dynload_dir}/_datetime.%{SOABI_debug}.so
+%{dynload_dir}/fcntl.%{SOABI_debug}.so
+%{dynload_dir}/grp.%{SOABI_debug}.so
+%{dynload_dir}/math.%{SOABI_debug}.so
+%{dynload_dir}/mmap.%{SOABI_debug}.so
+%{dynload_dir}/nis.%{SOABI_debug}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
+%{dynload_dir}/parser.%{SOABI_debug}.so
+%{dynload_dir}/_posixshmem.%{SOABI_debug}.so
+%{dynload_dir}/pyexpat.%{SOABI_debug}.so
+%{dynload_dir}/readline.%{SOABI_debug}.so
+%{dynload_dir}/resource.%{SOABI_debug}.so
+%{dynload_dir}/select.%{SOABI_debug}.so
+%{dynload_dir}/spwd.%{SOABI_debug}.so
+%{dynload_dir}/syslog.%{SOABI_debug}.so
+%{dynload_dir}/termios.%{SOABI_debug}.so
+%{dynload_dir}/unicodedata.%{SOABI_debug}.so
+%{dynload_dir}/_uuid.%{SOABI_debug}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
+%{dynload_dir}/zlib.%{SOABI_debug}.so
+
+# No need to split things out the "Makefile" and the config-32/64.h file as we
+# do for the regular build above (bug 531901), since they're all in one package
+# now; they're listed below, under "-devel":
+
+%{_libdir}/%{py_INSTSONAME_debug}
+
+# Analog of the -devel subpackage's files:
+%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
+%{_includedir}/python%{LDVERSION_debug}
+%{_bindir}/python%{LDVERSION_debug}-config
+%{_bindir}/python%{LDVERSION_debug}-*-config
+%{_libdir}/libpython%{LDVERSION_debug}.so
+%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
+%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
+%{_libdir}/pkgconfig/python-%{LDVERSION_debug}-embed.pc
+
+# Analog of the -tools subpackage's files:
+# None for now; we could build precanned versions that have the appropriate
+# shebang if needed
+
+# Analog of the tkinter subpackage's files:
+%{dynload_dir}/_tkinter.%{SOABI_debug}.so
+
+# Analog of the -test subpackage's files:
+%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
+%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
+%{dynload_dir}/_testcapi.%{SOABI_debug}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
+%{dynload_dir}/_testinternalcapi.%{SOABI_debug}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
+
+%endif # with debug_build
+
+# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
+#
+# The /usr/lib/rpm/redhat/macros defines %%__debug_package to use
+# debugfiles.list, and it appears that everything below /usr/lib/debug and
+# (/usr/src/debug) gets added to this file (via LISTFILES) in
+# /usr/lib/rpm/find-debuginfo.sh
+#
+# Hence by installing it below /usr/lib/debug we ensure it is added to the
+# -debuginfo subpackage
+# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
+# payload file would be unpackaged)
+
+# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
+%undefine _debuginfo_subpackages
+
+# ======================================================
+# Finally, the changelog:
+# ======================================================
+
+%changelog
+* Wed Nov 20 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.9.0~a1-1
+- Rebased to Python 3.9.0a1
+
+* Mon Oct 14 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0-1
+- Update to Python 3.8.0 final
+
+* Tue Oct 01 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~rc1-1
+- Rebased to Python 3.8.0rc1
+
+* Sat Aug 31 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b4-1
+- Rebased to Python 3.8.0b4
+- Enable Profile-guided optimization for all arches, not just x86 (#1741015)
+
+* Mon Jul 29 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b3-1
+- Update to 3.8.0b3
+
+* Fri Jul 26 2019 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.8.0~b2-2
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Fri Jul 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b2-1
+- Update to 3.8.0b2
+
+* Wed Jun 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b1-1
+- Update to 3.8.0b1
+
+* Fri May 17 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-2
+- Remove a faulty patch that resulted in invalid value of
+ distutils.sysconfig.get_config_var('LIBPL') (#1710767)
+
+* Tue May 07 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-1
+- Update to 3.8.0a4
+
+* Tue Mar 26 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a3-1
+- Update to 3.8.0a3
+
+* Mon Feb 25 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a2-1
+- Update to 3.8.0a2
+
+* Mon Feb 18 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-3
+- Reduced default build flags used to build extension modules
+
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
+
+* Sun Feb 17 2019 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.8.0~a1-2
+- Rebuild for readline 8.0
+
+* Tue Feb 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-1
+- Update to 3.8.0a1
diff --git a/sources b/sources
index dcd0d93..49e0291 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-SHA512 (Python-3.8.0.tar.xz) =
5f9bfcb3acdf592770a9d5abd2c32c68c55a49b92f958ded069e3ef31cf2d415e67112b4f6738fab237dc29e5c622298719946d2e9471e7e78e3a6bdf2fac1d1
-SHA512 (Python-3.8.0.tar.xz.asc) =
4741bcb9b79019f190fded565dd9851158911f1b0ba71f5972906c267ca6576ebfae7c1e649f8bd9fee6ce2cabb325ef1d85a28ab5962fc9275072d35229d06d
+SHA512 (Python-3.9.0a1.tar.xz) =
5880ba1707718dbd21926956faebef3e454b7dae15c880f96140deaff571765a760baa17ca109949b7f70f12c999660ab0071f231f58727e232739d026895e91
+SHA512 (Python-3.9.0a1.tar.xz.asc) =
5c4f31abca1c20be4b7592c97c1fe99ccc3ce494d8905a4aa6d2c96d59207ce7dd6630364a2fe03c9f37c755279c5e3078cba587ccebe165924d2456015d686c
diff --git a/tests/tests.yml b/tests/tests.yml
index 6d53a9c..eb39252 100644
--- a/tests/tests.yml
+++ b/tests/tests.yml
@@ -10,13 +10,13 @@
tests:
- smoke:
dir: python/smoke
- run: VERSION=3.8 ./venv.sh
+ run: VERSION=3.9 ./venv.sh
- selftest:
dir: python/selftest
- run: VERSION=3.8 X="-x test_wsgiref" ./parallel.sh
+ run: VERSION=3.9 X="-x test_wsgiref" ./parallel.sh
required_packages:
- gcc # for extension building in venv and selftest
- gdb # for test_gdb
- - python38 # the test subject
+ - python39 # the test subject
- python3-tox # for venv tests
- glibc-all-langpacks # for locale tests
commit 6b5182a34c77c73878e55b9c9f7a60b48f0b1f71
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Nov 25 13:20:27 2019 +0100
Add "downstream only" explanations to various patches
Suggested by Neal Gompa in
https://bugzilla.redhat.com/show_bug.cgi?id=1774417
diff --git a/python38.spec b/python38.spec
index e30ddca..53bb8e7 100644
--- a/python38.spec
+++ b/python38.spec
@@ -246,6 +246,8 @@ Patch111: 00111-no-static-lib.patch
# 00189 #
# Instead of bundled wheels, use our RPM packaged wheels from
# /usr/share/python-wheels
+# Downstream only: upstream bundles
+# We might eventually pursuit upstream support, but it's low prio
Patch189: 00189-use-rpm-wheels.patch
# 00251
@@ -253,6 +255,7 @@ Patch189: 00189-use-rpm-wheels.patch
# 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
+# Downstream only: Awaiting resources to work on upstream PEP
Patch251: 00251-change-user-install-location.patch
# 00274 #
@@ -262,6 +265,8 @@ Patch274: 00274-fix-arch-names.patch
# 00328 #
# Restore pyc to TIMESTAMP invalidation mode as default in rpmbubild
# See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
+# Downstream only: only used when building RPM packages
+# Ideally, we should talk to upstream and explain why we don't want this
Patch328: 00328-pyc-timestamp-invalidation-mode.patch
# (New patches go here ^^^)
commit 853a0fc587469015694d08002eec7af4e562ff84
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Nov 1 07:09:41 2019 +0000
Verify upstream sources with GPG
This is now a recommended thing to do:
https://docs.fedoraproject.org/en-US/packaging-guidelines/#_source_file_v...
Regardless if it adds actual security, it should prevent problems like this one:
https://mail.python.org/archives/list/python-dev@python.org/message/OYNQS...
diff --git a/pubkeys.txt b/pubkeys.txt
new file mode 100644
index 0000000..c409e96
--- /dev/null
+++ b/pubkeys.txt
@@ -0,0 +1,11542 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+otGu1dAOMqiu+LpDVVSQLDhw3vBFdxdIfXA2H/81d+d07nMAsxPWbTIErROlvvmP
+XEvLl7gIntjrQg/sFh+JpqXFNBOiVXJ55I1nRzd4+myHfWyNRSrYSdNEVok/Jyj3
+sUZ97e3hCDdFXFU6L2/Vp90goz/ibpqsr3YD4/dZfV/BvtwmXyimPjdEBqfPBYfs
+6c9tnrqlTzt/ZbGJASIEEAECAAwFAkK3K0AFAwASdQAACgkQlxC4m8pXrXy9QAf/
+eseh2YRutIvE3w0Zt7SKUpDsq12uYAYmCi1sjY+pxUpTr9ntFibu7Sk3qltzgbwH
+RGfM7qOlexN8FAgBw0jAHkrF9aB37pAhFkVoRMzUplmo8BLwj6Xieq+d8cRkh0kQ
+bsaxuzILQz9C+K6JdfAfZxlcFNJacW/IAIzJ68fYybqZqOxTA7f7TG5clAaep9Ud
+KGjlTb4p1ZKrJcQLsHtjQ1ZPAr1j6Xv52Pl8GLgZqFjmw2s23A67aeE0xoOooR1T
+F03HLpLlFqkJYZQR1piI4EXNMXodyAj2Y4dq/t63I3es572VrOouDCykfWGwvQTG
+0/qjLwUaNegrAtlqNBcKlIkBIgQQAQIADAUCQsj6fwUDABJ1AAAKCRCXELibylet
+fJgFCACg+2tVWc65zW5hQjmNY0Y5qxTcGokZ+yvr4K2+TnAdkIh4iOM/z5+8F19e
+YNrI7gfXIOloamThAhIfLLp7oXp6qiIZlhkw4oCCkMlAsbsohu73iHyUYNVfXoLT
+2AkSartajyTMGNga3IoaP5s4PCXxClE6vjvpkNSTWxRPYvRgtfS9PTsK1BbeVLQW
+Fsy6HUNOBW88LB3tyzej02eVefCo5xbUmDf3yMyZOFS5FsWSn1OvPSVlk0XidShy
+mz7cnMwEZBtIy8Ijf/8rquaHlY4J+4izt+j2Y1OEaUco23L5HaQIEg/EzGwBMZa5
+Yy5gSHV/9E0xaryNlcBB+dh5SsGciQEiBBABAgAMBQJCzEaOBQMAEnUAAAoJEJcQ
+uJvKV618rbsIAMgMmO4TR43vPr/0vo3UxX2zLnrywhN3s0bDYc8JcT9+OY6YOFdk
+6KGqZ4XTvn6oKa4cjtVmLw0ZCCqwkGWjlgCa20PQgPWTt5CjZ5F9PJOu9q9vTeNh
+Ns6mS7dBt2kJ2ROyGB0vmrgs8rs5T/WIVJ/4tPWPNubDoSzKstyg6+IH4DzmXzlg
+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
+BUZM3z1Jb3/DZwL8l/nuBOR6eBo0VBXAK1BeUD0HSowFyJPaZKHMMhshGmZ+H+Ak
+qvss1y2VUKoGyX+a9GVBPs66T6dobqUXgwW093dO4NDZNtcZkGqViBRBOmDBGy9h
+NpoOEqYoFOcsKFQ7OGQVMXvA3hNx0CmGprVwn5ZWn3WTYYCPaX215C2N8NWJsxm+
+ZIBfXYz9n3Re/HfCx8JSS338L6osc2Wb/DkmRYjmVay4S2nm+3CqycGyV5v/9a+Q
+5QB2FyfClsT0IJpbmHCv9PT/nwOBojHRCd47ru2HMQLzsMO0exQE8JTwc5acpyBB
+xmLJDeps6Ws7O2TDYNjNRYhJdMWst9Dt19eUIE9jZ8i6ePdGrHLHre/PRucKlLsr
+Mrz8CEWbQfc0ycCAEwh9fy7vs7oG7hs0Kr77EeZ5mOYGSVS896Kkoii/TNzcBM/S
+fD4P3CUh2lAEiQIzBBABCAAdFiEEa0msutz2vRyiBmerzVT849lkvvsFAlki8Z4A
+CgkQzVT849lkvvtduQ//UxzHsrlOWV2EiO3Fx8lP8ooHhy+p5E0mye784VXM5QEK
+RVZeuIXbTl6ezzWq/UmzEaMUO6VutX+g/OPltg8qbFLXzywlklP2dmp488Rqjb4E
+i8eUBMACUq0KnM0D4JPzT/cPcg+0vrIH9gg0D7g4u7UsEaOoB6u61TayJfibJcYk
+DXG/dDagDELnTNbSpF3hfF0y7oAXADJUK95gTzHlvE/gjax5OQTGqXrun41/1zyH
+ZhulONYnoEZ3AFVWKLXk3kwEp0LZ5N5xdiNdKH9Xsz8gUid4sJwD3XRhtPQzkDBG
+YvuTFlm7VAMeyLgLV2ho9wXXAvO2JVyAmLnynpYDnfiNKQ5+/J/u0ujtd57J9sCj
+dW/LRBN2Lssj9f+CJvi3JaobuQ9s89srvisCfyit5607MVRRdbyZKgcaVgCcFyXl
+MXVwEiogwamtxWY29ToosMysepSuG3yaM22yd2fm/W6PIQqPVCFMrVISERgHIoWr
+EM/PrVobhVLM1j+LlmUYqDD9o5lZlHRQyWVnHn0OBCxEZ4WFwW8wlNsZxJ9ayamh
+tqZHT5insaWoZSx4m/bMPIAy16CJZv1V0MoDyhluBMEK8ymeZtXKba+sduLKQ9XG
+KAvcckE7cdZoNubsf1q4+muGF6NfvbfziUvWty+d7rmVtIHh83yFUkY0h0g8WkrR
+/wAAVXv/AABVdgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/
+4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkA
+BgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADT
+LUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAAC
+BAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAAC
+VAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD
++AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAE
+PAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXds
+ZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0y
+LjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEA
+AAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFla
+IAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAA
+FklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3
+LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91
+ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg
+UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVz
+YwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2
+LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ
+RUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk
+/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVh
+cwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3Vy
+dgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkA
+XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA
+1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWAB
+ZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0C
+JgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsD
+FgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0E
+OwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYF
+lgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkH
+Kwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI
++wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvML
+CwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN
+Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P
+7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMS
+wxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V
+4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZ
+RRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc
+9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg
+8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQkl
+OCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p
+0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIu
+ty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz
+8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5
+fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/
+YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVF
+mkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JM
+KkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdT
+E1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4Wgda
+VlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh
+9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp
+8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfBy
+S3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7
+BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qE
+HYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGN
+mI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqX
+dZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUeh
+tqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+ms
+XKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3
+aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C
+28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO
+ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba
++9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/n
+qegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0
+wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////4QCMRXhp
+ZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAA
+UgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAB85AAAAbwAAHzkAAABvAAOg
+AQADAAAAAQABAACgAgAEAAAAAQAAAMigAwAEAAAAAQAAAToAAAAA/9sAQwACAQEC
+AQECAgECAgICAgMFAwMDAwMGBAQDBQcGBwcHBgYGBwgLCQcICggGBgkNCQoLCwwM
+DAcJDQ4NDA4LDAwL/9sAQwECAgIDAgMFAwMFCwgGCAsLCwsLCwsLCwsLCwsLCwsL
+CwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL/8AAEQgBOgDIAwEiAAIR
+AQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMC
+BAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJ
+ChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3
+eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS
+09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAA
+AAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEH
+YXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVG
+R0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKj
+pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX2
+9/j5+v/aAAwDAQACEQMRAD8A+BVTB5p6pzkUqrhh/nFSKMivSRgIqjuKeEB7UKvH
+P5U9Rx2o2APL9BzT/LBGaEUEAcjPpUijBOMUANEXzfOM0oXPQc05Rn/PWneucZpC
+GiIA9KURjoo59PWhpUXcXYAL1J6Gqw1mFJlAk2MSNoOAT7nOMD3rOpWhTXvOxtTo
+zm/dVywUwOO/FBjAODVG3vnu5A7tFb2qNhnMitnpyApP5cVBqHiJo9wtxiMKCJWG
+VznBHHP4D8a5/wC0KPc2+o1exqBMHDfU0zYGOCMH+VcbeeP5VfdLhDu2kp8y49uc
+VtaNrTSrvupklkYcAHAHA/z/ADrSGKhP4TOWGlHc1/J4yP50wx5/Co7fVre5fbBK
+GwcMF559yKnBUkg9utdCknszFxaIjHmmeVgfWrG0NjHU0xlwOeKu4rELxDqOKY0Y
+A+tWXhIbDdeoxzmoymSc5pXHYgZPy96YY+f5VOy44pjjrigViFkGMHtUbR9MirDL
+k96Y6ZHNTYdiu0ffoaKmKZ64/wAKKmwFhenNPH/16jB9OTUg+vNVcLD1OOvenLx1
+pgFPXrzSuFh6fninoeOaizjGKqazrkGk2jPdTRwHB27h1PoKUpKKuxqN9EWrvVI9
+JxLeyRhFOSG4J+lc9eeKmv7p47WK4eNmA84NhB7gjr2/Oudk0XUfHkjXMEcvkxtg
+ssgcKDnuPpn8a1tJ0rUmiiWLMLNvUDaVUgDJAHP/ANfIrxsTjHLSDsenh8Ko6yVz
+Z0vV4LRVS4h+05/56Fm479PTBGOelauozPqaeRHbzRwYyvkRgqeOm4dRz16itDwl
+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
+nT9AJE9WEH8R7bJ+YgQ8rcsAKHRZGS5QtBKjABEBAAG0L1RvdGFsbHkgTGVnaXQg
+U2lnbmluZyBLZXkgPG1hbGxvcnlAZXhhbXBsZS5vcmc+iNAEEwEIADoWIQSetJ3B
+ZvZADvXaU/V5tFfk5t8CXAUCUOqItQIbAQYLCQgHAwIHFQoJCAsDAgQWAgMBAh4B
+AheAAAoJEHm0V+Tm3wJcWjkEAI/0giyWy85DrMnJM7Q4hDyCjLEv+pN4VKAAcYBU
+ABDaJ4jvMAXkjjPR4kp4wd+mdE6OaVXGI4Vm6CWv/nfLX79OLvem7IzA5/3zRQKW
+Bu5/deuQbMCTNqRxxcUb6mN0JAr29/n++TNnEnCEMOpI9c4eVGysr3BU9AYbMgxf
+5wpNmI0EVV7zcgEEAJ084/KZCnF3LNjAnag4CrJe2N/4HY10K2+wrzJPkpP6nJ/C
+/cSF4214tWLeP3JUuhK8cfQDYd4gHUXjxSh8X6W0alNUPytKGyyutfu/AXsC3OOr
+yCB/++BJCEO/Bt1WuFHy+YIMRazCvo4hDyoXf4giPf5GshXoYqULsK/59fC/ABEB
+AAG0L1RvdGFsbHkgTGVnaXQgU2lnbmluZyBLZXkgPG1hbGxvcnlAZXhhbXBsZS5v
+cmc+iNAEEwEIADoWIQSAG9Wuk9OS4i3cbHr+o9xt6lu9cQUCVV7zcgIbAQYLCQgH
+AwIHFQoJCAsDAgQWAgMBAh4BAheAAAoJEP6j3G3qW71x37cD/AxkV2KkKC7Ag0TP
+28itBr+HYyIKPFyt34AkK/NscyUNK+uhsxNre6noV/rl61gKBgqcp4uOaPiOEF21
+Zh79x/k5MxR/XRN4S7Q8k4CxPQ1eafPvgB/+KL4qPO8I3cCFvq/6p3AFcxoGk6G5
+SQv0GYPRmWUShE0y+N6P11BdfGFpmI4EU554zgEEAObabQh5zAM31ZNAi7pek41m
+lrnAJiJVGfnEA4ItQmOevBIs55CFifhgGMobM3I9M3ty7TVw10AUdw5pxGGXkkic
+Wj3ziaOD1igaDBDvhTxzGTb+zTXmEKddcfwGl7ZVcmB72avmq2UgvPMQyAHQkw+j
+Bq0jwLhZhuXpt5B/gOAPACCxO4MBiQE3BCABAgChBQJXsqAKmh0CVGhpcyBrZXkg
+d2FzIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZSBFdmlsMzIgcHJvamVjdC4KSXQg
+aXMgbm90IG93bmVkIGJ5IHRoZSB1c2VyIGRlc2NyaWJlZCBpbiB0aGUgVUlELgpT
+ZWUgaHR0cHM6Ly9ldmlsMzIuY29tL3Jldm9rZWQgZm9yIG1vcmUgZGV0YWlscy4A
+CgkQGScg9+pbvXH+EAP+JoMEpYItU+4M1+CCluv79GO2Vv+v26VGMfCw+kjhpHOd
+ssa2yxDdYR5Ihadl1tKZgeHBO4cRPfbYxJm6c9fVxvYP2lO6UDMf/NEa2Lxxte77
+fL93MPnQxQBYy8Sjh8gpO3rAVvagez1iptOT3k+o4i80hTCATItZ6v1gs5N+QjG0
+IUJhcnJ5IEEuIFdhcnNhdyA8YmFycnlAd2Fyc2F3LnVzPoicBBABAgAGBQJT4HiR
+AAoJEEpFBn+LvXfwXwQEAI53rYeJhS7bedw6vWEU1gL+EdtDuFxNdO24qPTQ7Q37
+iD69hILPoRUAvldrmD6rOhgctbxK7qFPxWuhhht2yXAb2kH0lJ8cA0yWSfm7rlGN
+3+sZZBUUEAufHKBly/5sYGd0hSHlRLaDZ5PE8XApCMq58liwvFrYqrIxXs3Z9PQW
+iJwEEAECAAYFAlPgeJEACgkQTi/IT0VD1XdfBAP8DcnKbEq9KJAbjMC+bpHSGn1K
+A/dKehkIFxrKjZtX5p2OHMoftL/5unbgZjjbNNELx5K5kbJ+nUZDi7NjeTLr0KlP
+GNAAlJTI5ByNM/bVO85rMCXr3vdHkALjdZDmvKgZv9RyZXDAimRek4+0MQ1Ni90h
+hdRxuWw5oGv3HpRuWnmInAQQAQIABgUCU+B4kQAKCRCC04i4Z5GxT18EA/0URUqv
+kwtkLNhjetBD/COYPssntHAtdJLkoeWY8bvz6uT6nHh9Fm5Q5QTaoqpsOg7qrIZT
+exUImsShJxAO3D1jUQM+uqv71PR2KvaFf939HLlG8cPWnNFYAp42FRLEDU0QO04m
+D4DJsOTH5SEETYP9rU1pnp0ovWhnQzXyQ23vv4icBBABAgAGBQJT4HiRAAoJEJb9
+czBHQhGNXwQEAKPDJx4sJOfBfIB1yUsUiqDh4wd0cBnA7BTVFEz4YKov60TCPMXF
+QRzS/tCDosNB6KR18zq6EvVldNmPoLnpdEK4t8/LDNWn1rqUDX6IvV4aHtKhT+1d
+RYxwt2csFNfy9YHr0K/1Zl/Gi6ZiCi9vcWguDIm/3O5ltxlGymvzMkTbiJwEEAEC
+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
+MiBwcm9qZWN0LgpJdCBpcyBub3Qgb3duZWQgYnkgdGhlIHVzZXIgZGVzY3JpYmVk
+IGluIHRoZSBVSUQuClNlZSBodHRwczovL2V2aWwzMi5jb20vcmV2b2tlZCBmb3Ig
+bW9yZSBkZXRhaWxzLgAKCRD+WfgTp0sGvzhgD/0fzz3JzuUeggnXfz8Tw4ZKC9Vl
+t5dn7KvsXfXa8jfRjdvn9lYeOUxi9OpinNojm/Jm/aVfPo9ZtjOXlquRP74zQCW5
+YIc/HtNpamSqJJKhxQvHQAHJ2+YNC9IM3cafDwNFZEJC0KDhb2eVwazptH2nckfC
+1foCccyXfBlKS3ZCd9z+8mkO56mIdeFQKG1scO84RxdNDQVdei5BSfmbJlTwbdko
+p3yeg0Oc4bpmpNFwNtVsVv59JtvGtmbpuWOU3Tw6mTubEoorFL8tkQuMj7AWqiTc
+5qXN37xS63+VddwKlTEC+Q1SlK1GqVMTPosXeELJv5AQDmfbYJ8bVoEqK0+kjAN9
+tyJzzz4aFrUztoE1qNEmwrZYT8pPmhndVE4hZ4xIX8/uLVdClYYLLozHnzOCCVrH
+xIIeT02KRy4glo0daeeBrw6pwn4Qzjsnvy05+rfxe7Fql0fi9mCUQnKS5yZF0bCd
+qqXc730e9sEkeTyRn9zyjdT6EXW2nM8grkkinTTL5izcYZviM0aFkvSD7surVsvh
+h/8RscpWQHokp0Y0lb9gGDe701FacV6mO0bFkJBmZdMI1a9J6lwzDWsjDlCywVxP
+9TkRZasTFehgephqpRgnTzxjy5uux9GE5Tujpj/jUzbtcOmjlfBBb1Zm8vaf5xJC
+8ljywm61mOca0vbCcLQeQmFycnkgV2Fyc2F3IDxiYXJyeUB3YXJzYXcudXM+iJwE
+EAECAAYFAlPgmd8ACgkQGScg9+pbvXHpKAP+J+FPJiRe3Qf4UdVSs5fIs2BVrb89
+dP7EJn2RDrwCLUEqGNi9S1ccNGfFKt5omfXEyEruVYyKI9/lS5RxO7urs+sTNj7f
+2AUXXwE4cN71fzkfmrb9GEDJuBQL8SccUCCRTzAqWwvm5Pn9vF3QFhEQqU/4citx
+IWBqYvtB5AsGMe6InAQQAQIABgUCU+CZ3wAKCRDxZZRZ3c1oaukoA/94acZdSKRp
+9liCgCZ6jQmrsBWtbIhPbnrIz8x+/7o8FnGMbYdoBSrOkcU6Q2JDasjcwrhQkZwq
+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
+IcR7vZzBYlcBV1oka+ZjkwQ8f/KYkfNSPo8CgNjnkTiAbcSJYIyWDZY7YVf7xr63
+MvEPdPrU9/8pgWE9k5E4L/7W49udJVKAzhLibIZfN/y20O0Ohga4Zx27BjKhLpwR
+bzh/aYre2yvsZ4adpXNkjMmaqdirFtS5C35Zg7Zj/vCxS37iXrrKiga53N4ws6+d
+0cIf7vJmsvbU6TO38VKwWga6PXNWk0sJi//E2OuBS2lEQTcXrhPxppbVNDSnXs/Q
+5LfGFNpCxGRgk8M7o2sa87jy+IFy70sBGYUdpAnwx+E/axyYrBr5i6+Nl51Z96dK
+QiPbz3igCjve0f+oLO/Zz+u36gsttkFlUYCV1OZnQ1ZSBdw+OS2fw/9rLknnUiTK
+ayq/Rrf83NyXOD5E6jZ/FQAHethEmI4EU55iSgEEAMi63SkHZmk7K/SE21sxrShk
+wCExuwH5XfztE7dklykNG2Crv7pRuZ5dMslXvXnjdm6JiEsZPtNcBQFFfSCNdVyj
+s0EGHTsjsuFmNi2rDSndzL48juzQ/m3+34Tp9sTztWJb+J1BJmEUiehfEZvBvkAJ
+bA/GfagCKk19sQXdn4J9ACDbfVzRiQE3BCABAgChBQJXsqAfmh0CVGhpcyBrZXkg
+d2FzIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZSBFdmlsMzIgcHJvamVjdC4KSXQg
+aXMgbm90IG93bmVkIGJ5IHRoZSB1c2VyIGRlc2NyaWJlZCBpbiB0aGUgVUlELgpT
+ZWUgaHR0cHM6Ly9ldmlsMzIuY29tL3Jldm9rZWQgZm9yIG1vcmUgZGV0YWlscy4A
+CgkQM43t5aQTWzgpqAQAvNsSYdFkVCr7mC3nO9Bw3aswf+9GuyJXo8L7tSQXD/jY
+KR4IoqnEHJ+B/FIhylJaswEVrxk1MJxLr4eEaplj5HCNIF+2fACrLuXW8aCgUc5W
+dHUwo7o3RxEFABS5XDUcPhTuYDxTZ1HUfAju9DgLmqk+cA8doUqXkrdQ/InYyg+0
+J0JlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPoi4BBMBAgAi
+BQJT4CBqAhsvBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAzje3lpBNbOODy
+A/9z0Vw+/hMMMMhdnXyvSDNHMm3deWYg7ilgN1b4eeTJvRxlsHAj4XeRXXdnMMVZ
+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
+M1jzZSymwGCbmpjDHA0xp8lRWQA/zFMAIOLUd0mJATcEIAECAKEFAleyoAeaHQJU
+aGlzIGtleSB3YXMgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIEV2aWwzMiBwcm9q
+ZWN0LgpJdCBpcyBub3Qgb3duZWQgYnkgdGhlIHVzZXIgZGVzY3JpYmVkIGluIHRo
+ZSBVSUQuClNlZSBodHRwczovL2V2aWwzMi5jb20vcmV2b2tlZCBmb3IgbW9yZSBk
+ZXRhaWxzLgAKCRATwhXAakXIFqMRBAC11c2HJ2a51oVil371fACt/WO1MD/Vwk6W
+gA9wqBsNkDVYMBNFLjfF+YcVQpc8xuh/dHZwBbMd12w7NczxUbvOcy0eqXEHTKG7
+a4YU3eOBcPOG5vHPm4vTMKiFuinZausPmVC31yCo7mUOtlhDAd1PXA9QtbFE7QDr
+bJ3R6yfMALQpQW50aG9ueSBCYXh0ZXIgPGFudGhvbnlAaW50ZXJsaW5rLmNvbS5h
+dT6InAQQAQIABgUCU+B3uAAKCRA74bi7MLlLXInUBAC/X1z2onYWEMt/fSNSJYyK
+0dSW6vqd5aZPH/eR6INXlMJIiGXcIxnygHwzH3BEEYfhI2oiMztLlTVW7QFymMK3
+BEP05uj5wBuEZl9RCVku/sYHZRFMSuxcGEM5Cn6OAEvLtVz8zaw14wrQvtsf6OZn
+eZsepqxJul0Jfji7cDbXLYicBBABAgAGBQJT4He4AAoJEFdlTp4lHGXvidQD/3jK
+natl6Yo1GXwxrHNV+gNPXTvS7h1TAhCdn9NMnUpz/Q/izukFtaUjx4ZYMJDA071J
+1iVlnATJcolWKWXawI9CAvypRuSaetD4gmYaukFjEhqduRw6fsOI/TYlhBVY8G5z
+kwO79O5TLQQhgKRyibXvm1wrelMmudN+rNhS1XI/iJwEEAECAAYFAlPgd7gACgkQ
+n7q7OXdq/hKJ1AQAharG83xBSDL2QJ35pTugdDwBYRLBXCNl4xG+iAqRUZ8KethF
+s7TKIA6RsR9cen75aRT3dxp44F78fh5yelMMQ186BFMQi+Qt4HlkEsZFdGFtl0Qq
+O3PVhJ7wi4b+lSR4tOKHUyJLEFj8TEmHtRWGMSihVsITdXRoAblKxor48mWInAQQ
+AQIABgUCU+B3uAAKCRCxz8ox1wqv+YnUBACzLxjrrkq351SvtRIlPJYtAfewhisM
+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
+/G0Y7bwgUQIp4Al6TQ3tq5MB/u4xKpc=
+=3Kg1
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/python38.spec b/python38.spec
index d11eb4c..e30ddca 100644
--- a/python38.spec
+++ b/python38.spec
@@ -159,6 +159,7 @@ BuildRequires: gdbm-devel
BuildRequires: glibc-all-langpacks
BuildRequires: glibc-devel
BuildRequires: gmp-devel
+BuildRequires: gnupg2
BuildRequires: libappstream-glib
BuildRequires: libffi-devel
BuildRequires: libnsl2-devel
@@ -209,7 +210,9 @@ BuildRequires: python%{pyshortver}
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{general_version}/Python-%{upstream_ve...
+Source0: %{url}ftp/python/%{general_version}/Python-%{upstream_version}.tar.xz
+Source1: %{url}ftp/python/%{general_version}/Python-%{upstream_version}.tar.xz.asc
+Source2: %{url}static/files/pubkeys.txt
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
@@ -570,6 +573,7 @@ version once Python %{pybasever} is stable.
# ======================================================
%prep
+%gpgverify -k2 -s1 -d0
%setup -q -n Python-%{upstream_version}
# Remove all exe files to ensure we are not shipping prebuilt binaries
# note that those are only used to create Microsoft Windows installers
diff --git a/sources b/sources
index cd55897..dcd0d93 100644
--- a/sources
+++ b/sources
@@ -1 +1,2 @@
SHA512 (Python-3.8.0.tar.xz) =
5f9bfcb3acdf592770a9d5abd2c32c68c55a49b92f958ded069e3ef31cf2d415e67112b4f6738fab237dc29e5c622298719946d2e9471e7e78e3a6bdf2fac1d1
+SHA512 (Python-3.8.0.tar.xz.asc) =
4741bcb9b79019f190fded565dd9851158911f1b0ba71f5972906c267ca6576ebfae7c1e649f8bd9fee6ce2cabb325ef1d85a28ab5962fc9275072d35229d06d
commit e0704196d3189ba94d54c4d6a783b396a0aaa2c8
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Oct 14 22:19:24 2019 +0200
Update to Python 3.8.0 final
diff --git a/00001-rpath.patch b/00001-rpath.patch
index afa263e..d9dd3ce 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,4 +1,4 @@
-From f999fcbeb2274c750728808a0dbd7b8653e73d0a Mon Sep 17 00:00:00 2001
+From 8ecb6d320c03242ca94bf2e99d9d80510d5011e1 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00001: Fixup distutils/unixccompiler.py to remove standard
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 27b53e8..f1f0c8d 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,4 +1,4 @@
-From 81904771db8b112c8617a111e989b68e55af7a9c Mon Sep 17 00:00:00 2001
+From b9f1dd6be195cc3b11a80e6f0dde2096dd8b9855 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00102: Change the various install paths to use /usr/lib64/
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index cb7b91b..361af70 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,4 +1,4 @@
-From 5b9fcc86532051bea5d0e9fa856b014f229f4794 Mon Sep 17 00:00:00 2001
+From f6df02cde47874f10e183ead483c90941bb8076f Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
Subject: [PATCH] 00111: Don't try to build a libpythonMAJOR.MINOR.a
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index a5fdfd2..349c894 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,4 +1,4 @@
-From 6d3c9e128d693f5f211f94d2977ee990b3cfb69d Mon Sep 17 00:00:00 2001
+From e5c11f104e1d2543ac3ba4b3f0a7989821e57947 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
Subject: [PATCH] 00189: Instead of bundled wheels, use our RPM packaged wheels
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 3cb2050..1e0ddbb 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,4 +1,4 @@
-From 910f38d9768d39d4d31426743ae4081ed1ab66b6 Mon Sep 17 00:00:00 2001
+From 76330e0a8798b3b03160edc7e8d42d3dbee756fd Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
Subject: [PATCH] 00251: Change user install location
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index f129696..f383a58 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,4 +1,4 @@
-From 02443c3177bd15ddc48e7c3fc1dd2b6a3c095888 Mon Sep 17 00:00:00 2001
+From 64c67dbfa789f242e8ffd1ac88bafb4df2842401 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
Subject: [PATCH] 00274: Upstream uses Debian-style architecture naming, change
diff --git a/00328-pyc-timestamp-invalidation-mode.patch
b/00328-pyc-timestamp-invalidation-mode.patch
index 6163312..270b076 100644
--- a/00328-pyc-timestamp-invalidation-mode.patch
+++ b/00328-pyc-timestamp-invalidation-mode.patch
@@ -1,4 +1,4 @@
-From 62c2cdc7a459328e8792f9a029c74f12c4a0abf0 Mon Sep 17 00:00:00 2001
+From c706770ce2d951d9357ffc872b7e3f70ad36c264 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 11 Jul 2019 13:44:13 +0200
Subject: [PATCH] 00328: Restore pyc to TIMESTAMP invalidation mode as default
diff --git a/python38.spec b/python38.spec
index f9a8bea..d11eb4c 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel rc1
+#global prerel ...
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
Release: 1%{?dist}
@@ -1520,6 +1520,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Oct 14 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0-1
+- Update to Python 3.8.0 final
+
* Tue Oct 01 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~rc1-1
- Rebased to Python 3.8.0rc1
diff --git a/sources b/sources
index 1a61303..cd55897 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0rc1.tar.xz) =
9a4055c210e65157265aee262eefb776dece59290b04935beb08354825bfe7049f51bb8ba545d85c369df6e853003455965a6435129f4c4660b2786f26d4c66e
+SHA512 (Python-3.8.0.tar.xz) =
5f9bfcb3acdf592770a9d5abd2c32c68c55a49b92f958ded069e3ef31cf2d415e67112b4f6738fab237dc29e5c622298719946d2e9471e7e78e3a6bdf2fac1d1
commit 0c70c9d269cb95d3d6aa1e8985ced591241beb09
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Oct 14 23:06:52 2019 +0200
Pass -Og to EXTRA_CFLAGS as well as to CFLAGS_NODIST
- to CFLAGS_NODIST to take precedence as CFLAGS_NODIST go after EXTRA_CFLAGS
- to EXTRA_CFLAGS to "bake it in" and build extension modules with -Og
- call make regen-all with the same flags, as it invokes gcc as well
diff --git a/python38.spec b/python38.spec
index 0fa642f..f9a8bea 100644
--- a/python38.spec
+++ b/python38.spec
@@ -683,14 +683,15 @@ BuildPython() {
$ExtraConfigArgs \
%{nil}
+%global flags_override EXTRA_CFLAGS="$MoreCFlags"
CFLAGS_NODIST="$CFLAGS_NODIST $MoreCFlags"
+
%if %{without bootstrap}
# Regenerate generated files (needs python3)
- %make_build regen-all PYTHON_FOR_REGEN="python%{pybasever}"
+ %make_build %{flags_override} regen-all
PYTHON_FOR_REGEN="python%{pybasever}"
%endif
-
# Invoke the build
- %make_build CFLAGS_NODIST="$CFLAGS_NODIST $MoreCFlags"
+ %make_build %{flags_override}
popd
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
commit 2eefe4e7c0350ea121807b514e25edf19be3d873
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Oct 3 03:45:09 2019 +0200
Make the debug build compile with -Og
Due to Python's handling of CFLAGS and the way we
were passing extra compiler flags through the SPEC
the -Og flag for the debug build was overridden by
the -O2 flag, resulting in various side effects.
See:
https://bugs.python.org/issue37631
Resolves: rhbz#1678277
diff --git a/python38.spec b/python38.spec
index eb8f133..0fa642f 100644
--- a/python38.spec
+++ b/python38.spec
@@ -690,7 +690,7 @@ BuildPython() {
# Invoke the build
- %make_build EXTRA_CFLAGS="$CFLAGS $MoreCFlags"
+ %make_build CFLAGS_NODIST="$CFLAGS_NODIST $MoreCFlags"
popd
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
commit 8e2dbb0fbfdfc50108ffb6b219be8b328ab704ee
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Oct 1 23:05:55 2019 +0200
Rebased to Python 3.8.0rc1
Rebased patches: 102
Removed patches already merged upstream: 331
diff --git a/00001-rpath.patch b/00001-rpath.patch
index cb3969d..afa263e 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,4 +1,4 @@
-From 06e1abca862a731ab42dd4f04c232511a2ade166 Mon Sep 17 00:00:00 2001
+From f999fcbeb2274c750728808a0dbd7b8653e73d0a Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00001: Fixup distutils/unixccompiler.py to remove standard
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 388df8a..27b53e8 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,4 +1,4 @@
-From 331d11692ff564f152157bffbcaaf97e4c2676d2 Mon Sep 17 00:00:00 2001
+From 81904771db8b112c8617a111e989b68e55af7a9c Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00102: Change the various install paths to use /usr/lib64/
@@ -107,7 +107,7 @@ index a065ab0b5d..22d53fa562 100644
return sitepackages
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
-index e76e6927cb..0cfbea54b9 100644
+index b9e2fafbc0..0ae6d35b69 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -20,10 +20,10 @@ __all__ = [
@@ -154,7 +154,7 @@ index 41c4229919..543c88432a 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 6a9f4b5270..61d650882f 100644
+index 502317aa0c..4ad3df1122 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -143,7 +143,7 @@ LIBDIR= @libdir@
@@ -167,10 +167,10 @@ index 6a9f4b5270..61d650882f 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index 5f80738188..73d7913441 100644
+index b727f66953..a0c5fb6139 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
-@@ -689,7 +689,7 @@ calculate_exec_prefix(const PyConfig *config,
+@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig
*pathconfig,
if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0)
{
return PATHLEN_ERR();
}
@@ -179,17 +179,17 @@ index 5f80738188..73d7913441 100644
if (_PyStatus_EXCEPTION(status)) {
return status;
}
-@@ -1016,7 +1016,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t
*prefix)
+@@ -1067,7 +1067,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t
*prefix,
return PATHLEN_ERR();
}
}
-- status = joinpath(calculate->zip_path, L"lib/python00.zip",
zip_path_len);
-+ status = joinpath(calculate->zip_path, L"lib64/python00.zip",
zip_path_len);
+- 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;
}
-@@ -1145,7 +1145,7 @@ calculate_init(PyCalculatePath *calculate,
- if (!calculate->prefix) {
+@@ -1197,7 +1197,7 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config)
+ if (!calculate->exec_prefix) {
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
- calculate->lib_python = Py_DecodeLocale("lib/python" VERSION,
&len);
@@ -198,10 +198,10 @@ index 5f80738188..73d7913441 100644
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
diff --git a/configure b/configure
-index 3cd9b8866c..7d4cbab2c0 100755
+index 2a933cdbeb..bec365124e 100755
--- a/configure
+++ b/configure
-@@ -15197,9 +15197,9 @@ fi
+@@ -15182,9 +15182,9 @@ fi
if test x$PLATFORM_TRIPLET = x; then
@@ -214,10 +214,10 @@ index 3cd9b8866c..7d4cbab2c0 100755
diff --git a/configure.ac b/configure.ac
-index 033a93cd3f..5c8a04f61e 100644
+index a189d42c2c..154a0aa5cc 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4665,9 +4665,9 @@ fi
+@@ -4668,9 +4668,9 @@ fi
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
AC_SUBST(PY_ENABLE_SHARED)
if test x$PLATFORM_TRIPLET = x; then
@@ -230,10 +230,10 @@ index 033a93cd3f..5c8a04f61e 100644
AC_SUBST(LIBPL)
diff --git a/setup.py b/setup.py
-index be2ac0b01d..624274a75b 100644
+index 20d7f35652..024a1035c0 100644
--- a/setup.py
+++ b/setup.py
-@@ -648,7 +648,7 @@ class PyBuildExt(build_ext):
+@@ -649,7 +649,7 @@ class PyBuildExt(build_ext):
# directories (i.e. '.' and 'Include') must be first. See
issue
# 10520.
if not CROSS_COMPILING:
@@ -242,7 +242,7 @@ index be2ac0b01d..624274a75b 100644
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:
-@@ -946,11 +946,11 @@ class PyBuildExt(build_ext):
+@@ -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 +
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 5cd1757..cb7b91b 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,4 +1,4 @@
-From 9b7b6251f0fa17d6ab9eff945b3fe43cce549f13 Mon Sep 17 00:00:00 2001
+From 5b9fcc86532051bea5d0e9fa856b014f229f4794 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
Subject: [PATCH] 00111: Don't try to build a libpythonMAJOR.MINOR.a
@@ -21,10 +21,10 @@ Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
1 file changed, 2 insertions(+), 19 deletions(-)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 61d650882f..3f5be819c4 100644
+index 4ad3df1122..72d202d71b 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -561,7 +561,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+@@ -562,7 +562,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
# Build the interpreter
@@ -33,7 +33,7 @@ index 61d650882f..3f5be819c4 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -609,12 +609,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -610,12 +610,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -46,7 +46,7 @@ index 61d650882f..3f5be819c4 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM); \
-@@ -692,7 +686,7 @@ Makefile Modules/config.c: Makefile.pre \
+@@ -693,7 +687,7 @@ Makefile Modules/config.c: Makefile.pre \
@echo "The Makefile was updated, you may need to re-run make."
@@ -55,7 +55,7 @@ index 61d650882f..3f5be819c4 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
############################################################################
-@@ -1552,17 +1546,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1557,17 +1551,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index 19fa3a2..a5fdfd2 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,4 +1,4 @@
-From b377643b13abe774c95350c4b2534eb7aa001de4 Mon Sep 17 00:00:00 2001
+From 6d3c9e128d693f5f211f94d2977ee990b3cfb69d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
Subject: [PATCH] 00189: Instead of bundled wheels, use our RPM packaged wheels
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 18a4505..3cb2050 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,4 +1,4 @@
-From b610ba33332054763d46a43af205e3b9e6724bac Mon Sep 17 00:00:00 2001
+From 910f38d9768d39d4d31426743ae4081ed1ab66b6 Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
Subject: [PATCH] 00251: Change user install location
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index b038582..f129696 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,4 +1,4 @@
-From c79add9be412d3e42e3b623e04e7071dfadf75d1 Mon Sep 17 00:00:00 2001
+From 02443c3177bd15ddc48e7c3fc1dd2b6a3c095888 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
Subject: [PATCH] 00274: Upstream uses Debian-style architecture naming, change
@@ -29,7 +29,7 @@ index ba37cf99e2..52a9ec6662 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index 5c8a04f61e..807e379537 100644
+index 154a0aa5cc..273954f461 100644
--- a/configure.ac
+++ b/configure.ac
@@ -741,9 +741,9 @@ cat >> conftest.c <<EOF
diff --git a/00328-pyc-timestamp-invalidation-mode.patch
b/00328-pyc-timestamp-invalidation-mode.patch
index c0cbd82..6163312 100644
--- a/00328-pyc-timestamp-invalidation-mode.patch
+++ b/00328-pyc-timestamp-invalidation-mode.patch
@@ -1,4 +1,4 @@
-From 616cc366d97f4402cc50e0338954d1c82b843027 Mon Sep 17 00:00:00 2001
+From 62c2cdc7a459328e8792f9a029c74f12c4a0abf0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 11 Jul 2019 13:44:13 +0200
Subject: [PATCH] 00328: Restore pyc to TIMESTAMP invalidation mode as default
diff --git a/00331-fix-structuniontype_paramfunc.patch
b/00331-fix-structuniontype_paramfunc.patch
deleted file mode 100644
index d9cb132..0000000
--- a/00331-fix-structuniontype_paramfunc.patch
+++ /dev/null
@@ -1,246 +0,0 @@
-From 091ae930cd8bac805a083ea68e4f886200f57de0 Mon Sep 17 00:00:00 2001
-From: "Miss Islington (bot)"
- <31488909+miss-islington(a)users.noreply.github.com>
-Date: Fri, 30 Aug 2019 05:50:44 -0700
-Subject: [PATCH] 00331: Fix StructUnionType_paramfunc()
-
-Fix a ctypes regression of Python 3.8. When a ctypes.Structure is
-passed by copy to a function, ctypes internals created a temporary
-object which had the side effect of calling the structure finalizer
-(__del__) twice. The Python semantics requires a finalizer to be
-called exactly once. Fix ctypes internals to no longer call the
-finalizer twice.
-
-Create a new internal StructParam_Type which is only used by
-_ctypes_callproc() to call PyMem_Free(ptr) on Py_DECREF(argument).
-StructUnionType_paramfunc() creates such object.
-(cherry picked from commit 96b4087ce784ee7434dffdf69c475f5b40543982)
-
-Co-authored-by: Victor Stinner <vstinner(a)redhat.com>
----
- Lib/ctypes/test/test_structures.py | 51 +++++++++++--
- .../2019-08-30-11-21-10.bpo-37140.cFAX-a.rst | 5 ++
- Modules/_ctypes/_ctypes.c | 73 +++++++++++++++----
- 3 files changed, 109 insertions(+), 20 deletions(-)
- create mode 100644 Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
-
-diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
-index d1ea43bc7e..fda104563d 100644
---- a/Lib/ctypes/test/test_structures.py
-+++ b/Lib/ctypes/test/test_structures.py
-@@ -3,7 +3,7 @@ from ctypes import *
- from ctypes.test import need_symbol
- from struct import calcsize
- import _ctypes_test
--import test.support
-+from test import support
-
- class SubclassesTest(unittest.TestCase):
- def test_subclass(self):
-@@ -202,7 +202,7 @@ class StructureTestCase(unittest.TestCase):
- "_pack_": -1}
- self.assertRaises(ValueError, type(Structure), "X", (Structure,), d)
-
-- @test.support.cpython_only
-+ @support.cpython_only
- def test_packed_c_limits(self):
- # Issue 15989
- import _testcapi
-@@ -396,27 +396,66 @@ class StructureTestCase(unittest.TestCase):
- self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7))
-
- def test_pass_by_value(self):
-- # This should mirror the structure in Modules/_ctypes/_ctypes_test.c
-- class X(Structure):
-+ # This should mirror the Test structure
-+ # in Modules/_ctypes/_ctypes_test.c
-+ class Test(Structure):
- _fields_ = [
- ('first', c_ulong),
- ('second', c_ulong),
- ('third', c_ulong),
- ]
-
-- s = X()
-+ s = Test()
- s.first = 0xdeadbeef
- s.second = 0xcafebabe
- s.third = 0x0bad1dea
- dll = CDLL(_ctypes_test.__file__)
- func = dll._testfunc_large_struct_update_value
-- func.argtypes = (X,)
-+ func.argtypes = (Test,)
- func.restype = None
- func(s)
- self.assertEqual(s.first, 0xdeadbeef)
- self.assertEqual(s.second, 0xcafebabe)
- self.assertEqual(s.third, 0x0bad1dea)
-
-+ def test_pass_by_value_finalizer(self):
-+ # bpo-37140: Similar to test_pass_by_value(), but the Python structure
-+ # has a finalizer (__del__() method): the finalizer must only be called
-+ # once.
-+
-+ finalizer_calls = []
-+
-+ class Test(Structure):
-+ _fields_ = [
-+ ('first', c_ulong),
-+ ('second', c_ulong),
-+ ('third', c_ulong),
-+ ]
-+ def __del__(self):
-+ finalizer_calls.append("called")
-+
-+ s = Test(1, 2, 3)
-+ # Test the StructUnionType_paramfunc() code path which copies the
-+ # structure: if the stucture is larger than sizeof(void*).
-+ self.assertGreater(sizeof(s), sizeof(c_void_p))
-+
-+ dll = CDLL(_ctypes_test.__file__)
-+ func = dll._testfunc_large_struct_update_value
-+ func.argtypes = (Test,)
-+ func.restype = None
-+ func(s)
-+ # bpo-37140: Passing the structure by refrence must not call
-+ # its finalizer!
-+ self.assertEqual(finalizer_calls, [])
-+ self.assertEqual(s.first, 1)
-+ self.assertEqual(s.second, 2)
-+ self.assertEqual(s.third, 3)
-+
-+ # The finalizer must be called exactly once
-+ s = None
-+ support.gc_collect()
-+ self.assertEqual(finalizer_calls, ["called"])
-+
- def test_pass_by_value_in_register(self):
- class X(Structure):
- _fields_ = [
-diff --git a/Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
b/Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
-new file mode 100644
-index 0000000000..4eaa226147
---- /dev/null
-+++ b/Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
-@@ -0,0 +1,5 @@
-+Fix a ctypes regression of Python 3.8. When a ctypes.Structure is passed by
-+copy to a function, ctypes internals created a temporary object which had
-+the side effect of calling the structure finalizer (__del__) twice. The
-+Python semantics requires a finalizer to be called exactly once. Fix ctypes
-+internals to no longer call the finalizer twice.
-diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
-index 2201c4520a..4728874006 100644
---- a/Modules/_ctypes/_ctypes.c
-+++ b/Modules/_ctypes/_ctypes.c
-@@ -392,6 +392,35 @@ _ctypes_alloc_format_string_with_shape(int ndim, const Py_ssize_t
*shape,
- return result;
- }
-
-+/* StructParamObject and StructParam_Type are used in _ctypes_callproc()
-+ for argument.keep to call PyMem_Free(ptr) on Py_DECREF(argument).
-+
-+ StructUnionType_paramfunc() creates such object when a ctypes Structure is
-+ passed by copy to a C function. */
-+typedef struct {
-+ PyObject_HEAD
-+ void *ptr;
-+} StructParamObject;
-+
-+
-+static void
-+StructParam_dealloc(PyObject *myself)
-+{
-+ StructParamObject *self = (StructParamObject *)myself;
-+ PyMem_Free(self->ptr);
-+ Py_TYPE(self)->tp_free(myself);
-+}
-+
-+
-+static PyTypeObject StructParam_Type = {
-+ PyVarObject_HEAD_INIT(NULL, 0)
-+ .tp_name = "_ctypes.StructParam_Type",
-+ .tp_basicsize = sizeof(StructParamObject),
-+ .tp_dealloc = StructParam_dealloc,
-+ .tp_flags = Py_TPFLAGS_DEFAULT,
-+};
-+
-+
- /*
- PyCStructType_Type - a meta type/class. Creating a new class using this one as
- __metaclass__ will call the constructor StructUnionType_new. It replaces the
-@@ -403,35 +432,47 @@ static PyCArgObject *
- StructUnionType_paramfunc(CDataObject *self)
- {
- PyCArgObject *parg;
-- CDataObject *copied_self;
-+ PyObject *obj;
- StgDictObject *stgdict;
-+ void *ptr;
-
- if ((size_t)self->b_size > sizeof(void*)) {
-- void *new_ptr = PyMem_Malloc(self->b_size);
-- if (new_ptr == NULL)
-+ ptr = PyMem_Malloc(self->b_size);
-+ if (ptr == NULL) {
- return NULL;
-- memcpy(new_ptr, self->b_ptr, self->b_size);
-- copied_self = (CDataObject *)PyCData_AtAddress(
-- (PyObject *)Py_TYPE(self), new_ptr);
-- copied_self->b_needsfree = 1;
-+ }
-+ memcpy(ptr, self->b_ptr, self->b_size);
-+
-+ /* Create a Python object which calls PyMem_Free(ptr) in
-+ its deallocator. The object will be destroyed
-+ at _ctypes_callproc() cleanup. */
-+ obj = (&StructParam_Type)->tp_alloc(&StructParam_Type, 0);
-+ if (obj == NULL) {
-+ PyMem_Free(ptr);
-+ return NULL;
-+ }
-+
-+ StructParamObject *struct_param = (StructParamObject *)obj;
-+ struct_param->ptr = ptr;
- } else {
-- copied_self = self;
-- Py_INCREF(copied_self);
-+ ptr = self->b_ptr;
-+ obj = (PyObject *)self;
-+ Py_INCREF(obj);
- }
-
- parg = PyCArgObject_new();
- if (parg == NULL) {
-- Py_DECREF(copied_self);
-+ Py_DECREF(obj);
- return NULL;
- }
-
- parg->tag = 'V';
-- stgdict = PyObject_stgdict((PyObject *)copied_self);
-+ stgdict = PyObject_stgdict((PyObject *)self);
- assert(stgdict); /* Cannot be NULL for structure/union instances */
- parg->pffi_type = &stgdict->ffi_type_pointer;
-- parg->value.p = copied_self->b_ptr;
-- parg->size = copied_self->b_size;
-- parg->obj = (PyObject *)copied_self;
-+ parg->value.p = ptr;
-+ parg->size = self->b_size;
-+ parg->obj = obj;
- return parg;
- }
-
-@@ -5700,6 +5741,10 @@ PyInit__ctypes(void)
- if (PyType_Ready(&DictRemover_Type) < 0)
- return NULL;
-
-+ if (PyType_Ready(&StructParam_Type) < 0) {
-+ return NULL;
-+ }
-+
- #ifdef MS_WIN32
- if (create_comerror() < 0)
- return NULL;
---
-2.21.0
-
diff --git a/python38.spec b/python38.spec
index 11f543d..eb8f133 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel b4
+%global prerel rc1
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
Release: 1%{?dist}
@@ -261,13 +261,6 @@ Patch274: 00274-fix-arch-names.patch
# See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
Patch328: 00328-pyc-timestamp-invalidation-mode.patch
-# 00331 #
-# Fix StructUnionType_paramfunc()
-# Fix a ctypes regression of Python 3.8
-# Merged upstream
https://bugs.python.org/issue37140
-# Fixes clang FTBFS
https://bugzilla.redhat.com/show_bug.cgi?id=1715016
-Patch331: 00331-fix-structuniontype_paramfunc.patch
-
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -604,7 +597,6 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
%patch328 -p1
-%patch331 -p1
# Remove files that should be generated by the build
@@ -1527,6 +1519,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue Oct 01 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~rc1-1
+- Rebased to Python 3.8.0rc1
+
* Sat Aug 31 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b4-1
- Rebased to Python 3.8.0b4
- Enable Profile-guided optimization for all arches, not just x86 (#1741015)
diff --git a/sources b/sources
index 6ec0203..1a61303 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0b4.tar.xz) =
91cf7a6988a52edbffa544f4154219864c09f0726b617c79078fe6d00f4c85255cf302a087f80a0a1697ef6d7c9547c20fe9d8901ce8d6ef553e3b36bf87dbde
+SHA512 (Python-3.8.0rc1.tar.xz) =
9a4055c210e65157265aee262eefb776dece59290b04935beb08354825bfe7049f51bb8ba545d85c369df6e853003455965a6435129f4c4660b2786f26d4c66e
commit 06c78128987a7b5599a419e67ad6aa66a771fa3f
Author: Kalev Lember <klember(a)redhat.com>
Date: Wed Sep 25 06:50:47 2019 +0000
Avoid using _prefix macro for /usr/lib/debug dir
In case of flatpak module builds, _prefix is redefined as /app.
rpm-build however hardcodes /usr/lib/debug without using the _prefix
macro, so do the same here to match this.
This fixes building Python as a flatpak module.
https://bugzilla.redhat.com/show_bug.cgi?id=1737933#c14
diff --git a/python38.spec b/python38.spec
index 4accab5..11f543d 100644
--- a/python38.spec
+++ b/python38.spec
@@ -745,7 +745,7 @@ topdir=$(pwd)
# information
%if %{with gdb_hooks}
-DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+DirHoldingGdbPy=%{_usr}/lib/debug/%{_libdir}
mkdir -p %{buildroot}$DirHoldingGdbPy
%endif # with gdb_hooks
commit 4352870f13f58cd3c9b23f6ae4ed3d2a97d2d370
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Aug 30 15:47:05 2019 +0200
Rebased to Python 3.8.0b4
Patch 189 rebased for new setuptools/pip version.
Patch 331 added to fix clang:
https://bugzilla.redhat.com/show_bug.cgi?id=1715016
importlib.metadata is now a simple module, not a folder.
diff --git a/00001-rpath.patch b/00001-rpath.patch
index 030bc3c..cb3969d 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,4 +1,4 @@
-From 8a93e612de3f9f1e1c04ca2b31f207a2ce611fe1 Mon Sep 17 00:00:00 2001
+From 06e1abca862a731ab42dd4f04c232511a2ade166 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00001: Fixup distutils/unixccompiler.py to remove standard
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 45677ca..388df8a 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,4 +1,4 @@
-From ee7b218babbed91c283445021a99d4b28fc12b2f Mon Sep 17 00:00:00 2001
+From 331d11692ff564f152157bffbcaaf97e4c2676d2 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH] 00102: Change the various install paths to use /usr/lib64/
@@ -198,10 +198,10 @@ index 5f80738188..73d7913441 100644
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
diff --git a/configure b/configure
-index cb5f130d38..b30b4008f2 100755
+index 3cd9b8866c..7d4cbab2c0 100755
--- a/configure
+++ b/configure
-@@ -15195,9 +15195,9 @@ fi
+@@ -15197,9 +15197,9 @@ fi
if test x$PLATFORM_TRIPLET = x; then
@@ -214,10 +214,10 @@ index cb5f130d38..b30b4008f2 100755
diff --git a/configure.ac b/configure.ac
-index b31ed242f1..42d17bc0ad 100644
+index 033a93cd3f..5c8a04f61e 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4663,9 +4663,9 @@ fi
+@@ -4665,9 +4665,9 @@ fi
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
AC_SUBST(PY_ENABLE_SHARED)
if test x$PLATFORM_TRIPLET = x; then
@@ -230,7 +230,7 @@ index b31ed242f1..42d17bc0ad 100644
AC_SUBST(LIBPL)
diff --git a/setup.py b/setup.py
-index 6cbbec9e12..a5092861cf 100644
+index be2ac0b01d..624274a75b 100644
--- a/setup.py
+++ b/setup.py
@@ -648,7 +648,7 @@ class PyBuildExt(build_ext):
@@ -242,7 +242,7 @@ index 6cbbec9e12..a5092861cf 100644
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:
-@@ -944,11 +944,11 @@ class PyBuildExt(build_ext):
+@@ -946,11 +946,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
elif self.compiler.find_library_file(self.lib_dirs +
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index bc326cb..5cd1757 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,4 +1,4 @@
-From 65208ffdf868d06e6e16eeb12e3f47205a738ed3 Mon Sep 17 00:00:00 2001
+From 9b7b6251f0fa17d6ab9eff945b3fe43cce549f13 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
Subject: [PATCH] 00111: Don't try to build a libpythonMAJOR.MINOR.a
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index 7be6406..19fa3a2 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,4 +1,4 @@
-From 327e040bd14b6bd05314b24e59ffcdb2179f9757 Mon Sep 17 00:00:00 2001
+From b377643b13abe774c95350c4b2534eb7aa001de4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
Subject: [PATCH] 00189: Instead of bundled wheels, use our RPM packaged wheels
@@ -9,7 +9,7 @@ We keep them in /usr/share/python-wheels
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index 63de20e288..4d17e413db 100644
+index fc0edec6e3..4d17e413db 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -1,16 +1,27 @@
@@ -26,9 +26,9 @@ index 63de20e288..4d17e413db 100644
+_WHEEL_DIR = "/usr/share/python-wheels/"
--_SETUPTOOLS_VERSION = "41.0.1"
+-_SETUPTOOLS_VERSION = "41.2.0"
--_PIP_VERSION = "19.2.1"
+-_PIP_VERSION = "19.2.3"
+def _get_most_recent_wheel_version(pkg):
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
+ suffix = "-py2.py3-none-any.whl"
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 1b6f283..18a4505 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,4 +1,4 @@
-From 27348866d660c1344a1f78a6337436443e1ed19c Mon Sep 17 00:00:00 2001
+From b610ba33332054763d46a43af205e3b9e6724bac Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
Subject: [PATCH] 00251: Change user install location
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index 9bca39d..b038582 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,4 +1,4 @@
-From c827bec294a7fb9481a55c1f7d78e80007e38816 Mon Sep 17 00:00:00 2001
+From c79add9be412d3e42e3b623e04e7071dfadf75d1 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
Subject: [PATCH] 00274: Upstream uses Debian-style architecture naming, change
@@ -29,7 +29,7 @@ index ba37cf99e2..52a9ec6662 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index 42d17bc0ad..637a99f159 100644
+index 5c8a04f61e..807e379537 100644
--- a/configure.ac
+++ b/configure.ac
@@ -741,9 +741,9 @@ cat >> conftest.c <<EOF
diff --git a/00328-pyc-timestamp-invalidation-mode.patch
b/00328-pyc-timestamp-invalidation-mode.patch
index 18e7735..c0cbd82 100644
--- a/00328-pyc-timestamp-invalidation-mode.patch
+++ b/00328-pyc-timestamp-invalidation-mode.patch
@@ -1,4 +1,4 @@
-From 1df081ef9044c6b30fd75d591b6999eb62c48d9b Mon Sep 17 00:00:00 2001
+From 616cc366d97f4402cc50e0338954d1c82b843027 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 11 Jul 2019 13:44:13 +0200
Subject: [PATCH] 00328: Restore pyc to TIMESTAMP invalidation mode as default
diff --git a/00331-fix-structuniontype_paramfunc.patch
b/00331-fix-structuniontype_paramfunc.patch
new file mode 100644
index 0000000..d9cb132
--- /dev/null
+++ b/00331-fix-structuniontype_paramfunc.patch
@@ -0,0 +1,246 @@
+From 091ae930cd8bac805a083ea68e4f886200f57de0 Mon Sep 17 00:00:00 2001
+From: "Miss Islington (bot)"
+ <31488909+miss-islington(a)users.noreply.github.com>
+Date: Fri, 30 Aug 2019 05:50:44 -0700
+Subject: [PATCH] 00331: Fix StructUnionType_paramfunc()
+
+Fix a ctypes regression of Python 3.8. When a ctypes.Structure is
+passed by copy to a function, ctypes internals created a temporary
+object which had the side effect of calling the structure finalizer
+(__del__) twice. The Python semantics requires a finalizer to be
+called exactly once. Fix ctypes internals to no longer call the
+finalizer twice.
+
+Create a new internal StructParam_Type which is only used by
+_ctypes_callproc() to call PyMem_Free(ptr) on Py_DECREF(argument).
+StructUnionType_paramfunc() creates such object.
+(cherry picked from commit 96b4087ce784ee7434dffdf69c475f5b40543982)
+
+Co-authored-by: Victor Stinner <vstinner(a)redhat.com>
+---
+ Lib/ctypes/test/test_structures.py | 51 +++++++++++--
+ .../2019-08-30-11-21-10.bpo-37140.cFAX-a.rst | 5 ++
+ Modules/_ctypes/_ctypes.c | 73 +++++++++++++++----
+ 3 files changed, 109 insertions(+), 20 deletions(-)
+ create mode 100644 Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
+
+diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
+index d1ea43bc7e..fda104563d 100644
+--- a/Lib/ctypes/test/test_structures.py
++++ b/Lib/ctypes/test/test_structures.py
+@@ -3,7 +3,7 @@ from ctypes import *
+ from ctypes.test import need_symbol
+ from struct import calcsize
+ import _ctypes_test
+-import test.support
++from test import support
+
+ class SubclassesTest(unittest.TestCase):
+ def test_subclass(self):
+@@ -202,7 +202,7 @@ class StructureTestCase(unittest.TestCase):
+ "_pack_": -1}
+ self.assertRaises(ValueError, type(Structure), "X", (Structure,), d)
+
+- @test.support.cpython_only
++ @support.cpython_only
+ def test_packed_c_limits(self):
+ # Issue 15989
+ import _testcapi
+@@ -396,27 +396,66 @@ class StructureTestCase(unittest.TestCase):
+ self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7))
+
+ def test_pass_by_value(self):
+- # This should mirror the structure in Modules/_ctypes/_ctypes_test.c
+- class X(Structure):
++ # This should mirror the Test structure
++ # in Modules/_ctypes/_ctypes_test.c
++ class Test(Structure):
+ _fields_ = [
+ ('first', c_ulong),
+ ('second', c_ulong),
+ ('third', c_ulong),
+ ]
+
+- s = X()
++ s = Test()
+ s.first = 0xdeadbeef
+ s.second = 0xcafebabe
+ s.third = 0x0bad1dea
+ dll = CDLL(_ctypes_test.__file__)
+ func = dll._testfunc_large_struct_update_value
+- func.argtypes = (X,)
++ func.argtypes = (Test,)
+ func.restype = None
+ func(s)
+ self.assertEqual(s.first, 0xdeadbeef)
+ self.assertEqual(s.second, 0xcafebabe)
+ self.assertEqual(s.third, 0x0bad1dea)
+
++ def test_pass_by_value_finalizer(self):
++ # bpo-37140: Similar to test_pass_by_value(), but the Python structure
++ # has a finalizer (__del__() method): the finalizer must only be called
++ # once.
++
++ finalizer_calls = []
++
++ class Test(Structure):
++ _fields_ = [
++ ('first', c_ulong),
++ ('second', c_ulong),
++ ('third', c_ulong),
++ ]
++ def __del__(self):
++ finalizer_calls.append("called")
++
++ s = Test(1, 2, 3)
++ # Test the StructUnionType_paramfunc() code path which copies the
++ # structure: if the stucture is larger than sizeof(void*).
++ self.assertGreater(sizeof(s), sizeof(c_void_p))
++
++ dll = CDLL(_ctypes_test.__file__)
++ func = dll._testfunc_large_struct_update_value
++ func.argtypes = (Test,)
++ func.restype = None
++ func(s)
++ # bpo-37140: Passing the structure by refrence must not call
++ # its finalizer!
++ self.assertEqual(finalizer_calls, [])
++ self.assertEqual(s.first, 1)
++ self.assertEqual(s.second, 2)
++ self.assertEqual(s.third, 3)
++
++ # The finalizer must be called exactly once
++ s = None
++ support.gc_collect()
++ self.assertEqual(finalizer_calls, ["called"])
++
+ def test_pass_by_value_in_register(self):
+ class X(Structure):
+ _fields_ = [
+diff --git a/Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
b/Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
+new file mode 100644
+index 0000000000..4eaa226147
+--- /dev/null
++++ b/Misc/NEWS.d/next/Library/2019-08-30-11-21-10.bpo-37140.cFAX-a.rst
+@@ -0,0 +1,5 @@
++Fix a ctypes regression of Python 3.8. When a ctypes.Structure is passed by
++copy to a function, ctypes internals created a temporary object which had
++the side effect of calling the structure finalizer (__del__) twice. The
++Python semantics requires a finalizer to be called exactly once. Fix ctypes
++internals to no longer call the finalizer twice.
+diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
+index 2201c4520a..4728874006 100644
+--- a/Modules/_ctypes/_ctypes.c
++++ b/Modules/_ctypes/_ctypes.c
+@@ -392,6 +392,35 @@ _ctypes_alloc_format_string_with_shape(int ndim, const Py_ssize_t
*shape,
+ return result;
+ }
+
++/* StructParamObject and StructParam_Type are used in _ctypes_callproc()
++ for argument.keep to call PyMem_Free(ptr) on Py_DECREF(argument).
++
++ StructUnionType_paramfunc() creates such object when a ctypes Structure is
++ passed by copy to a C function. */
++typedef struct {
++ PyObject_HEAD
++ void *ptr;
++} StructParamObject;
++
++
++static void
++StructParam_dealloc(PyObject *myself)
++{
++ StructParamObject *self = (StructParamObject *)myself;
++ PyMem_Free(self->ptr);
++ Py_TYPE(self)->tp_free(myself);
++}
++
++
++static PyTypeObject StructParam_Type = {
++ PyVarObject_HEAD_INIT(NULL, 0)
++ .tp_name = "_ctypes.StructParam_Type",
++ .tp_basicsize = sizeof(StructParamObject),
++ .tp_dealloc = StructParam_dealloc,
++ .tp_flags = Py_TPFLAGS_DEFAULT,
++};
++
++
+ /*
+ PyCStructType_Type - a meta type/class. Creating a new class using this one as
+ __metaclass__ will call the constructor StructUnionType_new. It replaces the
+@@ -403,35 +432,47 @@ static PyCArgObject *
+ StructUnionType_paramfunc(CDataObject *self)
+ {
+ PyCArgObject *parg;
+- CDataObject *copied_self;
++ PyObject *obj;
+ StgDictObject *stgdict;
++ void *ptr;
+
+ if ((size_t)self->b_size > sizeof(void*)) {
+- void *new_ptr = PyMem_Malloc(self->b_size);
+- if (new_ptr == NULL)
++ ptr = PyMem_Malloc(self->b_size);
++ if (ptr == NULL) {
+ return NULL;
+- memcpy(new_ptr, self->b_ptr, self->b_size);
+- copied_self = (CDataObject *)PyCData_AtAddress(
+- (PyObject *)Py_TYPE(self), new_ptr);
+- copied_self->b_needsfree = 1;
++ }
++ memcpy(ptr, self->b_ptr, self->b_size);
++
++ /* Create a Python object which calls PyMem_Free(ptr) in
++ its deallocator. The object will be destroyed
++ at _ctypes_callproc() cleanup. */
++ obj = (&StructParam_Type)->tp_alloc(&StructParam_Type, 0);
++ if (obj == NULL) {
++ PyMem_Free(ptr);
++ return NULL;
++ }
++
++ StructParamObject *struct_param = (StructParamObject *)obj;
++ struct_param->ptr = ptr;
+ } else {
+- copied_self = self;
+- Py_INCREF(copied_self);
++ ptr = self->b_ptr;
++ obj = (PyObject *)self;
++ Py_INCREF(obj);
+ }
+
+ parg = PyCArgObject_new();
+ if (parg == NULL) {
+- Py_DECREF(copied_self);
++ Py_DECREF(obj);
+ return NULL;
+ }
+
+ parg->tag = 'V';
+- stgdict = PyObject_stgdict((PyObject *)copied_self);
++ stgdict = PyObject_stgdict((PyObject *)self);
+ assert(stgdict); /* Cannot be NULL for structure/union instances */
+ parg->pffi_type = &stgdict->ffi_type_pointer;
+- parg->value.p = copied_self->b_ptr;
+- parg->size = copied_self->b_size;
+- parg->obj = (PyObject *)copied_self;
++ parg->value.p = ptr;
++ parg->size = self->b_size;
++ parg->obj = obj;
+ return parg;
+ }
+
+@@ -5700,6 +5741,10 @@ PyInit__ctypes(void)
+ if (PyType_Ready(&DictRemover_Type) < 0)
+ return NULL;
+
++ if (PyType_Ready(&StructParam_Type) < 0) {
++ return NULL;
++ }
++
+ #ifdef MS_WIN32
+ if (create_comerror() < 0)
+ return NULL;
+--
+2.21.0
+
diff --git a/python38.spec b/python38.spec
index ecae9fe..4accab5 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,10 +14,10 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel b3
+%global prerel b4
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 2%{?dist}
+Release: 1%{?dist}
License: Python
@@ -261,6 +261,13 @@ Patch274: 00274-fix-arch-names.patch
# See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
Patch328: 00328-pyc-timestamp-invalidation-mode.patch
+# 00331 #
+# Fix StructUnionType_paramfunc()
+# Fix a ctypes regression of Python 3.8
+# Merged upstream
https://bugs.python.org/issue37140
+# Fixes clang FTBFS
https://bugzilla.redhat.com/show_bug.cgi?id=1715016
+Patch331: 00331-fix-structuniontype_paramfunc.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -373,8 +380,8 @@ Summary: Python runtime libraries
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 19.2.1
-Provides: bundled(python3-setuptools) = 41.0.1
+Provides: bundled(python3-pip) = 19.2.3
+Provides: bundled(python3-setuptools) = 41.2.0
%endif
%{?python_provide:%python_provide python3-libs}
@@ -550,8 +557,8 @@ The debug runtime additionally supports debug builds of C-API
extensions
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 19.2.1
-Provides: bundled(python3-setuptools) = 41.0.1
+Provides: bundled(python3-pip) = 19.2.3
+Provides: bundled(python3-setuptools) = 41.2.0
%endif
# The description for the flat package
@@ -597,6 +604,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
%patch328 -p1
+%patch331 -p1
# Remove files that should be generated by the build
@@ -1163,6 +1171,7 @@ CheckPython optimized
%{dynload_dir}/_socket.%{SOABI_optimized}.so
%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
%{dynload_dir}/_ssl.%{SOABI_optimized}.so
+%{dynload_dir}/_statistics.%{SOABI_optimized}.so
%{dynload_dir}/_struct.%{SOABI_optimized}.so
%{dynload_dir}/array.%{SOABI_optimized}.so
%{dynload_dir}/audioop.%{SOABI_optimized}.so
@@ -1239,11 +1248,6 @@ CheckPython optimized
%{pylibdir}/importlib/*.py
%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/importlib/metadata/
-%dir %{pylibdir}/importlib/metadata/__pycache__/
-%{pylibdir}/importlib/metadata/*.py
-%{pylibdir}/importlib/metadata/__pycache__/*%{bytecode_suffixes}
-
%dir %{pylibdir}/json/
%dir %{pylibdir}/json/__pycache__/
%{pylibdir}/json/*.py
@@ -1441,6 +1445,7 @@ CheckPython optimized
%{dynload_dir}/_socket.%{SOABI_debug}.so
%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
%{dynload_dir}/_ssl.%{SOABI_debug}.so
+%{dynload_dir}/_statistics.%{SOABI_debug}.so
%{dynload_dir}/_struct.%{SOABI_debug}.so
%{dynload_dir}/array.%{SOABI_debug}.so
%{dynload_dir}/audioop.%{SOABI_debug}.so
@@ -1522,7 +1527,8 @@ CheckPython optimized
# ======================================================
%changelog
-* Sat Aug 31 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b3-2
+* Sat Aug 31 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b4-1
+- Rebased to Python 3.8.0b4
- Enable Profile-guided optimization for all arches, not just x86 (#1741015)
* Mon Jul 29 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b3-1
diff --git a/sources b/sources
index 58d4f5b..6ec0203 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0b3.tar.xz) =
5b29e580514704150b397850b5bf5f3e4b98a45d9a9f8ac0364bef51caac74862f9f349b5d3d1bbcdcc5b48b2722f1a9e5e0a9837bf44360fe74a396e915ae35
+SHA512 (Python-3.8.0b4.tar.xz) =
91cf7a6988a52edbffa544f4154219864c09f0726b617c79078fe6d00f4c85255cf302a087f80a0a1697ef6d7c9547c20fe9d8901ce8d6ef553e3b36bf87dbde
commit 8f6e3122a8726d188cdcda5e705f3f530a5f9943
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Aug 15 16:51:16 2019 +0200
Enable Profile-guided optimization for all arches, not just x86
This increases the build time (to ~2 hours on armv7hl Koji),
but should bring more optimized Python to architectures other than x86.
The build time overhead is not so big on Python 3.8,
as only a limited number of tests is used.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1741015
diff --git a/python38.spec b/python38.spec
index 85512cf..ecae9fe 100644
--- a/python38.spec
+++ b/python38.spec
@@ -17,7 +17,7 @@ URL:
https://www.python.org/
%global prerel b3
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -52,13 +52,7 @@ License: Python
%bcond_without rpmwheels
# Expensive optimizations (mainly, profile-guided optimizations)
-%ifarch %{ix86} x86_64
%bcond_without optimizations
-%else
-# On some architectures, the optimized build takes tens of hours, possibly
-# longer than Koji's 24-hour timeout. Disable optimizations here.
-%bcond_with optimizations
-%endif
# Run the test suite in %%check
%bcond_without tests
@@ -1528,6 +1522,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Sat Aug 31 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b3-2
+- Enable Profile-guided optimization for all arches, not just x86 (#1741015)
+
* Mon Jul 29 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b3-1
- Update to 3.8.0b3
commit e9ba67b74b9849d00cfc8e332b711db142dfd3e3
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sun Aug 11 11:23:07 2019 +0200
Conditionalize python3-devel runtime dependencies on RPM packages and setuptools
Installing python3-devel currently brings in:
- annobin
- dwz
- efi-srpm-macros
- fpc-srpm-macros
- ghc-srpm-macros
- gnat-srpm-macros
- go-srpm-macros
- nim-srpm-macros
- ocaml-srpm-macros
- openblas-srpm-macros
- perl-srpm-macros
- python-rpm-macros
- python-srpm-macros
- python3-rpm-generators
- python3-rpm-macros
- qt5-srpm-macros
- redhat-rpm-config
- rust-srpm-macros
For somebody who needs python3-devel to build extension modules,
those are all useless, so we conditionalize it on rpm-build.
Based on the reason for setuptools dependency, we do the same here
(but note that python3 already recommends it).
diff --git a/python38.spec b/python38.spec
index 3013707..85512cf 100644
--- a/python38.spec
+++ b/python38.spec
@@ -415,10 +415,10 @@ Summary: Libraries and header files needed for Python development
Requires: %{name} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
BuildRequires: python-rpm-macros
-Requires: python-rpm-macros
-Requires: python3-rpm-macros
-
-%{?python_provide:%python_provide python3-devel}
+# The RPM related dependencies bring nothing to a non-RPM Python developer
+# But we want them when packages BuildRequire python3-devel
+Requires: (python-rpm-macros if rpm-build)
+Requires: (python3-rpm-macros if rpm-build)
%if %{without bootstrap}
# This is not "API" (packages that need setuptools should still BuildRequire
it)
@@ -428,11 +428,13 @@ Requires: python3-rpm-macros
# installed when -devel is required.
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1623914
# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
-Requires: python3-setuptools
+Requires: (python3-setuptools if rpm-build)
-Requires: python3-rpm-generators
+Requires: (python3-rpm-generators if rpm-build)
%endif
+%{?python_provide:%python_provide python3-devel}
+
Provides: %{name}-2to3 = %{version}-%{release}
Provides: 2to3 = %{version}-%{release}
commit 2d970f424cd99c706818edde79a8893629c4e02f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Aug 9 21:04:49 2019 +0200
Stop disabling test_asyncio, the problem was fixed
diff --git a/python38.spec b/python38.spec
index 00ef010..3013707 100644
--- a/python38.spec
+++ b/python38.spec
@@ -1019,8 +1019,6 @@ CheckPython() {
#
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
# test_gdb skipped everywhere:
#
https://bugzilla.redhat.com/show_bug.cgi?id=1734327
- # test_asyncio skipped:
- #
https://bugs.python.org/issue35998
# test_distutils
# distutils.tests.test_bdist_rpm tests fail when bootstraping the Python
# package: rpmbuild requires /usr/bin/pythonX.Y to be installed
@@ -1033,7 +1031,6 @@ CheckPython() {
%ifarch %{mips64}
-x test_ctypes \
%endif
- -x test_asyncio \
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
commit 2d19c7ecdce73a9e51d4a64916761d3e4d69eae9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Aug 9 20:57:37 2019 +0200
Skip test_gdb everywhere
https://bugzilla.redhat.com/show_bug.cgi?id=1734327
Also remove a note about test_gdb skipped on armv7hl, that one was fixed:
https://bugzilla.redhat.com/show_bug.cgi?id=1196181
diff --git a/python38.spec b/python38.spec
index adfe97f..00ef010 100644
--- a/python38.spec
+++ b/python38.spec
@@ -1015,10 +1015,10 @@ CheckPython() {
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.pythoninfo
# Run the upstream test suite
- # test_gdb skipped on armv7hl:
- #
https://bugzilla.redhat.com/show_bug.cgi?id=1196181
# test_gdb skipped on s390x:
#
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
+ # test_gdb skipped everywhere:
+ #
https://bugzilla.redhat.com/show_bug.cgi?id=1734327
# test_asyncio skipped:
#
https://bugs.python.org/issue35998
# test_distutils
@@ -1029,9 +1029,7 @@ CheckPython() {
%if %{with bootstrap}
-x test_distutils \
%endif
- %ifarch %{arm} s390x
-x test_gdb \
- %endif
%ifarch %{mips64}
-x test_ctypes \
%endif
commit 29530ba2a88dd55c7da7207d128004dfdb07a9e8
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jul 30 00:48:16 2019 +0200
Update to 3.8.0b3
diff --git a/00001-rpath.patch b/00001-rpath.patch
index c78445d..030bc3c 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,8 +1,8 @@
-From 8738c39204297788bcb07940a99608f80592829f Mon Sep 17 00:00:00 2001
+From 8a93e612de3f9f1e1c04ca2b31f207a2ce611fe1 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
-Subject: [PATCH 1/7] 00001: Fixup distutils/unixccompiler.py to remove
- standard library path from rpath Was Patch0 in ivazquez' python3000 specfile
+Subject: [PATCH] 00001: Fixup distutils/unixccompiler.py to remove standard
+ library path from rpath Was Patch0 in ivazquez' python3000 specfile
---
Lib/distutils/unixccompiler.py | 9 +++++++++
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 88d7fbd..45677ca 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,8 +1,8 @@
-From 6a503d0ad4512af57ef8a784f12bc439701d8cc7 Mon Sep 17 00:00:00 2001
+From ee7b218babbed91c283445021a99d4b28fc12b2f Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
-Subject: [PATCH 2/7] 00102: Change the various install paths to use
- /usr/lib64/ instead or /usr/lib/
+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
@@ -154,7 +154,7 @@ index 41c4229919..543c88432a 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 88abb56360..6c2edf32f7 100644
+index 6a9f4b5270..61d650882f 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -143,7 +143,7 @@ LIBDIR= @libdir@
@@ -198,10 +198,10 @@ index 5f80738188..73d7913441 100644
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
diff --git a/configure b/configure
-index 6e7f277bac..6cd8344c21 100755
+index cb5f130d38..b30b4008f2 100755
--- a/configure
+++ b/configure
-@@ -15181,9 +15181,9 @@ fi
+@@ -15195,9 +15195,9 @@ fi
if test x$PLATFORM_TRIPLET = x; then
@@ -214,10 +214,10 @@ index 6e7f277bac..6cd8344c21 100755
diff --git a/configure.ac b/configure.ac
-index 324ce0bd99..9a587f3c3f 100644
+index b31ed242f1..42d17bc0ad 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4655,9 +4655,9 @@ fi
+@@ -4663,9 +4663,9 @@ fi
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
AC_SUBST(PY_ENABLE_SHARED)
if test x$PLATFORM_TRIPLET = x; then
@@ -230,7 +230,7 @@ index 324ce0bd99..9a587f3c3f 100644
AC_SUBST(LIBPL)
diff --git a/setup.py b/setup.py
-index edc3434242..59cfc01a2a 100644
+index 6cbbec9e12..a5092861cf 100644
--- a/setup.py
+++ b/setup.py
@@ -648,7 +648,7 @@ class PyBuildExt(build_ext):
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 2cfeaf0..bc326cb 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,7 +1,7 @@
-From efbafc6328f45da6d38a1848933a37497206fb3f Mon Sep 17 00:00:00 2001
+From 65208ffdf868d06e6e16eeb12e3f47205a738ed3 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
-Subject: [PATCH 3/7] 00111: Don't try to build a libpythonMAJOR.MINOR.a
+Subject: [PATCH] 00111: Don't try to build a libpythonMAJOR.MINOR.a
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -21,10 +21,10 @@ Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
1 file changed, 2 insertions(+), 19 deletions(-)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 6c2edf32f7..28c0cead24 100644
+index 61d650882f..3f5be819c4 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -560,7 +560,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+@@ -561,7 +561,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
# Build the interpreter
@@ -33,7 +33,7 @@ index 6c2edf32f7..28c0cead24 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -608,12 +608,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -609,12 +609,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -46,7 +46,7 @@ index 6c2edf32f7..28c0cead24 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM); \
-@@ -691,7 +685,7 @@ Makefile Modules/config.c: Makefile.pre \
+@@ -692,7 +686,7 @@ Makefile Modules/config.c: Makefile.pre \
@echo "The Makefile was updated, you may need to re-run make."
@@ -55,7 +55,7 @@ index 6c2edf32f7..28c0cead24 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
############################################################################
-@@ -1551,17 +1545,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1552,17 +1546,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index 124fe81..7be6406 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,8 +1,7 @@
-From 2edaa31dec042fb8720add80814ca4a3cc4f788f Mon Sep 17 00:00:00 2001
+From 327e040bd14b6bd05314b24e59ffcdb2179f9757 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
-Subject: [PATCH 4/7] 00189: Instead of bundled wheels, use our RPM packaged
- wheels
+Subject: [PATCH] 00189: Instead of bundled wheels, use our RPM packaged wheels
We keep them in /usr/share/python-wheels
---
@@ -10,7 +9,7 @@ We keep them in /usr/share/python-wheels
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index 6f2569da81..4d17e413db 100644
+index 63de20e288..4d17e413db 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -1,16 +1,27 @@
@@ -27,9 +26,9 @@ index 6f2569da81..4d17e413db 100644
+_WHEEL_DIR = "/usr/share/python-wheels/"
--_SETUPTOOLS_VERSION = "40.8.0"
+-_SETUPTOOLS_VERSION = "41.0.1"
--_PIP_VERSION = "19.0.3"
+-_PIP_VERSION = "19.2.1"
+def _get_most_recent_wheel_version(pkg):
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
+ suffix = "-py2.py3-none-any.whl"
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index b00e6a7..1b6f283 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,7 +1,7 @@
-From 3e26b01573488b015065139689be3aa47dac17cf Mon Sep 17 00:00:00 2001
+From 27348866d660c1344a1f78a6337436443e1ed19c Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
-Subject: [PATCH 5/7] 00251: Change user install location
+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
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index 63f23f5..9bca39d 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,8 +1,8 @@
-From b92e29a8cc17f9c02a08b7a005e5ece71a409a0b Mon Sep 17 00:00:00 2001
+From c827bec294a7fb9481a55c1f7d78e80007e38816 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
-Subject: [PATCH 6/7] 00274: Upstream uses Debian-style architecture naming,
- change to match Fedora
+Subject: [PATCH] 00274: Upstream uses Debian-style architecture naming, change
+ to match Fedora
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
@@ -29,7 +29,7 @@ index ba37cf99e2..52a9ec6662 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index 9a587f3c3f..695ff85e4b 100644
+index 42d17bc0ad..637a99f159 100644
--- a/configure.ac
+++ b/configure.ac
@@ -741,9 +741,9 @@ cat >> conftest.c <<EOF
diff --git a/00328-pyc-timestamp-invalidation-mode.patch
b/00328-pyc-timestamp-invalidation-mode.patch
index 87515c4..18e7735 100644
--- a/00328-pyc-timestamp-invalidation-mode.patch
+++ b/00328-pyc-timestamp-invalidation-mode.patch
@@ -1,4 +1,4 @@
-From 746a45acd333174c3174230833b45f537bd92889 Mon Sep 17 00:00:00 2001
+From 1df081ef9044c6b30fd75d591b6999eb62c48d9b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 11 Jul 2019 13:44:13 +0200
Subject: [PATCH] 00328: Restore pyc to TIMESTAMP invalidation mode as default
diff --git a/python38.spec b/python38.spec
index e541158..adfe97f 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,10 +14,10 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel b2
+%global prerel b3
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 2%{?dist}
+Release: 1%{?dist}
License: Python
@@ -379,8 +379,8 @@ Summary: Python runtime libraries
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 19.0.3
-Provides: bundled(python3-setuptools) = 40.8.0
+Provides: bundled(python3-pip) = 19.2.1
+Provides: bundled(python3-setuptools) = 41.0.1
%endif
%{?python_provide:%python_provide python3-libs}
@@ -554,8 +554,8 @@ The debug runtime additionally supports debug builds of C-API
extensions
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 19.0.3
-Provides: bundled(python3-setuptools) = 40.8.0
+Provides: bundled(python3-pip) = 19.2.1
+Provides: bundled(python3-setuptools) = 41.0.1
%endif
# The description for the flat package
@@ -1531,6 +1531,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Jul 29 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b3-1
+- Update to 3.8.0b3
+
* Fri Jul 26 2019 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.8.0~b2-2
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
diff --git a/sources b/sources
index b6aaea1..58d4f5b 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0b2.tar.xz) =
5d4fdabad098b5273d34ecd939e7f7c104f4f9fc1460e5abaf4a8d1ad1c5d2ff26d579de03106f000672e0a20fcd6e4e1e44ce03be4bb4a734f937f3cc81cb3e
+SHA512 (Python-3.8.0b3.tar.xz) =
5b29e580514704150b397850b5bf5f3e4b98a45d9a9f8ac0364bef51caac74862f9f349b5d3d1bbcdcc5b48b2722f1a9e5e0a9837bf44360fe74a396e915ae35
commit 69c2d11d9a3af934e22f5648cb8bc4368ed72e25
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Jul 19 17:49:16 2019 +0200
Update python-debug description for Python 3.8 ABI unification
diff --git a/python38.spec b/python38.spec
index 9e863f4..e541158 100644
--- a/python38.spec
+++ b/python38.spec
@@ -534,15 +534,13 @@ extension modules.
This version uses more memory and will be slower than the regular Python build,
but is useful for tracking down reference-counting issues and other bugs.
-The bytecode format is unchanged, so that .pyc files are compatible between
-this and the standard version of Python, but the debugging features mean that
-C/C++ extension modules are ABI-incompatible and must be built for each version
-separately.
-
The debug build shares installation directories with the standard Python
-runtime, so that .py and .pyc files can be shared.
-Compiled extension modules use a special ABI flag ("d") in the filename,
-so extensions for both versions can co-exist in the same directory.
+runtime. Python modules -- source (.py), bytecode (.pyc), and C-API extensions
+(.cpython*.so) -- are compatible between this and the standard version
+of Python.
+
+The debug runtime additionally supports debug builds of C-API extensions
+(with the "d" ABI flag) for debugging issues in those extensions.
%endif # with debug_build
%else # with flatpackage
commit d35394ed786118a8e0712d0edaed78113371ef40
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Fri Jul 26 17:27:40 2019 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng(a)fedoraproject.org>
diff --git a/python38.spec b/python38.spec
index 1155db0..9e863f4 100644
--- a/python38.spec
+++ b/python38.spec
@@ -17,7 +17,7 @@ URL:
https://www.python.org/
%global prerel b2
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -1533,6 +1533,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Jul 26 2019 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.8.0~b2-2
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
* Fri Jul 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b2-1
- Update to 3.8.0b2
commit ff90d23b8f5d2b721aa55289d69cf1e27ba86449
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jul 11 16:20:09 2019 +0200
Keep the LICENSE.txt file in lib/pythonX.Y dir
The license() builtin tries to read it and virtualenv tries to copy it.
See
https://github.com/pypa/virtualenv/issues/1352
Up until now, the license() builtin juts felt back to:
See
https://www.python.org/psf/license/
However it should output the full license text.
Virtualenv ~16.6 warns:
No LICENSE.txt / LICENSE found in source
Technically, it is probably possible to install the package without
%license files, but that would simply resort to the previous noncritical
behavior.
This fix is not critical and hence it doesn't bump release, for easier
backporting to all our Python packages.
diff --git a/python38.spec b/python38.spec
index aef6396..1155db0 100644
--- a/python38.spec
+++ b/python38.spec
@@ -904,9 +904,6 @@ find %{buildroot} -name \*.bat -exec rm {} \;
find %{buildroot}/ -name "*~" -exec rm -f {} \;
find . -name "*~" -exec rm -f {} \;
-# Get rid of a stray copy of the license:
-rm %{buildroot}%{pylibdir}/LICENSE.txt
-
# Do bytecompilation with the newly installed interpreter.
# This is similar to the script in macros.pybytecompile
# compile *.pyc
@@ -1058,7 +1055,6 @@ CheckPython optimized
%files
-%license LICENSE
%doc README.rst
%if %{without flatpackage}
@@ -1079,13 +1075,14 @@ CheckPython optimized
%{_mandir}/*/python.1*
%files libs
-%license LICENSE
%doc README.rst
%endif
%dir %{pylibdir}
%dir %{dynload_dir}
+%license %{pylibdir}/LICENSE.txt
+
%{pylibdir}/lib2to3
%if %{without flatpackage}
%exclude %{pylibdir}/lib2to3/tests
commit 9213c03924aeb612d1b754dbe0b4397782c6b3fb
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jul 15 15:38:52 2019 +0200
Restore pyc to TIMESTAMP invalidation mode as default in rpmbubild
See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
diff --git a/00328-pyc-timestamp-invalidation-mode.patch
b/00328-pyc-timestamp-invalidation-mode.patch
new file mode 100644
index 0000000..87515c4
--- /dev/null
+++ b/00328-pyc-timestamp-invalidation-mode.patch
@@ -0,0 +1,55 @@
+From 746a45acd333174c3174230833b45f537bd92889 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
+Date: Thu, 11 Jul 2019 13:44:13 +0200
+Subject: [PATCH] 00328: Restore pyc to TIMESTAMP invalidation mode as default
+ in rpmbuild
+
+Since Fedora 31, the $SOURCE_DATE_EPOCH is set in rpmbuild to the latest
+%changelog date. This makes Python default to the CHECKED_HASH pyc
+invalidation mode, bringing more reproducible builds traded for an import
+performance decrease. To avoid that, we don't default to CHECKED_HASH
+when $RPM_BUILD_ROOT is set (i.e. when we are building RPM packages).
+
+See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
+---
+ Lib/py_compile.py | 3 ++-
+ Lib/test/test_py_compile.py | 2 ++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/Lib/py_compile.py b/Lib/py_compile.py
+index 21736896af..310bed5620 100644
+--- a/Lib/py_compile.py
++++ b/Lib/py_compile.py
+@@ -70,7 +70,8 @@ class PycInvalidationMode(enum.Enum):
+
+
+ def _get_default_invalidation_mode():
+- if os.environ.get('SOURCE_DATE_EPOCH'):
++ if (os.environ.get('SOURCE_DATE_EPOCH') and not
++ os.environ.get('RPM_BUILD_ROOT')):
+ return PycInvalidationMode.CHECKED_HASH
+ else:
+ return PycInvalidationMode.TIMESTAMP
+diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py
+index d6677ab45f..88059b127e 100644
+--- a/Lib/test/test_py_compile.py
++++ b/Lib/test/test_py_compile.py
+@@ -17,6 +17,7 @@ def without_source_date_epoch(fxn):
+ def wrapper(*args, **kwargs):
+ with support.EnvironmentVarGuard() as env:
+ env.unset('SOURCE_DATE_EPOCH')
++ env.unset('RPM_BUILD_ROOT')
+ return fxn(*args, **kwargs)
+ return wrapper
+
+@@ -27,6 +28,7 @@ def with_source_date_epoch(fxn):
+ def wrapper(*args, **kwargs):
+ with support.EnvironmentVarGuard() as env:
+ env['SOURCE_DATE_EPOCH'] = '123456789'
++ env.unset('RPM_BUILD_ROOT')
+ return fxn(*args, **kwargs)
+ return wrapper
+
+--
+2.21.0
+
diff --git a/python38.spec b/python38.spec
index d4a6314..aef6396 100644
--- a/python38.spec
+++ b/python38.spec
@@ -262,6 +262,11 @@ Patch251: 00251-change-user-install-location.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
+# 00328 #
+# Restore pyc to TIMESTAMP invalidation mode as default in rpmbubild
+# See
https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comm...
+Patch328: 00328-pyc-timestamp-invalidation-mode.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -597,6 +602,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
+%patch328 -p1
# Remove files that should be generated by the build
commit 7bf69ee163cd3cdbb3241dd717d001f617ea8d86
Author: Lumir Balhar <lbalhar(a)redhat.com>
Date: Mon Jul 15 12:19:12 2019 +0000
Move test.support module to python3-test subpackage
More info:
https://fedoraproject.org/wiki/Changes/Move_test.support_module_to_python...
diff --git a/python38.spec b/python38.spec
index d9ba192..d4a6314 100644
--- a/python38.spec
+++ b/python38.spec
@@ -1116,20 +1116,6 @@ CheckPython optimized
%{pylibdir}/ensurepip/_bundled/*.whl
%endif
-# The majority of the test module lives in the test subpackage
-# However test.support is in libs - it contains stuff used when testing your code
-#
https://bugzilla.redhat.com/show_bug.cgi?id=596258
-%if %{without flatpackage}
-%dir %{pylibdir}/test/
-%dir %{pylibdir}/test/__pycache__/
-%dir %{pylibdir}/test/support/
-%dir %{pylibdir}/test/support/__pycache__/
-%{pylibdir}/test/__init__.py
-%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%{pylibdir}/test/support/*.py
-%{pylibdir}/test/support/__pycache__/*%{bytecode_suffixes}
-%endif
-
%dir %{pylibdir}/concurrent/
%dir %{pylibdir}/concurrent/__pycache__/
%{pylibdir}/concurrent/*.py
@@ -1401,16 +1387,6 @@ CheckPython optimized
%{pylibdir}/tkinter/test
%{pylibdir}/unittest/test
-# stuff already owned by the libs subpackage
-# test requires libs, so we are safe not owning those dirs
-%if %{without flatpackage}
-%exclude %dir %{pylibdir}/test/
-%exclude %dir %{pylibdir}/test/__pycache__/
-%exclude %{pylibdir}/test/__init__.py
-%exclude %{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%exclude %{pylibdir}/test/support/
-%endif
-
# We don't bother splitting the debug build out into further subpackages:
# if you need it, you're probably a developer.
commit 988896a172b407d31d4425c5ceb9254d26a6c07f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jul 12 19:03:54 2019 +0200
Python now means Python 3
-
https://fedoraproject.org/wiki/Changes/Python_means_Python3
- The python-unversioned-command package is no longer Python 2, but 3
- The python, pydoc, python-config, python-debug, idle, pygettext.py and
msgfmt.py commands are now in python3
diff --git a/python38.spec b/python38.spec
index 326b000..d9ba192 100644
--- a/python38.spec
+++ b/python38.spec
@@ -304,6 +304,18 @@ Provides: python%{pyshortver} = %{version}-%{release}
# replace python36-3.6.2.
Obsoletes: python%{pyshortver}
+#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
+#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
+# We recommend /usr/bin/python so users get it by default
+# Versioned recommends are problematic, and we know that the package requires
+# python3 back with fixed version, so we just use the path here:
+Recommends: %{_bindir}/python
+
+# In Fedora 31, /usr/bin/pydoc was moved here from Python 2.
+# Ideally we'd have an explicit conflict with "/usr/bin/pydoc < 3",
+# but file provides aren't versioned and the file moved across packages.
+# Instead, we rely on the conflict in python3-libs.
+
# Previously, this was required for our rewheel patch to work.
# This is technically no longer needed, but we keep it recommended
# for the developer experience.
@@ -339,6 +351,22 @@ Packages containing additional libraries for Python are generally
named with
the "%{name}-" prefix.
+#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
+#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
+%package -n python-unversioned-command
+Summary: The "python" command that runs Python 3
+BuildArch: noarch
+
+# In theory this could require any python3 version
+Requires: python3 == %{version}-%{release}
+# But since we want to provide versioned python, we require exact version
+Provides: python = %{version}-%{release}
+# This also save us an explicit conflict for older python3 builds
+
+%description -n python-unversioned-command
+This package contains /usr/bin/python - the "python" command that runs Python
3.
+
+
%package libs
Summary: Python runtime libraries
@@ -358,6 +386,18 @@ Provides: bundled(python3-setuptools) = 40.8.0
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
Recommends: %{name}%{?_isa} = %{version}-%{release}
+#
https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_...
+# In Fedora 31, several "unversioned" files like /usr/bin/pydoc and all the
+# "unversioned" provides were moved from python2 to python3.
+# So, newer python3 packages need to conflict with old Python 2 builds that
+# still provided unversioned Python.
+# Since all python packages, new and old, have versioned requires on
+# python?-libs, we do it here:
+Conflicts: python-libs < 3
+# (We explicitly conflict with python-libs and not python2-libs, so only the
+# old Python 2 builds that still provided unversioned Python are handled.)
+
+
%description libs
This package contains runtime libraries for use by Python:
- the majority of the Python standard library
@@ -393,6 +433,10 @@ Provides: 2to3 = %{version}-%{release}
Conflicts: %{name} < %{version}-%{release}
+# In Fedora 31, several "unversioned" files were moved here from Python 2:
+# pygettext.py, msgfmt.py, python-config, python.pc
+Conflicts: python-devel < 3
+
%description devel
This package contains the header files and configuration needed to compile
Python extension modules (typically written in C or C++), to embed Python
@@ -408,11 +452,15 @@ Requires: %{name} = %{version}-%{release}
Requires: %{name}-tkinter = %{version}-%{release}
Provides: idle3 = %{version}-%{release}
+Provides: idle = %{version}-%{release}
Provides: %{name}-tools = %{version}-%{release}
Provides: %{name}-tools%{?_isa} = %{version}-%{release}
Obsoletes: %{name}-tools < %{version}-%{release}
+# In Fedora 31, /usr/bin/idle was moved here from Python 2.
+Conflicts: python-tools < 3
+
%{?python_provide:%python_provide python3-idle}
%description idle
@@ -468,6 +516,9 @@ Requires: %{name}-test%{?_isa} = %{version}-%{release}
Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
Requires: %{name}-idle%{?_isa} = %{version}-%{release}
+# In Fedora 31, /usr/bin/python-debug was moved here from Python 2.
+Conflicts: python-debug < 3
+
%{?python_provide:%python_provide python3-debug}
%description debug
@@ -892,6 +943,20 @@ rm %{buildroot}%{_libdir}/libpython3.so
rm %{buildroot}%{_mandir}/man1/python3.1*
rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
rm %{buildroot}%{_libdir}/pkgconfig/python3-embed.pc
+%else
+# Link the unversioned stuff
+#
https://fedoraproject.org/wiki/Changes/Python_means_Python3
+ln -s ./python3 %{buildroot}%{_bindir}/python
+ln -s ./pydoc3 %{buildroot}%{_bindir}/pydoc
+ln -s ./pygettext3.py %{buildroot}%{_bindir}/pygettext.py
+ln -s ./msgfmt3.py %{buildroot}%{_bindir}/msgfmt.py
+ln -s ./idle3 %{buildroot}%{_bindir}/idle
+ln -s ./python3-config %{buildroot}%{_bindir}/python-config
+ln -s ./python3.1 %{buildroot}%{_mandir}/man1/python.1
+ln -s ./python3.pc %{buildroot}%{_libdir}/pkgconfig/python.pc
+%if %{with debug_build}
+ln -s ./python3-debug %{buildroot}%{_bindir}/python-debug
+%endif
%endif
@@ -999,10 +1064,14 @@ CheckPython optimized
%{_bindir}/python%{pybasever}
%{_bindir}/python%{LDVERSION_optimized}
-%{_mandir}/*/*
+%{_mandir}/*/*3*
%if %{without flatpackage}
+%files -n python-unversioned-command
+%{_bindir}/python
+%{_mandir}/*/python.1*
+
%files libs
%license LICENSE
%doc README.rst
@@ -1255,11 +1324,15 @@ CheckPython optimized
%if %{without flatpackage}
%{_bindir}/python3-config
+%{_bindir}/python-config
%{_libdir}/pkgconfig/python3.pc
+%{_libdir}/pkgconfig/python.pc
%{_libdir}/pkgconfig/python3-embed.pc
%{_bindir}/pathfix.py
%{_bindir}/pygettext3.py
+%{_bindir}/pygettext.py
%{_bindir}/msgfmt3.py
+%{_bindir}/msgfmt.py
%endif
%{_bindir}/pygettext%{pybasever}.py
@@ -1348,6 +1421,7 @@ CheckPython optimized
%if %{without flatpackage}
%files debug
%{_bindir}/python3-debug
+%{_bindir}/python-debug
%endif
# Analog of the core subpackage's files:
commit b9306b1085cc75b1a409c1520adf1fbf8dba6f33
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jul 8 11:44:23 2019 +0200
Add %python_provide provides
This allows easier compatibility back and forth once (and if)
https://fedoraproject.org/wiki/Changes/Python_means_Python3
happens. This is not the full implementation of the change,
as the python-unversioned package still needs to be added.
This is currently a no-op as %python_provide does nothing
for python3.
diff --git a/python38.spec b/python38.spec
index b9a8a11..326b000 100644
--- a/python38.spec
+++ b/python38.spec
@@ -198,6 +198,9 @@ BuildRequires: /usr/bin/dtrace
# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
BuildRequires: /usr/sbin/ifconfig
+# For %%python_provide
+BuildRequires: python-rpm-macros
+
%if %{with rpmwheels}
BuildRequires: python-setuptools-wheel
BuildRequires: python-pip-wheel
@@ -347,6 +350,8 @@ Provides: bundled(python3-pip) = 19.0.3
Provides: bundled(python3-setuptools) = 40.8.0
%endif
+%{?python_provide:%python_provide python3-libs}
+
# There are files in the standard library that have python shebang.
# We've filtered the automatic requirement out so libs are installable without
# the main package. This however makes it pulled in by default.
@@ -368,6 +373,8 @@ BuildRequires: python-rpm-macros
Requires: python-rpm-macros
Requires: python3-rpm-macros
+%{?python_provide:%python_provide python3-devel}
+
%if %{without bootstrap}
# This is not "API" (packages that need setuptools should still BuildRequire
it)
# However some packages apparently can build both with and without setuptools
@@ -406,6 +413,8 @@ Provides: %{name}-tools = %{version}-%{release}
Provides: %{name}-tools%{?_isa} = %{version}-%{release}
Obsoletes: %{name}-tools < %{version}-%{release}
+%{?python_provide:%python_provide python3-idle}
+
%description idle
IDLE is Pythons Integrated Development and Learning Environment.
@@ -423,6 +432,8 @@ configuration, browsers, and other dialogs.
Summary: A GUI toolkit for Python
Requires: %{name} = %{version}-%{release}
+%{?python_provide:%python_provide python3-tkinter}
+
%description tkinter
The Tkinter (Tk interface) library is a graphical user interface toolkit for
the Python programming language.
@@ -433,6 +444,8 @@ Summary: The self-test suite for the main python3 package
Requires: %{name} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+%{?python_provide:%python_provide python3-test}
+
%description test
The self-test suite for the Python interpreter.
@@ -455,6 +468,8 @@ Requires: %{name}-test%{?_isa} = %{version}-%{release}
Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
Requires: %{name}-idle%{?_isa} = %{version}-%{release}
+%{?python_provide:%python_provide python3-debug}
+
%description debug
python3-debug provides a version of the Python runtime with numerous debugging
features enabled, aimed at advanced Python users such as developers of Python
commit bc1bef742babda61369307e8352f81e1a5e69b28
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jun 26 10:30:21 2019 +0200
Remove the OPENSSL_CONF=/non-existing-file workaround
The test was fixed upstream to expect different config on Fedora.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1618753
(Note that we still keep that on the CI for older Python versions.)
diff --git a/python38.spec b/python38.spec
index d0e347e..b9a8a11 100644
--- a/python38.spec
+++ b/python38.spec
@@ -925,12 +925,6 @@ CheckPython() {
ConfName=$1
ConfDir=$(pwd)/build/$ConfName
- # Fedora sets TLSv1 as explicit minimum version.
- # Python's test suite assumes that the minimum protocol version is set to
- # a magic marker. We workaround the test problem by setting:
- export OPENSSL_CONF=/non-existing-file
- #
https://bugzilla.redhat.com/show_bug.cgi?id=1618753
-
echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
# Note that we're running the tests using the version of the code in the
commit f16aa02ebf66256fb4c82f25548ff827ad7f9b5c
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jul 8 09:48:15 2019 +0200
Remove patch 316
The patch landed in Python in be5bb52f5f2d4da4b9d6f42399f7275ab47910f3
However patch 316 still applied cleanly.
Removing it doesn't make any difference, so not bumping anything.
diff --git a/00316-mark-bdist_wininst-unsupported.patch
b/00316-mark-bdist_wininst-unsupported.patch
deleted file mode 100644
index b54d9e1..0000000
--- a/00316-mark-bdist_wininst-unsupported.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From b4bb0385ffcfafb2a203b0863777b135d37feb3a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
-Date: Thu, 20 Dec 2018 12:46:25 +0100
-Subject: [PATCH 7/7] 00316: Mark bdist_wininst unsupported
-
-We remove the exe files from distutil's bdist_wininst.
-So we mark the command as unsupported - and the tests are skipped.
----
- Lib/distutils/command/bdist_wininst.py | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/Lib/distutils/command/bdist_wininst.py
b/Lib/distutils/command/bdist_wininst.py
-index acaa184b5f..6b458cb364 100644
---- a/Lib/distutils/command/bdist_wininst.py
-+++ b/Lib/distutils/command/bdist_wininst.py
-@@ -12,6 +12,8 @@ from distutils.sysconfig import get_python_version
- from distutils import log
-
- class bdist_wininst(Command):
-+ # Marker for tests that we have the unsupported bdist_wininst
-+ _unsupported = True
-
- description = "create an executable installer for MS Windows"
-
---
-2.21.0
-
diff --git a/python38.spec b/python38.spec
index 1fca8bb..d0e347e 100644
--- a/python38.spec
+++ b/python38.spec
@@ -259,11 +259,6 @@ Patch251: 00251-change-user-install-location.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00316 #
-# We remove the exe files from distutil's bdist_wininst
-# So we mark the command as unsupported - and the tests are skipped
-Patch316: 00316-mark-bdist_wininst-unsupported.patch
-
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -536,7 +531,6 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
-%patch316 -p1
# Remove files that should be generated by the build
commit 13257b57b3fc88a65ec1b5d8454e81243c5f1878
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jul 5 12:10:54 2019 +0200
Update to 3.8.0b2
diff --git a/00001-rpath.patch b/00001-rpath.patch
index fb55f99..c78445d 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,4 +1,4 @@
-From 068ae6b9d422e5deeb950d1354a003025642413a Mon Sep 17 00:00:00 2001
+From 8738c39204297788bcb07940a99608f80592829f Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH 1/7] 00001: Fixup distutils/unixccompiler.py to remove
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 9e03dcc..88d7fbd 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,4 +1,4 @@
-From 1b28c83def441be0e9377058b9a29a1ea3558ae0 Mon Sep 17 00:00:00 2001
+From 6a503d0ad4512af57ef8a784f12bc439701d8cc7 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH 2/7] 00102: Change the various install paths to use
@@ -87,10 +87,10 @@ index 287ab1989e..d4c05e0ab1 100644
check_path(cmd.install_headers,
os.path.join(destination, "include", "python",
"foopkg"))
diff --git a/Lib/site.py b/Lib/site.py
-index ad1146332b..99149a564f 100644
+index a065ab0b5d..22d53fa562 100644
--- a/Lib/site.py
+++ b/Lib/site.py
-@@ -334,11 +334,15 @@ def getsitepackages(prefixes=None):
+@@ -335,11 +335,15 @@ def getsitepackages(prefixes=None):
seen.add(prefix)
if os.sep == '/':
@@ -107,7 +107,7 @@ index ad1146332b..99149a564f 100644
return sitepackages
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
-index 8446c8deb2..cf64d79c4d 100644
+index e76e6927cb..0cfbea54b9 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -20,10 +20,10 @@ __all__ = [
@@ -154,7 +154,7 @@ index 41c4229919..543c88432a 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index a0bc9c1f1c..780118c410 100644
+index 88abb56360..6c2edf32f7 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -143,7 +143,7 @@ LIBDIR= @libdir@
@@ -198,10 +198,10 @@ index 5f80738188..73d7913441 100644
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
diff --git a/configure b/configure
-index b606fc808c..50b578a551 100755
+index 6e7f277bac..6cd8344c21 100755
--- a/configure
+++ b/configure
-@@ -15175,9 +15175,9 @@ fi
+@@ -15181,9 +15181,9 @@ fi
if test x$PLATFORM_TRIPLET = x; then
@@ -214,10 +214,10 @@ index b606fc808c..50b578a551 100755
diff --git a/configure.ac b/configure.ac
-index 3d589ac258..3bb44e6993 100644
+index 324ce0bd99..9a587f3c3f 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4649,9 +4649,9 @@ fi
+@@ -4655,9 +4655,9 @@ fi
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
AC_SUBST(PY_ENABLE_SHARED)
if test x$PLATFORM_TRIPLET = x; then
@@ -230,7 +230,7 @@ index 3d589ac258..3bb44e6993 100644
AC_SUBST(LIBPL)
diff --git a/setup.py b/setup.py
-index 598f5819f8..0685620484 100644
+index edc3434242..59cfc01a2a 100644
--- a/setup.py
+++ b/setup.py
@@ -648,7 +648,7 @@ class PyBuildExt(build_ext):
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index fbfa2f3..2cfeaf0 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,4 +1,4 @@
-From 79544450450248e4967a8b41aa6d08d32d5cd41a Mon Sep 17 00:00:00 2001
+From efbafc6328f45da6d38a1848933a37497206fb3f Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
Subject: [PATCH 3/7] 00111: Don't try to build a libpythonMAJOR.MINOR.a
@@ -21,7 +21,7 @@ Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
1 file changed, 2 insertions(+), 19 deletions(-)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 780118c410..3431ca815e 100644
+index 6c2edf32f7..28c0cead24 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -560,7 +560,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
@@ -55,7 +55,7 @@ index 780118c410..3431ca815e 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
############################################################################
-@@ -1546,17 +1540,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1551,17 +1545,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index 14648d5..124fe81 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,4 +1,4 @@
-From 56d0cce46e634840578af18492f3dffea55774a5 Mon Sep 17 00:00:00 2001
+From 2edaa31dec042fb8720add80814ca4a3cc4f788f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
Subject: [PATCH 4/7] 00189: Instead of bundled wheels, use our RPM packaged
@@ -10,7 +10,7 @@ We keep them in /usr/share/python-wheels
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index 526dfd004a..fc02255feb 100644
+index 6f2569da81..4d17e413db 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -1,16 +1,27 @@
@@ -44,7 +44,7 @@ index 526dfd004a..fc02255feb 100644
_PROJECTS = [
("setuptools", _SETUPTOOLS_VERSION),
-@@ -94,12 +105,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
+@@ -96,12 +107,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
additional_paths = []
for project, version in _PROJECTS:
wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 7ac4ea2..b00e6a7 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,4 +1,4 @@
-From 31460771d57aa535ed4672547d268c38f9eed755 Mon Sep 17 00:00:00 2001
+From 3e26b01573488b015065139689be3aa47dac17cf Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
Subject: [PATCH 5/7] 00251: Change user install location
@@ -40,10 +40,10 @@ index ae4f915669..0e4fd5b74a 100644
else:
if self.exec_prefix is None:
diff --git a/Lib/site.py b/Lib/site.py
-index 99149a564f..1107324848 100644
+index 22d53fa562..9513526109 100644
--- a/Lib/site.py
+++ b/Lib/site.py
-@@ -347,7 +347,14 @@ def getsitepackages(prefixes=None):
+@@ -348,7 +348,14 @@ def getsitepackages(prefixes=None):
return sitepackages
def addsitepackages(known_paths, prefixes=None):
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index c5e92b2..63f23f5 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,4 +1,4 @@
-From d63983e350f673cf9a5f4267e73475535432ebe7 Mon Sep 17 00:00:00 2001
+From b92e29a8cc17f9c02a08b7a005e5ece71a409a0b Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
Subject: [PATCH 6/7] 00274: Upstream uses Debian-style architecture naming,
@@ -29,7 +29,7 @@ index ba37cf99e2..52a9ec6662 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index 3bb44e6993..98b5e32ad9 100644
+index 9a587f3c3f..695ff85e4b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -741,9 +741,9 @@ cat >> conftest.c <<EOF
diff --git a/00316-mark-bdist_wininst-unsupported.patch
b/00316-mark-bdist_wininst-unsupported.patch
index 7db6e4d..b54d9e1 100644
--- a/00316-mark-bdist_wininst-unsupported.patch
+++ b/00316-mark-bdist_wininst-unsupported.patch
@@ -1,4 +1,4 @@
-From 736a0ca9fd2ee3f74ebdef187c5616288cc70351 Mon Sep 17 00:00:00 2001
+From b4bb0385ffcfafb2a203b0863777b135d37feb3a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 20 Dec 2018 12:46:25 +0100
Subject: [PATCH 7/7] 00316: Mark bdist_wininst unsupported
@@ -10,7 +10,7 @@ So we mark the command as unsupported - and the tests are skipped.
1 file changed, 2 insertions(+)
diff --git a/Lib/distutils/command/bdist_wininst.py
b/Lib/distutils/command/bdist_wininst.py
-index 3a616883be..ba299a4028 100644
+index acaa184b5f..6b458cb364 100644
--- a/Lib/distutils/command/bdist_wininst.py
+++ b/Lib/distutils/command/bdist_wininst.py
@@ -12,6 +12,8 @@ from distutils.sysconfig import get_python_version
diff --git a/python38.spec b/python38.spec
index 3f40c79..1fca8bb 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel b1
+%global prerel b2
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
Release: 1%{?dist}
@@ -1477,6 +1477,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Jul 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b2-1
+- Update to 3.8.0b2
+
* Wed Jun 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b1-1
- Update to 3.8.0b1
diff --git a/sources b/sources
index 663a3ab..b6aaea1 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0b1.tar.xz) =
0e2547691fde3a88408211146cd3be0de8e3e79c11485aec1062c17fabccefbcf2c1b188c96e570387f86b2e1b6a2fcbbb7329b241ff978974ca43e01ef014ca
+SHA512 (Python-3.8.0b2.tar.xz) =
5d4fdabad098b5273d34ecd939e7f7c104f4f9fc1460e5abaf4a8d1ad1c5d2ff26d579de03106f000672e0a20fcd6e4e1e44ce03be4bb4a734f937f3cc81cb3e
commit b6a6e97b8fa0c4322cb62677644c07b52aae1716
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jun 28 10:34:48 2019 +0200
Don't skip so many tests on the CI
test_wsgiref is tracked in
https://bugs.python.org/issue37411
diff --git a/tests/tests.yml b/tests/tests.yml
index ccc6808..6d53a9c 100644
--- a/tests/tests.yml
+++ b/tests/tests.yml
@@ -13,7 +13,7 @@
run: VERSION=3.8 ./venv.sh
- selftest:
dir: python/selftest
- run: VERSION=3.8 X="-x test_socket -x test_asyncgen -x test_asyncio -x
test_compile -x test_concurrent_futures -x test_itertools -x test_multiprocessing_fork -x
test_multiprocessing_forkserver -x test_shutil -x test_time -x test_multiprocessing_spawn
-x test_threading -x test_wsgiref" ./parallel.sh
+ run: VERSION=3.8 X="-x test_wsgiref" ./parallel.sh
required_packages:
- gcc # for extension building in venv and selftest
- gdb # for test_gdb
commit 949410ed57834259ee4c891af64c76ff3f784ce9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jun 28 13:12:55 2019 +0200
Fedora CI: Provision 3 GiB of RAM
diff --git a/tests/.fmf/version b/tests/.fmf/version
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/tests/.fmf/version
@@ -0,0 +1 @@
+1
diff --git a/tests/provision.fmf b/tests/provision.fmf
new file mode 100644
index 0000000..1a4f0f0
--- /dev/null
+++ b/tests/provision.fmf
@@ -0,0 +1,4 @@
+---
+standard-inventory-qcow2:
+ qemu:
+ m: 3G # Amount of VM memory
commit 17d397670a1f5942c051038baeafa66ebcd68528
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Mon Jun 17 17:29:58 2019 +0200
Skip test_distutils if bootstraping, use python3.X for regen-all
diff --git a/python38.spec b/python38.spec
index 73113c4..3f40c79 100644
--- a/python38.spec
+++ b/python38.spec
@@ -204,8 +204,8 @@ BuildRequires: python-pip-wheel
%endif
%if %{without bootstrap}
-# for make regen-all
-BuildRequires: python3
+# for make regen-all and distutils.tests.test_bdist_rpm
+BuildRequires: python%{pyshortver}
%endif
# =======================
@@ -625,7 +625,7 @@ BuildPython() {
%if %{without bootstrap}
# Regenerate generated files (needs python3)
- %make_build regen-all PYTHON_FOR_REGEN="python3"
+ %make_build regen-all PYTHON_FOR_REGEN="python%{pybasever}"
%endif
@@ -952,8 +952,14 @@ CheckPython() {
#
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
# test_asyncio skipped:
#
https://bugs.python.org/issue35998
+ # test_distutils
+ # distutils.tests.test_bdist_rpm tests fail when bootstraping the Python
+ # package: rpmbuild requires /usr/bin/pythonX.Y to be installed
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
-wW --slowest -j0 \
+ %if %{with bootstrap}
+ -x test_distutils \
+ %endif
%ifarch %{arm} s390x
-x test_gdb \
%endif
commit 3a6f3f6941b5212d29a61908a51ab0656f2ed8af
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Tue Jun 11 15:01:09 2019 +0200
Reenable test_distutils and test_bdist_rpm
Resolves: rhbz#1685557
diff --git a/python38.spec b/python38.spec
index b7f69fc..73113c4 100644
--- a/python38.spec
+++ b/python38.spec
@@ -954,8 +954,6 @@ CheckPython() {
#
https://bugs.python.org/issue35998
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
-wW --slowest -j0 \
- -x test_distutils \
- -x test_bdist_rpm \
%ifarch %{arm} s390x
-x test_gdb \
%endif
commit a292838ccc250a7dc575efe316a347cc6f53dcc3
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jun 5 09:14:07 2019 +0200
Update to 3.8.0b1
diff --git a/00001-rpath.patch b/00001-rpath.patch
index 504d2cc..fb55f99 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,4 +1,4 @@
-From 39b5f58db91eea63fae2883c74f8a3f7fe49bc17 Mon Sep 17 00:00:00 2001
+From 068ae6b9d422e5deeb950d1354a003025642413a Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH 1/7] 00001: Fixup distutils/unixccompiler.py to remove
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 40da29f..9e03dcc 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,4 +1,4 @@
-From c601ae9643cda53d9e1b898ea941bf9207c9f2f6 Mon Sep 17 00:00:00 2001
+From 1b28c83def441be0e9377058b9a29a1ea3558ae0 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
Subject: [PATCH 2/7] 00102: Change the various install paths to use
@@ -154,7 +154,7 @@ index 41c4229919..543c88432a 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 75eb66be3c..f1e21784af 100644
+index a0bc9c1f1c..780118c410 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -143,7 +143,7 @@ LIBDIR= @libdir@
@@ -167,28 +167,28 @@ index 75eb66be3c..f1e21784af 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index 3991ad719c..1baf8a2ff4 100644
+index 5f80738188..73d7913441 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
-@@ -688,7 +688,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
+@@ -689,7 +689,7 @@ calculate_exec_prefix(const PyConfig *config,
if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0)
{
return PATHLEN_ERR();
}
-- err = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len);
-+ err = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len);
- if (_Py_INIT_FAILED(err)) {
- return 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;
}
-@@ -1015,7 +1015,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t
*prefix)
+@@ -1016,7 +1016,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t
*prefix)
return PATHLEN_ERR();
}
}
-- err = joinpath(calculate->zip_path, L"lib/python00.zip",
zip_path_len);
-+ err = joinpath(calculate->zip_path, L"lib64/python00.zip",
zip_path_len);
- if (_Py_INIT_FAILED(err)) {
- return err;
+- status = joinpath(calculate->zip_path, L"lib/python00.zip",
zip_path_len);
++ status = joinpath(calculate->zip_path, L"lib64/python00.zip",
zip_path_len);
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
}
-@@ -1144,7 +1144,7 @@ calculate_init(PyCalculatePath *calculate,
+@@ -1145,7 +1145,7 @@ calculate_init(PyCalculatePath *calculate,
if (!calculate->prefix) {
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
@@ -198,10 +198,10 @@ index 3991ad719c..1baf8a2ff4 100644
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
diff --git a/configure b/configure
-index e6e4007351..b01e6fa9b7 100755
+index b606fc808c..50b578a551 100755
--- a/configure
+++ b/configure
-@@ -15159,9 +15159,9 @@ fi
+@@ -15175,9 +15175,9 @@ fi
if test x$PLATFORM_TRIPLET = x; then
@@ -214,10 +214,10 @@ index e6e4007351..b01e6fa9b7 100755
diff --git a/configure.ac b/configure.ac
-index a02597da2d..7f86f286b6 100644
+index 3d589ac258..3bb44e6993 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -4653,9 +4653,9 @@ fi
+@@ -4649,9 +4649,9 @@ fi
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
AC_SUBST(PY_ENABLE_SHARED)
if test x$PLATFORM_TRIPLET = x; then
@@ -230,10 +230,10 @@ index a02597da2d..7f86f286b6 100644
AC_SUBST(LIBPL)
diff --git a/setup.py b/setup.py
-index 96a49b4e35..64420838af 100644
+index 598f5819f8..0685620484 100644
--- a/setup.py
+++ b/setup.py
-@@ -610,7 +610,7 @@ class PyBuildExt(build_ext):
+@@ -648,7 +648,7 @@ class PyBuildExt(build_ext):
# directories (i.e. '.' and 'Include') must be first. See
issue
# 10520.
if not CROSS_COMPILING:
@@ -242,7 +242,7 @@ index 96a49b4e35..64420838af 100644
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:
-@@ -906,11 +906,11 @@ class PyBuildExt(build_ext):
+@@ -944,11 +944,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
elif self.compiler.find_library_file(self.lib_dirs +
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 6d1dc16..fbfa2f3 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,4 +1,4 @@
-From 0acdfa7c697ffb1087ded14819c7dcfe4784ca7c Mon Sep 17 00:00:00 2001
+From 79544450450248e4967a8b41aa6d08d32d5cd41a Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
Subject: [PATCH 3/7] 00111: Don't try to build a libpythonMAJOR.MINOR.a
@@ -21,10 +21,10 @@ Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
1 file changed, 2 insertions(+), 19 deletions(-)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index f1e21784af..414aa96008 100644
+index 780118c410..3431ca815e 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -559,7 +559,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+@@ -560,7 +560,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
# Build the interpreter
@@ -33,7 +33,7 @@ index f1e21784af..414aa96008 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -607,12 +607,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -608,12 +608,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -46,7 +46,7 @@ index f1e21784af..414aa96008 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM); \
-@@ -690,7 +684,7 @@ Makefile Modules/config.c: Makefile.pre \
+@@ -691,7 +685,7 @@ Makefile Modules/config.c: Makefile.pre \
@echo "The Makefile was updated, you may need to re-run make."
@@ -55,7 +55,7 @@ index f1e21784af..414aa96008 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
############################################################################
-@@ -1532,17 +1526,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1546,17 +1540,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index e75f6a8..14648d5 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,4 +1,4 @@
-From 7bb76d766aa5394e845f656b3f68b7910e9ee4e6 Mon Sep 17 00:00:00 2001
+From 56d0cce46e634840578af18492f3dffea55774a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
Subject: [PATCH 4/7] 00189: Instead of bundled wheels, use our RPM packaged
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 4c19ac8..7ac4ea2 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,4 +1,4 @@
-From 377daf65817790e78ccec966221724f4523693c1 Mon Sep 17 00:00:00 2001
+From 31460771d57aa535ed4672547d268c38f9eed755 Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
Subject: [PATCH 5/7] 00251: Change user install location
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index 16a8b9e..c5e92b2 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,4 +1,4 @@
-From e9def22e31801d9d75017e6752d3daf4099bc836 Mon Sep 17 00:00:00 2001
+From d63983e350f673cf9a5f4267e73475535432ebe7 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
Subject: [PATCH 6/7] 00274: Upstream uses Debian-style architecture naming,
@@ -29,10 +29,10 @@ index ba37cf99e2..52a9ec6662 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index 7f86f286b6..6d7430e014 100644
+index 3bb44e6993..98b5e32ad9 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -740,9 +740,9 @@ cat >> conftest.c <<EOF
+@@ -741,9 +741,9 @@ cat >> conftest.c <<EOF
alpha-linux-gnu
# elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
@@ -44,7 +44,7 @@ index 7f86f286b6..6d7430e014 100644
# endif
# elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
-@@ -782,7 +782,7 @@ cat >> conftest.c <<EOF
+@@ -783,7 +783,7 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64el-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
@@ -53,7 +53,7 @@ index 7f86f286b6..6d7430e014 100644
# else
# error unknown platform triplet
# endif
-@@ -792,22 +792,22 @@ cat >> conftest.c <<EOF
+@@ -793,22 +793,22 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
diff --git a/00316-mark-bdist_wininst-unsupported.patch
b/00316-mark-bdist_wininst-unsupported.patch
index db7d27c..7db6e4d 100644
--- a/00316-mark-bdist_wininst-unsupported.patch
+++ b/00316-mark-bdist_wininst-unsupported.patch
@@ -1,4 +1,4 @@
-From a44fa78c34634c580e3f5922aed600d7a777fe93 Mon Sep 17 00:00:00 2001
+From 736a0ca9fd2ee3f74ebdef187c5616288cc70351 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 20 Dec 2018 12:46:25 +0100
Subject: [PATCH 7/7] 00316: Mark bdist_wininst unsupported
diff --git a/python38.spec b/python38.spec
index 90eb418..b7f69fc 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,10 +14,10 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel a4
+%global prerel b1
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 2%{?dist}
+Release: 1%{?dist}
License: Python
@@ -882,6 +882,7 @@ rm %{buildroot}%{_bindir}/2to3
rm %{buildroot}%{_libdir}/libpython3.so
rm %{buildroot}%{_mandir}/man1/python3.1*
rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+rm %{buildroot}%{_libdir}/pkgconfig/python3-embed.pc
%endif
@@ -1184,6 +1185,11 @@ CheckPython optimized
%{pylibdir}/importlib/*.py
%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
+%dir %{pylibdir}/importlib/metadata/
+%dir %{pylibdir}/importlib/metadata/__pycache__/
+%{pylibdir}/importlib/metadata/*.py
+%{pylibdir}/importlib/metadata/__pycache__/*%{bytecode_suffixes}
+
%dir %{pylibdir}/json/
%dir %{pylibdir}/json/__pycache__/
%{pylibdir}/json/*.py
@@ -1243,6 +1249,7 @@ CheckPython optimized
%if %{without flatpackage}
%{_bindir}/python3-config
%{_libdir}/pkgconfig/python3.pc
+%{_libdir}/pkgconfig/python3-embed.pc
%{_bindir}/pathfix.py
%{_bindir}/pygettext3.py
%{_bindir}/msgfmt3.py
@@ -1256,7 +1263,9 @@ CheckPython optimized
%{_bindir}/python%{LDVERSION_optimized}-*-config
%{_libdir}/libpython%{LDVERSION_optimized}.so
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
+%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}-embed.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
+%{_libdir}/pkgconfig/python-%{pybasever}-embed.pc
%if %{without flatpackage}
@@ -1424,6 +1433,7 @@ CheckPython optimized
%{_libdir}/libpython%{LDVERSION_debug}.so
%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
+%{_libdir}/pkgconfig/python-%{LDVERSION_debug}-embed.pc
# Analog of the -tools subpackage's files:
# None for now; we could build precanned versions that have the appropriate
@@ -1463,6 +1473,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Jun 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~b1-1
+- Update to 3.8.0b1
+
* Fri May 17 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-2
- Remove a faulty patch that resulted in invalid value of
distutils.sysconfig.get_config_var('LIBPL') (#1710767)
diff --git a/sources b/sources
index 4536033..663a3ab 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0a4.tar.xz) =
76088206e3eb4ff0b9060f35e0bf994018452cc98d7f576bf7d6842158a6f6ae173b281c442f1175402428c683667b7bacebb2b989a561a9f12db1ad5f0f42cb
+SHA512 (Python-3.8.0b1.tar.xz) =
0e2547691fde3a88408211146cd3be0de8e3e79c11485aec1062c17fabccefbcf2c1b188c96e570387f86b2e1b6a2fcbbb7329b241ff978974ca43e01ef014ca
commit 7aab0ddc87c4c8476c8077800e765e52480fbc4d
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri May 17 13:24:33 2019 +0200
Remove Patch178, merge Patch205 into Patch102
Fixes invalid value of distutils.sysconfig.get_config_var('LIBPL').
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1710767
GitHub PR:
https://github.com/fedora-python/cpython/pull/2
diff --git a/00001-rpath.patch b/00001-rpath.patch
index e18f37f..504d2cc 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,7 +1,7 @@
From 39b5f58db91eea63fae2883c74f8a3f7fe49bc17 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
-Subject: [PATCH 1/9] 00001: Fixup distutils/unixccompiler.py to remove
+Subject: [PATCH 1/7] 00001: Fixup distutils/unixccompiler.py to remove
standard library path from rpath Was Patch0 in ivazquez' python3000 specfile
---
diff --git a/00102-lib64.patch b/00102-lib64.patch
index a22ec7b..40da29f 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,7 +1,7 @@
-From 972d1ce207285b7b29407b95ea6519c289c71d89 Mon Sep 17 00:00:00 2001
+From c601ae9643cda53d9e1b898ea941bf9207c9f2f6 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed, 13 Jan 2010 21:25:18 +0000
-Subject: [PATCH 2/9] 00102: Change the various install paths to use
+Subject: [PATCH 2/7] 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
@@ -27,8 +27,10 @@ Co-authored-by: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Lib/test/test_site.py | 4 ++--
Makefile.pre.in | 2 +-
Modules/getpath.c | 6 +++---
+ configure | 4 ++--
+ configure.ac | 4 ++--
setup.py | 6 +++---
- 9 files changed, 28 insertions(+), 19 deletions(-)
+ 11 files changed, 32 insertions(+), 23 deletions(-)
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
index c625c95bf7..ae4f915669 100644
@@ -195,6 +197,38 @@ index 3991ad719c..1baf8a2ff4 100644
if (!calculate->lib_python) {
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
+diff --git a/configure b/configure
+index e6e4007351..b01e6fa9b7 100755
+--- a/configure
++++ b/configure
+@@ -15159,9 +15159,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
+
+
+diff --git a/configure.ac b/configure.ac
+index a02597da2d..7f86f286b6 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -4653,9 +4653,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)
+
diff --git a/setup.py b/setup.py
index 96a49b4e35..64420838af 100644
--- a/setup.py
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index d89455d..6d1dc16 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,7 +1,7 @@
-From 031249155111abf6e971fff6516c4e828c394c05 Mon Sep 17 00:00:00 2001
+From 0acdfa7c697ffb1087ded14819c7dcfe4784ca7c Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon, 18 Jan 2010 17:59:07 +0000
-Subject: [PATCH 3/9] 00111: Don't try to build a libpythonMAJOR.MINOR.a
+Subject: [PATCH 3/7] 00111: Don't try to build a libpythonMAJOR.MINOR.a
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/00178-dont-duplicate-flags-in-sysconfig.patch
b/00178-dont-duplicate-flags-in-sysconfig.patch
deleted file mode 100644
index 4bbfed3..0000000
--- a/00178-dont-duplicate-flags-in-sysconfig.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From b9a703e3d37e325defe5baec111e1fbf5d42bede Mon Sep 17 00:00:00 2001
-From: Bohuslav Kabrda <bkabrda(a)redhat.com>
-Date: Wed, 10 Apr 2013 14:30:09 +0200
-Subject: [PATCH 4/9] 00178: Don't duplicate various FLAGS in sysconfig values
-
-http://bugs.python.org/issue17679
-
-Does not affect python2 AFAICS (different sysconfig values initialization)
----
- Lib/distutils/sysconfig.py | 5 ++++-
- Lib/sysconfig.py | 5 ++++-
- 2 files changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
-index 9a4892a737..ad4cef088b 100644
---- a/Lib/distutils/sysconfig.py
-+++ b/Lib/distutils/sysconfig.py
-@@ -373,7 +373,10 @@ def parse_makefile(fn, g=None):
- done[n] = item = ""
- if found:
- after = value[m.end():]
-- value = value[:m.start()] + item + after
-+ value = value[:m.start()]
-+ if item.strip() not in value:
-+ value += item
-+ value += after
- if "$" in after:
- notdone[name] = value
- else:
-diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
-index cf64d79c4d..fd972d658c 100644
---- a/Lib/sysconfig.py
-+++ b/Lib/sysconfig.py
-@@ -295,7 +295,10 @@ def _parse_makefile(filename, vars=None):
-
- if found:
- after = value[m.end():]
-- value = value[:m.start()] + item + after
-+ value = value[:m.start()]
-+ if item.strip() not in value:
-+ value += item
-+ value += after
- if "$" in after:
- notdone[name] = value
- else:
---
-2.21.0
-
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index 91cdb01..e75f6a8 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,7 +1,7 @@
-From 0f59810bb72d2092729346c17e96bf0c23120ee1 Mon Sep 17 00:00:00 2001
+From 7bb76d766aa5394e845f656b3f68b7910e9ee4e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Wed, 15 Aug 2018 15:36:29 +0200
-Subject: [PATCH 5/9] 00189: Instead of bundled wheels, use our RPM packaged
+Subject: [PATCH 4/7] 00189: Instead of bundled wheels, use our RPM packaged
wheels
We keep them in /usr/share/python-wheels
diff --git a/00205-make-libpl-respect-lib64.patch b/00205-make-libpl-respect-lib64.patch
deleted file mode 100644
index ddd0021..0000000
--- a/00205-make-libpl-respect-lib64.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 5ee8362bd5cc991b956efa9cf06eb6ad2607f57c Mon Sep 17 00:00:00 2001
-From: Robert Kuska <rkuska(a)redhat.com>
-Date: Mon, 21 Sep 2015 15:55:00 +0200
-Subject: [PATCH 6/9] 00205: Make LIBPL variable respect the libdir macro
-
-LIBPL variable in Makefile takes LIBPL from configure.ac,
-but the LIBPL variable defined there doesn't respect the libdir macro.
-
-Co-authored-by: Robert Kuska <rkuska(a)redhat.com>
-Co-authored-by: Charalampos Stratakis <cstratak(a)redhat.com>
----
- Makefile.pre.in | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 414aa96008..a07bd6718d 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -1512,7 +1512,7 @@ inclinstall:
-
- # Install the library and miscellaneous stuff needed for extending/embedding
- # This goes into $(exec_prefix)
--LIBPL= @LIBPL@
-+LIBPL= $(LIBDEST)/config-$(LDVERSION)-$(MULTIARCH)
-
- # pkgconfig directory
- LIBPC= $(LIBDIR)/pkgconfig
---
-2.21.0
-
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 1775b6c..4c19ac8 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,7 +1,7 @@
-From e9d8db2d243cf27b66083e0c6a9bb5d28866f937 Mon Sep 17 00:00:00 2001
+From 377daf65817790e78ccec966221724f4523693c1 Mon Sep 17 00:00:00 2001
From: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Mon, 26 Jun 2017 16:32:56 +0200
-Subject: [PATCH 7/9] 00251: Change user install location
+Subject: [PATCH 5/7] 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
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index b8453a2..16a8b9e 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,7 +1,7 @@
-From e108d7026aab241d89ff3a90d6421af3e9ee8e12 Mon Sep 17 00:00:00 2001
+From e9def22e31801d9d75017e6752d3daf4099bc836 Mon Sep 17 00:00:00 2001
From: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon, 28 Aug 2017 17:16:46 +0200
-Subject: [PATCH 8/9] 00274: Upstream uses Debian-style architecture naming,
+Subject: [PATCH 6/7] 00274: Upstream uses Debian-style architecture naming,
change to match Fedora
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
@@ -29,7 +29,7 @@ index ba37cf99e2..52a9ec6662 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index a02597da2d..5742ef4176 100644
+index 7f86f286b6..6d7430e014 100644
--- a/configure.ac
+++ b/configure.ac
@@ -740,9 +740,9 @@ cat >> conftest.c <<EOF
diff --git a/00316-mark-bdist_wininst-unsupported.patch
b/00316-mark-bdist_wininst-unsupported.patch
index b6174c8..db7d27c 100644
--- a/00316-mark-bdist_wininst-unsupported.patch
+++ b/00316-mark-bdist_wininst-unsupported.patch
@@ -1,7 +1,7 @@
-From 1ef328c38ad0ef7fad1652edddd3710885b0a778 Mon Sep 17 00:00:00 2001
+From a44fa78c34634c580e3f5922aed600d7a777fe93 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
Date: Thu, 20 Dec 2018 12:46:25 +0100
-Subject: [PATCH 9/9] 00316: Mark bdist_wininst unsupported
+Subject: [PATCH 7/7] 00316: Mark bdist_wininst unsupported
We remove the exe files from distutil's bdist_wininst.
So we mark the command as unsupported - and the tests are skipped.
diff --git a/python38.spec b/python38.spec
index 782e59d..90eb418 100644
--- a/python38.spec
+++ b/python38.spec
@@ -17,7 +17,7 @@ URL:
https://www.python.org/
%global prerel a4
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -243,22 +243,11 @@ Patch102: 00102-lib64.patch
# Downstream only: not appropriate for upstream
Patch111: 00111-no-static-lib.patch
-# 00178 #
-# Don't duplicate various FLAGS in sysconfig values
-#
http://bugs.python.org/issue17679
-# Does not affect python2 AFAICS (different sysconfig values initialization)
-Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
-
# 00189 #
# Instead of bundled wheels, use our RPM packaged wheels from
# /usr/share/python-wheels
Patch189: 00189-use-rpm-wheels.patch
-# 00205 #
-# LIBPL variable in makefile takes LIBPL from configure.ac
-# but the LIBPL variable defined there doesn't respect libdir macro
-Patch205: 00205-make-libpl-respect-lib64.patch
-
# 00251
# Set values of prefix and exec_prefix in distutils install command
# to /usr/local if executable is /usr/bin/python* and RPM build
@@ -539,14 +528,12 @@ rm -r Modules/expat
%patch102 -p1
%endif
%patch111 -p1
-%patch178 -p1
%if %{with rpmwheels}
%patch189 -p1
rm Lib/ensurepip/_bundled/*.whl
%endif
-%patch205 -p1
%patch251 -p1
%patch274 -p1
%patch316 -p1
@@ -1476,6 +1463,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri May 17 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-2
+- Remove a faulty patch that resulted in invalid value of
+ distutils.sysconfig.get_config_var('LIBPL') (#1710767)
+
* Tue May 07 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-1
- Update to 3.8.0a4
commit 9fbe2eee9d33879a17d01285d115b1cabb7240fb
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu May 16 10:33:14 2019 +0200
rpmlint: Filter out shared-lib-without-dependency-information
Since Python 3.8.0a4, extension modules are no longer linked against
libpython3.8.so.1.0. As a result, some of them are not linked against
anything at all.
And that is fine. They are not used as standard shared libraries.
diff --git a/python38.rpmlintrc b/python38.rpmlintrc
index e1e2cbe..1314d45 100644
--- a/python38.rpmlintrc
+++ b/python38.rpmlintrc
@@ -72,7 +72,9 @@ addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
\[Errno 2\]')
addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
# Python modules don't need to be linked against libc
+# Since 3.8 they are no longer linked against libpython3.8.so.1.0
addFilter(r'E: library-not-linked-against-libc
/usr/lib(64)?/python3.\d/lib-dynload/')
+addFilter(r'E: shared-lib-without-dependency-information
/usr/lib(64)?/python3.\d/lib-dynload/')
# SPELLING ERRORS
addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
commit 7e0c12521734cfcf7f848a77e2b869c71c641fbe
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Apr 25 18:55:05 2019 +0200
Regenerate generated files with python3
Switch to %make_build when touching this
Fixes
https://bugzilla.redhat.com/show_bug.cgi?id=1377240
diff --git a/python38.spec b/python38.spec
index 49041de..782e59d 100644
--- a/python38.spec
+++ b/python38.spec
@@ -203,6 +203,10 @@ BuildRequires: python-setuptools-wheel
BuildRequires: python-pip-wheel
%endif
+%if %{without bootstrap}
+# for make regen-all
+BuildRequires: python3
+%endif
# =======================
# Source code and patches
@@ -632,8 +636,14 @@ BuildPython() {
$ExtraConfigArgs \
%{nil}
+%if %{without bootstrap}
+ # Regenerate generated files (needs python3)
+ %make_build regen-all PYTHON_FOR_REGEN="python3"
+%endif
+
+
# Invoke the build
- make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
+ %make_build EXTRA_CFLAGS="$CFLAGS $MoreCFlags"
popd
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
commit 285f5549c610fb22fc5bea4cc2c7bb203a600d7b
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue May 7 17:13:12 2019 +0200
Update to 3.8.0a4
Patches rebased via git, see
https://github.com/fedora-python/cpython/tree/fedora-3.8.0a4
ABIFLAGS changed not to contain m, see
https://bugs.python.org/issue36707
diff --git a/00001-rpath.patch b/00001-rpath.patch
index 9fae54c..e18f37f 100644
--- a/00001-rpath.patch
+++ b/00001-rpath.patch
@@ -1,7 +1,18 @@
-diff -up Python-3.1.1/Lib/distutils/unixccompiler.py.rpath
Python-3.1.1/Lib/distutils/unixccompiler.py
---- Python-3.1.1/Lib/distutils/unixccompiler.py.rpath 2009-09-04 17:29:34.000000000
-0400
-+++ Python-3.1.1/Lib/distutils/unixccompiler.py 2009-09-04 17:49:54.000000000 -0400
-@@ -141,6 +141,15 @@ class UnixCCompiler(CCompiler):
+From 39b5f58db91eea63fae2883c74f8a3f7fe49bc17 Mon Sep 17 00:00:00 2001
+From: David Malcolm <dmalcolm(a)redhat.com>
+Date: Wed, 13 Jan 2010 21:25:18 +0000
+Subject: [PATCH 1/9] 00001: Fixup distutils/unixccompiler.py to remove
+ standard library path from rpath Was Patch0 in ivazquez' python3000 specfile
+
+---
+ Lib/distutils/unixccompiler.py | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
+index d10a78da31..4df4b67810 100644
+--- a/Lib/distutils/unixccompiler.py
++++ b/Lib/distutils/unixccompiler.py
+@@ -82,6 +82,15 @@ class UnixCCompiler(CCompiler):
if sys.platform == "cygwin":
exe_extension = ".exe"
@@ -17,3 +28,6 @@ diff -up Python-3.1.1/Lib/distutils/unixccompiler.py.rpath
Python-3.1.1/Lib/dist
def preprocess(self, source, output_file=None, macros=None,
include_dirs=None, extra_preargs=None, extra_postargs=None):
fixed_args = self._fix_compile_args(None, macros, include_dirs)
+--
+2.21.0
+
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 33b2422..a22ec7b 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,5 +1,37 @@
+From 972d1ce207285b7b29407b95ea6519c289c71d89 Mon Sep 17 00:00:00 2001
+From: David Malcolm <dmalcolm(a)redhat.com>
+Date: Wed, 13 Jan 2010 21:25:18 +0000
+Subject: [PATCH 2/9] 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(a)redhat.com>
+Co-authored-by: Thomas Spura <tomspur(a)fedoraproject.org>
+Co-authored-by: Slavek Kabrda <bkabrda(a)redhat.com>
+Co-authored-by: Matej Stuchlik <mstuchli(a)redhat.com>
+Co-authored-by: Tomas Orsava <torsava(a)redhat.com>
+Co-authored-by: Charalampos Stratakis <cstratak(a)redhat.com>
+Co-authored-by: Petr Viktorin <pviktori(a)redhat.com>
+Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
+Co-authored-by: Iryna Shcherbina <shcherbina.iryna(a)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 +++---
+ setup.py | 6 +++---
+ 9 files changed, 28 insertions(+), 19 deletions(-)
+
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
-index 0258d3d..4b969bf 100644
+index c625c95bf7..ae4f915669 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
@@ -20,10 +52,10 @@ index 0258d3d..4b969bf 100644
'scripts': '$base/bin',
'data' : '$base',
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
-index e07a6c8..554740d 100644
+index b51629eb94..9a4892a737 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
-@@ -140,8 +140,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
+@@ -146,8 +146,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
prefix = plat_specific and EXEC_PREFIX or PREFIX
if os.name == "posix":
@@ -38,7 +70,7 @@ index e07a6c8..554740d 100644
return libpython
else:
diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py
-index 287ab19..d4c05e0 100644
+index 287ab1989e..d4c05e0ab1 100644
--- a/Lib/distutils/tests/test_install.py
+++ b/Lib/distutils/tests/test_install.py
@@ -57,8 +57,9 @@ class InstallTestCase(support.TempdirManager,
@@ -53,7 +85,7 @@ index 287ab19..d4c05e0 100644
check_path(cmd.install_headers,
os.path.join(destination, "include", "python",
"foopkg"))
diff --git a/Lib/site.py b/Lib/site.py
-index 7dc1b04..85016b4 100644
+index ad1146332b..99149a564f 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -334,11 +334,15 @@ def getsitepackages(prefixes=None):
@@ -73,7 +105,7 @@ index 7dc1b04..85016b4 100644
return sitepackages
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
-index 9ee4d31..53c8606 100644
+index 8446c8deb2..cf64d79c4d 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -20,10 +20,10 @@ __all__ = [
@@ -105,7 +137,7 @@ index 9ee4d31..53c8606 100644
'scripts': '{userbase}/bin',
'data': '{userbase}',
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
-index 266adf0..e8513b6 100644
+index 41c4229919..543c88432a 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -266,8 +266,8 @@ class HelperFunctionsTests(unittest.TestCase):
@@ -120,10 +152,10 @@ index 266adf0..e8513b6 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 59ba9d4..5780ed8 100644
+index 75eb66be3c..f1e21784af 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -140,7 +140,7 @@ LIBDIR= @libdir@
+@@ -143,7 +143,7 @@ LIBDIR= @libdir@
MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
@@ -133,7 +165,7 @@ index 59ba9d4..5780ed8 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index dd188c6..6e69eed 100644
+index 3991ad719c..1baf8a2ff4 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -688,7 +688,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
@@ -164,7 +196,7 @@ index dd188c6..6e69eed 100644
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
diff --git a/setup.py b/setup.py
-index 0258d3d..4b969bf 100644
+index 96a49b4e35..64420838af 100644
--- a/setup.py
+++ b/setup.py
@@ -610,7 +610,7 @@ class PyBuildExt(build_ext):
@@ -176,7 +208,7 @@ index 0258d3d..4b969bf 100644
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:
-@@ -902,11 +902,11 @@ class PyBuildExt(build_ext):
+@@ -906,11 +906,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
elif self.compiler.find_library_file(self.lib_dirs +
@@ -190,3 +222,6 @@ index 0258d3d..4b969bf 100644
extra_link_args=readline_extra_link_args,
libraries=readline_libs))
else:
+--
+2.21.0
+
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 3d667e9..d89455d 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,8 +1,30 @@
+From 031249155111abf6e971fff6516c4e828c394c05 Mon Sep 17 00:00:00 2001
+From: David Malcolm <dmalcolm(a)redhat.com>
+Date: Mon, 18 Jan 2010 17:59:07 +0000
+Subject: [PATCH 3/9] 00111: Don't try to build a libpythonMAJOR.MINOR.a
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Downstream only: not appropriate for upstream.
+
+See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
+
+Co-authored-by: David Malcolm <dmalcolm(a)redhat.com>
+Co-authored-by: Bohuslav Kabrda <bkabrda(a)redhat.com>
+Co-authored-by: Matej Stuchlik <mstuchli(a)redhat.com>
+Co-authored-by: Robert Kuska <rkuska(a)redhat.com>
+Co-authored-by: Charalampos Stratakis <cstratak(a)redhat.com>
+Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
+---
+ Makefile.pre.in | 21 ++-------------------
+ 1 file changed, 2 insertions(+), 19 deletions(-)
+
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index f8ff1ce..f297d05 100644
+index f1e21784af..414aa96008 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -573,7 +573,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+@@ -559,7 +559,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
# Build the interpreter
@@ -11,7 +33,7 @@ index f8ff1ce..f297d05 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -621,12 +621,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -607,12 +607,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -24,7 +46,7 @@ index f8ff1ce..f297d05 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM); \
-@@ -704,7 +698,7 @@ Makefile Modules/config.c: Makefile.pre \
+@@ -690,7 +684,7 @@ Makefile Modules/config.c: Makefile.pre \
@echo "The Makefile was updated, you may need to re-run make."
@@ -33,7 +55,7 @@ index f8ff1ce..f297d05 100644
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
############################################################################
-@@ -1545,17 +1539,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1532,17 +1526,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
@@ -51,3 +73,6 @@ index f8ff1ce..f297d05 100644
$(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
$(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o
$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
+--
+2.21.0
+
diff --git a/00178-dont-duplicate-flags-in-sysconfig.patch
b/00178-dont-duplicate-flags-in-sysconfig.patch
index fc49b30..4bbfed3 100644
--- a/00178-dont-duplicate-flags-in-sysconfig.patch
+++ b/00178-dont-duplicate-flags-in-sysconfig.patch
@@ -1,7 +1,21 @@
-diff -r 39b9b05c3085 Lib/distutils/sysconfig.py
---- a/Lib/distutils/sysconfig.py Wed Apr 10 00:27:23 2013 +0200
-+++ b/Lib/distutils/sysconfig.py Wed Apr 10 10:14:18 2013 +0200
-@@ -362,7 +362,10 @@
+From b9a703e3d37e325defe5baec111e1fbf5d42bede Mon Sep 17 00:00:00 2001
+From: Bohuslav Kabrda <bkabrda(a)redhat.com>
+Date: Wed, 10 Apr 2013 14:30:09 +0200
+Subject: [PATCH 4/9] 00178: Don't duplicate various FLAGS in sysconfig values
+
+http://bugs.python.org/issue17679
+
+Does not affect python2 AFAICS (different sysconfig values initialization)
+---
+ Lib/distutils/sysconfig.py | 5 ++++-
+ Lib/sysconfig.py | 5 ++++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
+index 9a4892a737..ad4cef088b 100644
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -373,7 +373,10 @@ def parse_makefile(fn, g=None):
done[n] = item = ""
if found:
after = value[m.end():]
@@ -13,10 +27,11 @@ diff -r 39b9b05c3085 Lib/distutils/sysconfig.py
if "$" in after:
notdone[name] = value
else:
-diff -r 39b9b05c3085 Lib/sysconfig.py
---- a/Lib/sysconfig.py Wed Apr 10 00:27:23 2013 +0200
-+++ b/Lib/sysconfig.py Wed Apr 10 10:14:18 2013 +0200
-@@ -296,7 +296,10 @@
+diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
+index cf64d79c4d..fd972d658c 100644
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -295,7 +295,10 @@ def _parse_makefile(filename, vars=None):
if found:
after = value[m.end():]
@@ -28,3 +43,6 @@ diff -r 39b9b05c3085 Lib/sysconfig.py
if "$" in after:
notdone[name] = value
else:
+--
+2.21.0
+
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index ffb80af..91cdb01 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -1,5 +1,16 @@
+From 0f59810bb72d2092729346c17e96bf0c23120ee1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
+Date: Wed, 15 Aug 2018 15:36:29 +0200
+Subject: [PATCH 5/9] 00189: Instead of bundled wheels, use our RPM packaged
+ wheels
+
+We keep them in /usr/share/python-wheels
+---
+ Lib/ensurepip/__init__.py | 26 +++++++++++++++++---------
+ 1 file changed, 17 insertions(+), 9 deletions(-)
+
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index 4748ba4..fc02255 100644
+index 526dfd004a..fc02255feb 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -1,16 +1,27 @@
@@ -49,3 +60,6 @@ index 4748ba4..fc02255 100644
additional_paths.append(os.path.join(tmpdir, wheel_name))
+--
+2.21.0
+
diff --git a/00205-make-libpl-respect-lib64.patch b/00205-make-libpl-respect-lib64.patch
index 3e7c797..ddd0021 100644
--- a/00205-make-libpl-respect-lib64.patch
+++ b/00205-make-libpl-respect-lib64.patch
@@ -1,7 +1,22 @@
-diff -up Python-3.5.0/Makefile.pre.in.lib Python-3.5.0/Makefile.pre.in
---- Python-3.5.0/Makefile.pre.in.lib 2015-09-21 15:39:47.928286620 +0200
-+++ Python-3.5.0/Makefile.pre.in 2015-09-21 15:42:58.004042762 +0200
-@@ -1340,7 +1340,7 @@ inclinstall:
+From 5ee8362bd5cc991b956efa9cf06eb6ad2607f57c Mon Sep 17 00:00:00 2001
+From: Robert Kuska <rkuska(a)redhat.com>
+Date: Mon, 21 Sep 2015 15:55:00 +0200
+Subject: [PATCH 6/9] 00205: Make LIBPL variable respect the libdir macro
+
+LIBPL variable in Makefile takes LIBPL from configure.ac,
+but the LIBPL variable defined there doesn't respect the libdir macro.
+
+Co-authored-by: Robert Kuska <rkuska(a)redhat.com>
+Co-authored-by: Charalampos Stratakis <cstratak(a)redhat.com>
+---
+ Makefile.pre.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 414aa96008..a07bd6718d 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -1512,7 +1512,7 @@ inclinstall:
# Install the library and miscellaneous stuff needed for extending/embedding
# This goes into $(exec_prefix)
@@ -10,3 +25,6 @@ diff -up Python-3.5.0/Makefile.pre.in.lib Python-3.5.0/Makefile.pre.in
# pkgconfig directory
LIBPC= $(LIBDIR)/pkgconfig
+--
+2.21.0
+
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 4104449..1775b6c 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,11 +1,26 @@
+From e9d8db2d243cf27b66083e0c6a9bb5d28866f937 Mon Sep 17 00:00:00 2001
+From: Michal Cyprian <m.cyprian(a)gmail.com>
+Date: Mon, 26 Jun 2017 16:32:56 +0200
+Subject: [PATCH 7/9] 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 0258d3d..4ebf50a 100644
+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/
@@ -21,16 +36,16 @@ index 0258d3d..4ebf50a 100644
+
+ 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 0fc9200..c95202e 100644
+index 99149a564f..1107324848 100644
--- a/Lib/site.py
+++ b/Lib/site.py
-@@ -322,7 +322,14 @@ def getsitepackages(prefixes=None):
+@@ -347,7 +347,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
@@ -44,3 +59,6 @@ index 0fc9200..c95202e 100644
for sitedir in getsitepackages(prefixes):
if os.path.isdir(sitedir):
addsitedir(sitedir, known_paths)
+--
+2.21.0
+
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index ee15930..b8453a2 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,19 +1,25 @@
-From 3b0d3a25576e74c2ac1eb25136ae811bdbdd7c6c Mon Sep 17 00:00:00 2001
-From: Tomas Orsava <torsava(a)redhat.com>
-Date: Thu, 14 Feb 2019 16:08:57 +0100
-Subject: [PATCH] Upstream uses Debian-style architecture naming. Change to
- match Fedora / RHEL
+From e108d7026aab241d89ff3a90d6421af3e9ee8e12 Mon Sep 17 00:00:00 2001
+From: Petr Viktorin <pviktori(a)redhat.com>
+Date: Mon, 28 Aug 2017 17:16:46 +0200
+Subject: [PATCH 8/9] 00274: Upstream uses Debian-style architecture naming,
+ change to match Fedora
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+Co-authored-by: Petr Viktorin <pviktori(a)redhat.com>
+Co-authored-by: Miro Hronok <miro(a)hroncok.cz>
+Co-authored-by: Tomas Orsava <torsava(a)redhat.com>
---
config.sub | 2 +-
configure.ac | 16 ++++++++--------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/config.sub b/config.sub
-index 40ea5df..932128b 100755
+index ba37cf99e2..52a9ec6662 100755
--- a/config.sub
+++ b/config.sub
-@@ -1045,7 +1045,7 @@ case $basic_machine in
+@@ -1042,7 +1042,7 @@ case $basic_machine in
;;
ppc64) basic_machine=powerpc64-unknown
;;
@@ -23,10 +29,10 @@ index 40ea5df..932128b 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index a075ce3..b7f2ee3 100644
+index a02597da2d..5742ef4176 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -788,9 +788,9 @@ cat >> conftest.c <<EOF
+@@ -740,9 +740,9 @@ cat >> conftest.c <<EOF
alpha-linux-gnu
# elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
@@ -38,7 +44,7 @@ index a075ce3..b7f2ee3 100644
# endif
# elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
-@@ -810,7 +810,7 @@ cat >> conftest.c <<EOF
+@@ -782,7 +782,7 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64el-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
@@ -47,7 +53,7 @@ index a075ce3..b7f2ee3 100644
# else
# error unknown platform triplet
# endif
-@@ -820,22 +820,22 @@ cat >> conftest.c <<EOF
+@@ -792,22 +792,22 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
@@ -76,5 +82,5 @@ index a075ce3..b7f2ee3 100644
s390x-linux-gnu
# elif defined(__s390__)
--
-2.20.1
+2.21.0
diff --git a/00316-mark-bdist_wininst-unsupported.patch
b/00316-mark-bdist_wininst-unsupported.patch
index a6a3faf..b6174c8 100644
--- a/00316-mark-bdist_wininst-unsupported.patch
+++ b/00316-mark-bdist_wininst-unsupported.patch
@@ -1,5 +1,16 @@
+From 1ef328c38ad0ef7fad1652edddd3710885b0a778 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
+Date: Thu, 20 Dec 2018 12:46:25 +0100
+Subject: [PATCH 9/9] 00316: Mark bdist_wininst unsupported
+
+We remove the exe files from distutil's bdist_wininst.
+So we mark the command as unsupported - and the tests are skipped.
+---
+ Lib/distutils/command/bdist_wininst.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
diff --git a/Lib/distutils/command/bdist_wininst.py
b/Lib/distutils/command/bdist_wininst.py
-index 0871a4f..8796b68 100644
+index 3a616883be..ba299a4028 100644
--- a/Lib/distutils/command/bdist_wininst.py
+++ b/Lib/distutils/command/bdist_wininst.py
@@ -12,6 +12,8 @@ from distutils.sysconfig import get_python_version
@@ -11,3 +22,6 @@ index 0871a4f..8796b68 100644
description = "create an executable installer for MS Windows"
+--
+2.21.0
+
diff --git a/python38.spec b/python38.spec
index 7329aa6..49041de 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel a3
+%global prerel a4
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
Release: 1%{?dist}
@@ -97,8 +97,8 @@ License: Python
# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
-%global ABIFLAGS_optimized m
-%global ABIFLAGS_debug dm
+%global ABIFLAGS_optimized %{nil}
+%global ABIFLAGS_debug d
%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
@@ -279,6 +279,10 @@ Patch316: 00316-mark-bdist_wininst-unsupported.patch
# More information, and a patch number catalog, is at:
#
#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+#
+# The patches are stored and rebased at:
+#
+#
https://github.com/fedora-python/cpython
# ==========================================
@@ -868,9 +872,6 @@ ln -s \
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
-# make man python3.Xm work
https://bugzilla.redhat.com/show_bug.cgi?id=1612241
-ln -s ./python%{pybasever}.1 %{buildroot}%{_mandir}/man1/python%{pybasever}m.1
-
%if %{with flatpackage}
# Remove stuff that would conflict with python3 package
rm %{buildroot}%{_bindir}/python3
@@ -992,7 +993,7 @@ CheckPython optimized
%endif
%{_bindir}/python%{pybasever}
-%{_bindir}/python%{pybasever}m
+%{_bindir}/python%{LDVERSION_optimized}
%{_mandir}/*/*
@@ -1131,7 +1132,6 @@ CheckPython optimized
%{dynload_dir}/spwd.%{SOABI_optimized}.so
%{dynload_dir}/syslog.%{SOABI_optimized}.so
%{dynload_dir}/termios.%{SOABI_optimized}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
%{dynload_dir}/_uuid.%{SOABI_optimized}.so
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
@@ -1308,6 +1308,8 @@ CheckPython optimized
%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
+%{dynload_dir}/_testinternalcapi.%{SOABI_optimized}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
%{pylibdir}/lib2to3/tests
%{pylibdir}/tkinter/test
@@ -1405,7 +1407,6 @@ CheckPython optimized
%{dynload_dir}/spwd.%{SOABI_debug}.so
%{dynload_dir}/syslog.%{SOABI_debug}.so
%{dynload_dir}/termios.%{SOABI_debug}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
%{dynload_dir}/unicodedata.%{SOABI_debug}.so
%{dynload_dir}/_uuid.%{SOABI_debug}.so
%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
@@ -1439,6 +1440,8 @@ CheckPython optimized
%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
%{dynload_dir}/_testcapi.%{SOABI_debug}.so
%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
+%{dynload_dir}/_testinternalcapi.%{SOABI_debug}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
%endif # with debug_build
@@ -1463,6 +1466,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue May 07 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a4-1
+- Update to 3.8.0a4
+
* Tue Mar 26 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a3-1
- Update to 3.8.0a3
diff --git a/sources b/sources
index 4f6b5c4..4536033 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0a3.tar.xz) =
2348416c3118d1ff6b88b1ee823046de6a26305c10dd900fcb59fbc5b37a8f54db7afcd2f8e7c927c50c4f317a8c20370478030f996f93c63381d2167247e6fd
+SHA512 (Python-3.8.0a4.tar.xz) =
76088206e3eb4ff0b9060f35e0bf994018452cc98d7f576bf7d6842158a6f6ae173b281c442f1175402428c683667b7bacebb2b989a561a9f12db1ad5f0f42cb
commit 084a366e3d465801793c881800b016a776ba7c68
Author: Patrik Kopkan <pkopkan(a)redhat.com>
Date: Thu Apr 18 16:40:00 2019 +0200
add symlink for python3.Xm manpages
diff --git a/python38.spec b/python38.spec
index 036563b..7329aa6 100644
--- a/python38.spec
+++ b/python38.spec
@@ -868,6 +868,9 @@ ln -s \
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
+# make man python3.Xm work
https://bugzilla.redhat.com/show_bug.cgi?id=1612241
+ln -s ./python%{pybasever}.1 %{buildroot}%{_mandir}/man1/python%{pybasever}m.1
+
%if %{with flatpackage}
# Remove stuff that would conflict with python3 package
rm %{buildroot}%{_bindir}/python3
commit 35551f989b91c87d44c2b81b5b12e643060fdbe7
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Tue Mar 5 15:50:30 2019 +0100
Reenable test_posix.test_fs_holes()
Since 2012, when the test was skipped from Python 3.3.0b1 (commit
3b4dd24c42a177bd8bda0ebf127f199ef32364ef), Linux now have a good
support for punching holes in filesystems.
Only 00160-disable-test_fs_holes-in-rpm-build.patch and
00163-disable-parts-of-test_socket-in-rpm-build.patch patches used
@unittest._skipInRpmBuild @unittest._expectedFailureInRpmBuild
decorators, but these 2 patches have been removed: remove
00132-add-rpmbuild-hooks-to-unittest.patch and
WITHIN_PYTHON_RPM_BUILD environment variable as well.
diff --git a/00132-add-rpmbuild-hooks-to-unittest.patch
b/00132-add-rpmbuild-hooks-to-unittest.patch
deleted file mode 100644
index b187c6a..0000000
--- a/00132-add-rpmbuild-hooks-to-unittest.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py
-index 5ff1bf3..4d63954 100644
---- a/Lib/unittest/__init__.py
-+++ b/Lib/unittest/__init__.py
-@@ -58,7 +58,7 @@ __unittest = True
-
- from .result import TestResult
- from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip,
-- skipIf, skipUnless, expectedFailure)
-+ skipIf, skipUnless, expectedFailure, _skipInRpmBuild)
- from .suite import BaseTestSuite, TestSuite
- from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
- findTestCases)
-diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
-index a157ae8..64f912c 100644
---- a/Lib/unittest/case.py
-+++ b/Lib/unittest/case.py
-@@ -3,6 +3,7 @@
- import sys
- import functools
- import difflib
-+import os
- import logging
- import pprint
- import re
-@@ -158,6 +159,22 @@ class _BaseTestCaseContext:
- msg = self.test_case._formatMessage(self.msg, standardMsg)
- raise self.test_case.failureException(msg)
-
-+# Non-standard/downstream-only hooks for handling issues with specific test
-+# cases:
-+
-+def _skipInRpmBuild(reason):
-+ """
-+ Non-standard/downstream-only decorator for marking a specific unit test
-+ to be skipped when run within the %check of an rpmbuild.
-+
-+ Specifically, this takes effect when WITHIN_PYTHON_RPM_BUILD is set within
-+ the environment, and has no effect otherwise.
-+ """
-+ if 'WITHIN_PYTHON_RPM_BUILD' in os.environ:
-+ return skip(reason)
-+ else:
-+ return _id
-+
- class _AssertRaisesBaseContext(_BaseTestCaseContext):
-
- def __init__(self, expected, test_case, expected_regex=None):
diff --git a/00160-disable-test_fs_holes-in-rpm-build.patch
b/00160-disable-test_fs_holes-in-rpm-build.patch
deleted file mode 100644
index 9fa91d5..0000000
--- a/00160-disable-test_fs_holes-in-rpm-build.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up cpython-59223da36dec/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build
cpython-59223da36dec/Lib/test/test_posix.py
----
cpython-59223da36dec/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build 2012-08-07
17:15:59.000000000 -0400
-+++ cpython-59223da36dec/Lib/test/test_posix.py 2012-08-07 17:16:53.528330330 -0400
-@@ -973,6 +973,7 @@ class PosixTester(unittest.TestCase):
- posix.RTLD_GLOBAL
- posix.RTLD_LOCAL
-
-+ @unittest._skipInRpmBuild('running kernel may not match kernel in chroot')
- @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
- "test needs an OS that reports file holes")
- def test_fs_holes(self):
diff --git a/python38.spec b/python38.spec
index 341d436..036563b 100644
--- a/python38.spec
+++ b/python38.spec
@@ -239,28 +239,6 @@ Patch102: 00102-lib64.patch
# Downstream only: not appropriate for upstream
Patch111: 00111-no-static-lib.patch
-# 00132 #
-# Add non-standard hooks to unittest for use in the "check" phase below, when
-# running selftests within the build:
-# @unittest._skipInRpmBuild(reason)
-# for tests that hang or fail intermittently within the build environment, and:
-# @unittest._expectedFailureInRpmBuild
-# for tests that always fail within the build environment
-#
-# The hooks only take effect if WITHIN_PYTHON_RPM_BUILD is set in the
-# environment, which we set manually in the appropriate portion of the "check"
-# phase below (and which potentially other python-* rpms could set, to reuse
-# these unittest hooks in their own "check" phases)
-Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
-
-# 00160 #
-# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
-# header files in the build chroot, but may not be supported in the running
-# kernel, hence we disable this test in an rpm build.
-# Adding these was upstream issue
http://bugs.python.org/issue10142
-# Not yet sent upstream
-Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
-
# 00178 #
# Don't duplicate various FLAGS in sysconfig values
#
http://bugs.python.org/issue17679
@@ -553,8 +531,6 @@ rm -r Modules/expat
%patch102 -p1
%endif
%patch111 -p1
-%patch132 -p1
-%patch160 -p1
%patch178 -p1
%if %{with rpmwheels}
@@ -967,17 +943,13 @@ CheckPython() {
# Show some info, helpful for debugging test failures
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.pythoninfo
- # Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
- # our non-standard decorators take effect on the relevant tests:
- # @unittest._skipInRpmBuild(reason)
- # @unittest._expectedFailureInRpmBuild
+ # Run the upstream test suite
# test_gdb skipped on armv7hl:
#
https://bugzilla.redhat.com/show_bug.cgi?id=1196181
# test_gdb skipped on s390x:
#
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
# test_asyncio skipped:
#
https://bugs.python.org/issue35998
- WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
-wW --slowest -j0 \
-x test_distutils \
commit b564dce4fa452ad42ade6b898c551b64253ba2ba
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Tue Mar 5 15:35:12 2019 +0100
Reenable RecvmsgGenericStreamTests.testRecvmsgEOF()
Reenable RecvmsgGenericStreamTests.testRecvmsgEOF() of test_socket:
remove 00163-disable-parts-of-test_socket-in-rpm-build.patch.
diff --git a/00163-disable-parts-of-test_socket-in-rpm-build.patch
b/00163-disable-parts-of-test_socket-in-rpm-build.patch
deleted file mode 100644
index 0e28036..0000000
--- a/00163-disable-parts-of-test_socket-in-rpm-build.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-3.3.0b1/Lib/test/test_socket.py.disable-test_socket-in-rpm-builds
Python-3.3.0b1/Lib/test/test_socket.py
---- Python-3.3.0b1/Lib/test/test_socket.py.disable-test_socket-in-rpm-builds 2012-07-24
15:02:30.823355067 -0400
-+++ Python-3.3.0b1/Lib/test/test_socket.py 2012-07-24 15:08:13.021354999 -0400
-@@ -2188,6 +2188,7 @@ class RecvmsgGenericStreamTests(RecvmsgG
- # Tests which require a stream socket and can use either recvmsg()
- # or recvmsg_into().
-
-+ @unittest._skipInRpmBuild('fails intermittently when run within Koji')
- def testRecvmsgEOF(self):
- # Receive end-of-stream indicator (b"", peer socket closed).
- msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
diff --git a/python38.spec b/python38.spec
index 1261dcd..341d436 100644
--- a/python38.spec
+++ b/python38.spec
@@ -261,12 +261,6 @@ Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
# Not yet sent upstream
Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
-# 00163 #
-# Some tests within test_socket fail intermittently when run inside Koji;
-# disable them using unittest._skipInRpmBuild
-# Not yet sent upstream
-Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
-
# 00178 #
# Don't duplicate various FLAGS in sysconfig values
#
http://bugs.python.org/issue17679
@@ -561,7 +555,6 @@ rm -r Modules/expat
%patch111 -p1
%patch132 -p1
%patch160 -p1
-%patch163 -p1
%patch178 -p1
%if %{with rpmwheels}
commit 0cd827e77ed2a322f12b484dd38a0306ba6c565d
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Thu Jan 31 11:56:28 2019 +0100
Reenable test_gdb on most archs except arm and s390x
gdb has been fixed in Rawhide:
https://bugzilla.redhat.com/show_bug.cgi?id=1638798
https://bugzilla.redhat.com/show_bug.cgi?id=1634781
Install also gdb in selftest to no longer skip test_gdb
on the x86_64 CI.
But test_gdb is still skipped on armv7hl:
https://bugzilla.redhat.com/show_bug.cgi?id=1196181
And skipped on s390x:
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
diff --git a/python38.spec b/python38.spec
index b5797a8..1261dcd 100644
--- a/python38.spec
+++ b/python38.spec
@@ -978,6 +978,10 @@ CheckPython() {
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
# @unittest._expectedFailureInRpmBuild
+ # test_gdb skipped on armv7hl:
+ #
https://bugzilla.redhat.com/show_bug.cgi?id=1196181
+ # test_gdb skipped on s390x:
+ #
https://bugzilla.redhat.com/show_bug.cgi?id=1678277
# test_asyncio skipped:
#
https://bugs.python.org/issue35998
WITHIN_PYTHON_RPM_BUILD= \
@@ -985,7 +989,9 @@ CheckPython() {
-wW --slowest -j0 \
-x test_distutils \
-x test_bdist_rpm \
+ %ifarch %{arm} s390x
-x test_gdb \
+ %endif
%ifarch %{mips64}
-x test_ctypes \
%endif
diff --git a/tests/tests.yml b/tests/tests.yml
index 558953f..ccc6808 100644
--- a/tests/tests.yml
+++ b/tests/tests.yml
@@ -16,6 +16,7 @@
run: VERSION=3.8 X="-x test_socket -x test_asyncgen -x test_asyncio -x
test_compile -x test_concurrent_futures -x test_itertools -x test_multiprocessing_fork -x
test_multiprocessing_forkserver -x test_shutil -x test_time -x test_multiprocessing_spawn
-x test_threading -x test_wsgiref" ./parallel.sh
required_packages:
- gcc # for extension building in venv and selftest
+ - gdb # for test_gdb
- python38 # the test subject
- python3-tox # for venv tests
- glibc-all-langpacks # for locale tests
commit 41ec7ac42451df1d23d53554deb68ffccf67934f
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Fri Feb 15 14:55:26 2019 +0100
Reenable test_buffer on ppc64le
The test failed because of a GCC bug which has been fixed in GCC
master branch and Rawhide uses GCC 9 (master branch):
*
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88892
*
https://bugzilla.redhat.com/show_bug.cgi?id=1540995
diff --git a/python38.spec b/python38.spec
index 217db85..b5797a8 100644
--- a/python38.spec
+++ b/python38.spec
@@ -989,9 +989,6 @@ CheckPython() {
%ifarch %{mips64}
-x test_ctypes \
%endif
- %ifarch ppc64le
- -x test_buffer \
- %endif
-x test_asyncio \
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
commit b02de40d57688ae9f50044e848e69daf775ff011
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Thu Feb 14 17:37:18 2019 +0100
Fix arch names for the ppc architecture
Updated patch 00274
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index c8e53c1..ee15930 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,8 +1,19 @@
+From 3b0d3a25576e74c2ac1eb25136ae811bdbdd7c6c Mon Sep 17 00:00:00 2001
+From: Tomas Orsava <torsava(a)redhat.com>
+Date: Thu, 14 Feb 2019 16:08:57 +0100
+Subject: [PATCH] Upstream uses Debian-style architecture naming. Change to
+ match Fedora / RHEL
+
+---
+ config.sub | 2 +-
+ configure.ac | 16 ++++++++--------
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
diff --git a/config.sub b/config.sub
-index ba37cf9..52a9ec6 100755
+index 40ea5df..932128b 100755
--- a/config.sub
+++ b/config.sub
-@@ -1042,7 +1042,7 @@ case $basic_machine in
+@@ -1045,7 +1045,7 @@ case $basic_machine in
;;
ppc64) basic_machine=powerpc64-unknown
;;
@@ -12,10 +23,10 @@ index ba37cf9..52a9ec6 100755
ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/configure.ac b/configure.ac
-index 2535969..9fb3193 100644
+index a075ce3..b7f2ee3 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -765,9 +765,9 @@ cat >> conftest.c <<EOF
+@@ -788,9 +788,9 @@ cat >> conftest.c <<EOF
alpha-linux-gnu
# elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
@@ -27,7 +38,7 @@ index 2535969..9fb3193 100644
# endif
# elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
-@@ -807,7 +807,7 @@ cat >> conftest.c <<EOF
+@@ -810,7 +810,7 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64el-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
@@ -36,7 +47,7 @@ index 2535969..9fb3193 100644
# else
# error unknown platform triplet
# endif
-@@ -817,7 +817,7 @@ cat >> conftest.c <<EOF
+@@ -820,22 +820,22 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
@@ -45,8 +56,11 @@ index 2535969..9fb3193 100644
# else
# error unknown platform triplet
# endif
-@@ -827,9 +827,9 @@ cat >> conftest.c <<EOF
- powerpc-linux-gnuspe
+ # elif defined(__or1k__)
+ or1k-linux-gnu
+ # elif defined(__powerpc__) && defined(__SPE__)
+- powerpc-linux-gnuspe
++ ppc-linux-gnuspe
# elif defined(__powerpc64__)
# if defined(__LITTLE_ENDIAN__)
- powerpc64le-linux-gnu
@@ -56,4 +70,11 @@ index 2535969..9fb3193 100644
+ ppc64-linux-gnu
# endif
# elif defined(__powerpc__)
- powerpc-linux-gnu
+- powerpc-linux-gnu
++ ppc-linux-gnu
+ # elif defined(__s390x__)
+ s390x-linux-gnu
+ # elif defined(__s390__)
+--
+2.20.1
+
commit 136178652c45553ed8b1135d98edf572ca098b89
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Mar 20 11:31:21 2019 +0000
Temporarily skip test_asyncio to workaround bpo-35998
https://bugs.python.org/issue35998
diff --git a/python38.spec b/python38.spec
index 30f4dd3..217db85 100644
--- a/python38.spec
+++ b/python38.spec
@@ -978,6 +978,8 @@ CheckPython() {
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
# @unittest._expectedFailureInRpmBuild
+ # test_asyncio skipped:
+ #
https://bugs.python.org/issue35998
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
-wW --slowest -j0 \
@@ -990,6 +992,7 @@ CheckPython() {
%ifarch ppc64le
-x test_buffer \
%endif
+ -x test_asyncio \
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
commit 804ec7c37d91ca30ddaf9465cff955d886b95616
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Mar 27 01:14:40 2019 +0100
Update to 3.8.0a3
Rebased patches: 102
Updated pip/setuptools versions in spec and patch 189
diff --git a/00102-lib64.patch b/00102-lib64.patch
index b082083..33b2422 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -23,7 +23,7 @@ diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index e07a6c8..554740d 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
-@@ -129,8 +129,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
+@@ -140,8 +140,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
prefix = plat_specific and EXEC_PREFIX or PREFIX
if os.name == "posix":
@@ -108,7 +108,7 @@ diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index 266adf0..e8513b6 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
-@@ -275,8 +275,8 @@ class HelperFunctionsTests(unittest.TestCase):
+@@ -266,8 +266,8 @@ class HelperFunctionsTests(unittest.TestCase):
dirs = site.getsitepackages()
if os.sep == '/':
# OS X, Linux, FreeBSD, etc
@@ -123,7 +123,7 @@ diff --git a/Makefile.pre.in b/Makefile.pre.in
index 59ba9d4..5780ed8 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -133,7 +133,7 @@ LIBDIR= @libdir@
+@@ -140,7 +140,7 @@ LIBDIR= @libdir@
MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
@@ -133,28 +133,28 @@ index 59ba9d4..5780ed8 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index 85e737b..2a1fc79 100644
+index dd188c6..6e69eed 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
-@@ -500,7 +500,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
- "Could not find platform dependent libraries
<exec_prefix>\n");
+@@ -688,7 +688,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
+ if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0)
{
+ return PATHLEN_ERR();
+ }
+- err = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len);
++ err = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len);
+ if (_Py_INIT_FAILED(err)) {
+ return err;
+ }
+@@ -1015,7 +1015,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t
*prefix)
+ return PATHLEN_ERR();
}
- wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN);
-- joinpath(exec_prefix, L"lib/lib-dynload");
-+ joinpath(exec_prefix, L"lib64/lib-dynload");
}
- /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
- }
-@@ -742,7 +742,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t
*prefix)
- else {
- wcsncpy(calculate->zip_path, calculate->prefix, MAXPATHLEN);
+- err = joinpath(calculate->zip_path, L"lib/python00.zip",
zip_path_len);
++ err = joinpath(calculate->zip_path, L"lib64/python00.zip",
zip_path_len);
+ if (_Py_INIT_FAILED(err)) {
+ return err;
}
-- joinpath(calculate->zip_path, L"lib/python00.zip");
-+ joinpath(calculate->zip_path, L"lib64/python00.zip");
-
- /* Replace "00" with version */
- size_t bufsz = wcslen(calculate->zip_path);
-@@ -867,7 +867,7 @@ calculate_init(PyCalculatePath *calculate,
+@@ -1144,7 +1144,7 @@ calculate_init(PyCalculatePath *calculate,
if (!calculate->prefix) {
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
@@ -164,29 +164,29 @@ index 85e737b..2a1fc79 100644
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
}
diff --git a/setup.py b/setup.py
-index f1933f7..450cd8a 100644
+index 0258d3d..4b969bf 100644
--- a/setup.py
+++ b/setup.py
-@@ -531,7 +531,7 @@ class PyBuildExt(build_ext):
+@@ -610,7 +610,7 @@ class PyBuildExt(build_ext):
# directories (i.e. '.' and 'Include') must be first. See
issue
# 10520.
- if not cross_compiling:
+ 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:
-@@ -830,11 +830,11 @@ class PyBuildExt(build_ext):
+ if CROSS_COMPILING:
+@@ -902,11 +902,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
- elif self.compiler.find_library_file(lib_dirs +
+ elif self.compiler.find_library_file(self.lib_dirs +
- ['/usr/lib/termcap'],
+ ['/usr/lib64/termcap'],
'termcap'):
readline_libs.append('termcap')
- exts.append( Extension('readline', ['readline.c'],
-- library_dirs=['/usr/lib/termcap'],
-+ library_dirs=['/usr/lib64/termcap'],
- extra_link_args=readline_extra_link_args,
- libraries=readline_libs) )
+ 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:
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index 1afdab1..ffb80af 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -16,9 +16,9 @@ index 4748ba4..fc02255 100644
+_WHEEL_DIR = "/usr/share/python-wheels/"
--_SETUPTOOLS_VERSION = "40.6.2"
+-_SETUPTOOLS_VERSION = "40.8.0"
--_PIP_VERSION = "18.1"
+-_PIP_VERSION = "19.0.3"
+def _get_most_recent_wheel_version(pkg):
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
+ suffix = "-py2.py3-none-any.whl"
diff --git a/python38.spec b/python38.spec
index 6614951..30f4dd3 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel a2
+%global prerel a3
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
Release: 1%{?dist}
@@ -379,8 +379,8 @@ Summary: Python runtime libraries
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 18.1
-Provides: bundled(python3-setuptools) = 40.6.2
+Provides: bundled(python3-pip) = 19.0.3
+Provides: bundled(python3-setuptools) = 40.8.0
%endif
# There are files in the standard library that have python shebang.
@@ -521,8 +521,8 @@ so extensions for both versions can co-exist in the same directory.
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 18.1
-Provides: bundled(python3-setuptools) = 40.6.2
+Provides: bundled(python3-pip) = 19.0.3
+Provides: bundled(python3-setuptools) = 40.8.0
%endif
# The description for the flat package
@@ -1489,6 +1489,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue Mar 26 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a3-1
+- Update to 3.8.0a3
+
* Mon Feb 25 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a2-1
- Update to 3.8.0a2
diff --git a/sources b/sources
index 29d07a2..4f6b5c4 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0a2.tar.xz) =
ebba962aa73bf690f33f4e2183da5f64f13cdd892d94c48b433cd04f7cdbc8baf88ff60d7998c330683b590f7c02fa2f426c9cbde461f36871bda728ab4f07ac
+SHA512 (Python-3.8.0a3.tar.xz) =
2348416c3118d1ff6b88b1ee823046de6a26305c10dd900fcb59fbc5b37a8f54db7afcd2f8e7c927c50c4f317a8c20370478030f996f93c63381d2167247e6fd
commit ad7d856a30e0b7d042f8d6365146296e62a801d8
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sun Mar 10 19:48:49 2019 +0100
Add bootstrap bcond for Python 3.8
diff --git a/python38.spec b/python38.spec
index ca79117..6614951 100644
--- a/python38.spec
+++ b/python38.spec
@@ -36,6 +36,17 @@ License: Python
# WARNING: This does not change the package name and summary above
%bcond_without flatpackage
+# When bootstrapping python3, we need to build setuptools.
+# but setuptools BR python3-devel and that brings in python3-rpm-generators;
+# python3-rpm-generators needs python3-setuptools, so we cannot have it yet.
+#
+# Procedure:
https://fedoraproject.org/wiki/SIGs/Python/UpgradingPython
+#
+# IMPORTANT: When bootstrapping, it's very likely the wheels for pip and
+# setuptools are not available. Turn off the rpmwheels bcond until
+# the two packages are built with wheels to get around the issue.
+%bcond_with bootstrap
+
# Whether to use RPM build wheels from the python-{pip,setuptools}-wheel package
# Uses upstream bundled prebuilt wheels otherwise
%bcond_without rpmwheels
@@ -77,10 +88,6 @@ License: Python
%endif
-# Notes from bootstraping Python 3.7:
-#
https://fedoraproject.org/wiki/SIGs/Python/UpgradingPython
-
-
# =====================
# General global macros
# =====================
@@ -396,8 +403,8 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
BuildRequires: python-rpm-macros
Requires: python-rpm-macros
Requires: python3-rpm-macros
-Requires: python3-rpm-generators
+%if %{without bootstrap}
# This is not "API" (packages that need setuptools should still BuildRequire
it)
# However some packages apparently can build both with and without setuptools
# producing egg-info as file or directory (depending on setuptools presence).
@@ -407,6 +414,9 @@ Requires: python3-rpm-generators
# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
Requires: python3-setuptools
+Requires: python3-rpm-generators
+%endif
+
Provides: %{name}-2to3 = %{version}-%{release}
Provides: 2to3 = %{version}-%{release}
commit 5e25a870914dc63f4fe6811b4c2fca9cc3d90e7f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Feb 26 00:51:48 2019 +0100
Update to 3.8.0a2
diff --git a/python38.spec b/python38.spec
index b06ab0f..ca79117 100644
--- a/python38.spec
+++ b/python38.spec
@@ -14,10 +14,10 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
%global general_version %{pybasever}.0
-%global prerel a1
+%global prerel a2
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 3%{?dist}
+Release: 1%{?dist}
License: Python
@@ -1479,6 +1479,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Feb 25 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a2-1
+- Update to 3.8.0a2
+
* Mon Feb 18 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-3
- Reduced default build flags used to build extension modules
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
diff --git a/sources b/sources
index 8f72af4..29d07a2 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.8.0a1.tar.xz) =
81e0aea4cf37f432d72464579f1b97db574496fa7105c7b2e02caed2e27d95288f21605666e80b60a01c66afb115714004b4a219b31ce21c8f732828b70b24e2
+SHA512 (Python-3.8.0a2.tar.xz) =
ebba962aa73bf690f33f4e2183da5f64f13cdd892d94c48b433cd04f7cdbc8baf88ff60d7998c330683b590f7c02fa2f426c9cbde461f36871bda728ab4f07ac
commit 8449402f77556af669063726e55a7e65c3809da6
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jan 2 18:15:20 2019 +0100
Reduced default build flags used to build extension modules
Utilize extension_...flags for extension builds.
See
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
Depends on
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/e80fa1344a49662fec...
diff --git a/python38.spec b/python38.spec
index 942b233..b06ab0f 100644
--- a/python38.spec
+++ b/python38.spec
@@ -17,7 +17,7 @@ URL:
https://www.python.org/
%global prerel a1
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
@@ -170,6 +170,7 @@ BuildRequires: ncurses-devel
BuildRequires: openssl-devel
BuildRequires: pkgconfig
BuildRequires: readline-devel
+BuildRequires: redhat-rpm-config >= 127
BuildRequires: sqlite-devel
BuildRequires: gdb
@@ -406,12 +407,6 @@ Requires: python3-rpm-generators
# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
Requires: python3-setuptools
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
-# TODO change to a specific subpackage once available (#1218294)
-Requires: redhat-rpm-config
-
Provides: %{name}-2to3 = %{version}-%{release}
Provides: 2to3 = %{version}-%{release}
@@ -507,8 +502,6 @@ so extensions for both versions can co-exist in the same directory.
%else # with flatpackage
-Requires: redhat-rpm-config
-
# We'll not provide this, on purpose
# No package in Fedora shall ever depend on flatpackage via this
%global __requires_exclude ^python\\(abi\\) = 3\\..$
@@ -605,13 +598,21 @@ topdir=$(pwd)
%endif
# Set common compiler/linker flags
-export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+# We utilize the %%extension_...flags macros here so users building C/C++
+# extensions with our python won't get all the compiler/linker flags used
+# in Fedora RPMs.
+# Standard library built here will still use the %%build_...flags,
+# Fedora packages utilizing %%py3_build will use them as well
+#
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
+export CFLAGS="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
+export CFLAGS_NODIST="%{build_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
+export CXXFLAGS="%{extension_cxxflags} -D_GNU_SOURCE -fPIC -fwrapv"
export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
-export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export OPT="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
export LINKCC="gcc"
export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
-export LDFLAGS="$RPM_LD_FLAGS -g $(pkg-config --libs-only-L openssl)"
+export LDFLAGS="%{extension_ldflags} -g $(pkg-config --libs-only-L openssl)"
+export LDFLAGS_NODIST="%{build_ldflags} -g $(pkg-config --libs-only-L
openssl)"
# We can build several different configurations of Python: regular and debug.
# Define a common function that does one build:
@@ -1478,6 +1479,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Feb 18 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-3
+- Reduced default build flags used to build extension modules
+
https://fedoraproject.org/wiki/Changes/Python_Extension_Flags
+
* Sun Feb 17 2019 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.8.0~a1-2
- Rebuild for readline 8.0
commit d08091876766f5badc6ca946edb3652a8ab4f758
Author: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
Date: Sun Feb 17 09:30:52 2019 +0100
Rebuild for readline 8.0
diff --git a/python38.spec b/python38.spec
index c822f64..942b233 100644
--- a/python38.spec
+++ b/python38.spec
@@ -17,7 +17,7 @@ URL:
https://www.python.org/
%global prerel a1
%global upstream_version %{general_version}%{?prerel}
Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -1478,5 +1478,8 @@ CheckPython optimized
# ======================================================
%changelog
+* Sun Feb 17 2019 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.8.0~a1-2
+- Rebuild for readline 8.0
+
* Tue Feb 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-1
- Update to 3.8.0a1
commit 553fd279baf25122ce00ea8b4ae565a27a72c9d7
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 6 02:25:20 2019 +0100
rpmlint: Python modules don't need to be linked against libc
They are loaded from Python and Python is already linked against libc.
See
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.o...
diff --git a/python38.rpmlintrc b/python38.rpmlintrc
index d59fe13..e1e2cbe 100644
--- a/python38.rpmlintrc
+++ b/python38.rpmlintrc
@@ -71,5 +71,8 @@ addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
\[Errno 2\]')
# we need this macro to evaluate, even if the line starts with #
addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
+# Python modules don't need to be linked against libc
+addFilter(r'E: library-not-linked-against-libc
/usr/lib(64)?/python3.\d/lib-dynload/')
+
# SPELLING ERRORS
addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
commit 4aedf056ed1b66ccc2b8de1e13aec2e5322c250e
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 6 17:28:13 2019 +0100
Update Fedora CI tests definitions for 3.8
diff --git a/tests/tests.yml b/tests/tests.yml
index d26ece2..558953f 100644
--- a/tests/tests.yml
+++ b/tests/tests.yml
@@ -10,18 +10,12 @@
tests:
- smoke:
dir: python/smoke
- run: VERSION=3.7 ./venv.sh
+ run: VERSION=3.8 ./venv.sh
- selftest:
dir: python/selftest
- run: VERSION=3.7 X="-x test_socket -x test_asyncgen -x test_asyncio -x
test_compile -x test_concurrent_futures -x test_itertools -x test_multiprocessing_fork -x
test_multiprocessing_forkserver -x test_shutil -x test_time -x test_multiprocessing_spawn
-x test_threading -x test_wsgiref" ./parallel.sh
- - findleaks:
- dir: python/selftest
- run: VERSION=3.7 X="-x test_socket -x test_asyncgen -x test_asyncio -x
test_compile -x test_concurrent_futures -x test_itertools -x test_multiprocessing_fork -x
test_multiprocessing_forkserver -x test_shutil -x test_time -x test_multiprocessing_spawn
-x test_threading -x test_wsgiref" ./findleaks.sh
+ run: VERSION=3.8 X="-x test_socket -x test_asyncgen -x test_asyncio -x
test_compile -x test_concurrent_futures -x test_itertools -x test_multiprocessing_fork -x
test_multiprocessing_forkserver -x test_shutil -x test_time -x test_multiprocessing_spawn
-x test_threading -x test_wsgiref" ./parallel.sh
required_packages:
- gcc # for extension building in venv and selftest
- - python3-debug # for leak testing
- - python3-devel # for extension building in venv and selftest
- - python3-tkinter # for selftest
- - python3-test # for selftest
+ - python38 # the test subject
- python3-tox # for venv tests
- glibc-all-langpacks # for locale tests
commit 1f112461d177f38849195230eacf0a99c9021aa2
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 6 17:24:49 2019 +0100
Trim the %changelog
diff --git a/python38.spec b/python38.spec
index 1c2ee75..c822f64 100644
--- a/python38.spec
+++ b/python38.spec
@@ -1480,1194 +1480,3 @@ CheckPython optimized
%changelog
* Tue Feb 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-1
- Update to 3.8.0a1
-
-* Sat Feb 02 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.2-5
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
-
-* Wed Jan 16 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-4
-- Security fix for CVE-2019-5010 (#1666519, #1666522)
-
-* Mon Jan 14 2019 Bjrn Esser <besser82(a)fedoraproject.org> - 3.7.2-3
-- Rebuilt for libcrypt.so.2 (#1666033)
-
-* Fri Jan 04 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-2
-- No longer revert upstream commit 3b699932e5ac3e7
-- This was a dirty workaround for (#1644936)
-
-* Tue Dec 25 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-1
-- Update to 3.7.2
-
-* Fri Dec 07 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-5
-- Make sure we don't ship any exe files (not needed an prebuilt)
-
-* Wed Nov 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-4
-- Make sure the entire test.support module is in python3-libs (#1651245)
-
-* Tue Nov 06 2018 Victor Stinner <vstinner(a)redhat.com> - 3.7.1-3
-- Verify the value of '-s' when execute the CLI of cProfile (rhbz#1160640)
-
-* Sun Nov 04 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-2
-- Temporarily revert upstream commit 3b699932e5ac3e7
-- This is dirty workaround for (#1644936)
-
-* Mon Oct 22 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-1
-- Update to 3.7.1
-
-* Thu Sep 27 2018 Petr Viktorin <pviktori(a)redhat.com> - 3.7.0-10
-- Compile the debug build with -Og rather than -O0
-
-* Thu Aug 30 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-9
-- Require python3-setuptools from python3-devel to prevent packaging errors (#1623914)
-
-* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-8
-- Add /usr/bin/pygettext3.py and msgfmt3.py to python3-devel
-Resolves: rhbz#1571474
-
-* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-7
-- Backport TLS 1.3 related fixes to fix FTBFS
-Resolves: rhbz#1609291
-
-* Wed Aug 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-6
-- Use RPM built wheels of pip and setuptools in ensurepip instead of our rewheel patch
-
-* Fri Aug 10 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-5
-- Fix wrong requirement on gdbm
-
-* Fri Jul 20 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-4
-- Allow to call Py_Main() after Py_Initialize()
-Resolves: rhbz#1595421
-
-* Sat Jul 14 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.0-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
-
-* Thu Jul 12 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-2
-- Rebuild for new gdbm
-
-* Wed Jun 27 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-1
-- Update to 3.7.0 final
-
-* Wed Jun 13 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.21.rc1
-- Finish bootstrapping, enable rewheel, tests, optimizations
-
-* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
-- Update to 3.7.0rc1
-- Bootstrap, disable rewheel, tests, optimizations
-
-* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-4
-- Fix multiprocessing regression on newer glibcs
-- Enable test_multiprocessing_fork(server) and _spawn again
-Resolves: rhbz#1569933
-
-* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-3
-- Skip test_multiprocessing_fork(server) and _spawn for now
-
-* Wed Apr 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-2
-- Add flatpackage conditionals
-
-* Thu Mar 29 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.5-1
-- Update to 3.6.5
-
-* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-20
-- Fix broken macro invocation and broken building of C Python extensions
-Resolves: rhbz#1560103
-
-* Fri Mar 16 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-19
-- Add -n option for pathfix.py
-Resolves: rhbz#1546990
-
-* Thu Mar 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-18
-- Fix the py_byte_compile macro to work on Python 2
-- Remove the pybytecompile macro file from the flat package
-Resolves: rhbz#1484993
-
-* Tue Mar 13 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-17
-- Do not send IP addresses in SNI TLS extension
-
-* Sat Feb 24 2018 Florian Weimer <fweimer(a)redhat.com> - 3.6.4-16
-- Rebuild with new LDFLAGS from redhat-rpm-config
-
-* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-15
-- Filter out automatic /usr/bin/python3.X requirement,
- recommend the main package from libs instead
-Resolves: rhbz#1547131
-
-* Thu Feb 15 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.4-14
-- Remove the python3-tools package (#rhbz 1312030)
-- Move /usr/bin/2to3 to python3-devel
-- Move /usr/bin/idle and idlelib to python3-idle
-- Provide python3-tools from python3-idle
-
-* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-13
-- Escape macros in %%changelog
-
-* Fri Feb 02 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.4-12
-- Remove sys.executable check from change-user-install-location patch
-Resolves: rhbz#1532287
-
-* Thu Feb 01 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-11
-- Define TLS cipher suite on build time.
-
-* Wed Jan 31 2018 Tomas Orsava <torsava(a)redhat.com> - 3.6.4-10
-- Disable test_gdb for all arches and test_buffer for ppc64le in anticipation
- of the F28 mass rebuild
-- Re-enable these tests after the mass rebuild when they can be properly
- addressed
-
-* Tue Jan 23 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-9
-- Restore the PyExc_RecursionErrorInst public symbol
-
-* Tue Jan 23 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-8
-- Add patch to explicitly link _ctypes module with -ldl (#1537489)
-- Refactored patch for libxcrypt
-- Re-enable strict symbol checks in the link editor
-
-* Mon Jan 22 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-7
-- Add patch for libxcrypt
-- Disable strict symbol checks in the link editor
-
-* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-6
-- Rebuilt for switch to libxcrypt
-
-* Fri Jan 19 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-5
-- Fix localeconv() encoding for LC_NUMERIC
-
-* Thu Jan 18 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-4
-- R: gdbm-devel R: gdbm for python3-libs
-
-* Wed Jan 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-3
-- Require large enough gdbm (fixup for previous bump)
-
-* Tue Jan 16 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-2
-- Rebuild for reverted gdbm 1.13 on Fedora 27
-
-* Mon Jan 15 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-1
-- Update to version 3.6.4
-
-* Fri Jan 12 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-5
-- Fix the compilation of the nis module.
-
-* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
-- Raise the release of platform-python obsoletes for better maintainability
-
-* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
-- Obsolete platform-python and it's subpackages
-
-* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
-- Fix memory corruption due to allocator mix
-Resolves: rhbz#1498207
-
-* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
-- Update to Python 3.6.3
-
-* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
-- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
-- Make the -devel package require redhat-rpm-config
-Resolves: rhbz#1496757
-
-* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
-- Fix /usr/bin/env dependency from python3-tools
-Resolves: rhbz#1482118
-
-* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
-- Include `-g` in the flags sent to the linker (LDFLAGS)
-Resolves: rhbz#1483222
-
-* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
-- Specfile cleanup
-- Make the main description also applicable to the SRPM
-- Add audiotest.au to the test package
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
-- Remove %%{pylibdir}/Tools/scripts/2to3
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
-- Expat >= 2.1.0 is everywhere, remove explicit requires
-- Conditionalize systemtap-devel BuildRequires
-- For consistency, require /usr/sbin/ifconfig instead of net-tools
-
-* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
-- Rename patch files to be consistent
-- Run autotools to generate the configure script before building
-- Merge lib64 patches (104 into 102)
-- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
-- Remove patches 157 and 186, which had test changes left over after upstreaming
-- Remove patch 188, a temporary workaround for hashlib tests
-- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
-- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
-
-* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
-- Use python3 style of calling super() without arguments in rpath
- patch to prevent recursion in UnixCCompiler subclasses
-Resolves: rhbz#1458122
-
-* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
-- Add bcond for --without optimizations
-- Reword package descriptions
-- Remove Group declarations
-- Skip failing test_float_with_comma
-
-* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
-- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
-
-* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
-- Use bconds for configuring the build
-- Reorganize the initial sections
-
-* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
-- Have /usr/bin/2to3 (rhbz#1111275)
-- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
-
-* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
-- Revert "Add --executable option to install.py command"
- This enhancement is currently not needed and it can possibly
- collide with `pip --editable`option
-
-* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
-- Fix the "urllib FTP protocol stream injection" vulnerability
-Resolves: rhbz#1478916
-
-* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
-- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
- bsddb), however, no longer needod for Python 3
-- Tested building Python 3 with and without the dependency, all tests pass and
- filelists of resulting RPMs are identical
-
-* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
-- Do not generate debuginfo subpackages (#1476593)
-- Rebuild with binutils fix for ppc64le (#1475636)
-
-* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
-
-* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
-- Make test_asyncio to not depend on the current SIGHUP signal handler.
-
-* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
-- Update to Python 3.6.2
-
-* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
-- Update to the latest upstream implementation of PEP 538
-
-* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
-- Make pip and distutils in user environment install into separate location
-
-* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
-- Fix test_alpn_protocols from test_ssl
-- Do not require rebundled setuptools dependencies
-
-* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
-- Added a dependency to the devel subpackage on python3-rpm-generators which
- have been excised out of rpm-build
-- Updated notes on bootstrapping Python on top of this specfile accordingly
-- Involves: rhbz#1410631, rhbz#1444925
-
-* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
-- Enable profile guided optimizations for x86_64 and i686 architectures
-- Update to a newer implementation of PEP 538
-- Update description to reflect that Python 3 is now the default Python
-
-* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
-- Update PEP 538 to the latest upstream implementation
-
-* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
-- Enable link time optimizations
-- Move windows executables to the devel subpackage (rhbz#1426257)
-
-* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
-- Rename python3.Xdm-config script from -debug to be arch specific
-Resolves: rhbz#1179073
-
-* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
-- Install the Makefile in its proper location (rhbz#1438219)
-
-* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
-- Update to version 3.6.1 final
-
-* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
-- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
-
-* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
-- Update to Python 3.6.1 release candidate 1
-- Add patch 264 to skip a known test failure on aarch64
-
-* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
-- Use proper command line parsing in _testembed
-- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
-
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
-
-* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
-- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
-
-* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
-- Revert "Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables..." to prevent build failures
- of packages using alternate build tools
-
-* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
-- Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables
-- Use new %%_module_build macro
-
-* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
-- Add --executable option to install.py command
-
-* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
-- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
-in order for the virtualenvs to work properly
-
-* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
-
-* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
-- Add missing %%license macro
-
-* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
-- Modify the runtime dependency of python3-libs on system-python-libs again,
- because previous attempt didn't work properly with dnf resolving mechanism
-
-* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
-- Modify the runtime dependency of python3-libs on system-python-libs to use
- just the version and release number, but not the dist tag due to Modularity
-
-* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
-- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
-- Skip test_aead_aes_gcm during rpmbuild
-
-* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
-- Rebuild for readline 7.x
-
-* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
-- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
-
-* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
-- Define HAVE_LONG_LONG as 1 for backwards compatibility
-
-* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
-- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
-
-* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
-- Update to Python 3.6.0 final
-
-* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
-- Enable rewheel
-
-* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
-- Update to Python 3.6.0 release candidate 1
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
-- Update to Python 3.6.0 beta 4
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
-- Set to work with pip version 9.0.1
-
-* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
-- Use proper patch numbering and base upstream branch for
-porting ssl and hashlib modules to OpenSSL 1.1.0
-- Drop hashlib patch for now
-- Add riscv64 arch to 64bit and no-valgrind arches
-
-* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
-- Make it build with OpenSSL-1.1.0 based on upstream patch
-
-* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
-- Obsolete and Provide python35 package
-
-* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
-- Update %%py_byte_compile macro
-- Remove unused configure flags (rhbz#1374357)
-
-* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
-- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
- recompile optimized .pyc files
-- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
- files are no more
-- Resolves rhbz#1373635
-
-* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
-- Rebased to version 3.5.2
-- Set to work with pip version 8.1.2
-- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
-- Removed arch or environment specific patches 194, 196, 203, and 208
- as test builds indicate they are no longer needed
-- Updated patches 102, 146, and 242 to work with the new Python codebase
-- Removed patches 200, 201, 5000 which weren't even being applied
-
-* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
-- Fix for CVE-2016-1000110 HTTPoxy attack
-- SPEC file cleanup
-
-* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
-- Build properly on MIPS
-
-* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
--
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
-- Refactor patch for properly fixing CVE-2016-5636
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
-- Fix test_pyexpat failure with Expat version of 2.2.0
-
-* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
-- Move xml module to system-python-libs
-
-* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
-- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
-- Raise an error when STARTTLS fails
-- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
-- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
-- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
-
-* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
-- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
-
-* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
-- Move distutils to system-python-libs
-
-* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
-- Provide python3-enum34
-
-* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
-- Provide System Python packages and macros
-
-* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
-
-* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
-- Drop python3 macros, require python/python3-rpm-macros
-
-* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
-- Update to 3.5.1
-- Removed patch 199 and 207 (upstream)
-
-* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
-- Remove versioned libpython from devel package
-
-* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
-- add correct arch for ppc64/ppc64le to fix build failure
-
-* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
-- Hide the private _Py_atomic_xxx symbols from public header
-
-* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
-- Rebuild with wheel set to 1
-
-* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
-- Update to 3.5.0
-
-* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
-- python3-devel: Require python-macros for version independant macros such as
- python_provide. See fpc#281 and fpc#534.
-
-* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
-- Use 1024bit DH key in test_ssl
-- Use -O0 when compiling -debug build
-- Update pip version variable to the version we actually ship
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
-- Make relocating Python by changing _prefix actually work
-Resolves: rhbz#1231801
-
-* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
-- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
-
-* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
-- Updated to 3.4.3
-- BuildPython now accepts additional build options
-- Temporarily disabled test_gdb on arm (rhbz#1196181)
-
-* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
-- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
- (
http://bugs.python.org/issue23433)
-
-* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
-- Rebuilt for Fedora 23 Change
-
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
-
-* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
-- Own systemtap dirs (#710733)
-
-* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
-- build with valgrind on ppc64le
-- disable test_gdb on s390(x) until rhbz#1181034 is resolved
-
-* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
-- New patches: 170 (gc asserts), 200 (gettext headers),
- 201 (gdbm memory leak)
-
-* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
-- OpenSSL disabled SSLv3 in SSLv23 method
-
-* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
-- Update to 3.4.2
-- Refreshed patches: 156 (gdb autoload)
-- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
-
-* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
-- Fix CVE-2014-4650 - CGIHTTPServer URL handling
-Resolves: rhbz#1113529
-
-* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
-- exclude test_gdb on ppc* (rhbz#1132488)
-
-* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
-- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
-
-* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
-
-* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
-- aarch64 has valgrind, just list those that don't support it
-
-* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
-
-* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
-- bump release and rebuild to link with the correct tcl/tk libs on ppcle
-
-* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
-- Change paths to bundled projects in rewheel patch
-
-* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
-- In config script, use uname -m to write the arch
-
-* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
-- update the arch list where valgrind exists - %%power64 includes also
- ppc64le which is not supported yet
-
-* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
-- Forward arguments to the arch specific config script
-Resolves: rhbz#1102683
-
-* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
-- Rename python3.Xm-config script to arch specific.
-Resolves: rhbz#1091815
-
-* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
-- Use python3-*, not python-* runtime requires on setuptools and pip
-- rebuild for tcl-8.6
-
-* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
-- Update the rewheel module
-
-* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
-- Fix multilib dependencies.
-Resolves: rhbz#1091815
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
-- Update to Python 3.4.1
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
-- Fix test_gdb failure on ppc64le
-Resolves: rhbz#1095355
-
-* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
-- Add macro %%python3_version_nodots
-
-* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
-- Disable test_faulthandler, test_gdb on aarch64
-Resolves: rhbz#1045193
-
-* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
-- Don't add Werror=declaration-after-statement for extension
- modules through setup.py (PyBT#21121)
-
-* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
-- Add setuptools and pip to Requires
-
-* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
-- Point __os_install_post to correct brp-* files
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
-- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
-- Update to Python 3.4 final
-- Add patch adding the rewheel module
-- Merge patches from master
-
-* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
-- Update to Python 3.4 beta 2.
-- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
-- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
-
-* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
-- Update to Python 3.4 beta 1.
-- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
-ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
-- Removed patch 00187 (remove pthread atfork; upstreamed)
-
-* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
-- Update to Python 3.4 alpha 4.
-- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
-114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
-test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
-from py_compile)
-- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
-Koji), 142 (the mock issue that caused this is fixed)
-- Added patch 187 (remove thread atfork) - will be in next version
-- Refreshed script for checking pyc and pyo timestamps with new ignored files.
-- The fips patch is disabled for now until upstream makes a final decision
-what to do with sha3 implementation for 3.4.0.
-
-* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
-- Bytecompile all *.py files properly during build (rhbz#1023607)
-
-* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
-- Added fix for CVE-2013-4238 (rhbz#996399)
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
-- fix up indentation in arm patch
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
-- disable a test that fails on arm
-- enable valgrind support on arm arches
-
-* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
-- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
-
-* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
-- Add patch for CVE-2013-2099 (rhbz#963261).
-
-* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
-- Updated to Python 3.3.2.
-- Refreshed patches: 153 (gdb test noise)
-- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
-test threads)
-- Synced patch numbers with python.spec.
-
-* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
-- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
-
-* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
-- Add patch that enables building on ppc64p7 (replace the sed, so that
-we get consistent with python2 spec and it's more obvious that we're doing it.
-
-* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
-- Add fix for gdb tests failing on arm, rhbz#951802.
-
-* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
-- Updated to Python 3.3.1.
-- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
-153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
-keeping few more downstream tests)
-- Removed patches: 3 (audiotest.au made it to upstream tarball)
-- Removed workaround for
http://bugs.python.org/issue14774, discussed in
-http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
-- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
-- renumber patches to keep them in sync with python.spec
-
-* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
-- Fix error in platform.platform() when non-ascii byte strings are decoded to
- unicode (rhbz#922149)
-
-* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
-- Fix up shared library extension (rhbz#889784)
-
-* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
-- add ppc64p7 build target, optimized for Power7
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
-- add workaround for ENOPROTOOPT seen running selftests in Koji
-(rhbz#913732)
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
-- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
-
-* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
-- add aarch64 (rhbz#909783)
-
-* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
-- add BR on bluez-libs-devel (rhbz#879720)
-
-* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
-- 3.3.0rc3 -> 3.3.0; drop alphatag
-
-* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
-- 3.3.0rc2 -> 3.3.0rc3
-
-* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
-- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
-
-* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
-- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
-
-* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
-- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
-134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
-correctly when LANG=C (patch 55); importlib.test was moved to
-test.test_importlib upstream
-
-* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
-- disable some failing checks on PPC* (rhbz#846849)
-
-* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
-- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
-patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
-configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream issue
12326);
-"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
-for stdlib (upstream issues 10645 and 12218); email/test moved to
-test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
-_decimal and _lzma modules; make collections modules explicit in payload again
-(upstream issue 11085); add _testbuffer module to tests subpackage (added in
-upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
-workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
-distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
-_lzma module); skip some tests within test_socket (patch 163)
-
-* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
-
-* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-
-* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
-- use macro for power64 (rhbz#834653)
-
-* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
-- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
-
-* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
-- fix tapset for debug build
-
-* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
-- update uid/gid handling to avoid int overflows seen with uid/gid
-values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
-
-* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
-- renumber autotools patch from 300 to 5000
-- specfile cleanups
-
-* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
-- fix test_gdb.py (patch 156; rhbz#817072)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
-- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
-generating SELinux denials on "import ctypes" and "import uuid" when
embedding
-Python within httpd (patch 155; rhbz#814391)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
-- add explicit version requirements on expat to avoid linkage problems with
-XML_SetHashSalt
-
-* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
-- fix test_gdb (patch 153)
-
-* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
-- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
-values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
-
-* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
-- use newly installed python for byte compiling (now for real)
-
-* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
-- use newly installed python for byte compiling (#787498)
-
-* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
-- Build with $RPM_LD_FLAGS (#756863).
-- Use xz-compressed source tarball.
-
-* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
-- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
-
-* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
-- python3-devel missing autogenerated pkgconfig() provides (#746751)
-
-* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
-- cherrypick fix for distutils not using __pycache__ when byte-compiling
-files (rhbz#722578)
-
-* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
-- re-enable gdbm (patch 148; rhbz#742242)
-
-* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
-- add a sys._debugmallocstats() function (patch 147)
-
-* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
-- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
-_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
-
-* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
-- disable gdbm module to prepare for gdbm soname bump
-
-* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
-- renumber and rename patches for consistency with python.spec (8 to 55, 106
-to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
-
-* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
-- rewrite of "check", introducing downstream-only hooks for skipping specific
-cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
-fine-grained manner than before; (patches 106, 133-142 sparsely, moving
-patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
-
-* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
-- 3.2.2
-
-* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
-- run selftests with "--verbose"
-- disable parts of test_io on ppc (rhbz#732998)
-
-* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
-- use "--findleaks --verbose3" when running test suite
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
-- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
-ppc to avoid aliasing violations (patch 130; rhbz#698726)
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
-- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
-
-* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
-- add %%python3_version to the rpm macros (rhbz#719082)
-
-* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
-- disable some tests on sparc arches
-
-* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
-- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
-of static library build (due to Modules/_testembed; patch 6), autotool
-intermediates (patch 300)
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
-- use the gdb hooks from the upstream tarball, rather than keeping our own copy
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
-- don't run test_openpty and test_pty in %%check
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
-- cleanup of BuildRequires; add comment headings to specfile sections
-
-* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
-- fix the libpython.stp systemtap tapset (rhbz#697730)
-
-* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
-- 3.2
-- drop alphatag
-- regenerate autotool patch
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
-- add a /usr/bin/python3-debug symlink within the debug subpackage
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
-- 3.2rc3
-- regenerate autotool patch
-
-* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
-
-* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
-- 3.2rc2
-
-* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
-- 3.2rc1
-- rework patch 6 (static lib removal)
-- remove upstreamed patch 130 (ppc debug build)
-- regenerate patch 300 (autotool intermediates)
-- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
-- added libpython3.so and 2to3-3.2
-
-* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
-- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
-error with dynamic annotations (when configured using --with-valgrind)
-- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
-
-* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
-- add --with-valgrind to configuration (on architectures that support this)
-
-* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
-- work around test_subprocess failure seen in koji (patch 129)
-
-* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
-- 3.2b2
-- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
-patch 8 (systemtap), patch 102 (lib64)
-- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
-patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
-fixed upstream)
-- regenerate patch 300 (autotool intermediates)
-- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
-patch 128)
-- stop using runtest.sh in %%check (dropped by upstream), replacing with
-regrtest; fixup list of failing tests
-- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
-- rework manifests of shared libraries to use "SOABI_" macros, reflecting
-PEP 3149
-- drop itertools, operator and _collections modules from the manifests as py3k
-commit r84058 moved these inside libpython; json/tests moved to test/json_tests
-- move turtle code into the tkinter subpackage
-
-* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
-- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
-
-* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
-- move most of the content of the core package to the libs subpackage, given
-that the libs aren't meaningfully usable without the standard libraries
-
-* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
-- Move test.support to core package (rhbz#596258)
-- Add various missing __pycache__ directories to payload
-
-* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
-- Add __pycache__ directory for site-packages
-
-* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
-- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
-- make find-provides-without-python-sonames.sh 64bit aware
-
-* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
-- 3.2a1; add alphatag
-- rework %%files in the light of PEP 3147 (__pycache__)
-- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
-better job of things, and the %%files explicitly lists our modules (r82746
-appears to break the old way of doing things). This leads to various modules
-changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
-dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
-_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
-testing/devel purposes)
-- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
-- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
-plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
-- add machinery for rebuilding "configure" and friends, using the correct
-version of autoconf (patch 300)
-- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
-- "modulator" was removed upstream
-- drop "-b" from patch applications affecting .py files to avoid littering the
-installation tree
-
-* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
-- Turn on computed-gotos.
-- Fix for parallel make and graminit.c
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
-- rebuild
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
-- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
-a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
-
-* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
-- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
-- reformat whitespace in audioop.c (patch 106)
-- CVE-2010-1634: fix various integer overflow checks in the audioop
-module (patch 107)
-- CVE-2010-2089: further checks within the audioop module (patch 108)
-- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
-
-* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
-- reading the timestamp counter is available only on some arches (see Python/ceval.c)
-
-* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
-- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
-(patch 105)
-
-* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
-- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
-(patch 104); enable them and the WITH_TSC option within the debug build
-
-* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
-- build and install two different configurations of Python 3: debug and
-standard, packaging the debug build in a new "python3-debug" subpackage
-(patch 103)
-
-* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
-- exclude test_http_cookies when running selftests, due to hang seen on
-http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
-11 hours)
-- update python-gdb.py from v5 to py3k version submitted upstream
-
-* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
-- update python-gdb.py from v4 to v5 (improving performance and stability,
-adding commands)
-
-* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
-- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
-cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
-and exceptions)
-
-* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
-- refresh gdb hooks to v3 (reworking how they are packaged)
-
-* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
-- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
-- drop upstreamed patch 2 (.pyc permissions handling)
-- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
-- drop upstreamed patch 200 (path-fixing script)
-
-* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
-- fix typo in libpython.stp (rhbz:575336)
-
-* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
-- add pyfuntop.stp example (source 7)
-- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
-consistency with python.spec
-
-* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
-- rebuild for new package of redhat-rpm-config (rhbz:564527)
-- use 'install -p' when running 'make install'
-
-* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
-- split configure options into multiple lines for easy of editing
-- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
-tapset defining "python.function.entry" and "python.function.return"
to make
-the markers easy to use (dmalcolm; source 5), and an example of using the
-tapset to the docs (dmalcolm; source 6) (rhbz:545179)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
-- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
-%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
-ldconfig (bug 562980), and which should also ensure it becomes part of the
-debuginfo subpackage, rather than the libs subpackage
-- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
-configure script, and to avoid fragile scripts that try to figure this out
-dynamically (e.g. for the -gdb.py change)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
-- add gdb hooks for easier debugging (Source 4)
-
-* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
-- update python-3.1.1-config.patch to remove downstream customization of build
-of pyexpat and elementtree modules
-- add patch adapted from upstream (patch 7) to add support for building against
-system expat; add --with-system-expat to "configure" invocation
-- remove embedded copies of expat and zlib from source tree during "prep"
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
-- introduce %%{dynload_dir} macro
-- explicitly list all lib-dynload files, rather than dynamically gathering the
-payload into a temporary text file, so that we can be sure what we are
-shipping
-- introduce a macros.pybytecompile source file, to help with packaging python3
-modules (Source3; written by Toshio)
-- rename "2to3-3" to "python3-2to3" to better reflect python 3 module
packaging
-plans
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
-- change python-3.1.1-config.patch to remove our downstream change to curses
-configuration in Modules/Setup.dist, so that the curses modules are built using
-setup.py with the downstream default (linking against libncursesw.so, rather
-than libncurses.so), rather than within the Makefile; add a test to %%install
-to verify the dso files that the curses module is linked against the correct
-DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
-
-* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
-- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
-builds for setting up the python3 copy of the source tree)
-
-* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
-- move lib2to3 from -tools subpackage to main package (bug 556667)
-
-* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
-- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
-- use the %%{_isa} macro to ensure that the python-devel dependency on python
-is for the correct multilib arch (#555943)
-- delete bundled copy of libffi to make sure we use the system one
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
-- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
-docs, rather than the 2.6 build
-
-* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
-- replace references to /usr with %%{_prefix}; replace references to
-/usr/include with %%{_includedir} (Toshio)
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
-- fix permission on find-provides-without-python-sonames.sh from 775 to 755
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
-- remove build-time requirements on tix and tk, since we already have
-build-time requirements on the -devel subpackages for each of these (Thomas
-Spura)
-- replace usage of %%define with %%global (Thomas Spura)
-- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
-longer be necessary
-- move various test files from the "tools"/"tkinter" subpackages to
the "test"
-subpackage
-
-* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
-- add %%check section (thanks to Thomas Spura)
-- update patch 4 to use correct shebang line
-- get rid of stray patch file from buildroot
-
-* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
-- switched a few instances of "find |xargs" to "find -exec" for
consistency.
-- made the description of __os_install_post more accurate.
-
-* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
-- add macros.python3 to the -devel subpackage, containing common macros for use
-when packaging python3 modules
-
-* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
-- add a provides of "python(abi)" (see bug 532118)
-- fix issues identified by a.badger in package review (bug 526126, comment 39):
- - use "3" thoughout metadata, rather than "3.*"
- - remove conditional around "pkg-config openssl"
- - use standard cleanup of RPM_BUILD_ROOT
- - replace hardcoded references to /usr with _prefix macro
- - stop removing egg-info files
- - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
-up shebang lines
- - stop attempting to remove no-longer-present .cvsignore files
- - move the post/postun sections above the "files" sections
-
-* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
-- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
-flag is used by default in the upstream code
-- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
-_init_posix(), so we include them in the core package, along with their parent
-directories (bug 531901)
-
-* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
-- reword description, based on suggestion by amcnabb
-- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
-- fix the test_tk and test_ttk_* selftests (patch 5)
-- fix up the specfile's handling of shebang/perms to avoid corrupting
-test_httpservers.py (sed command suggested by amcnabb)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
-- fixup importlib/_bootstrap.py so that it correctly handles being unable to
-open .pyc files for writing (patch 2, upstream issue 7187)
-- actually apply the rpath patch (patch 1)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
-- update patch0's setup of the crypt module to link it against libcrypt
-- update patch0 to comment "datetimemodule" back out, so that it is built
-using setup.py (see Setup, option 3), thus linking it statically against
-timemodule.c and thus avoiding a run-time "undefined symbol:
-_PyTime_DoubleToTimet" failure on "import datetime"
-
-* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
-- remove executable flag from various files that shouldn't have it
-- fix end-of-line encodings
-- fix a character encoding
-
-* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
-- disable invocation of brp-python-bytecompile in postprocessing, since
-it would be with the wrong version of python (adapted from ivazquez'
-python3000 specfile)
-- use a custom implementation of __find_provides in order to filter out bogus
-provides lines for the various .so modules
-- fixup distutils/unixccompiler.py to remove standard library path from rpath
-(patch 1, was Patch0 in ivazquez' python3000 specfile)
-- split out libraries into a -libs subpackage
-- update summaries and descriptions, basing content on ivazquez' specfile
-- fixup executable permissions on .py, .xpm and .xbm files, based on work in
-ivazquez's specfile
-- get rid of DOS batch files
-- fixup permissions for shared libraries from non-standard 555 to standard 755
-- move /usr/bin/python*-config to the -devel subpackage
-- mark various directories as being documentation
-
-* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
-- Initial package for Python 3.
-
commit b796d42367dc4156790921c699e482b3d38dbdc1
Merge: 13cea58 3dcd1e8
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 6 17:21:53 2019 +0100
Merge python38 from review request
https://bugzilla.redhat.com/show_bug.cgi?id=1672833
commit 13cea58a5cc47a3318ab3a999861fa522576e19c
Author: Gwyn Ciesla <limb(a)fedoraproject.org>
Date: Wed Feb 6 16:18:54 2019 +0000
Added the README
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..4a3c78a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# python38
+
+The python38 package
\ No newline at end of file
commit 3dcd1e8c08308e6f98071561a324124279951d69
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Feb 5 12:35:53 2019 +0100
Make flat, rename to python38
diff --git a/python3.rpmlintrc b/python3.rpmlintrc
deleted file mode 100644
index d59fe13..0000000
--- a/python3.rpmlintrc
+++ /dev/null
@@ -1,75 +0,0 @@
-# KNOWN BUGS:
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
-addFilter(r'crypto-policy-non-compliance-openssl')
-
-
-# TESTS:
-addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3.\d/test')
-
-
-# OTHER DELIBERATES:
-# chroot function
-addFilter(r'missing-call-to-chdir-with-chroot')
-
-# intentionally unversioned and selfobsoleted
-addFilter(r'unversioned-explicit-obsoletes python')
-addFilter(r'self-obsoletion python3\d obsoletes python3\d')
-
-# intentionally hardcoded
-addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
-
-# intentional for our pythonXY package
-addFilter(r'python3\d\.[^:]+: (E|W): devel-file-in-non-devel-package')
-
-# we have non binary stuff, python files
-addFilter(r'only-non-binary-in-usr-lib')
-
-# some devel files that are deliberately needed
-addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
-addFilter(r'devel-file-in-non-devel-package
/usr/lib(64)?/python3\.\d/distutils/tests/xxmodule\.c')
-
-
-# SORRY, NOT SORRY:
-# manual pages
-addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix|msgfmt|pygettext)')
-addFilter(r'no-manual-page-for-binary python3.*-config$')
-addFilter(r'no-manual-page-for-binary python3.\dd?m$')
-
-# missing documentation from subpackages
-addFilter(r'^python3\d?-(debug|tkinter|test|idle)\.[^:]+: (E|W):
no-documentation')
-
-# platform python is obsoleted, but not provided
-addFilter(r'obsolete-not-provided platform-python')
-
-
-# RPMLINT IMPERFECTIONS
-#
https://github.com/rpm-software-management/rpmlint/issues/123
-addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3393')
-#
https://github.com/rpm-software-management/rpmlint/pull/133
-addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3394')
-
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1550562
-#
https://github.com/rpm-software-management/rpmlint/issues/128
-addFilter(r'python-bytecode-inconsistent-mtime .* 1970')
-
-# debugsource
-addFilter(r'^python3\d?-debugsource\.[^:]+: (E|W): no-documentation')
-
-# debuginfo
-addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(build-id\)')
-
-# this is OK for F28+
-addFilter(r'library-without-ldconfig-post')
-
-# debug package contains devel and non-devel files
-addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-package')
-
-# this goes to other subpackage, hence not actually dangling, the read error is bogus
-addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
-addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
-
-# we need this macro to evaluate, even if the line starts with #
-addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
-
-# SPELLING ERRORS
-addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
diff --git a/python3.spec b/python3.spec
deleted file mode 100644
index bb6d0a9..0000000
--- a/python3.spec
+++ /dev/null
@@ -1,2673 +0,0 @@
-# ==================
-# Top-level metadata
-# ==================
-
-%global pybasever 3.8
-
-# pybasever without the dot:
-%global pyshortver 38
-
-Name: python3
-Summary: Interpreter of the Python programming language
-URL:
https://www.python.org/
-
-# WARNING When rebasing to a new Python version,
-# remember to update the python3-docs package as well
-%global general_version %{pybasever}.0
-%global prerel a1
-%global upstream_version %{general_version}%{?prerel}
-Version: %{general_version}%{?prerel:~%{prerel}}
-Release: 1%{?dist}
-License: Python
-
-
-# ==================================
-# Conditionals controlling the build
-# ==================================
-
-# Note that the bcond macros are named for the CLI option they create.
-# "%%bcond_without" means "ENABLE by default and create a --without
option"
-
-
-# Flat package, i.e. python36, python37, python38 for tox etc.
-# warning: changes some other defaults
-# in Fedora, never turn this on for the python3 package
-# and always keep it on for python37 etc.
-# WARNING: This does not change the package name and summary above
-%bcond_with flatpackage
-
-# Whether to use RPM build wheels from the python-{pip,setuptools}-wheel package
-# Uses upstream bundled prebuilt wheels otherwise
-%bcond_without rpmwheels
-
-# Expensive optimizations (mainly, profile-guided optimizations)
-%ifarch %{ix86} x86_64
-%bcond_without optimizations
-%else
-# On some architectures, the optimized build takes tens of hours, possibly
-# longer than Koji's 24-hour timeout. Disable optimizations here.
-%bcond_with optimizations
-%endif
-
-# Run the test suite in %%check
-%bcond_without tests
-
-# Extra build for debugging the interpreter or C-API extensions
-# (the -debug subpackages)
-%if %{with flatpackage}
-%bcond_with debug_build
-%else
-%bcond_without debug_build
-%endif
-
-# Support for the GDB debugger
-%bcond_without gdb_hooks
-
-# The dbm.gnu module (key-value database)
-%bcond_without gdbm
-
-# Main interpreter loop optimization
-%bcond_without computed_gotos
-
-# Support for the Valgrind debugger/profiler
-%ifarch %{valgrind_arches}
-%bcond_without valgrind
-%else
-%bcond_with valgrind
-%endif
-
-
-# Notes from bootstraping Python 3.7:
-#
https://fedoraproject.org/wiki/SIGs/Python/UpgradingPython
-
-
-# =====================
-# General global macros
-# =====================
-
-%global pylibdir %{_libdir}/python%{pybasever}
-%global dynload_dir %{pylibdir}/lib-dynload
-
-# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
-# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
-%global ABIFLAGS_optimized m
-%global ABIFLAGS_debug dm
-
-%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
-%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
-
-# All bytecode files are in a __pycache__ subdirectory, with a name
-# reflecting the version of the bytecode.
-# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
-# For example,
-# foo/bar.py
-# has bytecode at:
-# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
-%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
-
-# Python's configure script defines SOVERSION, and this is used in the Makefile
-# to determine INSTSONAME, the name of the libpython DSO:
-# LDLIBRARY='libpython$(VERSION).so'
-# INSTSONAME="$LDLIBRARY".$SOVERSION
-# We mirror this here in order to make it easier to add the -gdb.py hooks.
-# (if these get out of sync, the payload of the libs subpackage will fail
-# and halt the build)
-%global py_SOVERSION 1.0
-%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
-%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
-
-# Disable automatic bytecompilation. The python3 binary is not yet be
-# available in /usr/bin when Python is built. Also, the bytecompilation fails
-# on files that test invalid syntax.
-%undefine py_auto_byte_compile
-
-# For multilib support, files that are different between 32- and 64-bit arches
-# need different filenames. Use "64" or "32" according to the word
size.
-# Currently, the best way to determine an architecture's word size happens to
-# be checking %%{_lib}.
-%if "%{_lib}" == "lib64"
-%global wordsize 64
-%else
-%global wordsize 32
-%endif
-
-
-# =======================
-# Build-time requirements
-# =======================
-
-# (keep this list alphabetized)
-
-BuildRequires: autoconf
-BuildRequires: bluez-libs-devel
-BuildRequires: bzip2
-BuildRequires: bzip2-devel
-BuildRequires: desktop-file-utils
-BuildRequires: expat-devel
-
-BuildRequires: findutils
-BuildRequires: gcc-c++
-%if %{with gdbm}
-BuildRequires: gdbm-devel
-%endif
-BuildRequires: glibc-all-langpacks
-BuildRequires: glibc-devel
-BuildRequires: gmp-devel
-BuildRequires: libappstream-glib
-BuildRequires: libffi-devel
-BuildRequires: libnsl2-devel
-BuildRequires: libtirpc-devel
-BuildRequires: libGL-devel
-BuildRequires: libuuid-devel
-BuildRequires: libX11-devel
-BuildRequires: ncurses-devel
-
-BuildRequires: openssl-devel
-BuildRequires: pkgconfig
-BuildRequires: readline-devel
-BuildRequires: sqlite-devel
-BuildRequires: gdb
-
-BuildRequires: tar
-BuildRequires: tcl-devel
-BuildRequires: tix-devel
-BuildRequires: tk-devel
-
-%if %{with valgrind}
-BuildRequires: valgrind-devel
-%endif
-
-BuildRequires: xz-devel
-BuildRequires: zlib-devel
-
-BuildRequires: /usr/bin/dtrace
-
-# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
-BuildRequires: /usr/sbin/ifconfig
-
-%if %{with rpmwheels}
-BuildRequires: python-setuptools-wheel
-BuildRequires: python-pip-wheel
-%endif
-
-
-# =======================
-# Source code and patches
-# =======================
-
-Source:
https://www.python.org/ftp/python/%{general_version}/Python-%{upstream_ve...
-
-# A simple script to check timestamps of bytecode files
-# Run in check section with Python that is currently being built
-# Originally written by bkabrda
-Source8: check-pyc-timestamps.py
-
-# Desktop menu entry for idle3
-Source10: idle3.desktop
-
-# AppData file for idle3
-Source11: idle3.appdata.xml
-
-# 00001 #
-# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
-# Was Patch0 in ivazquez' python3000 specfile:
-Patch1: 00001-rpath.patch
-
-# 00102 #
-# Change the various install paths to use /usr/lib64/ instead or /usr/lib
-# Only used when "%%{_lib}" == "lib64"
-# Not yet sent upstream.
-Patch102: 00102-lib64.patch
-
-# 00111 #
-# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
-# a libpythonMAJOR.MINOR.a
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
-# Downstream only: not appropriate for upstream
-Patch111: 00111-no-static-lib.patch
-
-# 00132 #
-# Add non-standard hooks to unittest for use in the "check" phase below, when
-# running selftests within the build:
-# @unittest._skipInRpmBuild(reason)
-# for tests that hang or fail intermittently within the build environment, and:
-# @unittest._expectedFailureInRpmBuild
-# for tests that always fail within the build environment
-#
-# The hooks only take effect if WITHIN_PYTHON_RPM_BUILD is set in the
-# environment, which we set manually in the appropriate portion of the "check"
-# phase below (and which potentially other python-* rpms could set, to reuse
-# these unittest hooks in their own "check" phases)
-Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
-
-# 00160 #
-# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
-# header files in the build chroot, but may not be supported in the running
-# kernel, hence we disable this test in an rpm build.
-# Adding these was upstream issue
http://bugs.python.org/issue10142
-# Not yet sent upstream
-Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
-
-# 00163 #
-# Some tests within test_socket fail intermittently when run inside Koji;
-# disable them using unittest._skipInRpmBuild
-# Not yet sent upstream
-Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
-
-# 00178 #
-# Don't duplicate various FLAGS in sysconfig values
-#
http://bugs.python.org/issue17679
-# Does not affect python2 AFAICS (different sysconfig values initialization)
-Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
-
-# 00189 #
-# Instead of bundled wheels, use our RPM packaged wheels from
-# /usr/share/python-wheels
-Patch189: 00189-use-rpm-wheels.patch
-
-# 00205 #
-# LIBPL variable in makefile takes LIBPL from configure.ac
-# but the LIBPL variable defined there doesn't respect libdir macro
-Patch205: 00205-make-libpl-respect-lib64.patch
-
-# 00251
-# 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
-Patch251: 00251-change-user-install-location.patch
-
-# 00274 #
-# Upstream uses Debian-style architecture naming. Change to match Fedora.
-Patch274: 00274-fix-arch-names.patch
-
-# 00316 #
-# We remove the exe files from distutil's bdist_wininst
-# So we mark the command as unsupported - and the tests are skipped
-Patch316: 00316-mark-bdist_wininst-unsupported.patch
-
-# (New patches go here ^^^)
-#
-# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
-# please try to keep the patch numbers in-sync between all specfiles.
-#
-# More information, and a patch number catalog, is at:
-#
-#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
-
-
-# ==========================================
-# Descriptions, and metadata for subpackages
-# ==========================================
-
-# People might want to dnf install pythonX.Y instead of pythonXY;
-# we enable this in both flat and nonflat package.
-Provides: python%{pybasever} = %{version}-%{release}
-
-%if %{without flatpackage}
-
-# Packages with Python modules in standard locations automatically
-# depend on python(abi). Provide that here.
-Provides: python(abi) = %{pybasever}
-
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-
-# In order to support multiple Python interpreters for development purposes,
-# packages with the naming scheme flatpackage (e.g. python35) exist for
-# non-default versions of Python 3.
-# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
-# these names here.
-Provides: python%{pyshortver} = %{version}-%{release}
-# Note that using Obsoletes without package version is not standard practice.
-# Here we assert that *any* version of the system's default interpreter is
-# preferable to an "extra" interpreter. For example, python3-3.6.1 will
-# replace python36-3.6.2.
-Obsoletes: python%{pyshortver}
-
-# Previously, this was required for our rewheel patch to work.
-# This is technically no longer needed, but we keep it recommended
-# for the developer experience.
-Recommends: python3-setuptools
-Recommends: python3-pip
-
-# This prevents ALL subpackages built from this spec to require
-# /usr/bin/python3*. Granularity per subpackage is impossible.
-# It's intended for the libs package not to drag in the interpreter, see
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
-# All others require %%{name} anyway.
-%global __requires_exclude ^/usr/bin/python3
-
-
-# The description used both for the SRPM and the main `python3` subpackage:
-%description
-Python is an accessible, high-level, dynamically typed, interpreted programming
-language, designed with an emphasis on code readability.
-It includes an extensive standard library, and has a vast ecosystem of
-third-party libraries.
-
-The %{name} package provides the "python3" executable: the reference
-interpreter for the Python language, version 3.
-The majority of its standard library is provided in the %{name}-libs package,
-which should be installed automatically along with %{name}.
-The remaining parts of the Python standard library are broken out into the
-%{name}-tkinter and %{name}-test packages, which may need to be installed
-separately.
-
-Documentation for Python is provided in the %{name}-docs package.
-
-Packages containing additional libraries for Python are generally named with
-the "%{name}-" prefix.
-
-
-%package libs
-Summary: Python runtime libraries
-
-%if %{with rpmwheels}
-Requires: python-setuptools-wheel
-Requires: python-pip-wheel
-%else
-Provides: bundled(python3-pip) = 18.1
-Provides: bundled(python3-setuptools) = 40.6.2
-%endif
-
-# There are files in the standard library that have python shebang.
-# We've filtered the automatic requirement out so libs are installable without
-# the main package. This however makes it pulled in by default.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
-Recommends: %{name}%{?_isa} = %{version}-%{release}
-
-%description libs
-This package contains runtime libraries for use by Python:
-- the majority of the Python standard library
-- a dynamically linked library for use by applications that embed Python as
- a scripting language, and by the main "python3" executable
-
-
-%package devel
-Summary: Libraries and header files needed for Python development
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-BuildRequires: python-rpm-macros
-Requires: python-rpm-macros
-Requires: python3-rpm-macros
-Requires: python3-rpm-generators
-
-# This is not "API" (packages that need setuptools should still BuildRequire
it)
-# However some packages apparently can build both with and without setuptools
-# producing egg-info as file or directory (depending on setuptools presence).
-# Directory-to-file updates are problematic in RPM, so we ensure setuptools is
-# installed when -devel is required.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1623914
-# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
-Requires: python3-setuptools
-
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
-# TODO change to a specific subpackage once available (#1218294)
-Requires: redhat-rpm-config
-
-Provides: %{name}-2to3 = %{version}-%{release}
-Provides: 2to3 = %{version}-%{release}
-
-Conflicts: %{name} < %{version}-%{release}
-
-%description devel
-This package contains the header files and configuration needed to compile
-Python extension modules (typically written in C or C++), to embed Python
-into other programs, and to make binary distributions for Python libraries.
-
-It also contains the necessary macros to build RPM packages with Python modules
-and 2to3 tool, an automatic source converter from Python 2.X.
-
-
-%package idle
-Summary: A basic graphical development environment for Python
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-tkinter = %{version}-%{release}
-
-Provides: idle3 = %{version}-%{release}
-
-Provides: %{name}-tools = %{version}-%{release}
-Provides: %{name}-tools%{?_isa} = %{version}-%{release}
-Obsoletes: %{name}-tools < %{version}-%{release}
-
-%description idle
-IDLE is Pythons Integrated Development and Learning Environment.
-
-IDLE has the following features: Python shell window (interactive
-interpreter) with colorizing of code input, output, and error messages;
-multi-window text editor with multiple undo, Python colorizing,
-smart indent, call tips, auto completion, and other features;
-search within any window, replace within editor windows, and
-search through multiple files (grep); debugger with persistent
-breakpoints, stepping, and viewing of global and local namespaces;
-configuration, browsers, and other dialogs.
-
-
-%package tkinter
-Summary: A GUI toolkit for Python
-Requires: %{name} = %{version}-%{release}
-
-%description tkinter
-The Tkinter (Tk interface) library is a graphical user interface toolkit for
-the Python programming language.
-
-
-%package test
-Summary: The self-test suite for the main python3 package
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-
-%description test
-The self-test suite for the Python interpreter.
-
-This is only useful to test Python itself. For testing general Python code,
-you should use the unittest module from %{name}-libs, or a library such as
-%{name}-pytest or %{name}-nose.
-
-
-%if %{with debug_build}
-%package debug
-Summary: Debug version of the Python runtime
-
-# The debug build is an all-in-one package version of the regular build, and
-# shares the same .py/.pyc files and directories as the regular build. Hence
-# we depend on all of the subpackages of the regular build:
-Requires: %{name}%{?_isa} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-Requires: %{name}-devel%{?_isa} = %{version}-%{release}
-Requires: %{name}-test%{?_isa} = %{version}-%{release}
-Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
-Requires: %{name}-idle%{?_isa} = %{version}-%{release}
-
-%description debug
-python3-debug provides a version of the Python runtime with numerous debugging
-features enabled, aimed at advanced Python users such as developers of Python
-extension modules.
-
-This version uses more memory and will be slower than the regular Python build,
-but is useful for tracking down reference-counting issues and other bugs.
-
-The bytecode format is unchanged, so that .pyc files are compatible between
-this and the standard version of Python, but the debugging features mean that
-C/C++ extension modules are ABI-incompatible and must be built for each version
-separately.
-
-The debug build shares installation directories with the standard Python
-runtime, so that .py and .pyc files can be shared.
-Compiled extension modules use a special ABI flag ("d") in the filename,
-so extensions for both versions can co-exist in the same directory.
-%endif # with debug_build
-
-%else # with flatpackage
-
-Requires: redhat-rpm-config
-
-# We'll not provide this, on purpose
-# No package in Fedora shall ever depend on flatpackage via this
-%global __requires_exclude ^python\\(abi\\) = 3\\..$
-%global __provides_exclude ^python\\(abi\\) = 3\\..$
-
-%if %{with rpmwheels}
-Requires: python-setuptools-wheel
-Requires: python-pip-wheel
-%else
-Provides: bundled(python3-pip) = 18.1
-Provides: bundled(python3-setuptools) = 40.6.2
-%endif
-
-# The description for the flat package
-%description
-Python %{pybasever} package for developers.
-
-This package exists to allow developers to test their code against a newer
-version of Python. This is not a full Python stack and if you wish to run
-your applications with Python %{pybasever}, update your Fedora to a newer
-version once Python %{pybasever} is stable.
-
-%endif # with flatpackage
-
-# ======================================================
-# The prep phase of the build:
-# ======================================================
-
-%prep
-%setup -q -n Python-%{upstream_version}
-# Remove all exe files to ensure we are not shipping prebuilt binaries
-# note that those are only used to create Microsoft Windows installers
-# and that functionality is broken on Linux anyway
-find -name '*.exe' -print -delete
-
-# Remove bundled libraries to ensure that we're using the system copy.
-rm -r Modules/expat
-
-#
-# Apply patches:
-#
-%patch1 -p1
-
-%if "%{_lib}" == "lib64"
-%patch102 -p1
-%endif
-%patch111 -p1
-%patch132 -p1
-%patch160 -p1
-%patch163 -p1
-%patch178 -p1
-
-%if %{with rpmwheels}
-%patch189 -p1
-rm Lib/ensurepip/_bundled/*.whl
-%endif
-
-%patch205 -p1
-%patch251 -p1
-%patch274 -p1
-%patch316 -p1
-
-
-# Remove files that should be generated by the build
-# (This is after patching, so that we can use patches directly from upstream)
-rm configure pyconfig.h.in
-
-
-# ======================================================
-# Configuring and building the code:
-# ======================================================
-
-%build
-
-# Regenerate the configure script and pyconfig.h.in
-autoconf
-autoheader
-
-# Remember the current directory (which has sources and the configure script),
-# so we can refer to it after we "cd" elsewhere.
-topdir=$(pwd)
-
-# Get proper option names from bconds
-%if %{with computed_gotos}
-%global computed_gotos_flag yes
-%else
-%global computed_gotos_flag no
-%endif
-
-%if %{with optimizations}
-%global optimizations_flag "--enable-optimizations"
-%else
-%global optimizations_flag "--disable-optimizations"
-%endif
-
-# Set common compiler/linker flags
-export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
-export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export LINKCC="gcc"
-export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
-export LDFLAGS="$RPM_LD_FLAGS -g $(pkg-config --libs-only-L openssl)"
-
-# We can build several different configurations of Python: regular and debug.
-# Define a common function that does one build:
-BuildPython() {
- ConfName=$1
- ExtraConfigArgs=$2
- MoreCFlags=$3
-
- # Each build is done in its own directory
- ConfDir=build/$ConfName
- echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
- mkdir -p $ConfDir
- pushd $ConfDir
-
- # Normally, %%configure looks for the "configure" script in the current
- # directory.
- # Since we changed directories, we need to tell %%configure where to look.
- %global _configure $topdir/configure
-
-%configure \
- --enable-ipv6 \
- --enable-shared \
- --with-computed-gotos=%{computed_gotos_flag} \
- --with-dbmliborder=gdbm:ndbm:bdb \
- --with-system-expat \
- --with-system-ffi \
- --enable-loadable-sqlite-extensions \
- --with-dtrace \
- --with-lto \
- --with-ssl-default-suites=openssl \
-%if %{with valgrind}
- --with-valgrind \
-%endif
- $ExtraConfigArgs \
- %{nil}
-
- # Invoke the build
- make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
-
- popd
- echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
-}
-
-# Call the above to build each configuration.
-
-%if %{with debug_build}
-BuildPython debug \
- "--without-ensurepip --with-pydebug" \
- "-Og"
-%endif # with debug_build
-
-BuildPython optimized \
- "--without-ensurepip %{optimizations_flag}" \
- ""
-
-# ======================================================
-# Installing the built code:
-# ======================================================
-
-%install
-
-# As in %%build, remember the current directory
-topdir=$(pwd)
-
-# We install a collection of hooks for gdb that make it easier to debug
-# executables linked against libpython3* (such as /usr/bin/python3 itself)
-#
-# These hooks are implemented in Python itself (though they are for the version
-# of python that gdb is linked with)
-#
-# gdb-archer looks for them in the same path as the ELF file or its .debug
-# file, with a -gdb.py suffix.
-# We put them next to the debug file, because ldconfig would complain if
-# it found non-library files directly in /usr/lib/
-# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
-#
-# We'll put these files in the debuginfo package by installing them to e.g.:
-# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
-# (note that the debug path is /usr/lib/debug for both 32/64 bit)
-#
-# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
-# information
-
-%if %{with gdb_hooks}
-DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
-mkdir -p %{buildroot}$DirHoldingGdbPy
-%endif # with gdb_hooks
-
-# Multilib support for pyconfig.h
-# 32- and 64-bit versions of pyconfig.h are different. For multilib support
-# (making it possible to install 32- and 64-bit versions simultaneously),
-# we need to install them under different filenames, and to make the common
-# "pyconfig.h" include the right file based on architecture.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
-# Filanames are defined here:
-%global _pyconfig32_h pyconfig-32.h
-%global _pyconfig64_h pyconfig-64.h
-%global _pyconfig_h pyconfig-%{wordsize}.h
-
-# Use a common function to do an install for all our configurations:
-InstallPython() {
-
- ConfName=$1
- PyInstSoName=$2
- MoreCFlags=$3
- LDVersion=$4
-
- # Switch to the directory with this configuration's built files
- ConfDir=build/$ConfName
- echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
- mkdir -p $ConfDir
- pushd $ConfDir
-
- make \
- DESTDIR=%{buildroot} \
- INSTALL="install -p" \
- EXTRA_CFLAGS="$MoreCFlags" \
- install
-
- popd
-
-%if %{with gdb_hooks}
- # See comment on $DirHoldingGdbPy above
- PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
- cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
-%endif # with gdb_hooks
-
- # Rename the -devel script that differs on different arches to arch specific name
- mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
- echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
- %{buildroot}%{_bindir}/python${LDVersion}-config
- echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
- %{buildroot}%{_bindir}/python${LDVersion}-config
- chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
-
- # Make python3-devel multilib-ready
- mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
- %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
- cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
-#include <bits/wordsize.h>
-
-#if __WORDSIZE == 32
-#include "%{_pyconfig32_h}"
-#elif __WORDSIZE == 64
-#include "%{_pyconfig64_h}"
-#else
-#error "Unknown word size"
-#endif
-EOF
-
- echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
-}
-
-# Install the "debug" build first; any common files will be overridden with
-# later builds
-%if %{with debug_build}
-InstallPython debug \
- %{py_INSTSONAME_debug} \
- -O0 \
- %{LDVERSION_debug}
-%endif # with debug_build
-
-# Now the optimized build:
-InstallPython optimized \
- %{py_INSTSONAME_optimized} \
- "" \
- %{LDVERSION_optimized}
-
-# Install directories for additional packages
-install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
-%if "%{_lib}" == "lib64"
-# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
-# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
-# modules).
-# Note that rpmlint will complain about hardcoded library path;
-# this is intentional.
-install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
-%endif
-
-%if %{without flatpackage}
-# add idle3 to menu
-install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
-desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
-
-# Install and validate appdata file
-mkdir -p %{buildroot}%{_metainfodir}
-cp -a %{SOURCE11} %{buildroot}%{_metainfodir}
-appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/idle3.appdata.xml
-%endif
-
-# Make sure distutils looks at the right pyconfig.h file
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
-# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
-# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
-# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
-#
-# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
-# variants:
-sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
- %{buildroot}%{pylibdir}/distutils/sysconfig.py \
- %{buildroot}%{pylibdir}/sysconfig.py
-
-# Install pathfix.py to bindir
-# See
https://github.com/fedora-python/python-rpm-porting/issues/24
-cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
-
-# Install i18n tools to bindir
-# They are also in python2, so we version them
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1571474
-for tool in pygettext msgfmt; do
- cp -p Tools/i18n/${tool}.py %{buildroot}%{_bindir}/${tool}%{pybasever}.py
- ln -s ${tool}%{pybasever}.py %{buildroot}%{_bindir}/${tool}3.py
-done
-
-# Switch all shebangs to refer to the specific Python version.
-# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
-# so handle files named using other naming scheme separately.
-LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
- Tools/scripts/pathfix.py \
- -i "%{_bindir}/python%{pybasever}" -pn \
- %{buildroot} \
- %{buildroot}%{_bindir}/*%{pybasever}.py \
- %{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
-
-# Remove tests for python3-tools which was removed in
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
-rm -rf %{buildroot}%{pylibdir}/test/test_tools
-
-# Remove shebang lines from .py files that aren't executable, and
-# remove executability from .py files that don't have a shebang line:
-find %{buildroot} -name \*.py \
- \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
- -print -exec sed -i '1d' {} \; \) -o \( \
- -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
- -exec chmod a-x {} \; \) \)
-
-# Get rid of DOS batch files:
-find %{buildroot} -name \*.bat -exec rm {} \;
-
-# Get rid of backup files:
-find %{buildroot}/ -name "*~" -exec rm -f {} \;
-find . -name "*~" -exec rm -f {} \;
-
-# Get rid of a stray copy of the license:
-rm %{buildroot}%{pylibdir}/LICENSE.txt
-
-# Do bytecompilation with the newly installed interpreter.
-# This is similar to the script in macros.pybytecompile
-# compile *.pyc
-find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
-
-# Since we have pathfix.py in bindir, this is created, but we don't want it
-rm -rf %{buildroot}%{_bindir}/__pycache__
-
-# Fixup permissions for shared libraries from non-standard 555 to standard 755:
-find %{buildroot} -perm 555 -exec chmod 755 {} \;
-
-# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
-# avoid the user having to know the precise version and ABI flags.
-# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
-%if %{with debug_build} && %{without flatpackage}
-ln -s \
- %{_bindir}/python%{LDVERSION_debug} \
- %{buildroot}%{_bindir}/python3-debug
-%endif
-
-# There's 2to3-X.X executable and 2to3 soft link to it.
-# No reason to have both, so keep only 2to3 as an executable.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
-
-%if %{with flatpackage}
-# Remove stuff that would conflict with python3 package
-rm %{buildroot}%{_bindir}/python3
-rm %{buildroot}%{_bindir}/pydoc3
-rm %{buildroot}%{_bindir}/pathfix.py
-rm %{buildroot}%{_bindir}/pygettext3.py
-rm %{buildroot}%{_bindir}/msgfmt3.py
-rm %{buildroot}%{_bindir}/idle3
-rm %{buildroot}%{_bindir}/python3-*
-rm %{buildroot}%{_bindir}/2to3
-rm %{buildroot}%{_libdir}/libpython3.so
-rm %{buildroot}%{_mandir}/man1/python3.1*
-rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
-%endif
-
-
-# ======================================================
-# Checks for packaging issues
-# ======================================================
-
-%check
-
-# first of all, check timestamps of bytecode files
-find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
-
-# Ensure that the curses module was linked against libncursesw.so, rather than
-# libncurses.so
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
-ldd %{buildroot}/%{dynload_dir}/_curses*.so \
- | grep curses \
- | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
-
-# Ensure that the debug modules are linked against the debug libpython, and
-# likewise for the optimized modules and libpython:
-for Module in %{buildroot}/%{dynload_dir}/*.so ; do
- case $Module in
- *.%{SOABI_debug})
- ldd $Module | grep %{py_INSTSONAME_optimized} &&
- (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
-
- ;;
- *.%{SOABI_optimized})
- ldd $Module | grep %{py_INSTSONAME_debug} &&
- (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
- ;;
- esac
-done
-
-
-# ======================================================
-# Running the upstream test suite
-# ======================================================
-
-topdir=$(pwd)
-CheckPython() {
- ConfName=$1
- ConfDir=$(pwd)/build/$ConfName
-
- # Fedora sets TLSv1 as explicit minimum version.
- # Python's test suite assumes that the minimum protocol version is set to
- # a magic marker. We workaround the test problem by setting:
- export OPENSSL_CONF=/non-existing-file
- #
https://bugzilla.redhat.com/show_bug.cgi?id=1618753
-
- echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-
- # Note that we're running the tests using the version of the code in the
- # builddir, not in the buildroot.
-
- # Show some info, helpful for debugging test failures
- LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.pythoninfo
-
- # Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
- # our non-standard decorators take effect on the relevant tests:
- # @unittest._skipInRpmBuild(reason)
- # @unittest._expectedFailureInRpmBuild
- WITHIN_PYTHON_RPM_BUILD= \
- LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- -wW --slowest -j0 \
- -x test_distutils \
- -x test_bdist_rpm \
- -x test_gdb \
- %ifarch %{mips64}
- -x test_ctypes \
- %endif
- %ifarch ppc64le
- -x test_buffer \
- %endif
-
- echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-
-}
-
-%if %{with tests}
-
-# Check each of the configurations:
-%if %{with debug_build}
-CheckPython debug
-%endif # with debug_build
-CheckPython optimized
-
-%endif # with tests
-
-
-%files
-%license LICENSE
-%doc README.rst
-
-%if %{without flatpackage}
-%{_bindir}/pydoc*
-%{_bindir}/python3
-%else
-%{_bindir}/pydoc%{pybasever}
-%endif
-
-%{_bindir}/python%{pybasever}
-%{_bindir}/python%{pybasever}m
-%{_mandir}/*/*
-
-
-%if %{without flatpackage}
-%files libs
-%license LICENSE
-%doc README.rst
-%endif
-
-%dir %{pylibdir}
-%dir %{dynload_dir}
-
-%{pylibdir}/lib2to3
-%if %{without flatpackage}
-%exclude %{pylibdir}/lib2to3/tests
-%endif
-
-%dir %{pylibdir}/unittest/
-%dir %{pylibdir}/unittest/__pycache__/
-%{pylibdir}/unittest/*.py
-%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/asyncio/
-%dir %{pylibdir}/asyncio/__pycache__/
-%{pylibdir}/asyncio/*.py
-%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/venv/
-%dir %{pylibdir}/venv/__pycache__/
-%{pylibdir}/venv/*.py
-%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/venv/scripts
-
-%{pylibdir}/wsgiref
-%{pylibdir}/xmlrpc
-
-%dir %{pylibdir}/ensurepip/
-%dir %{pylibdir}/ensurepip/__pycache__/
-%{pylibdir}/ensurepip/*.py
-%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
-
-%if %{with rpmwheels}
-%exclude %{pylibdir}/ensurepip/_bundled
-%else
-%dir %{pylibdir}/ensurepip/_bundled
-%{pylibdir}/ensurepip/_bundled/*.whl
-%endif
-
-# The majority of the test module lives in the test subpackage
-# However test.support is in libs - it contains stuff used when testing your code
-#
https://bugzilla.redhat.com/show_bug.cgi?id=596258
-%if %{without flatpackage}
-%dir %{pylibdir}/test/
-%dir %{pylibdir}/test/__pycache__/
-%dir %{pylibdir}/test/support/
-%dir %{pylibdir}/test/support/__pycache__/
-%{pylibdir}/test/__init__.py
-%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%{pylibdir}/test/support/*.py
-%{pylibdir}/test/support/__pycache__/*%{bytecode_suffixes}
-%endif
-
-%dir %{pylibdir}/concurrent/
-%dir %{pylibdir}/concurrent/__pycache__/
-%{pylibdir}/concurrent/*.py
-%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/concurrent/futures/
-%dir %{pylibdir}/concurrent/futures/__pycache__/
-%{pylibdir}/concurrent/futures/*.py
-%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
-
-%{pylibdir}/pydoc_data
-
-%{dynload_dir}/_blake2.%{SOABI_optimized}.so
-%{dynload_dir}/_md5.%{SOABI_optimized}.so
-%{dynload_dir}/_sha1.%{SOABI_optimized}.so
-%{dynload_dir}/_sha256.%{SOABI_optimized}.so
-%{dynload_dir}/_sha3.%{SOABI_optimized}.so
-%{dynload_dir}/_sha512.%{SOABI_optimized}.so
-
-%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
-%{dynload_dir}/_bisect.%{SOABI_optimized}.so
-%{dynload_dir}/_bz2.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
-%{dynload_dir}/_contextvars.%{SOABI_optimized}.so
-%{dynload_dir}/_crypt.%{SOABI_optimized}.so
-%{dynload_dir}/_csv.%{SOABI_optimized}.so
-%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
-%{dynload_dir}/_curses.%{SOABI_optimized}.so
-%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
-%{dynload_dir}/_dbm.%{SOABI_optimized}.so
-%{dynload_dir}/_decimal.%{SOABI_optimized}.so
-%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
-%if %{with gdbm}
-%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
-%endif
-%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
-%{dynload_dir}/_heapq.%{SOABI_optimized}.so
-%{dynload_dir}/_json.%{SOABI_optimized}.so
-%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
-%{dynload_dir}/_lzma.%{SOABI_optimized}.so
-%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
-%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
-%{dynload_dir}/_opcode.%{SOABI_optimized}.so
-%{dynload_dir}/_pickle.%{SOABI_optimized}.so
-%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
-%{dynload_dir}/_queue.%{SOABI_optimized}.so
-%{dynload_dir}/_random.%{SOABI_optimized}.so
-%{dynload_dir}/_socket.%{SOABI_optimized}.so
-%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
-%{dynload_dir}/_ssl.%{SOABI_optimized}.so
-%{dynload_dir}/_struct.%{SOABI_optimized}.so
-%{dynload_dir}/array.%{SOABI_optimized}.so
-%{dynload_dir}/audioop.%{SOABI_optimized}.so
-%{dynload_dir}/binascii.%{SOABI_optimized}.so
-%{dynload_dir}/cmath.%{SOABI_optimized}.so
-%{dynload_dir}/_datetime.%{SOABI_optimized}.so
-%{dynload_dir}/fcntl.%{SOABI_optimized}.so
-%{dynload_dir}/grp.%{SOABI_optimized}.so
-%{dynload_dir}/math.%{SOABI_optimized}.so
-%{dynload_dir}/mmap.%{SOABI_optimized}.so
-%{dynload_dir}/nis.%{SOABI_optimized}.so
-%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
-%{dynload_dir}/parser.%{SOABI_optimized}.so
-%{dynload_dir}/_posixshmem.%{SOABI_optimized}.so
-%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
-%{dynload_dir}/readline.%{SOABI_optimized}.so
-%{dynload_dir}/resource.%{SOABI_optimized}.so
-%{dynload_dir}/select.%{SOABI_optimized}.so
-%{dynload_dir}/spwd.%{SOABI_optimized}.so
-%{dynload_dir}/syslog.%{SOABI_optimized}.so
-%{dynload_dir}/termios.%{SOABI_optimized}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
-%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
-%{dynload_dir}/_uuid.%{SOABI_optimized}.so
-%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
-%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
-%{dynload_dir}/zlib.%{SOABI_optimized}.so
-
-%dir %{pylibdir}/site-packages/
-%dir %{pylibdir}/site-packages/__pycache__/
-%{pylibdir}/site-packages/README.txt
-%{pylibdir}/*.py
-%dir %{pylibdir}/__pycache__/
-%{pylibdir}/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/collections/
-%dir %{pylibdir}/collections/__pycache__/
-%{pylibdir}/collections/*.py
-%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/ctypes/
-%dir %{pylibdir}/ctypes/__pycache__/
-%{pylibdir}/ctypes/*.py
-%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/ctypes/macholib
-
-%{pylibdir}/curses
-
-%dir %{pylibdir}/dbm/
-%dir %{pylibdir}/dbm/__pycache__/
-%{pylibdir}/dbm/*.py
-%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/distutils/
-%dir %{pylibdir}/distutils/__pycache__/
-%{pylibdir}/distutils/*.py
-%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/distutils/README
-%{pylibdir}/distutils/command
-
-%dir %{pylibdir}/email/
-%dir %{pylibdir}/email/__pycache__/
-%{pylibdir}/email/*.py
-%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/email/mime
-%doc %{pylibdir}/email/architecture.rst
-
-%{pylibdir}/encodings
-
-%{pylibdir}/html
-%{pylibdir}/http
-
-%dir %{pylibdir}/importlib/
-%dir %{pylibdir}/importlib/__pycache__/
-%{pylibdir}/importlib/*.py
-%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/json/
-%dir %{pylibdir}/json/__pycache__/
-%{pylibdir}/json/*.py
-%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
-
-%{pylibdir}/logging
-%{pylibdir}/multiprocessing
-
-%dir %{pylibdir}/sqlite3/
-%dir %{pylibdir}/sqlite3/__pycache__/
-%{pylibdir}/sqlite3/*.py
-%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
-
-%if %{without flatpackage}
-%exclude %{pylibdir}/turtle.py
-%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
-%endif
-
-%{pylibdir}/urllib
-%{pylibdir}/xml
-
-%if "%{_lib}" == "lib64"
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
-%endif
-
-# "Makefile" and the config-32/64.h file are needed by
-# distutils/sysconfig.py:_init_posix(), so we include them in the core
-# package, along with their parent directories (bug 531901):
-%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
-%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
-%dir %{_includedir}/python%{LDVERSION_optimized}/
-%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-
-%{_libdir}/%{py_INSTSONAME_optimized}
-%if %{without flatpackage}
-%{_libdir}/libpython3.so
-%endif
-
-
-%if %{without flatpackage}
-%files devel
-%{_bindir}/2to3
-%endif
-
-%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
-%if %{without flatpackage}
-%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
-%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-%endif
-%{_includedir}/python%{LDVERSION_optimized}/*.h
-%{_includedir}/python%{LDVERSION_optimized}/internal/
-%{_includedir}/python%{LDVERSION_optimized}/cpython/
-%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
-
-%if %{without flatpackage}
-%{_bindir}/python3-config
-%{_libdir}/pkgconfig/python3.pc
-%{_bindir}/pathfix.py
-%{_bindir}/pygettext3.py
-%{_bindir}/msgfmt3.py
-%endif
-
-%{_bindir}/pygettext%{pybasever}.py
-%{_bindir}/msgfmt%{pybasever}.py
-
-%{_bindir}/python%{pybasever}-config
-%{_bindir}/python%{LDVERSION_optimized}-config
-%{_bindir}/python%{LDVERSION_optimized}-*-config
-%{_libdir}/libpython%{LDVERSION_optimized}.so
-%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
-%{_libdir}/pkgconfig/python-%{pybasever}.pc
-
-
-%if %{without flatpackage}
-%files idle
-
-%{_bindir}/idle*
-%else
-%{_bindir}/idle%{pybasever}
-%endif
-
-%{pylibdir}/idlelib
-
-%if %{without flatpackage}
-%{_metainfodir}/idle3.appdata.xml
-%{_datadir}/applications/idle3.desktop
-%{_datadir}/icons/hicolor/*/apps/idle3.*
-%endif
-
-%if %{without flatpackage}
-%files tkinter
-%endif
-
-%{pylibdir}/tkinter
-%if %{without flatpackage}
-%exclude %{pylibdir}/tkinter/test
-%endif
-%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
-%{pylibdir}/turtle.py
-%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
-%dir %{pylibdir}/turtledemo
-%{pylibdir}/turtledemo/*.py
-%{pylibdir}/turtledemo/*.cfg
-%dir %{pylibdir}/turtledemo/__pycache__/
-%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
-
-
-%if %{without flatpackage}
-%files test
-%endif
-
-%{pylibdir}/ctypes/test
-%{pylibdir}/distutils/tests
-%{pylibdir}/sqlite3/test
-%{pylibdir}/test
-%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
-%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
-%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
-%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
-%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
-%{pylibdir}/lib2to3/tests
-%{pylibdir}/tkinter/test
-%{pylibdir}/unittest/test
-
-# stuff already owned by the libs subpackage
-# test requires libs, so we are safe not owning those dirs
-%if %{without flatpackage}
-%exclude %dir %{pylibdir}/test/
-%exclude %dir %{pylibdir}/test/__pycache__/
-%exclude %{pylibdir}/test/__init__.py
-%exclude %{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%exclude %{pylibdir}/test/support/
-%endif
-
-# We don't bother splitting the debug build out into further subpackages:
-# if you need it, you're probably a developer.
-
-# Hence the manifest is the combination of analogous files in the manifests of
-# all of the other subpackages
-
-%if %{with debug_build}
-%if %{without flatpackage}
-%files debug
-%{_bindir}/python3-debug
-%endif
-
-# Analog of the core subpackage's files:
-%{_bindir}/python%{LDVERSION_debug}
-
-# Analog of the -libs subpackage's files:
-# ...with debug builds of the built-in "extension" modules:
-
-%{dynload_dir}/_blake2.%{SOABI_debug}.so
-%{dynload_dir}/_md5.%{SOABI_debug}.so
-%{dynload_dir}/_sha1.%{SOABI_debug}.so
-%{dynload_dir}/_sha256.%{SOABI_debug}.so
-%{dynload_dir}/_sha3.%{SOABI_debug}.so
-%{dynload_dir}/_sha512.%{SOABI_debug}.so
-
-%{dynload_dir}/_asyncio.%{SOABI_debug}.so
-%{dynload_dir}/_bisect.%{SOABI_debug}.so
-%{dynload_dir}/_bz2.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
-%{dynload_dir}/_contextvars.%{SOABI_debug}.so
-%{dynload_dir}/_crypt.%{SOABI_debug}.so
-%{dynload_dir}/_csv.%{SOABI_debug}.so
-%{dynload_dir}/_ctypes.%{SOABI_debug}.so
-%{dynload_dir}/_curses.%{SOABI_debug}.so
-%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
-%{dynload_dir}/_dbm.%{SOABI_debug}.so
-%{dynload_dir}/_decimal.%{SOABI_debug}.so
-%{dynload_dir}/_elementtree.%{SOABI_debug}.so
-%if %{with gdbm}
-%{dynload_dir}/_gdbm.%{SOABI_debug}.so
-%endif
-%{dynload_dir}/_hashlib.%{SOABI_debug}.so
-%{dynload_dir}/_heapq.%{SOABI_debug}.so
-%{dynload_dir}/_json.%{SOABI_debug}.so
-%{dynload_dir}/_lsprof.%{SOABI_debug}.so
-%{dynload_dir}/_lzma.%{SOABI_debug}.so
-%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
-%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
-%{dynload_dir}/_opcode.%{SOABI_debug}.so
-%{dynload_dir}/_pickle.%{SOABI_debug}.so
-%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
-%{dynload_dir}/_queue.%{SOABI_debug}.so
-%{dynload_dir}/_random.%{SOABI_debug}.so
-%{dynload_dir}/_socket.%{SOABI_debug}.so
-%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
-%{dynload_dir}/_ssl.%{SOABI_debug}.so
-%{dynload_dir}/_struct.%{SOABI_debug}.so
-%{dynload_dir}/array.%{SOABI_debug}.so
-%{dynload_dir}/audioop.%{SOABI_debug}.so
-%{dynload_dir}/binascii.%{SOABI_debug}.so
-%{dynload_dir}/cmath.%{SOABI_debug}.so
-%{dynload_dir}/_datetime.%{SOABI_debug}.so
-%{dynload_dir}/fcntl.%{SOABI_debug}.so
-%{dynload_dir}/grp.%{SOABI_debug}.so
-%{dynload_dir}/math.%{SOABI_debug}.so
-%{dynload_dir}/mmap.%{SOABI_debug}.so
-%{dynload_dir}/nis.%{SOABI_debug}.so
-%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
-%{dynload_dir}/parser.%{SOABI_debug}.so
-%{dynload_dir}/_posixshmem.%{SOABI_debug}.so
-%{dynload_dir}/pyexpat.%{SOABI_debug}.so
-%{dynload_dir}/readline.%{SOABI_debug}.so
-%{dynload_dir}/resource.%{SOABI_debug}.so
-%{dynload_dir}/select.%{SOABI_debug}.so
-%{dynload_dir}/spwd.%{SOABI_debug}.so
-%{dynload_dir}/syslog.%{SOABI_debug}.so
-%{dynload_dir}/termios.%{SOABI_debug}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
-%{dynload_dir}/unicodedata.%{SOABI_debug}.so
-%{dynload_dir}/_uuid.%{SOABI_debug}.so
-%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
-%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
-%{dynload_dir}/zlib.%{SOABI_debug}.so
-
-# No need to split things out the "Makefile" and the config-32/64.h file as we
-# do for the regular build above (bug 531901), since they're all in one package
-# now; they're listed below, under "-devel":
-
-%{_libdir}/%{py_INSTSONAME_debug}
-
-# Analog of the -devel subpackage's files:
-%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
-%{_includedir}/python%{LDVERSION_debug}
-%{_bindir}/python%{LDVERSION_debug}-config
-%{_bindir}/python%{LDVERSION_debug}-*-config
-%{_libdir}/libpython%{LDVERSION_debug}.so
-%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
-%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
-
-# Analog of the -tools subpackage's files:
-# None for now; we could build precanned versions that have the appropriate
-# shebang if needed
-
-# Analog of the tkinter subpackage's files:
-%{dynload_dir}/_tkinter.%{SOABI_debug}.so
-
-# Analog of the -test subpackage's files:
-%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
-%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
-%{dynload_dir}/_testcapi.%{SOABI_debug}.so
-%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
-
-%endif # with debug_build
-
-# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
-#
-# The /usr/lib/rpm/redhat/macros defines %%__debug_package to use
-# debugfiles.list, and it appears that everything below /usr/lib/debug and
-# (/usr/src/debug) gets added to this file (via LISTFILES) in
-# /usr/lib/rpm/find-debuginfo.sh
-#
-# Hence by installing it below /usr/lib/debug we ensure it is added to the
-# -debuginfo subpackage
-# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
-# payload file would be unpackaged)
-
-# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
-%undefine _debuginfo_subpackages
-
-# ======================================================
-# Finally, the changelog:
-# ======================================================
-
-%changelog
-* Tue Feb 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-1
-- Update to 3.8.0a1
-
-* Sat Feb 02 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.2-5
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
-
-* Wed Jan 16 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-4
-- Security fix for CVE-2019-5010 (#1666519, #1666522)
-
-* Mon Jan 14 2019 Bjrn Esser <besser82(a)fedoraproject.org> - 3.7.2-3
-- Rebuilt for libcrypt.so.2 (#1666033)
-
-* Fri Jan 04 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-2
-- No longer revert upstream commit 3b699932e5ac3e7
-- This was a dirty workaround for (#1644936)
-
-* Tue Dec 25 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-1
-- Update to 3.7.2
-
-* Fri Dec 07 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-5
-- Make sure we don't ship any exe files (not needed an prebuilt)
-
-* Wed Nov 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-4
-- Make sure the entire test.support module is in python3-libs (#1651245)
-
-* Tue Nov 06 2018 Victor Stinner <vstinner(a)redhat.com> - 3.7.1-3
-- Verify the value of '-s' when execute the CLI of cProfile (rhbz#1160640)
-
-* Sun Nov 04 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-2
-- Temporarily revert upstream commit 3b699932e5ac3e7
-- This is dirty workaround for (#1644936)
-
-* Mon Oct 22 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-1
-- Update to 3.7.1
-
-* Thu Sep 27 2018 Petr Viktorin <pviktori(a)redhat.com> - 3.7.0-10
-- Compile the debug build with -Og rather than -O0
-
-* Thu Aug 30 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-9
-- Require python3-setuptools from python3-devel to prevent packaging errors (#1623914)
-
-* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-8
-- Add /usr/bin/pygettext3.py and msgfmt3.py to python3-devel
-Resolves: rhbz#1571474
-
-* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-7
-- Backport TLS 1.3 related fixes to fix FTBFS
-Resolves: rhbz#1609291
-
-* Wed Aug 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-6
-- Use RPM built wheels of pip and setuptools in ensurepip instead of our rewheel patch
-
-* Fri Aug 10 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-5
-- Fix wrong requirement on gdbm
-
-* Fri Jul 20 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-4
-- Allow to call Py_Main() after Py_Initialize()
-Resolves: rhbz#1595421
-
-* Sat Jul 14 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.0-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
-
-* Thu Jul 12 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-2
-- Rebuild for new gdbm
-
-* Wed Jun 27 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-1
-- Update to 3.7.0 final
-
-* Wed Jun 13 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.21.rc1
-- Finish bootstrapping, enable rewheel, tests, optimizations
-
-* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
-- Update to 3.7.0rc1
-- Bootstrap, disable rewheel, tests, optimizations
-
-* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-4
-- Fix multiprocessing regression on newer glibcs
-- Enable test_multiprocessing_fork(server) and _spawn again
-Resolves: rhbz#1569933
-
-* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-3
-- Skip test_multiprocessing_fork(server) and _spawn for now
-
-* Wed Apr 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-2
-- Add flatpackage conditionals
-
-* Thu Mar 29 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.5-1
-- Update to 3.6.5
-
-* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-20
-- Fix broken macro invocation and broken building of C Python extensions
-Resolves: rhbz#1560103
-
-* Fri Mar 16 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-19
-- Add -n option for pathfix.py
-Resolves: rhbz#1546990
-
-* Thu Mar 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-18
-- Fix the py_byte_compile macro to work on Python 2
-- Remove the pybytecompile macro file from the flat package
-Resolves: rhbz#1484993
-
-* Tue Mar 13 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-17
-- Do not send IP addresses in SNI TLS extension
-
-* Sat Feb 24 2018 Florian Weimer <fweimer(a)redhat.com> - 3.6.4-16
-- Rebuild with new LDFLAGS from redhat-rpm-config
-
-* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-15
-- Filter out automatic /usr/bin/python3.X requirement,
- recommend the main package from libs instead
-Resolves: rhbz#1547131
-
-* Thu Feb 15 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.4-14
-- Remove the python3-tools package (#rhbz 1312030)
-- Move /usr/bin/2to3 to python3-devel
-- Move /usr/bin/idle and idlelib to python3-idle
-- Provide python3-tools from python3-idle
-
-* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-13
-- Escape macros in %%changelog
-
-* Fri Feb 02 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.4-12
-- Remove sys.executable check from change-user-install-location patch
-Resolves: rhbz#1532287
-
-* Thu Feb 01 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-11
-- Define TLS cipher suite on build time.
-
-* Wed Jan 31 2018 Tomas Orsava <torsava(a)redhat.com> - 3.6.4-10
-- Disable test_gdb for all arches and test_buffer for ppc64le in anticipation
- of the F28 mass rebuild
-- Re-enable these tests after the mass rebuild when they can be properly
- addressed
-
-* Tue Jan 23 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-9
-- Restore the PyExc_RecursionErrorInst public symbol
-
-* Tue Jan 23 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-8
-- Add patch to explicitly link _ctypes module with -ldl (#1537489)
-- Refactored patch for libxcrypt
-- Re-enable strict symbol checks in the link editor
-
-* Mon Jan 22 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-7
-- Add patch for libxcrypt
-- Disable strict symbol checks in the link editor
-
-* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-6
-- Rebuilt for switch to libxcrypt
-
-* Fri Jan 19 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-5
-- Fix localeconv() encoding for LC_NUMERIC
-
-* Thu Jan 18 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-4
-- R: gdbm-devel R: gdbm for python3-libs
-
-* Wed Jan 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-3
-- Require large enough gdbm (fixup for previous bump)
-
-* Tue Jan 16 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-2
-- Rebuild for reverted gdbm 1.13 on Fedora 27
-
-* Mon Jan 15 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-1
-- Update to version 3.6.4
-
-* Fri Jan 12 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-5
-- Fix the compilation of the nis module.
-
-* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
-- Raise the release of platform-python obsoletes for better maintainability
-
-* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
-- Obsolete platform-python and it's subpackages
-
-* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
-- Fix memory corruption due to allocator mix
-Resolves: rhbz#1498207
-
-* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
-- Update to Python 3.6.3
-
-* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
-- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
-- Make the -devel package require redhat-rpm-config
-Resolves: rhbz#1496757
-
-* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
-- Fix /usr/bin/env dependency from python3-tools
-Resolves: rhbz#1482118
-
-* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
-- Include `-g` in the flags sent to the linker (LDFLAGS)
-Resolves: rhbz#1483222
-
-* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
-- Specfile cleanup
-- Make the main description also applicable to the SRPM
-- Add audiotest.au to the test package
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
-- Remove %%{pylibdir}/Tools/scripts/2to3
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
-- Expat >= 2.1.0 is everywhere, remove explicit requires
-- Conditionalize systemtap-devel BuildRequires
-- For consistency, require /usr/sbin/ifconfig instead of net-tools
-
-* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
-- Rename patch files to be consistent
-- Run autotools to generate the configure script before building
-- Merge lib64 patches (104 into 102)
-- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
-- Remove patches 157 and 186, which had test changes left over after upstreaming
-- Remove patch 188, a temporary workaround for hashlib tests
-- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
-- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
-
-* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
-- Use python3 style of calling super() without arguments in rpath
- patch to prevent recursion in UnixCCompiler subclasses
-Resolves: rhbz#1458122
-
-* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
-- Add bcond for --without optimizations
-- Reword package descriptions
-- Remove Group declarations
-- Skip failing test_float_with_comma
-
-* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
-- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
-
-* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
-- Use bconds for configuring the build
-- Reorganize the initial sections
-
-* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
-- Have /usr/bin/2to3 (rhbz#1111275)
-- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
-
-* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
-- Revert "Add --executable option to install.py command"
- This enhancement is currently not needed and it can possibly
- collide with `pip --editable`option
-
-* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
-- Fix the "urllib FTP protocol stream injection" vulnerability
-Resolves: rhbz#1478916
-
-* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
-- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
- bsddb), however, no longer needod for Python 3
-- Tested building Python 3 with and without the dependency, all tests pass and
- filelists of resulting RPMs are identical
-
-* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
-- Do not generate debuginfo subpackages (#1476593)
-- Rebuild with binutils fix for ppc64le (#1475636)
-
-* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
-
-* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
-- Make test_asyncio to not depend on the current SIGHUP signal handler.
-
-* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
-- Update to Python 3.6.2
-
-* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
-- Update to the latest upstream implementation of PEP 538
-
-* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
-- Make pip and distutils in user environment install into separate location
-
-* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
-- Fix test_alpn_protocols from test_ssl
-- Do not require rebundled setuptools dependencies
-
-* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
-- Added a dependency to the devel subpackage on python3-rpm-generators which
- have been excised out of rpm-build
-- Updated notes on bootstrapping Python on top of this specfile accordingly
-- Involves: rhbz#1410631, rhbz#1444925
-
-* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
-- Enable profile guided optimizations for x86_64 and i686 architectures
-- Update to a newer implementation of PEP 538
-- Update description to reflect that Python 3 is now the default Python
-
-* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
-- Update PEP 538 to the latest upstream implementation
-
-* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
-- Enable link time optimizations
-- Move windows executables to the devel subpackage (rhbz#1426257)
-
-* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
-- Rename python3.Xdm-config script from -debug to be arch specific
-Resolves: rhbz#1179073
-
-* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
-- Install the Makefile in its proper location (rhbz#1438219)
-
-* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
-- Update to version 3.6.1 final
-
-* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
-- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
-
-* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
-- Update to Python 3.6.1 release candidate 1
-- Add patch 264 to skip a known test failure on aarch64
-
-* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
-- Use proper command line parsing in _testembed
-- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
-
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
-
-* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
-- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
-
-* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
-- Revert "Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables..." to prevent build failures
- of packages using alternate build tools
-
-* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
-- Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables
-- Use new %%_module_build macro
-
-* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
-- Add --executable option to install.py command
-
-* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
-- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
-in order for the virtualenvs to work properly
-
-* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
-
-* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
-- Add missing %%license macro
-
-* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
-- Modify the runtime dependency of python3-libs on system-python-libs again,
- because previous attempt didn't work properly with dnf resolving mechanism
-
-* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
-- Modify the runtime dependency of python3-libs on system-python-libs to use
- just the version and release number, but not the dist tag due to Modularity
-
-* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
-- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
-- Skip test_aead_aes_gcm during rpmbuild
-
-* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
-- Rebuild for readline 7.x
-
-* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
-- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
-
-* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
-- Define HAVE_LONG_LONG as 1 for backwards compatibility
-
-* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
-- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
-
-* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
-- Update to Python 3.6.0 final
-
-* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
-- Enable rewheel
-
-* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
-- Update to Python 3.6.0 release candidate 1
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
-- Update to Python 3.6.0 beta 4
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
-- Set to work with pip version 9.0.1
-
-* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
-- Use proper patch numbering and base upstream branch for
-porting ssl and hashlib modules to OpenSSL 1.1.0
-- Drop hashlib patch for now
-- Add riscv64 arch to 64bit and no-valgrind arches
-
-* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
-- Make it build with OpenSSL-1.1.0 based on upstream patch
-
-* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
-- Obsolete and Provide python35 package
-
-* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
-- Update %%py_byte_compile macro
-- Remove unused configure flags (rhbz#1374357)
-
-* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
-- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
- recompile optimized .pyc files
-- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
- files are no more
-- Resolves rhbz#1373635
-
-* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
-- Rebased to version 3.5.2
-- Set to work with pip version 8.1.2
-- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
-- Removed arch or environment specific patches 194, 196, 203, and 208
- as test builds indicate they are no longer needed
-- Updated patches 102, 146, and 242 to work with the new Python codebase
-- Removed patches 200, 201, 5000 which weren't even being applied
-
-* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
-- Fix for CVE-2016-1000110 HTTPoxy attack
-- SPEC file cleanup
-
-* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
-- Build properly on MIPS
-
-* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
--
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
-- Refactor patch for properly fixing CVE-2016-5636
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
-- Fix test_pyexpat failure with Expat version of 2.2.0
-
-* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
-- Move xml module to system-python-libs
-
-* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
-- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
-- Raise an error when STARTTLS fails
-- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
-- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
-- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
-
-* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
-- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
-
-* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
-- Move distutils to system-python-libs
-
-* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
-- Provide python3-enum34
-
-* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
-- Provide System Python packages and macros
-
-* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
-
-* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
-- Drop python3 macros, require python/python3-rpm-macros
-
-* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
-- Update to 3.5.1
-- Removed patch 199 and 207 (upstream)
-
-* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
-- Remove versioned libpython from devel package
-
-* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
-- add correct arch for ppc64/ppc64le to fix build failure
-
-* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
-- Hide the private _Py_atomic_xxx symbols from public header
-
-* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
-- Rebuild with wheel set to 1
-
-* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
-- Update to 3.5.0
-
-* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
-- python3-devel: Require python-macros for version independant macros such as
- python_provide. See fpc#281 and fpc#534.
-
-* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
-- Use 1024bit DH key in test_ssl
-- Use -O0 when compiling -debug build
-- Update pip version variable to the version we actually ship
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
-- Make relocating Python by changing _prefix actually work
-Resolves: rhbz#1231801
-
-* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
-- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
-
-* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
-- Updated to 3.4.3
-- BuildPython now accepts additional build options
-- Temporarily disabled test_gdb on arm (rhbz#1196181)
-
-* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
-- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
- (
http://bugs.python.org/issue23433)
-
-* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
-- Rebuilt for Fedora 23 Change
-
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
-
-* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
-- Own systemtap dirs (#710733)
-
-* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
-- build with valgrind on ppc64le
-- disable test_gdb on s390(x) until rhbz#1181034 is resolved
-
-* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
-- New patches: 170 (gc asserts), 200 (gettext headers),
- 201 (gdbm memory leak)
-
-* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
-- OpenSSL disabled SSLv3 in SSLv23 method
-
-* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
-- Update to 3.4.2
-- Refreshed patches: 156 (gdb autoload)
-- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
-
-* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
-- Fix CVE-2014-4650 - CGIHTTPServer URL handling
-Resolves: rhbz#1113529
-
-* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
-- exclude test_gdb on ppc* (rhbz#1132488)
-
-* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
-- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
-
-* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
-
-* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
-- aarch64 has valgrind, just list those that don't support it
-
-* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
-
-* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
-- bump release and rebuild to link with the correct tcl/tk libs on ppcle
-
-* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
-- Change paths to bundled projects in rewheel patch
-
-* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
-- In config script, use uname -m to write the arch
-
-* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
-- update the arch list where valgrind exists - %%power64 includes also
- ppc64le which is not supported yet
-
-* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
-- Forward arguments to the arch specific config script
-Resolves: rhbz#1102683
-
-* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
-- Rename python3.Xm-config script to arch specific.
-Resolves: rhbz#1091815
-
-* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
-- Use python3-*, not python-* runtime requires on setuptools and pip
-- rebuild for tcl-8.6
-
-* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
-- Update the rewheel module
-
-* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
-- Fix multilib dependencies.
-Resolves: rhbz#1091815
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
-- Update to Python 3.4.1
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
-- Fix test_gdb failure on ppc64le
-Resolves: rhbz#1095355
-
-* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
-- Add macro %%python3_version_nodots
-
-* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
-- Disable test_faulthandler, test_gdb on aarch64
-Resolves: rhbz#1045193
-
-* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
-- Don't add Werror=declaration-after-statement for extension
- modules through setup.py (PyBT#21121)
-
-* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
-- Add setuptools and pip to Requires
-
-* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
-- Point __os_install_post to correct brp-* files
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
-- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
-- Update to Python 3.4 final
-- Add patch adding the rewheel module
-- Merge patches from master
-
-* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
-- Update to Python 3.4 beta 2.
-- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
-- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
-
-* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
-- Update to Python 3.4 beta 1.
-- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
-ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
-- Removed patch 00187 (remove pthread atfork; upstreamed)
-
-* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
-- Update to Python 3.4 alpha 4.
-- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
-114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
-test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
-from py_compile)
-- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
-Koji), 142 (the mock issue that caused this is fixed)
-- Added patch 187 (remove thread atfork) - will be in next version
-- Refreshed script for checking pyc and pyo timestamps with new ignored files.
-- The fips patch is disabled for now until upstream makes a final decision
-what to do with sha3 implementation for 3.4.0.
-
-* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
-- Bytecompile all *.py files properly during build (rhbz#1023607)
-
-* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
-- Added fix for CVE-2013-4238 (rhbz#996399)
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
-- fix up indentation in arm patch
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
-- disable a test that fails on arm
-- enable valgrind support on arm arches
-
-* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
-- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
-
-* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
-- Add patch for CVE-2013-2099 (rhbz#963261).
-
-* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
-- Updated to Python 3.3.2.
-- Refreshed patches: 153 (gdb test noise)
-- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
-test threads)
-- Synced patch numbers with python.spec.
-
-* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
-- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
-
-* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
-- Add patch that enables building on ppc64p7 (replace the sed, so that
-we get consistent with python2 spec and it's more obvious that we're doing it.
-
-* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
-- Add fix for gdb tests failing on arm, rhbz#951802.
-
-* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
-- Updated to Python 3.3.1.
-- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
-153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
-keeping few more downstream tests)
-- Removed patches: 3 (audiotest.au made it to upstream tarball)
-- Removed workaround for
http://bugs.python.org/issue14774, discussed in
-http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
-- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
-- renumber patches to keep them in sync with python.spec
-
-* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
-- Fix error in platform.platform() when non-ascii byte strings are decoded to
- unicode (rhbz#922149)
-
-* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
-- Fix up shared library extension (rhbz#889784)
-
-* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
-- add ppc64p7 build target, optimized for Power7
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
-- add workaround for ENOPROTOOPT seen running selftests in Koji
-(rhbz#913732)
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
-- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
-
-* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
-- add aarch64 (rhbz#909783)
-
-* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
-- add BR on bluez-libs-devel (rhbz#879720)
-
-* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
-- 3.3.0rc3 -> 3.3.0; drop alphatag
-
-* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
-- 3.3.0rc2 -> 3.3.0rc3
-
-* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
-- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
-
-* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
-- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
-
-* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
-- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
-134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
-correctly when LANG=C (patch 55); importlib.test was moved to
-test.test_importlib upstream
-
-* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
-- disable some failing checks on PPC* (rhbz#846849)
-
-* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
-- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
-patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
-configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream issue
12326);
-"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
-for stdlib (upstream issues 10645 and 12218); email/test moved to
-test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
-_decimal and _lzma modules; make collections modules explicit in payload again
-(upstream issue 11085); add _testbuffer module to tests subpackage (added in
-upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
-workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
-distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
-_lzma module); skip some tests within test_socket (patch 163)
-
-* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
-
-* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-
-* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
-- use macro for power64 (rhbz#834653)
-
-* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
-- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
-
-* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
-- fix tapset for debug build
-
-* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
-- update uid/gid handling to avoid int overflows seen with uid/gid
-values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
-
-* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
-- renumber autotools patch from 300 to 5000
-- specfile cleanups
-
-* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
-- fix test_gdb.py (patch 156; rhbz#817072)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
-- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
-generating SELinux denials on "import ctypes" and "import uuid" when
embedding
-Python within httpd (patch 155; rhbz#814391)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
-- add explicit version requirements on expat to avoid linkage problems with
-XML_SetHashSalt
-
-* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
-- fix test_gdb (patch 153)
-
-* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
-- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
-values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
-
-* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
-- use newly installed python for byte compiling (now for real)
-
-* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
-- use newly installed python for byte compiling (#787498)
-
-* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
-- Build with $RPM_LD_FLAGS (#756863).
-- Use xz-compressed source tarball.
-
-* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
-- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
-
-* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
-- python3-devel missing autogenerated pkgconfig() provides (#746751)
-
-* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
-- cherrypick fix for distutils not using __pycache__ when byte-compiling
-files (rhbz#722578)
-
-* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
-- re-enable gdbm (patch 148; rhbz#742242)
-
-* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
-- add a sys._debugmallocstats() function (patch 147)
-
-* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
-- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
-_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
-
-* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
-- disable gdbm module to prepare for gdbm soname bump
-
-* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
-- renumber and rename patches for consistency with python.spec (8 to 55, 106
-to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
-
-* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
-- rewrite of "check", introducing downstream-only hooks for skipping specific
-cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
-fine-grained manner than before; (patches 106, 133-142 sparsely, moving
-patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
-
-* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
-- 3.2.2
-
-* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
-- run selftests with "--verbose"
-- disable parts of test_io on ppc (rhbz#732998)
-
-* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
-- use "--findleaks --verbose3" when running test suite
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
-- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
-ppc to avoid aliasing violations (patch 130; rhbz#698726)
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
-- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
-
-* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
-- add %%python3_version to the rpm macros (rhbz#719082)
-
-* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
-- disable some tests on sparc arches
-
-* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
-- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
-of static library build (due to Modules/_testembed; patch 6), autotool
-intermediates (patch 300)
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
-- use the gdb hooks from the upstream tarball, rather than keeping our own copy
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
-- don't run test_openpty and test_pty in %%check
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
-- cleanup of BuildRequires; add comment headings to specfile sections
-
-* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
-- fix the libpython.stp systemtap tapset (rhbz#697730)
-
-* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
-- 3.2
-- drop alphatag
-- regenerate autotool patch
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
-- add a /usr/bin/python3-debug symlink within the debug subpackage
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
-- 3.2rc3
-- regenerate autotool patch
-
-* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
-
-* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
-- 3.2rc2
-
-* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
-- 3.2rc1
-- rework patch 6 (static lib removal)
-- remove upstreamed patch 130 (ppc debug build)
-- regenerate patch 300 (autotool intermediates)
-- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
-- added libpython3.so and 2to3-3.2
-
-* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
-- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
-error with dynamic annotations (when configured using --with-valgrind)
-- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
-
-* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
-- add --with-valgrind to configuration (on architectures that support this)
-
-* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
-- work around test_subprocess failure seen in koji (patch 129)
-
-* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
-- 3.2b2
-- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
-patch 8 (systemtap), patch 102 (lib64)
-- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
-patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
-fixed upstream)
-- regenerate patch 300 (autotool intermediates)
-- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
-patch 128)
-- stop using runtest.sh in %%check (dropped by upstream), replacing with
-regrtest; fixup list of failing tests
-- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
-- rework manifests of shared libraries to use "SOABI_" macros, reflecting
-PEP 3149
-- drop itertools, operator and _collections modules from the manifests as py3k
-commit r84058 moved these inside libpython; json/tests moved to test/json_tests
-- move turtle code into the tkinter subpackage
-
-* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
-- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
-
-* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
-- move most of the content of the core package to the libs subpackage, given
-that the libs aren't meaningfully usable without the standard libraries
-
-* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
-- Move test.support to core package (rhbz#596258)
-- Add various missing __pycache__ directories to payload
-
-* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
-- Add __pycache__ directory for site-packages
-
-* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
-- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
-- make find-provides-without-python-sonames.sh 64bit aware
-
-* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
-- 3.2a1; add alphatag
-- rework %%files in the light of PEP 3147 (__pycache__)
-- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
-better job of things, and the %%files explicitly lists our modules (r82746
-appears to break the old way of doing things). This leads to various modules
-changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
-dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
-_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
-testing/devel purposes)
-- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
-- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
-plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
-- add machinery for rebuilding "configure" and friends, using the correct
-version of autoconf (patch 300)
-- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
-- "modulator" was removed upstream
-- drop "-b" from patch applications affecting .py files to avoid littering the
-installation tree
-
-* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
-- Turn on computed-gotos.
-- Fix for parallel make and graminit.c
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
-- rebuild
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
-- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
-a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
-
-* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
-- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
-- reformat whitespace in audioop.c (patch 106)
-- CVE-2010-1634: fix various integer overflow checks in the audioop
-module (patch 107)
-- CVE-2010-2089: further checks within the audioop module (patch 108)
-- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
-
-* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
-- reading the timestamp counter is available only on some arches (see Python/ceval.c)
-
-* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
-- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
-(patch 105)
-
-* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
-- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
-(patch 104); enable them and the WITH_TSC option within the debug build
-
-* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
-- build and install two different configurations of Python 3: debug and
-standard, packaging the debug build in a new "python3-debug" subpackage
-(patch 103)
-
-* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
-- exclude test_http_cookies when running selftests, due to hang seen on
-http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
-11 hours)
-- update python-gdb.py from v5 to py3k version submitted upstream
-
-* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
-- update python-gdb.py from v4 to v5 (improving performance and stability,
-adding commands)
-
-* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
-- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
-cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
-and exceptions)
-
-* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
-- refresh gdb hooks to v3 (reworking how they are packaged)
-
-* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
-- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
-- drop upstreamed patch 2 (.pyc permissions handling)
-- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
-- drop upstreamed patch 200 (path-fixing script)
-
-* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
-- fix typo in libpython.stp (rhbz:575336)
-
-* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
-- add pyfuntop.stp example (source 7)
-- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
-consistency with python.spec
-
-* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
-- rebuild for new package of redhat-rpm-config (rhbz:564527)
-- use 'install -p' when running 'make install'
-
-* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
-- split configure options into multiple lines for easy of editing
-- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
-tapset defining "python.function.entry" and "python.function.return"
to make
-the markers easy to use (dmalcolm; source 5), and an example of using the
-tapset to the docs (dmalcolm; source 6) (rhbz:545179)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
-- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
-%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
-ldconfig (bug 562980), and which should also ensure it becomes part of the
-debuginfo subpackage, rather than the libs subpackage
-- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
-configure script, and to avoid fragile scripts that try to figure this out
-dynamically (e.g. for the -gdb.py change)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
-- add gdb hooks for easier debugging (Source 4)
-
-* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
-- update python-3.1.1-config.patch to remove downstream customization of build
-of pyexpat and elementtree modules
-- add patch adapted from upstream (patch 7) to add support for building against
-system expat; add --with-system-expat to "configure" invocation
-- remove embedded copies of expat and zlib from source tree during "prep"
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
-- introduce %%{dynload_dir} macro
-- explicitly list all lib-dynload files, rather than dynamically gathering the
-payload into a temporary text file, so that we can be sure what we are
-shipping
-- introduce a macros.pybytecompile source file, to help with packaging python3
-modules (Source3; written by Toshio)
-- rename "2to3-3" to "python3-2to3" to better reflect python 3 module
packaging
-plans
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
-- change python-3.1.1-config.patch to remove our downstream change to curses
-configuration in Modules/Setup.dist, so that the curses modules are built using
-setup.py with the downstream default (linking against libncursesw.so, rather
-than libncurses.so), rather than within the Makefile; add a test to %%install
-to verify the dso files that the curses module is linked against the correct
-DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
-
-* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
-- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
-builds for setting up the python3 copy of the source tree)
-
-* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
-- move lib2to3 from -tools subpackage to main package (bug 556667)
-
-* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
-- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
-- use the %%{_isa} macro to ensure that the python-devel dependency on python
-is for the correct multilib arch (#555943)
-- delete bundled copy of libffi to make sure we use the system one
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
-- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
-docs, rather than the 2.6 build
-
-* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
-- replace references to /usr with %%{_prefix}; replace references to
-/usr/include with %%{_includedir} (Toshio)
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
-- fix permission on find-provides-without-python-sonames.sh from 775 to 755
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
-- remove build-time requirements on tix and tk, since we already have
-build-time requirements on the -devel subpackages for each of these (Thomas
-Spura)
-- replace usage of %%define with %%global (Thomas Spura)
-- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
-longer be necessary
-- move various test files from the "tools"/"tkinter" subpackages to
the "test"
-subpackage
-
-* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
-- add %%check section (thanks to Thomas Spura)
-- update patch 4 to use correct shebang line
-- get rid of stray patch file from buildroot
-
-* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
-- switched a few instances of "find |xargs" to "find -exec" for
consistency.
-- made the description of __os_install_post more accurate.
-
-* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
-- add macros.python3 to the -devel subpackage, containing common macros for use
-when packaging python3 modules
-
-* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
-- add a provides of "python(abi)" (see bug 532118)
-- fix issues identified by a.badger in package review (bug 526126, comment 39):
- - use "3" thoughout metadata, rather than "3.*"
- - remove conditional around "pkg-config openssl"
- - use standard cleanup of RPM_BUILD_ROOT
- - replace hardcoded references to /usr with _prefix macro
- - stop removing egg-info files
- - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
-up shebang lines
- - stop attempting to remove no-longer-present .cvsignore files
- - move the post/postun sections above the "files" sections
-
-* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
-- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
-flag is used by default in the upstream code
-- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
-_init_posix(), so we include them in the core package, along with their parent
-directories (bug 531901)
-
-* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
-- reword description, based on suggestion by amcnabb
-- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
-- fix the test_tk and test_ttk_* selftests (patch 5)
-- fix up the specfile's handling of shebang/perms to avoid corrupting
-test_httpservers.py (sed command suggested by amcnabb)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
-- fixup importlib/_bootstrap.py so that it correctly handles being unable to
-open .pyc files for writing (patch 2, upstream issue 7187)
-- actually apply the rpath patch (patch 1)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
-- update patch0's setup of the crypt module to link it against libcrypt
-- update patch0 to comment "datetimemodule" back out, so that it is built
-using setup.py (see Setup, option 3), thus linking it statically against
-timemodule.c and thus avoiding a run-time "undefined symbol:
-_PyTime_DoubleToTimet" failure on "import datetime"
-
-* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
-- remove executable flag from various files that shouldn't have it
-- fix end-of-line encodings
-- fix a character encoding
-
-* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
-- disable invocation of brp-python-bytecompile in postprocessing, since
-it would be with the wrong version of python (adapted from ivazquez'
-python3000 specfile)
-- use a custom implementation of __find_provides in order to filter out bogus
-provides lines for the various .so modules
-- fixup distutils/unixccompiler.py to remove standard library path from rpath
-(patch 1, was Patch0 in ivazquez' python3000 specfile)
-- split out libraries into a -libs subpackage
-- update summaries and descriptions, basing content on ivazquez' specfile
-- fixup executable permissions on .py, .xpm and .xbm files, based on work in
-ivazquez's specfile
-- get rid of DOS batch files
-- fixup permissions for shared libraries from non-standard 555 to standard 755
-- move /usr/bin/python*-config to the -devel subpackage
-- mark various directories as being documentation
-
-* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
-- Initial package for Python 3.
-
diff --git a/python38.rpmlintrc b/python38.rpmlintrc
new file mode 100644
index 0000000..d59fe13
--- /dev/null
+++ b/python38.rpmlintrc
@@ -0,0 +1,75 @@
+# KNOWN BUGS:
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
+addFilter(r'crypto-policy-non-compliance-openssl')
+
+
+# TESTS:
+addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3.\d/test')
+
+
+# OTHER DELIBERATES:
+# chroot function
+addFilter(r'missing-call-to-chdir-with-chroot')
+
+# intentionally unversioned and selfobsoleted
+addFilter(r'unversioned-explicit-obsoletes python')
+addFilter(r'self-obsoletion python3\d obsoletes python3\d')
+
+# intentionally hardcoded
+addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
+
+# intentional for our pythonXY package
+addFilter(r'python3\d\.[^:]+: (E|W): devel-file-in-non-devel-package')
+
+# we have non binary stuff, python files
+addFilter(r'only-non-binary-in-usr-lib')
+
+# some devel files that are deliberately needed
+addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
+addFilter(r'devel-file-in-non-devel-package
/usr/lib(64)?/python3\.\d/distutils/tests/xxmodule\.c')
+
+
+# SORRY, NOT SORRY:
+# manual pages
+addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix|msgfmt|pygettext)')
+addFilter(r'no-manual-page-for-binary python3.*-config$')
+addFilter(r'no-manual-page-for-binary python3.\dd?m$')
+
+# missing documentation from subpackages
+addFilter(r'^python3\d?-(debug|tkinter|test|idle)\.[^:]+: (E|W):
no-documentation')
+
+# platform python is obsoleted, but not provided
+addFilter(r'obsolete-not-provided platform-python')
+
+
+# RPMLINT IMPERFECTIONS
+#
https://github.com/rpm-software-management/rpmlint/issues/123
+addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3393')
+#
https://github.com/rpm-software-management/rpmlint/pull/133
+addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3394')
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1550562
+#
https://github.com/rpm-software-management/rpmlint/issues/128
+addFilter(r'python-bytecode-inconsistent-mtime .* 1970')
+
+# debugsource
+addFilter(r'^python3\d?-debugsource\.[^:]+: (E|W): no-documentation')
+
+# debuginfo
+addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(build-id\)')
+
+# this is OK for F28+
+addFilter(r'library-without-ldconfig-post')
+
+# debug package contains devel and non-devel files
+addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-package')
+
+# this goes to other subpackage, hence not actually dangling, the read error is bogus
+addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
+addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
+
+# we need this macro to evaluate, even if the line starts with #
+addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
+
+# SPELLING ERRORS
+addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
diff --git a/python38.spec b/python38.spec
new file mode 100644
index 0000000..1c2ee75
--- /dev/null
+++ b/python38.spec
@@ -0,0 +1,2673 @@
+# ==================
+# Top-level metadata
+# ==================
+
+%global pybasever 3.8
+
+# pybasever without the dot:
+%global pyshortver 38
+
+Name: python%{pyshortver}
+Summary: Version %{pybasever} of the Python interpreter
+URL:
https://www.python.org/
+
+# WARNING When rebasing to a new Python version,
+# remember to update the python3-docs package as well
+%global general_version %{pybasever}.0
+%global prerel a1
+%global upstream_version %{general_version}%{?prerel}
+Version: %{general_version}%{?prerel:~%{prerel}}
+Release: 1%{?dist}
+License: Python
+
+
+# ==================================
+# Conditionals controlling the build
+# ==================================
+
+# Note that the bcond macros are named for the CLI option they create.
+# "%%bcond_without" means "ENABLE by default and create a --without
option"
+
+
+# Flat package, i.e. python36, python37, python38 for tox etc.
+# warning: changes some other defaults
+# in Fedora, never turn this on for the python3 package
+# and always keep it on for python37 etc.
+# WARNING: This does not change the package name and summary above
+%bcond_without flatpackage
+
+# Whether to use RPM build wheels from the python-{pip,setuptools}-wheel package
+# Uses upstream bundled prebuilt wheels otherwise
+%bcond_without rpmwheels
+
+# Expensive optimizations (mainly, profile-guided optimizations)
+%ifarch %{ix86} x86_64
+%bcond_without optimizations
+%else
+# On some architectures, the optimized build takes tens of hours, possibly
+# longer than Koji's 24-hour timeout. Disable optimizations here.
+%bcond_with optimizations
+%endif
+
+# Run the test suite in %%check
+%bcond_without tests
+
+# Extra build for debugging the interpreter or C-API extensions
+# (the -debug subpackages)
+%if %{with flatpackage}
+%bcond_with debug_build
+%else
+%bcond_without debug_build
+%endif
+
+# Support for the GDB debugger
+%bcond_without gdb_hooks
+
+# The dbm.gnu module (key-value database)
+%bcond_without gdbm
+
+# Main interpreter loop optimization
+%bcond_without computed_gotos
+
+# Support for the Valgrind debugger/profiler
+%ifarch %{valgrind_arches}
+%bcond_without valgrind
+%else
+%bcond_with valgrind
+%endif
+
+
+# Notes from bootstraping Python 3.7:
+#
https://fedoraproject.org/wiki/SIGs/Python/UpgradingPython
+
+
+# =====================
+# General global macros
+# =====================
+
+%global pylibdir %{_libdir}/python%{pybasever}
+%global dynload_dir %{pylibdir}/lib-dynload
+
+# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
+# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
+%global ABIFLAGS_optimized m
+%global ABIFLAGS_debug dm
+
+%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
+%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
+
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
+
+# All bytecode files are in a __pycache__ subdirectory, with a name
+# reflecting the version of the bytecode.
+# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
+# For example,
+# foo/bar.py
+# has bytecode at:
+# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
+%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
+
+# Python's configure script defines SOVERSION, and this is used in the Makefile
+# to determine INSTSONAME, the name of the libpython DSO:
+# LDLIBRARY='libpython$(VERSION).so'
+# INSTSONAME="$LDLIBRARY".$SOVERSION
+# We mirror this here in order to make it easier to add the -gdb.py hooks.
+# (if these get out of sync, the payload of the libs subpackage will fail
+# and halt the build)
+%global py_SOVERSION 1.0
+%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
+%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
+
+# Disable automatic bytecompilation. The python3 binary is not yet be
+# available in /usr/bin when Python is built. Also, the bytecompilation fails
+# on files that test invalid syntax.
+%undefine py_auto_byte_compile
+
+# For multilib support, files that are different between 32- and 64-bit arches
+# need different filenames. Use "64" or "32" according to the word
size.
+# Currently, the best way to determine an architecture's word size happens to
+# be checking %%{_lib}.
+%if "%{_lib}" == "lib64"
+%global wordsize 64
+%else
+%global wordsize 32
+%endif
+
+
+# =======================
+# Build-time requirements
+# =======================
+
+# (keep this list alphabetized)
+
+BuildRequires: autoconf
+BuildRequires: bluez-libs-devel
+BuildRequires: bzip2
+BuildRequires: bzip2-devel
+BuildRequires: desktop-file-utils
+BuildRequires: expat-devel
+
+BuildRequires: findutils
+BuildRequires: gcc-c++
+%if %{with gdbm}
+BuildRequires: gdbm-devel
+%endif
+BuildRequires: glibc-all-langpacks
+BuildRequires: glibc-devel
+BuildRequires: gmp-devel
+BuildRequires: libappstream-glib
+BuildRequires: libffi-devel
+BuildRequires: libnsl2-devel
+BuildRequires: libtirpc-devel
+BuildRequires: libGL-devel
+BuildRequires: libuuid-devel
+BuildRequires: libX11-devel
+BuildRequires: ncurses-devel
+
+BuildRequires: openssl-devel
+BuildRequires: pkgconfig
+BuildRequires: readline-devel
+BuildRequires: sqlite-devel
+BuildRequires: gdb
+
+BuildRequires: tar
+BuildRequires: tcl-devel
+BuildRequires: tix-devel
+BuildRequires: tk-devel
+
+%if %{with valgrind}
+BuildRequires: valgrind-devel
+%endif
+
+BuildRequires: xz-devel
+BuildRequires: zlib-devel
+
+BuildRequires: /usr/bin/dtrace
+
+# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
+BuildRequires: /usr/sbin/ifconfig
+
+%if %{with rpmwheels}
+BuildRequires: python-setuptools-wheel
+BuildRequires: python-pip-wheel
+%endif
+
+
+# =======================
+# Source code and patches
+# =======================
+
+Source:
https://www.python.org/ftp/python/%{general_version}/Python-%{upstream_ve...
+
+# A simple script to check timestamps of bytecode files
+# Run in check section with Python that is currently being built
+# Originally written by bkabrda
+Source8: check-pyc-timestamps.py
+
+# Desktop menu entry for idle3
+Source10: idle3.desktop
+
+# AppData file for idle3
+Source11: idle3.appdata.xml
+
+# 00001 #
+# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
+# Was Patch0 in ivazquez' python3000 specfile:
+Patch1: 00001-rpath.patch
+
+# 00102 #
+# Change the various install paths to use /usr/lib64/ instead or /usr/lib
+# Only used when "%%{_lib}" == "lib64"
+# Not yet sent upstream.
+Patch102: 00102-lib64.patch
+
+# 00111 #
+# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
+# a libpythonMAJOR.MINOR.a
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
+# Downstream only: not appropriate for upstream
+Patch111: 00111-no-static-lib.patch
+
+# 00132 #
+# Add non-standard hooks to unittest for use in the "check" phase below, when
+# running selftests within the build:
+# @unittest._skipInRpmBuild(reason)
+# for tests that hang or fail intermittently within the build environment, and:
+# @unittest._expectedFailureInRpmBuild
+# for tests that always fail within the build environment
+#
+# The hooks only take effect if WITHIN_PYTHON_RPM_BUILD is set in the
+# environment, which we set manually in the appropriate portion of the "check"
+# phase below (and which potentially other python-* rpms could set, to reuse
+# these unittest hooks in their own "check" phases)
+Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
+
+# 00160 #
+# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
+# header files in the build chroot, but may not be supported in the running
+# kernel, hence we disable this test in an rpm build.
+# Adding these was upstream issue
http://bugs.python.org/issue10142
+# Not yet sent upstream
+Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
+
+# 00163 #
+# Some tests within test_socket fail intermittently when run inside Koji;
+# disable them using unittest._skipInRpmBuild
+# Not yet sent upstream
+Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
+
+# 00178 #
+# Don't duplicate various FLAGS in sysconfig values
+#
http://bugs.python.org/issue17679
+# Does not affect python2 AFAICS (different sysconfig values initialization)
+Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
+
+# 00189 #
+# Instead of bundled wheels, use our RPM packaged wheels from
+# /usr/share/python-wheels
+Patch189: 00189-use-rpm-wheels.patch
+
+# 00205 #
+# LIBPL variable in makefile takes LIBPL from configure.ac
+# but the LIBPL variable defined there doesn't respect libdir macro
+Patch205: 00205-make-libpl-respect-lib64.patch
+
+# 00251
+# 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
+Patch251: 00251-change-user-install-location.patch
+
+# 00274 #
+# Upstream uses Debian-style architecture naming. Change to match Fedora.
+Patch274: 00274-fix-arch-names.patch
+
+# 00316 #
+# We remove the exe files from distutil's bdist_wininst
+# So we mark the command as unsupported - and the tests are skipped
+Patch316: 00316-mark-bdist_wininst-unsupported.patch
+
+# (New patches go here ^^^)
+#
+# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
+# please try to keep the patch numbers in-sync between all specfiles.
+#
+# More information, and a patch number catalog, is at:
+#
+#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+
+
+# ==========================================
+# Descriptions, and metadata for subpackages
+# ==========================================
+
+# People might want to dnf install pythonX.Y instead of pythonXY;
+# we enable this in both flat and nonflat package.
+Provides: python%{pybasever} = %{version}-%{release}
+
+%if %{without flatpackage}
+
+# Packages with Python modules in standard locations automatically
+# depend on python(abi). Provide that here.
+Provides: python(abi) = %{pybasever}
+
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
+# In order to support multiple Python interpreters for development purposes,
+# packages with the naming scheme flatpackage (e.g. python35) exist for
+# non-default versions of Python 3.
+# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
+# these names here.
+Provides: python%{pyshortver} = %{version}-%{release}
+# Note that using Obsoletes without package version is not standard practice.
+# Here we assert that *any* version of the system's default interpreter is
+# preferable to an "extra" interpreter. For example, python3-3.6.1 will
+# replace python36-3.6.2.
+Obsoletes: python%{pyshortver}
+
+# Previously, this was required for our rewheel patch to work.
+# This is technically no longer needed, but we keep it recommended
+# for the developer experience.
+Recommends: python3-setuptools
+Recommends: python3-pip
+
+# This prevents ALL subpackages built from this spec to require
+# /usr/bin/python3*. Granularity per subpackage is impossible.
+# It's intended for the libs package not to drag in the interpreter, see
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+# All others require %%{name} anyway.
+%global __requires_exclude ^/usr/bin/python3
+
+
+# The description used both for the SRPM and the main `python3` subpackage:
+%description
+Python is an accessible, high-level, dynamically typed, interpreted programming
+language, designed with an emphasis on code readability.
+It includes an extensive standard library, and has a vast ecosystem of
+third-party libraries.
+
+The %{name} package provides the "python3" executable: the reference
+interpreter for the Python language, version 3.
+The majority of its standard library is provided in the %{name}-libs package,
+which should be installed automatically along with %{name}.
+The remaining parts of the Python standard library are broken out into the
+%{name}-tkinter and %{name}-test packages, which may need to be installed
+separately.
+
+Documentation for Python is provided in the %{name}-docs package.
+
+Packages containing additional libraries for Python are generally named with
+the "%{name}-" prefix.
+
+
+%package libs
+Summary: Python runtime libraries
+
+%if %{with rpmwheels}
+Requires: python-setuptools-wheel
+Requires: python-pip-wheel
+%else
+Provides: bundled(python3-pip) = 18.1
+Provides: bundled(python3-setuptools) = 40.6.2
+%endif
+
+# There are files in the standard library that have python shebang.
+# We've filtered the automatic requirement out so libs are installable without
+# the main package. This however makes it pulled in by default.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+Recommends: %{name}%{?_isa} = %{version}-%{release}
+
+%description libs
+This package contains runtime libraries for use by Python:
+- the majority of the Python standard library
+- a dynamically linked library for use by applications that embed Python as
+ a scripting language, and by the main "python3" executable
+
+
+%package devel
+Summary: Libraries and header files needed for Python development
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+BuildRequires: python-rpm-macros
+Requires: python-rpm-macros
+Requires: python3-rpm-macros
+Requires: python3-rpm-generators
+
+# This is not "API" (packages that need setuptools should still BuildRequire
it)
+# However some packages apparently can build both with and without setuptools
+# producing egg-info as file or directory (depending on setuptools presence).
+# Directory-to-file updates are problematic in RPM, so we ensure setuptools is
+# installed when -devel is required.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1623914
+# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
+Requires: python3-setuptools
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
+# TODO change to a specific subpackage once available (#1218294)
+Requires: redhat-rpm-config
+
+Provides: %{name}-2to3 = %{version}-%{release}
+Provides: 2to3 = %{version}-%{release}
+
+Conflicts: %{name} < %{version}-%{release}
+
+%description devel
+This package contains the header files and configuration needed to compile
+Python extension modules (typically written in C or C++), to embed Python
+into other programs, and to make binary distributions for Python libraries.
+
+It also contains the necessary macros to build RPM packages with Python modules
+and 2to3 tool, an automatic source converter from Python 2.X.
+
+
+%package idle
+Summary: A basic graphical development environment for Python
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-tkinter = %{version}-%{release}
+
+Provides: idle3 = %{version}-%{release}
+
+Provides: %{name}-tools = %{version}-%{release}
+Provides: %{name}-tools%{?_isa} = %{version}-%{release}
+Obsoletes: %{name}-tools < %{version}-%{release}
+
+%description idle
+IDLE is Pythons Integrated Development and Learning Environment.
+
+IDLE has the following features: Python shell window (interactive
+interpreter) with colorizing of code input, output, and error messages;
+multi-window text editor with multiple undo, Python colorizing,
+smart indent, call tips, auto completion, and other features;
+search within any window, replace within editor windows, and
+search through multiple files (grep); debugger with persistent
+breakpoints, stepping, and viewing of global and local namespaces;
+configuration, browsers, and other dialogs.
+
+
+%package tkinter
+Summary: A GUI toolkit for Python
+Requires: %{name} = %{version}-%{release}
+
+%description tkinter
+The Tkinter (Tk interface) library is a graphical user interface toolkit for
+the Python programming language.
+
+
+%package test
+Summary: The self-test suite for the main python3 package
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
+%description test
+The self-test suite for the Python interpreter.
+
+This is only useful to test Python itself. For testing general Python code,
+you should use the unittest module from %{name}-libs, or a library such as
+%{name}-pytest or %{name}-nose.
+
+
+%if %{with debug_build}
+%package debug
+Summary: Debug version of the Python runtime
+
+# The debug build is an all-in-one package version of the regular build, and
+# shares the same .py/.pyc files and directories as the regular build. Hence
+# we depend on all of the subpackages of the regular build:
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+Requires: %{name}-test%{?_isa} = %{version}-%{release}
+Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
+Requires: %{name}-idle%{?_isa} = %{version}-%{release}
+
+%description debug
+python3-debug provides a version of the Python runtime with numerous debugging
+features enabled, aimed at advanced Python users such as developers of Python
+extension modules.
+
+This version uses more memory and will be slower than the regular Python build,
+but is useful for tracking down reference-counting issues and other bugs.
+
+The bytecode format is unchanged, so that .pyc files are compatible between
+this and the standard version of Python, but the debugging features mean that
+C/C++ extension modules are ABI-incompatible and must be built for each version
+separately.
+
+The debug build shares installation directories with the standard Python
+runtime, so that .py and .pyc files can be shared.
+Compiled extension modules use a special ABI flag ("d") in the filename,
+so extensions for both versions can co-exist in the same directory.
+%endif # with debug_build
+
+%else # with flatpackage
+
+Requires: redhat-rpm-config
+
+# We'll not provide this, on purpose
+# No package in Fedora shall ever depend on flatpackage via this
+%global __requires_exclude ^python\\(abi\\) = 3\\..$
+%global __provides_exclude ^python\\(abi\\) = 3\\..$
+
+%if %{with rpmwheels}
+Requires: python-setuptools-wheel
+Requires: python-pip-wheel
+%else
+Provides: bundled(python3-pip) = 18.1
+Provides: bundled(python3-setuptools) = 40.6.2
+%endif
+
+# The description for the flat package
+%description
+Python %{pybasever} package for developers.
+
+This package exists to allow developers to test their code against a newer
+version of Python. This is not a full Python stack and if you wish to run
+your applications with Python %{pybasever}, update your Fedora to a newer
+version once Python %{pybasever} is stable.
+
+%endif # with flatpackage
+
+# ======================================================
+# The prep phase of the build:
+# ======================================================
+
+%prep
+%setup -q -n Python-%{upstream_version}
+# Remove all exe files to ensure we are not shipping prebuilt binaries
+# note that those are only used to create Microsoft Windows installers
+# and that functionality is broken on Linux anyway
+find -name '*.exe' -print -delete
+
+# Remove bundled libraries to ensure that we're using the system copy.
+rm -r Modules/expat
+
+#
+# Apply patches:
+#
+%patch1 -p1
+
+%if "%{_lib}" == "lib64"
+%patch102 -p1
+%endif
+%patch111 -p1
+%patch132 -p1
+%patch160 -p1
+%patch163 -p1
+%patch178 -p1
+
+%if %{with rpmwheels}
+%patch189 -p1
+rm Lib/ensurepip/_bundled/*.whl
+%endif
+
+%patch205 -p1
+%patch251 -p1
+%patch274 -p1
+%patch316 -p1
+
+
+# Remove files that should be generated by the build
+# (This is after patching, so that we can use patches directly from upstream)
+rm configure pyconfig.h.in
+
+
+# ======================================================
+# Configuring and building the code:
+# ======================================================
+
+%build
+
+# Regenerate the configure script and pyconfig.h.in
+autoconf
+autoheader
+
+# Remember the current directory (which has sources and the configure script),
+# so we can refer to it after we "cd" elsewhere.
+topdir=$(pwd)
+
+# Get proper option names from bconds
+%if %{with computed_gotos}
+%global computed_gotos_flag yes
+%else
+%global computed_gotos_flag no
+%endif
+
+%if %{with optimizations}
+%global optimizations_flag "--enable-optimizations"
+%else
+%global optimizations_flag "--disable-optimizations"
+%endif
+
+# Set common compiler/linker flags
+export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
+export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export LINKCC="gcc"
+export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
+export LDFLAGS="$RPM_LD_FLAGS -g $(pkg-config --libs-only-L openssl)"
+
+# We can build several different configurations of Python: regular and debug.
+# Define a common function that does one build:
+BuildPython() {
+ ConfName=$1
+ ExtraConfigArgs=$2
+ MoreCFlags=$3
+
+ # Each build is done in its own directory
+ ConfDir=build/$ConfName
+ echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ # Normally, %%configure looks for the "configure" script in the current
+ # directory.
+ # Since we changed directories, we need to tell %%configure where to look.
+ %global _configure $topdir/configure
+
+%configure \
+ --enable-ipv6 \
+ --enable-shared \
+ --with-computed-gotos=%{computed_gotos_flag} \
+ --with-dbmliborder=gdbm:ndbm:bdb \
+ --with-system-expat \
+ --with-system-ffi \
+ --enable-loadable-sqlite-extensions \
+ --with-dtrace \
+ --with-lto \
+ --with-ssl-default-suites=openssl \
+%if %{with valgrind}
+ --with-valgrind \
+%endif
+ $ExtraConfigArgs \
+ %{nil}
+
+ # Invoke the build
+ make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
+
+ popd
+ echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Call the above to build each configuration.
+
+%if %{with debug_build}
+BuildPython debug \
+ "--without-ensurepip --with-pydebug" \
+ "-Og"
+%endif # with debug_build
+
+BuildPython optimized \
+ "--without-ensurepip %{optimizations_flag}" \
+ ""
+
+# ======================================================
+# Installing the built code:
+# ======================================================
+
+%install
+
+# As in %%build, remember the current directory
+topdir=$(pwd)
+
+# We install a collection of hooks for gdb that make it easier to debug
+# executables linked against libpython3* (such as /usr/bin/python3 itself)
+#
+# These hooks are implemented in Python itself (though they are for the version
+# of python that gdb is linked with)
+#
+# gdb-archer looks for them in the same path as the ELF file or its .debug
+# file, with a -gdb.py suffix.
+# We put them next to the debug file, because ldconfig would complain if
+# it found non-library files directly in /usr/lib/
+# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
+#
+# We'll put these files in the debuginfo package by installing them to e.g.:
+# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
+# (note that the debug path is /usr/lib/debug for both 32/64 bit)
+#
+# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
+# information
+
+%if %{with gdb_hooks}
+DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+mkdir -p %{buildroot}$DirHoldingGdbPy
+%endif # with gdb_hooks
+
+# Multilib support for pyconfig.h
+# 32- and 64-bit versions of pyconfig.h are different. For multilib support
+# (making it possible to install 32- and 64-bit versions simultaneously),
+# we need to install them under different filenames, and to make the common
+# "pyconfig.h" include the right file based on architecture.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
+# Filanames are defined here:
+%global _pyconfig32_h pyconfig-32.h
+%global _pyconfig64_h pyconfig-64.h
+%global _pyconfig_h pyconfig-%{wordsize}.h
+
+# Use a common function to do an install for all our configurations:
+InstallPython() {
+
+ ConfName=$1
+ PyInstSoName=$2
+ MoreCFlags=$3
+ LDVersion=$4
+
+ # Switch to the directory with this configuration's built files
+ ConfDir=build/$ConfName
+ echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ make \
+ DESTDIR=%{buildroot} \
+ INSTALL="install -p" \
+ EXTRA_CFLAGS="$MoreCFlags" \
+ install
+
+ popd
+
+%if %{with gdb_hooks}
+ # See comment on $DirHoldingGdbPy above
+ PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
+ cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
+%endif # with gdb_hooks
+
+ # Rename the -devel script that differs on different arches to arch specific name
+ mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
+ echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
+
+ # Make python3-devel multilib-ready
+ mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
+ %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
+ cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+#include "%{_pyconfig32_h}"
+#elif __WORDSIZE == 64
+#include "%{_pyconfig64_h}"
+#else
+#error "Unknown word size"
+#endif
+EOF
+
+ echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Install the "debug" build first; any common files will be overridden with
+# later builds
+%if %{with debug_build}
+InstallPython debug \
+ %{py_INSTSONAME_debug} \
+ -O0 \
+ %{LDVERSION_debug}
+%endif # with debug_build
+
+# Now the optimized build:
+InstallPython optimized \
+ %{py_INSTSONAME_optimized} \
+ "" \
+ %{LDVERSION_optimized}
+
+# Install directories for additional packages
+install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
+%if "%{_lib}" == "lib64"
+# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
+# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
+# modules).
+# Note that rpmlint will complain about hardcoded library path;
+# this is intentional.
+install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
+%endif
+
+%if %{without flatpackage}
+# add idle3 to menu
+install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
+desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
+
+# Install and validate appdata file
+mkdir -p %{buildroot}%{_metainfodir}
+cp -a %{SOURCE11} %{buildroot}%{_metainfodir}
+appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/idle3.appdata.xml
+%endif
+
+# Make sure distutils looks at the right pyconfig.h file
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
+# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
+# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
+# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
+#
+# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
+# variants:
+sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
+ %{buildroot}%{pylibdir}/distutils/sysconfig.py \
+ %{buildroot}%{pylibdir}/sysconfig.py
+
+# Install pathfix.py to bindir
+# See
https://github.com/fedora-python/python-rpm-porting/issues/24
+cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+
+# Install i18n tools to bindir
+# They are also in python2, so we version them
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1571474
+for tool in pygettext msgfmt; do
+ cp -p Tools/i18n/${tool}.py %{buildroot}%{_bindir}/${tool}%{pybasever}.py
+ ln -s ${tool}%{pybasever}.py %{buildroot}%{_bindir}/${tool}3.py
+done
+
+# Switch all shebangs to refer to the specific Python version.
+# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
+# so handle files named using other naming scheme separately.
+LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
+ Tools/scripts/pathfix.py \
+ -i "%{_bindir}/python%{pybasever}" -pn \
+ %{buildroot} \
+ %{buildroot}%{_bindir}/*%{pybasever}.py \
+ %{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
+
+# Remove tests for python3-tools which was removed in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+rm -rf %{buildroot}%{pylibdir}/test/test_tools
+
+# Remove shebang lines from .py files that aren't executable, and
+# remove executability from .py files that don't have a shebang line:
+find %{buildroot} -name \*.py \
+ \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
+ -print -exec sed -i '1d' {} \; \) -o \( \
+ -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
+ -exec chmod a-x {} \; \) \)
+
+# Get rid of DOS batch files:
+find %{buildroot} -name \*.bat -exec rm {} \;
+
+# Get rid of backup files:
+find %{buildroot}/ -name "*~" -exec rm -f {} \;
+find . -name "*~" -exec rm -f {} \;
+
+# Get rid of a stray copy of the license:
+rm %{buildroot}%{pylibdir}/LICENSE.txt
+
+# Do bytecompilation with the newly installed interpreter.
+# This is similar to the script in macros.pybytecompile
+# compile *.pyc
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
+
+# Since we have pathfix.py in bindir, this is created, but we don't want it
+rm -rf %{buildroot}%{_bindir}/__pycache__
+
+# Fixup permissions for shared libraries from non-standard 555 to standard 755:
+find %{buildroot} -perm 555 -exec chmod 755 {} \;
+
+# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
+# avoid the user having to know the precise version and ABI flags.
+# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
+%if %{with debug_build} && %{without flatpackage}
+ln -s \
+ %{_bindir}/python%{LDVERSION_debug} \
+ %{buildroot}%{_bindir}/python3-debug
+%endif
+
+# There's 2to3-X.X executable and 2to3 soft link to it.
+# No reason to have both, so keep only 2to3 as an executable.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
+
+%if %{with flatpackage}
+# Remove stuff that would conflict with python3 package
+rm %{buildroot}%{_bindir}/python3
+rm %{buildroot}%{_bindir}/pydoc3
+rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/pygettext3.py
+rm %{buildroot}%{_bindir}/msgfmt3.py
+rm %{buildroot}%{_bindir}/idle3
+rm %{buildroot}%{_bindir}/python3-*
+rm %{buildroot}%{_bindir}/2to3
+rm %{buildroot}%{_libdir}/libpython3.so
+rm %{buildroot}%{_mandir}/man1/python3.1*
+rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+%endif
+
+
+# ======================================================
+# Checks for packaging issues
+# ======================================================
+
+%check
+
+# first of all, check timestamps of bytecode files
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
+
+# Ensure that the curses module was linked against libncursesw.so, rather than
+# libncurses.so
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
+ldd %{buildroot}/%{dynload_dir}/_curses*.so \
+ | grep curses \
+ | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
+
+# Ensure that the debug modules are linked against the debug libpython, and
+# likewise for the optimized modules and libpython:
+for Module in %{buildroot}/%{dynload_dir}/*.so ; do
+ case $Module in
+ *.%{SOABI_debug})
+ ldd $Module | grep %{py_INSTSONAME_optimized} &&
+ (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
+
+ ;;
+ *.%{SOABI_optimized})
+ ldd $Module | grep %{py_INSTSONAME_debug} &&
+ (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
+ ;;
+ esac
+done
+
+
+# ======================================================
+# Running the upstream test suite
+# ======================================================
+
+topdir=$(pwd)
+CheckPython() {
+ ConfName=$1
+ ConfDir=$(pwd)/build/$ConfName
+
+ # Fedora sets TLSv1 as explicit minimum version.
+ # Python's test suite assumes that the minimum protocol version is set to
+ # a magic marker. We workaround the test problem by setting:
+ export OPENSSL_CONF=/non-existing-file
+ #
https://bugzilla.redhat.com/show_bug.cgi?id=1618753
+
+ echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+ # Note that we're running the tests using the version of the code in the
+ # builddir, not in the buildroot.
+
+ # Show some info, helpful for debugging test failures
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.pythoninfo
+
+ # Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
+ # our non-standard decorators take effect on the relevant tests:
+ # @unittest._skipInRpmBuild(reason)
+ # @unittest._expectedFailureInRpmBuild
+ WITHIN_PYTHON_RPM_BUILD= \
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
+ -wW --slowest -j0 \
+ -x test_distutils \
+ -x test_bdist_rpm \
+ -x test_gdb \
+ %ifarch %{mips64}
+ -x test_ctypes \
+ %endif
+ %ifarch ppc64le
+ -x test_buffer \
+ %endif
+
+ echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+}
+
+%if %{with tests}
+
+# Check each of the configurations:
+%if %{with debug_build}
+CheckPython debug
+%endif # with debug_build
+CheckPython optimized
+
+%endif # with tests
+
+
+%files
+%license LICENSE
+%doc README.rst
+
+%if %{without flatpackage}
+%{_bindir}/pydoc*
+%{_bindir}/python3
+%else
+%{_bindir}/pydoc%{pybasever}
+%endif
+
+%{_bindir}/python%{pybasever}
+%{_bindir}/python%{pybasever}m
+%{_mandir}/*/*
+
+
+%if %{without flatpackage}
+%files libs
+%license LICENSE
+%doc README.rst
+%endif
+
+%dir %{pylibdir}
+%dir %{dynload_dir}
+
+%{pylibdir}/lib2to3
+%if %{without flatpackage}
+%exclude %{pylibdir}/lib2to3/tests
+%endif
+
+%dir %{pylibdir}/unittest/
+%dir %{pylibdir}/unittest/__pycache__/
+%{pylibdir}/unittest/*.py
+%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/asyncio/
+%dir %{pylibdir}/asyncio/__pycache__/
+%{pylibdir}/asyncio/*.py
+%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/venv/
+%dir %{pylibdir}/venv/__pycache__/
+%{pylibdir}/venv/*.py
+%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/venv/scripts
+
+%{pylibdir}/wsgiref
+%{pylibdir}/xmlrpc
+
+%dir %{pylibdir}/ensurepip/
+%dir %{pylibdir}/ensurepip/__pycache__/
+%{pylibdir}/ensurepip/*.py
+%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+
+%if %{with rpmwheels}
+%exclude %{pylibdir}/ensurepip/_bundled
+%else
+%dir %{pylibdir}/ensurepip/_bundled
+%{pylibdir}/ensurepip/_bundled/*.whl
+%endif
+
+# The majority of the test module lives in the test subpackage
+# However test.support is in libs - it contains stuff used when testing your code
+#
https://bugzilla.redhat.com/show_bug.cgi?id=596258
+%if %{without flatpackage}
+%dir %{pylibdir}/test/
+%dir %{pylibdir}/test/__pycache__/
+%dir %{pylibdir}/test/support/
+%dir %{pylibdir}/test/support/__pycache__/
+%{pylibdir}/test/__init__.py
+%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%{pylibdir}/test/support/*.py
+%{pylibdir}/test/support/__pycache__/*%{bytecode_suffixes}
+%endif
+
+%dir %{pylibdir}/concurrent/
+%dir %{pylibdir}/concurrent/__pycache__/
+%{pylibdir}/concurrent/*.py
+%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/futures/
+%dir %{pylibdir}/concurrent/futures/__pycache__/
+%{pylibdir}/concurrent/futures/*.py
+%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/pydoc_data
+
+%{dynload_dir}/_blake2.%{SOABI_optimized}.so
+%{dynload_dir}/_md5.%{SOABI_optimized}.so
+%{dynload_dir}/_sha1.%{SOABI_optimized}.so
+%{dynload_dir}/_sha256.%{SOABI_optimized}.so
+%{dynload_dir}/_sha3.%{SOABI_optimized}.so
+%{dynload_dir}/_sha512.%{SOABI_optimized}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
+%{dynload_dir}/_bisect.%{SOABI_optimized}.so
+%{dynload_dir}/_bz2.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
+%{dynload_dir}/_contextvars.%{SOABI_optimized}.so
+%{dynload_dir}/_crypt.%{SOABI_optimized}.so
+%{dynload_dir}/_csv.%{SOABI_optimized}.so
+%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
+%{dynload_dir}/_curses.%{SOABI_optimized}.so
+%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
+%{dynload_dir}/_dbm.%{SOABI_optimized}.so
+%{dynload_dir}/_decimal.%{SOABI_optimized}.so
+%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
+%{dynload_dir}/_heapq.%{SOABI_optimized}.so
+%{dynload_dir}/_json.%{SOABI_optimized}.so
+%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
+%{dynload_dir}/_lzma.%{SOABI_optimized}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
+%{dynload_dir}/_opcode.%{SOABI_optimized}.so
+%{dynload_dir}/_pickle.%{SOABI_optimized}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
+%{dynload_dir}/_queue.%{SOABI_optimized}.so
+%{dynload_dir}/_random.%{SOABI_optimized}.so
+%{dynload_dir}/_socket.%{SOABI_optimized}.so
+%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
+%{dynload_dir}/_ssl.%{SOABI_optimized}.so
+%{dynload_dir}/_struct.%{SOABI_optimized}.so
+%{dynload_dir}/array.%{SOABI_optimized}.so
+%{dynload_dir}/audioop.%{SOABI_optimized}.so
+%{dynload_dir}/binascii.%{SOABI_optimized}.so
+%{dynload_dir}/cmath.%{SOABI_optimized}.so
+%{dynload_dir}/_datetime.%{SOABI_optimized}.so
+%{dynload_dir}/fcntl.%{SOABI_optimized}.so
+%{dynload_dir}/grp.%{SOABI_optimized}.so
+%{dynload_dir}/math.%{SOABI_optimized}.so
+%{dynload_dir}/mmap.%{SOABI_optimized}.so
+%{dynload_dir}/nis.%{SOABI_optimized}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
+%{dynload_dir}/parser.%{SOABI_optimized}.so
+%{dynload_dir}/_posixshmem.%{SOABI_optimized}.so
+%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
+%{dynload_dir}/readline.%{SOABI_optimized}.so
+%{dynload_dir}/resource.%{SOABI_optimized}.so
+%{dynload_dir}/select.%{SOABI_optimized}.so
+%{dynload_dir}/spwd.%{SOABI_optimized}.so
+%{dynload_dir}/syslog.%{SOABI_optimized}.so
+%{dynload_dir}/termios.%{SOABI_optimized}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
+%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
+%{dynload_dir}/_uuid.%{SOABI_optimized}.so
+%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
+%{dynload_dir}/zlib.%{SOABI_optimized}.so
+
+%dir %{pylibdir}/site-packages/
+%dir %{pylibdir}/site-packages/__pycache__/
+%{pylibdir}/site-packages/README.txt
+%{pylibdir}/*.py
+%dir %{pylibdir}/__pycache__/
+%{pylibdir}/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/collections/
+%dir %{pylibdir}/collections/__pycache__/
+%{pylibdir}/collections/*.py
+%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/ctypes/
+%dir %{pylibdir}/ctypes/__pycache__/
+%{pylibdir}/ctypes/*.py
+%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/ctypes/macholib
+
+%{pylibdir}/curses
+
+%dir %{pylibdir}/dbm/
+%dir %{pylibdir}/dbm/__pycache__/
+%{pylibdir}/dbm/*.py
+%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/distutils/
+%dir %{pylibdir}/distutils/__pycache__/
+%{pylibdir}/distutils/*.py
+%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/distutils/README
+%{pylibdir}/distutils/command
+
+%dir %{pylibdir}/email/
+%dir %{pylibdir}/email/__pycache__/
+%{pylibdir}/email/*.py
+%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/email/mime
+%doc %{pylibdir}/email/architecture.rst
+
+%{pylibdir}/encodings
+
+%{pylibdir}/html
+%{pylibdir}/http
+
+%dir %{pylibdir}/importlib/
+%dir %{pylibdir}/importlib/__pycache__/
+%{pylibdir}/importlib/*.py
+%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/json/
+%dir %{pylibdir}/json/__pycache__/
+%{pylibdir}/json/*.py
+%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/logging
+%{pylibdir}/multiprocessing
+
+%dir %{pylibdir}/sqlite3/
+%dir %{pylibdir}/sqlite3/__pycache__/
+%{pylibdir}/sqlite3/*.py
+%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
+%exclude %{pylibdir}/turtle.py
+%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%endif
+
+%{pylibdir}/urllib
+%{pylibdir}/xml
+
+%if "%{_lib}" == "lib64"
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
+%endif
+
+# "Makefile" and the config-32/64.h file are needed by
+# distutils/sysconfig.py:_init_posix(), so we include them in the core
+# package, along with their parent directories (bug 531901):
+%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%dir %{_includedir}/python%{LDVERSION_optimized}/
+%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+
+%{_libdir}/%{py_INSTSONAME_optimized}
+%if %{without flatpackage}
+%{_libdir}/libpython3.so
+%endif
+
+
+%if %{without flatpackage}
+%files devel
+%{_bindir}/2to3
+%endif
+
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
+%if %{without flatpackage}
+%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+%endif
+%{_includedir}/python%{LDVERSION_optimized}/*.h
+%{_includedir}/python%{LDVERSION_optimized}/internal/
+%{_includedir}/python%{LDVERSION_optimized}/cpython/
+%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
+
+%if %{without flatpackage}
+%{_bindir}/python3-config
+%{_libdir}/pkgconfig/python3.pc
+%{_bindir}/pathfix.py
+%{_bindir}/pygettext3.py
+%{_bindir}/msgfmt3.py
+%endif
+
+%{_bindir}/pygettext%{pybasever}.py
+%{_bindir}/msgfmt%{pybasever}.py
+
+%{_bindir}/python%{pybasever}-config
+%{_bindir}/python%{LDVERSION_optimized}-config
+%{_bindir}/python%{LDVERSION_optimized}-*-config
+%{_libdir}/libpython%{LDVERSION_optimized}.so
+%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
+%{_libdir}/pkgconfig/python-%{pybasever}.pc
+
+
+%if %{without flatpackage}
+%files idle
+
+%{_bindir}/idle*
+%else
+%{_bindir}/idle%{pybasever}
+%endif
+
+%{pylibdir}/idlelib
+
+%if %{without flatpackage}
+%{_metainfodir}/idle3.appdata.xml
+%{_datadir}/applications/idle3.desktop
+%{_datadir}/icons/hicolor/*/apps/idle3.*
+%endif
+
+%if %{without flatpackage}
+%files tkinter
+%endif
+
+%{pylibdir}/tkinter
+%if %{without flatpackage}
+%exclude %{pylibdir}/tkinter/test
+%endif
+%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
+%{pylibdir}/turtle.py
+%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%dir %{pylibdir}/turtledemo
+%{pylibdir}/turtledemo/*.py
+%{pylibdir}/turtledemo/*.cfg
+%dir %{pylibdir}/turtledemo/__pycache__/
+%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
+
+
+%if %{without flatpackage}
+%files test
+%endif
+
+%{pylibdir}/ctypes/test
+%{pylibdir}/distutils/tests
+%{pylibdir}/sqlite3/test
+%{pylibdir}/test
+%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
+%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
+%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
+%{pylibdir}/lib2to3/tests
+%{pylibdir}/tkinter/test
+%{pylibdir}/unittest/test
+
+# stuff already owned by the libs subpackage
+# test requires libs, so we are safe not owning those dirs
+%if %{without flatpackage}
+%exclude %dir %{pylibdir}/test/
+%exclude %dir %{pylibdir}/test/__pycache__/
+%exclude %{pylibdir}/test/__init__.py
+%exclude %{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%exclude %{pylibdir}/test/support/
+%endif
+
+# We don't bother splitting the debug build out into further subpackages:
+# if you need it, you're probably a developer.
+
+# Hence the manifest is the combination of analogous files in the manifests of
+# all of the other subpackages
+
+%if %{with debug_build}
+%if %{without flatpackage}
+%files debug
+%{_bindir}/python3-debug
+%endif
+
+# Analog of the core subpackage's files:
+%{_bindir}/python%{LDVERSION_debug}
+
+# Analog of the -libs subpackage's files:
+# ...with debug builds of the built-in "extension" modules:
+
+%{dynload_dir}/_blake2.%{SOABI_debug}.so
+%{dynload_dir}/_md5.%{SOABI_debug}.so
+%{dynload_dir}/_sha1.%{SOABI_debug}.so
+%{dynload_dir}/_sha256.%{SOABI_debug}.so
+%{dynload_dir}/_sha3.%{SOABI_debug}.so
+%{dynload_dir}/_sha512.%{SOABI_debug}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_debug}.so
+%{dynload_dir}/_bisect.%{SOABI_debug}.so
+%{dynload_dir}/_bz2.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
+%{dynload_dir}/_contextvars.%{SOABI_debug}.so
+%{dynload_dir}/_crypt.%{SOABI_debug}.so
+%{dynload_dir}/_csv.%{SOABI_debug}.so
+%{dynload_dir}/_ctypes.%{SOABI_debug}.so
+%{dynload_dir}/_curses.%{SOABI_debug}.so
+%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
+%{dynload_dir}/_dbm.%{SOABI_debug}.so
+%{dynload_dir}/_decimal.%{SOABI_debug}.so
+%{dynload_dir}/_elementtree.%{SOABI_debug}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_debug}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_debug}.so
+%{dynload_dir}/_heapq.%{SOABI_debug}.so
+%{dynload_dir}/_json.%{SOABI_debug}.so
+%{dynload_dir}/_lsprof.%{SOABI_debug}.so
+%{dynload_dir}/_lzma.%{SOABI_debug}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
+%{dynload_dir}/_opcode.%{SOABI_debug}.so
+%{dynload_dir}/_pickle.%{SOABI_debug}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
+%{dynload_dir}/_queue.%{SOABI_debug}.so
+%{dynload_dir}/_random.%{SOABI_debug}.so
+%{dynload_dir}/_socket.%{SOABI_debug}.so
+%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
+%{dynload_dir}/_ssl.%{SOABI_debug}.so
+%{dynload_dir}/_struct.%{SOABI_debug}.so
+%{dynload_dir}/array.%{SOABI_debug}.so
+%{dynload_dir}/audioop.%{SOABI_debug}.so
+%{dynload_dir}/binascii.%{SOABI_debug}.so
+%{dynload_dir}/cmath.%{SOABI_debug}.so
+%{dynload_dir}/_datetime.%{SOABI_debug}.so
+%{dynload_dir}/fcntl.%{SOABI_debug}.so
+%{dynload_dir}/grp.%{SOABI_debug}.so
+%{dynload_dir}/math.%{SOABI_debug}.so
+%{dynload_dir}/mmap.%{SOABI_debug}.so
+%{dynload_dir}/nis.%{SOABI_debug}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
+%{dynload_dir}/parser.%{SOABI_debug}.so
+%{dynload_dir}/_posixshmem.%{SOABI_debug}.so
+%{dynload_dir}/pyexpat.%{SOABI_debug}.so
+%{dynload_dir}/readline.%{SOABI_debug}.so
+%{dynload_dir}/resource.%{SOABI_debug}.so
+%{dynload_dir}/select.%{SOABI_debug}.so
+%{dynload_dir}/spwd.%{SOABI_debug}.so
+%{dynload_dir}/syslog.%{SOABI_debug}.so
+%{dynload_dir}/termios.%{SOABI_debug}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
+%{dynload_dir}/unicodedata.%{SOABI_debug}.so
+%{dynload_dir}/_uuid.%{SOABI_debug}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
+%{dynload_dir}/zlib.%{SOABI_debug}.so
+
+# No need to split things out the "Makefile" and the config-32/64.h file as we
+# do for the regular build above (bug 531901), since they're all in one package
+# now; they're listed below, under "-devel":
+
+%{_libdir}/%{py_INSTSONAME_debug}
+
+# Analog of the -devel subpackage's files:
+%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
+%{_includedir}/python%{LDVERSION_debug}
+%{_bindir}/python%{LDVERSION_debug}-config
+%{_bindir}/python%{LDVERSION_debug}-*-config
+%{_libdir}/libpython%{LDVERSION_debug}.so
+%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
+%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
+
+# Analog of the -tools subpackage's files:
+# None for now; we could build precanned versions that have the appropriate
+# shebang if needed
+
+# Analog of the tkinter subpackage's files:
+%{dynload_dir}/_tkinter.%{SOABI_debug}.so
+
+# Analog of the -test subpackage's files:
+%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
+%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
+%{dynload_dir}/_testcapi.%{SOABI_debug}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
+
+%endif # with debug_build
+
+# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
+#
+# The /usr/lib/rpm/redhat/macros defines %%__debug_package to use
+# debugfiles.list, and it appears that everything below /usr/lib/debug and
+# (/usr/src/debug) gets added to this file (via LISTFILES) in
+# /usr/lib/rpm/find-debuginfo.sh
+#
+# Hence by installing it below /usr/lib/debug we ensure it is added to the
+# -debuginfo subpackage
+# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
+# payload file would be unpackaged)
+
+# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
+%undefine _debuginfo_subpackages
+
+# ======================================================
+# Finally, the changelog:
+# ======================================================
+
+%changelog
+* Tue Feb 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-1
+- Update to 3.8.0a1
+
+* Sat Feb 02 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.2-5
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Wed Jan 16 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-4
+- Security fix for CVE-2019-5010 (#1666519, #1666522)
+
+* Mon Jan 14 2019 Bjrn Esser <besser82(a)fedoraproject.org> - 3.7.2-3
+- Rebuilt for libcrypt.so.2 (#1666033)
+
+* Fri Jan 04 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-2
+- No longer revert upstream commit 3b699932e5ac3e7
+- This was a dirty workaround for (#1644936)
+
+* Tue Dec 25 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-1
+- Update to 3.7.2
+
+* Fri Dec 07 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-5
+- Make sure we don't ship any exe files (not needed an prebuilt)
+
+* Wed Nov 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-4
+- Make sure the entire test.support module is in python3-libs (#1651245)
+
+* Tue Nov 06 2018 Victor Stinner <vstinner(a)redhat.com> - 3.7.1-3
+- Verify the value of '-s' when execute the CLI of cProfile (rhbz#1160640)
+
+* Sun Nov 04 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-2
+- Temporarily revert upstream commit 3b699932e5ac3e7
+- This is dirty workaround for (#1644936)
+
+* Mon Oct 22 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-1
+- Update to 3.7.1
+
+* Thu Sep 27 2018 Petr Viktorin <pviktori(a)redhat.com> - 3.7.0-10
+- Compile the debug build with -Og rather than -O0
+
+* Thu Aug 30 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-9
+- Require python3-setuptools from python3-devel to prevent packaging errors (#1623914)
+
+* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-8
+- Add /usr/bin/pygettext3.py and msgfmt3.py to python3-devel
+Resolves: rhbz#1571474
+
+* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-7
+- Backport TLS 1.3 related fixes to fix FTBFS
+Resolves: rhbz#1609291
+
+* Wed Aug 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-6
+- Use RPM built wheels of pip and setuptools in ensurepip instead of our rewheel patch
+
+* Fri Aug 10 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-5
+- Fix wrong requirement on gdbm
+
+* Fri Jul 20 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-4
+- Allow to call Py_Main() after Py_Initialize()
+Resolves: rhbz#1595421
+
+* Sat Jul 14 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.0-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Thu Jul 12 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-2
+- Rebuild for new gdbm
+
+* Wed Jun 27 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-1
+- Update to 3.7.0 final
+
+* Wed Jun 13 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.21.rc1
+- Finish bootstrapping, enable rewheel, tests, optimizations
+
+* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
+- Update to 3.7.0rc1
+- Bootstrap, disable rewheel, tests, optimizations
+
+* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-4
+- Fix multiprocessing regression on newer glibcs
+- Enable test_multiprocessing_fork(server) and _spawn again
+Resolves: rhbz#1569933
+
+* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-3
+- Skip test_multiprocessing_fork(server) and _spawn for now
+
+* Wed Apr 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-2
+- Add flatpackage conditionals
+
+* Thu Mar 29 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.5-1
+- Update to 3.6.5
+
+* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-20
+- Fix broken macro invocation and broken building of C Python extensions
+Resolves: rhbz#1560103
+
+* Fri Mar 16 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-19
+- Add -n option for pathfix.py
+Resolves: rhbz#1546990
+
+* Thu Mar 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-18
+- Fix the py_byte_compile macro to work on Python 2
+- Remove the pybytecompile macro file from the flat package
+Resolves: rhbz#1484993
+
+* Tue Mar 13 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-17
+- Do not send IP addresses in SNI TLS extension
+
+* Sat Feb 24 2018 Florian Weimer <fweimer(a)redhat.com> - 3.6.4-16
+- Rebuild with new LDFLAGS from redhat-rpm-config
+
+* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-15
+- Filter out automatic /usr/bin/python3.X requirement,
+ recommend the main package from libs instead
+Resolves: rhbz#1547131
+
+* Thu Feb 15 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.4-14
+- Remove the python3-tools package (#rhbz 1312030)
+- Move /usr/bin/2to3 to python3-devel
+- Move /usr/bin/idle and idlelib to python3-idle
+- Provide python3-tools from python3-idle
+
+* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-13
+- Escape macros in %%changelog
+
+* Fri Feb 02 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.4-12
+- Remove sys.executable check from change-user-install-location patch
+Resolves: rhbz#1532287
+
+* Thu Feb 01 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-11
+- Define TLS cipher suite on build time.
+
+* Wed Jan 31 2018 Tomas Orsava <torsava(a)redhat.com> - 3.6.4-10
+- Disable test_gdb for all arches and test_buffer for ppc64le in anticipation
+ of the F28 mass rebuild
+- Re-enable these tests after the mass rebuild when they can be properly
+ addressed
+
+* Tue Jan 23 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-9
+- Restore the PyExc_RecursionErrorInst public symbol
+
+* Tue Jan 23 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-8
+- Add patch to explicitly link _ctypes module with -ldl (#1537489)
+- Refactored patch for libxcrypt
+- Re-enable strict symbol checks in the link editor
+
+* Mon Jan 22 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-7
+- Add patch for libxcrypt
+- Disable strict symbol checks in the link editor
+
+* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-6
+- Rebuilt for switch to libxcrypt
+
+* Fri Jan 19 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-5
+- Fix localeconv() encoding for LC_NUMERIC
+
+* Thu Jan 18 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-4
+- R: gdbm-devel R: gdbm for python3-libs
+
+* Wed Jan 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-3
+- Require large enough gdbm (fixup for previous bump)
+
+* Tue Jan 16 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-2
+- Rebuild for reverted gdbm 1.13 on Fedora 27
+
+* Mon Jan 15 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-1
+- Update to version 3.6.4
+
+* Fri Jan 12 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-5
+- Fix the compilation of the nis module.
+
+* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
+- Raise the release of platform-python obsoletes for better maintainability
+
+* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
+- Obsolete platform-python and it's subpackages
+
+* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
+- Fix memory corruption due to allocator mix
+Resolves: rhbz#1498207
+
+* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
+- Update to Python 3.6.3
+
+* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
+- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
+- Make the -devel package require redhat-rpm-config
+Resolves: rhbz#1496757
+
+* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
+- Fix /usr/bin/env dependency from python3-tools
+Resolves: rhbz#1482118
+
+* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
+- Include `-g` in the flags sent to the linker (LDFLAGS)
+Resolves: rhbz#1483222
+
+* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
+- Specfile cleanup
+- Make the main description also applicable to the SRPM
+- Add audiotest.au to the test package
+
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
+- Remove %%{pylibdir}/Tools/scripts/2to3
+
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
+- Expat >= 2.1.0 is everywhere, remove explicit requires
+- Conditionalize systemtap-devel BuildRequires
+- For consistency, require /usr/sbin/ifconfig instead of net-tools
+
+* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
+- Rename patch files to be consistent
+- Run autotools to generate the configure script before building
+- Merge lib64 patches (104 into 102)
+- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
+- Remove patches 157 and 186, which had test changes left over after upstreaming
+- Remove patch 188, a temporary workaround for hashlib tests
+- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
+- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
+
+* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
+- Use python3 style of calling super() without arguments in rpath
+ patch to prevent recursion in UnixCCompiler subclasses
+Resolves: rhbz#1458122
+
+* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
+- Add bcond for --without optimizations
+- Reword package descriptions
+- Remove Group declarations
+- Skip failing test_float_with_comma
+
+* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
+- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
+
+* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
+- Use bconds for configuring the build
+- Reorganize the initial sections
+
+* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
+- Have /usr/bin/2to3 (rhbz#1111275)
+- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
+
+* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
+- Revert "Add --executable option to install.py command"
+ This enhancement is currently not needed and it can possibly
+ collide with `pip --editable`option
+
+* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
+- Fix the "urllib FTP protocol stream injection" vulnerability
+Resolves: rhbz#1478916
+
+* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
+- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
+ bsddb), however, no longer needod for Python 3
+- Tested building Python 3 with and without the dependency, all tests pass and
+ filelists of resulting RPMs are identical
+
+* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
+- Do not generate debuginfo subpackages (#1476593)
+- Rebuild with binutils fix for ppc64le (#1475636)
+
+* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
+- Make test_asyncio to not depend on the current SIGHUP signal handler.
+
+* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
+- Update to Python 3.6.2
+
+* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
+- Update to the latest upstream implementation of PEP 538
+
+* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
+- Make pip and distutils in user environment install into separate location
+
+* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
+- Fix test_alpn_protocols from test_ssl
+- Do not require rebundled setuptools dependencies
+
+* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
+- Added a dependency to the devel subpackage on python3-rpm-generators which
+ have been excised out of rpm-build
+- Updated notes on bootstrapping Python on top of this specfile accordingly
+- Involves: rhbz#1410631, rhbz#1444925
+
+* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
+- Enable profile guided optimizations for x86_64 and i686 architectures
+- Update to a newer implementation of PEP 538
+- Update description to reflect that Python 3 is now the default Python
+
+* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
+- Update PEP 538 to the latest upstream implementation
+
+* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
+- Enable link time optimizations
+- Move windows executables to the devel subpackage (rhbz#1426257)
+
+* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
+- Rename python3.Xdm-config script from -debug to be arch specific
+Resolves: rhbz#1179073
+
+* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
+- Install the Makefile in its proper location (rhbz#1438219)
+
+* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
+- Update to version 3.6.1 final
+
+* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
+- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
+
+* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
+- Update to Python 3.6.1 release candidate 1
+- Add patch 264 to skip a known test failure on aarch64
+
+* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
+- Use proper command line parsing in _testembed
+- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
+
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
+
+* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
+- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
+
+* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
+- Revert "Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables..." to prevent build failures
+ of packages using alternate build tools
+
+* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
+- Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables
+- Use new %%_module_build macro
+
+* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
+- Add --executable option to install.py command
+
+* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
+- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
+in order for the virtualenvs to work properly
+
+* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
+- Add missing %%license macro
+
+* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
+- Modify the runtime dependency of python3-libs on system-python-libs again,
+ because previous attempt didn't work properly with dnf resolving mechanism
+
+* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
+- Modify the runtime dependency of python3-libs on system-python-libs to use
+ just the version and release number, but not the dist tag due to Modularity
+
+* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
+- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
+- Skip test_aead_aes_gcm during rpmbuild
+
+* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
+- Rebuild for readline 7.x
+
+* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
+- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
+
+* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
+- Define HAVE_LONG_LONG as 1 for backwards compatibility
+
+* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
+- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
+
+* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
+- Update to Python 3.6.0 final
+
+* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
+- Enable rewheel
+
+* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
+- Update to Python 3.6.0 release candidate 1
+
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
+- Update to Python 3.6.0 beta 4
+
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
+- Set to work with pip version 9.0.1
+
+* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
+- Use proper patch numbering and base upstream branch for
+porting ssl and hashlib modules to OpenSSL 1.1.0
+- Drop hashlib patch for now
+- Add riscv64 arch to 64bit and no-valgrind arches
+
+* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
+- Make it build with OpenSSL-1.1.0 based on upstream patch
+
+* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
+- Obsolete and Provide python35 package
+
+* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
+- Update %%py_byte_compile macro
+- Remove unused configure flags (rhbz#1374357)
+
+* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
+- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
+ recompile optimized .pyc files
+- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
+ files are no more
+- Resolves rhbz#1373635
+
+* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
+- Rebased to version 3.5.2
+- Set to work with pip version 8.1.2
+- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
+- Removed arch or environment specific patches 194, 196, 203, and 208
+ as test builds indicate they are no longer needed
+- Updated patches 102, 146, and 242 to work with the new Python codebase
+- Removed patches 200, 201, 5000 which weren't even being applied
+
+* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
+- Fix for CVE-2016-1000110 HTTPoxy attack
+- SPEC file cleanup
+
+* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
+- Build properly on MIPS
+
+* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
+-
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
+
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
+- Refactor patch for properly fixing CVE-2016-5636
+
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
+- Fix test_pyexpat failure with Expat version of 2.2.0
+
+* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
+- Move xml module to system-python-libs
+
+* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
+- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
+- Raise an error when STARTTLS fails
+- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
+- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
+- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
+
+* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
+- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
+
+* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
+- Move distutils to system-python-libs
+
+* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
+- Provide python3-enum34
+
+* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
+- Provide System Python packages and macros
+
+* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
+- Drop python3 macros, require python/python3-rpm-macros
+
+* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
+- Update to 3.5.1
+- Removed patch 199 and 207 (upstream)
+
+* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
+- Remove versioned libpython from devel package
+
+* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
+- add correct arch for ppc64/ppc64le to fix build failure
+
+* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
+- Hide the private _Py_atomic_xxx symbols from public header
+
+* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
+- Rebuild with wheel set to 1
+
+* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
+- Update to 3.5.0
+
+* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
+- python3-devel: Require python-macros for version independant macros such as
+ python_provide. See fpc#281 and fpc#534.
+
+* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
+- Use 1024bit DH key in test_ssl
+- Use -O0 when compiling -debug build
+- Update pip version variable to the version we actually ship
+
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
+- Make relocating Python by changing _prefix actually work
+Resolves: rhbz#1231801
+
+* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
+- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
+
+* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
+- Updated to 3.4.3
+- BuildPython now accepts additional build options
+- Temporarily disabled test_gdb on arm (rhbz#1196181)
+
+* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
+- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
+ (
http://bugs.python.org/issue23433)
+
+* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
+- Rebuilt for Fedora 23 Change
+
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
+
+* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
+- Own systemtap dirs (#710733)
+
+* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
+- build with valgrind on ppc64le
+- disable test_gdb on s390(x) until rhbz#1181034 is resolved
+
+* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
+- New patches: 170 (gc asserts), 200 (gettext headers),
+ 201 (gdbm memory leak)
+
+* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
+- OpenSSL disabled SSLv3 in SSLv23 method
+
+* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
+- Update to 3.4.2
+- Refreshed patches: 156 (gdb autoload)
+- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
+
+* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
+- Fix CVE-2014-4650 - CGIHTTPServer URL handling
+Resolves: rhbz#1113529
+
+* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
+- exclude test_gdb on ppc* (rhbz#1132488)
+
+* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
+- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
+
+* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
+- aarch64 has valgrind, just list those that don't support it
+
+* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
+- bump release and rebuild to link with the correct tcl/tk libs on ppcle
+
+* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
+- Change paths to bundled projects in rewheel patch
+
+* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
+- In config script, use uname -m to write the arch
+
+* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
+- update the arch list where valgrind exists - %%power64 includes also
+ ppc64le which is not supported yet
+
+* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
+- Forward arguments to the arch specific config script
+Resolves: rhbz#1102683
+
+* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
+- Rename python3.Xm-config script to arch specific.
+Resolves: rhbz#1091815
+
+* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
+- Use python3-*, not python-* runtime requires on setuptools and pip
+- rebuild for tcl-8.6
+
+* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
+- Update the rewheel module
+
+* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
+- Fix multilib dependencies.
+Resolves: rhbz#1091815
+
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
+- Update to Python 3.4.1
+
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
+- Fix test_gdb failure on ppc64le
+Resolves: rhbz#1095355
+
+* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
+- Add macro %%python3_version_nodots
+
+* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
+- Disable test_faulthandler, test_gdb on aarch64
+Resolves: rhbz#1045193
+
+* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
+- Don't add Werror=declaration-after-statement for extension
+ modules through setup.py (PyBT#21121)
+
+* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
+- Add setuptools and pip to Requires
+
+* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
+- Point __os_install_post to correct brp-* files
+
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
+- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
+
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
+- Update to Python 3.4 final
+- Add patch adding the rewheel module
+- Merge patches from master
+
+* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
+- Update to Python 3.4 beta 2.
+- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
+- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
+
+* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
+- Update to Python 3.4 beta 1.
+- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
+ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
+- Removed patch 00187 (remove pthread atfork; upstreamed)
+
+* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
+- Update to Python 3.4 alpha 4.
+- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
+114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
+test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
+from py_compile)
+- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
+Koji), 142 (the mock issue that caused this is fixed)
+- Added patch 187 (remove thread atfork) - will be in next version
+- Refreshed script for checking pyc and pyo timestamps with new ignored files.
+- The fips patch is disabled for now until upstream makes a final decision
+what to do with sha3 implementation for 3.4.0.
+
+* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
+- Bytecompile all *.py files properly during build (rhbz#1023607)
+
+* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
+- Added fix for CVE-2013-4238 (rhbz#996399)
+
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
+- fix up indentation in arm patch
+
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
+- disable a test that fails on arm
+- enable valgrind support on arm arches
+
+* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
+- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
+
+* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
+- Add patch for CVE-2013-2099 (rhbz#963261).
+
+* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
+- Updated to Python 3.3.2.
+- Refreshed patches: 153 (gdb test noise)
+- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
+test threads)
+- Synced patch numbers with python.spec.
+
+* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
+- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
+
+* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
+- Add patch that enables building on ppc64p7 (replace the sed, so that
+we get consistent with python2 spec and it's more obvious that we're doing it.
+
+* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
+- Add fix for gdb tests failing on arm, rhbz#951802.
+
+* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
+- Updated to Python 3.3.1.
+- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
+153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
+keeping few more downstream tests)
+- Removed patches: 3 (audiotest.au made it to upstream tarball)
+- Removed workaround for
http://bugs.python.org/issue14774, discussed in
+http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
+
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
+- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
+
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
+- renumber patches to keep them in sync with python.spec
+
+* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
+- Fix error in platform.platform() when non-ascii byte strings are decoded to
+ unicode (rhbz#922149)
+
+* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
+- Fix up shared library extension (rhbz#889784)
+
+* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
+- add ppc64p7 build target, optimized for Power7
+
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
+- add workaround for ENOPROTOOPT seen running selftests in Koji
+(rhbz#913732)
+
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
+- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
+
+* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
+- add aarch64 (rhbz#909783)
+
+* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
+- add BR on bluez-libs-devel (rhbz#879720)
+
+* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
+- 3.3.0rc3 -> 3.3.0; drop alphatag
+
+* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
+- 3.3.0rc2 -> 3.3.0rc3
+
+* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
+- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
+
+* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
+- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
+
+* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
+- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
+134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
+correctly when LANG=C (patch 55); importlib.test was moved to
+test.test_importlib upstream
+
+* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
+- disable some failing checks on PPC* (rhbz#846849)
+
+* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
+- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
+patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
+configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream issue
12326);
+"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
+for stdlib (upstream issues 10645 and 12218); email/test moved to
+test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
+_decimal and _lzma modules; make collections modules explicit in payload again
+(upstream issue 11085); add _testbuffer module to tests subpackage (added in
+upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
+workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
+distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
+_lzma module); skip some tests within test_socket (patch 163)
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+
+* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
+- use macro for power64 (rhbz#834653)
+
+* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
+- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
+
+* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
+- fix tapset for debug build
+
+* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
+- update uid/gid handling to avoid int overflows seen with uid/gid
+values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
+
+* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
+- renumber autotools patch from 300 to 5000
+- specfile cleanups
+
+* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
+- fix test_gdb.py (patch 156; rhbz#817072)
+
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
+- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
+generating SELinux denials on "import ctypes" and "import uuid" when
embedding
+Python within httpd (patch 155; rhbz#814391)
+
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
+- add explicit version requirements on expat to avoid linkage problems with
+XML_SetHashSalt
+
+* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
+- fix test_gdb (patch 153)
+
+* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
+- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
+values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
+
+* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
+- use newly installed python for byte compiling (now for real)
+
+* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
+- use newly installed python for byte compiling (#787498)
+
+* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
+- Build with $RPM_LD_FLAGS (#756863).
+- Use xz-compressed source tarball.
+
+* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
+- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
+
+* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
+- python3-devel missing autogenerated pkgconfig() provides (#746751)
+
+* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
+- cherrypick fix for distutils not using __pycache__ when byte-compiling
+files (rhbz#722578)
+
+* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
+- re-enable gdbm (patch 148; rhbz#742242)
+
+* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
+- add a sys._debugmallocstats() function (patch 147)
+
+* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
+- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
+_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
+
+* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
+- disable gdbm module to prepare for gdbm soname bump
+
+* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
+- renumber and rename patches for consistency with python.spec (8 to 55, 106
+to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
+
+* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
+- rewrite of "check", introducing downstream-only hooks for skipping specific
+cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
+fine-grained manner than before; (patches 106, 133-142 sparsely, moving
+patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
+
+* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
+- 3.2.2
+
+* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
+- run selftests with "--verbose"
+- disable parts of test_io on ppc (rhbz#732998)
+
+* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
+- use "--findleaks --verbose3" when running test suite
+
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
+- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
+ppc to avoid aliasing violations (patch 130; rhbz#698726)
+
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
+- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
+
+* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
+- add %%python3_version to the rpm macros (rhbz#719082)
+
+* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
+- disable some tests on sparc arches
+
+* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
+- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
+of static library build (due to Modules/_testembed; patch 6), autotool
+intermediates (patch 300)
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
+- use the gdb hooks from the upstream tarball, rather than keeping our own copy
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
+- don't run test_openpty and test_pty in %%check
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
+- cleanup of BuildRequires; add comment headings to specfile sections
+
+* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
+- fix the libpython.stp systemtap tapset (rhbz#697730)
+
+* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
+- 3.2
+- drop alphatag
+- regenerate autotool patch
+
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
+- add a /usr/bin/python3-debug symlink within the debug subpackage
+
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
+- 3.2rc3
+- regenerate autotool patch
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
+- 3.2rc2
+
+* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
+- 3.2rc1
+- rework patch 6 (static lib removal)
+- remove upstreamed patch 130 (ppc debug build)
+- regenerate patch 300 (autotool intermediates)
+- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
+- added libpython3.so and 2to3-3.2
+
+* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
+- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
+error with dynamic annotations (when configured using --with-valgrind)
+- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
+
+* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
+- add --with-valgrind to configuration (on architectures that support this)
+
+* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
+- work around test_subprocess failure seen in koji (patch 129)
+
+* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
+- 3.2b2
+- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
+patch 8 (systemtap), patch 102 (lib64)
+- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
+patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
+fixed upstream)
+- regenerate patch 300 (autotool intermediates)
+- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
+patch 128)
+- stop using runtest.sh in %%check (dropped by upstream), replacing with
+regrtest; fixup list of failing tests
+- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
+- rework manifests of shared libraries to use "SOABI_" macros, reflecting
+PEP 3149
+- drop itertools, operator and _collections modules from the manifests as py3k
+commit r84058 moved these inside libpython; json/tests moved to test/json_tests
+- move turtle code into the tkinter subpackage
+
+* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
+- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
+
+* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
+- move most of the content of the core package to the libs subpackage, given
+that the libs aren't meaningfully usable without the standard libraries
+
+* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
+- Move test.support to core package (rhbz#596258)
+- Add various missing __pycache__ directories to payload
+
+* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
+- Add __pycache__ directory for site-packages
+
+* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
+- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
+- make find-provides-without-python-sonames.sh 64bit aware
+
+* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
+- 3.2a1; add alphatag
+- rework %%files in the light of PEP 3147 (__pycache__)
+- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
+better job of things, and the %%files explicitly lists our modules (r82746
+appears to break the old way of doing things). This leads to various modules
+changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
+dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
+_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
+testing/devel purposes)
+- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
+- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
+plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
+- add machinery for rebuilding "configure" and friends, using the correct
+version of autoconf (patch 300)
+- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
+- "modulator" was removed upstream
+- drop "-b" from patch applications affecting .py files to avoid littering the
+installation tree
+
+* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
+- Turn on computed-gotos.
+- Fix for parallel make and graminit.c
+
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
+- rebuild
+
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
+- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
+a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
+
+* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
+- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
+- reformat whitespace in audioop.c (patch 106)
+- CVE-2010-1634: fix various integer overflow checks in the audioop
+module (patch 107)
+- CVE-2010-2089: further checks within the audioop module (patch 108)
+- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
+
+* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
+- reading the timestamp counter is available only on some arches (see Python/ceval.c)
+
+* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
+- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
+(patch 105)
+
+* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
+- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
+(patch 104); enable them and the WITH_TSC option within the debug build
+
+* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
+- build and install two different configurations of Python 3: debug and
+standard, packaging the debug build in a new "python3-debug" subpackage
+(patch 103)
+
+* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
+- exclude test_http_cookies when running selftests, due to hang seen on
+http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
+11 hours)
+- update python-gdb.py from v5 to py3k version submitted upstream
+
+* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
+- update python-gdb.py from v4 to v5 (improving performance and stability,
+adding commands)
+
+* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
+- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
+cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
+and exceptions)
+
+* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
+- refresh gdb hooks to v3 (reworking how they are packaged)
+
+* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
+- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
+- drop upstreamed patch 2 (.pyc permissions handling)
+- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
+- drop upstreamed patch 200 (path-fixing script)
+
+* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
+- fix typo in libpython.stp (rhbz:575336)
+
+* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
+- add pyfuntop.stp example (source 7)
+- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
+consistency with python.spec
+
+* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
+- rebuild for new package of redhat-rpm-config (rhbz:564527)
+- use 'install -p' when running 'make install'
+
+* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
+- split configure options into multiple lines for easy of editing
+- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
+tapset defining "python.function.entry" and "python.function.return"
to make
+the markers easy to use (dmalcolm; source 5), and an example of using the
+tapset to the docs (dmalcolm; source 6) (rhbz:545179)
+
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
+- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
+%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
+ldconfig (bug 562980), and which should also ensure it becomes part of the
+debuginfo subpackage, rather than the libs subpackage
+- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
+configure script, and to avoid fragile scripts that try to figure this out
+dynamically (e.g. for the -gdb.py change)
+
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
+- add gdb hooks for easier debugging (Source 4)
+
+* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
+- update python-3.1.1-config.patch to remove downstream customization of build
+of pyexpat and elementtree modules
+- add patch adapted from upstream (patch 7) to add support for building against
+system expat; add --with-system-expat to "configure" invocation
+- remove embedded copies of expat and zlib from source tree during "prep"
+
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
+- introduce %%{dynload_dir} macro
+- explicitly list all lib-dynload files, rather than dynamically gathering the
+payload into a temporary text file, so that we can be sure what we are
+shipping
+- introduce a macros.pybytecompile source file, to help with packaging python3
+modules (Source3; written by Toshio)
+- rename "2to3-3" to "python3-2to3" to better reflect python 3 module
packaging
+plans
+
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
+- change python-3.1.1-config.patch to remove our downstream change to curses
+configuration in Modules/Setup.dist, so that the curses modules are built using
+setup.py with the downstream default (linking against libncursesw.so, rather
+than libncurses.so), rather than within the Makefile; add a test to %%install
+to verify the dso files that the curses module is linked against the correct
+DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
+
+* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
+- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
+builds for setting up the python3 copy of the source tree)
+
+* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
+- move lib2to3 from -tools subpackage to main package (bug 556667)
+
+* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
+- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
+
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
+- use the %%{_isa} macro to ensure that the python-devel dependency on python
+is for the correct multilib arch (#555943)
+- delete bundled copy of libffi to make sure we use the system one
+
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
+- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
+docs, rather than the 2.6 build
+
+* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
+- replace references to /usr with %%{_prefix}; replace references to
+/usr/include with %%{_includedir} (Toshio)
+
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
+- fix permission on find-provides-without-python-sonames.sh from 775 to 755
+
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
+- remove build-time requirements on tix and tk, since we already have
+build-time requirements on the -devel subpackages for each of these (Thomas
+Spura)
+- replace usage of %%define with %%global (Thomas Spura)
+- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
+longer be necessary
+- move various test files from the "tools"/"tkinter" subpackages to
the "test"
+subpackage
+
+* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
+- add %%check section (thanks to Thomas Spura)
+- update patch 4 to use correct shebang line
+- get rid of stray patch file from buildroot
+
+* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
+- switched a few instances of "find |xargs" to "find -exec" for
consistency.
+- made the description of __os_install_post more accurate.
+
+* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
+- add macros.python3 to the -devel subpackage, containing common macros for use
+when packaging python3 modules
+
+* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
+- add a provides of "python(abi)" (see bug 532118)
+- fix issues identified by a.badger in package review (bug 526126, comment 39):
+ - use "3" thoughout metadata, rather than "3.*"
+ - remove conditional around "pkg-config openssl"
+ - use standard cleanup of RPM_BUILD_ROOT
+ - replace hardcoded references to /usr with _prefix macro
+ - stop removing egg-info files
+ - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
+up shebang lines
+ - stop attempting to remove no-longer-present .cvsignore files
+ - move the post/postun sections above the "files" sections
+
+* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
+- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
+flag is used by default in the upstream code
+- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
+_init_posix(), so we include them in the core package, along with their parent
+directories (bug 531901)
+
+* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
+- reword description, based on suggestion by amcnabb
+- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
+- fix the test_tk and test_ttk_* selftests (patch 5)
+- fix up the specfile's handling of shebang/perms to avoid corrupting
+test_httpservers.py (sed command suggested by amcnabb)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
+- fixup importlib/_bootstrap.py so that it correctly handles being unable to
+open .pyc files for writing (patch 2, upstream issue 7187)
+- actually apply the rpath patch (patch 1)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
+- update patch0's setup of the crypt module to link it against libcrypt
+- update patch0 to comment "datetimemodule" back out, so that it is built
+using setup.py (see Setup, option 3), thus linking it statically against
+timemodule.c and thus avoiding a run-time "undefined symbol:
+_PyTime_DoubleToTimet" failure on "import datetime"
+
+* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
+- remove executable flag from various files that shouldn't have it
+- fix end-of-line encodings
+- fix a character encoding
+
+* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
+- disable invocation of brp-python-bytecompile in postprocessing, since
+it would be with the wrong version of python (adapted from ivazquez'
+python3000 specfile)
+- use a custom implementation of __find_provides in order to filter out bogus
+provides lines for the various .so modules
+- fixup distutils/unixccompiler.py to remove standard library path from rpath
+(patch 1, was Patch0 in ivazquez' python3000 specfile)
+- split out libraries into a -libs subpackage
+- update summaries and descriptions, basing content on ivazquez' specfile
+- fixup executable permissions on .py, .xpm and .xbm files, based on work in
+ivazquez's specfile
+- get rid of DOS batch files
+- fixup permissions for shared libraries from non-standard 555 to standard 755
+- move /usr/bin/python*-config to the -devel subpackage
+- mark various directories as being documentation
+
+* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
+- Initial package for Python 3.
+
commit d051c04cb17c3265311ff2aa70260e714afa8fcc
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Feb 5 12:33:45 2019 +0100
Drop obsoletes for platform-python
diff --git a/python3.spec b/python3.spec
index ca2d3e3..bb6d0a9 100644
--- a/python3.spec
+++ b/python3.spec
@@ -329,13 +329,6 @@ Provides: python%{pyshortver} = %{version}-%{release}
# replace python36-3.6.2.
Obsoletes: python%{pyshortver}
-# Shall be removed in Fedora 31
-# The release is bumped to 20, so we can do f27 platform-python updates
-# If the release in f27 ever goes >= 20, raise it here
-# If platform-python is ever reintroduced, make it higher version than this:
-%global platpyver 3.6.2-20
-Obsoletes: platform-python < %{platpyver}
-
# Previously, this was required for our rewheel patch to work.
# This is technically no longer needed, but we keep it recommended
# for the developer experience.
@@ -388,10 +381,6 @@ Provides: bundled(python3-setuptools) = 40.6.2
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
Recommends: %{name}%{?_isa} = %{version}-%{release}
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-libs < %{platpyver}
-Obsoletes: platform-python-libs-devel < %{platpyver}
-
%description libs
This package contains runtime libraries for use by Python:
- the majority of the Python standard library
@@ -428,9 +417,6 @@ Provides: 2to3 = %{version}-%{release}
Conflicts: %{name} < %{version}-%{release}
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-devel < %{platpyver}
-
%description devel
This package contains the header files and configuration needed to compile
Python extension modules (typically written in C or C++), to embed Python
@@ -451,9 +437,6 @@ Provides: %{name}-tools = %{version}-%{release}
Provides: %{name}-tools%{?_isa} = %{version}-%{release}
Obsoletes: %{name}-tools < %{version}-%{release}
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-tools < %{platpyver}
-
%description idle
IDLE is Pythons Integrated Development and Learning Environment.
@@ -471,9 +454,6 @@ configuration, browsers, and other dialogs.
Summary: A GUI toolkit for Python
Requires: %{name} = %{version}-%{release}
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-tkinter < %{platpyver}
-
%description tkinter
The Tkinter (Tk interface) library is a graphical user interface toolkit for
the Python programming language.
@@ -484,9 +464,6 @@ Summary: The self-test suite for the main python3 package
Requires: %{name} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-test < %{platpyver}
-
%description test
The self-test suite for the Python interpreter.
commit 1fb3c04b752501b90fca0c90b67d0fa1050909e7
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Feb 5 01:40:25 2019 +0100
Update to 3.8.0a1
Uses tilde for prerelease information,
https://docs.fedoraproject.org/en-US/packaging-guidelines/Versioning/#_ve...
Patches rebased: 111, 132
Patches merged upstream: 155, 170 (differently), 317
/usr/bin/pyvenv is no more
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 4cce364..3d667e9 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,17 +1,17 @@
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 0db0dd0..bd8f769 100644
+index f8ff1ce..f297d05 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -574,7 +574,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+@@ -573,7 +573,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
+$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+ $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -622,12 +622,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -621,12 +621,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -21,19 +21,19 @@ index 0db0dd0..bd8f769 100644
- -rm -f $@
- $(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS)
-
- libpython$(LDVERSION).so: $(LIBRARY_OBJS)
+ libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -715,7 +709,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
- echo "-----------------------------------------------"; \
- fi
+ $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM); \
+@@ -704,7 +698,7 @@ Makefile Modules/config.c: Makefile.pre \
+ @echo "The Makefile was updated, you may need to re-run make."
+
-Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
+Programs/_testembed: Programs/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+ $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS)
############################################################################
-@@ -1483,17 +1477,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1545,17 +1539,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00132-add-rpmbuild-hooks-to-unittest.patch
b/00132-add-rpmbuild-hooks-to-unittest.patch
index 77dc6ec..b187c6a 100644
--- a/00132-add-rpmbuild-hooks-to-unittest.patch
+++ b/00132-add-rpmbuild-hooks-to-unittest.patch
@@ -1,6 +1,20 @@
-diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest
Python-3.2.2/Lib/unittest/case.py
---- Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest 2011-09-03
12:16:44.000000000 -0400
-+++ Python-3.2.2/Lib/unittest/case.py 2011-09-09 06:35:16.365568382 -0400
+diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py
+index 5ff1bf3..4d63954 100644
+--- a/Lib/unittest/__init__.py
++++ b/Lib/unittest/__init__.py
+@@ -58,7 +58,7 @@ __unittest = True
+
+ from .result import TestResult
+ from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip,
+- skipIf, skipUnless, expectedFailure)
++ skipIf, skipUnless, expectedFailure, _skipInRpmBuild)
+ from .suite import BaseTestSuite, TestSuite
+ from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
+ findTestCases)
+diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
+index a157ae8..64f912c 100644
+--- a/Lib/unittest/case.py
++++ b/Lib/unittest/case.py
@@ -3,6 +3,7 @@
import sys
import functools
@@ -9,7 +23,8 @@ diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest
Python
import logging
import pprint
import re
-@@ -101,5 +102,21 @@ def expectedFailure(func):
+@@ -158,6 +159,22 @@ class _BaseTestCaseContext:
+ msg = self.test_case._formatMessage(self.msg, standardMsg)
raise self.test_case.failureException(msg)
+# Non-standard/downstream-only hooks for handling issues with specific test
@@ -31,16 +46,3 @@ diff -up
Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
class _AssertRaisesBaseContext(_BaseTestCaseContext):
def __init__(self, expected, test_case, expected_regex=None):
-diff -up Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest
Python-3.2.2/Lib/unittest/__init__.py
---- Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest 2011-09-03
12:16:44.000000000 -0400
-+++ Python-3.2.2/Lib/unittest/__init__.py 2011-09-09 06:35:16.366568382 -0400
-@@ -57,7 +57,8 @@ __unittest = True
-
- from .result import TestResult
- from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
-- skipUnless, expectedFailure)
-+ skipUnless, expectedFailure,
-+ _skipInRpmBuild)
- from .suite import BaseTestSuite, TestSuite
- from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
- findTestCases)
diff --git a/00155-avoid-ctypes-thunks.patch b/00155-avoid-ctypes-thunks.patch
deleted file mode 100644
index f03890e..0000000
--- a/00155-avoid-ctypes-thunks.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -up Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391
Python-3.2.3/Lib/ctypes/__init__.py
---- Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 2012-04-20 15:12:49.017867692 -0400
-+++ Python-3.2.3/Lib/ctypes/__init__.py 2012-04-20 15:15:09.501111408 -0400
-@@ -275,11 +275,6 @@ def _reset_cache():
- # _SimpleCData.c_char_p_from_param
- POINTER(c_char).from_param = c_char_p.from_param
- _pointer_type_cache[None] = c_void_p
-- # XXX for whatever reasons, creating the first instance of a callback
-- # function is needed for the unittests on Win64 to succeed. This MAY
-- # be a compiler bug, since the problem occurs only when _ctypes is
-- # compiled with the MS SDK compiler. Or an uninitialized variable?
-- CFUNCTYPE(c_int)(lambda: None)
-
- def create_unicode_buffer(init, size=None):
- """create_unicode_buffer(aString) -> character array
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
deleted file mode 100644
index fb3ad85..0000000
--- a/00170-gc-assertions.patch
+++ /dev/null
@@ -1,311 +0,0 @@
-diff --git a/Include/object.h b/Include/object.h
-index c772dea..5729797 100644
---- a/Include/object.h
-+++ b/Include/object.h
-@@ -1098,6 +1098,49 @@ PyAPI_FUNC(void)
- _PyObject_DebugTypeStats(FILE *out);
- #endif /* ifndef Py_LIMITED_API */
-
-+/*
-+ Define a pair of assertion macros.
-+
-+ These work like the regular C assert(), in that they will abort the
-+ process with a message on stderr if the given condition fails to hold,
-+ but compile away to nothing if NDEBUG is defined.
-+
-+ However, before aborting, Python will also try to call _PyObject_Dump() on
-+ the given object. This may be of use when investigating bugs in which a
-+ particular object is corrupt (e.g. buggy a tp_visit method in an extension
-+ module breaking the garbage collector), to help locate the broken objects.
-+
-+ The WITH_MSG variant allows you to supply an additional message that Python
-+ will attempt to print to stderr, after the object dump.
-+*/
-+#ifdef NDEBUG
-+/* No debugging: compile away the assertions: */
-+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) ((void)0)
-+#else
-+/* With debugging: generate checks: */
-+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) \
-+ ((expr) \
-+ ? (void)(0) \
-+ : _PyObject_AssertFailed((obj), \
-+ (msg), \
-+ (__STRING(expr)), \
-+ (__FILE__), \
-+ (__LINE__), \
-+ (__PRETTY_FUNCTION__)))
-+#endif
-+
-+#define PyObject_ASSERT(obj, expr) \
-+ PyObject_ASSERT_WITH_MSG(obj, expr, NULL)
-+
-+/*
-+ Declare and define the entrypoint even when NDEBUG is defined, to avoid
-+ causing compiler/linker errors when building extensions without NDEBUG
-+ against a Python built with NDEBUG defined
-+*/
-+PyAPI_FUNC(void) _PyObject_AssertFailed(PyObject *, const char *,
-+ const char *, const char *, int,
-+ const char *);
-+
- #ifdef __cplusplus
- }
- #endif
-diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
-index 8d806db..dc8bb16 100644
---- a/Lib/test/test_gc.py
-+++ b/Lib/test/test_gc.py
-@@ -1,10 +1,12 @@
- import unittest
- from test.support import (verbose, refcount_test, run_unittest,
- strip_python_stderr, cpython_only, start_threads,
-- temp_dir, requires_type_collecting, TESTFN, unlink)
-+ temp_dir, requires_type_collecting, TESTFN, unlink,
-+ import_module)
- from test.support.script_helper import assert_python_ok, make_script
-
- import sys
-+import sysconfig
- import time
- import gc
- import weakref
-@@ -46,6 +48,8 @@ class GC_Detector(object):
- # gc collects it.
- self.wr = weakref.ref(C1055820(666), it_happened)
-
-+BUILD_WITH_NDEBUG = ('-DNDEBUG' in
sysconfig.get_config_vars()['PY_CFLAGS'])
-+
- @with_tp_del
- class Uncollectable(object):
- """Create a reference cycle with multiple __del__ methods.
-@@ -878,6 +882,50 @@ class GCCallbackTests(unittest.TestCase):
- self.assertEqual(len(gc.garbage), 0)
-
-
-+ @unittest.skipIf(BUILD_WITH_NDEBUG,
-+ 'built with -NDEBUG')
-+ def test_refcount_errors(self):
-+ self.preclean()
-+ # Verify the "handling" of objects with broken refcounts
-+ import_module("ctypes") #skip if not supported
-+
-+ import subprocess
-+ code = '''if 1:
-+ a = []
-+ b = [a]
-+
-+ # Simulate the refcount of "a" being too low (compared to the
-+ # references held on it by live data), but keeping it above zero
-+ # (to avoid deallocating it):
-+ import ctypes
-+ ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))
-+
-+ # The garbage collector should now have a fatal error when it reaches
-+ # the broken object:
-+ import gc
-+ gc.collect()
-+ '''
-+ p = subprocess.Popen([sys.executable, "-c", code],
-+ stdout=subprocess.PIPE,
-+ stderr=subprocess.PIPE)
-+ stdout, stderr = p.communicate()
-+ p.stdout.close()
-+ p.stderr.close()
-+ # Verify that stderr has a useful error message:
-+ self.assertRegex(stderr,
-+ b'Modules/gcmodule.c:[0-9]+: visit_decref: Assertion
"\(\(gc\)->gc.gc_refs >> \(1\)\) != 0" failed.')
-+ self.assertRegex(stderr,
-+ b'refcount was too small')
-+ self.assertRegex(stderr,
-+ b'object : \[\]')
-+ self.assertRegex(stderr,
-+ b'type : list')
-+ self.assertRegex(stderr,
-+ b'refcount: 1')
-+ self.assertRegex(stderr,
-+ b'address : 0x[0-9a-f]+')
-+
-+
- class GCTogglingTests(unittest.TestCase):
- def setUp(self):
- gc.enable()
-diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
-index 4d701cb..388dd78 100644
---- a/Modules/gcmodule.c
-+++ b/Modules/gcmodule.c
-@@ -239,7 +239,8 @@ update_refs(PyGC_Head *containers)
- {
- PyGC_Head *gc = containers->gc.gc_next;
- for (; gc != containers; gc = gc->gc.gc_next) {
-- assert(_PyGCHead_REFS(gc) == GC_REACHABLE);
-+ PyObject_ASSERT(FROM_GC(gc),
-+ _PyGCHead_REFS(gc) == GC_REACHABLE);
- _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
- /* Python's cyclic gc should never see an incoming refcount
- * of 0: if something decref'ed to 0, it should have been
-@@ -259,7 +260,8 @@ update_refs(PyGC_Head *containers)
- * so serious that maybe this should be a release-build
- * check instead of an assert?
- */
-- assert(_PyGCHead_REFS(gc) != 0);
-+ PyObject_ASSERT(FROM_GC(gc),
-+ _PyGCHead_REFS(gc) != 0);
- }
- }
-
-@@ -274,7 +276,9 @@ visit_decref(PyObject *op, void *data)
- * generation being collected, which can be recognized
- * because only they have positive gc_refs.
- */
-- assert(_PyGCHead_REFS(gc) != 0); /* else refcount was too small */
-+ PyObject_ASSERT_WITH_MSG(FROM_GC(gc),
-+ _PyGCHead_REFS(gc) != 0,
-+ "refcount was too small"); /* else refcount was too
small */
- if (_PyGCHead_REFS(gc) > 0)
- _PyGCHead_DECREF(gc);
- }
-@@ -334,9 +338,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
- * If gc_refs == GC_UNTRACKED, it must be ignored.
- */
- else {
-- assert(gc_refs > 0
-- || gc_refs == GC_REACHABLE
-- || gc_refs == GC_UNTRACKED);
-+ PyObject_ASSERT(FROM_GC(gc),
-+ gc_refs > 0
-+ || gc_refs == GC_REACHABLE
-+ || gc_refs == GC_UNTRACKED);
- }
- }
- return 0;
-@@ -378,7 +383,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
- */
- PyObject *op = FROM_GC(gc);
- traverseproc traverse = Py_TYPE(op)->tp_traverse;
-- assert(_PyGCHead_REFS(gc) > 0);
-+ PyObject_ASSERT(op, _PyGCHead_REFS(gc) > 0);
- _PyGCHead_SET_REFS(gc, GC_REACHABLE);
- (void) traverse(op,
- (visitproc)visit_reachable,
-@@ -441,7 +446,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head
*finalizers)
- for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
- PyObject *op = FROM_GC(gc);
-
-- assert(IS_TENTATIVELY_UNREACHABLE(op));
-+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
- next = gc->gc.gc_next;
-
- if (has_legacy_finalizer(op)) {
-@@ -517,7 +522,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
- PyWeakReference **wrlist;
-
- op = FROM_GC(gc);
-- assert(IS_TENTATIVELY_UNREACHABLE(op));
-+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
- next = gc->gc.gc_next;
-
- if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
-@@ -538,9 +543,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
- * the callback pointer intact. Obscure: it also
- * changes *wrlist.
- */
-- assert(wr->wr_object == op);
-+ PyObject_ASSERT(wr->wr_object, wr->wr_object == op);
- _PyWeakref_ClearRef(wr);
-- assert(wr->wr_object == Py_None);
-+ PyObject_ASSERT(wr->wr_object, wr->wr_object == Py_None);
- if (wr->wr_callback == NULL)
- continue; /* no callback */
-
-@@ -574,7 +579,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
- */
- if (IS_TENTATIVELY_UNREACHABLE(wr))
- continue;
-- assert(IS_REACHABLE(wr));
-+ PyObject_ASSERT(op, IS_REACHABLE(wr));
-
- /* Create a new reference so that wr can't go away
- * before we can process it again.
-@@ -583,7 +588,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
-
- /* Move wr to wrcb_to_call, for the next pass. */
- wrasgc = AS_GC(wr);
-- assert(wrasgc != next); /* wrasgc is reachable, but
-+ PyObject_ASSERT(op, wrasgc != next);
-+ /* wrasgc is reachable, but
- next isn't, so they can't
- be the same */
- gc_list_move(wrasgc, &wrcb_to_call);
-@@ -599,11 +605,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
-
- gc = wrcb_to_call.gc.gc_next;
- op = FROM_GC(gc);
-- assert(IS_REACHABLE(op));
-- assert(PyWeakref_Check(op));
-+ PyObject_ASSERT(op, IS_REACHABLE(op));
-+ PyObject_ASSERT(op, PyWeakref_Check(op));
- wr = (PyWeakReference *)op;
- callback = wr->wr_callback;
-- assert(callback != NULL);
-+ PyObject_ASSERT(op, callback != NULL);
-
- /* copy-paste of weakrefobject.c's handle_callback() */
- temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
-@@ -717,12 +723,14 @@ check_garbage(PyGC_Head *collectable)
- for (gc = collectable->gc.gc_next; gc != collectable;
- gc = gc->gc.gc_next) {
- _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
-- assert(_PyGCHead_REFS(gc) != 0);
-+ PyObject_ASSERT(FROM_GC(gc),
-+ _PyGCHead_REFS(gc) != 0);
- }
- subtract_refs(collectable);
- for (gc = collectable->gc.gc_next; gc != collectable;
- gc = gc->gc.gc_next) {
-- assert(_PyGCHead_REFS(gc) >= 0);
-+ PyObject_ASSERT(FROM_GC(gc),
-+ _PyGCHead_REFS(gc) >= 0);
- if (_PyGCHead_REFS(gc) != 0)
- return -1;
- }
-diff --git a/Objects/object.c b/Objects/object.c
-index 220aa90..f6c7161 100644
---- a/Objects/object.c
-+++ b/Objects/object.c
-@@ -2177,6 +2177,35 @@ _PyTrash_thread_destroy_chain(void)
- --tstate->trash_delete_nesting;
- }
-
-+PyAPI_FUNC(void)
-+_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
-+ const char *file, int line, const char *function)
-+{
-+ fprintf(stderr,
-+ "%s:%d: %s: Assertion \"%s\" failed.\n",
-+ file, line, function, expr);
-+ if (msg) {
-+ fprintf(stderr, "%s\n", msg);
-+ }
-+
-+ fflush(stderr);
-+
-+ if (obj) {
-+ /* This might succeed or fail, but we're about to abort, so at least
-+ try to provide any extra info we can: */
-+ _PyObject_Dump(obj);
-+ }
-+ else {
-+ fprintf(stderr, "NULL object\n");
-+ }
-+
-+ fflush(stdout);
-+ fflush(stderr);
-+
-+ /* Terminate the process: */
-+ abort();
-+}
-+
- #ifndef Py_TRACE_REFS
- /* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
- Define this here, so we can undefine the macro. */
diff --git a/00317-CVE-2019-5010.patch b/00317-CVE-2019-5010.patch
deleted file mode 100644
index 62e931e..0000000
--- a/00317-CVE-2019-5010.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-From c660debb97f4f422255a82fef2d77804552c043a Mon Sep 17 00:00:00 2001
-From: Christian Heimes <christian(a)python.org>
-Date: Tue, 15 Jan 2019 18:16:30 +0100
-Subject: [PATCH] bpo-35746: Fix segfault in ssl's cert parser
-
-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.
-
-Signed-off-by: Christian Heimes <christian(a)python.org>
----
- 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
-
-diff --git a/Lib/test/talos-2019-0758.pem b/Lib/test/talos-2019-0758.pem
-new file mode 100644
-index 000000000000..13b95a77fd8a
---- /dev/null
-+++ b/Lib/test/talos-2019-0758.pem
-@@ -0,0 +1,22 @@
-+-----BEGIN CERTIFICATE-----
-+MIIDqDCCApKgAwIBAgIBAjALBgkqhkiG9w0BAQswHzELMAkGA1UEBhMCVUsxEDAO
-+BgNVBAMTB2NvZHktY2EwHhcNMTgwNjE4MTgwMDU4WhcNMjgwNjE0MTgwMDU4WjA7
-+MQswCQYDVQQGEwJVSzEsMCoGA1UEAxMjY29kZW5vbWljb24tdm0tMi50ZXN0Lmxh
-+bC5jaXNjby5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC63fGB
-+J80A9Av1GB0bptslKRIUtJm8EeEu34HkDWbL6AJY0P8WfDtlXjlPaLqFa6sqH6ES
-+V48prSm1ZUbDSVL8R6BYVYpOlK8/48xk4pGTgRzv69gf5SGtQLwHy8UPBKgjSZoD
-+5a5k5wJXGswhKFFNqyyxqCvWmMnJWxXTt2XDCiWc4g4YAWi4O4+6SeeHVAV9rV7C
-+1wxqjzKovVe2uZOHjKEzJbbIU6JBPb6TRfMdRdYOw98n1VXDcKVgdX2DuuqjCzHP
-+WhU4Tw050M9NaK3eXp4Mh69VuiKoBGOLSOcS8reqHIU46Reg0hqeL8LIL6OhFHIF
-+j7HR6V1X6F+BfRS/AgMBAAGjgdYwgdMwCQYDVR0TBAIwADAdBgNVHQ4EFgQUOktp
-+HQjxDXXUg8prleY9jeLKeQ4wTwYDVR0jBEgwRoAUx6zgPygZ0ZErF9sPC4+5e2Io
-+UU+hI6QhMB8xCzAJBgNVBAYTAlVLMRAwDgYDVQQDEwdjb2R5LWNhggkA1QEAuwb7
-+2s0wCQYDVR0SBAIwADAuBgNVHREEJzAlgiNjb2Rlbm9taWNvbi12bS0yLnRlc3Qu
-+bGFsLmNpc2NvLmNvbTAOBgNVHQ8BAf8EBAMCBaAwCwYDVR0fBAQwAjAAMAsGCSqG
-+SIb3DQEBCwOCAQEAvqantx2yBlM11RoFiCfi+AfSblXPdrIrHvccepV4pYc/yO6p
-+t1f2dxHQb8rWH3i6cWag/EgIZx+HJQvo0rgPY1BFJsX1WnYf1/znZpkUBGbVmlJr
-+t/dW1gSkNS6sPsM0Q+7HPgEv8CPDNK5eo7vU2seE0iWOkxSyVUuiCEY9ZVGaLVit
-+p0C78nZ35Pdv4I+1cosmHl28+es1WI22rrnmdBpH8J1eY6WvUw2xuZHLeNVN0TzV
-+Q3qq53AaCWuLOD1AjESWuUCxMZTK9DPS4JKXTK8RLyDeqOvJGjsSWp3kL0y3GaQ+
-+10T1rfkKJub2+m9A9duin1fn6tHc2wSvB7m3DA==
-+-----END CERTIFICATE-----
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
-index 7f6b93148f45..1fc657f4d867 100644
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -115,6 +115,7 @@ def data_file(*name):
- BADKEY = data_file("badkey.pem")
- NOKIACERT = data_file("nokia.pem")
- NULLBYTECERT = data_file("nullbytecert.pem")
-+TALOS_INVALID_CRLDP = data_file("talos-2019-0758.pem")
-
- DHFILE = data_file("ffdh3072.pem")
- BYTES_DHFILE = os.fsencode(DHFILE)
-@@ -348,6 +349,27 @@ def test_parse_cert(self):
- self.assertEqual(p['crlDistributionPoints'],
- ('http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl',))
-
-+ 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:
-diff --git a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst
b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst
-new file mode 100644
-index 000000000000..dffe347eec84
---- /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.
-diff --git a/Modules/_ssl.c b/Modules/_ssl.c
-index 4e3352d9e661..0e720e268d93 100644
---- a/Modules/_ssl.c
-+++ b/Modules/_ssl.c
-@@ -1515,6 +1515,10 @@ _get_crl_dp(X509 *certificate) {
- STACK_OF(GENERAL_NAME) *gns;
-
- dp = sk_DIST_POINT_value(dps, i);
-+ if (dp->distpoint == NULL) {
-+ /* Ignore empty DP value, CVE-2019-5010 */
-+ continue;
-+ }
- gns = dp->distpoint->name.fullname;
-
- for (j=0; j < sk_GENERAL_NAME_num(gns); j++) {
diff --git a/python3.spec b/python3.spec
index b910bd2..ca2d3e3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,10 +2,10 @@
# Top-level metadata
# ==================
-%global pybasever 3.7
+%global pybasever 3.8
# pybasever without the dot:
-%global pyshortver 37
+%global pyshortver 38
Name: python3
Summary: Interpreter of the Python programming language
@@ -13,8 +13,11 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.2
-Release: 5%{?dist}
+%global general_version %{pybasever}.0
+%global prerel a1
+%global upstream_version %{general_version}%{?prerel}
+Version: %{general_version}%{?prerel:~%{prerel}}
+Release: 1%{?dist}
License: Python
@@ -197,7 +200,7 @@ BuildRequires: python-pip-wheel
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{?prerel}....
+Source:
https://www.python.org/ftp/python/%{general_version}/Python-%{upstream_ve...
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
@@ -242,13 +245,6 @@ Patch111: 00111-no-static-lib.patch
# these unittest hooks in their own "check" phases)
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
-# 00155 #
-# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
-# generating SELinux denials on "import ctypes" and "import uuid"
when
-# embedding Python within httpd
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=814391
-Patch155: 00155-avoid-ctypes-thunks.patch
-
# 00160 #
# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
# header files in the build chroot, but may not be supported in the running
@@ -263,16 +259,6 @@ Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
# Not yet sent upstream
Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
-# 00170 #
-# In debug builds, try to print repr() when a C-level assert fails in the
-# garbage collector (typically indicating a reference-counting error
-# somewhere else e.g in an extension module)
-# The new macros/functions within gcmodule.c are hidden to avoid exposing
-# them within the extension API.
-# Sent upstream:
http://bugs.python.org/issue9263
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=614680
-Patch170: 00170-gc-assertions.patch
-
# 00178 #
# Don't duplicate various FLAGS in sysconfig values
#
http://bugs.python.org/issue17679
@@ -305,11 +291,6 @@ Patch274: 00274-fix-arch-names.patch
# So we mark the command as unsupported - and the tests are skipped
Patch316: 00316-mark-bdist_wininst-unsupported.patch
-# 00317 #
-# Security fix for CVE-2019-5010: Fix segfault in ssl's cert parser
-# Fixed upstream
https://bugs.python.org/issue35746
-Patch317: 00317-CVE-2019-5010.patch
-
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -580,7 +561,7 @@ version once Python %{pybasever} is stable.
# ======================================================
%prep
-%setup -q -n Python-%{version}%{?prerel}
+%setup -q -n Python-%{upstream_version}
# Remove all exe files to ensure we are not shipping prebuilt binaries
# note that those are only used to create Microsoft Windows installers
# and that functionality is broken on Linux anyway
@@ -599,10 +580,8 @@ rm -r Modules/expat
%endif
%patch111 -p1
%patch132 -p1
-%patch155 -p1
%patch160 -p1
%patch163 -p1
-%patch170 -p1
%patch178 -p1
%if %{with rpmwheels}
@@ -614,7 +593,6 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
%patch316 -p1
-%patch317 -p1
# Remove files that should be generated by the build
@@ -942,7 +920,6 @@ rm %{buildroot}%{_bindir}/pygettext3.py
rm %{buildroot}%{_bindir}/msgfmt3.py
rm %{buildroot}%{_bindir}/idle3
rm %{buildroot}%{_bindir}/python3-*
-rm %{buildroot}%{_bindir}/pyvenv
rm %{buildroot}%{_bindir}/2to3
rm %{buildroot}%{_libdir}/libpython3.so
rm %{buildroot}%{_mandir}/man1/python3.1*
@@ -1048,14 +1025,12 @@ CheckPython optimized
%if %{without flatpackage}
%{_bindir}/pydoc*
%{_bindir}/python3
-%{_bindir}/pyvenv
%else
%{_bindir}/pydoc%{pybasever}
%endif
%{_bindir}/python%{pybasever}
%{_bindir}/python%{pybasever}m
-%{_bindir}/pyvenv-%{pybasever}
%{_mandir}/*/*
@@ -1186,6 +1161,7 @@ CheckPython optimized
%{dynload_dir}/nis.%{SOABI_optimized}.so
%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
%{dynload_dir}/parser.%{SOABI_optimized}.so
+%{dynload_dir}/_posixshmem.%{SOABI_optimized}.so
%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
%{dynload_dir}/readline.%{SOABI_optimized}.so
%{dynload_dir}/resource.%{SOABI_optimized}.so
@@ -1197,6 +1173,7 @@ CheckPython optimized
%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
%{dynload_dir}/_uuid.%{SOABI_optimized}.so
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
%{dynload_dir}/zlib.%{SOABI_optimized}.so
%dir %{pylibdir}/site-packages/
@@ -1301,6 +1278,7 @@ CheckPython optimized
%endif
%{_includedir}/python%{LDVERSION_optimized}/*.h
%{_includedir}/python%{LDVERSION_optimized}/internal/
+%{_includedir}/python%{LDVERSION_optimized}/cpython/
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
%if %{without flatpackage}
@@ -1457,6 +1435,7 @@ CheckPython optimized
%{dynload_dir}/nis.%{SOABI_debug}.so
%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
%{dynload_dir}/parser.%{SOABI_debug}.so
+%{dynload_dir}/_posixshmem.%{SOABI_debug}.so
%{dynload_dir}/pyexpat.%{SOABI_debug}.so
%{dynload_dir}/readline.%{SOABI_debug}.so
%{dynload_dir}/resource.%{SOABI_debug}.so
@@ -1467,6 +1446,7 @@ CheckPython optimized
%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
%{dynload_dir}/unicodedata.%{SOABI_debug}.so
%{dynload_dir}/_uuid.%{SOABI_debug}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
%{dynload_dir}/zlib.%{SOABI_debug}.so
@@ -1521,6 +1501,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue Feb 05 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.8.0~a1-1
+- Update to 3.8.0a1
+
* Sat Feb 02 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.2-5
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
diff --git a/sources b/sources
index 64dca46..8f72af4 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.2.tar.xz) =
6cd2d6d8455558783b99d55985cd7b22d67b98f41a09b4fdd96f680a630a4e035220d2b903f8c59ed513aa5ffe6730fa947ddb55bb72ce36f0e945ef8af5d971
+SHA512 (Python-3.8.0a1.tar.xz) =
81e0aea4cf37f432d72464579f1b97db574496fa7105c7b2e02caed2e27d95288f21605666e80b60a01c66afb115714004b4a219b31ce21c8f732828b70b24e2
commit 1cdc336f35f414dc65e97b501bb0ed2aef2678cd
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Sat Feb 2 10:18:25 2019 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng(a)fedoraproject.org>
diff --git a/python3.spec b/python3.spec
index 09908ae..b910bd2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
@@ -1521,6 +1521,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Sat Feb 02 2019 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.2-5
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
* Wed Jan 16 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-4
- Security fix for CVE-2019-5010 (#1666519, #1666522)
commit 75005c20f68f3b4ceb734e876b37009c8c3b99f3
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jan 28 12:54:13 2019 +0100
Clean old cruft, provide pythonX.Y
In diff order:
- gdbm releases in all Fedoras are long above 1:1.13
- the flat package should be called python3.7 but we are lazy to rename
- system-python is long gone, upgrade path works
- python3-enum34 is only required by 2 pkgs [0][1]
- glibc releases in all Fedoras are long above 2.24.90-26
Not removed:
- platform-python obsoletes shall be removed in Fedora 31, they were added in 28
[0]
https://src.fedoraproject.org/rpms/python-qt5/pull-request/3
[1]
https://src.fedoraproject.org/rpms/python-taskflow/pull-request/1
diff --git a/python3.spec b/python3.spec
index 3126463..09908ae 100644
--- a/python3.spec
+++ b/python3.spec
@@ -150,7 +150,7 @@ BuildRequires: expat-devel
BuildRequires: findutils
BuildRequires: gcc-c++
%if %{with gdbm}
-BuildRequires: gdbm-devel >= 1:1.13
+BuildRequires: gdbm-devel
%endif
BuildRequires: glibc-all-langpacks
BuildRequires: glibc-devel
@@ -324,18 +324,16 @@ Patch317: 00317-CVE-2019-5010.patch
# Descriptions, and metadata for subpackages
# ==========================================
+# People might want to dnf install pythonX.Y instead of pythonXY;
+# we enable this in both flat and nonflat package.
+Provides: python%{pybasever} = %{version}-%{release}
+
%if %{without flatpackage}
# Packages with Python modules in standard locations automatically
# depend on python(abi). Provide that here.
Provides: python(abi) = %{pybasever}
-# For backward compatibility only, remove in F29:
-Provides: system-python(abi) = %{pybasever}
-Provides: system-python = %{version}-%{release}
-Provides: system-python%{?_isa} = %{version}-%{release}
-Obsoletes: system-python < %{version}-%{release}
-
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
# In order to support multiple Python interpreters for development purposes,
@@ -395,20 +393,6 @@ the "%{name}-" prefix.
%package libs
Summary: Python runtime libraries
-# The "enum" module is included in the standard library.
-# Provide an upgrade path from the external library.
-Provides: python3-enum34 = 1.0.4-5%{?dist}
-Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
-
-# Python 3 built with glibc >= 2.24.90-26 needs to require it
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1410644
-Requires: glibc%{?_isa} >= 2.24.90-26
-
-%if %{with gdbm}
-# When built with this (as guarded by the BuildRequires above), require it
-Requires: gdbm-libs%{?_isa} >= 1:1.13
-%endif
-
%if %{with rpmwheels}
Requires: python-setuptools-wheel
Requires: python-pip-wheel
@@ -423,11 +407,6 @@ Provides: bundled(python3-setuptools) = 40.6.2
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
Recommends: %{name}%{?_isa} = %{version}-%{release}
-# For backward compatibility only, remove in F29:
-Provides: system-python-libs = %{version}-%{release}
-Provides: system-python-libs%{?_isa} = %{version}-%{release}
-Obsoletes: system-python-libs < %{version}-%{release}
-
# Shall be removed in Fedora 31
Obsoletes: platform-python-libs < %{platpyver}
Obsoletes: platform-python-libs-devel < %{platpyver}
@@ -468,16 +447,6 @@ Provides: 2to3 = %{version}-%{release}
Conflicts: %{name} < %{version}-%{release}
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-# /usr/bin/2to3 was moved from python2-tools to python3-tools
-# TODO Remove in Fedora 29
-Conflicts: python2-tools < 2.7.13-17
-Conflicts: python-tools < 2.7.13-17
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
-# /usr/bin/2to3 was moved from python3-tools to python3-devel
-# TODO Remove in Fedora 30
-Conflicts: python3-tools < 3.7
-
# Shall be removed in Fedora 31
Obsoletes: platform-python-devel < %{platpyver}
@@ -959,13 +928,6 @@ ln -s \
%{buildroot}%{_bindir}/python3-debug
%endif
-# System Python: Link the executable to libexec
-# This is for backwards compatibility only and should be removed in Fedora 29
-%if %{without flatpackage}
-mkdir -p %{buildroot}%{_libexecdir}
-ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
-%endif
-
# There's 2to3-X.X executable and 2to3 soft link to it.
# No reason to have both, so keep only 2to3 as an executable.
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
@@ -1087,8 +1049,6 @@ CheckPython optimized
%{_bindir}/pydoc*
%{_bindir}/python3
%{_bindir}/pyvenv
-# Remove in Fedora 29:
-%{_libexecdir}/system-python
%else
%{_bindir}/pydoc%{pybasever}
%endif
commit 4e7015b15350c792ee08c610868d213ada26b5b9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jan 16 09:13:16 2019 +0100
Security fix for CVE-2019-5010
https://bugs.python.org/issue35746
https://bugzilla.redhat.com/show_bug.cgi?id=1666519
https://bugzilla.redhat.com/show_bug.cgi?id=1666522
diff --git a/00317-CVE-2019-5010.patch b/00317-CVE-2019-5010.patch
new file mode 100644
index 0000000..62e931e
--- /dev/null
+++ b/00317-CVE-2019-5010.patch
@@ -0,0 +1,111 @@
+From c660debb97f4f422255a82fef2d77804552c043a Mon Sep 17 00:00:00 2001
+From: Christian Heimes <christian(a)python.org>
+Date: Tue, 15 Jan 2019 18:16:30 +0100
+Subject: [PATCH] bpo-35746: Fix segfault in ssl's cert parser
+
+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.
+
+Signed-off-by: Christian Heimes <christian(a)python.org>
+---
+ 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
+
+diff --git a/Lib/test/talos-2019-0758.pem b/Lib/test/talos-2019-0758.pem
+new file mode 100644
+index 000000000000..13b95a77fd8a
+--- /dev/null
++++ b/Lib/test/talos-2019-0758.pem
+@@ -0,0 +1,22 @@
++-----BEGIN CERTIFICATE-----
++MIIDqDCCApKgAwIBAgIBAjALBgkqhkiG9w0BAQswHzELMAkGA1UEBhMCVUsxEDAO
++BgNVBAMTB2NvZHktY2EwHhcNMTgwNjE4MTgwMDU4WhcNMjgwNjE0MTgwMDU4WjA7
++MQswCQYDVQQGEwJVSzEsMCoGA1UEAxMjY29kZW5vbWljb24tdm0tMi50ZXN0Lmxh
++bC5jaXNjby5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC63fGB
++J80A9Av1GB0bptslKRIUtJm8EeEu34HkDWbL6AJY0P8WfDtlXjlPaLqFa6sqH6ES
++V48prSm1ZUbDSVL8R6BYVYpOlK8/48xk4pGTgRzv69gf5SGtQLwHy8UPBKgjSZoD
++5a5k5wJXGswhKFFNqyyxqCvWmMnJWxXTt2XDCiWc4g4YAWi4O4+6SeeHVAV9rV7C
++1wxqjzKovVe2uZOHjKEzJbbIU6JBPb6TRfMdRdYOw98n1VXDcKVgdX2DuuqjCzHP
++WhU4Tw050M9NaK3eXp4Mh69VuiKoBGOLSOcS8reqHIU46Reg0hqeL8LIL6OhFHIF
++j7HR6V1X6F+BfRS/AgMBAAGjgdYwgdMwCQYDVR0TBAIwADAdBgNVHQ4EFgQUOktp
++HQjxDXXUg8prleY9jeLKeQ4wTwYDVR0jBEgwRoAUx6zgPygZ0ZErF9sPC4+5e2Io
++UU+hI6QhMB8xCzAJBgNVBAYTAlVLMRAwDgYDVQQDEwdjb2R5LWNhggkA1QEAuwb7
++2s0wCQYDVR0SBAIwADAuBgNVHREEJzAlgiNjb2Rlbm9taWNvbi12bS0yLnRlc3Qu
++bGFsLmNpc2NvLmNvbTAOBgNVHQ8BAf8EBAMCBaAwCwYDVR0fBAQwAjAAMAsGCSqG
++SIb3DQEBCwOCAQEAvqantx2yBlM11RoFiCfi+AfSblXPdrIrHvccepV4pYc/yO6p
++t1f2dxHQb8rWH3i6cWag/EgIZx+HJQvo0rgPY1BFJsX1WnYf1/znZpkUBGbVmlJr
++t/dW1gSkNS6sPsM0Q+7HPgEv8CPDNK5eo7vU2seE0iWOkxSyVUuiCEY9ZVGaLVit
++p0C78nZ35Pdv4I+1cosmHl28+es1WI22rrnmdBpH8J1eY6WvUw2xuZHLeNVN0TzV
++Q3qq53AaCWuLOD1AjESWuUCxMZTK9DPS4JKXTK8RLyDeqOvJGjsSWp3kL0y3GaQ+
++10T1rfkKJub2+m9A9duin1fn6tHc2wSvB7m3DA==
++-----END CERTIFICATE-----
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+index 7f6b93148f45..1fc657f4d867 100644
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -115,6 +115,7 @@ def data_file(*name):
+ BADKEY = data_file("badkey.pem")
+ NOKIACERT = data_file("nokia.pem")
+ NULLBYTECERT = data_file("nullbytecert.pem")
++TALOS_INVALID_CRLDP = data_file("talos-2019-0758.pem")
+
+ DHFILE = data_file("ffdh3072.pem")
+ BYTES_DHFILE = os.fsencode(DHFILE)
+@@ -348,6 +349,27 @@ def test_parse_cert(self):
+ self.assertEqual(p['crlDistributionPoints'],
+ ('http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl',))
+
++ 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:
+diff --git a/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst
b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst
+new file mode 100644
+index 000000000000..dffe347eec84
+--- /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.
+diff --git a/Modules/_ssl.c b/Modules/_ssl.c
+index 4e3352d9e661..0e720e268d93 100644
+--- a/Modules/_ssl.c
++++ b/Modules/_ssl.c
+@@ -1515,6 +1515,10 @@ _get_crl_dp(X509 *certificate) {
+ STACK_OF(GENERAL_NAME) *gns;
+
+ dp = sk_DIST_POINT_value(dps, i);
++ if (dp->distpoint == NULL) {
++ /* Ignore empty DP value, CVE-2019-5010 */
++ continue;
++ }
+ gns = dp->distpoint->name.fullname;
+
+ for (j=0; j < sk_GENERAL_NAME_num(gns); j++) {
diff --git a/python3.spec b/python3.spec
index dba250b..3126463 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
@@ -305,6 +305,11 @@ Patch274: 00274-fix-arch-names.patch
# So we mark the command as unsupported - and the tests are skipped
Patch316: 00316-mark-bdist_wininst-unsupported.patch
+# 00317 #
+# Security fix for CVE-2019-5010: Fix segfault in ssl's cert parser
+# Fixed upstream
https://bugs.python.org/issue35746
+Patch317: 00317-CVE-2019-5010.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -640,6 +645,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
%patch316 -p1
+%patch317 -p1
# Remove files that should be generated by the build
@@ -1555,6 +1561,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Jan 16 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-4
+- Security fix for CVE-2019-5010 (#1666519, #1666522)
+
* Mon Jan 14 2019 Bjrn Esser <besser82(a)fedoraproject.org> - 3.7.2-3
- Rebuilt for libcrypt.so.2 (#1666033)
commit 053863ab4146d8f26c0c8b7bb01015a7af29275e
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Mon Jan 14 18:53:46 2019 +0100
Rebuilt for libcrypt.so.2 (#1666033)
diff --git a/python3.spec b/python3.spec
index 6f9d923..dba250b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
@@ -1555,6 +1555,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Jan 14 2019 Bjrn Esser <besser82(a)fedoraproject.org> - 3.7.2-3
+- Rebuilt for libcrypt.so.2 (#1666033)
+
* Fri Jan 04 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-2
- No longer revert upstream commit 3b699932e5ac3e7
- This was a dirty workaround for (#1644936)
commit 41f5904a99d5a024993b41ffcadacaa6e5a42ebf
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jan 4 23:52:11 2019 +0100
No longer revert upstream commit 3b699932e5ac3e7
This was a dirty workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1644936
diff --git a/00312-revert-bpo-6721.patch b/00312-revert-bpo-6721.patch
deleted file mode 100644
index c3350bf..0000000
--- a/00312-revert-bpo-6721.patch
+++ /dev/null
@@ -1,168 +0,0 @@
-From 583bb07116505dcc73c0fc4aa3c1cf5074f3522d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
-Date: Fri, 2 Nov 2018 14:01:28 +0100
-Subject: [PATCH] Revert "bpo-6721: Hold logging locks across fork() (GH-4071)
- (#9291)"
-
-This reverts commit 3b699932e5ac3e76031bbb6d700fbea07492641d.
----
- Lib/logging/__init__.py | 50 ------------------------------
- Lib/test/test_logging.py | 67 ----------------------------------------
- 2 files changed, 117 deletions(-)
-
-diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
-index 3ad2cc38f6..53780cd600 100644
---- a/Lib/logging/__init__.py
-+++ b/Lib/logging/__init__.py
-@@ -225,55 +225,6 @@ def _releaseLock():
- if _lock:
- _lock.release()
-
--
--# Prevent a held logging lock from blocking a child from logging.
--
--if not hasattr(os, 'register_at_fork'): # Windows and friends.
-- def _register_at_fork_acquire_release(instance):
-- pass # no-op when os.register_at_fork does not exist.
--else: # The os.register_at_fork API exists
-- os.register_at_fork(before=_acquireLock,
-- after_in_child=_releaseLock,
-- after_in_parent=_releaseLock)
--
-- # A collection of instances with acquire and release methods (logging.Handler)
-- # to be called before and after fork. The weakref avoids us keeping discarded
-- # Handler instances alive forever in case an odd program creates and destroys
-- # many over its lifetime.
-- _at_fork_acquire_release_weakset = weakref.WeakSet()
--
--
-- def _register_at_fork_acquire_release(instance):
-- # We put the instance itself in a single WeakSet as we MUST have only
-- # one atomic weak ref. used by both before and after atfork calls to
-- # guarantee matched pairs of acquire and release calls.
-- _at_fork_acquire_release_weakset.add(instance)
--
--
-- def _at_fork_weak_calls(method_name):
-- for instance in _at_fork_acquire_release_weakset:
-- method = getattr(instance, method_name)
-- try:
-- method()
-- except Exception as err:
-- # Similar to what PyErr_WriteUnraisable does.
-- print("Ignoring exception from logging atfork", instance,
-- method_name, "method:", err, file=sys.stderr)
--
--
-- def _before_at_fork_weak_calls():
-- _at_fork_weak_calls('acquire')
--
--
-- def _after_at_fork_weak_calls():
-- _at_fork_weak_calls('release')
--
--
-- os.register_at_fork(before=_before_at_fork_weak_calls,
-- after_in_child=_after_at_fork_weak_calls,
-- after_in_parent=_after_at_fork_weak_calls)
--
--
- #---------------------------------------------------------------------------
- # The logging record
- #---------------------------------------------------------------------------
-@@ -844,7 +795,6 @@ class Handler(Filterer):
- Acquire a thread lock for serializing access to the underlying I/O.
- """
- self.lock = threading.RLock()
-- _register_at_fork_acquire_release(self)
-
- def acquire(self):
- """
-diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
-index 1ea2967f5b..5d5eba7357 100644
---- a/Lib/test/test_logging.py
-+++ b/Lib/test/test_logging.py
-@@ -35,7 +35,6 @@ import os
- import queue
- import random
- import re
--import signal
- import socket
- import struct
- import sys
-@@ -667,72 +666,6 @@ class HandlerTest(BaseTest):
- if os.path.exists(fn):
- os.unlink(fn)
-
-- # The implementation relies on os.register_at_fork existing, but we test
-- # based on os.fork existing because that is what users and this test use.
-- # This helps ensure that when fork exists (the important concept) that the
-- # register_at_fork mechanism is also present and used.
-- @unittest.skipIf(not hasattr(os, 'fork'), 'Test requires
os.fork().')
-- def test_post_fork_child_no_deadlock(self):
-- """Ensure forked child logging locks are not held;
bpo-6721."""
-- refed_h = logging.Handler()
-- refed_h.name = 'because we need at least one for this test'
-- self.assertGreater(len(logging._handlers), 0)
--
-- locks_held__ready_to_fork = threading.Event()
-- fork_happened__release_locks_and_end_thread = threading.Event()
--
-- def lock_holder_thread_fn():
-- logging._acquireLock()
-- try:
-- refed_h.acquire()
-- try:
-- # Tell the main thread to do the fork.
-- locks_held__ready_to_fork.set()
--
-- # If the deadlock bug exists, the fork will happen
-- # without dealing with the locks we hold, deadlocking
-- # the child.
--
-- # Wait for a successful fork or an unreasonable amount of
-- # time before releasing our locks. To avoid a timing based
-- # test we'd need communication from os.fork() as to when it
-- # has actually happened. Given this is a regression test
-- # for a fixed issue, potentially less reliably detecting
-- # regression via timing is acceptable for simplicity.
-- # The test will always take at least this long. :(
-- fork_happened__release_locks_and_end_thread.wait(0.5)
-- finally:
-- refed_h.release()
-- finally:
-- logging._releaseLock()
--
-- lock_holder_thread = threading.Thread(
-- target=lock_holder_thread_fn,
-- name='test_post_fork_child_no_deadlock lock holder')
-- lock_holder_thread.start()
--
-- locks_held__ready_to_fork.wait()
-- pid = os.fork()
-- if pid == 0: # Child.
-- logging.error(r'Child process did not deadlock. \o/')
-- os._exit(0)
-- else: # Parent.
-- fork_happened__release_locks_and_end_thread.set()
-- lock_holder_thread.join()
-- start_time = time.monotonic()
-- while True:
-- waited_pid, status = os.waitpid(pid, os.WNOHANG)
-- if waited_pid == pid:
-- break # child process exited.
-- if time.monotonic() - start_time > 7:
-- break # so long? implies child deadlock.
-- time.sleep(0.05)
-- if waited_pid != pid:
-- os.kill(pid, signal.SIGKILL)
-- waited_pid, status = os.waitpid(pid, 0)
-- self.fail("child process deadlocked.")
-- self.assertEqual(status, 0, msg="child process error")
--
-
- class BadStream(object):
- def write(self, data):
---
-2.19.1
-
diff --git a/python3.spec b/python3.spec
index 7a730f8..6f9d923 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -300,13 +300,6 @@ Patch251: 00251-change-user-install-location.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00312 #
-# Revert "bpo-6721: Hold logging locks across fork() 3b699932e5ac3e7
-# This is a TEMPORARY WORKAROUND for an urgent Fedora bug
-# TODO Investigate properly and get a real fix (here or in anaconda)!
-# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1644936
-Patch312: 00312-revert-bpo-6721.patch
-
# 00316 #
# We remove the exe files from distutil's bdist_wininst
# So we mark the command as unsupported - and the tests are skipped
@@ -646,7 +639,6 @@ rm Lib/ensurepip/_bundled/*.whl
%patch205 -p1
%patch251 -p1
%patch274 -p1
-%patch312 -p1
%patch316 -p1
@@ -1563,6 +1555,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Jan 04 2019 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-2
+- No longer revert upstream commit 3b699932e5ac3e7
+- This was a dirty workaround for (#1644936)
+
* Tue Dec 25 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-1
- Update to 3.7.2
commit 1385d6e65a65c4820b5778218da41e1beddb9484
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Dec 12 07:58:52 2018 +0100
Update to 3.7.2
Already upstreamed patches: 313, 315
Patches rebased: 111, 189 (new pip/setuptools versions only)
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 5bfff87..4cce364 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,17 +1,17 @@
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 0eddd13..7ed4f3c 100644
+index 0db0dd0..bd8f769 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -565,7 +565,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+@@ -574,7 +574,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
+$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
+ $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -609,12 +609,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -622,12 +622,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -24,16 +24,16 @@ index 0eddd13..7ed4f3c 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -702,7 +696,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
+@@ -715,7 +709,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
echo "-----------------------------------------------"; \
fi
-Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
+Programs/_testembed: Programs/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+ $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1460,17 +1454,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1483,17 +1477,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
index cc2719b..1afdab1 100644
--- a/00189-use-rpm-wheels.patch
+++ b/00189-use-rpm-wheels.patch
@@ -16,9 +16,9 @@ index 4748ba4..fc02255 100644
+_WHEEL_DIR = "/usr/share/python-wheels/"
--_SETUPTOOLS_VERSION = "39.0.1"
+-_SETUPTOOLS_VERSION = "40.6.2"
--_PIP_VERSION = "10.0.1"
+-_PIP_VERSION = "18.1"
+def _get_most_recent_wheel_version(pkg):
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
+ suffix = "-py2.py3-none-any.whl"
diff --git a/00313-cprofile-sort-option.patch b/00313-cprofile-sort-option.patch
deleted file mode 100644
index fe427e5..0000000
--- a/00313-cprofile-sort-option.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-commit c36e8721f276e7cc09cecdb9c04783630f0ba82a
-Author: Victor Stinner <vstinner(a)redhat.com>
-Date: Wed Nov 7 00:34:22 2018 +0100
-
- bpo-23420: Verify the value of '-s' when execute the CLI of cProfile
-
- Verify the value for the parameter '-s' of the cProfile CLI. Patch by Robert
- Kuska.
-
- Resolves: rhbz#1160640
-
-diff --git a/Lib/cProfile.py b/Lib/cProfile.py
-index c044be8..f6e423b 100755
---- a/Lib/cProfile.py
-+++ b/Lib/cProfile.py
-@@ -124,6 +124,7 @@ def main():
- import os
- import sys
- import runpy
-+ import pstats
- from optparse import OptionParser
- usage = "cProfile.py [-o output_file_path] [-s sort] [-m module | scriptfile]
[arg] ..."
- parser = OptionParser(usage=usage)
-@@ -132,7 +133,8 @@ def main():
- help="Save stats to <outfile>", default=None)
- parser.add_option('-s', '--sort', dest="sort",
- help="Sort order when printing to stdout, based on pstats.Stats
class",
-- default=-1)
-+ default=-1,
-+ choices=sorted(pstats.Stats.sort_arg_dict_default))
- parser.add_option('-m', dest="module",
action="store_true",
- help="Profile a library module", default=False)
-
-diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
-index 1430d22..5c4ec5b 100644
---- a/Lib/test/test_cprofile.py
-+++ b/Lib/test/test_cprofile.py
-@@ -2,6 +2,7 @@
-
- import sys
- from test.support import run_unittest, TESTFN, unlink
-+import unittest
-
- # rip off all interesting stuff from test_profile
- import cProfile
-@@ -50,8 +51,14 @@ class CProfileTest(ProfileTest):
- assert_python_ok('-m', 'cProfile', '-m',
'timeit', '-n', '1')
-
-
-+class TestCommandLine(unittest.TestCase):
-+ def test_sort(self):
-+ rc, out, err = assert_python_failure('-m', 'cProfile',
'-s', 'demo')
-+ self.assertGreater(rc, 0)
-+ self.assertIn(b"option -s: invalid choice: 'demo'", err)
-+
- def test_main():
-- run_unittest(CProfileTest)
-+ run_unittest(CProfileTest, TestCommandLine)
-
- def main():
- if '-r' not in sys.argv:
diff --git a/00315-test_email-mktime.patch b/00315-test_email-mktime.patch
deleted file mode 100644
index aacdcd6..0000000
--- a/00315-test_email-mktime.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 0165caf04ef9c615c8b86dd16f7c201ca7a0befa Mon Sep 17 00:00:00 2001
-From: Victor Stinner <vstinner(a)redhat.com>
-Date: Tue, 27 Nov 2018 12:40:50 +0100
-Subject: [PATCH] bpo-35317: Fix mktime() error in test_email (GH-10721)
-
-Fix mktime() overflow error in test_email: run
-test_localtime_daylight_true_dst_true() and
-test_localtime_daylight_false_dst_true() with a specific timezone.
-(cherry picked from commit cfaafda8e3e19764682abb4bd4c574accb784c42)
-
-Co-authored-by: Victor Stinner <vstinner(a)redhat.com>
----
- Lib/test/test_email/test_utils.py | 2 ++
- .../NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst | 3 +++
- 2 files changed, 5 insertions(+)
- create mode 100644 Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
-
-diff --git a/Lib/test/test_email/test_utils.py b/Lib/test/test_email/test_utils.py
-index 6dcb3bbe7aab..4e3c3f3a195f 100644
---- a/Lib/test/test_email/test_utils.py
-+++ b/Lib/test/test_email/test_utils.py
-@@ -75,6 +75,7 @@ def test_localtime_daylight_false_dst_false(self):
- t2 = utils.localtime(t1)
- self.assertEqual(t1, t2)
-
-+ @test.support.run_with_tz('Europe/Minsk')
- def test_localtime_daylight_true_dst_true(self):
- test.support.patch(self, time, 'daylight', True)
- t0 = datetime.datetime(2012, 3, 12, 1, 1)
-@@ -82,6 +83,7 @@ def test_localtime_daylight_true_dst_true(self):
- t2 = utils.localtime(t1)
- self.assertEqual(t1, t2)
-
-+ @test.support.run_with_tz('Europe/Minsk')
- def test_localtime_daylight_false_dst_true(self):
- test.support.patch(self, time, 'daylight', False)
- t0 = datetime.datetime(2012, 3, 12, 1, 1)
-diff --git a/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
b/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
-new file mode 100644
-index 000000000000..73a30f71927f
---- /dev/null
-+++ b/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
-@@ -0,0 +1,3 @@
-+Fix ``mktime()`` overflow error in ``test_email``: run
-+``test_localtime_daylight_true_dst_true()`` and
-+``test_localtime_daylight_false_dst_true()`` with a specific timezone.
diff --git a/python3.spec b/python3.spec
index 2e3569c..7a730f8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -13,8 +13,8 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.1
-Release: 5%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
@@ -307,18 +307,6 @@ Patch274: 00274-fix-arch-names.patch
# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1644936
Patch312: 00312-revert-bpo-6721.patch
-# 00313 #
-# Verify the value of '-s' when execute the CLI of cProfile
-#
http://bugs.python.org/issue23420
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1160640
-Patch313: 00313-cprofile-sort-option.patch
-
-# 00315 #
-# Fix mktime() error in test_email
-#
http://bugs.python.org/issue35317
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1652843
-Patch315: 00315-test_email-mktime.patch
-
# 00316 #
# We remove the exe files from distutil's bdist_wininst
# So we mark the command as unsupported - and the tests are skipped
@@ -427,8 +415,8 @@ Requires: gdbm-libs%{?_isa} >= 1:1.13
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 10.0.1
-Provides: bundled(python3-setuptools) = 39.0.1
+Provides: bundled(python3-pip) = 18.1
+Provides: bundled(python3-setuptools) = 40.6.2
%endif
# There are files in the standard library that have python shebang.
@@ -605,8 +593,8 @@ Requires: redhat-rpm-config
Requires: python-setuptools-wheel
Requires: python-pip-wheel
%else
-Provides: bundled(python3-pip) = 10.0.1
-Provides: bundled(python3-setuptools) = 39.0.1
+Provides: bundled(python3-pip) = 18.1
+Provides: bundled(python3-setuptools) = 40.6.2
%endif
# The description for the flat package
@@ -659,8 +647,6 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
%patch312 -p1
-%patch313 -p1
-%patch315 -p1
%patch316 -p1
@@ -1356,6 +1342,7 @@ CheckPython optimized
%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%endif
%{_includedir}/python%{LDVERSION_optimized}/*.h
+%{_includedir}/python%{LDVERSION_optimized}/internal/
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
%if %{without flatpackage}
@@ -1576,6 +1563,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue Dec 25 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.2-1
+- Update to 3.7.2
+
* Fri Dec 07 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-5
- Make sure we don't ship any exe files (not needed an prebuilt)
diff --git a/sources b/sources
index 4d40818..64dca46 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.1.tar.xz) =
3eb62a0127609b14420a47442727702f396519c649625aca59883d04f4c02e5f37ba1d58ac8e93c49d14a63f17ae7909315c33fc813293dbcdb6127f39a148b0
+SHA512 (Python-3.7.2.tar.xz) =
6cd2d6d8455558783b99d55985cd7b22d67b98f41a09b4fdd96f680a630a4e035220d2b903f8c59ed513aa5ffe6730fa947ddb55bb72ce36f0e945ef8af5d971
commit 15d5b5cfc53df90ea4d499bfdc405d1ada88cc26
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Dec 20 12:46:25 2018 +0100
Mark bdist_wininst unsupported to skip the tests
See also
https://src.fedoraproject.org/rpms/python3/pull-request/74
diff --git a/00316-mark-bdist_wininst-unsupported.patch
b/00316-mark-bdist_wininst-unsupported.patch
new file mode 100644
index 0000000..a6a3faf
--- /dev/null
+++ b/00316-mark-bdist_wininst-unsupported.patch
@@ -0,0 +1,13 @@
+diff --git a/Lib/distutils/command/bdist_wininst.py
b/Lib/distutils/command/bdist_wininst.py
+index 0871a4f..8796b68 100644
+--- a/Lib/distutils/command/bdist_wininst.py
++++ b/Lib/distutils/command/bdist_wininst.py
+@@ -12,6 +12,8 @@ from distutils.sysconfig import get_python_version
+ from distutils import log
+
+ class bdist_wininst(Command):
++ # Marker for tests that we have the unsupported bdist_wininst
++ _unsupported = True
+
+ description = "create an executable installer for MS Windows"
+
diff --git a/python3.spec b/python3.spec
index 6ba9805..2e3569c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -319,6 +319,11 @@ Patch313: 00313-cprofile-sort-option.patch
#
https://bugzilla.redhat.com/show_bug.cgi?id=1652843
Patch315: 00315-test_email-mktime.patch
+# 00316 #
+# We remove the exe files from distutil's bdist_wininst
+# So we mark the command as unsupported - and the tests are skipped
+Patch316: 00316-mark-bdist_wininst-unsupported.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -656,6 +661,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch312 -p1
%patch313 -p1
%patch315 -p1
+%patch316 -p1
# Remove files that should be generated by the build
commit 0e0fe4ff87c90aa88ad57b5456a7229c0051c0df
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Tue Dec 18 15:41:35 2018 +0100
Remove patches fixed upstream
Remove patches:
* 00291-setup-Link-ctypes-against-dl-explicitly.patch
Fixed upstream:
https://bugs.python.org/issue32647
* 00292-restore-PyExc_RecursionErrorInst-symbol.patch
Fixed upstream:
https://bugs.python.org/issue30697
* 00294-define-TLS-cipher-suite-on-build-time.patch
Fixed upstream:
https://bugs.python.org/issue31429
* 00301-pathfix-add-n-option-for-no-backup.patch
Fixed upstream:
https://bugs.python.org/issue32885
* 00302-fix-multiprocessing-regression-on-newer-glibcs.patch
Fixed upstream:
https://bugs.python.org/issue33329
Note: the ctypes issue has been fixed differently (better fix)
upstream.
diff --git a/00291-setup-Link-ctypes-against-dl-explicitly.patch
b/00291-setup-Link-ctypes-against-dl-explicitly.patch
deleted file mode 100644
index 4bf4801..0000000
--- a/00291-setup-Link-ctypes-against-dl-explicitly.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From aae2ef0bace0e38f4ee5aaa4642aa32450a84216 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
-Date: Tue, 23 Jan 2018 14:43:43 +0100
-Subject: [PATCH] setup: Link ctypes against dl explicitly
-
----
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/setup.py b/setup.py
-index c23628a2a9..9e40bb53e6 100644
---- a/setup.py
-+++ b/setup.py
-@@ -1935,7 +1935,7 @@ class PyBuildExt(build_ext):
- self.use_system_libffi = False
- include_dirs = []
- extra_compile_args = []
-- extra_link_args = []
-+ extra_link_args = ['-ldl']
- sources = ['_ctypes/_ctypes.c',
- '_ctypes/callbacks.c',
- '_ctypes/callproc.c',
---
-2.16.1
-
diff --git a/00292-restore-PyExc_RecursionErrorInst-symbol.patch
b/00292-restore-PyExc_RecursionErrorInst-symbol.patch
deleted file mode 100644
index 89671f8..0000000
--- a/00292-restore-PyExc_RecursionErrorInst-symbol.patch
+++ /dev/null
@@ -1,106 +0,0 @@
-diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
-index 847b50140a6..570dc3ed6fe 100644
---- a/Doc/whatsnew/3.6.rst
-+++ b/Doc/whatsnew/3.6.rst
-@@ -1852,10 +1852,10 @@ Build and C API Changes
- * The :c:func:`PyUnicode_FSConverter` and :c:func:`PyUnicode_FSDecoder`
- functions will now accept :term:`path-like objects <path-like object>`.
-
--* The ``PyExc_RecursionErrorInst`` singleton that was part of the public API
-- has been removed as its members being never cleared may cause a segfault
-- during finalization of the interpreter. Contributed by Xavier de Gaye in
-- :issue:`22898` and :issue:`30697`.
-+* The ``PyExc_RecursionErrorInst`` singleton is not used anymore as its members
-+ being never cleared may cause a segfault during finalization of the
-+ interpreter. Contributed by Xavier de Gaye in :issue:`22898` and
-+ :issue:`30697`.
-
-
- Other Improvements
-diff --git a/Include/pyerrors.h b/Include/pyerrors.h
-index c28c1373f82..8c1dbc5047b 100644
---- a/Include/pyerrors.h
-+++ b/Include/pyerrors.h
-@@ -219,6 +219,8 @@ PyAPI_DATA(PyObject *) PyExc_IOError;
- PyAPI_DATA(PyObject *) PyExc_WindowsError;
- #endif
-
-+PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst;
-+
- /* Predefined warning categories */
- PyAPI_DATA(PyObject *) PyExc_Warning;
- PyAPI_DATA(PyObject *) PyExc_UserWarning;
-diff --git a/Misc/NEWS.d/next/C API/2017-12-20-15-23-06.bpo-30697.v9FmgG.rst
b/Misc/NEWS.d/next/C API/2017-12-20-15-23-06.bpo-30697.v9FmgG.rst
-new file mode 100644
-index 00000000000..28f74ad4f30
---- /dev/null
-+++ b/Misc/NEWS.d/next/C API/2017-12-20-15-23-06.bpo-30697.v9FmgG.rst
-@@ -0,0 +1 @@
-+Restore PyExc_RecursionErrorInst in 3.6
-diff --git a/Objects/exceptions.c b/Objects/exceptions.c
-index df4899372a5..271e293e325 100644
---- a/Objects/exceptions.c
-+++ b/Objects/exceptions.c
-@@ -2430,6 +2430,12 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning,
-
-
-
-+/* Pre-computed RecursionError instance for when recursion depth is reached.
-+ Meant to be used when normalizing the exception for exceeding the recursion
-+ depth will cause its own infinite recursion.
-+*/
-+PyObject *PyExc_RecursionErrorInst = NULL;
-+
- #define PRE_INIT(TYPE) \
- if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
- if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
-@@ -2691,11 +2697,37 @@ _PyExc_Init(PyObject *bltinmod)
- ADD_ERRNO(TimeoutError, ETIMEDOUT);
-
- preallocate_memerrors();
-+
-+ if (!PyExc_RecursionErrorInst) {
-+ PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL,
NULL);
-+ if (!PyExc_RecursionErrorInst)
-+ Py_FatalError("Cannot pre-allocate RecursionError instance for "
-+ "recursion errors");
-+ else {
-+ PyBaseExceptionObject *err_inst =
-+ (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
-+ PyObject *args_tuple;
-+ PyObject *exc_message;
-+ exc_message = PyUnicode_FromString("maximum recursion depth
exceeded");
-+ if (!exc_message)
-+ Py_FatalError("cannot allocate argument for RecursionError "
-+ "pre-allocation");
-+ args_tuple = PyTuple_Pack(1, exc_message);
-+ if (!args_tuple)
-+ Py_FatalError("cannot allocate tuple for RecursionError "
-+ "pre-allocation");
-+ Py_DECREF(exc_message);
-+ if (BaseException_init(err_inst, args_tuple, NULL))
-+ Py_FatalError("init of pre-allocated RecursionError failed");
-+ Py_DECREF(args_tuple);
-+ }
-+ }
- }
-
- void
- _PyExc_Fini(void)
- {
-+ Py_CLEAR(PyExc_RecursionErrorInst);
- free_preallocated_memerrors();
- Py_CLEAR(errnomap);
- }
-diff --git a/PC/python3.def b/PC/python3.def
-index 4fc4a6814ee..ff70718fc37 100644
---- a/PC/python3.def
-+++ b/PC/python3.def
-@@ -224,6 +224,7 @@ EXPORTS
- PyExc_PermissionError=python36.PyExc_PermissionError DATA
- PyExc_ProcessLookupError=python36.PyExc_ProcessLookupError DATA
- PyExc_RecursionError=python36.PyExc_RecursionError DATA
-+ PyExc_RecursionErrorInst=python36.PyExc_RecursionErrorInst DATA
- PyExc_ReferenceError=python36.PyExc_ReferenceError DATA
- PyExc_ResourceWarning=python36.PyExc_ResourceWarning DATA
- PyExc_RuntimeError=python36.PyExc_RuntimeError DATA
diff --git a/00294-define-TLS-cipher-suite-on-build-time.patch
b/00294-define-TLS-cipher-suite-on-build-time.patch
deleted file mode 100644
index 1aa348c..0000000
--- a/00294-define-TLS-cipher-suite-on-build-time.patch
+++ /dev/null
@@ -1,228 +0,0 @@
-diff --git a/Lib/ssl.py b/Lib/ssl.py
-index 1f3a31a..b54a684 100644
---- a/Lib/ssl.py
-+++ b/Lib/ssl.py
-@@ -116,6 +116,7 @@ except ImportError:
-
-
- from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN, HAS_TLSv1_3
-+from _ssl import _DEFAULT_CIPHERS
- from _ssl import _OPENSSL_API_VERSION
-
-
-@@ -174,48 +175,7 @@ else:
- CHANNEL_BINDING_TYPES = []
-
-
--# Disable weak or insecure ciphers by default
--# (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL')
--# Enable a better set of ciphers by default
--# This list has been explicitly chosen to:
--# * TLS 1.3 ChaCha20 and AES-GCM cipher suites
--# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
--# * Prefer ECDHE over DHE for better performance
--# * Prefer AEAD over CBC for better performance and security
--# * Prefer AES-GCM over ChaCha20 because most platforms have AES-NI
--# (ChaCha20 needs OpenSSL 1.1.0 or patched 1.0.2)
--# * Prefer any AES-GCM and ChaCha20 over any AES-CBC for better
--# performance and security
--# * Then Use HIGH cipher suites as a fallback
--# * Disable NULL authentication, NULL encryption, 3DES and MD5 MACs
--# for security reasons
--_DEFAULT_CIPHERS = (
-- 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:'
-- 'TLS13-AES-128-GCM-SHA256:'
-- 'ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:'
-- 'ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:'
-- '!aNULL:!eNULL:!MD5:!3DES'
-- )
--
--# Restricted and more secure ciphers for the server side
--# This list has been explicitly chosen to:
--# * TLS 1.3 ChaCha20 and AES-GCM cipher suites
--# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
--# * Prefer ECDHE over DHE for better performance
--# * Prefer AEAD over CBC for better performance and security
--# * Prefer AES-GCM over ChaCha20 because most platforms have AES-NI
--# * Prefer any AES-GCM and ChaCha20 over any AES-CBC for better
--# performance and security
--# * Then Use HIGH cipher suites as a fallback
--# * Disable NULL authentication, NULL encryption, MD5 MACs, DSS, RC4, and
--# 3DES for security reasons
--_RESTRICTED_SERVER_CIPHERS = (
-- 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:'
-- 'TLS13-AES-128-GCM-SHA256:'
-- 'ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:'
-- 'ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:'
-- '!aNULL:!eNULL:!MD5:!DSS:!RC4:!3DES'
--)
-+_RESTRICTED_SERVER_CIPHERS = _DEFAULT_CIPHERS
-
-
- class CertificateError(ValueError):
-@@ -389,8 +349,6 @@ class SSLContext(_SSLContext):
-
- def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
- self = _SSLContext.__new__(cls, protocol)
-- if protocol != _SSLv2_IF_EXISTS:
-- self.set_ciphers(_DEFAULT_CIPHERS)
- return self
-
- def __init__(self, protocol=PROTOCOL_TLS):
-@@ -505,8 +463,6 @@ def create_default_context(purpose=Purpose.SERVER_AUTH, *,
cafile=None,
- # verify certs and host name in client mode
- context.verify_mode = CERT_REQUIRED
- context.check_hostname = True
-- elif purpose == Purpose.CLIENT_AUTH:
-- context.set_ciphers(_RESTRICTED_SERVER_CIPHERS)
-
- if cafile or capath or cadata:
- context.load_verify_locations(cafile, capath, cadata)
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
-index 54644e1..799100c 100644
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -18,6 +18,7 @@ import asyncore
- import weakref
- import platform
- import functools
-+import sysconfig
- try:
- import ctypes
- except ImportError:
-@@ -36,7 +37,7 @@ PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
- HOST = support.HOST
- IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
- IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
--
-+PY_SSL_DEFAULT_CIPHERS = sysconfig.get_config_var('PY_SSL_DEFAULT_CIPHERS')
-
- def data_file(*name):
- return os.path.join(os.path.dirname(__file__), *name)
-@@ -889,6 +890,19 @@ class ContextTests(unittest.TestCase):
- with self.assertRaisesRegex(ssl.SSLError, "No cipher can be
selected"):
- ctx.set_ciphers("^$:,;?*'dorothyx")
-
-+ @unittest.skipUnless(PY_SSL_DEFAULT_CIPHERS == 1,
-+ "Test applies only to Python default ciphers")
-+ def test_python_ciphers(self):
-+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
-+ ciphers = ctx.get_ciphers()
-+ for suite in ciphers:
-+ name = suite['name']
-+ self.assertNotIn("PSK", name)
-+ self.assertNotIn("SRP", name)
-+ self.assertNotIn("MD5", name)
-+ self.assertNotIn("RC4", name)
-+ self.assertNotIn("3DES", name)
-+
- @unittest.skipIf(ssl.OPENSSL_VERSION_INFO < (1, 0, 2, 0, 0), 'OpenSSL too
old')
- def test_get_ciphers(self):
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
-diff --git a/Modules/_ssl.c b/Modules/_ssl.c
-index df8c6a7..e23a569 100644
---- a/Modules/_ssl.c
-+++ b/Modules/_ssl.c
-@@ -206,6 +206,31 @@ SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s)
-
- #endif /* OpenSSL < 1.1.0 or LibreSSL */
-
-+/* Default cipher suites */
-+#ifndef PY_SSL_DEFAULT_CIPHERS
-+#define PY_SSL_DEFAULT_CIPHERS 1
-+#endif
-+
-+#if PY_SSL_DEFAULT_CIPHERS == 0
-+ #ifndef PY_SSL_DEFAULT_CIPHER_STRING
-+ #error "Py_SSL_DEFAULT_CIPHERS 0 needs Py_SSL_DEFAULT_CIPHER_STRING"
-+ #endif
-+#elif PY_SSL_DEFAULT_CIPHERS == 1
-+/* Python custom selection of sensible ciper suites
-+ * DEFAULT: OpenSSL's default cipher list. Since 1.0.2 the list is in sensible
order.
-+ * !aNULL:!eNULL: really no NULL ciphers
-+ * !MD5:!3DES:!DES:!RC4:!IDEA:!SEED: no weak or broken algorithms on old OpenSSL
versions.
-+ * !aDSS: no authentication with discrete logarithm DSA algorithm
-+ * !SRP:!PSK: no secure remote password or pre-shared key authentication
-+ */
-+ #define PY_SSL_DEFAULT_CIPHER_STRING
"DEFAULT:!aNULL:!eNULL:!MD5:!3DES:!DES:!RC4:!IDEA:!SEED:!aDSS:!SRP:!PSK"
-+#elif PY_SSL_DEFAULT_CIPHERS == 2
-+/* Ignored in SSLContext constructor, only used to as _ssl.DEFAULT_CIPHER_STRING */
-+ #define PY_SSL_DEFAULT_CIPHER_STRING SSL_DEFAULT_CIPHER_LIST
-+#else
-+ #error "Unsupported PY_SSL_DEFAULT_CIPHERS"
-+#endif
-+
-
- enum py_ssl_error {
- /* these mirror ssl.h */
-@@ -2739,7 +2764,12 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
- /* A bare minimum cipher list without completely broken cipher suites.
- * It's far from perfect but gives users a better head start. */
- if (proto_version != PY_SSL_VERSION_SSL2) {
-- result = SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!eNULL:!MD5");
-+#if PY_SSL_DEFAULT_CIPHERS == 2
-+ /* stick to OpenSSL's default settings */
-+ result = 1;
-+#else
-+ result = SSL_CTX_set_cipher_list(ctx, PY_SSL_DEFAULT_CIPHER_STRING);
-+#endif
- } else {
- /* SSLv2 needs MD5 */
- result = SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!eNULL");
-@@ -5279,6 +5309,9 @@ PyInit__ssl(void)
- (PyObject *)&PySSLSession_Type) != 0)
- return NULL;
-
-+ PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS",
-+ PY_SSL_DEFAULT_CIPHER_STRING);
-+
- PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
- PY_SSL_ERROR_ZERO_RETURN);
- PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
-diff --git a/configure.ac b/configure.ac
-index 7ea62f8..4b42393 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -5555,6 +5555,42 @@ if test "$have_getrandom" = yes; then
- [Define to 1 if the getrandom() function is available])
- fi
-
-+# ssl module default cipher suite string
-+AH_TEMPLATE(PY_SSL_DEFAULT_CIPHERS,
-+ [Default cipher suites list for ssl module.
-+ 1: Python's preferred selection, 2: leave OpenSSL defaults untouched, 0: custom
string])
-+AH_TEMPLATE(PY_SSL_DEFAULT_CIPHER_STRING,
-+ [Cipher suite string for PY_SSL_DEFAULT_CIPHERS=0]
-+)
-+AC_MSG_CHECKING(for --with-ssl-default-suites)
-+AC_ARG_WITH(ssl-default-suites,
-+
AS_HELP_STRING([--with-ssl-default-suites=@<:@python|openssl|STRING@:>@],
-+ [Override default cipher suites string,
-+ python: use Python's preferred selection (default),
-+ openssl: leave OpenSSL's defaults untouched,
-+ STRING: use a custom string,
-+ PROTOCOL_SSLv2 ignores the setting]),
-+[
-+AC_MSG_RESULT($withval)
-+case "$withval" in
-+ python)
-+ AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 1)
-+ ;;
-+ openssl)
-+ AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 2)
-+ ;;
-+ *)
-+ AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 0)
-+ AC_DEFINE_UNQUOTED(PY_SSL_DEFAULT_CIPHER_STRING, "$withval")
-+ ;;
-+esac
-+],
-+[
-+AC_MSG_RESULT(python)
-+AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 1)
-+])
-+
-+
- # generate output files
- AC_CONFIG_FILES(Makefile.pre Modules/Setup.config Misc/python.pc Misc/python-config.sh)
- AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix])
diff --git a/00301-pathfix-add-n-option-for-no-backup.patch
b/00301-pathfix-add-n-option-for-no-backup.patch
deleted file mode 100644
index 350fe97..0000000
--- a/00301-pathfix-add-n-option-for-no-backup.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From 5affd5c29eb1493cb31ef3cfdde15538ac134689 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
-Date: Tue, 13 Mar 2018 10:56:43 +0100
-Subject: [PATCH] bpo-32885: Tools/scripts/pathfix.py: Add -n option for no
- backup~ (#5772)
-
-Creating backup files with ~ suffix can be undesirable in some environment,
-such as when building RPM packages. Instead of requiring the user to remove
-those files manually, option -n was added, that simply disables this feature.
-
--n was selected because 2to3 has the same option with this behavior.
----
- Misc/ACKS | 1 +
- .../2018-02-20-12-16-47.bpo-32885.dL5x7C.rst | 2 ++
- Tools/scripts/pathfix.py | 28 +++++++++++++++-------
- 3 files changed, 23 insertions(+), 8 deletions(-)
- create mode 100644
Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
-
-diff --git a/Misc/ACKS b/Misc/ACKS
-index d8179c8b03ab..d752d8a35434 100644
---- a/Misc/ACKS
-+++ b/Misc/ACKS
-@@ -687,6 +687,7 @@ Ken Howard
- Brad Howes
- Mike Hoy
- Ben Hoyt
-+Miro Hronok
- Chiu-Hsiang Hsu
- Chih-Hao Huang
- Christian Hudon
-diff --git a/Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
b/Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
-new file mode 100644
-index 000000000000..e003e1d84fd0
---- /dev/null
-+++ b/Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
-@@ -0,0 +1,2 @@
-+Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disbale automatic
-+backup creation (files with ``~`` suffix).
-diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py
-index 562bbc737812..c5bf984306a3 100755
---- a/Tools/scripts/pathfix.py
-+++ b/Tools/scripts/pathfix.py
-@@ -7,8 +7,9 @@
- # Directories are searched recursively for files whose name looks
- # like a python module.
- # Symbolic links are always ignored (except as explicit directory
--# arguments). Of course, the original file is kept as a back-up
--# (with a "~" attached to its name).
-+# arguments).
-+# The original file is kept as a back-up (with a "~" attached to its name),
-+# -n flag can be used to disable this.
- #
- # Undoubtedly you can do this using find and sed or perl, but this is
- # a nice example of Python code that recurses down a directory tree
-@@ -31,14 +32,17 @@
-
- new_interpreter = None
- preserve_timestamps = False
-+create_backup = True
-+
-
- def main():
- global new_interpreter
- global preserve_timestamps
-- usage = ('usage: %s -i /interpreter -p file-or-directory ...\n' %
-+ global create_backup
-+ usage = ('usage: %s -i /interpreter -p -n file-or-directory ...\n' %
- sys.argv[0])
- try:
-- opts, args = getopt.getopt(sys.argv[1:], 'i:p')
-+ opts, args = getopt.getopt(sys.argv[1:], 'i:pn')
- except getopt.error as msg:
- err(str(msg) + '\n')
- err(usage)
-@@ -48,6 +52,8 @@ def main():
- new_interpreter = a.encode()
- if o == '-p':
- preserve_timestamps = True
-+ if o == '-n':
-+ create_backup = False
- if not new_interpreter or not new_interpreter.startswith(b'/') or \
- not args:
- err('-i option or file-or-directory missing\n')
-@@ -134,10 +140,16 @@ def fix(filename):
- except OSError as msg:
- err('%s: warning: chmod failed (%r)\n' % (tempname, msg))
- # Then make a backup of the original file as filename~
-- try:
-- os.rename(filename, filename + '~')
-- except OSError as msg:
-- err('%s: warning: backup failed (%r)\n' % (filename, msg))
-+ if create_backup:
-+ try:
-+ os.rename(filename, filename + '~')
-+ except OSError as msg:
-+ err('%s: warning: backup failed (%r)\n' % (filename, msg))
-+ else:
-+ try:
-+ os.remove(filename)
-+ except OSError as msg:
-+ err('%s: warning: removing failed (%r)\n' % (filename, msg))
- # Now move the temp file to the original file
- try:
- os.rename(tempname, filename)
diff --git a/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
b/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
deleted file mode 100644
index 965792a..0000000
--- a/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From a3febe3cba14b89885f42ca2f0224096a52885f6 Mon Sep 17 00:00:00 2001
-From: Antoine Pitrou <antoine(a)python.org>
-Date: Mon, 23 Apr 2018 13:19:42 +0200
-Subject: [PATCH] bpo-33329: Fix multiprocessing regression on newer glibcs
-
-Starting with glibc 2.27.9000-xxx, sigaddset() can return EINVAL for some
-reserved signal numbers between 1 and NSIG. The `range(1, NSIG)` idiom
-is commonly used to select all signals for blocking with `pthread_sigmask`.
-So we ignore the sigaddset() return value until we expose sigfillset()
-to provide a better idiom.
----
- .../next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst | 1 +
- Modules/signalmodule.c | 14 ++++++++------
- 2 files changed, 9 insertions(+), 6 deletions(-)
- create mode 100644 Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
-
-diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
-new file mode 100644
-index 000000000000..d1a4e56d04b9
---- /dev/null
-+++ b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
-@@ -0,0 +1 @@
-+Fix multiprocessing regression on newer glibcs
-diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
-index 791616014384..35fd87e2d1e7 100644
---- a/Modules/signalmodule.c
-+++ b/Modules/signalmodule.c
-@@ -819,7 +819,6 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
- int result = -1;
- PyObject *iterator, *item;
- long signum;
-- int err;
-
- sigemptyset(mask);
-
-@@ -841,11 +840,14 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
- Py_DECREF(item);
- if (signum == -1 && PyErr_Occurred())
- goto error;
-- if (0 < signum && signum < NSIG)
-- err = sigaddset(mask, (int)signum);
-- else
-- err = 1;
-- if (err) {
-+ if (0 < signum && signum < NSIG) {
-+ /* bpo-33329: ignore sigaddset() return value as it can fail
-+ * for some reserved signals, but we want the `range(1, NSIG)`
-+ * idiom to allow selecting all valid signals.
-+ */
-+ (void) sigaddset(mask, (int)signum);
-+ }
-+ else {
- PyErr_Format(PyExc_ValueError,
- "signal number %ld out of range", signum);
- goto error;
diff --git a/python3.spec b/python3.spec
index 7472a57..6ba9805 100644
--- a/python3.spec
+++ b/python3.spec
@@ -300,12 +300,6 @@ Patch251: 00251-change-user-install-location.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00291 #
-# Build fails with undefined references to dlopen / dlsym otherwise.
-# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
-# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
-Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
-
# 00312 #
# Revert "bpo-6721: Hold logging locks across fork() 3b699932e5ac3e7
# This is a TEMPORARY WORKAROUND for an urgent Fedora bug
@@ -659,7 +653,6 @@ rm Lib/ensurepip/_bundled/*.whl
%patch205 -p1
%patch251 -p1
%patch274 -p1
-%patch291 -p1
%patch312 -p1
%patch313 -p1
%patch315 -p1
commit 1092d478f540ba9d510316205eca201e5c5d07e9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Dec 7 10:03:24 2018 +0100
Make sure we don't ship any exe files (not needed an prebuilt)
Such files are only used to create Microsoft Windows installers
and that functionality is broken on Linux anyway.
We can keep the exe files in SRPM, as they are free software as
confirmed by the Python Software Foundation:
Hello,
Shipping and distributing these files is ok.
These files are stubs, used as the executable part of a self-unzipping
executable and showing an "installer window" to the user.
They are original to Python and, while they call win32 functions,
they don't have Windows SDK code in them.
The source is at: PC/bdist_wininst/install.c
The binaries are included so that anyone creating a bdist_wininst
distribution (mostly deprecated, actually) can do so, even when
cross-compiling.
Thanks,
Van (Lindberg)
See also
https://mail.python.org/pipermail/python-dev/2018-October/155507.html
diff --git a/python3.spec b/python3.spec
index bb020fa..7472a57 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.1
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
@@ -627,6 +627,10 @@ version once Python %{pybasever} is stable.
%prep
%setup -q -n Python-%{version}%{?prerel}
+# Remove all exe files to ensure we are not shipping prebuilt binaries
+# note that those are only used to create Microsoft Windows installers
+# and that functionality is broken on Linux anyway
+find -name '*.exe' -print -delete
# Remove bundled libraries to ensure that we're using the system copy.
rm -r Modules/expat
@@ -1283,7 +1287,6 @@ CheckPython optimized
%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/distutils/README
%{pylibdir}/distutils/command
-%exclude %{pylibdir}/distutils/command/wininst-*.exe
%dir %{pylibdir}/email/
%dir %{pylibdir}/email/__pycache__/
@@ -1353,7 +1356,6 @@ CheckPython optimized
%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%endif
-%{pylibdir}/distutils/command/wininst-*.exe
%{_includedir}/python%{LDVERSION_optimized}/*.h
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
@@ -1575,6 +1577,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Dec 07 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-5
+- Make sure we don't ship any exe files (not needed an prebuilt)
+
* Wed Nov 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-4
- Make sure the entire test.support module is in python3-libs (#1651245)
commit 5258d1d1943c5f416fe693cc8f5c740e514c6f35
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Dec 10 17:29:57 2018 +0100
Run the testsuite in parallel, --findleaks runs in the CI
diff --git a/python3.spec b/python3.spec
index e194ab2..bb020fa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1066,7 +1066,7 @@ CheckPython() {
# @unittest._expectedFailureInRpmBuild
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- -wW --slowest --findleaks \
+ -wW --slowest -j0 \
-x test_distutils \
-x test_bdist_rpm \
-x test_gdb \
commit bc8629686948c26706c634b14edb0265bacb3449
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Nov 14 16:34:36 2018 +0100
Run the selftest suite on Fedora CI
diff --git a/tests/tests.yml b/tests/tests.yml
index 2e14ca0..d26ece2 100644
--- a/tests/tests.yml
+++ b/tests/tests.yml
@@ -11,7 +11,17 @@
- smoke:
dir: python/smoke
run: VERSION=3.7 ./venv.sh
+ - selftest:
+ dir: python/selftest
+ run: VERSION=3.7 X="-x test_socket -x test_asyncgen -x test_asyncio -x
test_compile -x test_concurrent_futures -x test_itertools -x test_multiprocessing_fork -x
test_multiprocessing_forkserver -x test_shutil -x test_time -x test_multiprocessing_spawn
-x test_threading -x test_wsgiref" ./parallel.sh
+ - findleaks:
+ dir: python/selftest
+ run: VERSION=3.7 X="-x test_socket -x test_asyncgen -x test_asyncio -x
test_compile -x test_concurrent_futures -x test_itertools -x test_multiprocessing_fork -x
test_multiprocessing_forkserver -x test_shutil -x test_time -x test_multiprocessing_spawn
-x test_threading -x test_wsgiref" ./findleaks.sh
required_packages:
- - gcc
- - python3-tox
- - python3-devel
+ - gcc # for extension building in venv and selftest
+ - python3-debug # for leak testing
+ - python3-devel # for extension building in venv and selftest
+ - python3-tkinter # for selftest
+ - python3-test # for selftest
+ - python3-tox # for venv tests
+ - glibc-all-langpacks # for locale tests
commit 7be8eebca61f0afeaa2065b4a4e25dd21dffa249
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Tue Dec 18 11:27:06 2018 +0100
Require glibc-all-langpacks to test locales
Python 3 test suite requires various locales. Install all of them to
build the package to make sure that no test is skipped because of a
missing locale.
diff --git a/python3.spec b/python3.spec
index 2890caa..e194ab2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -152,6 +152,7 @@ BuildRequires: gcc-c++
%if %{with gdbm}
BuildRequires: gdbm-devel >= 1:1.13
%endif
+BuildRequires: glibc-all-langpacks
BuildRequires: glibc-devel
BuildRequires: gmp-devel
BuildRequires: libappstream-glib
commit 4f22584498d101092afb723fde527159a1cf22aa
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Nov 27 13:36:14 2018 +0100
Fix mktime() error in test_email
http://bugs.python.org/issue35317
https://bugzilla.redhat.com/show_bug.cgi?id=1652843
diff --git a/00315-test_email-mktime.patch b/00315-test_email-mktime.patch
new file mode 100644
index 0000000..aacdcd6
--- /dev/null
+++ b/00315-test_email-mktime.patch
@@ -0,0 +1,46 @@
+From 0165caf04ef9c615c8b86dd16f7c201ca7a0befa Mon Sep 17 00:00:00 2001
+From: Victor Stinner <vstinner(a)redhat.com>
+Date: Tue, 27 Nov 2018 12:40:50 +0100
+Subject: [PATCH] bpo-35317: Fix mktime() error in test_email (GH-10721)
+
+Fix mktime() overflow error in test_email: run
+test_localtime_daylight_true_dst_true() and
+test_localtime_daylight_false_dst_true() with a specific timezone.
+(cherry picked from commit cfaafda8e3e19764682abb4bd4c574accb784c42)
+
+Co-authored-by: Victor Stinner <vstinner(a)redhat.com>
+---
+ Lib/test/test_email/test_utils.py | 2 ++
+ .../NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst | 3 +++
+ 2 files changed, 5 insertions(+)
+ create mode 100644 Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
+
+diff --git a/Lib/test/test_email/test_utils.py b/Lib/test/test_email/test_utils.py
+index 6dcb3bbe7aab..4e3c3f3a195f 100644
+--- a/Lib/test/test_email/test_utils.py
++++ b/Lib/test/test_email/test_utils.py
+@@ -75,6 +75,7 @@ def test_localtime_daylight_false_dst_false(self):
+ t2 = utils.localtime(t1)
+ self.assertEqual(t1, t2)
+
++ @test.support.run_with_tz('Europe/Minsk')
+ def test_localtime_daylight_true_dst_true(self):
+ test.support.patch(self, time, 'daylight', True)
+ t0 = datetime.datetime(2012, 3, 12, 1, 1)
+@@ -82,6 +83,7 @@ def test_localtime_daylight_true_dst_true(self):
+ t2 = utils.localtime(t1)
+ self.assertEqual(t1, t2)
+
++ @test.support.run_with_tz('Europe/Minsk')
+ def test_localtime_daylight_false_dst_true(self):
+ test.support.patch(self, time, 'daylight', False)
+ t0 = datetime.datetime(2012, 3, 12, 1, 1)
+diff --git a/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
b/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
+new file mode 100644
+index 000000000000..73a30f71927f
+--- /dev/null
++++ b/Misc/NEWS.d/next/Tests/2018-11-26-16-54-21.bpo-35317.jByGP2.rst
+@@ -0,0 +1,3 @@
++Fix ``mktime()`` overflow error in ``test_email``: run
++``test_localtime_daylight_true_dst_true()`` and
++``test_localtime_daylight_false_dst_true()`` with a specific timezone.
diff --git a/python3.spec b/python3.spec
index 7444132..2890caa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -318,6 +318,12 @@ Patch312: 00312-revert-bpo-6721.patch
#
https://bugzilla.redhat.com/show_bug.cgi?id=1160640
Patch313: 00313-cprofile-sort-option.patch
+# 00315 #
+# Fix mktime() error in test_email
+#
http://bugs.python.org/issue35317
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1652843
+Patch315: 00315-test_email-mktime.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -651,6 +657,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch291 -p1
%patch312 -p1
%patch313 -p1
+%patch315 -p1
# Remove files that should be generated by the build
commit e21e6a6b22570e4027047076a268481ad1436dd9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Nov 26 15:52:56 2018 +0100
Show test.pythoninfo, helpful for debugging test failures
diff --git a/python3.spec b/python3.spec
index 9c638c8..7444132 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1049,6 +1049,9 @@ CheckPython() {
# Note that we're running the tests using the version of the code in the
# builddir, not in the buildroot.
+ # Show some info, helpful for debugging test failures
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.pythoninfo
+
# Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
commit 31d96372deeb66e3a6b061f075cf70fdd3205966
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Nov 19 15:55:55 2018 +0100
Make sure the entire test.support module is in python3-libs (#1651245)
diff --git a/python3.spec b/python3.spec
index 2cbf972..9c638c8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
@@ -540,6 +540,7 @@ the Python programming language.
%package test
Summary: The self-test suite for the main python3 package
Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
# Shall be removed in Fedora 31
Obsoletes: platform-python-test < %{platpyver}
@@ -1145,14 +1146,19 @@ CheckPython optimized
%{pylibdir}/ensurepip/_bundled/*.whl
%endif
+# The majority of the test module lives in the test subpackage
+# However test.support is in libs - it contains stuff used when testing your code
+#
https://bugzilla.redhat.com/show_bug.cgi?id=596258
+%if %{without flatpackage}
%dir %{pylibdir}/test/
%dir %{pylibdir}/test/__pycache__/
%dir %{pylibdir}/test/support/
%dir %{pylibdir}/test/support/__pycache__/
%{pylibdir}/test/__init__.py
%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%{pylibdir}/test/support/__init__.py
-%{pylibdir}/test/support/__pycache__/__init__%{bytecode_suffixes}
+%{pylibdir}/test/support/*.py
+%{pylibdir}/test/support/__pycache__/*%{bytecode_suffixes}
+%endif
%dir %{pylibdir}/concurrent/
%dir %{pylibdir}/concurrent/__pycache__/
@@ -1410,6 +1416,15 @@ CheckPython optimized
%{pylibdir}/tkinter/test
%{pylibdir}/unittest/test
+# stuff already owned by the libs subpackage
+# test requires libs, so we are safe not owning those dirs
+%if %{without flatpackage}
+%exclude %dir %{pylibdir}/test/
+%exclude %dir %{pylibdir}/test/__pycache__/
+%exclude %{pylibdir}/test/__init__.py
+%exclude %{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%exclude %{pylibdir}/test/support/
+%endif
# We don't bother splitting the debug build out into further subpackages:
# if you need it, you're probably a developer.
@@ -1549,6 +1564,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Nov 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-4
+- Make sure the entire test.support module is in python3-libs (#1651245)
+
* Tue Nov 06 2018 Victor Stinner <vstinner(a)redhat.com> - 3.7.1-3
- Verify the value of '-s' when execute the CLI of cProfile (rhbz#1160640)
commit a4e394925c249b7afd150fe2a6c7c77a3702f1b7
Author: Victor Stinner <vstinner(a)redhat.com>
Date: Wed Nov 7 00:37:34 2018 +0100
Verify the value of '-s' when execute the CLI of cProfile
Resolves: rhbz#1160640
diff --git a/00313-cprofile-sort-option.patch b/00313-cprofile-sort-option.patch
new file mode 100644
index 0000000..fe427e5
--- /dev/null
+++ b/00313-cprofile-sort-option.patch
@@ -0,0 +1,61 @@
+commit c36e8721f276e7cc09cecdb9c04783630f0ba82a
+Author: Victor Stinner <vstinner(a)redhat.com>
+Date: Wed Nov 7 00:34:22 2018 +0100
+
+ bpo-23420: Verify the value of '-s' when execute the CLI of cProfile
+
+ Verify the value for the parameter '-s' of the cProfile CLI. Patch by Robert
+ Kuska.
+
+ Resolves: rhbz#1160640
+
+diff --git a/Lib/cProfile.py b/Lib/cProfile.py
+index c044be8..f6e423b 100755
+--- a/Lib/cProfile.py
++++ b/Lib/cProfile.py
+@@ -124,6 +124,7 @@ def main():
+ import os
+ import sys
+ import runpy
++ import pstats
+ from optparse import OptionParser
+ usage = "cProfile.py [-o output_file_path] [-s sort] [-m module | scriptfile]
[arg] ..."
+ parser = OptionParser(usage=usage)
+@@ -132,7 +133,8 @@ def main():
+ help="Save stats to <outfile>", default=None)
+ parser.add_option('-s', '--sort', dest="sort",
+ help="Sort order when printing to stdout, based on pstats.Stats
class",
+- default=-1)
++ default=-1,
++ choices=sorted(pstats.Stats.sort_arg_dict_default))
+ parser.add_option('-m', dest="module",
action="store_true",
+ help="Profile a library module", default=False)
+
+diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
+index 1430d22..5c4ec5b 100644
+--- a/Lib/test/test_cprofile.py
++++ b/Lib/test/test_cprofile.py
+@@ -2,6 +2,7 @@
+
+ import sys
+ from test.support import run_unittest, TESTFN, unlink
++import unittest
+
+ # rip off all interesting stuff from test_profile
+ import cProfile
+@@ -50,8 +51,14 @@ class CProfileTest(ProfileTest):
+ assert_python_ok('-m', 'cProfile', '-m',
'timeit', '-n', '1')
+
+
++class TestCommandLine(unittest.TestCase):
++ def test_sort(self):
++ rc, out, err = assert_python_failure('-m', 'cProfile',
'-s', 'demo')
++ self.assertGreater(rc, 0)
++ self.assertIn(b"option -s: invalid choice: 'demo'", err)
++
+ def test_main():
+- run_unittest(CProfileTest)
++ run_unittest(CProfileTest, TestCommandLine)
+
+ def main():
+ if '-r' not in sys.argv:
diff --git a/python3.spec b/python3.spec
index dffcbdc..2cbf972 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.1
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
@@ -312,6 +312,12 @@ Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1644936
Patch312: 00312-revert-bpo-6721.patch
+# 00313 #
+# Verify the value of '-s' when execute the CLI of cProfile
+#
http://bugs.python.org/issue23420
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1160640
+Patch313: 00313-cprofile-sort-option.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -643,6 +649,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch274 -p1
%patch291 -p1
%patch312 -p1
+%patch313 -p1
# Remove files that should be generated by the build
@@ -1542,6 +1549,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue Nov 06 2018 Victor Stinner <vstinner(a)redhat.com> - 3.7.1-3
+- Verify the value of '-s' when execute the CLI of cProfile (rhbz#1160640)
+
* Sun Nov 04 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-2
- Temporarily revert upstream commit 3b699932e5ac3e7
- This is dirty workaround for (#1644936)
commit 72bc3f43c46b8142b42e0ef82a48c7f78f0714d0
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sun Nov 4 19:26:46 2018 +0100
Temporarily revert upstream commit 3b699932e5ac3e7
This is dirty workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1644936
diff --git a/00312-revert-bpo-6721.patch b/00312-revert-bpo-6721.patch
new file mode 100644
index 0000000..c3350bf
--- /dev/null
+++ b/00312-revert-bpo-6721.patch
@@ -0,0 +1,168 @@
+From 583bb07116505dcc73c0fc4aa3c1cf5074f3522d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
+Date: Fri, 2 Nov 2018 14:01:28 +0100
+Subject: [PATCH] Revert "bpo-6721: Hold logging locks across fork() (GH-4071)
+ (#9291)"
+
+This reverts commit 3b699932e5ac3e76031bbb6d700fbea07492641d.
+---
+ Lib/logging/__init__.py | 50 ------------------------------
+ Lib/test/test_logging.py | 67 ----------------------------------------
+ 2 files changed, 117 deletions(-)
+
+diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
+index 3ad2cc38f6..53780cd600 100644
+--- a/Lib/logging/__init__.py
++++ b/Lib/logging/__init__.py
+@@ -225,55 +225,6 @@ def _releaseLock():
+ if _lock:
+ _lock.release()
+
+-
+-# Prevent a held logging lock from blocking a child from logging.
+-
+-if not hasattr(os, 'register_at_fork'): # Windows and friends.
+- def _register_at_fork_acquire_release(instance):
+- pass # no-op when os.register_at_fork does not exist.
+-else: # The os.register_at_fork API exists
+- os.register_at_fork(before=_acquireLock,
+- after_in_child=_releaseLock,
+- after_in_parent=_releaseLock)
+-
+- # A collection of instances with acquire and release methods (logging.Handler)
+- # to be called before and after fork. The weakref avoids us keeping discarded
+- # Handler instances alive forever in case an odd program creates and destroys
+- # many over its lifetime.
+- _at_fork_acquire_release_weakset = weakref.WeakSet()
+-
+-
+- def _register_at_fork_acquire_release(instance):
+- # We put the instance itself in a single WeakSet as we MUST have only
+- # one atomic weak ref. used by both before and after atfork calls to
+- # guarantee matched pairs of acquire and release calls.
+- _at_fork_acquire_release_weakset.add(instance)
+-
+-
+- def _at_fork_weak_calls(method_name):
+- for instance in _at_fork_acquire_release_weakset:
+- method = getattr(instance, method_name)
+- try:
+- method()
+- except Exception as err:
+- # Similar to what PyErr_WriteUnraisable does.
+- print("Ignoring exception from logging atfork", instance,
+- method_name, "method:", err, file=sys.stderr)
+-
+-
+- def _before_at_fork_weak_calls():
+- _at_fork_weak_calls('acquire')
+-
+-
+- def _after_at_fork_weak_calls():
+- _at_fork_weak_calls('release')
+-
+-
+- os.register_at_fork(before=_before_at_fork_weak_calls,
+- after_in_child=_after_at_fork_weak_calls,
+- after_in_parent=_after_at_fork_weak_calls)
+-
+-
+ #---------------------------------------------------------------------------
+ # The logging record
+ #---------------------------------------------------------------------------
+@@ -844,7 +795,6 @@ class Handler(Filterer):
+ Acquire a thread lock for serializing access to the underlying I/O.
+ """
+ self.lock = threading.RLock()
+- _register_at_fork_acquire_release(self)
+
+ def acquire(self):
+ """
+diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
+index 1ea2967f5b..5d5eba7357 100644
+--- a/Lib/test/test_logging.py
++++ b/Lib/test/test_logging.py
+@@ -35,7 +35,6 @@ import os
+ import queue
+ import random
+ import re
+-import signal
+ import socket
+ import struct
+ import sys
+@@ -667,72 +666,6 @@ class HandlerTest(BaseTest):
+ if os.path.exists(fn):
+ os.unlink(fn)
+
+- # The implementation relies on os.register_at_fork existing, but we test
+- # based on os.fork existing because that is what users and this test use.
+- # This helps ensure that when fork exists (the important concept) that the
+- # register_at_fork mechanism is also present and used.
+- @unittest.skipIf(not hasattr(os, 'fork'), 'Test requires
os.fork().')
+- def test_post_fork_child_no_deadlock(self):
+- """Ensure forked child logging locks are not held;
bpo-6721."""
+- refed_h = logging.Handler()
+- refed_h.name = 'because we need at least one for this test'
+- self.assertGreater(len(logging._handlers), 0)
+-
+- locks_held__ready_to_fork = threading.Event()
+- fork_happened__release_locks_and_end_thread = threading.Event()
+-
+- def lock_holder_thread_fn():
+- logging._acquireLock()
+- try:
+- refed_h.acquire()
+- try:
+- # Tell the main thread to do the fork.
+- locks_held__ready_to_fork.set()
+-
+- # If the deadlock bug exists, the fork will happen
+- # without dealing with the locks we hold, deadlocking
+- # the child.
+-
+- # Wait for a successful fork or an unreasonable amount of
+- # time before releasing our locks. To avoid a timing based
+- # test we'd need communication from os.fork() as to when it
+- # has actually happened. Given this is a regression test
+- # for a fixed issue, potentially less reliably detecting
+- # regression via timing is acceptable for simplicity.
+- # The test will always take at least this long. :(
+- fork_happened__release_locks_and_end_thread.wait(0.5)
+- finally:
+- refed_h.release()
+- finally:
+- logging._releaseLock()
+-
+- lock_holder_thread = threading.Thread(
+- target=lock_holder_thread_fn,
+- name='test_post_fork_child_no_deadlock lock holder')
+- lock_holder_thread.start()
+-
+- locks_held__ready_to_fork.wait()
+- pid = os.fork()
+- if pid == 0: # Child.
+- logging.error(r'Child process did not deadlock. \o/')
+- os._exit(0)
+- else: # Parent.
+- fork_happened__release_locks_and_end_thread.set()
+- lock_holder_thread.join()
+- start_time = time.monotonic()
+- while True:
+- waited_pid, status = os.waitpid(pid, os.WNOHANG)
+- if waited_pid == pid:
+- break # child process exited.
+- if time.monotonic() - start_time > 7:
+- break # so long? implies child deadlock.
+- time.sleep(0.05)
+- if waited_pid != pid:
+- os.kill(pid, signal.SIGKILL)
+- waited_pid, status = os.waitpid(pid, 0)
+- self.fail("child process deadlocked.")
+- self.assertEqual(status, 0, msg="child process error")
+-
+
+ class BadStream(object):
+ def write(self, data):
+--
+2.19.1
+
diff --git a/python3.spec b/python3.spec
index 2e2ee57..dffcbdc 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.1
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -305,6 +305,13 @@ Patch274: 00274-fix-arch-names.patch
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
+# 00312 #
+# Revert "bpo-6721: Hold logging locks across fork() 3b699932e5ac3e7
+# This is a TEMPORARY WORKAROUND for an urgent Fedora bug
+# TODO Investigate properly and get a real fix (here or in anaconda)!
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1644936
+Patch312: 00312-revert-bpo-6721.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -635,6 +642,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
%patch291 -p1
+%patch312 -p1
# Remove files that should be generated by the build
@@ -1534,6 +1542,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Sun Nov 04 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-2
+- Temporarily revert upstream commit 3b699932e5ac3e7
+- This is dirty workaround for (#1644936)
+
* Mon Oct 22 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-1
- Update to 3.7.1
commit d533a32456480f7e57a05f03f03bf1887c9f4a80
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Oct 1 16:05:20 2018 +0200
Update to 3.7.1
Removed patches due to being upstreamed: 307, 308
Rebased patches: 170
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
index c37e69c..fb3ad85 100644
--- a/00170-gc-assertions.patch
+++ b/00170-gc-assertions.patch
@@ -53,15 +53,16 @@ index c772dea..5729797 100644
}
#endif
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
-index 904fc7d..288e242 100644
+index 8d806db..dc8bb16 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
-@@ -1,10 +1,11 @@
+@@ -1,10 +1,12 @@
import unittest
from test.support import (verbose, refcount_test, run_unittest,
strip_python_stderr, cpython_only, start_threads,
-- temp_dir, requires_type_collecting)
-+ temp_dir, import_module, requires_type_collecting)
+- temp_dir, requires_type_collecting, TESTFN, unlink)
++ temp_dir, requires_type_collecting, TESTFN, unlink,
++ import_module)
from test.support.script_helper import assert_python_ok, make_script
import sys
@@ -69,7 +70,7 @@ index 904fc7d..288e242 100644
import time
import gc
import weakref
-@@ -46,6 +47,8 @@ class GC_Detector(object):
+@@ -46,6 +48,8 @@ class GC_Detector(object):
# gc collects it.
self.wr = weakref.ref(C1055820(666), it_happened)
@@ -78,7 +79,7 @@ index 904fc7d..288e242 100644
@with_tp_del
class Uncollectable(object):
"""Create a reference cycle with multiple __del__ methods.
-@@ -863,6 +866,50 @@ class GCCallbackTests(unittest.TestCase):
+@@ -878,6 +882,50 @@ class GCCallbackTests(unittest.TestCase):
self.assertEqual(len(gc.garbage), 0)
@@ -130,7 +131,7 @@ index 904fc7d..288e242 100644
def setUp(self):
gc.enable()
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
-index 8ba1093..e795308 100644
+index 4d701cb..388dd78 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -239,7 +239,8 @@ update_refs(PyGC_Head *containers)
@@ -251,7 +252,7 @@ index 8ba1093..e795308 100644
/* copy-paste of weakrefobject.c's handle_callback() */
temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
-@@ -720,12 +726,14 @@ check_garbage(PyGC_Head *collectable)
+@@ -717,12 +723,14 @@ check_garbage(PyGC_Head *collectable)
for (gc = collectable->gc.gc_next; gc != collectable;
gc = gc->gc.gc_next) {
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
diff --git a/00307-allow-to-call-Py_Main-after-Py_Initialize.patch
b/00307-allow-to-call-Py_Main-after-Py_Initialize.patch
deleted file mode 100644
index d9c0486..0000000
--- a/00307-allow-to-call-Py_Main-after-Py_Initialize.patch
+++ /dev/null
@@ -1,150 +0,0 @@
-From bbd6fc7e77dbd33ae7d3670eaf7800b5d3ff42d3 Mon Sep 17 00:00:00 2001
-From: Victor Stinner <vstinner(a)redhat.com>
-Date: Fri, 20 Jul 2018 17:34:23 +0200
-Subject: [PATCH] bpo-34008: Allow to call Py_Main() after Py_Initialize()
- (GH-8043)
-
-Py_Main() can again be called after Py_Initialize(), as in Python
-3.6. The new configuration is ignored, except of
-_PyMainInterpreterConfig.argv which is used to update sys.argv.
-(cherry picked from commit fb47bca9ee2d07ce96df94b4e4abafd11826eb01)
-
-Co-authored-by: Victor Stinner <vstinner(a)redhat.com>
----
- Lib/test/test_embed.py | 8 ++++++++
- .../C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst | 1 +
- Modules/main.c | 10 +++++++---
- Programs/_testembed.c | 16 +++++++++++++++
- Python/pylifecycle.c | 23 +++++++++++++++++++---
- 5 files changed, 52 insertions(+), 6 deletions(-)
- create mode 100644 Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
-
-diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
-index f3b60433ccc1..024c3f99a85d 100644
---- a/Lib/test/test_embed.py
-+++ b/Lib/test/test_embed.py
-@@ -238,6 +238,14 @@ def test_initialize_twice(self):
- self.assertEqual(out, '')
- self.assertEqual(err, '')
-
-+ def test_initialize_pymain(self):
-+ """
-+ bpo-34008: Calling Py_Main() after Py_Initialize() must not fail.
-+ """
-+ out, err = self.run_embedded_interpreter("initialize_pymain")
-+ self.assertEqual(out.rstrip(), "Py_Main() after Py_Initialize:
sys.argv=['-c', 'arg2']")
-+ self.assertEqual(err, '')
-+
-
- if __name__ == "__main__":
- unittest.main()
-diff --git a/Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
b/Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
-new file mode 100644
-index 000000000000..d9881b9945df
---- /dev/null
-+++ b/Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
-@@ -0,0 +1 @@
-+Py_Main() can again be called after Py_Initialize(), as in Python 3.6.
-diff --git a/Modules/main.c b/Modules/main.c
-index 3809fa4abef5..31ebbceb83e0 100644
---- a/Modules/main.c
-+++ b/Modules/main.c
-@@ -2647,9 +2647,13 @@ pymain_main(_PyMain *pymain)
-
- pymain_init_stdio(pymain);
-
-- pymain->err = _Py_InitializeCore(&pymain->config);
-- if (_Py_INIT_FAILED(pymain->err)) {
-- _Py_FatalInitError(pymain->err);
-+ /* bpo-34008: For backward compatibility reasons, calling Py_Main() after
-+ Py_Initialize() ignores the new configuration. */
-+ if (!_PyRuntime.initialized) {
-+ pymain->err = _Py_InitializeCore(&pymain->config);
-+ if (_Py_INIT_FAILED(pymain->err)) {
-+ _Py_FatalInitError(pymain->err);
-+ }
- }
-
- if (pymain_init_python_main(pymain) < 0) {
-diff --git a/Programs/_testembed.c b/Programs/_testembed.c
-index b8827f074b9c..b1be682f7adc 100644
---- a/Programs/_testembed.c
-+++ b/Programs/_testembed.c
-@@ -276,6 +276,21 @@ static int test_initialize_twice(void)
- return 0;
- }
-
-+static int test_initialize_pymain(void)
-+{
-+ wchar_t *argv[] = {L"PYTHON", L"-c",
-+ L"import sys; print(f'Py_Main() after Py_Initialize:
sys.argv={sys.argv}')",
-+ L"arg2"};
-+ _testembed_Py_Initialize();
-+
-+ /* bpo-34008: Calling Py_Main() after Py_Initialize() must not crash */
-+ Py_Main(Py_ARRAY_LENGTH(argv), argv);
-+
-+ Py_Finalize();
-+
-+ return 0;
-+}
-+
-
- /* *********************************************************
- * List of test cases and the function that implements it.
-@@ -302,6 +317,7 @@ static struct TestCase TestCases[] = {
- { "pre_initialization_sys_options", test_pre_initialization_sys_options
},
- { "bpo20891", test_bpo20891 },
- { "initialize_twice", test_initialize_twice },
-+ { "initialize_pymain", test_initialize_pymain },
- { NULL, NULL }
- };
-
-diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index fdb759f480be..219a46558825 100644
---- a/Python/pylifecycle.c
-+++ b/Python/pylifecycle.c
-@@ -775,6 +775,22 @@ _Py_InitializeCore(const _PyCoreConfig *core_config)
- return _Py_INIT_OK();
- }
-
-+/* Py_Initialize() has already been called: update the main interpreter
-+ configuration. Example of bpo-34008: Py_Main() called after
-+ Py_Initialize(). */
-+static _PyInitError
-+_Py_ReconfigureMainInterpreter(PyInterpreterState *interp,
-+ const _PyMainInterpreterConfig *config)
-+{
-+ if (config->argv != NULL) {
-+ int res = PyDict_SetItemString(interp->sysdict, "argv",
config->argv);
-+ if (res < 0) {
-+ return _Py_INIT_ERR("fail to set sys.argv");
-+ }
-+ }
-+ return _Py_INIT_OK();
-+}
-+
- /* Update interpreter state based on supplied configuration settings
- *
- * After calling this function, most of the restrictions on the interpreter
-@@ -796,9 +812,6 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig
*config)
- if (!_PyRuntime.core_initialized) {
- return _Py_INIT_ERR("runtime core not initialized");
- }
-- if (_PyRuntime.initialized) {
-- return _Py_INIT_ERR("main interpreter already initialized");
-- }
-
- /* Get current thread state and interpreter pointer */
- tstate = PyThreadState_GET();
-@@ -813,6 +826,10 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig
*config)
- return _Py_INIT_ERR("failed to copy main interpreter config");
- }
-
-+ if (_PyRuntime.initialized) {
-+ return _Py_ReconfigureMainInterpreter(interp, config);
-+ }
-+
- if (interp->core_config._disable_importlib) {
- /* Special mode for freeze_importlib: run with no import system
- *
diff --git a/00308-tls-1.3.patch b/00308-tls-1.3.patch
deleted file mode 100644
index 7cd9e59..0000000
--- a/00308-tls-1.3.patch
+++ /dev/null
@@ -1,182 +0,0 @@
-diff --git a/Lib/test/dh1024.pem b/Lib/test/dh1024.pem
-deleted file mode 100644
-index a391176..0000000
---- a/Lib/test/dh1024.pem
-+++ /dev/null
-@@ -1,7 +0,0 @@
-------BEGIN DH PARAMETERS-----
--MIGHAoGBAIbzw1s9CT8SV5yv6L7esdAdZYZjPi3qWFs61CYTFFQnf2s/d09NYaJt
--rrvJhIzWavqnue71qXCf83/J3nz3FEwUU/L0mGyheVbsSHiI64wUo3u50wK5Igo0
--RNs/LD0irs7m0icZ//hijafTU+JOBiuA8zMI+oZfU7BGuc9XrUprAgEC
-------END DH PARAMETERS-----
--
--Generated with: openssl dhparam -out dh1024.pem 1024
-diff --git a/Lib/test/ffdh3072.pem b/Lib/test/ffdh3072.pem
-new file mode 100644
-index 0000000..ad69bac
---- /dev/null
-+++ b/Lib/test/ffdh3072.pem
-@@ -0,0 +1,41 @@
-+ DH Parameters: (3072 bit)
-+ prime:
-+ 00:ff:ff:ff:ff:ff:ff:ff:ff:ad:f8:54:58:a2:bb:
-+ 4a:9a:af:dc:56:20:27:3d:3c:f1:d8:b9:c5:83:ce:
-+ 2d:36:95:a9:e1:36:41:14:64:33:fb:cc:93:9d:ce:
-+ 24:9b:3e:f9:7d:2f:e3:63:63:0c:75:d8:f6:81:b2:
-+ 02:ae:c4:61:7a:d3:df:1e:d5:d5:fd:65:61:24:33:
-+ f5:1f:5f:06:6e:d0:85:63:65:55:3d:ed:1a:f3:b5:
-+ 57:13:5e:7f:57:c9:35:98:4f:0c:70:e0:e6:8b:77:
-+ e2:a6:89:da:f3:ef:e8:72:1d:f1:58:a1:36:ad:e7:
-+ 35:30:ac:ca:4f:48:3a:79:7a:bc:0a:b1:82:b3:24:
-+ fb:61:d1:08:a9:4b:b2:c8:e3:fb:b9:6a:da:b7:60:
-+ d7:f4:68:1d:4f:42:a3:de:39:4d:f4:ae:56:ed:e7:
-+ 63:72:bb:19:0b:07:a7:c8:ee:0a:6d:70:9e:02:fc:
-+ e1:cd:f7:e2:ec:c0:34:04:cd:28:34:2f:61:91:72:
-+ fe:9c:e9:85:83:ff:8e:4f:12:32:ee:f2:81:83:c3:
-+ fe:3b:1b:4c:6f:ad:73:3b:b5:fc:bc:2e:c2:20:05:
-+ c5:8e:f1:83:7d:16:83:b2:c6:f3:4a:26:c1:b2:ef:
-+ fa:88:6b:42:38:61:1f:cf:dc:de:35:5b:3b:65:19:
-+ 03:5b:bc:34:f4:de:f9:9c:02:38:61:b4:6f:c9:d6:
-+ e6:c9:07:7a:d9:1d:26:91:f7:f7:ee:59:8c:b0:fa:
-+ c1:86:d9:1c:ae:fe:13:09:85:13:92:70:b4:13:0c:
-+ 93:bc:43:79:44:f4:fd:44:52:e2:d7:4d:d3:64:f2:
-+ e2:1e:71:f5:4b:ff:5c:ae:82:ab:9c:9d:f6:9e:e8:
-+ 6d:2b:c5:22:36:3a:0d:ab:c5:21:97:9b:0d:ea:da:
-+ 1d:bf:9a:42:d5:c4:48:4e:0a:bc:d0:6b:fa:53:dd:
-+ ef:3c:1b:20:ee:3f:d5:9d:7c:25:e4:1d:2b:66:c6:
-+ 2e:37:ff:ff:ff:ff:ff:ff:ff:ff
-+ generator: 2 (0x2)
-+ recommended-private-length: 276 bits
-+-----BEGIN DH PARAMETERS-----
-+MIIBjAKCAYEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
-++8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
-+87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
-+YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
-+7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
-+ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3
-+7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32
-+nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZsYu
-+N///////////AgECAgIBFA==
-+-----END DH PARAMETERS-----
-diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
-index f9488a9..da8ba32 100644
---- a/Lib/test/test_ftplib.py
-+++ b/Lib/test/test_ftplib.py
-@@ -880,18 +880,23 @@ class TestTLS_FTPClass(TestCase):
- # clear text
- with self.client.transfercmd('list') as sock:
- self.assertNotIsInstance(sock, ssl.SSLSocket)
-+ self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii'))
- self.assertEqual(self.client.voidresp(), "226 transfer complete")
-
- # secured, after PROT P
- self.client.prot_p()
- with self.client.transfercmd('list') as sock:
- self.assertIsInstance(sock, ssl.SSLSocket)
-+ # consume from SSL socket to finalize handshake and avoid
-+ # "SSLError [SSL] shutdown while in init"
-+ self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii'))
- self.assertEqual(self.client.voidresp(), "226 transfer complete")
-
- # PROT C is issued, the connection must be in cleartext again
- self.client.prot_c()
- with self.client.transfercmd('list') as sock:
- self.assertNotIsInstance(sock, ssl.SSLSocket)
-+ self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii'))
- self.assertEqual(self.client.voidresp(), "226 transfer complete")
-
- def test_login(self):
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
-index 7bbaa9f..ea528b5 100644
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -55,7 +55,6 @@ CAPATH = data_file("capath")
- BYTES_CAPATH = os.fsencode(CAPATH)
- CAFILE_NEURONIO = data_file("capath", "4e1295a3.0")
- CAFILE_CACERT = data_file("capath", "5ed36f99.0")
--WRONG_CERT = data_file("wrongcert.pem")
-
- CERTFILE_INFO = {
- 'issuer': ((('countryName', 'XY'),),
-@@ -118,7 +117,7 @@ BADKEY = data_file("badkey.pem")
- NOKIACERT = data_file("nokia.pem")
- NULLBYTECERT = data_file("nullbytecert.pem")
-
--DHFILE = data_file("dh1024.pem")
-+DHFILE = data_file("ffdh3072.pem")
- BYTES_DHFILE = os.fsencode(DHFILE)
-
- # Not defined in all versions of OpenSSL
-@@ -2846,8 +2845,8 @@ class ThreadedTests(unittest.TestCase):
- connect to it with a wrong client certificate fails.
- """
- client_context, server_context, hostname = testing_context()
-- # load client cert
-- client_context.load_cert_chain(WRONG_CERT)
-+ # load client cert that is not signed by trusted CA
-+ client_context.load_cert_chain(CERTFILE)
- # require TLS client authentication
- server_context.verify_mode = ssl.CERT_REQUIRED
- # TLS 1.3 has different handshake
-@@ -2879,7 +2878,8 @@ class ThreadedTests(unittest.TestCase):
- @unittest.skipUnless(ssl.HAS_TLSv1_3, "Test needs TLS 1.3")
- def test_wrong_cert_tls13(self):
- client_context, server_context, hostname = testing_context()
-- client_context.load_cert_chain(WRONG_CERT)
-+ # load client cert that is not signed by trusted CA
-+ client_context.load_cert_chain(CERTFILE)
- server_context.verify_mode = ssl.CERT_REQUIRED
- server_context.minimum_version = ssl.TLSVersion.TLSv1_3
- client_context.minimum_version = ssl.TLSVersion.TLSv1_3
-diff --git a/Lib/test/wrongcert.pem b/Lib/test/wrongcert.pem
-deleted file mode 100644
-index 5f92f9b..0000000
---- a/Lib/test/wrongcert.pem
-+++ /dev/null
-@@ -1,32 +0,0 @@
-------BEGIN RSA PRIVATE KEY-----
--MIICXAIBAAKBgQC89ZNxjTgWgq7Z1g0tJ65w+k7lNAj5IgjLb155UkUrz0XsHDnH
--FlbsVUg2Xtk6+bo2UEYIzN7cIm5ImpmyW/2z0J1IDVDlvR2xJ659xrE0v5c2cB6T
--f9lnNTwpSoeK24Nd7Jwq4j9vk95fLrdqsBq0/KVlsCXeixS/CaqqduXfvwIDAQAB
--AoGAQFko4uyCgzfxr4Ezb4Mp5pN3Npqny5+Jey3r8EjSAX9Ogn+CNYgoBcdtFgbq
--1yif/0sK7ohGBJU9FUCAwrqNBI9ZHB6rcy7dx+gULOmRBGckln1o5S1+smVdmOsW
--7zUVLBVByKuNWqTYFlzfVd6s4iiXtAE2iHn3GCyYdlICwrECQQDhMQVxHd3EFbzg
--SFmJBTARlZ2GKA3c1g/h9/XbkEPQ9/RwI3vnjJ2RaSnjlfoLl8TOcf0uOGbOEyFe
--19RvCLXjAkEA1s+UE5ziF+YVkW3WolDCQ2kQ5WG9+ccfNebfh6b67B7Ln5iG0Sbg
--ky9cjsO3jbMJQtlzAQnH1850oRD5Gi51dQJAIbHCDLDZU9Ok1TI+I2BhVuA6F666
--lEZ7TeZaJSYq34OaUYUdrwG9OdqwZ9sy9LUav4ESzu2lhEQchCJrKMn23QJAReqs
--ZLHUeTjfXkVk7dHhWPWSlUZ6AhmIlA/AQ7Payg2/8wM/JkZEJEPvGVykms9iPUrv
--frADRr+hAGe43IewnQJBAJWKZllPgKuEBPwoEldHNS8nRu61D7HzxEzQ2xnfj+Nk
--2fgf1MAzzTRsikfGENhVsVWeqOcijWb6g5gsyCmlRpc=
-------END RSA PRIVATE KEY-----
-------BEGIN CERTIFICATE-----
--MIICsDCCAhmgAwIBAgIJAOqYOYFJfEEoMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
--BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
--aWRnaXRzIFB0eSBMdGQwHhcNMDgwNjI2MTgxNTUyWhcNMDkwNjI2MTgxNTUyWjBF
--MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
--ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
--gQC89ZNxjTgWgq7Z1g0tJ65w+k7lNAj5IgjLb155UkUrz0XsHDnHFlbsVUg2Xtk6
--+bo2UEYIzN7cIm5ImpmyW/2z0J1IDVDlvR2xJ659xrE0v5c2cB6Tf9lnNTwpSoeK
--24Nd7Jwq4j9vk95fLrdqsBq0/KVlsCXeixS/CaqqduXfvwIDAQABo4GnMIGkMB0G
--A1UdDgQWBBTctMtI3EO9OjLI0x9Zo2ifkwIiNjB1BgNVHSMEbjBsgBTctMtI3EO9
--OjLI0x9Zo2ifkwIiNqFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUt
--U3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAOqYOYFJ
--fEEoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAQwa7jya/DfhaDn7E
--usPkpgIX8WCL2B1SqnRTXEZfBPPVq/cUmFGyEVRVATySRuMwi8PXbVcOhXXuocA+
--43W+iIsD9pXapCZhhOerCq18TC1dWK98vLUsoK8PMjB6e5H/O8bqojv0EeC+fyCw
--eSHj5jpC8iZKjCHBn+mAi4cQ514=
-------END CERTIFICATE-----
-diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
-index 20d4eeac12..a0c683bbcf 100644
---- a/Lib/test/test_poplib.py
-+++ b/Lib/test/test_poplib.py
-@@ -178,7 +178,8 @@ class DummyPOP3Handler(asynchat.async_chat):
- return self.handle_close()
- # TODO: SSLError does not expose alert information
- elif ("SSLV3_ALERT_BAD_CERTIFICATE" in err.args[1] or
-- "SSLV3_ALERT_CERTIFICATE_UNKNOWN" in err.args[1]):
-+ "SSLV3_ALERT_CERTIFICATE_UNKNOWN" in err.args[1] or
-+ "bad record type" in err.args[1]):
- return self.handle_close()
- raise
- except OSError as err:
diff --git a/python3.spec b/python3.spec
index 6bc5a64..2e2ee57 100644
--- a/python3.spec
+++ b/python3.spec
@@ -13,8 +13,8 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.0
-Release: 10%{?dist}
+Version: %{pybasever}.1
+Release: 1%{?dist}
License: Python
@@ -196,7 +196,7 @@ BuildRequires: python-pip-wheel
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{?prerel}....
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
@@ -305,21 +305,6 @@ Patch274: 00274-fix-arch-names.patch
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
-# 00307 #
-# Allow to call Py_Main() after Py_Initialize()
-# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1595421
-# and:
https://bugs.python.org/issue34008
-Patch307: 00307-allow-to-call-Py_Main-after-Py_Initialize.patch
-
-# 00308 #
-# TLS 1.3 related fixes from upstream:
-#
https://github.com/python/cpython/pull/8762
-#
https://github.com/python/cpython/pull/8787
-# And a workaround before openssl is 1.1.1-pre9:
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1609291#c12
-# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1609291
-Patch308: 00308-tls-1.3.patch
-
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -650,8 +635,6 @@ rm Lib/ensurepip/_bundled/*.whl
%patch251 -p1
%patch274 -p1
%patch291 -p1
-%patch307 -p1
-%patch308 -p1
# Remove files that should be generated by the build
@@ -1551,6 +1534,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Oct 22 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.1-1
+- Update to 3.7.1
+
* Thu Sep 27 2018 Petr Viktorin <pviktori(a)redhat.com> - 3.7.0-10
- Compile the debug build with -Og rather than -O0
diff --git a/sources b/sources
index 099b345..4d40818 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0.tar.xz) =
8bb11233fb67ee9ab8ed1b72f8fdc62f66e26a6beaaeb92448bce681cf065269833b1658d3ed2459127f25ba43adb0eab73cf27c59834a2a803fb529b4216739
+SHA512 (Python-3.7.1.tar.xz) =
3eb62a0127609b14420a47442727702f396519c649625aca59883d04f4c02e5f37ba1d58ac8e93c49d14a63f17ae7909315c33fc813293dbcdb6127f39a148b0
commit 091b4b20e9f8fc324b0db7e04cb20b8426ab8612
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Thu Sep 27 11:32:47 2018 +0200
Compile the debug build with -Og rather than -O0
That is, "optimize for debugging experience" rather than
"don't optimize".
diff --git a/python3.spec b/python3.spec
index 993132b..6bc5a64 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
@@ -742,7 +742,7 @@ BuildPython() {
%if %{with debug_build}
BuildPython debug \
"--without-ensurepip --with-pydebug" \
- "-O0"
+ "-Og"
%endif # with debug_build
BuildPython optimized \
@@ -1551,6 +1551,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Sep 27 2018 Petr Viktorin <pviktori(a)redhat.com> - 3.7.0-10
+- Compile the debug build with -Og rather than -O0
+
* Thu Aug 30 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-9
- Require python3-setuptools from python3-devel to prevent packaging errors (#1623914)
commit e354fb5703f6b2157235a4bf6df150a41ad718ba
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Sep 27 13:57:12 2018 +0200
Disable test_gdb for now as it fails
with latest gdb.
diff --git a/python3.spec b/python3.spec
index 6ebe8d0..993132b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1059,12 +1059,10 @@ CheckPython() {
-wW --slowest --findleaks \
-x test_distutils \
-x test_bdist_rpm \
+ -x test_gdb \
%ifarch %{mips64}
-x test_ctypes \
%endif
- %ifarch %{power64} s390 s390x armv7hl %{mips}
- -x test_gdb \
- %endif
%ifarch ppc64le
-x test_buffer \
%endif
commit 33cd8ff3711a9a2bed9841431998d85c95415e82
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Sep 3 14:10:31 2018 +0200
rpmlintrc updates
* put 64 in ()? to support 32bit RPMs
* add new executables to the manpages ignore list
diff --git a/python3.rpmlintrc b/python3.rpmlintrc
index 6c1ce83..d59fe13 100644
--- a/python3.rpmlintrc
+++ b/python3.rpmlintrc
@@ -26,12 +26,12 @@ addFilter(r'only-non-binary-in-usr-lib')
# some devel files that are deliberately needed
addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
-addFilter(r'devel-file-in-non-devel-package
/usr/lib64/python3\.\d/distutils/tests/xxmodule\.c')
+addFilter(r'devel-file-in-non-devel-package
/usr/lib(64)?/python3\.\d/distutils/tests/xxmodule\.c')
# SORRY, NOT SORRY:
# manual pages
-addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix\.py)')
+addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix|msgfmt|pygettext)')
addFilter(r'no-manual-page-for-binary python3.*-config$')
addFilter(r'no-manual-page-for-binary python3.\dd?m$')
commit 704ecff9600ad338b4b00a7ca6677917102a75e3
Author: Petr plchal <psplicha(a)redhat.com>
Date: Thu Jul 19 17:02:45 2018 +0200
Enable basic venv smoke test in the CI
This executes virtual environment smoke test from the shared
python tests repository against Python 3.7.
diff --git a/tests/tests.yml b/tests/tests.yml
new file mode 100644
index 0000000..2e14ca0
--- /dev/null
+++ b/tests/tests.yml
@@ -0,0 +1,17 @@
+---
+- hosts: localhost
+ roles:
+ - role: standard-test-basic
+ tags:
+ - classic
+ repositories:
+ - repo: "https://src.fedoraproject.org/tests/python.git"
+ dest: "python"
+ tests:
+ - smoke:
+ dir: python/smoke
+ run: VERSION=3.7 ./venv.sh
+ required_packages:
+ - gcc
+ - python3-tox
+ - python3-devel
commit 4da7cff796031aae6132274def989f6fbcc482f7
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Aug 30 15:17:04 2018 +0200
Require python3-setuptools from python3-devel to prevent packaging errors (#1623914)
diff --git a/python3.spec b/python3.spec
index 5969a45..6ebe8d0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
@@ -458,6 +458,15 @@ Requires: python-rpm-macros
Requires: python3-rpm-macros
Requires: python3-rpm-generators
+# This is not "API" (packages that need setuptools should still BuildRequire
it)
+# However some packages apparently can build both with and without setuptools
+# producing egg-info as file or directory (depending on setuptools presence).
+# Directory-to-file updates are problematic in RPM, so we ensure setuptools is
+# installed when -devel is required.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1623914
+# See
https://fedoraproject.org/wiki/Packaging:Directory_Replacement
+Requires: python3-setuptools
+
#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
@@ -1544,6 +1553,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Aug 30 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-9
+- Require python3-setuptools from python3-devel to prevent packaging errors (#1623914)
+
* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-8
- Add /usr/bin/pygettext3.py and msgfmt3.py to python3-devel
Resolves: rhbz#1571474
commit 37056bc0f97ec9610dc96fa567da39f8e5c5d811
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jul 26 14:19:23 2018 +0200
Renew check-pyc-timestamps.py
- rename it, the are no pyo files on Python 3
- make sure to check all levels of pyc files optimization
- use path globs
- use comprehensions instead of map + filter
- use f-strings and print() instead of sys.stderr.write()
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
deleted file mode 100644
index ab75c9f..0000000
--- a/check-pyc-and-pyo-timestamps.py
+++ /dev/null
@@ -1,66 +0,0 @@
-"""Checks if all *.pyc and *.pyo files have later mtime than their *.py
files."""
-
-import importlib.util
-import os
-import sys
-
-# list of test and other files that we expect not to have bytecode
-not_compiled = [
- '/usr/bin/pathfix.py',
- '/usr/bin/pygettext3.py',
- f'/usr/bin/pygettext{sys.version[:3]}.py',
- '/usr/bin/msgfmt3.py',
- f'/usr/bin/msgfmt{sys.version[:3]}.py',
- 'test/bad_coding.py',
- 'test/bad_coding2.py',
- 'test/badsyntax_3131.py',
- 'test/badsyntax_future3.py',
- 'test/badsyntax_future4.py',
- 'test/badsyntax_future5.py',
- 'test/badsyntax_future6.py',
- 'test/badsyntax_future7.py',
- 'test/badsyntax_future8.py',
- 'test/badsyntax_future9.py',
- 'test/badsyntax_future10.py',
- 'test/badsyntax_async1.py',
- 'test/badsyntax_async2.py',
- 'test/badsyntax_async3.py',
- 'test/badsyntax_async4.py',
- 'test/badsyntax_async5.py',
- 'test/badsyntax_async6.py',
- 'test/badsyntax_async7.py',
- 'test/badsyntax_async8.py',
- 'test/badsyntax_async9.py',
- 'test/badsyntax_pep3120.py',
- 'lib2to3/tests/data/bom.py',
- 'lib2to3/tests/data/crlf.py',
- 'lib2to3/tests/data/different_encoding.py',
- 'lib2to3/tests/data/false_encoding.py',
- 'lib2to3/tests/data/py2_test_grammar.py',
- '.debug-gdb.py',
-]
-failed = 0
-
-
-def bytecode_expected(source):
- for f in not_compiled:
- if source.endswith(f):
- return False
- return True
-
-
-compiled = filter(lambda f: bytecode_expected(f), sys.argv[1:])
-for f in compiled:
- # check both pyo and pyc
- to_check = map(lambda b: importlib.util.cache_from_source(f, b), (True, False))
- f_mtime = os.path.getmtime(f)
- for c in to_check:
- c_mtime = os.path.getmtime(c)
- if c_mtime < f_mtime:
- sys.stderr.write('Failed bytecompilation timestamps check: ')
- sys.stderr.write('Bytecode file {} is older than source file
{}.\n'.format(c, f))
- failed += 1
-
-if failed:
- sys.stderr.write('\n{} files failed bytecompilation timestamps
check.\n'.format(failed))
- sys.exit(1)
diff --git a/check-pyc-timestamps.py b/check-pyc-timestamps.py
new file mode 100644
index 0000000..91af4fd
--- /dev/null
+++ b/check-pyc-timestamps.py
@@ -0,0 +1,55 @@
+"""Checks if all *.pyc files have later mtime than their *.py
files."""
+
+import os
+import sys
+from importlib.util import cache_from_source
+from pathlib import Path
+
+
+RPM_BUILD_ROOT = os.environ.get('RPM_BUILD_ROOT', '')
+
+# ...cpython-3X.pyc
+# ...cpython-3X.opt-1.pyc
+# ...cpython-3X.opt-2.pyc
+LEVELS = (None, 1, 2)
+
+# list of globs of test and other files that we expect not to have bytecode
+not_compiled = [
+ '/usr/bin/*',
+ '*/test/bad_coding.py',
+ '*/test/bad_coding2.py',
+ '*/test/badsyntax_*.py',
+ '*/lib2to3/tests/data/bom.py',
+ '*/lib2to3/tests/data/crlf.py',
+ '*/lib2to3/tests/data/different_encoding.py',
+ '*/lib2to3/tests/data/false_encoding.py',
+ '*/lib2to3/tests/data/py2_test_grammar.py',
+ '*.debug-gdb.py',
+]
+
+
+def bytecode_expected(path):
+ path = Path(path[len(RPM_BUILD_ROOT):])
+ for glob in not_compiled:
+ if path.match(glob):
+ return False
+ return True
+
+
+failed = 0
+compiled = (path for path in sys.argv[1:] if bytecode_expected(path))
+for path in compiled:
+ to_check = (cache_from_source(path, optimization=opt) for opt in LEVELS)
+ f_mtime = os.path.getmtime(path)
+ for pyc in to_check:
+ c_mtime = os.path.getmtime(pyc)
+ if c_mtime < f_mtime:
+ print('Failed bytecompilation timestamps check: '
+ f'Bytecode file {pyc} is older than source file {path}',
+ file=sys.stderr)
+ failed += 1
+
+if failed:
+ print(f'\n{failed} files failed bytecompilation timestamps check.',
+ file=sys.stderr)
+ sys.exit(1)
diff --git a/python3.spec b/python3.spec
index a6c6481..5969a45 100644
--- a/python3.spec
+++ b/python3.spec
@@ -200,8 +200,8 @@ Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
-# Written by bkabrda
-Source8: check-pyc-and-pyo-timestamps.py
+# Originally written by bkabrda
+Source8: check-pyc-timestamps.py
# Desktop menu entry for idle3
Source10: idle3.desktop
commit 83a5f52678e1699558dd538004931e76394cd5c9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jul 26 13:44:49 2018 +0200
Add /usr/bin/pygettext3.py and msgfmt3.py to python3-devel
Resolves: rhbz#1571474
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
index 262a985..ab75c9f 100644
--- a/check-pyc-and-pyo-timestamps.py
+++ b/check-pyc-and-pyo-timestamps.py
@@ -7,6 +7,10 @@ import sys
# list of test and other files that we expect not to have bytecode
not_compiled = [
'/usr/bin/pathfix.py',
+ '/usr/bin/pygettext3.py',
+ f'/usr/bin/pygettext{sys.version[:3]}.py',
+ '/usr/bin/msgfmt3.py',
+ f'/usr/bin/msgfmt{sys.version[:3]}.py',
'test/bad_coding.py',
'test/bad_coding2.py',
'test/badsyntax_3131.py',
diff --git a/python3.spec b/python3.spec
index 91d0f34..a6c6481 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
@@ -893,6 +893,14 @@ sed -i -e
"s/'pyconfig.h'/'%{_pyconfig_h}'/" \
# See
https://github.com/fedora-python/python-rpm-porting/issues/24
cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+# Install i18n tools to bindir
+# They are also in python2, so we version them
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1571474
+for tool in pygettext msgfmt; do
+ cp -p Tools/i18n/${tool}.py %{buildroot}%{_bindir}/${tool}%{pybasever}.py
+ ln -s ${tool}%{pybasever}.py %{buildroot}%{_bindir}/${tool}3.py
+done
+
# Switch all shebangs to refer to the specific Python version.
# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
# so handle files named using other naming scheme separately.
@@ -900,6 +908,7 @@ LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
Tools/scripts/pathfix.py \
-i "%{_bindir}/python%{pybasever}" -pn \
%{buildroot} \
+ %{buildroot}%{_bindir}/*%{pybasever}.py \
%{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
# Remove tests for python3-tools which was removed in
@@ -964,6 +973,8 @@ mv %{buildroot}%{_bindir}/2to3-%{pybasever}
%{buildroot}%{_bindir}/2to3
rm %{buildroot}%{_bindir}/python3
rm %{buildroot}%{_bindir}/pydoc3
rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/pygettext3.py
+rm %{buildroot}%{_bindir}/msgfmt3.py
rm %{buildroot}%{_bindir}/idle3
rm %{buildroot}%{_bindir}/python3-*
rm %{buildroot}%{_bindir}/pyvenv
@@ -1328,8 +1339,13 @@ CheckPython optimized
%{_bindir}/python3-config
%{_libdir}/pkgconfig/python3.pc
%{_bindir}/pathfix.py
+%{_bindir}/pygettext3.py
+%{_bindir}/msgfmt3.py
%endif
+%{_bindir}/pygettext%{pybasever}.py
+%{_bindir}/msgfmt%{pybasever}.py
+
%{_bindir}/python%{pybasever}-config
%{_bindir}/python%{LDVERSION_optimized}-config
%{_bindir}/python%{LDVERSION_optimized}-*-config
@@ -1528,6 +1544,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-8
+- Add /usr/bin/pygettext3.py and msgfmt3.py to python3-devel
+Resolves: rhbz#1571474
+
* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-7
- Backport TLS 1.3 related fixes to fix FTBFS
Resolves: rhbz#1609291
commit 4aa9ebcc0385f0475d3d8ad1593fb1d5806a9cea
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Aug 17 13:00:03 2018 +0200
Backport TLS 1.3 related fixes to fix FTBFS
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1609291
diff --git a/00308-tls-1.3.patch b/00308-tls-1.3.patch
new file mode 100644
index 0000000..7cd9e59
--- /dev/null
+++ b/00308-tls-1.3.patch
@@ -0,0 +1,182 @@
+diff --git a/Lib/test/dh1024.pem b/Lib/test/dh1024.pem
+deleted file mode 100644
+index a391176..0000000
+--- a/Lib/test/dh1024.pem
++++ /dev/null
+@@ -1,7 +0,0 @@
+------BEGIN DH PARAMETERS-----
+-MIGHAoGBAIbzw1s9CT8SV5yv6L7esdAdZYZjPi3qWFs61CYTFFQnf2s/d09NYaJt
+-rrvJhIzWavqnue71qXCf83/J3nz3FEwUU/L0mGyheVbsSHiI64wUo3u50wK5Igo0
+-RNs/LD0irs7m0icZ//hijafTU+JOBiuA8zMI+oZfU7BGuc9XrUprAgEC
+------END DH PARAMETERS-----
+-
+-Generated with: openssl dhparam -out dh1024.pem 1024
+diff --git a/Lib/test/ffdh3072.pem b/Lib/test/ffdh3072.pem
+new file mode 100644
+index 0000000..ad69bac
+--- /dev/null
++++ b/Lib/test/ffdh3072.pem
+@@ -0,0 +1,41 @@
++ DH Parameters: (3072 bit)
++ prime:
++ 00:ff:ff:ff:ff:ff:ff:ff:ff:ad:f8:54:58:a2:bb:
++ 4a:9a:af:dc:56:20:27:3d:3c:f1:d8:b9:c5:83:ce:
++ 2d:36:95:a9:e1:36:41:14:64:33:fb:cc:93:9d:ce:
++ 24:9b:3e:f9:7d:2f:e3:63:63:0c:75:d8:f6:81:b2:
++ 02:ae:c4:61:7a:d3:df:1e:d5:d5:fd:65:61:24:33:
++ f5:1f:5f:06:6e:d0:85:63:65:55:3d:ed:1a:f3:b5:
++ 57:13:5e:7f:57:c9:35:98:4f:0c:70:e0:e6:8b:77:
++ e2:a6:89:da:f3:ef:e8:72:1d:f1:58:a1:36:ad:e7:
++ 35:30:ac:ca:4f:48:3a:79:7a:bc:0a:b1:82:b3:24:
++ fb:61:d1:08:a9:4b:b2:c8:e3:fb:b9:6a:da:b7:60:
++ d7:f4:68:1d:4f:42:a3:de:39:4d:f4:ae:56:ed:e7:
++ 63:72:bb:19:0b:07:a7:c8:ee:0a:6d:70:9e:02:fc:
++ e1:cd:f7:e2:ec:c0:34:04:cd:28:34:2f:61:91:72:
++ fe:9c:e9:85:83:ff:8e:4f:12:32:ee:f2:81:83:c3:
++ fe:3b:1b:4c:6f:ad:73:3b:b5:fc:bc:2e:c2:20:05:
++ c5:8e:f1:83:7d:16:83:b2:c6:f3:4a:26:c1:b2:ef:
++ fa:88:6b:42:38:61:1f:cf:dc:de:35:5b:3b:65:19:
++ 03:5b:bc:34:f4:de:f9:9c:02:38:61:b4:6f:c9:d6:
++ e6:c9:07:7a:d9:1d:26:91:f7:f7:ee:59:8c:b0:fa:
++ c1:86:d9:1c:ae:fe:13:09:85:13:92:70:b4:13:0c:
++ 93:bc:43:79:44:f4:fd:44:52:e2:d7:4d:d3:64:f2:
++ e2:1e:71:f5:4b:ff:5c:ae:82:ab:9c:9d:f6:9e:e8:
++ 6d:2b:c5:22:36:3a:0d:ab:c5:21:97:9b:0d:ea:da:
++ 1d:bf:9a:42:d5:c4:48:4e:0a:bc:d0:6b:fa:53:dd:
++ ef:3c:1b:20:ee:3f:d5:9d:7c:25:e4:1d:2b:66:c6:
++ 2e:37:ff:ff:ff:ff:ff:ff:ff:ff
++ generator: 2 (0x2)
++ recommended-private-length: 276 bits
++-----BEGIN DH PARAMETERS-----
++MIIBjAKCAYEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
+++8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
++87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
++YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
++7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
++ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3
++7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32
++nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZsYu
++N///////////AgECAgIBFA==
++-----END DH PARAMETERS-----
+diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
+index f9488a9..da8ba32 100644
+--- a/Lib/test/test_ftplib.py
++++ b/Lib/test/test_ftplib.py
+@@ -880,18 +880,23 @@ class TestTLS_FTPClass(TestCase):
+ # clear text
+ with self.client.transfercmd('list') as sock:
+ self.assertNotIsInstance(sock, ssl.SSLSocket)
++ self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii'))
+ self.assertEqual(self.client.voidresp(), "226 transfer complete")
+
+ # secured, after PROT P
+ self.client.prot_p()
+ with self.client.transfercmd('list') as sock:
+ self.assertIsInstance(sock, ssl.SSLSocket)
++ # consume from SSL socket to finalize handshake and avoid
++ # "SSLError [SSL] shutdown while in init"
++ self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii'))
+ self.assertEqual(self.client.voidresp(), "226 transfer complete")
+
+ # PROT C is issued, the connection must be in cleartext again
+ self.client.prot_c()
+ with self.client.transfercmd('list') as sock:
+ self.assertNotIsInstance(sock, ssl.SSLSocket)
++ self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii'))
+ self.assertEqual(self.client.voidresp(), "226 transfer complete")
+
+ def test_login(self):
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+index 7bbaa9f..ea528b5 100644
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -55,7 +55,6 @@ CAPATH = data_file("capath")
+ BYTES_CAPATH = os.fsencode(CAPATH)
+ CAFILE_NEURONIO = data_file("capath", "4e1295a3.0")
+ CAFILE_CACERT = data_file("capath", "5ed36f99.0")
+-WRONG_CERT = data_file("wrongcert.pem")
+
+ CERTFILE_INFO = {
+ 'issuer': ((('countryName', 'XY'),),
+@@ -118,7 +117,7 @@ BADKEY = data_file("badkey.pem")
+ NOKIACERT = data_file("nokia.pem")
+ NULLBYTECERT = data_file("nullbytecert.pem")
+
+-DHFILE = data_file("dh1024.pem")
++DHFILE = data_file("ffdh3072.pem")
+ BYTES_DHFILE = os.fsencode(DHFILE)
+
+ # Not defined in all versions of OpenSSL
+@@ -2846,8 +2845,8 @@ class ThreadedTests(unittest.TestCase):
+ connect to it with a wrong client certificate fails.
+ """
+ client_context, server_context, hostname = testing_context()
+- # load client cert
+- client_context.load_cert_chain(WRONG_CERT)
++ # load client cert that is not signed by trusted CA
++ client_context.load_cert_chain(CERTFILE)
+ # require TLS client authentication
+ server_context.verify_mode = ssl.CERT_REQUIRED
+ # TLS 1.3 has different handshake
+@@ -2879,7 +2878,8 @@ class ThreadedTests(unittest.TestCase):
+ @unittest.skipUnless(ssl.HAS_TLSv1_3, "Test needs TLS 1.3")
+ def test_wrong_cert_tls13(self):
+ client_context, server_context, hostname = testing_context()
+- client_context.load_cert_chain(WRONG_CERT)
++ # load client cert that is not signed by trusted CA
++ client_context.load_cert_chain(CERTFILE)
+ server_context.verify_mode = ssl.CERT_REQUIRED
+ server_context.minimum_version = ssl.TLSVersion.TLSv1_3
+ client_context.minimum_version = ssl.TLSVersion.TLSv1_3
+diff --git a/Lib/test/wrongcert.pem b/Lib/test/wrongcert.pem
+deleted file mode 100644
+index 5f92f9b..0000000
+--- a/Lib/test/wrongcert.pem
++++ /dev/null
+@@ -1,32 +0,0 @@
+------BEGIN RSA PRIVATE KEY-----
+-MIICXAIBAAKBgQC89ZNxjTgWgq7Z1g0tJ65w+k7lNAj5IgjLb155UkUrz0XsHDnH
+-FlbsVUg2Xtk6+bo2UEYIzN7cIm5ImpmyW/2z0J1IDVDlvR2xJ659xrE0v5c2cB6T
+-f9lnNTwpSoeK24Nd7Jwq4j9vk95fLrdqsBq0/KVlsCXeixS/CaqqduXfvwIDAQAB
+-AoGAQFko4uyCgzfxr4Ezb4Mp5pN3Npqny5+Jey3r8EjSAX9Ogn+CNYgoBcdtFgbq
+-1yif/0sK7ohGBJU9FUCAwrqNBI9ZHB6rcy7dx+gULOmRBGckln1o5S1+smVdmOsW
+-7zUVLBVByKuNWqTYFlzfVd6s4iiXtAE2iHn3GCyYdlICwrECQQDhMQVxHd3EFbzg
+-SFmJBTARlZ2GKA3c1g/h9/XbkEPQ9/RwI3vnjJ2RaSnjlfoLl8TOcf0uOGbOEyFe
+-19RvCLXjAkEA1s+UE5ziF+YVkW3WolDCQ2kQ5WG9+ccfNebfh6b67B7Ln5iG0Sbg
+-ky9cjsO3jbMJQtlzAQnH1850oRD5Gi51dQJAIbHCDLDZU9Ok1TI+I2BhVuA6F666
+-lEZ7TeZaJSYq34OaUYUdrwG9OdqwZ9sy9LUav4ESzu2lhEQchCJrKMn23QJAReqs
+-ZLHUeTjfXkVk7dHhWPWSlUZ6AhmIlA/AQ7Payg2/8wM/JkZEJEPvGVykms9iPUrv
+-frADRr+hAGe43IewnQJBAJWKZllPgKuEBPwoEldHNS8nRu61D7HzxEzQ2xnfj+Nk
+-2fgf1MAzzTRsikfGENhVsVWeqOcijWb6g5gsyCmlRpc=
+------END RSA PRIVATE KEY-----
+------BEGIN CERTIFICATE-----
+-MIICsDCCAhmgAwIBAgIJAOqYOYFJfEEoMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+-BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+-aWRnaXRzIFB0eSBMdGQwHhcNMDgwNjI2MTgxNTUyWhcNMDkwNjI2MTgxNTUyWjBF
+-MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+-ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
+-gQC89ZNxjTgWgq7Z1g0tJ65w+k7lNAj5IgjLb155UkUrz0XsHDnHFlbsVUg2Xtk6
+-+bo2UEYIzN7cIm5ImpmyW/2z0J1IDVDlvR2xJ659xrE0v5c2cB6Tf9lnNTwpSoeK
+-24Nd7Jwq4j9vk95fLrdqsBq0/KVlsCXeixS/CaqqduXfvwIDAQABo4GnMIGkMB0G
+-A1UdDgQWBBTctMtI3EO9OjLI0x9Zo2ifkwIiNjB1BgNVHSMEbjBsgBTctMtI3EO9
+-OjLI0x9Zo2ifkwIiNqFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUt
+-U3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAOqYOYFJ
+-fEEoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAQwa7jya/DfhaDn7E
+-usPkpgIX8WCL2B1SqnRTXEZfBPPVq/cUmFGyEVRVATySRuMwi8PXbVcOhXXuocA+
+-43W+iIsD9pXapCZhhOerCq18TC1dWK98vLUsoK8PMjB6e5H/O8bqojv0EeC+fyCw
+-eSHj5jpC8iZKjCHBn+mAi4cQ514=
+------END CERTIFICATE-----
+diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
+index 20d4eeac12..a0c683bbcf 100644
+--- a/Lib/test/test_poplib.py
++++ b/Lib/test/test_poplib.py
+@@ -178,7 +178,8 @@ class DummyPOP3Handler(asynchat.async_chat):
+ return self.handle_close()
+ # TODO: SSLError does not expose alert information
+ elif ("SSLV3_ALERT_BAD_CERTIFICATE" in err.args[1] or
+- "SSLV3_ALERT_CERTIFICATE_UNKNOWN" in err.args[1]):
++ "SSLV3_ALERT_CERTIFICATE_UNKNOWN" in err.args[1] or
++ "bad record type" in err.args[1]):
+ return self.handle_close()
+ raise
+ except OSError as err:
diff --git a/python3.spec b/python3.spec
index 9caf494..91d0f34 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
@@ -311,6 +311,15 @@ Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
# and:
https://bugs.python.org/issue34008
Patch307: 00307-allow-to-call-Py_Main-after-Py_Initialize.patch
+# 00308 #
+# TLS 1.3 related fixes from upstream:
+#
https://github.com/python/cpython/pull/8762
+#
https://github.com/python/cpython/pull/8787
+# And a workaround before openssl is 1.1.1-pre9:
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1609291#c12
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1609291
+Patch308: 00308-tls-1.3.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -633,6 +642,7 @@ rm Lib/ensurepip/_bundled/*.whl
%patch274 -p1
%patch291 -p1
%patch307 -p1
+%patch308 -p1
# Remove files that should be generated by the build
@@ -1009,6 +1019,12 @@ CheckPython() {
ConfName=$1
ConfDir=$(pwd)/build/$ConfName
+ # Fedora sets TLSv1 as explicit minimum version.
+ # Python's test suite assumes that the minimum protocol version is set to
+ # a magic marker. We workaround the test problem by setting:
+ export OPENSSL_CONF=/non-existing-file
+ #
https://bugzilla.redhat.com/show_bug.cgi?id=1618753
+
echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
# Note that we're running the tests using the version of the code in the
@@ -1512,6 +1528,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Aug 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-7
+- Backport TLS 1.3 related fixes to fix FTBFS
+Resolves: rhbz#1609291
+
* Wed Aug 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-6
- Use RPM built wheels of pip and setuptools in ensurepip instead of our rewheel patch
commit b9e8a46cca86dec69891b26ab810cc80b4db96b2
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Aug 16 12:30:28 2018 +0200
Recommend setuptools and pip for developer experience
diff --git a/python3.spec b/python3.spec
index 6e87de8..9caf494 100644
--- a/python3.spec
+++ b/python3.spec
@@ -358,6 +358,12 @@ Obsoletes: python%{pyshortver}
%global platpyver 3.6.2-20
Obsoletes: platform-python < %{platpyver}
+# Previously, this was required for our rewheel patch to work.
+# This is technically no longer needed, but we keep it recommended
+# for the developer experience.
+Recommends: python3-setuptools
+Recommends: python3-pip
+
# This prevents ALL subpackages built from this spec to require
# /usr/bin/python3*. Granularity per subpackage is impossible.
# It's intended for the libs package not to drag in the interpreter, see
commit 0b241abda6b7f8d4b092974cecd11d9660fa7b83
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Aug 15 15:36:29 2018 +0200
Drop the rewheel patch, use RPM built wheels instead
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
deleted file mode 100644
index d8ba671..0000000
--- a/00189-add-rewheel-module.patch
+++ /dev/null
@@ -1,245 +0,0 @@
-diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index 7ff938b..8c3d062 100644
---- a/Lib/ensurepip/__init__.py
-+++ b/Lib/ensurepip/__init__.py
-@@ -1,8 +1,10 @@
- import os
- import os.path
- import pkgutil
-+import shutil
- import sys
- import tempfile
-+from ensurepip import rewheel
-
-
- __all__ = ["version", "bootstrap"]
-@@ -24,8 +26,15 @@ def _run_pip(args, additional_paths=None):
- sys.path = additional_paths + sys.path
-
- # Install the bundled software
-- import pip._internal
-- return pip._internal.main(args)
-+ try:
-+ # pip 10
-+ from pip._internal import main
-+ except ImportError:
-+ # pip 9
-+ from pip import main
-+ if args[0] in ["install", "list", "wheel"]:
-+ args.append('--pre')
-+ return main(args)
-
-
- def version():
-@@ -88,20 +97,39 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
- # omit pip and easy_install
- os.environ["ENSUREPIP_OPTIONS"] = "install"
-
-+ whls = []
-+ rewheel_dir = None
-+ # try to see if we have system-wide versions of _PROJECTS
-+ dep_records = rewheel.find_system_records([p[0] for p in _PROJECTS])
-+ # TODO: check if system-wide versions are the newest ones
-+ # if --upgrade is used?
-+ if all(dep_records):
-+ # if we have all _PROJECTS installed system-wide, we'll recreate
-+ # wheels from them and install those
-+ rewheel_dir = tempfile.TemporaryDirectory()
-+ for dr in dep_records:
-+ new_whl = rewheel.rewheel_from_record(dr, rewheel_dir.name)
-+ whls.append(os.path.join(rewheel_dir.name, new_whl))
-+ else:
-+ # if we don't have all the _PROJECTS installed system-wide,
-+ # let's just fall back to bundled wheels
-+ for project, version in _PROJECTS:
-+ whl = os.path.join(
-+ os.path.dirname(__file__),
-+ "_bundled",
-+ "{}-{}-py2.py3-none-any.whl".format(project, version)
-+ )
-+ whls.append(whl)
-+
- with tempfile.TemporaryDirectory() as tmpdir:
- # Put our bundled wheels into a temporary directory and construct the
- # additional paths that need added to sys.path
- additional_paths = []
-- for project, version in _PROJECTS:
-- wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
-- whl = pkgutil.get_data(
-- "ensurepip",
-- "_bundled/{}".format(wheel_name),
-- )
-- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
-- fp.write(whl)
--
-- additional_paths.append(os.path.join(tmpdir, wheel_name))
-+ for whl in whls:
-+ shutil.copy(whl, tmpdir)
-+ additional_paths.append(os.path.join(tmpdir, os.path.basename(whl)))
-+ if rewheel_dir:
-+ rewheel_dir.cleanup()
-
- # Construct the arguments to be passed to the pip command
- args = ["install", "--no-index", "--find-links",
tmpdir]
-diff --git a/Lib/ensurepip/rewheel/__init__.py b/Lib/ensurepip/rewheel/__init__.py
-new file mode 100644
-index 0000000..753c764
---- /dev/null
-+++ b/Lib/ensurepip/rewheel/__init__.py
-@@ -0,0 +1,143 @@
-+import argparse
-+import codecs
-+import csv
-+import email.parser
-+import os
-+import io
-+import re
-+import site
-+import subprocess
-+import sys
-+import zipfile
-+
-+def run():
-+ parser = argparse.ArgumentParser(description='Recreate wheel of package with
given RECORD.')
-+ parser.add_argument('record_path',
-+ help='Path to RECORD file')
-+ parser.add_argument('-o', '--output-dir',
-+ help='Dir where to place the wheel, defaults to current
working dir.',
-+ dest='outdir',
-+ default=os.path.curdir)
-+
-+ ns = parser.parse_args()
-+ retcode = 0
-+ try:
-+ print(rewheel_from_record(**vars(ns)))
-+ except BaseException as e:
-+ print('Failed: {}'.format(e))
-+ retcode = 1
-+ sys.exit(1)
-+
-+def find_system_records(projects):
-+ """Return list of paths to RECORD files for system-installed
projects.
-+
-+ If a project is not installed, the resulting list contains None instead
-+ of a path to its RECORD
-+ """
-+ records = []
-+ # get system site-packages dirs
-+ sys_sitepack = site.getsitepackages([sys.base_prefix, sys.base_exec_prefix])
-+ sys_sitepack = [sp for sp in sys_sitepack if os.path.exists(sp)]
-+ # try to find all projects in all system site-packages
-+ for project in projects:
-+ path = None
-+ for sp in sys_sitepack:
-+ dist_info_re = os.path.join(sp, project) +
r'-[^\{0}]+\.dist-info'.format(os.sep)
-+ candidates = [os.path.join(sp, p) for p in os.listdir(sp)]
-+ # filter out candidate dirs based on the above regexp
-+ filtered = [c for c in candidates if re.match(dist_info_re, c)]
-+ # if we have 0 or 2 or more dirs, something is wrong...
-+ if len(filtered) == 1:
-+ path = filtered[0]
-+ if path is not None:
-+ records.append(os.path.join(path, 'RECORD'))
-+ else:
-+ records.append(None)
-+ return records
-+
-+def rewheel_from_record(record_path, outdir):
-+ """Recreates a whee of package with given record_path and returns
path
-+ to the newly created wheel."""
-+ site_dir = os.path.dirname(os.path.dirname(record_path))
-+ record_relpath = record_path[len(site_dir):].strip(os.path.sep)
-+ to_write, to_omit = get_records_to_pack(site_dir, record_relpath)
-+ new_wheel_name = get_wheel_name(record_path)
-+ new_wheel_path = os.path.join(outdir, new_wheel_name + '.whl')
-+
-+ new_wheel = zipfile.ZipFile(new_wheel_path, mode='w',
compression=zipfile.ZIP_DEFLATED)
-+ # we need to write a new record with just the files that we will write,
-+ # e.g. not binaries and *.pyc/*.pyo files
-+ new_record = io.StringIO()
-+ writer = csv.writer(new_record)
-+
-+ # handle files that we can write straight away
-+ for f, sha_hash, size in to_write:
-+ new_wheel.write(os.path.join(site_dir, f), arcname=f)
-+ writer.writerow([f, sha_hash,size])
-+
-+ # rewrite the old wheel file with a new computed one
-+ writer.writerow([record_relpath, '', ''])
-+ new_wheel.writestr(record_relpath, new_record.getvalue())
-+
-+ new_wheel.close()
-+
-+ return new_wheel.filename
-+
-+def get_wheel_name(record_path):
-+ """Return proper name of the wheel, without .whl."""
-+
-+ wheel_info_path = os.path.join(os.path.dirname(record_path), 'WHEEL')
-+ with codecs.open(wheel_info_path, encoding='utf-8') as wheel_info_file:
-+ wheel_info = email.parser.Parser().parsestr(wheel_info_file.read())
-+
-+ metadata_path = os.path.join(os.path.dirname(record_path), 'METADATA')
-+ with codecs.open(metadata_path, encoding='utf-8') as metadata_file:
-+ metadata = email.parser.Parser().parsestr(metadata_file.read())
-+
-+ # construct name parts according to wheel spec
-+ distribution = metadata.get('Name')
-+ version = metadata.get('Version')
-+ build_tag = '' # nothing for now
-+ lang_tag = []
-+ for t in wheel_info.get_all('Tag'):
-+ lang_tag.append(t.split('-')[0])
-+ lang_tag = '.'.join(lang_tag)
-+ abi_tag, plat_tag = wheel_info.get('Tag').split('-')[1:3]
-+ # leave out build tag, if it is empty
-+ to_join = filter(None, [distribution, version, build_tag, lang_tag, abi_tag,
plat_tag])
-+ return '-'.join(list(to_join))
-+
-+def get_records_to_pack(site_dir, record_relpath):
-+ """Accepts path of sitedir and path of RECORD file relative to it.
-+ Returns two lists:
-+ - list of files that can be written to new RECORD straight away
-+ - list of files that shouldn't be written or need some processing
-+ (pyc and pyo files, scripts)
-+ """
-+ record_file_path = os.path.join(site_dir, record_relpath)
-+ with codecs.open(record_file_path, encoding='utf-8') as record_file:
-+ record_contents = record_file.read()
-+ # temporary fix for
https://github.com/pypa/pip/issues/1376
-+ # we need to ignore files under ".data" directory
-+ data_dir = os.path.dirname(record_relpath).strip(os.path.sep)
-+ data_dir = data_dir[:-len('dist-info')] + 'data'
-+
-+ to_write = []
-+ to_omit = []
-+ for l in record_contents.splitlines():
-+ spl = l.split(',')
-+ if len(spl) == 3:
-+ # new record will omit (or write differently):
-+ # - abs paths, paths with ".." (entry points),
-+ # - pyc+pyo files
-+ # - the old RECORD file
-+ # TODO: is there any better way to recognize an entry point?
-+ if os.path.isabs(spl[0]) or spl[0].startswith('..') or \
-+ spl[0].endswith('.pyc') or spl[0].endswith('.pyo') or \
-+ spl[0] == record_relpath or spl[0].startswith(data_dir):
-+ to_omit.append(spl)
-+ else:
-+ to_write.append(spl)
-+ else:
-+ pass # bad RECORD or empty line
-+ return to_write, to_omit
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index d07b312..1c6720e 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -1301,7 +1301,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \
- test/test_asyncio \
- collections concurrent concurrent/futures encodings \
- email email/mime test/test_email test/test_email/data \
-- ensurepip ensurepip/_bundled \
-+ ensurepip ensurepip/_bundled ensurepip/rewheel \
- html json test/test_json http dbm xmlrpc \
- sqlite3 sqlite3/test \
- logging csv wsgiref urllib \
diff --git a/00189-use-rpm-wheels.patch b/00189-use-rpm-wheels.patch
new file mode 100644
index 0000000..cc2719b
--- /dev/null
+++ b/00189-use-rpm-wheels.patch
@@ -0,0 +1,51 @@
+diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
+index 4748ba4..fc02255 100644
+--- a/Lib/ensurepip/__init__.py
++++ b/Lib/ensurepip/__init__.py
+@@ -1,16 +1,27 @@
++import distutils.version
++import glob
+ import os
+ import os.path
+-import pkgutil
+ import sys
+ import tempfile
+
+
+ __all__ = ["version", "bootstrap"]
+
++_WHEEL_DIR = "/usr/share/python-wheels/"
+
+-_SETUPTOOLS_VERSION = "39.0.1"
+
+-_PIP_VERSION = "10.0.1"
++def _get_most_recent_wheel_version(pkg):
++ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
++ suffix = "-py2.py3-none-any.whl"
++ pattern = "{}*{}".format(prefix, suffix)
++ versions = (p[len(prefix):-len(suffix)] for p in glob.glob(pattern))
++ return str(max(versions, key=distutils.version.LooseVersion))
++
++
++_SETUPTOOLS_VERSION = _get_most_recent_wheel_version("setuptools")
++
++_PIP_VERSION = _get_most_recent_wheel_version("pip")
+
+ _PROJECTS = [
+ ("setuptools", _SETUPTOOLS_VERSION),
+@@ -94,12 +105,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
+ additional_paths = []
+ for project, version in _PROJECTS:
+ wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
+- whl = pkgutil.get_data(
+- "ensurepip",
+- "_bundled/{}".format(wheel_name),
+- )
+- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
+- fp.write(whl)
++ with open(os.path.join(_WHEEL_DIR, wheel_name), "rb") as sfp:
++ with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
++ fp.write(sfp.read())
+
+ additional_paths.append(os.path.join(tmpdir, wheel_name))
+
diff --git a/python3.spec b/python3.spec
index 3661213..6e87de8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
@@ -33,6 +33,9 @@ License: Python
# WARNING: This does not change the package name and summary above
%bcond_with flatpackage
+# Whether to use RPM build wheels from the python-{pip,setuptools}-wheel package
+# Uses upstream bundled prebuilt wheels otherwise
+%bcond_without rpmwheels
# Expensive optimizations (mainly, profile-guided optimizations)
%ifarch %{ix86} x86_64
@@ -46,13 +49,6 @@ License: Python
# Run the test suite in %%check
%bcond_without tests
-# Ability to reuse RPM-installed pip using rewheel
-%if %{with flatpackage}
-%bcond_with rewheel
-%else
-%bcond_without rewheel
-%endif
-
# Extra build for debugging the interpreter or C-API extensions
# (the -debug subpackages)
%if %{with flatpackage}
@@ -190,9 +186,9 @@ BuildRequires: /usr/bin/dtrace
# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
BuildRequires: /usr/sbin/ifconfig
-%if %{with rewheel}
-BuildRequires: python3-setuptools
-BuildRequires: python3-pip
+%if %{with rpmwheels}
+BuildRequires: python-setuptools-wheel
+BuildRequires: python-pip-wheel
%endif
@@ -283,10 +279,9 @@ Patch170: 00170-gc-assertions.patch
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# 00189 #
-# Add the rewheel module, allowing to recreate wheels from already installed
-# ones
-#
https://github.com/bkabrda/rewheel
-Patch189: 00189-add-rewheel-module.patch
+# Instead of bundled wheels, use our RPM packaged wheels from
+# /usr/share/python-wheels
+Patch189: 00189-use-rpm-wheels.patch
# 00205 #
# LIBPL variable in makefile takes LIBPL from configure.ac
@@ -363,11 +358,6 @@ Obsoletes: python%{pyshortver}
%global platpyver 3.6.2-20
Obsoletes: platform-python < %{platpyver}
-%if %{with rewheel}
-Requires: python3-setuptools
-Requires: python3-pip
-%endif
-
# This prevents ALL subpackages built from this spec to require
# /usr/bin/python3*. Granularity per subpackage is impossible.
# It's intended for the libs package not to drag in the interpreter, see
@@ -414,6 +404,14 @@ Requires: glibc%{?_isa} >= 2.24.90-26
Requires: gdbm-libs%{?_isa} >= 1:1.13
%endif
+%if %{with rpmwheels}
+Requires: python-setuptools-wheel
+Requires: python-pip-wheel
+%else
+Provides: bundled(python3-pip) = 10.0.1
+Provides: bundled(python3-setuptools) = 39.0.1
+%endif
+
# There are files in the standard library that have python shebang.
# We've filtered the automatic requirement out so libs are installable without
# the main package. This however makes it pulled in by default.
@@ -443,12 +441,7 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
BuildRequires: python-rpm-macros
Requires: python-rpm-macros
Requires: python3-rpm-macros
-
-%if %{with rewheel}
-# without rewheel is used to bootstrap setuptools+pip
-# python3-rpm-generators needs python3-setuptools, so we cannot have it yet
Requires: python3-rpm-generators
-%endif
#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
@@ -579,9 +572,13 @@ Requires: redhat-rpm-config
%global __requires_exclude ^python\\(abi\\) = 3\\..$
%global __provides_exclude ^python\\(abi\\) = 3\\..$
-# We keep those inside on purpose
+%if %{with rpmwheels}
+Requires: python-setuptools-wheel
+Requires: python-pip-wheel
+%else
Provides: bundled(python3-pip) = 10.0.1
Provides: bundled(python3-setuptools) = 39.0.1
+%endif
# The description for the flat package
%description
@@ -604,11 +601,6 @@ version once Python %{pybasever} is stable.
# Remove bundled libraries to ensure that we're using the system copy.
rm -r Modules/expat
-%if %{with rewheel}
-%global pip_version %(pip3 --version | cut -d' ' -f2)
-sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
-%endif
-
#
# Apply patches:
#
@@ -625,8 +617,9 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch170 -p1
%patch178 -p1
-%if %{with rewheel}
+%if %{with rpmwheels}
%patch189 -p1
+rm Lib/ensurepip/_bundled/*.whl
%endif
%patch205 -p1
@@ -1107,20 +1100,13 @@ CheckPython optimized
%{pylibdir}/ensurepip/*.py
%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
-%if %{without flatpackage}
+%if %{with rpmwheels}
%exclude %{pylibdir}/ensurepip/_bundled
%else
%dir %{pylibdir}/ensurepip/_bundled
%{pylibdir}/ensurepip/_bundled/*.whl
%endif
-%if %{with rewheel}
-%dir %{pylibdir}/ensurepip/rewheel/
-%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
-%{pylibdir}/ensurepip/rewheel/*.py
-%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
-%endif
-
%dir %{pylibdir}/test/
%dir %{pylibdir}/test/__pycache__/
%dir %{pylibdir}/test/support/
@@ -1520,6 +1506,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Aug 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-6
+- Use RPM built wheels of pip and setuptools in ensurepip instead of our rewheel patch
+
* Fri Aug 10 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-5
- Fix wrong requirement on gdbm
commit da8bebda6dc857076a540a222e65328def300345
Author: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
Date: Fri Aug 10 12:56:24 2018 +0200
Fix wrong requirement on gdbm
Signed-off-by: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
diff --git a/python3.spec b/python3.spec
index 4359d8b..3661213 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
@@ -411,7 +411,7 @@ Requires: glibc%{?_isa} >= 2.24.90-26
%if %{with gdbm}
# When built with this (as guarded by the BuildRequires above), require it
-Requires: gdbm%{?_isa} >= 1:1.13
+Requires: gdbm-libs%{?_isa} >= 1:1.13
%endif
# There are files in the standard library that have python shebang.
@@ -1520,6 +1520,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Aug 10 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-5
+- Fix wrong requirement on gdbm
+
* Fri Jul 20 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-4
- Allow to call Py_Main() after Py_Initialize()
Resolves: rhbz#1595421
commit a64e7f7e987353a3485cac592d39ff7a78b1718b
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat Aug 4 22:07:21 2018 +0200
Use the %{valgrind_arches} macro instead of hardcoding unsupported arches
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.o...
diff --git a/python3.spec b/python3.spec
index a3ff6af..4359d8b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -71,10 +71,9 @@ License: Python
%bcond_without computed_gotos
# Support for the Valgrind debugger/profiler
-%ifnarch s390 %{mips} riscv64
+%ifarch %{valgrind_arches}
%bcond_without valgrind
%else
-# Some arches don't have valgrind, disable support for it there.
%bcond_with valgrind
%endif
commit 37437e1d447934363bebd27bfadccc041e9b4cde
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jul 20 17:47:22 2018 +0200
Allow to call Py_Main() after Py_Initialize()
Resolves: rhbz#1595421
diff --git a/00307-allow-to-call-Py_Main-after-Py_Initialize.patch
b/00307-allow-to-call-Py_Main-after-Py_Initialize.patch
new file mode 100644
index 0000000..d9c0486
--- /dev/null
+++ b/00307-allow-to-call-Py_Main-after-Py_Initialize.patch
@@ -0,0 +1,150 @@
+From bbd6fc7e77dbd33ae7d3670eaf7800b5d3ff42d3 Mon Sep 17 00:00:00 2001
+From: Victor Stinner <vstinner(a)redhat.com>
+Date: Fri, 20 Jul 2018 17:34:23 +0200
+Subject: [PATCH] bpo-34008: Allow to call Py_Main() after Py_Initialize()
+ (GH-8043)
+
+Py_Main() can again be called after Py_Initialize(), as in Python
+3.6. The new configuration is ignored, except of
+_PyMainInterpreterConfig.argv which is used to update sys.argv.
+(cherry picked from commit fb47bca9ee2d07ce96df94b4e4abafd11826eb01)
+
+Co-authored-by: Victor Stinner <vstinner(a)redhat.com>
+---
+ Lib/test/test_embed.py | 8 ++++++++
+ .../C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst | 1 +
+ Modules/main.c | 10 +++++++---
+ Programs/_testembed.c | 16 +++++++++++++++
+ Python/pylifecycle.c | 23 +++++++++++++++++++---
+ 5 files changed, 52 insertions(+), 6 deletions(-)
+ create mode 100644 Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
+
+diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
+index f3b60433ccc1..024c3f99a85d 100644
+--- a/Lib/test/test_embed.py
++++ b/Lib/test/test_embed.py
+@@ -238,6 +238,14 @@ def test_initialize_twice(self):
+ self.assertEqual(out, '')
+ self.assertEqual(err, '')
+
++ def test_initialize_pymain(self):
++ """
++ bpo-34008: Calling Py_Main() after Py_Initialize() must not fail.
++ """
++ out, err = self.run_embedded_interpreter("initialize_pymain")
++ self.assertEqual(out.rstrip(), "Py_Main() after Py_Initialize:
sys.argv=['-c', 'arg2']")
++ self.assertEqual(err, '')
++
+
+ if __name__ == "__main__":
+ unittest.main()
+diff --git a/Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
b/Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
+new file mode 100644
+index 000000000000..d9881b9945df
+--- /dev/null
++++ b/Misc/NEWS.d/next/C API/2018-07-02-10-58-11.bpo-34008.COewz-.rst
+@@ -0,0 +1 @@
++Py_Main() can again be called after Py_Initialize(), as in Python 3.6.
+diff --git a/Modules/main.c b/Modules/main.c
+index 3809fa4abef5..31ebbceb83e0 100644
+--- a/Modules/main.c
++++ b/Modules/main.c
+@@ -2647,9 +2647,13 @@ pymain_main(_PyMain *pymain)
+
+ pymain_init_stdio(pymain);
+
+- pymain->err = _Py_InitializeCore(&pymain->config);
+- if (_Py_INIT_FAILED(pymain->err)) {
+- _Py_FatalInitError(pymain->err);
++ /* bpo-34008: For backward compatibility reasons, calling Py_Main() after
++ Py_Initialize() ignores the new configuration. */
++ if (!_PyRuntime.initialized) {
++ pymain->err = _Py_InitializeCore(&pymain->config);
++ if (_Py_INIT_FAILED(pymain->err)) {
++ _Py_FatalInitError(pymain->err);
++ }
+ }
+
+ if (pymain_init_python_main(pymain) < 0) {
+diff --git a/Programs/_testembed.c b/Programs/_testembed.c
+index b8827f074b9c..b1be682f7adc 100644
+--- a/Programs/_testembed.c
++++ b/Programs/_testembed.c
+@@ -276,6 +276,21 @@ static int test_initialize_twice(void)
+ return 0;
+ }
+
++static int test_initialize_pymain(void)
++{
++ wchar_t *argv[] = {L"PYTHON", L"-c",
++ L"import sys; print(f'Py_Main() after Py_Initialize:
sys.argv={sys.argv}')",
++ L"arg2"};
++ _testembed_Py_Initialize();
++
++ /* bpo-34008: Calling Py_Main() after Py_Initialize() must not crash */
++ Py_Main(Py_ARRAY_LENGTH(argv), argv);
++
++ Py_Finalize();
++
++ return 0;
++}
++
+
+ /* *********************************************************
+ * List of test cases and the function that implements it.
+@@ -302,6 +317,7 @@ static struct TestCase TestCases[] = {
+ { "pre_initialization_sys_options", test_pre_initialization_sys_options
},
+ { "bpo20891", test_bpo20891 },
+ { "initialize_twice", test_initialize_twice },
++ { "initialize_pymain", test_initialize_pymain },
+ { NULL, NULL }
+ };
+
+diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
+index fdb759f480be..219a46558825 100644
+--- a/Python/pylifecycle.c
++++ b/Python/pylifecycle.c
+@@ -775,6 +775,22 @@ _Py_InitializeCore(const _PyCoreConfig *core_config)
+ return _Py_INIT_OK();
+ }
+
++/* Py_Initialize() has already been called: update the main interpreter
++ configuration. Example of bpo-34008: Py_Main() called after
++ Py_Initialize(). */
++static _PyInitError
++_Py_ReconfigureMainInterpreter(PyInterpreterState *interp,
++ const _PyMainInterpreterConfig *config)
++{
++ if (config->argv != NULL) {
++ int res = PyDict_SetItemString(interp->sysdict, "argv",
config->argv);
++ if (res < 0) {
++ return _Py_INIT_ERR("fail to set sys.argv");
++ }
++ }
++ return _Py_INIT_OK();
++}
++
+ /* Update interpreter state based on supplied configuration settings
+ *
+ * After calling this function, most of the restrictions on the interpreter
+@@ -796,9 +812,6 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig
*config)
+ if (!_PyRuntime.core_initialized) {
+ return _Py_INIT_ERR("runtime core not initialized");
+ }
+- if (_PyRuntime.initialized) {
+- return _Py_INIT_ERR("main interpreter already initialized");
+- }
+
+ /* Get current thread state and interpreter pointer */
+ tstate = PyThreadState_GET();
+@@ -813,6 +826,10 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig
*config)
+ return _Py_INIT_ERR("failed to copy main interpreter config");
+ }
+
++ if (_PyRuntime.initialized) {
++ return _Py_ReconfigureMainInterpreter(interp, config);
++ }
++
+ if (interp->core_config._disable_importlib) {
+ /* Special mode for freeze_importlib: run with no import system
+ *
diff --git a/python3.spec b/python3.spec
index b77ab76..a3ff6af 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
@@ -311,6 +311,12 @@ Patch274: 00274-fix-arch-names.patch
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
+# 00307 #
+# Allow to call Py_Main() after Py_Initialize()
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1595421
+# and:
https://bugs.python.org/issue34008
+Patch307: 00307-allow-to-call-Py_Main-after-Py_Initialize.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -628,6 +634,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch251 -p1
%patch274 -p1
%patch291 -p1
+%patch307 -p1
# Remove files that should be generated by the build
@@ -1514,6 +1521,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Jul 20 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-4
+- Allow to call Py_Main() after Py_Initialize()
+Resolves: rhbz#1595421
+
* Sat Jul 14 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.0-3
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
commit d90f9872b6d41e2cff3389ded4f9df5e28c092b0
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jul 9 12:53:43 2018 +0200
Replace no longer relevant notes from bootstrapping 3.6 with link to 3.7
diff --git a/python3.spec b/python3.spec
index 3863a95..b77ab76 100644
--- a/python3.spec
+++ b/python3.spec
@@ -79,40 +79,8 @@ License: Python
%endif
-# ==================================
-# Notes from bootstraping Python 3.6
-# ==================================
-#
-# New Python major version (3.X) break ABI and bytecode compatibility,
-# so all packages depending on it need to be rebuilt.
-#
-# Due to a dependency cycle between Python, gdb, rpm, pip, setuptools, wheel,
-# and other packages, this isn't straightforward.
-# Build in the following order:
-#
-# 1. At the same time:
-# - gdb without python support (add %%global _without_python 1 on top of
-# gdb's SPEC file)
-# - python-rpm-generators
-# (this can be done also during step 2., but should be done before 3.)
-# 2. python3 without rewheel (use %%bcond_with rewheel instead of
-# %%bcond_without)
-# 3. gdb with python support (remove %%global _without_python 1 on top of
-# gdb's SPEC file)
-# 4. rpm
-# 5. python-setuptools with bootstrap set to 1
-# 6. python-pip with build_wheel set to 0
-# 7. python-wheel with %%bcond_without bootstrap
-# 8. python-setuptools with bootstrap set to 0 and also with_check set to 0
-# 9. python-pip with build_wheel set to 1
-# 10. pyparsing
-# 11. python3 with rewheel
-#
-# Then the most important packages have to be built, in dependency order.
-# These were:
-# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt
-#
-# After these have been built, a targeted rebuild should be done for the rest.
+# Notes from bootstraping Python 3.7:
+#
https://fedoraproject.org/wiki/SIGs/Python/UpgradingPython
# =====================
commit 266317a762f36aa79cb4db25039b3b0e4bee9a9d
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Sat Jul 14 02:50:11 2018 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng(a)fedoraproject.org>
diff --git a/python3.spec b/python3.spec
index 4e972c5..3863a95 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
@@ -1546,6 +1546,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Sat Jul 14 2018 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.7.0-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
* Thu Jul 12 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-2
- Rebuild for new gdbm
commit 7a4ecff9a735f2a154aeb7a22b4a6503226b31eb
Author: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
Date: Thu Jul 12 10:58:16 2018 +0200
Rebuild for new gdbm
Signed-off-by: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
diff --git a/python3.spec b/python3.spec
index ccada0f..4e972c5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -1546,6 +1546,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Jul 12 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.7.0-2
+- Rebuild for new gdbm
+
* Wed Jun 27 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-1
- Update to 3.7.0 final
commit dc63bc71b5e68ce18dd72bc15a99817ce16cfa8d
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jun 27 12:17:46 2018 +0200
Update to 3.7.0 final
diff --git a/python3.spec b/python3.spec
index 7f9c29a..ccada0f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -11,14 +11,10 @@ Name: python3
Summary: Interpreter of the Python programming language
URL:
https://www.python.org/
-
-# First rc
-%global prerel rc1
-
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.21.%{?prerel}%{?dist}
+Release: 1%{?dist}
License: Python
@@ -237,7 +233,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
@@ -1550,6 +1546,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Jun 27 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-1
+- Update to 3.7.0 final
+
* Wed Jun 13 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.21.rc1
- Finish bootstrapping, enable rewheel, tests, optimizations
diff --git a/sources b/sources
index 8ed12d6..099b345 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0rc1.tar.xz) =
cc4c29dfce7e2fca6328f802bd435e1ffc4acecd70d83d602a894bf076bdb95fb4635c891043ba1c3b6438d23ba7f76545cfe323ec0b57029b5c0f639fc6d2c5
+SHA512 (Python-3.7.0.tar.xz) =
8bb11233fb67ee9ab8ed1b72f8fdc62f66e26a6beaaeb92448bce681cf065269833b1658d3ed2459127f25ba43adb0eab73cf27c59834a2a803fb529b4216739
commit 838e397e16128957c8fcf6f2db31b099d2d90350
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jun 18 23:44:35 2018 +0200
Install appdata files to %{_metainfodir}
See:
https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Applica...
and:
https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html
diff --git a/python3.spec b/python3.spec
index 7e2cd03..7f9c29a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -893,9 +893,9 @@ install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/h
desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
# Install and validate appdata file
-mkdir -p %{buildroot}%{_datadir}/appdata
-cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
-appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
+mkdir -p %{buildroot}%{_metainfodir}
+cp -a %{SOURCE11} %{buildroot}%{_metainfodir}
+appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/idle3.appdata.xml
%endif
# Make sure distutils looks at the right pyconfig.h file
@@ -1371,7 +1371,7 @@ CheckPython optimized
%{pylibdir}/idlelib
%if %{without flatpackage}
-%{_datadir}/appdata/idle3.appdata.xml
+%{_metainfodir}/idle3.appdata.xml
%{_datadir}/applications/idle3.desktop
%{_datadir}/icons/hicolor/*/apps/idle3.*
%endif
commit 40d6240272f02361704e89a807f683e81ef84a0b
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jun 18 23:42:46 2018 +0200
Remove %defattr(-, root, root)
It is not needed since gods know when. Is's the default.
diff --git a/python3.spec b/python3.spec
index cfe6468..7e2cd03 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1080,7 +1080,6 @@ CheckPython optimized
%files
-%defattr(-, root, root)
%license LICENSE
%doc README.rst
@@ -1102,7 +1101,6 @@ CheckPython optimized
%if %{without flatpackage}
%files libs
-%defattr(-,root,root,-)
%license LICENSE
%doc README.rst
%endif
@@ -1336,7 +1334,6 @@ CheckPython optimized
%if %{without flatpackage}
%files devel
-%defattr(-,root,root)
%{_bindir}/2to3
%endif
@@ -1365,7 +1362,6 @@ CheckPython optimized
%if %{without flatpackage}
%files idle
-%defattr(-,root,root,755)
%{_bindir}/idle*
%else
@@ -1382,7 +1378,6 @@ CheckPython optimized
%if %{without flatpackage}
%files tkinter
-%defattr(-,root,root,755)
%endif
%{pylibdir}/tkinter
@@ -1401,7 +1396,6 @@ CheckPython optimized
%if %{without flatpackage}
%files test
-%defattr(-, root, root)
%endif
%{pylibdir}/ctypes/test
@@ -1427,7 +1421,6 @@ CheckPython optimized
%if %{with debug_build}
%if %{without flatpackage}
%files debug
-%defattr(-,root,root,-)
%{_bindir}/python3-debug
%endif
commit d780a93d16002cb4fddc858863437c784a904516
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jun 13 20:47:48 2018 +0200
Don't hardcode pip version, make it dynamic at build time
This will make test_with_pip (test.test_venv.EnsurePipTest) happy.
diff --git a/python3.spec b/python3.spec
index ae579b5..cfe6468 100644
--- a/python3.spec
+++ b/python3.spec
@@ -636,7 +636,7 @@ version once Python %{pybasever} is stable.
rm -r Modules/expat
%if %{with rewheel}
-%global pip_version 9.0.1
+%global pip_version %(pip3 --version | cut -d' ' -f2)
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
%endif
commit 3ba1d1aadf6f9125a1d7a3059f8581aa738bb074
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jun 13 19:14:30 2018 +0200
Finish bootstrapping, enable rewheel, tests, optimizations
diff --git a/python3.spec b/python3.spec
index 5cb2190..ae579b5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.20.%{?prerel}%{?dist}
+Release: 0.21.%{?prerel}%{?dist}
License: Python
@@ -40,7 +40,7 @@ License: Python
# Expensive optimizations (mainly, profile-guided optimizations)
%ifarch %{ix86} x86_64
-%bcond_with optimizations
+%bcond_without optimizations
%else
# On some architectures, the optimized build takes tens of hours, possibly
# longer than Koji's 24-hour timeout. Disable optimizations here.
@@ -48,13 +48,13 @@ License: Python
%endif
# Run the test suite in %%check
-%bcond_with tests
+%bcond_without tests
# Ability to reuse RPM-installed pip using rewheel
%if %{with flatpackage}
%bcond_with rewheel
%else
-%bcond_with rewheel
+%bcond_without rewheel
%endif
# Extra build for debugging the interpreter or C-API extensions
@@ -1557,6 +1557,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Jun 13 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.21.rc1
+- Finish bootstrapping, enable rewheel, tests, optimizations
+
* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
- Update to 3.7.0rc1
- Bootstrap, disable rewheel, tests, optimizations
commit 2266a26125b54d320d22ce07e09ef6620e9d1065
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jun 13 15:27:50 2018 +0200
Bootstrap, disable tests, optimizations
diff --git a/python3.spec b/python3.spec
index c166c19..5cb2190 100644
--- a/python3.spec
+++ b/python3.spec
@@ -40,7 +40,7 @@ License: Python
# Expensive optimizations (mainly, profile-guided optimizations)
%ifarch %{ix86} x86_64
-%bcond_without optimizations
+%bcond_with optimizations
%else
# On some architectures, the optimized build takes tens of hours, possibly
# longer than Koji's 24-hour timeout. Disable optimizations here.
@@ -48,7 +48,7 @@ License: Python
%endif
# Run the test suite in %%check
-%bcond_without tests
+%bcond_with tests
# Ability to reuse RPM-installed pip using rewheel
%if %{with flatpackage}
@@ -1559,7 +1559,7 @@ CheckPython optimized
%changelog
* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
- Update to 3.7.0rc1
-- Bootstrap, disable rewheel
+- Bootstrap, disable rewheel, tests, optimizations
* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-4
- Fix multiprocessing regression on newer glibcs
commit 00bb7bddf29c3fd4a83a43f7f66fe90fd79740e1
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jun 12 13:55:40 2018 +0200
Bootstrap, disable rewheel
diff --git a/python3.spec b/python3.spec
index 1e2645b..c166c19 100644
--- a/python3.spec
+++ b/python3.spec
@@ -54,7 +54,7 @@ License: Python
%if %{with flatpackage}
%bcond_with rewheel
%else
-%bcond_without rewheel
+%bcond_with rewheel
%endif
# Extra build for debugging the interpreter or C-API extensions
@@ -1559,6 +1559,7 @@ CheckPython optimized
%changelog
* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
- Update to 3.7.0rc1
+- Bootstrap, disable rewheel
* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-4
- Fix multiprocessing regression on newer glibcs
commit cb1167a87825f7bce17fed3fc4e24a040995cd77
Merge: 2d5b843 de441a2
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jun 12 12:44:40 2018 +0200
Merge from python37, update to 3.7.0rc1
diff --cc python3.rpmlintrc
index 03607c6,0000000..6c1ce83
mode 100644,000000..100644
--- a/python3.rpmlintrc
+++ b/python3.rpmlintrc
@@@ -1,67 -1,0 +1,75 @@@
+# KNOWN BUGS:
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
+addFilter(r'crypto-policy-non-compliance-openssl')
+
+
+# TESTS:
+addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3.\d/test')
+
+
+# OTHER DELIBERATES:
+# chroot function
+addFilter(r'missing-call-to-chdir-with-chroot')
+
+# intentionally unversioned and selfobsoleted
+addFilter(r'unversioned-explicit-obsoletes python')
+addFilter(r'self-obsoletion python3\d obsoletes python3\d')
+
+# intentionally hardcoded
+addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
+
++# intentional for our pythonXY package
++addFilter(r'python3\d\.[^:]+: (E|W): devel-file-in-non-devel-package')
++
+# we have non binary stuff, python files
+addFilter(r'only-non-binary-in-usr-lib')
+
+# some devel files that are deliberately needed
+addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
+addFilter(r'devel-file-in-non-devel-package
/usr/lib64/python3\.\d/distutils/tests/xxmodule\.c')
+
+
+# SORRY, NOT SORRY:
+# manual pages
+addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix\.py)')
+addFilter(r'no-manual-page-for-binary python3.*-config$')
+addFilter(r'no-manual-page-for-binary python3.\dd?m$')
+
+# missing documentation from subpackages
+addFilter(r'^python3\d?-(debug|tkinter|test|idle)\.[^:]+: (E|W):
no-documentation')
+
+# platform python is obsoleted, but not provided
+addFilter(r'obsolete-not-provided platform-python')
+
+
- # RPMLINT IMPERFECTIONS:
- # ifarch applied patches are OK
- #
https://fedoraproject.org/wiki/Packaging:Guidelines#Architecture_Support
- addFilter(r'%ifarch-applied-patch')
++# RPMLINT IMPERFECTIONS
++#
https://github.com/rpm-software-management/rpmlint/issues/123
++addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3393')
++#
https://github.com/rpm-software-management/rpmlint/pull/133
++addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3394')
++
++#
https://bugzilla.redhat.com/show_bug.cgi?id=1550562
++#
https://github.com/rpm-software-management/rpmlint/issues/128
++addFilter(r'python-bytecode-inconsistent-mtime .* 1970')
+
+# debugsource
+addFilter(r'^python3\d?-debugsource\.[^:]+: (E|W): no-documentation')
+
+# debuginfo
+addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(build-id\)')
+
+# this is OK for F28+
+addFilter(r'library-without-ldconfig-post')
+
+# debug package contains devel and non-devel files
+addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-package')
+
+# this goes to other subpackage, hence not actually dangling, the read error is bogus
+addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
+addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
+
+# we need this macro to evaluate, even if the line starts with #
+addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
+
+# SPELLING ERRORS
+addFilter(r'spelling-error .* en_US
(bytecode|pyc|filename|tkinter|namespaces|pytest) ')
diff --cc python3.spec
index e7f52f5,0000000..1e2645b
mode 100644,000000..100644
--- a/python3.spec
+++ b/python3.spec
@@@ -1,2703 -1,0 +1,2680 @@@
+# ==================
+# Top-level metadata
+# ==================
+
- %global pybasever 3.6
++%global pybasever 3.7
+
+# pybasever without the dot:
- %global pyshortver 36
++%global pyshortver 37
+
+Name: python3
+Summary: Interpreter of the Python programming language
+URL:
https://www.python.org/
+
++
++# First rc
++%global prerel rc1
++
+# WARNING When rebasing to a new Python version,
+# remember to update the python3-docs package as well
- Version: %{pybasever}.5
- Release: 4%{?dist}
++Version: %{pybasever}.0
++Release: 0.20.%{?prerel}%{?dist}
+License: Python
+
+
+# ==================================
+# Conditionals controlling the build
+# ==================================
+
+# Note that the bcond macros are named for the CLI option they create.
+# "%%bcond_without" means "ENABLE by default and create a --without
option"
+
++
+# Flat package, i.e. python36, python37, python38 for tox etc.
+# warning: changes some other defaults
+# in Fedora, never turn this on for the python3 package
- # and always keep it on for python36 etc.
++# and always keep it on for python37 etc.
+# WARNING: This does not change the package name and summary above
+%bcond_with flatpackage
+
+
+# Expensive optimizations (mainly, profile-guided optimizations)
+%ifarch %{ix86} x86_64
+%bcond_without optimizations
+%else
+# On some architectures, the optimized build takes tens of hours, possibly
+# longer than Koji's 24-hour timeout. Disable optimizations here.
+%bcond_with optimizations
+%endif
+
+# Run the test suite in %%check
+%bcond_without tests
+
+# Ability to reuse RPM-installed pip using rewheel
+%if %{with flatpackage}
+%bcond_with rewheel
+%else
+%bcond_without rewheel
+%endif
+
+# Extra build for debugging the interpreter or C-API extensions
+# (the -debug subpackages)
+%if %{with flatpackage}
+%bcond_with debug_build
+%else
+%bcond_without debug_build
+%endif
+
+# Support for the GDB debugger
+%bcond_without gdb_hooks
+
+# The dbm.gnu module (key-value database)
+%bcond_without gdbm
+
+# Main interpreter loop optimization
+%bcond_without computed_gotos
+
+# Support for the Valgrind debugger/profiler
+%ifnarch s390 %{mips} riscv64
+%bcond_without valgrind
+%else
+# Some arches don't have valgrind, disable support for it there.
+%bcond_with valgrind
+%endif
+
+
+# ==================================
+# Notes from bootstraping Python 3.6
+# ==================================
+#
+# New Python major version (3.X) break ABI and bytecode compatibility,
+# so all packages depending on it need to be rebuilt.
+#
+# Due to a dependency cycle between Python, gdb, rpm, pip, setuptools, wheel,
+# and other packages, this isn't straightforward.
+# Build in the following order:
+#
+# 1. At the same time:
+# - gdb without python support (add %%global _without_python 1 on top of
+# gdb's SPEC file)
+# - python-rpm-generators
+# (this can be done also during step 2., but should be done before 3.)
+# 2. python3 without rewheel (use %%bcond_with rewheel instead of
+# %%bcond_without)
+# 3. gdb with python support (remove %%global _without_python 1 on top of
+# gdb's SPEC file)
+# 4. rpm
+# 5. python-setuptools with bootstrap set to 1
+# 6. python-pip with build_wheel set to 0
+# 7. python-wheel with %%bcond_without bootstrap
+# 8. python-setuptools with bootstrap set to 0 and also with_check set to 0
+# 9. python-pip with build_wheel set to 1
+# 10. pyparsing
+# 11. python3 with rewheel
+#
+# Then the most important packages have to be built, in dependency order.
+# These were:
+# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt
+#
+# After these have been built, a targeted rebuild should be done for the rest.
+
+
+# =====================
+# General global macros
+# =====================
+
+%global pylibdir %{_libdir}/python%{pybasever}
+%global dynload_dir %{pylibdir}/lib-dynload
+
+# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
+# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
+%global ABIFLAGS_optimized m
+%global ABIFLAGS_debug dm
+
+%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
+%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
+
+%global SOABI_optimized
cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
+
+# All bytecode files are in a __pycache__ subdirectory, with a name
+# reflecting the version of the bytecode.
+# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
+# For example,
+# foo/bar.py
+# has bytecode at:
+# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
+%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
+
+# Python's configure script defines SOVERSION, and this is used in the Makefile
+# to determine INSTSONAME, the name of the libpython DSO:
+# LDLIBRARY='libpython$(VERSION).so'
+# INSTSONAME="$LDLIBRARY".$SOVERSION
+# We mirror this here in order to make it easier to add the -gdb.py hooks.
+# (if these get out of sync, the payload of the libs subpackage will fail
+# and halt the build)
+%global py_SOVERSION 1.0
+%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
+%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
+
+# Disable automatic bytecompilation. The python3 binary is not yet be
+# available in /usr/bin when Python is built. Also, the bytecompilation fails
+# on files that test invalid syntax.
+%undefine py_auto_byte_compile
+
+# For multilib support, files that are different between 32- and 64-bit arches
+# need different filenames. Use "64" or "32" according to the word
size.
+# Currently, the best way to determine an architecture's word size happens to
+# be checking %%{_lib}.
+%if "%{_lib}" == "lib64"
+%global wordsize 64
+%else
+%global wordsize 32
+%endif
+
+
+# =======================
+# Build-time requirements
+# =======================
+
+# (keep this list alphabetized)
+
+BuildRequires: autoconf
+BuildRequires: bluez-libs-devel
+BuildRequires: bzip2
+BuildRequires: bzip2-devel
+BuildRequires: desktop-file-utils
+BuildRequires: expat-devel
+
+BuildRequires: findutils
+BuildRequires: gcc-c++
+%if %{with gdbm}
+BuildRequires: gdbm-devel >= 1:1.13
+%endif
+BuildRequires: glibc-devel
+BuildRequires: gmp-devel
+BuildRequires: libappstream-glib
+BuildRequires: libffi-devel
+BuildRequires: libnsl2-devel
+BuildRequires: libtirpc-devel
+BuildRequires: libGL-devel
++BuildRequires: libuuid-devel
+BuildRequires: libX11-devel
+BuildRequires: ncurses-devel
+
+BuildRequires: openssl-devel
+BuildRequires: pkgconfig
+BuildRequires: readline-devel
+BuildRequires: sqlite-devel
+BuildRequires: gdb
+
+BuildRequires: tar
+BuildRequires: tcl-devel
+BuildRequires: tix-devel
+BuildRequires: tk-devel
+
+%if %{with valgrind}
+BuildRequires: valgrind-devel
+%endif
+
+BuildRequires: xz-devel
+BuildRequires: zlib-devel
+
+BuildRequires: /usr/bin/dtrace
+
+# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
+BuildRequires: /usr/sbin/ifconfig
+
+%if %{with rewheel}
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%endif
+
+
+# =======================
+# Source code and patches
+# =======================
+
- Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
-
- # Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
- # to enable specfiles to selectively byte-compile individual files and paths
- # with different Python runtimes as necessary:
- Source3: macros.pybytecompile%{pybasever}
++Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
+
+# A simple script to check timestamps of bytecode files
+# Run in check section with Python that is currently being built
+# Written by bkabrda
+Source8: check-pyc-and-pyo-timestamps.py
+
- # Backward compatible no-op macro for system-python
- # Remove in Fedora 29
- Source9: macros.systempython
-
+# Desktop menu entry for idle3
+Source10: idle3.desktop
+
+# AppData file for idle3
+Source11: idle3.appdata.xml
+
+# 00001 #
+# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
+# Was Patch0 in ivazquez' python3000 specfile:
+Patch1: 00001-rpath.patch
+
+# 00102 #
+# Change the various install paths to use /usr/lib64/ instead or /usr/lib
+# Only used when "%%{_lib}" == "lib64"
+# Not yet sent upstream.
+Patch102: 00102-lib64.patch
+
+# 00111 #
+# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
+# a libpythonMAJOR.MINOR.a
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
+# Downstream only: not appropriate for upstream
+Patch111: 00111-no-static-lib.patch
+
+# 00132 #
+# Add non-standard hooks to unittest for use in the "check" phase below, when
+# running selftests within the build:
+# @unittest._skipInRpmBuild(reason)
+# for tests that hang or fail intermittently within the build environment, and:
+# @unittest._expectedFailureInRpmBuild
+# for tests that always fail within the build environment
+#
+# The hooks only take effect if WITHIN_PYTHON_RPM_BUILD is set in the
+# environment, which we set manually in the appropriate portion of the
"check"
+# phase below (and which potentially other python-* rpms could set, to reuse
+# these unittest hooks in their own "check" phases)
+Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
+
+# 00155 #
+# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
+# generating SELinux denials on "import ctypes" and "import uuid"
when
+# embedding Python within httpd
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=814391
+Patch155: 00155-avoid-ctypes-thunks.patch
+
+# 00160 #
+# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
+# header files in the build chroot, but may not be supported in the running
+# kernel, hence we disable this test in an rpm build.
+# Adding these was upstream issue
http://bugs.python.org/issue10142
+# Not yet sent upstream
+Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
+
+# 00163 #
+# Some tests within test_socket fail intermittently when run inside Koji;
+# disable them using unittest._skipInRpmBuild
+# Not yet sent upstream
+Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
+
+# 00170 #
+# In debug builds, try to print repr() when a C-level assert fails in the
+# garbage collector (typically indicating a reference-counting error
+# somewhere else e.g in an extension module)
+# The new macros/functions within gcmodule.c are hidden to avoid exposing
+# them within the extension API.
+# Sent upstream:
http://bugs.python.org/issue9263
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=614680
+Patch170: 00170-gc-assertions.patch
+
+# 00178 #
+# Don't duplicate various FLAGS in sysconfig values
+#
http://bugs.python.org/issue17679
+# Does not affect python2 AFAICS (different sysconfig values initialization)
+Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
+
+# 00189 #
+# Add the rewheel module, allowing to recreate wheels from already installed
+# ones
+#
https://github.com/bkabrda/rewheel
+Patch189: 00189-add-rewheel-module.patch
+
+# 00205 #
+# LIBPL variable in makefile takes LIBPL from configure.ac
+# but the LIBPL variable defined there doesn't respect libdir macro
+Patch205: 00205-make-libpl-respect-lib64.patch
+
+# 00251
+# 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
+Patch251: 00251-change-user-install-location.patch
+
- # 00262 #
- # Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
- #
https://www.python.org/dev/peps/pep-0538/
- # Fedora Change:
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
- # Original proposal:
https://bugzilla.redhat.com/show_bug.cgi?id=1404918
- Patch262: 00262-pep538_coerce_legacy_c_locale.patch
-
+# 00274 #
+# Upstream uses Debian-style architecture naming. Change to match Fedora.
+Patch274: 00274-fix-arch-names.patch
+
- # 00292 #
- # Restore the public PyExc_RecursionErrorInst symbol that was removed
- # from the 3.6.4 release upstream.
- # Reported upstream:
https://bugs.python.org/issue30697
- Patch292: 00292-restore-PyExc_RecursionErrorInst-symbol.patch
-
- # 00294 #
- # Define TLS cipher suite on build time depending
- # on the OpenSSL default cipher suite selection.
- # Fixed upstream on CPython's 3.7 branch:
- #
https://bugs.python.org/issue31429
- # See also:
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
- Patch294: 00294-define-TLS-cipher-suite-on-build-time.patch
-
- # 00301 #
- # Tools/scripts/pathfix.py: Add -n option for no backup~
- # See:
https://bugzilla.redhat.com/show_bug.cgi?id=1546990
- # Fixed upstream:
https://bugs.python.org/issue32885
- Patch301: 00301-pathfix-add-n-option-for-no-backup.patch
-
- # 00302 #
- # Fix multiprocessing regression on newer glibcs
- # See:
https://bugzilla.redhat.com/show_bug.cgi?id=1569933
- # and:
https://bugs.python.org/issue33329
- Patch302: 00302-fix-multiprocessing-regression-on-newer-glibcs.patch
++# 00291 #
++# Build fails with undefined references to dlopen / dlsym otherwise.
++# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
++# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
++Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
+
+# (New patches go here ^^^)
+#
+# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
+# please try to keep the patch numbers in-sync between all specfiles.
+#
+# More information, and a patch number catalog, is at:
+#
+#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+
+
+# ==========================================
+# Descriptions, and metadata for subpackages
+# ==========================================
+
+%if %{without flatpackage}
+
+# Packages with Python modules in standard locations automatically
+# depend on python(abi). Provide that here.
+Provides: python(abi) = %{pybasever}
+
+# For backward compatibility only, remove in F29:
+Provides: system-python(abi) = %{pybasever}
+Provides: system-python = %{version}-%{release}
+Provides: system-python%{?_isa} = %{version}-%{release}
+Obsoletes: system-python < %{version}-%{release}
+
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
+# In order to support multiple Python interpreters for development purposes,
+# packages with the naming scheme flatpackage (e.g. python35) exist for
+# non-default versions of Python 3.
+# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
+# these names here.
+Provides: python%{pyshortver} = %{version}-%{release}
+# Note that using Obsoletes without package version is not standard practice.
+# Here we assert that *any* version of the system's default interpreter is
+# preferable to an "extra" interpreter. For example, python3-3.6.1 will
+# replace python36-3.6.2.
+Obsoletes: python%{pyshortver}
+
+# Shall be removed in Fedora 31
+# The release is bumped to 20, so we can do f27 platform-python updates
+# If the release in f27 ever goes >= 20, raise it here
+# If platform-python is ever reintroduced, make it higher version than this:
+%global platpyver 3.6.2-20
+Obsoletes: platform-python < %{platpyver}
+
+%if %{with rewheel}
+Requires: python3-setuptools
+Requires: python3-pip
+%endif
+
+# This prevents ALL subpackages built from this spec to require
+# /usr/bin/python3*. Granularity per subpackage is impossible.
+# It's intended for the libs package not to drag in the interpreter, see
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+# All others require %%{name} anyway.
+%global __requires_exclude ^/usr/bin/python3
+
+
+# The description used both for the SRPM and the main `python3` subpackage:
+%description
+Python is an accessible, high-level, dynamically typed, interpreted programming
+language, designed with an emphasis on code readability.
+It includes an extensive standard library, and has a vast ecosystem of
+third-party libraries.
+
+The %{name} package provides the "python3" executable: the reference
+interpreter for the Python language, version 3.
+The majority of its standard library is provided in the %{name}-libs package,
+which should be installed automatically along with %{name}.
+The remaining parts of the Python standard library are broken out into the
+%{name}-tkinter and %{name}-test packages, which may need to be installed
+separately.
+
+Documentation for Python is provided in the %{name}-docs package.
+
+Packages containing additional libraries for Python are generally named with
+the "%{name}-" prefix.
+
+
+%package libs
+Summary: Python runtime libraries
+
+# The "enum" module is included in the standard library.
+# Provide an upgrade path from the external library.
+Provides: python3-enum34 = 1.0.4-5%{?dist}
+Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
+
+# Python 3 built with glibc >= 2.24.90-26 needs to require it
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1410644
+Requires: glibc%{?_isa} >= 2.24.90-26
+
+%if %{with gdbm}
+# When built with this (as guarded by the BuildRequires above), require it
+Requires: gdbm%{?_isa} >= 1:1.13
+%endif
+
+# There are files in the standard library that have python shebang.
+# We've filtered the automatic requirement out so libs are installable without
+# the main package. This however makes it pulled in by default.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+Recommends: %{name}%{?_isa} = %{version}-%{release}
+
+# For backward compatibility only, remove in F29:
+Provides: system-python-libs = %{version}-%{release}
+Provides: system-python-libs%{?_isa} = %{version}-%{release}
+Obsoletes: system-python-libs < %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-libs < %{platpyver}
+Obsoletes: platform-python-libs-devel < %{platpyver}
+
+%description libs
+This package contains runtime libraries for use by Python:
+- the majority of the Python standard library
+- a dynamically linked library for use by applications that embed Python as
+ a scripting language, and by the main "python3" executable
+
+
+%package devel
+Summary: Libraries and header files needed for Python development
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+BuildRequires: python-rpm-macros
+Requires: python-rpm-macros
+Requires: python3-rpm-macros
++
++%if %{with rewheel}
++# without rewheel is used to bootstrap setuptools+pip
++# python3-rpm-generators needs python3-setuptools, so we cannot have it yet
+Requires: python3-rpm-generators
++%endif
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
+# TODO change to a specific subpackage once available (#1218294)
+Requires: redhat-rpm-config
+
+Provides: %{name}-2to3 = %{version}-%{release}
+Provides: 2to3 = %{version}-%{release}
+
+Conflicts: %{name} < %{version}-%{release}
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+# /usr/bin/2to3 was moved from python2-tools to python3-tools
+# TODO Remove in Fedora 29
+Conflicts: python2-tools < 2.7.13-17
+Conflicts: python-tools < 2.7.13-17
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+# /usr/bin/2to3 was moved from python3-tools to python3-devel
+# TODO Remove in Fedora 30
- Conflicts: python3-tools < 3.6.4-14
++Conflicts: python3-tools < 3.7
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-devel < %{platpyver}
+
+%description devel
+This package contains the header files and configuration needed to compile
+Python extension modules (typically written in C or C++), to embed Python
+into other programs, and to make binary distributions for Python libraries.
+
+It also contains the necessary macros to build RPM packages with Python modules
+and 2to3 tool, an automatic source converter from Python 2.X.
+
+
+%package idle
+Summary: A basic graphical development environment for Python
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-tkinter = %{version}-%{release}
+
+Provides: idle3 = %{version}-%{release}
+
+Provides: %{name}-tools = %{version}-%{release}
+Provides: %{name}-tools%{?_isa} = %{version}-%{release}
+Obsoletes: %{name}-tools < %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-tools < %{platpyver}
+
+%description idle
+IDLE is Pythons Integrated Development and Learning Environment.
+
+IDLE has the following features: Python shell window (interactive
+interpreter) with colorizing of code input, output, and error messages;
+multi-window text editor with multiple undo, Python colorizing,
+smart indent, call tips, auto completion, and other features;
+search within any window, replace within editor windows, and
+search through multiple files (grep); debugger with persistent
+breakpoints, stepping, and viewing of global and local namespaces;
+configuration, browsers, and other dialogs.
+
+
+%package tkinter
+Summary: A GUI toolkit for Python
+Requires: %{name} = %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-tkinter < %{platpyver}
+
+%description tkinter
+The Tkinter (Tk interface) library is a graphical user interface toolkit for
+the Python programming language.
+
+
+%package test
+Summary: The self-test suite for the main python3 package
+Requires: %{name} = %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-test < %{platpyver}
+
+%description test
+The self-test suite for the Python interpreter.
+
+This is only useful to test Python itself. For testing general Python code,
+you should use the unittest module from %{name}-libs, or a library such as
+%{name}-pytest or %{name}-nose.
+
+
+%if %{with debug_build}
+%package debug
+Summary: Debug version of the Python runtime
+
+# The debug build is an all-in-one package version of the regular build, and
+# shares the same .py/.pyc files and directories as the regular build. Hence
+# we depend on all of the subpackages of the regular build:
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+Requires: %{name}-test%{?_isa} = %{version}-%{release}
+Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
+Requires: %{name}-idle%{?_isa} = %{version}-%{release}
+
+%description debug
+python3-debug provides a version of the Python runtime with numerous debugging
+features enabled, aimed at advanced Python users such as developers of Python
+extension modules.
+
+This version uses more memory and will be slower than the regular Python build,
+but is useful for tracking down reference-counting issues and other bugs.
+
+The bytecode format is unchanged, so that .pyc files are compatible between
+this and the standard version of Python, but the debugging features mean that
+C/C++ extension modules are ABI-incompatible and must be built for each version
+separately.
+
+The debug build shares installation directories with the standard Python
+runtime, so that .py and .pyc files can be shared.
+Compiled extension modules use a special ABI flag ("d") in the filename,
+so extensions for both versions can co-exist in the same directory.
+%endif # with debug_build
+
+%else # with flatpackage
+
+Requires: redhat-rpm-config
+
+# We'll not provide this, on purpose
+# No package in Fedora shall ever depend on flatpackage via this
+%global __requires_exclude ^python\\(abi\\) = 3\\..$
+%global __provides_exclude ^python\\(abi\\) = 3\\..$
+
+# We keep those inside on purpose
- Provides: bundled(python3-pip) = 9.0.3
++Provides: bundled(python3-pip) = 10.0.1
+Provides: bundled(python3-setuptools) = 39.0.1
+
+# The description for the flat package
+%description
+Python %{pybasever} package for developers.
+
- This package exists to allow developers to test their code against an older
++This package exists to allow developers to test their code against a newer
+version of Python. This is not a full Python stack and if you wish to run
- your applications with Python %{pybasever}, see other distributions
- that support it, such as CentOS or RHEL with Software Collections
- or older Fedora releases.
++your applications with Python %{pybasever}, update your Fedora to a newer
++version once Python %{pybasever} is stable.
+
+%endif # with flatpackage
+
+# ======================================================
+# The prep phase of the build:
+# ======================================================
+
+%prep
+%setup -q -n Python-%{version}%{?prerel}
+
+# Remove bundled libraries to ensure that we're using the system copy.
+rm -r Modules/expat
- rm -r Modules/zlib
+
+%if %{with rewheel}
- %global pip_version 9.0.3
++%global pip_version 9.0.1
+sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
+%endif
+
+#
+# Apply patches:
+#
+%patch1 -p1
+
+%if "%{_lib}" == "lib64"
+%patch102 -p1
+%endif
+%patch111 -p1
+%patch132 -p1
+%patch155 -p1
+%patch160 -p1
+%patch163 -p1
+%patch170 -p1
+%patch178 -p1
+
+%if %{with rewheel}
+%patch189 -p1
+%endif
+
+%patch205 -p1
+%patch251 -p1
- %patch262 -p1
+%patch274 -p1
- %patch292 -p1
- %patch294 -p1
- %patch301 -p1
- %patch302 -p1
++%patch291 -p1
+
+
+# Remove files that should be generated by the build
+# (This is after patching, so that we can use patches directly from upstream)
+rm configure pyconfig.h.in
+
+
+# ======================================================
+# Configuring and building the code:
+# ======================================================
+
+%build
+
+# Regenerate the configure script and pyconfig.h.in
+autoconf
+autoheader
+
+# Remember the current directory (which has sources and the configure script),
+# so we can refer to it after we "cd" elsewhere.
+topdir=$(pwd)
+
+# Get proper option names from bconds
+%if %{with computed_gotos}
+%global computed_gotos_flag yes
+%else
+%global computed_gotos_flag no
+%endif
+
+%if %{with optimizations}
+%global optimizations_flag "--enable-optimizations"
+%else
+%global optimizations_flag "--disable-optimizations"
+%endif
+
+# Set common compiler/linker flags
+export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
+export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export LINKCC="gcc"
+export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
+export LDFLAGS="$RPM_LD_FLAGS -g $(pkg-config --libs-only-L openssl)"
+
+# We can build several different configurations of Python: regular and debug.
+# Define a common function that does one build:
+BuildPython() {
+ ConfName=$1
+ ExtraConfigArgs=$2
+ MoreCFlags=$3
+
+ # Each build is done in its own directory
+ ConfDir=build/$ConfName
+ echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ # Normally, %%configure looks for the "configure" script in the current
+ # directory.
+ # Since we changed directories, we need to tell %%configure where to look.
+ %global _configure $topdir/configure
+
+%configure \
+ --enable-ipv6 \
+ --enable-shared \
+ --with-computed-gotos=%{computed_gotos_flag} \
+ --with-dbmliborder=gdbm:ndbm:bdb \
+ --with-system-expat \
+ --with-system-ffi \
+ --enable-loadable-sqlite-extensions \
+ --with-dtrace \
+ --with-lto \
+ --with-ssl-default-suites=openssl \
+%if %{with valgrind}
+ --with-valgrind \
+%endif
+ $ExtraConfigArgs \
+ %{nil}
+
+ # Invoke the build
+ make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
+
+ popd
+ echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Call the above to build each configuration.
+
+%if %{with debug_build}
+BuildPython debug \
+ "--without-ensurepip --with-pydebug" \
+ "-O0"
+%endif # with debug_build
+
+BuildPython optimized \
+ "--without-ensurepip %{optimizations_flag}" \
+ ""
+
+# ======================================================
+# Installing the built code:
+# ======================================================
+
+%install
+
+# As in %%build, remember the current directory
+topdir=$(pwd)
+
+# We install a collection of hooks for gdb that make it easier to debug
+# executables linked against libpython3* (such as /usr/bin/python3 itself)
+#
+# These hooks are implemented in Python itself (though they are for the version
+# of python that gdb is linked with)
+#
+# gdb-archer looks for them in the same path as the ELF file or its .debug
+# file, with a -gdb.py suffix.
+# We put them next to the debug file, because ldconfig would complain if
+# it found non-library files directly in /usr/lib/
+# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
+#
+# We'll put these files in the debuginfo package by installing them to e.g.:
+# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
+# (note that the debug path is /usr/lib/debug for both 32/64 bit)
+#
+# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
+# information
+
+%if %{with gdb_hooks}
+DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+mkdir -p %{buildroot}$DirHoldingGdbPy
+%endif # with gdb_hooks
+
+# Multilib support for pyconfig.h
+# 32- and 64-bit versions of pyconfig.h are different. For multilib support
+# (making it possible to install 32- and 64-bit versions simultaneously),
+# we need to install them under different filenames, and to make the common
+# "pyconfig.h" include the right file based on architecture.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
+# Filanames are defined here:
+%global _pyconfig32_h pyconfig-32.h
+%global _pyconfig64_h pyconfig-64.h
+%global _pyconfig_h pyconfig-%{wordsize}.h
+
+# Use a common function to do an install for all our configurations:
+InstallPython() {
+
+ ConfName=$1
+ PyInstSoName=$2
+ MoreCFlags=$3
+ LDVersion=$4
+
+ # Switch to the directory with this configuration's built files
+ ConfDir=build/$ConfName
+ echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ make \
+ DESTDIR=%{buildroot} \
+ INSTALL="install -p" \
+ EXTRA_CFLAGS="$MoreCFlags" \
+ install
+
+ popd
+
+%if %{with gdb_hooks}
+ # See comment on $DirHoldingGdbPy above
+
PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
+ cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
+%endif # with gdb_hooks
+
+ # Rename the -devel script that differs on different arches to arch specific name
+ mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
+ echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
+
+ # Make python3-devel multilib-ready
+ mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
+ %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
+ cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+#include "%{_pyconfig32_h}"
+#elif __WORDSIZE == 64
+#include "%{_pyconfig64_h}"
+#else
+#error "Unknown word size"
+#endif
+EOF
+
+ echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Install the "debug" build first; any common files will be overridden with
+# later builds
+%if %{with debug_build}
+InstallPython debug \
+ %{py_INSTSONAME_debug} \
+ -O0 \
+ %{LDVERSION_debug}
+%endif # with debug_build
+
+# Now the optimized build:
+InstallPython optimized \
+ %{py_INSTSONAME_optimized} \
+ "" \
+ %{LDVERSION_optimized}
+
+# Install directories for additional packages
+install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
+%if "%{_lib}" == "lib64"
+# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
+# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
+# modules).
+# Note that rpmlint will complain about hardcoded library path;
+# this is intentional.
+install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
+%endif
+
+%if %{without flatpackage}
+# add idle3 to menu
+install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
+desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
+
+# Install and validate appdata file
+mkdir -p %{buildroot}%{_datadir}/appdata
+cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
+appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
+%endif
+
+# Make sure distutils looks at the right pyconfig.h file
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
+# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
+# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
+# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
+#
+# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
+# variants:
+sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
+ %{buildroot}%{pylibdir}/distutils/sysconfig.py \
+ %{buildroot}%{pylibdir}/sysconfig.py
+
+# Install pathfix.py to bindir
+# See
https://github.com/fedora-python/python-rpm-porting/issues/24
+cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+
+# Switch all shebangs to refer to the specific Python version.
+# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
+# so handle files named using other naming scheme separately.
+LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
+ Tools/scripts/pathfix.py \
+ -i "%{_bindir}/python%{pybasever}" -pn \
+ %{buildroot} \
+ %{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
+
+# Remove tests for python3-tools which was removed in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+rm -rf %{buildroot}%{pylibdir}/test/test_tools
+
+# Remove shebang lines from .py files that aren't executable, and
+# remove executability from .py files that don't have a shebang line:
+find %{buildroot} -name \*.py \
+ \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
+ -print -exec sed -i '1d' {} \; \) -o \( \
+ -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
+ -exec chmod a-x {} \; \) \)
+
+# Get rid of DOS batch files:
+find %{buildroot} -name \*.bat -exec rm {} \;
+
+# Get rid of backup files:
+find %{buildroot}/ -name "*~" -exec rm -f {} \;
+find . -name "*~" -exec rm -f {} \;
+
+# Get rid of a stray copy of the license:
+rm %{buildroot}%{pylibdir}/LICENSE.txt
+
+# Do bytecompilation with the newly installed interpreter.
+# This is similar to the script in macros.pybytecompile
+# compile *.pyc
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile,
sys; [py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt)
for opt in range(3) for f in sys.argv[1:]]' || :
+
+# Since we have pathfix.py in bindir, this is created, but we don't want it
+rm -rf %{buildroot}%{_bindir}/__pycache__
+
+# Fixup permissions for shared libraries from non-standard 555 to standard 755:
+find %{buildroot} -perm 555 -exec chmod 755 {} \;
+
- %if %{without flatpackage}
- # Install macros for rpm:
- mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
- install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
- install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
- %endif
-
+# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
+# avoid the user having to know the precise version and ABI flags.
+# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
+%if %{with debug_build} && %{without flatpackage}
+ln -s \
+ %{_bindir}/python%{LDVERSION_debug} \
+ %{buildroot}%{_bindir}/python3-debug
+%endif
+
+# System Python: Link the executable to libexec
+# This is for backwards compatibility only and should be removed in Fedora 29
+%if %{without flatpackage}
+mkdir -p %{buildroot}%{_libexecdir}
+ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
+%endif
+
++# There's 2to3-X.X executable and 2to3 soft link to it.
++# No reason to have both, so keep only 2to3 as an executable.
++# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
++mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
++
+%if %{with flatpackage}
+# Remove stuff that would conflict with python3 package
+rm %{buildroot}%{_bindir}/python3
+rm %{buildroot}%{_bindir}/pydoc3
+rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/idle3
+rm %{buildroot}%{_bindir}/python3-*
+rm %{buildroot}%{_bindir}/pyvenv
- rm %{buildroot}%{_bindir}/2to3*
++rm %{buildroot}%{_bindir}/2to3
+rm %{buildroot}%{_libdir}/libpython3.so
+rm %{buildroot}%{_mandir}/man1/python3.1*
+rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+%endif
+
++
+# ======================================================
+# Checks for packaging issues
+# ======================================================
+
+%check
+
+# first of all, check timestamps of bytecode files
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
+
+# Ensure that the curses module was linked against libncursesw.so, rather than
+# libncurses.so
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
+ldd %{buildroot}/%{dynload_dir}/_curses*.so \
+ | grep curses \
+ | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
+
+# Ensure that the debug modules are linked against the debug libpython, and
+# likewise for the optimized modules and libpython:
+for Module in %{buildroot}/%{dynload_dir}/*.so ; do
+ case $Module in
+ *.%{SOABI_debug})
+ ldd $Module | grep %{py_INSTSONAME_optimized} &&
+ (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
+
+ ;;
+ *.%{SOABI_optimized})
+ ldd $Module | grep %{py_INSTSONAME_debug} &&
+ (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
+ ;;
+ esac
+done
+
++
+# ======================================================
+# Running the upstream test suite
+# ======================================================
+
+topdir=$(pwd)
+CheckPython() {
+ ConfName=$1
+ ConfDir=$(pwd)/build/$ConfName
+
+ echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+ # Note that we're running the tests using the version of the code in the
+ # builddir, not in the buildroot.
+
+ # Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that
the
+ # our non-standard decorators take effect on the relevant tests:
+ # @unittest._skipInRpmBuild(reason)
+ # @unittest._expectedFailureInRpmBuild
- # test_faulthandler.test_register_chain currently fails on ppc64le and
- # aarch64, see upstream bug
http://bugs.python.org/issue21131
+ WITHIN_PYTHON_RPM_BUILD= \
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
+ -wW --slowest --findleaks \
+ -x test_distutils \
+ -x test_bdist_rpm \
- -x test_gdb \
- %ifarch ppc64le aarch64
- -x test_faulthandler \
- %endif
+ %ifarch %{mips64}
+ -x test_ctypes \
+ %endif
++ %ifarch %{power64} s390 s390x armv7hl %{mips}
++ -x test_gdb \
++ %endif
+ %ifarch ppc64le
+ -x test_buffer \
+ %endif
+
+ echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+}
+
+%if %{with tests}
+
+# Check each of the configurations:
+%if %{with debug_build}
+CheckPython debug
+%endif # with debug_build
+CheckPython optimized
+
+%endif # with tests
+
+
+%files
+%defattr(-, root, root)
+%license LICENSE
+%doc README.rst
+
+%if %{without flatpackage}
+%{_bindir}/pydoc*
+%{_bindir}/python3
+%{_bindir}/pyvenv
- %{_mandir}/*/*
- %{_bindir}/pyvenv
+# Remove in Fedora 29:
+%{_libexecdir}/system-python
+%else
+%{_bindir}/pydoc%{pybasever}
- %{_mandir}/*/python%{pybasever}*
+%endif
- %{_bindir}/pyvenv-%{pybasever}
++
+%{_bindir}/python%{pybasever}
+%{_bindir}/python%{pybasever}m
++%{_bindir}/pyvenv-%{pybasever}
++%{_mandir}/*/*
++
+
+%if %{without flatpackage}
+%files libs
+%defattr(-,root,root,-)
+%license LICENSE
+%doc README.rst
+%endif
+
+%dir %{pylibdir}
+%dir %{dynload_dir}
+
+%{pylibdir}/lib2to3
+%if %{without flatpackage}
+%exclude %{pylibdir}/lib2to3/tests
+%endif
+
+%dir %{pylibdir}/unittest/
+%dir %{pylibdir}/unittest/__pycache__/
+%{pylibdir}/unittest/*.py
+%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/asyncio/
+%dir %{pylibdir}/asyncio/__pycache__/
+%{pylibdir}/asyncio/*.py
+%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/venv/
+%dir %{pylibdir}/venv/__pycache__/
+%{pylibdir}/venv/*.py
+%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/venv/scripts
+
+%{pylibdir}/wsgiref
+%{pylibdir}/xmlrpc
+
+%dir %{pylibdir}/ensurepip/
+%dir %{pylibdir}/ensurepip/__pycache__/
+%{pylibdir}/ensurepip/*.py
+%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
+%exclude %{pylibdir}/ensurepip/_bundled
+%else
+%dir %{pylibdir}/ensurepip/_bundled
+%{pylibdir}/ensurepip/_bundled/*.whl
+%endif
+
+%if %{with rewheel}
+%dir %{pylibdir}/ensurepip/rewheel/
+%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
+%{pylibdir}/ensurepip/rewheel/*.py
+%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
+%endif
+
+%dir %{pylibdir}/test/
+%dir %{pylibdir}/test/__pycache__/
+%dir %{pylibdir}/test/support/
+%dir %{pylibdir}/test/support/__pycache__/
+%{pylibdir}/test/__init__.py
+%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%{pylibdir}/test/support/__init__.py
+%{pylibdir}/test/support/__pycache__/__init__%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/
+%dir %{pylibdir}/concurrent/__pycache__/
+%{pylibdir}/concurrent/*.py
+%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/futures/
+%dir %{pylibdir}/concurrent/futures/__pycache__/
+%{pylibdir}/concurrent/futures/*.py
+%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/pydoc_data
+
+%{dynload_dir}/_blake2.%{SOABI_optimized}.so
+%{dynload_dir}/_md5.%{SOABI_optimized}.so
+%{dynload_dir}/_sha1.%{SOABI_optimized}.so
+%{dynload_dir}/_sha256.%{SOABI_optimized}.so
+%{dynload_dir}/_sha3.%{SOABI_optimized}.so
+%{dynload_dir}/_sha512.%{SOABI_optimized}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
+%{dynload_dir}/_bisect.%{SOABI_optimized}.so
+%{dynload_dir}/_bz2.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
++%{dynload_dir}/_contextvars.%{SOABI_optimized}.so
+%{dynload_dir}/_crypt.%{SOABI_optimized}.so
+%{dynload_dir}/_csv.%{SOABI_optimized}.so
+%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
+%{dynload_dir}/_curses.%{SOABI_optimized}.so
+%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
+%{dynload_dir}/_dbm.%{SOABI_optimized}.so
+%{dynload_dir}/_decimal.%{SOABI_optimized}.so
+%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
+%{dynload_dir}/_heapq.%{SOABI_optimized}.so
+%{dynload_dir}/_json.%{SOABI_optimized}.so
+%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
+%{dynload_dir}/_lzma.%{SOABI_optimized}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
+%{dynload_dir}/_opcode.%{SOABI_optimized}.so
+%{dynload_dir}/_pickle.%{SOABI_optimized}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
++%{dynload_dir}/_queue.%{SOABI_optimized}.so
+%{dynload_dir}/_random.%{SOABI_optimized}.so
+%{dynload_dir}/_socket.%{SOABI_optimized}.so
+%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
+%{dynload_dir}/_ssl.%{SOABI_optimized}.so
+%{dynload_dir}/_struct.%{SOABI_optimized}.so
+%{dynload_dir}/array.%{SOABI_optimized}.so
+%{dynload_dir}/audioop.%{SOABI_optimized}.so
+%{dynload_dir}/binascii.%{SOABI_optimized}.so
+%{dynload_dir}/cmath.%{SOABI_optimized}.so
+%{dynload_dir}/_datetime.%{SOABI_optimized}.so
+%{dynload_dir}/fcntl.%{SOABI_optimized}.so
+%{dynload_dir}/grp.%{SOABI_optimized}.so
+%{dynload_dir}/math.%{SOABI_optimized}.so
+%{dynload_dir}/mmap.%{SOABI_optimized}.so
+%{dynload_dir}/nis.%{SOABI_optimized}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
+%{dynload_dir}/parser.%{SOABI_optimized}.so
+%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
+%{dynload_dir}/readline.%{SOABI_optimized}.so
+%{dynload_dir}/resource.%{SOABI_optimized}.so
+%{dynload_dir}/select.%{SOABI_optimized}.so
+%{dynload_dir}/spwd.%{SOABI_optimized}.so
+%{dynload_dir}/syslog.%{SOABI_optimized}.so
+%{dynload_dir}/termios.%{SOABI_optimized}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
+%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
++%{dynload_dir}/_uuid.%{SOABI_optimized}.so
+%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
+%{dynload_dir}/zlib.%{SOABI_optimized}.so
+
+%dir %{pylibdir}/site-packages/
+%dir %{pylibdir}/site-packages/__pycache__/
+%{pylibdir}/site-packages/README.txt
+%{pylibdir}/*.py
+%dir %{pylibdir}/__pycache__/
+%{pylibdir}/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/collections/
+%dir %{pylibdir}/collections/__pycache__/
+%{pylibdir}/collections/*.py
+%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/ctypes/
+%dir %{pylibdir}/ctypes/__pycache__/
+%{pylibdir}/ctypes/*.py
+%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/ctypes/macholib
+
+%{pylibdir}/curses
+
+%dir %{pylibdir}/dbm/
+%dir %{pylibdir}/dbm/__pycache__/
+%{pylibdir}/dbm/*.py
+%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/distutils/
+%dir %{pylibdir}/distutils/__pycache__/
+%{pylibdir}/distutils/*.py
+%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/distutils/README
+%{pylibdir}/distutils/command
+%exclude %{pylibdir}/distutils/command/wininst-*.exe
+
+%dir %{pylibdir}/email/
+%dir %{pylibdir}/email/__pycache__/
+%{pylibdir}/email/*.py
+%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/email/mime
+%doc %{pylibdir}/email/architecture.rst
+
+%{pylibdir}/encodings
+
+%{pylibdir}/html
+%{pylibdir}/http
+
+%dir %{pylibdir}/importlib/
+%dir %{pylibdir}/importlib/__pycache__/
+%{pylibdir}/importlib/*.py
+%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/json/
+%dir %{pylibdir}/json/__pycache__/
+%{pylibdir}/json/*.py
+%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/logging
+%{pylibdir}/multiprocessing
+
+%dir %{pylibdir}/sqlite3/
+%dir %{pylibdir}/sqlite3/__pycache__/
+%{pylibdir}/sqlite3/*.py
+%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
+%exclude %{pylibdir}/turtle.py
+%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%endif
+
+%{pylibdir}/urllib
+%{pylibdir}/xml
+
+%if "%{_lib}" == "lib64"
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
+%endif
+
+# "Makefile" and the config-32/64.h file are needed by
+# distutils/sysconfig.py:_init_posix(), so we include them in the core
+# package, along with their parent directories (bug 531901):
+%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%dir %{_includedir}/python%{LDVERSION_optimized}/
+%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+
+%{_libdir}/%{py_INSTSONAME_optimized}
+%if %{without flatpackage}
+%{_libdir}/libpython3.so
+%endif
+
++
+%if %{without flatpackage}
+%files devel
+%defattr(-,root,root)
+%{_bindir}/2to3
- # TODO: Remove 2to3-3.7 once rebased to 3.7
- %{_bindir}/2to3-%{pybasever}
+%endif
+
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
+%if %{without flatpackage}
+%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+%endif
+%{pylibdir}/distutils/command/wininst-*.exe
+%{_includedir}/python%{LDVERSION_optimized}/*.h
+%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
+
+%if %{without flatpackage}
+%{_bindir}/python3-config
+%{_libdir}/pkgconfig/python3.pc
- %{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
- %{_rpmconfigdir}/macros.d/macros.systempython
+%{_bindir}/pathfix.py
+%endif
+
+%{_bindir}/python%{pybasever}-config
+%{_bindir}/python%{LDVERSION_optimized}-config
+%{_bindir}/python%{LDVERSION_optimized}-*-config
+%{_libdir}/libpython%{LDVERSION_optimized}.so
+%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
+%{_libdir}/pkgconfig/python-%{pybasever}.pc
+
++
+%if %{without flatpackage}
+%files idle
+%defattr(-,root,root,755)
+
+%{_bindir}/idle*
+%else
+%{_bindir}/idle%{pybasever}
+%endif
+
+%{pylibdir}/idlelib
+
+%if %{without flatpackage}
+%{_datadir}/appdata/idle3.appdata.xml
+%{_datadir}/applications/idle3.desktop
+%{_datadir}/icons/hicolor/*/apps/idle3.*
+%endif
+
+%if %{without flatpackage}
+%files tkinter
+%defattr(-,root,root,755)
+%endif
+
+%{pylibdir}/tkinter
+%if %{without flatpackage}
+%exclude %{pylibdir}/tkinter/test
+%endif
+%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
+%{pylibdir}/turtle.py
+%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%dir %{pylibdir}/turtledemo
+%{pylibdir}/turtledemo/*.py
+%{pylibdir}/turtledemo/*.cfg
+%dir %{pylibdir}/turtledemo/__pycache__/
+%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
+
++
+%if %{without flatpackage}
+%files test
+%defattr(-, root, root)
+%endif
++
+%{pylibdir}/ctypes/test
+%{pylibdir}/distutils/tests
+%{pylibdir}/sqlite3/test
+%{pylibdir}/test
+%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
+%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
+%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
++%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
+%{pylibdir}/lib2to3/tests
+%{pylibdir}/tkinter/test
+%{pylibdir}/unittest/test
+
+
+# We don't bother splitting the debug build out into further subpackages:
+# if you need it, you're probably a developer.
+
+# Hence the manifest is the combination of analogous files in the manifests of
+# all of the other subpackages
+
+%if %{with debug_build}
+%if %{without flatpackage}
+%files debug
+%defattr(-,root,root,-)
+%{_bindir}/python3-debug
+%endif
+
+# Analog of the core subpackage's files:
+%{_bindir}/python%{LDVERSION_debug}
+
+# Analog of the -libs subpackage's files:
+# ...with debug builds of the built-in "extension" modules:
+
+%{dynload_dir}/_blake2.%{SOABI_debug}.so
+%{dynload_dir}/_md5.%{SOABI_debug}.so
+%{dynload_dir}/_sha1.%{SOABI_debug}.so
+%{dynload_dir}/_sha256.%{SOABI_debug}.so
+%{dynload_dir}/_sha3.%{SOABI_debug}.so
+%{dynload_dir}/_sha512.%{SOABI_debug}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_debug}.so
+%{dynload_dir}/_bisect.%{SOABI_debug}.so
+%{dynload_dir}/_bz2.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
++%{dynload_dir}/_contextvars.%{SOABI_debug}.so
+%{dynload_dir}/_crypt.%{SOABI_debug}.so
+%{dynload_dir}/_csv.%{SOABI_debug}.so
+%{dynload_dir}/_ctypes.%{SOABI_debug}.so
+%{dynload_dir}/_curses.%{SOABI_debug}.so
+%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
+%{dynload_dir}/_dbm.%{SOABI_debug}.so
+%{dynload_dir}/_decimal.%{SOABI_debug}.so
+%{dynload_dir}/_elementtree.%{SOABI_debug}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_debug}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_debug}.so
+%{dynload_dir}/_heapq.%{SOABI_debug}.so
+%{dynload_dir}/_json.%{SOABI_debug}.so
+%{dynload_dir}/_lsprof.%{SOABI_debug}.so
+%{dynload_dir}/_lzma.%{SOABI_debug}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
+%{dynload_dir}/_opcode.%{SOABI_debug}.so
+%{dynload_dir}/_pickle.%{SOABI_debug}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
++%{dynload_dir}/_queue.%{SOABI_debug}.so
+%{dynload_dir}/_random.%{SOABI_debug}.so
+%{dynload_dir}/_socket.%{SOABI_debug}.so
+%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
+%{dynload_dir}/_ssl.%{SOABI_debug}.so
+%{dynload_dir}/_struct.%{SOABI_debug}.so
+%{dynload_dir}/array.%{SOABI_debug}.so
+%{dynload_dir}/audioop.%{SOABI_debug}.so
+%{dynload_dir}/binascii.%{SOABI_debug}.so
+%{dynload_dir}/cmath.%{SOABI_debug}.so
+%{dynload_dir}/_datetime.%{SOABI_debug}.so
+%{dynload_dir}/fcntl.%{SOABI_debug}.so
+%{dynload_dir}/grp.%{SOABI_debug}.so
+%{dynload_dir}/math.%{SOABI_debug}.so
+%{dynload_dir}/mmap.%{SOABI_debug}.so
+%{dynload_dir}/nis.%{SOABI_debug}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
+%{dynload_dir}/parser.%{SOABI_debug}.so
+%{dynload_dir}/pyexpat.%{SOABI_debug}.so
+%{dynload_dir}/readline.%{SOABI_debug}.so
+%{dynload_dir}/resource.%{SOABI_debug}.so
+%{dynload_dir}/select.%{SOABI_debug}.so
+%{dynload_dir}/spwd.%{SOABI_debug}.so
+%{dynload_dir}/syslog.%{SOABI_debug}.so
+%{dynload_dir}/termios.%{SOABI_debug}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
+%{dynload_dir}/unicodedata.%{SOABI_debug}.so
++%{dynload_dir}/_uuid.%{SOABI_debug}.so
++%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
+%{dynload_dir}/zlib.%{SOABI_debug}.so
+
+# No need to split things out the "Makefile" and the config-32/64.h file as
we
+# do for the regular build above (bug 531901), since they're all in one package
+# now; they're listed below, under "-devel":
+
+%{_libdir}/%{py_INSTSONAME_debug}
+
+# Analog of the -devel subpackage's files:
+%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
+%{_includedir}/python%{LDVERSION_debug}
+%{_bindir}/python%{LDVERSION_debug}-config
+%{_bindir}/python%{LDVERSION_debug}-*-config
+%{_libdir}/libpython%{LDVERSION_debug}.so
+%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
+%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
+
+# Analog of the -tools subpackage's files:
+# None for now; we could build precanned versions that have the appropriate
+# shebang if needed
+
+# Analog of the tkinter subpackage's files:
+%{dynload_dir}/_tkinter.%{SOABI_debug}.so
+
+# Analog of the -test subpackage's files:
+%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
+%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
+%{dynload_dir}/_testcapi.%{SOABI_debug}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
+
+%endif # with debug_build
+
+# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
+#
+# The /usr/lib/rpm/redhat/macros defines %%__debug_package to use
+# debugfiles.list, and it appears that everything below /usr/lib/debug and
+# (/usr/src/debug) gets added to this file (via LISTFILES) in
+# /usr/lib/rpm/find-debuginfo.sh
+#
+# Hence by installing it below /usr/lib/debug we ensure it is added to the
+# -debuginfo subpackage
+# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
+# payload file would be unpackaged)
+
+# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
+%undefine _debuginfo_subpackages
+
+# ======================================================
+# Finally, the changelog:
+# ======================================================
+
+%changelog
++* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
++- Update to 3.7.0rc1
++
+* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-4
+- Fix multiprocessing regression on newer glibcs
+- Enable test_multiprocessing_fork(server) and _spawn again
+Resolves: rhbz#1569933
+
+* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-3
+- Skip test_multiprocessing_fork(server) and _spawn for now
+
+* Wed Apr 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-2
+- Add flatpackage conditionals
+
+* Thu Mar 29 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.5-1
+- Update to 3.6.5
+
+* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-20
+- Fix broken macro invocation and broken building of C Python extensions
+Resolves: rhbz#1560103
+
+* Fri Mar 16 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-19
+- Add -n option for pathfix.py
+Resolves: rhbz#1546990
+
+* Thu Mar 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-18
+- Fix the py_byte_compile macro to work on Python 2
+- Remove the pybytecompile macro file from the flat package
+Resolves: rhbz#1484993
+
+* Tue Mar 13 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-17
+- Do not send IP addresses in SNI TLS extension
+
+* Sat Feb 24 2018 Florian Weimer <fweimer(a)redhat.com> - 3.6.4-16
+- Rebuild with new LDFLAGS from redhat-rpm-config
+
+* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-15
+- Filter out automatic /usr/bin/python3.X requirement,
+ recommend the main package from libs instead
+Resolves: rhbz#1547131
+
+* Thu Feb 15 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.4-14
+- Remove the python3-tools package (#rhbz 1312030)
+- Move /usr/bin/2to3 to python3-devel
+- Move /usr/bin/idle and idlelib to python3-idle
+- Provide python3-tools from python3-idle
+
+* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-13
+- Escape macros in %%changelog
+
+* Fri Feb 02 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.4-12
+- Remove sys.executable check from change-user-install-location patch
+Resolves: rhbz#1532287
+
+* Thu Feb 01 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-11
+- Define TLS cipher suite on build time.
+
+* Wed Jan 31 2018 Tomas Orsava <torsava(a)redhat.com> - 3.6.4-10
+- Disable test_gdb for all arches and test_buffer for ppc64le in anticipation
+ of the F28 mass rebuild
+- Re-enable these tests after the mass rebuild when they can be properly
+ addressed
+
+* Tue Jan 23 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-9
+- Restore the PyExc_RecursionErrorInst public symbol
+
+* Tue Jan 23 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-8
+- Add patch to explicitly link _ctypes module with -ldl (#1537489)
+- Refactored patch for libxcrypt
+- Re-enable strict symbol checks in the link editor
+
+* Mon Jan 22 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-7
+- Add patch for libxcrypt
+- Disable strict symbol checks in the link editor
+
+* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-6
+- Rebuilt for switch to libxcrypt
+
+* Fri Jan 19 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-5
+- Fix localeconv() encoding for LC_NUMERIC
+
+* Thu Jan 18 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-4
+- R: gdbm-devel R: gdbm for python3-libs
+
+* Wed Jan 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-3
+- Require large enough gdbm (fixup for previous bump)
+
+* Tue Jan 16 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-2
+- Rebuild for reverted gdbm 1.13 on Fedora 27
+
+* Mon Jan 15 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-1
+- Update to version 3.6.4
+
+* Fri Jan 12 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-5
+- Fix the compilation of the nis module.
+
+* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
+- Raise the release of platform-python obsoletes for better maintainability
+
+* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
+- Obsolete platform-python and it's subpackages
+
+* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
+- Fix memory corruption due to allocator mix
+Resolves: rhbz#1498207
+
+* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
+- Update to Python 3.6.3
+
+* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
+- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
+- Make the -devel package require redhat-rpm-config
+Resolves: rhbz#1496757
+
+* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
+- Fix /usr/bin/env dependency from python3-tools
+Resolves: rhbz#1482118
+
+* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
+- Include `-g` in the flags sent to the linker (LDFLAGS)
+Resolves: rhbz#1483222
+
+* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
+- Specfile cleanup
+- Make the main description also applicable to the SRPM
+- Add audiotest.au to the test package
+
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
+- Remove %%{pylibdir}/Tools/scripts/2to3
+
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
+- Expat >= 2.1.0 is everywhere, remove explicit requires
+- Conditionalize systemtap-devel BuildRequires
+- For consistency, require /usr/sbin/ifconfig instead of net-tools
+
+* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
+- Rename patch files to be consistent
+- Run autotools to generate the configure script before building
+- Merge lib64 patches (104 into 102)
+- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
+- Remove patches 157 and 186, which had test changes left over after upstreaming
+- Remove patch 188, a temporary workaround for hashlib tests
+- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
+- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
+
+* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
+- Use python3 style of calling super() without arguments in rpath
+ patch to prevent recursion in UnixCCompiler subclasses
+Resolves: rhbz#1458122
+
+* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
+- Add bcond for --without optimizations
+- Reword package descriptions
+- Remove Group declarations
+- Skip failing test_float_with_comma
+
+* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
+- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
+
+* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
+- Use bconds for configuring the build
+- Reorganize the initial sections
+
+* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
+- Have /usr/bin/2to3 (rhbz#1111275)
+- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
+
+* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
+- Revert "Add --executable option to install.py command"
+ This enhancement is currently not needed and it can possibly
+ collide with `pip --editable`option
+
+* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
+- Fix the "urllib FTP protocol stream injection" vulnerability
+Resolves: rhbz#1478916
+
+* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
+- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
+ bsddb), however, no longer needod for Python 3
+- Tested building Python 3 with and without the dependency, all tests pass and
+ filelists of resulting RPMs are identical
+
+* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
+- Do not generate debuginfo subpackages (#1476593)
+- Rebuild with binutils fix for ppc64le (#1475636)
+
+* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
+- Make test_asyncio to not depend on the current SIGHUP signal handler.
+
+* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
+- Update to Python 3.6.2
+
+* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
+- Update to the latest upstream implementation of PEP 538
+
+* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
+- Make pip and distutils in user environment install into separate location
+
+* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
+- Fix test_alpn_protocols from test_ssl
+- Do not require rebundled setuptools dependencies
+
+* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
+- Added a dependency to the devel subpackage on python3-rpm-generators which
+ have been excised out of rpm-build
+- Updated notes on bootstrapping Python on top of this specfile accordingly
+- Involves: rhbz#1410631, rhbz#1444925
+
+* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
+- Enable profile guided optimizations for x86_64 and i686 architectures
+- Update to a newer implementation of PEP 538
+- Update description to reflect that Python 3 is now the default Python
+
+* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
+- Update PEP 538 to the latest upstream implementation
+
+* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
+- Enable link time optimizations
+- Move windows executables to the devel subpackage (rhbz#1426257)
+
+* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
+- Rename python3.Xdm-config script from -debug to be arch specific
+Resolves: rhbz#1179073
+
+* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
+- Install the Makefile in its proper location (rhbz#1438219)
+
+* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
+- Update to version 3.6.1 final
+
+* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
+- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
+
+* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
+- Update to Python 3.6.1 release candidate 1
+- Add patch 264 to skip a known test failure on aarch64
+
+* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
+- Use proper command line parsing in _testembed
+- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
+
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
+
+* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
+- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
+
+* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
+- Revert "Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables..." to prevent build failures
+ of packages using alternate build tools
+
+* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
+- Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables
+- Use new %%_module_build macro
+
+* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
+- Add --executable option to install.py command
+
+* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
+- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
+in order for the virtualenvs to work properly
+
+* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.6.0-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
+- Add missing %%license macro
+
+* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
+- Modify the runtime dependency of python3-libs on system-python-libs again,
+ because previous attempt didn't work properly with dnf resolving mechanism
+
+* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
+- Modify the runtime dependency of python3-libs on system-python-libs to use
+ just the version and release number, but not the dist tag due to Modularity
+
+* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
+- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
+- Skip test_aead_aes_gcm during rpmbuild
+
+* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
+- Rebuild for readline 7.x
+
+* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
+- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
+
+* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
+- Define HAVE_LONG_LONG as 1 for backwards compatibility
+
+* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
+- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
+
+* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
+- Update to Python 3.6.0 final
+
+* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
+- Enable rewheel
+
+* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
+- Update to Python 3.6.0 release candidate 1
+
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
+- Update to Python 3.6.0 beta 4
+
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
+- Set to work with pip version 9.0.1
+
+* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
+- Use proper patch numbering and base upstream branch for
+porting ssl and hashlib modules to OpenSSL 1.1.0
+- Drop hashlib patch for now
+- Add riscv64 arch to 64bit and no-valgrind arches
+
+* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
+- Make it build with OpenSSL-1.1.0 based on upstream patch
+
+* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
+- Obsolete and Provide python35 package
+
+* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
+- Update %%py_byte_compile macro
+- Remove unused configure flags (rhbz#1374357)
+
+* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
+- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
+ recompile optimized .pyc files
+- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
+ files are no more
+- Resolves rhbz#1373635
+
+* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
+- Rebased to version 3.5.2
+- Set to work with pip version 8.1.2
+- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
+- Removed arch or environment specific patches 194, 196, 203, and 208
+ as test builds indicate they are no longer needed
+- Updated patches 102, 146, and 242 to work with the new Python codebase
+- Removed patches 200, 201, 5000 which weren't even being applied
+
+* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
+- Fix for CVE-2016-1000110 HTTPoxy attack
+- SPEC file cleanup
+
+* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
+- Build properly on MIPS
+
+* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
+-
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
+
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
+- Refactor patch for properly fixing CVE-2016-5636
+
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
+- Fix test_pyexpat failure with Expat version of 2.2.0
+
+* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
+- Move xml module to system-python-libs
+
+* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
+- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
+- Raise an error when STARTTLS fails
+- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
+- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
+- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
+
+* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
+- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
+
+* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
+- Move distutils to system-python-libs
+
+* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
+- Provide python3-enum34
+
+* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
+- Provide System Python packages and macros
+
+* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
+- Drop python3 macros, require python/python3-rpm-macros
+
+* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
+- Update to 3.5.1
+- Removed patch 199 and 207 (upstream)
+
+* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
+- Remove versioned libpython from devel package
+
+* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
+- add correct arch for ppc64/ppc64le to fix build failure
+
+* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
+- Hide the private _Py_atomic_xxx symbols from public header
+
+* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
+- Rebuild with wheel set to 1
+
+* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
+- Update to 3.5.0
+
+* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
+- python3-devel: Require python-macros for version independant macros such as
+ python_provide. See fpc#281 and fpc#534.
+
+* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
+- Use 1024bit DH key in test_ssl
+- Use -O0 when compiling -debug build
+- Update pip version variable to the version we actually ship
+
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
+- Make relocating Python by changing _prefix actually work
+Resolves: rhbz#1231801
+
+* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
+- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
+
+* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
+- Updated to 3.4.3
+- BuildPython now accepts additional build options
+- Temporarily disabled test_gdb on arm (rhbz#1196181)
+
+* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
+- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
+ (
http://bugs.python.org/issue23433)
+
+* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
+- Rebuilt for Fedora 23 Change
+
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
+
+* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
+- Own systemtap dirs (#710733)
+
+* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
+- build with valgrind on ppc64le
+- disable test_gdb on s390(x) until rhbz#1181034 is resolved
+
+* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
+- New patches: 170 (gc asserts), 200 (gettext headers),
+ 201 (gdbm memory leak)
+
+* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
+- OpenSSL disabled SSLv3 in SSLv23 method
+
+* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
+- Update to 3.4.2
+- Refreshed patches: 156 (gdb autoload)
+- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
+
+* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
+- Fix CVE-2014-4650 - CGIHTTPServer URL handling
+Resolves: rhbz#1113529
+
+* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
+- exclude test_gdb on ppc* (rhbz#1132488)
+
+* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
+- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
+
+* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
+- aarch64 has valgrind, just list those that don't support it
+
+* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
+- bump release and rebuild to link with the correct tcl/tk libs on ppcle
+
+* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
+- Change paths to bundled projects in rewheel patch
+
+* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
+- In config script, use uname -m to write the arch
+
+* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
+- update the arch list where valgrind exists - %%power64 includes also
+ ppc64le which is not supported yet
+
+* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
+- Forward arguments to the arch specific config script
+Resolves: rhbz#1102683
+
+* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
+- Rename python3.Xm-config script to arch specific.
+Resolves: rhbz#1091815
+
+* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
+- Use python3-*, not python-* runtime requires on setuptools and pip
+- rebuild for tcl-8.6
+
+* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
+- Update the rewheel module
+
+* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
+- Fix multilib dependencies.
+Resolves: rhbz#1091815
+
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
+- Update to Python 3.4.1
+
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
+- Fix test_gdb failure on ppc64le
+Resolves: rhbz#1095355
+
+* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
+- Add macro %%python3_version_nodots
+
+* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
+- Disable test_faulthandler, test_gdb on aarch64
+Resolves: rhbz#1045193
+
+* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
+- Don't add Werror=declaration-after-statement for extension
+ modules through setup.py (PyBT#21121)
+
+* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
+- Add setuptools and pip to Requires
+
+* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
+- Point __os_install_post to correct brp-* files
+
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
+- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
+
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
+- Update to Python 3.4 final
+- Add patch adding the rewheel module
+- Merge patches from master
+
+* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
+- Update to Python 3.4 beta 2.
+- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
+- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
+
+* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
+- Update to Python 3.4 beta 1.
+- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
+ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
+- Removed patch 00187 (remove pthread atfork; upstreamed)
+
+* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
+- Update to Python 3.4 alpha 4.
+- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
+114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
+test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
+from py_compile)
+- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
+Koji), 142 (the mock issue that caused this is fixed)
+- Added patch 187 (remove thread atfork) - will be in next version
+- Refreshed script for checking pyc and pyo timestamps with new ignored files.
+- The fips patch is disabled for now until upstream makes a final decision
+what to do with sha3 implementation for 3.4.0.
+
+* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
+- Bytecompile all *.py files properly during build (rhbz#1023607)
+
+* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
+- Added fix for CVE-2013-4238 (rhbz#996399)
+
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
+- fix up indentation in arm patch
+
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
+- disable a test that fails on arm
+- enable valgrind support on arm arches
+
+* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
+- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
+
+* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
+- Add patch for CVE-2013-2099 (rhbz#963261).
+
+* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
+- Updated to Python 3.3.2.
+- Refreshed patches: 153 (gdb test noise)
+- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
+test threads)
+- Synced patch numbers with python.spec.
+
+* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
+- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
+
+* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
+- Add patch that enables building on ppc64p7 (replace the sed, so that
+we get consistent with python2 spec and it's more obvious that we're doing it.
+
+* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
+- Add fix for gdb tests failing on arm, rhbz#951802.
+
+* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
+- Updated to Python 3.3.1.
+- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
+153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
+keeping few more downstream tests)
+- Removed patches: 3 (audiotest.au made it to upstream tarball)
+- Removed workaround for
http://bugs.python.org/issue14774, discussed in
+http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
+
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
+- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
+
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
+- renumber patches to keep them in sync with python.spec
+
+* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
+- Fix error in platform.platform() when non-ascii byte strings are decoded to
+ unicode (rhbz#922149)
+
+* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
+- Fix up shared library extension (rhbz#889784)
+
+* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
+- add ppc64p7 build target, optimized for Power7
+
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
+- add workaround for ENOPROTOOPT seen running selftests in Koji
+(rhbz#913732)
+
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
+- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
+
+* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
+- add aarch64 (rhbz#909783)
+
+* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
+- add BR on bluez-libs-devel (rhbz#879720)
+
+* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
+- 3.3.0rc3 -> 3.3.0; drop alphatag
+
+* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
+- 3.3.0rc2 -> 3.3.0rc3
+
+* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
+- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
+
+* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
+- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
+
+* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
+- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
+134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
+correctly when LANG=C (patch 55); importlib.test was moved to
+test.test_importlib upstream
+
+* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
+- disable some failing checks on PPC* (rhbz#846849)
+
+* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
+- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
+patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
+configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream
issue 12326);
+"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
+for stdlib (upstream issues 10645 and 12218); email/test moved to
+test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
+_decimal and _lzma modules; make collections modules explicit in payload again
+(upstream issue 11085); add _testbuffer module to tests subpackage (added in
+upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
+workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
+distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
+_lzma module); skip some tests within test_socket (patch 163)
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+
+* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
+- use macro for power64 (rhbz#834653)
+
+* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
+- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
+
+* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
+- fix tapset for debug build
+
+* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
+- update uid/gid handling to avoid int overflows seen with uid/gid
+values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
+
+* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
+- renumber autotools patch from 300 to 5000
+- specfile cleanups
+
+* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
+- fix test_gdb.py (patch 156; rhbz#817072)
+
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
+- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
+generating SELinux denials on "import ctypes" and "import uuid" when
embedding
+Python within httpd (patch 155; rhbz#814391)
+
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
+- add explicit version requirements on expat to avoid linkage problems with
+XML_SetHashSalt
+
+* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
+- fix test_gdb (patch 153)
+
+* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
+- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
+values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
+
+* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
+- use newly installed python for byte compiling (now for real)
+
+* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
+- use newly installed python for byte compiling (#787498)
+
+* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
+- Build with $RPM_LD_FLAGS (#756863).
+- Use xz-compressed source tarball.
+
+* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
+- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
+
+* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
+- python3-devel missing autogenerated pkgconfig() provides (#746751)
+
+* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
+- cherrypick fix for distutils not using __pycache__ when byte-compiling
+files (rhbz#722578)
+
+* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
+- re-enable gdbm (patch 148; rhbz#742242)
+
+* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
+- add a sys._debugmallocstats() function (patch 147)
+
+* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
+- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
+_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
+
+* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
+- disable gdbm module to prepare for gdbm soname bump
+
+* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
+- renumber and rename patches for consistency with python.spec (8 to 55, 106
+to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
+
+* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
+- rewrite of "check", introducing downstream-only hooks for skipping specific
+cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
+fine-grained manner than before; (patches 106, 133-142 sparsely, moving
+patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
+
+* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
+- 3.2.2
+
+* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
+- run selftests with "--verbose"
+- disable parts of test_io on ppc (rhbz#732998)
+
+* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
+- use "--findleaks --verbose3" when running test suite
+
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
+- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
+ppc to avoid aliasing violations (patch 130; rhbz#698726)
+
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
+- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
+
+* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
+- add %%python3_version to the rpm macros (rhbz#719082)
+
+* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
+- disable some tests on sparc arches
+
+* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
+- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
+of static library build (due to Modules/_testembed; patch 6), autotool
+intermediates (patch 300)
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
+- use the gdb hooks from the upstream tarball, rather than keeping our own copy
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
+- don't run test_openpty and test_pty in %%check
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
+- cleanup of BuildRequires; add comment headings to specfile sections
+
+* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
+- fix the libpython.stp systemtap tapset (rhbz#697730)
+
+* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
+- 3.2
+- drop alphatag
+- regenerate autotool patch
+
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
+- add a /usr/bin/python3-debug symlink within the debug subpackage
+
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
+- 3.2rc3
+- regenerate autotool patch
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
+- 3.2rc2
+
+* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
+- 3.2rc1
+- rework patch 6 (static lib removal)
+- remove upstreamed patch 130 (ppc debug build)
+- regenerate patch 300 (autotool intermediates)
+- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
+- added libpython3.so and 2to3-3.2
+
+* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
+- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
+error with dynamic annotations (when configured using --with-valgrind)
+- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
+
+* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
+- add --with-valgrind to configuration (on architectures that support this)
+
+* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
+- work around test_subprocess failure seen in koji (patch 129)
+
+* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
+- 3.2b2
+- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
+patch 8 (systemtap), patch 102 (lib64)
+- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
+patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
+fixed upstream)
+- regenerate patch 300 (autotool intermediates)
+- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
+patch 128)
+- stop using runtest.sh in %%check (dropped by upstream), replacing with
+regrtest; fixup list of failing tests
+- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
+- rework manifests of shared libraries to use "SOABI_" macros, reflecting
+PEP 3149
+- drop itertools, operator and _collections modules from the manifests as py3k
+commit r84058 moved these inside libpython; json/tests moved to test/json_tests
+- move turtle code into the tkinter subpackage
+
+* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
+- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
+
+* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
+- move most of the content of the core package to the libs subpackage, given
+that the libs aren't meaningfully usable without the standard libraries
+
+* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
+- Move test.support to core package (rhbz#596258)
+- Add various missing __pycache__ directories to payload
+
+* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
+- Add __pycache__ directory for site-packages
+
+* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
+- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
+- make find-provides-without-python-sonames.sh 64bit aware
+
+* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
+- 3.2a1; add alphatag
+- rework %%files in the light of PEP 3147 (__pycache__)
+- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
+better job of things, and the %%files explicitly lists our modules (r82746
+appears to break the old way of doing things). This leads to various modules
+changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
+dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
+_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
+testing/devel purposes)
+- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
+- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
+plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
+- add machinery for rebuilding "configure" and friends, using the correct
+version of autoconf (patch 300)
+- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
+- "modulator" was removed upstream
+- drop "-b" from patch applications affecting .py files to avoid littering
the
+installation tree
+
+* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
+- Turn on computed-gotos.
+- Fix for parallel make and graminit.c
+
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
+- rebuild
+
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
+- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
+a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
+
+* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
+- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
+- reformat whitespace in audioop.c (patch 106)
+- CVE-2010-1634: fix various integer overflow checks in the audioop
+module (patch 107)
+- CVE-2010-2089: further checks within the audioop module (patch 108)
+- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
+
+* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
+- reading the timestamp counter is available only on some arches (see Python/ceval.c)
+
+* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
+- add flags for statvfs.f_flag to the constant list in posixmodule (i.e.
"os")
+(patch 105)
+
+* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
+- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
+(patch 104); enable them and the WITH_TSC option within the debug build
+
+* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
+- build and install two different configurations of Python 3: debug and
+standard, packaging the debug build in a new "python3-debug" subpackage
+(patch 103)
+
+* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
+- exclude test_http_cookies when running selftests, due to hang seen on
+http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
+11 hours)
+- update python-gdb.py from v5 to py3k version submitted upstream
+
+* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
+- update python-gdb.py from v4 to v5 (improving performance and stability,
+adding commands)
+
+* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
+- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
+cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
+and exceptions)
+
+* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
+- refresh gdb hooks to v3 (reworking how they are packaged)
+
+* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
+- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
+- drop upstreamed patch 2 (.pyc permissions handling)
+- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
+- drop upstreamed patch 200 (path-fixing script)
+
+* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
+- fix typo in libpython.stp (rhbz:575336)
+
+* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
+- add pyfuntop.stp example (source 7)
+- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
+consistency with python.spec
+
+* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
+- rebuild for new package of redhat-rpm-config (rhbz:564527)
+- use 'install -p' when running 'make install'
+
+* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
+- split configure options into multiple lines for easy of editing
+- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
+tapset defining "python.function.entry" and "python.function.return"
to make
+the markers easy to use (dmalcolm; source 5), and an example of using the
+tapset to the docs (dmalcolm; source 6) (rhbz:545179)
+
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
+- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
+%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
+ldconfig (bug 562980), and which should also ensure it becomes part of the
+debuginfo subpackage, rather than the libs subpackage
+- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
+configure script, and to avoid fragile scripts that try to figure this out
+dynamically (e.g. for the -gdb.py change)
+
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
+- add gdb hooks for easier debugging (Source 4)
+
+* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
+- update python-3.1.1-config.patch to remove downstream customization of build
+of pyexpat and elementtree modules
+- add patch adapted from upstream (patch 7) to add support for building against
+system expat; add --with-system-expat to "configure" invocation
+- remove embedded copies of expat and zlib from source tree during "prep"
+
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
+- introduce %%{dynload_dir} macro
+- explicitly list all lib-dynload files, rather than dynamically gathering the
+payload into a temporary text file, so that we can be sure what we are
+shipping
+- introduce a macros.pybytecompile source file, to help with packaging python3
+modules (Source3; written by Toshio)
+- rename "2to3-3" to "python3-2to3" to better reflect python 3
module packaging
+plans
+
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
+- change python-3.1.1-config.patch to remove our downstream change to curses
+configuration in Modules/Setup.dist, so that the curses modules are built using
+setup.py with the downstream default (linking against libncursesw.so, rather
+than libncurses.so), rather than within the Makefile; add a test to %%install
+to verify the dso files that the curses module is linked against the correct
+DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
+
+* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
+- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
+builds for setting up the python3 copy of the source tree)
+
+* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
+- move lib2to3 from -tools subpackage to main package (bug 556667)
+
+* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
+- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
+
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
+- use the %%{_isa} macro to ensure that the python-devel dependency on python
+is for the correct multilib arch (#555943)
+- delete bundled copy of libffi to make sure we use the system one
+
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
+- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
+docs, rather than the 2.6 build
+
+* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
+- replace references to /usr with %%{_prefix}; replace references to
+/usr/include with %%{_includedir} (Toshio)
+
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
+- fix permission on find-provides-without-python-sonames.sh from 775 to 755
+
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
+- remove build-time requirements on tix and tk, since we already have
+build-time requirements on the -devel subpackages for each of these (Thomas
+Spura)
+- replace usage of %%define with %%global (Thomas Spura)
+- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
+longer be necessary
+- move various test files from the "tools"/"tkinter" subpackages to
the "test"
+subpackage
+
+* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
+- add %%check section (thanks to Thomas Spura)
+- update patch 4 to use correct shebang line
+- get rid of stray patch file from buildroot
+
+* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
+- switched a few instances of "find |xargs" to "find -exec" for
consistency.
+- made the description of __os_install_post more accurate.
+
+* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
+- add macros.python3 to the -devel subpackage, containing common macros for use
+when packaging python3 modules
+
+* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
+- add a provides of "python(abi)" (see bug 532118)
+- fix issues identified by a.badger in package review (bug 526126, comment 39):
+ - use "3" thoughout metadata, rather than "3.*"
+ - remove conditional around "pkg-config openssl"
+ - use standard cleanup of RPM_BUILD_ROOT
+ - replace hardcoded references to /usr with _prefix macro
+ - stop removing egg-info files
+ - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
+up shebang lines
+ - stop attempting to remove no-longer-present .cvsignore files
+ - move the post/postun sections above the "files" sections
+
+* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
+- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
+flag is used by default in the upstream code
+- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
+_init_posix(), so we include them in the core package, along with their parent
+directories (bug 531901)
+
+* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
+- reword description, based on suggestion by amcnabb
+- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
+- fix the test_tk and test_ttk_* selftests (patch 5)
+- fix up the specfile's handling of shebang/perms to avoid corrupting
+test_httpservers.py (sed command suggested by amcnabb)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
+- fixup importlib/_bootstrap.py so that it correctly handles being unable to
+open .pyc files for writing (patch 2, upstream issue 7187)
+- actually apply the rpath patch (patch 1)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
+- update patch0's setup of the crypt module to link it against libcrypt
+- update patch0 to comment "datetimemodule" back out, so that it is built
+using setup.py (see Setup, option 3), thus linking it statically against
+timemodule.c and thus avoiding a run-time "undefined symbol:
+_PyTime_DoubleToTimet" failure on "import datetime"
+
+* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
+- remove executable flag from various files that shouldn't have it
+- fix end-of-line encodings
+- fix a character encoding
+
+* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
+- disable invocation of brp-python-bytecompile in postprocessing, since
+it would be with the wrong version of python (adapted from ivazquez'
+python3000 specfile)
+- use a custom implementation of __find_provides in order to filter out bogus
+provides lines for the various .so modules
+- fixup distutils/unixccompiler.py to remove standard library path from rpath
+(patch 1, was Patch0 in ivazquez' python3000 specfile)
+- split out libraries into a -libs subpackage
+- update summaries and descriptions, basing content on ivazquez' specfile
+- fixup executable permissions on .py, .xpm and .xbm files, based on work in
+ivazquez's specfile
+- get rid of DOS batch files
+- fixup permissions for shared libraries from non-standard 555 to standard 755
+- move /usr/bin/python*-config to the -devel subpackage
+- mark various directories as being documentation
+
+* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
+- Initial package for Python 3.
+
commit de441a2d3a149709d37d4a49e93caf82f7190d62
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jun 12 12:42:28 2018 +0200
Fix prerel comment
diff --git a/python37.spec b/python37.spec
index 45a9382..93dbbea 100644
--- a/python37.spec
+++ b/python37.spec
@@ -12,7 +12,7 @@ Summary: Version %{pybasever} of the Python interpreter
URL:
https://www.python.org/
-# Third beta
+# First rc
%global prerel rc1
# WARNING When rebasing to a new Python version,
commit ceff4b88709b01fc3c12cbd18f23353bdda7a34f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jun 12 11:47:27 2018 +0200
Add 3394 magic number to rpmlintrc
diff --git a/python37.rpmlintrc b/python37.rpmlintrc
index f91b865..6c1ce83 100644
--- a/python37.rpmlintrc
+++ b/python37.rpmlintrc
@@ -45,6 +45,8 @@ addFilter(r'obsolete-not-provided platform-python')
# RPMLINT IMPERFECTIONS
#
https://github.com/rpm-software-management/rpmlint/issues/123
addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3393')
+#
https://github.com/rpm-software-management/rpmlint/pull/133
+addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3394')
#
https://bugzilla.redhat.com/show_bug.cgi?id=1550562
#
https://github.com/rpm-software-management/rpmlint/issues/128
commit 63f277fa3ba598c67ff7b3b6e1c78cb462495f70
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jun 12 11:01:05 2018 +0200
Update to 3.7.0rc1
diff --git a/python37.spec b/python37.spec
index 29e306e..45a9382 100644
--- a/python37.spec
+++ b/python37.spec
@@ -13,12 +13,12 @@ URL:
https://www.python.org/
# Third beta
-%global prerel b5
+%global prerel rc1
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.19.%{?prerel}%{?dist}
+Release: 0.20.%{?prerel}%{?dist}
License: Python
@@ -1557,6 +1557,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue Jun 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.20.rc1
+- Update to 3.7.0rc1
+
* Thu May 31 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.19.b5
- Update to 3.7.0b5
diff --git a/sources b/sources
index 67aabf2..8ed12d6 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0b5.tar.xz) =
1623df6a250982b070788f47a5a6cc6c2fd6d8e6396cf6926b771abc35e4291bd4532f03e070f8010f17075d5bdb748ce8056ef9e1a2c54e518d58b75481b692
+SHA512 (Python-3.7.0rc1.tar.xz) =
cc4c29dfce7e2fca6328f802bd435e1ffc4acecd70d83d602a894bf076bdb95fb4635c891043ba1c3b6438d23ba7f76545cfe323ec0b57029b5c0f639fc6d2c5
commit bcf8a5d914375e3c2bc00955a6a628baaa26a31d
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu May 31 10:57:22 2018 +0200
Update to 3.7.0b5
diff --git a/00304-test-posix-pass-environ.patch b/00304-test-posix-pass-environ.patch
deleted file mode 100644
index 9780674..0000000
--- a/00304-test-posix-pass-environ.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
-index da0135b..1b27b5f 100644
---- a/Lib/test/test_posix.py
-+++ b/Lib/test/test_posix.py
-@@ -1463,7 +1463,7 @@ class TestPosixSpawn(unittest.TestCase):
- """
- pid = posix.posix_spawn(sys.executable,
- [sys.executable, '-c', script],
-- {'foo': 'bar'})
-+ {**os.environ, 'foo': 'bar'})
- self.assertEqual(os.waitpid(pid, 0), (pid, 0))
- with open(envfile) as f:
- self.assertEqual(f.read(), 'bar')
diff --git a/python37.spec b/python37.spec
index 8d6903a..29e306e 100644
--- a/python37.spec
+++ b/python37.spec
@@ -13,12 +13,12 @@ URL:
https://www.python.org/
# Third beta
-%global prerel b4
+%global prerel b5
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.18.%{?prerel}%{?dist}
+Release: 0.19.%{?prerel}%{?dist}
License: Python
@@ -347,13 +347,6 @@ Patch274: 00274-fix-arch-names.patch
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
-# 00304 #
-# Pass os.environ to new process created at test_posix::test_specify_environment
-# Otherwise important variables such as LD_LIBRARY_PATH are not set and the
-# child process might not work at all
-# Proposed upstream:
https://bugs.python.org/issue33455
-Patch304: 00304-test-posix-pass-environ.patch
-
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -671,7 +664,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch251 -p1
%patch274 -p1
%patch291 -p1
-%patch304 -p1
# Remove files that should be generated by the build
@@ -1226,7 +1218,6 @@ CheckPython optimized
%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
%{dynload_dir}/_ssl.%{SOABI_optimized}.so
%{dynload_dir}/_struct.%{SOABI_optimized}.so
-%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
%{dynload_dir}/array.%{SOABI_optimized}.so
%{dynload_dir}/audioop.%{SOABI_optimized}.so
%{dynload_dir}/binascii.%{SOABI_optimized}.so
@@ -1490,7 +1481,6 @@ CheckPython optimized
%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
%{dynload_dir}/_ssl.%{SOABI_debug}.so
%{dynload_dir}/_struct.%{SOABI_debug}.so
-%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
%{dynload_dir}/array.%{SOABI_debug}.so
%{dynload_dir}/audioop.%{SOABI_debug}.so
%{dynload_dir}/binascii.%{SOABI_debug}.so
@@ -1567,6 +1557,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu May 31 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.19.b5
+- Update to 3.7.0b5
+
* Sat May 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.18.b4
- Bump the bundled pip version to 10.0.1
diff --git a/sources b/sources
index abc3c00..67aabf2 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0b4.tar.xz) =
e97459a5467a984a5a2bfc08ed937dfeb899f3d4ff9a655878badffc19e722efc30112422c14f94fcf9f6c82ee01e9fe2bb538db83454e4c83b711d1a8444472
+SHA512 (Python-3.7.0b5.tar.xz) =
1623df6a250982b070788f47a5a6cc6c2fd6d8e6396cf6926b771abc35e4291bd4532f03e070f8010f17075d5bdb748ce8056ef9e1a2c54e518d58b75481b692
commit 8fcf2dac2d5dd1a57bcb2213f2b9f4673a7578ce
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Thu May 24 18:13:25 2018 +0200
Update the bootstrapping sequence
diff --git a/python37.spec b/python37.spec
index 3870e66..8d6903a 100644
--- a/python37.spec
+++ b/python37.spec
@@ -97,15 +97,12 @@ License: Python
# 1. At the same time:
# - gdb without python support (add %%global _without_python 1 on top of
# gdb's SPEC file)
-# - python-rpm-generators with bootstrapping_python set to 1
+# - python-rpm-generators
# (this can be done also during step 2., but should be done before 3.)
# 2. python3 without rewheel (use %%bcond_with rewheel instead of
# %%bcond_without)
-# 3. At the same time:
-# - gdb with python support (remove %%global _without_python 1 on top of
-# gdb's SPEC file)
-# - python-rpm-generators with bootstrapping_python set to 0
-# (this can be done at any later step without negative effects)
+# 3. gdb with python support (remove %%global _without_python 1 on top of
+# gdb's SPEC file)
# 4. rpm
# 5. python-setuptools with bootstrap set to 1
# 6. python-pip with build_wheel set to 0
commit 2d5b84388b07f909b709643e0e6a9f4dc0b93f39
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Thu May 24 18:11:18 2018 +0200
Update the bootstrapping sequence
diff --git a/python3.spec b/python3.spec
index a81b111..e7f52f5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -92,15 +92,12 @@ License: Python
# 1. At the same time:
# - gdb without python support (add %%global _without_python 1 on top of
# gdb's SPEC file)
-# - python-rpm-generators with bootstrapping_python set to 1
+# - python-rpm-generators
# (this can be done also during step 2., but should be done before 3.)
# 2. python3 without rewheel (use %%bcond_with rewheel instead of
# %%bcond_without)
-# 3. At the same time:
-# - gdb with python support (remove %%global _without_python 1 on top of
-# gdb's SPEC file)
-# - python-rpm-generators with bootstrapping_python set to 0
-# (this can be done at any later step without negative effects)
+# 3. gdb with python support (remove %%global _without_python 1 on top of
+# gdb's SPEC file)
# 4. rpm
# 5. python-setuptools with bootstrap set to 1
# 6. python-pip with build_wheel set to 0
commit 29a768cb735f155731b08e2ac79cfdac4a9f1dc9
Merge: 8810a59 611414f
Author: Charalampos Stratakis <cstratak(a)fedoraproject.org>
Date: Mon May 14 09:58:59 2018 +0000
Merge #23 `Rewheel related: rebase the patch and bump the pip bundled version`
commit 611414f20d556b4e9d869aaab25d1794a7000362
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat May 12 10:51:09 2018 +0200
Bump the bundled pip version to 10.0.1
diff --git a/python37.spec b/python37.spec
index a0097d9..e2cf7a3 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.17.%{?prerel}%{?dist}
+Release: 0.18.%{?prerel}%{?dist}
License: Python
@@ -616,7 +616,7 @@ Requires: redhat-rpm-config
%global __provides_exclude ^python\\(abi\\) = 3\\..$
# We keep those inside on purpose
-Provides: bundled(python3-pip) = 9.0.3
+Provides: bundled(python3-pip) = 10.0.1
Provides: bundled(python3-setuptools) = 39.0.1
# The description for the flat package
@@ -1565,6 +1565,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Sat May 12 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.18.b4
+- Bump the bundled pip version to 10.0.1
+
* Thu May 10 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.17.b4
- Update to 3.7.0b4
commit 63266cf9edfbe760dab8234988723688d6670550
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat May 12 10:48:48 2018 +0200
Rebase the rewheel patch
It was not rebased before, because it was never applied
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
index bae64d4..d8ba671 100644
--- a/00189-add-rewheel-module.patch
+++ b/00189-add-rewheel-module.patch
@@ -1,5 +1,5 @@
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index d69e09f..5cb12df 100644
+index 7ff938b..8c3d062 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -1,8 +1,10 @@
@@ -13,16 +13,25 @@ index d69e09f..5cb12df 100644
__all__ = ["version", "bootstrap"]
-@@ -25,6 +27,8 @@ def _run_pip(args, additional_paths=None):
+@@ -24,8 +26,15 @@ def _run_pip(args, additional_paths=None):
+ sys.path = additional_paths + sys.path
# Install the bundled software
- import pip
+- import pip._internal
+- return pip._internal.main(args)
++ try:
++ # pip 10
++ from pip._internal import main
++ except ImportError:
++ # pip 9
++ from pip import main
+ if args[0] in ["install", "list", "wheel"]:
+ args.append('--pre')
- return pip.main(args)
++ return main(args)
-@@ -88,20 +92,39 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
+ def version():
+@@ -88,20 +97,39 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
# omit pip and easy_install
os.environ["ENSUREPIP_OPTIONS"] = "install"
@@ -222,10 +231,10 @@ index 0000000..753c764
+ pass # bad RECORD or empty line
+ return to_write, to_omit
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 51e8132..42b3d29 100644
+index d07b312..1c6720e 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -1241,7 +1241,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \
+@@ -1301,7 +1301,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \
test/test_asyncio \
collections concurrent concurrent/futures encodings \
email email/mime test/test_email test/test_email/data \
commit 8810a59050a8c0d34545a11108a267532444b1a5
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri May 11 23:27:10 2018 +0200
Only require python3-rpm-generators when built with rewheel
Without rewheel is used to bootstrap setuptools+pip
python3-rpm-generators needs python3-setuptools, so we cannot have it yet
diff --git a/python37.spec b/python37.spec
index a0097d9..99fed63 100644
--- a/python37.spec
+++ b/python37.spec
@@ -484,7 +484,12 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
BuildRequires: python-rpm-macros
Requires: python-rpm-macros
Requires: python3-rpm-macros
+
+%if %{with rewheel}
+# without rewheel is used to bootstrap setuptools+pip
+# python3-rpm-generators needs python3-setuptools, so we cannot have it yet
Requires: python3-rpm-generators
+%endif
#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
commit 0c391afb695caa6f78857957ba9a733a8e598ac9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu May 10 14:47:13 2018 +0200
Update to 3.7.0b4
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
index 9d69223..c8e53c1 100644
--- a/00274-fix-arch-names.patch
+++ b/00274-fix-arch-names.patch
@@ -1,7 +1,21 @@
-diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
---- Python-3.5.0/configure.ac.than 2015-11-13 11:51:32.039560172 -0500
-+++ Python-3.5.0/configure.ac 2015-11-13 11:52:11.670168157 -0500
-@@ -788,9 +788,9 @@ cat >> conftest.c <<EOF
+diff --git a/config.sub b/config.sub
+index ba37cf9..52a9ec6 100755
+--- a/config.sub
++++ b/config.sub
+@@ -1042,7 +1042,7 @@ case $basic_machine in
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+- ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed
's/^[^-]*-//'`
++ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo "$basic_machine" | sed
's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little)
+ basic_machine=powerpc64le-unknown
+diff --git a/configure.ac b/configure.ac
+index 2535969..9fb3193 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -765,9 +765,9 @@ cat >> conftest.c <<EOF
alpha-linux-gnu
# elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
@@ -13,7 +27,7 @@ diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
# endif
# elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
# if defined(__ARMEL__)
-@@ -810,7 +810,7 @@ cat >> conftest.c <<EOF
+@@ -807,7 +807,7 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64el-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
@@ -22,7 +36,7 @@ diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
# else
# error unknown platform triplet
# endif
-@@ -820,7 +820,7 @@ cat >> conftest.c <<EOF
+@@ -817,7 +817,7 @@ cat >> conftest.c <<EOF
# elif _MIPS_SIM == _ABIN32
mips64-linux-gnuabin32
# elif _MIPS_SIM == _ABI64
@@ -31,7 +45,7 @@ diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
# else
# error unknown platform triplet
# endif
-@@ -830,9 +830,9 @@ cat >> conftest.c <<EOF
+@@ -827,9 +827,9 @@ cat >> conftest.c <<EOF
powerpc-linux-gnuspe
# elif defined(__powerpc64__)
# if defined(__LITTLE_ENDIAN__)
@@ -43,16 +57,3 @@ diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
# endif
# elif defined(__powerpc__)
powerpc-linux-gnu
-diff --git a/config.sub b/config.sub
-index 40ea5df..932128b 100755
---- a/config.sub
-+++ b/config.sub
-@@ -1045,7 +1045,7 @@ case $basic_machine in
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
-- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-+ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed
's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little)
- basic_machine=powerpc64le-unknown
diff --git a/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
b/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
deleted file mode 100644
index 965792a..0000000
--- a/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From a3febe3cba14b89885f42ca2f0224096a52885f6 Mon Sep 17 00:00:00 2001
-From: Antoine Pitrou <antoine(a)python.org>
-Date: Mon, 23 Apr 2018 13:19:42 +0200
-Subject: [PATCH] bpo-33329: Fix multiprocessing regression on newer glibcs
-
-Starting with glibc 2.27.9000-xxx, sigaddset() can return EINVAL for some
-reserved signal numbers between 1 and NSIG. The `range(1, NSIG)` idiom
-is commonly used to select all signals for blocking with `pthread_sigmask`.
-So we ignore the sigaddset() return value until we expose sigfillset()
-to provide a better idiom.
----
- .../next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst | 1 +
- Modules/signalmodule.c | 14 ++++++++------
- 2 files changed, 9 insertions(+), 6 deletions(-)
- create mode 100644 Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
-
-diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
-new file mode 100644
-index 000000000000..d1a4e56d04b9
---- /dev/null
-+++ b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
-@@ -0,0 +1 @@
-+Fix multiprocessing regression on newer glibcs
-diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
-index 791616014384..35fd87e2d1e7 100644
---- a/Modules/signalmodule.c
-+++ b/Modules/signalmodule.c
-@@ -819,7 +819,6 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
- int result = -1;
- PyObject *iterator, *item;
- long signum;
-- int err;
-
- sigemptyset(mask);
-
-@@ -841,11 +840,14 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
- Py_DECREF(item);
- if (signum == -1 && PyErr_Occurred())
- goto error;
-- if (0 < signum && signum < NSIG)
-- err = sigaddset(mask, (int)signum);
-- else
-- err = 1;
-- if (err) {
-+ if (0 < signum && signum < NSIG) {
-+ /* bpo-33329: ignore sigaddset() return value as it can fail
-+ * for some reserved signals, but we want the `range(1, NSIG)`
-+ * idiom to allow selecting all valid signals.
-+ */
-+ (void) sigaddset(mask, (int)signum);
-+ }
-+ else {
- PyErr_Format(PyExc_ValueError,
- "signal number %ld out of range", signum);
- goto error;
diff --git a/00304-test-posix-pass-environ.patch b/00304-test-posix-pass-environ.patch
new file mode 100644
index 0000000..9780674
--- /dev/null
+++ b/00304-test-posix-pass-environ.patch
@@ -0,0 +1,13 @@
+diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
+index da0135b..1b27b5f 100644
+--- a/Lib/test/test_posix.py
++++ b/Lib/test/test_posix.py
+@@ -1463,7 +1463,7 @@ class TestPosixSpawn(unittest.TestCase):
+ """
+ pid = posix.posix_spawn(sys.executable,
+ [sys.executable, '-c', script],
+- {'foo': 'bar'})
++ {**os.environ, 'foo': 'bar'})
+ self.assertEqual(os.waitpid(pid, 0), (pid, 0))
+ with open(envfile) as f:
+ self.assertEqual(f.read(), 'bar')
diff --git a/python37.spec b/python37.spec
index 28bbba0..a0097d9 100644
--- a/python37.spec
+++ b/python37.spec
@@ -13,12 +13,12 @@ URL:
https://www.python.org/
# Third beta
-%global prerel b3
+%global prerel b4
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.16.%{?prerel}%{?dist}
+Release: 0.17.%{?prerel}%{?dist}
License: Python
@@ -350,11 +350,12 @@ Patch274: 00274-fix-arch-names.patch
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
-# 00302 #
-# Fix multiprocessing regression on newer glibcs
-# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1569933
-# and:
https://bugs.python.org/issue33329
-Patch302: 00302-fix-multiprocessing-regression-on-newer-glibcs.patch
+# 00304 #
+# Pass os.environ to new process created at test_posix::test_specify_environment
+# Otherwise important variables such as LD_LIBRARY_PATH are not set and the
+# child process might not work at all
+# Proposed upstream:
https://bugs.python.org/issue33455
+Patch304: 00304-test-posix-pass-environ.patch
# (New patches go here ^^^)
#
@@ -668,7 +669,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch251 -p1
%patch274 -p1
%patch291 -p1
-%patch302 -p1
+%patch304 -p1
# Remove files that should be generated by the build
@@ -1564,6 +1565,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu May 10 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.17.b4
+- Update to 3.7.0b4
+
* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.16.b3
- Fix multiprocessing regression on newer glibcs
- Enable test_multiprocessing_fork(server) and _spawn again
diff --git a/sources b/sources
index 3a10973..abc3c00 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0b3.tar.xz) =
4fd605cb1621e4bed73c2aadf0443fb70b4d013e9d93a26e81e75dc56906062660b63ac1d97224da217d5e05a3372802a291924a26cc067959d8e1e753a8356f
+SHA512 (Python-3.7.0b4.tar.xz) =
e97459a5467a984a5a2bfc08ed937dfeb899f3d4ff9a655878badffc19e722efc30112422c14f94fcf9f6c82ee01e9fe2bb538db83454e4c83b711d1a8444472
commit e324bf2dbba4dd776d787a8f124676a5e44c94d4
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Apr 23 18:17:32 2018 +0200
Fix multiprocessing regression on newer glibcs
Enable test_multiprocessing_fork(server) and _spawn again
Resolves: rhbz#1569933
diff --git a/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
b/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
new file mode 100644
index 0000000..965792a
--- /dev/null
+++ b/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
@@ -0,0 +1,55 @@
+From a3febe3cba14b89885f42ca2f0224096a52885f6 Mon Sep 17 00:00:00 2001
+From: Antoine Pitrou <antoine(a)python.org>
+Date: Mon, 23 Apr 2018 13:19:42 +0200
+Subject: [PATCH] bpo-33329: Fix multiprocessing regression on newer glibcs
+
+Starting with glibc 2.27.9000-xxx, sigaddset() can return EINVAL for some
+reserved signal numbers between 1 and NSIG. The `range(1, NSIG)` idiom
+is commonly used to select all signals for blocking with `pthread_sigmask`.
+So we ignore the sigaddset() return value until we expose sigfillset()
+to provide a better idiom.
+---
+ .../next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst | 1 +
+ Modules/signalmodule.c | 14 ++++++++------
+ 2 files changed, 9 insertions(+), 6 deletions(-)
+ create mode 100644 Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
+
+diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
+new file mode 100644
+index 000000000000..d1a4e56d04b9
+--- /dev/null
++++ b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
+@@ -0,0 +1 @@
++Fix multiprocessing regression on newer glibcs
+diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
+index 791616014384..35fd87e2d1e7 100644
+--- a/Modules/signalmodule.c
++++ b/Modules/signalmodule.c
+@@ -819,7 +819,6 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
+ int result = -1;
+ PyObject *iterator, *item;
+ long signum;
+- int err;
+
+ sigemptyset(mask);
+
+@@ -841,11 +840,14 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
+ Py_DECREF(item);
+ if (signum == -1 && PyErr_Occurred())
+ goto error;
+- if (0 < signum && signum < NSIG)
+- err = sigaddset(mask, (int)signum);
+- else
+- err = 1;
+- if (err) {
++ if (0 < signum && signum < NSIG) {
++ /* bpo-33329: ignore sigaddset() return value as it can fail
++ * for some reserved signals, but we want the `range(1, NSIG)`
++ * idiom to allow selecting all valid signals.
++ */
++ (void) sigaddset(mask, (int)signum);
++ }
++ else {
+ PyErr_Format(PyExc_ValueError,
+ "signal number %ld out of range", signum);
+ goto error;
diff --git a/python3.spec b/python3.spec
index a69624d..a81b111 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.5
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
@@ -374,6 +374,12 @@ Patch294: 00294-define-TLS-cipher-suite-on-build-time.patch
# Fixed upstream:
https://bugs.python.org/issue32885
Patch301: 00301-pathfix-add-n-option-for-no-backup.patch
+# 00302 #
+# Fix multiprocessing regression on newer glibcs
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1569933
+# and:
https://bugs.python.org/issue33329
+Patch302: 00302-fix-multiprocessing-regression-on-newer-glibcs.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -691,6 +697,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch292 -p1
%patch294 -p1
%patch301 -p1
+%patch302 -p1
# Remove files that should be generated by the build
@@ -1093,9 +1100,6 @@ CheckPython() {
%ifarch ppc64le
-x test_buffer \
%endif
- -x test_multiprocessing_fork \
- -x test_multiprocessing_forkserver \
- -x test_multiprocessing_spawn \
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1582,6 +1586,11 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-4
+- Fix multiprocessing regression on newer glibcs
+- Enable test_multiprocessing_fork(server) and _spawn again
+Resolves: rhbz#1569933
+
* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-3
- Skip test_multiprocessing_fork(server) and _spawn for now
commit 240a1f769d717f588c2a671716d194b3c4454866
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Apr 23 13:39:24 2018 +0200
Fix multiprocessing regression on newer glibcs
Enable test_multiprocessing_fork(server) and _spawn again
Resolves: rhbz#1569933
diff --git a/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
b/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
new file mode 100644
index 0000000..965792a
--- /dev/null
+++ b/00302-fix-multiprocessing-regression-on-newer-glibcs.patch
@@ -0,0 +1,55 @@
+From a3febe3cba14b89885f42ca2f0224096a52885f6 Mon Sep 17 00:00:00 2001
+From: Antoine Pitrou <antoine(a)python.org>
+Date: Mon, 23 Apr 2018 13:19:42 +0200
+Subject: [PATCH] bpo-33329: Fix multiprocessing regression on newer glibcs
+
+Starting with glibc 2.27.9000-xxx, sigaddset() can return EINVAL for some
+reserved signal numbers between 1 and NSIG. The `range(1, NSIG)` idiom
+is commonly used to select all signals for blocking with `pthread_sigmask`.
+So we ignore the sigaddset() return value until we expose sigfillset()
+to provide a better idiom.
+---
+ .../next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst | 1 +
+ Modules/signalmodule.c | 14 ++++++++------
+ 2 files changed, 9 insertions(+), 6 deletions(-)
+ create mode 100644 Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
+
+diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
+new file mode 100644
+index 000000000000..d1a4e56d04b9
+--- /dev/null
++++ b/Misc/NEWS.d/next/Library/2018-04-23-13-21-39.bpo-33329.lQ-Eod.rst
+@@ -0,0 +1 @@
++Fix multiprocessing regression on newer glibcs
+diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
+index 791616014384..35fd87e2d1e7 100644
+--- a/Modules/signalmodule.c
++++ b/Modules/signalmodule.c
+@@ -819,7 +819,6 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
+ int result = -1;
+ PyObject *iterator, *item;
+ long signum;
+- int err;
+
+ sigemptyset(mask);
+
+@@ -841,11 +840,14 @@ iterable_to_sigset(PyObject *iterable, sigset_t *mask)
+ Py_DECREF(item);
+ if (signum == -1 && PyErr_Occurred())
+ goto error;
+- if (0 < signum && signum < NSIG)
+- err = sigaddset(mask, (int)signum);
+- else
+- err = 1;
+- if (err) {
++ if (0 < signum && signum < NSIG) {
++ /* bpo-33329: ignore sigaddset() return value as it can fail
++ * for some reserved signals, but we want the `range(1, NSIG)`
++ * idiom to allow selecting all valid signals.
++ */
++ (void) sigaddset(mask, (int)signum);
++ }
++ else {
+ PyErr_Format(PyExc_ValueError,
+ "signal number %ld out of range", signum);
+ goto error;
diff --git a/python37.spec b/python37.spec
index 0407d87..28bbba0 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.15.%{?prerel}%{?dist}
+Release: 0.16.%{?prerel}%{?dist}
License: Python
@@ -350,6 +350,12 @@ Patch274: 00274-fix-arch-names.patch
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
+# 00302 #
+# Fix multiprocessing regression on newer glibcs
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1569933
+# and:
https://bugs.python.org/issue33329
+Patch302: 00302-fix-multiprocessing-regression-on-newer-glibcs.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -662,6 +668,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch251 -p1
%patch274 -p1
%patch291 -p1
+%patch302 -p1
# Remove files that should be generated by the build
@@ -1061,9 +1068,6 @@ CheckPython() {
%ifarch ppc64le
-x test_buffer \
%endif
- -x test_multiprocessing_fork \
- -x test_multiprocessing_forkserver \
- -x test_multiprocessing_spawn \
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1560,6 +1564,11 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Apr 23 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.16.b3
+- Fix multiprocessing regression on newer glibcs
+- Enable test_multiprocessing_fork(server) and _spawn again
+Resolves: rhbz#1569933
+
* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.15.b3
- Skip test_multiprocessing_fork(server) and _spawn for now
commit 45a046d2f4d6624b57b8b7d7acaa468a4ff57ebb
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Apr 19 22:17:51 2018 +0200
Skip test_multiprocessing_fork(server) and _spawn for now
It hangs the build
diff --git a/python3.spec b/python3.spec
index 4b4f79d..a69624d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.5
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
@@ -1093,6 +1093,9 @@ CheckPython() {
%ifarch ppc64le
-x test_buffer \
%endif
+ -x test_multiprocessing_fork \
+ -x test_multiprocessing_forkserver \
+ -x test_multiprocessing_spawn \
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1579,6 +1582,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-3
+- Skip test_multiprocessing_fork(server) and _spawn for now
+
* Wed Apr 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-2
- Add flatpackage conditionals
commit 872e1bafb7741fedab810841e99ad0eec4cc1b0e
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Apr 19 18:08:13 2018 +0200
Skip test_multiprocessing_fork(server) and _spawn for now
It hangs the build
diff --git a/python37.spec b/python37.spec
index 04bd2d6..0407d87 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.14.%{?prerel}%{?dist}
+Release: 0.15.%{?prerel}%{?dist}
License: Python
@@ -1061,6 +1061,9 @@ CheckPython() {
%ifarch ppc64le
-x test_buffer \
%endif
+ -x test_multiprocessing_fork \
+ -x test_multiprocessing_forkserver \
+ -x test_multiprocessing_spawn \
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1557,6 +1560,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Apr 19 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.15.b3
+- Skip test_multiprocessing_fork(server) and _spawn for now
+
* Thu Mar 29 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.14.b3
- Update to 3.7.0b3
commit fc23c477cf09d8415e3b3e2172861c149218f4b6
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Apr 18 17:14:16 2018 +0200
Typos and such
From
https://src.fedoraproject.org/rpms/python3/pull-request/33
diff --git a/python37.spec b/python37.spec
index 6fb6b3c..04bd2d6 100644
--- a/python37.spec
+++ b/python37.spec
@@ -379,7 +379,7 @@ Obsoletes: system-python < %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
# In order to support multiple Python interpreters for development purposes,
-# packages with with the naming scheme flatpackage (e.g. python35) exist for
+# packages with the naming scheme flatpackage (e.g. python35) exist for
# non-default versions of Python 3.
# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
# these names here.
@@ -612,9 +612,11 @@ Requires: redhat-rpm-config
Provides: bundled(python3-pip) = 9.0.3
Provides: bundled(python3-setuptools) = 39.0.1
-# The descripton for the flat flatpackage package
+# The description for the flat package
%description
-This package exists to allow developers to test their code against an newer
+Python %{pybasever} package for developers.
+
+This package exists to allow developers to test their code against a newer
version of Python. This is not a full Python stack and if you wish to run
your applications with Python %{pybasever}, update your Fedora to a newer
version once Python %{pybasever} is stable.
commit 8c67bafd7ce7a04d4b41aa58b464857dfb14dd70
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Apr 18 14:40:03 2018 +0200
Add flatpackage conditionals
This will allow us to create python36 easily once needed [1].
It shoudl also make it easier to merge stuff between python36 and 37.
This more or less backports:
https://src.fedoraproject.org/rpms/python37/c/63459d7d2a4a8df39f900d753cf...
https://src.fedoraproject.org/rpms/python37/c/7f3ae64d2f98f00b8778b9693ad...
https://src.fedoraproject.org/rpms/python37/c/6a6d4a03245c076ec8686b8f96a...
[1]
https://fedoraproject.org/wiki/Changes/Python3.7
diff --git a/python3.spec b/python3.spec
index 5bdde01..4b4f79d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,19 +2,19 @@
# Top-level metadata
# ==================
-Name: python3
-Summary: Interpreter of the Python programming language
-URL:
https://www.python.org/
-
%global pybasever 3.6
# pybasever without the dot:
%global pyshortver 36
+Name: python3
+Summary: Interpreter of the Python programming language
+URL:
https://www.python.org/
+
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.5
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -25,6 +25,14 @@ License: Python
# Note that the bcond macros are named for the CLI option they create.
# "%%bcond_without" means "ENABLE by default and create a --without
option"
+# Flat package, i.e. python36, python37, python38 for tox etc.
+# warning: changes some other defaults
+# in Fedora, never turn this on for the python3 package
+# and always keep it on for python36 etc.
+# WARNING: This does not change the package name and summary above
+%bcond_with flatpackage
+
+
# Expensive optimizations (mainly, profile-guided optimizations)
%ifarch %{ix86} x86_64
%bcond_without optimizations
@@ -38,11 +46,19 @@ License: Python
%bcond_without tests
# Ability to reuse RPM-installed pip using rewheel
+%if %{with flatpackage}
+%bcond_with rewheel
+%else
%bcond_without rewheel
+%endif
# Extra build for debugging the interpreter or C-API extensions
# (the -debug subpackages)
+%if %{with flatpackage}
+%bcond_with debug_build
+%else
%bcond_without debug_build
+%endif
# Support for the GDB debugger
%bcond_without gdb_hooks
@@ -372,6 +388,8 @@ Patch301: 00301-pathfix-add-n-option-for-no-backup.patch
# Descriptions, and metadata for subpackages
# ==========================================
+%if %{without flatpackage}
+
# Packages with Python modules in standard locations automatically
# depend on python(abi). Provide that here.
Provides: python(abi) = %{pybasever}
@@ -385,7 +403,7 @@ Obsoletes: system-python < %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
# In order to support multiple Python interpreters for development purposes,
-# packages with with the naming scheme pythonXY (e.g. python35) exist for
+# packages with the naming scheme flatpackage (e.g. python35) exist for
# non-default versions of Python 3.
# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
# these names here.
@@ -605,6 +623,30 @@ Compiled extension modules use a special ABI flag ("d") in
the filename,
so extensions for both versions can co-exist in the same directory.
%endif # with debug_build
+%else # with flatpackage
+
+Requires: redhat-rpm-config
+
+# We'll not provide this, on purpose
+# No package in Fedora shall ever depend on flatpackage via this
+%global __requires_exclude ^python\\(abi\\) = 3\\..$
+%global __provides_exclude ^python\\(abi\\) = 3\\..$
+
+# We keep those inside on purpose
+Provides: bundled(python3-pip) = 9.0.3
+Provides: bundled(python3-setuptools) = 39.0.1
+
+# The description for the flat package
+%description
+Python %{pybasever} package for developers.
+
+This package exists to allow developers to test their code against an older
+version of Python. This is not a full Python stack and if you wish to run
+your applications with Python %{pybasever}, see other distributions
+that support it, such as CentOS or RHEL with Software Collections
+or older Fedora releases.
+
+%endif # with flatpackage
# ======================================================
# The prep phase of the build:
@@ -870,6 +912,7 @@ install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
%endif
+%if %{without flatpackage}
# add idle3 to menu
install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
@@ -880,6 +923,7 @@ desktop-file-install --dir=%{buildroot}%{_datadir}/applications
%{SOURCE10}
mkdir -p %{buildroot}%{_datadir}/appdata
cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
+%endif
# Make sure distutils looks at the right pyconfig.h file
# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
@@ -942,15 +986,17 @@ rm -rf %{buildroot}%{_bindir}/__pycache__
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
find %{buildroot} -perm 555 -exec chmod 755 {} \;
+%if %{without flatpackage}
# Install macros for rpm:
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
+%endif
# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
# avoid the user having to know the precise version and ABI flags.
# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
-%if %{with debug_build}
+%if %{with debug_build} && %{without flatpackage}
ln -s \
%{_bindir}/python%{LDVERSION_debug} \
%{buildroot}%{_bindir}/python3-debug
@@ -958,9 +1004,24 @@ ln -s \
# System Python: Link the executable to libexec
# This is for backwards compatibility only and should be removed in Fedora 29
+%if %{without flatpackage}
mkdir -p %{buildroot}%{_libexecdir}
ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
+%endif
+%if %{with flatpackage}
+# Remove stuff that would conflict with python3 package
+rm %{buildroot}%{_bindir}/python3
+rm %{buildroot}%{_bindir}/pydoc3
+rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/idle3
+rm %{buildroot}%{_bindir}/python3-*
+rm %{buildroot}%{_bindir}/pyvenv
+rm %{buildroot}%{_bindir}/2to3*
+rm %{buildroot}%{_libdir}/libpython3.so
+rm %{buildroot}%{_mandir}/man1/python3.1*
+rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+%endif
# ======================================================
# Checks for packaging issues
@@ -1052,26 +1113,37 @@ CheckPython optimized
%defattr(-, root, root)
%license LICENSE
%doc README.rst
+
+%if %{without flatpackage}
%{_bindir}/pydoc*
%{_bindir}/python3
-%{_bindir}/python%{pybasever}
-%{_bindir}/python%{pybasever}m
%{_bindir}/pyvenv
-%{_bindir}/pyvenv-%{pybasever}
%{_mandir}/*/*
+%{_bindir}/pyvenv
# Remove in Fedora 29:
%{_libexecdir}/system-python
+%else
+%{_bindir}/pydoc%{pybasever}
+%{_mandir}/*/python%{pybasever}*
+%endif
+%{_bindir}/pyvenv-%{pybasever}
+%{_bindir}/python%{pybasever}
+%{_bindir}/python%{pybasever}m
+%if %{without flatpackage}
%files libs
%defattr(-,root,root,-)
%license LICENSE
%doc README.rst
+%endif
%dir %{pylibdir}
%dir %{dynload_dir}
%{pylibdir}/lib2to3
+%if %{without flatpackage}
%exclude %{pylibdir}/lib2to3/tests
+%endif
%dir %{pylibdir}/unittest/
%dir %{pylibdir}/unittest/__pycache__/
@@ -1096,7 +1168,13 @@ CheckPython optimized
%dir %{pylibdir}/ensurepip/__pycache__/
%{pylibdir}/ensurepip/*.py
%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
%exclude %{pylibdir}/ensurepip/_bundled
+%else
+%dir %{pylibdir}/ensurepip/_bundled
+%{pylibdir}/ensurepip/_bundled/*.whl
+%endif
%if %{with rewheel}
%dir %{pylibdir}/ensurepip/rewheel/
@@ -1255,8 +1333,10 @@ CheckPython optimized
%{pylibdir}/sqlite3/*.py
%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
+%if %{without flatpackage}
%exclude %{pylibdir}/turtle.py
%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%endif
%{pylibdir}/urllib
%{pylibdir}/xml
@@ -1276,43 +1356,68 @@ CheckPython optimized
%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%{_libdir}/%{py_INSTSONAME_optimized}
+%if %{without flatpackage}
%{_libdir}/libpython3.so
+%endif
+%if %{without flatpackage}
%files devel
%defattr(-,root,root)
%{_bindir}/2to3
# TODO: Remove 2to3-3.7 once rebased to 3.7
%{_bindir}/2to3-%{pybasever}
+%endif
+
%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
+%if %{without flatpackage}
%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+%endif
%{pylibdir}/distutils/command/wininst-*.exe
%{_includedir}/python%{LDVERSION_optimized}/*.h
-%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
+
+%if %{without flatpackage}
%{_bindir}/python3-config
+%{_libdir}/pkgconfig/python3.pc
+%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
+%{_rpmconfigdir}/macros.d/macros.systempython
+%{_bindir}/pathfix.py
+%endif
+
%{_bindir}/python%{pybasever}-config
%{_bindir}/python%{LDVERSION_optimized}-config
%{_bindir}/python%{LDVERSION_optimized}-*-config
-%{_bindir}/pathfix.py
%{_libdir}/libpython%{LDVERSION_optimized}.so
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
-%{_libdir}/pkgconfig/python3.pc
-%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
-%{_rpmconfigdir}/macros.d/macros.systempython
+%if %{without flatpackage}
%files idle
%defattr(-,root,root,755)
+
%{_bindir}/idle*
+%else
+%{_bindir}/idle%{pybasever}
+%endif
+
%{pylibdir}/idlelib
+
+%if %{without flatpackage}
%{_datadir}/appdata/idle3.appdata.xml
%{_datadir}/applications/idle3.desktop
%{_datadir}/icons/hicolor/*/apps/idle3.*
+%endif
+%if %{without flatpackage}
%files tkinter
%defattr(-,root,root,755)
+%endif
+
%{pylibdir}/tkinter
+%if %{without flatpackage}
%exclude %{pylibdir}/tkinter/test
+%endif
%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
%{pylibdir}/turtle.py
%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
@@ -1322,8 +1427,10 @@ CheckPython optimized
%dir %{pylibdir}/turtledemo/__pycache__/
%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
+%if %{without flatpackage}
%files test
%defattr(-, root, root)
+%endif
%{pylibdir}/ctypes/test
%{pylibdir}/distutils/tests
%{pylibdir}/sqlite3/test
@@ -1344,12 +1451,14 @@ CheckPython optimized
# all of the other subpackages
%if %{with debug_build}
+%if %{without flatpackage}
%files debug
%defattr(-,root,root,-)
+%{_bindir}/python3-debug
+%endif
# Analog of the core subpackage's files:
%{_bindir}/python%{LDVERSION_debug}
-%{_bindir}/python3-debug
# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
@@ -1470,6 +1579,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Apr 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.5-2
+- Add flatpackage conditionals
+
* Thu Mar 29 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.5-1
- Update to 3.6.5
commit 34ebe3da1391f2feca7b23173cec5fc5e5d01fdf
Merge: 9a2e4be fb9702f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Apr 18 13:36:00 2018 +0200
Merge master with f28
commit 8799184fe77c6332b853f31d26ef29db743700f0
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 29 15:04:40 2018 +0200
Remove macros.systempython
It was for backward compatibility only, to be removed in F29.
This will only become non-flat package in F29+.
diff --git a/macros.systempython b/macros.systempython
deleted file mode 100644
index 314cd45..0000000
--- a/macros.systempython
+++ /dev/null
@@ -1 +0,0 @@
-%system_python_abi %{expand: }
diff --git a/python37.spec b/python37.spec
index b314587..6fb6b3c 100644
--- a/python37.spec
+++ b/python37.spec
@@ -247,10 +247,6 @@ Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.
# Written by bkabrda
Source8: check-pyc-and-pyo-timestamps.py
-# Backward compatible no-op macro for system-python
-# Remove in Fedora 29
-Source9: macros.systempython
-
# Desktop menu entry for idle3
Source10: idle3.desktop
@@ -959,12 +955,6 @@ rm -rf %{buildroot}%{_bindir}/__pycache__
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
find %{buildroot} -perm 555 -exec chmod 755 {} \;
-# Install macros for rpm:
-%if %{without flatpackage}
-mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
-install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
-%endif
-
# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
# avoid the user having to know the precise version and ABI flags.
# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
@@ -1359,7 +1349,6 @@ CheckPython optimized
%if %{without flatpackage}
%{_bindir}/python3-config
%{_libdir}/pkgconfig/python3.pc
-%{_rpmconfigdir}/macros.d/macros.systempython
%{_bindir}/pathfix.py
%endif
commit 9a2e4be589292030ebf559eec8bb547250915d95
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Mar 29 16:03:33 2018 +0200
Update to 3.6.5
Rebased patches: 102, 111, 262
Removed patches due to being upstreamed:
264, 273, 289, 290, 291, 298
Update pip version to 9.0.3
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 8eea66d..2b913ca 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -110,7 +110,7 @@ index f698927..bc977b5 100644
@@ -248,8 +248,8 @@ class HelperFunctionsTests(unittest.TestCase):
self.assertEqual(dirs[1], wanted)
elif os.sep == '/':
- # OS X non-framwework builds, Linux, FreeBSD, etc
+ # OS X non-framework builds, Linux, FreeBSD, etc
- self.assertEqual(len(dirs), 1)
- wanted = os.path.join('xoxo', 'lib',
+ self.assertEqual(len(dirs), 2)
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 6929fda..bc4203d 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,9 +1,9 @@
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 70e5927..04c8e3d 100644
+index 4b093e3..1088435 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -556,7 +556,7 @@ clinic: $(BUILDPYTHON) $(srcdir)/Modules/_blake2/blake2s_impl.c
- $(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make
+@@ -543,7 +543,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+ $(PYTHON_FOR_REGEN) ./Tools/clinic/clinic.py --make
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
@@ -11,7 +11,7 @@ index 70e5927..04c8e3d 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -601,18 +601,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -588,18 +588,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -30,7 +30,7 @@ index 70e5927..04c8e3d 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -702,7 +690,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
+@@ -689,7 +677,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
echo "-----------------------------------------------"; \
fi
@@ -39,7 +39,7 @@ index 70e5927..04c8e3d 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1382,18 +1370,6 @@ libainstall: all python-config
+@@ -1425,18 +1413,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index b144ba5..4a640fd 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -542,18 +542,6 @@ diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index ae2bcd4..0a302ff 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
-@@ -9,8 +9,9 @@ import sys
- import subprocess
- import tempfile
- from test.support import script_helper, is_android
--from test.support.script_helper import (spawn_python, kill_python, assert_python_ok,
-- assert_python_failure)
-+from test.support.script_helper import (
-+ spawn_python, kill_python, assert_python_ok, assert_python_failure
-+)
-
-
- # XXX (ncoghlan): Move to script_helper and make consistent with run_python
@@ -151,6 +152,7 @@ class CmdLineTest(unittest.TestCase):
env = os.environ.copy()
# Use C locale to get ascii for the locale encoding
diff --git a/00264-skip-test-failing-on-aarch64.patch
b/00264-skip-test-failing-on-aarch64.patch
deleted file mode 100644
index edda219..0000000
--- a/00264-skip-test-failing-on-aarch64.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
-index 3eded77..ad7859a 100644
---- a/Lib/ctypes/test/test_structures.py
-+++ b/Lib/ctypes/test/test_structures.py
-@@ -392,6 +392,7 @@ class StructureTestCase(unittest.TestCase):
- (1, 0, 0, 0, 0, 0))
- self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7))
-
-+ @unittest.skip('Fails on aarch64:
http://bugs.python.org/issue29804')
- def test_pass_by_value(self):
- # This should mirror the structure in Modules/_ctypes/_ctypes_test.c
- class X(Structure):
diff --git a/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
b/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
deleted file mode 100644
index 4d0c87d..0000000
--- a/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
+++ /dev/null
@@ -1,240 +0,0 @@
-diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst
-index b04442bc162..9a0c570533a 100644
---- a/Doc/library/locale.rst
-+++ b/Doc/library/locale.rst
-@@ -147,6 +147,16 @@ The :mod:`locale` module defines the following exception and
functions:
- | ``CHAR_MAX`` | Nothing is specified in this locale. |
- +--------------+-----------------------------------------+
-
-+ The function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC``
-+ locale to decode ``decimal_point`` and ``thousands_sep`` byte strings if
-+ they are non-ASCII or longer than 1 byte, and the ``LC_NUMERIC`` locale is
-+ different than the ``LC_CTYPE`` locale. This temporary change affects other
-+ threads.
-+
-+ .. versionchanged:: 3.6.5
-+ The function now sets temporarily the ``LC_CTYPE`` locale to the
-+ ``LC_NUMERIC`` locale in some cases.
-+
-
- .. function:: nl_langinfo(option)
-
-diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
-index 196a4c00056..d8a1647e8b5 100644
---- a/Doc/library/stdtypes.rst
-+++ b/Doc/library/stdtypes.rst
-@@ -1599,6 +1599,20 @@ expression support in the :mod:`re` module).
- See :ref:`formatstrings` for a description of the various formatting options
- that can be specified in format strings.
-
-+ .. note::
-+ When formatting a number (:class:`int`, :class:`float`, :class:`float`
-+ and subclasses) with the ``n`` type (ex: ``'{:n}'.format(1234)``), the
-+ function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC``
-+ locale to decode ``decimal_point`` and ``thousands_sep`` fields of
-+ :c:func:`localeconv` if they are non-ASCII or longer than 1 byte, and the
-+ ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. This
-+ temporary change affects other threads.
-+
-+ .. versionchanged:: 3.6.5
-+ When formatting a number with the ``n`` type, the function sets
-+ temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale in some
-+ cases.
-+
-
- .. method:: str.format_map(mapping)
-
-diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
-index 847b50140a6..f83508c9250 100644
---- a/Doc/whatsnew/3.6.rst
-+++ b/Doc/whatsnew/3.6.rst
-@@ -2346,3 +2346,11 @@ It has been replaced by the new ``make regen-all`` target.
- (Contributed by Victor Stinner in :issue:`23404`.)
-
- .. versionchanged:: 3.6.2
-+
-+
-+Notable changes in Python 3.6.5
-+===============================
-+
-+The :func:`locale.localeconv` function now sets temporarily the ``LC_CTYPE``
-+locale to the ``LC_NUMERIC`` locale in some cases.
-+(Contributed by Victor Stinner in :issue:`31900`.)
-diff --git a/Include/fileutils.h b/Include/fileutils.h
-index 900c70faad7..875715df97a 100644
---- a/Include/fileutils.h
-+++ b/Include/fileutils.h
-@@ -119,6 +119,11 @@ PyAPI_FUNC(int) _Py_get_blocking(int fd);
- PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking);
- #endif /* !MS_WINDOWS */
-
-+PyAPI_FUNC(int) _Py_GetLocaleconvNumeric(
-+ PyObject **decimal_point,
-+ PyObject **thousands_sep,
-+ const char **grouping);
-+
- #endif /* Py_LIMITED_API */
-
- #ifdef __cplusplus
-diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
-index 71c9146ccb8..95b370b1ad0 100644
---- a/Modules/_localemodule.c
-+++ b/Modules/_localemodule.c
-@@ -171,12 +171,6 @@ PyLocale_localeconv(PyObject* self)
- RESULT(#i, x); \
- } while (0)
-
-- /* Numeric information */
-- RESULT_STRING(decimal_point);
-- RESULT_STRING(thousands_sep);
-- x = copy_grouping(l->grouping);
-- RESULT("grouping", x);
--
- /* Monetary information */
- RESULT_STRING(int_curr_symbol);
- RESULT_STRING(currency_symbol);
-@@ -195,6 +189,32 @@ PyLocale_localeconv(PyObject* self)
- RESULT_INT(n_sep_by_space);
- RESULT_INT(p_sign_posn);
- RESULT_INT(n_sign_posn);
-+
-+ /* Numeric information */
-+ PyObject *decimal_point, *thousands_sep;
-+ const char *grouping;
-+ if (_Py_GetLocaleconvNumeric(&decimal_point,
-+ &thousands_sep,
-+ &grouping) < 0) {
-+ goto failed;
-+ }
-+
-+ if (PyDict_SetItemString(result, "decimal_point", decimal_point) < 0)
{
-+ Py_DECREF(decimal_point);
-+ Py_DECREF(thousands_sep);
-+ goto failed;
-+ }
-+ Py_DECREF(decimal_point);
-+
-+ if (PyDict_SetItemString(result, "thousands_sep", thousands_sep) < 0)
{
-+ Py_DECREF(thousands_sep);
-+ goto failed;
-+ }
-+ Py_DECREF(thousands_sep);
-+
-+ x = copy_grouping(grouping);
-+ RESULT("grouping", x);
-+
- return result;
-
- failed:
-diff --git a/Python/fileutils.c b/Python/fileutils.c
-index 97505e5bc6d..14dd81b03f0 100644
---- a/Python/fileutils.c
-+++ b/Python/fileutils.c
-@@ -1597,3 +1597,80 @@ _Py_set_blocking(int fd, int blocking)
- return -1;
- }
- #endif
-+
-+
-+int
-+_Py_GetLocaleconvNumeric(PyObject **decimal_point, PyObject **thousands_sep,
-+ const char **grouping)
-+{
-+ int res = -1;
-+
-+ struct lconv *lc = localeconv();
-+
-+ int change_locale = 0;
-+ if (decimal_point != NULL &&
-+ (strlen(lc->decimal_point) > 1 || ((unsigned char)lc->decimal_point[0])
> 127))
-+ {
-+ change_locale = 1;
-+ }
-+ if (thousands_sep != NULL &&
-+ (strlen(lc->thousands_sep) > 1 || ((unsigned char)lc->thousands_sep[0])
> 127))
-+ {
-+ change_locale = 1;
-+ }
-+
-+ /* Keep a copy of the LC_CTYPE locale */
-+ char *oldloc = NULL, *loc = NULL;
-+ if (change_locale) {
-+ oldloc = setlocale(LC_CTYPE, NULL);
-+ if (!oldloc) {
-+ PyErr_SetString(PyExc_RuntimeWarning, "faild to get LC_CTYPE
locale");
-+ return -1;
-+ }
-+
-+ oldloc = _PyMem_Strdup(oldloc);
-+ if (!oldloc) {
-+ PyErr_NoMemory();
-+ return -1;
-+ }
-+
-+ loc = setlocale(LC_NUMERIC, NULL);
-+ if (loc != NULL && strcmp(loc, oldloc) == 0) {
-+ loc = NULL;
-+ }
-+
-+ if (loc != NULL) {
-+ /* Only set the locale temporarilty the LC_CTYPE locale
-+ if LC_NUMERIC locale is different than LC_CTYPE locale and
-+ decimal_point and/or thousands_sep are non-ASCII or longer than
-+ 1 byte */
-+ setlocale(LC_CTYPE, loc);
-+ }
-+ }
-+
-+ if (decimal_point != NULL) {
-+ *decimal_point = PyUnicode_DecodeLocale(lc->decimal_point, NULL);
-+ if (*decimal_point == NULL) {
-+ goto error;
-+ }
-+ }
-+ if (thousands_sep != NULL) {
-+ *thousands_sep = PyUnicode_DecodeLocale(lc->thousands_sep, NULL);
-+ if (*thousands_sep == NULL) {
-+ goto error;
-+ }
-+ }
-+
-+ if (grouping != NULL) {
-+ *grouping = lc->grouping;
-+ }
-+
-+ res = 0;
-+
-+error:
-+ if (loc != NULL) {
-+ setlocale(LC_CTYPE, oldloc);
-+ }
-+ PyMem_Free(oldloc);
-+ return res;
-+}
-diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
-index d2be76f1e1a..d3ef650e6ce 100644
---- a/Python/formatter_unicode.c
-+++ b/Python/formatter_unicode.c
-@@ -707,18 +707,11 @@ get_locale_info(enum LocaleType type, LocaleInfo *locale_info)
- {
- switch (type) {
- case LT_CURRENT_LOCALE: {
-- struct lconv *locale_data = localeconv();
-- locale_info->decimal_point = PyUnicode_DecodeLocale(
-- locale_data->decimal_point,
-- NULL);
-- if (locale_info->decimal_point == NULL)
-+ if (_Py_GetLocaleconvNumeric(&locale_info->decimal_point,
-+ &locale_info->thousands_sep,
-+ &locale_info->grouping) < 0) {
- return -1;
-- locale_info->thousands_sep = PyUnicode_DecodeLocale(
-- locale_data->thousands_sep,
-- NULL);
-- if (locale_info->thousands_sep == NULL)
-- return -1;
-- locale_info->grouping = locale_data->grouping;
-+ }
- break;
- }
- case LT_DEFAULT_LOCALE:
diff --git a/00277-fix-test-subprocess-hanging-tests.patch
b/00277-fix-test-subprocess-hanging-tests.patch
deleted file mode 100644
index c9b54e2..0000000
--- a/00277-fix-test-subprocess-hanging-tests.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 54849962eacc38f4e6c6f8a72ae258b3e7c2ecd5 Mon Sep 17 00:00:00 2001
-From: Victor Stinner <victor.stinner(a)gmail.com>
-Date: Thu, 5 Oct 2017 15:05:30 +0200
-Subject: [PATCH] bpo-31178: Mock os.waitpid() in test_subprocess
-
-Fix test_exception_errpipe_bad_data() and
-test_exception_errpipe_normal() of test_subprocess: mock os.waitpid()
-to avoid calling the real os.waitpid(0, 0) which is an unexpected
-side effect of the test.
----
- Lib/test/test_subprocess.py | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
-diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
-index 00dc37bc2c7..3ba5c028517 100644
---- a/Lib/test/test_subprocess.py
-+++ b/Lib/test/test_subprocess.py
-@@ -1559,8 +1559,10 @@ def proper_error(*args):
-
- fork_exec.side_effect = proper_error
-
-- with self.assertRaises(IsADirectoryError):
-- self.PopenNoDestructor(["non_existent_command"])
-+ with mock.patch("subprocess.os.waitpid",
-+ side_effect=ChildProcessError):
-+ with self.assertRaises(IsADirectoryError):
-+ self.PopenNoDestructor(["non_existent_command"])
-
- @mock.patch("subprocess._posixsubprocess.fork_exec")
- def test_exception_errpipe_bad_data(self, fork_exec):
-@@ -1577,8 +1579,10 @@ def bad_error(*args):
-
- fork_exec.side_effect = bad_error
-
-- with self.assertRaises(subprocess.SubprocessError) as e:
-- self.PopenNoDestructor(["non_existent_command"])
-+ with mock.patch("subprocess.os.waitpid",
-+ side_effect=ChildProcessError):
-+ with self.assertRaises(subprocess.SubprocessError) as e:
-+ self.PopenNoDestructor(["non_existent_command"])
-
- self.assertIn(repr(error_data), str(e.exception))
-
diff --git a/00279-fix-memory-corruption-due-to-allocator-mix.patch
b/00279-fix-memory-corruption-due-to-allocator-mix.patch
deleted file mode 100644
index 4937391..0000000
--- a/00279-fix-memory-corruption-due-to-allocator-mix.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Modules/getpath.c b/Modules/getpath.c
-index c4055be..1258fcd 100644
---- a/Modules/getpath.c
-+++ b/Modules/getpath.c
-@@ -735,7 +735,7 @@ calculate_path(void)
- bufsz += wcslen(zip_path) + 1;
- bufsz += wcslen(exec_prefix) + 1;
-
-- buf = PyMem_New(wchar_t, bufsz);
-+ buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t));
- if (buf == NULL) {
- Py_FatalError(
- "Not enough memory for dynamic PYTHONPATH");
diff --git a/00289-fix-nis-compilation.patch b/00289-fix-nis-compilation.patch
deleted file mode 100644
index 4d4e3dc..0000000
--- a/00289-fix-nis-compilation.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/setup.py b/setup.py
-index 3eb6ad1..3437e48 100644
---- a/setup.py
-+++ b/setup.py
-@@ -1331,20 +1331,14 @@ class PyBuildExt(build_ext):
- exts.append( Extension('termios', ['termios.c']) )
- # Jeremy Hylton's rlimit interface
- exts.append( Extension('resource', ['resource.c']) )
-+ else:
-+ missing.extend(['resource', 'termios'])
-
-- # Sun yellow pages. Some systems have the functions in libc.
-- if (host_platform not in ['cygwin', 'qnx6'] and
-- find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
-- if (self.compiler.find_library_file(lib_dirs, 'nsl')):
-- libs = ['nsl']
-- else:
-- libs = []
-- exts.append( Extension('nis', ['nismodule.c'],
-- libraries = libs) )
-- else:
-- missing.append('nis')
-+ nis = self._detect_nis(inc_dirs, lib_dirs)
-+ if nis is not None:
-+ exts.append(nis)
- else:
-- missing.extend(['nis', 'resource', 'termios'])
-+ missing.append('nis')
-
- # Curses support, requiring the System V version of curses, often
- # provided by the ncurses library.
-@@ -2179,6 +2173,51 @@ class PyBuildExt(build_ext):
- )
- return ext
-
-+ def _detect_nis(self, inc_dirs, lib_dirs):
-+ if host_platform in {'win32', 'cygwin', 'qnx6'}:
-+ return None
-+
-+ libs = []
-+ library_dirs = []
-+ includes_dirs = []
-+
-+ # Latest glibc has moved Sun RPC headers into tircp and nsl sub
-+ # directories. rpc code has been moved to libtirpc.
-+ rpcsvc_inc = find_file(
-+ 'rpcsvc/yp_prot.h', inc_dirs,
-+ ['/usr/local/include/nsl', '/usr/include/nsl']
-+ )
-+ rpc_inc = find_file(
-+ 'rpc/rpc.h', inc_dirs,
-+ ['/usr/local/include/tirpc', '/usr/include/tirpc']
-+ )
-+ if rpcsvc_inc is None or rpc_inc is None:
-+ # not found
-+ return None
-+ includes_dirs.extend(rpcsvc_inc)
-+ includes_dirs.extend(rpc_inc)
-+
-+ if self.compiler.find_library_file(lib_dirs, 'nsl'):
-+ libs.append('nsl')
-+ else:
-+ # libnsl-devel: check for libnsl in nsl/ subdirectory
-+ nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs]
-+ libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
-+ if libnsl is not None:
-+ library_dirs.append(os.path.dirname(libnsl))
-+ libs.append('nsl')
-+
-+ if self.compiler.find_library_file(lib_dirs, 'tirpc'):
-+ libs.append('tirpc')
-+
-+ return Extension(
-+ 'nis', ['nismodule.c'],
-+ libraries=libs,
-+ library_dirs=library_dirs,
-+ include_dirs=includes_dirs
-+ )
-+
-+
- class PyBuildInstall(install):
- # Suppress the warning about installation into the lib_dynload
- # directory, which is not in sys.path when running Python during
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
deleted file mode 100644
index c5d768b..0000000
--- a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-diff --git a/Include/Python.h b/Include/Python.h
-index dd595ea5e4c..1feb1531cc9 100644
---- a/Include/Python.h
-+++ b/Include/Python.h
-@@ -35,6 +35,9 @@
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif
-+#ifdef HAVE_CRYPT_H
-+#include <crypt.h>
-+#endif
-
- /* For size_t? */
- #ifdef HAVE_STDDEF_H
-diff --git a/configure.ac b/configure.ac
-index 03b0f501aff..15ef872a53a 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2041,7 +2041,7 @@ dnl AC_MSG_RESULT($cpp_type)
-
- # checks for header files
- AC_HEADER_STDC
--AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
-+AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \
- fcntl.h grp.h \
- ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \
- sched.h shadow.h signal.h stropts.h termios.h \
-
diff --git a/00291-setup-Link-ctypes-against-dl-explicitly.patch
b/00291-setup-Link-ctypes-against-dl-explicitly.patch
deleted file mode 100644
index 6539003..0000000
--- a/00291-setup-Link-ctypes-against-dl-explicitly.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff --git a/setup.py b/setup.py
-index f4f6e4fdb1f0..8536c350fe3a 100644
---- a/setup.py
-+++ b/setup.py
-@@ -2005,6 +2005,10 @@ def detect_ctypes(self, inc_dirs, lib_dirs):
- ext.libraries.append(ffi_lib)
- self.use_system_libffi = True
-
-+ if sysconfig.get_config_var('HAVE_LIBDL'):
-+ # for dlopen, see bpo-32647
-+ ext.libraries.append('dl')
-+
- def _decimal_ext(self):
- extra_compile_args = []
- undef_macros = []
diff --git a/00298-do-not-send-IP-in-SNI-TLS-extension.patch
b/00298-do-not-send-IP-in-SNI-TLS-extension.patch
deleted file mode 100644
index 19b6b31..0000000
--- a/00298-do-not-send-IP-in-SNI-TLS-extension.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-diff --git a/Modules/_ssl.c b/Modules/_ssl.c
-index df8c6a7d96d8..e8cffef14de0 100644
---- a/Modules/_ssl.c
-+++ b/Modules/_ssl.c
-@@ -55,6 +55,11 @@ static PySocketModule_APIObject PySocketModule;
- #include <sys/poll.h>
- #endif
-
-+#ifndef MS_WINDOWS
-+/* inet_pton */
-+#include <arpa/inet.h>
-+#endif
-+
- /* Don't warn about deprecated functions */
- #ifdef __GNUC__
- #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-@@ -667,8 +672,41 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
- SSL_set_mode(self->ssl, mode);
-
- #if HAVE_SNI
-- if (server_hostname != NULL)
-- SSL_set_tlsext_host_name(self->ssl, server_hostname);
-+ if (server_hostname != NULL) {
-+/* Don't send SNI for IP addresses. We cannot simply use inet_aton() and
-+ * inet_pton() here. inet_aton() may be linked weakly and inet_pton() isn't
-+ * available on all platforms. Use OpenSSL's IP address parser. It's
-+ * available since 1.0.2 and LibreSSL since at least 2.3.0. */
-+ int send_sni = 1;
-+#if OPENSSL_VERSION_NUMBER >= 0x10200000L
-+ ASN1_OCTET_STRING *ip = a2i_IPADDRESS(server_hostname);
-+ if (ip == NULL) {
-+ send_sni = 1;
-+ ERR_clear_error();
-+ } else {
-+ send_sni = 0;
-+ ASN1_OCTET_STRING_free(ip);
-+ }
-+#elif defined(HAVE_INET_PTON)
-+#ifdef ENABLE_IPV6
-+ char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
-+#else
-+ char packed[sizeof(struct in_addr)];
-+#endif /* ENABLE_IPV6 */
-+ if (inet_pton(AF_INET, server_hostname, packed)) {
-+ send_sni = 0;
-+#ifdef ENABLE_IPV6
-+ } else if(inet_pton(AF_INET6, server_hostname, packed)) {
-+ send_sni = 0;
-+#endif /* ENABLE_IPV6 */
-+ } else {
-+ send_sni = 1;
-+ }
-+#endif /* HAVE_INET_PTON */
-+ if (send_sni) {
-+ SSL_set_tlsext_host_name(self->ssl, server_hostname);
-+ }
-+ }
- #endif
-
- /* If the socket is in non-blocking mode or timeout mode, set the BIO
diff --git a/python3.spec b/python3.spec
index dd21fdc..5bdde01 100644
--- a/python3.spec
+++ b/python3.spec
@@ -13,8 +13,8 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.4
-Release: 20%{?dist}
+Version: %{pybasever}.5
+Release: 1%{?dist}
License: Python
@@ -334,45 +334,10 @@ Patch251: 00251-change-user-install-location.patch
# Original proposal:
https://bugzilla.redhat.com/show_bug.cgi?id=1404918
Patch262: 00262-pep538_coerce_legacy_c_locale.patch
-# 00264 #
-# test_pass_by_value was added in Python 3.6.1 and on aarch64
-# it is catching an error that was there, but wasn't tested before.
-# Therefore skipping the test on aarch64 until fixed upstream.
-# Reported upstream:
http://bugs.python.org/issue29804
-Patch264: 00264-skip-test-failing-on-aarch64.patch
-
-# 00273 #
-# Fix localeconv() encoding for LC_NUMERIC
-# Fixed upstream:
https://bugs.python.org/issue31900
-Patch273: 00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
-
# 00274 #
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00289 #
-# Fix the compilation of the nis module, as glibc removed the
-# interfaces related to Sun RPC and they are now provided
-# by libtirpc and libnsl2.
-# See:
https://fedoraproject.org/wiki/Changes/SunRPCRemoval
-# and
https://fedoraproject.org/wiki/Changes/NISIPv6
-# Fixed upstream:
https://bugs.python.org/issue32521
-Patch289: 00289-fix-nis-compilation.patch
-
-# 00290 #
-# Not every target system may provide a crypt() function in its stdlibc
-# and may use an external or replacement library, like libxcrypt, for
-# providing such functions.
-# Fixed upstream:
https://bugs.python.org/issue32635
-Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
-
-# 00291 #
-# Build fails with undefined references to dlopen / dlsym otherwise.
-# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
-# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
-# Fixed upstream:
https://bugs.python.org/issue32647
-Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
-
# 00292 #
# Restore the public PyExc_RecursionErrorInst symbol that was removed
# from the 3.6.4 release upstream.
@@ -387,12 +352,6 @@ Patch292: 00292-restore-PyExc_RecursionErrorInst-symbol.patch
# See also:
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
Patch294: 00294-define-TLS-cipher-suite-on-build-time.patch
-# 00298 #
-# The SSL module no longer sends IP addresses in SNI TLS extension on
-# platforms with OpenSSL 1.0.2+ or inet_pton.
-# Fixed upstream:
https://bugs.python.org/issue32185
-Patch298: 00298-do-not-send-IP-in-SNI-TLS-extension.patch
-
# 00301 #
# Tools/scripts/pathfix.py: Add -n option for no backup~
# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1546990
@@ -659,7 +618,7 @@ rm -r Modules/expat
rm -r Modules/zlib
%if %{with rewheel}
-%global pip_version 9.0.1
+%global pip_version 9.0.3
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
%endif
@@ -686,19 +645,9 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch205 -p1
%patch251 -p1
%patch262 -p1
-
-%ifarch aarch64
-%patch264 -p1
-%endif
-
-%patch273 -p1
%patch274 -p1
-%patch289 -p1
-%patch290 -p1
-%patch291 -p1
%patch292 -p1
%patch294 -p1
-%patch298 -p1
%patch301 -p1
@@ -1521,6 +1470,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Mar 29 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.5-1
+- Update to 3.6.5
+
* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-20
- Fix broken macro invocation and broken building of C Python extensions
Resolves: rhbz#1560103
diff --git a/sources b/sources
index 6b5ff13..9d32274 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.4.tar.xz) =
09ba2103ac517ac4d262f00380c9aac836a53401ce252540c17fd821a3b92e1ddf32528d00772221eb3126b12cb95b62c3ac3e852f4951e6f2eb406c88c848a2
+SHA512 (Python-3.6.5.tar.xz) =
6b26fcd296b9bd8e67861eff10d14db7507711ddba947288d16d6def53135c39326b7f969c04bb2b2993f924d9e7ad3f5c5282a3915760bc0885cf0a8ea5eb51
commit fb9702fb7f582516652106aabd7c208108970071
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Mar 29 16:03:33 2018 +0200
Update to 3.6.5
Rebased patches: 102, 111, 262
Removed patches due to being upstreamed:
264, 273, 289, 290, 291, 298
Update pip version to 9.0.3
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 8eea66d..2b913ca 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -110,7 +110,7 @@ index f698927..bc977b5 100644
@@ -248,8 +248,8 @@ class HelperFunctionsTests(unittest.TestCase):
self.assertEqual(dirs[1], wanted)
elif os.sep == '/':
- # OS X non-framwework builds, Linux, FreeBSD, etc
+ # OS X non-framework builds, Linux, FreeBSD, etc
- self.assertEqual(len(dirs), 1)
- wanted = os.path.join('xoxo', 'lib',
+ self.assertEqual(len(dirs), 2)
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 6929fda..bc4203d 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,9 +1,9 @@
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 70e5927..04c8e3d 100644
+index 4b093e3..1088435 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -556,7 +556,7 @@ clinic: $(BUILDPYTHON) $(srcdir)/Modules/_blake2/blake2s_impl.c
- $(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make
+@@ -543,7 +543,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+ $(PYTHON_FOR_REGEN) ./Tools/clinic/clinic.py --make
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
@@ -11,7 +11,7 @@ index 70e5927..04c8e3d 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -601,18 +601,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -588,18 +588,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -30,7 +30,7 @@ index 70e5927..04c8e3d 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -702,7 +690,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
+@@ -689,7 +677,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
echo "-----------------------------------------------"; \
fi
@@ -39,7 +39,7 @@ index 70e5927..04c8e3d 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1382,18 +1370,6 @@ libainstall: all python-config
+@@ -1425,18 +1413,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index b144ba5..4a640fd 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -542,18 +542,6 @@ diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index ae2bcd4..0a302ff 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
-@@ -9,8 +9,9 @@ import sys
- import subprocess
- import tempfile
- from test.support import script_helper, is_android
--from test.support.script_helper import (spawn_python, kill_python, assert_python_ok,
-- assert_python_failure)
-+from test.support.script_helper import (
-+ spawn_python, kill_python, assert_python_ok, assert_python_failure
-+)
-
-
- # XXX (ncoghlan): Move to script_helper and make consistent with run_python
@@ -151,6 +152,7 @@ class CmdLineTest(unittest.TestCase):
env = os.environ.copy()
# Use C locale to get ascii for the locale encoding
diff --git a/00264-skip-test-failing-on-aarch64.patch
b/00264-skip-test-failing-on-aarch64.patch
deleted file mode 100644
index edda219..0000000
--- a/00264-skip-test-failing-on-aarch64.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
-index 3eded77..ad7859a 100644
---- a/Lib/ctypes/test/test_structures.py
-+++ b/Lib/ctypes/test/test_structures.py
-@@ -392,6 +392,7 @@ class StructureTestCase(unittest.TestCase):
- (1, 0, 0, 0, 0, 0))
- self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7))
-
-+ @unittest.skip('Fails on aarch64:
http://bugs.python.org/issue29804')
- def test_pass_by_value(self):
- # This should mirror the structure in Modules/_ctypes/_ctypes_test.c
- class X(Structure):
diff --git a/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
b/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
deleted file mode 100644
index 4d0c87d..0000000
--- a/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
+++ /dev/null
@@ -1,240 +0,0 @@
-diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst
-index b04442bc162..9a0c570533a 100644
---- a/Doc/library/locale.rst
-+++ b/Doc/library/locale.rst
-@@ -147,6 +147,16 @@ The :mod:`locale` module defines the following exception and
functions:
- | ``CHAR_MAX`` | Nothing is specified in this locale. |
- +--------------+-----------------------------------------+
-
-+ The function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC``
-+ locale to decode ``decimal_point`` and ``thousands_sep`` byte strings if
-+ they are non-ASCII or longer than 1 byte, and the ``LC_NUMERIC`` locale is
-+ different than the ``LC_CTYPE`` locale. This temporary change affects other
-+ threads.
-+
-+ .. versionchanged:: 3.6.5
-+ The function now sets temporarily the ``LC_CTYPE`` locale to the
-+ ``LC_NUMERIC`` locale in some cases.
-+
-
- .. function:: nl_langinfo(option)
-
-diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
-index 196a4c00056..d8a1647e8b5 100644
---- a/Doc/library/stdtypes.rst
-+++ b/Doc/library/stdtypes.rst
-@@ -1599,6 +1599,20 @@ expression support in the :mod:`re` module).
- See :ref:`formatstrings` for a description of the various formatting options
- that can be specified in format strings.
-
-+ .. note::
-+ When formatting a number (:class:`int`, :class:`float`, :class:`float`
-+ and subclasses) with the ``n`` type (ex: ``'{:n}'.format(1234)``), the
-+ function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC``
-+ locale to decode ``decimal_point`` and ``thousands_sep`` fields of
-+ :c:func:`localeconv` if they are non-ASCII or longer than 1 byte, and the
-+ ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. This
-+ temporary change affects other threads.
-+
-+ .. versionchanged:: 3.6.5
-+ When formatting a number with the ``n`` type, the function sets
-+ temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale in some
-+ cases.
-+
-
- .. method:: str.format_map(mapping)
-
-diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
-index 847b50140a6..f83508c9250 100644
---- a/Doc/whatsnew/3.6.rst
-+++ b/Doc/whatsnew/3.6.rst
-@@ -2346,3 +2346,11 @@ It has been replaced by the new ``make regen-all`` target.
- (Contributed by Victor Stinner in :issue:`23404`.)
-
- .. versionchanged:: 3.6.2
-+
-+
-+Notable changes in Python 3.6.5
-+===============================
-+
-+The :func:`locale.localeconv` function now sets temporarily the ``LC_CTYPE``
-+locale to the ``LC_NUMERIC`` locale in some cases.
-+(Contributed by Victor Stinner in :issue:`31900`.)
-diff --git a/Include/fileutils.h b/Include/fileutils.h
-index 900c70faad7..875715df97a 100644
---- a/Include/fileutils.h
-+++ b/Include/fileutils.h
-@@ -119,6 +119,11 @@ PyAPI_FUNC(int) _Py_get_blocking(int fd);
- PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking);
- #endif /* !MS_WINDOWS */
-
-+PyAPI_FUNC(int) _Py_GetLocaleconvNumeric(
-+ PyObject **decimal_point,
-+ PyObject **thousands_sep,
-+ const char **grouping);
-+
- #endif /* Py_LIMITED_API */
-
- #ifdef __cplusplus
-diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
-index 71c9146ccb8..95b370b1ad0 100644
---- a/Modules/_localemodule.c
-+++ b/Modules/_localemodule.c
-@@ -171,12 +171,6 @@ PyLocale_localeconv(PyObject* self)
- RESULT(#i, x); \
- } while (0)
-
-- /* Numeric information */
-- RESULT_STRING(decimal_point);
-- RESULT_STRING(thousands_sep);
-- x = copy_grouping(l->grouping);
-- RESULT("grouping", x);
--
- /* Monetary information */
- RESULT_STRING(int_curr_symbol);
- RESULT_STRING(currency_symbol);
-@@ -195,6 +189,32 @@ PyLocale_localeconv(PyObject* self)
- RESULT_INT(n_sep_by_space);
- RESULT_INT(p_sign_posn);
- RESULT_INT(n_sign_posn);
-+
-+ /* Numeric information */
-+ PyObject *decimal_point, *thousands_sep;
-+ const char *grouping;
-+ if (_Py_GetLocaleconvNumeric(&decimal_point,
-+ &thousands_sep,
-+ &grouping) < 0) {
-+ goto failed;
-+ }
-+
-+ if (PyDict_SetItemString(result, "decimal_point", decimal_point) < 0)
{
-+ Py_DECREF(decimal_point);
-+ Py_DECREF(thousands_sep);
-+ goto failed;
-+ }
-+ Py_DECREF(decimal_point);
-+
-+ if (PyDict_SetItemString(result, "thousands_sep", thousands_sep) < 0)
{
-+ Py_DECREF(thousands_sep);
-+ goto failed;
-+ }
-+ Py_DECREF(thousands_sep);
-+
-+ x = copy_grouping(grouping);
-+ RESULT("grouping", x);
-+
- return result;
-
- failed:
-diff --git a/Python/fileutils.c b/Python/fileutils.c
-index 97505e5bc6d..14dd81b03f0 100644
---- a/Python/fileutils.c
-+++ b/Python/fileutils.c
-@@ -1597,3 +1597,80 @@ _Py_set_blocking(int fd, int blocking)
- return -1;
- }
- #endif
-+
-+
-+int
-+_Py_GetLocaleconvNumeric(PyObject **decimal_point, PyObject **thousands_sep,
-+ const char **grouping)
-+{
-+ int res = -1;
-+
-+ struct lconv *lc = localeconv();
-+
-+ int change_locale = 0;
-+ if (decimal_point != NULL &&
-+ (strlen(lc->decimal_point) > 1 || ((unsigned char)lc->decimal_point[0])
> 127))
-+ {
-+ change_locale = 1;
-+ }
-+ if (thousands_sep != NULL &&
-+ (strlen(lc->thousands_sep) > 1 || ((unsigned char)lc->thousands_sep[0])
> 127))
-+ {
-+ change_locale = 1;
-+ }
-+
-+ /* Keep a copy of the LC_CTYPE locale */
-+ char *oldloc = NULL, *loc = NULL;
-+ if (change_locale) {
-+ oldloc = setlocale(LC_CTYPE, NULL);
-+ if (!oldloc) {
-+ PyErr_SetString(PyExc_RuntimeWarning, "faild to get LC_CTYPE
locale");
-+ return -1;
-+ }
-+
-+ oldloc = _PyMem_Strdup(oldloc);
-+ if (!oldloc) {
-+ PyErr_NoMemory();
-+ return -1;
-+ }
-+
-+ loc = setlocale(LC_NUMERIC, NULL);
-+ if (loc != NULL && strcmp(loc, oldloc) == 0) {
-+ loc = NULL;
-+ }
-+
-+ if (loc != NULL) {
-+ /* Only set the locale temporarilty the LC_CTYPE locale
-+ if LC_NUMERIC locale is different than LC_CTYPE locale and
-+ decimal_point and/or thousands_sep are non-ASCII or longer than
-+ 1 byte */
-+ setlocale(LC_CTYPE, loc);
-+ }
-+ }
-+
-+ if (decimal_point != NULL) {
-+ *decimal_point = PyUnicode_DecodeLocale(lc->decimal_point, NULL);
-+ if (*decimal_point == NULL) {
-+ goto error;
-+ }
-+ }
-+ if (thousands_sep != NULL) {
-+ *thousands_sep = PyUnicode_DecodeLocale(lc->thousands_sep, NULL);
-+ if (*thousands_sep == NULL) {
-+ goto error;
-+ }
-+ }
-+
-+ if (grouping != NULL) {
-+ *grouping = lc->grouping;
-+ }
-+
-+ res = 0;
-+
-+error:
-+ if (loc != NULL) {
-+ setlocale(LC_CTYPE, oldloc);
-+ }
-+ PyMem_Free(oldloc);
-+ return res;
-+}
-diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
-index d2be76f1e1a..d3ef650e6ce 100644
---- a/Python/formatter_unicode.c
-+++ b/Python/formatter_unicode.c
-@@ -707,18 +707,11 @@ get_locale_info(enum LocaleType type, LocaleInfo *locale_info)
- {
- switch (type) {
- case LT_CURRENT_LOCALE: {
-- struct lconv *locale_data = localeconv();
-- locale_info->decimal_point = PyUnicode_DecodeLocale(
-- locale_data->decimal_point,
-- NULL);
-- if (locale_info->decimal_point == NULL)
-+ if (_Py_GetLocaleconvNumeric(&locale_info->decimal_point,
-+ &locale_info->thousands_sep,
-+ &locale_info->grouping) < 0) {
- return -1;
-- locale_info->thousands_sep = PyUnicode_DecodeLocale(
-- locale_data->thousands_sep,
-- NULL);
-- if (locale_info->thousands_sep == NULL)
-- return -1;
-- locale_info->grouping = locale_data->grouping;
-+ }
- break;
- }
- case LT_DEFAULT_LOCALE:
diff --git a/00277-fix-test-subprocess-hanging-tests.patch
b/00277-fix-test-subprocess-hanging-tests.patch
deleted file mode 100644
index c9b54e2..0000000
--- a/00277-fix-test-subprocess-hanging-tests.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 54849962eacc38f4e6c6f8a72ae258b3e7c2ecd5 Mon Sep 17 00:00:00 2001
-From: Victor Stinner <victor.stinner(a)gmail.com>
-Date: Thu, 5 Oct 2017 15:05:30 +0200
-Subject: [PATCH] bpo-31178: Mock os.waitpid() in test_subprocess
-
-Fix test_exception_errpipe_bad_data() and
-test_exception_errpipe_normal() of test_subprocess: mock os.waitpid()
-to avoid calling the real os.waitpid(0, 0) which is an unexpected
-side effect of the test.
----
- Lib/test/test_subprocess.py | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
-diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
-index 00dc37bc2c7..3ba5c028517 100644
---- a/Lib/test/test_subprocess.py
-+++ b/Lib/test/test_subprocess.py
-@@ -1559,8 +1559,10 @@ def proper_error(*args):
-
- fork_exec.side_effect = proper_error
-
-- with self.assertRaises(IsADirectoryError):
-- self.PopenNoDestructor(["non_existent_command"])
-+ with mock.patch("subprocess.os.waitpid",
-+ side_effect=ChildProcessError):
-+ with self.assertRaises(IsADirectoryError):
-+ self.PopenNoDestructor(["non_existent_command"])
-
- @mock.patch("subprocess._posixsubprocess.fork_exec")
- def test_exception_errpipe_bad_data(self, fork_exec):
-@@ -1577,8 +1579,10 @@ def bad_error(*args):
-
- fork_exec.side_effect = bad_error
-
-- with self.assertRaises(subprocess.SubprocessError) as e:
-- self.PopenNoDestructor(["non_existent_command"])
-+ with mock.patch("subprocess.os.waitpid",
-+ side_effect=ChildProcessError):
-+ with self.assertRaises(subprocess.SubprocessError) as e:
-+ self.PopenNoDestructor(["non_existent_command"])
-
- self.assertIn(repr(error_data), str(e.exception))
-
diff --git a/00279-fix-memory-corruption-due-to-allocator-mix.patch
b/00279-fix-memory-corruption-due-to-allocator-mix.patch
deleted file mode 100644
index 4937391..0000000
--- a/00279-fix-memory-corruption-due-to-allocator-mix.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Modules/getpath.c b/Modules/getpath.c
-index c4055be..1258fcd 100644
---- a/Modules/getpath.c
-+++ b/Modules/getpath.c
-@@ -735,7 +735,7 @@ calculate_path(void)
- bufsz += wcslen(zip_path) + 1;
- bufsz += wcslen(exec_prefix) + 1;
-
-- buf = PyMem_New(wchar_t, bufsz);
-+ buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t));
- if (buf == NULL) {
- Py_FatalError(
- "Not enough memory for dynamic PYTHONPATH");
diff --git a/00289-fix-nis-compilation.patch b/00289-fix-nis-compilation.patch
deleted file mode 100644
index 4d4e3dc..0000000
--- a/00289-fix-nis-compilation.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/setup.py b/setup.py
-index 3eb6ad1..3437e48 100644
---- a/setup.py
-+++ b/setup.py
-@@ -1331,20 +1331,14 @@ class PyBuildExt(build_ext):
- exts.append( Extension('termios', ['termios.c']) )
- # Jeremy Hylton's rlimit interface
- exts.append( Extension('resource', ['resource.c']) )
-+ else:
-+ missing.extend(['resource', 'termios'])
-
-- # Sun yellow pages. Some systems have the functions in libc.
-- if (host_platform not in ['cygwin', 'qnx6'] and
-- find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
-- if (self.compiler.find_library_file(lib_dirs, 'nsl')):
-- libs = ['nsl']
-- else:
-- libs = []
-- exts.append( Extension('nis', ['nismodule.c'],
-- libraries = libs) )
-- else:
-- missing.append('nis')
-+ nis = self._detect_nis(inc_dirs, lib_dirs)
-+ if nis is not None:
-+ exts.append(nis)
- else:
-- missing.extend(['nis', 'resource', 'termios'])
-+ missing.append('nis')
-
- # Curses support, requiring the System V version of curses, often
- # provided by the ncurses library.
-@@ -2179,6 +2173,51 @@ class PyBuildExt(build_ext):
- )
- return ext
-
-+ def _detect_nis(self, inc_dirs, lib_dirs):
-+ if host_platform in {'win32', 'cygwin', 'qnx6'}:
-+ return None
-+
-+ libs = []
-+ library_dirs = []
-+ includes_dirs = []
-+
-+ # Latest glibc has moved Sun RPC headers into tircp and nsl sub
-+ # directories. rpc code has been moved to libtirpc.
-+ rpcsvc_inc = find_file(
-+ 'rpcsvc/yp_prot.h', inc_dirs,
-+ ['/usr/local/include/nsl', '/usr/include/nsl']
-+ )
-+ rpc_inc = find_file(
-+ 'rpc/rpc.h', inc_dirs,
-+ ['/usr/local/include/tirpc', '/usr/include/tirpc']
-+ )
-+ if rpcsvc_inc is None or rpc_inc is None:
-+ # not found
-+ return None
-+ includes_dirs.extend(rpcsvc_inc)
-+ includes_dirs.extend(rpc_inc)
-+
-+ if self.compiler.find_library_file(lib_dirs, 'nsl'):
-+ libs.append('nsl')
-+ else:
-+ # libnsl-devel: check for libnsl in nsl/ subdirectory
-+ nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs]
-+ libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
-+ if libnsl is not None:
-+ library_dirs.append(os.path.dirname(libnsl))
-+ libs.append('nsl')
-+
-+ if self.compiler.find_library_file(lib_dirs, 'tirpc'):
-+ libs.append('tirpc')
-+
-+ return Extension(
-+ 'nis', ['nismodule.c'],
-+ libraries=libs,
-+ library_dirs=library_dirs,
-+ include_dirs=includes_dirs
-+ )
-+
-+
- class PyBuildInstall(install):
- # Suppress the warning about installation into the lib_dynload
- # directory, which is not in sys.path when running Python during
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
deleted file mode 100644
index c5d768b..0000000
--- a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-diff --git a/Include/Python.h b/Include/Python.h
-index dd595ea5e4c..1feb1531cc9 100644
---- a/Include/Python.h
-+++ b/Include/Python.h
-@@ -35,6 +35,9 @@
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif
-+#ifdef HAVE_CRYPT_H
-+#include <crypt.h>
-+#endif
-
- /* For size_t? */
- #ifdef HAVE_STDDEF_H
-diff --git a/configure.ac b/configure.ac
-index 03b0f501aff..15ef872a53a 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2041,7 +2041,7 @@ dnl AC_MSG_RESULT($cpp_type)
-
- # checks for header files
- AC_HEADER_STDC
--AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
-+AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \
- fcntl.h grp.h \
- ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \
- sched.h shadow.h signal.h stropts.h termios.h \
-
diff --git a/00291-setup-Link-ctypes-against-dl-explicitly.patch
b/00291-setup-Link-ctypes-against-dl-explicitly.patch
deleted file mode 100644
index 6539003..0000000
--- a/00291-setup-Link-ctypes-against-dl-explicitly.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff --git a/setup.py b/setup.py
-index f4f6e4fdb1f0..8536c350fe3a 100644
---- a/setup.py
-+++ b/setup.py
-@@ -2005,6 +2005,10 @@ def detect_ctypes(self, inc_dirs, lib_dirs):
- ext.libraries.append(ffi_lib)
- self.use_system_libffi = True
-
-+ if sysconfig.get_config_var('HAVE_LIBDL'):
-+ # for dlopen, see bpo-32647
-+ ext.libraries.append('dl')
-+
- def _decimal_ext(self):
- extra_compile_args = []
- undef_macros = []
diff --git a/00298-do-not-send-IP-in-SNI-TLS-extension.patch
b/00298-do-not-send-IP-in-SNI-TLS-extension.patch
deleted file mode 100644
index 19b6b31..0000000
--- a/00298-do-not-send-IP-in-SNI-TLS-extension.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-diff --git a/Modules/_ssl.c b/Modules/_ssl.c
-index df8c6a7d96d8..e8cffef14de0 100644
---- a/Modules/_ssl.c
-+++ b/Modules/_ssl.c
-@@ -55,6 +55,11 @@ static PySocketModule_APIObject PySocketModule;
- #include <sys/poll.h>
- #endif
-
-+#ifndef MS_WINDOWS
-+/* inet_pton */
-+#include <arpa/inet.h>
-+#endif
-+
- /* Don't warn about deprecated functions */
- #ifdef __GNUC__
- #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-@@ -667,8 +672,41 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
- SSL_set_mode(self->ssl, mode);
-
- #if HAVE_SNI
-- if (server_hostname != NULL)
-- SSL_set_tlsext_host_name(self->ssl, server_hostname);
-+ if (server_hostname != NULL) {
-+/* Don't send SNI for IP addresses. We cannot simply use inet_aton() and
-+ * inet_pton() here. inet_aton() may be linked weakly and inet_pton() isn't
-+ * available on all platforms. Use OpenSSL's IP address parser. It's
-+ * available since 1.0.2 and LibreSSL since at least 2.3.0. */
-+ int send_sni = 1;
-+#if OPENSSL_VERSION_NUMBER >= 0x10200000L
-+ ASN1_OCTET_STRING *ip = a2i_IPADDRESS(server_hostname);
-+ if (ip == NULL) {
-+ send_sni = 1;
-+ ERR_clear_error();
-+ } else {
-+ send_sni = 0;
-+ ASN1_OCTET_STRING_free(ip);
-+ }
-+#elif defined(HAVE_INET_PTON)
-+#ifdef ENABLE_IPV6
-+ char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
-+#else
-+ char packed[sizeof(struct in_addr)];
-+#endif /* ENABLE_IPV6 */
-+ if (inet_pton(AF_INET, server_hostname, packed)) {
-+ send_sni = 0;
-+#ifdef ENABLE_IPV6
-+ } else if(inet_pton(AF_INET6, server_hostname, packed)) {
-+ send_sni = 0;
-+#endif /* ENABLE_IPV6 */
-+ } else {
-+ send_sni = 1;
-+ }
-+#endif /* HAVE_INET_PTON */
-+ if (send_sni) {
-+ SSL_set_tlsext_host_name(self->ssl, server_hostname);
-+ }
-+ }
- #endif
-
- /* If the socket is in non-blocking mode or timeout mode, set the BIO
diff --git a/python3.spec b/python3.spec
index dd21fdc..5bdde01 100644
--- a/python3.spec
+++ b/python3.spec
@@ -13,8 +13,8 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.4
-Release: 20%{?dist}
+Version: %{pybasever}.5
+Release: 1%{?dist}
License: Python
@@ -334,45 +334,10 @@ Patch251: 00251-change-user-install-location.patch
# Original proposal:
https://bugzilla.redhat.com/show_bug.cgi?id=1404918
Patch262: 00262-pep538_coerce_legacy_c_locale.patch
-# 00264 #
-# test_pass_by_value was added in Python 3.6.1 and on aarch64
-# it is catching an error that was there, but wasn't tested before.
-# Therefore skipping the test on aarch64 until fixed upstream.
-# Reported upstream:
http://bugs.python.org/issue29804
-Patch264: 00264-skip-test-failing-on-aarch64.patch
-
-# 00273 #
-# Fix localeconv() encoding for LC_NUMERIC
-# Fixed upstream:
https://bugs.python.org/issue31900
-Patch273: 00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
-
# 00274 #
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00289 #
-# Fix the compilation of the nis module, as glibc removed the
-# interfaces related to Sun RPC and they are now provided
-# by libtirpc and libnsl2.
-# See:
https://fedoraproject.org/wiki/Changes/SunRPCRemoval
-# and
https://fedoraproject.org/wiki/Changes/NISIPv6
-# Fixed upstream:
https://bugs.python.org/issue32521
-Patch289: 00289-fix-nis-compilation.patch
-
-# 00290 #
-# Not every target system may provide a crypt() function in its stdlibc
-# and may use an external or replacement library, like libxcrypt, for
-# providing such functions.
-# Fixed upstream:
https://bugs.python.org/issue32635
-Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
-
-# 00291 #
-# Build fails with undefined references to dlopen / dlsym otherwise.
-# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
-# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
-# Fixed upstream:
https://bugs.python.org/issue32647
-Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
-
# 00292 #
# Restore the public PyExc_RecursionErrorInst symbol that was removed
# from the 3.6.4 release upstream.
@@ -387,12 +352,6 @@ Patch292: 00292-restore-PyExc_RecursionErrorInst-symbol.patch
# See also:
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
Patch294: 00294-define-TLS-cipher-suite-on-build-time.patch
-# 00298 #
-# The SSL module no longer sends IP addresses in SNI TLS extension on
-# platforms with OpenSSL 1.0.2+ or inet_pton.
-# Fixed upstream:
https://bugs.python.org/issue32185
-Patch298: 00298-do-not-send-IP-in-SNI-TLS-extension.patch
-
# 00301 #
# Tools/scripts/pathfix.py: Add -n option for no backup~
# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1546990
@@ -659,7 +618,7 @@ rm -r Modules/expat
rm -r Modules/zlib
%if %{with rewheel}
-%global pip_version 9.0.1
+%global pip_version 9.0.3
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
%endif
@@ -686,19 +645,9 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch205 -p1
%patch251 -p1
%patch262 -p1
-
-%ifarch aarch64
-%patch264 -p1
-%endif
-
-%patch273 -p1
%patch274 -p1
-%patch289 -p1
-%patch290 -p1
-%patch291 -p1
%patch292 -p1
%patch294 -p1
-%patch298 -p1
%patch301 -p1
@@ -1521,6 +1470,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Mar 29 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.5-1
+- Update to 3.6.5
+
* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-20
- Fix broken macro invocation and broken building of C Python extensions
Resolves: rhbz#1560103
diff --git a/sources b/sources
index 6b5ff13..9d32274 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.4.tar.xz) =
09ba2103ac517ac4d262f00380c9aac836a53401ce252540c17fd821a3b92e1ddf32528d00772221eb3126b12cb95b62c3ac3e852f4951e6f2eb406c88c848a2
+SHA512 (Python-3.6.5.tar.xz) =
6b26fcd296b9bd8e67861eff10d14db7507711ddba947288d16d6def53135c39326b7f969c04bb2b2993f924d9e7ad3f5c5282a3915760bc0885cf0a8ea5eb51
commit 3422f8b4a46c8d4cfd09bf88be2e89562b188fe4
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 29 15:01:56 2018 +0200
Remove macros.pybytecompile3.7
It will live in python-rpm-macros, see:
https://src.fedoraproject.org/rpms/python-rpm-macros/pull-request/4
diff --git a/macros.pybytecompile3.7 b/macros.pybytecompile3.7
deleted file mode 100644
index f319979..0000000
--- a/macros.pybytecompile3.7
+++ /dev/null
@@ -1,25 +0,0 @@
-# Note that the path could itself be a python file, or a directory
-
-# Python's compile_all module only works on directories, and requires a max
-# recursion depth
-
-# Note that the py_byte_compile macro should work for python2 as well
-# Which unfortunately makes the definition more complicated than it should be
-# The condition should be reversed once /usr/bin/python is python3!
-
-%py_byte_compile()\
-py2_byte_compile () {\
- python_binary="%1"\
- bytecode_compilation_path="%2"\
- find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
- find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
-}\
-\
-py3_byte_compile () {\
- python_binary="%1"\
- bytecode_compilation_path="%2"\
- find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
-}\
-\
-[[ "%1" == *python3* ]] || py2_byte_compile "%1" "%2"
&& py3_byte_compile "%1" "%2" \
-%{nil}
diff --git a/python37.spec b/python37.spec
index 5ebfa83..b314587 100644
--- a/python37.spec
+++ b/python37.spec
@@ -242,11 +242,6 @@ BuildRequires: python3-pip
Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
-# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
-# to enable specfiles to selectively byte-compile individual files and paths
-# with different Python runtimes as necessary:
-Source3: macros.pybytecompile%{pybasever}
-
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
# Written by bkabrda
@@ -967,7 +962,6 @@ find %{buildroot} -perm 555 -exec chmod 755 {} \;
# Install macros for rpm:
%if %{without flatpackage}
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
-install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
%endif
@@ -1366,7 +1360,6 @@ CheckPython optimized
%{_bindir}/python3-config
%{_libdir}/pkgconfig/python3.pc
%{_rpmconfigdir}/macros.d/macros.systempython
-%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
%{_bindir}/pathfix.py
%endif
commit a50d5ce8642d2e8895fa049fb8e04b0742ed21ba
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 29 15:00:59 2018 +0200
Update to 3.7.0b3
diff --git a/python37.spec b/python37.spec
index 9427085..5ebfa83 100644
--- a/python37.spec
+++ b/python37.spec
@@ -12,13 +12,13 @@ Summary: Version %{pybasever} of the Python interpreter
URL:
https://www.python.org/
-# Second alpha
-%global prerel b2
+# Third beta
+%global prerel b3
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.13.%{?prerel}%{?dist}
+Release: 0.14.%{?prerel}%{?dist}
License: Python
@@ -1573,6 +1573,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Mar 29 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.14.b3
+- Update to 3.7.0b3
+
* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.13.b2
- Fix broken macro invocation and broken building of C Python extensions
Resolves: rhbz#1560103
diff --git a/sources b/sources
index 8d99783..3a10973 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0b2.tar.xz) =
15941cb2c14ad9fbabc6ff7085796ef7d44832bdffd4db662c8578732018154b0385408b28147dbaff1ad8f3158c1cc48d579898436842fc7101580e89503f7d
+SHA512 (Python-3.7.0b3.tar.xz) =
4fd605cb1621e4bed73c2aadf0443fb70b4d013e9d93a26e81e75dc56906062660b63ac1d97224da217d5e05a3372802a291924a26cc067959d8e1e753a8356f
commit 6f038c8edef24fd89d21ae6b9db53c096fef4864
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Mar 27 13:24:32 2018 +0200
Update setuptools and pip bundled versions
diff --git a/python37.spec b/python37.spec
index c410903..9427085 100644
--- a/python37.spec
+++ b/python37.spec
@@ -618,8 +618,8 @@ Requires: redhat-rpm-config
%global __provides_exclude ^python\\(abi\\) = 3\\..$
# We keep those inside on purpose
-Provides: bundled(python3-pip) = 9.0.1
-Provides: bundled(python3-setuptools) = 28.8.0
+Provides: bundled(python3-pip) = 9.0.3
+Provides: bundled(python3-setuptools) = 39.0.1
# The descripton for the flat flatpackage package
%description
commit cb0fe74d039bd711652463cebc60a9ad332db955
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sun Mar 25 20:55:08 2018 +0200
Fix shebangs of the GDB hooks
Also, use -p (preserve timestamp) and -n (don't create backup files)
with pathfix.py.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1560295
diff --git a/python37.spec b/python37.spec
index 25e3fda..c410903 100644
--- a/python37.spec
+++ b/python37.spec
@@ -924,8 +924,9 @@ cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
# so handle files named using other naming scheme separately.
LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
Tools/scripts/pathfix.py \
- -i "%{_bindir}/python%{pybasever}" \
- %{buildroot}
+ -i "%{_bindir}/python%{pybasever}" -pn \
+ %{buildroot} \
+ %{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
# Remove tests for python3-tools which was removed in
#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
commit 6c5992ec4eefd7d510434df06fb18f56a7bdf49a
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sun Mar 25 20:49:54 2018 +0200
Fix shebangs of the GDB hooks
Also, use -p (preserve timestamp) and -n (don't create backup files)
with pathfix.py.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1560295
diff --git a/python3.spec b/python3.spec
index 8c9dacd..dd21fdc 100644
--- a/python3.spec
+++ b/python3.spec
@@ -953,8 +953,9 @@ cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
# so handle files named using other naming scheme separately.
LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
Tools/scripts/pathfix.py \
- -i "%{_bindir}/python%{pybasever}" \
- %{buildroot}
+ -i "%{_bindir}/python%{pybasever}" -pn \
+ %{buildroot} \
+ %{?with_gdb_hooks:%{buildroot}$DirHoldingGdbPy/*.py}
# Remove tests for python3-tools which was removed in
#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
commit 34f9f5ef13fdd1f6c4c777cec6f33b819753cc62
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat Mar 24 08:06:56 2018 +0100
rpmlintrc: Filter macro-in-comment %{_pyconfig(32|64)_h}
diff --git a/python37.rpmlintrc b/python37.rpmlintrc
index 58bf02b..f91b865 100644
--- a/python37.rpmlintrc
+++ b/python37.rpmlintrc
@@ -66,6 +66,8 @@ addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-pac
addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
+# we need this macro to evaluate, even if the line starts with #
+addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
# SPELLING ERRORS
addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
commit 3777cb5efa3e34405b4dfa4c49c49a3241104ae9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat Mar 24 08:02:08 2018 +0100
Fix broken macro invocation and broken building of C Python extensions
Revert "Use %% for actual % in spec"
This reverts commit acda1a219a580e20d4e587d7b1338af926ac7ece.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1560103
diff --git a/python37.spec b/python37.spec
index e6f1ea3..25e3fda 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.12.%{?prerel}%{?dist}
+Release: 0.13.%{?prerel}%{?dist}
License: Python
@@ -853,9 +853,9 @@ InstallPython() {
#include <bits/wordsize.h>
#if __WORDSIZE == 32
-#include "%%{_pyconfig32_h}"
+#include "%{_pyconfig32_h}"
#elif __WORDSIZE == 64
-#include "%%{_pyconfig64_h}"
+#include "%{_pyconfig64_h}"
#else
#error "Unknown word size"
#endif
@@ -1572,6 +1572,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.13.b2
+- Fix broken macro invocation and broken building of C Python extensions
+Resolves: rhbz#1560103
+
* Wed Feb 28 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.12.b2
- Update to 3.7.0b2
commit 37c970a4db6dd7f5c6885e40bc506efd3288a573
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat Mar 24 08:06:56 2018 +0100
rpmlintrc: Filter macro-in-comment %{_pyconfig(32|64)_h}
diff --git a/python3.rpmlintrc b/python3.rpmlintrc
index 2c6e93d..03607c6 100644
--- a/python3.rpmlintrc
+++ b/python3.rpmlintrc
@@ -60,6 +60,8 @@ addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-pac
addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
+# we need this macro to evaluate, even if the line starts with #
+addFilter(r'macro-in-comment %\{_pyconfig(32|64)_h\}')
# SPELLING ERRORS
addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
commit e8fa184158dfa253cf88fbac86a18cfb82046ca9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat Mar 24 08:02:08 2018 +0100
Fix broken macro invocation and broken building of C Python extensions
Revert "Use %% for actual % in spec"
This reverts commit 90512a5a1b6bb4e54449a0e3611482e6a55a8ab3.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1560103
diff --git a/python3.spec b/python3.spec
index e96ccf7..8c9dacd 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 19%{?dist}
+Release: 20%{?dist}
License: Python
@@ -884,9 +884,9 @@ InstallPython() {
#include <bits/wordsize.h>
#if __WORDSIZE == 32
-#include "%%{_pyconfig32_h}"
+#include "%{_pyconfig32_h}"
#elif __WORDSIZE == 64
-#include "%%{_pyconfig64_h}"
+#include "%{_pyconfig64_h}"
#else
#error "Unknown word size"
#endif
@@ -1520,6 +1520,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Sat Mar 24 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-20
+- Fix broken macro invocation and broken building of C Python extensions
+Resolves: rhbz#1560103
+
* Fri Mar 16 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-19
- Add -n option for pathfix.py
Resolves: rhbz#1546990
commit 58c6b177d4bfe558542c765d6b57d641646b4fe0
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 1 15:21:59 2018 +0100
Add rpmlintrc file
Filter all the errors and warnings. This allows us to actually read the rpmlint
output to get new information. From now on, we can rely on this information
when pushing updates.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1548683
Backport of
https://src.fedoraproject.org/rpms/python37/pull-request/10
diff --git a/python3.rpmlintrc b/python3.rpmlintrc
new file mode 100644
index 0000000..2c6e93d
--- /dev/null
+++ b/python3.rpmlintrc
@@ -0,0 +1,65 @@
+# KNOWN BUGS:
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
+addFilter(r'crypto-policy-non-compliance-openssl')
+
+
+# TESTS:
+addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3.\d/test')
+
+
+# OTHER DELIBERATES:
+# chroot function
+addFilter(r'missing-call-to-chdir-with-chroot')
+
+# intentionally unversioned and selfobsoleted
+addFilter(r'unversioned-explicit-obsoletes python')
+addFilter(r'self-obsoletion python3\d obsoletes python3\d')
+
+# intentionally hardcoded
+addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
+
+# we have non binary stuff, python files
+addFilter(r'only-non-binary-in-usr-lib')
+
+# some devel files that are deliberately needed
+addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
+addFilter(r'devel-file-in-non-devel-package
/usr/lib64/python3\.\d/distutils/tests/xxmodule\.c')
+
+
+# SORRY, NOT SORRY:
+# manual pages
+addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix\.py)')
+addFilter(r'no-manual-page-for-binary python3.*-config$')
+addFilter(r'no-manual-page-for-binary python3.\dd?m$')
+
+# missing documentation from subpackages
+addFilter(r'^python3\d?-(debug|tkinter|test|idle)\.[^:]+: (E|W):
no-documentation')
+
+# platform python is obsoleted, but not provided
+addFilter(r'obsolete-not-provided platform-python')
+
+
+# RPMLINT IMPERFECTIONS:
+# ifarch applied patches are OK
+#
https://fedoraproject.org/wiki/Packaging:Guidelines#Architecture_Support
+addFilter(r'%ifarch-applied-patch')
+
+# debugsource
+addFilter(r'^python3\d?-debugsource\.[^:]+: (E|W): no-documentation')
+
+# debuginfo
+addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(build-id\)')
+
+# this is OK for F28+
+addFilter(r'library-without-ldconfig-post')
+
+# debug package contains devel and non-devel files
+addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-package')
+
+# this goes to other subpackage, hence not actually dangling, the read error is bogus
+addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
+addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
+
+
+# SPELLING ERRORS
+addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
commit 90512a5a1b6bb4e54449a0e3611482e6a55a8ab3
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 1 15:19:51 2018 +0100
Use %% for actual % in spec
rpmlint reports this as macro in comment, however it was left here, because it
is not macro and not comment. On the other hand, % shall be escaped using %%.
All this needs to blow is somebody defining a macro called _pyconfig64_h.
diff --git a/python3.spec b/python3.spec
index 41594dd..e96ccf7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -884,9 +884,9 @@ InstallPython() {
#include <bits/wordsize.h>
#if __WORDSIZE == 32
-#include "%{_pyconfig32_h}"
+#include "%%{_pyconfig32_h}"
#elif __WORDSIZE == 64
-#include "%{_pyconfig64_h}"
+#include "%%{_pyconfig64_h}"
#else
#error "Unknown word size"
#endif
commit 545e6802537971e9848fdcda7e15d3c5bfb08b9e
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Mar 14 22:05:06 2018 +0100
Add -n option for pathfix.py (#1546990)
diff --git a/00301-pathfix-add-n-option-for-no-backup.patch
b/00301-pathfix-add-n-option-for-no-backup.patch
new file mode 100644
index 0000000..350fe97
--- /dev/null
+++ b/00301-pathfix-add-n-option-for-no-backup.patch
@@ -0,0 +1,104 @@
+From 5affd5c29eb1493cb31ef3cfdde15538ac134689 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro(a)hroncok.cz>
+Date: Tue, 13 Mar 2018 10:56:43 +0100
+Subject: [PATCH] bpo-32885: Tools/scripts/pathfix.py: Add -n option for no
+ backup~ (#5772)
+
+Creating backup files with ~ suffix can be undesirable in some environment,
+such as when building RPM packages. Instead of requiring the user to remove
+those files manually, option -n was added, that simply disables this feature.
+
+-n was selected because 2to3 has the same option with this behavior.
+---
+ Misc/ACKS | 1 +
+ .../2018-02-20-12-16-47.bpo-32885.dL5x7C.rst | 2 ++
+ Tools/scripts/pathfix.py | 28 +++++++++++++++-------
+ 3 files changed, 23 insertions(+), 8 deletions(-)
+ create mode 100644
Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
+
+diff --git a/Misc/ACKS b/Misc/ACKS
+index d8179c8b03ab..d752d8a35434 100644
+--- a/Misc/ACKS
++++ b/Misc/ACKS
+@@ -687,6 +687,7 @@ Ken Howard
+ Brad Howes
+ Mike Hoy
+ Ben Hoyt
++Miro Hronok
+ Chiu-Hsiang Hsu
+ Chih-Hao Huang
+ Christian Hudon
+diff --git a/Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
b/Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
+new file mode 100644
+index 000000000000..e003e1d84fd0
+--- /dev/null
++++ b/Misc/NEWS.d/next/Tools-Demos/2018-02-20-12-16-47.bpo-32885.dL5x7C.rst
+@@ -0,0 +1,2 @@
++Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disbale automatic
++backup creation (files with ``~`` suffix).
+diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py
+index 562bbc737812..c5bf984306a3 100755
+--- a/Tools/scripts/pathfix.py
++++ b/Tools/scripts/pathfix.py
+@@ -7,8 +7,9 @@
+ # Directories are searched recursively for files whose name looks
+ # like a python module.
+ # Symbolic links are always ignored (except as explicit directory
+-# arguments). Of course, the original file is kept as a back-up
+-# (with a "~" attached to its name).
++# arguments).
++# The original file is kept as a back-up (with a "~" attached to its name),
++# -n flag can be used to disable this.
+ #
+ # Undoubtedly you can do this using find and sed or perl, but this is
+ # a nice example of Python code that recurses down a directory tree
+@@ -31,14 +32,17 @@
+
+ new_interpreter = None
+ preserve_timestamps = False
++create_backup = True
++
+
+ def main():
+ global new_interpreter
+ global preserve_timestamps
+- usage = ('usage: %s -i /interpreter -p file-or-directory ...\n' %
++ global create_backup
++ usage = ('usage: %s -i /interpreter -p -n file-or-directory ...\n' %
+ sys.argv[0])
+ try:
+- opts, args = getopt.getopt(sys.argv[1:], 'i:p')
++ opts, args = getopt.getopt(sys.argv[1:], 'i:pn')
+ except getopt.error as msg:
+ err(str(msg) + '\n')
+ err(usage)
+@@ -48,6 +52,8 @@ def main():
+ new_interpreter = a.encode()
+ if o == '-p':
+ preserve_timestamps = True
++ if o == '-n':
++ create_backup = False
+ if not new_interpreter or not new_interpreter.startswith(b'/') or \
+ not args:
+ err('-i option or file-or-directory missing\n')
+@@ -134,10 +140,16 @@ def fix(filename):
+ except OSError as msg:
+ err('%s: warning: chmod failed (%r)\n' % (tempname, msg))
+ # Then make a backup of the original file as filename~
+- try:
+- os.rename(filename, filename + '~')
+- except OSError as msg:
+- err('%s: warning: backup failed (%r)\n' % (filename, msg))
++ if create_backup:
++ try:
++ os.rename(filename, filename + '~')
++ except OSError as msg:
++ err('%s: warning: backup failed (%r)\n' % (filename, msg))
++ else:
++ try:
++ os.remove(filename)
++ except OSError as msg:
++ err('%s: warning: removing failed (%r)\n' % (filename, msg))
+ # Now move the temp file to the original file
+ try:
+ os.rename(tempname, filename)
diff --git a/python3.spec b/python3.spec
index a81494f..41594dd 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 18%{?dist}
+Release: 19%{?dist}
License: Python
@@ -393,6 +393,12 @@ Patch294: 00294-define-TLS-cipher-suite-on-build-time.patch
# Fixed upstream:
https://bugs.python.org/issue32185
Patch298: 00298-do-not-send-IP-in-SNI-TLS-extension.patch
+# 00301 #
+# Tools/scripts/pathfix.py: Add -n option for no backup~
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1546990
+# Fixed upstream:
https://bugs.python.org/issue32885
+Patch301: 00301-pathfix-add-n-option-for-no-backup.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -693,6 +699,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch292 -p1
%patch294 -p1
%patch298 -p1
+%patch301 -p1
# Remove files that should be generated by the build
@@ -1513,6 +1520,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Mar 16 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-19
+- Add -n option for pathfix.py
+Resolves: rhbz#1546990
+
* Thu Mar 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-18
- Fix the py_byte_compile macro to work on Python 2
- Remove the pybytecompile macro file from the flat package
commit e5f4159f8f90b5b2836af3af921a9d80c7df1b86
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jan 18 16:53:05 2018 +0100
Fix the py_byte_compile macro to work on Python 2
See
https://bugzilla.redhat.com/show_bug.cgi?id=1484993
Inspired by Terje Rsten's workaround from that bugzilla
diff --git a/macros.pybytecompile3.6 b/macros.pybytecompile3.6
index 3968c6e..f319979 100644
--- a/macros.pybytecompile3.6
+++ b/macros.pybytecompile3.6
@@ -3,8 +3,23 @@
# Python's compile_all module only works on directories, and requires a max
# recursion depth
+# Note that the py_byte_compile macro should work for python2 as well
+# Which unfortunately makes the definition more complicated than it should be
+# The condition should be reversed once /usr/bin/python is python3!
+
%py_byte_compile()\
-python_binary="%1"\
-bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
+py2_byte_compile () {\
+ python_binary="%1"\
+ bytecode_compilation_path="%2"\
+ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+}\
+\
+py3_byte_compile () {\
+ python_binary="%1"\
+ bytecode_compilation_path="%2"\
+ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
+}\
+\
+[[ "%1" == *python3* ]] || py2_byte_compile "%1" "%2"
&& py3_byte_compile "%1" "%2" \
%{nil}
diff --git a/python3.spec b/python3.spec
index b649cd9..a81494f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 17%{?dist}
+Release: 18%{?dist}
License: Python
@@ -1513,6 +1513,11 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Mar 15 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-18
+- Fix the py_byte_compile macro to work on Python 2
+- Remove the pybytecompile macro file from the flat package
+Resolves: rhbz#1484993
+
* Tue Mar 13 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-17
- Do not send IP addresses in SNI TLS extension
commit 94ba907c0b9e5db6edb54844da38c8f4cb9985f2
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 1 16:00:00 2018 +0100
rpmlintrc: Add stuff from the nonflat package
diff --git a/python37.rpmlintrc b/python37.rpmlintrc
index 42a5f41..58bf02b 100644
--- a/python37.rpmlintrc
+++ b/python37.rpmlintrc
@@ -11,8 +11,9 @@ addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3
# chroot function
addFilter(r'missing-call-to-chdir-with-chroot')
-# intentionally unversioned
+# intentionally unversioned and selfobsoleted
addFilter(r'unversioned-explicit-obsoletes python')
+addFilter(r'self-obsoletion python3\d obsoletes python3\d')
# intentionally hardcoded
addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
@@ -20,12 +21,25 @@ addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{p
# intentional for our pythonXY package
addFilter(r'python3\d\.[^:]+: (E|W): devel-file-in-non-devel-package')
+# we have non binary stuff, python files
+addFilter(r'only-non-binary-in-usr-lib')
+
+# some devel files that are deliberately needed
+addFilter(r'devel-file-in-non-devel-package
/usr/include/python3\.\dm/pyconfig-(32|64)\.h')
+addFilter(r'devel-file-in-non-devel-package
/usr/lib64/python3\.\d/distutils/tests/xxmodule\.c')
+
# SORRY, NOT SORRY:
# manual pages
-addFilter(r'no-manual-page-for-binary (idle|pydoc|pyvenv-)3\.\d$')
+addFilter(r'no-manual-page-for-binary
(idle|pydoc|pyvenv|2to3|python3-debug|pathfix\.py)')
addFilter(r'no-manual-page-for-binary python3.*-config$')
-addFilter(r'no-manual-page-for-binary python3.\dm$')
+addFilter(r'no-manual-page-for-binary python3.\dd?m$')
+
+# missing documentation from subpackages
+addFilter(r'^python3\d?-(debug|tkinter|test|idle)\.[^:]+: (E|W):
no-documentation')
+
+# platform python is obsoleted, but not provided
+addFilter(r'obsolete-not-provided platform-python')
# RPMLINT IMPERFECTIONS
@@ -44,3 +58,14 @@ addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(bui
# this is OK for F28+
addFilter(r'library-without-ldconfig-post')
+
+# debug package contains devel and non-devel files
+addFilter(r'python3\d?-debug.[^:]+: (E|W):
(non-)?devel-file-in-(non-)?devel-package')
+
+# this goes to other subpackage, hence not actually dangling, the read error is bogus
+addFilter(r'dangling-relative-symlink /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc
python-3\.\d\.pc')
+addFilter(r'read-error /usr/lib(64)?/pkgconfig/python-3\.\ddm\.pc \[Errno 2\]')
+
+
+# SPELLING ERRORS
+addFilter(r'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest)
')
commit 42c61b3ece6f15eb2733fce5cb09be0a7bf6d48e
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 1 15:21:59 2018 +0100
Add rpmlintrc file
Filter all the errors and warnings. This allows us to actually read the rpmlint
output to get new information. From now on, we can rely on this information
when pushing updates.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1548683
diff --git a/python37.rpmlintrc b/python37.rpmlintrc
new file mode 100644
index 0000000..42a5f41
--- /dev/null
+++ b/python37.rpmlintrc
@@ -0,0 +1,46 @@
+# KNOWN BUGS:
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
+addFilter(r'crypto-policy-non-compliance-openssl')
+
+
+# TESTS:
+addFilter(r'(zero-length|pem-certificate|uncompressed-zip)
/usr/lib(64)?/python3.\d/test')
+
+
+# OTHER DELIBERATES:
+# chroot function
+addFilter(r'missing-call-to-chdir-with-chroot')
+
+# intentionally unversioned
+addFilter(r'unversioned-explicit-obsoletes python')
+
+# intentionally hardcoded
+addFilter(r'hardcoded-library-path in
%{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})')
+
+# intentional for our pythonXY package
+addFilter(r'python3\d\.[^:]+: (E|W): devel-file-in-non-devel-package')
+
+
+# SORRY, NOT SORRY:
+# manual pages
+addFilter(r'no-manual-page-for-binary (idle|pydoc|pyvenv-)3\.\d$')
+addFilter(r'no-manual-page-for-binary python3.*-config$')
+addFilter(r'no-manual-page-for-binary python3.\dm$')
+
+
+# RPMLINT IMPERFECTIONS
+#
https://github.com/rpm-software-management/rpmlint/issues/123
+addFilter(r'python-bytecode-wrong-magic-value .* expected 33\d\d \(3\.7\), found
3393')
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1550562
+#
https://github.com/rpm-software-management/rpmlint/issues/128
+addFilter(r'python-bytecode-inconsistent-mtime .* 1970')
+
+# debugsource
+addFilter(r'^python3\d?-debugsource\.[^:]+: (E|W): no-documentation')
+
+# debuginfo
+addFilter(r'^python3\d?-debuginfo\.[^:]+: (E|W): useless-provides
debuginfo\(build-id\)')
+
+# this is OK for F28+
+addFilter(r'library-without-ldconfig-post')
commit c9bb114a1dc3fc2216af482d1cdbafe58db45afb
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Mar 13 16:58:18 2018 +0100
Do not send IP addresses in SNI TLS extension
diff --git a/00298-do-not-send-IP-in-SNI-TLS-extension.patch
b/00298-do-not-send-IP-in-SNI-TLS-extension.patch
new file mode 100644
index 0000000..19b6b31
--- /dev/null
+++ b/00298-do-not-send-IP-in-SNI-TLS-extension.patch
@@ -0,0 +1,60 @@
+diff --git a/Modules/_ssl.c b/Modules/_ssl.c
+index df8c6a7d96d8..e8cffef14de0 100644
+--- a/Modules/_ssl.c
++++ b/Modules/_ssl.c
+@@ -55,6 +55,11 @@ static PySocketModule_APIObject PySocketModule;
+ #include <sys/poll.h>
+ #endif
+
++#ifndef MS_WINDOWS
++/* inet_pton */
++#include <arpa/inet.h>
++#endif
++
+ /* Don't warn about deprecated functions */
+ #ifdef __GNUC__
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+@@ -667,8 +672,41 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
+ SSL_set_mode(self->ssl, mode);
+
+ #if HAVE_SNI
+- if (server_hostname != NULL)
+- SSL_set_tlsext_host_name(self->ssl, server_hostname);
++ if (server_hostname != NULL) {
++/* Don't send SNI for IP addresses. We cannot simply use inet_aton() and
++ * inet_pton() here. inet_aton() may be linked weakly and inet_pton() isn't
++ * available on all platforms. Use OpenSSL's IP address parser. It's
++ * available since 1.0.2 and LibreSSL since at least 2.3.0. */
++ int send_sni = 1;
++#if OPENSSL_VERSION_NUMBER >= 0x10200000L
++ ASN1_OCTET_STRING *ip = a2i_IPADDRESS(server_hostname);
++ if (ip == NULL) {
++ send_sni = 1;
++ ERR_clear_error();
++ } else {
++ send_sni = 0;
++ ASN1_OCTET_STRING_free(ip);
++ }
++#elif defined(HAVE_INET_PTON)
++#ifdef ENABLE_IPV6
++ char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
++#else
++ char packed[sizeof(struct in_addr)];
++#endif /* ENABLE_IPV6 */
++ if (inet_pton(AF_INET, server_hostname, packed)) {
++ send_sni = 0;
++#ifdef ENABLE_IPV6
++ } else if(inet_pton(AF_INET6, server_hostname, packed)) {
++ send_sni = 0;
++#endif /* ENABLE_IPV6 */
++ } else {
++ send_sni = 1;
++ }
++#endif /* HAVE_INET_PTON */
++ if (send_sni) {
++ SSL_set_tlsext_host_name(self->ssl, server_hostname);
++ }
++ }
+ #endif
+
+ /* If the socket is in non-blocking mode or timeout mode, set the BIO
diff --git a/python3.spec b/python3.spec
index 3a6cf71..b649cd9 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 16%{?dist}
+Release: 17%{?dist}
License: Python
@@ -387,6 +387,12 @@ Patch292: 00292-restore-PyExc_RecursionErrorInst-symbol.patch
# See also:
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
Patch294: 00294-define-TLS-cipher-suite-on-build-time.patch
+# 00298 #
+# The SSL module no longer sends IP addresses in SNI TLS extension on
+# platforms with OpenSSL 1.0.2+ or inet_pton.
+# Fixed upstream:
https://bugs.python.org/issue32185
+Patch298: 00298-do-not-send-IP-in-SNI-TLS-extension.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -686,6 +692,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch291 -p1
%patch292 -p1
%patch294 -p1
+%patch298 -p1
# Remove files that should be generated by the build
@@ -1506,6 +1513,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Tue Mar 13 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-17
+- Do not send IP addresses in SNI TLS extension
+
* Sat Feb 24 2018 Florian Weimer <fweimer(a)redhat.com> - 3.6.4-16
- Rebuild with new LDFLAGS from redhat-rpm-config
commit acda1a219a580e20d4e587d7b1338af926ac7ece
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Mar 1 15:19:51 2018 +0100
Use %% for actual % in spec
rpmlint reports this as macro in comment, however it was left here, because it
is not macro and not comment. On the other hand, % shall be escaped using %%.
All this needs to blow is somebody defining a macro called _pyconfig64_h.
diff --git a/python37.spec b/python37.spec
index b7070c2..e6f1ea3 100644
--- a/python37.spec
+++ b/python37.spec
@@ -853,9 +853,9 @@ InstallPython() {
#include <bits/wordsize.h>
#if __WORDSIZE == 32
-#include "%{_pyconfig32_h}"
+#include "%%{_pyconfig32_h}"
#elif __WORDSIZE == 64
-#include "%{_pyconfig64_h}"
+#include "%%{_pyconfig64_h}"
#else
#error "Unknown word size"
#endif
commit ef18b4528ad79fa920867ec85532baee647410ef
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 28 10:30:29 2018 +0100
Update to 3.7.0b2
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 50cc13a..5bfff87 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,9 +1,9 @@
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index a5a9d5e..51e8132 100644
+index 0eddd13..7ed4f3c 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -530,7 +530,7 @@ clinic: $(BUILDPYTHON) $(srcdir)/Modules/_blake2/blake2s_impl.c
- $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/clinic/clinic.py --make --srcdir
$(srcdir)
+@@ -565,7 +565,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
+ $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
@@ -11,7 +11,7 @@ index a5a9d5e..51e8132 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -574,12 +574,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -609,12 +609,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -24,7 +24,7 @@ index a5a9d5e..51e8132 100644
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -667,7 +661,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
+@@ -702,7 +696,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
echo "-----------------------------------------------"; \
fi
@@ -33,7 +33,7 @@ index a5a9d5e..51e8132 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1408,17 +1402,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
+@@ -1460,17 +1454,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
index 0412e0d..c37e69c 100644
--- a/00170-gc-assertions.patch
+++ b/00170-gc-assertions.patch
@@ -1,8 +1,8 @@
diff --git a/Include/object.h b/Include/object.h
-index cb57359..f928f97 100644
+index c772dea..5729797 100644
--- a/Include/object.h
+++ b/Include/object.h
-@@ -1069,6 +1069,49 @@ PyAPI_FUNC(void)
+@@ -1098,6 +1098,49 @@ PyAPI_FUNC(void)
_PyObject_DebugTypeStats(FILE *out);
#endif /* ifndef Py_LIMITED_API */
@@ -53,15 +53,15 @@ index cb57359..f928f97 100644
}
#endif
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
-index 904fc7d..5676007 100644
+index 904fc7d..288e242 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1,10 +1,11 @@
import unittest
from test.support import (verbose, refcount_test, run_unittest,
strip_python_stderr, cpython_only, start_threads,
-- temp_dir, requires_type_collecting,reap_threads)
-+ temp_dir,reap_threads, import_module,
requires_type_collecting)
+- temp_dir, requires_type_collecting)
++ temp_dir, import_module, requires_type_collecting)
from test.support.script_helper import assert_python_ok, make_script
import sys
@@ -130,10 +130,10 @@ index 904fc7d..5676007 100644
def setUp(self):
gc.enable()
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
-index 6e26c7a..8410206 100644
+index 8ba1093..e795308 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
-@@ -238,7 +238,8 @@ update_refs(PyGC_Head *containers)
+@@ -239,7 +239,8 @@ update_refs(PyGC_Head *containers)
{
PyGC_Head *gc = containers->gc.gc_next;
for (; gc != containers; gc = gc->gc.gc_next) {
@@ -143,7 +143,7 @@ index 6e26c7a..8410206 100644
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
/* Python's cyclic gc should never see an incoming refcount
* of 0: if something decref'ed to 0, it should have been
-@@ -258,7 +259,8 @@ update_refs(PyGC_Head *containers)
+@@ -259,7 +260,8 @@ update_refs(PyGC_Head *containers)
* so serious that maybe this should be a release-build
* check instead of an assert?
*/
@@ -153,7 +153,7 @@ index 6e26c7a..8410206 100644
}
}
-@@ -273,7 +275,9 @@ visit_decref(PyObject *op, void *data)
+@@ -274,7 +276,9 @@ visit_decref(PyObject *op, void *data)
* generation being collected, which can be recognized
* because only they have positive gc_refs.
*/
@@ -164,7 +164,7 @@ index 6e26c7a..8410206 100644
if (_PyGCHead_REFS(gc) > 0)
_PyGCHead_DECREF(gc);
}
-@@ -333,9 +337,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
+@@ -334,9 +338,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
* If gc_refs == GC_UNTRACKED, it must be ignored.
*/
else {
@@ -178,7 +178,7 @@ index 6e26c7a..8410206 100644
}
}
return 0;
-@@ -377,7 +382,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
+@@ -378,7 +383,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
*/
PyObject *op = FROM_GC(gc);
traverseproc traverse = Py_TYPE(op)->tp_traverse;
@@ -187,7 +187,7 @@ index 6e26c7a..8410206 100644
_PyGCHead_SET_REFS(gc, GC_REACHABLE);
(void) traverse(op,
(visitproc)visit_reachable,
-@@ -440,7 +445,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head
*finalizers)
+@@ -441,7 +446,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head
*finalizers)
for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
PyObject *op = FROM_GC(gc);
@@ -196,7 +196,7 @@ index 6e26c7a..8410206 100644
next = gc->gc.gc_next;
if (has_legacy_finalizer(op)) {
-@@ -516,7 +521,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -517,7 +522,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
PyWeakReference **wrlist;
op = FROM_GC(gc);
@@ -205,7 +205,7 @@ index 6e26c7a..8410206 100644
next = gc->gc.gc_next;
if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
-@@ -537,9 +542,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -538,9 +543,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
* the callback pointer intact. Obscure: it also
* changes *wrlist.
*/
@@ -217,7 +217,7 @@ index 6e26c7a..8410206 100644
if (wr->wr_callback == NULL)
continue; /* no callback */
-@@ -573,7 +578,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -574,7 +579,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
*/
if (IS_TENTATIVELY_UNREACHABLE(wr))
continue;
@@ -226,7 +226,7 @@ index 6e26c7a..8410206 100644
/* Create a new reference so that wr can't go away
* before we can process it again.
-@@ -582,7 +587,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -583,7 +588,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
/* Move wr to wrcb_to_call, for the next pass. */
wrasgc = AS_GC(wr);
@@ -236,7 +236,7 @@ index 6e26c7a..8410206 100644
next isn't, so they can't
be the same */
gc_list_move(wrasgc, &wrcb_to_call);
-@@ -598,11 +604,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -599,11 +605,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
gc = wrcb_to_call.gc.gc_next;
op = FROM_GC(gc);
@@ -251,7 +251,7 @@ index 6e26c7a..8410206 100644
/* copy-paste of weakrefobject.c's handle_callback() */
temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
-@@ -719,12 +725,14 @@ check_garbage(PyGC_Head *collectable)
+@@ -720,12 +726,14 @@ check_garbage(PyGC_Head *collectable)
for (gc = collectable->gc.gc_next; gc != collectable;
gc = gc->gc.gc_next) {
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
@@ -269,10 +269,10 @@ index 6e26c7a..8410206 100644
return -1;
}
diff --git a/Objects/object.c b/Objects/object.c
-index ed8a62a..5279b15 100644
+index 220aa90..f6c7161 100644
--- a/Objects/object.c
+++ b/Objects/object.c
-@@ -2116,6 +2116,35 @@ _PyTrash_thread_destroy_chain(void)
+@@ -2177,6 +2177,35 @@ _PyTrash_thread_destroy_chain(void)
--tstate->trash_delete_nesting;
}
diff --git a/python37.spec b/python37.spec
index 85b9e06..b7070c2 100644
--- a/python37.spec
+++ b/python37.spec
@@ -13,12 +13,12 @@ URL:
https://www.python.org/
# Second alpha
-%global prerel b1
+%global prerel b2
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.11.%{?prerel}%{?dist}
+Release: 0.12.%{?prerel}%{?dist}
License: Python
@@ -1572,6 +1572,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Feb 28 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.12.b2
+- Update to 3.7.0b2
+
* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.11.b1
- Fix the py_byte_compile macro to work on Python 2
- Remove the pybytecompile macro file from the flat package
diff --git a/sources b/sources
index 126d4f3..8d99783 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0b1.tar.xz) =
c2c9d76c310987e1998504ae6270350e7afd3834923143fe9f9e7ad130a491f2d1b45f26aff4c3ce5e6133979098da68e865aaabfc1dc6ff4227e6ef969cd50c
+SHA512 (Python-3.7.0b2.tar.xz) =
15941cb2c14ad9fbabc6ff7085796ef7d44832bdffd4db662c8578732018154b0385408b28147dbaff1ad8f3158c1cc48d579898436842fc7101580e89503f7d
commit 6a6a8d45dde27e4c29d133fa3956d14f8593ec61
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jan 18 16:53:05 2018 +0100
Fix the py_byte_compile macro to work on Python 2
See
https://bugzilla.redhat.com/show_bug.cgi?id=1484993
Inspired by Terje Rsten's workaround from that bugzilla
This also removes the pybytecompile macro file from the flat package because it
doesn't belong there as pointed out during the review and later forgotten.
diff --git a/macros.pybytecompile3.7 b/macros.pybytecompile3.7
index 3968c6e..f319979 100644
--- a/macros.pybytecompile3.7
+++ b/macros.pybytecompile3.7
@@ -3,8 +3,23 @@
# Python's compile_all module only works on directories, and requires a max
# recursion depth
+# Note that the py_byte_compile macro should work for python2 as well
+# Which unfortunately makes the definition more complicated than it should be
+# The condition should be reversed once /usr/bin/python is python3!
+
%py_byte_compile()\
-python_binary="%1"\
-bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
+py2_byte_compile () {\
+ python_binary="%1"\
+ bytecode_compilation_path="%2"\
+ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+}\
+\
+py3_byte_compile () {\
+ python_binary="%1"\
+ bytecode_compilation_path="%2"\
+ find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
+}\
+\
+[[ "%1" == *python3* ]] || py2_byte_compile "%1" "%2"
&& py3_byte_compile "%1" "%2" \
%{nil}
diff --git a/python37.spec b/python37.spec
index fda232b..85b9e06 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.10.%{?prerel}%{?dist}
+Release: 0.11.%{?prerel}%{?dist}
License: Python
@@ -964,9 +964,9 @@ rm -rf %{buildroot}%{_bindir}/__pycache__
find %{buildroot} -perm 555 -exec chmod 755 {} \;
# Install macros for rpm:
+%if %{without flatpackage}
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
-%if %{without flatpackage}
install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
%endif
@@ -1365,6 +1365,7 @@ CheckPython optimized
%{_bindir}/python3-config
%{_libdir}/pkgconfig/python3.pc
%{_rpmconfigdir}/macros.d/macros.systempython
+%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
%{_bindir}/pathfix.py
%endif
@@ -1374,7 +1375,6 @@ CheckPython optimized
%{_libdir}/libpython%{LDVERSION_optimized}.so
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
-%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
%if %{without flatpackage}
@@ -1572,6 +1572,11 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.11.b1
+- Fix the py_byte_compile macro to work on Python 2
+- Remove the pybytecompile macro file from the flat package
+Resolves: rhbz#1484993
+
* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.10.b1
- Filter out automatic /usr/bin/python3.X requirement,
recommend the main package from libs instead
commit 6b9e1d1d7ab03dcd54b53bce53c59ffc368ee9c9
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Feb 26 17:28:35 2018 +0100
Replace patch 291 with the upstream fix.
diff --git a/00291-setup-Link-ctypes-against-dl-explicitly.patch
b/00291-setup-Link-ctypes-against-dl-explicitly.patch
index 4bf4801..6539003 100644
--- a/00291-setup-Link-ctypes-against-dl-explicitly.patch
+++ b/00291-setup-Link-ctypes-against-dl-explicitly.patch
@@ -1,25 +1,15 @@
-From aae2ef0bace0e38f4ee5aaa4642aa32450a84216 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
-Date: Tue, 23 Jan 2018 14:43:43 +0100
-Subject: [PATCH] setup: Link ctypes against dl explicitly
-
----
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
diff --git a/setup.py b/setup.py
-index c23628a2a9..9e40bb53e6 100644
+index f4f6e4fdb1f0..8536c350fe3a 100644
--- a/setup.py
+++ b/setup.py
-@@ -1935,7 +1935,7 @@ class PyBuildExt(build_ext):
- self.use_system_libffi = False
- include_dirs = []
+@@ -2005,6 +2005,10 @@ def detect_ctypes(self, inc_dirs, lib_dirs):
+ ext.libraries.append(ffi_lib)
+ self.use_system_libffi = True
+
++ if sysconfig.get_config_var('HAVE_LIBDL'):
++ # for dlopen, see bpo-32647
++ ext.libraries.append('dl')
++
+ def _decimal_ext(self):
extra_compile_args = []
-- extra_link_args = []
-+ extra_link_args = ['-ldl']
- sources = ['_ctypes/_ctypes.c',
- '_ctypes/callbacks.c',
- '_ctypes/callproc.c',
---
-2.16.1
-
+ undef_macros = []
diff --git a/python3.spec b/python3.spec
index 9b033c9..3a6cf71 100644
--- a/python3.spec
+++ b/python3.spec
@@ -370,6 +370,7 @@ Patch290:
00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
# Build fails with undefined references to dlopen / dlsym otherwise.
# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
+# Fixed upstream:
https://bugs.python.org/issue32647
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
# 00292 #
commit 347e968f54b2eb8693041334ca8abdb3416f97c6
Author: Florian Weimer <fweimer(a)redhat.com>
Date: Sat Feb 24 18:28:44 2018 +0100
Rebuild with new LDFLAGS from redhat-rpm-config
diff --git a/python3.spec b/python3.spec
index 4b032be..9b033c9 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 15%{?dist}
+Release: 16%{?dist}
License: Python
@@ -1505,6 +1505,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Sat Feb 24 2018 Florian Weimer <fweimer(a)redhat.com> - 3.6.4-16
+- Rebuild with new LDFLAGS from redhat-rpm-config
+
* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-15
- Filter out automatic /usr/bin/python3.X requirement,
recommend the main package from libs instead
commit f52973f5cbf85052d695a4f4fad06aa1c8edc7c9
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Tue Feb 20 18:56:34 2018 +0100
Reenable test_gdb on x86_64
The test was disabled for Python 3.6.4 where it fails currently, but it
completes successfully on Python 3.7. See commit:
https://src.fedoraproject.org/rpms/python37/c/d84538b320e2013a786d7d1e391...
Enable also runnig test_gdb on aarch64, as failures are no longer observed.
The bugzilla associated with the reqson why it was disabled is long closed.
See commit:
https://src.fedoraproject.org/rpms/python37/c/3b7dcebf399c67228916767bb92...
diff --git a/python37.spec b/python37.spec
index 58cc1e4..fda232b 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1065,10 +1065,12 @@ CheckPython() {
-wW --slowest --findleaks \
-x test_distutils \
-x test_bdist_rpm \
- -x test_gdb \
%ifarch %{mips64}
-x test_ctypes \
%endif
+ %ifarch %{power64} s390 s390x armv7hl %{mips}
+ -x test_gdb \
+ %endif
%ifarch ppc64le
-x test_buffer \
%endif
commit a2c6e9ba550ec1d5de0d4be035e83e0e91906d19
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Wed Feb 14 22:29:50 2018 +0100
Do not skip test_faulthandler on ppc64le and aarch64 as it no longer fails
diff --git a/python37.spec b/python37.spec
index df10049..58cc1e4 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1060,17 +1060,12 @@ CheckPython() {
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
# @unittest._expectedFailureInRpmBuild
- # test_faulthandler.test_register_chain currently fails on ppc64le and
- # aarch64, see upstream bug
http://bugs.python.org/issue21131
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
-wW --slowest --findleaks \
-x test_distutils \
-x test_bdist_rpm \
-x test_gdb \
- %ifarch ppc64le aarch64
- -x test_faulthandler \
- %endif
%ifarch %{mips64}
-x test_ctypes \
%endif
commit de5e1e875a0b659077bc0ea5ea623246f1bb4948
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Wed Feb 14 17:10:48 2018 +0100
test_pass_by_value no longer fails on aarch64; patch removed
diff --git a/00264-skip-test-failing-on-aarch64.patch
b/00264-skip-test-failing-on-aarch64.patch
deleted file mode 100644
index edda219..0000000
--- a/00264-skip-test-failing-on-aarch64.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
-index 3eded77..ad7859a 100644
---- a/Lib/ctypes/test/test_structures.py
-+++ b/Lib/ctypes/test/test_structures.py
-@@ -392,6 +392,7 @@ class StructureTestCase(unittest.TestCase):
- (1, 0, 0, 0, 0, 0))
- self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7))
-
-+ @unittest.skip('Fails on aarch64:
http://bugs.python.org/issue29804')
- def test_pass_by_value(self):
- # This should mirror the structure in Modules/_ctypes/_ctypes_test.c
- class X(Structure):
diff --git a/python37.spec b/python37.spec
index 29aadcc..df10049 100644
--- a/python37.spec
+++ b/python37.spec
@@ -349,13 +349,6 @@ Patch205: 00205-make-libpl-respect-lib64.patch
# Fedora Change:
https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
Patch251: 00251-change-user-install-location.patch
-# 00264 #
-# test_pass_by_value was added in Python 3.6.1 and on aarch64
-# it is catching an error that was there, but wasn't tested before.
-# Therefore skipping the test on aarch64 until fixed upstream.
-# Reported upstream:
http://bugs.python.org/issue29804
-Patch264: 00264-skip-test-failing-on-aarch64.patch
-
# 00274 #
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
@@ -674,11 +667,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch205 -p1
%patch251 -p1
-
-%ifarch aarch64
-%patch264 -p1
-%endif
-
%patch274 -p1
%patch291 -p1
commit 3f778c43e364bfcca194d665bab51bdb6a5c1f84
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 21 14:35:54 2018 +0100
Filter out automatic /usr/bin/python3.X requirement...
...recommend the main package from libs instead.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
diff --git a/python3.spec b/python3.spec
index f647c00..4b032be 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 14%{?dist}
+Release: 15%{?dist}
License: Python
@@ -436,6 +436,14 @@ Requires: python3-setuptools
Requires: python3-pip
%endif
+# This prevents ALL subpackages built from this spec to require
+# /usr/bin/python3*. Granularity per subpackage is impossible.
+# It's intended for the libs package not to drag in the interpreter, see
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+# All others require %%{name} anyway.
+%global __requires_exclude ^/usr/bin/python3
+
+
# The description used both for the SRPM and the main `python3` subpackage:
%description
Python is an accessible, high-level, dynamically typed, interpreted programming
@@ -474,6 +482,12 @@ Requires: glibc%{?_isa} >= 2.24.90-26
Requires: gdbm%{?_isa} >= 1:1.13
%endif
+# There are files in the standard library that have python shebang.
+# We've filtered the automatic requirement out so libs are installable without
+# the main package. This however makes it pulled in by default.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+Recommends: %{name}%{?_isa} = %{version}-%{release}
+
# For backward compatibility only, remove in F29:
Provides: system-python-libs = %{version}-%{release}
Provides: system-python-libs%{?_isa} = %{version}-%{release}
@@ -1491,6 +1505,11 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-15
+- Filter out automatic /usr/bin/python3.X requirement,
+ recommend the main package from libs instead
+Resolves: rhbz#1547131
+
* Thu Feb 15 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.4-14
- Remove the python3-tools package (#rhbz 1312030)
- Move /usr/bin/2to3 to python3-devel
commit 06a649c4a515f8865ffd7dce1b95eb48f308287c
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 21 14:35:54 2018 +0100
Filter out automatic /usr/bin/python3.X requirement...
...recommend the main package from libs instead.
Resolves
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
diff --git a/python37.spec b/python37.spec
index f759380..29aadcc 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.9.%{?prerel}%{?dist}
+Release: 0.10.%{?prerel}%{?dist}
License: Python
@@ -418,6 +418,14 @@ Requires: python3-setuptools
Requires: python3-pip
%endif
+# This prevents ALL subpackages built from this spec to require
+# /usr/bin/python3*. Granularity per subpackage is impossible.
+# It's intended for the libs package not to drag in the interpreter, see
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+# All others require %%{name} anyway.
+%global __requires_exclude ^/usr/bin/python3
+
+
# The description used both for the SRPM and the main `python3` subpackage:
%description
Python is an accessible, high-level, dynamically typed, interpreted programming
@@ -456,6 +464,12 @@ Requires: glibc%{?_isa} >= 2.24.90-26
Requires: gdbm%{?_isa} >= 1:1.13
%endif
+# There are files in the standard library that have python shebang.
+# We've filtered the automatic requirement out so libs are installable without
+# the main package. This however makes it pulled in by default.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1547131
+Recommends: %{name}%{?_isa} = %{version}-%{release}
+
# For backward compatibility only, remove in F29:
Provides: system-python-libs = %{version}-%{release}
Provides: system-python-libs%{?_isa} = %{version}-%{release}
@@ -1573,6 +1587,11 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Feb 21 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.10.b1
+- Filter out automatic /usr/bin/python3.X requirement,
+ recommend the main package from libs instead
+Resolves: rhbz#1547131
+
* Thu Feb 15 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.7.0-0.9.b1
- Remove sys.executable check from change-user-install-location patch
Resolves: rhbz#1532287
commit 6e4c18d0c79a0748f9166817b85436c4d8503755
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Sat Feb 17 21:01:39 2018 +0100
Remove %ldconfig_scriptlets (F28+ only)
%ldconfig_scriptlets does nothing on F28+.
The original idea was to keep is present not to unnecessarily diverge master
and f27, but since that have happened anyway, I'm removing it for spec
simplicity. Not adding a new changelog entry (it's not user facing) nor bumping
the release (it doesn't need to be rebuilt, it changes nothing). Altering the
changelog entry that was added when %ldconfig_scriptlets was added.
diff --git a/python37.spec b/python37.spec
index a7b832b..f759380 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1091,15 +1091,6 @@ CheckPython optimized
%endif # with tests
-# Remove this when F27 EOL
-%if %{with flatpackage}
-%ldconfig_scriptlets
-%else
-%ldconfig_scriptlets libs
-%ldconfig_scriptlets debug
-%endif
-
-
%files
%defattr(-, root, root)
%license LICENSE
@@ -1587,7 +1578,7 @@ CheckPython optimized
Resolves: rhbz#1532287
* Wed Feb 14 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.8.b1
-- Readd ldconfig scriplets via macro
+- Readd ldconfig scriplets via macro (later removed on F28+ only)
* Mon Feb 12 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.7.0-0.7.b1
- Update to 3.7.0b1
commit ffaa0f307889d9e7a3055b1f212182da79f59c5e
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Tue Feb 13 16:23:24 2018 +0100
Remove unused Postfix argument from InstallPython
It was used for Systemtap hooks, which were removed recently:
https://src.fedoraproject.org/rpms/python3/c/dd3cb47629970fe54d5dd87825c0...
diff --git a/python3.spec b/python3.spec
index 523364d..f647c00 100644
--- a/python3.spec
+++ b/python3.spec
@@ -819,7 +819,6 @@ InstallPython() {
PyInstSoName=$2
MoreCFlags=$3
LDVersion=$4
- Postfix=$5
# Switch to the directory with this configuration's built files
ConfDir=build/$ConfName
@@ -873,16 +872,14 @@ EOF
InstallPython debug \
%{py_INSTSONAME_debug} \
-O0 \
- %{LDVERSION_debug} \
- -debug
+ %{LDVERSION_debug}
%endif # with debug_build
# Now the optimized build:
InstallPython optimized \
%{py_INSTSONAME_optimized} \
"" \
- %{LDVERSION_optimized} \
- ""
+ %{LDVERSION_optimized}
# Install directories for additional packages
install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
commit 56c7fd9871f10addbf4456faf1ac8d7270996009
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Tue Feb 13 13:49:21 2018 +0100
Fix deprecation warning on using imp
In build log fixes the following warning:
/builddir/build/SOURCES/check-pyc-and-pyo-timestamps.py:3: DeprecationWarning: the imp
module is deprecated in favour of importlib; see the module's documentation for
alternative uses
import imp
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
index 76a3421..262a985 100644
--- a/check-pyc-and-pyo-timestamps.py
+++ b/check-pyc-and-pyo-timestamps.py
@@ -1,6 +1,6 @@
"""Checks if all *.pyc and *.pyo files have later mtime than their *.py
files."""
-import imp
+import importlib.util
import os
import sys
@@ -37,16 +37,18 @@ not_compiled = [
]
failed = 0
+
def bytecode_expected(source):
for f in not_compiled:
if source.endswith(f):
return False
return True
+
compiled = filter(lambda f: bytecode_expected(f), sys.argv[1:])
for f in compiled:
# check both pyo and pyc
- to_check = map(lambda b: imp.cache_from_source(f, b), (True, False))
+ to_check = map(lambda b: importlib.util.cache_from_source(f, b), (True, False))
f_mtime = os.path.getmtime(f)
for c in to_check:
c_mtime = os.path.getmtime(c)
commit daeec838fe3aa8668ffa4ac4cca8e23a8c9aa375
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Tue Feb 13 11:16:40 2018 +0100
Remove not used patches
Should have been removed with update to 3.6.3
https://src.fedoraproject.org/rpms/python3/c/47069ff4171cd7fafa42544033be...
diff --git a/00270-fix-ssl-alpn-hook-test.patch b/00270-fix-ssl-alpn-hook-test.patch
deleted file mode 100644
index 97b433e..0000000
--- a/00270-fix-ssl-alpn-hook-test.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
-index d203cdd..c128dae 100644
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -3256,8 +3256,9 @@ if _have_threads:
- except ssl.SSLError as e:
- stats = e
-
-- if expected is None and IS_OPENSSL_1_1:
-- # OpenSSL 1.1.0 raises handshake error
-+ if (expected is None and IS_OPENSSL_1_1
-+ and ssl.OPENSSL_VERSION_INFO < (1, 1, 0, 6)):
-+ # OpenSSL 1.1.0 to 1.1.0e raises handshake error
- self.assertIsInstance(stats, ssl.SSLError)
- else:
- msg = "failed trying %s (s) and %s (c).\n" \
diff --git a/00271-asyncio-get-default-signal-handler.patch
b/00271-asyncio-get-default-signal-handler.patch
deleted file mode 100644
index 8b1bf77..0000000
--- a/00271-asyncio-get-default-signal-handler.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
-index 492a84a2313..9746678607c 100644
---- a/Lib/test/test_asyncio/test_events.py
-+++ b/Lib/test/test_asyncio/test_events.py
-@@ -1980,19 +1980,26 @@ def test_subprocess_terminate(self):
-
- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
- def test_subprocess_send_signal(self):
-- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
--
-- connect = self.loop.subprocess_exec(
-- functools.partial(MySubprocessProtocol, self.loop),
-- sys.executable, prog)
-- transp, proto = self.loop.run_until_complete(connect)
-- self.assertIsInstance(proto, MySubprocessProtocol)
-- self.loop.run_until_complete(proto.connected)
--
-- transp.send_signal(signal.SIGHUP)
-- self.loop.run_until_complete(proto.completed)
-- self.assertEqual(-signal.SIGHUP, proto.returncode)
-- transp.close()
-+ # bpo-31034: Make sure that we get the default signal handler (killing
-+ # the process). The parent process may have decided to ignore SIGHUP,
-+ # and signal handlers are inherited.
-+ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL)
-+ try:
-+ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-+
-+ connect = self.loop.subprocess_exec(
-+ functools.partial(MySubprocessProtocol, self.loop),
-+ sys.executable, prog)
-+ transp, proto = self.loop.run_until_complete(connect)
-+ self.assertIsInstance(proto, MySubprocessProtocol)
-+ self.loop.run_until_complete(proto.connected)
-+
-+ transp.send_signal(signal.SIGHUP)
-+ self.loop.run_until_complete(proto.completed)
-+ self.assertEqual(-signal.SIGHUP, proto.returncode)
-+ transp.close()
-+ finally:
-+ signal.signal(signal.SIGHUP, old_handler)
-
- def test_subprocess_stderr(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
-diff --git a/Lib/test/test_asyncio/test_subprocess.py
b/Lib/test/test_asyncio/test_subprocess.py
-index 2e14a8a9735..e8822c36698 100644
---- a/Lib/test/test_asyncio/test_subprocess.py
-+++ b/Lib/test/test_asyncio/test_subprocess.py
-@@ -166,25 +166,32 @@ def test_terminate(self):
-
- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
- def test_send_signal(self):
-- code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
-- args = [sys.executable, '-c', code]
-- create = asyncio.create_subprocess_exec(*args,
-- stdout=subprocess.PIPE,
-- loop=self.loop)
-- proc = self.loop.run_until_complete(create)
--
-- @asyncio.coroutine
-- def send_signal(proc):
-- # basic synchronization to wait until the program is sleeping
-- line = yield from proc.stdout.readline()
-- self.assertEqual(line, b'sleeping\n')
-+ # bpo-31034: Make sure that we get the default signal handler (killing
-+ # the process). The parent process may have decided to ignore SIGHUP,
-+ # and signal handlers are inherited.
-+ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL)
-+ try:
-+ code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
-+ args = [sys.executable, '-c', code]
-+ create = asyncio.create_subprocess_exec(*args,
-+ stdout=subprocess.PIPE,
-+ loop=self.loop)
-+ proc = self.loop.run_until_complete(create)
-
-- proc.send_signal(signal.SIGHUP)
-- returncode = (yield from proc.wait())
-- return returncode
--
-- returncode = self.loop.run_until_complete(send_signal(proc))
-- self.assertEqual(-signal.SIGHUP, returncode)
-+ @asyncio.coroutine
-+ def send_signal(proc):
-+ # basic synchronization to wait until the program is sleeping
-+ line = yield from proc.stdout.readline()
-+ self.assertEqual(line, b'sleeping\n')
-+
-+ proc.send_signal(signal.SIGHUP)
-+ returncode = (yield from proc.wait())
-+ return returncode
-+
-+ returncode = self.loop.run_until_complete(send_signal(proc))
-+ self.assertEqual(-signal.SIGHUP, returncode)
-+ finally:
-+ signal.signal(signal.SIGHUP, old_handler)
-
- def prepare_broken_pipe_test(self):
- # buffer large enough to feed the whole pipe buffer
diff --git a/00272-fix-ftplib-to-reject-newlines.patch
b/00272-fix-ftplib-to-reject-newlines.patch
deleted file mode 100644
index 66486a8..0000000
--- a/00272-fix-ftplib-to-reject-newlines.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 8c2d4cf092c5f0335e7982392a33927579c4d512 Mon Sep 17 00:00:00 2001
-From: Dong-hee Na <donghee.na92(a)gmail.com>
-Date: Wed, 26 Jul 2017 21:11:25 +0900
-Subject: [PATCH] [3.6] bpo-30119: fix ftplib.FTP.putline() to throw an error
- for a illegal command (#1214) (#2886)
-
----
- Lib/ftplib.py | 2 ++
- Lib/test/test_ftplib.py | 6 +++++-
- Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst | 2 ++
- 3 files changed, 9 insertions(+), 1 deletion(-)
- create mode 100644 Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
-
-diff --git a/Lib/ftplib.py b/Lib/ftplib.py
-index 8f36f537e8a..a02e595cb02 100644
---- a/Lib/ftplib.py
-+++ b/Lib/ftplib.py
-@@ -186,6 +186,8 @@ def sanitize(self, s):
-
- # Internal: send one line to the server, appending CRLF
- def putline(self, line):
-+ if '\r' in line or '\n' in line:
-+ raise ValueError('an illegal newline character should not be
contained')
- line = line + CRLF
- if self.debugging > 1:
- print('*put*', self.sanitize(line))
-diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
-index 12fabc5e8be..a561e9efa03 100644
---- a/Lib/test/test_ftplib.py
-+++ b/Lib/test/test_ftplib.py
-@@ -484,6 +484,9 @@ def test_sanitize(self):
- self.assertEqual(self.client.sanitize('PASS 12345'), repr('PASS
*****'))
-
- def test_exceptions(self):
-+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r\n0')
-+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\n0')
-+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r0')
- self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 400')
- self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 499')
- self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'echo 500')
-@@ -492,7 +495,8 @@ def test_exceptions(self):
-
- def test_all_errors(self):
- exceptions = (ftplib.error_reply, ftplib.error_temp, ftplib.error_perm,
-- ftplib.error_proto, ftplib.Error, OSError, EOFError)
-+ ftplib.error_proto, ftplib.Error, OSError,
-+ EOFError)
- for x in exceptions:
- try:
- raise x('exception not included in all_errors set')
-diff --git a/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
-new file mode 100644
-index 00000000000..a37d3703842
---- /dev/null
-+++ b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
-@@ -0,0 +1,2 @@
-+ftplib.FTP.putline() now throws ValueError on commands that contains CR or
-+LF. Patch by Dong-hee Na.
commit 3bbc2a0bdf53b44febb0bbe45d9e5ed284698e02
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Mon Feb 12 17:43:19 2018 +0100
Fix rpmlint errors: spelling, tabs (bz#1535596)
diff --git a/python3.spec b/python3.spec
index cc3b0ef..523364d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -127,7 +127,7 @@ License: Python
# has bytecode at:
# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
# Python's configure script defines SOVERSION, and this is used in the Makefile
@@ -439,7 +439,7 @@ Requires: python3-pip
# The description used both for the SRPM and the main `python3` subpackage:
%description
Python is an accessible, high-level, dynamically typed, interpreted programming
-language, designed with an emphasis on code readibility.
+language, designed with an emphasis on code readability.
It includes an extensive standard library, and has a vast ecosystem of
third-party libraries.
@@ -591,7 +591,7 @@ you should use the unittest module from %{name}-libs, or a library
such as
Summary: Debug version of the Python runtime
# The debug build is an all-in-one package version of the regular build, and
-# shares the same .py/.pyc files and directories as the regular build. Hence
+# shares the same .py/.pyc files and directories as the regular build. Hence
# we depend on all of the subpackages of the regular build:
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
@@ -616,7 +616,7 @@ separately.
The debug build shares installation directories with the standard Python
runtime, so that .py and .pyc files can be shared.
Compiled extension modules use a special ABI flag ("d") in the filename,
-so extensions for both verisons can co-exist in the same directory.
+so extensions for both versions can co-exist in the same directory.
%endif # with debug_build
commit bf7378574e55db46ceff9cc1c207f7a851dda132
Author: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Fri Feb 16 15:33:54 2018 +0100
Remove sys.executable check from change-user-install-location patch
Resolves: rhbz#1532287
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 1dcd9f2..4104449 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,19 +1,20 @@
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
-index 9d31d13..ed44a93 100644
+index 0258d3d..4ebf50a 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
-@@ -424,8 +424,18 @@ class install(Command):
+@@ -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 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):
++ # 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 = ""
@@ -24,22 +25,21 @@ index 9d31d13..ed44a93 100644
else:
if self.exec_prefix is None:
diff --git a/Lib/site.py b/Lib/site.py
-index 4744eb0..b5fe571 100644
+index 0fc9200..c95202e 100644
--- a/Lib/site.py
+++ b/Lib/site.py
-@@ -326,7 +326,15 @@ def getsitepackages(prefixes=None):
+@@ -322,7 +322,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.
++ """Add site-packages to sys.path
+
-+ '/usr/local' is included in PREFIXES if the executable is /usr/bin/python*
-+ and RPM build is not detected to make sudo pip installed packages visible.
++ '/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 sys.executable.startswith("/usr/bin/python")
-+ and 'RPM_BUILD_ROOT' not in os.environ):
++ 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):
diff --git a/python37.spec b/python37.spec
index ccea761..a7b832b 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.8.%{?prerel}%{?dist}
+Release: 0.9.%{?prerel}%{?dist}
License: Python
@@ -1582,6 +1582,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Feb 15 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.7.0-0.9.b1
+- Remove sys.executable check from change-user-install-location patch
+Resolves: rhbz#1532287
+
* Wed Feb 14 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.8.b1
- Readd ldconfig scriplets via macro
commit d938460ea1a9a638205d427014593e10c5dfa6e0
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Thu Jan 18 22:57:38 2018 +0100
Remove the python3-tools package (bz#1312030)
For more details see
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
Scope:
- Remove the python3-tools package and `Tools/` library
- Move /usr/bin/2to3 to python3-devel
- Move /usr/bin/idle and idlelib to python3-idle
- Provide python3-tools from python3-idle to keep upgrades sane
- Remove tests for tools from python3-tests package
Backported from
https://src.fedoraproject.org/rpms/python37/pull-request/4
diff --git a/python3.spec b/python3.spec
index 78317c8..cc3b0ef 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 13%{?dist}
+Release: 14%{?dist}
License: Python
@@ -505,8 +505,21 @@ Requires: python3-rpm-generators
# TODO change to a specific subpackage once available (#1218294)
Requires: redhat-rpm-config
+Provides: %{name}-2to3 = %{version}-%{release}
+Provides: 2to3 = %{version}-%{release}
+
Conflicts: %{name} < %{version}-%{release}
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+# /usr/bin/2to3 was moved from python2-tools to python3-tools
+# TODO Remove in Fedora 29
+Conflicts: python2-tools < 2.7.13-17
+Conflicts: python-tools < 2.7.13-17
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+# /usr/bin/2to3 was moved from python3-tools to python3-devel
+# TODO Remove in Fedora 30
+Conflicts: python3-tools < 3.6.4-14
+
# Shall be removed in Fedora 31
Obsoletes: platform-python-devel < %{platpyver}
@@ -515,32 +528,35 @@ This package contains the header files and configuration needed to
compile
Python extension modules (typically written in C or C++), to embed Python
into other programs, and to make binary distributions for Python libraries.
-It also contains the necessary macros to build RPM packages with Python modules.
+It also contains the necessary macros to build RPM packages with Python modules
+and 2to3 tool, an automatic source converter from Python 2.X.
-%package tools
-Summary: A collection of tools included with Python including 2to3 and idle
+%package idle
+Summary: A basic graphical development environment for Python
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tkinter = %{version}-%{release}
-Provides: %{name}-2to3 = %{version}-%{release}
-Provides: %{name}-idle = %{version}-%{release}
-Provides: 2to3 = %{version}-%{release}
Provides: idle3 = %{version}-%{release}
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-# /usr/bin/2to3 was moved from here
-# TODO Remove in Fedora 29
-Conflicts: python2-tools < 2.7.13-17
-Conflicts: python-tools < 2.7.13-17
+Provides: %{name}-tools = %{version}-%{release}
+Provides: %{name}-tools%{?_isa} = %{version}-%{release}
+Obsoletes: %{name}-tools < %{version}-%{release}
# Shall be removed in Fedora 31
Obsoletes: platform-python-tools < %{platpyver}
-%description tools
-This package contains several tools included with Python, including:
-- 2to3, an automatic source converter from Python 2.X
-- idle, a basic graphical development environment
+%description idle
+IDLE is Pythons Integrated Development and Learning Environment.
+
+IDLE has the following features: Python shell window (interactive
+interpreter) with colorizing of code input, output, and error messages;
+multi-window text editor with multiple undo, Python colorizing,
+smart indent, call tips, auto completion, and other features;
+search within any window, replace within editor windows, and
+search through multiple files (grep); debugger with persistent
+breakpoints, stepping, and viewing of global and local namespaces;
+configuration, browsers, and other dialogs.
%package tkinter
@@ -558,7 +574,6 @@ the Python programming language.
%package test
Summary: The self-test suite for the main python3 package
Requires: %{name} = %{version}-%{release}
-Requires: %{name}-tools = %{version}-%{release}
# Shall be removed in Fedora 31
Obsoletes: platform-python-test < %{platpyver}
@@ -583,7 +598,7 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Requires: %{name}-devel%{?_isa} = %{version}-%{release}
Requires: %{name}-test%{?_isa} = %{version}-%{release}
Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
-Requires: %{name}-tools%{?_isa} = %{version}-%{release}
+Requires: %{name}-idle%{?_isa} = %{version}-%{release}
%description debug
python3-debug provides a version of the Python runtime with numerous debugging
@@ -891,21 +906,6 @@ mkdir -p %{buildroot}%{_datadir}/appdata
cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
-# Development tools
-install -m755 -d %{buildroot}%{pylibdir}/Tools
-install Tools/README %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/freeze %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/i18n %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/pynche %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/scripts %{buildroot}%{pylibdir}/Tools/
-
-# Documentation tools
-install -m755 -d %{buildroot}%{pylibdir}/Doc
-cp -ar Doc/tools %{buildroot}%{pylibdir}/Doc/
-
-# Demo scripts
-cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
-
# Make sure distutils looks at the right pyconfig.h file
# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
@@ -918,22 +918,21 @@ sed -i -e
"s/'pyconfig.h'/'%{_pyconfig_h}'/" \
%{buildroot}%{pylibdir}/distutils/sysconfig.py \
%{buildroot}%{pylibdir}/sysconfig.py
+# Install pathfix.py to bindir
+# See
https://github.com/fedora-python/python-rpm-porting/issues/24
+cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+
# Switch all shebangs to refer to the specific Python version.
# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
# so handle files named using other naming scheme separately.
LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
Tools/scripts/pathfix.py \
-i "%{_bindir}/python%{pybasever}" \
- %{buildroot} %{buildroot}%{pylibdir}/Tools/scripts/*-*.py \
- %{buildroot}%{pylibdir}/Tools/pynche/{pynche,pynche.pyw}
-# not covered, also redundant and useless:
-rm %{buildroot}%{pylibdir}/Tools/scripts/{2to3,idle3,pydoc3,pyvenv}
-
-
-# Move pathfix.py to bindir
-# See
https://github.com/fedora-python/python-rpm-porting/issues/24
-mv %{buildroot}%{pylibdir}/Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+ %{buildroot}
+# Remove tests for python3-tools which was removed in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+rm -rf %{buildroot}%{pylibdir}/test/test_tools
# Remove shebang lines from .py files that aren't executable, and
# remove executability from .py files that don't have a shebang line:
@@ -943,10 +942,6 @@ find %{buildroot} -name \*.py \
-perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
-exec chmod a-x {} \; \) \)
-# Remove executable flag from files that shouldn't have it:
-chmod a-x \
- %{buildroot}%{pylibdir}/Tools/README
-
# Get rid of DOS batch files:
find %{buildroot} -name \*.bat -exec rm {} \;
@@ -1134,8 +1129,6 @@ CheckPython optimized
%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
%endif
-%{pylibdir}/idlelib
-
%dir %{pylibdir}/test/
%dir %{pylibdir}/test/__pycache__/
%dir %{pylibdir}/test/support/
@@ -1311,6 +1304,9 @@ CheckPython optimized
%files devel
%defattr(-,root,root)
+%{_bindir}/2to3
+# TODO: Remove 2to3-3.7 once rebased to 3.7
+%{_bindir}/2to3-%{pybasever}
%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
%{pylibdir}/distutils/command/wininst-*.exe
@@ -1329,14 +1325,10 @@ CheckPython optimized
%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
%{_rpmconfigdir}/macros.d/macros.systempython
-%files tools
+%files idle
%defattr(-,root,root,755)
-%{_bindir}/2to3
-# TODO: Remove 2to3-3.7 once rebased to 3.7
-%{_bindir}/2to3-%{pybasever}
%{_bindir}/idle*
-%{pylibdir}/Tools
-%doc %{pylibdir}/Doc
+%{pylibdir}/idlelib
%{_datadir}/appdata/idle3.appdata.xml
%{_datadir}/applications/idle3.desktop
%{_datadir}/icons/hicolor/*/apps/idle3.*
@@ -1502,6 +1494,12 @@ CheckPython optimized
# ======================================================
%changelog
+* Thu Feb 15 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.4-14
+- Remove the python3-tools package (#rhbz 1312030)
+- Move /usr/bin/2to3 to python3-devel
+- Move /usr/bin/idle and idlelib to python3-idle
+- Provide python3-tools from python3-idle
+
* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-13
- Escape macros in %%changelog
commit 9203532359bcd2631b67c56d89098264413b502d
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Tue Feb 13 16:23:24 2018 +0100
Remove unused Postfix argument from InstallPython
It was used for Systemtap hooks, which were removed recently:
https://src.fedoraproject.org/rpms/python37/c/31d212b3c7fa592942d18607d11...
diff --git a/python37.spec b/python37.spec
index 3992856..ccea761 100644
--- a/python37.spec
+++ b/python37.spec
@@ -815,7 +815,6 @@ InstallPython() {
PyInstSoName=$2
MoreCFlags=$3
LDVersion=$4
- Postfix=$5
# Switch to the directory with this configuration's built files
ConfDir=build/$ConfName
@@ -869,16 +868,14 @@ EOF
InstallPython debug \
%{py_INSTSONAME_debug} \
-O0 \
- %{LDVERSION_debug} \
- -debug
+ %{LDVERSION_debug}
%endif # with debug_build
# Now the optimized build:
InstallPython optimized \
%{py_INSTSONAME_optimized} \
"" \
- %{LDVERSION_optimized} \
- ""
+ %{LDVERSION_optimized}
# Install directories for additional packages
install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
commit f3f5f60ac09feb66c0c1381deedaa85cdec5da14
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Tue Feb 13 13:49:21 2018 +0100
Fix deprecation warning on using imp
In build log fixes the following warning:
/builddir/build/SOURCES/check-pyc-and-pyo-timestamps.py:3: DeprecationWarning: the imp
module is deprecated in favour of importlib; see the module's documentation for
alternative uses
import imp
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
index 76a3421..262a985 100644
--- a/check-pyc-and-pyo-timestamps.py
+++ b/check-pyc-and-pyo-timestamps.py
@@ -1,6 +1,6 @@
"""Checks if all *.pyc and *.pyo files have later mtime than their *.py
files."""
-import imp
+import importlib.util
import os
import sys
@@ -37,16 +37,18 @@ not_compiled = [
]
failed = 0
+
def bytecode_expected(source):
for f in not_compiled:
if source.endswith(f):
return False
return True
+
compiled = filter(lambda f: bytecode_expected(f), sys.argv[1:])
for f in compiled:
# check both pyo and pyc
- to_check = map(lambda b: imp.cache_from_source(f, b), (True, False))
+ to_check = map(lambda b: importlib.util.cache_from_source(f, b), (True, False))
f_mtime = os.path.getmtime(f)
for c in to_check:
c_mtime = os.path.getmtime(c)
commit 627aaf656c2780cf22b88ba4dbca7caa3a4f21b7
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Tue Feb 13 11:16:40 2018 +0100
Remove not used patches
Should have been removed with update to 3.6.3
https://src.fedoraproject.org/rpms/python37/c/47069ff4171cd7fafa42544033b...
diff --git a/00270-fix-ssl-alpn-hook-test.patch b/00270-fix-ssl-alpn-hook-test.patch
deleted file mode 100644
index 97b433e..0000000
--- a/00270-fix-ssl-alpn-hook-test.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
-index d203cdd..c128dae 100644
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -3256,8 +3256,9 @@ if _have_threads:
- except ssl.SSLError as e:
- stats = e
-
-- if expected is None and IS_OPENSSL_1_1:
-- # OpenSSL 1.1.0 raises handshake error
-+ if (expected is None and IS_OPENSSL_1_1
-+ and ssl.OPENSSL_VERSION_INFO < (1, 1, 0, 6)):
-+ # OpenSSL 1.1.0 to 1.1.0e raises handshake error
- self.assertIsInstance(stats, ssl.SSLError)
- else:
- msg = "failed trying %s (s) and %s (c).\n" \
diff --git a/00271-asyncio-get-default-signal-handler.patch
b/00271-asyncio-get-default-signal-handler.patch
deleted file mode 100644
index 8b1bf77..0000000
--- a/00271-asyncio-get-default-signal-handler.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
-index 492a84a2313..9746678607c 100644
---- a/Lib/test/test_asyncio/test_events.py
-+++ b/Lib/test/test_asyncio/test_events.py
-@@ -1980,19 +1980,26 @@ def test_subprocess_terminate(self):
-
- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
- def test_subprocess_send_signal(self):
-- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
--
-- connect = self.loop.subprocess_exec(
-- functools.partial(MySubprocessProtocol, self.loop),
-- sys.executable, prog)
-- transp, proto = self.loop.run_until_complete(connect)
-- self.assertIsInstance(proto, MySubprocessProtocol)
-- self.loop.run_until_complete(proto.connected)
--
-- transp.send_signal(signal.SIGHUP)
-- self.loop.run_until_complete(proto.completed)
-- self.assertEqual(-signal.SIGHUP, proto.returncode)
-- transp.close()
-+ # bpo-31034: Make sure that we get the default signal handler (killing
-+ # the process). The parent process may have decided to ignore SIGHUP,
-+ # and signal handlers are inherited.
-+ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL)
-+ try:
-+ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-+
-+ connect = self.loop.subprocess_exec(
-+ functools.partial(MySubprocessProtocol, self.loop),
-+ sys.executable, prog)
-+ transp, proto = self.loop.run_until_complete(connect)
-+ self.assertIsInstance(proto, MySubprocessProtocol)
-+ self.loop.run_until_complete(proto.connected)
-+
-+ transp.send_signal(signal.SIGHUP)
-+ self.loop.run_until_complete(proto.completed)
-+ self.assertEqual(-signal.SIGHUP, proto.returncode)
-+ transp.close()
-+ finally:
-+ signal.signal(signal.SIGHUP, old_handler)
-
- def test_subprocess_stderr(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
-diff --git a/Lib/test/test_asyncio/test_subprocess.py
b/Lib/test/test_asyncio/test_subprocess.py
-index 2e14a8a9735..e8822c36698 100644
---- a/Lib/test/test_asyncio/test_subprocess.py
-+++ b/Lib/test/test_asyncio/test_subprocess.py
-@@ -166,25 +166,32 @@ def test_terminate(self):
-
- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
- def test_send_signal(self):
-- code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
-- args = [sys.executable, '-c', code]
-- create = asyncio.create_subprocess_exec(*args,
-- stdout=subprocess.PIPE,
-- loop=self.loop)
-- proc = self.loop.run_until_complete(create)
--
-- @asyncio.coroutine
-- def send_signal(proc):
-- # basic synchronization to wait until the program is sleeping
-- line = yield from proc.stdout.readline()
-- self.assertEqual(line, b'sleeping\n')
-+ # bpo-31034: Make sure that we get the default signal handler (killing
-+ # the process). The parent process may have decided to ignore SIGHUP,
-+ # and signal handlers are inherited.
-+ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL)
-+ try:
-+ code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
-+ args = [sys.executable, '-c', code]
-+ create = asyncio.create_subprocess_exec(*args,
-+ stdout=subprocess.PIPE,
-+ loop=self.loop)
-+ proc = self.loop.run_until_complete(create)
-
-- proc.send_signal(signal.SIGHUP)
-- returncode = (yield from proc.wait())
-- return returncode
--
-- returncode = self.loop.run_until_complete(send_signal(proc))
-- self.assertEqual(-signal.SIGHUP, returncode)
-+ @asyncio.coroutine
-+ def send_signal(proc):
-+ # basic synchronization to wait until the program is sleeping
-+ line = yield from proc.stdout.readline()
-+ self.assertEqual(line, b'sleeping\n')
-+
-+ proc.send_signal(signal.SIGHUP)
-+ returncode = (yield from proc.wait())
-+ return returncode
-+
-+ returncode = self.loop.run_until_complete(send_signal(proc))
-+ self.assertEqual(-signal.SIGHUP, returncode)
-+ finally:
-+ signal.signal(signal.SIGHUP, old_handler)
-
- def prepare_broken_pipe_test(self):
- # buffer large enough to feed the whole pipe buffer
diff --git a/00272-fix-ftplib-to-reject-newlines.patch
b/00272-fix-ftplib-to-reject-newlines.patch
deleted file mode 100644
index 66486a8..0000000
--- a/00272-fix-ftplib-to-reject-newlines.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 8c2d4cf092c5f0335e7982392a33927579c4d512 Mon Sep 17 00:00:00 2001
-From: Dong-hee Na <donghee.na92(a)gmail.com>
-Date: Wed, 26 Jul 2017 21:11:25 +0900
-Subject: [PATCH] [3.6] bpo-30119: fix ftplib.FTP.putline() to throw an error
- for a illegal command (#1214) (#2886)
-
----
- Lib/ftplib.py | 2 ++
- Lib/test/test_ftplib.py | 6 +++++-
- Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst | 2 ++
- 3 files changed, 9 insertions(+), 1 deletion(-)
- create mode 100644 Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
-
-diff --git a/Lib/ftplib.py b/Lib/ftplib.py
-index 8f36f537e8a..a02e595cb02 100644
---- a/Lib/ftplib.py
-+++ b/Lib/ftplib.py
-@@ -186,6 +186,8 @@ def sanitize(self, s):
-
- # Internal: send one line to the server, appending CRLF
- def putline(self, line):
-+ if '\r' in line or '\n' in line:
-+ raise ValueError('an illegal newline character should not be
contained')
- line = line + CRLF
- if self.debugging > 1:
- print('*put*', self.sanitize(line))
-diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
-index 12fabc5e8be..a561e9efa03 100644
---- a/Lib/test/test_ftplib.py
-+++ b/Lib/test/test_ftplib.py
-@@ -484,6 +484,9 @@ def test_sanitize(self):
- self.assertEqual(self.client.sanitize('PASS 12345'), repr('PASS
*****'))
-
- def test_exceptions(self):
-+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r\n0')
-+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\n0')
-+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r0')
- self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 400')
- self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 499')
- self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'echo 500')
-@@ -492,7 +495,8 @@ def test_exceptions(self):
-
- def test_all_errors(self):
- exceptions = (ftplib.error_reply, ftplib.error_temp, ftplib.error_perm,
-- ftplib.error_proto, ftplib.Error, OSError, EOFError)
-+ ftplib.error_proto, ftplib.Error, OSError,
-+ EOFError)
- for x in exceptions:
- try:
- raise x('exception not included in all_errors set')
-diff --git a/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
-new file mode 100644
-index 00000000000..a37d3703842
---- /dev/null
-+++ b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
-@@ -0,0 +1,2 @@
-+ftplib.FTP.putline() now throws ValueError on commands that contains CR or
-+LF. Patch by Dong-hee Na.
commit ac19ab7c07949909d9858dd743d1bfcfe12434ef
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Mon Feb 12 17:43:19 2018 +0100
Fix rpmlint errors: spelling, tabs (bz#1535596)
diff --git a/python37.spec b/python37.spec
index 022a16b..3992856 100644
--- a/python37.spec
+++ b/python37.spec
@@ -148,7 +148,7 @@ License: Python
# has bytecode at:
# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
# Python's configure script defines SOVERSION, and this is used in the Makefile
@@ -421,7 +421,7 @@ Requires: python3-pip
# The description used both for the SRPM and the main `python3` subpackage:
%description
Python is an accessible, high-level, dynamically typed, interpreted programming
-language, designed with an emphasis on code readibility.
+language, designed with an emphasis on code readability.
It includes an extensive standard library, and has a vast ecosystem of
third-party libraries.
@@ -573,7 +573,7 @@ you should use the unittest module from %{name}-libs, or a library
such as
Summary: Debug version of the Python runtime
# The debug build is an all-in-one package version of the regular build, and
-# shares the same .py/.pyc files and directories as the regular build. Hence
+# shares the same .py/.pyc files and directories as the regular build. Hence
# we depend on all of the subpackages of the regular build:
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
@@ -598,7 +598,7 @@ separately.
The debug build shares installation directories with the standard Python
runtime, so that .py and .pyc files can be shared.
Compiled extension modules use a special ABI flag ("d") in the filename,
-so extensions for both verisons can co-exist in the same directory.
+so extensions for both versions can co-exist in the same directory.
%endif # with debug_build
%else # with flatpackage
commit 2bcebb2b16c28cd4324c31187ba8aa8a1965f29f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Feb 15 14:34:07 2018 +0100
Fix the name macro in the description 2
diff --git a/python3.spec b/python3.spec
index 6cbcfca..78317c8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -568,7 +568,7 @@ The self-test suite for the Python interpreter.
This is only useful to test Python itself. For testing general Python code,
you should use the unittest module from %{name}-libs, or a library such as
-${name}-pytest or ${name}-nose.
+%{name}-pytest or %{name}-nose.
%if %{with debug_build}
commit 654b8b4665cea3fe6148dd0110b65bbe0bc93a55
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Feb 15 14:34:07 2018 +0100
Fix the name macro in the description 2
diff --git a/python37.spec b/python37.spec
index 6a34652..022a16b 100644
--- a/python37.spec
+++ b/python37.spec
@@ -565,7 +565,7 @@ The self-test suite for the Python interpreter.
This is only useful to test Python itself. For testing general Python code,
you should use the unittest module from %{name}-libs, or a library such as
-${name}-pytest or ${name}-nose.
+%{name}-pytest or %{name}-nose.
%if %{with debug_build}
commit 1161a4660dd81e52329d42d5bc09e78d7433ad70
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Feb 8 14:54:08 2018 +0100
Fix the name macro in the description
diff --git a/python37.spec b/python37.spec
index a93a3b2..6a34652 100644
--- a/python37.spec
+++ b/python37.spec
@@ -425,7 +425,7 @@ language, designed with an emphasis on code readibility.
It includes an extensive standard library, and has a vast ecosystem of
third-party libraries.
-The ${name} package provides the "python3" executable: the reference
+The %{name} package provides the "python3" executable: the reference
interpreter for the Python language, version 3.
The majority of its standard library is provided in the %{name}-libs package,
which should be installed automatically along with %{name}.
commit 0679427e979f6d97e22768e08cae87be7b1f807f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Feb 14 18:48:02 2018 +0100
Readd ldconfig scriplets via macro
diff --git a/python37.spec b/python37.spec
index c880daf..a93a3b2 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.7.%{?prerel}%{?dist}
+Release: 0.8.%{?prerel}%{?dist}
License: Python
@@ -1094,6 +1094,15 @@ CheckPython optimized
%endif # with tests
+# Remove this when F27 EOL
+%if %{with flatpackage}
+%ldconfig_scriptlets
+%else
+%ldconfig_scriptlets libs
+%ldconfig_scriptlets debug
+%endif
+
+
%files
%defattr(-, root, root)
%license LICENSE
@@ -1576,6 +1585,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Wed Feb 14 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.8.b1
+- Readd ldconfig scriplets via macro
+
* Mon Feb 12 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.7.0-0.7.b1
- Update to 3.7.0b1
- Define TLS cipher suite on build time
commit cc54a40057b61c03c7107f0247fb4a62371d4a29
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Feb 12 19:44:15 2018 +0100
3.7.0b1 sources
diff --git a/sources b/sources
index 9fd642f..126d4f3 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0a4.tar.xz) =
3d9517fb381258e21548e3e88de88592adc75bc37fddf21e79149d7706d85f5df816ffcc170603ce93959c76d903d4fd4c0231b5b0b2b430c21701cc303d9e5a
+SHA512 (Python-3.7.0b1.tar.xz) =
c2c9d76c310987e1998504ae6270350e7afd3834923143fe9f9e7ad130a491f2d1b45f26aff4c3ce5e6133979098da68e865aaabfc1dc6ff4227e6ef969cd50c
commit 02bfb4dc2a67905bc9b84f20c0b7db2eb1647598
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Feb 1 11:20:15 2018 +0100
Define TLS cipher suite on build time
diff --git a/python37.spec b/python37.spec
index 90d1b84..c880daf 100644
--- a/python37.spec
+++ b/python37.spec
@@ -738,6 +738,7 @@ BuildPython() {
--enable-loadable-sqlite-extensions \
--with-dtrace \
--with-lto \
+ --with-ssl-default-suites=openssl \
%if %{with valgrind}
--with-valgrind \
%endif
@@ -1577,6 +1578,7 @@ CheckPython optimized
%changelog
* Mon Feb 12 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.7.0-0.7.b1
- Update to 3.7.0b1
+- Define TLS cipher suite on build time
* Fri Feb 09 2018 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.7.0-0.6.a4
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
commit d84538b320e2013a786d7d1e391bfebd059f69a5
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Wed Jan 31 15:16:02 2018 +0100
Disable test_gdb for all arches and test_buffer for ppc64le in anticipation of the F28
mass rebuild
- Re-enable these tests after the mass rebuild when they can be properly
addressed
diff --git a/python37.spec b/python37.spec
index adfd31a..90d1b84 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1067,14 +1067,15 @@ CheckPython() {
-wW --slowest --findleaks \
-x test_distutils \
-x test_bdist_rpm \
+ -x test_gdb \
%ifarch ppc64le aarch64
-x test_faulthandler \
%endif
%ifarch %{mips64}
-x test_ctypes \
%endif
- %ifarch %{power64} s390 s390x armv7hl aarch64 %{mips}
- -x test_gdb
+ %ifarch ppc64le
+ -x test_buffer \
%endif
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
commit cea6d60615a84b72d036b1d324a2fd8e6613df3f
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Thu Feb 1 18:50:40 2018 +0100
Update to 3.7.0b1
- Rebase patches 102, 170
- Remove patches 273, 289, 290
diff --git a/00102-lib64.patch b/00102-lib64.patch
index b48feda..b082083 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -70,8 +70,8 @@ index 7dc1b04..85016b4 100644
sitepackages.append(prefix)
+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
- # for framework builds *only* we add the standard Apple locations.
- if sys.platform == "darwin" and sys._framework:
+ return sitepackages
+
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
index 9ee4d31..53c8606 100644
--- a/Lib/sysconfig.py
@@ -109,9 +109,9 @@ index 266adf0..e8513b6 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -275,8 +275,8 @@ class HelperFunctionsTests(unittest.TestCase):
- self.assertEqual(dirs[1], wanted)
- elif os.sep == '/':
- # OS X non-framework builds, Linux, FreeBSD, etc
+ 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)
@@ -190,14 +190,3 @@ index f1933f7..450cd8a 100644
extra_link_args=readline_extra_link_args,
libraries=readline_libs) )
else:
-@@ -871,8 +871,8 @@ class PyBuildExt(build_ext):
- if krb5_h:
- ssl_incs += krb5_h
- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-- ['/usr/local/ssl/lib',
-- '/usr/contrib/ssl/lib/'
-+ ['/usr/local/ssl/lib64',
-+ '/usr/contrib/ssl/lib64/'
- ] )
-
- if (ssl_incs is not None and
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
index 1f71939..0412e0d 100644
--- a/00170-gc-assertions.patch
+++ b/00170-gc-assertions.patch
@@ -60,8 +60,8 @@ index 904fc7d..5676007 100644
import unittest
from test.support import (verbose, refcount_test, run_unittest,
strip_python_stderr, cpython_only, start_threads,
-- temp_dir, requires_type_collecting)
-+ temp_dir, import_module, requires_type_collecting)
+- temp_dir, requires_type_collecting,reap_threads)
++ temp_dir,reap_threads, import_module,
requires_type_collecting)
from test.support.script_helper import assert_python_ok, make_script
import sys
diff --git a/00273-skip-float-test.patch b/00273-skip-float-test.patch
deleted file mode 100644
index 233d3ed..0000000
--- a/00273-skip-float-test.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
-index 66726d6496d..3318fa5df59 100644
---- a/Lib/test/test_float.py
-+++ b/Lib/test/test_float.py
-@@ -141,6 +141,7 @@ class GeneralFloatCases(unittest.TestCase):
- # non-UTF-8 byte string
- check(b'123\xa0')
-
-+ @unittest.skip('Fails in Koji:
https://bugzilla.redhat.com/show_bug.cgi?id=1484497')
- @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
- def test_float_with_comma(self):
- # set locale to something that doesn't use '.' for the decimal
point
diff --git a/00289-fix-nis-compilation.patch b/00289-fix-nis-compilation.patch
deleted file mode 100644
index 4d4e3dc..0000000
--- a/00289-fix-nis-compilation.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/setup.py b/setup.py
-index 3eb6ad1..3437e48 100644
---- a/setup.py
-+++ b/setup.py
-@@ -1331,20 +1331,14 @@ class PyBuildExt(build_ext):
- exts.append( Extension('termios', ['termios.c']) )
- # Jeremy Hylton's rlimit interface
- exts.append( Extension('resource', ['resource.c']) )
-+ else:
-+ missing.extend(['resource', 'termios'])
-
-- # Sun yellow pages. Some systems have the functions in libc.
-- if (host_platform not in ['cygwin', 'qnx6'] and
-- find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
-- if (self.compiler.find_library_file(lib_dirs, 'nsl')):
-- libs = ['nsl']
-- else:
-- libs = []
-- exts.append( Extension('nis', ['nismodule.c'],
-- libraries = libs) )
-- else:
-- missing.append('nis')
-+ nis = self._detect_nis(inc_dirs, lib_dirs)
-+ if nis is not None:
-+ exts.append(nis)
- else:
-- missing.extend(['nis', 'resource', 'termios'])
-+ missing.append('nis')
-
- # Curses support, requiring the System V version of curses, often
- # provided by the ncurses library.
-@@ -2179,6 +2173,51 @@ class PyBuildExt(build_ext):
- )
- return ext
-
-+ def _detect_nis(self, inc_dirs, lib_dirs):
-+ if host_platform in {'win32', 'cygwin', 'qnx6'}:
-+ return None
-+
-+ libs = []
-+ library_dirs = []
-+ includes_dirs = []
-+
-+ # Latest glibc has moved Sun RPC headers into tircp and nsl sub
-+ # directories. rpc code has been moved to libtirpc.
-+ rpcsvc_inc = find_file(
-+ 'rpcsvc/yp_prot.h', inc_dirs,
-+ ['/usr/local/include/nsl', '/usr/include/nsl']
-+ )
-+ rpc_inc = find_file(
-+ 'rpc/rpc.h', inc_dirs,
-+ ['/usr/local/include/tirpc', '/usr/include/tirpc']
-+ )
-+ if rpcsvc_inc is None or rpc_inc is None:
-+ # not found
-+ return None
-+ includes_dirs.extend(rpcsvc_inc)
-+ includes_dirs.extend(rpc_inc)
-+
-+ if self.compiler.find_library_file(lib_dirs, 'nsl'):
-+ libs.append('nsl')
-+ else:
-+ # libnsl-devel: check for libnsl in nsl/ subdirectory
-+ nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs]
-+ libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
-+ if libnsl is not None:
-+ library_dirs.append(os.path.dirname(libnsl))
-+ libs.append('nsl')
-+
-+ if self.compiler.find_library_file(lib_dirs, 'tirpc'):
-+ libs.append('tirpc')
-+
-+ return Extension(
-+ 'nis', ['nismodule.c'],
-+ libraries=libs,
-+ library_dirs=library_dirs,
-+ include_dirs=includes_dirs
-+ )
-+
-+
- class PyBuildInstall(install):
- # Suppress the warning about installation into the lib_dynload
- # directory, which is not in sys.path when running Python during
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
deleted file mode 100644
index c5d768b..0000000
--- a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-diff --git a/Include/Python.h b/Include/Python.h
-index dd595ea5e4c..1feb1531cc9 100644
---- a/Include/Python.h
-+++ b/Include/Python.h
-@@ -35,6 +35,9 @@
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif
-+#ifdef HAVE_CRYPT_H
-+#include <crypt.h>
-+#endif
-
- /* For size_t? */
- #ifdef HAVE_STDDEF_H
-diff --git a/configure.ac b/configure.ac
-index 03b0f501aff..15ef872a53a 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -2041,7 +2041,7 @@ dnl AC_MSG_RESULT($cpp_type)
-
- # checks for header files
- AC_HEADER_STDC
--AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
-+AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \
- fcntl.h grp.h \
- ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \
- sched.h shadow.h signal.h stropts.h termios.h \
-
diff --git a/python37.spec b/python37.spec
index 5961cf0..adfd31a 100644
--- a/python37.spec
+++ b/python37.spec
@@ -13,12 +13,12 @@ URL:
https://www.python.org/
# Second alpha
-%global prerel a4
+%global prerel b1
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.6.%{?prerel}%{?dist}
+Release: 0.7.%{?prerel}%{?dist}
License: Python
@@ -356,31 +356,10 @@ Patch251: 00251-change-user-install-location.patch
# Reported upstream:
http://bugs.python.org/issue29804
Patch264: 00264-skip-test-failing-on-aarch64.patch
-# 00273 #
-# Skip test_float_with_comma, which fails in Koji with UnicodeDecodeError
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
-Patch273: 00273-skip-float-test.patch
-
# 00274 #
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00289 #
-# Fix the compilation of the nis module, as glibc removed the
-# interfaces related to Sun RPC and they are now provided
-# by libtirpc and libnsl2.
-# See:
https://fedoraproject.org/wiki/Changes/SunRPCRemoval
-# and
https://fedoraproject.org/wiki/Changes/NISIPv6
-# Fixed upstream:
https://bugs.python.org/issue32521
-Patch289: 00289-fix-nis-compilation.patch
-
-# 00290 #
-# Not every target system may provide a crypt() function in its stdlibc
-# and may use an external or replacement library, like libxcrypt, for
-# providing such functions.
-# Fixed upstream:
https://bugs.python.org/issue32635
-Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
-
# 00291 #
# Build fails with undefined references to dlopen / dlsym otherwise.
# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
@@ -686,10 +665,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch264 -p1
%endif
-%patch273 -p1
%patch274 -p1
-%patch289 -p1
-%patch290 -p1
%patch291 -p1
@@ -1227,6 +1203,7 @@ CheckPython optimized
%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
+%{dynload_dir}/_contextvars.%{SOABI_optimized}.so
%{dynload_dir}/_crypt.%{SOABI_optimized}.so
%{dynload_dir}/_csv.%{SOABI_optimized}.so
%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
@@ -1248,11 +1225,13 @@ CheckPython optimized
%{dynload_dir}/_opcode.%{SOABI_optimized}.so
%{dynload_dir}/_pickle.%{SOABI_optimized}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
+%{dynload_dir}/_queue.%{SOABI_optimized}.so
%{dynload_dir}/_random.%{SOABI_optimized}.so
%{dynload_dir}/_socket.%{SOABI_optimized}.so
%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
%{dynload_dir}/_ssl.%{SOABI_optimized}.so
%{dynload_dir}/_struct.%{SOABI_optimized}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
%{dynload_dir}/array.%{SOABI_optimized}.so
%{dynload_dir}/audioop.%{SOABI_optimized}.so
%{dynload_dir}/binascii.%{SOABI_optimized}.so
@@ -1490,6 +1469,7 @@ CheckPython optimized
%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
+%{dynload_dir}/_contextvars.%{SOABI_debug}.so
%{dynload_dir}/_crypt.%{SOABI_debug}.so
%{dynload_dir}/_csv.%{SOABI_debug}.so
%{dynload_dir}/_ctypes.%{SOABI_debug}.so
@@ -1511,11 +1491,13 @@ CheckPython optimized
%{dynload_dir}/_opcode.%{SOABI_debug}.so
%{dynload_dir}/_pickle.%{SOABI_debug}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
+%{dynload_dir}/_queue.%{SOABI_debug}.so
%{dynload_dir}/_random.%{SOABI_debug}.so
%{dynload_dir}/_socket.%{SOABI_debug}.so
%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
%{dynload_dir}/_ssl.%{SOABI_debug}.so
%{dynload_dir}/_struct.%{SOABI_debug}.so
+%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
%{dynload_dir}/array.%{SOABI_debug}.so
%{dynload_dir}/audioop.%{SOABI_debug}.so
%{dynload_dir}/binascii.%{SOABI_debug}.so
@@ -1592,6 +1574,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Mon Feb 12 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.7.0-0.7.b1
+- Update to 3.7.0b1
+
* Fri Feb 09 2018 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.7.0-0.6.a4
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
commit 10ba826cb615a4b7f4666e353b5283d2206fc89e
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 23 17:18:20 2018 +0100
Synced patch for libxcrypt with upstream
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
index 38aa7de..c5d768b 100644
--- a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+++ b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
@@ -1,45 +1,28 @@
-From bb9a8332e54fd6d2b0d4767b55c7df9a36ad3022 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
-Date: Sun, 21 Jan 2018 18:55:31 +0100
-Subject: [PATCH] cryptmodule: Include <crypt.h> for declaration of crypt() if
- needed
-
-Not every target system may provide a crypt() function in its stdlibc
-and may use an external or replacement library, like libxcrypt, for
-providing such functions.
----
- Modules/_cryptmodule.c | 4 ++++
- configure.ac | 2 +-
- 2 files changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c
-index 58d179e6a3..0031037b64 100644
---- a/Modules/_cryptmodule.c
-+++ b/Modules/_cryptmodule.c
-@@ -5,6 +5,10 @@
-
- #include <sys/types.h>
-
-+#if defined(HAVE_CRYPT_H)
+diff --git a/Include/Python.h b/Include/Python.h
+index dd595ea5e4c..1feb1531cc9 100644
+--- a/Include/Python.h
++++ b/Include/Python.h
+@@ -35,6 +35,9 @@
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif
++#ifdef HAVE_CRYPT_H
+#include <crypt.h>
+#endif
-+
- /* Module crypt */
- /*[clinic input]
+ /* For size_t? */
+ #ifdef HAVE_STDDEF_H
diff --git a/configure.ac b/configure.ac
-index 39e2e8e769..79397a7a24 100644
+index 03b0f501aff..15ef872a53a 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -2049,7 +2049,7 @@ AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
+@@ -2041,7 +2041,7 @@ dnl AC_MSG_RESULT($cpp_type)
+
+ # checks for header files
+ AC_HEADER_STDC
+-AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
++AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \
fcntl.h grp.h \
ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \
sched.h shadow.h signal.h stropts.h termios.h \
--unistd.h utime.h \
-+unistd.h crypt.h utime.h \
- poll.h sys/devpoll.h sys/epoll.h sys/poll.h \
- sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \
- sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \
---
-2.16.1
-
+
diff --git a/python37.spec b/python37.spec
index 5e898b4..5961cf0 100644
--- a/python37.spec
+++ b/python37.spec
@@ -378,7 +378,7 @@ Patch289: 00289-fix-nis-compilation.patch
# Not every target system may provide a crypt() function in its stdlibc
# and may use an external or replacement library, like libxcrypt, for
# providing such functions.
-# Reported upstream:
https://bugs.python.org/issue32635
+# Fixed upstream:
https://bugs.python.org/issue32635
Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
# 00291 #
commit d3af3ef92c9437fcf73170772d67a8b968bbddb9
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Tue Jan 23 15:25:04 2018 +0100
Add patch to explicitly link _ctypes module with -ldl (#1537489)
Add patch to explicitly link _ctypes module with -ldl (#1537489)
Refactored patch for libxcrypt
Re-enable strict symbol checks in the link editor
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
index be62939..38aa7de 100644
--- a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+++ b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
@@ -1,4 +1,4 @@
-From 6811089dbf34a2cef9799e1cb6d63b863b58739f Mon Sep 17 00:00:00 2001
+From bb9a8332e54fd6d2b0d4767b55c7df9a36ad3022 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
Date: Sun, 21 Jan 2018 18:55:31 +0100
Subject: [PATCH] cryptmodule: Include <crypt.h> for declaration of crypt() if
@@ -9,18 +9,18 @@ and may use an external or replacement library, like libxcrypt, for
providing such functions.
---
Modules/_cryptmodule.c | 4 ++++
- configure.ac | 4 ++++
- 2 files changed, 8 insertions(+)
+ configure.ac | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c
-index 58d179e6a3..bb26d83f55 100644
+index 58d179e6a3..0031037b64 100644
--- a/Modules/_cryptmodule.c
+++ b/Modules/_cryptmodule.c
@@ -5,6 +5,10 @@
#include <sys/types.h>
-+#if defined(HAVE_XCRYPT)
++#if defined(HAVE_CRYPT_H)
+#include <crypt.h>
+#endif
+
@@ -28,20 +28,18 @@ index 58d179e6a3..bb26d83f55 100644
/*[clinic input]
diff --git a/configure.ac b/configure.ac
-index 39e2e8e769..129c198c15 100644
+index 39e2e8e769..79397a7a24 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -2816,6 +2816,10 @@ LIBS="$withval $LIBS"
-
- PKG_PROG_PKG_CONFIG
-
-+# Check for libxcrypt is present.
-+PKG_CHECK_MODULES([libxcrypt], libxcrypt,
-+ AC_DEFINE([HAVE_XCRYPT], 1, [Define to 1 if libxcrypt is found.]), [])
-+
- # Check for use of the system expat library
- AC_MSG_CHECKING(for --with-system-expat)
- AC_ARG_WITH(system_expat,
+@@ -2049,7 +2049,7 @@ AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
+ fcntl.h grp.h \
+ ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \
+ sched.h shadow.h signal.h stropts.h termios.h \
+-unistd.h utime.h \
++unistd.h crypt.h utime.h \
+ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \
+ sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \
+ sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \
--
-2.16.0
+2.16.1
diff --git a/00291-setup-Link-ctypes-against-dl-explicitly.patch
b/00291-setup-Link-ctypes-against-dl-explicitly.patch
new file mode 100644
index 0000000..4bf4801
--- /dev/null
+++ b/00291-setup-Link-ctypes-against-dl-explicitly.patch
@@ -0,0 +1,25 @@
+From aae2ef0bace0e38f4ee5aaa4642aa32450a84216 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Tue, 23 Jan 2018 14:43:43 +0100
+Subject: [PATCH] setup: Link ctypes against dl explicitly
+
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index c23628a2a9..9e40bb53e6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1935,7 +1935,7 @@ class PyBuildExt(build_ext):
+ self.use_system_libffi = False
+ include_dirs = []
+ extra_compile_args = []
+- extra_link_args = []
++ extra_link_args = ['-ldl']
+ sources = ['_ctypes/_ctypes.c',
+ '_ctypes/callbacks.c',
+ '_ctypes/callproc.c',
+--
+2.16.1
+
diff --git a/python37.spec b/python37.spec
index a31689d..5e898b4 100644
--- a/python37.spec
+++ b/python37.spec
@@ -167,11 +167,6 @@ License: Python
# on files that test invalid syntax.
%undefine py_auto_byte_compile
-# Disable strict symbol checks in the link editor.
-# See:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af192613e1beec3...
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
-%undefine _strict_symbol_defs_build
-
# For multilib support, files that are different between 32- and 64-bit arches
# need different filenames. Use "64" or "32" according to the word
size.
# Currently, the best way to determine an architecture's word size happens to
@@ -386,6 +381,12 @@ Patch289: 00289-fix-nis-compilation.patch
# Reported upstream:
https://bugs.python.org/issue32635
Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+# 00291 #
+# Build fails with undefined references to dlopen / dlsym otherwise.
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
+# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
+Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -689,6 +690,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch274 -p1
%patch289 -p1
%patch290 -p1
+%patch291 -p1
# Remove files that should be generated by the build
commit 221978fced637390618d95a14b1eb0efa806d0ce
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 23 13:22:12 2018 +0100
Disable strict symbol checks in the link editor.
diff --git a/python37.spec b/python37.spec
index c9b3b12..a31689d 100644
--- a/python37.spec
+++ b/python37.spec
@@ -167,6 +167,11 @@ License: Python
# on files that test invalid syntax.
%undefine py_auto_byte_compile
+# Disable strict symbol checks in the link editor.
+# See:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af192613e1beec3...
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
+%undefine _strict_symbol_defs_build
+
# For multilib support, files that are different between 32- and 64-bit arches
# need different filenames. Use "64" or "32" according to the word
size.
# Currently, the best way to determine an architecture's word size happens to
@@ -378,6 +383,7 @@ Patch289: 00289-fix-nis-compilation.patch
# Not every target system may provide a crypt() function in its stdlibc
# and may use an external or replacement library, like libxcrypt, for
# providing such functions.
+# Reported upstream:
https://bugs.python.org/issue32635
Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
# (New patches go here ^^^)
commit 212f3d7eb8d9663bd56b2cdfa7067f4e57d83673
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Mon Jan 22 21:10:32 2018 +0100
Add patch for libxcrypt
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
new file mode 100644
index 0000000..be62939
--- /dev/null
+++ b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
@@ -0,0 +1,47 @@
+From 6811089dbf34a2cef9799e1cb6d63b863b58739f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Jan 2018 18:55:31 +0100
+Subject: [PATCH] cryptmodule: Include <crypt.h> for declaration of crypt() if
+ needed
+
+Not every target system may provide a crypt() function in its stdlibc
+and may use an external or replacement library, like libxcrypt, for
+providing such functions.
+---
+ Modules/_cryptmodule.c | 4 ++++
+ configure.ac | 4 ++++
+ 2 files changed, 8 insertions(+)
+
+diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c
+index 58d179e6a3..bb26d83f55 100644
+--- a/Modules/_cryptmodule.c
++++ b/Modules/_cryptmodule.c
+@@ -5,6 +5,10 @@
+
+ #include <sys/types.h>
+
++#if defined(HAVE_XCRYPT)
++#include <crypt.h>
++#endif
++
+ /* Module crypt */
+
+ /*[clinic input]
+diff --git a/configure.ac b/configure.ac
+index 39e2e8e769..129c198c15 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2816,6 +2816,10 @@ LIBS="$withval $LIBS"
+
+ PKG_PROG_PKG_CONFIG
+
++# Check for libxcrypt is present.
++PKG_CHECK_MODULES([libxcrypt], libxcrypt,
++ AC_DEFINE([HAVE_XCRYPT], 1, [Define to 1 if libxcrypt is found.]), [])
++
+ # Check for use of the system expat library
+ AC_MSG_CHECKING(for --with-system-expat)
+ AC_ARG_WITH(system_expat,
+--
+2.16.0
+
diff --git a/python37.spec b/python37.spec
index 8681ba0..c9b3b12 100644
--- a/python37.spec
+++ b/python37.spec
@@ -374,6 +374,12 @@ Patch274: 00274-fix-arch-names.patch
# Fixed upstream:
https://bugs.python.org/issue32521
Patch289: 00289-fix-nis-compilation.patch
+# 00290 #
+# Not every target system may provide a crypt() function in its stdlibc
+# and may use an external or replacement library, like libxcrypt, for
+# providing such functions.
+Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -676,6 +682,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch273 -p1
%patch274 -p1
%patch289 -p1
+%patch290 -p1
# Remove files that should be generated by the build
commit 8ab3c20b1a6d30636a3c590edf383159439c2f24
Author: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
Date: Thu Jan 18 19:41:19 2018 +0100
R: gdbm-devel R: gdbm for python3-libs
Signed-off-by: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
diff --git a/python37.spec b/python37.spec
index bd552d0..8681ba0 100644
--- a/python37.spec
+++ b/python37.spec
@@ -461,7 +461,7 @@ Requires: glibc%{?_isa} >= 2.24.90-26
%if %{with gdbm}
# When built with this (as guarded by the BuildRequires above), require it
-Requires: gdbm-devel%{?_isa} >= 1:1.13
+Requires: gdbm%{?_isa} >= 1:1.13
%endif
# For backward compatibility only, remove in F29:
commit 60eff5e20777179bc3272a99baf8c2f23595caa2
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jan 17 11:48:11 2018 +0100
Require large enough gdbm (fixup for previous commit)
diff --git a/python37.spec b/python37.spec
index 4ca9d39..bd552d0 100644
--- a/python37.spec
+++ b/python37.spec
@@ -459,6 +459,11 @@ Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1410644
Requires: glibc%{?_isa} >= 2.24.90-26
+%if %{with gdbm}
+# When built with this (as guarded by the BuildRequires above), require it
+Requires: gdbm-devel%{?_isa} >= 1:1.13
+%endif
+
# For backward compatibility only, remove in F29:
Provides: system-python-libs = %{version}-%{release}
Provides: system-python-libs%{?_isa} = %{version}-%{release}
commit 13f7a0acb91a9218e45bf88388a48773fc07b338
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 16 20:36:17 2018 +0100
Rebuild for reverted gdbm 1:1.13 on F27
diff --git a/python37.spec b/python37.spec
index 5cc18bc..4ca9d39 100644
--- a/python37.spec
+++ b/python37.spec
@@ -194,7 +194,7 @@ BuildRequires: expat-devel
BuildRequires: findutils
BuildRequires: gcc-c++
%if %{with gdbm}
-BuildRequires: gdbm-devel
+BuildRequires: gdbm-devel >= 1:1.13
%endif
BuildRequires: glibc-devel
BuildRequires: gmp-devel
commit 0b33e0cf27cf8edce3d8ff13f1f98718ca83f2fa
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Dec 4 17:53:50 2017 +0100
Remove a ppc64 segfault workaround which provided a larger stack for that arch, as it
doesn't seem to affect the build anymore.
diff --git a/python37.spec b/python37.spec
index c99f34a..5cc18bc 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1050,14 +1050,6 @@ done
# Running the upstream test suite
# ======================================================
-# For ppc64 we need a larger stack than default
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1292462
-%ifarch %{power64}
- ulimit -a
- ulimit -s 16384
-%endif
-
-
topdir=$(pwd)
CheckPython() {
ConfName=$1
commit 3dcb34959e11920c4141e25f38a1ee73169b534b
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Nov 29 16:46:46 2017 +0100
Masc two macros in comments that were expanded.
Remove the commented out file for the time shared library.
diff --git a/python37.spec b/python37.spec
index 52118c0..c99f34a 100644
--- a/python37.spec
+++ b/python37.spec
@@ -269,7 +269,7 @@ Patch1: 00001-rpath.patch
# 00102 #
# Change the various install paths to use /usr/lib64/ instead or /usr/lib
-# Only used when "%{_lib}" == "lib64"
+# Only used when "%%{_lib}" == "lib64"
# Not yet sent upstream.
Patch102: 00102-lib64.patch
@@ -1260,7 +1260,6 @@ CheckPython optimized
%{dynload_dir}/spwd.%{SOABI_optimized}.so
%{dynload_dir}/syslog.%{SOABI_optimized}.so
%{dynload_dir}/termios.%{SOABI_optimized}.so
-#%{dynload_dir}/time.%{SOABI_optimized}.so
%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
%{dynload_dir}/_uuid.%{SOABI_optimized}.so
@@ -1524,7 +1523,6 @@ CheckPython optimized
%{dynload_dir}/spwd.%{SOABI_debug}.so
%{dynload_dir}/syslog.%{SOABI_debug}.so
%{dynload_dir}/termios.%{SOABI_debug}.so
-#%{dynload_dir}/time.%{SOABI_debug}.so
%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
%{dynload_dir}/unicodedata.%{SOABI_debug}.so
%{dynload_dir}/_uuid.%{SOABI_debug}.so
@@ -1564,7 +1562,7 @@ CheckPython optimized
# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
#
-# The /usr/lib/rpm/redhat/macros defines %__debug_package to use
+# The /usr/lib/rpm/redhat/macros defines %%__debug_package to use
# debugfiles.list, and it appears that everything below /usr/lib/debug and
# (/usr/src/debug) gets added to this file (via LISTFILES) in
# /usr/lib/rpm/find-debuginfo.sh
commit 6f9a91b6423b66131d58620352c249595922ad3e
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Nov 29 16:32:41 2017 +0100
Remove python-gdb.py source file as it now gets installed from the upstream sources
diff --git a/python-gdb.py b/python-gdb.py
deleted file mode 100644
index dd6d462..0000000
--- a/python-gdb.py
+++ /dev/null
@@ -1,1380 +0,0 @@
-#!/usr/bin/python
-'''
-From gdb 7 onwards, gdb's build can be configured --with-python, allowing gdb
-to be extended with Python code e.g. for library-specific data visualizations,
-such as for the C++ STL types. Documentation on this API can be seen at:
-http://sourceware.org/gdb/current/onlinedocs/gdb/Python-API.html
-
-
-This python module deals with the case when the process being debugged (the
-"inferior process" in gdb parlance) is itself python, or more specifically,
-linked against libpython. In this situation, almost every item of data is a
-(PyObject*), and having the debugger merely print their addresses is not very
-enlightening.
-
-This module embeds knowledge about the implementation details of libpython so
-that we can emit useful visualizations e.g. a string, a list, a dict, a frame
-giving file/line information and the state of local variables
-
-In particular, given a gdb.Value corresponding to a PyObject* in the inferior
-process, we can generate a "proxy value" within the gdb process. For example,
-given a PyObject* in the inferior process that is in fact a PyListObject*
-holding three PyObject* that turn out to be PyBytesObject* instances, we can
-generate a proxy value within the gdb process that is a list of bytes
-instances:
- [b"foo", b"bar", b"baz"]
-
-Doing so can be expensive for complicated graphs of objects, and could take
-some time, so we also have a "write_repr" method that writes a representation
-of the data to a file-like object. This allows us to stop the traversal by
-having the file-like object raise an exception if it gets too much data.
-
-With both "proxyval" and "write_repr" we keep track of the set of all
addresses
-visited so far in the traversal, to avoid infinite recursion due to cycles in
-the graph of object references.
-
-We try to defer gdb.lookup_type() invocations for python types until as late as
-possible: for a dynamically linked python binary, when the process starts in
-the debugger, the libpython.so hasn't been dynamically loaded yet, so none of
-the type names are known to the debugger
-
-The module also extends gdb with some python-specific commands.
-'''
-from __future__ import with_statement
-import gdb
-
-# Look up the gdb.Type for some standard types:
-_type_char_ptr = gdb.lookup_type('char').pointer() # char*
-_type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned
char*
-_type_void_ptr = gdb.lookup_type('void').pointer() # void*
-_type_size_t = gdb.lookup_type('size_t')
-
-SIZEOF_VOID_P = _type_void_ptr.sizeof
-
-
-Py_TPFLAGS_HEAPTYPE = (1L << 9)
-
-Py_TPFLAGS_INT_SUBCLASS = (1L << 23)
-Py_TPFLAGS_LONG_SUBCLASS = (1L << 24)
-Py_TPFLAGS_LIST_SUBCLASS = (1L << 25)
-Py_TPFLAGS_TUPLE_SUBCLASS = (1L << 26)
-Py_TPFLAGS_BYTES_SUBCLASS = (1L << 27)
-Py_TPFLAGS_UNICODE_SUBCLASS = (1L << 28)
-Py_TPFLAGS_DICT_SUBCLASS = (1L << 29)
-Py_TPFLAGS_BASE_EXC_SUBCLASS = (1L << 30)
-Py_TPFLAGS_TYPE_SUBCLASS = (1L << 31)
-
-
-MAX_OUTPUT_LEN=1024
-
-class NullPyObjectPtr(RuntimeError):
- pass
-
-
-def safety_limit(val):
- # Given a integer value from the process being debugged, limit it to some
- # safety threshold so that arbitrary breakage within said process doesn't
- # break the gdb process too much (e.g. sizes of iterations, sizes of lists)
- return min(val, 1000)
-
-
-def safe_range(val):
- # As per range, but don't trust the value too much: cap it to a safety
- # threshold in case the data was corrupted
- return xrange(safety_limit(val))
-
-
-class StringTruncated(RuntimeError):
- pass
-
-class TruncatedStringIO(object):
- '''Similar to cStringIO, but can truncate the output by raising a
- StringTruncated exception'''
- def __init__(self, maxlen=None):
- self._val = ''
- self.maxlen = maxlen
-
- def write(self, data):
- if self.maxlen:
- if len(data) + len(self._val) > self.maxlen:
- # Truncation:
- self._val += data[0:self.maxlen - len(self._val)]
- raise StringTruncated()
-
- self._val += data
-
- def getvalue(self):
- return self._val
-
-class PyObjectPtr(object):
- """
- Class wrapping a gdb.Value that's a either a (PyObject*) within the
- inferior process, or some subclass pointer e.g. (PyBytesObject*)
-
- There will be a subclass for every refined PyObject type that we care
- about.
-
- Note that at every stage the underlying pointer could be NULL, point
- to corrupt data, etc; this is the debugger, after all.
- """
- _typename = 'PyObject'
-
- def __init__(self, gdbval, cast_to=None):
- if cast_to:
- self._gdbval = gdbval.cast(cast_to)
- else:
- self._gdbval = gdbval
-
- def field(self, name):
- '''
- Get the gdb.Value for the given field within the PyObject, coping with
- some python 2 versus python 3 differences.
-
- Various libpython types are defined using the "PyObject_HEAD" and
- "PyObject_VAR_HEAD" macros.
-
- In Python 2, this these are defined so that "ob_type" and (for a var
- object) "ob_size" are fields of the type in question.
-
- In Python 3, this is defined as an embedded PyVarObject type thus:
- PyVarObject ob_base;
- so that the "ob_size" field is located insize the "ob_base"
field, and
- the "ob_type" is most easily accessed by casting back to a
(PyObject*).
- '''
- if self.is_null():
- raise NullPyObjectPtr(self)
-
- if name == 'ob_type':
- pyo_ptr = self._gdbval.cast(PyObjectPtr.get_gdb_type())
- return pyo_ptr.dereference()[name]
-
- if name == 'ob_size':
- pyo_ptr = self._gdbval.cast(PyVarObjectPtr.get_gdb_type())
- return pyo_ptr.dereference()[name]
-
- # General case: look it up inside the object:
- return self._gdbval.dereference()[name]
-
- def pyop_field(self, name):
- '''
- Get a PyObjectPtr for the given PyObject* field within this PyObject,
- coping with some python 2 versus python 3 differences.
- '''
- return PyObjectPtr.from_pyobject_ptr(self.field(name))
-
- def write_field_repr(self, name, out, visited):
- '''
- Extract the PyObject* field named "name", and write its representation
- to file-like object "out"
- '''
- field_obj = self.pyop_field(name)
- field_obj.write_repr(out, visited)
-
- def get_truncated_repr(self, maxlen):
- '''
- Get a repr-like string for the data, but truncate it at "maxlen" bytes
- (ending the object graph traversal as soon as you do)
- '''
- out = TruncatedStringIO(maxlen)
- try:
- self.write_repr(out, set())
- except StringTruncated:
- # Truncation occurred:
- return out.getvalue() + '...(truncated)'
-
- # No truncation occurred:
- return out.getvalue()
-
- def type(self):
- return PyTypeObjectPtr(self.field('ob_type'))
-
- def is_null(self):
- return 0 == long(self._gdbval)
-
- def is_optimized_out(self):
- '''
- Is the value of the underlying PyObject* visible to the debugger?
-
- This can vary with the precise version of the compiler used to build
- Python, and the precise version of gdb.
-
- See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=556975 with
- PyEval_EvalFrameEx's "f"
- '''
- return self._gdbval.is_optimized_out
-
- def safe_tp_name(self):
- try:
- return self.type().field('tp_name').string()
- except NullPyObjectPtr:
- # NULL tp_name?
- return 'unknown'
- except RuntimeError:
- # Can't even read the object at all?
- return 'unknown'
-
- def proxyval(self, visited):
- '''
- Scrape a value from the inferior process, and try to represent it
- within the gdb process, whilst (hopefully) avoiding crashes when
- the remote data is corrupt.
-
- Derived classes will override this.
-
- For example, a PyIntObject* with ob_ival 42 in the inferior process
- should result in an int(42) in this process.
-
- visited: a set of all gdb.Value pyobject pointers already visited
- whilst generating this value (to guard against infinite recursion when
- visiting object graphs with loops). Analogous to Py_ReprEnter and
- Py_ReprLeave
- '''
-
- class FakeRepr(object):
- """
- Class representing a non-descript PyObject* value in the inferior
- process for when we don't have a custom scraper, intended to have
- a sane repr().
- """
-
- def __init__(self, tp_name, address):
- self.tp_name = tp_name
- self.address = address
-
- def __repr__(self):
- # For the NULL pointer, we have no way of knowing a type, so
- # special-case it as per
- #
http://bugs.python.org/issue8032#msg100882
- if self.address == 0:
- return '0x0'
- return '<%s at remote 0x%x>' % (self.tp_name,
self.address)
-
- return FakeRepr(self.safe_tp_name(),
- long(self._gdbval))
-
- def write_repr(self, out, visited):
- '''
- Write a string representation of the value scraped from the inferior
- process to "out", a file-like object.
- '''
- # Default implementation: generate a proxy value and write its repr
- # However, this could involve a lot of work for complicated objects,
- # so for derived classes we specialize this
- return out.write(repr(self.proxyval(visited)))
-
- @classmethod
- def subclass_from_type(cls, t):
- '''
- Given a PyTypeObjectPtr instance wrapping a gdb.Value that's a
- (PyTypeObject*), determine the corresponding subclass of PyObjectPtr
- to use
-
- Ideally, we would look up the symbols for the global types, but that
- isn't working yet:
- (gdb) python print gdb.lookup_symbol('PyList_Type')[0].value
- Traceback (most recent call last):
- File "<string>", line 1, in <module>
- NotImplementedError: Symbol type not yet supported in Python scripts.
- Error while executing Python code.
-
- For now, we use tp_flags, after doing some string comparisons on the
- tp_name for some special-cases that don't seem to be visible through
- flags
- '''
- try:
- tp_name = t.field('tp_name').string()
- tp_flags = int(t.field('tp_flags'))
- except RuntimeError:
- # Handle any kind of error e.g. NULL ptrs by simply using the base
- # class
- return cls
-
- #print 'tp_flags = 0x%08x' % tp_flags
- #print 'tp_name = %r' % tp_name
-
- name_map = {'bool': PyBoolObjectPtr,
- 'classobj': PyClassObjectPtr,
- 'instance': PyInstanceObjectPtr,
- 'NoneType': PyNoneStructPtr,
- 'frame': PyFrameObjectPtr,
- 'set' : PySetObjectPtr,
- 'frozenset' : PySetObjectPtr,
- 'builtin_function_or_method' : PyCFunctionObjectPtr,
- }
- if tp_name in name_map:
- return name_map[tp_name]
-
- if tp_flags & Py_TPFLAGS_HEAPTYPE:
- return HeapTypeObjectPtr
-
- if tp_flags & Py_TPFLAGS_INT_SUBCLASS:
- return PyIntObjectPtr
- if tp_flags & Py_TPFLAGS_LONG_SUBCLASS:
- return PyLongObjectPtr
- if tp_flags & Py_TPFLAGS_LIST_SUBCLASS:
- return PyListObjectPtr
- if tp_flags & Py_TPFLAGS_TUPLE_SUBCLASS:
- return PyTupleObjectPtr
- if tp_flags & Py_TPFLAGS_BYTES_SUBCLASS:
- return PyBytesObjectPtr
- if tp_flags & Py_TPFLAGS_UNICODE_SUBCLASS:
- return PyUnicodeObjectPtr
- if tp_flags & Py_TPFLAGS_DICT_SUBCLASS:
- return PyDictObjectPtr
- if tp_flags & Py_TPFLAGS_BASE_EXC_SUBCLASS:
- return PyBaseExceptionObjectPtr
- #if tp_flags & Py_TPFLAGS_TYPE_SUBCLASS:
- # return PyTypeObjectPtr
-
- # Use the base class:
- return cls
-
- @classmethod
- def from_pyobject_ptr(cls, gdbval):
- '''
- Try to locate the appropriate derived class dynamically, and cast
- the pointer accordingly.
- '''
- try:
- p = PyObjectPtr(gdbval)
- cls = cls.subclass_from_type(p.type())
- return cls(gdbval, cast_to=cls.get_gdb_type())
- except RuntimeError:
- # Handle any kind of error e.g. NULL ptrs by simply using the base
- # class
- pass
- return cls(gdbval)
-
- @classmethod
- def get_gdb_type(cls):
- return gdb.lookup_type(cls._typename).pointer()
-
- def as_address(self):
- return long(self._gdbval)
-
-class PyVarObjectPtr(PyObjectPtr):
- _typename = 'PyVarObject'
-
-class ProxyAlreadyVisited(object):
- '''
- Placeholder proxy to use when protecting against infinite recursion due to
- loops in the object graph.
-
- Analogous to the values emitted by the users of Py_ReprEnter and Py_ReprLeave
- '''
- def __init__(self, rep):
- self._rep = rep
-
- def __repr__(self):
- return self._rep
-
-
-def _write_instance_repr(out, visited, name, pyop_attrdict, address):
- '''Shared code for use by old-style and new-style classes:
- write a representation to file-like object "out"'''
- out.write('<')
- out.write(name)
-
- # Write dictionary of instance attributes:
- if isinstance(pyop_attrdict, PyDictObjectPtr):
- out.write('(')
- first = True
- for pyop_arg, pyop_val in pyop_attrdict.iteritems():
- if not first:
- out.write(', ')
- first = False
- out.write(pyop_arg.proxyval(visited))
- out.write('=')
- pyop_val.write_repr(out, visited)
- out.write(')')
- out.write(' at remote 0x%x>' % address)
-
-
-class InstanceProxy(object):
-
- def __init__(self, cl_name, attrdict, address):
- self.cl_name = cl_name
- self.attrdict = attrdict
- self.address = address
-
- def __repr__(self):
- if isinstance(self.attrdict, dict):
- kwargs = ', '.join(["%s=%r" % (arg, val)
- for arg, val in self.attrdict.iteritems()])
- return '<%s(%s) at remote 0x%x>' % (self.cl_name,
- kwargs, self.address)
- else:
- return '<%s at remote 0x%x>' % (self.cl_name,
- self.address)
-
-def _PyObject_VAR_SIZE(typeobj, nitems):
- return ( ( typeobj.field('tp_basicsize') +
- nitems * typeobj.field('tp_itemsize') +
- (SIZEOF_VOID_P - 1)
- ) & ~(SIZEOF_VOID_P - 1)
- ).cast(_type_size_t)
-
-class HeapTypeObjectPtr(PyObjectPtr):
- _typename = 'PyObject'
-
- def get_attr_dict(self):
- '''
- Get the PyDictObject ptr representing the attribute dictionary
- (or None if there's a problem)
- '''
- try:
- typeobj = self.type()
- dictoffset = int_from_int(typeobj.field('tp_dictoffset'))
- if dictoffset != 0:
- if dictoffset < 0:
- type_PyVarObject_ptr =
gdb.lookup_type('PyVarObject').pointer()
- tsize =
int_from_int(self._gdbval.cast(type_PyVarObject_ptr)['ob_size'])
- if tsize < 0:
- tsize = -tsize
- size = _PyObject_VAR_SIZE(typeobj, tsize)
- dictoffset += size
- assert dictoffset > 0
- assert dictoffset % SIZEOF_VOID_P == 0
-
- dictptr = self._gdbval.cast(_type_char_ptr) + dictoffset
- PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer()
- dictptr = dictptr.cast(PyObjectPtrPtr)
- return PyObjectPtr.from_pyobject_ptr(dictptr.dereference())
- except RuntimeError:
- # Corrupt data somewhere; fail safe
- pass
-
- # Not found, or some kind of error:
- return None
-
- def proxyval(self, visited):
- '''
- Support for new-style classes.
-
- Currently we just locate the dictionary using a transliteration to
- python of _PyObject_GetDictPtr, ignoring descriptors
- '''
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('<...>')
- visited.add(self.as_address())
-
- pyop_attr_dict = self.get_attr_dict()
- if pyop_attr_dict:
- attr_dict = pyop_attr_dict.proxyval(visited)
- else:
- attr_dict = {}
- tp_name = self.safe_tp_name()
-
- # New-style class:
- return InstanceProxy(tp_name, attr_dict, long(self._gdbval))
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('<...>')
- return
- visited.add(self.as_address())
-
- pyop_attrdict = self.get_attr_dict()
- _write_instance_repr(out, visited,
- self.safe_tp_name(), pyop_attrdict, self.as_address())
-
-class ProxyException(Exception):
- def __init__(self, tp_name, args):
- self.tp_name = tp_name
- self.args = args
-
- def __repr__(self):
- return '%s%r' % (self.tp_name, self.args)
-
-class PyBaseExceptionObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyBaseExceptionObject* i.e. an exception
- within the process being debugged.
- """
- _typename = 'PyBaseExceptionObject'
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('(...)')
- visited.add(self.as_address())
- arg_proxy = self.pyop_field('args').proxyval(visited)
- return ProxyException(self.safe_tp_name(),
- arg_proxy)
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('(...)')
- return
- visited.add(self.as_address())
-
- out.write(self.safe_tp_name())
- self.write_field_repr('args', out, visited)
-
-class PyClassObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyClassObject* i.e. a <classobj>
- instance within the process being debugged.
- """
- _typename = 'PyClassObject'
-
-
-class BuiltInFunctionProxy(object):
- def __init__(self, ml_name):
- self.ml_name = ml_name
-
- def __repr__(self):
- return "<built-in function %s>" % self.ml_name
-
-class BuiltInMethodProxy(object):
- def __init__(self, ml_name, pyop_m_self):
- self.ml_name = ml_name
- self.pyop_m_self = pyop_m_self
-
- def __repr__(self):
- return ('<built-in method %s of %s object at remote 0x%x>'
- % (self.ml_name,
- self.pyop_m_self.safe_tp_name(),
- self.pyop_m_self.as_address())
- )
-
-class PyCFunctionObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyCFunctionObject*
- (see Include/methodobject.h and Objects/methodobject.c)
- """
- _typename = 'PyCFunctionObject'
-
- def proxyval(self, visited):
- m_ml = self.field('m_ml') # m_ml is a (PyMethodDef*)
- ml_name = m_ml['ml_name'].string()
-
- pyop_m_self = self.pyop_field('m_self')
- if pyop_m_self.is_null():
- return BuiltInFunctionProxy(ml_name)
- else:
- return BuiltInMethodProxy(ml_name, pyop_m_self)
-
-
-class PyCodeObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyCodeObject* i.e. a <code> instance
- within the process being debugged.
- """
- _typename = 'PyCodeObject'
-
- def addr2line(self, addrq):
- '''
- Get the line number for a given bytecode offset
-
- Analogous to PyCode_Addr2Line; translated from pseudocode in
- Objects/lnotab_notes.txt
- '''
- co_lnotab = self.pyop_field('co_lnotab').proxyval(set())
-
- # Initialize lineno to co_firstlineno as per PyCode_Addr2Line
- # not 0, as lnotab_notes.txt has it:
- lineno = int_from_int(self.field('co_firstlineno'))
-
- addr = 0
- for addr_incr, line_incr in zip(co_lnotab[::2], co_lnotab[1::2]):
- addr += ord(addr_incr)
- if addr > addrq:
- return lineno
- lineno += ord(line_incr)
- return lineno
-
-
-class PyDictObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyDictObject* i.e. a dict instance
- within the process being debugged.
- """
- _typename = 'PyDictObject'
-
- def iteritems(self):
- '''
- Yields a sequence of (PyObjectPtr key, PyObjectPtr value) pairs,
- analagous to dict.iteritems()
- '''
- for i in safe_range(self.field('ma_mask') + 1):
- ep = self.field('ma_table') + i
- pyop_value = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
- if not pyop_value.is_null():
- pyop_key = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
- yield (pyop_key, pyop_value)
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('{...}')
- visited.add(self.as_address())
-
- result = {}
- for pyop_key, pyop_value in self.iteritems():
- proxy_key = pyop_key.proxyval(visited)
- proxy_value = pyop_value.proxyval(visited)
- result[proxy_key] = proxy_value
- return result
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('{...}')
- return
- visited.add(self.as_address())
-
- out.write('{')
- first = True
- for pyop_key, pyop_value in self.iteritems():
- if not first:
- out.write(', ')
- first = False
- pyop_key.write_repr(out, visited)
- out.write(': ')
- pyop_value.write_repr(out, visited)
- out.write('}')
-
-class PyInstanceObjectPtr(PyObjectPtr):
- _typename = 'PyInstanceObject'
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('<...>')
- visited.add(self.as_address())
-
- # Get name of class:
- in_class = self.pyop_field('in_class')
- cl_name = in_class.pyop_field('cl_name').proxyval(visited)
-
- # Get dictionary of instance attributes:
- in_dict = self.pyop_field('in_dict').proxyval(visited)
-
- # Old-style class:
- return InstanceProxy(cl_name, in_dict, long(self._gdbval))
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('<...>')
- return
- visited.add(self.as_address())
-
- # Old-style class:
-
- # Get name of class:
- in_class = self.pyop_field('in_class')
- cl_name = in_class.pyop_field('cl_name').proxyval(visited)
-
- # Get dictionary of instance attributes:
- pyop_in_dict = self.pyop_field('in_dict')
-
- _write_instance_repr(out, visited,
- cl_name, pyop_in_dict, self.as_address())
-
-class PyListObjectPtr(PyObjectPtr):
- _typename = 'PyListObject'
-
- def __getitem__(self, i):
- # Get the gdb.Value for the (PyObject*) with the given index:
- field_ob_item = self.field('ob_item')
- return field_ob_item[i]
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('[...]')
- visited.add(self.as_address())
-
- result = [PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
- for i in safe_range(int_from_int(self.field('ob_size')))]
- return result
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('[...]')
- return
- visited.add(self.as_address())
-
- out.write('[')
- for i in safe_range(int_from_int(self.field('ob_size'))):
- if i > 0:
- out.write(', ')
- element = PyObjectPtr.from_pyobject_ptr(self[i])
- element.write_repr(out, visited)
- out.write(']')
-
-class PyLongObjectPtr(PyObjectPtr):
- _typename = 'PyLongObject'
-
- def proxyval(self, visited):
- '''
- Python's Include/longobjrep.h has this declaration:
- struct _longobject {
- PyObject_VAR_HEAD
- digit ob_digit[1];
- };
-
- with this description:
- The absolute value of a number is equal to
- SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
- Negative numbers are represented with ob_size < 0;
- zero is represented by ob_size == 0.
-
- where SHIFT can be either:
- #define PyLong_SHIFT 30
- #define PyLong_SHIFT 15
- '''
- ob_size = long(self.field('ob_size'))
- if ob_size == 0:
- return 0L
-
- ob_digit = self.field('ob_digit')
-
- if gdb.lookup_type('digit').sizeof == 2:
- SHIFT = 15L
- else:
- SHIFT = 30L
-
- digits = [long(ob_digit[i]) * 2**(SHIFT*i)
- for i in safe_range(abs(ob_size))]
- result = sum(digits)
- if ob_size < 0:
- result = -result
- return result
-
-class PyBoolObjectPtr(PyLongObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyBoolObject* i.e. one of the two
- <bool> instances (Py_True/Py_False) within the process being debugged.
- """
- def proxyval(self, visited):
- if PyLongObjectPtr.proxyval(self, visited):
- return True
- else:
- return False
-
-class PyNoneStructPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyObject* pointing to the
- singleton (we hope) _Py_NoneStruct with ob_type PyNone_Type
- """
- _typename = 'PyObject'
-
- def proxyval(self, visited):
- return None
-
-
-class PyFrameObjectPtr(PyObjectPtr):
- _typename = 'PyFrameObject'
-
- def __init__(self, gdbval, cast_to):
- PyObjectPtr.__init__(self, gdbval, cast_to)
-
- if not self.is_optimized_out():
- self.co = PyCodeObjectPtr.from_pyobject_ptr(self.field('f_code'))
- self.co_name = self.co.pyop_field('co_name')
- self.co_filename = self.co.pyop_field('co_filename')
-
- self.f_lineno = int_from_int(self.field('f_lineno'))
- self.f_lasti = int_from_int(self.field('f_lasti'))
- self.co_nlocals = int_from_int(self.co.field('co_nlocals'))
- self.co_varnames =
PyTupleObjectPtr.from_pyobject_ptr(self.co.field('co_varnames'))
-
- def iter_locals(self):
- '''
- Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
- the local variables of this frame
- '''
- if self.is_optimized_out():
- return
-
- f_localsplus = self.field('f_localsplus')
- for i in safe_range(self.co_nlocals):
- pyop_value = PyObjectPtr.from_pyobject_ptr(f_localsplus[i])
- if not pyop_value.is_null():
- pyop_name = PyObjectPtr.from_pyobject_ptr(self.co_varnames[i])
- yield (pyop_name, pyop_value)
-
- def iter_globals(self):
- '''
- Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
- the global variables of this frame
- '''
- if self.is_optimized_out():
- return
-
- pyop_globals = self.pyop_field('f_globals')
- return pyop_globals.iteritems()
-
- def iter_builtins(self):
- '''
- Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
- the builtin variables
- '''
- if self.is_optimized_out():
- return
-
- pyop_builtins = self.pyop_field('f_builtins')
- return pyop_builtins.iteritems()
-
- def get_var_by_name(self, name):
- '''
- Look for the named local variable, returning a (PyObjectPtr, scope) pair
- where scope is a string 'local', 'global', 'builtin'
-
- If not found, return (None, None)
- '''
- for pyop_name, pyop_value in self.iter_locals():
- if name == pyop_name.proxyval(set()):
- return pyop_value, 'local'
- for pyop_name, pyop_value in self.iter_globals():
- if name == pyop_name.proxyval(set()):
- return pyop_value, 'global'
- for pyop_name, pyop_value in self.iter_builtins():
- if name == pyop_name.proxyval(set()):
- return pyop_value, 'builtin'
- return None, None
-
- def filename(self):
- '''Get the path of the current Python source file, as a
string'''
- if self.is_optimized_out():
- return '(frame information optimized out)'
- return self.co_filename.proxyval(set())
-
- def current_line_num(self):
- '''Get current line number as an integer (1-based)
-
- Translated from PyFrame_GetLineNumber and PyCode_Addr2Line
-
- See Objects/lnotab_notes.txt
- '''
- if self.is_optimized_out():
- return None
- f_trace = self.field('f_trace')
- if long(f_trace) != 0:
- # we have a non-NULL f_trace:
- return self.f_lineno
- else:
- #try:
- return self.co.addr2line(self.f_lasti)
- #except ValueError:
- # return self.f_lineno
-
- def current_line(self):
- '''Get the text of the current source line as a string, with a
trailing
- newline character'''
- if self.is_optimized_out():
- return '(frame information optimized out)'
- with open(self.filename(), 'r') as f:
- all_lines = f.readlines()
- # Convert from 1-based current_line_num to 0-based list offset:
- return all_lines[self.current_line_num()-1]
-
- def write_repr(self, out, visited):
- if self.is_optimized_out():
- out.write('(frame information optimized out)')
- return
- out.write('Frame 0x%x, for file %s, line %i, in %s ('
- % (self.as_address(),
- self.co_filename.proxyval(visited),
- self.current_line_num(),
- self.co_name.proxyval(visited)))
- first = True
- for pyop_name, pyop_value in self.iter_locals():
- if not first:
- out.write(', ')
- first = False
-
- out.write(pyop_name.proxyval(visited))
- out.write('=')
- pyop_value.write_repr(out, visited)
-
- out.write(')')
-
-class PySetObjectPtr(PyObjectPtr):
- _typename = 'PySetObject'
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('%s(...)' % self.safe_tp_name())
- visited.add(self.as_address())
-
- members = []
- table = self.field('table')
- for i in safe_range(self.field('mask')+1):
- setentry = table[i]
- key = setentry['key']
- if key != 0:
- key_proxy = PyObjectPtr.from_pyobject_ptr(key).proxyval(visited)
- if key_proxy != '<dummy key>':
- members.append(key_proxy)
- if self.safe_tp_name() == 'frozenset':
- return frozenset(members)
- else:
- return set(members)
-
- def write_repr(self, out, visited):
- out.write(self.safe_tp_name())
-
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('(...)')
- return
- visited.add(self.as_address())
-
- out.write('([')
- first = True
- table = self.field('table')
- for i in safe_range(self.field('mask')+1):
- setentry = table[i]
- key = setentry['key']
- if key != 0:
- pyop_key = PyObjectPtr.from_pyobject_ptr(key)
- key_proxy = pyop_key.proxyval(visited) # FIXME!
- if key_proxy != '<dummy key>':
- if not first:
- out.write(', ')
- first = False
- pyop_key.write_repr(out, visited)
- out.write('])')
-
-
-class PyBytesObjectPtr(PyObjectPtr):
- _typename = 'PyBytesObject'
-
- def __str__(self):
- field_ob_size = self.field('ob_size')
- field_ob_sval = self.field('ob_sval')
- char_ptr = field_ob_sval.address.cast(_type_unsigned_char_ptr)
- return ''.join([chr(char_ptr[i]) for i in safe_range(field_ob_size)])
-
- def proxyval(self, visited):
- return str(self)
-
-class PyTupleObjectPtr(PyObjectPtr):
- _typename = 'PyTupleObject'
-
- def __getitem__(self, i):
- # Get the gdb.Value for the (PyObject*) with the given index:
- field_ob_item = self.field('ob_item')
- return field_ob_item[i]
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('(...)')
- visited.add(self.as_address())
-
- result = tuple([PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
- for i in
safe_range(int_from_int(self.field('ob_size')))])
- return result
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('(...)')
- return
- visited.add(self.as_address())
-
- out.write('(')
- for i in safe_range(int_from_int(self.field('ob_size'))):
- if i > 0:
- out.write(', ')
- element = PyObjectPtr.from_pyobject_ptr(self[i])
- element.write_repr(out, visited)
- if self.field('ob_size') == 1:
- out.write(',)')
- else:
- out.write(')')
-
-class PyTypeObjectPtr(PyObjectPtr):
- _typename = 'PyTypeObject'
-
-
-class PyUnicodeObjectPtr(PyObjectPtr):
- _typename = 'PyUnicodeObject'
-
- def proxyval(self, visited):
- # From unicodeobject.h:
- # Py_ssize_t length; /* Length of raw Unicode data in buffer */
- # Py_UNICODE *str; /* Raw Unicode buffer */
- field_length = long(self.field('length'))
- field_str = self.field('str')
-
- # Gather a list of ints from the Py_UNICODE array; these are either
- # UCS-2 or UCS-4 code points:
- Py_UNICODEs = [int(field_str[i]) for i in safe_range(field_length)]
-
- # Convert the int code points to unicode characters, and generate a
- # local unicode instance:
- result = u''.join([unichr(ucs) for ucs in Py_UNICODEs])
- return result
-
-
-def int_from_int(gdbval):
- return int(str(gdbval))
-
-
-def stringify(val):
- # TODO: repr() puts everything on one line; pformat can be nicer, but
- # can lead to v.long results; this function isolates the choice
- if True:
- return repr(val)
- else:
- from pprint import pformat
- return pformat(val)
-
-
-class PyObjectPtrPrinter:
- "Prints a (PyObject*)"
-
- def __init__ (self, gdbval):
- self.gdbval = gdbval
-
- def to_string (self):
- pyop = PyObjectPtr.from_pyobject_ptr(self.gdbval)
- if True:
- return pyop.get_truncated_repr(MAX_OUTPUT_LEN)
- else:
- # Generate full proxy value then stringify it.
- # Doing so could be expensive
- proxyval = pyop.proxyval(set())
- return stringify(proxyval)
-
-def pretty_printer_lookup(gdbval):
- type = gdbval.type.unqualified()
- if type.code == gdb.TYPE_CODE_PTR:
- type = type.target().unqualified()
- t = str(type)
- if t in ("PyObject", "PyFrameObject",
"PyUnicodeObject"):
- return PyObjectPtrPrinter(gdbval)
-
-"""
-During development, I've been manually invoking the code in this way:
-(gdb) python
-
-import sys
-sys.path.append('/home/david/coding/python-gdb')
-import libpython
-end
-
-then reloading it after each edit like this:
-(gdb) python reload(libpython)
-
-The following code should ensure that the prettyprinter is registered
-if the code is autoloaded by gdb when visiting libpython.so, provided
-that this python file is installed to the same path as the library (or its
-.debug file) plus a "-gdb.py" suffix, e.g:
- /usr/lib/libpython2.6.so.1.0-gdb.py
- /usr/lib/debug/usr/lib/libpython2.6.so.1.0.debug-gdb.py
-"""
-def register (obj):
- if obj == None:
- obj = gdb
-
- # Wire up the pretty-printer
- obj.pretty_printers.append(pretty_printer_lookup)
-
-register (gdb.current_objfile ())
-
-
-class Frame(object):
- '''
- Wrapper for gdb.Frame, adding various methods
- '''
- def __init__(self, gdbframe):
- self._gdbframe = gdbframe
-
- def older(self):
- older = self._gdbframe.older()
- if older:
- return Frame(older)
- else:
- return None
-
- def newer(self):
- newer = self._gdbframe.newer()
- if newer:
- return Frame(newer)
- else:
- return None
-
- def select(self):
- self._gdbframe.select()
-
- def get_index(self):
- '''Calculate index of frame, starting at 0 for the newest frame
within
- this thread'''
- index = 0
- # Go down until you reach the newest frame:
- iter_frame = self
- while iter_frame.newer():
- index += 1
- iter_frame = iter_frame.newer()
- return index
-
- def is_evalframeex(self):
- if self._gdbframe.function():
- if self._gdbframe.function().name == 'PyEval_EvalFrameEx':
- '''
- I believe we also need to filter on the inline
- struct frame_id.inline_depth, only regarding frames with
- an inline depth of 0 as actually being this function
-
- So we reject those with type gdb.INLINE_FRAME
- '''
- if self._gdbframe.type() == gdb.NORMAL_FRAME:
- # We have a PyEval_EvalFrameEx frame:
- return True
-
- return False
-
- def get_pyop(self):
- try:
- f = self._gdbframe.read_var('f')
- return PyFrameObjectPtr.from_pyobject_ptr(f)
- except ValueError:
- return None
-
- @classmethod
- def get_selected_frame(cls):
- _gdbframe = gdb.selected_frame()
- if _gdbframe:
- return Frame(_gdbframe)
- return None
-
- @classmethod
- def get_selected_python_frame(cls):
- '''Try to obtain the Frame for the python code in the selected
frame,
- or None'''
- frame = cls.get_selected_frame()
-
- while frame:
- if frame.is_evalframeex():
- return frame
- frame = frame.older()
-
- # Not found:
- return None
-
- def print_summary(self):
- if self.is_evalframeex():
- pyop = self.get_pyop()
- if pyop:
- sys.stdout.write('#%i %s\n' % (self.get_index(),
pyop.get_truncated_repr(MAX_OUTPUT_LEN)))
- sys.stdout.write(pyop.current_line())
- else:
- sys.stdout.write('#%i (unable to read python frame
information)\n' % self.get_index())
- else:
- sys.stdout.write('#%i\n' % self.get_index())
-
-class PyList(gdb.Command):
- '''List the current Python source code, if any
-
- Use
- py-list START
- to list at a different line number within the python source.
-
- Use
- py-list START, END
- to list a specific range of lines within the python source.
- '''
-
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-list",
- gdb.COMMAND_FILES,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- import re
-
- start = None
- end = None
-
- m = re.match(r'\s*(\d+)\s*', args)
- if m:
- start = int(m.group(0))
- end = start + 10
-
- m = re.match(r'\s*(\d+)\s*,\s*(\d+)\s*', args)
- if m:
- start, end = map(int, m.groups())
-
- frame = Frame.get_selected_python_frame()
- if not frame:
- print 'Unable to locate python frame'
- return
-
- pyop = frame.get_pyop()
- if not pyop:
- print 'Unable to read information on python frame'
- return
-
- filename = pyop.filename()
- lineno = pyop.current_line_num()
-
- if start is None:
- start = lineno - 5
- end = lineno + 5
-
- if start<1:
- start = 1
-
- with open(filename, 'r') as f:
- all_lines = f.readlines()
- # start and end are 1-based, all_lines is 0-based;
- # so [start-1:end] as a python slice gives us [start, end] as a
- # closed interval
- for i, line in enumerate(all_lines[start-1:end]):
- linestr = str(i+start)
- # Highlight current line:
- if i + start == lineno:
- linestr = '>' + linestr
- sys.stdout.write('%4s %s' % (linestr, line))
-
-
-# ...and register the command:
-PyList()
-
-def move_in_stack(move_up):
- '''Move up or down the stack (for the py-up/py-down
command)'''
- frame = Frame.get_selected_python_frame()
- while frame:
- if move_up:
- iter_frame = frame.older()
- else:
- iter_frame = frame.newer()
-
- if not iter_frame:
- break
-
- if iter_frame.is_evalframeex():
- # Result:
- iter_frame.select()
- iter_frame.print_summary()
- return
-
- frame = iter_frame
-
- if move_up:
- print 'Unable to find an older python frame'
- else:
- print 'Unable to find a newer python frame'
-
-class PyUp(gdb.Command):
- 'Select and print the python stack frame that called this one (if any)'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-up",
- gdb.COMMAND_STACK,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- move_in_stack(move_up=True)
-
-PyUp()
-
-class PyDown(gdb.Command):
- 'Select and print the python stack frame called by this one (if any)'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-down",
- gdb.COMMAND_STACK,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- move_in_stack(move_up=False)
-
-PyDown()
-
-class PyBacktrace(gdb.Command):
- 'Display the current python frame and all the frames within its call stack (if
any)'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-bt",
- gdb.COMMAND_STACK,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- frame = Frame.get_selected_python_frame()
- while frame:
- if frame.is_evalframeex():
- frame.print_summary()
- frame = frame.older()
-
-PyBacktrace()
-
-class PyPrint(gdb.Command):
- 'Look up the given python variable name, and print it'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-print",
- gdb.COMMAND_DATA,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- name = str(args)
-
- frame = Frame.get_selected_python_frame()
- if not frame:
- print 'Unable to locate python frame'
- return
-
- pyop_frame = frame.get_pyop()
- if not pyop_frame:
- print 'Unable to read information on python frame'
- return
-
- pyop_var, scope = pyop_frame.get_var_by_name(name)
-
- if pyop_var:
- print ('%s %r = %s'
- % (scope,
- name,
- pyop_var.get_truncated_repr(MAX_OUTPUT_LEN)))
- else:
- print '%r not found' % name
-
-PyPrint()
-
-class PyLocals(gdb.Command):
- 'Look up the given python variable name, and print it'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-locals",
- gdb.COMMAND_DATA,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- name = str(args)
-
- frame = Frame.get_selected_python_frame()
- if not frame:
- print 'Unable to locate python frame'
- return
-
- pyop_frame = frame.get_pyop()
- if not pyop_frame:
- print 'Unable to read information on python frame'
- return
-
- for pyop_name, pyop_value in pyop_frame.iter_locals():
- print ('%s = %s'
- % (pyop_name.proxyval(set()),
- pyop_value.get_truncated_repr(MAX_OUTPUT_LEN)))
-
-PyLocals()
commit 31d212b3c7fa592942d18607d1146c189936e754
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Nov 29 16:09:30 2017 +0100
Remove our downstream systemtap instrumentation as now upstream provides us with
dtrace hooks.
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
deleted file mode 100644
index a48fe7c..0000000
--- a/00055-systemtap.patch
+++ /dev/null
@@ -1,762 +0,0 @@
-diff -up Python-3.3.0rc2/configure.ac.systemtap Python-3.3.0rc2/configure.ac
---- Python-3.3.0rc2/configure.ac.systemtap 2012-09-09 05:11:14.000000000 -0400
-+++ Python-3.3.0rc2/configure.ac 2012-09-10 09:17:21.114511781 -0400
-@@ -2678,6 +2678,23 @@ if test "$with_valgrind" != no; then
- OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
- fi
-
-+# Check for systemtap support
-+# On Linux, /usr/bin/dtrace is in fact a shim to SystemTap
-+AC_MSG_CHECKING([for --with-systemtap])
-+AC_ARG_WITH([systemtap],
-+ AC_HELP_STRING([--with(out)-systemtap], [disable/enable SystemTap
support]),,
-+ with_systemtap=no)
-+AC_MSG_RESULT([$with_systemtap])
-+if test "$with_systemtap" != no; then
-+ AC_DEFINE(WITH_SYSTEMTAP, 1,
-+ [Define if you want to compile in SystemTap support])
-+ SYSTEMTAPOBJS="Python/pysystemtap.o"
-+ SYSTEMTAPDEPS="\$(srcdir)/Python/pysystemtap.h"
-+fi
-+
-+AC_SUBST(SYSTEMTAPOBJS)
-+AC_SUBST(SYSTEMTAPDEPS)
-+
- # -I${DLINCLDIR} is added to the compile rule for importdl.o
- AC_SUBST(DLINCLDIR)
- DLINCLDIR=.
-diff -up Python-3.3.0rc2/Doc/howto/index.rst.systemtap
Python-3.3.0rc2/Doc/howto/index.rst
---- Python-3.3.0rc2/Doc/howto/index.rst.systemtap 2012-09-09 05:10:51.000000000 -0400
-+++ Python-3.3.0rc2/Doc/howto/index.rst 2012-09-10 09:17:21.117511779 -0400
-@@ -29,4 +29,5 @@ Currently, the HOWTOs are:
- argparse.rst
- ipaddress.rst
- clinic.rst
-+ instrumentation.rst
-
-diff -up Python-3.3.0rc2/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0rc2/Doc/howto/instrumentation.rst
---- Python-3.3.0rc2/Doc/howto/instrumentation.rst.systemtap 2012-09-10 09:17:21.117511779
-0400
-+++ Python-3.3.0rc2/Doc/howto/instrumentation.rst 2012-09-10 09:17:21.117511779 -0400
-@@ -0,0 +1,295 @@
-+.. _instrumentation:
-+
-+====================================
-+Instrumenting CPython with SystemTap
-+====================================
-+
-+:author: David Malcolm <dmalcolm(a)redhat.com>
-+
-+DTrace and SystemTap are monitoring tools, each providing a way to inspect
-+what the processes on a computer system are doing. They both use
-+domain-specific languages allowing a user to write scripts which:
-+
-+ - filter which processes are to be observed
-+ - gather data from the processes of interest
-+ - generate reports on the data
-+
-+As of Python 3.3, CPython can be built with embedded "markers" that can be
-+observed by a SystemTap script, making it easier to monitor what the CPython
-+processes on a system are doing.
-+
-+.. Potentially this document could be expanded to also cover DTrace markers.
-+ However, I'm not a DTrace expert.
-+
-+.. I'm using ".. code-block:: c" for SystemTap scripts, as "c"
is syntactically
-+ the closest match that Sphinx supports
-+
-+
-+Enabling the static markers
-+---------------------------
-+
-+In order to build CPython with the embedded markers for SystemTap, the
-+SystemTap development tools must be installed.
-+
-+On a Fedora or Red Hat Enterprise Linux machine, this can be done via::
-+
-+ yum install systemtap-sdt-devel
-+
-+CPython must then be configured `--with-systemtap`::
-+
-+ checking for --with-systemtap... yes
-+
-+You can verify if the SystemTap static markers are present in the built
-+binary by seeing if it contains a ".note.stapsdt" section.
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -S ./python | grep .note.stapsdt
-+ [29] .note.stapsdt NOTE 0000000000000000 00308d78 000000b8 0 0
0 4
-+
-+If you've built python as a shared library (with --enable-shared), you need
-+to look instead within the shared library. For example:
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt
-+ [28] .note.stapsdt NOTE 0000000000000000 00365b68 000000b8 0 0
0 4
-+
-+Earlier versions of SystemTap stored the markers in a ".probes" section.
-+
-+For the curious, you can see the metadata for the static markers using this
-+invocation.
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -x .note.stapsdt ./python
-+
-+ Hex dump of section [29] '.note.stapsdt', 184 bytes at offset 0x308d78:
-+ 0x00000000 08000000 45000000 03000000 73746170 ....E.......stap
-+ 0x00000010 73647400 d4664b00 00000000 4fc36600 sdt..fK.....O.f.
-+ 0x00000020 00000000 488d9000 00000000 70797468 ....H.......pyth
-+ 0x00000030 6f6e0066 756e6374 696f6e5f 5f656e74 on.function__ent
-+ 0x00000040 72790038 40257261 78203840 25726478 ry.8@%rax 8@%rdx
-+ 0x00000050 202d3440 25656378 00000000 08000000 -4@%ecx........
-+ 0x00000060 46000000 03000000 73746170 73647400 F.......stapsdt.
-+ 0x00000070 0d674b00 00000000 4fc36600 00000000 .gK.....O.f.....
-+ 0x00000080 4a8d9000 00000000 70797468 6f6e0066 J.......python.f
-+ 0x00000090 756e6374 696f6e5f 5f726574 75726e00 unction__return.
-+ 0x000000a0 38402572 61782038 40257264 78202d34 8@%rax 8@%rdx -4
-+ 0x000000b0 40256563 78000000 @%ecx...
-+
-+and a sufficiently modern eu-readelf can print the metadata:
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -n ./python
-+
-+ Note section [ 1] '.note.gnu.build-id' of 36 bytes at offset 0x190:
-+ Owner Data size Type
-+ GNU 20 GNU_BUILD_ID
-+ Build ID: a28f8db1b224530b0d38ad7b82a249cf7c3f18d6
-+
-+ Note section [27] '.note.stapsdt' of 184 bytes at offset 0x1ae884:
-+ Owner Data size Type
-+ stapsdt 70 Version: 3
-+ PC: 0xe0d3a, Base: 0x14b150, Semaphore: 0x3ae882
-+ Provider: python, Name: function__return, Args: '8@%rbx 8@%r13 -4@%eax'
-+ stapsdt 69 Version: 3
-+ PC: 0xe0f37, Base: 0x14b150, Semaphore: 0x3ae880
-+ Provider: python, Name: function__entry, Args: '8@%rbx 8@%r13 -4@%eax'
-+
-+The above metadata contains information for SystemTap describing how it can
-+patch strategically-placed machine code instructions to enable the tracing
-+hooks used by a SystemTap script.
-+
-+
-+Static markers
-+--------------
-+
-+The low-level way to use the SystemTap integration is to use the static
-+markers directly. This requires you to explicitly state the binary file
-+containing them.
-+
-+For example, this script can be used to show the call/return hierarchy of a
-+Python script:
-+
-+.. code-block:: c
-+
-+ probe process('python').mark("function__entry") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%s => %s in %s:%d\\n",
-+ thread_indent(1), funcname, filename, lineno);
-+ }
-+
-+ probe process('python').mark("function__return") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%s <= %s in %s:%d\\n",
-+ thread_indent(-1), funcname, filename, lineno);
-+ }
-+
-+It can be invoked like this:
-+
-+.. code-block:: bash
-+
-+ $ stap \
-+ show-call-hierarchy.stp \
-+ -c ./python test.py
-+
-+The output looks like this::
-+
-+ 11408 python(8274): => __contains__ in Lib/_abcoll.py:362
-+ 11414 python(8274): => __getitem__ in Lib/os.py:425
-+ 11418 python(8274): => encode in Lib/os.py:490
-+ 11424 python(8274): <= encode in Lib/os.py:493
-+ 11428 python(8274): <= __getitem__ in Lib/os.py:426
-+ 11433 python(8274): <= __contains__ in Lib/_abcoll.py:366
-+
-+where the columns are:
-+
-+ - time in microseconds since start of script
-+
-+ - name of executable
-+
-+ - PID of process
-+
-+and the remainder indicates the call/return hierarchy as the script executes.
-+
-+For a `--enable-shared` build of CPython, the markers are contained within the
-+libpython shared library, and the probe's dotted path needs to reflect this. For
-+example, this line from the above example::
-+
-+ probe process('python').mark("function__entry") {
-+
-+should instead read::
-+
-+ probe
process('python').library("libpython3.3dm.so.1.0").mark("function__entry")
{
-+
-+(assuming a debug build of CPython 3.3)
-+
-+.. I'm reusing the "c:function" type for markers
-+
-+.. c:function:: function__entry(str filename, str funcname, int lineno)
-+
-+ This marker indicates that execution of a Python function has begun. It is
-+ only triggered for pure-python (bytecode) functions.
-+
-+ The filename, function name, and line number are provided back to the
-+ tracing script as positional arguments, which must be accessed using
-+ `$arg1`, `$arg2`:
-+
-+ * `$arg1` : `(const char *)` filename, accessible using `user_string($arg1)`
-+
-+ * `$arg2` : `(const char *)` function name, accessible using
-+ `user_string($arg2)`
-+
-+ * `$arg3` : `int` line number
-+
-+ * `$arg4` : `(PyFrameObject *)`, the frame being executed
-+
-+.. c:function:: function__return(str filename, str funcname, int lineno)
-+
-+ This marker is the converse of `function__entry`, and indicates that
-+ execution of a Python function has ended (either via ``return``, or via an
-+ exception). It is only triggered for pure-python (bytecode) functions.
-+
-+ The arguments are the same as for `function__entry`
-+
-+
-+Tapsets
-+-------
-+
-+The higher-level way to use the SystemTap integration is to use a "tapset":
-+SystemTap's equivalent of a library, which hides some of the lower-level
-+details of the static markers.
-+
-+Here is a tapset file, based on a non-shared build of CPython:
-+
-+.. code-block:: c
-+
-+ /*
-+ Provide a higher-level wrapping around the function__entry and
-+ function__return markers:
-+ */
-+ probe python.function.entry =
process("python").mark("function__entry")
-+ {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+ frameptr = $arg4
-+ }
-+ probe python.function.return =
process("python").mark("function__return")
-+ {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+ frameptr = $arg4
-+ }
-+
-+If this file is installed in SystemTap's tapset directory (e.g.
-+`/usr/share/systemtap/tapset`), then these additional probepoints become
-+available:
-+
-+.. c:function:: python.function.entry(str filename, str funcname, int lineno, frameptr)
-+
-+ This probe point indicates that execution of a Python function has begun.
-+ It is only triggered for pure-python (bytecode) functions.
-+
-+.. c:function:: python.function.return(str filename, str funcname, int lineno,
frameptr)
-+
-+ This probe point is the converse of `python.function.return`, and indicates
-+ that execution of a Python function has ended (either via ``return``, or
-+ via an exception). It is only triggered for pure-python (bytecode) functions.
-+
-+
-+Examples
-+--------
-+This SystemTap script uses the tapset above to more cleanly implement the
-+example given above of tracing the Python function-call hierarchy, without
-+needing to directly name the static markers:
-+
-+.. code-block:: c
-+
-+ probe python.function.entry
-+ {
-+ printf("%s => %s in %s:%d\n",
-+ thread_indent(1), funcname, filename, lineno);
-+ }
-+
-+ probe python.function.return
-+ {
-+ printf("%s <= %s in %s:%d\n",
-+ thread_indent(-1), funcname, filename, lineno);
-+ }
-+
-+
-+The following script uses the tapset above to provide a top-like view of all
-+running CPython code, showing the top 20 most frequently-entered bytecode
-+frames, each second, across the whole system:
-+
-+.. code-block:: c
-+
-+ global fn_calls;
-+
-+ probe python.function.entry
-+ {
-+ fn_calls[pid(), filename, funcname, lineno] += 1;
-+ }
-+
-+ probe timer.ms(1000) {
-+ printf("\033[2J\033[1;1H") /* clear screen */
-+ printf("%6s %80s %6s %30s %6s\n",
-+ "PID", "FILENAME", "LINE",
"FUNCTION", "CALLS")
-+ foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
-+ printf("%6d %80s %6d %30s %6d\n",
-+ pid, filename, lineno, funcname,
-+ fn_calls[pid, filename, funcname, lineno]);
-+ }
-+ delete fn_calls;
-+ }
-+
-diff -up Python-3.3.0rc2/Lib/test/test_systemtap.py.systemtap
Python-3.3.0rc2/Lib/test/test_systemtap.py
---- Python-3.3.0rc2/Lib/test/test_systemtap.py.systemtap 2012-09-10 09:17:21.117511779
-0400
-+++ Python-3.3.0rc2/Lib/test/test_systemtap.py 2012-09-10 09:17:21.117511779 -0400
-@@ -0,0 +1,234 @@
-+# Verify that systemtap static probes work
-+#
-+import subprocess
-+import sys
-+import sysconfig
-+import os
-+import unittest
-+
-+from test.support import run_unittest, TESTFN, unlink
-+
-+if '--with-systemtap' not in sysconfig.get_config_var('CONFIG_ARGS'):
-+ raise unittest.SkipTest("Python was not configured --with-systemtap")
-+
-+try:
-+ _, stap_version = subprocess.Popen(["stap", "-V"],
-+ stdout=subprocess.PIPE,
-+ stderr=subprocess.PIPE,
-+ ).communicate()
-+except OSError:
-+ # This is what "no stap" looks like. There may, however, be other
-+ # errors that manifest this way too.
-+ raise unittest.SkipTest("Couldn't find stap on the path")
-+
-+def invoke_systemtap_script(script, cmd):
-+ # Start a child process, probing with the given systemtap script
-+ # (passed as stdin to the "stap" tool)
-+ # The script should be a bytes instance
-+ # Return (stdout, stderr) pair
-+
-+ p = subprocess.Popen(["stap", "-", '-vv', '-c',
cmd],
-+ stdin=subprocess.PIPE,
-+ stdout=subprocess.PIPE,
-+ stderr=subprocess.PIPE)
-+ out, err = p.communicate(input=script)
-+ return out, err
-+
-+# Verify that stap can run a simple "hello world"-style script
-+# This can fail for various reasons:
-+# - missing kernel headers
-+# - permissions (a non-root user needs to be in the "stapdev" group)
-+TRIVIAL_STAP_SCRIPT = b'probe begin { println("hello world") exit ()
}'
-+
-+out, err = invoke_systemtap_script(TRIVIAL_STAP_SCRIPT, 'true')
-+if out != b'hello world\n':
-+ raise unittest.SkipTest("Test systemtap script did not run; stderr was:
%s" % err)
-+
-+# We don't expect stderr to be empty, since we're invoking stap with
"-vv": stap
-+# will (we hope) generate debugging output on stderr.
-+
-+def invoke_python_under_systemtap(script, pythoncode=None, pythonfile=None):
-+ # Start a child python process, probing with the given systemtap script
-+ # (passed as stdin to the "stap" tool)
-+ # The script should be a bytes instance
-+ # Return (stdout, stderr) pair
-+
-+ if pythonfile:
-+ pythoncmd = '%s %s' % (sys.executable, pythonfile)
-+ else:
-+ pythoncmd = '%s -c %r' % (sys.executable, pythoncode)
-+
-+ # The process tree of a stap invocation of a command goes through
-+ # something like this:
-+ # stap ->fork/exec(staprun; exec stapio ->f/e(-c cmd); exec staprun -r)
-+ # and this trip through setuid leads to LD_LIBRARY_PATH being dropped,
-+ # which would lead to an --enable-shared build of python failing to be
-+ # find its libpython, with an error like:
-+ # error while loading shared libraries: libpython3.3dm.so.1.0: cannot
-+ # open shared object file: No such file or directory
-+ # Hence we need to jump through some hoops to expose LD_LIBRARY_PATH to
-+ # the invoked python process:
-+ LD_LIBRARY_PATH = os.environ.get('LD_LIBRARY_PATH', '')
-+ if LD_LIBRARY_PATH:
-+ pythoncmd = 'env LD_LIBRARY_PATH=%s ' % LD_LIBRARY_PATH + pythoncmd
-+
-+ return invoke_systemtap_script(script, pythoncmd)
-+
-+# When using the static markers, we need to supply the prefix of a systemtap
-+# dotted probe point that containing the marker.
-+# See
http://sourceware.org/systemtap/langref/Probe_points.html
-+#
-+# We need to determine if this is a shared-library build
-+#
-+# Note that sysconfig can get this wrong; see:
-+#
http://bugs.python.org/issue14774
-+#
-+if '--enable-shared' in sysconfig.get_config_var('CONFIG_ARGS'):
-+ # For a shared-library build, the markers are in library(INSTSONAME):
-+ INSTSONAME = sysconfig.get_config_var('INSTSONAME')
-+ probe_prefix = 'process("%s").library("%s")' %
(sys.executable, INSTSONAME)
-+else:
-+ # For a non-shared-library build, we can simply use sys.executable:
-+ probe_prefix = 'process("%s")' % sys.executable
-+
-+# The following script ought to generate lots of lines showing recursive
-+# function entry and return, of the form:
-+# 11408 python(8274): => __contains__ in Lib/_abcoll.py:362
-+# 11414 python(8274): => __getitem__ in Lib/os.py:425
-+# 11418 python(8274): => encode in Lib/os.py:490
-+# 11424 python(8274): <= encode in Lib/os.py:493
-+# 11428 python(8274): <= __getitem__ in Lib/os.py:426
-+# 11433 python(8274): <= __contains__ in Lib/_abcoll.py:366
-+# where the column are:
-+# - time in microseconds since start of script
-+# - name of executable
-+# - PID of process
-+# and the remainder indicates the call/return hierarchy
-+
-+hierarchy_script = ('''
-+probe %s.mark("function__entry") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%%s => %%s in %%s:%%d\\n", thread_indent(1), funcname,
filename, lineno);
-+}
-+
-+probe %s.mark("function__return") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%%s <= %%s in %%s:%%d\\n", thread_indent(-1), funcname,
filename, lineno);
-+}
-+''' % (probe_prefix, probe_prefix)).encode('utf-8')
-+
-+
-+class ErrorDumper:
-+ # A context manager that dumps extra information if an exception is raised,
-+ # to help track down why the problem occurred
-+ def __init__(self, out, err):
-+ self.out = out
-+ self.err = err
-+
-+ def __enter__(self):
-+ pass
-+
-+ def __exit__(self, type_, value, traceback):
-+ if type_:
-+ # an exception is being raised:
-+ print('stdout: %s' % out.decode())
-+ print('stderr: %s' % err.decode())
-+
-+class SystemtapTests(unittest.TestCase):
-+
-+ def test_invoking_python(self):
-+ # Ensure that we can invoke python under stap, with a trivial stap
-+ # script:
-+ out, err = invoke_python_under_systemtap(
-+ b'probe begin { println("hello from stap") exit () }',
-+ pythoncode="print('hello from python')")
-+ with ErrorDumper(out, err):
-+ self.assertIn(b'hello from stap', out)
-+ self.assertIn(b'hello from python', out)
-+
-+ def test_function_entry(self):
-+ # Ensure that the function_entry static marker works
-+ out, err = invoke_python_under_systemtap(hierarchy_script)
-+ # stdout ought to contain various lines showing recursive function
-+ # entry and return (see above)
-+
-+ # Uncomment this for debugging purposes:
-+ # print(out.decode('utf-8'))
-+
-+ # Executing the cmdline-supplied "pass":
-+ # 0 python(8274): => <module> in <string>:1
-+ # 5 python(8274): <= <module> in <string>:1
-+ with ErrorDumper(out, err):
-+ self.assertIn(b'=> <module> in <string>:1', out,
-+ msg="stdout: %s\nstderr: %s\n" % (out, err))
-+
-+ def test_function_encoding(self):
-+ # Ensure that function names containing non-Latin 1 code
-+ # points are handled:
-+ pythonfile = TESTFN
-+ try:
-+ unlink(pythonfile)
-+ f = open(pythonfile, "wb")
-+ f.write("""
-+# Sample script with non-ASCII filename, for use by test_systemtap.py
-+# Implicitly UTF-8
-+
-+def ():
-+ '''Function with non-ASCII identifier; I believe this reads
"mojibake"'''
-+ print("hello world!")
-+
-+()
-+""".encode('utf-8'))
-+ f.close()
-+
-+ out, err = invoke_python_under_systemtap(hierarchy_script,
-+ pythonfile=pythonfile)
-+ out_utf8 = out.decode('utf-8')
-+ with ErrorDumper(out, err):
-+ self.assertIn('=> <module> in %s:5' % pythonfile,
out_utf8)
-+ self.assertIn(' => in %s:5' % pythonfile, out_utf8)
-+ self.assertIn(' <= in %s:7' % pythonfile, out_utf8)
-+ self.assertIn('<= <module> in %s:9' % pythonfile,
out_utf8)
-+ finally:
-+ unlink(pythonfile)
-+
-+ @unittest.skipIf(sys.getfilesystemencoding() == 'ascii',
-+ 'the test filename is not encodable with ASCII')
-+ def test_filename_encoding(self):
-+ # Ensure that scripts names containing non-Latin 1 code
-+ # points are handled:
-+ pythonfile = TESTFN + '_.py'
-+ try:
-+ unlink(pythonfile)
-+ f = open(pythonfile, "wb")
-+ f.write("""
-+def foo():
-+ '''Function with non-ASCII identifier; I believe this reads
"mojibake"'''
-+ print("hello world!")
-+
-+foo()
-+""".encode('utf-8'))
-+ f.close()
-+
-+ out, err = invoke_python_under_systemtap(hierarchy_script,
-+ pythonfile=pythonfile)
-+ out_utf8 = out.decode('utf-8')
-+ with ErrorDumper(out, err):
-+ self.assertIn('=> <module> in %s:2' % pythonfile,
out_utf8)
-+ self.assertIn(' => foo in %s:2' % pythonfile, out_utf8)
-+ self.assertIn(' <= foo in %s:4' % pythonfile, out_utf8)
-+ self.assertIn('<= <module> in %s:6' % pythonfile,
out_utf8)
-+ finally:
-+ unlink(pythonfile)
-+
-+def test_main():
-+ run_unittest(SystemtapTests)
-+
-+if __name__ == "__main__":
-+ test_main()
-diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap Python-3.3.0rc2/Makefile.pre.in
---- Python-3.3.0rc2/Makefile.pre.in.systemtap 2012-09-09 05:11:05.000000000 -0400
-+++ Python-3.3.0rc2/Makefile.pre.in 2012-09-10 09:19:51.195501518 -0400
-@@ -363,6 +363,7 @@ PYTHON_OBJS= \
- Python/formatter_unicode.o \
- Python/fileutils.o \
- Python/$(DYNLOADFILE) \
-+ @SYSTEMTAPOBJS@ \
- $(LIBOBJS) \
- $(MACHDEP_OBJS) \
- $(THREADOBJ)
-@@ -713,7 +714,8 @@ Objects/setobject.o: $(srcdir)/Objects/s
- $(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
- $(OPCODETARGETGEN) $(OPCODETARGETS_H)
-
--Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h
-+Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h \
-+ $(srcdir)/Python/ceval_systemtap.h @SYSTEMTAPDEPS@
-
- Python/frozen.o: Python/importlib.h Python/importlib_external.h
-
-@@ -724,6 +726,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
- Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py
- $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
Objects/typeslots.inc
-
-+# Only needed with --with-systemtap; not a public header:
-+$(srcdir)/Python/pysystemtap.h: $(srcdir)/Python/pysystemtap.d
-+ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Python/pysystemtap.d
-+
-+Python/pysystemtap.o: $(srcdir)/Python/pysystemtap.d Python/ceval.o
-+ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Python/pysystemtap.d Python/ceval.o
-+
- ############################################################################
- # Header files
-
-@@ -1345,6 +1354,7 @@ clean: pycremoval
- -rm -f Lib/lib2to3/*Grammar*.pickle
- -rm -f Programs/_testembed Programs/_freeze_importlib
- -rm -rf build
-+ -rm -f $(srcdir)/Python/pysystemtap.h
-
- profile-removal:
- find . -name '*.gc??' -exec rm -f {} ';'
-diff -up Python-3.3.0rc2/pyconfig.h.in.systemtap Python-3.3.0rc2/pyconfig.h.in
---- Python-3.3.0rc2/pyconfig.h.in.systemtap 2012-09-09 05:11:14.000000000 -0400
-+++ Python-3.3.0rc2/pyconfig.h.in 2012-09-10 09:17:21.120511781 -0400
-@@ -1306,6 +1306,9 @@
- /* Define if you want to compile in Python-specific mallocs */
- #undef WITH_PYMALLOC
-
-+/* Define if you want to compile in SystemTap support */
-+#undef WITH_SYSTEMTAP
-+
- /* Define if you want to compile in rudimentary thread support */
- #undef WITH_THREAD
-
-diff -up Python-3.3.0rc2/Python/ceval.c.systemtap Python-3.3.0rc2/Python/ceval.c
---- Python-3.3.0rc2/Python/ceval.c.systemtap 2012-09-09 05:11:12.000000000 -0400
-+++ Python-3.3.0rc2/Python/ceval.c 2012-09-10 09:17:21.122511781 -0400
-@@ -18,6 +18,8 @@
-
- #include <ctype.h>
-
-+#include "ceval_systemtap.h"
-+
- #ifndef WITH_TSC
-
- #define READ_TIMESTAMP(var)
-@@ -1160,6 +1162,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
- }
- }
-
-+ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
-+ systemtap_function_entry(f);
-+ }
-+
- co = f->f_code;
- names = co->co_names;
- consts = co->co_consts;
-@@ -3077,6 +3083,11 @@ fast_yield:
-
- /* pop frame */
- exit_eval_frame:
-+
-+ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
-+ systemtap_function_return(f);
-+ }
-+
- Py_LeaveRecursiveCall();
- f->f_executing = 0;
- tstate->frame = f->f_back;
-diff -up Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap
Python-3.3.0rc2/Python/ceval_systemtap.h
---- Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap 2012-09-10 09:17:21.122511781
-0400
-+++ Python-3.3.0rc2/Python/ceval_systemtap.h 2012-09-10 09:17:21.122511781 -0400
-@@ -0,0 +1,86 @@
-+/*
-+ Support for SystemTap static markers
-+*/
-+
-+#ifdef WITH_SYSTEMTAP
-+
-+#include "pysystemtap.h"
-+
-+/*
-+ A struct to hold all of the information gathered when one of the traceable
-+ markers is triggered
-+*/
-+struct frame_marker_info
-+{
-+ PyObject *filename_obj;
-+ PyObject *funcname_obj;
-+ const char *filename;
-+ const char *funcname;
-+ int lineno;
-+};
-+
-+static void
-+get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
-+{
-+ PyObject *ptype;
-+ PyObject *pvalue;
-+ PyObject *ptraceback;
-+
-+ PyErr_Fetch(&ptype, &pvalue, &ptraceback);
-+
-+ fmi->filename_obj = PyUnicode_EncodeFSDefault(f->f_code->co_filename);
-+ if (fmi->filename_obj) {
-+ fmi->filename = PyBytes_AsString(fmi->filename_obj);
-+ } else {
-+ fmi->filename = NULL;
-+ }
-+
-+ fmi->funcname_obj = PyUnicode_AsUTF8String(f->f_code->co_name);
-+ if (fmi->funcname_obj) {
-+ fmi->funcname = PyBytes_AsString(fmi->funcname_obj);
-+ } else {
-+ fmi->funcname = NULL;
-+ }
-+
-+ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
-+
-+ PyErr_Restore(ptype, pvalue, ptraceback);
-+
-+}
-+
-+static void
-+release_frame_marker_info(struct frame_marker_info *fmi)
-+{
-+ Py_XDECREF(fmi->filename_obj);
-+ Py_XDECREF(fmi->funcname_obj);
-+}
-+
-+static void
-+systemtap_function_entry(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.funcname, fmi.lineno, f);
-+ release_frame_marker_info(&fmi);
-+}
-+
-+static void
-+systemtap_function_return(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.funcname, fmi.lineno, f);
-+ release_frame_marker_info(&fmi);
-+}
-+
-+#else /* #ifdef WITH_SYSTEMTAP */
-+
-+/*
-+ When configured --without-systemtap, everything compiles away to nothing:
-+*/
-+#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
-+#define PYTHON_FUNCTION_RETURN_ENABLED() 0
-+#define systemtap_function_entry(f)
-+#define systemtap_function_return(f)
-+
-+#endif
-diff -up Python-3.3.0rc2/Python/pysystemtap.d.systemtap
Python-3.3.0rc2/Python/pysystemtap.d
---- Python-3.3.0rc2/Python/pysystemtap.d.systemtap 2012-09-10 09:17:21.122511781 -0400
-+++ Python-3.3.0rc2/Python/pysystemtap.d 2012-09-10 09:17:21.122511781 -0400
-@@ -0,0 +1,4 @@
-+provider python {
-+ probe function__entry(const char *, const char *, int, PyFrameObject *);
-+ probe function__return(const char *, const char *, int, PyFrameObject *);
-+};
diff --git a/libpython.stp b/libpython.stp
deleted file mode 100644
index f41da80..0000000
--- a/libpython.stp
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Systemtap tapset to make it easier to trace Python */
-
-/*
- Define python.function.entry/return:
-*/
-probe python.function.entry =
process("python3").library("LIBRARY_PATH").mark("function__entry")
-{
- filename = user_string($arg1);
- funcname = user_string($arg2);
- lineno = $arg3;
-}
-probe python.function.return =
process("python3").library("LIBRARY_PATH").mark("function__return")
-{
- filename = user_string($arg1);
- funcname = user_string($arg2);
- lineno = $arg3;
-}
diff --git a/pyfuntop.stp b/pyfuntop.stp
deleted file mode 100644
index f235a23..0000000
--- a/pyfuntop.stp
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/stap
-
-global fn_calls;
-
-probe python.function.entry
-{
- fn_calls[pid(), filename, funcname, lineno] += 1;
-}
-
-probe timer.ms(1000) {
- printf("\033[2J\033[1;1H") /* clear screen */
- printf("%6s %80s %6s %30s %6s\n",
- "PID", "FILENAME", "LINE", "FUNCTION",
"CALLS")
- foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
- printf("%6d %80s %6d %30s %6d\n",
- pid, filename, lineno, funcname,
- fn_calls[pid, filename, funcname, lineno]);
- }
-
- delete fn_calls;
-}
diff --git a/python37.spec b/python37.spec
index fee2c28..52118c0 100644
--- a/python37.spec
+++ b/python37.spec
@@ -68,9 +68,6 @@ License: Python
# Support for the GDB debugger
%bcond_without gdb_hooks
-# Support for systemtap instrumentation
-%bcond_with systemtap
-
# The dbm.gnu module (key-value database)
%bcond_without gdbm
@@ -216,12 +213,6 @@ BuildRequires: readline-devel
BuildRequires: sqlite-devel
BuildRequires: gdb
-%if %{with systemtap}
-BuildRequires: systemtap-devel
-BuildRequires: systemtap-sdt-devel
-%global tapsetdir /usr/share/systemtap/tapset
-%endif
-
BuildRequires: tar
BuildRequires: tcl-devel
BuildRequires: tix-devel
@@ -256,19 +247,6 @@ Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.
# with different Python runtimes as necessary:
Source3: macros.pybytecompile%{pybasever}
-# Systemtap tapset to make it easier to use the systemtap static probes
-# (actually a template; LIBRARY_PATH will get fixed up during install)
-# Written by dmalcolm; not yet sent upstream
-Source5: libpython.stp
-
-# Example systemtap script using the tapset
-# Written by wcohen, mjw, dmalcolm; not yet sent upstream
-Source6: systemtap-example.stp
-
-# Another example systemtap script that uses the tapset
-# Written by dmalcolm; not yet sent upstream
-Source7: pyfuntop.stp
-
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
# Written by bkabrda
@@ -289,13 +267,6 @@ Source11: idle3.appdata.xml
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: 00001-rpath.patch
-# 00055 #
-# Systemtap support: add statically-defined probe points
-# Patch sent upstream as
http://bugs.python.org/issue14776
-# with some subsequent reworking to cope with LANG=C in an rpmbuild
-# (where sys.getfilesystemencoding() == 'ascii')
-Patch55: 00055-systemtap.patch
-
# 00102 #
# Change the various install paths to use /usr/lib64/ instead or /usr/lib
# Only used when "%{_lib}" == "lib64"
@@ -662,12 +633,6 @@ version once Python %{pybasever} is stable.
%prep
%setup -q -n Python-%{version}%{?prerel}
-%if %{with systemtap}
-# Provide an example of usage of the tapset:
-cp -a %{SOURCE6} .
-cp -a %{SOURCE7} .
-%endif # with systemtap
-
# Remove bundled libraries to ensure that we're using the system copy.
rm -r Modules/expat
@@ -681,10 +646,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
#
%patch1 -p1
-%if %{with systemtap}
-%patch55 -p1 -b .systemtap
-%endif
-
%if "%{_lib}" == "lib64"
%patch102 -p1
%endif
@@ -781,9 +742,6 @@ BuildPython() {
--enable-loadable-sqlite-extensions \
--with-dtrace \
--with-lto \
-%if %{with systemtap}
- --with-systemtap \
-%endif
%if %{with valgrind}
--with-valgrind \
%endif
@@ -905,16 +863,6 @@ InstallPython() {
#endif
EOF
- # Systemtap hooks
-%if %{with systemtap}
- mkdir -p %{buildroot}%{tapsetdir}
- sed \
- -e "s|LIBRARY_PATH|%{_libdir}/${PyInstSoName}|" \
- -e 's|"python3"|"python3${Postfix}"|' \
- %{_sourcedir}/libpython.stp \
- > %{buildroot}%{tapsetdir}/libpython%{pybasever}${Postfix}-%{wordsize}.stp
-%endif # with systemtap
-
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -1408,12 +1356,6 @@ CheckPython optimized
%if %{without flatpackage}
%{_libdir}/libpython3.so
%endif
-%if %{with systemtap}
-%dir %(dirname %{tapsetdir})
-%dir %{tapsetdir}
-%{tapsetdir}/%{libpython_stp_optimized}
-%doc systemtap-example.stp pyfuntop.stp
-%endif
%if %{without flatpackage}
@@ -1594,11 +1536,6 @@ CheckPython optimized
# now; they're listed below, under "-devel":
%{_libdir}/%{py_INSTSONAME_debug}
-%if %{with systemtap}
-%dir %(dirname %{tapsetdir})
-%dir %{tapsetdir}
-%{tapsetdir}/%{libpython_stp_debug}
-%endif
# Analog of the -devel subpackage's files:
%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
diff --git a/systemtap-example.stp b/systemtap-example.stp
deleted file mode 100644
index 164333a..0000000
--- a/systemtap-example.stp
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- Example usage of the Python systemtap tapset to show a nested view of all
- Python function calls (and returns) across the whole system.
-
- Run this using
- stap systemtap-example.stp
- to instrument all Python processes on the system, or (for example) using
- stap systemtap-example.stp -c COMMAND
- to instrument a specific program (implemented in Python)
-*/
-probe python.function.entry
-{
- printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename,
lineno);
-}
-
-probe python.function.return
-{
- printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename,
lineno);
-}
commit 72d368458c8d100a5a33da8fc1361182955344a4
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Fri Feb 9 12:01:54 2018 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng(a)fedoraproject.org>
diff --git a/python37.spec b/python37.spec
index db40e3b..fee2c28 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.5.%{?prerel}%{?dist}
+Release: 0.6.%{?prerel}%{?dist}
License: Python
@@ -1645,6 +1645,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Feb 09 2018 Fedora Release Engineering <releng(a)fedoraproject.org> -
3.7.0-0.6.a4
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
* Fri Jan 26 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.7.0-0.5.a4
- Remove the python3-tools package (#rhbz 1312030)
- Move /usr/bin/2to3 to python3-devel
commit 40b8f9ece20b5f9cbaf3d2fd78a39a3158dfa0c5
Author: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
Date: Fri Feb 9 09:05:39 2018 +0100
Escape macros in %changelog
Reference:
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.o...
Signed-off-by: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
diff --git a/python3.spec b/python3.spec
index 0dc0dda..6cbcfca 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
@@ -1502,6 +1502,9 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Feb 09 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-13
+- Escape macros in %%changelog
+
* Fri Feb 02 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.4-12
- Remove sys.executable check from change-user-install-location patch
Resolves: rhbz#1532287
@@ -1775,7 +1778,7 @@ porting ssl and hashlib modules to OpenSSL 1.1.0
- Obsolete and Provide python35 package
* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
-- Update %py_byte_compile macro
+- Update %%py_byte_compile macro
- Remove unused configure flags (rhbz#1374357)
* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
commit af1dc2628db378d5086f7396efd13f86a04b0bd7
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Feb 8 14:54:08 2018 +0100
Fix the name macro in the description
diff --git a/python3.spec b/python3.spec
index 748e26d..0dc0dda 100644
--- a/python3.spec
+++ b/python3.spec
@@ -443,7 +443,7 @@ language, designed with an emphasis on code readibility.
It includes an extensive standard library, and has a vast ecosystem of
third-party libraries.
-The ${name} package provides the "python3" executable: the reference
+The %{name} package provides the "python3" executable: the reference
interpreter for the Python language, version 3.
The majority of its standard library is provided in the %{name}-libs package,
which should be installed automatically along with %{name}.
commit 08ffd081b5cd033575aaea43a56990ea76ab6248
Author: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Fri Feb 2 12:27:49 2018 +0100
Remove sys.executable check from change-user-install-location patch
Resolves: rhbz#1532287
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
index 1dcd9f2..4104449 100644
--- a/00251-change-user-install-location.patch
+++ b/00251-change-user-install-location.patch
@@ -1,19 +1,20 @@
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
-index 9d31d13..ed44a93 100644
+index 0258d3d..4ebf50a 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
-@@ -424,8 +424,18 @@ class install(Command):
+@@ -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 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):
++ # 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 = ""
@@ -24,22 +25,21 @@ index 9d31d13..ed44a93 100644
else:
if self.exec_prefix is None:
diff --git a/Lib/site.py b/Lib/site.py
-index 4744eb0..b5fe571 100644
+index 0fc9200..c95202e 100644
--- a/Lib/site.py
+++ b/Lib/site.py
-@@ -326,7 +326,15 @@ def getsitepackages(prefixes=None):
+@@ -322,7 +322,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.
++ """Add site-packages to sys.path
+
-+ '/usr/local' is included in PREFIXES if the executable is /usr/bin/python*
-+ and RPM build is not detected to make sudo pip installed packages visible.
++ '/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 sys.executable.startswith("/usr/bin/python")
-+ and 'RPM_BUILD_ROOT' not in os.environ):
++ 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):
diff --git a/python3.spec b/python3.spec
index 8765231..748e26d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
@@ -1502,6 +1502,10 @@ CheckPython optimized
# ======================================================
%changelog
+* Fri Feb 02 2018 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.4-12
+- Remove sys.executable check from change-user-install-location patch
+Resolves: rhbz#1532287
+
* Thu Feb 01 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-11
- Define TLS cipher suite on build time.
commit c86891d48830e86d86406143cf366247cea348bd
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Feb 5 17:59:56 2018 +0100
Remove obsolete scriptlets that are now automatic.
diff --git a/python37.spec b/python37.spec
index 9f1b85b..db40e3b 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1156,39 +1156,6 @@ CheckPython optimized
%endif # with tests
-# ======================================================
-# Scriptlets
-# ======================================================
-
-%if %{without flatpackage}
-
-%post libs -p /sbin/ldconfig
-
-%postun libs -p /sbin/ldconfig
-
-%posttrans
-/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
-
-%endif
-
-
-%post
-%if %{with flatpackage}
-/sbin/ldconfig
-%else
-/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
-%endif
-
-%postun
-%if %{with flatpackage}
-/sbin/ldconfig
-%else
-if [ $1 -eq 0 ] ; then
- /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
- /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
-fi
-%endif
-
%files
%defattr(-, root, root)
%license LICENSE
commit 14deb52d02decabd7dda8bcfa01e628031f03414
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Feb 5 17:50:53 2018 +0100
Remove obsolete scriptlets that are now automatic.
diff --git a/python3.spec b/python3.spec
index e9465a6..8765231 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1077,26 +1077,6 @@ CheckPython optimized
%endif # with tests
-# ======================================================
-# Scriptlets
-# ======================================================
-
-%post libs -p /sbin/ldconfig
-
-%postun libs -p /sbin/ldconfig
-
-%post
-/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
-
-%postun
-if [ $1 -eq 0 ] ; then
- /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
- /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
-fi
-
-%posttrans
-/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
-
%files
%defattr(-, root, root)
%license LICENSE
commit 969d51434e2479639d62c2b03fd51df7403eb722
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Feb 1 11:20:15 2018 +0100
Define TLS cipher suite on build time
diff --git a/00294-define-TLS-cipher-suite-on-build-time.patch
b/00294-define-TLS-cipher-suite-on-build-time.patch
new file mode 100644
index 0000000..1aa348c
--- /dev/null
+++ b/00294-define-TLS-cipher-suite-on-build-time.patch
@@ -0,0 +1,228 @@
+diff --git a/Lib/ssl.py b/Lib/ssl.py
+index 1f3a31a..b54a684 100644
+--- a/Lib/ssl.py
++++ b/Lib/ssl.py
+@@ -116,6 +116,7 @@ except ImportError:
+
+
+ from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN, HAS_TLSv1_3
++from _ssl import _DEFAULT_CIPHERS
+ from _ssl import _OPENSSL_API_VERSION
+
+
+@@ -174,48 +175,7 @@ else:
+ CHANNEL_BINDING_TYPES = []
+
+
+-# Disable weak or insecure ciphers by default
+-# (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL')
+-# Enable a better set of ciphers by default
+-# This list has been explicitly chosen to:
+-# * TLS 1.3 ChaCha20 and AES-GCM cipher suites
+-# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
+-# * Prefer ECDHE over DHE for better performance
+-# * Prefer AEAD over CBC for better performance and security
+-# * Prefer AES-GCM over ChaCha20 because most platforms have AES-NI
+-# (ChaCha20 needs OpenSSL 1.1.0 or patched 1.0.2)
+-# * Prefer any AES-GCM and ChaCha20 over any AES-CBC for better
+-# performance and security
+-# * Then Use HIGH cipher suites as a fallback
+-# * Disable NULL authentication, NULL encryption, 3DES and MD5 MACs
+-# for security reasons
+-_DEFAULT_CIPHERS = (
+- 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:'
+- 'TLS13-AES-128-GCM-SHA256:'
+- 'ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:'
+- 'ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:'
+- '!aNULL:!eNULL:!MD5:!3DES'
+- )
+-
+-# Restricted and more secure ciphers for the server side
+-# This list has been explicitly chosen to:
+-# * TLS 1.3 ChaCha20 and AES-GCM cipher suites
+-# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
+-# * Prefer ECDHE over DHE for better performance
+-# * Prefer AEAD over CBC for better performance and security
+-# * Prefer AES-GCM over ChaCha20 because most platforms have AES-NI
+-# * Prefer any AES-GCM and ChaCha20 over any AES-CBC for better
+-# performance and security
+-# * Then Use HIGH cipher suites as a fallback
+-# * Disable NULL authentication, NULL encryption, MD5 MACs, DSS, RC4, and
+-# 3DES for security reasons
+-_RESTRICTED_SERVER_CIPHERS = (
+- 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:'
+- 'TLS13-AES-128-GCM-SHA256:'
+- 'ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:'
+- 'ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:'
+- '!aNULL:!eNULL:!MD5:!DSS:!RC4:!3DES'
+-)
++_RESTRICTED_SERVER_CIPHERS = _DEFAULT_CIPHERS
+
+
+ class CertificateError(ValueError):
+@@ -389,8 +349,6 @@ class SSLContext(_SSLContext):
+
+ def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
+ self = _SSLContext.__new__(cls, protocol)
+- if protocol != _SSLv2_IF_EXISTS:
+- self.set_ciphers(_DEFAULT_CIPHERS)
+ return self
+
+ def __init__(self, protocol=PROTOCOL_TLS):
+@@ -505,8 +463,6 @@ def create_default_context(purpose=Purpose.SERVER_AUTH, *,
cafile=None,
+ # verify certs and host name in client mode
+ context.verify_mode = CERT_REQUIRED
+ context.check_hostname = True
+- elif purpose == Purpose.CLIENT_AUTH:
+- context.set_ciphers(_RESTRICTED_SERVER_CIPHERS)
+
+ if cafile or capath or cadata:
+ context.load_verify_locations(cafile, capath, cadata)
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+index 54644e1..799100c 100644
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -18,6 +18,7 @@ import asyncore
+ import weakref
+ import platform
+ import functools
++import sysconfig
+ try:
+ import ctypes
+ except ImportError:
+@@ -36,7 +37,7 @@ PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
+ HOST = support.HOST
+ IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
+ IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
+-
++PY_SSL_DEFAULT_CIPHERS = sysconfig.get_config_var('PY_SSL_DEFAULT_CIPHERS')
+
+ def data_file(*name):
+ return os.path.join(os.path.dirname(__file__), *name)
+@@ -889,6 +890,19 @@ class ContextTests(unittest.TestCase):
+ with self.assertRaisesRegex(ssl.SSLError, "No cipher can be
selected"):
+ ctx.set_ciphers("^$:,;?*'dorothyx")
+
++ @unittest.skipUnless(PY_SSL_DEFAULT_CIPHERS == 1,
++ "Test applies only to Python default ciphers")
++ def test_python_ciphers(self):
++ ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
++ ciphers = ctx.get_ciphers()
++ for suite in ciphers:
++ name = suite['name']
++ self.assertNotIn("PSK", name)
++ self.assertNotIn("SRP", name)
++ self.assertNotIn("MD5", name)
++ self.assertNotIn("RC4", name)
++ self.assertNotIn("3DES", name)
++
+ @unittest.skipIf(ssl.OPENSSL_VERSION_INFO < (1, 0, 2, 0, 0), 'OpenSSL too
old')
+ def test_get_ciphers(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+diff --git a/Modules/_ssl.c b/Modules/_ssl.c
+index df8c6a7..e23a569 100644
+--- a/Modules/_ssl.c
++++ b/Modules/_ssl.c
+@@ -206,6 +206,31 @@ SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s)
+
+ #endif /* OpenSSL < 1.1.0 or LibreSSL */
+
++/* Default cipher suites */
++#ifndef PY_SSL_DEFAULT_CIPHERS
++#define PY_SSL_DEFAULT_CIPHERS 1
++#endif
++
++#if PY_SSL_DEFAULT_CIPHERS == 0
++ #ifndef PY_SSL_DEFAULT_CIPHER_STRING
++ #error "Py_SSL_DEFAULT_CIPHERS 0 needs Py_SSL_DEFAULT_CIPHER_STRING"
++ #endif
++#elif PY_SSL_DEFAULT_CIPHERS == 1
++/* Python custom selection of sensible ciper suites
++ * DEFAULT: OpenSSL's default cipher list. Since 1.0.2 the list is in sensible
order.
++ * !aNULL:!eNULL: really no NULL ciphers
++ * !MD5:!3DES:!DES:!RC4:!IDEA:!SEED: no weak or broken algorithms on old OpenSSL
versions.
++ * !aDSS: no authentication with discrete logarithm DSA algorithm
++ * !SRP:!PSK: no secure remote password or pre-shared key authentication
++ */
++ #define PY_SSL_DEFAULT_CIPHER_STRING
"DEFAULT:!aNULL:!eNULL:!MD5:!3DES:!DES:!RC4:!IDEA:!SEED:!aDSS:!SRP:!PSK"
++#elif PY_SSL_DEFAULT_CIPHERS == 2
++/* Ignored in SSLContext constructor, only used to as _ssl.DEFAULT_CIPHER_STRING */
++ #define PY_SSL_DEFAULT_CIPHER_STRING SSL_DEFAULT_CIPHER_LIST
++#else
++ #error "Unsupported PY_SSL_DEFAULT_CIPHERS"
++#endif
++
+
+ enum py_ssl_error {
+ /* these mirror ssl.h */
+@@ -2739,7 +2764,12 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
+ /* A bare minimum cipher list without completely broken cipher suites.
+ * It's far from perfect but gives users a better head start. */
+ if (proto_version != PY_SSL_VERSION_SSL2) {
+- result = SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!eNULL:!MD5");
++#if PY_SSL_DEFAULT_CIPHERS == 2
++ /* stick to OpenSSL's default settings */
++ result = 1;
++#else
++ result = SSL_CTX_set_cipher_list(ctx, PY_SSL_DEFAULT_CIPHER_STRING);
++#endif
+ } else {
+ /* SSLv2 needs MD5 */
+ result = SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!eNULL");
+@@ -5279,6 +5309,9 @@ PyInit__ssl(void)
+ (PyObject *)&PySSLSession_Type) != 0)
+ return NULL;
+
++ PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS",
++ PY_SSL_DEFAULT_CIPHER_STRING);
++
+ PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
+ PY_SSL_ERROR_ZERO_RETURN);
+ PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
+diff --git a/configure.ac b/configure.ac
+index 7ea62f8..4b42393 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -5555,6 +5555,42 @@ if test "$have_getrandom" = yes; then
+ [Define to 1 if the getrandom() function is available])
+ fi
+
++# ssl module default cipher suite string
++AH_TEMPLATE(PY_SSL_DEFAULT_CIPHERS,
++ [Default cipher suites list for ssl module.
++ 1: Python's preferred selection, 2: leave OpenSSL defaults untouched, 0: custom
string])
++AH_TEMPLATE(PY_SSL_DEFAULT_CIPHER_STRING,
++ [Cipher suite string for PY_SSL_DEFAULT_CIPHERS=0]
++)
++AC_MSG_CHECKING(for --with-ssl-default-suites)
++AC_ARG_WITH(ssl-default-suites,
++
AS_HELP_STRING([--with-ssl-default-suites=@<:@python|openssl|STRING@:>@],
++ [Override default cipher suites string,
++ python: use Python's preferred selection (default),
++ openssl: leave OpenSSL's defaults untouched,
++ STRING: use a custom string,
++ PROTOCOL_SSLv2 ignores the setting]),
++[
++AC_MSG_RESULT($withval)
++case "$withval" in
++ python)
++ AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 1)
++ ;;
++ openssl)
++ AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 2)
++ ;;
++ *)
++ AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 0)
++ AC_DEFINE_UNQUOTED(PY_SSL_DEFAULT_CIPHER_STRING, "$withval")
++ ;;
++esac
++],
++[
++AC_MSG_RESULT(python)
++AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 1)
++])
++
++
+ # generate output files
+ AC_CONFIG_FILES(Makefile.pre Modules/Setup.config Misc/python.pc Misc/python-config.sh)
+ AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix])
diff --git a/python3.spec b/python3.spec
index f8a1509..e9465a6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
@@ -378,6 +378,14 @@ Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
# Reported upstream:
https://bugs.python.org/issue30697
Patch292: 00292-restore-PyExc_RecursionErrorInst-symbol.patch
+# 00294 #
+# Define TLS cipher suite on build time depending
+# on the OpenSSL default cipher suite selection.
+# Fixed upstream on CPython's 3.7 branch:
+#
https://bugs.python.org/issue31429
+# See also:
https://bugzilla.redhat.com/show_bug.cgi?id=1489816
+Patch294: 00294-define-TLS-cipher-suite-on-build-time.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -647,6 +655,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch290 -p1
%patch291 -p1
%patch292 -p1
+%patch294 -p1
# Remove files that should be generated by the build
@@ -718,6 +727,7 @@ BuildPython() {
--enable-loadable-sqlite-extensions \
--with-dtrace \
--with-lto \
+ --with-ssl-default-suites=openssl \
%if %{with valgrind}
--with-valgrind \
%endif
@@ -1512,6 +1522,9 @@ fi
# ======================================================
%changelog
+* Thu Feb 01 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-11
+- Define TLS cipher suite on build time.
+
* Wed Jan 31 2018 Tomas Orsava <torsava(a)redhat.com> - 3.6.4-10
- Disable test_gdb for all arches and test_buffer for ppc64le in anticipation
of the F28 mass rebuild
commit be049209131847f4fcb28b67ea7c04134d9c4f9e
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Wed Jan 31 15:16:02 2018 +0100
Disable test_gdb for all arches and test_buffer for ppc64le in anticipation of the F28
mass rebuild
- Re-enable these tests after the mass rebuild when they can be properly
addressed
diff --git a/python3.spec b/python3.spec
index 5ba3068..f8a1509 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
@@ -1041,14 +1041,15 @@ CheckPython() {
-wW --slowest --findleaks \
-x test_distutils \
-x test_bdist_rpm \
+ -x test_gdb \
%ifarch ppc64le aarch64
-x test_faulthandler \
%endif
%ifarch %{mips64}
-x test_ctypes \
%endif
- %ifarch %{power64} s390 s390x armv7hl aarch64 %{mips}
- -x test_gdb
+ %ifarch ppc64le
+ -x test_buffer \
%endif
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1511,6 +1512,12 @@ fi
# ======================================================
%changelog
+* Wed Jan 31 2018 Tomas Orsava <torsava(a)redhat.com> - 3.6.4-10
+- Disable test_gdb for all arches and test_buffer for ppc64le in anticipation
+ of the F28 mass rebuild
+- Re-enable these tests after the mass rebuild when they can be properly
+ addressed
+
* Tue Jan 23 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-9
- Restore the PyExc_RecursionErrorInst public symbol
commit dc669abc1d3e49e9fb3055d6d89042fdd83d6081
Author: Iryna Shcherbina <shcherbina.iryna(a)gmail.com>
Date: Thu Jan 18 22:57:38 2018 +0100
Remove the python3-tools package (bz#1312030)
For more details see
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
Scope:
- Remove the python3-tools package and `Tools/` library
- Move /usr/bin/2to3 to python3-devel
- Move /usr/bin/idle and idlelib to python3-idle
- Provide python3-tools from python3-idle to keep upgrades sane
- Remove tests for tools from python3-tests package
Merges
https://src.fedoraproject.org/rpms/python37/pull-request/4
diff --git a/python37.spec b/python37.spec
index cf18266..9f1b85b 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.4.%{?prerel}%{?dist}
+Release: 0.5.%{?prerel}%{?dist}
License: Python
@@ -519,8 +519,21 @@ Requires: python3-rpm-generators
# TODO change to a specific subpackage once available (#1218294)
Requires: redhat-rpm-config
+Provides: %{name}-2to3 = %{version}-%{release}
+Provides: 2to3 = %{version}-%{release}
+
Conflicts: %{name} < %{version}-%{release}
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+# /usr/bin/2to3 was moved from python2-tools to python3-tools
+# TODO Remove in Fedora 29
+Conflicts: python2-tools < 2.7.13-17
+Conflicts: python-tools < 2.7.13-17
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+# /usr/bin/2to3 was moved from python3-tools to python3-devel
+# TODO Remove in Fedora 30
+Conflicts: python3-tools < 3.7
+
# Shall be removed in Fedora 31
Obsoletes: platform-python-devel < %{platpyver}
@@ -529,32 +542,35 @@ This package contains the header files and configuration needed to
compile
Python extension modules (typically written in C or C++), to embed Python
into other programs, and to make binary distributions for Python libraries.
-It also contains the necessary macros to build RPM packages with Python modules.
+It also contains the necessary macros to build RPM packages with Python modules
+and 2to3 tool, an automatic source converter from Python 2.X.
-%package tools
-Summary: A collection of tools included with Python including 2to3 and idle
+%package idle
+Summary: A basic graphical development environment for Python
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tkinter = %{version}-%{release}
-Provides: %{name}-2to3 = %{version}-%{release}
-Provides: %{name}-idle = %{version}-%{release}
-Provides: 2to3 = %{version}-%{release}
Provides: idle3 = %{version}-%{release}
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-# /usr/bin/2to3 was moved from here
-# TODO Remove in Fedora 29
-Conflicts: python2-tools < 2.7.13-17
-Conflicts: python-tools < 2.7.13-17
+Provides: %{name}-tools = %{version}-%{release}
+Provides: %{name}-tools%{?_isa} = %{version}-%{release}
+Obsoletes: %{name}-tools < %{version}-%{release}
# Shall be removed in Fedora 31
Obsoletes: platform-python-tools < %{platpyver}
-%description tools
-This package contains several tools included with Python, including:
-- 2to3, an automatic source converter from Python 2.X
-- idle, a basic graphical development environment
+%description idle
+IDLE is Pythons Integrated Development and Learning Environment.
+
+IDLE has the following features: Python shell window (interactive
+interpreter) with colorizing of code input, output, and error messages;
+multi-window text editor with multiple undo, Python colorizing,
+smart indent, call tips, auto completion, and other features;
+search within any window, replace within editor windows, and
+search through multiple files (grep); debugger with persistent
+breakpoints, stepping, and viewing of global and local namespaces;
+configuration, browsers, and other dialogs.
%package tkinter
@@ -572,7 +588,6 @@ the Python programming language.
%package test
Summary: The self-test suite for the main python3 package
Requires: %{name} = %{version}-%{release}
-Requires: %{name}-tools = %{version}-%{release}
# Shall be removed in Fedora 31
Obsoletes: platform-python-test < %{platpyver}
@@ -597,7 +612,7 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Requires: %{name}-devel%{?_isa} = %{version}-%{release}
Requires: %{name}-test%{?_isa} = %{version}-%{release}
Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
-Requires: %{name}-tools%{?_isa} = %{version}-%{release}
+Requires: %{name}-idle%{?_isa} = %{version}-%{release}
%description debug
python3-debug provides a version of the Python runtime with numerous debugging
@@ -944,21 +959,6 @@ cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
%endif
-# Development tools
-install -m755 -d %{buildroot}%{pylibdir}/Tools
-install Tools/README %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/freeze %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/i18n %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/pynche %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/scripts %{buildroot}%{pylibdir}/Tools/
-
-# Documentation tools
-install -m755 -d %{buildroot}%{pylibdir}/Doc
-cp -ar Doc/tools %{buildroot}%{pylibdir}/Doc/
-
-# Demo scripts
-cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
-
# Make sure distutils looks at the right pyconfig.h file
# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
@@ -971,22 +971,21 @@ sed -i -e
"s/'pyconfig.h'/'%{_pyconfig_h}'/" \
%{buildroot}%{pylibdir}/distutils/sysconfig.py \
%{buildroot}%{pylibdir}/sysconfig.py
+# Install pathfix.py to bindir
+# See
https://github.com/fedora-python/python-rpm-porting/issues/24
+cp -p Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+
# Switch all shebangs to refer to the specific Python version.
# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
# so handle files named using other naming scheme separately.
LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
Tools/scripts/pathfix.py \
-i "%{_bindir}/python%{pybasever}" \
- %{buildroot} %{buildroot}%{pylibdir}/Tools/scripts/*-*.py \
- %{buildroot}%{pylibdir}/Tools/pynche/{pynche,pynche.pyw}
-# not covered, also redundant and useless:
-rm %{buildroot}%{pylibdir}/Tools/scripts/{2to3,idle3,pydoc3,pyvenv}
-
-
-# Move pathfix.py to bindir
-# See
https://github.com/fedora-python/python-rpm-porting/issues/24
-mv %{buildroot}%{pylibdir}/Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+ %{buildroot}
+# Remove tests for python3-tools which was removed in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1312030
+rm -rf %{buildroot}%{pylibdir}/test/test_tools
# Remove shebang lines from .py files that aren't executable, and
# remove executability from .py files that don't have a shebang line:
@@ -996,10 +995,6 @@ find %{buildroot} -name \*.py \
-perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
-exec chmod a-x {} \; \) \)
-# Remove executable flag from files that shouldn't have it:
-chmod a-x \
- %{buildroot}%{pylibdir}/Tools/README
-
# Get rid of DOS batch files:
find %{buildroot} -name \*.bat -exec rm {} \;
@@ -1047,9 +1042,10 @@ mkdir -p %{buildroot}%{_libexecdir}
ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
%endif
-# There's no point of having this, as decided in
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-rm %{buildroot}%{_bindir}/2to3-%{pybasever}
+# There's 2to3-X.X executable and 2to3 soft link to it.
+# No reason to have both, so keep only 2to3 as an executable.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+mv %{buildroot}%{_bindir}/2to3-%{pybasever} %{buildroot}%{_bindir}/2to3
%if %{with flatpackage}
# Remove stuff that would conflict with python3 package
@@ -1267,8 +1263,6 @@ fi
%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
%endif
-%{pylibdir}/idlelib
-
%dir %{pylibdir}/test/
%dir %{pylibdir}/test/__pycache__/
%dir %{pylibdir}/test/support/
@@ -1458,6 +1452,7 @@ fi
%if %{without flatpackage}
%files devel
%defattr(-,root,root)
+%{_bindir}/2to3
%endif
%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
@@ -1486,17 +1481,16 @@ fi
%if %{without flatpackage}
-%files tools
+%files idle
%defattr(-,root,root,755)
-%{_bindir}/2to3
%{_bindir}/idle*
%else
%{_bindir}/idle%{pybasever}
%endif
-%{pylibdir}/Tools
-%doc %{pylibdir}/Doc
+%{pylibdir}/idlelib
+
%if %{without flatpackage}
%{_datadir}/appdata/idle3.appdata.xml
%{_datadir}/applications/idle3.desktop
@@ -1684,6 +1678,12 @@ fi
# ======================================================
%changelog
+* Fri Jan 26 2018 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.7.0-0.5.a4
+- Remove the python3-tools package (#rhbz 1312030)
+- Move /usr/bin/2to3 to python3-devel
+- Move /usr/bin/idle and idlelib to python3-idle
+- Provide python3-tools from python3-idle
+
* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.7.0-0.4.a4
- Rebuilt for switch to libxcrypt
commit d623e929ca5b17f310a4c437c1a497c7af1b2316
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 23 17:19:17 2018 +0100
Restore the PyExc_RecursionErrorInst public symbol
diff --git a/00292-restore-PyExc_RecursionErrorInst-symbol.patch
b/00292-restore-PyExc_RecursionErrorInst-symbol.patch
new file mode 100644
index 0000000..89671f8
--- /dev/null
+++ b/00292-restore-PyExc_RecursionErrorInst-symbol.patch
@@ -0,0 +1,106 @@
+diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
+index 847b50140a6..570dc3ed6fe 100644
+--- a/Doc/whatsnew/3.6.rst
++++ b/Doc/whatsnew/3.6.rst
+@@ -1852,10 +1852,10 @@ Build and C API Changes
+ * The :c:func:`PyUnicode_FSConverter` and :c:func:`PyUnicode_FSDecoder`
+ functions will now accept :term:`path-like objects <path-like object>`.
+
+-* The ``PyExc_RecursionErrorInst`` singleton that was part of the public API
+- has been removed as its members being never cleared may cause a segfault
+- during finalization of the interpreter. Contributed by Xavier de Gaye in
+- :issue:`22898` and :issue:`30697`.
++* The ``PyExc_RecursionErrorInst`` singleton is not used anymore as its members
++ being never cleared may cause a segfault during finalization of the
++ interpreter. Contributed by Xavier de Gaye in :issue:`22898` and
++ :issue:`30697`.
+
+
+ Other Improvements
+diff --git a/Include/pyerrors.h b/Include/pyerrors.h
+index c28c1373f82..8c1dbc5047b 100644
+--- a/Include/pyerrors.h
++++ b/Include/pyerrors.h
+@@ -219,6 +219,8 @@ PyAPI_DATA(PyObject *) PyExc_IOError;
+ PyAPI_DATA(PyObject *) PyExc_WindowsError;
+ #endif
+
++PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst;
++
+ /* Predefined warning categories */
+ PyAPI_DATA(PyObject *) PyExc_Warning;
+ PyAPI_DATA(PyObject *) PyExc_UserWarning;
+diff --git a/Misc/NEWS.d/next/C API/2017-12-20-15-23-06.bpo-30697.v9FmgG.rst
b/Misc/NEWS.d/next/C API/2017-12-20-15-23-06.bpo-30697.v9FmgG.rst
+new file mode 100644
+index 00000000000..28f74ad4f30
+--- /dev/null
++++ b/Misc/NEWS.d/next/C API/2017-12-20-15-23-06.bpo-30697.v9FmgG.rst
+@@ -0,0 +1 @@
++Restore PyExc_RecursionErrorInst in 3.6
+diff --git a/Objects/exceptions.c b/Objects/exceptions.c
+index df4899372a5..271e293e325 100644
+--- a/Objects/exceptions.c
++++ b/Objects/exceptions.c
+@@ -2430,6 +2430,12 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning,
+
+
+
++/* Pre-computed RecursionError instance for when recursion depth is reached.
++ Meant to be used when normalizing the exception for exceeding the recursion
++ depth will cause its own infinite recursion.
++*/
++PyObject *PyExc_RecursionErrorInst = NULL;
++
+ #define PRE_INIT(TYPE) \
+ if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
+ if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
+@@ -2691,11 +2697,37 @@ _PyExc_Init(PyObject *bltinmod)
+ ADD_ERRNO(TimeoutError, ETIMEDOUT);
+
+ preallocate_memerrors();
++
++ if (!PyExc_RecursionErrorInst) {
++ PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL,
NULL);
++ if (!PyExc_RecursionErrorInst)
++ Py_FatalError("Cannot pre-allocate RecursionError instance for "
++ "recursion errors");
++ else {
++ PyBaseExceptionObject *err_inst =
++ (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
++ PyObject *args_tuple;
++ PyObject *exc_message;
++ exc_message = PyUnicode_FromString("maximum recursion depth
exceeded");
++ if (!exc_message)
++ Py_FatalError("cannot allocate argument for RecursionError "
++ "pre-allocation");
++ args_tuple = PyTuple_Pack(1, exc_message);
++ if (!args_tuple)
++ Py_FatalError("cannot allocate tuple for RecursionError "
++ "pre-allocation");
++ Py_DECREF(exc_message);
++ if (BaseException_init(err_inst, args_tuple, NULL))
++ Py_FatalError("init of pre-allocated RecursionError failed");
++ Py_DECREF(args_tuple);
++ }
++ }
+ }
+
+ void
+ _PyExc_Fini(void)
+ {
++ Py_CLEAR(PyExc_RecursionErrorInst);
+ free_preallocated_memerrors();
+ Py_CLEAR(errnomap);
+ }
+diff --git a/PC/python3.def b/PC/python3.def
+index 4fc4a6814ee..ff70718fc37 100644
+--- a/PC/python3.def
++++ b/PC/python3.def
+@@ -224,6 +224,7 @@ EXPORTS
+ PyExc_PermissionError=python36.PyExc_PermissionError DATA
+ PyExc_ProcessLookupError=python36.PyExc_ProcessLookupError DATA
+ PyExc_RecursionError=python36.PyExc_RecursionError DATA
++ PyExc_RecursionErrorInst=python36.PyExc_RecursionErrorInst DATA
+ PyExc_ReferenceError=python36.PyExc_ReferenceError DATA
+ PyExc_ResourceWarning=python36.PyExc_ResourceWarning DATA
+ PyExc_RuntimeError=python36.PyExc_RuntimeError DATA
diff --git a/python3.spec b/python3.spec
index 73cb6e2..5ba3068 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
@@ -372,6 +372,12 @@ Patch290:
00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
+# 00292 #
+# Restore the public PyExc_RecursionErrorInst symbol that was removed
+# from the 3.6.4 release upstream.
+# Reported upstream:
https://bugs.python.org/issue30697
+Patch292: 00292-restore-PyExc_RecursionErrorInst-symbol.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -640,6 +646,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch289 -p1
%patch290 -p1
%patch291 -p1
+%patch292 -p1
# Remove files that should be generated by the build
@@ -1504,6 +1511,9 @@ fi
# ======================================================
%changelog
+* Tue Jan 23 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-9
+- Restore the PyExc_RecursionErrorInst public symbol
+
* Tue Jan 23 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-8
- Add patch to explicitly link _ctypes module with -ldl (#1537489)
- Refactored patch for libxcrypt
commit 434d46925934a7254c9de8bb4d2008546902d49a
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 23 17:18:20 2018 +0100
Synced patch for libxcrypt with upstream
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
index 38aa7de..c5d768b 100644
--- a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+++ b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
@@ -1,45 +1,28 @@
-From bb9a8332e54fd6d2b0d4767b55c7df9a36ad3022 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
-Date: Sun, 21 Jan 2018 18:55:31 +0100
-Subject: [PATCH] cryptmodule: Include <crypt.h> for declaration of crypt() if
- needed
-
-Not every target system may provide a crypt() function in its stdlibc
-and may use an external or replacement library, like libxcrypt, for
-providing such functions.
----
- Modules/_cryptmodule.c | 4 ++++
- configure.ac | 2 +-
- 2 files changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c
-index 58d179e6a3..0031037b64 100644
---- a/Modules/_cryptmodule.c
-+++ b/Modules/_cryptmodule.c
-@@ -5,6 +5,10 @@
-
- #include <sys/types.h>
-
-+#if defined(HAVE_CRYPT_H)
+diff --git a/Include/Python.h b/Include/Python.h
+index dd595ea5e4c..1feb1531cc9 100644
+--- a/Include/Python.h
++++ b/Include/Python.h
+@@ -35,6 +35,9 @@
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif
++#ifdef HAVE_CRYPT_H
+#include <crypt.h>
+#endif
-+
- /* Module crypt */
- /*[clinic input]
+ /* For size_t? */
+ #ifdef HAVE_STDDEF_H
diff --git a/configure.ac b/configure.ac
-index 39e2e8e769..79397a7a24 100644
+index 03b0f501aff..15ef872a53a 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -2049,7 +2049,7 @@ AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
+@@ -2041,7 +2041,7 @@ dnl AC_MSG_RESULT($cpp_type)
+
+ # checks for header files
+ AC_HEADER_STDC
+-AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
++AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \
fcntl.h grp.h \
ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \
sched.h shadow.h signal.h stropts.h termios.h \
--unistd.h utime.h \
-+unistd.h crypt.h utime.h \
- poll.h sys/devpoll.h sys/epoll.h sys/poll.h \
- sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \
- sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \
---
-2.16.1
-
+
diff --git a/python3.spec b/python3.spec
index b1cc9f6..73cb6e2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -363,7 +363,7 @@ Patch289: 00289-fix-nis-compilation.patch
# Not every target system may provide a crypt() function in its stdlibc
# and may use an external or replacement library, like libxcrypt, for
# providing such functions.
-# Reported upstream:
https://bugs.python.org/issue32635
+# Fixed upstream:
https://bugs.python.org/issue32635
Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
# 00291 #
commit ce6ec4f16ac18a3f451b036bb6743fdeebb8813c
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Tue Jan 23 15:25:04 2018 +0100
Add patch to explicitly link _ctypes module with -ldl (#1537489)
Refactored patch for libxcrypt
Re-enable strict symbol checks in the link editor
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
index be62939..38aa7de 100644
--- a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+++ b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
@@ -1,4 +1,4 @@
-From 6811089dbf34a2cef9799e1cb6d63b863b58739f Mon Sep 17 00:00:00 2001
+From bb9a8332e54fd6d2b0d4767b55c7df9a36ad3022 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
Date: Sun, 21 Jan 2018 18:55:31 +0100
Subject: [PATCH] cryptmodule: Include <crypt.h> for declaration of crypt() if
@@ -9,18 +9,18 @@ and may use an external or replacement library, like libxcrypt, for
providing such functions.
---
Modules/_cryptmodule.c | 4 ++++
- configure.ac | 4 ++++
- 2 files changed, 8 insertions(+)
+ configure.ac | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c
-index 58d179e6a3..bb26d83f55 100644
+index 58d179e6a3..0031037b64 100644
--- a/Modules/_cryptmodule.c
+++ b/Modules/_cryptmodule.c
@@ -5,6 +5,10 @@
#include <sys/types.h>
-+#if defined(HAVE_XCRYPT)
++#if defined(HAVE_CRYPT_H)
+#include <crypt.h>
+#endif
+
@@ -28,20 +28,18 @@ index 58d179e6a3..bb26d83f55 100644
/*[clinic input]
diff --git a/configure.ac b/configure.ac
-index 39e2e8e769..129c198c15 100644
+index 39e2e8e769..79397a7a24 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -2816,6 +2816,10 @@ LIBS="$withval $LIBS"
-
- PKG_PROG_PKG_CONFIG
-
-+# Check for libxcrypt is present.
-+PKG_CHECK_MODULES([libxcrypt], libxcrypt,
-+ AC_DEFINE([HAVE_XCRYPT], 1, [Define to 1 if libxcrypt is found.]), [])
-+
- # Check for use of the system expat library
- AC_MSG_CHECKING(for --with-system-expat)
- AC_ARG_WITH(system_expat,
+@@ -2049,7 +2049,7 @@ AC_CHECK_HEADERS(asm/types.h conio.h direct.h dlfcn.h errno.h \
+ fcntl.h grp.h \
+ ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \
+ sched.h shadow.h signal.h stropts.h termios.h \
+-unistd.h utime.h \
++unistd.h crypt.h utime.h \
+ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \
+ sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \
+ sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \
--
-2.16.0
+2.16.1
diff --git a/00291-setup-Link-ctypes-against-dl-explicitly.patch
b/00291-setup-Link-ctypes-against-dl-explicitly.patch
new file mode 100644
index 0000000..4bf4801
--- /dev/null
+++ b/00291-setup-Link-ctypes-against-dl-explicitly.patch
@@ -0,0 +1,25 @@
+From aae2ef0bace0e38f4ee5aaa4642aa32450a84216 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Tue, 23 Jan 2018 14:43:43 +0100
+Subject: [PATCH] setup: Link ctypes against dl explicitly
+
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index c23628a2a9..9e40bb53e6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1935,7 +1935,7 @@ class PyBuildExt(build_ext):
+ self.use_system_libffi = False
+ include_dirs = []
+ extra_compile_args = []
+- extra_link_args = []
++ extra_link_args = ['-ldl']
+ sources = ['_ctypes/_ctypes.c',
+ '_ctypes/callbacks.c',
+ '_ctypes/callproc.c',
+--
+2.16.1
+
diff --git a/python3.spec b/python3.spec
index 9f1b88a..b1cc9f6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
@@ -146,11 +146,6 @@ License: Python
# on files that test invalid syntax.
%undefine py_auto_byte_compile
-# Disable strict symbol checks in the link editor.
-# See:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af192613e1beec3...
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
-%undefine _strict_symbol_defs_build
-
# For multilib support, files that are different between 32- and 64-bit arches
# need different filenames. Use "64" or "32" according to the word
size.
# Currently, the best way to determine an architecture's word size happens to
@@ -371,6 +366,12 @@ Patch289: 00289-fix-nis-compilation.patch
# Reported upstream:
https://bugs.python.org/issue32635
Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+# 00291 #
+# Build fails with undefined references to dlopen / dlsym otherwise.
+# See:
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
+# and:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af19
+Patch291: 00291-setup-Link-ctypes-against-dl-explicitly.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -638,6 +639,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch274 -p1
%patch289 -p1
%patch290 -p1
+%patch291 -p1
# Remove files that should be generated by the build
@@ -1502,6 +1504,11 @@ fi
# ======================================================
%changelog
+* Tue Jan 23 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-8
+- Add patch to explicitly link _ctypes module with -ldl (#1537489)
+- Refactored patch for libxcrypt
+- Re-enable strict symbol checks in the link editor
+
* Mon Jan 22 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-7
- Add patch for libxcrypt
- Disable strict symbol checks in the link editor
commit 5a8bf97593a4db85208e905cb543728234fb4412
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 23 13:22:12 2018 +0100
Disable strict symbol checks in the link editor.
diff --git a/python3.spec b/python3.spec
index d86a696..9f1b88a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -146,6 +146,11 @@ License: Python
# on files that test invalid syntax.
%undefine py_auto_byte_compile
+# Disable strict symbol checks in the link editor.
+# See:
https://src.fedoraproject.org/rpms/redhat-rpm-config/c/078af192613e1beec3...
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1537489
+%undefine _strict_symbol_defs_build
+
# For multilib support, files that are different between 32- and 64-bit arches
# need different filenames. Use "64" or "32" according to the word
size.
# Currently, the best way to determine an architecture's word size happens to
@@ -363,6 +368,7 @@ Patch289: 00289-fix-nis-compilation.patch
# Not every target system may provide a crypt() function in its stdlibc
# and may use an external or replacement library, like libxcrypt, for
# providing such functions.
+# Reported upstream:
https://bugs.python.org/issue32635
Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
# (New patches go here ^^^)
@@ -1498,6 +1504,7 @@ fi
%changelog
* Mon Jan 22 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-7
- Add patch for libxcrypt
+- Disable strict symbol checks in the link editor
* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-6
- Rebuilt for switch to libxcrypt
commit 5ea7bf417d382b9fe25e4382c8e40aa4074f46cb
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Mon Jan 22 21:10:32 2018 +0100
Add patch for libxcrypt
diff --git a/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
new file mode 100644
index 0000000..be62939
--- /dev/null
+++ b/00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
@@ -0,0 +1,47 @@
+From 6811089dbf34a2cef9799e1cb6d63b863b58739f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82(a)fedoraproject.org>
+Date: Sun, 21 Jan 2018 18:55:31 +0100
+Subject: [PATCH] cryptmodule: Include <crypt.h> for declaration of crypt() if
+ needed
+
+Not every target system may provide a crypt() function in its stdlibc
+and may use an external or replacement library, like libxcrypt, for
+providing such functions.
+---
+ Modules/_cryptmodule.c | 4 ++++
+ configure.ac | 4 ++++
+ 2 files changed, 8 insertions(+)
+
+diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c
+index 58d179e6a3..bb26d83f55 100644
+--- a/Modules/_cryptmodule.c
++++ b/Modules/_cryptmodule.c
+@@ -5,6 +5,10 @@
+
+ #include <sys/types.h>
+
++#if defined(HAVE_XCRYPT)
++#include <crypt.h>
++#endif
++
+ /* Module crypt */
+
+ /*[clinic input]
+diff --git a/configure.ac b/configure.ac
+index 39e2e8e769..129c198c15 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2816,6 +2816,10 @@ LIBS="$withval $LIBS"
+
+ PKG_PROG_PKG_CONFIG
+
++# Check for libxcrypt is present.
++PKG_CHECK_MODULES([libxcrypt], libxcrypt,
++ AC_DEFINE([HAVE_XCRYPT], 1, [Define to 1 if libxcrypt is found.]), [])
++
+ # Check for use of the system expat library
+ AC_MSG_CHECKING(for --with-system-expat)
+ AC_ARG_WITH(system_expat,
+--
+2.16.0
+
diff --git a/python3.spec b/python3.spec
index 3eed00a..d86a696 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
@@ -359,6 +359,12 @@ Patch274: 00274-fix-arch-names.patch
# Fixed upstream:
https://bugs.python.org/issue32521
Patch289: 00289-fix-nis-compilation.patch
+# 00290 #
+# Not every target system may provide a crypt() function in its stdlibc
+# and may use an external or replacement library, like libxcrypt, for
+# providing such functions.
+Patch290: 00290-cryptmodule-Include-crypt.h-for-declaration-of-crypt.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -625,6 +631,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch273 -p1
%patch274 -p1
%patch289 -p1
+%patch290 -p1
# Remove files that should be generated by the build
@@ -1489,6 +1496,9 @@ fi
# ======================================================
%changelog
+* Mon Jan 22 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-7
+- Add patch for libxcrypt
+
* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-6
- Rebuilt for switch to libxcrypt
commit 08148d40f83b062a693eb1e23b71a686fcfda0c2
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Sat Jan 20 23:07:44 2018 +0100
Rebuilt for switch to libxcrypt
diff --git a/python37.spec b/python37.spec
index 5ff5696..cf18266 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.3.%{?prerel}%{?dist}
+Release: 0.4.%{?prerel}%{?dist}
License: Python
@@ -1684,6 +1684,9 @@ fi
# ======================================================
%changelog
+* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.7.0-0.4.a4
+- Rebuilt for switch to libxcrypt
+
* Thu Jan 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.3.a4
- Remove /usr/bin/python37 (#1526129)
- Move install stuff from %%check to %%install, where it belongs (oops)
commit 085ae328d4e0757fb686cb14e9b9c30e7edf4fec
Author: Bjrn Esser <besser82(a)fedoraproject.org>
Date: Sat Jan 20 23:07:42 2018 +0100
Rebuilt for switch to libxcrypt
diff --git a/python3.spec b/python3.spec
index d2962bc..3eed00a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
@@ -1489,6 +1489,9 @@ fi
# ======================================================
%changelog
+* Sat Jan 20 2018 Bjrn Esser <besser82(a)fedoraproject.org> - 3.6.4-6
+- Rebuilt for switch to libxcrypt
+
* Fri Jan 19 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-5
- Fix localeconv() encoding for LC_NUMERIC
commit 40bb48b58479cf1b301b2e5a073d9d07f9c32420
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Jan 19 17:44:40 2018 +0100
Properly add patch 273
diff --git a/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
b/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
new file mode 100644
index 0000000..4d0c87d
--- /dev/null
+++ b/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
@@ -0,0 +1,240 @@
+diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst
+index b04442bc162..9a0c570533a 100644
+--- a/Doc/library/locale.rst
++++ b/Doc/library/locale.rst
+@@ -147,6 +147,16 @@ The :mod:`locale` module defines the following exception and
functions:
+ | ``CHAR_MAX`` | Nothing is specified in this locale. |
+ +--------------+-----------------------------------------+
+
++ The function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC``
++ locale to decode ``decimal_point`` and ``thousands_sep`` byte strings if
++ they are non-ASCII or longer than 1 byte, and the ``LC_NUMERIC`` locale is
++ different than the ``LC_CTYPE`` locale. This temporary change affects other
++ threads.
++
++ .. versionchanged:: 3.6.5
++ The function now sets temporarily the ``LC_CTYPE`` locale to the
++ ``LC_NUMERIC`` locale in some cases.
++
+
+ .. function:: nl_langinfo(option)
+
+diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
+index 196a4c00056..d8a1647e8b5 100644
+--- a/Doc/library/stdtypes.rst
++++ b/Doc/library/stdtypes.rst
+@@ -1599,6 +1599,20 @@ expression support in the :mod:`re` module).
+ See :ref:`formatstrings` for a description of the various formatting options
+ that can be specified in format strings.
+
++ .. note::
++ When formatting a number (:class:`int`, :class:`float`, :class:`float`
++ and subclasses) with the ``n`` type (ex: ``'{:n}'.format(1234)``), the
++ function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC``
++ locale to decode ``decimal_point`` and ``thousands_sep`` fields of
++ :c:func:`localeconv` if they are non-ASCII or longer than 1 byte, and the
++ ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. This
++ temporary change affects other threads.
++
++ .. versionchanged:: 3.6.5
++ When formatting a number with the ``n`` type, the function sets
++ temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale in some
++ cases.
++
+
+ .. method:: str.format_map(mapping)
+
+diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
+index 847b50140a6..f83508c9250 100644
+--- a/Doc/whatsnew/3.6.rst
++++ b/Doc/whatsnew/3.6.rst
+@@ -2346,3 +2346,11 @@ It has been replaced by the new ``make regen-all`` target.
+ (Contributed by Victor Stinner in :issue:`23404`.)
+
+ .. versionchanged:: 3.6.2
++
++
++Notable changes in Python 3.6.5
++===============================
++
++The :func:`locale.localeconv` function now sets temporarily the ``LC_CTYPE``
++locale to the ``LC_NUMERIC`` locale in some cases.
++(Contributed by Victor Stinner in :issue:`31900`.)
+diff --git a/Include/fileutils.h b/Include/fileutils.h
+index 900c70faad7..875715df97a 100644
+--- a/Include/fileutils.h
++++ b/Include/fileutils.h
+@@ -119,6 +119,11 @@ PyAPI_FUNC(int) _Py_get_blocking(int fd);
+ PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking);
+ #endif /* !MS_WINDOWS */
+
++PyAPI_FUNC(int) _Py_GetLocaleconvNumeric(
++ PyObject **decimal_point,
++ PyObject **thousands_sep,
++ const char **grouping);
++
+ #endif /* Py_LIMITED_API */
+
+ #ifdef __cplusplus
+diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
+index 71c9146ccb8..95b370b1ad0 100644
+--- a/Modules/_localemodule.c
++++ b/Modules/_localemodule.c
+@@ -171,12 +171,6 @@ PyLocale_localeconv(PyObject* self)
+ RESULT(#i, x); \
+ } while (0)
+
+- /* Numeric information */
+- RESULT_STRING(decimal_point);
+- RESULT_STRING(thousands_sep);
+- x = copy_grouping(l->grouping);
+- RESULT("grouping", x);
+-
+ /* Monetary information */
+ RESULT_STRING(int_curr_symbol);
+ RESULT_STRING(currency_symbol);
+@@ -195,6 +189,32 @@ PyLocale_localeconv(PyObject* self)
+ RESULT_INT(n_sep_by_space);
+ RESULT_INT(p_sign_posn);
+ RESULT_INT(n_sign_posn);
++
++ /* Numeric information */
++ PyObject *decimal_point, *thousands_sep;
++ const char *grouping;
++ if (_Py_GetLocaleconvNumeric(&decimal_point,
++ &thousands_sep,
++ &grouping) < 0) {
++ goto failed;
++ }
++
++ if (PyDict_SetItemString(result, "decimal_point", decimal_point) < 0)
{
++ Py_DECREF(decimal_point);
++ Py_DECREF(thousands_sep);
++ goto failed;
++ }
++ Py_DECREF(decimal_point);
++
++ if (PyDict_SetItemString(result, "thousands_sep", thousands_sep) < 0)
{
++ Py_DECREF(thousands_sep);
++ goto failed;
++ }
++ Py_DECREF(thousands_sep);
++
++ x = copy_grouping(grouping);
++ RESULT("grouping", x);
++
+ return result;
+
+ failed:
+diff --git a/Python/fileutils.c b/Python/fileutils.c
+index 97505e5bc6d..14dd81b03f0 100644
+--- a/Python/fileutils.c
++++ b/Python/fileutils.c
+@@ -1597,3 +1597,80 @@ _Py_set_blocking(int fd, int blocking)
+ return -1;
+ }
+ #endif
++
++
++int
++_Py_GetLocaleconvNumeric(PyObject **decimal_point, PyObject **thousands_sep,
++ const char **grouping)
++{
++ int res = -1;
++
++ struct lconv *lc = localeconv();
++
++ int change_locale = 0;
++ if (decimal_point != NULL &&
++ (strlen(lc->decimal_point) > 1 || ((unsigned char)lc->decimal_point[0])
> 127))
++ {
++ change_locale = 1;
++ }
++ if (thousands_sep != NULL &&
++ (strlen(lc->thousands_sep) > 1 || ((unsigned char)lc->thousands_sep[0])
> 127))
++ {
++ change_locale = 1;
++ }
++
++ /* Keep a copy of the LC_CTYPE locale */
++ char *oldloc = NULL, *loc = NULL;
++ if (change_locale) {
++ oldloc = setlocale(LC_CTYPE, NULL);
++ if (!oldloc) {
++ PyErr_SetString(PyExc_RuntimeWarning, "faild to get LC_CTYPE
locale");
++ return -1;
++ }
++
++ oldloc = _PyMem_Strdup(oldloc);
++ if (!oldloc) {
++ PyErr_NoMemory();
++ return -1;
++ }
++
++ loc = setlocale(LC_NUMERIC, NULL);
++ if (loc != NULL && strcmp(loc, oldloc) == 0) {
++ loc = NULL;
++ }
++
++ if (loc != NULL) {
++ /* Only set the locale temporarilty the LC_CTYPE locale
++ if LC_NUMERIC locale is different than LC_CTYPE locale and
++ decimal_point and/or thousands_sep are non-ASCII or longer than
++ 1 byte */
++ setlocale(LC_CTYPE, loc);
++ }
++ }
++
++ if (decimal_point != NULL) {
++ *decimal_point = PyUnicode_DecodeLocale(lc->decimal_point, NULL);
++ if (*decimal_point == NULL) {
++ goto error;
++ }
++ }
++ if (thousands_sep != NULL) {
++ *thousands_sep = PyUnicode_DecodeLocale(lc->thousands_sep, NULL);
++ if (*thousands_sep == NULL) {
++ goto error;
++ }
++ }
++
++ if (grouping != NULL) {
++ *grouping = lc->grouping;
++ }
++
++ res = 0;
++
++error:
++ if (loc != NULL) {
++ setlocale(LC_CTYPE, oldloc);
++ }
++ PyMem_Free(oldloc);
++ return res;
++}
+diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
+index d2be76f1e1a..d3ef650e6ce 100644
+--- a/Python/formatter_unicode.c
++++ b/Python/formatter_unicode.c
+@@ -707,18 +707,11 @@ get_locale_info(enum LocaleType type, LocaleInfo *locale_info)
+ {
+ switch (type) {
+ case LT_CURRENT_LOCALE: {
+- struct lconv *locale_data = localeconv();
+- locale_info->decimal_point = PyUnicode_DecodeLocale(
+- locale_data->decimal_point,
+- NULL);
+- if (locale_info->decimal_point == NULL)
++ if (_Py_GetLocaleconvNumeric(&locale_info->decimal_point,
++ &locale_info->thousands_sep,
++ &locale_info->grouping) < 0) {
+ return -1;
+- locale_info->thousands_sep = PyUnicode_DecodeLocale(
+- locale_data->thousands_sep,
+- NULL);
+- if (locale_info->thousands_sep == NULL)
+- return -1;
+- locale_info->grouping = locale_data->grouping;
++ }
+ break;
+ }
+ case LT_DEFAULT_LOCALE:
commit 26024771dfe131dc39d4e4664c5194a69b47c48c
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Jan 19 17:36:05 2018 +0100
Fix localeconv() encoding for LC_NUMERIC
diff --git a/00273-skip-float-test.patch b/00273-skip-float-test.patch
deleted file mode 100644
index 233d3ed..0000000
--- a/00273-skip-float-test.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
-index 66726d6496d..3318fa5df59 100644
---- a/Lib/test/test_float.py
-+++ b/Lib/test/test_float.py
-@@ -141,6 +141,7 @@ class GeneralFloatCases(unittest.TestCase):
- # non-UTF-8 byte string
- check(b'123\xa0')
-
-+ @unittest.skip('Fails in Koji:
https://bugzilla.redhat.com/show_bug.cgi?id=1484497')
- @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
- def test_float_with_comma(self):
- # set locale to something that doesn't use '.' for the decimal
point
diff --git a/python3.spec b/python3.spec
index 96416ce..d2962bc 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
@@ -342,9 +342,9 @@ Patch262: 00262-pep538_coerce_legacy_c_locale.patch
Patch264: 00264-skip-test-failing-on-aarch64.patch
# 00273 #
-# Skip test_float_with_comma, which fails in Koji with UnicodeDecodeError
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
-Patch273: 00273-skip-float-test.patch
+# Fix localeconv() encoding for LC_NUMERIC
+# Fixed upstream:
https://bugs.python.org/issue31900
+Patch273: 00273-fix-localeconv-encoding-for-LC_NUMERIC.patch
# 00274 #
# Upstream uses Debian-style architecture naming. Change to match Fedora.
@@ -1489,6 +1489,9 @@ fi
# ======================================================
%changelog
+* Fri Jan 19 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-5
+- Fix localeconv() encoding for LC_NUMERIC
+
* Thu Jan 18 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-4
- R: gdbm-devel R: gdbm for python3-libs
commit 57ec20127dcd1e317c6f6eb846a72d846b180560
Author: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
Date: Thu Jan 18 19:41:19 2018 +0100
R: gdbm-devel R: gdbm for python3-libs
Signed-off-by: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
diff --git a/python3.spec b/python3.spec
index 80ce6ab..96416ce 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
@@ -444,7 +444,7 @@ Requires: glibc%{?_isa} >= 2.24.90-26
%if %{with gdbm}
# When built with this (as guarded by the BuildRequires above), require it
-Requires: gdbm-devel%{?_isa} >= 1:1.13
+Requires: gdbm%{?_isa} >= 1:1.13
%endif
# For backward compatibility only, remove in F29:
@@ -1489,6 +1489,9 @@ fi
# ======================================================
%changelog
+* Thu Jan 18 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 3.6.4-4
+- R: gdbm-devel R: gdbm for python3-libs
+
* Wed Jan 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-3
- Require large enough gdbm (fixup for previous bump)
commit 6a6d4a03245c076ec8686b8f96ac4ffd3f6ad4e4
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jan 18 16:03:21 2018 +0100
Move install stuff from %check to %install, where it belongs (oops)
diff --git a/python37.spec b/python37.spec
index 24d57dc..5ff5696 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1047,6 +1047,24 @@ mkdir -p %{buildroot}%{_libexecdir}
ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
%endif
+# There's no point of having this, as decided in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+rm %{buildroot}%{_bindir}/2to3-%{pybasever}
+
+%if %{with flatpackage}
+# Remove stuff that would conflict with python3 package
+rm %{buildroot}%{_bindir}/python3
+rm %{buildroot}%{_bindir}/pydoc3
+rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/idle3
+rm %{buildroot}%{_bindir}/python3-*
+rm %{buildroot}%{_bindir}/pyvenv
+rm %{buildroot}%{_bindir}/2to3
+rm %{buildroot}%{_libdir}/libpython3.so
+rm %{buildroot}%{_mandir}/man1/python3.1*
+rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+%endif
+
# ======================================================
# Checks for packaging issues
@@ -1083,24 +1101,6 @@ for Module in %{buildroot}/%{dynload_dir}/*.so ; do
esac
done
-# There's no point of having this, as decided in
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-rm %{buildroot}%{_bindir}/2to3-%{pybasever}
-
-%if %{with flatpackage}
-# Remove stuff that would conflict with python3 package
-rm %{buildroot}%{_bindir}/python3
-rm %{buildroot}%{_bindir}/pydoc3
-rm %{buildroot}%{_bindir}/pathfix.py
-rm %{buildroot}%{_bindir}/idle3
-rm %{buildroot}%{_bindir}/python3-*
-rm %{buildroot}%{_bindir}/pyvenv
-rm %{buildroot}%{_bindir}/2to3
-rm %{buildroot}%{_libdir}/libpython3.so
-rm %{buildroot}%{_mandir}/man1/python3.1*
-rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
-%endif
-
# ======================================================
# Running the upstream test suite
@@ -1686,6 +1686,7 @@ fi
%changelog
* Thu Jan 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.3.a4
- Remove /usr/bin/python37 (#1526129)
+- Move install stuff from %%check to %%install, where it belongs (oops)
* Tue Jan 09 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.2.a4
- Update to 3.7.0 alpha 4
commit 7f3ae64d2f98f00b8778b9693ad37fa3c295f4dc
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jan 18 16:02:54 2018 +0100
Remove /usr/bin/python37 (#1526129)
diff --git a/python37.spec b/python37.spec
index c373bb3..24d57dc 100644
--- a/python37.spec
+++ b/python37.spec
@@ -18,7 +18,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.2.%{?prerel}%{?dist}
+Release: 0.3.%{?prerel}%{?dist}
License: Python
@@ -1089,7 +1089,7 @@ rm %{buildroot}%{_bindir}/2to3-%{pybasever}
%if %{with flatpackage}
# Remove stuff that would conflict with python3 package
-mv %{buildroot}%{_bindir}/python{3,%{pyshortver}}
+rm %{buildroot}%{_bindir}/python3
rm %{buildroot}%{_bindir}/pydoc3
rm %{buildroot}%{_bindir}/pathfix.py
rm %{buildroot}%{_bindir}/idle3
@@ -1206,7 +1206,6 @@ fi
%{_libexecdir}/system-python
%else
%{_bindir}/pydoc%{pybasever}
-%{_bindir}/python%{pyshortver}
%endif
%{_bindir}/python%{pybasever}
@@ -1685,6 +1684,9 @@ fi
# ======================================================
%changelog
+* Thu Jan 18 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.3.a4
+- Remove /usr/bin/python37 (#1526129)
+
* Tue Jan 09 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.2.a4
- Update to 3.7.0 alpha 4
- Fix the compilation of the nis module
commit c9349a73c79318fef15994b81d8ea36fc4c15eb8
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jan 9 22:16:51 2018 +0100
Update to 3.7.0 alpha 4
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 61f9b52..b48feda 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -105,13 +105,13 @@ index 9ee4d31..53c8606 100644
'scripts': '{userbase}/bin',
'data': '{userbase}',
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
-index 99e7b4f..c4c98a6 100644
+index 266adf0..e8513b6 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -275,8 +275,8 @@ class HelperFunctionsTests(unittest.TestCase):
self.assertEqual(dirs[1], wanted)
elif os.sep == '/':
- # OS X non-framwework builds, Linux, FreeBSD, etc
+ # OS X non-framework builds, Linux, FreeBSD, etc
- self.assertEqual(len(dirs), 1)
- wanted = os.path.join('xoxo', 'lib',
+ self.assertEqual(len(dirs), 2)
@@ -120,7 +120,7 @@ index 99e7b4f..c4c98a6 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index e8df8f7..a5a9d5e 100644
+index 59ba9d4..5780ed8 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -133,7 +133,7 @@ LIBDIR= @libdir@
@@ -133,41 +133,41 @@ index e8df8f7..a5a9d5e 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index dd3387a..1258fcd 100644
+index 85e737b..2a1fc79 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
-@@ -494,7 +494,7 @@ calculate_path(void)
- _pythonpath = Py_DecodeLocale(PYTHONPATH, NULL);
- _prefix = Py_DecodeLocale(PREFIX, NULL);
- _exec_prefix = Py_DecodeLocale(EXEC_PREFIX, NULL);
-- lib_python = Py_DecodeLocale("lib/python" VERSION, NULL);
-+ lib_python = Py_DecodeLocale("lib64/python" VERSION, NULL);
-
- if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
- Py_FatalError(
-@@ -683,7 +683,7 @@ calculate_path(void)
- }
- else
- wcsncpy(zip_path, _prefix, MAXPATHLEN);
-- joinpath(zip_path, L"lib/python00.zip");
-+ joinpath(zip_path, L"lib64/python00.zip");
- bufsz = wcslen(zip_path); /* Replace "00" with version */
- zip_path[bufsz - 6] = VERSION[0];
- zip_path[bufsz - 5] = VERSION[2];
-@@ -695,7 +695,7 @@ calculate_path(void)
- fprintf(stderr,
+@@ -500,7 +500,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
"Could not find platform dependent libraries
<exec_prefix>\n");
- wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
+ }
+ wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN);
- joinpath(exec_prefix, L"lib/lib-dynload");
+ joinpath(exec_prefix, L"lib64/lib-dynload");
}
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+ }
+@@ -742,7 +742,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t
*prefix)
+ else {
+ wcsncpy(calculate->zip_path, calculate->prefix, MAXPATHLEN);
+ }
+- joinpath(calculate->zip_path, L"lib/python00.zip");
++ joinpath(calculate->zip_path, L"lib64/python00.zip");
+ /* Replace "00" with version */
+ size_t bufsz = wcslen(calculate->zip_path);
+@@ -867,7 +867,7 @@ calculate_init(PyCalculatePath *calculate,
+ if (!calculate->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);
+ }
diff --git a/setup.py b/setup.py
-index 11c4ec6..c3e5512 100644
+index f1933f7..450cd8a 100644
--- a/setup.py
+++ b/setup.py
-@@ -513,7 +513,7 @@ class PyBuildExt(build_ext):
+@@ -531,7 +531,7 @@ class PyBuildExt(build_ext):
# directories (i.e. '.' and 'Include') must be first. See
issue
# 10520.
if not cross_compiling:
@@ -176,7 +176,7 @@ index 11c4ec6..c3e5512 100644
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:
-@@ -809,11 +809,11 @@ class PyBuildExt(build_ext):
+@@ -830,11 +830,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
elif self.compiler.find_library_file(lib_dirs +
@@ -190,7 +190,7 @@ index 11c4ec6..c3e5512 100644
extra_link_args=readline_extra_link_args,
libraries=readline_libs) )
else:
-@@ -850,8 +850,8 @@ class PyBuildExt(build_ext):
+@@ -871,8 +871,8 @@ class PyBuildExt(build_ext):
if krb5_h:
ssl_incs += krb5_h
ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
diff --git a/00289-fix-nis-compilation.patch b/00289-fix-nis-compilation.patch
new file mode 100644
index 0000000..4d4e3dc
--- /dev/null
+++ b/00289-fix-nis-compilation.patch
@@ -0,0 +1,83 @@
+diff --git a/setup.py b/setup.py
+index 3eb6ad1..3437e48 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1331,20 +1331,14 @@ class PyBuildExt(build_ext):
+ exts.append( Extension('termios', ['termios.c']) )
+ # Jeremy Hylton's rlimit interface
+ exts.append( Extension('resource', ['resource.c']) )
++ else:
++ missing.extend(['resource', 'termios'])
+
+- # Sun yellow pages. Some systems have the functions in libc.
+- if (host_platform not in ['cygwin', 'qnx6'] and
+- find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
+- if (self.compiler.find_library_file(lib_dirs, 'nsl')):
+- libs = ['nsl']
+- else:
+- libs = []
+- exts.append( Extension('nis', ['nismodule.c'],
+- libraries = libs) )
+- else:
+- missing.append('nis')
++ nis = self._detect_nis(inc_dirs, lib_dirs)
++ if nis is not None:
++ exts.append(nis)
+ else:
+- missing.extend(['nis', 'resource', 'termios'])
++ missing.append('nis')
+
+ # Curses support, requiring the System V version of curses, often
+ # provided by the ncurses library.
+@@ -2179,6 +2173,51 @@ class PyBuildExt(build_ext):
+ )
+ return ext
+
++ def _detect_nis(self, inc_dirs, lib_dirs):
++ if host_platform in {'win32', 'cygwin', 'qnx6'}:
++ return None
++
++ libs = []
++ library_dirs = []
++ includes_dirs = []
++
++ # Latest glibc has moved Sun RPC headers into tircp and nsl sub
++ # directories. rpc code has been moved to libtirpc.
++ rpcsvc_inc = find_file(
++ 'rpcsvc/yp_prot.h', inc_dirs,
++ ['/usr/local/include/nsl', '/usr/include/nsl']
++ )
++ rpc_inc = find_file(
++ 'rpc/rpc.h', inc_dirs,
++ ['/usr/local/include/tirpc', '/usr/include/tirpc']
++ )
++ if rpcsvc_inc is None or rpc_inc is None:
++ # not found
++ return None
++ includes_dirs.extend(rpcsvc_inc)
++ includes_dirs.extend(rpc_inc)
++
++ if self.compiler.find_library_file(lib_dirs, 'nsl'):
++ libs.append('nsl')
++ else:
++ # libnsl-devel: check for libnsl in nsl/ subdirectory
++ nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs]
++ libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
++ if libnsl is not None:
++ library_dirs.append(os.path.dirname(libnsl))
++ libs.append('nsl')
++
++ if self.compiler.find_library_file(lib_dirs, 'tirpc'):
++ libs.append('tirpc')
++
++ return Extension(
++ 'nis', ['nismodule.c'],
++ libraries=libs,
++ library_dirs=library_dirs,
++ include_dirs=includes_dirs
++ )
++
++
+ class PyBuildInstall(install):
+ # Suppress the warning about installation into the lib_dynload
+ # directory, which is not in sys.path when running Python during
diff --git a/python37.spec b/python37.spec
index 57a4691..c373bb3 100644
--- a/python37.spec
+++ b/python37.spec
@@ -13,12 +13,12 @@ URL:
https://www.python.org/
# Second alpha
-%global prerel a2
+%global prerel a4
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.0
-Release: 0.1.%{?prerel}%{?dist}
+Release: 0.2.%{?prerel}%{?dist}
License: Python
@@ -203,6 +203,8 @@ BuildRequires: glibc-devel
BuildRequires: gmp-devel
BuildRequires: libappstream-glib
BuildRequires: libffi-devel
+BuildRequires: libnsl2-devel
+BuildRequires: libtirpc-devel
BuildRequires: libGL-devel
BuildRequires: libuuid-devel
BuildRequires: libX11-devel
@@ -392,6 +394,14 @@ Patch273: 00273-skip-float-test.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
+# 00289 #
+# Fix the compilation of the nis module, as glibc removed the
+# interfaces related to Sun RPC and they are now provided
+# by libtirpc and libnsl2.
+# See:
https://fedoraproject.org/wiki/Changes/SunRPCRemoval
+# and
https://fedoraproject.org/wiki/Changes/NISIPv6
+# Fixed upstream:
https://bugs.python.org/issue32521
+Patch289: 00289-fix-nis-compilation.patch
# (New patches go here ^^^)
#
@@ -684,6 +694,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch273 -p1
%patch274 -p1
+%patch289 -p1
# Remove files that should be generated by the build
@@ -1674,6 +1685,10 @@ fi
# ======================================================
%changelog
+* Tue Jan 09 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.2.a4
+- Update to 3.7.0 alpha 4
+- Fix the compilation of the nis module
+
* Tue Nov 28 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.1.a2
- Update to 3.7.0 alpha 2
- Removed merged patches 262, 277, 279
diff --git a/sources b/sources
index 24ad9db..9fd642f 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.7.0a2.tar.xz) =
604cef8fe079afad66f4df17752cb1afdc7d12abd392cb5995b16e83df392f56bd1ed88d6be9e0f3e9d7ea0dd394e497f6311547d277d9fd1ebd3eb039f7b068
+SHA512 (Python-3.7.0a4.tar.xz) =
3d9517fb381258e21548e3e88de88592adc75bc37fddf21e79149d7706d85f5df816ffcc170603ce93959c76d903d4fd4c0231b5b0b2b430c21701cc303d9e5a
commit 1a43a65185f0f0371e3ee0fc7341535a7929486b
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Jan 17 11:48:11 2018 +0100
Require large enough gdbm (fixup for previous commit)
diff --git a/python3.spec b/python3.spec
index 02b4557..80ce6ab 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
@@ -442,6 +442,11 @@ Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1410644
Requires: glibc%{?_isa} >= 2.24.90-26
+%if %{with gdbm}
+# When built with this (as guarded by the BuildRequires above), require it
+Requires: gdbm-devel%{?_isa} >= 1:1.13
+%endif
+
# For backward compatibility only, remove in F29:
Provides: system-python-libs = %{version}-%{release}
Provides: system-python-libs%{?_isa} = %{version}-%{release}
@@ -1484,6 +1489,9 @@ fi
# ======================================================
%changelog
+* Wed Jan 17 2018 Miro Hronok <mhroncok(a)redhat.com> - 3.6.4-3
+- Require large enough gdbm (fixup for previous bump)
+
* Tue Jan 16 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-2
- Rebuild for reverted gdbm 1.13 on Fedora 27
commit 6e38667b8a4543e9dedebc181b9f6d417ecea23a
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 16 20:36:17 2018 +0100
Rebuild for reverted gdbm 1:1.13 on F27
diff --git a/python3.spec b/python3.spec
index d6f9c43..02b4557 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.4
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -173,7 +173,7 @@ BuildRequires: expat-devel
BuildRequires: findutils
BuildRequires: gcc-c++
%if %{with gdbm}
-BuildRequires: gdbm-devel
+BuildRequires: gdbm-devel >= 1:1.13
%endif
BuildRequires: glibc-devel
BuildRequires: gmp-devel
@@ -1484,6 +1484,9 @@ fi
# ======================================================
%changelog
+* Tue Jan 16 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-2
+- Rebuild for reverted gdbm 1.13 on Fedora 27
+
* Mon Jan 15 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-1
- Update to version 3.6.4
commit 0077a197809465e42a2c6300b80af67898f8ebcd
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Jan 15 15:28:35 2018 +0100
Update to version 3.6.4
Rebased patches: 189, 262
Dropped patches due to being upstreamed: 277, 279
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
index 53a26ca..36b2611 100644
--- a/00189-add-rewheel-module.patch
+++ b/00189-add-rewheel-module.patch
@@ -1,6 +1,7 @@
-diff -Nur Python-3.4.1/Lib/ensurepip/__init__.py
Python-3.4.1-rewheel/Lib/ensurepip/__init__.py
---- Python-3.4.1/Lib/ensurepip/__init__.py 2014-08-21 10:49:30.792695824 +0200
-+++ Python-3.4.1-rewheel/Lib/ensurepip/__init__.py 2014-08-21 10:10:41.958341726 +0200
+diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
+index d69e09f..5cb12df 100644
+--- a/Lib/ensurepip/__init__.py
++++ b/Lib/ensurepip/__init__.py
@@ -1,8 +1,10 @@
import os
import os.path
@@ -12,16 +13,16 @@ diff -Nur Python-3.4.1/Lib/ensurepip/__init__.py
Python-3.4.1-rewheel/Lib/ensure
__all__ = ["version", "bootstrap"]
-@@ -38,6 +40,8 @@
+@@ -25,6 +27,8 @@ def _run_pip(args, additional_paths=None):
# Install the bundled software
import pip
+ if args[0] in ["install", "list", "wheel"]:
+ args.append('--pre')
- pip.main(args)
+ return pip.main(args)
-@@ -87,20 +91,39 @@
+@@ -88,20 +92,39 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
# omit pip and easy_install
os.environ["ENSUREPIP_OPTIONS"] = "install"
@@ -72,8 +73,8 @@ diff -Nur Python-3.4.1/Lib/ensurepip/__init__.py
Python-3.4.1-rewheel/Lib/ensure
# Construct the arguments to be passed to the pip command
args = ["install", "--no-index", "--find-links",
tmpdir]
diff -Nur Python-3.4.1/Lib/ensurepip/rewheel/__init__.py
Python-3.4.1-rewheel/Lib/ensurepip/rewheel/__init__.py
---- Python-3.4.1/Lib/ensurepip/rewheel/__init__.py 1970-01-01 01:00:00.000000000 +0100
-+++ Python-3.4.1-rewheel/Lib/ensurepip/rewheel/__init__.py 2014-08-21 10:11:22.560320121
+0200
+--- Python-3.4.1/Lib/ensurepip/rewheel/__init__.py 1970-01-01 01:00:00.000000000 +0100
++++ Python-3.4.1-rewheel/Lib/ensurepip/rewheel/__init__.py 2014-08-21 10:11:22.560320121
+0200
@@ -0,0 +1,143 @@
+import argparse
+import codecs
@@ -219,8 +220,8 @@ diff -Nur Python-3.4.1/Lib/ensurepip/rewheel/__init__.py
Python-3.4.1-rewheel/Li
+ pass # bad RECORD or empty line
+ return to_write, to_omit
diff -Nur Python-3.4.1/Makefile.pre.in Python-3.4.1-rewheel/Makefile.pre.in
---- Python-3.4.1/Makefile.pre.in 2014-08-21 10:49:31.512695040 +0200
-+++ Python-3.4.1-rewheel/Makefile.pre.in 2014-08-21 10:10:41.961341722 +0200
+--- Python-3.4.1/Makefile.pre.in 2014-08-21 10:49:31.512695040 +0200
++++ Python-3.4.1-rewheel/Makefile.pre.in 2014-08-21 10:10:41.961341722 +0200
@@ -1145,7 +1145,7 @@
test/test_asyncio \
collections concurrent concurrent/futures encodings \
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index d749bac..b144ba5 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -1,8 +1,8 @@
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
-index 195f63f..8ecd70f 100644
+index 9ffb714..3f7201a 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
-@@ -713,6 +713,45 @@ conflict.
+@@ -711,6 +711,45 @@ conflict.
.. versionadded:: 3.6
@@ -500,37 +500,13 @@ index 0000000..635c98f
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
-index 6c3625d..009f542 100644
+index 6e4286e..594dfa9 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
-@@ -369,14 +369,21 @@ class EmbeddingTests(unittest.TestCase):
- def tearDown(self):
- os.chdir(self.oldcwd)
-
-- def run_embedded_interpreter(self, *args):
-+ def run_embedded_interpreter(self, *args, env=None):
- """Runs a test in the embedded interpreter"""
- cmd = [self.test_exe]
- cmd.extend(args)
-+ if env is not None and sys.platform == 'win32':
-+ # Windows requires at least the SYSTEMROOT environment variable to
-+ # start Python.
-+ env = env.copy()
-+ env['SYSTEMROOT'] = os.environ['SYSTEMROOT']
-+
- p = subprocess.Popen(cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
-- universal_newlines=True)
-+ universal_newlines=True,
-+ env=env)
- (out, err) = p.communicate()
- self.assertEqual(p.returncode, 0,
- "bad returncode %d, stderr is %r" %
-@@ -386,31 +393,21 @@ class EmbeddingTests(unittest.TestCase):
- def test_subinterps(self):
+@@ -425,32 +425,21 @@ class EmbeddingTests(unittest.TestCase):
+ def test_repeated_init_and_subinterpreters(self):
# This is just a "don't crash" test
- out, err = self.run_embedded_interpreter()
+ out, err =
self.run_embedded_interpreter('repeated_init_and_subinterpreters')
- if support.verbose:
+ if support.verbose > 1:
print()
@@ -549,33 +525,19 @@ index 6c3625d..009f542 100644
-
def test_forced_io_encoding(self):
# Checks forced configuration of embedded interpreter IO streams
-- out, err = self.run_embedded_interpreter("forced_io_encoding")
+ env = dict(os.environ, PYTHONIOENCODING="utf-8:surrogateescape")
+ out, err = self.run_embedded_interpreter("forced_io_encoding",
env=env)
- if support.verbose:
-+ env = dict(os.environ, PYTHONIOENCODING="utf-8:surrogateescape")
-+ out, err = self.run_embedded_interpreter("forced_io_encoding",
env=env)
+ if support.verbose > 1:
print()
print(out)
print(err)
-- expected_errors = sys.__stdout__.errors
-- expected_stdin_encoding = sys.__stdin__.encoding
+ expected_stream_encoding = "utf-8"
+ expected_errors = "surrogateescape"
- expected_pipe_encoding = self._get_default_pipe_encoding()
-+ expected_stream_encoding = "utf-8"
-+ expected_errors = "surrogateescape"
expected_output = '\n'.join([
"--- Use defaults ---",
"Expected encoding: default",
-@@ -437,8 +434,8 @@ class EmbeddingTests(unittest.TestCase):
- "stdout: latin-1:replace",
- "stderr: latin-1:backslashreplace"])
- expected_output = expected_output.format(
-- in_encoding=expected_stdin_encoding,
-- out_encoding=expected_pipe_encoding,
-+ in_encoding=expected_stream_encoding,
-+ out_encoding=expected_stream_encoding,
- errors=expected_errors)
- # This is useful if we ever trip over odd platform behaviour
- self.maxDiff = None
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index ae2bcd4..0a302ff 100644
--- a/Lib/test/test_cmd_line.py
@@ -601,7 +563,7 @@ index ae2bcd4..0a302ff 100644
b'import locale; '
b'print(ascii("' + undecodable + b'"), '
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
-index df9ebd4..63145e4 100644
+index 7866a5c..b41239a 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -680,6 +680,7 @@ class SysModuleTest(unittest.TestCase):
@@ -613,7 +575,7 @@ index df9ebd4..63145e4 100644
'import sys',
'def dump(name):',
diff --git a/Modules/main.c b/Modules/main.c
-index dd50211..f20cf24 100644
+index b0fb78f..0d8590a 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -105,7 +105,11 @@ static const char usage_6[] =
@@ -630,16 +592,15 @@ index dd50211..f20cf24 100644
static int
usage(int exitcode, const wchar_t* program)
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
-index 3968399..1bd2bbf 100644
+index b0f9087..da892bf 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -1,4 +1,5 @@
--#include <Python.h>
-+#include "Python.h"
+ #include <Python.h>
+#include "pyconfig.h"
+ #include "pythread.h"
#include <stdio.h>
- /*********************************************************
diff --git a/Programs/python.c b/Programs/python.c
index a7afbc7..03f8295 100644
--- a/Programs/python.c
@@ -713,7 +674,7 @@ index a7afbc7..03f8295 100644
for (i = 0; i < argc; i++) {
PyMem_RawFree(argv_copy2[i]);
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index a4f7f82..3843297 100644
+index 640271f..2a22b24 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -167,6 +167,7 @@ Py_SetStandardStreamEncoding(const char *encoding, const char
*errors)
@@ -929,7 +890,7 @@ index a4f7f82..3843297 100644
#endif
if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
-@@ -1242,12 +1428,8 @@ initstdio(void)
+@@ -1251,12 +1437,8 @@ initstdio(void)
}
}
if (!errors && !(pythonioencoding && *pythonioencoding)) {
@@ -944,90 +905,11 @@ index a4f7f82..3843297 100644
}
}
-diff --git a/configure b/configure
-index 2915246..39e5a27 100755
---- a/configure
-+++ b/configure
-@@ -834,6 +834,8 @@ with_thread
- enable_ipv6
- with_doc_strings
- with_pymalloc
-+with_c_locale_coercion
-+with_c_locale_warning
- with_valgrind
- with_dtrace
- with_fpectl
-@@ -1527,6 +1529,12 @@ Optional Packages:
- deprecated; use --with(out)-threads
- --with(out)-doc-strings disable/enable documentation strings
- --with(out)-pymalloc disable/enable specialized mallocs
-+ --with(out)-c-locale-coercion
-+ disable/enable C locale coercion to a UTF-8 based
-+ locale
-+ --with(out)-c-locale-warning
-+ disable/enable locale compatibility warning in the C
-+ locale
- --with-valgrind Enable Valgrind support
- --with(out)-dtrace disable/enable DTrace support
- --with-fpectl enable SIGFPE catching
-@@ -11010,6 +11018,52 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pymalloc" >&5
- $as_echo "$with_pymalloc" >&6; }
-
-+# Check for --with-c-locale-coercion
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for
--with-c-locale-coercion" >&5
-+$as_echo_n "checking for --with-c-locale-coercion... " >&6; }
-+
-+# Check whether --with-c-locale-coercion was given.
-+if test "${with_c_locale_coercion+set}" = set; then :
-+ withval=$with_c_locale_coercion;
-+fi
-+
-+
-+if test -z "$with_c_locale_coercion"
-+then
-+ with_c_locale_coercion="yes"
-+fi
-+if test "$with_c_locale_coercion" != "no"
-+then
-+
-+$as_echo "#define PY_COERCE_C_LOCALE 1" >>confdefs.h
-+
-+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_c_locale_coercion"
>&5
-+$as_echo "$with_c_locale_coercion" >&6; }
-+
-+# Check for --with-c-locale-warning
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-c-locale-warning"
>&5
-+$as_echo_n "checking for --with-c-locale-warning... " >&6; }
-+
-+# Check whether --with-c-locale-warning was given.
-+if test "${with_c_locale_warning+set}" = set; then :
-+ withval=$with_c_locale_warning;
-+fi
-+
-+
-+if test -z "$with_c_locale_warning"
-+then
-+ with_c_locale_warning="yes"
-+fi
-+if test "$with_c_locale_warning" != "no"
-+then
-+
-+$as_echo "#define PY_WARN_ON_C_LOCALE 1" >>confdefs.h
-+
-+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_c_locale_warning"
>&5
-+$as_echo "$with_c_locale_warning" >&6; }
-+
- # Check for Valgrind support
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-valgrind"
>&5
- $as_echo_n "checking for --with-valgrind... " >&6; }
diff --git a/configure.ac b/configure.ac
-index 67dfba3..b9c9f04 100644
+index 601cc84..5cdc021 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -3279,6 +3279,40 @@ then
+@@ -3310,6 +3310,40 @@ then
fi
AC_MSG_RESULT($with_pymalloc)
@@ -1068,23 +950,3 @@ index 67dfba3..b9c9f04 100644
# Check for Valgrind support
AC_MSG_CHECKING([for --with-valgrind])
AC_ARG_WITH([valgrind],
-diff --git a/pyconfig.h.in b/pyconfig.h.in
-index b10c57f..0a6f3e2 100644
---- a/pyconfig.h.in
-+++ b/pyconfig.h.in
-@@ -1244,9 +1244,15 @@
- /* Define as the preferred size in bits of long digits */
- #undef PYLONG_BITS_IN_DIGIT
-
-+/* Define if you want to coerce the C locale to a UTF-8 based locale */
-+#undef PY_COERCE_C_LOCALE
-+
- /* Define to printf format modifier for Py_ssize_t */
- #undef PY_FORMAT_SIZE_T
-
-+/* Define to emit a locale compatibility warning in the C locale */
-+#undef PY_WARN_ON_C_LOCALE
-+
- /* Define if you want to build an interpreter with many run-time checks. */
- #undef Py_DEBUG
-
diff --git a/python3.spec b/python3.spec
index 7495259..d6f9c43 100644
--- a/python3.spec
+++ b/python3.spec
@@ -13,8 +13,8 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.3
-Release: 5%{?dist}
+Version: %{pybasever}.4
+Release: 1%{?dist}
License: Python
@@ -350,19 +350,6 @@ Patch273: 00273-skip-float-test.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00277 #
-# Fix test_exception_errpipe_bad_data() and
-# test_exception_errpipe_normal() of test_subprocess: mock os.waitpid()
-# to avoid calling the real os.waitpid(0, 0) which is an unexpected
-# side effect of the test, which makes the koji builds hang.
-# Fixed upstream:
https://github.com/python/cpython/commit/11045c9d8a21dd9bd182a3939189db02...
-Patch277: 00277-fix-test-subprocess-hanging-tests.patch
-
-# 00279 #
-# Fix memory corruption due to allocator mix
-# Fixed upstream:
https://bugs.python.org/issue31532
-Patch279: 00279-fix-memory-corruption-due-to-allocator-mix.patch
-
# 00289 #
# Fix the compilation of the nis module, as glibc removed the
# interfaces related to Sun RPC and they are now provided
@@ -632,8 +619,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch273 -p1
%patch274 -p1
-%patch277 -p1
-%patch279 -p1
%patch289 -p1
@@ -1499,6 +1484,9 @@ fi
# ======================================================
%changelog
+* Mon Jan 15 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.4-1
+- Update to version 3.6.4
+
* Fri Jan 12 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-5
- Fix the compilation of the nis module.
diff --git a/sources b/sources
index 002f1fb..6b5ff13 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.3.tar.xz) =
32f24a3adcb7880003c7ecdc5e53e838e774adda76b308961d8215e28db630b2fa2828097817924c76afa4212b2df3362eb64d4e10f37c0147f512ec5aa8662b
+SHA512 (Python-3.6.4.tar.xz) =
09ba2103ac517ac4d262f00380c9aac836a53401ce252540c17fd821a3b92e1ddf32528d00772221eb3126b12cb95b62c3ac3e852f4951e6f2eb406c88c848a2
commit 6ff303ee104bbee32f1912eb012ae02c4a92ea99
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Jan 12 16:06:48 2018 +0100
Fix the compilation of the nis module.
The headers required to build the nis module were removed
from glibc and they are now provided by the libtirpc and libnsl2
packages, thus adding their respective -devel subpackages as
BuildRequires and the upstream fix to search for the headers
and the shared libraries at the appropriate locations.
diff --git a/00289-fix-nis-compilation.patch b/00289-fix-nis-compilation.patch
new file mode 100644
index 0000000..4d4e3dc
--- /dev/null
+++ b/00289-fix-nis-compilation.patch
@@ -0,0 +1,83 @@
+diff --git a/setup.py b/setup.py
+index 3eb6ad1..3437e48 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1331,20 +1331,14 @@ class PyBuildExt(build_ext):
+ exts.append( Extension('termios', ['termios.c']) )
+ # Jeremy Hylton's rlimit interface
+ exts.append( Extension('resource', ['resource.c']) )
++ else:
++ missing.extend(['resource', 'termios'])
+
+- # Sun yellow pages. Some systems have the functions in libc.
+- if (host_platform not in ['cygwin', 'qnx6'] and
+- find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
+- if (self.compiler.find_library_file(lib_dirs, 'nsl')):
+- libs = ['nsl']
+- else:
+- libs = []
+- exts.append( Extension('nis', ['nismodule.c'],
+- libraries = libs) )
+- else:
+- missing.append('nis')
++ nis = self._detect_nis(inc_dirs, lib_dirs)
++ if nis is not None:
++ exts.append(nis)
+ else:
+- missing.extend(['nis', 'resource', 'termios'])
++ missing.append('nis')
+
+ # Curses support, requiring the System V version of curses, often
+ # provided by the ncurses library.
+@@ -2179,6 +2173,51 @@ class PyBuildExt(build_ext):
+ )
+ return ext
+
++ def _detect_nis(self, inc_dirs, lib_dirs):
++ if host_platform in {'win32', 'cygwin', 'qnx6'}:
++ return None
++
++ libs = []
++ library_dirs = []
++ includes_dirs = []
++
++ # Latest glibc has moved Sun RPC headers into tircp and nsl sub
++ # directories. rpc code has been moved to libtirpc.
++ rpcsvc_inc = find_file(
++ 'rpcsvc/yp_prot.h', inc_dirs,
++ ['/usr/local/include/nsl', '/usr/include/nsl']
++ )
++ rpc_inc = find_file(
++ 'rpc/rpc.h', inc_dirs,
++ ['/usr/local/include/tirpc', '/usr/include/tirpc']
++ )
++ if rpcsvc_inc is None or rpc_inc is None:
++ # not found
++ return None
++ includes_dirs.extend(rpcsvc_inc)
++ includes_dirs.extend(rpc_inc)
++
++ if self.compiler.find_library_file(lib_dirs, 'nsl'):
++ libs.append('nsl')
++ else:
++ # libnsl-devel: check for libnsl in nsl/ subdirectory
++ nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs]
++ libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
++ if libnsl is not None:
++ library_dirs.append(os.path.dirname(libnsl))
++ libs.append('nsl')
++
++ if self.compiler.find_library_file(lib_dirs, 'tirpc'):
++ libs.append('tirpc')
++
++ return Extension(
++ 'nis', ['nismodule.c'],
++ libraries=libs,
++ library_dirs=library_dirs,
++ include_dirs=includes_dirs
++ )
++
++
+ class PyBuildInstall(install):
+ # Suppress the warning about installation into the lib_dynload
+ # directory, which is not in sys.path when running Python during
diff --git a/python3.spec b/python3.spec
index 8bb01e0..7495259 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.3
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
@@ -179,6 +179,8 @@ BuildRequires: glibc-devel
BuildRequires: gmp-devel
BuildRequires: libappstream-glib
BuildRequires: libffi-devel
+BuildRequires: libnsl2-devel
+BuildRequires: libtirpc-devel
BuildRequires: libGL-devel
BuildRequires: libX11-devel
BuildRequires: ncurses-devel
@@ -361,6 +363,15 @@ Patch277: 00277-fix-test-subprocess-hanging-tests.patch
# Fixed upstream:
https://bugs.python.org/issue31532
Patch279: 00279-fix-memory-corruption-due-to-allocator-mix.patch
+# 00289 #
+# Fix the compilation of the nis module, as glibc removed the
+# interfaces related to Sun RPC and they are now provided
+# by libtirpc and libnsl2.
+# See:
https://fedoraproject.org/wiki/Changes/SunRPCRemoval
+# and
https://fedoraproject.org/wiki/Changes/NISIPv6
+# Fixed upstream:
https://bugs.python.org/issue32521
+Patch289: 00289-fix-nis-compilation.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -623,6 +634,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch274 -p1
%patch277 -p1
%patch279 -p1
+%patch289 -p1
# Remove files that should be generated by the build
@@ -1487,6 +1499,9 @@ fi
# ======================================================
%changelog
+* Fri Jan 12 2018 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-5
+- Fix the compilation of the nis module.
+
* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
- Raise the release of platform-python obsoletes for better maintainability
commit ec5f432a6e752b0fccc17b4e7a75a6378449164e
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Dec 4 17:53:50 2017 +0100
Remove a ppc64 segfault workaround which provided a larger stack for that
arch, as it doesn't seem to affect the build anymore.
diff --git a/python3.spec b/python3.spec
index 1f7907e..8bb01e0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -996,14 +996,6 @@ done
# Running the upstream test suite
# ======================================================
-# For ppc64 we need a larger stack than default
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1292462
-%ifarch %{power64}
- ulimit -a
- ulimit -s 16384
-%endif
-
-
topdir=$(pwd)
CheckPython() {
ConfName=$1
commit 15a050eb4bccb5537f23371b1547ae92f02600a0
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Nov 29 16:46:46 2017 +0100
Masc two macros in comments that were expanded.
Remove the commented out file for the time shared library.
diff --git a/python3.spec b/python3.spec
index 29a7d70..1f7907e 100644
--- a/python3.spec
+++ b/python3.spec
@@ -245,7 +245,7 @@ Patch1: 00001-rpath.patch
# 00102 #
# Change the various install paths to use /usr/lib64/ instead or /usr/lib
-# Only used when "%{_lib}" == "lib64"
+# Only used when "%%{_lib}" == "lib64"
# Not yet sent upstream.
Patch102: 00102-lib64.patch
@@ -1211,7 +1211,6 @@ fi
%{dynload_dir}/spwd.%{SOABI_optimized}.so
%{dynload_dir}/syslog.%{SOABI_optimized}.so
%{dynload_dir}/termios.%{SOABI_optimized}.so
-#%{dynload_dir}/time.%{SOABI_optimized}.so
%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
@@ -1441,7 +1440,6 @@ fi
%{dynload_dir}/spwd.%{SOABI_debug}.so
%{dynload_dir}/syslog.%{SOABI_debug}.so
%{dynload_dir}/termios.%{SOABI_debug}.so
-#%{dynload_dir}/time.%{SOABI_debug}.so
%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
%{dynload_dir}/unicodedata.%{SOABI_debug}.so
%{dynload_dir}/zlib.%{SOABI_debug}.so
@@ -1479,7 +1477,7 @@ fi
# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
#
-# The /usr/lib/rpm/redhat/macros defines %__debug_package to use
+# The /usr/lib/rpm/redhat/macros defines %%__debug_package to use
# debugfiles.list, and it appears that everything below /usr/lib/debug and
# (/usr/src/debug) gets added to this file (via LISTFILES) in
# /usr/lib/rpm/find-debuginfo.sh
commit 522ee16d1ae7749c0cb6edaa2c64593efeb4e5d1
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Nov 29 16:32:41 2017 +0100
Remove python-gdb.py source file as it now gets installed from the upstream sources
diff --git a/python-gdb.py b/python-gdb.py
deleted file mode 100644
index dd6d462..0000000
--- a/python-gdb.py
+++ /dev/null
@@ -1,1380 +0,0 @@
-#!/usr/bin/python
-'''
-From gdb 7 onwards, gdb's build can be configured --with-python, allowing gdb
-to be extended with Python code e.g. for library-specific data visualizations,
-such as for the C++ STL types. Documentation on this API can be seen at:
-http://sourceware.org/gdb/current/onlinedocs/gdb/Python-API.html
-
-
-This python module deals with the case when the process being debugged (the
-"inferior process" in gdb parlance) is itself python, or more specifically,
-linked against libpython. In this situation, almost every item of data is a
-(PyObject*), and having the debugger merely print their addresses is not very
-enlightening.
-
-This module embeds knowledge about the implementation details of libpython so
-that we can emit useful visualizations e.g. a string, a list, a dict, a frame
-giving file/line information and the state of local variables
-
-In particular, given a gdb.Value corresponding to a PyObject* in the inferior
-process, we can generate a "proxy value" within the gdb process. For example,
-given a PyObject* in the inferior process that is in fact a PyListObject*
-holding three PyObject* that turn out to be PyBytesObject* instances, we can
-generate a proxy value within the gdb process that is a list of bytes
-instances:
- [b"foo", b"bar", b"baz"]
-
-Doing so can be expensive for complicated graphs of objects, and could take
-some time, so we also have a "write_repr" method that writes a representation
-of the data to a file-like object. This allows us to stop the traversal by
-having the file-like object raise an exception if it gets too much data.
-
-With both "proxyval" and "write_repr" we keep track of the set of all
addresses
-visited so far in the traversal, to avoid infinite recursion due to cycles in
-the graph of object references.
-
-We try to defer gdb.lookup_type() invocations for python types until as late as
-possible: for a dynamically linked python binary, when the process starts in
-the debugger, the libpython.so hasn't been dynamically loaded yet, so none of
-the type names are known to the debugger
-
-The module also extends gdb with some python-specific commands.
-'''
-from __future__ import with_statement
-import gdb
-
-# Look up the gdb.Type for some standard types:
-_type_char_ptr = gdb.lookup_type('char').pointer() # char*
-_type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned
char*
-_type_void_ptr = gdb.lookup_type('void').pointer() # void*
-_type_size_t = gdb.lookup_type('size_t')
-
-SIZEOF_VOID_P = _type_void_ptr.sizeof
-
-
-Py_TPFLAGS_HEAPTYPE = (1L << 9)
-
-Py_TPFLAGS_INT_SUBCLASS = (1L << 23)
-Py_TPFLAGS_LONG_SUBCLASS = (1L << 24)
-Py_TPFLAGS_LIST_SUBCLASS = (1L << 25)
-Py_TPFLAGS_TUPLE_SUBCLASS = (1L << 26)
-Py_TPFLAGS_BYTES_SUBCLASS = (1L << 27)
-Py_TPFLAGS_UNICODE_SUBCLASS = (1L << 28)
-Py_TPFLAGS_DICT_SUBCLASS = (1L << 29)
-Py_TPFLAGS_BASE_EXC_SUBCLASS = (1L << 30)
-Py_TPFLAGS_TYPE_SUBCLASS = (1L << 31)
-
-
-MAX_OUTPUT_LEN=1024
-
-class NullPyObjectPtr(RuntimeError):
- pass
-
-
-def safety_limit(val):
- # Given a integer value from the process being debugged, limit it to some
- # safety threshold so that arbitrary breakage within said process doesn't
- # break the gdb process too much (e.g. sizes of iterations, sizes of lists)
- return min(val, 1000)
-
-
-def safe_range(val):
- # As per range, but don't trust the value too much: cap it to a safety
- # threshold in case the data was corrupted
- return xrange(safety_limit(val))
-
-
-class StringTruncated(RuntimeError):
- pass
-
-class TruncatedStringIO(object):
- '''Similar to cStringIO, but can truncate the output by raising a
- StringTruncated exception'''
- def __init__(self, maxlen=None):
- self._val = ''
- self.maxlen = maxlen
-
- def write(self, data):
- if self.maxlen:
- if len(data) + len(self._val) > self.maxlen:
- # Truncation:
- self._val += data[0:self.maxlen - len(self._val)]
- raise StringTruncated()
-
- self._val += data
-
- def getvalue(self):
- return self._val
-
-class PyObjectPtr(object):
- """
- Class wrapping a gdb.Value that's a either a (PyObject*) within the
- inferior process, or some subclass pointer e.g. (PyBytesObject*)
-
- There will be a subclass for every refined PyObject type that we care
- about.
-
- Note that at every stage the underlying pointer could be NULL, point
- to corrupt data, etc; this is the debugger, after all.
- """
- _typename = 'PyObject'
-
- def __init__(self, gdbval, cast_to=None):
- if cast_to:
- self._gdbval = gdbval.cast(cast_to)
- else:
- self._gdbval = gdbval
-
- def field(self, name):
- '''
- Get the gdb.Value for the given field within the PyObject, coping with
- some python 2 versus python 3 differences.
-
- Various libpython types are defined using the "PyObject_HEAD" and
- "PyObject_VAR_HEAD" macros.
-
- In Python 2, this these are defined so that "ob_type" and (for a var
- object) "ob_size" are fields of the type in question.
-
- In Python 3, this is defined as an embedded PyVarObject type thus:
- PyVarObject ob_base;
- so that the "ob_size" field is located insize the "ob_base"
field, and
- the "ob_type" is most easily accessed by casting back to a
(PyObject*).
- '''
- if self.is_null():
- raise NullPyObjectPtr(self)
-
- if name == 'ob_type':
- pyo_ptr = self._gdbval.cast(PyObjectPtr.get_gdb_type())
- return pyo_ptr.dereference()[name]
-
- if name == 'ob_size':
- pyo_ptr = self._gdbval.cast(PyVarObjectPtr.get_gdb_type())
- return pyo_ptr.dereference()[name]
-
- # General case: look it up inside the object:
- return self._gdbval.dereference()[name]
-
- def pyop_field(self, name):
- '''
- Get a PyObjectPtr for the given PyObject* field within this PyObject,
- coping with some python 2 versus python 3 differences.
- '''
- return PyObjectPtr.from_pyobject_ptr(self.field(name))
-
- def write_field_repr(self, name, out, visited):
- '''
- Extract the PyObject* field named "name", and write its representation
- to file-like object "out"
- '''
- field_obj = self.pyop_field(name)
- field_obj.write_repr(out, visited)
-
- def get_truncated_repr(self, maxlen):
- '''
- Get a repr-like string for the data, but truncate it at "maxlen" bytes
- (ending the object graph traversal as soon as you do)
- '''
- out = TruncatedStringIO(maxlen)
- try:
- self.write_repr(out, set())
- except StringTruncated:
- # Truncation occurred:
- return out.getvalue() + '...(truncated)'
-
- # No truncation occurred:
- return out.getvalue()
-
- def type(self):
- return PyTypeObjectPtr(self.field('ob_type'))
-
- def is_null(self):
- return 0 == long(self._gdbval)
-
- def is_optimized_out(self):
- '''
- Is the value of the underlying PyObject* visible to the debugger?
-
- This can vary with the precise version of the compiler used to build
- Python, and the precise version of gdb.
-
- See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=556975 with
- PyEval_EvalFrameEx's "f"
- '''
- return self._gdbval.is_optimized_out
-
- def safe_tp_name(self):
- try:
- return self.type().field('tp_name').string()
- except NullPyObjectPtr:
- # NULL tp_name?
- return 'unknown'
- except RuntimeError:
- # Can't even read the object at all?
- return 'unknown'
-
- def proxyval(self, visited):
- '''
- Scrape a value from the inferior process, and try to represent it
- within the gdb process, whilst (hopefully) avoiding crashes when
- the remote data is corrupt.
-
- Derived classes will override this.
-
- For example, a PyIntObject* with ob_ival 42 in the inferior process
- should result in an int(42) in this process.
-
- visited: a set of all gdb.Value pyobject pointers already visited
- whilst generating this value (to guard against infinite recursion when
- visiting object graphs with loops). Analogous to Py_ReprEnter and
- Py_ReprLeave
- '''
-
- class FakeRepr(object):
- """
- Class representing a non-descript PyObject* value in the inferior
- process for when we don't have a custom scraper, intended to have
- a sane repr().
- """
-
- def __init__(self, tp_name, address):
- self.tp_name = tp_name
- self.address = address
-
- def __repr__(self):
- # For the NULL pointer, we have no way of knowing a type, so
- # special-case it as per
- #
http://bugs.python.org/issue8032#msg100882
- if self.address == 0:
- return '0x0'
- return '<%s at remote 0x%x>' % (self.tp_name,
self.address)
-
- return FakeRepr(self.safe_tp_name(),
- long(self._gdbval))
-
- def write_repr(self, out, visited):
- '''
- Write a string representation of the value scraped from the inferior
- process to "out", a file-like object.
- '''
- # Default implementation: generate a proxy value and write its repr
- # However, this could involve a lot of work for complicated objects,
- # so for derived classes we specialize this
- return out.write(repr(self.proxyval(visited)))
-
- @classmethod
- def subclass_from_type(cls, t):
- '''
- Given a PyTypeObjectPtr instance wrapping a gdb.Value that's a
- (PyTypeObject*), determine the corresponding subclass of PyObjectPtr
- to use
-
- Ideally, we would look up the symbols for the global types, but that
- isn't working yet:
- (gdb) python print gdb.lookup_symbol('PyList_Type')[0].value
- Traceback (most recent call last):
- File "<string>", line 1, in <module>
- NotImplementedError: Symbol type not yet supported in Python scripts.
- Error while executing Python code.
-
- For now, we use tp_flags, after doing some string comparisons on the
- tp_name for some special-cases that don't seem to be visible through
- flags
- '''
- try:
- tp_name = t.field('tp_name').string()
- tp_flags = int(t.field('tp_flags'))
- except RuntimeError:
- # Handle any kind of error e.g. NULL ptrs by simply using the base
- # class
- return cls
-
- #print 'tp_flags = 0x%08x' % tp_flags
- #print 'tp_name = %r' % tp_name
-
- name_map = {'bool': PyBoolObjectPtr,
- 'classobj': PyClassObjectPtr,
- 'instance': PyInstanceObjectPtr,
- 'NoneType': PyNoneStructPtr,
- 'frame': PyFrameObjectPtr,
- 'set' : PySetObjectPtr,
- 'frozenset' : PySetObjectPtr,
- 'builtin_function_or_method' : PyCFunctionObjectPtr,
- }
- if tp_name in name_map:
- return name_map[tp_name]
-
- if tp_flags & Py_TPFLAGS_HEAPTYPE:
- return HeapTypeObjectPtr
-
- if tp_flags & Py_TPFLAGS_INT_SUBCLASS:
- return PyIntObjectPtr
- if tp_flags & Py_TPFLAGS_LONG_SUBCLASS:
- return PyLongObjectPtr
- if tp_flags & Py_TPFLAGS_LIST_SUBCLASS:
- return PyListObjectPtr
- if tp_flags & Py_TPFLAGS_TUPLE_SUBCLASS:
- return PyTupleObjectPtr
- if tp_flags & Py_TPFLAGS_BYTES_SUBCLASS:
- return PyBytesObjectPtr
- if tp_flags & Py_TPFLAGS_UNICODE_SUBCLASS:
- return PyUnicodeObjectPtr
- if tp_flags & Py_TPFLAGS_DICT_SUBCLASS:
- return PyDictObjectPtr
- if tp_flags & Py_TPFLAGS_BASE_EXC_SUBCLASS:
- return PyBaseExceptionObjectPtr
- #if tp_flags & Py_TPFLAGS_TYPE_SUBCLASS:
- # return PyTypeObjectPtr
-
- # Use the base class:
- return cls
-
- @classmethod
- def from_pyobject_ptr(cls, gdbval):
- '''
- Try to locate the appropriate derived class dynamically, and cast
- the pointer accordingly.
- '''
- try:
- p = PyObjectPtr(gdbval)
- cls = cls.subclass_from_type(p.type())
- return cls(gdbval, cast_to=cls.get_gdb_type())
- except RuntimeError:
- # Handle any kind of error e.g. NULL ptrs by simply using the base
- # class
- pass
- return cls(gdbval)
-
- @classmethod
- def get_gdb_type(cls):
- return gdb.lookup_type(cls._typename).pointer()
-
- def as_address(self):
- return long(self._gdbval)
-
-class PyVarObjectPtr(PyObjectPtr):
- _typename = 'PyVarObject'
-
-class ProxyAlreadyVisited(object):
- '''
- Placeholder proxy to use when protecting against infinite recursion due to
- loops in the object graph.
-
- Analogous to the values emitted by the users of Py_ReprEnter and Py_ReprLeave
- '''
- def __init__(self, rep):
- self._rep = rep
-
- def __repr__(self):
- return self._rep
-
-
-def _write_instance_repr(out, visited, name, pyop_attrdict, address):
- '''Shared code for use by old-style and new-style classes:
- write a representation to file-like object "out"'''
- out.write('<')
- out.write(name)
-
- # Write dictionary of instance attributes:
- if isinstance(pyop_attrdict, PyDictObjectPtr):
- out.write('(')
- first = True
- for pyop_arg, pyop_val in pyop_attrdict.iteritems():
- if not first:
- out.write(', ')
- first = False
- out.write(pyop_arg.proxyval(visited))
- out.write('=')
- pyop_val.write_repr(out, visited)
- out.write(')')
- out.write(' at remote 0x%x>' % address)
-
-
-class InstanceProxy(object):
-
- def __init__(self, cl_name, attrdict, address):
- self.cl_name = cl_name
- self.attrdict = attrdict
- self.address = address
-
- def __repr__(self):
- if isinstance(self.attrdict, dict):
- kwargs = ', '.join(["%s=%r" % (arg, val)
- for arg, val in self.attrdict.iteritems()])
- return '<%s(%s) at remote 0x%x>' % (self.cl_name,
- kwargs, self.address)
- else:
- return '<%s at remote 0x%x>' % (self.cl_name,
- self.address)
-
-def _PyObject_VAR_SIZE(typeobj, nitems):
- return ( ( typeobj.field('tp_basicsize') +
- nitems * typeobj.field('tp_itemsize') +
- (SIZEOF_VOID_P - 1)
- ) & ~(SIZEOF_VOID_P - 1)
- ).cast(_type_size_t)
-
-class HeapTypeObjectPtr(PyObjectPtr):
- _typename = 'PyObject'
-
- def get_attr_dict(self):
- '''
- Get the PyDictObject ptr representing the attribute dictionary
- (or None if there's a problem)
- '''
- try:
- typeobj = self.type()
- dictoffset = int_from_int(typeobj.field('tp_dictoffset'))
- if dictoffset != 0:
- if dictoffset < 0:
- type_PyVarObject_ptr =
gdb.lookup_type('PyVarObject').pointer()
- tsize =
int_from_int(self._gdbval.cast(type_PyVarObject_ptr)['ob_size'])
- if tsize < 0:
- tsize = -tsize
- size = _PyObject_VAR_SIZE(typeobj, tsize)
- dictoffset += size
- assert dictoffset > 0
- assert dictoffset % SIZEOF_VOID_P == 0
-
- dictptr = self._gdbval.cast(_type_char_ptr) + dictoffset
- PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer()
- dictptr = dictptr.cast(PyObjectPtrPtr)
- return PyObjectPtr.from_pyobject_ptr(dictptr.dereference())
- except RuntimeError:
- # Corrupt data somewhere; fail safe
- pass
-
- # Not found, or some kind of error:
- return None
-
- def proxyval(self, visited):
- '''
- Support for new-style classes.
-
- Currently we just locate the dictionary using a transliteration to
- python of _PyObject_GetDictPtr, ignoring descriptors
- '''
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('<...>')
- visited.add(self.as_address())
-
- pyop_attr_dict = self.get_attr_dict()
- if pyop_attr_dict:
- attr_dict = pyop_attr_dict.proxyval(visited)
- else:
- attr_dict = {}
- tp_name = self.safe_tp_name()
-
- # New-style class:
- return InstanceProxy(tp_name, attr_dict, long(self._gdbval))
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('<...>')
- return
- visited.add(self.as_address())
-
- pyop_attrdict = self.get_attr_dict()
- _write_instance_repr(out, visited,
- self.safe_tp_name(), pyop_attrdict, self.as_address())
-
-class ProxyException(Exception):
- def __init__(self, tp_name, args):
- self.tp_name = tp_name
- self.args = args
-
- def __repr__(self):
- return '%s%r' % (self.tp_name, self.args)
-
-class PyBaseExceptionObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyBaseExceptionObject* i.e. an exception
- within the process being debugged.
- """
- _typename = 'PyBaseExceptionObject'
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('(...)')
- visited.add(self.as_address())
- arg_proxy = self.pyop_field('args').proxyval(visited)
- return ProxyException(self.safe_tp_name(),
- arg_proxy)
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('(...)')
- return
- visited.add(self.as_address())
-
- out.write(self.safe_tp_name())
- self.write_field_repr('args', out, visited)
-
-class PyClassObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyClassObject* i.e. a <classobj>
- instance within the process being debugged.
- """
- _typename = 'PyClassObject'
-
-
-class BuiltInFunctionProxy(object):
- def __init__(self, ml_name):
- self.ml_name = ml_name
-
- def __repr__(self):
- return "<built-in function %s>" % self.ml_name
-
-class BuiltInMethodProxy(object):
- def __init__(self, ml_name, pyop_m_self):
- self.ml_name = ml_name
- self.pyop_m_self = pyop_m_self
-
- def __repr__(self):
- return ('<built-in method %s of %s object at remote 0x%x>'
- % (self.ml_name,
- self.pyop_m_self.safe_tp_name(),
- self.pyop_m_self.as_address())
- )
-
-class PyCFunctionObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyCFunctionObject*
- (see Include/methodobject.h and Objects/methodobject.c)
- """
- _typename = 'PyCFunctionObject'
-
- def proxyval(self, visited):
- m_ml = self.field('m_ml') # m_ml is a (PyMethodDef*)
- ml_name = m_ml['ml_name'].string()
-
- pyop_m_self = self.pyop_field('m_self')
- if pyop_m_self.is_null():
- return BuiltInFunctionProxy(ml_name)
- else:
- return BuiltInMethodProxy(ml_name, pyop_m_self)
-
-
-class PyCodeObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyCodeObject* i.e. a <code> instance
- within the process being debugged.
- """
- _typename = 'PyCodeObject'
-
- def addr2line(self, addrq):
- '''
- Get the line number for a given bytecode offset
-
- Analogous to PyCode_Addr2Line; translated from pseudocode in
- Objects/lnotab_notes.txt
- '''
- co_lnotab = self.pyop_field('co_lnotab').proxyval(set())
-
- # Initialize lineno to co_firstlineno as per PyCode_Addr2Line
- # not 0, as lnotab_notes.txt has it:
- lineno = int_from_int(self.field('co_firstlineno'))
-
- addr = 0
- for addr_incr, line_incr in zip(co_lnotab[::2], co_lnotab[1::2]):
- addr += ord(addr_incr)
- if addr > addrq:
- return lineno
- lineno += ord(line_incr)
- return lineno
-
-
-class PyDictObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyDictObject* i.e. a dict instance
- within the process being debugged.
- """
- _typename = 'PyDictObject'
-
- def iteritems(self):
- '''
- Yields a sequence of (PyObjectPtr key, PyObjectPtr value) pairs,
- analagous to dict.iteritems()
- '''
- for i in safe_range(self.field('ma_mask') + 1):
- ep = self.field('ma_table') + i
- pyop_value = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
- if not pyop_value.is_null():
- pyop_key = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
- yield (pyop_key, pyop_value)
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('{...}')
- visited.add(self.as_address())
-
- result = {}
- for pyop_key, pyop_value in self.iteritems():
- proxy_key = pyop_key.proxyval(visited)
- proxy_value = pyop_value.proxyval(visited)
- result[proxy_key] = proxy_value
- return result
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('{...}')
- return
- visited.add(self.as_address())
-
- out.write('{')
- first = True
- for pyop_key, pyop_value in self.iteritems():
- if not first:
- out.write(', ')
- first = False
- pyop_key.write_repr(out, visited)
- out.write(': ')
- pyop_value.write_repr(out, visited)
- out.write('}')
-
-class PyInstanceObjectPtr(PyObjectPtr):
- _typename = 'PyInstanceObject'
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('<...>')
- visited.add(self.as_address())
-
- # Get name of class:
- in_class = self.pyop_field('in_class')
- cl_name = in_class.pyop_field('cl_name').proxyval(visited)
-
- # Get dictionary of instance attributes:
- in_dict = self.pyop_field('in_dict').proxyval(visited)
-
- # Old-style class:
- return InstanceProxy(cl_name, in_dict, long(self._gdbval))
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('<...>')
- return
- visited.add(self.as_address())
-
- # Old-style class:
-
- # Get name of class:
- in_class = self.pyop_field('in_class')
- cl_name = in_class.pyop_field('cl_name').proxyval(visited)
-
- # Get dictionary of instance attributes:
- pyop_in_dict = self.pyop_field('in_dict')
-
- _write_instance_repr(out, visited,
- cl_name, pyop_in_dict, self.as_address())
-
-class PyListObjectPtr(PyObjectPtr):
- _typename = 'PyListObject'
-
- def __getitem__(self, i):
- # Get the gdb.Value for the (PyObject*) with the given index:
- field_ob_item = self.field('ob_item')
- return field_ob_item[i]
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('[...]')
- visited.add(self.as_address())
-
- result = [PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
- for i in safe_range(int_from_int(self.field('ob_size')))]
- return result
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('[...]')
- return
- visited.add(self.as_address())
-
- out.write('[')
- for i in safe_range(int_from_int(self.field('ob_size'))):
- if i > 0:
- out.write(', ')
- element = PyObjectPtr.from_pyobject_ptr(self[i])
- element.write_repr(out, visited)
- out.write(']')
-
-class PyLongObjectPtr(PyObjectPtr):
- _typename = 'PyLongObject'
-
- def proxyval(self, visited):
- '''
- Python's Include/longobjrep.h has this declaration:
- struct _longobject {
- PyObject_VAR_HEAD
- digit ob_digit[1];
- };
-
- with this description:
- The absolute value of a number is equal to
- SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
- Negative numbers are represented with ob_size < 0;
- zero is represented by ob_size == 0.
-
- where SHIFT can be either:
- #define PyLong_SHIFT 30
- #define PyLong_SHIFT 15
- '''
- ob_size = long(self.field('ob_size'))
- if ob_size == 0:
- return 0L
-
- ob_digit = self.field('ob_digit')
-
- if gdb.lookup_type('digit').sizeof == 2:
- SHIFT = 15L
- else:
- SHIFT = 30L
-
- digits = [long(ob_digit[i]) * 2**(SHIFT*i)
- for i in safe_range(abs(ob_size))]
- result = sum(digits)
- if ob_size < 0:
- result = -result
- return result
-
-class PyBoolObjectPtr(PyLongObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyBoolObject* i.e. one of the two
- <bool> instances (Py_True/Py_False) within the process being debugged.
- """
- def proxyval(self, visited):
- if PyLongObjectPtr.proxyval(self, visited):
- return True
- else:
- return False
-
-class PyNoneStructPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyObject* pointing to the
- singleton (we hope) _Py_NoneStruct with ob_type PyNone_Type
- """
- _typename = 'PyObject'
-
- def proxyval(self, visited):
- return None
-
-
-class PyFrameObjectPtr(PyObjectPtr):
- _typename = 'PyFrameObject'
-
- def __init__(self, gdbval, cast_to):
- PyObjectPtr.__init__(self, gdbval, cast_to)
-
- if not self.is_optimized_out():
- self.co = PyCodeObjectPtr.from_pyobject_ptr(self.field('f_code'))
- self.co_name = self.co.pyop_field('co_name')
- self.co_filename = self.co.pyop_field('co_filename')
-
- self.f_lineno = int_from_int(self.field('f_lineno'))
- self.f_lasti = int_from_int(self.field('f_lasti'))
- self.co_nlocals = int_from_int(self.co.field('co_nlocals'))
- self.co_varnames =
PyTupleObjectPtr.from_pyobject_ptr(self.co.field('co_varnames'))
-
- def iter_locals(self):
- '''
- Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
- the local variables of this frame
- '''
- if self.is_optimized_out():
- return
-
- f_localsplus = self.field('f_localsplus')
- for i in safe_range(self.co_nlocals):
- pyop_value = PyObjectPtr.from_pyobject_ptr(f_localsplus[i])
- if not pyop_value.is_null():
- pyop_name = PyObjectPtr.from_pyobject_ptr(self.co_varnames[i])
- yield (pyop_name, pyop_value)
-
- def iter_globals(self):
- '''
- Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
- the global variables of this frame
- '''
- if self.is_optimized_out():
- return
-
- pyop_globals = self.pyop_field('f_globals')
- return pyop_globals.iteritems()
-
- def iter_builtins(self):
- '''
- Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
- the builtin variables
- '''
- if self.is_optimized_out():
- return
-
- pyop_builtins = self.pyop_field('f_builtins')
- return pyop_builtins.iteritems()
-
- def get_var_by_name(self, name):
- '''
- Look for the named local variable, returning a (PyObjectPtr, scope) pair
- where scope is a string 'local', 'global', 'builtin'
-
- If not found, return (None, None)
- '''
- for pyop_name, pyop_value in self.iter_locals():
- if name == pyop_name.proxyval(set()):
- return pyop_value, 'local'
- for pyop_name, pyop_value in self.iter_globals():
- if name == pyop_name.proxyval(set()):
- return pyop_value, 'global'
- for pyop_name, pyop_value in self.iter_builtins():
- if name == pyop_name.proxyval(set()):
- return pyop_value, 'builtin'
- return None, None
-
- def filename(self):
- '''Get the path of the current Python source file, as a
string'''
- if self.is_optimized_out():
- return '(frame information optimized out)'
- return self.co_filename.proxyval(set())
-
- def current_line_num(self):
- '''Get current line number as an integer (1-based)
-
- Translated from PyFrame_GetLineNumber and PyCode_Addr2Line
-
- See Objects/lnotab_notes.txt
- '''
- if self.is_optimized_out():
- return None
- f_trace = self.field('f_trace')
- if long(f_trace) != 0:
- # we have a non-NULL f_trace:
- return self.f_lineno
- else:
- #try:
- return self.co.addr2line(self.f_lasti)
- #except ValueError:
- # return self.f_lineno
-
- def current_line(self):
- '''Get the text of the current source line as a string, with a
trailing
- newline character'''
- if self.is_optimized_out():
- return '(frame information optimized out)'
- with open(self.filename(), 'r') as f:
- all_lines = f.readlines()
- # Convert from 1-based current_line_num to 0-based list offset:
- return all_lines[self.current_line_num()-1]
-
- def write_repr(self, out, visited):
- if self.is_optimized_out():
- out.write('(frame information optimized out)')
- return
- out.write('Frame 0x%x, for file %s, line %i, in %s ('
- % (self.as_address(),
- self.co_filename.proxyval(visited),
- self.current_line_num(),
- self.co_name.proxyval(visited)))
- first = True
- for pyop_name, pyop_value in self.iter_locals():
- if not first:
- out.write(', ')
- first = False
-
- out.write(pyop_name.proxyval(visited))
- out.write('=')
- pyop_value.write_repr(out, visited)
-
- out.write(')')
-
-class PySetObjectPtr(PyObjectPtr):
- _typename = 'PySetObject'
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('%s(...)' % self.safe_tp_name())
- visited.add(self.as_address())
-
- members = []
- table = self.field('table')
- for i in safe_range(self.field('mask')+1):
- setentry = table[i]
- key = setentry['key']
- if key != 0:
- key_proxy = PyObjectPtr.from_pyobject_ptr(key).proxyval(visited)
- if key_proxy != '<dummy key>':
- members.append(key_proxy)
- if self.safe_tp_name() == 'frozenset':
- return frozenset(members)
- else:
- return set(members)
-
- def write_repr(self, out, visited):
- out.write(self.safe_tp_name())
-
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('(...)')
- return
- visited.add(self.as_address())
-
- out.write('([')
- first = True
- table = self.field('table')
- for i in safe_range(self.field('mask')+1):
- setentry = table[i]
- key = setentry['key']
- if key != 0:
- pyop_key = PyObjectPtr.from_pyobject_ptr(key)
- key_proxy = pyop_key.proxyval(visited) # FIXME!
- if key_proxy != '<dummy key>':
- if not first:
- out.write(', ')
- first = False
- pyop_key.write_repr(out, visited)
- out.write('])')
-
-
-class PyBytesObjectPtr(PyObjectPtr):
- _typename = 'PyBytesObject'
-
- def __str__(self):
- field_ob_size = self.field('ob_size')
- field_ob_sval = self.field('ob_sval')
- char_ptr = field_ob_sval.address.cast(_type_unsigned_char_ptr)
- return ''.join([chr(char_ptr[i]) for i in safe_range(field_ob_size)])
-
- def proxyval(self, visited):
- return str(self)
-
-class PyTupleObjectPtr(PyObjectPtr):
- _typename = 'PyTupleObject'
-
- def __getitem__(self, i):
- # Get the gdb.Value for the (PyObject*) with the given index:
- field_ob_item = self.field('ob_item')
- return field_ob_item[i]
-
- def proxyval(self, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('(...)')
- visited.add(self.as_address())
-
- result = tuple([PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
- for i in
safe_range(int_from_int(self.field('ob_size')))])
- return result
-
- def write_repr(self, out, visited):
- # Guard against infinite loops:
- if self.as_address() in visited:
- out.write('(...)')
- return
- visited.add(self.as_address())
-
- out.write('(')
- for i in safe_range(int_from_int(self.field('ob_size'))):
- if i > 0:
- out.write(', ')
- element = PyObjectPtr.from_pyobject_ptr(self[i])
- element.write_repr(out, visited)
- if self.field('ob_size') == 1:
- out.write(',)')
- else:
- out.write(')')
-
-class PyTypeObjectPtr(PyObjectPtr):
- _typename = 'PyTypeObject'
-
-
-class PyUnicodeObjectPtr(PyObjectPtr):
- _typename = 'PyUnicodeObject'
-
- def proxyval(self, visited):
- # From unicodeobject.h:
- # Py_ssize_t length; /* Length of raw Unicode data in buffer */
- # Py_UNICODE *str; /* Raw Unicode buffer */
- field_length = long(self.field('length'))
- field_str = self.field('str')
-
- # Gather a list of ints from the Py_UNICODE array; these are either
- # UCS-2 or UCS-4 code points:
- Py_UNICODEs = [int(field_str[i]) for i in safe_range(field_length)]
-
- # Convert the int code points to unicode characters, and generate a
- # local unicode instance:
- result = u''.join([unichr(ucs) for ucs in Py_UNICODEs])
- return result
-
-
-def int_from_int(gdbval):
- return int(str(gdbval))
-
-
-def stringify(val):
- # TODO: repr() puts everything on one line; pformat can be nicer, but
- # can lead to v.long results; this function isolates the choice
- if True:
- return repr(val)
- else:
- from pprint import pformat
- return pformat(val)
-
-
-class PyObjectPtrPrinter:
- "Prints a (PyObject*)"
-
- def __init__ (self, gdbval):
- self.gdbval = gdbval
-
- def to_string (self):
- pyop = PyObjectPtr.from_pyobject_ptr(self.gdbval)
- if True:
- return pyop.get_truncated_repr(MAX_OUTPUT_LEN)
- else:
- # Generate full proxy value then stringify it.
- # Doing so could be expensive
- proxyval = pyop.proxyval(set())
- return stringify(proxyval)
-
-def pretty_printer_lookup(gdbval):
- type = gdbval.type.unqualified()
- if type.code == gdb.TYPE_CODE_PTR:
- type = type.target().unqualified()
- t = str(type)
- if t in ("PyObject", "PyFrameObject",
"PyUnicodeObject"):
- return PyObjectPtrPrinter(gdbval)
-
-"""
-During development, I've been manually invoking the code in this way:
-(gdb) python
-
-import sys
-sys.path.append('/home/david/coding/python-gdb')
-import libpython
-end
-
-then reloading it after each edit like this:
-(gdb) python reload(libpython)
-
-The following code should ensure that the prettyprinter is registered
-if the code is autoloaded by gdb when visiting libpython.so, provided
-that this python file is installed to the same path as the library (or its
-.debug file) plus a "-gdb.py" suffix, e.g:
- /usr/lib/libpython2.6.so.1.0-gdb.py
- /usr/lib/debug/usr/lib/libpython2.6.so.1.0.debug-gdb.py
-"""
-def register (obj):
- if obj == None:
- obj = gdb
-
- # Wire up the pretty-printer
- obj.pretty_printers.append(pretty_printer_lookup)
-
-register (gdb.current_objfile ())
-
-
-class Frame(object):
- '''
- Wrapper for gdb.Frame, adding various methods
- '''
- def __init__(self, gdbframe):
- self._gdbframe = gdbframe
-
- def older(self):
- older = self._gdbframe.older()
- if older:
- return Frame(older)
- else:
- return None
-
- def newer(self):
- newer = self._gdbframe.newer()
- if newer:
- return Frame(newer)
- else:
- return None
-
- def select(self):
- self._gdbframe.select()
-
- def get_index(self):
- '''Calculate index of frame, starting at 0 for the newest frame
within
- this thread'''
- index = 0
- # Go down until you reach the newest frame:
- iter_frame = self
- while iter_frame.newer():
- index += 1
- iter_frame = iter_frame.newer()
- return index
-
- def is_evalframeex(self):
- if self._gdbframe.function():
- if self._gdbframe.function().name == 'PyEval_EvalFrameEx':
- '''
- I believe we also need to filter on the inline
- struct frame_id.inline_depth, only regarding frames with
- an inline depth of 0 as actually being this function
-
- So we reject those with type gdb.INLINE_FRAME
- '''
- if self._gdbframe.type() == gdb.NORMAL_FRAME:
- # We have a PyEval_EvalFrameEx frame:
- return True
-
- return False
-
- def get_pyop(self):
- try:
- f = self._gdbframe.read_var('f')
- return PyFrameObjectPtr.from_pyobject_ptr(f)
- except ValueError:
- return None
-
- @classmethod
- def get_selected_frame(cls):
- _gdbframe = gdb.selected_frame()
- if _gdbframe:
- return Frame(_gdbframe)
- return None
-
- @classmethod
- def get_selected_python_frame(cls):
- '''Try to obtain the Frame for the python code in the selected
frame,
- or None'''
- frame = cls.get_selected_frame()
-
- while frame:
- if frame.is_evalframeex():
- return frame
- frame = frame.older()
-
- # Not found:
- return None
-
- def print_summary(self):
- if self.is_evalframeex():
- pyop = self.get_pyop()
- if pyop:
- sys.stdout.write('#%i %s\n' % (self.get_index(),
pyop.get_truncated_repr(MAX_OUTPUT_LEN)))
- sys.stdout.write(pyop.current_line())
- else:
- sys.stdout.write('#%i (unable to read python frame
information)\n' % self.get_index())
- else:
- sys.stdout.write('#%i\n' % self.get_index())
-
-class PyList(gdb.Command):
- '''List the current Python source code, if any
-
- Use
- py-list START
- to list at a different line number within the python source.
-
- Use
- py-list START, END
- to list a specific range of lines within the python source.
- '''
-
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-list",
- gdb.COMMAND_FILES,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- import re
-
- start = None
- end = None
-
- m = re.match(r'\s*(\d+)\s*', args)
- if m:
- start = int(m.group(0))
- end = start + 10
-
- m = re.match(r'\s*(\d+)\s*,\s*(\d+)\s*', args)
- if m:
- start, end = map(int, m.groups())
-
- frame = Frame.get_selected_python_frame()
- if not frame:
- print 'Unable to locate python frame'
- return
-
- pyop = frame.get_pyop()
- if not pyop:
- print 'Unable to read information on python frame'
- return
-
- filename = pyop.filename()
- lineno = pyop.current_line_num()
-
- if start is None:
- start = lineno - 5
- end = lineno + 5
-
- if start<1:
- start = 1
-
- with open(filename, 'r') as f:
- all_lines = f.readlines()
- # start and end are 1-based, all_lines is 0-based;
- # so [start-1:end] as a python slice gives us [start, end] as a
- # closed interval
- for i, line in enumerate(all_lines[start-1:end]):
- linestr = str(i+start)
- # Highlight current line:
- if i + start == lineno:
- linestr = '>' + linestr
- sys.stdout.write('%4s %s' % (linestr, line))
-
-
-# ...and register the command:
-PyList()
-
-def move_in_stack(move_up):
- '''Move up or down the stack (for the py-up/py-down
command)'''
- frame = Frame.get_selected_python_frame()
- while frame:
- if move_up:
- iter_frame = frame.older()
- else:
- iter_frame = frame.newer()
-
- if not iter_frame:
- break
-
- if iter_frame.is_evalframeex():
- # Result:
- iter_frame.select()
- iter_frame.print_summary()
- return
-
- frame = iter_frame
-
- if move_up:
- print 'Unable to find an older python frame'
- else:
- print 'Unable to find a newer python frame'
-
-class PyUp(gdb.Command):
- 'Select and print the python stack frame that called this one (if any)'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-up",
- gdb.COMMAND_STACK,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- move_in_stack(move_up=True)
-
-PyUp()
-
-class PyDown(gdb.Command):
- 'Select and print the python stack frame called by this one (if any)'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-down",
- gdb.COMMAND_STACK,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- move_in_stack(move_up=False)
-
-PyDown()
-
-class PyBacktrace(gdb.Command):
- 'Display the current python frame and all the frames within its call stack (if
any)'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-bt",
- gdb.COMMAND_STACK,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- frame = Frame.get_selected_python_frame()
- while frame:
- if frame.is_evalframeex():
- frame.print_summary()
- frame = frame.older()
-
-PyBacktrace()
-
-class PyPrint(gdb.Command):
- 'Look up the given python variable name, and print it'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-print",
- gdb.COMMAND_DATA,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- name = str(args)
-
- frame = Frame.get_selected_python_frame()
- if not frame:
- print 'Unable to locate python frame'
- return
-
- pyop_frame = frame.get_pyop()
- if not pyop_frame:
- print 'Unable to read information on python frame'
- return
-
- pyop_var, scope = pyop_frame.get_var_by_name(name)
-
- if pyop_var:
- print ('%s %r = %s'
- % (scope,
- name,
- pyop_var.get_truncated_repr(MAX_OUTPUT_LEN)))
- else:
- print '%r not found' % name
-
-PyPrint()
-
-class PyLocals(gdb.Command):
- 'Look up the given python variable name, and print it'
- def __init__(self):
- gdb.Command.__init__ (self,
- "py-locals",
- gdb.COMMAND_DATA,
- gdb.COMPLETE_NONE)
-
-
- def invoke(self, args, from_tty):
- name = str(args)
-
- frame = Frame.get_selected_python_frame()
- if not frame:
- print 'Unable to locate python frame'
- return
-
- pyop_frame = frame.get_pyop()
- if not pyop_frame:
- print 'Unable to read information on python frame'
- return
-
- for pyop_name, pyop_value in pyop_frame.iter_locals():
- print ('%s = %s'
- % (pyop_name.proxyval(set()),
- pyop_value.get_truncated_repr(MAX_OUTPUT_LEN)))
-
-PyLocals()
commit dd3cb47629970fe54d5dd87825c005d51e3070be
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Nov 29 16:09:30 2017 +0100
Remove our downstream systemtap instrumentation as now upstream provides us
with dtrace hooks.
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
deleted file mode 100644
index a48fe7c..0000000
--- a/00055-systemtap.patch
+++ /dev/null
@@ -1,762 +0,0 @@
-diff -up Python-3.3.0rc2/configure.ac.systemtap Python-3.3.0rc2/configure.ac
---- Python-3.3.0rc2/configure.ac.systemtap 2012-09-09 05:11:14.000000000 -0400
-+++ Python-3.3.0rc2/configure.ac 2012-09-10 09:17:21.114511781 -0400
-@@ -2678,6 +2678,23 @@ if test "$with_valgrind" != no; then
- OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
- fi
-
-+# Check for systemtap support
-+# On Linux, /usr/bin/dtrace is in fact a shim to SystemTap
-+AC_MSG_CHECKING([for --with-systemtap])
-+AC_ARG_WITH([systemtap],
-+ AC_HELP_STRING([--with(out)-systemtap], [disable/enable SystemTap
support]),,
-+ with_systemtap=no)
-+AC_MSG_RESULT([$with_systemtap])
-+if test "$with_systemtap" != no; then
-+ AC_DEFINE(WITH_SYSTEMTAP, 1,
-+ [Define if you want to compile in SystemTap support])
-+ SYSTEMTAPOBJS="Python/pysystemtap.o"
-+ SYSTEMTAPDEPS="\$(srcdir)/Python/pysystemtap.h"
-+fi
-+
-+AC_SUBST(SYSTEMTAPOBJS)
-+AC_SUBST(SYSTEMTAPDEPS)
-+
- # -I${DLINCLDIR} is added to the compile rule for importdl.o
- AC_SUBST(DLINCLDIR)
- DLINCLDIR=.
-diff -up Python-3.3.0rc2/Doc/howto/index.rst.systemtap
Python-3.3.0rc2/Doc/howto/index.rst
---- Python-3.3.0rc2/Doc/howto/index.rst.systemtap 2012-09-09 05:10:51.000000000 -0400
-+++ Python-3.3.0rc2/Doc/howto/index.rst 2012-09-10 09:17:21.117511779 -0400
-@@ -29,4 +29,5 @@ Currently, the HOWTOs are:
- argparse.rst
- ipaddress.rst
- clinic.rst
-+ instrumentation.rst
-
-diff -up Python-3.3.0rc2/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0rc2/Doc/howto/instrumentation.rst
---- Python-3.3.0rc2/Doc/howto/instrumentation.rst.systemtap 2012-09-10 09:17:21.117511779
-0400
-+++ Python-3.3.0rc2/Doc/howto/instrumentation.rst 2012-09-10 09:17:21.117511779 -0400
-@@ -0,0 +1,295 @@
-+.. _instrumentation:
-+
-+====================================
-+Instrumenting CPython with SystemTap
-+====================================
-+
-+:author: David Malcolm <dmalcolm(a)redhat.com>
-+
-+DTrace and SystemTap are monitoring tools, each providing a way to inspect
-+what the processes on a computer system are doing. They both use
-+domain-specific languages allowing a user to write scripts which:
-+
-+ - filter which processes are to be observed
-+ - gather data from the processes of interest
-+ - generate reports on the data
-+
-+As of Python 3.3, CPython can be built with embedded "markers" that can be
-+observed by a SystemTap script, making it easier to monitor what the CPython
-+processes on a system are doing.
-+
-+.. Potentially this document could be expanded to also cover DTrace markers.
-+ However, I'm not a DTrace expert.
-+
-+.. I'm using ".. code-block:: c" for SystemTap scripts, as "c"
is syntactically
-+ the closest match that Sphinx supports
-+
-+
-+Enabling the static markers
-+---------------------------
-+
-+In order to build CPython with the embedded markers for SystemTap, the
-+SystemTap development tools must be installed.
-+
-+On a Fedora or Red Hat Enterprise Linux machine, this can be done via::
-+
-+ yum install systemtap-sdt-devel
-+
-+CPython must then be configured `--with-systemtap`::
-+
-+ checking for --with-systemtap... yes
-+
-+You can verify if the SystemTap static markers are present in the built
-+binary by seeing if it contains a ".note.stapsdt" section.
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -S ./python | grep .note.stapsdt
-+ [29] .note.stapsdt NOTE 0000000000000000 00308d78 000000b8 0 0
0 4
-+
-+If you've built python as a shared library (with --enable-shared), you need
-+to look instead within the shared library. For example:
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt
-+ [28] .note.stapsdt NOTE 0000000000000000 00365b68 000000b8 0 0
0 4
-+
-+Earlier versions of SystemTap stored the markers in a ".probes" section.
-+
-+For the curious, you can see the metadata for the static markers using this
-+invocation.
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -x .note.stapsdt ./python
-+
-+ Hex dump of section [29] '.note.stapsdt', 184 bytes at offset 0x308d78:
-+ 0x00000000 08000000 45000000 03000000 73746170 ....E.......stap
-+ 0x00000010 73647400 d4664b00 00000000 4fc36600 sdt..fK.....O.f.
-+ 0x00000020 00000000 488d9000 00000000 70797468 ....H.......pyth
-+ 0x00000030 6f6e0066 756e6374 696f6e5f 5f656e74 on.function__ent
-+ 0x00000040 72790038 40257261 78203840 25726478 ry.8@%rax 8@%rdx
-+ 0x00000050 202d3440 25656378 00000000 08000000 -4@%ecx........
-+ 0x00000060 46000000 03000000 73746170 73647400 F.......stapsdt.
-+ 0x00000070 0d674b00 00000000 4fc36600 00000000 .gK.....O.f.....
-+ 0x00000080 4a8d9000 00000000 70797468 6f6e0066 J.......python.f
-+ 0x00000090 756e6374 696f6e5f 5f726574 75726e00 unction__return.
-+ 0x000000a0 38402572 61782038 40257264 78202d34 8@%rax 8@%rdx -4
-+ 0x000000b0 40256563 78000000 @%ecx...
-+
-+and a sufficiently modern eu-readelf can print the metadata:
-+
-+.. code-block:: bash
-+
-+ $ eu-readelf -n ./python
-+
-+ Note section [ 1] '.note.gnu.build-id' of 36 bytes at offset 0x190:
-+ Owner Data size Type
-+ GNU 20 GNU_BUILD_ID
-+ Build ID: a28f8db1b224530b0d38ad7b82a249cf7c3f18d6
-+
-+ Note section [27] '.note.stapsdt' of 184 bytes at offset 0x1ae884:
-+ Owner Data size Type
-+ stapsdt 70 Version: 3
-+ PC: 0xe0d3a, Base: 0x14b150, Semaphore: 0x3ae882
-+ Provider: python, Name: function__return, Args: '8@%rbx 8@%r13 -4@%eax'
-+ stapsdt 69 Version: 3
-+ PC: 0xe0f37, Base: 0x14b150, Semaphore: 0x3ae880
-+ Provider: python, Name: function__entry, Args: '8@%rbx 8@%r13 -4@%eax'
-+
-+The above metadata contains information for SystemTap describing how it can
-+patch strategically-placed machine code instructions to enable the tracing
-+hooks used by a SystemTap script.
-+
-+
-+Static markers
-+--------------
-+
-+The low-level way to use the SystemTap integration is to use the static
-+markers directly. This requires you to explicitly state the binary file
-+containing them.
-+
-+For example, this script can be used to show the call/return hierarchy of a
-+Python script:
-+
-+.. code-block:: c
-+
-+ probe process('python').mark("function__entry") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%s => %s in %s:%d\\n",
-+ thread_indent(1), funcname, filename, lineno);
-+ }
-+
-+ probe process('python').mark("function__return") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%s <= %s in %s:%d\\n",
-+ thread_indent(-1), funcname, filename, lineno);
-+ }
-+
-+It can be invoked like this:
-+
-+.. code-block:: bash
-+
-+ $ stap \
-+ show-call-hierarchy.stp \
-+ -c ./python test.py
-+
-+The output looks like this::
-+
-+ 11408 python(8274): => __contains__ in Lib/_abcoll.py:362
-+ 11414 python(8274): => __getitem__ in Lib/os.py:425
-+ 11418 python(8274): => encode in Lib/os.py:490
-+ 11424 python(8274): <= encode in Lib/os.py:493
-+ 11428 python(8274): <= __getitem__ in Lib/os.py:426
-+ 11433 python(8274): <= __contains__ in Lib/_abcoll.py:366
-+
-+where the columns are:
-+
-+ - time in microseconds since start of script
-+
-+ - name of executable
-+
-+ - PID of process
-+
-+and the remainder indicates the call/return hierarchy as the script executes.
-+
-+For a `--enable-shared` build of CPython, the markers are contained within the
-+libpython shared library, and the probe's dotted path needs to reflect this. For
-+example, this line from the above example::
-+
-+ probe process('python').mark("function__entry") {
-+
-+should instead read::
-+
-+ probe
process('python').library("libpython3.3dm.so.1.0").mark("function__entry")
{
-+
-+(assuming a debug build of CPython 3.3)
-+
-+.. I'm reusing the "c:function" type for markers
-+
-+.. c:function:: function__entry(str filename, str funcname, int lineno)
-+
-+ This marker indicates that execution of a Python function has begun. It is
-+ only triggered for pure-python (bytecode) functions.
-+
-+ The filename, function name, and line number are provided back to the
-+ tracing script as positional arguments, which must be accessed using
-+ `$arg1`, `$arg2`:
-+
-+ * `$arg1` : `(const char *)` filename, accessible using `user_string($arg1)`
-+
-+ * `$arg2` : `(const char *)` function name, accessible using
-+ `user_string($arg2)`
-+
-+ * `$arg3` : `int` line number
-+
-+ * `$arg4` : `(PyFrameObject *)`, the frame being executed
-+
-+.. c:function:: function__return(str filename, str funcname, int lineno)
-+
-+ This marker is the converse of `function__entry`, and indicates that
-+ execution of a Python function has ended (either via ``return``, or via an
-+ exception). It is only triggered for pure-python (bytecode) functions.
-+
-+ The arguments are the same as for `function__entry`
-+
-+
-+Tapsets
-+-------
-+
-+The higher-level way to use the SystemTap integration is to use a "tapset":
-+SystemTap's equivalent of a library, which hides some of the lower-level
-+details of the static markers.
-+
-+Here is a tapset file, based on a non-shared build of CPython:
-+
-+.. code-block:: c
-+
-+ /*
-+ Provide a higher-level wrapping around the function__entry and
-+ function__return markers:
-+ */
-+ probe python.function.entry =
process("python").mark("function__entry")
-+ {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+ frameptr = $arg4
-+ }
-+ probe python.function.return =
process("python").mark("function__return")
-+ {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+ frameptr = $arg4
-+ }
-+
-+If this file is installed in SystemTap's tapset directory (e.g.
-+`/usr/share/systemtap/tapset`), then these additional probepoints become
-+available:
-+
-+.. c:function:: python.function.entry(str filename, str funcname, int lineno, frameptr)
-+
-+ This probe point indicates that execution of a Python function has begun.
-+ It is only triggered for pure-python (bytecode) functions.
-+
-+.. c:function:: python.function.return(str filename, str funcname, int lineno,
frameptr)
-+
-+ This probe point is the converse of `python.function.return`, and indicates
-+ that execution of a Python function has ended (either via ``return``, or
-+ via an exception). It is only triggered for pure-python (bytecode) functions.
-+
-+
-+Examples
-+--------
-+This SystemTap script uses the tapset above to more cleanly implement the
-+example given above of tracing the Python function-call hierarchy, without
-+needing to directly name the static markers:
-+
-+.. code-block:: c
-+
-+ probe python.function.entry
-+ {
-+ printf("%s => %s in %s:%d\n",
-+ thread_indent(1), funcname, filename, lineno);
-+ }
-+
-+ probe python.function.return
-+ {
-+ printf("%s <= %s in %s:%d\n",
-+ thread_indent(-1), funcname, filename, lineno);
-+ }
-+
-+
-+The following script uses the tapset above to provide a top-like view of all
-+running CPython code, showing the top 20 most frequently-entered bytecode
-+frames, each second, across the whole system:
-+
-+.. code-block:: c
-+
-+ global fn_calls;
-+
-+ probe python.function.entry
-+ {
-+ fn_calls[pid(), filename, funcname, lineno] += 1;
-+ }
-+
-+ probe timer.ms(1000) {
-+ printf("\033[2J\033[1;1H") /* clear screen */
-+ printf("%6s %80s %6s %30s %6s\n",
-+ "PID", "FILENAME", "LINE",
"FUNCTION", "CALLS")
-+ foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
-+ printf("%6d %80s %6d %30s %6d\n",
-+ pid, filename, lineno, funcname,
-+ fn_calls[pid, filename, funcname, lineno]);
-+ }
-+ delete fn_calls;
-+ }
-+
-diff -up Python-3.3.0rc2/Lib/test/test_systemtap.py.systemtap
Python-3.3.0rc2/Lib/test/test_systemtap.py
---- Python-3.3.0rc2/Lib/test/test_systemtap.py.systemtap 2012-09-10 09:17:21.117511779
-0400
-+++ Python-3.3.0rc2/Lib/test/test_systemtap.py 2012-09-10 09:17:21.117511779 -0400
-@@ -0,0 +1,234 @@
-+# Verify that systemtap static probes work
-+#
-+import subprocess
-+import sys
-+import sysconfig
-+import os
-+import unittest
-+
-+from test.support import run_unittest, TESTFN, unlink
-+
-+if '--with-systemtap' not in sysconfig.get_config_var('CONFIG_ARGS'):
-+ raise unittest.SkipTest("Python was not configured --with-systemtap")
-+
-+try:
-+ _, stap_version = subprocess.Popen(["stap", "-V"],
-+ stdout=subprocess.PIPE,
-+ stderr=subprocess.PIPE,
-+ ).communicate()
-+except OSError:
-+ # This is what "no stap" looks like. There may, however, be other
-+ # errors that manifest this way too.
-+ raise unittest.SkipTest("Couldn't find stap on the path")
-+
-+def invoke_systemtap_script(script, cmd):
-+ # Start a child process, probing with the given systemtap script
-+ # (passed as stdin to the "stap" tool)
-+ # The script should be a bytes instance
-+ # Return (stdout, stderr) pair
-+
-+ p = subprocess.Popen(["stap", "-", '-vv', '-c',
cmd],
-+ stdin=subprocess.PIPE,
-+ stdout=subprocess.PIPE,
-+ stderr=subprocess.PIPE)
-+ out, err = p.communicate(input=script)
-+ return out, err
-+
-+# Verify that stap can run a simple "hello world"-style script
-+# This can fail for various reasons:
-+# - missing kernel headers
-+# - permissions (a non-root user needs to be in the "stapdev" group)
-+TRIVIAL_STAP_SCRIPT = b'probe begin { println("hello world") exit ()
}'
-+
-+out, err = invoke_systemtap_script(TRIVIAL_STAP_SCRIPT, 'true')
-+if out != b'hello world\n':
-+ raise unittest.SkipTest("Test systemtap script did not run; stderr was:
%s" % err)
-+
-+# We don't expect stderr to be empty, since we're invoking stap with
"-vv": stap
-+# will (we hope) generate debugging output on stderr.
-+
-+def invoke_python_under_systemtap(script, pythoncode=None, pythonfile=None):
-+ # Start a child python process, probing with the given systemtap script
-+ # (passed as stdin to the "stap" tool)
-+ # The script should be a bytes instance
-+ # Return (stdout, stderr) pair
-+
-+ if pythonfile:
-+ pythoncmd = '%s %s' % (sys.executable, pythonfile)
-+ else:
-+ pythoncmd = '%s -c %r' % (sys.executable, pythoncode)
-+
-+ # The process tree of a stap invocation of a command goes through
-+ # something like this:
-+ # stap ->fork/exec(staprun; exec stapio ->f/e(-c cmd); exec staprun -r)
-+ # and this trip through setuid leads to LD_LIBRARY_PATH being dropped,
-+ # which would lead to an --enable-shared build of python failing to be
-+ # find its libpython, with an error like:
-+ # error while loading shared libraries: libpython3.3dm.so.1.0: cannot
-+ # open shared object file: No such file or directory
-+ # Hence we need to jump through some hoops to expose LD_LIBRARY_PATH to
-+ # the invoked python process:
-+ LD_LIBRARY_PATH = os.environ.get('LD_LIBRARY_PATH', '')
-+ if LD_LIBRARY_PATH:
-+ pythoncmd = 'env LD_LIBRARY_PATH=%s ' % LD_LIBRARY_PATH + pythoncmd
-+
-+ return invoke_systemtap_script(script, pythoncmd)
-+
-+# When using the static markers, we need to supply the prefix of a systemtap
-+# dotted probe point that containing the marker.
-+# See
http://sourceware.org/systemtap/langref/Probe_points.html
-+#
-+# We need to determine if this is a shared-library build
-+#
-+# Note that sysconfig can get this wrong; see:
-+#
http://bugs.python.org/issue14774
-+#
-+if '--enable-shared' in sysconfig.get_config_var('CONFIG_ARGS'):
-+ # For a shared-library build, the markers are in library(INSTSONAME):
-+ INSTSONAME = sysconfig.get_config_var('INSTSONAME')
-+ probe_prefix = 'process("%s").library("%s")' %
(sys.executable, INSTSONAME)
-+else:
-+ # For a non-shared-library build, we can simply use sys.executable:
-+ probe_prefix = 'process("%s")' % sys.executable
-+
-+# The following script ought to generate lots of lines showing recursive
-+# function entry and return, of the form:
-+# 11408 python(8274): => __contains__ in Lib/_abcoll.py:362
-+# 11414 python(8274): => __getitem__ in Lib/os.py:425
-+# 11418 python(8274): => encode in Lib/os.py:490
-+# 11424 python(8274): <= encode in Lib/os.py:493
-+# 11428 python(8274): <= __getitem__ in Lib/os.py:426
-+# 11433 python(8274): <= __contains__ in Lib/_abcoll.py:366
-+# where the column are:
-+# - time in microseconds since start of script
-+# - name of executable
-+# - PID of process
-+# and the remainder indicates the call/return hierarchy
-+
-+hierarchy_script = ('''
-+probe %s.mark("function__entry") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%%s => %%s in %%s:%%d\\n", thread_indent(1), funcname,
filename, lineno);
-+}
-+
-+probe %s.mark("function__return") {
-+ filename = user_string($arg1);
-+ funcname = user_string($arg2);
-+ lineno = $arg3;
-+
-+ printf("%%s <= %%s in %%s:%%d\\n", thread_indent(-1), funcname,
filename, lineno);
-+}
-+''' % (probe_prefix, probe_prefix)).encode('utf-8')
-+
-+
-+class ErrorDumper:
-+ # A context manager that dumps extra information if an exception is raised,
-+ # to help track down why the problem occurred
-+ def __init__(self, out, err):
-+ self.out = out
-+ self.err = err
-+
-+ def __enter__(self):
-+ pass
-+
-+ def __exit__(self, type_, value, traceback):
-+ if type_:
-+ # an exception is being raised:
-+ print('stdout: %s' % out.decode())
-+ print('stderr: %s' % err.decode())
-+
-+class SystemtapTests(unittest.TestCase):
-+
-+ def test_invoking_python(self):
-+ # Ensure that we can invoke python under stap, with a trivial stap
-+ # script:
-+ out, err = invoke_python_under_systemtap(
-+ b'probe begin { println("hello from stap") exit () }',
-+ pythoncode="print('hello from python')")
-+ with ErrorDumper(out, err):
-+ self.assertIn(b'hello from stap', out)
-+ self.assertIn(b'hello from python', out)
-+
-+ def test_function_entry(self):
-+ # Ensure that the function_entry static marker works
-+ out, err = invoke_python_under_systemtap(hierarchy_script)
-+ # stdout ought to contain various lines showing recursive function
-+ # entry and return (see above)
-+
-+ # Uncomment this for debugging purposes:
-+ # print(out.decode('utf-8'))
-+
-+ # Executing the cmdline-supplied "pass":
-+ # 0 python(8274): => <module> in <string>:1
-+ # 5 python(8274): <= <module> in <string>:1
-+ with ErrorDumper(out, err):
-+ self.assertIn(b'=> <module> in <string>:1', out,
-+ msg="stdout: %s\nstderr: %s\n" % (out, err))
-+
-+ def test_function_encoding(self):
-+ # Ensure that function names containing non-Latin 1 code
-+ # points are handled:
-+ pythonfile = TESTFN
-+ try:
-+ unlink(pythonfile)
-+ f = open(pythonfile, "wb")
-+ f.write("""
-+# Sample script with non-ASCII filename, for use by test_systemtap.py
-+# Implicitly UTF-8
-+
-+def ():
-+ '''Function with non-ASCII identifier; I believe this reads
"mojibake"'''
-+ print("hello world!")
-+
-+()
-+""".encode('utf-8'))
-+ f.close()
-+
-+ out, err = invoke_python_under_systemtap(hierarchy_script,
-+ pythonfile=pythonfile)
-+ out_utf8 = out.decode('utf-8')
-+ with ErrorDumper(out, err):
-+ self.assertIn('=> <module> in %s:5' % pythonfile,
out_utf8)
-+ self.assertIn(' => in %s:5' % pythonfile, out_utf8)
-+ self.assertIn(' <= in %s:7' % pythonfile, out_utf8)
-+ self.assertIn('<= <module> in %s:9' % pythonfile,
out_utf8)
-+ finally:
-+ unlink(pythonfile)
-+
-+ @unittest.skipIf(sys.getfilesystemencoding() == 'ascii',
-+ 'the test filename is not encodable with ASCII')
-+ def test_filename_encoding(self):
-+ # Ensure that scripts names containing non-Latin 1 code
-+ # points are handled:
-+ pythonfile = TESTFN + '_.py'
-+ try:
-+ unlink(pythonfile)
-+ f = open(pythonfile, "wb")
-+ f.write("""
-+def foo():
-+ '''Function with non-ASCII identifier; I believe this reads
"mojibake"'''
-+ print("hello world!")
-+
-+foo()
-+""".encode('utf-8'))
-+ f.close()
-+
-+ out, err = invoke_python_under_systemtap(hierarchy_script,
-+ pythonfile=pythonfile)
-+ out_utf8 = out.decode('utf-8')
-+ with ErrorDumper(out, err):
-+ self.assertIn('=> <module> in %s:2' % pythonfile,
out_utf8)
-+ self.assertIn(' => foo in %s:2' % pythonfile, out_utf8)
-+ self.assertIn(' <= foo in %s:4' % pythonfile, out_utf8)
-+ self.assertIn('<= <module> in %s:6' % pythonfile,
out_utf8)
-+ finally:
-+ unlink(pythonfile)
-+
-+def test_main():
-+ run_unittest(SystemtapTests)
-+
-+if __name__ == "__main__":
-+ test_main()
-diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap Python-3.3.0rc2/Makefile.pre.in
---- Python-3.3.0rc2/Makefile.pre.in.systemtap 2012-09-09 05:11:05.000000000 -0400
-+++ Python-3.3.0rc2/Makefile.pre.in 2012-09-10 09:19:51.195501518 -0400
-@@ -363,6 +363,7 @@ PYTHON_OBJS= \
- Python/formatter_unicode.o \
- Python/fileutils.o \
- Python/$(DYNLOADFILE) \
-+ @SYSTEMTAPOBJS@ \
- $(LIBOBJS) \
- $(MACHDEP_OBJS) \
- $(THREADOBJ)
-@@ -713,7 +714,8 @@ Objects/setobject.o: $(srcdir)/Objects/s
- $(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
- $(OPCODETARGETGEN) $(OPCODETARGETS_H)
-
--Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h
-+Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h \
-+ $(srcdir)/Python/ceval_systemtap.h @SYSTEMTAPDEPS@
-
- Python/frozen.o: Python/importlib.h Python/importlib_external.h
-
-@@ -724,6 +726,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
- Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py
- $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
Objects/typeslots.inc
-
-+# Only needed with --with-systemtap; not a public header:
-+$(srcdir)/Python/pysystemtap.h: $(srcdir)/Python/pysystemtap.d
-+ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Python/pysystemtap.d
-+
-+Python/pysystemtap.o: $(srcdir)/Python/pysystemtap.d Python/ceval.o
-+ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Python/pysystemtap.d Python/ceval.o
-+
- ############################################################################
- # Header files
-
-@@ -1345,6 +1354,7 @@ clean: pycremoval
- -rm -f Lib/lib2to3/*Grammar*.pickle
- -rm -f Programs/_testembed Programs/_freeze_importlib
- -rm -rf build
-+ -rm -f $(srcdir)/Python/pysystemtap.h
-
- profile-removal:
- find . -name '*.gc??' -exec rm -f {} ';'
-diff -up Python-3.3.0rc2/pyconfig.h.in.systemtap Python-3.3.0rc2/pyconfig.h.in
---- Python-3.3.0rc2/pyconfig.h.in.systemtap 2012-09-09 05:11:14.000000000 -0400
-+++ Python-3.3.0rc2/pyconfig.h.in 2012-09-10 09:17:21.120511781 -0400
-@@ -1306,6 +1306,9 @@
- /* Define if you want to compile in Python-specific mallocs */
- #undef WITH_PYMALLOC
-
-+/* Define if you want to compile in SystemTap support */
-+#undef WITH_SYSTEMTAP
-+
- /* Define if you want to compile in rudimentary thread support */
- #undef WITH_THREAD
-
-diff -up Python-3.3.0rc2/Python/ceval.c.systemtap Python-3.3.0rc2/Python/ceval.c
---- Python-3.3.0rc2/Python/ceval.c.systemtap 2012-09-09 05:11:12.000000000 -0400
-+++ Python-3.3.0rc2/Python/ceval.c 2012-09-10 09:17:21.122511781 -0400
-@@ -18,6 +18,8 @@
-
- #include <ctype.h>
-
-+#include "ceval_systemtap.h"
-+
- #ifndef WITH_TSC
-
- #define READ_TIMESTAMP(var)
-@@ -1160,6 +1162,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
- }
- }
-
-+ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
-+ systemtap_function_entry(f);
-+ }
-+
- co = f->f_code;
- names = co->co_names;
- consts = co->co_consts;
-@@ -3077,6 +3083,11 @@ fast_yield:
-
- /* pop frame */
- exit_eval_frame:
-+
-+ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
-+ systemtap_function_return(f);
-+ }
-+
- Py_LeaveRecursiveCall();
- f->f_executing = 0;
- tstate->frame = f->f_back;
-diff -up Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap
Python-3.3.0rc2/Python/ceval_systemtap.h
---- Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap 2012-09-10 09:17:21.122511781
-0400
-+++ Python-3.3.0rc2/Python/ceval_systemtap.h 2012-09-10 09:17:21.122511781 -0400
-@@ -0,0 +1,86 @@
-+/*
-+ Support for SystemTap static markers
-+*/
-+
-+#ifdef WITH_SYSTEMTAP
-+
-+#include "pysystemtap.h"
-+
-+/*
-+ A struct to hold all of the information gathered when one of the traceable
-+ markers is triggered
-+*/
-+struct frame_marker_info
-+{
-+ PyObject *filename_obj;
-+ PyObject *funcname_obj;
-+ const char *filename;
-+ const char *funcname;
-+ int lineno;
-+};
-+
-+static void
-+get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
-+{
-+ PyObject *ptype;
-+ PyObject *pvalue;
-+ PyObject *ptraceback;
-+
-+ PyErr_Fetch(&ptype, &pvalue, &ptraceback);
-+
-+ fmi->filename_obj = PyUnicode_EncodeFSDefault(f->f_code->co_filename);
-+ if (fmi->filename_obj) {
-+ fmi->filename = PyBytes_AsString(fmi->filename_obj);
-+ } else {
-+ fmi->filename = NULL;
-+ }
-+
-+ fmi->funcname_obj = PyUnicode_AsUTF8String(f->f_code->co_name);
-+ if (fmi->funcname_obj) {
-+ fmi->funcname = PyBytes_AsString(fmi->funcname_obj);
-+ } else {
-+ fmi->funcname = NULL;
-+ }
-+
-+ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
-+
-+ PyErr_Restore(ptype, pvalue, ptraceback);
-+
-+}
-+
-+static void
-+release_frame_marker_info(struct frame_marker_info *fmi)
-+{
-+ Py_XDECREF(fmi->filename_obj);
-+ Py_XDECREF(fmi->funcname_obj);
-+}
-+
-+static void
-+systemtap_function_entry(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.funcname, fmi.lineno, f);
-+ release_frame_marker_info(&fmi);
-+}
-+
-+static void
-+systemtap_function_return(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.funcname, fmi.lineno, f);
-+ release_frame_marker_info(&fmi);
-+}
-+
-+#else /* #ifdef WITH_SYSTEMTAP */
-+
-+/*
-+ When configured --without-systemtap, everything compiles away to nothing:
-+*/
-+#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
-+#define PYTHON_FUNCTION_RETURN_ENABLED() 0
-+#define systemtap_function_entry(f)
-+#define systemtap_function_return(f)
-+
-+#endif
-diff -up Python-3.3.0rc2/Python/pysystemtap.d.systemtap
Python-3.3.0rc2/Python/pysystemtap.d
---- Python-3.3.0rc2/Python/pysystemtap.d.systemtap 2012-09-10 09:17:21.122511781 -0400
-+++ Python-3.3.0rc2/Python/pysystemtap.d 2012-09-10 09:17:21.122511781 -0400
-@@ -0,0 +1,4 @@
-+provider python {
-+ probe function__entry(const char *, const char *, int, PyFrameObject *);
-+ probe function__return(const char *, const char *, int, PyFrameObject *);
-+};
diff --git a/libpython.stp b/libpython.stp
deleted file mode 100644
index f41da80..0000000
--- a/libpython.stp
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Systemtap tapset to make it easier to trace Python */
-
-/*
- Define python.function.entry/return:
-*/
-probe python.function.entry =
process("python3").library("LIBRARY_PATH").mark("function__entry")
-{
- filename = user_string($arg1);
- funcname = user_string($arg2);
- lineno = $arg3;
-}
-probe python.function.return =
process("python3").library("LIBRARY_PATH").mark("function__return")
-{
- filename = user_string($arg1);
- funcname = user_string($arg2);
- lineno = $arg3;
-}
diff --git a/pyfuntop.stp b/pyfuntop.stp
deleted file mode 100644
index f235a23..0000000
--- a/pyfuntop.stp
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/stap
-
-global fn_calls;
-
-probe python.function.entry
-{
- fn_calls[pid(), filename, funcname, lineno] += 1;
-}
-
-probe timer.ms(1000) {
- printf("\033[2J\033[1;1H") /* clear screen */
- printf("%6s %80s %6s %30s %6s\n",
- "PID", "FILENAME", "LINE", "FUNCTION",
"CALLS")
- foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
- printf("%6d %80s %6d %30s %6d\n",
- pid, filename, lineno, funcname,
- fn_calls[pid, filename, funcname, lineno]);
- }
-
- delete fn_calls;
-}
diff --git a/python3.spec b/python3.spec
index 9b8f122..29a7d70 100644
--- a/python3.spec
+++ b/python3.spec
@@ -47,9 +47,6 @@ License: Python
# Support for the GDB debugger
%bcond_without gdb_hooks
-# Support for systemtap instrumentation
-%bcond_with systemtap
-
# The dbm.gnu module (key-value database)
%bcond_without gdbm
@@ -192,12 +189,6 @@ BuildRequires: readline-devel
BuildRequires: sqlite-devel
BuildRequires: gdb
-%if %{with systemtap}
-BuildRequires: systemtap-devel
-BuildRequires: systemtap-sdt-devel
-%global tapsetdir /usr/share/systemtap/tapset
-%endif
-
BuildRequires: tar
BuildRequires: tcl-devel
BuildRequires: tix-devel
@@ -232,19 +223,6 @@ Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# with different Python runtimes as necessary:
Source3: macros.pybytecompile%{pybasever}
-# Systemtap tapset to make it easier to use the systemtap static probes
-# (actually a template; LIBRARY_PATH will get fixed up during install)
-# Written by dmalcolm; not yet sent upstream
-Source5: libpython.stp
-
-# Example systemtap script using the tapset
-# Written by wcohen, mjw, dmalcolm; not yet sent upstream
-Source6: systemtap-example.stp
-
-# Another example systemtap script that uses the tapset
-# Written by dmalcolm; not yet sent upstream
-Source7: pyfuntop.stp
-
# A simple script to check timestamps of bytecode files
# Run in check section with Python that is currently being built
# Written by bkabrda
@@ -265,13 +243,6 @@ Source11: idle3.appdata.xml
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: 00001-rpath.patch
-# 00055 #
-# Systemtap support: add statically-defined probe points
-# Patch sent upstream as
http://bugs.python.org/issue14776
-# with some subsequent reworking to cope with LANG=C in an rpmbuild
-# (where sys.getfilesystemencoding() == 'ascii')
-Patch55: 00055-systemtap.patch
-
# 00102 #
# Change the various install paths to use /usr/lib64/ instead or /usr/lib
# Only used when "%{_lib}" == "lib64"
@@ -611,12 +582,6 @@ so extensions for both verisons can co-exist in the same directory.
%prep
%setup -q -n Python-%{version}%{?prerel}
-%if %{with systemtap}
-# Provide an example of usage of the tapset:
-cp -a %{SOURCE6} .
-cp -a %{SOURCE7} .
-%endif # with systemtap
-
# Remove bundled libraries to ensure that we're using the system copy.
rm -r Modules/expat
rm -r Modules/zlib
@@ -631,10 +596,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
#
%patch1 -p1
-%if %{with systemtap}
-%patch55 -p1 -b .systemtap
-%endif
-
%if "%{_lib}" == "lib64"
%patch102 -p1
%endif
@@ -733,9 +694,6 @@ BuildPython() {
--enable-loadable-sqlite-extensions \
--with-dtrace \
--with-lto \
-%if %{with systemtap}
- --with-systemtap \
-%endif
%if %{with valgrind}
--with-valgrind \
%endif
@@ -857,16 +815,6 @@ InstallPython() {
#endif
EOF
- # Systemtap hooks
-%if %{with systemtap}
- mkdir -p %{buildroot}%{tapsetdir}
- sed \
- -e "s|LIBRARY_PATH|%{_libdir}/${PyInstSoName}|" \
- -e 's|"python3"|"python3${Postfix}"|' \
- %{_sourcedir}/libpython.stp \
- > %{buildroot}%{tapsetdir}/libpython%{pybasever}${Postfix}-%{wordsize}.stp
-%endif # with systemtap
-
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -1354,12 +1302,6 @@ fi
%{_libdir}/%{py_INSTSONAME_optimized}
%{_libdir}/libpython3.so
-%if %{with systemtap}
-%dir %(dirname %{tapsetdir})
-%dir %{tapsetdir}
-%{tapsetdir}/%{libpython_stp_optimized}
-%doc systemtap-example.stp pyfuntop.stp
-%endif
%files devel
%defattr(-,root,root)
@@ -1509,11 +1451,6 @@ fi
# now; they're listed below, under "-devel":
%{_libdir}/%{py_INSTSONAME_debug}
-%if %{with systemtap}
-%dir %(dirname %{tapsetdir})
-%dir %{tapsetdir}
-%{tapsetdir}/%{libpython_stp_debug}
-%endif
# Analog of the -devel subpackage's files:
%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
diff --git a/systemtap-example.stp b/systemtap-example.stp
deleted file mode 100644
index 164333a..0000000
--- a/systemtap-example.stp
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- Example usage of the Python systemtap tapset to show a nested view of all
- Python function calls (and returns) across the whole system.
-
- Run this using
- stap systemtap-example.stp
- to instrument all Python processes on the system, or (for example) using
- stap systemtap-example.stp -c COMMAND
- to instrument a specific program (implemented in Python)
-*/
-probe python.function.entry
-{
- printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename,
lineno);
-}
-
-probe python.function.return
-{
- printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename,
lineno);
-}
commit d673becd53fe3ce18146482b8c44b60570b3bd50
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Dec 1 13:57:42 2017 +0100
Ignore stuff
diff --git a/.gitignore b/.gitignore
index dafa321..1107137 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
/*.tar.*
+/*.src.rpm
+/results_python3*
commit 2f822707637375b7e7883c8035091601c48e062f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Dec 1 13:55:24 2017 +0100
Add sources for 3.7.0a2
diff --git a/sources b/sources
index 002f1fb..24ad9db 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.3.tar.xz) =
32f24a3adcb7880003c7ecdc5e53e838e774adda76b308961d8215e28db630b2fa2828097817924c76afa4212b2df3362eb64d4e10f37c0147f512ec5aa8662b
+SHA512 (Python-3.7.0a2.tar.xz) =
604cef8fe079afad66f4df17752cb1afdc7d12abd392cb5995b16e83df392f56bd1ed88d6be9e0f3e9d7ea0dd394e497f6311547d277d9fd1ebd3eb039f7b068
commit c93495efdf6816cb23deca82b36df13e6a83a25b
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Dec 1 13:53:36 2017 +0100
Purge %changelog
diff --git a/python37.spec b/python37.spec
index be00616..57a4691 100644
--- a/python37.spec
+++ b/python37.spec
@@ -1677,1029 +1677,3 @@ fi
* Tue Nov 28 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.1.a2
- Update to 3.7.0 alpha 2
- Removed merged patches 262, 277, 279
-
-* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
-- Raise the release of platform-python obsoletes for better maintainability
-
-* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
-- Obsolete platform-python and it's subpackages
-
-* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
-- Fix memory corruption due to allocator mix
-Resolves: rhbz#1498207
-
-* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
-- Update to Python 3.6.3
-
-* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
-- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
-- Make the -devel package require redhat-rpm-config
-Resolves: rhbz#1496757
-
-* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
-- Fix /usr/bin/env dependency from python3-tools
-Resolves: rhbz#1482118
-
-* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
-- Include `-g` in the flags sent to the linker (LDFLAGS)
-Resolves: rhbz#1483222
-
-* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
-- Specfile cleanup
-- Make the main description also applicable to the SRPM
-- Add audiotest.au to the test package
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
-- Remove %%{pylibdir}/Tools/scripts/2to3
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
-- Expat >= 2.1.0 is everywhere, remove explicit requires
-- Conditionalize systemtap-devel BuildRequires
-- For consistency, require /usr/sbin/ifconfig instead of net-tools
-
-* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
-- Rename patch files to be consistent
-- Run autotools to generate the configure script before building
-- Merge lib64 patches (104 into 102)
-- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
-- Remove patches 157 and 186, which had test changes left over after upstreaming
-- Remove patch 188, a temporary workaround for hashlib tests
-- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
-- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
-
-* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
-- Use python3 style of calling super() without arguments in rpath
- patch to prevent recursion in UnixCCompiler subclasses
-Resolves: rhbz#1458122
-
-* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
-- Add bcond for --without optimizations
-- Reword package descriptions
-- Remove Group declarations
-- Skip failing test_float_with_comma
-
-* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
-- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
-
-* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
-- Use bconds for configuring the build
-- Reorganize the initial sections
-
-* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
-- Have /usr/bin/2to3 (rhbz#1111275)
-- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
-
-* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
-- Revert "Add --executable option to install.py command"
- This enhancement is currently not needed and it can possibly
- collide with `pip --editable`option
-
-* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
-- Fix the "urllib FTP protocol stream injection" vulnerability
-Resolves: rhbz#1478916
-
-* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
-- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
- bsddb), however, no longer needod for Python 3
-- Tested building Python 3 with and without the dependency, all tests pass and
- filelists of resulting RPMs are identical
-
-* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
-- Do not generate debuginfo subpackages (#1476593)
-- Rebuild with binutils fix for ppc64le (#1475636)
-
-* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
-
-* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
-- Make test_asyncio to not depend on the current SIGHUP signal handler.
-
-* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
-- Update to Python 3.6.2
-
-* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
-- Update to the latest upstream implementation of PEP 538
-
-* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
-- Make pip and distutils in user environment install into separate location
-
-* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
-- Fix test_alpn_protocols from test_ssl
-- Do not require rebundled setuptools dependencies
-
-* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
-- Added a dependency to the devel subpackage on python3-rpm-generators which
- have been excised out of rpm-build
-- Updated notes on bootstrapping Python on top of this specfile accordingly
-- Involves: rhbz#1410631, rhbz#1444925
-
-* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
-- Enable profile guided optimizations for x86_64 and i686 architectures
-- Update to a newer implementation of PEP 538
-- Update description to reflect that Python 3 is now the default Python
-
-* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
-- Update PEP 538 to the latest upstream implementation
-
-* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
-- Enable link time optimizations
-- Move windows executables to the devel subpackage (rhbz#1426257)
-
-* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
-- Rename python3.Xdm-config script from -debug to be arch specific
-Resolves: rhbz#1179073
-
-* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
-- Install the Makefile in its proper location (rhbz#1438219)
-
-* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
-- Update to version 3.6.1 final
-
-* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
-- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
-
-* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
-- Update to Python 3.6.1 release candidate 1
-- Add patch 264 to skip a known test failure on aarch64
-
-* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
-- Use proper command line parsing in _testembed
-- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
-
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
-
-* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
-- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
-
-* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
-- Revert "Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables..." to prevent build failures
- of packages using alternate build tools
-
-* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
-- Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables
-- Use new %%_module_build macro
-
-* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
-- Add --executable option to install.py command
-
-* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
-- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
-in order for the virtualenvs to work properly
-
-* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
-
-* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
-- Add missing %%license macro
-
-* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
-- Modify the runtime dependency of python3-libs on system-python-libs again,
- because previous attempt didn't work properly with dnf resolving mechanism
-
-* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
-- Modify the runtime dependency of python3-libs on system-python-libs to use
- just the version and release number, but not the dist tag due to Modularity
-
-* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
-- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
-- Skip test_aead_aes_gcm during rpmbuild
-
-* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
-- Rebuild for readline 7.x
-
-* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
-- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
-
-* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
-- Define HAVE_LONG_LONG as 1 for backwards compatibility
-
-* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
-- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
-
-* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
-- Update to Python 3.6.0 final
-
-* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
-- Enable rewheel
-
-* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
-- Update to Python 3.6.0 release candidate 1
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
-- Update to Python 3.6.0 beta 4
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
-- Set to work with pip version 9.0.1
-
-* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
-- Use proper patch numbering and base upstream branch for
-porting ssl and hashlib modules to OpenSSL 1.1.0
-- Drop hashlib patch for now
-- Add riscv64 arch to 64bit and no-valgrind arches
-
-* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
-- Make it build with OpenSSL-1.1.0 based on upstream patch
-
-* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
-- Obsolete and Provide python35 package
-
-* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
-- Update %py_byte_compile macro
-- Remove unused configure flags (rhbz#1374357)
-
-* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
-- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
- recompile optimized .pyc files
-- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
- files are no more
-- Resolves rhbz#1373635
-
-* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
-- Rebased to version 3.5.2
-- Set to work with pip version 8.1.2
-- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
-- Removed arch or environment specific patches 194, 196, 203, and 208
- as test builds indicate they are no longer needed
-- Updated patches 102, 146, and 242 to work with the new Python codebase
-- Removed patches 200, 201, 5000 which weren't even being applied
-
-* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
-- Fix for CVE-2016-1000110 HTTPoxy attack
-- SPEC file cleanup
-
-* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
-- Build properly on MIPS
-
-* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
--
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
-- Refactor patch for properly fixing CVE-2016-5636
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
-- Fix test_pyexpat failure with Expat version of 2.2.0
-
-* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
-- Move xml module to system-python-libs
-
-* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
-- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
-- Raise an error when STARTTLS fails
-- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
-- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
-- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
-
-* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
-- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
-
-* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
-- Move distutils to system-python-libs
-
-* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
-- Provide python3-enum34
-
-* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
-- Provide System Python packages and macros
-
-* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
-
-* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
-- Drop python3 macros, require python/python3-rpm-macros
-
-* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
-- Update to 3.5.1
-- Removed patch 199 and 207 (upstream)
-
-* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
-- Remove versioned libpython from devel package
-
-* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
-- add correct arch for ppc64/ppc64le to fix build failure
-
-* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
-- Hide the private _Py_atomic_xxx symbols from public header
-
-* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
-- Rebuild with wheel set to 1
-
-* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
-- Update to 3.5.0
-
-* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
-- python3-devel: Require python-macros for version independant macros such as
- python_provide. See fpc#281 and fpc#534.
-
-* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
-- Use 1024bit DH key in test_ssl
-- Use -O0 when compiling -debug build
-- Update pip version variable to the version we actually ship
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
-- Make relocating Python by changing _prefix actually work
-Resolves: rhbz#1231801
-
-* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
-- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
-
-* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
-- Updated to 3.4.3
-- BuildPython now accepts additional build options
-- Temporarily disabled test_gdb on arm (rhbz#1196181)
-
-* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
-- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
- (
http://bugs.python.org/issue23433)
-
-* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
-- Rebuilt for Fedora 23 Change
-
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
-
-* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
-- Own systemtap dirs (#710733)
-
-* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
-- build with valgrind on ppc64le
-- disable test_gdb on s390(x) until rhbz#1181034 is resolved
-
-* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
-- New patches: 170 (gc asserts), 200 (gettext headers),
- 201 (gdbm memory leak)
-
-* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
-- OpenSSL disabled SSLv3 in SSLv23 method
-
-* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
-- Update to 3.4.2
-- Refreshed patches: 156 (gdb autoload)
-- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
-
-* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
-- Fix CVE-2014-4650 - CGIHTTPServer URL handling
-Resolves: rhbz#1113529
-
-* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
-- exclude test_gdb on ppc* (rhbz#1132488)
-
-* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
-- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
-
-* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
-
-* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
-- aarch64 has valgrind, just list those that don't support it
-
-* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
-
-* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
-- bump release and rebuild to link with the correct tcl/tk libs on ppcle
-
-* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
-- Change paths to bundled projects in rewheel patch
-
-* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
-- In config script, use uname -m to write the arch
-
-* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
-- update the arch list where valgrind exists - %%power64 includes also
- ppc64le which is not supported yet
-
-* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
-- Forward arguments to the arch specific config script
-Resolves: rhbz#1102683
-
-* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
-- Rename python3.Xm-config script to arch specific.
-Resolves: rhbz#1091815
-
-* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
-- Use python3-*, not python-* runtime requires on setuptools and pip
-- rebuild for tcl-8.6
-
-* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
-- Update the rewheel module
-
-* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
-- Fix multilib dependencies.
-Resolves: rhbz#1091815
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
-- Update to Python 3.4.1
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
-- Fix test_gdb failure on ppc64le
-Resolves: rhbz#1095355
-
-* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
-- Add macro %%python3_version_nodots
-
-* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
-- Disable test_faulthandler, test_gdb on aarch64
-Resolves: rhbz#1045193
-
-* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
-- Don't add Werror=declaration-after-statement for extension
- modules through setup.py (PyBT#21121)
-
-* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
-- Add setuptools and pip to Requires
-
-* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
-- Point __os_install_post to correct brp-* files
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
-- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
-- Update to Python 3.4 final
-- Add patch adding the rewheel module
-- Merge patches from master
-
-* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
-- Update to Python 3.4 beta 2.
-- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
-- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
-
-* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
-- Update to Python 3.4 beta 1.
-- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
-ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
-- Removed patch 00187 (remove pthread atfork; upstreamed)
-
-* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
-- Update to Python 3.4 alpha 4.
-- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
-114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
-test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
-from py_compile)
-- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
-Koji), 142 (the mock issue that caused this is fixed)
-- Added patch 187 (remove thread atfork) - will be in next version
-- Refreshed script for checking pyc and pyo timestamps with new ignored files.
-- The fips patch is disabled for now until upstream makes a final decision
-what to do with sha3 implementation for 3.4.0.
-
-* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
-- Bytecompile all *.py files properly during build (rhbz#1023607)
-
-* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
-- Added fix for CVE-2013-4238 (rhbz#996399)
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
-- fix up indentation in arm patch
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
-- disable a test that fails on arm
-- enable valgrind support on arm arches
-
-* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
-- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
-
-* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
-- Add patch for CVE-2013-2099 (rhbz#963261).
-
-* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
-- Updated to Python 3.3.2.
-- Refreshed patches: 153 (gdb test noise)
-- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
-test threads)
-- Synced patch numbers with python.spec.
-
-* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
-- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
-
-* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
-- Add patch that enables building on ppc64p7 (replace the sed, so that
-we get consistent with python2 spec and it's more obvious that we're doing it.
-
-* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
-- Add fix for gdb tests failing on arm, rhbz#951802.
-
-* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
-- Updated to Python 3.3.1.
-- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
-153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
-keeping few more downstream tests)
-- Removed patches: 3 (audiotest.au made it to upstream tarball)
-- Removed workaround for
http://bugs.python.org/issue14774, discussed in
-http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
-- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
-- renumber patches to keep them in sync with python.spec
-
-* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
-- Fix error in platform.platform() when non-ascii byte strings are decoded to
- unicode (rhbz#922149)
-
-* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
-- Fix up shared library extension (rhbz#889784)
-
-* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
-- add ppc64p7 build target, optimized for Power7
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
-- add workaround for ENOPROTOOPT seen running selftests in Koji
-(rhbz#913732)
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
-- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
-
-* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
-- add aarch64 (rhbz#909783)
-
-* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
-- add BR on bluez-libs-devel (rhbz#879720)
-
-* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
-- 3.3.0rc3 -> 3.3.0; drop alphatag
-
-* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
-- 3.3.0rc2 -> 3.3.0rc3
-
-* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
-- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
-
-* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
-- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
-
-* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
-- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
-134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
-correctly when LANG=C (patch 55); importlib.test was moved to
-test.test_importlib upstream
-
-* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
-- disable some failing checks on PPC* (rhbz#846849)
-
-* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
-- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
-patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
-configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream issue
12326);
-"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
-for stdlib (upstream issues 10645 and 12218); email/test moved to
-test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
-_decimal and _lzma modules; make collections modules explicit in payload again
-(upstream issue 11085); add _testbuffer module to tests subpackage (added in
-upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
-workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
-distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
-_lzma module); skip some tests within test_socket (patch 163)
-
-* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
-
-* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-
-* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
-- use macro for power64 (rhbz#834653)
-
-* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
-- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
-
-* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
-- fix tapset for debug build
-
-* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
-- update uid/gid handling to avoid int overflows seen with uid/gid
-values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
-
-* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
-- renumber autotools patch from 300 to 5000
-- specfile cleanups
-
-* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
-- fix test_gdb.py (patch 156; rhbz#817072)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
-- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
-generating SELinux denials on "import ctypes" and "import uuid" when
embedding
-Python within httpd (patch 155; rhbz#814391)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
-- add explicit version requirements on expat to avoid linkage problems with
-XML_SetHashSalt
-
-* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
-- fix test_gdb (patch 153)
-
-* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
-- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
-values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
-
-* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
-- use newly installed python for byte compiling (now for real)
-
-* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
-- use newly installed python for byte compiling (#787498)
-
-* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
-- Build with $RPM_LD_FLAGS (#756863).
-- Use xz-compressed source tarball.
-
-* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
-- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
-
-* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
-- python3-devel missing autogenerated pkgconfig() provides (#746751)
-
-* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
-- cherrypick fix for distutils not using __pycache__ when byte-compiling
-files (rhbz#722578)
-
-* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
-- re-enable gdbm (patch 148; rhbz#742242)
-
-* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
-- add a sys._debugmallocstats() function (patch 147)
-
-* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
-- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
-_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
-
-* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
-- disable gdbm module to prepare for gdbm soname bump
-
-* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
-- renumber and rename patches for consistency with python.spec (8 to 55, 106
-to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
-
-* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
-- rewrite of "check", introducing downstream-only hooks for skipping specific
-cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
-fine-grained manner than before; (patches 106, 133-142 sparsely, moving
-patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
-
-* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
-- 3.2.2
-
-* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
-- run selftests with "--verbose"
-- disable parts of test_io on ppc (rhbz#732998)
-
-* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
-- use "--findleaks --verbose3" when running test suite
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
-- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
-ppc to avoid aliasing violations (patch 130; rhbz#698726)
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
-- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
-
-* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
-- add %%python3_version to the rpm macros (rhbz#719082)
-
-* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
-- disable some tests on sparc arches
-
-* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
-- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
-of static library build (due to Modules/_testembed; patch 6), autotool
-intermediates (patch 300)
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
-- use the gdb hooks from the upstream tarball, rather than keeping our own copy
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
-- don't run test_openpty and test_pty in %%check
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
-- cleanup of BuildRequires; add comment headings to specfile sections
-
-* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
-- fix the libpython.stp systemtap tapset (rhbz#697730)
-
-* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
-- 3.2
-- drop alphatag
-- regenerate autotool patch
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
-- add a /usr/bin/python3-debug symlink within the debug subpackage
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
-- 3.2rc3
-- regenerate autotool patch
-
-* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
-
-* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
-- 3.2rc2
-
-* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
-- 3.2rc1
-- rework patch 6 (static lib removal)
-- remove upstreamed patch 130 (ppc debug build)
-- regenerate patch 300 (autotool intermediates)
-- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
-- added libpython3.so and 2to3-3.2
-
-* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
-- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
-error with dynamic annotations (when configured using --with-valgrind)
-- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
-
-* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
-- add --with-valgrind to configuration (on architectures that support this)
-
-* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
-- work around test_subprocess failure seen in koji (patch 129)
-
-* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
-- 3.2b2
-- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
-patch 8 (systemtap), patch 102 (lib64)
-- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
-patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
-fixed upstream)
-- regenerate patch 300 (autotool intermediates)
-- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
-patch 128)
-- stop using runtest.sh in %%check (dropped by upstream), replacing with
-regrtest; fixup list of failing tests
-- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
-- rework manifests of shared libraries to use "SOABI_" macros, reflecting
-PEP 3149
-- drop itertools, operator and _collections modules from the manifests as py3k
-commit r84058 moved these inside libpython; json/tests moved to test/json_tests
-- move turtle code into the tkinter subpackage
-
-* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
-- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
-
-* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
-- move most of the content of the core package to the libs subpackage, given
-that the libs aren't meaningfully usable without the standard libraries
-
-* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
-- Move test.support to core package (rhbz#596258)
-- Add various missing __pycache__ directories to payload
-
-* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
-- Add __pycache__ directory for site-packages
-
-* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
-- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
-- make find-provides-without-python-sonames.sh 64bit aware
-
-* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
-- 3.2a1; add alphatag
-- rework %%files in the light of PEP 3147 (__pycache__)
-- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
-better job of things, and the %%files explicitly lists our modules (r82746
-appears to break the old way of doing things). This leads to various modules
-changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
-dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
-_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
-testing/devel purposes)
-- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
-- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
-plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
-- add machinery for rebuilding "configure" and friends, using the correct
-version of autoconf (patch 300)
-- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
-- "modulator" was removed upstream
-- drop "-b" from patch applications affecting .py files to avoid littering the
-installation tree
-
-* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
-- Turn on computed-gotos.
-- Fix for parallel make and graminit.c
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
-- rebuild
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
-- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
-a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
-
-* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
-- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
-- reformat whitespace in audioop.c (patch 106)
-- CVE-2010-1634: fix various integer overflow checks in the audioop
-module (patch 107)
-- CVE-2010-2089: further checks within the audioop module (patch 108)
-- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
-
-* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
-- reading the timestamp counter is available only on some arches (see Python/ceval.c)
-
-* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
-- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
-(patch 105)
-
-* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
-- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
-(patch 104); enable them and the WITH_TSC option within the debug build
-
-* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
-- build and install two different configurations of Python 3: debug and
-standard, packaging the debug build in a new "python3-debug" subpackage
-(patch 103)
-
-* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
-- exclude test_http_cookies when running selftests, due to hang seen on
-http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
-11 hours)
-- update python-gdb.py from v5 to py3k version submitted upstream
-
-* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
-- update python-gdb.py from v4 to v5 (improving performance and stability,
-adding commands)
-
-* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
-- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
-cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
-and exceptions)
-
-* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
-- refresh gdb hooks to v3 (reworking how they are packaged)
-
-* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
-- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
-- drop upstreamed patch 2 (.pyc permissions handling)
-- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
-- drop upstreamed patch 200 (path-fixing script)
-
-* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
-- fix typo in libpython.stp (rhbz:575336)
-
-* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
-- add pyfuntop.stp example (source 7)
-- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
-consistency with python.spec
-
-* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
-- rebuild for new package of redhat-rpm-config (rhbz:564527)
-- use 'install -p' when running 'make install'
-
-* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
-- split configure options into multiple lines for easy of editing
-- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
-tapset defining "python.function.entry" and "python.function.return"
to make
-the markers easy to use (dmalcolm; source 5), and an example of using the
-tapset to the docs (dmalcolm; source 6) (rhbz:545179)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
-- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
-%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
-ldconfig (bug 562980), and which should also ensure it becomes part of the
-debuginfo subpackage, rather than the libs subpackage
-- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
-configure script, and to avoid fragile scripts that try to figure this out
-dynamically (e.g. for the -gdb.py change)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
-- add gdb hooks for easier debugging (Source 4)
-
-* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
-- update python-3.1.1-config.patch to remove downstream customization of build
-of pyexpat and elementtree modules
-- add patch adapted from upstream (patch 7) to add support for building against
-system expat; add --with-system-expat to "configure" invocation
-- remove embedded copies of expat and zlib from source tree during "prep"
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
-- introduce %%{dynload_dir} macro
-- explicitly list all lib-dynload files, rather than dynamically gathering the
-payload into a temporary text file, so that we can be sure what we are
-shipping
-- introduce a macros.pybytecompile source file, to help with packaging python3
-modules (Source3; written by Toshio)
-- rename "2to3-3" to "python3-2to3" to better reflect python 3 module
packaging
-plans
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
-- change python-3.1.1-config.patch to remove our downstream change to curses
-configuration in Modules/Setup.dist, so that the curses modules are built using
-setup.py with the downstream default (linking against libncursesw.so, rather
-than libncurses.so), rather than within the Makefile; add a test to %%install
-to verify the dso files that the curses module is linked against the correct
-DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
-
-* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
-- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
-builds for setting up the python3 copy of the source tree)
-
-* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
-- move lib2to3 from -tools subpackage to main package (bug 556667)
-
-* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
-- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
-- use the %%{_isa} macro to ensure that the python-devel dependency on python
-is for the correct multilib arch (#555943)
-- delete bundled copy of libffi to make sure we use the system one
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
-- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
-docs, rather than the 2.6 build
-
-* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
-- replace references to /usr with %%{_prefix}; replace references to
-/usr/include with %%{_includedir} (Toshio)
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
-- fix permission on find-provides-without-python-sonames.sh from 775 to 755
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
-- remove build-time requirements on tix and tk, since we already have
-build-time requirements on the -devel subpackages for each of these (Thomas
-Spura)
-- replace usage of %%define with %%global (Thomas Spura)
-- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
-longer be necessary
-- move various test files from the "tools"/"tkinter" subpackages to
the "test"
-subpackage
-
-* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
-- add %%check section (thanks to Thomas Spura)
-- update patch 4 to use correct shebang line
-- get rid of stray patch file from buildroot
-
-* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
-- switched a few instances of "find |xargs" to "find -exec" for
consistency.
-- made the description of __os_install_post more accurate.
-
-* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
-- add macros.python3 to the -devel subpackage, containing common macros for use
-when packaging python3 modules
-
-* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
-- add a provides of "python(abi)" (see bug 532118)
-- fix issues identified by a.badger in package review (bug 526126, comment 39):
- - use "3" thoughout metadata, rather than "3.*"
- - remove conditional around "pkg-config openssl"
- - use standard cleanup of RPM_BUILD_ROOT
- - replace hardcoded references to /usr with _prefix macro
- - stop removing egg-info files
- - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
-up shebang lines
- - stop attempting to remove no-longer-present .cvsignore files
- - move the post/postun sections above the "files" sections
-
-* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
-- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
-flag is used by default in the upstream code
-- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
-_init_posix(), so we include them in the core package, along with their parent
-directories (bug 531901)
-
-* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
-- reword description, based on suggestion by amcnabb
-- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
-- fix the test_tk and test_ttk_* selftests (patch 5)
-- fix up the specfile's handling of shebang/perms to avoid corrupting
-test_httpservers.py (sed command suggested by amcnabb)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
-- fixup importlib/_bootstrap.py so that it correctly handles being unable to
-open .pyc files for writing (patch 2, upstream issue 7187)
-- actually apply the rpath patch (patch 1)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
-- update patch0's setup of the crypt module to link it against libcrypt
-- update patch0 to comment "datetimemodule" back out, so that it is built
-using setup.py (see Setup, option 3), thus linking it statically against
-timemodule.c and thus avoiding a run-time "undefined symbol:
-_PyTime_DoubleToTimet" failure on "import datetime"
-
-* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
-- remove executable flag from various files that shouldn't have it
-- fix end-of-line encodings
-- fix a character encoding
-
-* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
-- disable invocation of brp-python-bytecompile in postprocessing, since
-it would be with the wrong version of python (adapted from ivazquez'
-python3000 specfile)
-- use a custom implementation of __find_provides in order to filter out bogus
-provides lines for the various .so modules
-- fixup distutils/unixccompiler.py to remove standard library path from rpath
-(patch 1, was Patch0 in ivazquez' python3000 specfile)
-- split out libraries into a -libs subpackage
-- update summaries and descriptions, basing content on ivazquez' specfile
-- fixup executable permissions on .py, .xpm and .xbm files, based on work in
-ivazquez's specfile
-- get rid of DOS batch files
-- fixup permissions for shared libraries from non-standard 555 to standard 755
-- move /usr/bin/python*-config to the -devel subpackage
-- mark various directories as being documentation
-
-* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
-- Initial package for Python 3.
-
commit 1da74de71e201c9109a4f256862d6cf863f7170a
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Dec 1 13:52:53 2017 +0100
Rename the specfile to fit package name
diff --git a/python3.spec b/python3.spec
deleted file mode 100644
index be00616..0000000
--- a/python3.spec
+++ /dev/null
@@ -1,2705 +0,0 @@
-# ==================
-# Top-level metadata
-# ==================
-
-%global pybasever 3.7
-
-# pybasever without the dot:
-%global pyshortver 37
-
-Name: python%{pyshortver}
-Summary: Version %{pybasever} of the Python interpreter
-URL:
https://www.python.org/
-
-
-# Second alpha
-%global prerel a2
-
-# WARNING When rebasing to a new Python version,
-# remember to update the python3-docs package as well
-Version: %{pybasever}.0
-Release: 0.1.%{?prerel}%{?dist}
-License: Python
-
-
-# ==================================
-# Conditionals controlling the build
-# ==================================
-
-# Note that the bcond macros are named for the CLI option they create.
-# "%%bcond_without" means "ENABLE by default and create a --without
option"
-
-
-# Flat package, i.e. python36, python37, python38 for tox etc.
-# warning: changes some other defaults
-# in Fedora, never turn this on for the python3 package
-# and always keep it on for python37 etc.
-# WARNING: This does not change the package name and summary above
-%bcond_without flatpackage
-
-
-# Expensive optimizations (mainly, profile-guided optimizations)
-%ifarch %{ix86} x86_64
-%bcond_without optimizations
-%else
-# On some architectures, the optimized build takes tens of hours, possibly
-# longer than Koji's 24-hour timeout. Disable optimizations here.
-%bcond_with optimizations
-%endif
-
-# Run the test suite in %%check
-%bcond_without tests
-
-# Ability to reuse RPM-installed pip using rewheel
-%if %{with flatpackage}
-%bcond_with rewheel
-%else
-%bcond_without rewheel
-%endif
-
-# Extra build for debugging the interpreter or C-API extensions
-# (the -debug subpackages)
-%if %{with flatpackage}
-%bcond_with debug_build
-%else
-%bcond_without debug_build
-%endif
-
-# Support for the GDB debugger
-%bcond_without gdb_hooks
-
-# Support for systemtap instrumentation
-%bcond_with systemtap
-
-# The dbm.gnu module (key-value database)
-%bcond_without gdbm
-
-# Main interpreter loop optimization
-%bcond_without computed_gotos
-
-# Support for the Valgrind debugger/profiler
-%ifnarch s390 %{mips} riscv64
-%bcond_without valgrind
-%else
-# Some arches don't have valgrind, disable support for it there.
-%bcond_with valgrind
-%endif
-
-
-# ==================================
-# Notes from bootstraping Python 3.6
-# ==================================
-#
-# New Python major version (3.X) break ABI and bytecode compatibility,
-# so all packages depending on it need to be rebuilt.
-#
-# Due to a dependency cycle between Python, gdb, rpm, pip, setuptools, wheel,
-# and other packages, this isn't straightforward.
-# Build in the following order:
-#
-# 1. At the same time:
-# - gdb without python support (add %%global _without_python 1 on top of
-# gdb's SPEC file)
-# - python-rpm-generators with bootstrapping_python set to 1
-# (this can be done also during step 2., but should be done before 3.)
-# 2. python3 without rewheel (use %%bcond_with rewheel instead of
-# %%bcond_without)
-# 3. At the same time:
-# - gdb with python support (remove %%global _without_python 1 on top of
-# gdb's SPEC file)
-# - python-rpm-generators with bootstrapping_python set to 0
-# (this can be done at any later step without negative effects)
-# 4. rpm
-# 5. python-setuptools with bootstrap set to 1
-# 6. python-pip with build_wheel set to 0
-# 7. python-wheel with %%bcond_without bootstrap
-# 8. python-setuptools with bootstrap set to 0 and also with_check set to 0
-# 9. python-pip with build_wheel set to 1
-# 10. pyparsing
-# 11. python3 with rewheel
-#
-# Then the most important packages have to be built, in dependency order.
-# These were:
-# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt
-#
-# After these have been built, a targeted rebuild should be done for the rest.
-
-
-# =====================
-# General global macros
-# =====================
-
-%global pylibdir %{_libdir}/python%{pybasever}
-%global dynload_dir %{pylibdir}/lib-dynload
-
-# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
-# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
-%global ABIFLAGS_optimized m
-%global ABIFLAGS_debug dm
-
-%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
-%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
-
-# All bytecode files are in a __pycache__ subdirectory, with a name
-# reflecting the version of the bytecode.
-# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
-# For example,
-# foo/bar.py
-# has bytecode at:
-# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
-# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
-%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
-
-# Python's configure script defines SOVERSION, and this is used in the Makefile
-# to determine INSTSONAME, the name of the libpython DSO:
-# LDLIBRARY='libpython$(VERSION).so'
-# INSTSONAME="$LDLIBRARY".$SOVERSION
-# We mirror this here in order to make it easier to add the -gdb.py hooks.
-# (if these get out of sync, the payload of the libs subpackage will fail
-# and halt the build)
-%global py_SOVERSION 1.0
-%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
-%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
-
-# Disable automatic bytecompilation. The python3 binary is not yet be
-# available in /usr/bin when Python is built. Also, the bytecompilation fails
-# on files that test invalid syntax.
-%undefine py_auto_byte_compile
-
-# For multilib support, files that are different between 32- and 64-bit arches
-# need different filenames. Use "64" or "32" according to the word
size.
-# Currently, the best way to determine an architecture's word size happens to
-# be checking %%{_lib}.
-%if "%{_lib}" == "lib64"
-%global wordsize 64
-%else
-%global wordsize 32
-%endif
-
-
-# =======================
-# Build-time requirements
-# =======================
-
-# (keep this list alphabetized)
-
-BuildRequires: autoconf
-BuildRequires: bluez-libs-devel
-BuildRequires: bzip2
-BuildRequires: bzip2-devel
-BuildRequires: desktop-file-utils
-BuildRequires: expat-devel
-
-BuildRequires: findutils
-BuildRequires: gcc-c++
-%if %{with gdbm}
-BuildRequires: gdbm-devel
-%endif
-BuildRequires: glibc-devel
-BuildRequires: gmp-devel
-BuildRequires: libappstream-glib
-BuildRequires: libffi-devel
-BuildRequires: libGL-devel
-BuildRequires: libuuid-devel
-BuildRequires: libX11-devel
-BuildRequires: ncurses-devel
-
-BuildRequires: openssl-devel
-BuildRequires: pkgconfig
-BuildRequires: readline-devel
-BuildRequires: sqlite-devel
-BuildRequires: gdb
-
-%if %{with systemtap}
-BuildRequires: systemtap-devel
-BuildRequires: systemtap-sdt-devel
-%global tapsetdir /usr/share/systemtap/tapset
-%endif
-
-BuildRequires: tar
-BuildRequires: tcl-devel
-BuildRequires: tix-devel
-BuildRequires: tk-devel
-
-%if %{with valgrind}
-BuildRequires: valgrind-devel
-%endif
-
-BuildRequires: xz-devel
-BuildRequires: zlib-devel
-
-BuildRequires: /usr/bin/dtrace
-
-# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
-BuildRequires: /usr/sbin/ifconfig
-
-%if %{with rewheel}
-BuildRequires: python3-setuptools
-BuildRequires: python3-pip
-%endif
-
-
-# =======================
-# Source code and patches
-# =======================
-
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
-
-# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
-# to enable specfiles to selectively byte-compile individual files and paths
-# with different Python runtimes as necessary:
-Source3: macros.pybytecompile%{pybasever}
-
-# Systemtap tapset to make it easier to use the systemtap static probes
-# (actually a template; LIBRARY_PATH will get fixed up during install)
-# Written by dmalcolm; not yet sent upstream
-Source5: libpython.stp
-
-# Example systemtap script using the tapset
-# Written by wcohen, mjw, dmalcolm; not yet sent upstream
-Source6: systemtap-example.stp
-
-# Another example systemtap script that uses the tapset
-# Written by dmalcolm; not yet sent upstream
-Source7: pyfuntop.stp
-
-# A simple script to check timestamps of bytecode files
-# Run in check section with Python that is currently being built
-# Written by bkabrda
-Source8: check-pyc-and-pyo-timestamps.py
-
-# Backward compatible no-op macro for system-python
-# Remove in Fedora 29
-Source9: macros.systempython
-
-# Desktop menu entry for idle3
-Source10: idle3.desktop
-
-# AppData file for idle3
-Source11: idle3.appdata.xml
-
-# 00001 #
-# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
-# Was Patch0 in ivazquez' python3000 specfile:
-Patch1: 00001-rpath.patch
-
-# 00055 #
-# Systemtap support: add statically-defined probe points
-# Patch sent upstream as
http://bugs.python.org/issue14776
-# with some subsequent reworking to cope with LANG=C in an rpmbuild
-# (where sys.getfilesystemencoding() == 'ascii')
-Patch55: 00055-systemtap.patch
-
-# 00102 #
-# Change the various install paths to use /usr/lib64/ instead or /usr/lib
-# Only used when "%{_lib}" == "lib64"
-# Not yet sent upstream.
-Patch102: 00102-lib64.patch
-
-# 00111 #
-# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
-# a libpythonMAJOR.MINOR.a
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
-# Downstream only: not appropriate for upstream
-Patch111: 00111-no-static-lib.patch
-
-# 00132 #
-# Add non-standard hooks to unittest for use in the "check" phase below, when
-# running selftests within the build:
-# @unittest._skipInRpmBuild(reason)
-# for tests that hang or fail intermittently within the build environment, and:
-# @unittest._expectedFailureInRpmBuild
-# for tests that always fail within the build environment
-#
-# The hooks only take effect if WITHIN_PYTHON_RPM_BUILD is set in the
-# environment, which we set manually in the appropriate portion of the "check"
-# phase below (and which potentially other python-* rpms could set, to reuse
-# these unittest hooks in their own "check" phases)
-Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
-
-# 00155 #
-# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
-# generating SELinux denials on "import ctypes" and "import uuid"
when
-# embedding Python within httpd
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=814391
-Patch155: 00155-avoid-ctypes-thunks.patch
-
-# 00160 #
-# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
-# header files in the build chroot, but may not be supported in the running
-# kernel, hence we disable this test in an rpm build.
-# Adding these was upstream issue
http://bugs.python.org/issue10142
-# Not yet sent upstream
-Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
-
-# 00163 #
-# Some tests within test_socket fail intermittently when run inside Koji;
-# disable them using unittest._skipInRpmBuild
-# Not yet sent upstream
-Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
-
-# 00170 #
-# In debug builds, try to print repr() when a C-level assert fails in the
-# garbage collector (typically indicating a reference-counting error
-# somewhere else e.g in an extension module)
-# The new macros/functions within gcmodule.c are hidden to avoid exposing
-# them within the extension API.
-# Sent upstream:
http://bugs.python.org/issue9263
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=614680
-Patch170: 00170-gc-assertions.patch
-
-# 00178 #
-# Don't duplicate various FLAGS in sysconfig values
-#
http://bugs.python.org/issue17679
-# Does not affect python2 AFAICS (different sysconfig values initialization)
-Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
-
-# 00189 #
-# Add the rewheel module, allowing to recreate wheels from already installed
-# ones
-#
https://github.com/bkabrda/rewheel
-Patch189: 00189-add-rewheel-module.patch
-
-# 00205 #
-# LIBPL variable in makefile takes LIBPL from configure.ac
-# but the LIBPL variable defined there doesn't respect libdir macro
-Patch205: 00205-make-libpl-respect-lib64.patch
-
-# 00251
-# 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
-Patch251: 00251-change-user-install-location.patch
-
-# 00264 #
-# test_pass_by_value was added in Python 3.6.1 and on aarch64
-# it is catching an error that was there, but wasn't tested before.
-# Therefore skipping the test on aarch64 until fixed upstream.
-# Reported upstream:
http://bugs.python.org/issue29804
-Patch264: 00264-skip-test-failing-on-aarch64.patch
-
-# 00273 #
-# Skip test_float_with_comma, which fails in Koji with UnicodeDecodeError
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
-Patch273: 00273-skip-float-test.patch
-
-# 00274 #
-# Upstream uses Debian-style architecture naming. Change to match Fedora.
-Patch274: 00274-fix-arch-names.patch
-
-
-# (New patches go here ^^^)
-#
-# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
-# please try to keep the patch numbers in-sync between all specfiles.
-#
-# More information, and a patch number catalog, is at:
-#
-#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
-
-
-# ==========================================
-# Descriptions, and metadata for subpackages
-# ==========================================
-
-%if %{without flatpackage}
-
-# Packages with Python modules in standard locations automatically
-# depend on python(abi). Provide that here.
-Provides: python(abi) = %{pybasever}
-
-# For backward compatibility only, remove in F29:
-Provides: system-python(abi) = %{pybasever}
-Provides: system-python = %{version}-%{release}
-Provides: system-python%{?_isa} = %{version}-%{release}
-Obsoletes: system-python < %{version}-%{release}
-
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-
-# In order to support multiple Python interpreters for development purposes,
-# packages with with the naming scheme flatpackage (e.g. python35) exist for
-# non-default versions of Python 3.
-# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
-# these names here.
-Provides: python%{pyshortver} = %{version}-%{release}
-# Note that using Obsoletes without package version is not standard practice.
-# Here we assert that *any* version of the system's default interpreter is
-# preferable to an "extra" interpreter. For example, python3-3.6.1 will
-# replace python36-3.6.2.
-Obsoletes: python%{pyshortver}
-
-# Shall be removed in Fedora 31
-# The release is bumped to 20, so we can do f27 platform-python updates
-# If the release in f27 ever goes >= 20, raise it here
-# If platform-python is ever reintroduced, make it higher version than this:
-%global platpyver 3.6.2-20
-Obsoletes: platform-python < %{platpyver}
-
-%if %{with rewheel}
-Requires: python3-setuptools
-Requires: python3-pip
-%endif
-
-# The description used both for the SRPM and the main `python3` subpackage:
-%description
-Python is an accessible, high-level, dynamically typed, interpreted programming
-language, designed with an emphasis on code readibility.
-It includes an extensive standard library, and has a vast ecosystem of
-third-party libraries.
-
-The ${name} package provides the "python3" executable: the reference
-interpreter for the Python language, version 3.
-The majority of its standard library is provided in the %{name}-libs package,
-which should be installed automatically along with %{name}.
-The remaining parts of the Python standard library are broken out into the
-%{name}-tkinter and %{name}-test packages, which may need to be installed
-separately.
-
-Documentation for Python is provided in the %{name}-docs package.
-
-Packages containing additional libraries for Python are generally named with
-the "%{name}-" prefix.
-
-
-%package libs
-Summary: Python runtime libraries
-
-# The "enum" module is included in the standard library.
-# Provide an upgrade path from the external library.
-Provides: python3-enum34 = 1.0.4-5%{?dist}
-Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
-
-# Python 3 built with glibc >= 2.24.90-26 needs to require it
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1410644
-Requires: glibc%{?_isa} >= 2.24.90-26
-
-# For backward compatibility only, remove in F29:
-Provides: system-python-libs = %{version}-%{release}
-Provides: system-python-libs%{?_isa} = %{version}-%{release}
-Obsoletes: system-python-libs < %{version}-%{release}
-
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-libs < %{platpyver}
-Obsoletes: platform-python-libs-devel < %{platpyver}
-
-%description libs
-This package contains runtime libraries for use by Python:
-- the majority of the Python standard library
-- a dynamically linked library for use by applications that embed Python as
- a scripting language, and by the main "python3" executable
-
-
-%package devel
-Summary: Libraries and header files needed for Python development
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-BuildRequires: python-rpm-macros
-Requires: python-rpm-macros
-Requires: python3-rpm-macros
-Requires: python3-rpm-generators
-
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
-# TODO change to a specific subpackage once available (#1218294)
-Requires: redhat-rpm-config
-
-Conflicts: %{name} < %{version}-%{release}
-
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-devel < %{platpyver}
-
-%description devel
-This package contains the header files and configuration needed to compile
-Python extension modules (typically written in C or C++), to embed Python
-into other programs, and to make binary distributions for Python libraries.
-
-It also contains the necessary macros to build RPM packages with Python modules.
-
-
-%package tools
-Summary: A collection of tools included with Python including 2to3 and idle
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-tkinter = %{version}-%{release}
-
-Provides: %{name}-2to3 = %{version}-%{release}
-Provides: %{name}-idle = %{version}-%{release}
-Provides: 2to3 = %{version}-%{release}
-Provides: idle3 = %{version}-%{release}
-
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-# /usr/bin/2to3 was moved from here
-# TODO Remove in Fedora 29
-Conflicts: python2-tools < 2.7.13-17
-Conflicts: python-tools < 2.7.13-17
-
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-tools < %{platpyver}
-
-%description tools
-This package contains several tools included with Python, including:
-- 2to3, an automatic source converter from Python 2.X
-- idle, a basic graphical development environment
-
-
-%package tkinter
-Summary: A GUI toolkit for Python
-Requires: %{name} = %{version}-%{release}
-
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-tkinter < %{platpyver}
-
-%description tkinter
-The Tkinter (Tk interface) library is a graphical user interface toolkit for
-the Python programming language.
-
-
-%package test
-Summary: The self-test suite for the main python3 package
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-tools = %{version}-%{release}
-
-# Shall be removed in Fedora 31
-Obsoletes: platform-python-test < %{platpyver}
-
-%description test
-The self-test suite for the Python interpreter.
-
-This is only useful to test Python itself. For testing general Python code,
-you should use the unittest module from %{name}-libs, or a library such as
-${name}-pytest or ${name}-nose.
-
-
-%if %{with debug_build}
-%package debug
-Summary: Debug version of the Python runtime
-
-# The debug build is an all-in-one package version of the regular build, and
-# shares the same .py/.pyc files and directories as the regular build. Hence
-# we depend on all of the subpackages of the regular build:
-Requires: %{name}%{?_isa} = %{version}-%{release}
-Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-Requires: %{name}-devel%{?_isa} = %{version}-%{release}
-Requires: %{name}-test%{?_isa} = %{version}-%{release}
-Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
-Requires: %{name}-tools%{?_isa} = %{version}-%{release}
-
-%description debug
-python3-debug provides a version of the Python runtime with numerous debugging
-features enabled, aimed at advanced Python users such as developers of Python
-extension modules.
-
-This version uses more memory and will be slower than the regular Python build,
-but is useful for tracking down reference-counting issues and other bugs.
-
-The bytecode format is unchanged, so that .pyc files are compatible between
-this and the standard version of Python, but the debugging features mean that
-C/C++ extension modules are ABI-incompatible and must be built for each version
-separately.
-
-The debug build shares installation directories with the standard Python
-runtime, so that .py and .pyc files can be shared.
-Compiled extension modules use a special ABI flag ("d") in the filename,
-so extensions for both verisons can co-exist in the same directory.
-%endif # with debug_build
-
-%else # with flatpackage
-
-Requires: redhat-rpm-config
-
-# We'll not provide this, on purpose
-# No package in Fedora shall ever depend on flatpackage via this
-%global __requires_exclude ^python\\(abi\\) = 3\\..$
-%global __provides_exclude ^python\\(abi\\) = 3\\..$
-
-# We keep those inside on purpose
-Provides: bundled(python3-pip) = 9.0.1
-Provides: bundled(python3-setuptools) = 28.8.0
-
-# The descripton for the flat flatpackage package
-%description
-This package exists to allow developers to test their code against an newer
-version of Python. This is not a full Python stack and if you wish to run
-your applications with Python %{pybasever}, update your Fedora to a newer
-version once Python %{pybasever} is stable.
-
-%endif # with flatpackage
-
-# ======================================================
-# The prep phase of the build:
-# ======================================================
-
-%prep
-%setup -q -n Python-%{version}%{?prerel}
-
-%if %{with systemtap}
-# Provide an example of usage of the tapset:
-cp -a %{SOURCE6} .
-cp -a %{SOURCE7} .
-%endif # with systemtap
-
-# Remove bundled libraries to ensure that we're using the system copy.
-rm -r Modules/expat
-
-%if %{with rewheel}
-%global pip_version 9.0.1
-sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
-%endif
-
-#
-# Apply patches:
-#
-%patch1 -p1
-
-%if %{with systemtap}
-%patch55 -p1 -b .systemtap
-%endif
-
-%if "%{_lib}" == "lib64"
-%patch102 -p1
-%endif
-%patch111 -p1
-%patch132 -p1
-%patch155 -p1
-%patch160 -p1
-%patch163 -p1
-%patch170 -p1
-%patch178 -p1
-
-%if %{with rewheel}
-%patch189 -p1
-%endif
-
-%patch205 -p1
-%patch251 -p1
-
-%ifarch aarch64
-%patch264 -p1
-%endif
-
-%patch273 -p1
-%patch274 -p1
-
-
-# Remove files that should be generated by the build
-# (This is after patching, so that we can use patches directly from upstream)
-rm configure pyconfig.h.in
-
-
-# ======================================================
-# Configuring and building the code:
-# ======================================================
-
-%build
-
-# Regenerate the configure script and pyconfig.h.in
-autoconf
-autoheader
-
-# Remember the current directory (which has sources and the configure script),
-# so we can refer to it after we "cd" elsewhere.
-topdir=$(pwd)
-
-# Get proper option names from bconds
-%if %{with computed_gotos}
-%global computed_gotos_flag yes
-%else
-%global computed_gotos_flag no
-%endif
-
-%if %{with optimizations}
-%global optimizations_flag "--enable-optimizations"
-%else
-%global optimizations_flag "--disable-optimizations"
-%endif
-
-# Set common compiler/linker flags
-export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
-export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export LINKCC="gcc"
-export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
-export LDFLAGS="$RPM_LD_FLAGS -g $(pkg-config --libs-only-L openssl)"
-
-# We can build several different configurations of Python: regular and debug.
-# Define a common function that does one build:
-BuildPython() {
- ConfName=$1
- ExtraConfigArgs=$2
- MoreCFlags=$3
-
- # Each build is done in its own directory
- ConfDir=build/$ConfName
- echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
- mkdir -p $ConfDir
- pushd $ConfDir
-
- # Normally, %%configure looks for the "configure" script in the current
- # directory.
- # Since we changed directories, we need to tell %%configure where to look.
- %global _configure $topdir/configure
-
-%configure \
- --enable-ipv6 \
- --enable-shared \
- --with-computed-gotos=%{computed_gotos_flag} \
- --with-dbmliborder=gdbm:ndbm:bdb \
- --with-system-expat \
- --with-system-ffi \
- --enable-loadable-sqlite-extensions \
- --with-dtrace \
- --with-lto \
-%if %{with systemtap}
- --with-systemtap \
-%endif
-%if %{with valgrind}
- --with-valgrind \
-%endif
- $ExtraConfigArgs \
- %{nil}
-
- # Invoke the build
- make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
-
- popd
- echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
-}
-
-# Call the above to build each configuration.
-
-%if %{with debug_build}
-BuildPython debug \
- "--without-ensurepip --with-pydebug" \
- "-O0"
-%endif # with debug_build
-
-BuildPython optimized \
- "--without-ensurepip %{optimizations_flag}" \
- ""
-
-# ======================================================
-# Installing the built code:
-# ======================================================
-
-%install
-
-# As in %%build, remember the current directory
-topdir=$(pwd)
-
-# We install a collection of hooks for gdb that make it easier to debug
-# executables linked against libpython3* (such as /usr/bin/python3 itself)
-#
-# These hooks are implemented in Python itself (though they are for the version
-# of python that gdb is linked with)
-#
-# gdb-archer looks for them in the same path as the ELF file or its .debug
-# file, with a -gdb.py suffix.
-# We put them next to the debug file, because ldconfig would complain if
-# it found non-library files directly in /usr/lib/
-# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
-#
-# We'll put these files in the debuginfo package by installing them to e.g.:
-# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
-# (note that the debug path is /usr/lib/debug for both 32/64 bit)
-#
-# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
-# information
-
-%if %{with gdb_hooks}
-DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
-mkdir -p %{buildroot}$DirHoldingGdbPy
-%endif # with gdb_hooks
-
-# Multilib support for pyconfig.h
-# 32- and 64-bit versions of pyconfig.h are different. For multilib support
-# (making it possible to install 32- and 64-bit versions simultaneously),
-# we need to install them under different filenames, and to make the common
-# "pyconfig.h" include the right file based on architecture.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
-# Filanames are defined here:
-%global _pyconfig32_h pyconfig-32.h
-%global _pyconfig64_h pyconfig-64.h
-%global _pyconfig_h pyconfig-%{wordsize}.h
-
-# Use a common function to do an install for all our configurations:
-InstallPython() {
-
- ConfName=$1
- PyInstSoName=$2
- MoreCFlags=$3
- LDVersion=$4
- Postfix=$5
-
- # Switch to the directory with this configuration's built files
- ConfDir=build/$ConfName
- echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
- mkdir -p $ConfDir
- pushd $ConfDir
-
- make \
- DESTDIR=%{buildroot} \
- INSTALL="install -p" \
- EXTRA_CFLAGS="$MoreCFlags" \
- install
-
- popd
-
-%if %{with gdb_hooks}
- # See comment on $DirHoldingGdbPy above
- PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
- cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
-%endif # with gdb_hooks
-
- # Rename the -devel script that differs on different arches to arch specific name
- mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
- echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
- %{buildroot}%{_bindir}/python${LDVersion}-config
- echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
- %{buildroot}%{_bindir}/python${LDVersion}-config
- chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
-
- # Make python3-devel multilib-ready
- mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
- %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
- cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
-#include <bits/wordsize.h>
-
-#if __WORDSIZE == 32
-#include "%{_pyconfig32_h}"
-#elif __WORDSIZE == 64
-#include "%{_pyconfig64_h}"
-#else
-#error "Unknown word size"
-#endif
-EOF
-
- # Systemtap hooks
-%if %{with systemtap}
- mkdir -p %{buildroot}%{tapsetdir}
- sed \
- -e "s|LIBRARY_PATH|%{_libdir}/${PyInstSoName}|" \
- -e 's|"python3"|"python3${Postfix}"|' \
- %{_sourcedir}/libpython.stp \
- > %{buildroot}%{tapsetdir}/libpython%{pybasever}${Postfix}-%{wordsize}.stp
-%endif # with systemtap
-
- echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
-}
-
-# Install the "debug" build first; any common files will be overridden with
-# later builds
-%if %{with debug_build}
-InstallPython debug \
- %{py_INSTSONAME_debug} \
- -O0 \
- %{LDVERSION_debug} \
- -debug
-%endif # with debug_build
-
-# Now the optimized build:
-InstallPython optimized \
- %{py_INSTSONAME_optimized} \
- "" \
- %{LDVERSION_optimized} \
- ""
-
-# Install directories for additional packages
-install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
-%if "%{_lib}" == "lib64"
-# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
-# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
-# modules).
-# Note that rpmlint will complain about hardcoded library path;
-# this is intentional.
-install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
-%endif
-
-%if %{without flatpackage}
-# add idle3 to menu
-install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
-desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
-
-# Install and validate appdata file
-mkdir -p %{buildroot}%{_datadir}/appdata
-cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
-appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
-%endif
-
-# Development tools
-install -m755 -d %{buildroot}%{pylibdir}/Tools
-install Tools/README %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/freeze %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/i18n %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/pynche %{buildroot}%{pylibdir}/Tools/
-cp -ar Tools/scripts %{buildroot}%{pylibdir}/Tools/
-
-# Documentation tools
-install -m755 -d %{buildroot}%{pylibdir}/Doc
-cp -ar Doc/tools %{buildroot}%{pylibdir}/Doc/
-
-# Demo scripts
-cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
-
-# Make sure distutils looks at the right pyconfig.h file
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
-# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
-# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
-# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
-#
-# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
-# variants:
-sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
- %{buildroot}%{pylibdir}/distutils/sysconfig.py \
- %{buildroot}%{pylibdir}/sysconfig.py
-
-# Switch all shebangs to refer to the specific Python version.
-# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
-# so handle files named using other naming scheme separately.
-LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
- Tools/scripts/pathfix.py \
- -i "%{_bindir}/python%{pybasever}" \
- %{buildroot} %{buildroot}%{pylibdir}/Tools/scripts/*-*.py \
- %{buildroot}%{pylibdir}/Tools/pynche/{pynche,pynche.pyw}
-# not covered, also redundant and useless:
-rm %{buildroot}%{pylibdir}/Tools/scripts/{2to3,idle3,pydoc3,pyvenv}
-
-
-# Move pathfix.py to bindir
-# See
https://github.com/fedora-python/python-rpm-porting/issues/24
-mv %{buildroot}%{pylibdir}/Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
-
-
-# Remove shebang lines from .py files that aren't executable, and
-# remove executability from .py files that don't have a shebang line:
-find %{buildroot} -name \*.py \
- \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
- -print -exec sed -i '1d' {} \; \) -o \( \
- -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
- -exec chmod a-x {} \; \) \)
-
-# Remove executable flag from files that shouldn't have it:
-chmod a-x \
- %{buildroot}%{pylibdir}/Tools/README
-
-# Get rid of DOS batch files:
-find %{buildroot} -name \*.bat -exec rm {} \;
-
-# Get rid of backup files:
-find %{buildroot}/ -name "*~" -exec rm -f {} \;
-find . -name "*~" -exec rm -f {} \;
-
-# Get rid of a stray copy of the license:
-rm %{buildroot}%{pylibdir}/LICENSE.txt
-
-# Do bytecompilation with the newly installed interpreter.
-# This is similar to the script in macros.pybytecompile
-# compile *.pyc
-find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
-
-# Since we have pathfix.py in bindir, this is created, but we don't want it
-rm -rf %{buildroot}%{_bindir}/__pycache__
-
-# Fixup permissions for shared libraries from non-standard 555 to standard 755:
-find %{buildroot} -perm 555 -exec chmod 755 {} \;
-
-# Install macros for rpm:
-mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
-install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
-%if %{without flatpackage}
-install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
-%endif
-
-# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
-# avoid the user having to know the precise version and ABI flags.
-# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
-%if %{with debug_build} && %{without flatpackage}
-ln -s \
- %{_bindir}/python%{LDVERSION_debug} \
- %{buildroot}%{_bindir}/python3-debug
-%endif
-
-# System Python: Link the executable to libexec
-# This is for backwards compatibility only and should be removed in Fedora 29
-%if %{without flatpackage}
-mkdir -p %{buildroot}%{_libexecdir}
-ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
-%endif
-
-
-# ======================================================
-# Checks for packaging issues
-# ======================================================
-
-%check
-
-# first of all, check timestamps of bytecode files
-find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
-
-# Ensure that the curses module was linked against libncursesw.so, rather than
-# libncurses.so
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
-ldd %{buildroot}/%{dynload_dir}/_curses*.so \
- | grep curses \
- | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
-
-# Ensure that the debug modules are linked against the debug libpython, and
-# likewise for the optimized modules and libpython:
-for Module in %{buildroot}/%{dynload_dir}/*.so ; do
- case $Module in
- *.%{SOABI_debug})
- ldd $Module | grep %{py_INSTSONAME_optimized} &&
- (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
-
- ;;
- *.%{SOABI_optimized})
- ldd $Module | grep %{py_INSTSONAME_debug} &&
- (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
- ;;
- esac
-done
-
-# There's no point of having this, as decided in
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-rm %{buildroot}%{_bindir}/2to3-%{pybasever}
-
-%if %{with flatpackage}
-# Remove stuff that would conflict with python3 package
-mv %{buildroot}%{_bindir}/python{3,%{pyshortver}}
-rm %{buildroot}%{_bindir}/pydoc3
-rm %{buildroot}%{_bindir}/pathfix.py
-rm %{buildroot}%{_bindir}/idle3
-rm %{buildroot}%{_bindir}/python3-*
-rm %{buildroot}%{_bindir}/pyvenv
-rm %{buildroot}%{_bindir}/2to3
-rm %{buildroot}%{_libdir}/libpython3.so
-rm %{buildroot}%{_mandir}/man1/python3.1*
-rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
-%endif
-
-
-# ======================================================
-# Running the upstream test suite
-# ======================================================
-
-# For ppc64 we need a larger stack than default
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1292462
-%ifarch %{power64}
- ulimit -a
- ulimit -s 16384
-%endif
-
-
-topdir=$(pwd)
-CheckPython() {
- ConfName=$1
- ConfDir=$(pwd)/build/$ConfName
-
- echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-
- # Note that we're running the tests using the version of the code in the
- # builddir, not in the buildroot.
-
- # Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
- # our non-standard decorators take effect on the relevant tests:
- # @unittest._skipInRpmBuild(reason)
- # @unittest._expectedFailureInRpmBuild
- # test_faulthandler.test_register_chain currently fails on ppc64le and
- # aarch64, see upstream bug
http://bugs.python.org/issue21131
- WITHIN_PYTHON_RPM_BUILD= \
- LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- -wW --slowest --findleaks \
- -x test_distutils \
- -x test_bdist_rpm \
- %ifarch ppc64le aarch64
- -x test_faulthandler \
- %endif
- %ifarch %{mips64}
- -x test_ctypes \
- %endif
- %ifarch %{power64} s390 s390x armv7hl aarch64 %{mips}
- -x test_gdb
- %endif
-
- echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-
-}
-
-%if %{with tests}
-
-# Check each of the configurations:
-%if %{with debug_build}
-CheckPython debug
-%endif # with debug_build
-CheckPython optimized
-
-%endif # with tests
-
-
-# ======================================================
-# Scriptlets
-# ======================================================
-
-%if %{without flatpackage}
-
-%post libs -p /sbin/ldconfig
-
-%postun libs -p /sbin/ldconfig
-
-%posttrans
-/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
-
-%endif
-
-
-%post
-%if %{with flatpackage}
-/sbin/ldconfig
-%else
-/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
-%endif
-
-%postun
-%if %{with flatpackage}
-/sbin/ldconfig
-%else
-if [ $1 -eq 0 ] ; then
- /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
- /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
-fi
-%endif
-
-%files
-%defattr(-, root, root)
-%license LICENSE
-%doc README.rst
-
-%if %{without flatpackage}
-%{_bindir}/pydoc*
-%{_bindir}/python3
-%{_bindir}/pyvenv
-# Remove in Fedora 29:
-%{_libexecdir}/system-python
-%else
-%{_bindir}/pydoc%{pybasever}
-%{_bindir}/python%{pyshortver}
-%endif
-
-%{_bindir}/python%{pybasever}
-%{_bindir}/python%{pybasever}m
-%{_bindir}/pyvenv-%{pybasever}
-%{_mandir}/*/*
-
-
-%if %{without flatpackage}
-%files libs
-%defattr(-,root,root,-)
-%license LICENSE
-%doc README.rst
-%endif
-
-%dir %{pylibdir}
-%dir %{dynload_dir}
-
-%{pylibdir}/lib2to3
-%if %{without flatpackage}
-%exclude %{pylibdir}/lib2to3/tests
-%endif
-
-%dir %{pylibdir}/unittest/
-%dir %{pylibdir}/unittest/__pycache__/
-%{pylibdir}/unittest/*.py
-%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/asyncio/
-%dir %{pylibdir}/asyncio/__pycache__/
-%{pylibdir}/asyncio/*.py
-%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/venv/
-%dir %{pylibdir}/venv/__pycache__/
-%{pylibdir}/venv/*.py
-%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/venv/scripts
-
-%{pylibdir}/wsgiref
-%{pylibdir}/xmlrpc
-
-%dir %{pylibdir}/ensurepip/
-%dir %{pylibdir}/ensurepip/__pycache__/
-%{pylibdir}/ensurepip/*.py
-%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
-
-%if %{without flatpackage}
-%exclude %{pylibdir}/ensurepip/_bundled
-%else
-%dir %{pylibdir}/ensurepip/_bundled
-%{pylibdir}/ensurepip/_bundled/*.whl
-%endif
-
-%if %{with rewheel}
-%dir %{pylibdir}/ensurepip/rewheel/
-%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
-%{pylibdir}/ensurepip/rewheel/*.py
-%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
-%endif
-
-%{pylibdir}/idlelib
-
-%dir %{pylibdir}/test/
-%dir %{pylibdir}/test/__pycache__/
-%dir %{pylibdir}/test/support/
-%dir %{pylibdir}/test/support/__pycache__/
-%{pylibdir}/test/__init__.py
-%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%{pylibdir}/test/support/__init__.py
-%{pylibdir}/test/support/__pycache__/__init__%{bytecode_suffixes}
-
-%dir %{pylibdir}/concurrent/
-%dir %{pylibdir}/concurrent/__pycache__/
-%{pylibdir}/concurrent/*.py
-%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/concurrent/futures/
-%dir %{pylibdir}/concurrent/futures/__pycache__/
-%{pylibdir}/concurrent/futures/*.py
-%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
-
-%{pylibdir}/pydoc_data
-
-%{dynload_dir}/_blake2.%{SOABI_optimized}.so
-%{dynload_dir}/_md5.%{SOABI_optimized}.so
-%{dynload_dir}/_sha1.%{SOABI_optimized}.so
-%{dynload_dir}/_sha256.%{SOABI_optimized}.so
-%{dynload_dir}/_sha3.%{SOABI_optimized}.so
-%{dynload_dir}/_sha512.%{SOABI_optimized}.so
-
-%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
-%{dynload_dir}/_bisect.%{SOABI_optimized}.so
-%{dynload_dir}/_bz2.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
-%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
-%{dynload_dir}/_crypt.%{SOABI_optimized}.so
-%{dynload_dir}/_csv.%{SOABI_optimized}.so
-%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
-%{dynload_dir}/_curses.%{SOABI_optimized}.so
-%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
-%{dynload_dir}/_dbm.%{SOABI_optimized}.so
-%{dynload_dir}/_decimal.%{SOABI_optimized}.so
-%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
-%if %{with gdbm}
-%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
-%endif
-%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
-%{dynload_dir}/_heapq.%{SOABI_optimized}.so
-%{dynload_dir}/_json.%{SOABI_optimized}.so
-%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
-%{dynload_dir}/_lzma.%{SOABI_optimized}.so
-%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
-%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
-%{dynload_dir}/_opcode.%{SOABI_optimized}.so
-%{dynload_dir}/_pickle.%{SOABI_optimized}.so
-%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
-%{dynload_dir}/_random.%{SOABI_optimized}.so
-%{dynload_dir}/_socket.%{SOABI_optimized}.so
-%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
-%{dynload_dir}/_ssl.%{SOABI_optimized}.so
-%{dynload_dir}/_struct.%{SOABI_optimized}.so
-%{dynload_dir}/array.%{SOABI_optimized}.so
-%{dynload_dir}/audioop.%{SOABI_optimized}.so
-%{dynload_dir}/binascii.%{SOABI_optimized}.so
-%{dynload_dir}/cmath.%{SOABI_optimized}.so
-%{dynload_dir}/_datetime.%{SOABI_optimized}.so
-%{dynload_dir}/fcntl.%{SOABI_optimized}.so
-%{dynload_dir}/grp.%{SOABI_optimized}.so
-%{dynload_dir}/math.%{SOABI_optimized}.so
-%{dynload_dir}/mmap.%{SOABI_optimized}.so
-%{dynload_dir}/nis.%{SOABI_optimized}.so
-%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
-%{dynload_dir}/parser.%{SOABI_optimized}.so
-%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
-%{dynload_dir}/readline.%{SOABI_optimized}.so
-%{dynload_dir}/resource.%{SOABI_optimized}.so
-%{dynload_dir}/select.%{SOABI_optimized}.so
-%{dynload_dir}/spwd.%{SOABI_optimized}.so
-%{dynload_dir}/syslog.%{SOABI_optimized}.so
-%{dynload_dir}/termios.%{SOABI_optimized}.so
-#%{dynload_dir}/time.%{SOABI_optimized}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
-%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
-%{dynload_dir}/_uuid.%{SOABI_optimized}.so
-%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
-%{dynload_dir}/zlib.%{SOABI_optimized}.so
-
-%dir %{pylibdir}/site-packages/
-%dir %{pylibdir}/site-packages/__pycache__/
-%{pylibdir}/site-packages/README.txt
-%{pylibdir}/*.py
-%dir %{pylibdir}/__pycache__/
-%{pylibdir}/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/collections/
-%dir %{pylibdir}/collections/__pycache__/
-%{pylibdir}/collections/*.py
-%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/ctypes/
-%dir %{pylibdir}/ctypes/__pycache__/
-%{pylibdir}/ctypes/*.py
-%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/ctypes/macholib
-
-%{pylibdir}/curses
-
-%dir %{pylibdir}/dbm/
-%dir %{pylibdir}/dbm/__pycache__/
-%{pylibdir}/dbm/*.py
-%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/distutils/
-%dir %{pylibdir}/distutils/__pycache__/
-%{pylibdir}/distutils/*.py
-%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/distutils/README
-%{pylibdir}/distutils/command
-%exclude %{pylibdir}/distutils/command/wininst-*.exe
-
-%dir %{pylibdir}/email/
-%dir %{pylibdir}/email/__pycache__/
-%{pylibdir}/email/*.py
-%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/email/mime
-%doc %{pylibdir}/email/architecture.rst
-
-%{pylibdir}/encodings
-
-%{pylibdir}/html
-%{pylibdir}/http
-
-%dir %{pylibdir}/importlib/
-%dir %{pylibdir}/importlib/__pycache__/
-%{pylibdir}/importlib/*.py
-%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/json/
-%dir %{pylibdir}/json/__pycache__/
-%{pylibdir}/json/*.py
-%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
-
-%{pylibdir}/logging
-%{pylibdir}/multiprocessing
-
-%dir %{pylibdir}/sqlite3/
-%dir %{pylibdir}/sqlite3/__pycache__/
-%{pylibdir}/sqlite3/*.py
-%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
-
-%if %{without flatpackage}
-%exclude %{pylibdir}/turtle.py
-%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
-%endif
-
-%{pylibdir}/urllib
-%{pylibdir}/xml
-
-%if "%{_lib}" == "lib64"
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
-%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
-%endif
-
-# "Makefile" and the config-32/64.h file are needed by
-# distutils/sysconfig.py:_init_posix(), so we include them in the core
-# package, along with their parent directories (bug 531901):
-%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
-%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
-%dir %{_includedir}/python%{LDVERSION_optimized}/
-%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-
-%{_libdir}/%{py_INSTSONAME_optimized}
-%if %{without flatpackage}
-%{_libdir}/libpython3.so
-%endif
-%if %{with systemtap}
-%dir %(dirname %{tapsetdir})
-%dir %{tapsetdir}
-%{tapsetdir}/%{libpython_stp_optimized}
-%doc systemtap-example.stp pyfuntop.stp
-%endif
-
-
-%if %{without flatpackage}
-%files devel
-%defattr(-,root,root)
-%endif
-
-%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
-%if %{without flatpackage}
-%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
-%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-%endif
-%{pylibdir}/distutils/command/wininst-*.exe
-%{_includedir}/python%{LDVERSION_optimized}/*.h
-%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
-
-%if %{without flatpackage}
-%{_bindir}/python3-config
-%{_libdir}/pkgconfig/python3.pc
-%{_rpmconfigdir}/macros.d/macros.systempython
-%{_bindir}/pathfix.py
-%endif
-
-%{_bindir}/python%{pybasever}-config
-%{_bindir}/python%{LDVERSION_optimized}-config
-%{_bindir}/python%{LDVERSION_optimized}-*-config
-%{_libdir}/libpython%{LDVERSION_optimized}.so
-%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
-%{_libdir}/pkgconfig/python-%{pybasever}.pc
-%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
-
-
-%if %{without flatpackage}
-%files tools
-%defattr(-,root,root,755)
-
-%{_bindir}/2to3
-%{_bindir}/idle*
-%else
-%{_bindir}/idle%{pybasever}
-%endif
-
-%{pylibdir}/Tools
-%doc %{pylibdir}/Doc
-%if %{without flatpackage}
-%{_datadir}/appdata/idle3.appdata.xml
-%{_datadir}/applications/idle3.desktop
-%{_datadir}/icons/hicolor/*/apps/idle3.*
-%endif
-
-%if %{without flatpackage}
-%files tkinter
-%defattr(-,root,root,755)
-%endif
-
-%{pylibdir}/tkinter
-%if %{without flatpackage}
-%exclude %{pylibdir}/tkinter/test
-%endif
-%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
-%{pylibdir}/turtle.py
-%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
-%dir %{pylibdir}/turtledemo
-%{pylibdir}/turtledemo/*.py
-%{pylibdir}/turtledemo/*.cfg
-%dir %{pylibdir}/turtledemo/__pycache__/
-%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
-
-
-%if %{without flatpackage}
-%files test
-%defattr(-, root, root)
-%endif
-
-%{pylibdir}/ctypes/test
-%{pylibdir}/distutils/tests
-%{pylibdir}/sqlite3/test
-%{pylibdir}/test
-%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
-%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
-%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
-%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
-%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
-%{pylibdir}/lib2to3/tests
-%{pylibdir}/tkinter/test
-%{pylibdir}/unittest/test
-
-
-# We don't bother splitting the debug build out into further subpackages:
-# if you need it, you're probably a developer.
-
-# Hence the manifest is the combination of analogous files in the manifests of
-# all of the other subpackages
-
-%if %{with debug_build}
-%if %{without flatpackage}
-%files debug
-%defattr(-,root,root,-)
-%{_bindir}/python3-debug
-%endif
-
-# Analog of the core subpackage's files:
-%{_bindir}/python%{LDVERSION_debug}
-
-# Analog of the -libs subpackage's files:
-# ...with debug builds of the built-in "extension" modules:
-
-%{dynload_dir}/_blake2.%{SOABI_debug}.so
-%{dynload_dir}/_md5.%{SOABI_debug}.so
-%{dynload_dir}/_sha1.%{SOABI_debug}.so
-%{dynload_dir}/_sha256.%{SOABI_debug}.so
-%{dynload_dir}/_sha3.%{SOABI_debug}.so
-%{dynload_dir}/_sha512.%{SOABI_debug}.so
-
-%{dynload_dir}/_asyncio.%{SOABI_debug}.so
-%{dynload_dir}/_bisect.%{SOABI_debug}.so
-%{dynload_dir}/_bz2.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
-%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
-%{dynload_dir}/_crypt.%{SOABI_debug}.so
-%{dynload_dir}/_csv.%{SOABI_debug}.so
-%{dynload_dir}/_ctypes.%{SOABI_debug}.so
-%{dynload_dir}/_curses.%{SOABI_debug}.so
-%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
-%{dynload_dir}/_dbm.%{SOABI_debug}.so
-%{dynload_dir}/_decimal.%{SOABI_debug}.so
-%{dynload_dir}/_elementtree.%{SOABI_debug}.so
-%if %{with gdbm}
-%{dynload_dir}/_gdbm.%{SOABI_debug}.so
-%endif
-%{dynload_dir}/_hashlib.%{SOABI_debug}.so
-%{dynload_dir}/_heapq.%{SOABI_debug}.so
-%{dynload_dir}/_json.%{SOABI_debug}.so
-%{dynload_dir}/_lsprof.%{SOABI_debug}.so
-%{dynload_dir}/_lzma.%{SOABI_debug}.so
-%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
-%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
-%{dynload_dir}/_opcode.%{SOABI_debug}.so
-%{dynload_dir}/_pickle.%{SOABI_debug}.so
-%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
-%{dynload_dir}/_random.%{SOABI_debug}.so
-%{dynload_dir}/_socket.%{SOABI_debug}.so
-%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
-%{dynload_dir}/_ssl.%{SOABI_debug}.so
-%{dynload_dir}/_struct.%{SOABI_debug}.so
-%{dynload_dir}/array.%{SOABI_debug}.so
-%{dynload_dir}/audioop.%{SOABI_debug}.so
-%{dynload_dir}/binascii.%{SOABI_debug}.so
-%{dynload_dir}/cmath.%{SOABI_debug}.so
-%{dynload_dir}/_datetime.%{SOABI_debug}.so
-%{dynload_dir}/fcntl.%{SOABI_debug}.so
-%{dynload_dir}/grp.%{SOABI_debug}.so
-%{dynload_dir}/math.%{SOABI_debug}.so
-%{dynload_dir}/mmap.%{SOABI_debug}.so
-%{dynload_dir}/nis.%{SOABI_debug}.so
-%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
-%{dynload_dir}/parser.%{SOABI_debug}.so
-%{dynload_dir}/pyexpat.%{SOABI_debug}.so
-%{dynload_dir}/readline.%{SOABI_debug}.so
-%{dynload_dir}/resource.%{SOABI_debug}.so
-%{dynload_dir}/select.%{SOABI_debug}.so
-%{dynload_dir}/spwd.%{SOABI_debug}.so
-%{dynload_dir}/syslog.%{SOABI_debug}.so
-%{dynload_dir}/termios.%{SOABI_debug}.so
-#%{dynload_dir}/time.%{SOABI_debug}.so
-%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
-%{dynload_dir}/unicodedata.%{SOABI_debug}.so
-%{dynload_dir}/_uuid.%{SOABI_debug}.so
-%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
-%{dynload_dir}/zlib.%{SOABI_debug}.so
-
-# No need to split things out the "Makefile" and the config-32/64.h file as we
-# do for the regular build above (bug 531901), since they're all in one package
-# now; they're listed below, under "-devel":
-
-%{_libdir}/%{py_INSTSONAME_debug}
-%if %{with systemtap}
-%dir %(dirname %{tapsetdir})
-%dir %{tapsetdir}
-%{tapsetdir}/%{libpython_stp_debug}
-%endif
-
-# Analog of the -devel subpackage's files:
-%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
-%{_includedir}/python%{LDVERSION_debug}
-%{_bindir}/python%{LDVERSION_debug}-config
-%{_bindir}/python%{LDVERSION_debug}-*-config
-%{_libdir}/libpython%{LDVERSION_debug}.so
-%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
-%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
-
-# Analog of the -tools subpackage's files:
-# None for now; we could build precanned versions that have the appropriate
-# shebang if needed
-
-# Analog of the tkinter subpackage's files:
-%{dynload_dir}/_tkinter.%{SOABI_debug}.so
-
-# Analog of the -test subpackage's files:
-%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
-%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
-%{dynload_dir}/_testcapi.%{SOABI_debug}.so
-%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
-
-%endif # with debug_build
-
-# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
-#
-# The /usr/lib/rpm/redhat/macros defines %__debug_package to use
-# debugfiles.list, and it appears that everything below /usr/lib/debug and
-# (/usr/src/debug) gets added to this file (via LISTFILES) in
-# /usr/lib/rpm/find-debuginfo.sh
-#
-# Hence by installing it below /usr/lib/debug we ensure it is added to the
-# -debuginfo subpackage
-# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
-# payload file would be unpackaged)
-
-# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
-%undefine _debuginfo_subpackages
-
-# ======================================================
-# Finally, the changelog:
-# ======================================================
-
-%changelog
-* Tue Nov 28 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.1.a2
-- Update to 3.7.0 alpha 2
-- Removed merged patches 262, 277, 279
-
-* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
-- Raise the release of platform-python obsoletes for better maintainability
-
-* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
-- Obsolete platform-python and it's subpackages
-
-* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
-- Fix memory corruption due to allocator mix
-Resolves: rhbz#1498207
-
-* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
-- Update to Python 3.6.3
-
-* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
-- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
-- Make the -devel package require redhat-rpm-config
-Resolves: rhbz#1496757
-
-* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
-- Fix /usr/bin/env dependency from python3-tools
-Resolves: rhbz#1482118
-
-* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
-- Include `-g` in the flags sent to the linker (LDFLAGS)
-Resolves: rhbz#1483222
-
-* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
-- Specfile cleanup
-- Make the main description also applicable to the SRPM
-- Add audiotest.au to the test package
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
-- Remove %%{pylibdir}/Tools/scripts/2to3
-
-* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
-- Expat >= 2.1.0 is everywhere, remove explicit requires
-- Conditionalize systemtap-devel BuildRequires
-- For consistency, require /usr/sbin/ifconfig instead of net-tools
-
-* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
-- Rename patch files to be consistent
-- Run autotools to generate the configure script before building
-- Merge lib64 patches (104 into 102)
-- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
-- Remove patches 157 and 186, which had test changes left over after upstreaming
-- Remove patch 188, a temporary workaround for hashlib tests
-- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
-- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
-
-* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
-- Use python3 style of calling super() without arguments in rpath
- patch to prevent recursion in UnixCCompiler subclasses
-Resolves: rhbz#1458122
-
-* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
-- Add bcond for --without optimizations
-- Reword package descriptions
-- Remove Group declarations
-- Skip failing test_float_with_comma
-
-* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
-- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
-
-* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
-- Use bconds for configuring the build
-- Reorganize the initial sections
-
-* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
-- Have /usr/bin/2to3 (rhbz#1111275)
-- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
-
-* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
-- Revert "Add --executable option to install.py command"
- This enhancement is currently not needed and it can possibly
- collide with `pip --editable`option
-
-* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
-- Fix the "urllib FTP protocol stream injection" vulnerability
-Resolves: rhbz#1478916
-
-* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
-- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
- bsddb), however, no longer needod for Python 3
-- Tested building Python 3 with and without the dependency, all tests pass and
- filelists of resulting RPMs are identical
-
-* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
-- Do not generate debuginfo subpackages (#1476593)
-- Rebuild with binutils fix for ppc64le (#1475636)
-
-* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
-
-* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
-- Make test_asyncio to not depend on the current SIGHUP signal handler.
-
-* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
-- Update to Python 3.6.2
-
-* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
-- Update to the latest upstream implementation of PEP 538
-
-* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
-- Make pip and distutils in user environment install into separate location
-
-* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
-- Fix test_alpn_protocols from test_ssl
-- Do not require rebundled setuptools dependencies
-
-* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
-- Added a dependency to the devel subpackage on python3-rpm-generators which
- have been excised out of rpm-build
-- Updated notes on bootstrapping Python on top of this specfile accordingly
-- Involves: rhbz#1410631, rhbz#1444925
-
-* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
-- Enable profile guided optimizations for x86_64 and i686 architectures
-- Update to a newer implementation of PEP 538
-- Update description to reflect that Python 3 is now the default Python
-
-* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
-- Update PEP 538 to the latest upstream implementation
-
-* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
-- Enable link time optimizations
-- Move windows executables to the devel subpackage (rhbz#1426257)
-
-* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
-- Rename python3.Xdm-config script from -debug to be arch specific
-Resolves: rhbz#1179073
-
-* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
-- Install the Makefile in its proper location (rhbz#1438219)
-
-* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
-- Update to version 3.6.1 final
-
-* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
-- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
-
-* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
-- Update to Python 3.6.1 release candidate 1
-- Add patch 264 to skip a known test failure on aarch64
-
-* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
-- Use proper command line parsing in _testembed
-- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
-
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
-
-* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
-- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
-
-* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
-- Revert "Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables..." to prevent build failures
- of packages using alternate build tools
-
-* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
-- Set values of prefix and exec_prefix to /usr/local for
- /usr/bin/python* executables
-- Use new %%_module_build macro
-
-* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
-- Add --executable option to install.py command
-
-* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
-- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
-in order for the virtualenvs to work properly
-
-* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
-
-* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
-- Add missing %%license macro
-
-* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
-- Modify the runtime dependency of python3-libs on system-python-libs again,
- because previous attempt didn't work properly with dnf resolving mechanism
-
-* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
-- Modify the runtime dependency of python3-libs on system-python-libs to use
- just the version and release number, but not the dist tag due to Modularity
-
-* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
-- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
-- Skip test_aead_aes_gcm during rpmbuild
-
-* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
-- Rebuild for readline 7.x
-
-* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
-- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
-
-* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
-- Define HAVE_LONG_LONG as 1 for backwards compatibility
-
-* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
-- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
-
-* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
-- Update to Python 3.6.0 final
-
-* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
-- Enable rewheel
-
-* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
-- Update to Python 3.6.0 release candidate 1
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
-- Update to Python 3.6.0 beta 4
-
-* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
-- Set to work with pip version 9.0.1
-
-* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
-- Use proper patch numbering and base upstream branch for
-porting ssl and hashlib modules to OpenSSL 1.1.0
-- Drop hashlib patch for now
-- Add riscv64 arch to 64bit and no-valgrind arches
-
-* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
-- Make it build with OpenSSL-1.1.0 based on upstream patch
-
-* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
-- Obsolete and Provide python35 package
-
-* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
-- Update %py_byte_compile macro
-- Remove unused configure flags (rhbz#1374357)
-
-* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
-- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
- recompile optimized .pyc files
-- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
- files are no more
-- Resolves rhbz#1373635
-
-* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
-- Rebased to version 3.5.2
-- Set to work with pip version 8.1.2
-- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
-- Removed arch or environment specific patches 194, 196, 203, and 208
- as test builds indicate they are no longer needed
-- Updated patches 102, 146, and 242 to work with the new Python codebase
-- Removed patches 200, 201, 5000 which weren't even being applied
-
-* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
-- Fix for CVE-2016-1000110 HTTPoxy attack
-- SPEC file cleanup
-
-* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
-- Build properly on MIPS
-
-* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
--
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
-- Refactor patch for properly fixing CVE-2016-5636
-
-* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
-- Fix test_pyexpat failure with Expat version of 2.2.0
-
-* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
-- Move xml module to system-python-libs
-
-* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
-- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
-- Raise an error when STARTTLS fails
-- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
-- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
-- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
-
-* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
-- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
-
-* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
-- Move distutils to system-python-libs
-
-* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
-- Provide python3-enum34
-
-* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
-- Provide System Python packages and macros
-
-* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
-
-* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
-- Drop python3 macros, require python/python3-rpm-macros
-
-* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
-- Update to 3.5.1
-- Removed patch 199 and 207 (upstream)
-
-* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
-- Remove versioned libpython from devel package
-
-* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
-- add correct arch for ppc64/ppc64le to fix build failure
-
-* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
-- Hide the private _Py_atomic_xxx symbols from public header
-
-* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
-- Rebuild with wheel set to 1
-
-* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
-- Update to 3.5.0
-
-* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
-- python3-devel: Require python-macros for version independant macros such as
- python_provide. See fpc#281 and fpc#534.
-
-* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
-- Use 1024bit DH key in test_ssl
-- Use -O0 when compiling -debug build
-- Update pip version variable to the version we actually ship
-
-* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
-- Make relocating Python by changing _prefix actually work
-Resolves: rhbz#1231801
-
-* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
-- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
-
-* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
-- Updated to 3.4.3
-- BuildPython now accepts additional build options
-- Temporarily disabled test_gdb on arm (rhbz#1196181)
-
-* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
-- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
- (
http://bugs.python.org/issue23433)
-
-* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
-- Rebuilt for Fedora 23 Change
-
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
-
-* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
-- Own systemtap dirs (#710733)
-
-* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
-- build with valgrind on ppc64le
-- disable test_gdb on s390(x) until rhbz#1181034 is resolved
-
-* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
-- New patches: 170 (gc asserts), 200 (gettext headers),
- 201 (gdbm memory leak)
-
-* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
-- OpenSSL disabled SSLv3 in SSLv23 method
-
-* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
-- Update to 3.4.2
-- Refreshed patches: 156 (gdb autoload)
-- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
-
-* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
-- Fix CVE-2014-4650 - CGIHTTPServer URL handling
-Resolves: rhbz#1113529
-
-* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
-- exclude test_gdb on ppc* (rhbz#1132488)
-
-* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
-- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
-
-* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
-
-* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
-- aarch64 has valgrind, just list those that don't support it
-
-* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
-
-* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
-- bump release and rebuild to link with the correct tcl/tk libs on ppcle
-
-* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
-- Change paths to bundled projects in rewheel patch
-
-* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
-- In config script, use uname -m to write the arch
-
-* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
-- update the arch list where valgrind exists - %%power64 includes also
- ppc64le which is not supported yet
-
-* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
-- Forward arguments to the arch specific config script
-Resolves: rhbz#1102683
-
-* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
-- Rename python3.Xm-config script to arch specific.
-Resolves: rhbz#1091815
-
-* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
-- Use python3-*, not python-* runtime requires on setuptools and pip
-- rebuild for tcl-8.6
-
-* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
-- Update the rewheel module
-
-* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
-- Fix multilib dependencies.
-Resolves: rhbz#1091815
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
-- Update to Python 3.4.1
-
-* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
-- Fix test_gdb failure on ppc64le
-Resolves: rhbz#1095355
-
-* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
-- Add macro %%python3_version_nodots
-
-* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
-- Disable test_faulthandler, test_gdb on aarch64
-Resolves: rhbz#1045193
-
-* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
-- Don't add Werror=declaration-after-statement for extension
- modules through setup.py (PyBT#21121)
-
-* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
-- Add setuptools and pip to Requires
-
-* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
-- Point __os_install_post to correct brp-* files
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
-- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
-
-* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
-- Update to Python 3.4 final
-- Add patch adding the rewheel module
-- Merge patches from master
-
-* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
-- Update to Python 3.4 beta 2.
-- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
-- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
-
-* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
-- Update to Python 3.4 beta 1.
-- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
-ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
-- Removed patch 00187 (remove pthread atfork; upstreamed)
-
-* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
-- Update to Python 3.4 alpha 4.
-- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
-114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
-test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
-157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
-from py_compile)
-- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
-Koji), 142 (the mock issue that caused this is fixed)
-- Added patch 187 (remove thread atfork) - will be in next version
-- Refreshed script for checking pyc and pyo timestamps with new ignored files.
-- The fips patch is disabled for now until upstream makes a final decision
-what to do with sha3 implementation for 3.4.0.
-
-* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
-- Bytecompile all *.py files properly during build (rhbz#1023607)
-
-* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
-- Added fix for CVE-2013-4238 (rhbz#996399)
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
-- fix up indentation in arm patch
-
-* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
-- disable a test that fails on arm
-- enable valgrind support on arm arches
-
-* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
-- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
-
-* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
-- Add patch for CVE-2013-2099 (rhbz#963261).
-
-* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
-- Updated to Python 3.3.2.
-- Refreshed patches: 153 (gdb test noise)
-- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
-test threads)
-- Synced patch numbers with python.spec.
-
-* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
-- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
-
-* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
-- Add patch that enables building on ppc64p7 (replace the sed, so that
-we get consistent with python2 spec and it's more obvious that we're doing it.
-
-* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
-- Add fix for gdb tests failing on arm, rhbz#951802.
-
-* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
-- Updated to Python 3.3.1.
-- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
-153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
-keeping few more downstream tests)
-- Removed patches: 3 (audiotest.au made it to upstream tarball)
-- Removed workaround for
http://bugs.python.org/issue14774, discussed in
-http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
-- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
-
-* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
-- renumber patches to keep them in sync with python.spec
-
-* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
-- Fix error in platform.platform() when non-ascii byte strings are decoded to
- unicode (rhbz#922149)
-
-* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
-- Fix up shared library extension (rhbz#889784)
-
-* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
-- add ppc64p7 build target, optimized for Power7
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
-- add workaround for ENOPROTOOPT seen running selftests in Koji
-(rhbz#913732)
-
-* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
-- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
-
-* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
-- add aarch64 (rhbz#909783)
-
-* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
-- add BR on bluez-libs-devel (rhbz#879720)
-
-* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
-- 3.3.0rc3 -> 3.3.0; drop alphatag
-
-* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
-- 3.3.0rc2 -> 3.3.0rc3
-
-* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
-- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
-
-* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
-- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
-
-* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
-- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
-134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
-correctly when LANG=C (patch 55); importlib.test was moved to
-test.test_importlib upstream
-
-* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
-- disable some failing checks on PPC* (rhbz#846849)
-
-* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
-- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
-patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
-configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream issue
12326);
-"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
-for stdlib (upstream issues 10645 and 12218); email/test moved to
-test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
-_decimal and _lzma modules; make collections modules explicit in payload again
-(upstream issue 11085); add _testbuffer module to tests subpackage (added in
-upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
-workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
-distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
-_lzma module); skip some tests within test_socket (patch 163)
-
-* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
-
-* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
-
-* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
-- use macro for power64 (rhbz#834653)
-
-* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
-- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
-
-* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
-- fix tapset for debug build
-
-* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
-- update uid/gid handling to avoid int overflows seen with uid/gid
-values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
-
-* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
-- renumber autotools patch from 300 to 5000
-- specfile cleanups
-
-* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
-- fix test_gdb.py (patch 156; rhbz#817072)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
-- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
-generating SELinux denials on "import ctypes" and "import uuid" when
embedding
-Python within httpd (patch 155; rhbz#814391)
-
-* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
-- add explicit version requirements on expat to avoid linkage problems with
-XML_SetHashSalt
-
-* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
-- fix test_gdb (patch 153)
-
-* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
-- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
-values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
-
-* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
-- use newly installed python for byte compiling (now for real)
-
-* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
-- use newly installed python for byte compiling (#787498)
-
-* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
-- Build with $RPM_LD_FLAGS (#756863).
-- Use xz-compressed source tarball.
-
-* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
-- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
-
-* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
-- python3-devel missing autogenerated pkgconfig() provides (#746751)
-
-* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
-- cherrypick fix for distutils not using __pycache__ when byte-compiling
-files (rhbz#722578)
-
-* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
-- re-enable gdbm (patch 148; rhbz#742242)
-
-* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
-- add a sys._debugmallocstats() function (patch 147)
-
-* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
-- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
-_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
-
-* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
-- disable gdbm module to prepare for gdbm soname bump
-
-* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
-- renumber and rename patches for consistency with python.spec (8 to 55, 106
-to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
-
-* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
-- rewrite of "check", introducing downstream-only hooks for skipping specific
-cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
-fine-grained manner than before; (patches 106, 133-142 sparsely, moving
-patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
-
-* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
-- 3.2.2
-
-* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
-- run selftests with "--verbose"
-- disable parts of test_io on ppc (rhbz#732998)
-
-* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
-- use "--findleaks --verbose3" when running test suite
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
-- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
-ppc to avoid aliasing violations (patch 130; rhbz#698726)
-
-* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
-- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
-
-* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
-- add %%python3_version to the rpm macros (rhbz#719082)
-
-* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
-- disable some tests on sparc arches
-
-* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
-- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
-of static library build (due to Modules/_testembed; patch 6), autotool
-intermediates (patch 300)
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
-- use the gdb hooks from the upstream tarball, rather than keeping our own copy
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
-- don't run test_openpty and test_pty in %%check
-
-* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
-- cleanup of BuildRequires; add comment headings to specfile sections
-
-* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
-- fix the libpython.stp systemtap tapset (rhbz#697730)
-
-* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
-- 3.2
-- drop alphatag
-- regenerate autotool patch
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
-- add a /usr/bin/python3-debug symlink within the debug subpackage
-
-* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
-- 3.2rc3
-- regenerate autotool patch
-
-* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
-- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
-
-* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
-- 3.2rc2
-
-* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
-- 3.2rc1
-- rework patch 6 (static lib removal)
-- remove upstreamed patch 130 (ppc debug build)
-- regenerate patch 300 (autotool intermediates)
-- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
-- added libpython3.so and 2to3-3.2
-
-* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
-- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
-error with dynamic annotations (when configured using --with-valgrind)
-- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
-
-* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
-- add --with-valgrind to configuration (on architectures that support this)
-
-* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
-- work around test_subprocess failure seen in koji (patch 129)
-
-* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
-- 3.2b2
-- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
-patch 8 (systemtap), patch 102 (lib64)
-- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
-patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
-fixed upstream)
-- regenerate patch 300 (autotool intermediates)
-- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
-patch 128)
-- stop using runtest.sh in %%check (dropped by upstream), replacing with
-regrtest; fixup list of failing tests
-- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
-- rework manifests of shared libraries to use "SOABI_" macros, reflecting
-PEP 3149
-- drop itertools, operator and _collections modules from the manifests as py3k
-commit r84058 moved these inside libpython; json/tests moved to test/json_tests
-- move turtle code into the tkinter subpackage
-
-* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
-- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
-
-* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
-- move most of the content of the core package to the libs subpackage, given
-that the libs aren't meaningfully usable without the standard libraries
-
-* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
-- Move test.support to core package (rhbz#596258)
-- Add various missing __pycache__ directories to payload
-
-* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
-- Add __pycache__ directory for site-packages
-
-* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
-- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
-- make find-provides-without-python-sonames.sh 64bit aware
-
-* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
-- 3.2a1; add alphatag
-- rework %%files in the light of PEP 3147 (__pycache__)
-- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
-better job of things, and the %%files explicitly lists our modules (r82746
-appears to break the old way of doing things). This leads to various modules
-changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
-dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
-_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
-testing/devel purposes)
-- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
-- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
-plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
-- add machinery for rebuilding "configure" and friends, using the correct
-version of autoconf (patch 300)
-- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
-- "modulator" was removed upstream
-- drop "-b" from patch applications affecting .py files to avoid littering the
-installation tree
-
-* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
-- Turn on computed-gotos.
-- Fix for parallel make and graminit.c
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
-- rebuild
-
-* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
-- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
-a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
-
-* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
-- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
-- reformat whitespace in audioop.c (patch 106)
-- CVE-2010-1634: fix various integer overflow checks in the audioop
-module (patch 107)
-- CVE-2010-2089: further checks within the audioop module (patch 108)
-- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
-
-* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
-- reading the timestamp counter is available only on some arches (see Python/ceval.c)
-
-* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
-- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
-(patch 105)
-
-* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
-- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
-(patch 104); enable them and the WITH_TSC option within the debug build
-
-* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
-- build and install two different configurations of Python 3: debug and
-standard, packaging the debug build in a new "python3-debug" subpackage
-(patch 103)
-
-* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
-- exclude test_http_cookies when running selftests, due to hang seen on
-http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
-11 hours)
-- update python-gdb.py from v5 to py3k version submitted upstream
-
-* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
-- update python-gdb.py from v4 to v5 (improving performance and stability,
-adding commands)
-
-* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
-- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
-cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
-and exceptions)
-
-* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
-- refresh gdb hooks to v3 (reworking how they are packaged)
-
-* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
-- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
-- drop upstreamed patch 2 (.pyc permissions handling)
-- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
-- drop upstreamed patch 200 (path-fixing script)
-
-* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
-- fix typo in libpython.stp (rhbz:575336)
-
-* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
-- add pyfuntop.stp example (source 7)
-- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
-consistency with python.spec
-
-* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
-- rebuild for new package of redhat-rpm-config (rhbz:564527)
-- use 'install -p' when running 'make install'
-
-* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
-- split configure options into multiple lines for easy of editing
-- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
-tapset defining "python.function.entry" and "python.function.return"
to make
-the markers easy to use (dmalcolm; source 5), and an example of using the
-tapset to the docs (dmalcolm; source 6) (rhbz:545179)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
-- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
-%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
-ldconfig (bug 562980), and which should also ensure it becomes part of the
-debuginfo subpackage, rather than the libs subpackage
-- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
-configure script, and to avoid fragile scripts that try to figure this out
-dynamically (e.g. for the -gdb.py change)
-
-* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
-- add gdb hooks for easier debugging (Source 4)
-
-* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
-- update python-3.1.1-config.patch to remove downstream customization of build
-of pyexpat and elementtree modules
-- add patch adapted from upstream (patch 7) to add support for building against
-system expat; add --with-system-expat to "configure" invocation
-- remove embedded copies of expat and zlib from source tree during "prep"
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
-- introduce %%{dynload_dir} macro
-- explicitly list all lib-dynload files, rather than dynamically gathering the
-payload into a temporary text file, so that we can be sure what we are
-shipping
-- introduce a macros.pybytecompile source file, to help with packaging python3
-modules (Source3; written by Toshio)
-- rename "2to3-3" to "python3-2to3" to better reflect python 3 module
packaging
-plans
-
-* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
-- change python-3.1.1-config.patch to remove our downstream change to curses
-configuration in Modules/Setup.dist, so that the curses modules are built using
-setup.py with the downstream default (linking against libncursesw.so, rather
-than libncurses.so), rather than within the Makefile; add a test to %%install
-to verify the dso files that the curses module is linked against the correct
-DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
-
-* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
-- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
-builds for setting up the python3 copy of the source tree)
-
-* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
-- move lib2to3 from -tools subpackage to main package (bug 556667)
-
-* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
-- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
-- use the %%{_isa} macro to ensure that the python-devel dependency on python
-is for the correct multilib arch (#555943)
-- delete bundled copy of libffi to make sure we use the system one
-
-* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
-- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
-docs, rather than the 2.6 build
-
-* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
-- replace references to /usr with %%{_prefix}; replace references to
-/usr/include with %%{_includedir} (Toshio)
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
-- fix permission on find-provides-without-python-sonames.sh from 775 to 755
-
-* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
-- remove build-time requirements on tix and tk, since we already have
-build-time requirements on the -devel subpackages for each of these (Thomas
-Spura)
-- replace usage of %%define with %%global (Thomas Spura)
-- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
-longer be necessary
-- move various test files from the "tools"/"tkinter" subpackages to
the "test"
-subpackage
-
-* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
-- add %%check section (thanks to Thomas Spura)
-- update patch 4 to use correct shebang line
-- get rid of stray patch file from buildroot
-
-* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
-- switched a few instances of "find |xargs" to "find -exec" for
consistency.
-- made the description of __os_install_post more accurate.
-
-* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
-- add macros.python3 to the -devel subpackage, containing common macros for use
-when packaging python3 modules
-
-* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
-- add a provides of "python(abi)" (see bug 532118)
-- fix issues identified by a.badger in package review (bug 526126, comment 39):
- - use "3" thoughout metadata, rather than "3.*"
- - remove conditional around "pkg-config openssl"
- - use standard cleanup of RPM_BUILD_ROOT
- - replace hardcoded references to /usr with _prefix macro
- - stop removing egg-info files
- - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
-up shebang lines
- - stop attempting to remove no-longer-present .cvsignore files
- - move the post/postun sections above the "files" sections
-
-* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
-- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
-flag is used by default in the upstream code
-- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
-_init_posix(), so we include them in the core package, along with their parent
-directories (bug 531901)
-
-* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
-- reword description, based on suggestion by amcnabb
-- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
-- fix the test_tk and test_ttk_* selftests (patch 5)
-- fix up the specfile's handling of shebang/perms to avoid corrupting
-test_httpservers.py (sed command suggested by amcnabb)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
-- fixup importlib/_bootstrap.py so that it correctly handles being unable to
-open .pyc files for writing (patch 2, upstream issue 7187)
-- actually apply the rpath patch (patch 1)
-
-* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
-- update patch0's setup of the crypt module to link it against libcrypt
-- update patch0 to comment "datetimemodule" back out, so that it is built
-using setup.py (see Setup, option 3), thus linking it statically against
-timemodule.c and thus avoiding a run-time "undefined symbol:
-_PyTime_DoubleToTimet" failure on "import datetime"
-
-* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
-- remove executable flag from various files that shouldn't have it
-- fix end-of-line encodings
-- fix a character encoding
-
-* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
-- disable invocation of brp-python-bytecompile in postprocessing, since
-it would be with the wrong version of python (adapted from ivazquez'
-python3000 specfile)
-- use a custom implementation of __find_provides in order to filter out bogus
-provides lines for the various .so modules
-- fixup distutils/unixccompiler.py to remove standard library path from rpath
-(patch 1, was Patch0 in ivazquez' python3000 specfile)
-- split out libraries into a -libs subpackage
-- update summaries and descriptions, basing content on ivazquez' specfile
-- fixup executable permissions on .py, .xpm and .xbm files, based on work in
-ivazquez's specfile
-- get rid of DOS batch files
-- fixup permissions for shared libraries from non-standard 555 to standard 755
-- move /usr/bin/python*-config to the -devel subpackage
-- mark various directories as being documentation
-
-* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
-- Initial package for Python 3.
-
diff --git a/python37.spec b/python37.spec
new file mode 100644
index 0000000..be00616
--- /dev/null
+++ b/python37.spec
@@ -0,0 +1,2705 @@
+# ==================
+# Top-level metadata
+# ==================
+
+%global pybasever 3.7
+
+# pybasever without the dot:
+%global pyshortver 37
+
+Name: python%{pyshortver}
+Summary: Version %{pybasever} of the Python interpreter
+URL:
https://www.python.org/
+
+
+# Second alpha
+%global prerel a2
+
+# WARNING When rebasing to a new Python version,
+# remember to update the python3-docs package as well
+Version: %{pybasever}.0
+Release: 0.1.%{?prerel}%{?dist}
+License: Python
+
+
+# ==================================
+# Conditionals controlling the build
+# ==================================
+
+# Note that the bcond macros are named for the CLI option they create.
+# "%%bcond_without" means "ENABLE by default and create a --without
option"
+
+
+# Flat package, i.e. python36, python37, python38 for tox etc.
+# warning: changes some other defaults
+# in Fedora, never turn this on for the python3 package
+# and always keep it on for python37 etc.
+# WARNING: This does not change the package name and summary above
+%bcond_without flatpackage
+
+
+# Expensive optimizations (mainly, profile-guided optimizations)
+%ifarch %{ix86} x86_64
+%bcond_without optimizations
+%else
+# On some architectures, the optimized build takes tens of hours, possibly
+# longer than Koji's 24-hour timeout. Disable optimizations here.
+%bcond_with optimizations
+%endif
+
+# Run the test suite in %%check
+%bcond_without tests
+
+# Ability to reuse RPM-installed pip using rewheel
+%if %{with flatpackage}
+%bcond_with rewheel
+%else
+%bcond_without rewheel
+%endif
+
+# Extra build for debugging the interpreter or C-API extensions
+# (the -debug subpackages)
+%if %{with flatpackage}
+%bcond_with debug_build
+%else
+%bcond_without debug_build
+%endif
+
+# Support for the GDB debugger
+%bcond_without gdb_hooks
+
+# Support for systemtap instrumentation
+%bcond_with systemtap
+
+# The dbm.gnu module (key-value database)
+%bcond_without gdbm
+
+# Main interpreter loop optimization
+%bcond_without computed_gotos
+
+# Support for the Valgrind debugger/profiler
+%ifnarch s390 %{mips} riscv64
+%bcond_without valgrind
+%else
+# Some arches don't have valgrind, disable support for it there.
+%bcond_with valgrind
+%endif
+
+
+# ==================================
+# Notes from bootstraping Python 3.6
+# ==================================
+#
+# New Python major version (3.X) break ABI and bytecode compatibility,
+# so all packages depending on it need to be rebuilt.
+#
+# Due to a dependency cycle between Python, gdb, rpm, pip, setuptools, wheel,
+# and other packages, this isn't straightforward.
+# Build in the following order:
+#
+# 1. At the same time:
+# - gdb without python support (add %%global _without_python 1 on top of
+# gdb's SPEC file)
+# - python-rpm-generators with bootstrapping_python set to 1
+# (this can be done also during step 2., but should be done before 3.)
+# 2. python3 without rewheel (use %%bcond_with rewheel instead of
+# %%bcond_without)
+# 3. At the same time:
+# - gdb with python support (remove %%global _without_python 1 on top of
+# gdb's SPEC file)
+# - python-rpm-generators with bootstrapping_python set to 0
+# (this can be done at any later step without negative effects)
+# 4. rpm
+# 5. python-setuptools with bootstrap set to 1
+# 6. python-pip with build_wheel set to 0
+# 7. python-wheel with %%bcond_without bootstrap
+# 8. python-setuptools with bootstrap set to 0 and also with_check set to 0
+# 9. python-pip with build_wheel set to 1
+# 10. pyparsing
+# 11. python3 with rewheel
+#
+# Then the most important packages have to be built, in dependency order.
+# These were:
+# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt
+#
+# After these have been built, a targeted rebuild should be done for the rest.
+
+
+# =====================
+# General global macros
+# =====================
+
+%global pylibdir %{_libdir}/python%{pybasever}
+%global dynload_dir %{pylibdir}/lib-dynload
+
+# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
+# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
+%global ABIFLAGS_optimized m
+%global ABIFLAGS_debug dm
+
+%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
+%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
+
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
+
+# All bytecode files are in a __pycache__ subdirectory, with a name
+# reflecting the version of the bytecode.
+# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
+# For example,
+# foo/bar.py
+# has bytecode at:
+# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
+%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
+
+# Python's configure script defines SOVERSION, and this is used in the Makefile
+# to determine INSTSONAME, the name of the libpython DSO:
+# LDLIBRARY='libpython$(VERSION).so'
+# INSTSONAME="$LDLIBRARY".$SOVERSION
+# We mirror this here in order to make it easier to add the -gdb.py hooks.
+# (if these get out of sync, the payload of the libs subpackage will fail
+# and halt the build)
+%global py_SOVERSION 1.0
+%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
+%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
+
+# Disable automatic bytecompilation. The python3 binary is not yet be
+# available in /usr/bin when Python is built. Also, the bytecompilation fails
+# on files that test invalid syntax.
+%undefine py_auto_byte_compile
+
+# For multilib support, files that are different between 32- and 64-bit arches
+# need different filenames. Use "64" or "32" according to the word
size.
+# Currently, the best way to determine an architecture's word size happens to
+# be checking %%{_lib}.
+%if "%{_lib}" == "lib64"
+%global wordsize 64
+%else
+%global wordsize 32
+%endif
+
+
+# =======================
+# Build-time requirements
+# =======================
+
+# (keep this list alphabetized)
+
+BuildRequires: autoconf
+BuildRequires: bluez-libs-devel
+BuildRequires: bzip2
+BuildRequires: bzip2-devel
+BuildRequires: desktop-file-utils
+BuildRequires: expat-devel
+
+BuildRequires: findutils
+BuildRequires: gcc-c++
+%if %{with gdbm}
+BuildRequires: gdbm-devel
+%endif
+BuildRequires: glibc-devel
+BuildRequires: gmp-devel
+BuildRequires: libappstream-glib
+BuildRequires: libffi-devel
+BuildRequires: libGL-devel
+BuildRequires: libuuid-devel
+BuildRequires: libX11-devel
+BuildRequires: ncurses-devel
+
+BuildRequires: openssl-devel
+BuildRequires: pkgconfig
+BuildRequires: readline-devel
+BuildRequires: sqlite-devel
+BuildRequires: gdb
+
+%if %{with systemtap}
+BuildRequires: systemtap-devel
+BuildRequires: systemtap-sdt-devel
+%global tapsetdir /usr/share/systemtap/tapset
+%endif
+
+BuildRequires: tar
+BuildRequires: tcl-devel
+BuildRequires: tix-devel
+BuildRequires: tk-devel
+
+%if %{with valgrind}
+BuildRequires: valgrind-devel
+%endif
+
+BuildRequires: xz-devel
+BuildRequires: zlib-devel
+
+BuildRequires: /usr/bin/dtrace
+
+# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
+BuildRequires: /usr/sbin/ifconfig
+
+%if %{with rewheel}
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%endif
+
+
+# =======================
+# Source code and patches
+# =======================
+
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
+
+# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
+# to enable specfiles to selectively byte-compile individual files and paths
+# with different Python runtimes as necessary:
+Source3: macros.pybytecompile%{pybasever}
+
+# Systemtap tapset to make it easier to use the systemtap static probes
+# (actually a template; LIBRARY_PATH will get fixed up during install)
+# Written by dmalcolm; not yet sent upstream
+Source5: libpython.stp
+
+# Example systemtap script using the tapset
+# Written by wcohen, mjw, dmalcolm; not yet sent upstream
+Source6: systemtap-example.stp
+
+# Another example systemtap script that uses the tapset
+# Written by dmalcolm; not yet sent upstream
+Source7: pyfuntop.stp
+
+# A simple script to check timestamps of bytecode files
+# Run in check section with Python that is currently being built
+# Written by bkabrda
+Source8: check-pyc-and-pyo-timestamps.py
+
+# Backward compatible no-op macro for system-python
+# Remove in Fedora 29
+Source9: macros.systempython
+
+# Desktop menu entry for idle3
+Source10: idle3.desktop
+
+# AppData file for idle3
+Source11: idle3.appdata.xml
+
+# 00001 #
+# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
+# Was Patch0 in ivazquez' python3000 specfile:
+Patch1: 00001-rpath.patch
+
+# 00055 #
+# Systemtap support: add statically-defined probe points
+# Patch sent upstream as
http://bugs.python.org/issue14776
+# with some subsequent reworking to cope with LANG=C in an rpmbuild
+# (where sys.getfilesystemencoding() == 'ascii')
+Patch55: 00055-systemtap.patch
+
+# 00102 #
+# Change the various install paths to use /usr/lib64/ instead or /usr/lib
+# Only used when "%{_lib}" == "lib64"
+# Not yet sent upstream.
+Patch102: 00102-lib64.patch
+
+# 00111 #
+# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
+# a libpythonMAJOR.MINOR.a
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
+# Downstream only: not appropriate for upstream
+Patch111: 00111-no-static-lib.patch
+
+# 00132 #
+# Add non-standard hooks to unittest for use in the "check" phase below, when
+# running selftests within the build:
+# @unittest._skipInRpmBuild(reason)
+# for tests that hang or fail intermittently within the build environment, and:
+# @unittest._expectedFailureInRpmBuild
+# for tests that always fail within the build environment
+#
+# The hooks only take effect if WITHIN_PYTHON_RPM_BUILD is set in the
+# environment, which we set manually in the appropriate portion of the "check"
+# phase below (and which potentially other python-* rpms could set, to reuse
+# these unittest hooks in their own "check" phases)
+Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
+
+# 00155 #
+# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
+# generating SELinux denials on "import ctypes" and "import uuid"
when
+# embedding Python within httpd
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=814391
+Patch155: 00155-avoid-ctypes-thunks.patch
+
+# 00160 #
+# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
+# header files in the build chroot, but may not be supported in the running
+# kernel, hence we disable this test in an rpm build.
+# Adding these was upstream issue
http://bugs.python.org/issue10142
+# Not yet sent upstream
+Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
+
+# 00163 #
+# Some tests within test_socket fail intermittently when run inside Koji;
+# disable them using unittest._skipInRpmBuild
+# Not yet sent upstream
+Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
+
+# 00170 #
+# In debug builds, try to print repr() when a C-level assert fails in the
+# garbage collector (typically indicating a reference-counting error
+# somewhere else e.g in an extension module)
+# The new macros/functions within gcmodule.c are hidden to avoid exposing
+# them within the extension API.
+# Sent upstream:
http://bugs.python.org/issue9263
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=614680
+Patch170: 00170-gc-assertions.patch
+
+# 00178 #
+# Don't duplicate various FLAGS in sysconfig values
+#
http://bugs.python.org/issue17679
+# Does not affect python2 AFAICS (different sysconfig values initialization)
+Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
+
+# 00189 #
+# Add the rewheel module, allowing to recreate wheels from already installed
+# ones
+#
https://github.com/bkabrda/rewheel
+Patch189: 00189-add-rewheel-module.patch
+
+# 00205 #
+# LIBPL variable in makefile takes LIBPL from configure.ac
+# but the LIBPL variable defined there doesn't respect libdir macro
+Patch205: 00205-make-libpl-respect-lib64.patch
+
+# 00251
+# 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
+Patch251: 00251-change-user-install-location.patch
+
+# 00264 #
+# test_pass_by_value was added in Python 3.6.1 and on aarch64
+# it is catching an error that was there, but wasn't tested before.
+# Therefore skipping the test on aarch64 until fixed upstream.
+# Reported upstream:
http://bugs.python.org/issue29804
+Patch264: 00264-skip-test-failing-on-aarch64.patch
+
+# 00273 #
+# Skip test_float_with_comma, which fails in Koji with UnicodeDecodeError
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
+Patch273: 00273-skip-float-test.patch
+
+# 00274 #
+# Upstream uses Debian-style architecture naming. Change to match Fedora.
+Patch274: 00274-fix-arch-names.patch
+
+
+# (New patches go here ^^^)
+#
+# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
+# please try to keep the patch numbers in-sync between all specfiles.
+#
+# More information, and a patch number catalog, is at:
+#
+#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+
+
+# ==========================================
+# Descriptions, and metadata for subpackages
+# ==========================================
+
+%if %{without flatpackage}
+
+# Packages with Python modules in standard locations automatically
+# depend on python(abi). Provide that here.
+Provides: python(abi) = %{pybasever}
+
+# For backward compatibility only, remove in F29:
+Provides: system-python(abi) = %{pybasever}
+Provides: system-python = %{version}-%{release}
+Provides: system-python%{?_isa} = %{version}-%{release}
+Obsoletes: system-python < %{version}-%{release}
+
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
+# In order to support multiple Python interpreters for development purposes,
+# packages with with the naming scheme flatpackage (e.g. python35) exist for
+# non-default versions of Python 3.
+# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
+# these names here.
+Provides: python%{pyshortver} = %{version}-%{release}
+# Note that using Obsoletes without package version is not standard practice.
+# Here we assert that *any* version of the system's default interpreter is
+# preferable to an "extra" interpreter. For example, python3-3.6.1 will
+# replace python36-3.6.2.
+Obsoletes: python%{pyshortver}
+
+# Shall be removed in Fedora 31
+# The release is bumped to 20, so we can do f27 platform-python updates
+# If the release in f27 ever goes >= 20, raise it here
+# If platform-python is ever reintroduced, make it higher version than this:
+%global platpyver 3.6.2-20
+Obsoletes: platform-python < %{platpyver}
+
+%if %{with rewheel}
+Requires: python3-setuptools
+Requires: python3-pip
+%endif
+
+# The description used both for the SRPM and the main `python3` subpackage:
+%description
+Python is an accessible, high-level, dynamically typed, interpreted programming
+language, designed with an emphasis on code readibility.
+It includes an extensive standard library, and has a vast ecosystem of
+third-party libraries.
+
+The ${name} package provides the "python3" executable: the reference
+interpreter for the Python language, version 3.
+The majority of its standard library is provided in the %{name}-libs package,
+which should be installed automatically along with %{name}.
+The remaining parts of the Python standard library are broken out into the
+%{name}-tkinter and %{name}-test packages, which may need to be installed
+separately.
+
+Documentation for Python is provided in the %{name}-docs package.
+
+Packages containing additional libraries for Python are generally named with
+the "%{name}-" prefix.
+
+
+%package libs
+Summary: Python runtime libraries
+
+# The "enum" module is included in the standard library.
+# Provide an upgrade path from the external library.
+Provides: python3-enum34 = 1.0.4-5%{?dist}
+Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
+
+# Python 3 built with glibc >= 2.24.90-26 needs to require it
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1410644
+Requires: glibc%{?_isa} >= 2.24.90-26
+
+# For backward compatibility only, remove in F29:
+Provides: system-python-libs = %{version}-%{release}
+Provides: system-python-libs%{?_isa} = %{version}-%{release}
+Obsoletes: system-python-libs < %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-libs < %{platpyver}
+Obsoletes: platform-python-libs-devel < %{platpyver}
+
+%description libs
+This package contains runtime libraries for use by Python:
+- the majority of the Python standard library
+- a dynamically linked library for use by applications that embed Python as
+ a scripting language, and by the main "python3" executable
+
+
+%package devel
+Summary: Libraries and header files needed for Python development
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+BuildRequires: python-rpm-macros
+Requires: python-rpm-macros
+Requires: python3-rpm-macros
+Requires: python3-rpm-generators
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
+# TODO change to a specific subpackage once available (#1218294)
+Requires: redhat-rpm-config
+
+Conflicts: %{name} < %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-devel < %{platpyver}
+
+%description devel
+This package contains the header files and configuration needed to compile
+Python extension modules (typically written in C or C++), to embed Python
+into other programs, and to make binary distributions for Python libraries.
+
+It also contains the necessary macros to build RPM packages with Python modules.
+
+
+%package tools
+Summary: A collection of tools included with Python including 2to3 and idle
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-tkinter = %{version}-%{release}
+
+Provides: %{name}-2to3 = %{version}-%{release}
+Provides: %{name}-idle = %{version}-%{release}
+Provides: 2to3 = %{version}-%{release}
+Provides: idle3 = %{version}-%{release}
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+# /usr/bin/2to3 was moved from here
+# TODO Remove in Fedora 29
+Conflicts: python2-tools < 2.7.13-17
+Conflicts: python-tools < 2.7.13-17
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-tools < %{platpyver}
+
+%description tools
+This package contains several tools included with Python, including:
+- 2to3, an automatic source converter from Python 2.X
+- idle, a basic graphical development environment
+
+
+%package tkinter
+Summary: A GUI toolkit for Python
+Requires: %{name} = %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-tkinter < %{platpyver}
+
+%description tkinter
+The Tkinter (Tk interface) library is a graphical user interface toolkit for
+the Python programming language.
+
+
+%package test
+Summary: The self-test suite for the main python3 package
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-tools = %{version}-%{release}
+
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-test < %{platpyver}
+
+%description test
+The self-test suite for the Python interpreter.
+
+This is only useful to test Python itself. For testing general Python code,
+you should use the unittest module from %{name}-libs, or a library such as
+${name}-pytest or ${name}-nose.
+
+
+%if %{with debug_build}
+%package debug
+Summary: Debug version of the Python runtime
+
+# The debug build is an all-in-one package version of the regular build, and
+# shares the same .py/.pyc files and directories as the regular build. Hence
+# we depend on all of the subpackages of the regular build:
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+Requires: %{name}-test%{?_isa} = %{version}-%{release}
+Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
+Requires: %{name}-tools%{?_isa} = %{version}-%{release}
+
+%description debug
+python3-debug provides a version of the Python runtime with numerous debugging
+features enabled, aimed at advanced Python users such as developers of Python
+extension modules.
+
+This version uses more memory and will be slower than the regular Python build,
+but is useful for tracking down reference-counting issues and other bugs.
+
+The bytecode format is unchanged, so that .pyc files are compatible between
+this and the standard version of Python, but the debugging features mean that
+C/C++ extension modules are ABI-incompatible and must be built for each version
+separately.
+
+The debug build shares installation directories with the standard Python
+runtime, so that .py and .pyc files can be shared.
+Compiled extension modules use a special ABI flag ("d") in the filename,
+so extensions for both verisons can co-exist in the same directory.
+%endif # with debug_build
+
+%else # with flatpackage
+
+Requires: redhat-rpm-config
+
+# We'll not provide this, on purpose
+# No package in Fedora shall ever depend on flatpackage via this
+%global __requires_exclude ^python\\(abi\\) = 3\\..$
+%global __provides_exclude ^python\\(abi\\) = 3\\..$
+
+# We keep those inside on purpose
+Provides: bundled(python3-pip) = 9.0.1
+Provides: bundled(python3-setuptools) = 28.8.0
+
+# The descripton for the flat flatpackage package
+%description
+This package exists to allow developers to test their code against an newer
+version of Python. This is not a full Python stack and if you wish to run
+your applications with Python %{pybasever}, update your Fedora to a newer
+version once Python %{pybasever} is stable.
+
+%endif # with flatpackage
+
+# ======================================================
+# The prep phase of the build:
+# ======================================================
+
+%prep
+%setup -q -n Python-%{version}%{?prerel}
+
+%if %{with systemtap}
+# Provide an example of usage of the tapset:
+cp -a %{SOURCE6} .
+cp -a %{SOURCE7} .
+%endif # with systemtap
+
+# Remove bundled libraries to ensure that we're using the system copy.
+rm -r Modules/expat
+
+%if %{with rewheel}
+%global pip_version 9.0.1
+sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
+%endif
+
+#
+# Apply patches:
+#
+%patch1 -p1
+
+%if %{with systemtap}
+%patch55 -p1 -b .systemtap
+%endif
+
+%if "%{_lib}" == "lib64"
+%patch102 -p1
+%endif
+%patch111 -p1
+%patch132 -p1
+%patch155 -p1
+%patch160 -p1
+%patch163 -p1
+%patch170 -p1
+%patch178 -p1
+
+%if %{with rewheel}
+%patch189 -p1
+%endif
+
+%patch205 -p1
+%patch251 -p1
+
+%ifarch aarch64
+%patch264 -p1
+%endif
+
+%patch273 -p1
+%patch274 -p1
+
+
+# Remove files that should be generated by the build
+# (This is after patching, so that we can use patches directly from upstream)
+rm configure pyconfig.h.in
+
+
+# ======================================================
+# Configuring and building the code:
+# ======================================================
+
+%build
+
+# Regenerate the configure script and pyconfig.h.in
+autoconf
+autoheader
+
+# Remember the current directory (which has sources and the configure script),
+# so we can refer to it after we "cd" elsewhere.
+topdir=$(pwd)
+
+# Get proper option names from bconds
+%if %{with computed_gotos}
+%global computed_gotos_flag yes
+%else
+%global computed_gotos_flag no
+%endif
+
+%if %{with optimizations}
+%global optimizations_flag "--enable-optimizations"
+%else
+%global optimizations_flag "--disable-optimizations"
+%endif
+
+# Set common compiler/linker flags
+export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
+export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export LINKCC="gcc"
+export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
+export LDFLAGS="$RPM_LD_FLAGS -g $(pkg-config --libs-only-L openssl)"
+
+# We can build several different configurations of Python: regular and debug.
+# Define a common function that does one build:
+BuildPython() {
+ ConfName=$1
+ ExtraConfigArgs=$2
+ MoreCFlags=$3
+
+ # Each build is done in its own directory
+ ConfDir=build/$ConfName
+ echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ # Normally, %%configure looks for the "configure" script in the current
+ # directory.
+ # Since we changed directories, we need to tell %%configure where to look.
+ %global _configure $topdir/configure
+
+%configure \
+ --enable-ipv6 \
+ --enable-shared \
+ --with-computed-gotos=%{computed_gotos_flag} \
+ --with-dbmliborder=gdbm:ndbm:bdb \
+ --with-system-expat \
+ --with-system-ffi \
+ --enable-loadable-sqlite-extensions \
+ --with-dtrace \
+ --with-lto \
+%if %{with systemtap}
+ --with-systemtap \
+%endif
+%if %{with valgrind}
+ --with-valgrind \
+%endif
+ $ExtraConfigArgs \
+ %{nil}
+
+ # Invoke the build
+ make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
+
+ popd
+ echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Call the above to build each configuration.
+
+%if %{with debug_build}
+BuildPython debug \
+ "--without-ensurepip --with-pydebug" \
+ "-O0"
+%endif # with debug_build
+
+BuildPython optimized \
+ "--without-ensurepip %{optimizations_flag}" \
+ ""
+
+# ======================================================
+# Installing the built code:
+# ======================================================
+
+%install
+
+# As in %%build, remember the current directory
+topdir=$(pwd)
+
+# We install a collection of hooks for gdb that make it easier to debug
+# executables linked against libpython3* (such as /usr/bin/python3 itself)
+#
+# These hooks are implemented in Python itself (though they are for the version
+# of python that gdb is linked with)
+#
+# gdb-archer looks for them in the same path as the ELF file or its .debug
+# file, with a -gdb.py suffix.
+# We put them next to the debug file, because ldconfig would complain if
+# it found non-library files directly in /usr/lib/
+# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
+#
+# We'll put these files in the debuginfo package by installing them to e.g.:
+# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
+# (note that the debug path is /usr/lib/debug for both 32/64 bit)
+#
+# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
+# information
+
+%if %{with gdb_hooks}
+DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+mkdir -p %{buildroot}$DirHoldingGdbPy
+%endif # with gdb_hooks
+
+# Multilib support for pyconfig.h
+# 32- and 64-bit versions of pyconfig.h are different. For multilib support
+# (making it possible to install 32- and 64-bit versions simultaneously),
+# we need to install them under different filenames, and to make the common
+# "pyconfig.h" include the right file based on architecture.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
+# Filanames are defined here:
+%global _pyconfig32_h pyconfig-32.h
+%global _pyconfig64_h pyconfig-64.h
+%global _pyconfig_h pyconfig-%{wordsize}.h
+
+# Use a common function to do an install for all our configurations:
+InstallPython() {
+
+ ConfName=$1
+ PyInstSoName=$2
+ MoreCFlags=$3
+ LDVersion=$4
+ Postfix=$5
+
+ # Switch to the directory with this configuration's built files
+ ConfDir=build/$ConfName
+ echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+ pushd $ConfDir
+
+ make \
+ DESTDIR=%{buildroot} \
+ INSTALL="install -p" \
+ EXTRA_CFLAGS="$MoreCFlags" \
+ install
+
+ popd
+
+%if %{with gdb_hooks}
+ # See comment on $DirHoldingGdbPy above
+ PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
+ cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
+%endif # with gdb_hooks
+
+ # Rename the -devel script that differs on different arches to arch specific name
+ mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
+ echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
+
+ # Make python3-devel multilib-ready
+ mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
+ %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
+ cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+#include "%{_pyconfig32_h}"
+#elif __WORDSIZE == 64
+#include "%{_pyconfig64_h}"
+#else
+#error "Unknown word size"
+#endif
+EOF
+
+ # Systemtap hooks
+%if %{with systemtap}
+ mkdir -p %{buildroot}%{tapsetdir}
+ sed \
+ -e "s|LIBRARY_PATH|%{_libdir}/${PyInstSoName}|" \
+ -e 's|"python3"|"python3${Postfix}"|' \
+ %{_sourcedir}/libpython.stp \
+ > %{buildroot}%{tapsetdir}/libpython%{pybasever}${Postfix}-%{wordsize}.stp
+%endif # with systemtap
+
+ echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Install the "debug" build first; any common files will be overridden with
+# later builds
+%if %{with debug_build}
+InstallPython debug \
+ %{py_INSTSONAME_debug} \
+ -O0 \
+ %{LDVERSION_debug} \
+ -debug
+%endif # with debug_build
+
+# Now the optimized build:
+InstallPython optimized \
+ %{py_INSTSONAME_optimized} \
+ "" \
+ %{LDVERSION_optimized} \
+ ""
+
+# Install directories for additional packages
+install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
+%if "%{_lib}" == "lib64"
+# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
+# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
+# modules).
+# Note that rpmlint will complain about hardcoded library path;
+# this is intentional.
+install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
+%endif
+
+%if %{without flatpackage}
+# add idle3 to menu
+install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
+desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
+
+# Install and validate appdata file
+mkdir -p %{buildroot}%{_datadir}/appdata
+cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
+appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
+%endif
+
+# Development tools
+install -m755 -d %{buildroot}%{pylibdir}/Tools
+install Tools/README %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/freeze %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/i18n %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/pynche %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/scripts %{buildroot}%{pylibdir}/Tools/
+
+# Documentation tools
+install -m755 -d %{buildroot}%{pylibdir}/Doc
+cp -ar Doc/tools %{buildroot}%{pylibdir}/Doc/
+
+# Demo scripts
+cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
+
+# Make sure distutils looks at the right pyconfig.h file
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
+# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
+# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
+# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
+#
+# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
+# variants:
+sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
+ %{buildroot}%{pylibdir}/distutils/sysconfig.py \
+ %{buildroot}%{pylibdir}/sysconfig.py
+
+# Switch all shebangs to refer to the specific Python version.
+# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
+# so handle files named using other naming scheme separately.
+LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
+ Tools/scripts/pathfix.py \
+ -i "%{_bindir}/python%{pybasever}" \
+ %{buildroot} %{buildroot}%{pylibdir}/Tools/scripts/*-*.py \
+ %{buildroot}%{pylibdir}/Tools/pynche/{pynche,pynche.pyw}
+# not covered, also redundant and useless:
+rm %{buildroot}%{pylibdir}/Tools/scripts/{2to3,idle3,pydoc3,pyvenv}
+
+
+# Move pathfix.py to bindir
+# See
https://github.com/fedora-python/python-rpm-porting/issues/24
+mv %{buildroot}%{pylibdir}/Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+
+
+# Remove shebang lines from .py files that aren't executable, and
+# remove executability from .py files that don't have a shebang line:
+find %{buildroot} -name \*.py \
+ \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
+ -print -exec sed -i '1d' {} \; \) -o \( \
+ -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
+ -exec chmod a-x {} \; \) \)
+
+# Remove executable flag from files that shouldn't have it:
+chmod a-x \
+ %{buildroot}%{pylibdir}/Tools/README
+
+# Get rid of DOS batch files:
+find %{buildroot} -name \*.bat -exec rm {} \;
+
+# Get rid of backup files:
+find %{buildroot}/ -name "*~" -exec rm -f {} \;
+find . -name "*~" -exec rm -f {} \;
+
+# Get rid of a stray copy of the license:
+rm %{buildroot}%{pylibdir}/LICENSE.txt
+
+# Do bytecompilation with the newly installed interpreter.
+# This is similar to the script in macros.pybytecompile
+# compile *.pyc
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
+
+# Since we have pathfix.py in bindir, this is created, but we don't want it
+rm -rf %{buildroot}%{_bindir}/__pycache__
+
+# Fixup permissions for shared libraries from non-standard 555 to standard 755:
+find %{buildroot} -perm 555 -exec chmod 755 {} \;
+
+# Install macros for rpm:
+mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
+install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
+%if %{without flatpackage}
+install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
+%endif
+
+# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
+# avoid the user having to know the precise version and ABI flags.
+# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
+%if %{with debug_build} && %{without flatpackage}
+ln -s \
+ %{_bindir}/python%{LDVERSION_debug} \
+ %{buildroot}%{_bindir}/python3-debug
+%endif
+
+# System Python: Link the executable to libexec
+# This is for backwards compatibility only and should be removed in Fedora 29
+%if %{without flatpackage}
+mkdir -p %{buildroot}%{_libexecdir}
+ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
+%endif
+
+
+# ======================================================
+# Checks for packaging issues
+# ======================================================
+
+%check
+
+# first of all, check timestamps of bytecode files
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
+
+# Ensure that the curses module was linked against libncursesw.so, rather than
+# libncurses.so
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
+ldd %{buildroot}/%{dynload_dir}/_curses*.so \
+ | grep curses \
+ | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
+
+# Ensure that the debug modules are linked against the debug libpython, and
+# likewise for the optimized modules and libpython:
+for Module in %{buildroot}/%{dynload_dir}/*.so ; do
+ case $Module in
+ *.%{SOABI_debug})
+ ldd $Module | grep %{py_INSTSONAME_optimized} &&
+ (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
+
+ ;;
+ *.%{SOABI_optimized})
+ ldd $Module | grep %{py_INSTSONAME_debug} &&
+ (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
+ ;;
+ esac
+done
+
+# There's no point of having this, as decided in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+rm %{buildroot}%{_bindir}/2to3-%{pybasever}
+
+%if %{with flatpackage}
+# Remove stuff that would conflict with python3 package
+mv %{buildroot}%{_bindir}/python{3,%{pyshortver}}
+rm %{buildroot}%{_bindir}/pydoc3
+rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/idle3
+rm %{buildroot}%{_bindir}/python3-*
+rm %{buildroot}%{_bindir}/pyvenv
+rm %{buildroot}%{_bindir}/2to3
+rm %{buildroot}%{_libdir}/libpython3.so
+rm %{buildroot}%{_mandir}/man1/python3.1*
+rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+%endif
+
+
+# ======================================================
+# Running the upstream test suite
+# ======================================================
+
+# For ppc64 we need a larger stack than default
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1292462
+%ifarch %{power64}
+ ulimit -a
+ ulimit -s 16384
+%endif
+
+
+topdir=$(pwd)
+CheckPython() {
+ ConfName=$1
+ ConfDir=$(pwd)/build/$ConfName
+
+ echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+ # Note that we're running the tests using the version of the code in the
+ # builddir, not in the buildroot.
+
+ # Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
+ # our non-standard decorators take effect on the relevant tests:
+ # @unittest._skipInRpmBuild(reason)
+ # @unittest._expectedFailureInRpmBuild
+ # test_faulthandler.test_register_chain currently fails on ppc64le and
+ # aarch64, see upstream bug
http://bugs.python.org/issue21131
+ WITHIN_PYTHON_RPM_BUILD= \
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
+ -wW --slowest --findleaks \
+ -x test_distutils \
+ -x test_bdist_rpm \
+ %ifarch ppc64le aarch64
+ -x test_faulthandler \
+ %endif
+ %ifarch %{mips64}
+ -x test_ctypes \
+ %endif
+ %ifarch %{power64} s390 s390x armv7hl aarch64 %{mips}
+ -x test_gdb
+ %endif
+
+ echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
+}
+
+%if %{with tests}
+
+# Check each of the configurations:
+%if %{with debug_build}
+CheckPython debug
+%endif # with debug_build
+CheckPython optimized
+
+%endif # with tests
+
+
+# ======================================================
+# Scriptlets
+# ======================================================
+
+%if %{without flatpackage}
+
+%post libs -p /sbin/ldconfig
+
+%postun libs -p /sbin/ldconfig
+
+%posttrans
+/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+
+%endif
+
+
+%post
+%if %{with flatpackage}
+/sbin/ldconfig
+%else
+/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
+%endif
+
+%postun
+%if %{with flatpackage}
+/sbin/ldconfig
+%else
+if [ $1 -eq 0 ] ; then
+ /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
+ /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+fi
+%endif
+
+%files
+%defattr(-, root, root)
+%license LICENSE
+%doc README.rst
+
+%if %{without flatpackage}
+%{_bindir}/pydoc*
+%{_bindir}/python3
+%{_bindir}/pyvenv
+# Remove in Fedora 29:
+%{_libexecdir}/system-python
+%else
+%{_bindir}/pydoc%{pybasever}
+%{_bindir}/python%{pyshortver}
+%endif
+
+%{_bindir}/python%{pybasever}
+%{_bindir}/python%{pybasever}m
+%{_bindir}/pyvenv-%{pybasever}
+%{_mandir}/*/*
+
+
+%if %{without flatpackage}
+%files libs
+%defattr(-,root,root,-)
+%license LICENSE
+%doc README.rst
+%endif
+
+%dir %{pylibdir}
+%dir %{dynload_dir}
+
+%{pylibdir}/lib2to3
+%if %{without flatpackage}
+%exclude %{pylibdir}/lib2to3/tests
+%endif
+
+%dir %{pylibdir}/unittest/
+%dir %{pylibdir}/unittest/__pycache__/
+%{pylibdir}/unittest/*.py
+%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/asyncio/
+%dir %{pylibdir}/asyncio/__pycache__/
+%{pylibdir}/asyncio/*.py
+%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/venv/
+%dir %{pylibdir}/venv/__pycache__/
+%{pylibdir}/venv/*.py
+%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/venv/scripts
+
+%{pylibdir}/wsgiref
+%{pylibdir}/xmlrpc
+
+%dir %{pylibdir}/ensurepip/
+%dir %{pylibdir}/ensurepip/__pycache__/
+%{pylibdir}/ensurepip/*.py
+%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
+%exclude %{pylibdir}/ensurepip/_bundled
+%else
+%dir %{pylibdir}/ensurepip/_bundled
+%{pylibdir}/ensurepip/_bundled/*.whl
+%endif
+
+%if %{with rewheel}
+%dir %{pylibdir}/ensurepip/rewheel/
+%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
+%{pylibdir}/ensurepip/rewheel/*.py
+%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
+%endif
+
+%{pylibdir}/idlelib
+
+%dir %{pylibdir}/test/
+%dir %{pylibdir}/test/__pycache__/
+%dir %{pylibdir}/test/support/
+%dir %{pylibdir}/test/support/__pycache__/
+%{pylibdir}/test/__init__.py
+%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%{pylibdir}/test/support/__init__.py
+%{pylibdir}/test/support/__pycache__/__init__%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/
+%dir %{pylibdir}/concurrent/__pycache__/
+%{pylibdir}/concurrent/*.py
+%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/futures/
+%dir %{pylibdir}/concurrent/futures/__pycache__/
+%{pylibdir}/concurrent/futures/*.py
+%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/pydoc_data
+
+%{dynload_dir}/_blake2.%{SOABI_optimized}.so
+%{dynload_dir}/_md5.%{SOABI_optimized}.so
+%{dynload_dir}/_sha1.%{SOABI_optimized}.so
+%{dynload_dir}/_sha256.%{SOABI_optimized}.so
+%{dynload_dir}/_sha3.%{SOABI_optimized}.so
+%{dynload_dir}/_sha512.%{SOABI_optimized}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
+%{dynload_dir}/_bisect.%{SOABI_optimized}.so
+%{dynload_dir}/_bz2.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
+%{dynload_dir}/_crypt.%{SOABI_optimized}.so
+%{dynload_dir}/_csv.%{SOABI_optimized}.so
+%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
+%{dynload_dir}/_curses.%{SOABI_optimized}.so
+%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
+%{dynload_dir}/_dbm.%{SOABI_optimized}.so
+%{dynload_dir}/_decimal.%{SOABI_optimized}.so
+%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
+%{dynload_dir}/_heapq.%{SOABI_optimized}.so
+%{dynload_dir}/_json.%{SOABI_optimized}.so
+%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
+%{dynload_dir}/_lzma.%{SOABI_optimized}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
+%{dynload_dir}/_opcode.%{SOABI_optimized}.so
+%{dynload_dir}/_pickle.%{SOABI_optimized}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
+%{dynload_dir}/_random.%{SOABI_optimized}.so
+%{dynload_dir}/_socket.%{SOABI_optimized}.so
+%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
+%{dynload_dir}/_ssl.%{SOABI_optimized}.so
+%{dynload_dir}/_struct.%{SOABI_optimized}.so
+%{dynload_dir}/array.%{SOABI_optimized}.so
+%{dynload_dir}/audioop.%{SOABI_optimized}.so
+%{dynload_dir}/binascii.%{SOABI_optimized}.so
+%{dynload_dir}/cmath.%{SOABI_optimized}.so
+%{dynload_dir}/_datetime.%{SOABI_optimized}.so
+%{dynload_dir}/fcntl.%{SOABI_optimized}.so
+%{dynload_dir}/grp.%{SOABI_optimized}.so
+%{dynload_dir}/math.%{SOABI_optimized}.so
+%{dynload_dir}/mmap.%{SOABI_optimized}.so
+%{dynload_dir}/nis.%{SOABI_optimized}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
+%{dynload_dir}/parser.%{SOABI_optimized}.so
+%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
+%{dynload_dir}/readline.%{SOABI_optimized}.so
+%{dynload_dir}/resource.%{SOABI_optimized}.so
+%{dynload_dir}/select.%{SOABI_optimized}.so
+%{dynload_dir}/spwd.%{SOABI_optimized}.so
+%{dynload_dir}/syslog.%{SOABI_optimized}.so
+%{dynload_dir}/termios.%{SOABI_optimized}.so
+#%{dynload_dir}/time.%{SOABI_optimized}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
+%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
+%{dynload_dir}/_uuid.%{SOABI_optimized}.so
+%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
+%{dynload_dir}/zlib.%{SOABI_optimized}.so
+
+%dir %{pylibdir}/site-packages/
+%dir %{pylibdir}/site-packages/__pycache__/
+%{pylibdir}/site-packages/README.txt
+%{pylibdir}/*.py
+%dir %{pylibdir}/__pycache__/
+%{pylibdir}/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/collections/
+%dir %{pylibdir}/collections/__pycache__/
+%{pylibdir}/collections/*.py
+%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/ctypes/
+%dir %{pylibdir}/ctypes/__pycache__/
+%{pylibdir}/ctypes/*.py
+%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/ctypes/macholib
+
+%{pylibdir}/curses
+
+%dir %{pylibdir}/dbm/
+%dir %{pylibdir}/dbm/__pycache__/
+%{pylibdir}/dbm/*.py
+%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/distutils/
+%dir %{pylibdir}/distutils/__pycache__/
+%{pylibdir}/distutils/*.py
+%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/distutils/README
+%{pylibdir}/distutils/command
+%exclude %{pylibdir}/distutils/command/wininst-*.exe
+
+%dir %{pylibdir}/email/
+%dir %{pylibdir}/email/__pycache__/
+%{pylibdir}/email/*.py
+%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/email/mime
+%doc %{pylibdir}/email/architecture.rst
+
+%{pylibdir}/encodings
+
+%{pylibdir}/html
+%{pylibdir}/http
+
+%dir %{pylibdir}/importlib/
+%dir %{pylibdir}/importlib/__pycache__/
+%{pylibdir}/importlib/*.py
+%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/json/
+%dir %{pylibdir}/json/__pycache__/
+%{pylibdir}/json/*.py
+%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/logging
+%{pylibdir}/multiprocessing
+
+%dir %{pylibdir}/sqlite3/
+%dir %{pylibdir}/sqlite3/__pycache__/
+%{pylibdir}/sqlite3/*.py
+%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
+%exclude %{pylibdir}/turtle.py
+%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%endif
+
+%{pylibdir}/urllib
+%{pylibdir}/xml
+
+%if "%{_lib}" == "lib64"
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
+%endif
+
+# "Makefile" and the config-32/64.h file are needed by
+# distutils/sysconfig.py:_init_posix(), so we include them in the core
+# package, along with their parent directories (bug 531901):
+%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%dir %{_includedir}/python%{LDVERSION_optimized}/
+%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+
+%{_libdir}/%{py_INSTSONAME_optimized}
+%if %{without flatpackage}
+%{_libdir}/libpython3.so
+%endif
+%if %{with systemtap}
+%dir %(dirname %{tapsetdir})
+%dir %{tapsetdir}
+%{tapsetdir}/%{libpython_stp_optimized}
+%doc systemtap-example.stp pyfuntop.stp
+%endif
+
+
+%if %{without flatpackage}
+%files devel
+%defattr(-,root,root)
+%endif
+
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
+%if %{without flatpackage}
+%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+%endif
+%{pylibdir}/distutils/command/wininst-*.exe
+%{_includedir}/python%{LDVERSION_optimized}/*.h
+%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
+
+%if %{without flatpackage}
+%{_bindir}/python3-config
+%{_libdir}/pkgconfig/python3.pc
+%{_rpmconfigdir}/macros.d/macros.systempython
+%{_bindir}/pathfix.py
+%endif
+
+%{_bindir}/python%{pybasever}-config
+%{_bindir}/python%{LDVERSION_optimized}-config
+%{_bindir}/python%{LDVERSION_optimized}-*-config
+%{_libdir}/libpython%{LDVERSION_optimized}.so
+%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
+%{_libdir}/pkgconfig/python-%{pybasever}.pc
+%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
+
+
+%if %{without flatpackage}
+%files tools
+%defattr(-,root,root,755)
+
+%{_bindir}/2to3
+%{_bindir}/idle*
+%else
+%{_bindir}/idle%{pybasever}
+%endif
+
+%{pylibdir}/Tools
+%doc %{pylibdir}/Doc
+%if %{without flatpackage}
+%{_datadir}/appdata/idle3.appdata.xml
+%{_datadir}/applications/idle3.desktop
+%{_datadir}/icons/hicolor/*/apps/idle3.*
+%endif
+
+%if %{without flatpackage}
+%files tkinter
+%defattr(-,root,root,755)
+%endif
+
+%{pylibdir}/tkinter
+%if %{without flatpackage}
+%exclude %{pylibdir}/tkinter/test
+%endif
+%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
+%{pylibdir}/turtle.py
+%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%dir %{pylibdir}/turtledemo
+%{pylibdir}/turtledemo/*.py
+%{pylibdir}/turtledemo/*.cfg
+%dir %{pylibdir}/turtledemo/__pycache__/
+%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
+
+
+%if %{without flatpackage}
+%files test
+%defattr(-, root, root)
+%endif
+
+%{pylibdir}/ctypes/test
+%{pylibdir}/distutils/tests
+%{pylibdir}/sqlite3/test
+%{pylibdir}/test
+%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
+%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
+%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
+%{pylibdir}/lib2to3/tests
+%{pylibdir}/tkinter/test
+%{pylibdir}/unittest/test
+
+
+# We don't bother splitting the debug build out into further subpackages:
+# if you need it, you're probably a developer.
+
+# Hence the manifest is the combination of analogous files in the manifests of
+# all of the other subpackages
+
+%if %{with debug_build}
+%if %{without flatpackage}
+%files debug
+%defattr(-,root,root,-)
+%{_bindir}/python3-debug
+%endif
+
+# Analog of the core subpackage's files:
+%{_bindir}/python%{LDVERSION_debug}
+
+# Analog of the -libs subpackage's files:
+# ...with debug builds of the built-in "extension" modules:
+
+%{dynload_dir}/_blake2.%{SOABI_debug}.so
+%{dynload_dir}/_md5.%{SOABI_debug}.so
+%{dynload_dir}/_sha1.%{SOABI_debug}.so
+%{dynload_dir}/_sha256.%{SOABI_debug}.so
+%{dynload_dir}/_sha3.%{SOABI_debug}.so
+%{dynload_dir}/_sha512.%{SOABI_debug}.so
+
+%{dynload_dir}/_asyncio.%{SOABI_debug}.so
+%{dynload_dir}/_bisect.%{SOABI_debug}.so
+%{dynload_dir}/_bz2.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
+%{dynload_dir}/_crypt.%{SOABI_debug}.so
+%{dynload_dir}/_csv.%{SOABI_debug}.so
+%{dynload_dir}/_ctypes.%{SOABI_debug}.so
+%{dynload_dir}/_curses.%{SOABI_debug}.so
+%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
+%{dynload_dir}/_dbm.%{SOABI_debug}.so
+%{dynload_dir}/_decimal.%{SOABI_debug}.so
+%{dynload_dir}/_elementtree.%{SOABI_debug}.so
+%if %{with gdbm}
+%{dynload_dir}/_gdbm.%{SOABI_debug}.so
+%endif
+%{dynload_dir}/_hashlib.%{SOABI_debug}.so
+%{dynload_dir}/_heapq.%{SOABI_debug}.so
+%{dynload_dir}/_json.%{SOABI_debug}.so
+%{dynload_dir}/_lsprof.%{SOABI_debug}.so
+%{dynload_dir}/_lzma.%{SOABI_debug}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
+%{dynload_dir}/_opcode.%{SOABI_debug}.so
+%{dynload_dir}/_pickle.%{SOABI_debug}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
+%{dynload_dir}/_random.%{SOABI_debug}.so
+%{dynload_dir}/_socket.%{SOABI_debug}.so
+%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
+%{dynload_dir}/_ssl.%{SOABI_debug}.so
+%{dynload_dir}/_struct.%{SOABI_debug}.so
+%{dynload_dir}/array.%{SOABI_debug}.so
+%{dynload_dir}/audioop.%{SOABI_debug}.so
+%{dynload_dir}/binascii.%{SOABI_debug}.so
+%{dynload_dir}/cmath.%{SOABI_debug}.so
+%{dynload_dir}/_datetime.%{SOABI_debug}.so
+%{dynload_dir}/fcntl.%{SOABI_debug}.so
+%{dynload_dir}/grp.%{SOABI_debug}.so
+%{dynload_dir}/math.%{SOABI_debug}.so
+%{dynload_dir}/mmap.%{SOABI_debug}.so
+%{dynload_dir}/nis.%{SOABI_debug}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
+%{dynload_dir}/parser.%{SOABI_debug}.so
+%{dynload_dir}/pyexpat.%{SOABI_debug}.so
+%{dynload_dir}/readline.%{SOABI_debug}.so
+%{dynload_dir}/resource.%{SOABI_debug}.so
+%{dynload_dir}/select.%{SOABI_debug}.so
+%{dynload_dir}/spwd.%{SOABI_debug}.so
+%{dynload_dir}/syslog.%{SOABI_debug}.so
+%{dynload_dir}/termios.%{SOABI_debug}.so
+#%{dynload_dir}/time.%{SOABI_debug}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
+%{dynload_dir}/unicodedata.%{SOABI_debug}.so
+%{dynload_dir}/_uuid.%{SOABI_debug}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
+%{dynload_dir}/zlib.%{SOABI_debug}.so
+
+# No need to split things out the "Makefile" and the config-32/64.h file as we
+# do for the regular build above (bug 531901), since they're all in one package
+# now; they're listed below, under "-devel":
+
+%{_libdir}/%{py_INSTSONAME_debug}
+%if %{with systemtap}
+%dir %(dirname %{tapsetdir})
+%dir %{tapsetdir}
+%{tapsetdir}/%{libpython_stp_debug}
+%endif
+
+# Analog of the -devel subpackage's files:
+%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
+%{_includedir}/python%{LDVERSION_debug}
+%{_bindir}/python%{LDVERSION_debug}-config
+%{_bindir}/python%{LDVERSION_debug}-*-config
+%{_libdir}/libpython%{LDVERSION_debug}.so
+%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
+%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
+
+# Analog of the -tools subpackage's files:
+# None for now; we could build precanned versions that have the appropriate
+# shebang if needed
+
+# Analog of the tkinter subpackage's files:
+%{dynload_dir}/_tkinter.%{SOABI_debug}.so
+
+# Analog of the -test subpackage's files:
+%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
+%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
+%{dynload_dir}/_testcapi.%{SOABI_debug}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
+
+%endif # with debug_build
+
+# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
+#
+# The /usr/lib/rpm/redhat/macros defines %__debug_package to use
+# debugfiles.list, and it appears that everything below /usr/lib/debug and
+# (/usr/src/debug) gets added to this file (via LISTFILES) in
+# /usr/lib/rpm/find-debuginfo.sh
+#
+# Hence by installing it below /usr/lib/debug we ensure it is added to the
+# -debuginfo subpackage
+# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
+# payload file would be unpackaged)
+
+# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
+%undefine _debuginfo_subpackages
+
+# ======================================================
+# Finally, the changelog:
+# ======================================================
+
+%changelog
+* Tue Nov 28 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.1.a2
+- Update to 3.7.0 alpha 2
+- Removed merged patches 262, 277, 279
+
+* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
+- Raise the release of platform-python obsoletes for better maintainability
+
+* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
+- Obsolete platform-python and it's subpackages
+
+* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
+- Fix memory corruption due to allocator mix
+Resolves: rhbz#1498207
+
+* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
+- Update to Python 3.6.3
+
+* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
+- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
+- Make the -devel package require redhat-rpm-config
+Resolves: rhbz#1496757
+
+* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
+- Fix /usr/bin/env dependency from python3-tools
+Resolves: rhbz#1482118
+
+* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
+- Include `-g` in the flags sent to the linker (LDFLAGS)
+Resolves: rhbz#1483222
+
+* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
+- Specfile cleanup
+- Make the main description also applicable to the SRPM
+- Add audiotest.au to the test package
+
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
+- Remove %%{pylibdir}/Tools/scripts/2to3
+
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
+- Expat >= 2.1.0 is everywhere, remove explicit requires
+- Conditionalize systemtap-devel BuildRequires
+- For consistency, require /usr/sbin/ifconfig instead of net-tools
+
+* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
+- Rename patch files to be consistent
+- Run autotools to generate the configure script before building
+- Merge lib64 patches (104 into 102)
+- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
+- Remove patches 157 and 186, which had test changes left over after upstreaming
+- Remove patch 188, a temporary workaround for hashlib tests
+- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
+- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
+
+* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
+- Use python3 style of calling super() without arguments in rpath
+ patch to prevent recursion in UnixCCompiler subclasses
+Resolves: rhbz#1458122
+
+* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
+- Add bcond for --without optimizations
+- Reword package descriptions
+- Remove Group declarations
+- Skip failing test_float_with_comma
+
+* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
+- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
+
+* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
+- Use bconds for configuring the build
+- Reorganize the initial sections
+
+* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
+- Have /usr/bin/2to3 (rhbz#1111275)
+- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
+
+* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
+- Revert "Add --executable option to install.py command"
+ This enhancement is currently not needed and it can possibly
+ collide with `pip --editable`option
+
+* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
+- Fix the "urllib FTP protocol stream injection" vulnerability
+Resolves: rhbz#1478916
+
+* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
+- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
+ bsddb), however, no longer needod for Python 3
+- Tested building Python 3 with and without the dependency, all tests pass and
+ filelists of resulting RPMs are identical
+
+* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
+- Do not generate debuginfo subpackages (#1476593)
+- Rebuild with binutils fix for ppc64le (#1475636)
+
+* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
+- Make test_asyncio to not depend on the current SIGHUP signal handler.
+
+* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
+- Update to Python 3.6.2
+
+* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
+- Update to the latest upstream implementation of PEP 538
+
+* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
+- Make pip and distutils in user environment install into separate location
+
+* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
+- Fix test_alpn_protocols from test_ssl
+- Do not require rebundled setuptools dependencies
+
+* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
+- Added a dependency to the devel subpackage on python3-rpm-generators which
+ have been excised out of rpm-build
+- Updated notes on bootstrapping Python on top of this specfile accordingly
+- Involves: rhbz#1410631, rhbz#1444925
+
+* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
+- Enable profile guided optimizations for x86_64 and i686 architectures
+- Update to a newer implementation of PEP 538
+- Update description to reflect that Python 3 is now the default Python
+
+* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
+- Update PEP 538 to the latest upstream implementation
+
+* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
+- Enable link time optimizations
+- Move windows executables to the devel subpackage (rhbz#1426257)
+
+* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
+- Rename python3.Xdm-config script from -debug to be arch specific
+Resolves: rhbz#1179073
+
+* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
+- Install the Makefile in its proper location (rhbz#1438219)
+
+* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
+- Update to version 3.6.1 final
+
+* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
+- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
+
+* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
+- Update to Python 3.6.1 release candidate 1
+- Add patch 264 to skip a known test failure on aarch64
+
+* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
+- Use proper command line parsing in _testembed
+- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
+
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
+
+* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
+- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
+
+* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
+- Revert "Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables..." to prevent build failures
+ of packages using alternate build tools
+
+* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
+- Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables
+- Use new %%_module_build macro
+
+* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
+- Add --executable option to install.py command
+
+* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
+- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
+in order for the virtualenvs to work properly
+
+* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
+- Add missing %%license macro
+
+* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
+- Modify the runtime dependency of python3-libs on system-python-libs again,
+ because previous attempt didn't work properly with dnf resolving mechanism
+
+* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
+- Modify the runtime dependency of python3-libs on system-python-libs to use
+ just the version and release number, but not the dist tag due to Modularity
+
+* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
+- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
+- Skip test_aead_aes_gcm during rpmbuild
+
+* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
+- Rebuild for readline 7.x
+
+* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
+- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
+
+* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
+- Define HAVE_LONG_LONG as 1 for backwards compatibility
+
+* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
+- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
+
+* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
+- Update to Python 3.6.0 final
+
+* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
+- Enable rewheel
+
+* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
+- Update to Python 3.6.0 release candidate 1
+
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
+- Update to Python 3.6.0 beta 4
+
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
+- Set to work with pip version 9.0.1
+
+* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
+- Use proper patch numbering and base upstream branch for
+porting ssl and hashlib modules to OpenSSL 1.1.0
+- Drop hashlib patch for now
+- Add riscv64 arch to 64bit and no-valgrind arches
+
+* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
+- Make it build with OpenSSL-1.1.0 based on upstream patch
+
+* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
+- Obsolete and Provide python35 package
+
+* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
+- Update %py_byte_compile macro
+- Remove unused configure flags (rhbz#1374357)
+
+* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
+- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
+ recompile optimized .pyc files
+- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
+ files are no more
+- Resolves rhbz#1373635
+
+* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
+- Rebased to version 3.5.2
+- Set to work with pip version 8.1.2
+- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
+- Removed arch or environment specific patches 194, 196, 203, and 208
+ as test builds indicate they are no longer needed
+- Updated patches 102, 146, and 242 to work with the new Python codebase
+- Removed patches 200, 201, 5000 which weren't even being applied
+
+* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
+- Fix for CVE-2016-1000110 HTTPoxy attack
+- SPEC file cleanup
+
+* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
+- Build properly on MIPS
+
+* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
+-
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
+
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
+- Refactor patch for properly fixing CVE-2016-5636
+
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
+- Fix test_pyexpat failure with Expat version of 2.2.0
+
+* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
+- Move xml module to system-python-libs
+
+* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
+- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
+- Raise an error when STARTTLS fails
+- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
+- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
+- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
+
+* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
+- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
+
+* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
+- Move distutils to system-python-libs
+
+* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
+- Provide python3-enum34
+
+* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
+- Provide System Python packages and macros
+
+* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
+- Drop python3 macros, require python/python3-rpm-macros
+
+* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
+- Update to 3.5.1
+- Removed patch 199 and 207 (upstream)
+
+* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
+- Remove versioned libpython from devel package
+
+* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
+- add correct arch for ppc64/ppc64le to fix build failure
+
+* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
+- Hide the private _Py_atomic_xxx symbols from public header
+
+* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
+- Rebuild with wheel set to 1
+
+* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
+- Update to 3.5.0
+
+* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
+- python3-devel: Require python-macros for version independant macros such as
+ python_provide. See fpc#281 and fpc#534.
+
+* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
+- Use 1024bit DH key in test_ssl
+- Use -O0 when compiling -debug build
+- Update pip version variable to the version we actually ship
+
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
+- Make relocating Python by changing _prefix actually work
+Resolves: rhbz#1231801
+
+* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
+- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
+
+* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
+- Updated to 3.4.3
+- BuildPython now accepts additional build options
+- Temporarily disabled test_gdb on arm (rhbz#1196181)
+
+* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
+- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
+ (
http://bugs.python.org/issue23433)
+
+* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
+- Rebuilt for Fedora 23 Change
+
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
+
+* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
+- Own systemtap dirs (#710733)
+
+* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
+- build with valgrind on ppc64le
+- disable test_gdb on s390(x) until rhbz#1181034 is resolved
+
+* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
+- New patches: 170 (gc asserts), 200 (gettext headers),
+ 201 (gdbm memory leak)
+
+* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
+- OpenSSL disabled SSLv3 in SSLv23 method
+
+* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
+- Update to 3.4.2
+- Refreshed patches: 156 (gdb autoload)
+- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
+
+* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
+- Fix CVE-2014-4650 - CGIHTTPServer URL handling
+Resolves: rhbz#1113529
+
+* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
+- exclude test_gdb on ppc* (rhbz#1132488)
+
+* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
+- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
+
+* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
+- aarch64 has valgrind, just list those that don't support it
+
+* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
+- bump release and rebuild to link with the correct tcl/tk libs on ppcle
+
+* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
+- Change paths to bundled projects in rewheel patch
+
+* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
+- In config script, use uname -m to write the arch
+
+* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
+- update the arch list where valgrind exists - %%power64 includes also
+ ppc64le which is not supported yet
+
+* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
+- Forward arguments to the arch specific config script
+Resolves: rhbz#1102683
+
+* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
+- Rename python3.Xm-config script to arch specific.
+Resolves: rhbz#1091815
+
+* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
+- Use python3-*, not python-* runtime requires on setuptools and pip
+- rebuild for tcl-8.6
+
+* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
+- Update the rewheel module
+
+* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
+- Fix multilib dependencies.
+Resolves: rhbz#1091815
+
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
+- Update to Python 3.4.1
+
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
+- Fix test_gdb failure on ppc64le
+Resolves: rhbz#1095355
+
+* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
+- Add macro %%python3_version_nodots
+
+* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
+- Disable test_faulthandler, test_gdb on aarch64
+Resolves: rhbz#1045193
+
+* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
+- Don't add Werror=declaration-after-statement for extension
+ modules through setup.py (PyBT#21121)
+
+* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
+- Add setuptools and pip to Requires
+
+* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
+- Point __os_install_post to correct brp-* files
+
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
+- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
+
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
+- Update to Python 3.4 final
+- Add patch adding the rewheel module
+- Merge patches from master
+
+* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
+- Update to Python 3.4 beta 2.
+- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
+- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
+
+* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
+- Update to Python 3.4 beta 1.
+- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
+ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
+- Removed patch 00187 (remove pthread atfork; upstreamed)
+
+* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
+- Update to Python 3.4 alpha 4.
+- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
+114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
+test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
+from py_compile)
+- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
+Koji), 142 (the mock issue that caused this is fixed)
+- Added patch 187 (remove thread atfork) - will be in next version
+- Refreshed script for checking pyc and pyo timestamps with new ignored files.
+- The fips patch is disabled for now until upstream makes a final decision
+what to do with sha3 implementation for 3.4.0.
+
+* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
+- Bytecompile all *.py files properly during build (rhbz#1023607)
+
+* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
+- Added fix for CVE-2013-4238 (rhbz#996399)
+
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
+- fix up indentation in arm patch
+
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
+- disable a test that fails on arm
+- enable valgrind support on arm arches
+
+* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
+- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
+
+* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
+- Add patch for CVE-2013-2099 (rhbz#963261).
+
+* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
+- Updated to Python 3.3.2.
+- Refreshed patches: 153 (gdb test noise)
+- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
+test threads)
+- Synced patch numbers with python.spec.
+
+* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
+- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
+
+* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
+- Add patch that enables building on ppc64p7 (replace the sed, so that
+we get consistent with python2 spec and it's more obvious that we're doing it.
+
+* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
+- Add fix for gdb tests failing on arm, rhbz#951802.
+
+* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
+- Updated to Python 3.3.1.
+- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
+153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
+keeping few more downstream tests)
+- Removed patches: 3 (audiotest.au made it to upstream tarball)
+- Removed workaround for
http://bugs.python.org/issue14774, discussed in
+http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
+
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
+- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
+
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
+- renumber patches to keep them in sync with python.spec
+
+* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
+- Fix error in platform.platform() when non-ascii byte strings are decoded to
+ unicode (rhbz#922149)
+
+* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
+- Fix up shared library extension (rhbz#889784)
+
+* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
+- add ppc64p7 build target, optimized for Power7
+
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
+- add workaround for ENOPROTOOPT seen running selftests in Koji
+(rhbz#913732)
+
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
+- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
+
+* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
+- add aarch64 (rhbz#909783)
+
+* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
+- add BR on bluez-libs-devel (rhbz#879720)
+
+* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
+- 3.3.0rc3 -> 3.3.0; drop alphatag
+
+* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
+- 3.3.0rc2 -> 3.3.0rc3
+
+* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
+- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
+
+* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
+- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
+
+* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
+- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
+134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
+correctly when LANG=C (patch 55); importlib.test was moved to
+test.test_importlib upstream
+
+* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
+- disable some failing checks on PPC* (rhbz#846849)
+
+* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
+- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
+patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
+configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream issue
12326);
+"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
+for stdlib (upstream issues 10645 and 12218); email/test moved to
+test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
+_decimal and _lzma modules; make collections modules explicit in payload again
+(upstream issue 11085); add _testbuffer module to tests subpackage (added in
+upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
+workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
+distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
+_lzma module); skip some tests within test_socket (patch 163)
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+
+* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
+- use macro for power64 (rhbz#834653)
+
+* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
+- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
+
+* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
+- fix tapset for debug build
+
+* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
+- update uid/gid handling to avoid int overflows seen with uid/gid
+values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
+
+* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
+- renumber autotools patch from 300 to 5000
+- specfile cleanups
+
+* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
+- fix test_gdb.py (patch 156; rhbz#817072)
+
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
+- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
+generating SELinux denials on "import ctypes" and "import uuid" when
embedding
+Python within httpd (patch 155; rhbz#814391)
+
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
+- add explicit version requirements on expat to avoid linkage problems with
+XML_SetHashSalt
+
+* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
+- fix test_gdb (patch 153)
+
+* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
+- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
+values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
+
+* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
+- use newly installed python for byte compiling (now for real)
+
+* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
+- use newly installed python for byte compiling (#787498)
+
+* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
+- Build with $RPM_LD_FLAGS (#756863).
+- Use xz-compressed source tarball.
+
+* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
+- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
+
+* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
+- python3-devel missing autogenerated pkgconfig() provides (#746751)
+
+* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
+- cherrypick fix for distutils not using __pycache__ when byte-compiling
+files (rhbz#722578)
+
+* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
+- re-enable gdbm (patch 148; rhbz#742242)
+
+* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
+- add a sys._debugmallocstats() function (patch 147)
+
+* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
+- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
+_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
+
+* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
+- disable gdbm module to prepare for gdbm soname bump
+
+* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
+- renumber and rename patches for consistency with python.spec (8 to 55, 106
+to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
+
+* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
+- rewrite of "check", introducing downstream-only hooks for skipping specific
+cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
+fine-grained manner than before; (patches 106, 133-142 sparsely, moving
+patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
+
+* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
+- 3.2.2
+
+* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
+- run selftests with "--verbose"
+- disable parts of test_io on ppc (rhbz#732998)
+
+* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
+- use "--findleaks --verbose3" when running test suite
+
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
+- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
+ppc to avoid aliasing violations (patch 130; rhbz#698726)
+
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
+- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
+
+* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
+- add %%python3_version to the rpm macros (rhbz#719082)
+
+* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
+- disable some tests on sparc arches
+
+* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
+- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
+of static library build (due to Modules/_testembed; patch 6), autotool
+intermediates (patch 300)
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
+- use the gdb hooks from the upstream tarball, rather than keeping our own copy
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
+- don't run test_openpty and test_pty in %%check
+
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
+- cleanup of BuildRequires; add comment headings to specfile sections
+
+* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
+- fix the libpython.stp systemtap tapset (rhbz#697730)
+
+* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
+- 3.2
+- drop alphatag
+- regenerate autotool patch
+
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
+- add a /usr/bin/python3-debug symlink within the debug subpackage
+
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
+- 3.2rc3
+- regenerate autotool patch
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
+- 3.2rc2
+
+* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
+- 3.2rc1
+- rework patch 6 (static lib removal)
+- remove upstreamed patch 130 (ppc debug build)
+- regenerate patch 300 (autotool intermediates)
+- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
+- added libpython3.so and 2to3-3.2
+
+* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
+- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
+error with dynamic annotations (when configured using --with-valgrind)
+- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
+
+* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
+- add --with-valgrind to configuration (on architectures that support this)
+
+* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
+- work around test_subprocess failure seen in koji (patch 129)
+
+* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
+- 3.2b2
+- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
+patch 8 (systemtap), patch 102 (lib64)
+- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
+patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
+fixed upstream)
+- regenerate patch 300 (autotool intermediates)
+- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
+patch 128)
+- stop using runtest.sh in %%check (dropped by upstream), replacing with
+regrtest; fixup list of failing tests
+- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
+- rework manifests of shared libraries to use "SOABI_" macros, reflecting
+PEP 3149
+- drop itertools, operator and _collections modules from the manifests as py3k
+commit r84058 moved these inside libpython; json/tests moved to test/json_tests
+- move turtle code into the tkinter subpackage
+
+* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
+- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
+
+* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
+- move most of the content of the core package to the libs subpackage, given
+that the libs aren't meaningfully usable without the standard libraries
+
+* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
+- Move test.support to core package (rhbz#596258)
+- Add various missing __pycache__ directories to payload
+
+* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
+- Add __pycache__ directory for site-packages
+
+* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
+- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
+- make find-provides-without-python-sonames.sh 64bit aware
+
+* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
+- 3.2a1; add alphatag
+- rework %%files in the light of PEP 3147 (__pycache__)
+- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
+better job of things, and the %%files explicitly lists our modules (r82746
+appears to break the old way of doing things). This leads to various modules
+changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
+dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
+_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
+testing/devel purposes)
+- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
+- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
+plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
+- add machinery for rebuilding "configure" and friends, using the correct
+version of autoconf (patch 300)
+- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
+- "modulator" was removed upstream
+- drop "-b" from patch applications affecting .py files to avoid littering the
+installation tree
+
+* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
+- Turn on computed-gotos.
+- Fix for parallel make and graminit.c
+
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
+- rebuild
+
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
+- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
+a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
+
+* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
+- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
+- reformat whitespace in audioop.c (patch 106)
+- CVE-2010-1634: fix various integer overflow checks in the audioop
+module (patch 107)
+- CVE-2010-2089: further checks within the audioop module (patch 108)
+- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
+
+* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
+- reading the timestamp counter is available only on some arches (see Python/ceval.c)
+
+* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
+- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
+(patch 105)
+
+* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
+- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
+(patch 104); enable them and the WITH_TSC option within the debug build
+
+* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
+- build and install two different configurations of Python 3: debug and
+standard, packaging the debug build in a new "python3-debug" subpackage
+(patch 103)
+
+* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
+- exclude test_http_cookies when running selftests, due to hang seen on
+http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
+11 hours)
+- update python-gdb.py from v5 to py3k version submitted upstream
+
+* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
+- update python-gdb.py from v4 to v5 (improving performance and stability,
+adding commands)
+
+* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
+- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
+cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
+and exceptions)
+
+* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
+- refresh gdb hooks to v3 (reworking how they are packaged)
+
+* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
+- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
+- drop upstreamed patch 2 (.pyc permissions handling)
+- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
+- drop upstreamed patch 200 (path-fixing script)
+
+* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
+- fix typo in libpython.stp (rhbz:575336)
+
+* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
+- add pyfuntop.stp example (source 7)
+- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
+consistency with python.spec
+
+* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
+- rebuild for new package of redhat-rpm-config (rhbz:564527)
+- use 'install -p' when running 'make install'
+
+* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
+- split configure options into multiple lines for easy of editing
+- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
+tapset defining "python.function.entry" and "python.function.return"
to make
+the markers easy to use (dmalcolm; source 5), and an example of using the
+tapset to the docs (dmalcolm; source 6) (rhbz:545179)
+
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
+- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
+%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
+ldconfig (bug 562980), and which should also ensure it becomes part of the
+debuginfo subpackage, rather than the libs subpackage
+- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
+configure script, and to avoid fragile scripts that try to figure this out
+dynamically (e.g. for the -gdb.py change)
+
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
+- add gdb hooks for easier debugging (Source 4)
+
+* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
+- update python-3.1.1-config.patch to remove downstream customization of build
+of pyexpat and elementtree modules
+- add patch adapted from upstream (patch 7) to add support for building against
+system expat; add --with-system-expat to "configure" invocation
+- remove embedded copies of expat and zlib from source tree during "prep"
+
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
+- introduce %%{dynload_dir} macro
+- explicitly list all lib-dynload files, rather than dynamically gathering the
+payload into a temporary text file, so that we can be sure what we are
+shipping
+- introduce a macros.pybytecompile source file, to help with packaging python3
+modules (Source3; written by Toshio)
+- rename "2to3-3" to "python3-2to3" to better reflect python 3 module
packaging
+plans
+
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
+- change python-3.1.1-config.patch to remove our downstream change to curses
+configuration in Modules/Setup.dist, so that the curses modules are built using
+setup.py with the downstream default (linking against libncursesw.so, rather
+than libncurses.so), rather than within the Makefile; add a test to %%install
+to verify the dso files that the curses module is linked against the correct
+DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
+
+* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
+- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
+builds for setting up the python3 copy of the source tree)
+
+* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
+- move lib2to3 from -tools subpackage to main package (bug 556667)
+
+* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
+- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
+
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
+- use the %%{_isa} macro to ensure that the python-devel dependency on python
+is for the correct multilib arch (#555943)
+- delete bundled copy of libffi to make sure we use the system one
+
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
+- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
+docs, rather than the 2.6 build
+
+* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
+- replace references to /usr with %%{_prefix}; replace references to
+/usr/include with %%{_includedir} (Toshio)
+
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
+- fix permission on find-provides-without-python-sonames.sh from 775 to 755
+
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
+- remove build-time requirements on tix and tk, since we already have
+build-time requirements on the -devel subpackages for each of these (Thomas
+Spura)
+- replace usage of %%define with %%global (Thomas Spura)
+- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
+longer be necessary
+- move various test files from the "tools"/"tkinter" subpackages to
the "test"
+subpackage
+
+* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
+- add %%check section (thanks to Thomas Spura)
+- update patch 4 to use correct shebang line
+- get rid of stray patch file from buildroot
+
+* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
+- switched a few instances of "find |xargs" to "find -exec" for
consistency.
+- made the description of __os_install_post more accurate.
+
+* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
+- add macros.python3 to the -devel subpackage, containing common macros for use
+when packaging python3 modules
+
+* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
+- add a provides of "python(abi)" (see bug 532118)
+- fix issues identified by a.badger in package review (bug 526126, comment 39):
+ - use "3" thoughout metadata, rather than "3.*"
+ - remove conditional around "pkg-config openssl"
+ - use standard cleanup of RPM_BUILD_ROOT
+ - replace hardcoded references to /usr with _prefix macro
+ - stop removing egg-info files
+ - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
+up shebang lines
+ - stop attempting to remove no-longer-present .cvsignore files
+ - move the post/postun sections above the "files" sections
+
+* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
+- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
+flag is used by default in the upstream code
+- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
+_init_posix(), so we include them in the core package, along with their parent
+directories (bug 531901)
+
+* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
+- reword description, based on suggestion by amcnabb
+- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
+- fix the test_tk and test_ttk_* selftests (patch 5)
+- fix up the specfile's handling of shebang/perms to avoid corrupting
+test_httpservers.py (sed command suggested by amcnabb)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
+- fixup importlib/_bootstrap.py so that it correctly handles being unable to
+open .pyc files for writing (patch 2, upstream issue 7187)
+- actually apply the rpath patch (patch 1)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
+- update patch0's setup of the crypt module to link it against libcrypt
+- update patch0 to comment "datetimemodule" back out, so that it is built
+using setup.py (see Setup, option 3), thus linking it statically against
+timemodule.c and thus avoiding a run-time "undefined symbol:
+_PyTime_DoubleToTimet" failure on "import datetime"
+
+* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
+- remove executable flag from various files that shouldn't have it
+- fix end-of-line encodings
+- fix a character encoding
+
+* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
+- disable invocation of brp-python-bytecompile in postprocessing, since
+it would be with the wrong version of python (adapted from ivazquez'
+python3000 specfile)
+- use a custom implementation of __find_provides in order to filter out bogus
+provides lines for the various .so modules
+- fixup distutils/unixccompiler.py to remove standard library path from rpath
+(patch 1, was Patch0 in ivazquez' python3000 specfile)
+- split out libraries into a -libs subpackage
+- update summaries and descriptions, basing content on ivazquez' specfile
+- fixup executable permissions on .py, .xpm and .xbm files, based on work in
+ivazquez's specfile
+- get rid of DOS batch files
+- fixup permissions for shared libraries from non-standard 555 to standard 755
+- move /usr/bin/python*-config to the -devel subpackage
+- mark various directories as being documentation
+
+* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
+- Initial package for Python 3.
+
commit cf16d06001cda79d5473a9cdb76ceb86aac6b1b7
Merge: 33e1cb6 0879619
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Dec 1 13:52:03 2017 +0100
Merge python37 from churchyard/py37
commit 33e1cb6f54bad46d939e760c9654d9c9b0944c70
Author: Gwyn Ciesla <limb(a)fedoraproject.org>
Date: Fri Dec 1 12:28:37 2017 +0000
Added the README
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..42bf07d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# python37
+
+The python37 package
\ No newline at end of file
commit 08796195b5a2a3f3d957c607783948d306985278
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Nov 30 16:47:53 2017 +0100
Remove /usr/bin/2to3-3.7
diff --git a/python3.spec b/python3.spec
index ea90da0..be00616 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1072,6 +1072,10 @@ for Module in %{buildroot}/%{dynload_dir}/*.so ; do
esac
done
+# There's no point of having this, as decided in
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+rm %{buildroot}%{_bindir}/2to3-%{pybasever}
+
%if %{with flatpackage}
# Remove stuff that would conflict with python3 package
mv %{buildroot}%{_bindir}/python{3,%{pyshortver}}
@@ -1481,8 +1485,6 @@ fi
%{_bindir}/idle%{pybasever}
%endif
-# TODO: Remove 2to3-3.7 once rebased to 3.7
-%{_bindir}/2to3-%{pybasever}
%{pylibdir}/Tools
%doc %{pylibdir}/Doc
%if %{without flatpackage}
commit 63459d7d2a4a8df39f900d753cf742c979b480a9
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Nov 30 09:54:54 2017 +0100
Add flatpackage conditional for python37
diff --git a/python3.spec b/python3.spec
index e540456..ea90da0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,15 +2,16 @@
# Top-level metadata
# ==================
-Name: python3
-Summary: Interpreter of the Python programming language
-URL:
https://www.python.org/
-
%global pybasever 3.7
# pybasever without the dot:
%global pyshortver 37
+Name: python%{pyshortver}
+Summary: Version %{pybasever} of the Python interpreter
+URL:
https://www.python.org/
+
+
# Second alpha
%global prerel a2
@@ -28,6 +29,15 @@ License: Python
# Note that the bcond macros are named for the CLI option they create.
# "%%bcond_without" means "ENABLE by default and create a --without
option"
+
+# Flat package, i.e. python36, python37, python38 for tox etc.
+# warning: changes some other defaults
+# in Fedora, never turn this on for the python3 package
+# and always keep it on for python37 etc.
+# WARNING: This does not change the package name and summary above
+%bcond_without flatpackage
+
+
# Expensive optimizations (mainly, profile-guided optimizations)
%ifarch %{ix86} x86_64
%bcond_without optimizations
@@ -41,11 +51,19 @@ License: Python
%bcond_without tests
# Ability to reuse RPM-installed pip using rewheel
+%if %{with flatpackage}
+%bcond_with rewheel
+%else
%bcond_without rewheel
+%endif
# Extra build for debugging the interpreter or C-API extensions
# (the -debug subpackages)
+%if %{with flatpackage}
+%bcond_with debug_build
+%else
%bcond_without debug_build
+%endif
# Support for the GDB debugger
%bcond_without gdb_hooks
@@ -389,6 +407,8 @@ Patch274: 00274-fix-arch-names.patch
# Descriptions, and metadata for subpackages
# ==========================================
+%if %{without flatpackage}
+
# Packages with Python modules in standard locations automatically
# depend on python(abi). Provide that here.
Provides: python(abi) = %{pybasever}
@@ -402,7 +422,7 @@ Obsoletes: system-python < %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
# In order to support multiple Python interpreters for development purposes,
-# packages with with the naming scheme pythonXY (e.g. python35) exist for
+# packages with with the naming scheme flatpackage (e.g. python35) exist for
# non-default versions of Python 3.
# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
# these names here.
@@ -588,6 +608,27 @@ Compiled extension modules use a special ABI flag ("d") in
the filename,
so extensions for both verisons can co-exist in the same directory.
%endif # with debug_build
+%else # with flatpackage
+
+Requires: redhat-rpm-config
+
+# We'll not provide this, on purpose
+# No package in Fedora shall ever depend on flatpackage via this
+%global __requires_exclude ^python\\(abi\\) = 3\\..$
+%global __provides_exclude ^python\\(abi\\) = 3\\..$
+
+# We keep those inside on purpose
+Provides: bundled(python3-pip) = 9.0.1
+Provides: bundled(python3-setuptools) = 28.8.0
+
+# The descripton for the flat flatpackage package
+%description
+This package exists to allow developers to test their code against an newer
+version of Python. This is not a full Python stack and if you wish to run
+your applications with Python %{pybasever}, update your Fedora to a newer
+version once Python %{pybasever} is stable.
+
+%endif # with flatpackage
# ======================================================
# The prep phase of the build:
@@ -879,6 +920,7 @@ install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
%endif
+%if %{without flatpackage}
# add idle3 to menu
install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
@@ -889,6 +931,7 @@ desktop-file-install --dir=%{buildroot}%{_datadir}/applications
%{SOURCE10}
mkdir -p %{buildroot}%{_datadir}/appdata
cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
+%endif
# Development tools
install -m755 -d %{buildroot}%{pylibdir}/Tools
@@ -973,12 +1016,14 @@ find %{buildroot} -perm 555 -exec chmod 755 {} \;
# Install macros for rpm:
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
+%if %{without flatpackage}
install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
+%endif
# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
# avoid the user having to know the precise version and ABI flags.
# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
-%if %{with debug_build}
+%if %{with debug_build} && %{without flatpackage}
ln -s \
%{_bindir}/python%{LDVERSION_debug} \
%{buildroot}%{_bindir}/python3-debug
@@ -986,8 +1031,10 @@ ln -s \
# System Python: Link the executable to libexec
# This is for backwards compatibility only and should be removed in Fedora 29
+%if %{without flatpackage}
mkdir -p %{buildroot}%{_libexecdir}
ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
+%endif
# ======================================================
@@ -1025,6 +1072,21 @@ for Module in %{buildroot}/%{dynload_dir}/*.so ; do
esac
done
+%if %{with flatpackage}
+# Remove stuff that would conflict with python3 package
+mv %{buildroot}%{_bindir}/python{3,%{pyshortver}}
+rm %{buildroot}%{_bindir}/pydoc3
+rm %{buildroot}%{_bindir}/pathfix.py
+rm %{buildroot}%{_bindir}/idle3
+rm %{buildroot}%{_bindir}/python3-*
+rm %{buildroot}%{_bindir}/pyvenv
+rm %{buildroot}%{_bindir}/2to3
+rm %{buildroot}%{_libdir}/libpython3.so
+rm %{buildroot}%{_mandir}/man1/python3.1*
+rm %{buildroot}%{_libdir}/pkgconfig/python3.pc
+%endif
+
+
# ======================================================
# Running the upstream test suite
# ======================================================
@@ -1087,46 +1149,71 @@ CheckPython optimized
# Scriptlets
# ======================================================
+%if %{without flatpackage}
+
%post libs -p /sbin/ldconfig
%postun libs -p /sbin/ldconfig
+%posttrans
+/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+
+%endif
+
+
%post
+%if %{with flatpackage}
+/sbin/ldconfig
+%else
/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
+%endif
%postun
+%if %{with flatpackage}
+/sbin/ldconfig
+%else
if [ $1 -eq 0 ] ; then
/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
fi
-
-%posttrans
-/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+%endif
%files
%defattr(-, root, root)
%license LICENSE
%doc README.rst
+
+%if %{without flatpackage}
%{_bindir}/pydoc*
%{_bindir}/python3
+%{_bindir}/pyvenv
+# Remove in Fedora 29:
+%{_libexecdir}/system-python
+%else
+%{_bindir}/pydoc%{pybasever}
+%{_bindir}/python%{pyshortver}
+%endif
+
%{_bindir}/python%{pybasever}
%{_bindir}/python%{pybasever}m
-%{_bindir}/pyvenv
%{_bindir}/pyvenv-%{pybasever}
%{_mandir}/*/*
-# Remove in Fedora 29:
-%{_libexecdir}/system-python
+
+%if %{without flatpackage}
%files libs
%defattr(-,root,root,-)
%license LICENSE
%doc README.rst
+%endif
%dir %{pylibdir}
%dir %{dynload_dir}
%{pylibdir}/lib2to3
+%if %{without flatpackage}
%exclude %{pylibdir}/lib2to3/tests
+%endif
%dir %{pylibdir}/unittest/
%dir %{pylibdir}/unittest/__pycache__/
@@ -1151,7 +1238,13 @@ fi
%dir %{pylibdir}/ensurepip/__pycache__/
%{pylibdir}/ensurepip/*.py
%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
%exclude %{pylibdir}/ensurepip/_bundled
+%else
+%dir %{pylibdir}/ensurepip/_bundled
+%{pylibdir}/ensurepip/_bundled/*.whl
+%endif
%if %{with rewheel}
%dir %{pylibdir}/ensurepip/rewheel/
@@ -1314,8 +1407,10 @@ fi
%{pylibdir}/sqlite3/*.py
%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
+%if %{without flatpackage}
%exclude %{pylibdir}/turtle.py
%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%endif
%{pylibdir}/urllib
%{pylibdir}/xml
@@ -1335,7 +1430,9 @@ fi
%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%{_libdir}/%{py_INSTSONAME_optimized}
+%if %{without flatpackage}
%{_libdir}/libpython3.so
+%endif
%if %{with systemtap}
%dir %(dirname %{tapsetdir})
%dir %{tapsetdir}
@@ -1343,42 +1440,66 @@ fi
%doc systemtap-example.stp pyfuntop.stp
%endif
+
+%if %{without flatpackage}
%files devel
%defattr(-,root,root)
+%endif
+
%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
+%if %{without flatpackage}
%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
+%endif
%{pylibdir}/distutils/command/wininst-*.exe
%{_includedir}/python%{LDVERSION_optimized}/*.h
-%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
+
+%if %{without flatpackage}
%{_bindir}/python3-config
+%{_libdir}/pkgconfig/python3.pc
+%{_rpmconfigdir}/macros.d/macros.systempython
+%{_bindir}/pathfix.py
+%endif
+
%{_bindir}/python%{pybasever}-config
%{_bindir}/python%{LDVERSION_optimized}-config
%{_bindir}/python%{LDVERSION_optimized}-*-config
-%{_bindir}/pathfix.py
%{_libdir}/libpython%{LDVERSION_optimized}.so
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
-%{_libdir}/pkgconfig/python3.pc
%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
-%{_rpmconfigdir}/macros.d/macros.systempython
+
+%if %{without flatpackage}
%files tools
%defattr(-,root,root,755)
+
%{_bindir}/2to3
+%{_bindir}/idle*
+%else
+%{_bindir}/idle%{pybasever}
+%endif
+
# TODO: Remove 2to3-3.7 once rebased to 3.7
%{_bindir}/2to3-%{pybasever}
-%{_bindir}/idle*
%{pylibdir}/Tools
%doc %{pylibdir}/Doc
+%if %{without flatpackage}
%{_datadir}/appdata/idle3.appdata.xml
%{_datadir}/applications/idle3.desktop
%{_datadir}/icons/hicolor/*/apps/idle3.*
+%endif
+%if %{without flatpackage}
%files tkinter
%defattr(-,root,root,755)
+%endif
+
%{pylibdir}/tkinter
+%if %{without flatpackage}
%exclude %{pylibdir}/tkinter/test
+%endif
%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
%{pylibdir}/turtle.py
%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
@@ -1388,8 +1509,12 @@ fi
%dir %{pylibdir}/turtledemo/__pycache__/
%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
+
+%if %{without flatpackage}
%files test
%defattr(-, root, root)
+%endif
+
%{pylibdir}/ctypes/test
%{pylibdir}/distutils/tests
%{pylibdir}/sqlite3/test
@@ -1411,12 +1536,14 @@ fi
# all of the other subpackages
%if %{with debug_build}
+%if %{without flatpackage}
%files debug
%defattr(-,root,root,-)
+%{_bindir}/python3-debug
+%endif
# Analog of the core subpackage's files:
%{_bindir}/python%{LDVERSION_debug}
-%{_bindir}/python3-debug
# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
commit d668c1e89cecad767da9798403b1f86892576a95
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Nov 28 13:47:21 2017 +0100
Python 3.7 (fedpkg prep ok, builds ok without debug)
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 8eea66d..61f9b52 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,5 +1,5 @@
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
-index 9474e9c..c0ce4c6 100644
+index 0258d3d..4b969bf 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
@@ -20,10 +20,10 @@ index 9474e9c..c0ce4c6 100644
'scripts': '$base/bin',
'data' : '$base',
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
-index 026cca7..6d3e077 100644
+index e07a6c8..554740d 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
-@@ -132,8 +132,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
+@@ -129,8 +129,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
prefix = plat_specific and EXEC_PREFIX or PREFIX
if os.name == "posix":
@@ -37,10 +37,11 @@ index 026cca7..6d3e077 100644
if standard_lib:
return libpython
else:
-diff a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py
+diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py
+index 287ab19..d4c05e0 100644
--- a/Lib/distutils/tests/test_install.py
+++ b/Lib/distutils/tests/test_install.py
-@@ -57,8 +57,9 @@
+@@ -57,8 +57,9 @@ class InstallTestCase(support.TempdirManager,
self.assertEqual(got, expected)
libdir = os.path.join(destination, "lib", "python")
@@ -52,10 +53,10 @@ diff a/Lib/distutils/tests/test_install.py
b/Lib/distutils/tests/test_install.py
check_path(cmd.install_headers,
os.path.join(destination, "include", "python",
"foopkg"))
diff --git a/Lib/site.py b/Lib/site.py
-index a84e3bb..ba0d3ea 100644
+index 7dc1b04..85016b4 100644
--- a/Lib/site.py
+++ b/Lib/site.py
-@@ -303,11 +303,15 @@ def getsitepackages(prefixes=None):
+@@ -334,11 +334,15 @@ def getsitepackages(prefixes=None):
seen.add(prefix)
if os.sep == '/':
@@ -69,10 +70,10 @@ index a84e3bb..ba0d3ea 100644
sitepackages.append(prefix)
+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
- if sys.platform == "darwin":
- # for framework builds *only* we add the standard Apple
+ # for framework builds *only* we add the standard Apple locations.
+ if sys.platform == "darwin" and sys._framework:
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
-index b9bbfe5..2a5f29c 100644
+index 9ee4d31..53c8606 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -20,10 +20,10 @@ __all__ = [
@@ -89,7 +90,7 @@ index b9bbfe5..2a5f29c 100644
'include':
'{installed_base}/include/python{py_version_short}{abiflags}',
'platinclude':
-@@ -61,10 +61,10 @@ _INSTALL_SCHEMES = {
+@@ -62,10 +62,10 @@ _INSTALL_SCHEMES = {
'data': '{userbase}',
},
'posix_user': {
@@ -104,10 +105,10 @@ index b9bbfe5..2a5f29c 100644
'scripts': '{userbase}/bin',
'data': '{userbase}',
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
-index f698927..bc977b5 100644
+index 99e7b4f..c4c98a6 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
-@@ -248,8 +248,8 @@ class HelperFunctionsTests(unittest.TestCase):
+@@ -275,8 +275,8 @@ class HelperFunctionsTests(unittest.TestCase):
self.assertEqual(dirs[1], wanted)
elif os.sep == '/':
# OS X non-framwework builds, Linux, FreeBSD, etc
@@ -119,10 +120,10 @@ index f698927..bc977b5 100644
'site-packages')
self.assertEqual(dirs[0], wanted)
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 8fa7934..a693917 100644
+index e8df8f7..a5a9d5e 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -126,7 +126,7 @@ LIBDIR= @libdir@
+@@ -133,7 +133,7 @@ LIBDIR= @libdir@
MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
@@ -132,7 +133,7 @@ index 8fa7934..a693917 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index 65b47a3..eaa756c 100644
+index dd3387a..1258fcd 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -494,7 +494,7 @@ calculate_path(void)
@@ -163,10 +164,10 @@ index 65b47a3..eaa756c 100644
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
diff --git a/setup.py b/setup.py
-index 0f2dfc4..da37896 100644
+index 11c4ec6..c3e5512 100644
--- a/setup.py
+++ b/setup.py
-@@ -492,7 +492,7 @@ class PyBuildExt(build_ext):
+@@ -513,7 +513,7 @@ class PyBuildExt(build_ext):
# directories (i.e. '.' and 'Include') must be first. See
issue
# 10520.
if not cross_compiling:
@@ -175,7 +176,7 @@ index 0f2dfc4..da37896 100644
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:
-@@ -780,11 +780,11 @@ class PyBuildExt(build_ext):
+@@ -809,11 +809,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
elif self.compiler.find_library_file(lib_dirs +
@@ -189,7 +190,7 @@ index 0f2dfc4..da37896 100644
extra_link_args=readline_extra_link_args,
libraries=readline_libs) )
else:
-@@ -821,8 +821,8 @@ class PyBuildExt(build_ext):
+@@ -850,8 +850,8 @@ class PyBuildExt(build_ext):
if krb5_h:
ssl_incs += krb5_h
ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 6929fda..50cc13a 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,9 +1,9 @@
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 70e5927..04c8e3d 100644
+index a5a9d5e..51e8132 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -556,7 +556,7 @@ clinic: $(BUILDPYTHON) $(srcdir)/Modules/_blake2/blake2s_impl.c
- $(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make
+@@ -530,7 +530,7 @@ clinic: $(BUILDPYTHON) $(srcdir)/Modules/_blake2/blake2s_impl.c
+ $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/clinic/clinic.py --make --srcdir
$(srcdir)
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
@@ -11,26 +11,20 @@ index 70e5927..04c8e3d 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -601,18 +601,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+@@ -574,12 +574,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+ _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
-
+-
-# Build static library
--# avoid long command lines, same as LIBRARY_OBJS
-$(LIBRARY): $(LIBRARY_OBJS)
- -rm -f $@
-- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
-- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
-- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
-- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS) Python/frozen.o
-- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODOBJS)
-- $(RANLIB) $@
+- $(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS)
-
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -702,7 +690,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
+@@ -667,7 +661,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
echo "-----------------------------------------------"; \
fi
@@ -39,7 +33,7 @@ index 70e5927..04c8e3d 100644
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1382,18 +1370,6 @@ libainstall: all python-config
+@@ -1408,17 +1402,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
else true; \
fi; \
done
@@ -49,7 +43,6 @@ index 70e5927..04c8e3d 100644
- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
- else \
- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
- fi; \
- else \
- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
index f491733..1f71939 100644
--- a/00170-gc-assertions.patch
+++ b/00170-gc-assertions.patch
@@ -1,8 +1,8 @@
diff --git a/Include/object.h b/Include/object.h
-index 0c88603..e3413e8 100644
+index cb57359..f928f97 100644
--- a/Include/object.h
+++ b/Include/object.h
-@@ -1059,6 +1059,49 @@ PyAPI_FUNC(void)
+@@ -1069,6 +1069,49 @@ PyAPI_FUNC(void)
_PyObject_DebugTypeStats(FILE *out);
#endif /* ifndef Py_LIMITED_API */
@@ -53,7 +53,7 @@ index 0c88603..e3413e8 100644
}
#endif
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
-index e727499..6efcafb 100644
+index 904fc7d..5676007 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1,10 +1,11 @@
@@ -69,7 +69,7 @@ index e727499..6efcafb 100644
import time
import gc
import weakref
-@@ -50,6 +51,8 @@ class GC_Detector(object):
+@@ -46,6 +47,8 @@ class GC_Detector(object):
# gc collects it.
self.wr = weakref.ref(C1055820(666), it_happened)
@@ -78,7 +78,7 @@ index e727499..6efcafb 100644
@with_tp_del
class Uncollectable(object):
"""Create a reference cycle with multiple __del__ methods.
-@@ -862,6 +865,50 @@ class GCCallbackTests(unittest.TestCase):
+@@ -863,6 +866,50 @@ class GCCallbackTests(unittest.TestCase):
self.assertEqual(len(gc.garbage), 0)
@@ -130,10 +130,10 @@ index e727499..6efcafb 100644
def setUp(self):
gc.enable()
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
-index 0c6f444..87edd5a 100644
+index 6e26c7a..8410206 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
-@@ -341,7 +341,8 @@ update_refs(PyGC_Head *containers)
+@@ -238,7 +238,8 @@ update_refs(PyGC_Head *containers)
{
PyGC_Head *gc = containers->gc.gc_next;
for (; gc != containers; gc = gc->gc.gc_next) {
@@ -143,7 +143,7 @@ index 0c6f444..87edd5a 100644
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
/* Python's cyclic gc should never see an incoming refcount
* of 0: if something decref'ed to 0, it should have been
-@@ -361,7 +362,8 @@ update_refs(PyGC_Head *containers)
+@@ -258,7 +259,8 @@ update_refs(PyGC_Head *containers)
* so serious that maybe this should be a release-build
* check instead of an assert?
*/
@@ -153,7 +153,7 @@ index 0c6f444..87edd5a 100644
}
}
-@@ -376,7 +378,9 @@ visit_decref(PyObject *op, void *data)
+@@ -273,7 +275,9 @@ visit_decref(PyObject *op, void *data)
* generation being collected, which can be recognized
* because only they have positive gc_refs.
*/
@@ -164,7 +164,7 @@ index 0c6f444..87edd5a 100644
if (_PyGCHead_REFS(gc) > 0)
_PyGCHead_DECREF(gc);
}
-@@ -436,9 +440,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
+@@ -333,9 +337,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
* If gc_refs == GC_UNTRACKED, it must be ignored.
*/
else {
@@ -178,7 +178,7 @@ index 0c6f444..87edd5a 100644
}
}
return 0;
-@@ -480,7 +485,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
+@@ -377,7 +382,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
*/
PyObject *op = FROM_GC(gc);
traverseproc traverse = Py_TYPE(op)->tp_traverse;
@@ -187,7 +187,7 @@ index 0c6f444..87edd5a 100644
_PyGCHead_SET_REFS(gc, GC_REACHABLE);
(void) traverse(op,
(visitproc)visit_reachable,
-@@ -543,7 +548,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head
*finalizers)
+@@ -440,7 +445,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head
*finalizers)
for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
PyObject *op = FROM_GC(gc);
@@ -196,7 +196,7 @@ index 0c6f444..87edd5a 100644
next = gc->gc.gc_next;
if (has_legacy_finalizer(op)) {
-@@ -619,7 +624,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -516,7 +521,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
PyWeakReference **wrlist;
op = FROM_GC(gc);
@@ -205,7 +205,7 @@ index 0c6f444..87edd5a 100644
next = gc->gc.gc_next;
if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
-@@ -640,9 +645,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -537,9 +542,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
* the callback pointer intact. Obscure: it also
* changes *wrlist.
*/
@@ -217,7 +217,7 @@ index 0c6f444..87edd5a 100644
if (wr->wr_callback == NULL)
continue; /* no callback */
-@@ -676,7 +681,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -573,7 +578,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
*/
if (IS_TENTATIVELY_UNREACHABLE(wr))
continue;
@@ -226,7 +226,7 @@ index 0c6f444..87edd5a 100644
/* Create a new reference so that wr can't go away
* before we can process it again.
-@@ -685,7 +690,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -582,7 +587,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
/* Move wr to wrcb_to_call, for the next pass. */
wrasgc = AS_GC(wr);
@@ -236,7 +236,7 @@ index 0c6f444..87edd5a 100644
next isn't, so they can't
be the same */
gc_list_move(wrasgc, &wrcb_to_call);
-@@ -701,11 +707,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
+@@ -598,11 +604,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
gc = wrcb_to_call.gc.gc_next;
op = FROM_GC(gc);
@@ -251,7 +251,7 @@ index 0c6f444..87edd5a 100644
/* copy-paste of weakrefobject.c's handle_callback() */
temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
-@@ -822,12 +828,14 @@ check_garbage(PyGC_Head *collectable)
+@@ -719,12 +725,14 @@ check_garbage(PyGC_Head *collectable)
for (gc = collectable->gc.gc_next; gc != collectable;
gc = gc->gc.gc_next) {
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
@@ -269,11 +269,11 @@ index 0c6f444..87edd5a 100644
return -1;
}
diff --git a/Objects/object.c b/Objects/object.c
-index 559794f..a47d47f 100644
+index ed8a62a..5279b15 100644
--- a/Objects/object.c
+++ b/Objects/object.c
-@@ -2022,6 +2022,35 @@ _PyTrash_thread_destroy_chain(void)
- }
+@@ -2116,6 +2116,35 @@ _PyTrash_thread_destroy_chain(void)
+ --tstate->trash_delete_nesting;
}
+PyAPI_FUNC(void)
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
index 53a26ca..bae64d4 100644
--- a/00189-add-rewheel-module.patch
+++ b/00189-add-rewheel-module.patch
@@ -1,6 +1,7 @@
-diff -Nur Python-3.4.1/Lib/ensurepip/__init__.py
Python-3.4.1-rewheel/Lib/ensurepip/__init__.py
---- Python-3.4.1/Lib/ensurepip/__init__.py 2014-08-21 10:49:30.792695824 +0200
-+++ Python-3.4.1-rewheel/Lib/ensurepip/__init__.py 2014-08-21 10:10:41.958341726 +0200
+diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
+index d69e09f..5cb12df 100644
+--- a/Lib/ensurepip/__init__.py
++++ b/Lib/ensurepip/__init__.py
@@ -1,8 +1,10 @@
import os
import os.path
@@ -12,16 +13,16 @@ diff -Nur Python-3.4.1/Lib/ensurepip/__init__.py
Python-3.4.1-rewheel/Lib/ensure
__all__ = ["version", "bootstrap"]
-@@ -38,6 +40,8 @@
+@@ -25,6 +27,8 @@ def _run_pip(args, additional_paths=None):
# Install the bundled software
import pip
+ if args[0] in ["install", "list", "wheel"]:
+ args.append('--pre')
- pip.main(args)
+ return pip.main(args)
-@@ -87,20 +91,39 @@
+@@ -88,20 +92,39 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
# omit pip and easy_install
os.environ["ENSUREPIP_OPTIONS"] = "install"
@@ -71,9 +72,11 @@ diff -Nur Python-3.4.1/Lib/ensurepip/__init__.py
Python-3.4.1-rewheel/Lib/ensure
# Construct the arguments to be passed to the pip command
args = ["install", "--no-index", "--find-links",
tmpdir]
-diff -Nur Python-3.4.1/Lib/ensurepip/rewheel/__init__.py
Python-3.4.1-rewheel/Lib/ensurepip/rewheel/__init__.py
---- Python-3.4.1/Lib/ensurepip/rewheel/__init__.py 1970-01-01 01:00:00.000000000 +0100
-+++ Python-3.4.1-rewheel/Lib/ensurepip/rewheel/__init__.py 2014-08-21 10:11:22.560320121
+0200
+diff --git a/Lib/ensurepip/rewheel/__init__.py b/Lib/ensurepip/rewheel/__init__.py
+new file mode 100644
+index 0000000..753c764
+--- /dev/null
++++ b/Lib/ensurepip/rewheel/__init__.py
@@ -0,0 +1,143 @@
+import argparse
+import codecs
@@ -218,10 +221,11 @@ diff -Nur Python-3.4.1/Lib/ensurepip/rewheel/__init__.py
Python-3.4.1-rewheel/Li
+ else:
+ pass # bad RECORD or empty line
+ return to_write, to_omit
-diff -Nur Python-3.4.1/Makefile.pre.in Python-3.4.1-rewheel/Makefile.pre.in
---- Python-3.4.1/Makefile.pre.in 2014-08-21 10:49:31.512695040 +0200
-+++ Python-3.4.1-rewheel/Makefile.pre.in 2014-08-21 10:10:41.961341722 +0200
-@@ -1145,7 +1145,7 @@
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 51e8132..42b3d29 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -1241,7 +1241,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \
test/test_asyncio \
collections concurrent concurrent/futures encodings \
email email/mime test/test_email test/test_email/data \
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
deleted file mode 100644
index d749bac..0000000
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ /dev/null
@@ -1,1090 +0,0 @@
-diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
-index 195f63f..8ecd70f 100644
---- a/Doc/using/cmdline.rst
-+++ b/Doc/using/cmdline.rst
-@@ -713,6 +713,45 @@ conflict.
-
- .. versionadded:: 3.6
-
-+
-+.. envvar:: PYTHONCOERCECLOCALE
-+
-+ If set to the value ``0``, causes the main Python command line application
-+ to skip coercing the legacy ASCII-based C locale to a more capable UTF-8
-+ based alternative. Note that this setting is checked even when the
-+ :option:`-E` or :option:`-I` options are used, as it is handled prior to
-+ the processing of command line options.
-+
-+ If this variable is *not* set, or is set to a value other than ``0``, and
-+ the current locale reported for the ``LC_CTYPE`` category is the default
-+ ``C`` locale, then the Python CLI will attempt to configure one of the
-+ following locales for the given locale categories before loading the
-+ interpreter runtime:
-+
-+ * ``C.UTF-8`` (``LC_ALL``)
-+ * ``C.utf8`` (``LC_ALL``)
-+ * ``UTF-8`` (``LC_CTYPE``)
-+
-+ If setting one of these locale categories succeeds, then the matching
-+ environment variables will be set (both ``LC_ALL`` and ``LANG`` for the
-+ ``LC_ALL`` category, and ``LC_CTYPE`` for the ``LC_CTYPE`` category) in
-+ the current process environment before the Python runtime is initialized.
-+
-+ Configuring one of these locales (either explicitly or via the above
-+ implicit locale coercion) will automatically set the error handler for
-+ :data:`sys.stdin` and :data:`sys.stdout` to ``surrogateescape``. This
-+ behavior can be overridden using :envvar:`PYTHONIOENCODING` as usual.
-+
-+ For debugging purposes, setting ``PYTHONCOERCECLOCALE=warn`` will cause
-+ Python to emit warning messages on ``stderr`` if either the locale coercion
-+ activates, or else if a locale that *would* have triggered coercion is
-+ still active when the Python runtime is initialized.
-+
-+ Availability: \*nix
-+
-+ .. versionadded:: 3.7
-+ See :pep:`538` for more details.
-+
- Debug-mode variables
- ~~~~~~~~~~~~~~~~~~~~
-
-diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
-index ca5f9c2..7aa460b 100644
---- a/Lib/test/support/script_helper.py
-+++ b/Lib/test/support/script_helper.py
-@@ -51,8 +51,35 @@ def interpreter_requires_environment():
- return __cached_interp_requires_environment
-
-
--_PythonRunResult = collections.namedtuple("_PythonRunResult",
-- ("rc", "out",
"err"))
-+class _PythonRunResult(collections.namedtuple("_PythonRunResult",
-+ ("rc", "out",
"err"))):
-+ """Helper for reporting Python subprocess run
results"""
-+ def fail(self, cmd_line):
-+ """Provide helpful details about failed subcommand
runs"""
-+ # Limit to 80 lines to ASCII characters
-+ maxlen = 80 * 100
-+ out, err = self.out, self.err
-+ if len(out) > maxlen:
-+ out = b'(... truncated stdout ...)' + out[-maxlen:]
-+ if len(err) > maxlen:
-+ err = b'(... truncated stderr ...)' + err[-maxlen:]
-+ out = out.decode('ascii', 'replace').rstrip()
-+ err = err.decode('ascii', 'replace').rstrip()
-+ raise AssertionError("Process return code is %d\n"
-+ "command line: %r\n"
-+ "\n"
-+ "stdout:\n"
-+ "---\n"
-+ "%s\n"
-+ "---\n"
-+ "\n"
-+ "stderr:\n"
-+ "---\n"
-+ "%s\n"
-+ "---"
-+ % (self.rc, cmd_line,
-+ out,
-+ err))
-
-
- # Executing the interpreter in a subprocess
-@@ -110,30 +137,7 @@ def run_python_until_end(*args, **env_vars):
- def _assert_python(expected_success, *args, **env_vars):
- res, cmd_line = run_python_until_end(*args, **env_vars)
- if (res.rc and expected_success) or (not res.rc and not expected_success):
-- # Limit to 80 lines to ASCII characters
-- maxlen = 80 * 100
-- out, err = res.out, res.err
-- if len(out) > maxlen:
-- out = b'(... truncated stdout ...)' + out[-maxlen:]
-- if len(err) > maxlen:
-- err = b'(... truncated stderr ...)' + err[-maxlen:]
-- out = out.decode('ascii', 'replace').rstrip()
-- err = err.decode('ascii', 'replace').rstrip()
-- raise AssertionError("Process return code is %d\n"
-- "command line: %r\n"
-- "\n"
-- "stdout:\n"
-- "---\n"
-- "%s\n"
-- "---\n"
-- "\n"
-- "stderr:\n"
-- "---\n"
-- "%s\n"
-- "---"
-- % (res.rc, cmd_line,
-- out,
-- err))
-+ res.fail(cmd_line)
- return res
-
- def assert_python_ok(*args, **env_vars):
-diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py
-new file mode 100644
-index 0000000..635c98f
---- /dev/null
-+++ b/Lib/test/test_c_locale_coercion.py
-@@ -0,0 +1,371 @@
-+# Tests the attempted automatic coercion of the C locale to a UTF-8 locale
-+
-+import unittest
-+import locale
-+import os
-+import sys
-+import sysconfig
-+import shutil
-+import subprocess
-+from collections import namedtuple
-+
-+import test.support
-+from test.support.script_helper import (
-+ run_python_until_end,
-+ interpreter_requires_environment,
-+)
-+
-+# Set our expectation for the default encoding used in the C locale
-+# for the filesystem encoding and the standard streams
-+
-+# AIX uses iso8859-1 in the C locale, other *nix platforms use ASCII
-+if sys.platform.startswith("aix"):
-+ C_LOCALE_STREAM_ENCODING = "iso8859-1"
-+else:
-+ C_LOCALE_STREAM_ENCODING = "ascii"
-+
-+# FS encoding is UTF-8 on macOS, other *nix platforms use the locale encoding
-+if sys.platform == "darwin":
-+ C_LOCALE_FS_ENCODING = "utf-8"
-+else:
-+ C_LOCALE_FS_ENCODING = C_LOCALE_STREAM_ENCODING
-+
-+# Note that the above is probably still wrong in some cases, such as:
-+# * Windows when PYTHONLEGACYWINDOWSFSENCODING is set
-+# * AIX and any other platforms that use latin-1 in the C locale
-+#
-+# Options for dealing with this:
-+# * Don't set PYTHON_COERCE_C_LOCALE on such platforms (e.g. Windows doesn't)
-+# * Fix the test expectations to match the actual platform behaviour
-+
-+# In order to get the warning messages to match up as expected, the candidate
-+# order here must much the target locale order in Python/pylifecycle.c
-+_C_UTF8_LOCALES = ("C.UTF-8", "C.utf8", "UTF-8")
-+
-+# There's no reliable cross-platform way of checking locale alias
-+# lists, so the only way of knowing which of these locales will work
-+# is to try them with locale.setlocale(). We do that in a subprocess
-+# to avoid altering the locale of the test runner.
-+#
-+# If the relevant locale module attributes exist, and we're not on a platform
-+# where we expect it to always succeed, we also check that
-+# `locale.nl_langinfo(locale.CODESET)` works, as if it fails, the interpreter
-+# will skip locale coercion for that particular target locale
-+_check_nl_langinfo_CODESET = bool(
-+ sys.platform not in ("darwin", "linux") and
-+ hasattr(locale, "nl_langinfo") and
-+ hasattr(locale, "CODESET")
-+)
-+
-+def _set_locale_in_subprocess(locale_name):
-+ cmd_fmt = "import locale; print(locale.setlocale(locale.LC_CTYPE,
'{}'))"
-+ if _check_nl_langinfo_CODESET:
-+ # If there's no valid CODESET, we expect coercion to be skipped
-+ cmd_fmt += "; import sys; sys.exit(not
locale.nl_langinfo(locale.CODESET))"
-+ cmd = cmd_fmt.format(locale_name)
-+ result, py_cmd = run_python_until_end("-c", cmd, __isolated=True)
-+ return result.rc == 0
-+
-+
-+
-+_fields = "fsencoding stdin_info stdout_info stderr_info lang lc_ctype
lc_all"
-+_EncodingDetails = namedtuple("EncodingDetails", _fields)
-+
-+class EncodingDetails(_EncodingDetails):
-+ # XXX (ncoghlan): Using JSON for child state reporting may be less fragile
-+ CHILD_PROCESS_SCRIPT = ";".join([
-+ "import sys, os",
-+ "print(sys.getfilesystemencoding())",
-+ "print(sys.stdin.encoding + ':' + sys.stdin.errors)",
-+ "print(sys.stdout.encoding + ':' + sys.stdout.errors)",
-+ "print(sys.stderr.encoding + ':' + sys.stderr.errors)",
-+ "print(os.environ.get('LANG', 'not set'))",
-+ "print(os.environ.get('LC_CTYPE', 'not set'))",
-+ "print(os.environ.get('LC_ALL', 'not set'))",
-+ ])
-+
-+ @classmethod
-+ def get_expected_details(cls, coercion_expected, fs_encoding, stream_encoding,
env_vars):
-+ """Returns expected child process details for a given
encoding"""
-+ _stream = stream_encoding + ":{}"
-+ # stdin and stdout should use surrogateescape either because the
-+ # coercion triggered, or because the C locale was detected
-+ stream_info = 2*[_stream.format("surrogateescape")]
-+ # stderr should always use backslashreplace
-+ stream_info.append(_stream.format("backslashreplace"))
-+ expected_lang = env_vars.get("LANG", "not set").lower()
-+ if coercion_expected:
-+ expected_lc_ctype = CLI_COERCION_TARGET.lower()
-+ else:
-+ expected_lc_ctype = env_vars.get("LC_CTYPE", "not
set").lower()
-+ expected_lc_all = env_vars.get("LC_ALL", "not set").lower()
-+ env_info = expected_lang, expected_lc_ctype, expected_lc_all
-+ return dict(cls(fs_encoding, *stream_info, *env_info)._asdict())
-+
-+ @staticmethod
-+ def _handle_output_variations(data):
-+ """Adjust the output to handle platform specific idiosyncrasies
-+
-+ * Some platforms report ASCII as ANSI_X3.4-1968
-+ * Some platforms report ASCII as US-ASCII
-+ * Some platforms report UTF-8 instead of utf-8
-+ """
-+ data = data.replace(b"ANSI_X3.4-1968", b"ascii")
-+ data = data.replace(b"US-ASCII", b"ascii")
-+ data = data.lower()
-+ return data
-+
-+ @classmethod
-+ def get_child_details(cls, env_vars):
-+ """Retrieves fsencoding and standard stream details from a child
process
-+
-+ Returns (encoding_details, stderr_lines):
-+
-+ - encoding_details: EncodingDetails for eager decoding
-+ - stderr_lines: result of calling splitlines() on the stderr output
-+
-+ The child is run in isolated mode if the current interpreter supports
-+ that.
-+ """
-+ result, py_cmd = run_python_until_end(
-+ "-c", cls.CHILD_PROCESS_SCRIPT,
-+ __isolated=True,
-+ **env_vars
-+ )
-+ if not result.rc == 0:
-+ result.fail(py_cmd)
-+ # All subprocess outputs in this test case should be pure ASCII
-+ adjusted_output = cls._handle_output_variations(result.out)
-+ stdout_lines = adjusted_output.decode("ascii").splitlines()
-+ child_encoding_details = dict(cls(*stdout_lines)._asdict())
-+ stderr_lines = result.err.decode("ascii").rstrip().splitlines()
-+ return child_encoding_details, stderr_lines
-+
-+
-+# Details of the shared library warning emitted at runtime
-+LEGACY_LOCALE_WARNING = (
-+ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
-+ "encoding), which may cause Unicode compatibility problems. Using C.UTF-8,
"
-+ "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
-+ "locales is recommended."
-+)
-+
-+# Details of the CLI locale coercion warning emitted at runtime
-+CLI_COERCION_WARNING_FMT = (
-+ "Python detected LC_CTYPE=C: LC_CTYPE coerced to {} (set another locale "
-+ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior)."
-+)
-+
-+
-+AVAILABLE_TARGETS = None
-+CLI_COERCION_TARGET = None
-+CLI_COERCION_WARNING = None
-+
-+def setUpModule():
-+ global AVAILABLE_TARGETS
-+ global CLI_COERCION_TARGET
-+ global CLI_COERCION_WARNING
-+
-+ if AVAILABLE_TARGETS is not None:
-+ # initialization already done
-+ return
-+ AVAILABLE_TARGETS = []
-+
-+ # Find the target locales available in the current system
-+ for target_locale in _C_UTF8_LOCALES:
-+ if _set_locale_in_subprocess(target_locale):
-+ AVAILABLE_TARGETS.append(target_locale)
-+
-+ if AVAILABLE_TARGETS:
-+ # Coercion is expected to use the first available target locale
-+ CLI_COERCION_TARGET = AVAILABLE_TARGETS[0]
-+ CLI_COERCION_WARNING = CLI_COERCION_WARNING_FMT.format(CLI_COERCION_TARGET)
-+
-+
-+class _LocaleHandlingTestCase(unittest.TestCase):
-+ # Base class to check expected locale handling behaviour
-+
-+ def _check_child_encoding_details(self,
-+ env_vars,
-+ expected_fs_encoding,
-+ expected_stream_encoding,
-+ expected_warnings,
-+ coercion_expected):
-+ """Check the C locale handling for the given process environment
-+
-+ Parameters:
-+ expected_fs_encoding: expected sys.getfilesystemencoding() result
-+ expected_stream_encoding: expected encoding for standard streams
-+ expected_warning: stderr output to expect (if any)
-+ """
-+ result = EncodingDetails.get_child_details(env_vars)
-+ encoding_details, stderr_lines = result
-+ expected_details = EncodingDetails.get_expected_details(
-+ coercion_expected,
-+ expected_fs_encoding,
-+ expected_stream_encoding,
-+ env_vars
-+ )
-+ self.assertEqual(encoding_details, expected_details)
-+ if expected_warnings is None:
-+ expected_warnings = []
-+ self.assertEqual(stderr_lines, expected_warnings)
-+
-+
-+class LocaleConfigurationTests(_LocaleHandlingTestCase):
-+ # Test explicit external configuration via the process environment
-+
-+ def setUpClass():
-+ # This relies on setupModule() having been run, so it can't be
-+ # handled via the @unittest.skipUnless decorator
-+ if not AVAILABLE_TARGETS:
-+ raise unittest.SkipTest("No C-with-UTF-8 locale available")
-+
-+ def test_external_target_locale_configuration(self):
-+
-+ # Explicitly setting a target locale should give the same behaviour as
-+ # is seen when implicitly coercing to that target locale
-+ self.maxDiff = None
-+
-+ expected_fs_encoding = "utf-8"
-+ expected_stream_encoding = "utf-8"
-+
-+ base_var_dict = {
-+ "LANG": "",
-+ "LC_CTYPE": "",
-+ "LC_ALL": "",
-+ }
-+ for env_var in ("LANG", "LC_CTYPE"):
-+ for locale_to_set in AVAILABLE_TARGETS:
-+ # XXX (ncoghlan): LANG=UTF-8 doesn't appear to work as
-+ # expected, so skip that combination for now
-+ # See
https://bugs.python.org/issue30672 for discussion
-+ if env_var == "LANG" and locale_to_set == "UTF-8":
-+ continue
-+
-+ with self.subTest(env_var=env_var,
-+ configured_locale=locale_to_set):
-+ var_dict = base_var_dict.copy()
-+ var_dict[env_var] = locale_to_set
-+ self._check_child_encoding_details(var_dict,
-+ expected_fs_encoding,
-+ expected_stream_encoding,
-+ expected_warnings=None,
-+ coercion_expected=False)
-+
-+
-+
-+(a)test.support.cpython_only
-+(a)unittest.skipUnless(sysconfig.get_config_var("PY_COERCE_C_LOCALE"),
-+ "C locale coercion disabled at build time")
-+class LocaleCoercionTests(_LocaleHandlingTestCase):
-+ # Test implicit reconfiguration of the environment during CLI startup
-+
-+ def _check_c_locale_coercion(self,
-+ fs_encoding, stream_encoding,
-+ coerce_c_locale,
-+ expected_warnings=None,
-+ coercion_expected=True,
-+ **extra_vars):
-+ """Check the C locale handling for various configurations
-+
-+ Parameters:
-+ fs_encoding: expected sys.getfilesystemencoding() result
-+ stream_encoding: expected encoding for standard streams
-+ coerce_c_locale: setting to use for PYTHONCOERCECLOCALE
-+ None: don't set the variable at all
-+ str: the value set in the child's environment
-+ expected_warnings: expected warning lines on stderr
-+ extra_vars: additional environment variables to set in subprocess
-+ """
-+ self.maxDiff = None
-+
-+ if not AVAILABLE_TARGETS:
-+ # Locale coercion is disabled when there aren't any target locales
-+ fs_encoding = C_LOCALE_FS_ENCODING
-+ stream_encoding = C_LOCALE_STREAM_ENCODING
-+ coercion_expected = False
-+ if expected_warnings:
-+ expected_warnings = [LEGACY_LOCALE_WARNING]
-+
-+ base_var_dict = {
-+ "LANG": "",
-+ "LC_CTYPE": "",
-+ "LC_ALL": "",
-+ }
-+ base_var_dict.update(extra_vars)
-+ for env_var in ("LANG", "LC_CTYPE"):
-+ for locale_to_set in ("", "C", "POSIX",
"invalid.ascii"):
-+ # XXX (ncoghlan): *BSD platforms don't behave as expected in the
-+ # POSIX locale, so we skip that for now
-+ # See
https://bugs.python.org/issue30672 for discussion
-+ if locale_to_set == "POSIX":
-+ continue
-+ with self.subTest(env_var=env_var,
-+ nominal_locale=locale_to_set,
-+ PYTHONCOERCECLOCALE=coerce_c_locale):
-+ var_dict = base_var_dict.copy()
-+ var_dict[env_var] = locale_to_set
-+ if coerce_c_locale is not None:
-+ var_dict["PYTHONCOERCECLOCALE"] = coerce_c_locale
-+ # Check behaviour on successful coercion
-+ self._check_child_encoding_details(var_dict,
-+ fs_encoding,
-+ stream_encoding,
-+ expected_warnings,
-+ coercion_expected)
-+
-+ def test_test_PYTHONCOERCECLOCALE_not_set(self):
-+ # This should coerce to the first available target locale by default
-+ self._check_c_locale_coercion("utf-8", "utf-8",
coerce_c_locale=None)
-+
-+ def test_PYTHONCOERCECLOCALE_not_zero(self):
-+ # *Any* string other than "0" is considered "set" for our
purposes
-+ # and hence should result in the locale coercion being enabled
-+ for setting in ("", "1", "true",
"false"):
-+ self._check_c_locale_coercion("utf-8", "utf-8",
coerce_c_locale=setting)
-+
-+ def test_PYTHONCOERCECLOCALE_set_to_warn(self):
-+ # PYTHONCOERCECLOCALE=warn enables runtime warnings for legacy locales
-+ self._check_c_locale_coercion("utf-8", "utf-8",
-+ coerce_c_locale="warn",
-+ expected_warnings=[CLI_COERCION_WARNING])
-+
-+
-+ def test_PYTHONCOERCECLOCALE_set_to_zero(self):
-+ # The setting "0" should result in the locale coercion being disabled
-+ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
-+ C_LOCALE_STREAM_ENCODING,
-+ coerce_c_locale="0",
-+ coercion_expected=False)
-+ # Setting LC_ALL=C shouldn't make any difference to the behaviour
-+ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
-+ C_LOCALE_STREAM_ENCODING,
-+ coerce_c_locale="0",
-+ LC_ALL="C",
-+ coercion_expected=False)
-+
-+ def test_LC_ALL_set_to_C(self):
-+ # Setting LC_ALL should render the locale coercion ineffective
-+ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
-+ C_LOCALE_STREAM_ENCODING,
-+ coerce_c_locale=None,
-+ LC_ALL="C",
-+ coercion_expected=False)
-+ # And result in a warning about a lack of locale compatibility
-+ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
-+ C_LOCALE_STREAM_ENCODING,
-+ coerce_c_locale="warn",
-+ LC_ALL="C",
-+ expected_warnings=[LEGACY_LOCALE_WARNING],
-+ coercion_expected=False)
-+
-+def test_main():
-+ test.support.run_unittest(
-+ LocaleConfigurationTests,
-+ LocaleCoercionTests
-+ )
-+ test.support.reap_children()
-+
-+if __name__ == "__main__":
-+ test_main()
-diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
-index 6c3625d..009f542 100644
---- a/Lib/test/test_capi.py
-+++ b/Lib/test/test_capi.py
-@@ -369,14 +369,21 @@ class EmbeddingTests(unittest.TestCase):
- def tearDown(self):
- os.chdir(self.oldcwd)
-
-- def run_embedded_interpreter(self, *args):
-+ def run_embedded_interpreter(self, *args, env=None):
- """Runs a test in the embedded interpreter"""
- cmd = [self.test_exe]
- cmd.extend(args)
-+ if env is not None and sys.platform == 'win32':
-+ # Windows requires at least the SYSTEMROOT environment variable to
-+ # start Python.
-+ env = env.copy()
-+ env['SYSTEMROOT'] = os.environ['SYSTEMROOT']
-+
- p = subprocess.Popen(cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
-- universal_newlines=True)
-+ universal_newlines=True,
-+ env=env)
- (out, err) = p.communicate()
- self.assertEqual(p.returncode, 0,
- "bad returncode %d, stderr is %r" %
-@@ -386,31 +393,21 @@ class EmbeddingTests(unittest.TestCase):
- def test_subinterps(self):
- # This is just a "don't crash" test
- out, err = self.run_embedded_interpreter()
-- if support.verbose:
-+ if support.verbose > 1:
- print()
- print(out)
- print(err)
-
-- @staticmethod
-- def _get_default_pipe_encoding():
-- rp, wp = os.pipe()
-- try:
-- with os.fdopen(wp, 'w') as w:
-- default_pipe_encoding = w.encoding
-- finally:
-- os.close(rp)
-- return default_pipe_encoding
--
- def test_forced_io_encoding(self):
- # Checks forced configuration of embedded interpreter IO streams
-- out, err = self.run_embedded_interpreter("forced_io_encoding")
-- if support.verbose:
-+ env = dict(os.environ, PYTHONIOENCODING="utf-8:surrogateescape")
-+ out, err = self.run_embedded_interpreter("forced_io_encoding",
env=env)
-+ if support.verbose > 1:
- print()
- print(out)
- print(err)
-- expected_errors = sys.__stdout__.errors
-- expected_stdin_encoding = sys.__stdin__.encoding
-- expected_pipe_encoding = self._get_default_pipe_encoding()
-+ expected_stream_encoding = "utf-8"
-+ expected_errors = "surrogateescape"
- expected_output = '\n'.join([
- "--- Use defaults ---",
- "Expected encoding: default",
-@@ -437,8 +434,8 @@ class EmbeddingTests(unittest.TestCase):
- "stdout: latin-1:replace",
- "stderr: latin-1:backslashreplace"])
- expected_output = expected_output.format(
-- in_encoding=expected_stdin_encoding,
-- out_encoding=expected_pipe_encoding,
-+ in_encoding=expected_stream_encoding,
-+ out_encoding=expected_stream_encoding,
- errors=expected_errors)
- # This is useful if we ever trip over odd platform behaviour
- self.maxDiff = None
-diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
-index ae2bcd4..0a302ff 100644
---- a/Lib/test/test_cmd_line.py
-+++ b/Lib/test/test_cmd_line.py
-@@ -9,8 +9,9 @@ import sys
- import subprocess
- import tempfile
- from test.support import script_helper, is_android
--from test.support.script_helper import (spawn_python, kill_python, assert_python_ok,
-- assert_python_failure)
-+from test.support.script_helper import (
-+ spawn_python, kill_python, assert_python_ok, assert_python_failure
-+)
-
-
- # XXX (ncoghlan): Move to script_helper and make consistent with run_python
-@@ -151,6 +152,7 @@ class CmdLineTest(unittest.TestCase):
- env = os.environ.copy()
- # Use C locale to get ascii for the locale encoding
- env['LC_ALL'] = 'C'
-+ env['PYTHONCOERCECLOCALE'] = '0'
- code = (
- b'import locale; '
- b'print(ascii("' + undecodable + b'"), '
-diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
-index df9ebd4..63145e4 100644
---- a/Lib/test/test_sys.py
-+++ b/Lib/test/test_sys.py
-@@ -680,6 +680,7 @@ class SysModuleTest(unittest.TestCase):
- # Force the POSIX locale
- env = os.environ.copy()
- env["LC_ALL"] = "C"
-+ env["PYTHONCOERCECLOCALE"] = "0"
- code = '\n'.join((
- 'import sys',
- 'def dump(name):',
-diff --git a/Modules/main.c b/Modules/main.c
-index dd50211..f20cf24 100644
---- a/Modules/main.c
-+++ b/Modules/main.c
-@@ -105,7 +105,11 @@ static const char usage_6[] =
- " predictable seed.\n"
- "PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
- " on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
--" hooks.\n";
-+" hooks.\n"
-+
-+"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
-+" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
-+" locale coercion and locale compatibility warnings on stderr.\n";
-
- static int
- usage(int exitcode, const wchar_t* program)
-diff --git a/Programs/_testembed.c b/Programs/_testembed.c
-index 3968399..1bd2bbf 100644
---- a/Programs/_testembed.c
-+++ b/Programs/_testembed.c
-@@ -1,4 +1,5 @@
--#include <Python.h>
-+#include "Python.h"
-+#include "pyconfig.h"
- #include <stdio.h>
-
- /*********************************************************
-diff --git a/Programs/python.c b/Programs/python.c
-index a7afbc7..03f8295 100644
---- a/Programs/python.c
-+++ b/Programs/python.c
-@@ -15,6 +15,21 @@ wmain(int argc, wchar_t **argv)
- }
- #else
-
-+/* Access private pylifecycle helper API to better handle the legacy C locale
-+ *
-+ * The legacy C locale assumes ASCII as the default text encoding, which
-+ * causes problems not only for the CPython runtime, but also other
-+ * components like GNU readline.
-+ *
-+ * Accordingly, when the CLI detects it, it attempts to coerce it to a
-+ * more capable UTF-8 based alternative.
-+ *
-+ * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
-+ *
-+ */
-+extern int _Py_LegacyLocaleDetected(void);
-+extern void _Py_CoerceLegacyLocale(void);
-+
- int
- main(int argc, char **argv)
- {
-@@ -25,7 +40,11 @@ main(int argc, char **argv)
- char *oldloc;
-
- /* Force malloc() allocator to bootstrap Python */
-+#ifdef Py_DEBUG
-+ (void)_PyMem_SetupAllocators("malloc_debug");
-+# else
- (void)_PyMem_SetupAllocators("malloc");
-+# endif
-
- argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
- argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
-@@ -49,7 +68,21 @@ main(int argc, char **argv)
- return 1;
- }
-
-+#ifdef __ANDROID__
-+ /* Passing "" to setlocale() on Android requests the C locale rather
-+ * than checking environment variables, so request C.UTF-8 explicitly
-+ */
-+ setlocale(LC_ALL, "C.UTF-8");
-+#else
-+ /* Reconfigure the locale to the default for this process */
- setlocale(LC_ALL, "");
-+#endif
-+
-+ if (_Py_LegacyLocaleDetected()) {
-+ _Py_CoerceLegacyLocale();
-+ }
-+
-+ /* Convert from char to wchar_t based on the locale settings */
- for (i = 0; i < argc; i++) {
- argv_copy[i] = Py_DecodeLocale(argv[i], NULL);
- if (!argv_copy[i]) {
-@@ -70,7 +103,11 @@ main(int argc, char **argv)
-
- /* Force again malloc() allocator to release memory blocks allocated
- before Py_Main() */
-+#ifdef Py_DEBUG
-+ (void)_PyMem_SetupAllocators("malloc_debug");
-+# else
- (void)_PyMem_SetupAllocators("malloc");
-+# endif
-
- for (i = 0; i < argc; i++) {
- PyMem_RawFree(argv_copy2[i]);
-diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index a4f7f82..3843297 100644
---- a/Python/pylifecycle.c
-+++ b/Python/pylifecycle.c
-@@ -167,6 +167,7 @@ Py_SetStandardStreamEncoding(const char *encoding, const char
*errors)
- return 0;
- }
-
-+
- /* Global initializations. Can be undone by Py_FinalizeEx(). Don't
- call this twice without an intervening Py_FinalizeEx() call. When
- initializations fail, a fatal error is issued and the function does
-@@ -301,6 +302,183 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
- }
-
-
-+/* Helper functions to better handle the legacy C locale
-+ *
-+ * The legacy C locale assumes ASCII as the default text encoding, which
-+ * causes problems not only for the CPython runtime, but also other
-+ * components like GNU readline.
-+ *
-+ * Accordingly, when the CLI detects it, it attempts to coerce it to a
-+ * more capable UTF-8 based alternative as follows:
-+ *
-+ * if (_Py_LegacyLocaleDetected()) {
-+ * _Py_CoerceLegacyLocale();
-+ * }
-+ *
-+ * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
-+ *
-+ * Locale coercion also impacts the default error handler for the standard
-+ * streams: while the usual default is "strict", the default for the legacy
-+ * C locale and for any of the coercion target locales is "surrogateescape".
-+ */
-+
-+int
-+_Py_LegacyLocaleDetected(void)
-+{
-+#ifndef MS_WINDOWS
-+ /* On non-Windows systems, the C locale is considered a legacy locale */
-+ /* XXX (ncoghlan): some platforms (notably Mac OS X) don't appear to treat
-+ * the POSIX locale as a simple alias for the C locale, so
-+ * we may also want to check for that explicitly.
-+ */
-+ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
-+ return ctype_loc != NULL && strcmp(ctype_loc, "C") == 0;
-+#else
-+ /* Windows uses code pages instead of locales, so no locale is legacy */
-+ return 0;
-+#endif
-+}
-+
-+
-+static const char *_C_LOCALE_WARNING =
-+ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
-+ "encoding), which may cause Unicode compatibility problems. Using C.UTF-8,
"
-+ "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
-+ "locales is recommended.\n";
-+
-+static int
-+_legacy_locale_warnings_enabled(void)
-+{
-+ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
-+ return (coerce_c_locale != NULL &&
-+ strncmp(coerce_c_locale, "warn", 5) == 0);
-+}
-+
-+static void
-+_emit_stderr_warning_for_legacy_locale(void)
-+{
-+ if (_legacy_locale_warnings_enabled()) {
-+ if (_Py_LegacyLocaleDetected()) {
-+ fprintf(stderr, "%s", _C_LOCALE_WARNING);
-+ }
-+ }
-+}
-+
-+typedef struct _CandidateLocale {
-+ const char *locale_name; /* The locale to try as a coercion target */
-+} _LocaleCoercionTarget;
-+
-+static _LocaleCoercionTarget _TARGET_LOCALES[] = {
-+ {"C.UTF-8"},
-+ {"C.utf8"},
-+ {"UTF-8"},
-+ {NULL}
-+};
-+
-+static char *
-+get_default_standard_stream_error_handler(void)
-+{
-+ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
-+ if (ctype_loc != NULL) {
-+ /* "surrogateescape" is the default in the legacy C locale */
-+ if (strcmp(ctype_loc, "C") == 0) {
-+ return "surrogateescape";
-+ }
-+
-+#ifdef PY_COERCE_C_LOCALE
-+ /* "surrogateescape" is the default in locale coercion target locales
*/
-+ const _LocaleCoercionTarget *target = NULL;
-+ for (target = _TARGET_LOCALES; target->locale_name; target++) {
-+ if (strcmp(ctype_loc, target->locale_name) == 0) {
-+ return "surrogateescape";
-+ }
-+ }
-+#endif
-+ }
-+
-+ /* Otherwise return NULL to request the typical default error handler */
-+ return NULL;
-+}
-+
-+#ifdef PY_COERCE_C_LOCALE
-+static const char *_C_LOCALE_COERCION_WARNING =
-+ "Python detected LC_CTYPE=C: LC_CTYPE coerced to %.20s (set another locale
"
-+ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n";
-+
-+static void
-+_coerce_default_locale_settings(const _LocaleCoercionTarget *target)
-+{
-+
-+ const char *newloc = target->locale_name;
-+
-+ /* Reset locale back to currently configured defaults */
-+ setlocale(LC_ALL, "");
-+
-+ /* Set the relevant locale environment variable */
-+ if (setenv("LC_CTYPE", newloc, 1)) {
-+ fprintf(stderr,
-+ "Error setting LC_CTYPE, skipping C locale coercion\n");
-+ return;
-+ }
-+ if (_legacy_locale_warnings_enabled()) {
-+ fprintf(stderr, _C_LOCALE_COERCION_WARNING, newloc);
-+ }
-+
-+ /* Reconfigure with the overridden environment variables */
-+ setlocale(LC_ALL, "");
-+}
-+#endif
-+
-+
-+void
-+_Py_CoerceLegacyLocale(void)
-+{
-+#ifdef PY_COERCE_C_LOCALE
-+ /* We ignore the Python -E and -I flags here, as the CLI needs to sort out
-+ * the locale settings *before* we try to do anything with the command
-+ * line arguments. For cross-platform debugging purposes, we also need
-+ * to give end users a way to force even scripts that are otherwise
-+ * isolated from their environment to use the legacy ASCII-centric C
-+ * locale.
-+ *
-+ * Ignoring -E and -I is safe from a security perspective, as we only use
-+ * the setting to turn *off* the implicit locale coercion, and anyone with
-+ * access to the process environment already has the ability to set
-+ * `LC_ALL=C` to override the C level locale settings anyway.
-+ */
-+ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
-+ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
-+ /* PYTHONCOERCECLOCALE is not set, or is set to something other than
"0" */
-+ const char *locale_override = getenv("LC_ALL");
-+ if (locale_override == NULL || *locale_override == '\0') {
-+ /* LC_ALL is also not set (or is set to an empty string) */
-+ const _LocaleCoercionTarget *target = NULL;
-+ for (target = _TARGET_LOCALES; target->locale_name; target++) {
-+ const char *new_locale = setlocale(LC_CTYPE,
-+ target->locale_name);
-+ if (new_locale != NULL) {
-+#if !defined(__APPLE__) && defined(HAVE_LANGINFO_H) && defined(CODESET)
-+ /* Also ensure that nl_langinfo works in this locale */
-+ char *codeset = nl_langinfo(CODESET);
-+ if (!codeset || *codeset == '\0') {
-+ /* CODESET is not set or empty, so skip coercion */
-+ new_locale = NULL;
-+ setlocale(LC_CTYPE, "");
-+ continue;
-+ }
-+#endif
-+ /* Successfully configured locale, so make it the default */
-+ _coerce_default_locale_settings(target);
-+ return;
-+ }
-+ }
-+ }
-+ }
-+ /* No C locale warning here, as Py_Initialize will emit one later */
-+#endif
-+}
-+
-+
- void
- _Py_InitializeEx_Private(int install_sigs, int install_importlib)
- {
-@@ -315,11 +493,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
- initialized = 1;
- _Py_Finalizing = NULL;
-
--#ifdef HAVE_SETLOCALE
-+#ifdef __ANDROID__
-+ /* Passing "" to setlocale() on Android requests the C locale rather
-+ * than checking environment variables, so request C.UTF-8 explicitly
-+ */
-+ setlocale(LC_CTYPE, "C.UTF-8");
-+#else
-+#ifndef MS_WINDOWS
- /* Set up the LC_CTYPE locale, so we can obtain
- the locale's charset without having to switch
- locales. */
- setlocale(LC_CTYPE, "");
-+ _emit_stderr_warning_for_legacy_locale();
-+#endif
- #endif
-
- if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
-@@ -1242,12 +1428,8 @@ initstdio(void)
- }
- }
- if (!errors && !(pythonioencoding && *pythonioencoding)) {
-- /* When the LC_CTYPE locale is the POSIX locale ("C locale"),
-- stdin and stdout use the surrogateescape error handler by
-- default, instead of the strict error handler. */
-- char *loc = setlocale(LC_CTYPE, NULL);
-- if (loc != NULL && strcmp(loc, "C") == 0)
-- errors = "surrogateescape";
-+ /* Choose the default error handler based on the current locale */
-+ errors = get_default_standard_stream_error_handler();
- }
- }
-
-diff --git a/configure b/configure
-index 2915246..39e5a27 100755
---- a/configure
-+++ b/configure
-@@ -834,6 +834,8 @@ with_thread
- enable_ipv6
- with_doc_strings
- with_pymalloc
-+with_c_locale_coercion
-+with_c_locale_warning
- with_valgrind
- with_dtrace
- with_fpectl
-@@ -1527,6 +1529,12 @@ Optional Packages:
- deprecated; use --with(out)-threads
- --with(out)-doc-strings disable/enable documentation strings
- --with(out)-pymalloc disable/enable specialized mallocs
-+ --with(out)-c-locale-coercion
-+ disable/enable C locale coercion to a UTF-8 based
-+ locale
-+ --with(out)-c-locale-warning
-+ disable/enable locale compatibility warning in the C
-+ locale
- --with-valgrind Enable Valgrind support
- --with(out)-dtrace disable/enable DTrace support
- --with-fpectl enable SIGFPE catching
-@@ -11010,6 +11018,52 @@ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pymalloc" >&5
- $as_echo "$with_pymalloc" >&6; }
-
-+# Check for --with-c-locale-coercion
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for
--with-c-locale-coercion" >&5
-+$as_echo_n "checking for --with-c-locale-coercion... " >&6; }
-+
-+# Check whether --with-c-locale-coercion was given.
-+if test "${with_c_locale_coercion+set}" = set; then :
-+ withval=$with_c_locale_coercion;
-+fi
-+
-+
-+if test -z "$with_c_locale_coercion"
-+then
-+ with_c_locale_coercion="yes"
-+fi
-+if test "$with_c_locale_coercion" != "no"
-+then
-+
-+$as_echo "#define PY_COERCE_C_LOCALE 1" >>confdefs.h
-+
-+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_c_locale_coercion"
>&5
-+$as_echo "$with_c_locale_coercion" >&6; }
-+
-+# Check for --with-c-locale-warning
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-c-locale-warning"
>&5
-+$as_echo_n "checking for --with-c-locale-warning... " >&6; }
-+
-+# Check whether --with-c-locale-warning was given.
-+if test "${with_c_locale_warning+set}" = set; then :
-+ withval=$with_c_locale_warning;
-+fi
-+
-+
-+if test -z "$with_c_locale_warning"
-+then
-+ with_c_locale_warning="yes"
-+fi
-+if test "$with_c_locale_warning" != "no"
-+then
-+
-+$as_echo "#define PY_WARN_ON_C_LOCALE 1" >>confdefs.h
-+
-+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_c_locale_warning"
>&5
-+$as_echo "$with_c_locale_warning" >&6; }
-+
- # Check for Valgrind support
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-valgrind"
>&5
- $as_echo_n "checking for --with-valgrind... " >&6; }
-diff --git a/configure.ac b/configure.ac
-index 67dfba3..b9c9f04 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -3279,6 +3279,40 @@ then
- fi
- AC_MSG_RESULT($with_pymalloc)
-
-+# Check for --with-c-locale-coercion
-+AC_MSG_CHECKING(for --with-c-locale-coercion)
-+AC_ARG_WITH(c-locale-coercion,
-+ AS_HELP_STRING([--with(out)-c-locale-coercion],
-+ [disable/enable C locale coercion to a UTF-8 based locale]))
-+
-+if test -z "$with_c_locale_coercion"
-+then
-+ with_c_locale_coercion="yes"
-+fi
-+if test "$with_c_locale_coercion" != "no"
-+then
-+ AC_DEFINE(PY_COERCE_C_LOCALE, 1,
-+ [Define if you want to coerce the C locale to a UTF-8 based locale])
-+fi
-+AC_MSG_RESULT($with_c_locale_coercion)
-+
-+# Check for --with-c-locale-warning
-+AC_MSG_CHECKING(for --with-c-locale-warning)
-+AC_ARG_WITH(c-locale-warning,
-+ AS_HELP_STRING([--with(out)-c-locale-warning],
-+ [disable/enable locale compatibility warning in the C locale]))
-+
-+if test -z "$with_c_locale_warning"
-+then
-+ with_c_locale_warning="yes"
-+fi
-+if test "$with_c_locale_warning" != "no"
-+then
-+ AC_DEFINE(PY_WARN_ON_C_LOCALE, 1,
-+ [Define to emit a locale compatibility warning in the C locale])
-+fi
-+AC_MSG_RESULT($with_c_locale_warning)
-+
- # Check for Valgrind support
- AC_MSG_CHECKING([for --with-valgrind])
- AC_ARG_WITH([valgrind],
-diff --git a/pyconfig.h.in b/pyconfig.h.in
-index b10c57f..0a6f3e2 100644
---- a/pyconfig.h.in
-+++ b/pyconfig.h.in
-@@ -1244,9 +1244,15 @@
- /* Define as the preferred size in bits of long digits */
- #undef PYLONG_BITS_IN_DIGIT
-
-+/* Define if you want to coerce the C locale to a UTF-8 based locale */
-+#undef PY_COERCE_C_LOCALE
-+
- /* Define to printf format modifier for Py_ssize_t */
- #undef PY_FORMAT_SIZE_T
-
-+/* Define to emit a locale compatibility warning in the C locale */
-+#undef PY_WARN_ON_C_LOCALE
-+
- /* Define if you want to build an interpreter with many run-time checks. */
- #undef Py_DEBUG
-
diff --git a/00277-fix-test-subprocess-hanging-tests.patch
b/00277-fix-test-subprocess-hanging-tests.patch
deleted file mode 100644
index c9b54e2..0000000
--- a/00277-fix-test-subprocess-hanging-tests.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 54849962eacc38f4e6c6f8a72ae258b3e7c2ecd5 Mon Sep 17 00:00:00 2001
-From: Victor Stinner <victor.stinner(a)gmail.com>
-Date: Thu, 5 Oct 2017 15:05:30 +0200
-Subject: [PATCH] bpo-31178: Mock os.waitpid() in test_subprocess
-
-Fix test_exception_errpipe_bad_data() and
-test_exception_errpipe_normal() of test_subprocess: mock os.waitpid()
-to avoid calling the real os.waitpid(0, 0) which is an unexpected
-side effect of the test.
----
- Lib/test/test_subprocess.py | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
-diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
-index 00dc37bc2c7..3ba5c028517 100644
---- a/Lib/test/test_subprocess.py
-+++ b/Lib/test/test_subprocess.py
-@@ -1559,8 +1559,10 @@ def proper_error(*args):
-
- fork_exec.side_effect = proper_error
-
-- with self.assertRaises(IsADirectoryError):
-- self.PopenNoDestructor(["non_existent_command"])
-+ with mock.patch("subprocess.os.waitpid",
-+ side_effect=ChildProcessError):
-+ with self.assertRaises(IsADirectoryError):
-+ self.PopenNoDestructor(["non_existent_command"])
-
- @mock.patch("subprocess._posixsubprocess.fork_exec")
- def test_exception_errpipe_bad_data(self, fork_exec):
-@@ -1577,8 +1579,10 @@ def bad_error(*args):
-
- fork_exec.side_effect = bad_error
-
-- with self.assertRaises(subprocess.SubprocessError) as e:
-- self.PopenNoDestructor(["non_existent_command"])
-+ with mock.patch("subprocess.os.waitpid",
-+ side_effect=ChildProcessError):
-+ with self.assertRaises(subprocess.SubprocessError) as e:
-+ self.PopenNoDestructor(["non_existent_command"])
-
- self.assertIn(repr(error_data), str(e.exception))
-
diff --git a/00279-fix-memory-corruption-due-to-allocator-mix.patch
b/00279-fix-memory-corruption-due-to-allocator-mix.patch
deleted file mode 100644
index 4937391..0000000
--- a/00279-fix-memory-corruption-due-to-allocator-mix.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Modules/getpath.c b/Modules/getpath.c
-index c4055be..1258fcd 100644
---- a/Modules/getpath.c
-+++ b/Modules/getpath.c
-@@ -735,7 +735,7 @@ calculate_path(void)
- bufsz += wcslen(zip_path) + 1;
- bufsz += wcslen(exec_prefix) + 1;
-
-- buf = PyMem_New(wchar_t, bufsz);
-+ buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t));
- if (buf == NULL) {
- Py_FatalError(
- "Not enough memory for dynamic PYTHONPATH");
diff --git a/macros.pybytecompile3.6 b/macros.pybytecompile3.6
deleted file mode 100644
index 3968c6e..0000000
--- a/macros.pybytecompile3.6
+++ /dev/null
@@ -1,10 +0,0 @@
-# Note that the path could itself be a python file, or a directory
-
-# Python's compile_all module only works on directories, and requires a max
-# recursion depth
-
-%py_byte_compile()\
-python_binary="%1"\
-bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
-%{nil}
diff --git a/macros.pybytecompile3.7 b/macros.pybytecompile3.7
new file mode 100644
index 0000000..3968c6e
--- /dev/null
+++ b/macros.pybytecompile3.7
@@ -0,0 +1,10 @@
+# Note that the path could itself be a python file, or a directory
+
+# Python's compile_all module only works on directories, and requires a max
+# recursion depth
+
+%py_byte_compile()\
+python_binary="%1"\
+bytecode_compilation_path="%2"\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
+%{nil}
diff --git a/python3.spec b/python3.spec
index 9b8f122..e540456 100644
--- a/python3.spec
+++ b/python3.spec
@@ -6,15 +6,18 @@ Name: python3
Summary: Interpreter of the Python programming language
URL:
https://www.python.org/
-%global pybasever 3.6
+%global pybasever 3.7
# pybasever without the dot:
-%global pyshortver 36
+%global pyshortver 37
+
+# Second alpha
+%global prerel a2
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.3
-Release: 4%{?dist}
+Version: %{pybasever}.0
+Release: 0.1.%{?prerel}%{?dist}
License: Python
@@ -183,6 +186,7 @@ BuildRequires: gmp-devel
BuildRequires: libappstream-glib
BuildRequires: libffi-devel
BuildRequires: libGL-devel
+BuildRequires: libuuid-devel
BuildRequires: libX11-devel
BuildRequires: ncurses-devel
@@ -225,7 +229,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
@@ -354,13 +358,6 @@ Patch205: 00205-make-libpl-respect-lib64.patch
# Fedora Change:
https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
Patch251: 00251-change-user-install-location.patch
-# 00262 #
-# Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
-#
https://www.python.org/dev/peps/pep-0538/
-# Fedora Change:
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
-# Original proposal:
https://bugzilla.redhat.com/show_bug.cgi?id=1404918
-Patch262: 00262-pep538_coerce_legacy_c_locale.patch
-
# 00264 #
# test_pass_by_value was added in Python 3.6.1 and on aarch64
# it is catching an error that was there, but wasn't tested before.
@@ -377,18 +374,6 @@ Patch273: 00273-skip-float-test.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
-# 00277 #
-# Fix test_exception_errpipe_bad_data() and
-# test_exception_errpipe_normal() of test_subprocess: mock os.waitpid()
-# to avoid calling the real os.waitpid(0, 0) which is an unexpected
-# side effect of the test, which makes the koji builds hang.
-# Fixed upstream:
https://github.com/python/cpython/commit/11045c9d8a21dd9bd182a3939189db02...
-Patch277: 00277-fix-test-subprocess-hanging-tests.patch
-
-# 00279 #
-# Fix memory corruption due to allocator mix
-# Fixed upstream:
https://bugs.python.org/issue31532
-Patch279: 00279-fix-memory-corruption-due-to-allocator-mix.patch
# (New patches go here ^^^)
#
@@ -619,7 +604,6 @@ cp -a %{SOURCE7} .
# Remove bundled libraries to ensure that we're using the system copy.
rm -r Modules/expat
-rm -r Modules/zlib
%if %{with rewheel}
%global pip_version 9.0.1
@@ -652,7 +636,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch205 -p1
%patch251 -p1
-%patch262 -p1
%ifarch aarch64
%patch264 -p1
@@ -660,8 +643,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch273 -p1
%patch274 -p1
-%patch277 -p1
-%patch279 -p1
# Remove files that should be generated by the build
@@ -1266,6 +1247,7 @@ fi
#%{dynload_dir}/time.%{SOABI_optimized}.so
%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
+%{dynload_dir}/_uuid.%{SOABI_optimized}.so
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
%{dynload_dir}/zlib.%{SOABI_optimized}.so
@@ -1416,6 +1398,7 @@ fi
%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
%{pylibdir}/lib2to3/tests
%{pylibdir}/tkinter/test
%{pylibdir}/unittest/test
@@ -1502,6 +1485,8 @@ fi
#%{dynload_dir}/time.%{SOABI_debug}.so
%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
%{dynload_dir}/unicodedata.%{SOABI_debug}.so
+%{dynload_dir}/_uuid.%{SOABI_debug}.so
+%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
%{dynload_dir}/zlib.%{SOABI_debug}.so
# No need to split things out the "Makefile" and the config-32/64.h file as we
@@ -1560,6 +1545,10 @@ fi
# ======================================================
%changelog
+* Tue Nov 28 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.7.0-0.1.a2
+- Update to 3.7.0 alpha 2
+- Removed merged patches 262, 277, 279
+
* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
- Raise the release of platform-python obsoletes for better maintainability
commit 1f528dac57b2a9a9a1635fdb76c9c86473f1a936
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Nov 21 11:04:48 2017 +0100
Raise the release of platform-python obsoletes for better maintainability
diff --git a/python3.spec b/python3.spec
index 78c250f..9b8f122 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.3
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
@@ -429,7 +429,10 @@ Provides: python%{pyshortver} = %{version}-%{release}
Obsoletes: python%{pyshortver}
# Shall be removed in Fedora 31
-%global platpyver 3.6.2-13
+# The release is bumped to 20, so we can do f27 platform-python updates
+# If the release in f27 ever goes >= 20, raise it here
+# If platform-python is ever reintroduced, make it higher version than this:
+%global platpyver 3.6.2-20
Obsoletes: platform-python < %{platpyver}
%if %{with rewheel}
@@ -1557,6 +1560,9 @@ fi
# ======================================================
%changelog
+* Tue Nov 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-4
+- Raise the release of platform-python obsoletes for better maintainability
+
* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
- Obsolete platform-python and it's subpackages
commit e522c84bc535b0c34ede8361d245205842f80dca
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Nov 15 16:05:21 2017 +0100
Obsolete platform-python and it's subpackages
diff --git a/python3.spec b/python3.spec
index 55aeac4..78c250f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.3
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
@@ -428,6 +428,10 @@ Provides: python%{pyshortver} = %{version}-%{release}
# replace python36-3.6.2.
Obsoletes: python%{pyshortver}
+# Shall be removed in Fedora 31
+%global platpyver 3.6.2-13
+Obsoletes: platform-python < %{platpyver}
+
%if %{with rewheel}
Requires: python3-setuptools
Requires: python3-pip
@@ -471,6 +475,10 @@ Provides: system-python-libs = %{version}-%{release}
Provides: system-python-libs%{?_isa} = %{version}-%{release}
Obsoletes: system-python-libs < %{version}-%{release}
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-libs < %{platpyver}
+Obsoletes: platform-python-libs-devel < %{platpyver}
+
%description libs
This package contains runtime libraries for use by Python:
- the majority of the Python standard library
@@ -495,6 +503,9 @@ Requires: redhat-rpm-config
Conflicts: %{name} < %{version}-%{release}
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-devel < %{platpyver}
+
%description devel
This package contains the header files and configuration needed to compile
Python extension modules (typically written in C or C++), to embed Python
@@ -519,6 +530,9 @@ Provides: idle3 = %{version}-%{release}
Conflicts: python2-tools < 2.7.13-17
Conflicts: python-tools < 2.7.13-17
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-tools < %{platpyver}
+
%description tools
This package contains several tools included with Python, including:
- 2to3, an automatic source converter from Python 2.X
@@ -529,6 +543,9 @@ This package contains several tools included with Python, including:
Summary: A GUI toolkit for Python
Requires: %{name} = %{version}-%{release}
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-tkinter < %{platpyver}
+
%description tkinter
The Tkinter (Tk interface) library is a graphical user interface toolkit for
the Python programming language.
@@ -539,6 +556,8 @@ Summary: The self-test suite for the main python3 package
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tools = %{version}-%{release}
+# Shall be removed in Fedora 31
+Obsoletes: platform-python-test < %{platpyver}
%description test
The self-test suite for the Python interpreter.
@@ -1538,6 +1557,9 @@ fi
# ======================================================
%changelog
+* Wed Nov 15 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.3-3
+- Obsolete platform-python and it's subpackages
+
* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
- Fix memory corruption due to allocator mix
Resolves: rhbz#1498207
commit a8c86d3aed83a5aadd8af7e7f45a93678a288a75
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Oct 9 13:21:53 2017 +0200
Apply the patch 279 correctly.
diff --git a/python3.spec b/python3.spec
index 53def0a..55aeac4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -639,6 +639,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch273 -p1
%patch274 -p1
%patch277 -p1
+%patch279 -p1
# Remove files that should be generated by the build
commit 22b8f2b10b5b7e2631c6ed98e2d63adbb6405d12
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Oct 9 13:10:17 2017 +0200
Fix memory corruption due to allocator mix (rhbz#1498207)
diff --git a/00279-fix-memory-corruption-due-to-allocator-mix.patch
b/00279-fix-memory-corruption-due-to-allocator-mix.patch
new file mode 100644
index 0000000..4937391
--- /dev/null
+++ b/00279-fix-memory-corruption-due-to-allocator-mix.patch
@@ -0,0 +1,13 @@
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index c4055be..1258fcd 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -735,7 +735,7 @@ calculate_path(void)
+ bufsz += wcslen(zip_path) + 1;
+ bufsz += wcslen(exec_prefix) + 1;
+
+- buf = PyMem_New(wchar_t, bufsz);
++ buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t));
+ if (buf == NULL) {
+ Py_FatalError(
+ "Not enough memory for dynamic PYTHONPATH");
diff --git a/python3.spec b/python3.spec
index 492fbad..53def0a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.3
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
@@ -385,6 +385,11 @@ Patch274: 00274-fix-arch-names.patch
# Fixed upstream:
https://github.com/python/cpython/commit/11045c9d8a21dd9bd182a3939189db02...
Patch277: 00277-fix-test-subprocess-hanging-tests.patch
+# 00279 #
+# Fix memory corruption due to allocator mix
+# Fixed upstream:
https://bugs.python.org/issue31532
+Patch279: 00279-fix-memory-corruption-due-to-allocator-mix.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -1532,6 +1537,10 @@ fi
# ======================================================
%changelog
+* Mon Oct 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-2
+- Fix memory corruption due to allocator mix
+Resolves: rhbz#1498207
+
* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
- Update to Python 3.6.3
commit 47069ff4171cd7fafa42544033bef8589ad04304
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Oct 6 13:30:25 2017 +0200
Update to Python 3.6.3
Patches 270, 271, 272 were removed as they have been upstreamed.
Patch 277 was added to fix two hanging tests from test_subprocess.
Added gdb at the build dependencies, since gdb is not anymore in the
buildroot, and that made test_gdb to be skipped.
diff --git a/00277-fix-test-subprocess-hanging-tests.patch
b/00277-fix-test-subprocess-hanging-tests.patch
new file mode 100644
index 0000000..c9b54e2
--- /dev/null
+++ b/00277-fix-test-subprocess-hanging-tests.patch
@@ -0,0 +1,43 @@
+From 54849962eacc38f4e6c6f8a72ae258b3e7c2ecd5 Mon Sep 17 00:00:00 2001
+From: Victor Stinner <victor.stinner(a)gmail.com>
+Date: Thu, 5 Oct 2017 15:05:30 +0200
+Subject: [PATCH] bpo-31178: Mock os.waitpid() in test_subprocess
+
+Fix test_exception_errpipe_bad_data() and
+test_exception_errpipe_normal() of test_subprocess: mock os.waitpid()
+to avoid calling the real os.waitpid(0, 0) which is an unexpected
+side effect of the test.
+---
+ Lib/test/test_subprocess.py | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
+index 00dc37bc2c7..3ba5c028517 100644
+--- a/Lib/test/test_subprocess.py
++++ b/Lib/test/test_subprocess.py
+@@ -1559,8 +1559,10 @@ def proper_error(*args):
+
+ fork_exec.side_effect = proper_error
+
+- with self.assertRaises(IsADirectoryError):
+- self.PopenNoDestructor(["non_existent_command"])
++ with mock.patch("subprocess.os.waitpid",
++ side_effect=ChildProcessError):
++ with self.assertRaises(IsADirectoryError):
++ self.PopenNoDestructor(["non_existent_command"])
+
+ @mock.patch("subprocess._posixsubprocess.fork_exec")
+ def test_exception_errpipe_bad_data(self, fork_exec):
+@@ -1577,8 +1579,10 @@ def bad_error(*args):
+
+ fork_exec.side_effect = bad_error
+
+- with self.assertRaises(subprocess.SubprocessError) as e:
+- self.PopenNoDestructor(["non_existent_command"])
++ with mock.patch("subprocess.os.waitpid",
++ side_effect=ChildProcessError):
++ with self.assertRaises(subprocess.SubprocessError) as e:
++ self.PopenNoDestructor(["non_existent_command"])
+
+ self.assertIn(repr(error_data), str(e.exception))
+
diff --git a/python3.spec b/python3.spec
index 4c19b74..492fbad 100644
--- a/python3.spec
+++ b/python3.spec
@@ -13,8 +13,8 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
-Version: %{pybasever}.2
-Release: 19%{?dist}
+Version: %{pybasever}.3
+Release: 1%{?dist}
License: Python
@@ -190,6 +190,7 @@ BuildRequires: openssl-devel
BuildRequires: pkgconfig
BuildRequires: readline-devel
BuildRequires: sqlite-devel
+BuildRequires: gdb
%if %{with systemtap}
BuildRequires: systemtap-devel
@@ -367,25 +368,6 @@ Patch262: 00262-pep538_coerce_legacy_c_locale.patch
# Reported upstream:
http://bugs.python.org/issue29804
Patch264: 00264-skip-test-failing-on-aarch64.patch
-# 00270 #
-# Fix test_alpn_protocols from test_ssl as openssl > 1.1.0f
-# changed the behaviour of the ALPN hook.
-# Fixed upstream:
http://bugs.python.org/issue30714
-Patch270: 00270-fix-ssl-alpn-hook-test.patch
-
-# 00271 #
-# Make test_asyncio to not depend on the current signal handler
-# as this can make it hang on koji, since it ignores SIGHUP.
-# Reported upstream:
http://bugs.python.org/issue31034
-Patch271: 00271-asyncio-get-default-signal-handler.patch
-
-# 00272 #
-# Reject newline characters in ftplib.FTP.putline() arguments to
-# avoid FTP protocol stream injection via malicious URLs.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1478916
-# Fixed upstream:
http://bugs.python.org/issue30119
-Patch272: 00272-fix-ftplib-to-reject-newlines.patch
-
# 00273 #
# Skip test_float_with_comma, which fails in Koji with UnicodeDecodeError
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
@@ -395,6 +377,14 @@ Patch273: 00273-skip-float-test.patch
# Upstream uses Debian-style architecture naming. Change to match Fedora.
Patch274: 00274-fix-arch-names.patch
+# 00277 #
+# Fix test_exception_errpipe_bad_data() and
+# test_exception_errpipe_normal() of test_subprocess: mock os.waitpid()
+# to avoid calling the real os.waitpid(0, 0) which is an unexpected
+# side effect of the test, which makes the koji builds hang.
+# Fixed upstream:
https://github.com/python/cpython/commit/11045c9d8a21dd9bd182a3939189db02...
+Patch277: 00277-fix-test-subprocess-hanging-tests.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -641,11 +631,9 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch264 -p1
%endif
-%patch270 -p1
-%patch271 -p1
-%patch272 -p1
%patch273 -p1
%patch274 -p1
+%patch277 -p1
# Remove files that should be generated by the build
@@ -1544,6 +1532,9 @@ fi
# ======================================================
%changelog
+* Fri Oct 06 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.3-1
+- Update to Python 3.6.3
+
* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
- Make the -devel package require redhat-rpm-config
diff --git a/sources b/sources
index af1a1e7..002f1fb 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.2.tar.xz) =
a8270a09a9e9b39f69ece6cdade2fa964665d2107b5acbad4453f1b921107b329c697c137185928fb4a576fc0f2ae2a98dbf26a8b7ea17219e990ddbc216db8b
+SHA512 (Python-3.6.3.tar.xz) =
32f24a3adcb7880003c7ecdc5e53e838e774adda76b308961d8215e28db630b2fa2828097817924c76afa4212b2df3362eb64d4e10f37c0147f512ec5aa8662b
commit 71718b673e72b2c88c67b8072a69fbd36af988a8
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Sep 29 12:30:12 2017 +0200
Make the -devel package require redhat-rpm-config
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
Later should be changed to a specific subpackage.
diff --git a/python3.spec b/python3.spec
index f1ede0c..4c19b74 100644
--- a/python3.spec
+++ b/python3.spec
@@ -491,6 +491,13 @@ BuildRequires: python-rpm-macros
Requires: python-rpm-macros
Requires: python3-rpm-macros
Requires: python3-rpm-generators
+
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1217376
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1496757
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1218294
+# TODO change to a specific subpackage once available (#1218294)
+Requires: redhat-rpm-config
+
Conflicts: %{name} < %{version}-%{release}
%description devel
@@ -1537,8 +1544,10 @@ fi
# ======================================================
%changelog
-* Tue Sep 19 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
+* Fri Sep 29 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
+- Make the -devel package require redhat-rpm-config
+Resolves: rhbz#1496757
* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
- Fix /usr/bin/env dependency from python3-tools
commit 0652b06063b98a5192d6538a989f9244dbee11df
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Sep 19 12:03:41 2017 +0200
Move pathfix.py to bindir
See
https://github.com/fedora-python/python-rpm-porting/issues/24
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
index aab0cc1..76a3421 100644
--- a/check-pyc-and-pyo-timestamps.py
+++ b/check-pyc-and-pyo-timestamps.py
@@ -6,6 +6,7 @@ import sys
# list of test and other files that we expect not to have bytecode
not_compiled = [
+ '/usr/bin/pathfix.py',
'test/bad_coding.py',
'test/bad_coding2.py',
'test/badsyntax_3131.py',
diff --git a/python3.spec b/python3.spec
index f173971..f1ede0c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 18%{?dist}
+Release: 19%{?dist}
License: Python
@@ -925,6 +925,11 @@ LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
rm %{buildroot}%{pylibdir}/Tools/scripts/{2to3,idle3,pydoc3,pyvenv}
+# Move pathfix.py to bindir
+# See
https://github.com/fedora-python/python-rpm-porting/issues/24
+mv %{buildroot}%{pylibdir}/Tools/scripts/pathfix.py %{buildroot}%{_bindir}/
+
+
# Remove shebang lines from .py files that aren't executable, and
# remove executability from .py files that don't have a shebang line:
find %{buildroot} -name \*.py \
@@ -955,6 +960,9 @@ find %{buildroot} -type f -a -name "*.py" -print0 | \
PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
+# Since we have pathfix.py in bindir, this is created, but we don't want it
+rm -rf %{buildroot}%{_bindir}/__pycache__
+
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
find %{buildroot} -perm 555 -exec chmod 755 {} \;
@@ -1342,6 +1350,7 @@ fi
%{_bindir}/python%{pybasever}-config
%{_bindir}/python%{LDVERSION_optimized}-config
%{_bindir}/python%{LDVERSION_optimized}-*-config
+%{_bindir}/pathfix.py
%{_libdir}/libpython%{LDVERSION_optimized}.so
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
@@ -1528,6 +1537,9 @@ fi
# ======================================================
%changelog
+* Tue Sep 19 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-19
+- Move pathfix.py to bindir,
https://github.com/fedora-python/python-rpm-porting/issues/24
+
* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
- Fix /usr/bin/env dependency from python3-tools
Resolves: rhbz#1482118
commit 685fb7bc99d90a53a32c37eb29a961a702eb22a0
Author: Iryna Shcherbina <ishcherb(a)redhat.com>
Date: Thu Sep 14 10:26:07 2017 +0200
Fix /usr/bin/env dependency from python3-tools (rhbz#1482118)
diff --git a/python3.spec b/python3.spec
index 2a465f4..f173971 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 17%{?dist}
+Release: 18%{?dist}
License: Python
@@ -914,13 +914,15 @@ sed -i -e
"s/'pyconfig.h'/'%{_pyconfig_h}'/" \
%{buildroot}%{pylibdir}/sysconfig.py
# Switch all shebangs to refer to the specific Python version.
-# This currently only covers files with .py extension
+# This currently only covers files matching ^[a-zA-Z0-9_]+\.py$,
+# so handle files named using other naming scheme separately.
LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
Tools/scripts/pathfix.py \
-i "%{_bindir}/python%{pybasever}" \
- %{buildroot}
+ %{buildroot} %{buildroot}%{pylibdir}/Tools/scripts/*-*.py \
+ %{buildroot}%{pylibdir}/Tools/pynche/{pynche,pynche.pyw}
# not covered, also redundant and useless:
-rm %{buildroot}%{pylibdir}/Tools/scripts/2to3
+rm %{buildroot}%{pylibdir}/Tools/scripts/{2to3,idle3,pydoc3,pyvenv}
# Remove shebang lines from .py files that aren't executable, and
@@ -1526,6 +1528,10 @@ fi
# ======================================================
%changelog
+* Wed Sep 13 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-18
+- Fix /usr/bin/env dependency from python3-tools
+Resolves: rhbz#1482118
+
* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
- Include `-g` in the flags sent to the linker (LDFLAGS)
Resolves: rhbz#1483222
commit 87e35ed7a51d53aa56d224e3b61ae82b16f47dc5
Author: Iryna Shcherbina <ishcherb(a)redhat.com>
Date: Wed Sep 6 14:29:47 2017 +0200
Include -g in LDFLAGS sent to the linker (rhbz#1483222)
Include -g flag for both compilation and linking so that the debugging
information is correctly generated.
diff --git a/python3.spec b/python3.spec
index db8c83a..2a465f4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 16%{?dist}
+Release: 17%{?dist}
License: Python
@@ -680,7 +680,7 @@ export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
export LINKCC="gcc"
export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
-export LDFLAGS="$RPM_LD_FLAGS $(pkg-config --libs-only-L openssl)"
+export LDFLAGS="$RPM_LD_FLAGS -g $(pkg-config --libs-only-L openssl)"
# We can build several different configurations of Python: regular and debug.
# Define a common function that does one build:
@@ -1526,6 +1526,10 @@ fi
# ======================================================
%changelog
+* Wed Sep 06 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-17
+- Include `-g` in the flags sent to the linker (LDFLAGS)
+Resolves: rhbz#1483222
+
* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
- Specfile cleanup
- Make the main description also applicable to the SRPM
commit 7d6b083b8335c56b33afe8d0eb9b3557b5114093
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Sep 5 17:31:28 2017 +0200
Add changelog entry for this round of cleanups
diff --git a/python3.spec b/python3.spec
index f08a7ab..db8c83a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 15%{?dist}
+Release: 16%{?dist}
License: Python
@@ -1526,6 +1526,11 @@ fi
# ======================================================
%changelog
+* Tue Sep 05 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-16
+- Specfile cleanup
+- Make the main description also applicable to the SRPM
+- Add audiotest.au to the test package
+
* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
- Remove %%{pylibdir}/Tools/scripts/2to3
commit 15a5ab169416bf61d9851b1874110ea12623daa9
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Sep 5 11:54:13 2017 +0200
Make the main description also applicable to the SRPM
Also, add a comment to highlight its dual purpose
diff --git a/python3.spec b/python3.spec
index 30d392d..f08a7ab 100644
--- a/python3.spec
+++ b/python3.spec
@@ -438,14 +438,15 @@ Requires: python3-setuptools
Requires: python3-pip
%endif
+# The description used both for the SRPM and the main `python3` subpackage:
%description
Python is an accessible, high-level, dynamically typed, interpreted programming
language, designed with an emphasis on code readibility.
It includes an extensive standard library, and has a vast ecosystem of
third-party libraries.
-This package provides the "python3" executable: the reference interpreter for
-the Python language, version 3.
+The ${name} package provides the "python3" executable: the reference
+interpreter for the Python language, version 3.
The majority of its standard library is provided in the %{name}-libs package,
which should be installed automatically along with %{name}.
The remaining parts of the Python standard library are broken out into the
commit 7c72174fbd9f244826e707368d8db9b694948a21
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Sep 5 11:54:06 2017 +0200
Snipe a typo
diff --git a/python3.spec b/python3.spec
index 203015b..30d392d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -846,7 +846,7 @@ EOF
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
-# Install the "debug" build first; anny common files will be overridden with
+# Install the "debug" build first; any common files will be overridden with
# later builds
%if %{with debug_build}
InstallPython debug \
commit 4ced9a188ed0a0170a629db7ea5b473a37bbe993
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Sep 5 11:40:37 2017 +0200
Check %{_lib} rather than hardcode all 64-bit arches
Checking %{lib} isn't guaranteed to determine the word size
correctly, but it works for current arches and is more likely
to stay correct when a new arch are added.
diff --git a/python3.spec b/python3.spec
index 700d819..203015b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -151,7 +151,9 @@ License: Python
# For multilib support, files that are different between 32- and 64-bit arches
# need different filenames. Use "64" or "32" according to the word
size.
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
+# Currently, the best way to determine an architecture's word size happens to
+# be checking %%{_lib}.
+%if "%{_lib}" == "lib64"
%global wordsize 64
%else
%global wordsize 32
commit 4f6b427d2e3994d6709a64376225228d393c0eee
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Sep 4 17:33:16 2017 +0200
Include audiotest.au again
These files were removed because historically they included
a short sound clip from Monty Python shows, which might fall
under copyright.
In 2010 this was replaced upstream by a recording of Guido
van Rossum saying something silly in Dutch. So, there's no
reason to exclude the file anymore.
The bug mentioned in the removed comment is private due to
corporate policy from 2004. Sorry for that!
The problem itself is discussed at:
http://bugs.python.org/issue7755
diff --git a/python3.spec b/python3.spec
index 7c4a91a..700d819 100644
--- a/python3.spec
+++ b/python3.spec
@@ -898,9 +898,6 @@ cp -ar Doc/tools %{buildroot}%{pylibdir}/Doc/
# Demo scripts
cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
-# Fix for bug #136654
-rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdir}/test/audiotest.au
-
# Make sure distutils looks at the right pyconfig.h file
# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
commit 39c4234d4870bd7258615fcd718f26f56f045e8b
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 16:50:59 2017 +0200
Remove the %clean section
diff --git a/python3.spec b/python3.spec
index 20b10a0..7c4a91a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1070,14 +1070,6 @@ CheckPython optimized
# ======================================================
-# Cleaning up
-# ======================================================
-
-%clean
-rm -fr %{buildroot}
-
-
-# ======================================================
# Scriptlets
# ======================================================
commit 64593af0dd4edd2343b6631838523735f1d51066
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 14:17:21 2017 +0200
Move systemtap tapfile installation into the per-build function
diff --git a/python3.spec b/python3.spec
index 0c5eac2..20b10a0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -149,6 +149,15 @@ License: Python
# on files that test invalid syntax.
%undefine py_auto_byte_compile
+# For multilib support, files that are different between 32- and 64-bit arches
+# need different filenames. Use "64" or "32" according to the word
size.
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
+%global wordsize 64
+%else
+%global wordsize 32
+%endif
+
+
# =======================
# Build-time requirements
# =======================
@@ -768,12 +777,7 @@ mkdir -p %{buildroot}$DirHoldingGdbPy
# Filanames are defined here:
%global _pyconfig32_h pyconfig-32.h
%global _pyconfig64_h pyconfig-64.h
-
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
-%global _pyconfig_h %{_pyconfig64_h}
-%else
-%global _pyconfig_h %{_pyconfig32_h}
-%endif
+%global _pyconfig_h pyconfig-%{wordsize}.h
# Use a common function to do an install for all our configurations:
InstallPython() {
@@ -782,6 +786,7 @@ InstallPython() {
PyInstSoName=$2
MoreCFlags=$3
LDVersion=$4
+ Postfix=$5
# Switch to the directory with this configuration's built files
ConfDir=build/$ConfName
@@ -826,6 +831,16 @@ InstallPython() {
#endif
EOF
+ # Systemtap hooks
+%if %{with systemtap}
+ mkdir -p %{buildroot}%{tapsetdir}
+ sed \
+ -e "s|LIBRARY_PATH|%{_libdir}/${PyInstSoName}|" \
+ -e 's|"python3"|"python3${Postfix}"|' \
+ %{_sourcedir}/libpython.stp \
+ > %{buildroot}%{tapsetdir}/libpython%{pybasever}${Postfix}-%{wordsize}.stp
+%endif # with systemtap
+
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -835,14 +850,16 @@ EOF
InstallPython debug \
%{py_INSTSONAME_debug} \
-O0 \
- %{LDVERSION_debug}
+ %{LDVERSION_debug} \
+ -debug
%endif # with debug_build
# Now the optimized build:
InstallPython optimized \
%{py_INSTSONAME_optimized} \
"" \
- %{LDVERSION_optimized}
+ %{LDVERSION_optimized} \
+ ""
# Install directories for additional packages
install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
@@ -953,39 +970,6 @@ ln -s \
%{buildroot}%{_bindir}/python3-debug
%endif
-#
-# Systemtap hooks:
-#
-%if %{with systemtap}
-# Install a tapset for this libpython into tapsetdir, fixing up the path to the
-# library:
-mkdir -p %{buildroot}%{tapsetdir}
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64}
-%global libpython_stp_optimized libpython%{pybasever}-64.stp
-%global libpython_stp_debug libpython%{pybasever}-debug-64.stp
-%else
-%global libpython_stp_optimized libpython%{pybasever}-32.stp
-%global libpython_stp_debug libpython%{pybasever}-debug-32.stp
-%endif
-
-sed \
- -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_optimized}|" \
- %{_sourcedir}/libpython.stp \
- > %{buildroot}%{tapsetdir}/%{libpython_stp_optimized}
-
-%if %{with debug_build}
-# In Python 3, python3 and python3-debug don't point to the same binary,
-# so we have to replace "python3" with "python3-debug" to get
systemtap
-# working with debug build
-sed \
- -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_debug}|" \
- -e 's|"python3"|"python3-debug"|' \
- %{_sourcedir}/libpython.stp \
- > %{buildroot}%{tapsetdir}/%{libpython_stp_debug}
-%endif # with debug_build
-
-%endif # with systemtap
-
# System Python: Link the executable to libexec
# This is for backwards compatibility only and should be removed in Fedora 29
mkdir -p %{buildroot}%{_libexecdir}
commit 6c5169565e6bff14f883f19a234fc1b1133b6822
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 14:01:43 2017 +0200
Move multilib support for pyconfig.h to the per-build section
diff --git a/python3.spec b/python3.spec
index e1ffc09..0c5eac2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -759,6 +759,22 @@ DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
mkdir -p %{buildroot}$DirHoldingGdbPy
%endif # with gdb_hooks
+# Multilib support for pyconfig.h
+# 32- and 64-bit versions of pyconfig.h are different. For multilib support
+# (making it possible to install 32- and 64-bit versions simultaneously),
+# we need to install them under different filenames, and to make the common
+# "pyconfig.h" include the right file based on architecture.
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
+# Filanames are defined here:
+%global _pyconfig32_h pyconfig-32.h
+%global _pyconfig64_h pyconfig-64.h
+
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
+%global _pyconfig_h %{_pyconfig64_h}
+%else
+%global _pyconfig_h %{_pyconfig32_h}
+%endif
+
# Use a common function to do an install for all our configurations:
InstallPython() {
@@ -795,6 +811,21 @@ InstallPython() {
%{buildroot}%{_bindir}/python${LDVersion}-config
chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
+ # Make python3-devel multilib-ready
+ mv %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h \
+ %{buildroot}%{_includedir}/python${LDVersion}/%{_pyconfig_h}
+ cat > %{buildroot}%{_includedir}/python${LDVersion}/pyconfig.h << EOF
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+#include "%{_pyconfig32_h}"
+#elif __WORDSIZE == 64
+#include "%{_pyconfig64_h}"
+#else
+#error "Unknown word size"
+#endif
+EOF
+
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -853,44 +884,11 @@ cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
# Fix for bug #136654
rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdir}/test/audiotest.au
-# Make python3-devel multilib-ready
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
-%global _pyconfig32_h pyconfig-32.h
-%global _pyconfig64_h pyconfig-64.h
-
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
-%global _pyconfig_h %{_pyconfig64_h}
-%else
-%global _pyconfig_h %{_pyconfig32_h}
-%endif
-
-%if %{with debug_build}
-%global PyIncludeDirs python%{LDVERSION_optimized} python%{LDVERSION_debug}
-
-%else
-%global PyIncludeDirs python%{LDVERSION_optimized}
-%endif
-
-for PyIncludeDir in %{PyIncludeDirs} ; do
- mv %{buildroot}%{_includedir}/$PyIncludeDir/pyconfig.h \
- %{buildroot}%{_includedir}/$PyIncludeDir/%{_pyconfig_h}
- cat > %{buildroot}%{_includedir}/$PyIncludeDir/pyconfig.h << EOF
-#include <bits/wordsize.h>
-
-#if __WORDSIZE == 32
-#include "%{_pyconfig32_h}"
-#elif __WORDSIZE == 64
-#include "%{_pyconfig64_h}"
-#else
-#error "Unknown word size"
-#endif
-EOF
-done
-
-# Fix for bug 201434: make sure distutils looks at the right pyconfig.h file
+# Make sure distutils looks at the right pyconfig.h file
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=201434
# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
-# when python starts up (bug 653058)
+# when python starts up (see
https://bugzilla.redhat.com/show_bug.cgi?id=653058)
#
# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
# variants:
commit 474cc9f637058b6b4688c53670115d86d5a89431
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 13:49:50 2017 +0200
install: Move renaming -devel scripts to the per-build function
diff --git a/python3.spec b/python3.spec
index b165216..e1ffc09 100644
--- a/python3.spec
+++ b/python3.spec
@@ -765,6 +765,7 @@ InstallPython() {
ConfName=$1
PyInstSoName=$2
MoreCFlags=$3
+ LDVersion=$4
# Switch to the directory with this configuration's built files
ConfDir=build/$ConfName
@@ -786,6 +787,14 @@ InstallPython() {
cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
%endif # with gdb_hooks
+ # Rename the -devel script that differs on different arches to arch specific name
+ mv %{buildroot}%{_bindir}/python${LDVersion}-{,`uname -m`-}config
+ echo -e '#!/bin/sh\nexec `dirname $0`/python'${LDVersion}'-`uname
-m`-config "$@"' > \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ echo '[ $? -eq 127 ] && echo "Could not find
python'${LDVersion}'-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python${LDVersion}-config
+ chmod +x %{buildroot}%{_bindir}/python${LDVersion}-config
+
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -794,13 +803,15 @@ InstallPython() {
%if %{with debug_build}
InstallPython debug \
%{py_INSTSONAME_debug} \
- -O0
+ -O0 \
+ %{LDVERSION_debug}
%endif # with debug_build
# Now the optimized build:
InstallPython optimized \
%{py_INSTSONAME_optimized} \
- ""
+ "" \
+ %{LDVERSION_optimized}
# Install directories for additional packages
install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
@@ -977,25 +988,6 @@ sed \
%endif # with systemtap
-# Rename the -devel script that differs on different arches to arch specific name
-mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,`uname -m`-}config
-
-echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname -m`-config
"$@"' > \
- %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
-echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname -m`-config. Look around to see available arches."
>&2' >> \
- %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
- chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
-
-%if %{with debug_build}
-# Rename the -debug script that differs on different arches to arch specific name
-mv %{buildroot}%{_bindir}/python%{LDVERSION_debug}-{,`uname -m`-}config
-echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_debug}-`uname -m`-config
"$@"' > \
- %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
-echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_debug}-`uname -m`-config. Look around to see available arches."
>&2' >> \
- %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
- chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
-%endif # with debug_build
-
# System Python: Link the executable to libexec
# This is for backwards compatibility only and should be removed in Fedora 29
mkdir -p %{buildroot}%{_libexecdir}
commit ec8375ccf7481b6aa95005e225a8be80e3b3ac70
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 13:43:34 2017 +0200
Move packaging checks from %install to %check
diff --git a/python3.spec b/python3.spec
index c656d2c..b165216 100644
--- a/python3.spec
+++ b/python3.spec
@@ -935,28 +935,6 @@ mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
-# Ensure that the curses module was linked against libncursesw.so, rather than
-# libncurses.so (bug 539917)
-ldd %{buildroot}/%{dynload_dir}/_curses*.so \
- | grep curses \
- | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
-
-# Ensure that the debug modules are linked against the debug libpython, and
-# likewise for the optimized modules and libpython:
-for Module in %{buildroot}/%{dynload_dir}/*.so ; do
- case $Module in
- *.%{SOABI_debug})
- ldd $Module | grep %{py_INSTSONAME_optimized} &&
- (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
-
- ;;
- *.%{SOABI_optimized})
- ldd $Module | grep %{py_INSTSONAME_debug} &&
- (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
- ;;
- esac
-done
-
# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
# avoid the user having to know the precise version and ABI flags.
# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
@@ -1001,6 +979,7 @@ sed \
# Rename the -devel script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,`uname -m`-}config
+
echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname -m`-config
"$@"' > \
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname -m`-config. Look around to see available arches."
>&2' >> \
@@ -1024,7 +1003,7 @@ ln -s %{_bindir}/python%{pybasever}
%{buildroot}%{_libexecdir}/system-python
# ======================================================
-# Running the upstream test suite
+# Checks for packaging issues
# ======================================================
%check
@@ -1035,6 +1014,33 @@ find %{buildroot} -type f -a -name "*.py" -print0 | \
PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
+# Ensure that the curses module was linked against libncursesw.so, rather than
+# libncurses.so
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=539917
+ldd %{buildroot}/%{dynload_dir}/_curses*.so \
+ | grep curses \
+ | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
+
+# Ensure that the debug modules are linked against the debug libpython, and
+# likewise for the optimized modules and libpython:
+for Module in %{buildroot}/%{dynload_dir}/*.so ; do
+ case $Module in
+ *.%{SOABI_debug})
+ ldd $Module | grep %{py_INSTSONAME_optimized} &&
+ (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
+
+ ;;
+ *.%{SOABI_optimized})
+ ldd $Module | grep %{py_INSTSONAME_debug} &&
+ (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
+ ;;
+ esac
+done
+
+# ======================================================
+# Running the upstream test suite
+# ======================================================
+
# For ppc64 we need a larger stack than default
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1292462
%ifarch %{power64}
@@ -1042,6 +1048,7 @@ find %{buildroot} -type f -a -name "*.py" -print0 | \
ulimit -s 16384
%endif
+
topdir=$(pwd)
CheckPython() {
ConfName=$1
commit d54a775b46f723aea2f1d2e0ad825e40154cb568
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 13:35:53 2017 +0200
Remove some unneeded old cleanups in %install
diff --git a/python3.spec b/python3.spec
index efa2ad1..c656d2c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -905,14 +905,8 @@ find %{buildroot} -name \*.py \
-perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
-exec chmod a-x {} \; \) \)
-# .xpm and .xbm files should not be executable:
-find %{buildroot} \
- \( -name \*.xbm -o -name \*.xpm -o -name \*.xpm.1 \) \
- -exec chmod a-x {} \;
-
# Remove executable flag from files that shouldn't have it:
chmod a-x \
- %{buildroot}%{pylibdir}/distutils/tests/Setup.sample \
%{buildroot}%{pylibdir}/Tools/README
# Get rid of DOS batch files:
@@ -921,24 +915,9 @@ find %{buildroot} -name \*.bat -exec rm {} \;
# Get rid of backup files:
find %{buildroot}/ -name "*~" -exec rm -f {} \;
find . -name "*~" -exec rm -f {} \;
-rm -f %{buildroot}%{pylibdir}/LICENSE.txt
-# Junk, no point in putting in -test sub-pkg
-rm -f %{buildroot}/%{pylibdir}/idlelib/testcode.py*
-
-# Get rid of stray patch file from buildroot:
-rm -f %{buildroot}%{pylibdir}/test/test_imp.py.apply-our-changes-to-expected-shebang #
from patch 4
-
-# Fix end-of-line encodings:
-find %{buildroot}/ -name \*.py -exec sed -i 's/\r//' {} \;
-
-# Fix an encoding:
-iconv -f iso8859-1 -t utf-8 %{buildroot}/%{pylibdir}/Demo/rpc/README > README.conv
&& mv -f README.conv %{buildroot}/%{pylibdir}/Demo/rpc/README
-# Note that
-# %{pylibdir}/Demo/distutils/test2to3/setup.py
-# is in iso-8859-1 encoding, and that this is deliberate; this is test data
-# for the 2to3 tool, and one of the functions of the 2to3 tool is to fixup
-# character encodings within python source code
+# Get rid of a stray copy of the license:
+rm %{buildroot}%{pylibdir}/LICENSE.txt
# Do bytecompilation with the newly installed interpreter.
# This is similar to the script in macros.pybytecompile
@@ -949,8 +928,7 @@ find %{buildroot} -type f -a -name "*.py" -print0 | \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
-find %{buildroot} \
- -perm 555 -exec chmod 755 {} \;
+find %{buildroot} -perm 555 -exec chmod 755 {} \;
# Install macros for rpm:
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
commit f86b3d1707739ef4afebea5b8f9ece9692b29840
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 17:52:06 2017 +0200
Move creation of site-packages/__pycache__ dirs together
diff --git a/python3.spec b/python3.spec
index 72c2918..efa2ad1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -802,7 +802,16 @@ InstallPython optimized \
%{py_INSTSONAME_optimized} \
""
+# Install directories for additional packages
install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
+%if "%{_lib}" == "lib64"
+# The 64-bit version needs to create "site-packages" in /usr/lib/ (for
+# pure-Python modules) as well as in /usr/lib64/ (for packages with extension
+# modules).
+# Note that rpmlint will complain about hardcoded library path;
+# this is intentional.
+install -d -m 0755
%{buildroot}%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
+%endif
# add idle3 to menu
install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
@@ -833,10 +842,6 @@ cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
# Fix for bug #136654
rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdir}/test/audiotest.au
-%if "%{_lib}" == "lib64"
-install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
-%endif
-
# Make python3-devel multilib-ready
# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
%global _pyconfig32_h pyconfig-32.h
commit 208332b1c936594b8e2388806115015b85459822
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Thu Aug 31 16:00:06 2017 +0200
Clean up the start of the %install section
- Rewrite comments
- Move common part of GDB hook install out of the per-build function
diff --git a/python3.spec b/python3.spec
index ceef4f2..72c2918 100644
--- a/python3.spec
+++ b/python3.spec
@@ -731,63 +731,66 @@ BuildPython optimized \
# ======================================================
%install
+
+# As in %%build, remember the current directory
topdir=$(pwd)
+# We install a collection of hooks for gdb that make it easier to debug
+# executables linked against libpython3* (such as /usr/bin/python3 itself)
+#
+# These hooks are implemented in Python itself (though they are for the version
+# of python that gdb is linked with)
+#
+# gdb-archer looks for them in the same path as the ELF file or its .debug
+# file, with a -gdb.py suffix.
+# We put them next to the debug file, because ldconfig would complain if
+# it found non-library files directly in /usr/lib/
+# (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
+#
+# We'll put these files in the debuginfo package by installing them to e.g.:
+# /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
+# (note that the debug path is /usr/lib/debug for both 32/64 bit)
+#
+# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
+# information
+
+%if %{with gdb_hooks}
+DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+mkdir -p %{buildroot}$DirHoldingGdbPy
+%endif # with gdb_hooks
+
+# Use a common function to do an install for all our configurations:
InstallPython() {
ConfName=$1
PyInstSoName=$2
MoreCFlags=$3
+ # Switch to the directory with this configuration's built files
ConfDir=build/$ConfName
-
echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
mkdir -p $ConfDir
-
pushd $ConfDir
-make install DESTDIR=%{buildroot} INSTALL="install -p"
EXTRA_CFLAGS="$MoreCFlags"
+ make \
+ DESTDIR=%{buildroot} \
+ INSTALL="install -p" \
+ EXTRA_CFLAGS="$MoreCFlags" \
+ install
popd
- # We install a collection of hooks for gdb that make it easier to debug
- # executables linked against libpython3* (such as /usr/bin/python3 itself)
- #
- # These hooks are implemented in Python itself (though they are for the version
- # of python that gdb is linked with, in this case Python 2.7)
- #
- # gdb-archer looks for them in the same path as the ELF file, with a -gdb.py suffix.
- # We put them in the debuginfo package by installing them to e.g.:
- # /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
- #
- # See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
- # information
- #
- # Copy up the gdb hooks into place; the python file will be autoloaded by gdb
- # when visiting libpython.so, provided that the python file is installed to the
- # same path as the library (or its .debug file) plus a "-gdb.py" suffix,
e.g:
- # /usr/lib/debug/usr/lib64/libpython3.2.so.1.0.debug-gdb.py
- # (note that the debug path is /usr/lib/debug for both 32/64 bit)
- #
- # Initially I tried:
- # /usr/lib/libpython3.1.so.1.0-gdb.py
- # but doing so generated noise when ldconfig was rerun
- # (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
- #
%if %{with gdb_hooks}
- DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+ # See comment on $DirHoldingGdbPy above
PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
-
- mkdir -p %{buildroot}$DirHoldingGdbPy
cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
%endif # with gdb_hooks
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
-# Use "InstallPython" to support building with different configurations:
-
-# Install the "debug" build first, so that we can move some files aside
+# Install the "debug" build first; anny common files will be overridden with
+# later builds
%if %{with debug_build}
InstallPython debug \
%{py_INSTSONAME_debug} \
@@ -796,7 +799,8 @@ InstallPython debug \
# Now the optimized build:
InstallPython optimized \
- %{py_INSTSONAME_optimized}
+ %{py_INSTSONAME_optimized} \
+ ""
install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
@@ -833,7 +837,8 @@ rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdi
install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
%endif
-# Make python3-devel multilib-ready (bug #192747, #139911)
+# Make python3-devel multilib-ready
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=192747
%global _pyconfig32_h pyconfig-32.h
%global _pyconfig64_h pyconfig-64.h
commit b3fc51be3238066b98575ea2d67e62ce7a7a1456
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Fri Sep 1 11:14:37 2017 +0200
Replace ${RPM_BUILD_ROOT} by %{buildroot}
diff --git a/python3.spec b/python3.spec
index 6b31105..ceef4f2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -798,26 +798,26 @@ InstallPython debug \
InstallPython optimized \
%{py_INSTSONAME_optimized}
-install -d -m 0755 ${RPM_BUILD_ROOT}%{pylibdir}/site-packages/__pycache__
+install -d -m 0755 %{buildroot}%{pylibdir}/site-packages/__pycache__
# add idle3 to menu
-install -D -m 0644 Lib/idlelib/Icons/idle_16.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_32.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
-install -D -m 0644 Lib/idlelib/Icons/idle_48.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
-desktop-file-install --dir=${RPM_BUILD_ROOT}%{_datadir}/applications %{SOURCE10}
+install -D -m 0644 Lib/idlelib/Icons/idle_16.png
%{buildroot}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_32.png
%{buildroot}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_48.png
%{buildroot}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
+desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE10}
# Install and validate appdata file
-mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/appdata
-cp -a %{SOURCE11} ${RPM_BUILD_ROOT}%{_datadir}/appdata
-appstream-util validate-relax --nonet
${RPM_BUILD_ROOT}%{_datadir}/appdata/idle3.appdata.xml
+mkdir -p %{buildroot}%{_datadir}/appdata
+cp -a %{SOURCE11} %{buildroot}%{_datadir}/appdata
+appstream-util validate-relax --nonet %{buildroot}%{_datadir}/appdata/idle3.appdata.xml
# Development tools
-install -m755 -d ${RPM_BUILD_ROOT}%{pylibdir}/Tools
-install Tools/README ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
-cp -ar Tools/freeze ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
-cp -ar Tools/i18n ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
-cp -ar Tools/pynche ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
-cp -ar Tools/scripts ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
+install -m755 -d %{buildroot}%{pylibdir}/Tools
+install Tools/README %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/freeze %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/i18n %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/pynche %{buildroot}%{pylibdir}/Tools/
+cp -ar Tools/scripts %{buildroot}%{pylibdir}/Tools/
# Documentation tools
install -m755 -d %{buildroot}%{pylibdir}/Doc
@@ -913,7 +913,7 @@ find %{buildroot}/ -name "*~" -exec rm -f {} \;
find . -name "*~" -exec rm -f {} \;
rm -f %{buildroot}%{pylibdir}/LICENSE.txt
# Junk, no point in putting in -test sub-pkg
-rm -f ${RPM_BUILD_ROOT}/%{pylibdir}/idlelib/testcode.py*
+rm -f %{buildroot}/%{pylibdir}/idlelib/testcode.py*
# Get rid of stray patch file from buildroot:
rm -f %{buildroot}%{pylibdir}/test/test_imp.py.apply-our-changes-to-expected-shebang #
from patch 4
commit db2797c8b72fdcf01f01515e1849a2466933e371
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Thu Aug 31 15:27:20 2017 +0200
Clean up the %build section
- Add more explanatory comments, remove historical notes
- Put configuration options in %%global
- Shell: use $() instead of backticks
- Remove unused aruments to BuildPython()! (fun fact: most were *never* used!)
diff --git a/python3.spec b/python3.spec
index 072a1e4..6b31105 100644
--- a/python3.spec
+++ b/python3.spec
@@ -644,42 +644,50 @@ rm configure pyconfig.h.in
autoconf
autoheader
+# Remember the current directory (which has sources and the configure script),
+# so we can refer to it after we "cd" elsewhere.
topdir=$(pwd)
+
+# Get proper option names from bconds
+%if %{with computed_gotos}
+%global computed_gotos_flag yes
+%else
+%global computed_gotos_flag no
+%endif
+
+%if %{with optimizations}
+%global optimizations_flag "--enable-optimizations"
+%else
+%global optimizations_flag "--disable-optimizations"
+%endif
+
+# Set common compiler/linker flags
export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
-export CPPFLAGS="`pkg-config --cflags-only-I libffi`"
+export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
export LINKCC="gcc"
-export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
-export LDFLAGS="$RPM_LD_FLAGS `pkg-config --libs-only-L openssl`"
+export CFLAGS="$CFLAGS $(pkg-config --cflags openssl)"
+export LDFLAGS="$RPM_LD_FLAGS $(pkg-config --libs-only-L openssl)"
-
-# Define a function, for how to perform a "build" of python for a given
-# configuration:
+# We can build several different configurations of Python: regular and debug.
+# Define a common function that does one build:
BuildPython() {
ConfName=$1
- BinaryName=$2
- SymlinkName=$3
- ExtraConfigArgs=$4
- PathFixWithThisBinary=$5
- MoreCFlags=$6
+ ExtraConfigArgs=$2
+ MoreCFlags=$3
+ # Each build is done in its own directory
ConfDir=build/$ConfName
-
- echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName - %{_bindir}/$BinaryName
+ echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
mkdir -p $ConfDir
-
pushd $ConfDir
- # Use the freshly created "configure" script, but in the directory two
above:
+ # Normally, %%configure looks for the "configure" script in the current
+ # directory.
+ # Since we changed directories, we need to tell %%configure where to look.
%global _configure $topdir/configure
- %if %{with computed_gotos}
- %global computed_gotos_flag yes
- %else
- %global computed_gotos_flag no
- %endif
-
%configure \
--enable-ipv6 \
--enable-shared \
@@ -699,45 +707,24 @@ BuildPython() {
$ExtraConfigArgs \
%{nil}
- # Set EXTRA_CFLAGS to our CFLAGS (rather than overriding OPT, as we've done
- # in the past).
- # This should fix a problem with --with-valgrind where it adds
- # -DDYNAMIC_ANNOTATIONS_ENABLED=1
- # to OPT which must be passed to all compilation units in the build,
- # otherwise leading to linker errors, e.g.
- # missing symbol AnnotateRWLockDestroy
- #
- # Invoke the build:
+ # Invoke the build
make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
popd
- echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfDir
+ echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
}
-# Use "BuildPython" to support building with different configurations:
+# Call the above to build each configuration.
%if %{with debug_build}
BuildPython debug \
- python-debug \
- python%{pybasever}-debug \
-%ifarch %{ix86} x86_64 ppc %{power64}
- "--with-pydebug --without-ensurepip" \
-%else
- "--with-pydebug --without-ensurepip" \
-%endif
- false \
- -O0
+ "--without-ensurepip --with-pydebug" \
+ "-O0"
%endif # with debug_build
BuildPython optimized \
- python \
- python%{pybasever} \
-%if %{with optimizations}
- "--without-ensurepip --enable-optimizations" \
-%else
- "--without-ensurepip --disable-optimizations" \
-%endif # with optimizations
- true
+ "--without-ensurepip %{optimizations_flag}" \
+ ""
# ======================================================
# Installing the built code:
commit e441743e28f31eb921af310064a0303e92524f01
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Thu Aug 31 15:28:09 2017 +0200
Don't remove the buildroot in %install
diff --git a/python3.spec b/python3.spec
index aa42e9c..072a1e4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -745,8 +745,6 @@ BuildPython optimized \
%install
topdir=$(pwd)
-rm -fr %{buildroot}
-mkdir -p %{buildroot}%{_prefix} %{buildroot}%{_mandir}
InstallPython() {
commit 1acd7dfa3395ac84b450d0d740aeba9e470ffd29
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Sep 1 17:42:46 2017 +0200
Remove %{pylibdir}/Tools/scripts/2to3
* the file has wrong shebang (#!/usr/bin/env python)
* it is not covered by the shebang correction because it is not
named with .py extension
* a note has been added to the shebang correction code about this
* ignoring shebang, the file is identical to /usr/bin/2to3
* thus redundant
diff --git a/python3.spec b/python3.spec
index 64782da..aa42e9c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 14%{?dist}
+Release: 15%{?dist}
License: Python
@@ -893,10 +893,14 @@ sed -i -e
"s/'pyconfig.h'/'%{_pyconfig_h}'/" \
%{buildroot}%{pylibdir}/sysconfig.py
# Switch all shebangs to refer to the specific Python version.
+# This currently only covers files with .py extension
LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
Tools/scripts/pathfix.py \
-i "%{_bindir}/python%{pybasever}" \
%{buildroot}
+# not covered, also redundant and useless:
+rm %{buildroot}%{pylibdir}/Tools/scripts/2to3
+
# Remove shebang lines from .py files that aren't executable, and
# remove executability from .py files that don't have a shebang line:
@@ -1576,6 +1580,9 @@ fi
# ======================================================
%changelog
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-15
+- Remove %%{pylibdir}/Tools/scripts/2to3
+
* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
- Expat >= 2.1.0 is everywhere, remove explicit requires
- Conditionalize systemtap-devel BuildRequires
commit 5f24f39d01d423935d2b21ff7502114641e6fca3
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Sep 1 11:48:50 2017 +0200
For consistency, require /usr/sbin/ifconfig instead of net-tools
diff --git a/python3.spec b/python3.spec
index ae2a4fb..64782da 100644
--- a/python3.spec
+++ b/python3.spec
@@ -175,9 +175,6 @@ BuildRequires: libGL-devel
BuildRequires: libX11-devel
BuildRequires: ncurses-devel
-# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
-BuildRequires: net-tools
-
BuildRequires: openssl-devel
BuildRequires: pkgconfig
BuildRequires: readline-devel
@@ -203,6 +200,9 @@ BuildRequires: zlib-devel
BuildRequires: /usr/bin/dtrace
+# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
+BuildRequires: /usr/sbin/ifconfig
+
%if %{with rewheel}
BuildRequires: python3-setuptools
BuildRequires: python3-pip
@@ -1579,6 +1579,7 @@ fi
* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
- Expat >= 2.1.0 is everywhere, remove explicit requires
- Conditionalize systemtap-devel BuildRequires
+- For consistency, require /usr/sbin/ifconfig instead of net-tools
* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
- Rename patch files to be consistent
commit 51501f9a0bbd9c12b933dfbfd64580e4d04ca5a4
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Sep 1 11:28:31 2017 +0200
Conditionalize systemtap-devel BuildRequires
diff --git a/python3.spec b/python3.spec
index f5902c0..ae2a4fb 100644
--- a/python3.spec
+++ b/python3.spec
@@ -183,9 +183,11 @@ BuildRequires: pkgconfig
BuildRequires: readline-devel
BuildRequires: sqlite-devel
-BuildRequires: systemtap-sdt-devel
+%if %{with systemtap}
BuildRequires: systemtap-devel
+BuildRequires: systemtap-sdt-devel
%global tapsetdir /usr/share/systemtap/tapset
+%endif
BuildRequires: tar
BuildRequires: tcl-devel
@@ -199,6 +201,8 @@ BuildRequires: valgrind-devel
BuildRequires: xz-devel
BuildRequires: zlib-devel
+BuildRequires: /usr/bin/dtrace
+
%if %{with rewheel}
BuildRequires: python3-setuptools
BuildRequires: python3-pip
@@ -1574,6 +1578,7 @@ fi
%changelog
* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
- Expat >= 2.1.0 is everywhere, remove explicit requires
+- Conditionalize systemtap-devel BuildRequires
* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
- Rename patch files to be consistent
commit 33e1101626689456a447c55b4450b66910df063f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Sep 1 11:04:02 2017 +0200
Expat >= 2.1.0 is everywhere, remove explicit requires
(Except EL6)
diff --git a/python3.spec b/python3.spec
index 316eedb..f5902c0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 13%{?dist}
+Release: 14%{?dist}
License: Python
@@ -160,10 +160,7 @@ BuildRequires: bluez-libs-devel
BuildRequires: bzip2
BuildRequires: bzip2-devel
BuildRequires: desktop-file-utils
-
-# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
-# it (in pyexpat) in order to enable the fix in Python-3.2.3 for CVE-2012-0876:
-BuildRequires: expat-devel >= 2.1.0
+BuildRequires: expat-devel
BuildRequires: findutils
BuildRequires: gcc-c++
@@ -449,12 +446,6 @@ the "%{name}-" prefix.
%package libs
Summary: Python runtime libraries
-# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
-# this symbol (in pyexpat), so we must explicitly state this dependency to
-# prevent "import pyexpat" from failing with a linker error if someone
hasn't
-# yet upgraded expat:
-Requires: expat >= 2.1.0
-
# The "enum" module is included in the standard library.
# Provide an upgrade path from the external library.
Provides: python3-enum34 = 1.0.4-5%{?dist}
@@ -1581,6 +1572,9 @@ fi
# ======================================================
%changelog
+* Fri Sep 01 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-14
+- Expat >= 2.1.0 is everywhere, remove explicit requires
+
* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
- Rename patch files to be consistent
- Run autotools to generate the configure script before building
commit 357f40b6c43803f3fe15c4ae3ff1c5f135c46c22
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Aug 31 23:01:10 2017 +0200
Move python2-tools conflicts to tools subpackage
They were previously wrongly placed in tkinter subpackage
diff --git a/python3.spec b/python3.spec
index c33f99c..316eedb 100644
--- a/python3.spec
+++ b/python3.spec
@@ -504,6 +504,12 @@ Provides: %{name}-idle = %{version}-%{release}
Provides: 2to3 = %{version}-%{release}
Provides: idle3 = %{version}-%{release}
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+# /usr/bin/2to3 was moved from here
+# TODO Remove in Fedora 29
+Conflicts: python2-tools < 2.7.13-17
+Conflicts: python-tools < 2.7.13-17
+
%description tools
This package contains several tools included with Python, including:
- 2to3, an automatic source converter from Python 2.X
@@ -514,12 +520,6 @@ This package contains several tools included with Python, including:
Summary: A GUI toolkit for Python
Requires: %{name} = %{version}-%{release}
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
-# /usr/bin/2to3 was moved from here
-# TODO Remove in Fedora 29
-Conflicts: python2-tools < 2.7.13-17
-Conflicts: python-tools < 2.7.13-17
-
%description tkinter
The Tkinter (Tk interface) library is a graphical user interface toolkit for
the Python programming language.
@@ -1588,7 +1588,8 @@ fi
- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
- Remove patches 157 and 186, which had test changes left over after upstreaming
- Remove patch 188, a temporary workaround for hashlib tests
-- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274.
+- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274
+- Move python2-tools conflicts to tools subpackage (it was wrongly in tkinter)
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit 1151a3e1a41f4ed815e1e74671cfab8a79b9ba60
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 29 10:36:23 2017 +0200
Remove commented-out prep code for hashlib OpenSSL/FIPS patch
A task is open in Bugzilla for adding this back:
https://bugzilla.redhat.com/show_bug.cgi?id=1486212
diff --git a/python3.spec b/python3.spec
index aa803a5..c33f99c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -590,19 +590,6 @@ cp -a %{SOURCE7} .
rm -r Modules/expat
rm -r Modules/zlib
-## Disabling hashlib patch for now as it needs to be reimplemented
-## for OpenSSL 1.1.0.
-# Don't build upstream Python's implementation of these crypto algorithms;
-# instead rely on _hashlib and OpenSSL.
-#
-# For example, in our builds hashlib.md5 is implemented within _hashlib via
-# OpenSSL (and thus respects FIPS mode), and does not fall back to _md5
-# TODO: there seems to be no OpenSSL support in Python for sha3 so far
-# when it is there, also remove _sha3/ dir
-#for f in md5module.c sha1module.c sha256module.c sha512module.c; do
-# rm Modules/$f
-#done
-
%if %{with rewheel}
%global pip_version 9.0.1
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
commit 3a884e4af31574b8d88afe4911dfc86e55d22aee
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 17:38:51 2017 +0200
Make module removal (unbundling) more strict
Failures from removing bundled expat or zlib should not be silent;
if they occur they should be investigated.
Also, reword the comments for conciseness
diff --git a/python3.spec b/python3.spec
index d0d2451..aa803a5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -586,13 +586,9 @@ cp -a %{SOURCE6} .
cp -a %{SOURCE7} .
%endif # with systemtap
-# Ensure that we're using the system copy of various libraries, rather than
-# copies shipped by upstream in the tarball:
-# Remove embedded copy of expat:
-rm -r Modules/expat || exit 1
-
-# Remove embedded copy of zlib:
-rm -r Modules/zlib || exit 1
+# Remove bundled libraries to ensure that we're using the system copy.
+rm -r Modules/expat
+rm -r Modules/zlib
## Disabling hashlib patch for now as it needs to be reimplemented
## for OpenSSL 1.1.0.
commit 9faeaef40ad3e08229eff99c611dc74dc80d1788
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 17:30:42 2017 +0200
Remove fix for version-specific documentation URLs in pydoc
This was fixed upstream some time ago. The removed sed invocation
did nothing.
diff --git a/python3.spec b/python3.spec
index 396ca96..d0d2451 100644
--- a/python3.spec
+++ b/python3.spec
@@ -650,16 +650,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch273 -p1
%patch274 -p1
-# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
-# are many differences between 2.6 and the Python 3 library.
-#
-# Fix up the URLs within pydoc to point at the documentation for this
-# MAJOR.MINOR version:
-#
-sed --in-place \
-
--expression="s|http://docs.python.org/library|http://docs.python.org/%{pybasever}/library|g"
\
- Lib/pydoc.py || exit 1
-
# Remove files that should be generated by the build
# (This is after patching, so that we can use patches directly from upstream)
commit 28aab8e5dbc9e7d00f7f7a72f3a2b895369b542d
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 17:23:55 2017 +0200
Remove the BuildRoot tag
According to current guidelines, this SHOULD NOT be used.
diff --git a/python3.spec b/python3.spec
index 666e93f..396ca96 100644
--- a/python3.spec
+++ b/python3.spec
@@ -392,8 +392,6 @@ Patch274: 00274-fix-arch-names.patch
#
#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
-BuildRoot: %{_tmppath}/%{name}-%{version}-root
-
# ==========================================
# Descriptions, and metadata for subpackages
commit 9423d36fb4847cc6117daea82490a188cc78ebdf
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 17:16:46 2017 +0200
Consolidate architecture-naming patches in one
Patches 180, 206, 243 and 5001 all changed architecture names
from Debian style (which upstream uses) to what Fedora uses.
Consolidate them into a single patch, 274.
Delete changes to `configure` from patch 243 without replacement;
that file is generated from `configure.ac`.
diff --git a/00180-python-add-support-for-ppc64p7.patch
b/00180-python-add-support-for-ppc64p7.patch
deleted file mode 100644
index 054f9f3..0000000
--- a/00180-python-add-support-for-ppc64p7.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/config.sub b/config.sub
-index 40ea5df..932128b 100755
---- a/config.sub
-+++ b/config.sub
-@@ -1045,7 +1045,7 @@ case $basic_machine in
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
-- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-+ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed
's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little)
- basic_machine=powerpc64le-unknown
diff --git a/00206-remove-hf-from-arm-triplet.patch
b/00206-remove-hf-from-arm-triplet.patch
deleted file mode 100644
index c5f309c..0000000
--- a/00206-remove-hf-from-arm-triplet.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -up Python-3.5.0/configure.ac.eabi Python-3.5.0/configure.ac
---- Python-3.5.0/configure.eabi 2015-09-23 13:52:20.756909744 +0200
-+++ Python-3.5.0/configure 2015-09-23 13:52:46.859163629 +0200
-@@ -762,9 +762,9 @@ cat >> conftest.c <<EOF
- alpha-linux-gnu
- # elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP)
- # if defined(__ARMEL__)
-- arm-linux-gnueabihf
-+ arm-linux-gnueabi
- # else
-- armeb-linux-gnueabihf
-+ armeb-linux-gnueabi
- # endif
- # elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
- # if defined(__ARMEL__)
diff --git a/00243-fix-mips64-triplet.patch b/00243-fix-mips64-triplet.patch
deleted file mode 100644
index 91bf6af..0000000
--- a/00243-fix-mips64-triplet.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-diff -urp Python-3.5.0/configure p/configure
---- Python-3.5.0/configure 2016-02-25 16:12:12.615184011 +0000
-+++ p/configure 2016-02-25 16:13:01.293412517 +0000
-@@ -5133,7 +5133,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64el-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64el-linux-gnuabi64
-+ mips64el-linux-gnu
- # else
- # error unknown platform triplet
- # endif
-@@ -5143,7 +5143,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64-linux-gnuabi64
-+ mips64-linux-gnu
- # else
- # error unknown platform triplet
- # endif
-diff -urp Python-3.5.0/configure.ac p/configure.ac
---- Python-3.5.0/configure.ac 2016-02-25 16:12:11.663159985 +0000
-+++ p/configure.ac 2016-02-25 16:13:18.814854710 +0000
-@@ -784,7 +784,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64el-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64el-linux-gnuabi64
-+ mips64el-linux-gnu
- # else
- # error unknown platform triplet
- # endif
-@@ -794,7 +794,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64-linux-gnuabi64
-+ mips64-linux-gnu
- # else
- # error unknown platform triplet
- # endif
diff --git a/00274-fix-arch-names.patch b/00274-fix-arch-names.patch
new file mode 100644
index 0000000..9d69223
--- /dev/null
+++ b/00274-fix-arch-names.patch
@@ -0,0 +1,58 @@
+diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
+--- Python-3.5.0/configure.ac.than 2015-11-13 11:51:32.039560172 -0500
++++ Python-3.5.0/configure.ac 2015-11-13 11:52:11.670168157 -0500
+@@ -788,9 +788,9 @@ cat >> conftest.c <<EOF
+ alpha-linux-gnu
+ # elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP)
+ # if defined(__ARMEL__)
+- arm-linux-gnueabihf
++ arm-linux-gnueabi
+ # else
+- armeb-linux-gnueabihf
++ armeb-linux-gnueabi
+ # endif
+ # elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
+ # if defined(__ARMEL__)
+@@ -810,7 +810,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64el-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64el-linux-gnuabi64
++ mips64el-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+@@ -820,7 +820,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64-linux-gnuabi64
++ mips64-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+@@ -830,9 +830,9 @@ cat >> conftest.c <<EOF
+ powerpc-linux-gnuspe
+ # elif defined(__powerpc64__)
+ # if defined(__LITTLE_ENDIAN__)
+- powerpc64le-linux-gnu
++ ppc64le-linux-gnu
+ # else
+- powerpc64-linux-gnu
++ ppc64-linux-gnu
+ # endif
+ # elif defined(__powerpc__)
+ powerpc-linux-gnu
+diff --git a/config.sub b/config.sub
+index 40ea5df..932128b 100755
+--- a/config.sub
++++ b/config.sub
+@@ -1045,7 +1045,7 @@ case $basic_machine in
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed
's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little)
+ basic_machine=powerpc64le-unknown
diff --git a/05001-powerppc-arch.patch b/05001-powerppc-arch.patch
deleted file mode 100644
index 10f0201..0000000
--- a/05001-powerppc-arch.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
---- Python-3.5.0/configure.ac.than 2015-11-13 11:51:32.039560172 -0500
-+++ Python-3.5.0/configure.ac 2015-11-13 11:52:11.670168157 -0500
-@@ -804,9 +804,9 @@ cat >> conftest.c <<EOF
- powerpc-linux-gnuspe
- # elif defined(__powerpc64__)
- # if defined(__LITTLE_ENDIAN__)
-- powerpc64le-linux-gnu
-+ ppc64le-linux-gnu
- # else
-- powerpc64-linux-gnu
-+ ppc64-linux-gnu
- # endif
- # elif defined(__powerpc__)
- powerpc-linux-gnu
-diff -up Python-3.5.0/configure.than Python-3.5.0/configure
---- Python-3.5.0/configure.than 2015-11-13 12:13:19.039658399 -0500
-+++ Python-3.5.0/configure 2015-11-13 12:13:35.199906857 -0500
-@@ -5153,9 +5153,9 @@ cat >> conftest.c <<EOF
- powerpc-linux-gnuspe
- # elif defined(__powerpc64__)
- # if defined(__LITTLE_ENDIAN__)
-- powerpc64le-linux-gnu
-+ ppc64le-linux-gnu
- # else
-- powerpc64-linux-gnu
-+ ppc64-linux-gnu
- # endif
- # elif defined(__powerpc__)
- powerpc-linux-gnu
diff --git a/python3.spec b/python3.spec
index fe52e47..666e93f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -323,11 +323,6 @@ Patch170: 00170-gc-assertions.patch
# Does not affect python2 AFAICS (different sysconfig values initialization)
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
-# 00180 #
-# Enable building on ppc64p7
-# Not appropriate for upstream, Fedora-specific naming
-Patch180: 00180-python-add-support-for-ppc64p7.patch
-
# 00189 #
# Add the rewheel module, allowing to recreate wheels from already installed
# ones
@@ -339,18 +334,6 @@ Patch189: 00189-add-rewheel-module.patch
# but the LIBPL variable defined there doesn't respect libdir macro
Patch205: 00205-make-libpl-respect-lib64.patch
-# 00206 #
-# Remove hf flag from arm triplet which is used
-# by debian but fedora infra uses only eabi without hf
-Patch206: 00206-remove-hf-from-arm-triplet.patch
-
-# 00243 #
-# Fix the triplet used on 64-bit MIPS
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=1322526
-# Upstream uses Debian-like style mips64-linux-gnuabi64
-# Fedora needs the default mips64-linux-gnu
-Patch243: 00243-fix-mips64-triplet.patch
-
# 00251
# Set values of prefix and exec_prefix in distutils install command
# to /usr/local if executable is /usr/bin/python* and RPM build
@@ -396,6 +379,10 @@ Patch272: 00272-fix-ftplib-to-reject-newlines.patch
# See
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
Patch273: 00273-skip-float-test.patch
+# 00274 #
+# Upstream uses Debian-style architecture naming. Change to match Fedora.
+Patch274: 00274-fix-arch-names.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -405,11 +392,6 @@ Patch273: 00273-skip-float-test.patch
#
#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
-# 05001 #
-# add correct arch for ppc64/ppc64le
-# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
-Patch5001: 05001-powerppc-arch.patch
-
BuildRoot: %{_tmppath}/%{name}-%{version}-root
@@ -651,15 +633,12 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch163 -p1
%patch170 -p1
%patch178 -p1
-%patch180 -p1
%if %{with rewheel}
%patch189 -p1
%endif
%patch205 -p1
-%patch206 -p1
-%patch243 -p1
%patch251 -p1
%patch262 -p1
@@ -671,6 +650,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch271 -p1
%patch272 -p1
%patch273 -p1
+%patch274 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -682,7 +662,6 @@ sed --in-place \
--expression="s|http://docs.python.org/library|http://docs.python.org/%{pybasever}/library|g"
\
Lib/pydoc.py || exit 1
-%patch5001 -p1
# Remove files that should be generated by the build
# (This is after patching, so that we can use patches directly from upstream)
@@ -1638,6 +1617,7 @@ fi
- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
- Remove patches 157 and 186, which had test changes left over after upstreaming
- Remove patch 188, a temporary workaround for hashlib tests
+- Merge patches 180, 206, 243, 5001 (architecture naming) into new patch 274.
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit ac06deac652cca79cce036f8acf81decbd86a82c
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 15:50:56 2017 +0200
Remove patch 188, a temporary workaround for hashlib tests
diff --git a/00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
b/00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
deleted file mode 100644
index 90af30d..0000000
--- a/00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -r 28c04e954bb6 Lib/lib2to3/main.py
---- a/Lib/lib2to3/main.py Tue Oct 29 22:25:55 2013 -0400
-+++ b/Lib/lib2to3/main.py Wed Nov 06 14:33:07 2013 +0100
-@@ -213,6 +213,7 @@
-
- # Set up logging handler
- level = logging.DEBUG if options.verbose else logging.INFO
-+ logging.root.handlers = []
- logging.basicConfig(format='%(name)s: %(message)s', level=level)
- logger = logging.getLogger('lib2to3.main')
-
diff --git a/python3.spec b/python3.spec
index 3cffc87..fe52e47 100644
--- a/python3.spec
+++ b/python3.spec
@@ -328,21 +328,6 @@ Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# Not appropriate for upstream, Fedora-specific naming
Patch180: 00180-python-add-support-for-ppc64p7.patch
-# 00188 #
-# Downstream only patch that should be removed when we compile all guaranteed
-# hashlib algorithms properly. The problem is this:
-# - during tests, test_hashlib is imported and executed before test_lib2to3
-# - if at least one hash function has failed, trying to import it triggers an
-# exception that is being caught and exception is logged:
-#
http://hg.python.org/cpython/file/2de806c8b070/Lib/hashlib.py#l217
-# - logging the exception makes logging module run basicConfig
-# - when lib2to3 tests are run again, lib2to3 runs basicConfig again, which
-# doesn't do anything, because it was run previously
-# (logging.root.handlers != []), which means that the default setup
-# (most importantly logging level) is not overriden. That means that a test
-# relying on this will fail (test_filename_changing_on_output_single_dir)
-Patch188: 00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
-
# 00189 #
# Add the rewheel module, allowing to recreate wheels from already installed
# ones
@@ -667,7 +652,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch170 -p1
%patch178 -p1
%patch180 -p1
-%patch188 -p1
%if %{with rewheel}
%patch189 -p1
@@ -1653,6 +1637,7 @@ fi
- Merge lib64 patches (104 into 102)
- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
- Remove patches 157 and 186, which had test changes left over after upstreaming
+- Remove patch 188, a temporary workaround for hashlib tests
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit d8970d7383e1377e69dde453fc1b19820aa2b77b
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 15:45:22 2017 +0200
Remove patch 186, which added a duplicate test
The actual change is upstream; the patch as it was just added an
inferior version of upstream's test_bad_coding.
diff --git a/00186-dont-raise-from-py_compile.patch
b/00186-dont-raise-from-py_compile.patch
deleted file mode 100644
index 25c4a9d..0000000
--- a/00186-dont-raise-from-py_compile.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff -r 7fa3e824a4ee Lib/test/test_py_compile.py
---- a/Lib/test/test_py_compile.py Tue Oct 29 22:25:06 2013 -0400
-+++ b/Lib/test/test_py_compile.py Wed Oct 30 11:08:31 2013 +0100
-@@ -54,6 +54,10 @@
- self.assertTrue(os.path.exists(self.pyc_path))
- self.assertFalse(os.path.exists(self.cache_path))
-
-+ def test_bad_coding(self):
-+ bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py')
-+ self.assertIsNone(py_compile.compile(bad_coding, doraise=False))
-+
- def test_relative_path(self):
- py_compile.compile(os.path.relpath(self.source_path),
- os.path.relpath(self.pyc_path))
diff --git a/python3.spec b/python3.spec
index b2fc811..3cffc87 100644
--- a/python3.spec
+++ b/python3.spec
@@ -328,15 +328,6 @@ Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# Not appropriate for upstream, Fedora-specific naming
Patch180: 00180-python-add-support-for-ppc64p7.patch
-# 00186 #
-# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=1023607
-# Previously, this fixed a problem where some *.py files were not being
-# bytecompiled properly during build. This was result of py_compile.compile
-# raising exception when trying to convert test file with bad encoding, and
-# thus not continuing bytecompilation for other files.
-# This was fixed upstream, but the test hasn't been merged yet, so we keep it
-Patch186: 00186-dont-raise-from-py_compile.patch
-
# 00188 #
# Downstream only patch that should be removed when we compile all guaranteed
# hashlib algorithms properly. The problem is this:
@@ -676,7 +667,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch170 -p1
%patch178 -p1
%patch180 -p1
-%patch186 -p1
%patch188 -p1
%if %{with rewheel}
@@ -1662,7 +1652,7 @@ fi
- Run autotools to generate the configure script before building
- Merge lib64 patches (104 into 102)
- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
-- Remove patch 157, which contained test changes left over after upstreaming
+- Remove patches 157 and 186, which had test changes left over after upstreaming
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit 720c2ade200e9c5ab1a13df5612a48cdbd8d6353
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 15:36:10 2017 +0200
Update comment for patch 170
diff --git a/python3.spec b/python3.spec
index 9792bb7..b2fc811 100644
--- a/python3.spec
+++ b/python3.spec
@@ -311,12 +311,10 @@ Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
# In debug builds, try to print repr() when a C-level assert fails in the
# garbage collector (typically indicating a reference-counting error
# somewhere else e.g in an extension module)
-# Backported to 2.7 from a patch I sent upstream for py3k
-#
http://bugs.python.org/issue9263
-# (
https://bugzilla.redhat.com/show_bug.cgi?id=614680)
-# hiding the proposed new macros/functions within gcmodule.c to avoid exposing
+# The new macros/functions within gcmodule.c are hidden to avoid exposing
# them within the extension API.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=850013
+# Sent upstream:
http://bugs.python.org/issue9263
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=614680
Patch170: 00170-gc-assertions.patch
# 00178 #
commit 61c2d437a2288473d392fa123371ae3806253e6d
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 15:29:04 2017 +0200
Remove patch 157, which contained test changes left over after upstreaming
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
deleted file mode 100644
index 03f3e02..0000000
--- a/00157-uid-gid-overflows.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
-index e9fdb07..ea60e6e 100644
---- a/Lib/test/test_os.py
-+++ b/Lib/test/test_os.py
-@@ -1723,30 +1723,36 @@ class PosixUidGidTests(unittest.TestCase):
- def test_setuid(self):
- if os.getuid() != 0:
- self.assertRaises(OSError, os.setuid, 0)
-+ self.assertRaises(TypeError, os.setuid, 'not an int')
- self.assertRaises(OverflowError, os.setuid, 1<<32)
-
- @unittest.skipUnless(hasattr(os, 'setgid'), 'test needs
os.setgid()')
- def test_setgid(self):
- if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(OSError, os.setgid, 0)
-+ self.assertRaises(TypeError, os.setgid, 'not an int')
- self.assertRaises(OverflowError, os.setgid, 1<<32)
-
- @unittest.skipUnless(hasattr(os, 'seteuid'), 'test needs
os.seteuid()')
- def test_seteuid(self):
- if os.getuid() != 0:
- self.assertRaises(OSError, os.seteuid, 0)
-+ self.assertRaises(TypeError, os.seteuid, 'not an int')
- self.assertRaises(OverflowError, os.seteuid, 1<<32)
-
- @unittest.skipUnless(hasattr(os, 'setegid'), 'test needs
os.setegid()')
- def test_setegid(self):
- if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(OSError, os.setegid, 0)
-+ self.assertRaises(TypeError, os.setegid, 'not an int')
- self.assertRaises(OverflowError, os.setegid, 1<<32)
-
- @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs
os.setreuid()')
- def test_setreuid(self):
- if os.getuid() != 0:
- self.assertRaises(OSError, os.setreuid, 0, 0)
-+ self.assertRaises(TypeError, os.setreuid, 'not an int', 0)
-+ self.assertRaises(TypeError, os.setreuid, 0, 'not an int')
- self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
- self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
-
-@@ -1762,6 +1768,8 @@ class PosixUidGidTests(unittest.TestCase):
- def test_setregid(self):
- if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(OSError, os.setregid, 0, 0)
-+ self.assertRaises(TypeError, os.setregid, 'not an int', 0)
-+ self.assertRaises(TypeError, os.setregid, 0, 'not an int')
- self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
- self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
-
-diff --git a/Lib/test/test_pwd.py b/Lib/test/test_pwd.py
-index ac9cff7..db98159 100644
---- a/Lib/test/test_pwd.py
-+++ b/Lib/test/test_pwd.py
-@@ -104,11 +104,11 @@ class PwdTest(unittest.TestCase):
- # In some cases, byuids isn't a complete list of all users in the
- # system, so if we try to pick a value not in byuids (via a perturbing
- # loop, say), pwd.getpwuid() might still be able to find data for that
-- # uid. Using sys.maxint may provoke the same problems, but hopefully
-+ # uid. Using 2**32 - 2 may provoke the same problems, but hopefully
- # it will be a more repeatable failure.
- # Android accepts a very large span of uids including sys.maxsize and
- # -1; it raises KeyError with 1 or 2 for example.
-- fakeuid = sys.maxsize
-+ fakeuid = 2**32 - 2
- self.assertNotIn(fakeuid, byuids)
- if not support.is_android:
- self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
diff --git a/python3.spec b/python3.spec
index 384b267..9792bb7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -293,22 +293,6 @@ Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
# See
https://bugzilla.redhat.com/show_bug.cgi?id=814391
Patch155: 00155-avoid-ctypes-thunks.patch
-# 00157 #
-# Update uid/gid handling throughout the standard library: uid_t and gid_t are
-# unsigned 32-bit values, but existing code often passed them through C long
-# values, which are signed 32-bit values on 32-bit architectures, leading to
-# negative int objects for uid/gid values >= 2^31 on 32-bit architectures.
-#
-# Introduce _PyObject_FromUid/Gid to convert uid_t/gid_t values to python
-# objects, using int objects where the value will fit (long objects otherwise),
-# and _PyArg_ParseUid/Gid to convert int/long to uid_t/gid_t, with -1 allowed
-# as a special case (since this is given special meaning by the chown syscall)
-#
-# Update standard library to use this throughout for uid/gid values, so that
-# very large uid/gid values are round-trippable, and -1 remains usable.
-# See
https://bugzilla.redhat.com/show_bug.cgi?id=697470
-Patch157: 00157-uid-gid-overflows.patch
-
# 00160 #
# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
# header files in the build chroot, but may not be supported in the running
@@ -689,7 +673,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch111 -p1
%patch132 -p1
%patch155 -p1
-%patch157 -p1
%patch160 -p1
%patch163 -p1
%patch170 -p1
@@ -1681,6 +1664,7 @@ fi
- Run autotools to generate the configure script before building
- Merge lib64 patches (104 into 102)
- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
+- Remove patch 157, which contained test changes left over after upstreaming
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit c4a5733df68f87f153e5efb3f4707be8b2b48d7e
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 15:04:48 2017 +0200
Use full URLs for bugzilla bugs
Seasoned packagers have pattern-matching circuits for "rhbz"
embedded in their brains, but for newcomers it's one more
opaque, non-googlable string.
The original comment for patch 00111 had a wrong bug number.
Correct it.
diff --git a/python3.spec b/python3.spec
index 30d1b12..384b267 100644
--- a/python3.spec
+++ b/python3.spec
@@ -267,7 +267,8 @@ Patch102: 00102-lib64.patch
# 00111 #
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
-# a libpythonMAJOR.MINOR.a (bug 550692):
+# a libpythonMAJOR.MINOR.a
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=556092
# Downstream only: not appropriate for upstream
Patch111: 00111-no-static-lib.patch
@@ -288,7 +289,8 @@ Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
# 00155 #
# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
# generating SELinux denials on "import ctypes" and "import uuid"
when
-# embedding Python within httpd (rhbz#814391)
+# embedding Python within httpd
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=814391
Patch155: 00155-avoid-ctypes-thunks.patch
# 00157 #
@@ -304,7 +306,7 @@ Patch155: 00155-avoid-ctypes-thunks.patch
#
# Update standard library to use this throughout for uid/gid values, so that
# very large uid/gid values are round-trippable, and -1 remains usable.
-# (rhbz#697470)
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=697470
Patch157: 00157-uid-gid-overflows.patch
# 00160 #
@@ -326,10 +328,11 @@ Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
# garbage collector (typically indicating a reference-counting error
# somewhere else e.g in an extension module)
# Backported to 2.7 from a patch I sent upstream for py3k
-#
http://bugs.python.org/issue9263 (rhbz#614680)
+#
http://bugs.python.org/issue9263
+# (
https://bugzilla.redhat.com/show_bug.cgi?id=614680)
# hiding the proposed new macros/functions within gcmodule.c to avoid exposing
# them within the extension API.
-# (rhbz#850013
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=850013
Patch170: 00170-gc-assertions.patch
# 00178 #
@@ -385,7 +388,7 @@ Patch206: 00206-remove-hf-from-arm-triplet.patch
# 00243 #
# Fix the triplet used on 64-bit MIPS
-# rhbz#1322526:
https://bugzilla.redhat.com/show_bug.cgi?id=1322526
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1322526
# Upstream uses Debian-like style mips64-linux-gnuabi64
# Fedora needs the default mips64-linux-gnu
Patch243: 00243-fix-mips64-triplet.patch
@@ -426,13 +429,13 @@ Patch271: 00271-asyncio-get-default-signal-handler.patch
# 00272 #
# Reject newline characters in ftplib.FTP.putline() arguments to
# avoid FTP protocol stream injection via malicious URLs.
-# rhbz#1478916
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1478916
# Fixed upstream:
http://bugs.python.org/issue30119
Patch272: 00272-fix-ftplib-to-reject-newlines.patch
# 00273 #
# Skip test_float_with_comma, which fails in Koji with UnicodeDecodeError
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
Patch273: 00273-skip-float-test.patch
# (New patches go here ^^^)
@@ -883,7 +886,8 @@ make install DESTDIR=%{buildroot} INSTALL="install -p"
EXTRA_CFLAGS="$MoreCFlags
#
# Initially I tried:
# /usr/lib/libpython3.1.so.1.0-gdb.py
- # but doing so generated noise when ldconfig was rerun (rhbz:562980)
+ # but doing so generated noise when ldconfig was rerun
+ # (see
https://bugzilla.redhat.com/show_bug.cgi?id=562980)
#
%if %{with gdb_hooks}
DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
@@ -1077,8 +1081,8 @@ for Module in %{buildroot}/%{dynload_dir}/*.so ; do
done
# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
-# avoid the user having to know the precise version and ABI flags. (see
-# e.g. rhbz#676748):
+# avoid the user having to know the precise version and ABI flags.
+# See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=676748
%if %{with debug_build}
ln -s \
%{_bindir}/python%{LDVERSION_debug} \
@@ -1154,7 +1158,8 @@ find %{buildroot} -type f -a -name "*.py" -print0 | \
PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
-# For ppc64 we need a larger stack than default (rhbz#1292462)
+# For ppc64 we need a larger stack than default
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1292462
%ifarch %{power64}
ulimit -a
ulimit -s 16384
@@ -1650,8 +1655,8 @@ fi
%endif # with debug_build
-# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from
-# ldconfig (rhbz:562980).
+# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from ldconfig
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=562980
#
# The /usr/lib/rpm/redhat/macros defines %__debug_package to use
# debugfiles.list, and it appears that everything below /usr/lib/debug and
@@ -1663,7 +1668,7 @@ fi
# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
# payload file would be unpackaged)
-# Workaround for rhbz#1476593
+# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=1476593
%undefine _debuginfo_subpackages
# ======================================================
commit bbf22253530becdede28441270a43749d01c3bbd
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 15:09:16 2017 +0200
Skip test_bdist_rpm using test config rather than a patch
Remove patch 137
diff --git a/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
b/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
deleted file mode 100644
index 0457093..0000000
--- a/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up
Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py.skip-distutils-tests-that-fail-in-rpmbuild
Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py
----
Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py.skip-distutils-tests-that-fail-in-rpmbuild 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py 2011-09-10 05:04:56.328852558
-0400
-@@ -23,6 +23,7 @@ setup(name='foo', version='0.1', py_modu
-
- """
-
-+(a)unittest._skipInRpmBuild("don't try to nest one rpm build inside another rpm
build")
- class BuildRpmTestCase(support.TempdirManager,
- support.EnvironGuard,
- support.LoggingSilencer,
-diff -up
Python-3.2.2/Lib/distutils/tests/test_build_ext.py.skip-distutils-tests-that-fail-in-rpmbuild
Python-3.2.2/Lib/distutils/tests/test_build_ext.py
diff --git a/python3.spec b/python3.spec
index 0e0277d..30d1b12 100644
--- a/python3.spec
+++ b/python3.spec
@@ -285,10 +285,6 @@ Patch111: 00111-no-static-lib.patch
# these unittest hooks in their own "check" phases)
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
-# 00137 #
-# Some tests within distutils fail when run in an rpmbuild:
-Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
-
# 00155 #
# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
# generating SELinux denials on "import ctypes" and "import uuid"
when
@@ -689,7 +685,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%endif
%patch111 -p1
%patch132 -p1
-%patch137 -p1
%patch155 -p1
%patch157 -p1
%patch160 -p1
@@ -1185,6 +1180,7 @@ CheckPython() {
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
-wW --slowest --findleaks \
-x test_distutils \
+ -x test_bdist_rpm \
%ifarch ppc64le aarch64
-x test_faulthandler \
%endif
@@ -1679,6 +1675,7 @@ fi
- Rename patch files to be consistent
- Run autotools to generate the configure script before building
- Merge lib64 patches (104 into 102)
+- Skip test_bdist_rpm using test config rather than a patch (removes patch 137)
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit 2c6abcc9a3523d218833c73d81a5528c44fd3ccf
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 14:52:51 2017 +0200
Merge lib64 patches into one (104 into 102)
It doean't make sense for these to be separate.
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 8e9ae4e..8eea66d 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -37,6 +37,20 @@ index 026cca7..6d3e077 100644
if standard_lib:
return libpython
else:
+diff a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py
+--- a/Lib/distutils/tests/test_install.py
++++ b/Lib/distutils/tests/test_install.py
+@@ -57,8 +57,9 @@
+ self.assertEqual(got, expected)
+
+ libdir = os.path.join(destination, "lib", "python")
++ platlibdir = os.path.join(destination, "lib64", "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"))
diff --git a/Lib/site.py b/Lib/site.py
index a84e3bb..ba0d3ea 100644
--- a/Lib/site.py
diff --git a/00104-lib64-fix-for-test_install.patch
b/00104-lib64-fix-for-test_install.patch
deleted file mode 100644
index 7852bf6..0000000
--- a/00104-lib64-fix-for-test_install.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- Python-2.7.2/Lib/distutils/tests/test_install.py.lib64 2011-09-08 17:51:57.851405376
-0400
-+++ Python-2.7.2/Lib/distutils/tests/test_install.py 2011-09-08 18:40:46.754205096 -0400
-@@ -41,8 +41,9 @@ class InstallTestCase(support.TempdirMan
- self.assertEqual(got, expected)
-
- libdir = os.path.join(destination, "lib", "python")
-+ platlibdir = os.path.join(destination, "lib64", "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"))
diff --git a/python3.spec b/python3.spec
index 03dae44..0e0277d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -259,12 +259,11 @@ Patch1: 00001-rpath.patch
# (where sys.getfilesystemencoding() == 'ascii')
Patch55: 00055-systemtap.patch
-Patch102: 00102-lib64.patch
-
-# 00104 #
+# 00102 #
+# Change the various install paths to use /usr/lib64/ instead or /usr/lib
# Only used when "%{_lib}" == "lib64"
-# Another lib64 fix, for distutils/tests/test_install.py; not upstream:
-Patch104: 00104-lib64-fix-for-test_install.patch
+# Not yet sent upstream.
+Patch102: 00102-lib64.patch
# 00111 #
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
@@ -687,7 +686,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%if "%{_lib}" == "lib64"
%patch102 -p1
-%patch104 -p1
%endif
%patch111 -p1
%patch132 -p1
@@ -1680,6 +1678,7 @@ fi
* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
- Rename patch files to be consistent
- Run autotools to generate the configure script before building
+- Merge lib64 patches (104 into 102)
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit 96a7bd540e8e742d856027cad62d3ecdeece2c4e
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 29 15:13:05 2017 +0200
Run autotools to generate the configure script before building
Partially fixes
https://bugzilla.redhat.com/show_bug.cgi?id=1377240
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 0ab0387..a48fe7c 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -25,66 +25,6 @@ diff -up Python-3.3.0rc2/configure.ac.systemtap
Python-3.3.0rc2/configure.ac
# -I${DLINCLDIR} is added to the compile rule for importdl.o
AC_SUBST(DLINCLDIR)
DLINCLDIR=.
-diff -up Python-3.3.0rc2/configure.systemtap Python-3.3.0rc2/configure
---- Python-3.3.0rc2/configure.systemtap 2012-09-09 05:11:14.000000000 -0400
-+++ Python-3.3.0rc2/configure 2012-09-10 09:17:21.116511780 -0400
-@@ -618,6 +618,8 @@ TRUE
- MACHDEP_OBJS
- DYNLOADFILE
- DLINCLDIR
-+SYSTEMTAPDEPS
-+SYSTEMTAPOBJS
- THREADOBJ
- LDLAST
- USE_THREAD_MODULE
-@@ -779,6 +781,7 @@ with_doc_strings
- with_tsc
- with_pymalloc
- with_valgrind
-+with_systemtap
- with_fpectl
- with_libm
- with_libc
-@@ -1456,6 +1459,7 @@ Optional Packages:
- --with(out)-tsc enable/disable timestamp counter profile
- --with(out)-pymalloc disable/enable specialized mallocs
- --with-valgrind Enable Valgrind support
-+ --with(out)-systemtap disable/enable SystemTap support
- --with-fpectl enable SIGFPE catching
- --with-libm=STRING math library
- --with-libc=STRING C library
-@@ -10065,6 +10069,31 @@ fi
- OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
- fi
-
-+# Check for systemtap support
-+# On Linux, /usr/bin/dtrace is in fact a shim to SystemTap
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-systemtap"
>&5
-+$as_echo_n "checking for --with-systemtap... " >&6; }
-+
-+# Check whether --with-systemtap was given.
-+if test "${with_systemtap+set}" = set; then :
-+ withval=$with_systemtap;
-+else
-+ with_systemtap=no
-+fi
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_systemtap" >&5
-+$as_echo "$with_systemtap" >&6; }
-+if test "$with_systemtap" != no; then
-+
-+$as_echo "#define WITH_SYSTEMTAP 1" >>confdefs.h
-+
-+ SYSTEMTAPOBJS="Python/pysystemtap.o"
-+ SYSTEMTAPDEPS="\$(srcdir)/Python/pysystemtap.h"
-+fi
-+
-+
-+
-+
- # -I${DLINCLDIR} is added to the compile rule for importdl.o
-
- DLINCLDIR=.
diff -up Python-3.3.0rc2/Doc/howto/index.rst.systemtap
Python-3.3.0rc2/Doc/howto/index.rst
--- Python-3.3.0rc2/Doc/howto/index.rst.systemtap 2012-09-09 05:10:51.000000000 -0400
+++ Python-3.3.0rc2/Doc/howto/index.rst 2012-09-10 09:17:21.117511779 -0400
diff --git a/python3.spec b/python3.spec
index e78a343..03dae44 100644
--- a/python3.spec
+++ b/python3.spec
@@ -733,11 +733,21 @@ sed --in-place \
%patch5001 -p1
+# Remove files that should be generated by the build
+# (This is after patching, so that we can use patches directly from upstream)
+rm configure pyconfig.h.in
+
+
# ======================================================
# Configuring and building the code:
# ======================================================
%build
+
+# Regenerate the configure script and pyconfig.h.in
+autoconf
+autoheader
+
topdir=$(pwd)
export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
@@ -1669,6 +1679,7 @@ fi
%changelog
* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
- Rename patch files to be consistent
+- Run autotools to generate the configure script before building
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
commit d27ccf60331245da0ce1229a6a0597cc3d4087a9
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 14:45:54 2017 +0200
Rename patch files to start with the number
A consistent naming scheme makes managing patch files easier.
diff --git a/00001-rpath.patch b/00001-rpath.patch
new file mode 100644
index 0000000..9fae54c
--- /dev/null
+++ b/00001-rpath.patch
@@ -0,0 +1,19 @@
+diff -up Python-3.1.1/Lib/distutils/unixccompiler.py.rpath
Python-3.1.1/Lib/distutils/unixccompiler.py
+--- Python-3.1.1/Lib/distutils/unixccompiler.py.rpath 2009-09-04 17:29:34.000000000
-0400
++++ Python-3.1.1/Lib/distutils/unixccompiler.py 2009-09-04 17:49:54.000000000 -0400
+@@ -141,6 +141,15 @@ class UnixCCompiler(CCompiler):
+ if sys.platform == "cygwin":
+ exe_extension = ".exe"
+
++ def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
++ """Remove standard library path from rpath"""
++ libraries, library_dirs, runtime_library_dirs = super()._fix_lib_args(
++ libraries, library_dirs, runtime_library_dirs)
++ libdir = sysconfig.get_config_var('LIBDIR')
++ if runtime_library_dirs and (libdir in runtime_library_dirs):
++ runtime_library_dirs.remove(libdir)
++ return libraries, library_dirs, runtime_library_dirs
++
+ def preprocess(self, source, output_file=None, macros=None,
+ include_dirs=None, extra_preargs=None, extra_postargs=None):
+ fixed_args = self._fix_compile_args(None, macros, include_dirs)
diff --git a/05001-powerppc-arch.patch b/05001-powerppc-arch.patch
new file mode 100644
index 0000000..10f0201
--- /dev/null
+++ b/05001-powerppc-arch.patch
@@ -0,0 +1,30 @@
+diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
+--- Python-3.5.0/configure.ac.than 2015-11-13 11:51:32.039560172 -0500
++++ Python-3.5.0/configure.ac 2015-11-13 11:52:11.670168157 -0500
+@@ -804,9 +804,9 @@ cat >> conftest.c <<EOF
+ powerpc-linux-gnuspe
+ # elif defined(__powerpc64__)
+ # if defined(__LITTLE_ENDIAN__)
+- powerpc64le-linux-gnu
++ ppc64le-linux-gnu
+ # else
+- powerpc64-linux-gnu
++ ppc64-linux-gnu
+ # endif
+ # elif defined(__powerpc__)
+ powerpc-linux-gnu
+diff -up Python-3.5.0/configure.than Python-3.5.0/configure
+--- Python-3.5.0/configure.than 2015-11-13 12:13:19.039658399 -0500
++++ Python-3.5.0/configure 2015-11-13 12:13:35.199906857 -0500
+@@ -5153,9 +5153,9 @@ cat >> conftest.c <<EOF
+ powerpc-linux-gnuspe
+ # elif defined(__powerpc64__)
+ # if defined(__LITTLE_ENDIAN__)
+- powerpc64le-linux-gnu
++ ppc64le-linux-gnu
+ # else
+- powerpc64-linux-gnu
++ ppc64-linux-gnu
+ # endif
+ # elif defined(__powerpc__)
+ powerpc-linux-gnu
diff --git a/Python-3.1.1-rpath.patch b/Python-3.1.1-rpath.patch
deleted file mode 100644
index 9fae54c..0000000
--- a/Python-3.1.1-rpath.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-diff -up Python-3.1.1/Lib/distutils/unixccompiler.py.rpath
Python-3.1.1/Lib/distutils/unixccompiler.py
---- Python-3.1.1/Lib/distutils/unixccompiler.py.rpath 2009-09-04 17:29:34.000000000
-0400
-+++ Python-3.1.1/Lib/distutils/unixccompiler.py 2009-09-04 17:49:54.000000000 -0400
-@@ -141,6 +141,15 @@ class UnixCCompiler(CCompiler):
- if sys.platform == "cygwin":
- exe_extension = ".exe"
-
-+ def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
-+ """Remove standard library path from rpath"""
-+ libraries, library_dirs, runtime_library_dirs = super()._fix_lib_args(
-+ libraries, library_dirs, runtime_library_dirs)
-+ libdir = sysconfig.get_config_var('LIBDIR')
-+ if runtime_library_dirs and (libdir in runtime_library_dirs):
-+ runtime_library_dirs.remove(libdir)
-+ return libraries, library_dirs, runtime_library_dirs
-+
- def preprocess(self, source, output_file=None, macros=None,
- include_dirs=None, extra_preargs=None, extra_postargs=None):
- fixed_args = self._fix_compile_args(None, macros, include_dirs)
diff --git a/python3-powerppc-arch.patch b/python3-powerppc-arch.patch
deleted file mode 100644
index 10f0201..0000000
--- a/python3-powerppc-arch.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
---- Python-3.5.0/configure.ac.than 2015-11-13 11:51:32.039560172 -0500
-+++ Python-3.5.0/configure.ac 2015-11-13 11:52:11.670168157 -0500
-@@ -804,9 +804,9 @@ cat >> conftest.c <<EOF
- powerpc-linux-gnuspe
- # elif defined(__powerpc64__)
- # if defined(__LITTLE_ENDIAN__)
-- powerpc64le-linux-gnu
-+ ppc64le-linux-gnu
- # else
-- powerpc64-linux-gnu
-+ ppc64-linux-gnu
- # endif
- # elif defined(__powerpc__)
- powerpc-linux-gnu
-diff -up Python-3.5.0/configure.than Python-3.5.0/configure
---- Python-3.5.0/configure.than 2015-11-13 12:13:19.039658399 -0500
-+++ Python-3.5.0/configure 2015-11-13 12:13:35.199906857 -0500
-@@ -5153,9 +5153,9 @@ cat >> conftest.c <<EOF
- powerpc-linux-gnuspe
- # elif defined(__powerpc64__)
- # if defined(__LITTLE_ENDIAN__)
-- powerpc64le-linux-gnu
-+ ppc64le-linux-gnu
- # else
-- powerpc64-linux-gnu
-+ ppc64-linux-gnu
- # endif
- # elif defined(__powerpc__)
- powerpc-linux-gnu
diff --git a/python3.spec b/python3.spec
index 14fd81e..e78a343 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
@@ -247,9 +247,10 @@ Source10: idle3.desktop
# AppData file for idle3
Source11: idle3.appdata.xml
+# 00001 #
# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
# Was Patch0 in ivazquez' python3000 specfile:
-Patch1: Python-3.1.1-rpath.patch
+Patch1: 00001-rpath.patch
# 00055 #
# Systemtap support: add statically-defined probe points
@@ -448,9 +449,10 @@ Patch273: 00273-skip-float-test.patch
#
#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+# 05001 #
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
-Patch5001: python3-powerppc-arch.patch
+Patch5001: 05001-powerppc-arch.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
@@ -1665,6 +1667,9 @@ fi
# ======================================================
%changelog
+* Mon Aug 28 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-13
+- Rename patch files to be consistent
+
* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
- Use python3 style of calling super() without arguments in rpath
patch to prevent recursion in UnixCCompiler subclasses
commit eef42fd7ea9065fbb33026ca99ffd86566e14567
Author: Michal Cyprian <m.cyprian(a)gmail.com>
Date: Wed Aug 30 14:52:53 2017 +0200
Use python3 style of calling super() without arguments in rpath patch
diff --git a/Python-3.1.1-rpath.patch b/Python-3.1.1-rpath.patch
index 1493af2..9fae54c 100644
--- a/Python-3.1.1-rpath.patch
+++ b/Python-3.1.1-rpath.patch
@@ -1,15 +1,14 @@
diff -up Python-3.1.1/Lib/distutils/unixccompiler.py.rpath
Python-3.1.1/Lib/distutils/unixccompiler.py
--- Python-3.1.1/Lib/distutils/unixccompiler.py.rpath 2009-09-04 17:29:34.000000000
-0400
+++ Python-3.1.1/Lib/distutils/unixccompiler.py 2009-09-04 17:49:54.000000000 -0400
-@@ -141,6 +141,16 @@ class UnixCCompiler(CCompiler):
+@@ -141,6 +141,15 @@ class UnixCCompiler(CCompiler):
if sys.platform == "cygwin":
exe_extension = ".exe"
+ def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
+ """Remove standard library path from rpath"""
-+ libraries, library_dirs, runtime_library_dirs = super(
-+ self.__class__, self)._fix_lib_args(libraries, library_dirs,
-+ runtime_library_dirs)
++ libraries, library_dirs, runtime_library_dirs = super()._fix_lib_args(
++ libraries, library_dirs, runtime_library_dirs)
+ libdir = sysconfig.get_config_var('LIBDIR')
+ if runtime_library_dirs and (libdir in runtime_library_dirs):
+ runtime_library_dirs.remove(libdir)
diff --git a/python3.spec b/python3.spec
index 7509aa4..14fd81e 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@ URL:
https://www.python.org/
# WARNING When rebasing to a new Python version,
# remember to update the python3-docs package as well
Version: %{pybasever}.2
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
@@ -1665,6 +1665,11 @@ fi
# ======================================================
%changelog
+* Mon Aug 28 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-12
+- Use python3 style of calling super() without arguments in rpath
+ patch to prevent recursion in UnixCCompiler subclasses
+Resolves: rhbz#1458122
+
* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
- Add bcond for --without optimizations
- Reword package descriptions
commit b7855d36446510a3c4ec7ef746ea9a365bd5dd3c
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Mon Aug 28 15:20:28 2017 +0200
Add a warning about updating python3-docs
diff --git a/python3.spec b/python3.spec
index a9ced53..7509aa4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -11,6 +11,8 @@ URL:
https://www.python.org/
# pybasever without the dot:
%global pyshortver 36
+# WARNING When rebasing to a new Python version,
+# remember to update the python3-docs package as well
Version: %{pybasever}.2
Release: 11%{?dist}
License: Python
commit 37ed19d2c94ab30382c72a63cc868ba4d24c6f4b
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 28 13:36:04 2017 +0200
Add forgotten patch file
diff --git a/00273-skip-float-test.patch b/00273-skip-float-test.patch
new file mode 100644
index 0000000..233d3ed
--- /dev/null
+++ b/00273-skip-float-test.patch
@@ -0,0 +1,12 @@
+diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
+index 66726d6496d..3318fa5df59 100644
+--- a/Lib/test/test_float.py
++++ b/Lib/test/test_float.py
+@@ -141,6 +141,7 @@ class GeneralFloatCases(unittest.TestCase):
+ # non-UTF-8 byte string
+ check(b'123\xa0')
+
++ @unittest.skip('Fails in Koji:
https://bugzilla.redhat.com/show_bug.cgi?id=1484497')
+ @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
+ def test_float_with_comma(self):
+ # set locale to something that doesn't use '.' for the decimal
point
commit 74f6a3d59e42c71b4e3629646c72281e62c2f277
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Wed Aug 23 23:42:09 2017 +0200
Skip failing test_float_with_comma
I am unable to reproduce this bug outside of a build environment.
Skip the test to make Python build again.
Bug filed:
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
diff --git a/python3.spec b/python3.spec
index d6a255a..a9ced53 100644
--- a/python3.spec
+++ b/python3.spec
@@ -432,6 +432,11 @@ Patch271: 00271-asyncio-get-default-signal-handler.patch
# Fixed upstream:
http://bugs.python.org/issue30119
Patch272: 00272-fix-ftplib-to-reject-newlines.patch
+# 00273 #
+# Skip test_float_with_comma, which fails in Koji with UnicodeDecodeError
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1484497
+Patch273: 00273-skip-float-test.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -710,6 +715,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch270 -p1
%patch271 -p1
%patch272 -p1
+%patch273 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1661,6 +1667,7 @@ fi
- Add bcond for --without optimizations
- Reword package descriptions
- Remove Group declarations
+- Skip failing test_float_with_comma
* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
commit 094ccc055a177934c80400f03c6dca93e2ba3148
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 22 16:55:51 2017 +0200
Reword comments for descriptions and subpackage metadata
diff --git a/python3.spec b/python3.spec
index 5602119..d6a255a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -447,12 +447,13 @@ Patch5001: python3-powerppc-arch.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
-# ======================================================
-# Additional metadata, and subpackages
-# ======================================================
+# ==========================================
+# Descriptions, and metadata for subpackages
+# ==========================================
-# See notes in bug 532118:
+# Packages with Python modules in standard locations automatically
+# depend on python(abi). Provide that here.
Provides: python(abi) = %{pybasever}
# For backward compatibility only, remove in F29:
@@ -508,10 +509,14 @@ Summary: Python runtime libraries
# prevent "import pyexpat" from failing with a linker error if someone
hasn't
# yet upgraded expat:
Requires: expat >= 2.1.0
+
+# The "enum" module is included in the standard library.
+# Provide an upgrade path from the external library.
Provides: python3-enum34 = 1.0.4-5%{?dist}
Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
-# Python 3 built with glibc >= 2.24.90-26 needs to require it (rhbz#1410644).
+# Python 3 built with glibc >= 2.24.90-26 needs to require it
+# See
https://bugzilla.redhat.com/show_bug.cgi?id=1410644
Requires: glibc%{?_isa} >= 2.24.90-26
# For backward compatibility only, remove in F29:
@@ -519,7 +524,6 @@ Provides: system-python-libs = %{version}-%{release}
Provides: system-python-libs%{?_isa} = %{version}-%{release}
Obsoletes: system-python-libs < %{version}-%{release}
-
%description libs
This package contains runtime libraries for use by Python:
- the majority of the Python standard library
commit 44bb068a8e3509fa1a113deb97509beb8847d7f7
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 22 16:10:31 2017 +0200
Top-level metadata: move URL, reword Summary
diff --git a/python3.spec b/python3.spec
index ea4777b..5602119 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,8 @@
# ==================
Name: python3
-Summary: Version 3 of the Python programming language aka Python 3000
+Summary: Interpreter of the Python programming language
+URL:
https://www.python.org/
%global pybasever 3.6
@@ -450,7 +451,6 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-root
# Additional metadata, and subpackages
# ======================================================
-URL:
https://www.python.org/
# See notes in bug 532118:
Provides: python(abi) = %{pybasever}
commit 737c23e8071caa7a8ac9573b677f1af3977f362c
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 22 17:00:09 2017 +0200
Remove unused patches
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
deleted file mode 100644
index e0cdce0..0000000
--- a/00146-hashlib-fips.patch
+++ /dev/null
@@ -1,640 +0,0 @@
-diff --git a/Lib/hashlib.py b/Lib/hashlib.py
-index 316cece..b7ad879 100644
---- a/Lib/hashlib.py
-+++ b/Lib/hashlib.py
-@@ -23,6 +23,16 @@ the zlib module.
- Choose your hash function wisely. Some have known collision weaknesses.
- sha384 and sha512 will be slow on 32 bit platforms.
-
-+If the underlying implementation supports "FIPS mode", and this is enabled,
it
-+may restrict the available hashes to only those that are compliant with FIPS
-+regulations. For example, it may deny the use of MD5, on the grounds that this
-+is not secure for uses such as authentication, system integrity checking, or
-+digital signatures. If you need to use such a hash for non-security purposes
-+(such as indexing into a data structure for speed), you can override the keyword
-+argument "usedforsecurity" from True to False to signify that your code is
not
-+relying on the hash for security purposes, and this will allow the hash to be
-+usable even in FIPS mode.
-+
- Hash objects have these methods:
- - update(arg): Update the hash object with the bytes in arg. Repeated calls
- are equivalent to a single call with the concatenation of all
-@@ -62,6 +72,18 @@ algorithms_available = set(__always_supported)
- __all__ = __always_supported + ('new', 'algorithms_guaranteed',
- 'algorithms_available', 'pbkdf2_hmac')
-
-+import functools
-+def __ignore_usedforsecurity(func):
-+ """Used for sha3_* functions. Until OpenSSL implements them, we want
-+ to use them from Python _sha3 module, but we want them to accept
-+ usedforsecurity argument too."""
-+ # TODO: remove this function when OpenSSL implements sha3
-+ @functools.wraps(func)
-+ def inner(*args, **kwargs):
-+ if 'usedforsecurity' in kwargs:
-+ kwargs.pop('usedforsecurity')
-+ return func(*args, **kwargs)
-+ return inner
-
- __builtin_constructor_cache = {}
-
-@@ -100,31 +122,39 @@ def __get_openssl_constructor(name):
- f = getattr(_hashlib, 'openssl_' + name)
- # Allow the C module to raise ValueError. The function will be
- # defined but the hash not actually available thanks to OpenSSL.
-- f()
-+ # We pass "usedforsecurity=False" to disable FIPS-based restrictions:
-+ # at this stage we're merely seeing if the function is callable,
-+ # rather than using it for actual work.
-+ f(usedforsecurity=False)
- # Use the C function directly (very fast)
- return f
- except (AttributeError, ValueError):
-+ # TODO: We want to just raise here when OpenSSL implements sha3
-+ # because we want to make sure that Fedora uses everything from OpenSSL
- return __get_builtin_constructor(name)
-
-
--def __py_new(name, data=b''):
-- """new(name, data=b'') - Return a new hashing object using
the named algorithm;
-- optionally initialized with data (which must be bytes).
-+def __py_new(name, data=b'', usedforsecurity=True):
-+ """new(name, data=b'', usedforsecurity=True) - Return a new
hashing object using
-+ the named algorithm; optionally initialized with data (which must be bytes).
-+ The 'usedforsecurity' keyword argument does nothing, and is for
compatibilty
-+ with the OpenSSL implementation
- """
- return __get_builtin_constructor(name)(data)
-
-
--def __hash_new(name, data=b''):
-- """new(name, data=b'') - Return a new hashing object using
the named algorithm;
-- optionally initialized with data (which must be bytes).
-+def __hash_new(name, data=b'', usedforsecurity=True):
-+ """new(name, data=b'', usedforsecurity=True) - Return a new
hashing object using
-+ the named algorithm; optionally initialized with data (which must be bytes).
-+
-+ Override 'usedforsecurity' to False when using for non-security purposes in
-+ a FIPS environment
- """
- try:
-- return _hashlib.new(name, data)
-+ return _hashlib.new(name, data, usedforsecurity)
- except ValueError:
-- # If the _hashlib module (OpenSSL) doesn't support the named
-- # hash, try using our builtin implementations.
-- # This allows for SHA224/256 and SHA384/512 support even though
-- # the OpenSSL library prior to 0.9.8 doesn't provide them.
-+ # TODO: We want to just raise here when OpenSSL implements sha3
-+ # because we want to make sure that Fedora uses everything from OpenSSL
- return __get_builtin_constructor(name)(data)
-
-
-@@ -207,7 +237,10 @@ for __func_name in __always_supported:
- # try them all, some may not work due to the OpenSSL
- # version not supporting that algorithm.
- try:
-- globals()[__func_name] = __get_hash(__func_name)
-+ func = __get_hash(__func_name)
-+ if 'sha3_' in __func_name:
-+ func = __ignore_usedforsecurity(func)
-+ globals()[__func_name] = func
- except ValueError:
- import logging
- logging.exception('code for hash %s was not found.', __func_name)
-@@ -215,3 +248,4 @@ for __func_name in __always_supported:
- # Cleanup locals()
- del __always_supported, __func_name, __get_hash
- del __py_new, __hash_new, __get_openssl_constructor
-+del __ignore_usedforsecurity
-\ No newline at end of file
-diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
-index c9b113e..60e2392 100644
---- a/Lib/test/test_hashlib.py
-+++ b/Lib/test/test_hashlib.py
-@@ -24,7 +24,22 @@ from test.support import _4G, bigmemtest, import_fresh_module
- COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
-
- c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
--py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
-+# skipped on Fedora, since we always use OpenSSL implementation
-+# py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
-+
-+def openssl_enforces_fips():
-+ # Use the "openssl" command (if present) to try to determine if the local
-+ # OpenSSL is configured to enforce FIPS
-+ from subprocess import Popen, PIPE
-+ try:
-+ p = Popen(['openssl', 'md5'],
-+ stdin=PIPE, stdout=PIPE, stderr=PIPE)
-+ except OSError:
-+ # "openssl" command not found
-+ return False
-+ stdout, stderr = p.communicate(input=b'abc')
-+ return b'unknown cipher' in stderr
-+OPENSSL_ENFORCES_FIPS = openssl_enforces_fips()
-
- def hexstr(s):
- assert isinstance(s, bytes), repr(s)
-@@ -34,6 +49,16 @@ def hexstr(s):
- r += h[(i >> 4) & 0xF] + h[i & 0xF]
- return r
-
-+# hashlib and _hashlib-based functions support a "usedforsecurity" keyword
-+# argument, and FIPS mode requires that it be used overridden with a False
-+# value for these selftests to work. Other cryptographic code within Python
-+# doesn't support this keyword.
-+# Modify a function to one in which "usedforsecurity=False" is added to the
-+# keyword arguments:
-+def suppress_fips(f):
-+ def g(*args, **kwargs):
-+ return f(*args, usedforsecurity=False, **kwargs)
-+ return g
-
- class HashLibTestCase(unittest.TestCase):
- supported_hash_names = ( 'md5', 'MD5', 'sha1',
'SHA1',
-@@ -63,11 +88,11 @@ class HashLibTestCase(unittest.TestCase):
- # For each algorithm, test the direct constructor and the use
- # of hashlib.new given the algorithm name.
- for algorithm, constructors in self.constructors_to_test.items():
-- constructors.add(getattr(hashlib, algorithm))
-+ constructors.add(suppress_fips(getattr(hashlib, algorithm)))
- def _test_algorithm_via_hashlib_new(data=None, _alg=algorithm):
- if data is None:
-- return hashlib.new(_alg)
-- return hashlib.new(_alg, data)
-+ return suppress_fips(hashlib.new)(_alg)
-+ return suppress_fips(hashlib.new)(_alg, data)
- constructors.add(_test_algorithm_via_hashlib_new)
-
- _hashlib = self._conditional_import_module('_hashlib')
-@@ -79,27 +104,12 @@ class HashLibTestCase(unittest.TestCase):
- for algorithm, constructors in self.constructors_to_test.items():
- constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
- if constructor:
-- constructors.add(constructor)
-+ constructors.add(suppress_fips(constructor))
-
- def add_builtin_constructor(name):
- constructor = getattr(hashlib, "__get_builtin_constructor")(name)
- self.constructors_to_test[name].add(constructor)
-
-- _md5 = self._conditional_import_module('_md5')
-- if _md5:
-- add_builtin_constructor('md5')
-- _sha1 = self._conditional_import_module('_sha1')
-- if _sha1:
-- add_builtin_constructor('sha1')
-- _sha256 = self._conditional_import_module('_sha256')
-- if _sha256:
-- add_builtin_constructor('sha224')
-- add_builtin_constructor('sha256')
-- _sha512 = self._conditional_import_module('_sha512')
-- if _sha512:
-- add_builtin_constructor('sha384')
-- add_builtin_constructor('sha512')
--
- super(HashLibTestCase, self).__init__(*args, **kwargs)
-
- @property
-@@ -148,9 +158,6 @@ class HashLibTestCase(unittest.TestCase):
- else:
- del sys.modules['_md5']
- self.assertRaises(TypeError, get_builtin_constructor, 3)
-- constructor = get_builtin_constructor('md5')
-- self.assertIs(constructor, _md5.md5)
-- self.assertEqual(sorted(builtin_constructor_cache), ['MD5',
'md5'])
-
- def test_hexdigest(self):
- for cons in self.hash_constructors:
-@@ -433,6 +440,64 @@ class HashLibTestCase(unittest.TestCase):
-
- self.assertEqual(expected_hash, hasher.hexdigest())
-
-+ def test_issue9146(self):
-+ # Ensure that various ways to use "MD5" from "hashlib"
don't segfault:
-+ m = hashlib.md5(usedforsecurity=False)
-+ m.update(b'abc\n')
-+ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
-+
-+ m = hashlib.new('md5', usedforsecurity=False)
-+ m.update(b'abc\n')
-+ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
-+
-+ m = hashlib.md5(b'abc\n', usedforsecurity=False)
-+ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
-+
-+ m = hashlib.new('md5', b'abc\n', usedforsecurity=False)
-+ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
-+
-+ @unittest.skipUnless(OPENSSL_ENFORCES_FIPS,
-+ 'FIPS enforcement required for this test.')
-+ def test_hashlib_fips_mode(self):
-+ # Ensure that we raise a ValueError on vanilla attempts to use MD5
-+ # in hashlib in a FIPS-enforced setting:
-+ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
-+ m = hashlib.md5()
-+
-+ if not self._conditional_import_module('_md5'):
-+ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
-+ m = hashlib.new('md5')
-+
-+ @unittest.skipUnless(OPENSSL_ENFORCES_FIPS,
-+ 'FIPS enforcement required for this test.')
-+ def test_hashopenssl_fips_mode(self):
-+ # Verify the _hashlib module's handling of md5:
-+ _hashlib = self._conditional_import_module('_hashlib')
-+ if _hashlib:
-+ assert hasattr(_hashlib, 'openssl_md5')
-+
-+ # Ensure that _hashlib raises a ValueError on vanilla attempts to
-+ # use MD5 in a FIPS-enforced setting:
-+ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
-+ m = _hashlib.openssl_md5()
-+ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
-+ m = _hashlib.new('md5')
-+
-+ # Ensure that in such a setting we can whitelist a callsite with
-+ # usedforsecurity=False and have it succeed:
-+ m = _hashlib.openssl_md5(usedforsecurity=False)
-+ m.update(b'abc\n')
-+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
-+
-+ m = _hashlib.new('md5', usedforsecurity=False)
-+ m.update(b'abc\n')
-+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
-+
-+ m = _hashlib.openssl_md5(b'abc\n', usedforsecurity=False)
-+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
-+
-+ m = _hashlib.new('md5', b'abc\n', usedforsecurity=False)
-+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
-
- class KDFTests(unittest.TestCase):
-
-@@ -516,7 +581,7 @@ class KDFTests(unittest.TestCase):
- out = pbkdf2(hash_name='sha1', password=b'password',
salt=b'salt',
- iterations=1, dklen=None)
- self.assertEqual(out, self.pbkdf2_results['sha1'][0][0])
--
-+ @unittest.skip('skipped on Fedora, as we always use OpenSSL pbkdf2_hmac')
- def test_pbkdf2_hmac_py(self):
- self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac)
-
-diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
-index 44765ac..b8cf490 100644
---- a/Modules/_hashopenssl.c
-+++ b/Modules/_hashopenssl.c
-@@ -20,6 +20,8 @@
-
-
- /* EVP is the preferred interface to hashing in OpenSSL */
-+#include <openssl/ssl.h>
-+#include <openssl/err.h>
- #include <openssl/evp.h>
- #include <openssl/hmac.h>
- /* We use the object interface to discover what hashes OpenSSL supports. */
-@@ -45,11 +47,19 @@ typedef struct {
-
- static PyTypeObject EVPtype;
-
-+/* Struct to hold all the cached information we need on a specific algorithm.
-+ We have one of these per algorithm */
-+typedef struct {
-+ PyObject *name_obj;
-+ EVP_MD_CTX ctxs[2];
-+ /* ctx_ptrs will point to ctxs unless an error occurred, when it will
-+ be NULL: */
-+ EVP_MD_CTX *ctx_ptrs[2];
-+ PyObject *error_msgs[2];
-+} EVPCachedInfo;
-
--#define DEFINE_CONSTS_FOR_NEW(Name) \
-- static PyObject *CONST_ ## Name ## _name_obj = NULL; \
-- static EVP_MD_CTX CONST_new_ ## Name ## _ctx; \
-- static EVP_MD_CTX *CONST_new_ ## Name ## _ctx_p = NULL;
-+#define DEFINE_CONSTS_FOR_NEW(Name) \
-+ static EVPCachedInfo cached_info_ ##Name;
-
- DEFINE_CONSTS_FOR_NEW(md5)
- DEFINE_CONSTS_FOR_NEW(sha1)
-@@ -92,6 +102,48 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len)
- }
- }
-
-+static void
-+mc_ctx_init(EVP_MD_CTX *ctx, int usedforsecurity)
-+{
-+ EVP_MD_CTX_init(ctx);
-+
-+ /*
-+ If the user has declared that this digest is being used in a
-+ non-security role (e.g. indexing into a data structure), set
-+ the exception flag for openssl to allow it
-+ */
-+ if (!usedforsecurity) {
-+#ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW
-+ EVP_MD_CTX_set_flags(ctx,
-+ EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
-+#endif
-+ }
-+}
-+
-+/* Get an error msg for the last error as a PyObject */
-+static PyObject *
-+error_msg_for_last_error(void)
-+{
-+ char *errstr;
-+
-+ errstr = ERR_error_string(ERR_peek_last_error(), NULL);
-+ ERR_clear_error();
-+
-+ return PyUnicode_FromString(errstr); /* Can be NULL */
-+}
-+
-+static void
-+set_evp_exception(void)
-+{
-+ char *errstr;
-+
-+ errstr = ERR_error_string(ERR_peek_last_error(), NULL);
-+ ERR_clear_error();
-+
-+ PyErr_SetString(PyExc_ValueError, errstr);
-+}
-+
-+
- /* Internal methods for a hash object */
-
- static void
-@@ -259,15 +311,16 @@ EVP_repr(EVPobject *self)
- static int
- EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds)
- {
-- static char *kwlist[] = {"name", "string", NULL};
-+ static char *kwlist[] = {"name", "string",
"usedforsecurity", NULL};
- PyObject *name_obj = NULL;
- PyObject *data_obj = NULL;
-+ int usedforsecurity = 1;
- Py_buffer view;
- char *nameStr;
- const EVP_MD *digest;
-
-- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:HASH", kwlist,
-- &name_obj, &data_obj)) {
-+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:HASH", kwlist,
-+ &name_obj, &data_obj,
&usedforsecurity)) {
- return -1;
- }
-
-@@ -288,7 +341,12 @@ EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds)
- PyBuffer_Release(&view);
- return -1;
- }
-- EVP_DigestInit(&self->ctx, digest);
-+ mc_ctx_init(&self->ctx, usedforsecurity);
-+ if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
-+ set_evp_exception();
-+ PyBuffer_Release(&view);
-+ return -1;
-+ }
-
- self->name = name_obj;
- Py_INCREF(self->name);
-@@ -372,7 +430,8 @@ static PyTypeObject EVPtype = {
- static PyObject *
- EVPnew(PyObject *name_obj,
- const EVP_MD *digest, const EVP_MD_CTX *initial_ctx,
-- const unsigned char *cp, Py_ssize_t len)
-+ const unsigned char *cp, Py_ssize_t len,
-+ int usedforsecurity)
- {
- EVPobject *self;
-
-@@ -387,7 +446,12 @@ EVPnew(PyObject *name_obj,
- if (initial_ctx) {
- EVP_MD_CTX_copy(&self->ctx, initial_ctx);
- } else {
-- EVP_DigestInit(&self->ctx, digest);
-+ mc_ctx_init(&self->ctx, usedforsecurity);
-+ if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
-+ set_evp_exception();
-+ Py_DECREF(self);
-+ return NULL;
-+ }
- }
-
- if (cp && len) {
-@@ -411,21 +475,29 @@ PyDoc_STRVAR(EVP_new__doc__,
- An optional string argument may be provided and will be\n\
- automatically hashed.\n\
- \n\
--The MD5 and SHA1 algorithms are always supported.\n");
-+The MD5 and SHA1 algorithms are always supported.\n\
-+\n\
-+An optional \"usedforsecurity=True\" keyword argument is provided for use
in\n\
-+environments that enforce FIPS-based restrictions. Some implementations of\n\
-+OpenSSL can be configured to prevent the usage of non-secure algorithms (such\n\
-+as MD5). If you have a non-security use for these algorithms (e.g. a hash\n\
-+table), you can override this argument by marking the callsite as\n\
-+\"usedforsecurity=False\".");
-
- static PyObject *
- EVP_new(PyObject *self, PyObject *args, PyObject *kwdict)
- {
-- static char *kwlist[] = {"name", "string", NULL};
-+ static char *kwlist[] = {"name", "string",
"usedforsecurity", NULL};
- PyObject *name_obj = NULL;
- PyObject *data_obj = NULL;
-+ int usedforsecurity = 1;
- Py_buffer view = { 0 };
- PyObject *ret_obj;
- char *name;
- const EVP_MD *digest;
-
-- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|O:new", kwlist,
-- &name_obj, &data_obj)) {
-+ if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|Oi:new", kwlist,
-+ &name_obj, &data_obj,
&usedforsecurity)) {
- return NULL;
- }
-
-@@ -439,7 +511,8 @@ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict)
-
- digest = EVP_get_digestbyname(name);
-
-- ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, view.len);
-+ ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, view.len,
-+ usedforsecurity);
-
- if (data_obj)
- PyBuffer_Release(&view);
-@@ -722,57 +795,114 @@ generate_hash_name_list(void)
-
-
- /*
-- * This macro generates constructor function definitions for specific
-- * hash algorithms. These constructors are much faster than calling
-- * the generic one passing it a python string and are noticably
-- * faster than calling a python new() wrapper. Thats important for
-+ * This macro and function generates a family of constructor function
-+ * definitions for specific hash algorithms. These constructors are much
-+ * faster than calling the generic one passing it a python string and are
-+ * noticably faster than calling a python new() wrapper. That's important for
- * code that wants to make hashes of a bunch of small strings.
- */
- #define GEN_CONSTRUCTOR(NAME) \
- static PyObject * \
-- EVP_new_ ## NAME (PyObject *self, PyObject *args) \
-+ EVP_new_ ## NAME (PyObject *self, PyObject *args, PyObject *kwdict) \
- { \
-- PyObject *data_obj = NULL; \
-- Py_buffer view = { 0 }; \
-- PyObject *ret_obj; \
-- \
-- if (!PyArg_ParseTuple(args, "|O:" #NAME , &data_obj)) { \
-- return NULL; \
-- } \
-- \
-- if (data_obj) \
-- GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); \
-- \
-- ret_obj = EVPnew( \
-- CONST_ ## NAME ## _name_obj, \
-- NULL, \
-- CONST_new_ ## NAME ## _ctx_p, \
-- (unsigned char*)view.buf, \
-- view.len); \
-- \
-- if (data_obj) \
-- PyBuffer_Release(&view); \
-- return ret_obj; \
-+ return implement_specific_EVP_new(self, args, kwdict, \
-+ "|Oi:" #NAME, \
-+ &cached_info_ ## NAME ); \
- }
-
-+static PyObject *
-+implement_specific_EVP_new(PyObject *self, PyObject *args, PyObject *kwdict,
-+ const char *format,
-+ EVPCachedInfo *cached_info)
-+{
-+ static char *kwlist[] = {"string", "usedforsecurity", NULL};
-+ PyObject *data_obj = NULL;
-+ Py_buffer view = { 0 };
-+ int usedforsecurity = 1;
-+ int idx;
-+ PyObject *ret_obj = NULL;
-+
-+ assert(cached_info);
-+
-+ if (!PyArg_ParseTupleAndKeywords(args, kwdict, format, kwlist,
-+ &data_obj, &usedforsecurity)) {
-+ return NULL;
-+ }
-+
-+ if (data_obj)
-+ GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view);
-+
-+ idx = usedforsecurity ? 1 : 0;
-+
-+ /*
-+ * If an error occurred during creation of the global content, the ctx_ptr
-+ * will be NULL, and the error_msg will hopefully be non-NULL:
-+ */
-+ if (cached_info->ctx_ptrs[idx]) {
-+ /* We successfully initialized this context; copy it: */
-+ ret_obj = EVPnew(cached_info->name_obj,
-+ NULL,
-+ cached_info->ctx_ptrs[idx],
-+ (unsigned char*)view.buf, view.len,
-+ usedforsecurity);
-+ } else {
-+ /* Some kind of error happened initializing the global context for
-+ this (digest, usedforsecurity) pair.
-+ Raise an exception with the saved error message: */
-+ if (cached_info->error_msgs[idx]) {
-+ PyErr_SetObject(PyExc_ValueError, cached_info->error_msgs[idx]);
-+ } else {
-+ PyErr_SetString(PyExc_ValueError, "Error initializing hash");
-+ }
-+ }
-+
-+ if (data_obj)
-+ PyBuffer_Release(&view);
-+
-+ return ret_obj;
-+}
-+
- /* a PyMethodDef structure for the constructor */
- #define CONSTRUCTOR_METH_DEF(NAME) \
-- {"openssl_" #NAME, (PyCFunction)EVP_new_ ## NAME, METH_VARARGS, \
-+ {"openssl_" #NAME, (PyCFunction)EVP_new_ ## NAME, \
-+ METH_VARARGS|METH_KEYWORDS, \
- PyDoc_STR("Returns a " #NAME \
- " hash object; optionally initialized with a string") \
- }
-
--/* used in the init function to setup a constructor: initialize OpenSSL
-- constructor constants if they haven't been initialized already. */
--#define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \
-- if (CONST_ ## NAME ## _name_obj == NULL) { \
-- CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
-- if (EVP_get_digestbyname(#NAME)) { \
-- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
-- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME));
\
-- } \
-- } \
-+/*
-+ Macro/function pair to set up the constructors.
-+
-+ Try to initialize a context for each hash twice, once with
-+ EVP_MD_CTX_FLAG_NON_FIPS_ALLOW and once without.
-+
-+ Any that have errors during initialization will end up with a NULL ctx_ptrs
-+ entry, and err_msgs will be set (unless we're very low on memory)
-+*/
-+#define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \
-+ init_constructor_constant(&cached_info_ ## NAME, #NAME); \
- } while (0);
-+static void
-+init_constructor_constant(EVPCachedInfo *cached_info, const char *name)
-+{
-+ assert(cached_info);
-+ cached_info->name_obj = PyUnicode_FromString(name);
-+ if (EVP_get_digestbyname(name)) {
-+ int i;
-+ for (i=0; i<2; i++) {
-+ mc_ctx_init(&cached_info->ctxs[i], i);
-+ if (EVP_DigestInit_ex(&cached_info->ctxs[i],
-+ EVP_get_digestbyname(name), NULL)) {
-+ /* Success: */
-+ cached_info->ctx_ptrs[i] = &cached_info->ctxs[i];
-+ } else {
-+ /* Failure: */
-+ cached_info->ctx_ptrs[i] = NULL;
-+ cached_info->error_msgs[i] = error_msg_for_last_error();
-+ }
-+ }
-+ }
-+}
-
- GEN_CONSTRUCTOR(md5)
- GEN_CONSTRUCTOR(sha1)
-@@ -819,13 +949,10 @@ PyInit__hashlib(void)
- {
- PyObject *m, *openssl_md_meth_names;
-
-- OpenSSL_add_all_digests();
-- ERR_load_crypto_strings();
-+ SSL_load_error_strings();
-+ SSL_library_init();
-
-- /* TODO build EVP_functions openssl_* entries dynamically based
-- * on what hashes are supported rather than listing many
-- * but having some be unsupported. Only init appropriate
-- * constants. */
-+ OpenSSL_add_all_digests();
-
- Py_TYPE(&EVPtype) = &PyType_Type;
- if (PyType_Ready(&EVPtype) < 0)
diff --git a/python3.spec b/python3.spec
index 299d446..ea4777b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -282,38 +282,10 @@ Patch111: 00111-no-static-lib.patch
# these unittest hooks in their own "check" phases)
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
-# 00133 #
-# 00133-skip-test_dl.patch is not relevant for python3: the "dl" module no
-# longer exists
-
# 00137 #
# Some tests within distutils fail when run in an rpmbuild:
Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
-# 00146 #
-# Support OpenSSL FIPS mode (e.g. when OPENSSL_FORCE_FIPS_MODE=1 is set)
-# - handle failures from OpenSSL (e.g. on attempts to use MD5 in a
-# FIPS-enforcing environment)
-# - add a new "usedforsecurity" keyword argument to the various digest
-# algorithms in hashlib so that you can whitelist a callsite with
-# "usedforsecurity=False"
-# (sent upstream for python 3 as
http://bugs.python.org/issue9216 ; see RHEL6
-# python patch 119)
-# - enforce usage of the _hashlib implementation: don't fall back to the _md5
-# and _sha* modules (leading to clearer error messages if fips selftests
-# fail)
-# - don't build the _md5 and _sha* modules; rely on the _hashlib implementation
-# of hashlib
-# (rhbz#563986)
-# Note: Up to Python 3.4.0.b1, upstream had their own implementation of what
-# they assumed would become sha3. This patch was adapted to give it the
-# usedforsecurity argument, even though it did nothing (OpenSSL didn't have
-# sha3 implementation at that time).In 3.4.0.b2, sha3 implementation was reverted
-# (see
http://bugs.python.org/issue16113), but the alterations were left in the
-# patch, since they may be useful again if upstream decides to rerevert sha3
-# implementation and OpenSSL still doesn't support it. For now, they're
harmless.
-Patch146: 00146-hashlib-fips.patch
-
# 00155 #
# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
# generating SELinux denials on "import ctypes" and "import uuid"
when
@@ -707,7 +679,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch111 -p1
%patch132 -p1
%patch137 -p1
-#patch146 -p1
%patch155 -p1
%patch157 -p1
%patch160 -p1
commit f50a7d31c33b2a1c07a731d342650094cca15f49
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 22 15:48:41 2017 +0200
Reword and expand comment on Provides/Obsoletes of pythonXY
diff --git a/python3.spec b/python3.spec
index c93ea50..299d446 100644
--- a/python3.spec
+++ b/python3.spec
@@ -491,13 +491,17 @@ Obsoletes: system-python < %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-# In order to support multiple python interpreters, apart from the system python3,
-# for development purposes, new packages were introduced which can be installed in
parallel
-# with the main python3 package (e.g. 1369688), with the naming scheme
'python<version>',
-# however in order to keep the upgrade path clean we need to Obsolete and Provide
-# these packages at the main python3 package.
-Obsoletes: python%{pyshortver}
+# In order to support multiple Python interpreters for development purposes,
+# packages with with the naming scheme pythonXY (e.g. python35) exist for
+# non-default versions of Python 3.
+# For consistency, and to keep the upgrade path clean, we Provide/Obsolete
+# these names here.
Provides: python%{pyshortver} = %{version}-%{release}
+# Note that using Obsoletes without package version is not standard practice.
+# Here we assert that *any* version of the system's default interpreter is
+# preferable to an "extra" interpreter. For example, python3-3.6.1 will
+# replace python36-3.6.2.
+Obsoletes: python%{pyshortver}
%if %{with rewheel}
Requires: python3-setuptools
commit 1824b3ec27d93d66a828424cb50651cf904a79b4
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 22 14:24:22 2017 +0200
Use configuration macro instead of workaround to disable byte-compilation
diff --git a/python3.spec b/python3.spec
index 56c9a70..c93ea50 100644
--- a/python3.spec
+++ b/python3.spec
@@ -141,26 +141,10 @@ License: Python
%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
-# We want to byte-compile the .py files within the packages using the new
-# python3 binary.
-#
-# Unfortunately, rpmbuild's infrastructure requires us to jump through some
-# hoops to avoid byte-compiling with the system python 2 version:
-# /usr/lib/rpm/redhat/macros sets up build policy that (amongst other things)
-# defines __os_install_post. In particular, "brp-python-bytecompile" is
-# invoked without an argument thus using the wrong version of python
-# (/usr/bin/python, rather than the freshly built python), thus leading to
-# numerous syntax errors, and incorrect magic numbers in the .pyc files. We
-# thus override __os_install_post to avoid invoking this script:
-%global __os_install_post /usr/lib/rpm/brp-compress \
- %{!?__debug_package:/usr/lib/rpm/brp-strip %{__strip}} \
- /usr/lib/rpm/brp-strip-static-archive %{__strip} \
- /usr/lib/rpm/brp-strip-comment-note %{__strip} %{__objdump} \
- /usr/lib/rpm/brp-python-hardlink
-# to remove the invocation of brp-python-bytecompile, whilst keeping the
-# invocation of brp-python-hardlink (since this should still work for python3
-# pyc/pyo files)
-
+# Disable automatic bytecompilation. The python3 binary is not yet be
+# available in /usr/bin when Python is built. Also, the bytecompilation fails
+# on files that test invalid syntax.
+%undefine py_auto_byte_compile
# =======================
# Build-time requirements
commit 66c621f01a02d349242fb2f56215d6f92feb31f9
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 22 14:33:31 2017 +0200
Re-alphabetize the BuidRequires section
diff --git a/python3.spec b/python3.spec
index 6d54414..56c9a70 100644
--- a/python3.spec
+++ b/python3.spec
@@ -172,6 +172,7 @@ BuildRequires: autoconf
BuildRequires: bluez-libs-devel
BuildRequires: bzip2
BuildRequires: bzip2-devel
+BuildRequires: desktop-file-utils
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# it (in pyexpat) in order to enable the fix in Python-3.2.3 for CVE-2012-0876:
@@ -184,23 +185,22 @@ BuildRequires: gdbm-devel
%endif
BuildRequires: glibc-devel
BuildRequires: gmp-devel
+BuildRequires: libappstream-glib
BuildRequires: libffi-devel
BuildRequires: libGL-devel
BuildRequires: libX11-devel
BuildRequires: ncurses-devel
+
# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
BuildRequires: net-tools
+
BuildRequires: openssl-devel
BuildRequires: pkgconfig
BuildRequires: readline-devel
BuildRequires: sqlite-devel
-BuildRequires: desktop-file-utils
-BuildRequires: libappstream-glib
BuildRequires: systemtap-sdt-devel
BuildRequires: systemtap-devel
-# (this introduces a dependency on "python", in that systemtap-sdt-devel's
-# /usr/bin/dtrace is a python 2 script)
%global tapsetdir /usr/share/systemtap/tapset
BuildRequires: tar
commit 88b30e0657489f40599836434c0e2bf38666b5f4
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Tue Aug 22 14:21:01 2017 +0200
Remove duplicate globals
diff --git a/python3.spec b/python3.spec
index 6e099cc..6d54414 100644
--- a/python3.spec
+++ b/python3.spec
@@ -978,16 +978,6 @@ install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/
%global _pyconfig_h %{_pyconfig32_h}
%endif
-# ABIFLAGS, LDVERSION and SOABI are in the upstream Makefile
-%global ABIFLAGS_optimized m
-%global ABIFLAGS_debug dm
-
-%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
-%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
-
%if %{with debug_build}
%global PyIncludeDirs python%{LDVERSION_optimized} python%{LDVERSION_debug}
commit c2f871903561b5e01179c60d0dfc549520215467
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Mon Aug 21 13:46:14 2017 +0200
Reword package summaries and descriptions
Also, remove Group tags
diff --git a/python3.spec b/python3.spec
index c97e919..6e099cc 100644
--- a/python3.spec
+++ b/python3.spec
@@ -521,25 +521,27 @@ Requires: python3-pip
%endif
%description
-Python is an interpreted, interactive, object-oriented programming
-language often compared to Tcl, Perl, Scheme or Java. Python includes
-modules, classes, exceptions, very high level dynamic data types
-and dynamic typing. Python supports interfaces to many system calls and
-libraries, as well as to various windowing systems (X11, Motif, Tk,
-Mac and MFC).
+Python is an accessible, high-level, dynamically typed, interpreted programming
+language, designed with an emphasis on code readibility.
+It includes an extensive standard library, and has a vast ecosystem of
+third-party libraries.
-Programmers can write new built-in modules for Python in C or C++.
-Python can be used as an extension language for applications that
-need a programmable interface.
+This package provides the "python3" executable: the reference interpreter for
+the Python language, version 3.
+The majority of its standard library is provided in the %{name}-libs package,
+which should be installed automatically along with %{name}.
+The remaining parts of the Python standard library are broken out into the
+%{name}-tkinter and %{name}-test packages, which may need to be installed
+separately.
-Note that documentation for Python is provided in the python3-docs package.
+Documentation for Python is provided in the %{name}-docs package.
+
+Packages containing additional libraries for Python are generally named with
+the "%{name}-" prefix.
-This package provides the "python3" executable; most of the actual
-implementation is within the "python3-libs" package.
%package libs
Summary: Python runtime libraries
-Group: Development/Libraries
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# this symbol (in pyexpat), so we must explicitly state this dependency to
@@ -560,13 +562,13 @@ Obsoletes: system-python-libs < %{version}-%{release}
%description libs
This package contains runtime libraries for use by Python:
-- the libpython dynamic library, for use by applications that embed Python as
-a scripting language, and by the main "python3" executable
-- the Python standard library
+- the majority of the Python standard library
+- a dynamically linked library for use by applications that embed Python as
+ a scripting language, and by the main "python3" executable
+
%package devel
Summary: Libraries and header files needed for Python development
-Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
BuildRequires: python-rpm-macros
@@ -576,19 +578,15 @@ Requires: python3-rpm-generators
Conflicts: %{name} < %{version}-%{release}
%description devel
-The Python programming language's interpreter can be extended with
-dynamically loaded extensions and can be embedded in other programs.
-This package contains the header files and libraries needed to do
-these types of tasks.
+This package contains the header files and configuration needed to compile
+Python extension modules (typically written in C or C++), to embed Python
+into other programs, and to make binary distributions for Python libraries.
+
+It also contains the necessary macros to build RPM packages with Python modules.
-Install python3-devel if you want to develop Python extensions. The
-python3 package will also need to be installed. You'll probably also
-want to install the python3-docs package, which contains Python
-documentation.
%package tools
Summary: A collection of tools included with Python including 2to3 and idle
-Group: Development/Tools
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tkinter = %{version}-%{release}
@@ -598,12 +596,13 @@ Provides: 2to3 = %{version}-%{release}
Provides: idle3 = %{version}-%{release}
%description tools
-This package contains several tools included with Python including 2to3
-and idle.
+This package contains several tools included with Python, including:
+- 2to3, an automatic source converter from Python 2.X
+- idle, a basic graphical development environment
+
%package tkinter
Summary: A GUI toolkit for Python
-Group: Development/Languages
Requires: %{name} = %{version}-%{release}
#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
@@ -613,27 +612,27 @@ Conflicts: python2-tools < 2.7.13-17
Conflicts: python-tools < 2.7.13-17
%description tkinter
-The Tkinter (Tk interface) program is a graphical user interface for
-the Python scripting language.
+The Tkinter (Tk interface) library is a graphical user interface toolkit for
+the Python programming language.
+
%package test
-Summary: The test modules from the main python3 package
-Group: Development/Languages
+Summary: The self-test suite for the main python3 package
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tools = %{version}-%{release}
+
%description test
-The test modules from the main %{name} package.
-These are in a separate package to save space, as they are almost never used
-in production.
+The self-test suite for the Python interpreter.
+
+This is only useful to test Python itself. For testing general Python code,
+you should use the unittest module from %{name}-libs, or a library such as
+${name}-pytest or ${name}-nose.
-You might want to install the python3-test package if you're developing
-python code that uses more than just unittest and/or test_support.py.
%if %{with debug_build}
%package debug
Summary: Debug version of the Python runtime
-Group: Applications/System
# The debug build is an all-in-one package version of the regular build, and
# shares the same .py/.pyc files and directories as the regular build. Hence
@@ -647,22 +646,24 @@ Requires: %{name}-tools%{?_isa} = %{version}-%{release}
%description debug
python3-debug provides a version of the Python runtime with numerous debugging
-features enabled, aimed at advanced Python users, such as developers of Python
+features enabled, aimed at advanced Python users such as developers of Python
extension modules.
This version uses more memory and will be slower than the regular Python build,
-but is useful for tracking down reference-counting issues, and other bugs.
+but is useful for tracking down reference-counting issues and other bugs.
-The bytecodes are unchanged, so that .pyc files are compatible between the two
-versions of Python, but the debugging features mean that C/C++ extension
-modules are ABI-incompatible with those built for the standard runtime.
+The bytecode format is unchanged, so that .pyc files are compatible between
+this and the standard version of Python, but the debugging features mean that
+C/C++ extension modules are ABI-incompatible and must be built for each version
+separately.
-It shares installation directories with the standard Python runtime, so that
-.py and .pyc files can be shared. All compiled extension modules gain a "_d"
-suffix ("foo_d.so" rather than "foo.so") so that each Python
implementation
-can load its own extensions.
+The debug build shares installation directories with the standard Python
+runtime, so that .py and .pyc files can be shared.
+Compiled extension modules use a special ABI flag ("d") in the filename,
+so extensions for both verisons can co-exist in the same directory.
%endif # with debug_build
+
# ======================================================
# The prep phase of the build:
# ======================================================
@@ -1705,6 +1706,8 @@ fi
%changelog
* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
- Add bcond for --without optimizations
+- Reword package descriptions
+- Remove Group declarations
* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
commit 59c11e6706753fc7935c99c103272c6dd44487d1
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Thu Aug 17 09:41:37 2017 +0200
Revise the bootstrapping notes
diff --git a/python3.spec b/python3.spec
index 74c0525..c97e919 100644
--- a/python3.spec
+++ b/python3.spec
@@ -66,17 +66,23 @@ License: Python
# Notes from bootstraping Python 3.6
# ==================================
#
+# New Python major version (3.X) break ABI and bytecode compatibility,
+# so all packages depending on it need to be rebuilt.
+#
# Due to a dependency cycle between Python, gdb, rpm, pip, setuptools, wheel,
-# and other packages, in order to rebase Python 3 one has to build in the
-# following order:
+# and other packages, this isn't straightforward.
+# Build in the following order:
#
# 1. At the same time:
-# - gdb without python support (add %%global _without_python 1 on top of gdb's
SPEC file)
+# - gdb without python support (add %%global _without_python 1 on top of
+# gdb's SPEC file)
# - python-rpm-generators with bootstrapping_python set to 1
# (this can be done also during step 2., but should be done before 3.)
-# 2. python3 with rewheel set to 0
+# 2. python3 without rewheel (use %%bcond_with rewheel instead of
+# %%bcond_without)
# 3. At the same time:
-# - gdb with python support (remove %%global _without_python 1 on top of gdb's
SPEC file)
+# - gdb with python support (remove %%global _without_python 1 on top of
+# gdb's SPEC file)
# - python-rpm-generators with bootstrapping_python set to 0
# (this can be done at any later step without negative effects)
# 4. rpm
@@ -86,15 +92,13 @@ License: Python
# 8. python-setuptools with bootstrap set to 0 and also with_check set to 0
# 9. python-pip with build_wheel set to 1
# 10. pyparsing
-# 11. python3 with rewheel set to 1
-#
-# Then the most important packages have to be built, starting from their
-# various leaf dependencies recursively. After these have been built, a
-# targeted rebuild should be requested for the rest.
+# 11. python3 with rewheel
#
-# Currently these packages are recommended to have been built before a targeted
-# rebuild after a python abi change:
+# Then the most important packages have to be built, in dependency order.
+# These were:
# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt
+#
+# After these have been built, a targeted rebuild should be done for the rest.
# =====================
commit 0c74e1153226d2a1029164b3ba6a07645b99ddc4
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Thu Aug 17 09:18:50 2017 +0200
Remove historical information from the global macros section
diff --git a/python3.spec b/python3.spec
index fe90cd0..74c0525 100644
--- a/python3.spec
+++ b/python3.spec
@@ -104,15 +104,8 @@ License: Python
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
-# SOABI is defined in the upstream configure.in from Python-3.2a2 onwards,
-# for PEP 3149:
-#
http://www.python.org/dev/peps/pep-3149/
-
-# ("configure.in" became "configure.ac" in Python 3.3 onwards, and
in
-# backports)
-
-# ABIFLAGS, LDVERSION and SOABI are in the upstream Makefile
-# With Python 3.3, we lose the "u" suffix due to PEP 393
+# ABIFLAGS, LDVERSION and SOABI are in the upstream configure.ac
+# See PEP 3149 for some background:
http://www.python.org/dev/peps/pep-3149/
%global ABIFLAGS_optimized m
%global ABIFLAGS_debug dm
@@ -122,13 +115,12 @@ License: Python
%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
-# All bytecode files are now in a __pycache__ subdirectory, with a name
-# reflecting the version of the bytecode (to permit sharing of python libraries
-# between different runtimes)
-# See
http://www.python.org/dev/peps/pep-3147/
+# All bytecode files are in a __pycache__ subdirectory, with a name
+# reflecting the version of the bytecode.
+# See PEP 3147:
http://www.python.org/dev/peps/pep-3147/
# For example,
# foo/bar.py
-# now has bytecode at:
+# has bytecode at:
# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
commit f63e273cfd439aa9d4515eadee335361717ef014
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Thu Aug 17 09:13:29 2017 +0200
Document configuration options
diff --git a/python3.spec b/python3.spec
index a57ae0a..fe90cd0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -22,24 +22,42 @@ License: Python
# Note that the bcond macros are named for the CLI option they create.
# "%%bcond_without" means "ENABLE by default and create a --without
option"
+# Expensive optimizations (mainly, profile-guided optimizations)
%ifarch %{ix86} x86_64
%bcond_without optimizations
%else
+# On some architectures, the optimized build takes tens of hours, possibly
+# longer than Koji's 24-hour timeout. Disable optimizations here.
%bcond_with optimizations
%endif
+# Run the test suite in %%check
%bcond_without tests
+
+# Ability to reuse RPM-installed pip using rewheel
%bcond_without rewheel
+
+# Extra build for debugging the interpreter or C-API extensions
+# (the -debug subpackages)
%bcond_without debug_build
+
+# Support for the GDB debugger
%bcond_without gdb_hooks
+
+# Support for systemtap instrumentation
%bcond_with systemtap
+
+# The dbm.gnu module (key-value database)
%bcond_without gdbm
+
+# Main interpreter loop optimization
%bcond_without computed_gotos
-# some arches don't have valgrind so we need to disable its support on them
+# Support for the Valgrind debugger/profiler
%ifnarch s390 %{mips} riscv64
%bcond_without valgrind
%else
+# Some arches don't have valgrind, disable support for it there.
%bcond_with valgrind
%endif
commit a7a170bba67e240d7ced975a3cc8ad114caa54b5
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Wed Aug 16 17:55:57 2017 +0200
Add bcond for --without optimizations
diff --git a/python3.spec b/python3.spec
index 98ec2e7..a57ae0a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -11,7 +11,7 @@ Summary: Version 3 of the Python programming language aka Python 3000
%global pyshortver 36
Version: %{pybasever}.2
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
@@ -22,6 +22,12 @@ License: Python
# Note that the bcond macros are named for the CLI option they create.
# "%%bcond_without" means "ENABLE by default and create a --without
option"
+%ifarch %{ix86} x86_64
+%bcond_without optimizations
+%else
+%bcond_with optimizations
+%endif
+
%bcond_without tests
%bcond_without rewheel
%bcond_without debug_build
@@ -832,11 +838,11 @@ BuildPython debug \
BuildPython optimized \
python \
python%{pybasever} \
-%ifarch %{ix86} x86_64
+%if %{with optimizations}
"--without-ensurepip --enable-optimizations" \
%else
- "--without-ensurepip" \
-%endif
+ "--without-ensurepip --disable-optimizations" \
+%endif # with optimizations
true
# ======================================================
@@ -1683,6 +1689,9 @@ fi
# ======================================================
%changelog
+* Mon Aug 21 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-11
+- Add bcond for --without optimizations
+
* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
commit 11efc8ea599184f57531e16dee37967645557c2c
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Aug 21 13:33:07 2017 +0200
Remove system-python
diff --git a/macros.systempython b/macros.systempython
index b7d1e91..314cd45 100644
--- a/macros.systempython
+++ b/macros.systempython
@@ -1,4 +1 @@
-%system_python_abi %{expand: \
-%global __requires_exclude ^python\\\\(abi\\\\) = 3\\\\..$
-Requires: system-python(abi) = %{python3_version}
-}
+%system_python_abi %{expand: }
diff --git a/python3.spec b/python3.spec
index 3eec686..98ec2e7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -11,7 +11,7 @@ Summary: Version 3 of the Python programming language aka Python 3000
%global pyshortver 36
Version: %{pybasever}.2
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
@@ -230,7 +230,8 @@ Source7: pyfuntop.stp
# Written by bkabrda
Source8: check-pyc-and-pyo-timestamps.py
-# A simple macro that enables packages to require system-python(abi) instead of
python(abi)
+# Backward compatible no-op macro for system-python
+# Remove in Fedora 29
Source9: macros.systempython
# Desktop menu entry for idle3
@@ -478,6 +479,12 @@ URL:
https://www.python.org/
# See notes in bug 532118:
Provides: python(abi) = %{pybasever}
+# For backward compatibility only, remove in F29:
+Provides: system-python(abi) = %{pybasever}
+Provides: system-python = %{version}-%{release}
+Provides: system-python%{?_isa} = %{version}-%{release}
+Obsoletes: system-python < %{version}-%{release}
+
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
# In order to support multiple python interpreters, apart from the system python3,
@@ -508,17 +515,11 @@ need a programmable interface.
Note that documentation for Python is provided in the python3-docs package.
This package provides the "python3" executable; most of the actual
-implementation is within the "python3-libs" and "system-python-libs"
packages.
+implementation is within the "python3-libs" package.
%package libs
Summary: Python runtime libraries
Group: Development/Libraries
-# For Modularity purpose we need not to include the dist-tag int he dependency
-%if %(d="%{?dist}"; [ "${d#module-base-runtime-}x" !=
"${d}x" ] && echo 1 || echo 0)
-Requires: system-python-libs%{?_isa} = %{version}
-%else
-Requires: system-python-libs%{?_isa} = %{version}-%{release}
-%endif
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# this symbol (in pyexpat), so we must explicitly state this dependency to
@@ -528,36 +529,21 @@ Requires: expat >= 2.1.0
Provides: python3-enum34 = 1.0.4-5%{?dist}
Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
+# Python 3 built with glibc >= 2.24.90-26 needs to require it (rhbz#1410644).
+Requires: glibc%{?_isa} >= 2.24.90-26
+
+# For backward compatibility only, remove in F29:
+Provides: system-python-libs = %{version}-%{release}
+Provides: system-python-libs%{?_isa} = %{version}-%{release}
+Obsoletes: system-python-libs < %{version}-%{release}
+
+
%description libs
This package contains runtime libraries for use by Python:
- the libpython dynamic library, for use by applications that embed Python as
a scripting language, and by the main "python3" executable
- the Python standard library
-%package -n system-python
-Summary: System Python executable
-Group: Development/Libraries
-Requires: system-python-libs%{?_isa} = %{version}-%{release}
-Provides: system-python(abi) = %{pybasever}
-
-%description -n system-python
-System Python provides a binary interpreter which uses system-python-libs,
-a subset of standard Python library considered essential to run various tools,
-requiring Python, that consider themselves "system tools".
-
-%package -n system-python-libs
-Summary: System Python runtime libraries
-Group: Development/Libraries
-
-%define __requires_exclude ^(/usr/bin/python3.*|python\\(abi\\) = 3\\..*)$
-
-Requires: expat >= 2.1.0
-# Python 3 built with glibc >= 2.24.90-26 needs to require it (rhbz#1410644).
-Requires: glibc%{?_isa} >= 2.24.90-26
-
-%description -n system-python-libs
-This package contains files used to embed System Python into applications.
-
%package devel
Summary: Libraries and header files needed for Python development
Group: Development/Libraries
@@ -1163,9 +1149,10 @@ echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_debug}-`uname -m`
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
%endif # with debug_build
-# System Python: Copy the executable to libexec
+# System Python: Link the executable to libexec
+# This is for backwards compatibility only and should be removed in Fedora 29
mkdir -p %{buildroot}%{_libexecdir}
-cp %{buildroot}%{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
+ln -s %{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
# ======================================================
@@ -1247,10 +1234,6 @@ rm -fr %{buildroot}
%postun libs -p /sbin/ldconfig
-%post -n system-python-libs -p /sbin/ldconfig
-
-%postun -n system-python-libs -p /sbin/ldconfig
-
%post
/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
@@ -1274,12 +1257,17 @@ fi
%{_bindir}/pyvenv
%{_bindir}/pyvenv-%{pybasever}
%{_mandir}/*/*
+# Remove in Fedora 29:
+%{_libexecdir}/system-python
%files libs
%defattr(-,root,root,-)
%license LICENSE
%doc README.rst
+%dir %{pylibdir}
+%dir %{dynload_dir}
+
%{pylibdir}/lib2to3
%exclude %{pylibdir}/lib2to3/tests
@@ -1338,21 +1326,6 @@ fi
%{pylibdir}/pydoc_data
-##################################################################################
-
-%files -n system-python
-%defattr(-,root,root,-)
-%license LICENSE
-%doc README.rst
-%{_libexecdir}/system-python
-
-%files -n system-python-libs
-%defattr(-,root,root,-)
-%license LICENSE
-%doc README.rst
-%dir %{pylibdir}
-%dir %{dynload_dir}
-
%{dynload_dir}/_blake2.%{SOABI_optimized}.so
%{dynload_dir}/_md5.%{SOABI_optimized}.so
%{dynload_dir}/_sha1.%{SOABI_optimized}.so
@@ -1710,6 +1683,9 @@ fi
# ======================================================
%changelog
+* Mon Aug 21 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-10
+- Remove system-python, see
https://fedoraproject.org/wiki/Changes/Platform_Python_Stack
+
* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
- Use bconds for configuring the build
- Reorganize the initial sections
commit 043c57400a624abc9d42acbb060d3b19019c50b2
Author: Petr Viktorin <pviktori(a)redhat.com>
Date: Wed Aug 16 15:36:04 2017 +0200
Use bconds for configuring the build
This makes configuring the build much easier, at least with
rpmbuild and mock.
Also, reorganize the initial sections, where the config options
were scattered.
diff --git a/python3.spec b/python3.spec
index cc950f3..3eec686 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1,8 +1,46 @@
-# ======================================================
-# Conditionals and other variables controlling the build
-# ======================================================
+# ==================
+# Top-level metadata
+# ==================
+
+Name: python3
+Summary: Version 3 of the Python programming language aka Python 3000
+
+%global pybasever 3.6
-# NOTES ON BOOTSTRAPING PYTHON 3.6:
+# pybasever without the dot:
+%global pyshortver 36
+
+Version: %{pybasever}.2
+Release: 9%{?dist}
+License: Python
+
+
+# ==================================
+# Conditionals controlling the build
+# ==================================
+
+# Note that the bcond macros are named for the CLI option they create.
+# "%%bcond_without" means "ENABLE by default and create a --without
option"
+
+%bcond_without tests
+%bcond_without rewheel
+%bcond_without debug_build
+%bcond_without gdb_hooks
+%bcond_with systemtap
+%bcond_without gdbm
+%bcond_without computed_gotos
+
+# some arches don't have valgrind so we need to disable its support on them
+%ifnarch s390 %{mips} riscv64
+%bcond_without valgrind
+%else
+%bcond_with valgrind
+%endif
+
+
+# ==================================
+# Notes from bootstraping Python 3.6
+# ==================================
#
# Due to a dependency cycle between Python, gdb, rpm, pip, setuptools, wheel,
# and other packages, in order to rebase Python 3 one has to build in the
@@ -12,7 +50,7 @@
# - gdb without python support (add %%global _without_python 1 on top of gdb's
SPEC file)
# - python-rpm-generators with bootstrapping_python set to 1
# (this can be done also during step 2., but should be done before 3.)
-# 2. python3 with with_rewheel set to 0
+# 2. python3 with rewheel set to 0
# 3. At the same time:
# - gdb with python support (remove %%global _without_python 1 on top of gdb's
SPEC file)
# - python-rpm-generators with bootstrapping_python set to 0
@@ -24,7 +62,7 @@
# 8. python-setuptools with bootstrap set to 0 and also with_check set to 0
# 9. python-pip with build_wheel set to 1
# 10. pyparsing
-# 11. python3 with with_rewheel set to 1
+# 11. python3 with rewheel set to 1
#
# Then the most important packages have to be built, starting from their
# various leaf dependencies recursively. After these have been built, a
@@ -34,12 +72,10 @@
# rebuild after a python abi change:
# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt
-%global with_rewheel 1
-%global pybasever 3.6
-
-# pybasever without the dot:
-%global pyshortver 36
+# =====================
+# General global macros
+# =====================
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -69,10 +105,10 @@
# For example,
# foo/bar.py
# now has bytecode at:
-# foo/__pycache__/bar.cpython-36.pyc
-# foo/__pycache__/bar.cpython-36.opt-1.pyc
-# foo/__pycache__/bar.cpython-36.opt-2.pyc
-%global bytecode_suffixes .cpython-36*.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-1.pyc
+# foo/__pycache__/bar.cpython-%%{pyshortver}.opt-2.pyc
+%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
# Python's configure script defines SOVERSION, and this is used in the Makefile
# to determine INSTSONAME, the name of the libpython DSO:
@@ -85,27 +121,6 @@
%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
-%global with_debug_build 1
-
-%global with_gdb_hooks 1
-
-%global with_systemtap 0
-
-# some arches don't have valgrind so we need to disable its support on them
-%ifnarch s390 %{mips} riscv64
-%global with_valgrind 1
-%else
-%global with_valgrind 0
-%endif
-
-%global with_gdbm 1
-
-# Change from yes to no to turn this off
-%global with_computed_gotos yes
-
-# Turn this to 0 to turn off the "check" phase:
-%global run_selftest_suite 1
-
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
#
@@ -127,17 +142,6 @@
# pyc/pyo files)
-# ==================
-# Top-level metadata
-# ==================
-Summary: Version 3 of the Python programming language aka Python 3000
-Name: python3
-Version: %{pybasever}.2
-Release: 8%{?dist}
-License: Python
-Group: Development/Languages
-
-
# =======================
# Build-time requirements
# =======================
@@ -155,7 +159,7 @@ BuildRequires: expat-devel >= 2.1.0
BuildRequires: findutils
BuildRequires: gcc-c++
-%if %{with_gdbm}
+%if %{with gdbm}
BuildRequires: gdbm-devel
%endif
BuildRequires: glibc-devel
@@ -184,14 +188,14 @@ BuildRequires: tcl-devel
BuildRequires: tix-devel
BuildRequires: tk-devel
-%if 0%{?with_valgrind}
+%if %{with valgrind}
BuildRequires: valgrind-devel
%endif
BuildRequires: xz-devel
BuildRequires: zlib-devel
-%if 0%{?with_rewheel}
+%if %{with rewheel}
BuildRequires: python3-setuptools
BuildRequires: python3-pip
%endif
@@ -484,7 +488,7 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Obsoletes: python%{pyshortver}
Provides: python%{pyshortver} = %{version}-%{release}
-%if 0%{with_rewheel}
+%if %{with rewheel}
Requires: python3-setuptools
Requires: python3-pip
%endif
@@ -620,7 +624,7 @@ in production.
You might want to install the python3-test package if you're developing
python code that uses more than just unittest and/or test_support.py.
-%if 0%{?with_debug_build}
+%if %{with debug_build}
%package debug
Summary: Debug version of the Python runtime
Group: Applications/System
@@ -651,7 +655,7 @@ It shares installation directories with the standard Python runtime,
so that
.py and .pyc files can be shared. All compiled extension modules gain a "_d"
suffix ("foo_d.so" rather than "foo.so") so that each Python
implementation
can load its own extensions.
-%endif # with_debug_build
+%endif # with debug_build
# ======================================================
# The prep phase of the build:
@@ -660,11 +664,11 @@ can load its own extensions.
%prep
%setup -q -n Python-%{version}%{?prerel}
-%if 0%{?with_systemtap}
+%if %{with systemtap}
# Provide an example of usage of the tapset:
cp -a %{SOURCE6} .
cp -a %{SOURCE7} .
-%endif # with_systemtap
+%endif # with systemtap
# Ensure that we're using the system copy of various libraries, rather than
# copies shipped by upstream in the tarball:
@@ -687,7 +691,7 @@ rm -r Modules/zlib || exit 1
# rm Modules/$f
#done
-%if 0%{with_rewheel}
+%if %{with rewheel}
%global pip_version 9.0.1
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
%endif
@@ -697,7 +701,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
#
%patch1 -p1
-%if 0%{?with_systemtap}
+%if %{with systemtap}
%patch55 -p1 -b .systemtap
%endif
@@ -719,7 +723,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch186 -p1
%patch188 -p1
-%if 0%{with_rewheel}
+%if %{with rewheel}
%patch189 -p1
%endif
@@ -784,20 +788,26 @@ BuildPython() {
# Use the freshly created "configure" script, but in the directory two
above:
%global _configure $topdir/configure
+ %if %{with computed_gotos}
+ %global computed_gotos_flag yes
+ %else
+ %global computed_gotos_flag no
+ %endif
+
%configure \
--enable-ipv6 \
--enable-shared \
- --with-computed-gotos=%{with_computed_gotos} \
+ --with-computed-gotos=%{computed_gotos_flag} \
--with-dbmliborder=gdbm:ndbm:bdb \
--with-system-expat \
--with-system-ffi \
--enable-loadable-sqlite-extensions \
--with-dtrace \
--with-lto \
-%if 0%{?with_systemtap}
+%if %{with systemtap}
--with-systemtap \
%endif
-%if 0%{?with_valgrind}
+%if %{with valgrind}
--with-valgrind \
%endif
$ExtraConfigArgs \
@@ -820,7 +830,7 @@ BuildPython() {
# Use "BuildPython" to support building with different configurations:
-%if 0%{?with_debug_build}
+%if %{with debug_build}
BuildPython debug \
python-debug \
python%{pybasever}-debug \
@@ -831,7 +841,7 @@ BuildPython debug \
%endif
false \
-O0
-%endif # with_debug_build
+%endif # with debug_build
BuildPython optimized \
python \
@@ -892,13 +902,13 @@ make install DESTDIR=%{buildroot} INSTALL="install -p"
EXTRA_CFLAGS="$MoreCFlags
# /usr/lib/libpython3.1.so.1.0-gdb.py
# but doing so generated noise when ldconfig was rerun (rhbz:562980)
#
-%if 0%{?with_gdb_hooks}
+%if %{with gdb_hooks}
DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
mkdir -p %{buildroot}$DirHoldingGdbPy
cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
-%endif # with_gdb_hooks
+%endif # with gdb_hooks
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -906,11 +916,11 @@ make install DESTDIR=%{buildroot} INSTALL="install -p"
EXTRA_CFLAGS="$MoreCFlags
# Use "InstallPython" to support building with different configurations:
# Install the "debug" build first, so that we can move some files aside
-%if 0%{?with_debug_build}
+%if %{with debug_build}
InstallPython debug \
%{py_INSTSONAME_debug} \
-O0
-%endif # with_debug_build
+%endif # with debug_build
# Now the optimized build:
InstallPython optimized \
@@ -971,7 +981,7 @@ install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/
%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
-%if 0%{?with_debug_build}
+%if %{with debug_build}
%global PyIncludeDirs python%{LDVERSION_optimized} python%{LDVERSION_debug}
%else
@@ -1096,7 +1106,7 @@ done
# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
# avoid the user having to know the precise version and ABI flags. (see
# e.g. rhbz#676748):
-%if 0%{?with_debug_build}
+%if %{with debug_build}
ln -s \
%{_bindir}/python%{LDVERSION_debug} \
%{buildroot}%{_bindir}/python3-debug
@@ -1105,7 +1115,7 @@ ln -s \
#
# Systemtap hooks:
#
-%if 0%{?with_systemtap}
+%if %{with systemtap}
# Install a tapset for this libpython into tapsetdir, fixing up the path to the
# library:
mkdir -p %{buildroot}%{tapsetdir}
@@ -1122,7 +1132,7 @@ sed \
%{_sourcedir}/libpython.stp \
%{buildroot}%{tapsetdir}/%{libpython_stp_optimized}
-%if 0%{?with_debug_build}
+%if %{with debug_build}
# In Python 3, python3 and python3-debug don't point to the same binary,
# so we have to replace "python3" with "python3-debug" to get
systemtap
# working with debug build
@@ -1131,9 +1141,9 @@ sed \
-e 's|"python3"|"python3-debug"|' \
%{_sourcedir}/libpython.stp \
%{buildroot}%{tapsetdir}/%{libpython_stp_debug}
-%endif #
with_debug_build
+%endif # with debug_build
-%endif # with_systemtap
+%endif # with systemtap
# Rename the -devel script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,`uname -m`-}config
@@ -1143,7 +1153,7 @@ echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
-%if 0%{?with_debug_build}
+%if %{with debug_build}
# Rename the -debug script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_debug}-{,`uname -m`-}config
echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_debug}-`uname -m`-config
"$@"' > \
@@ -1151,7 +1161,7 @@ echo -e '#!/bin/sh\nexec `dirname
$0`/python%{LDVERSION_debug}-`uname -m`-config
echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_debug}-`uname -m`-config. Look around to see available arches."
>&2' >> \
%{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
-%endif # with_debug_build
+%endif # with debug_build
# System Python: Copy the executable to libexec
mkdir -p %{buildroot}%{_libexecdir}
@@ -1210,15 +1220,15 @@ CheckPython() {
}
-%if 0%{run_selftest_suite}
+%if %{with tests}
# Check each of the configurations:
-%if 0%{?with_debug_build}
+%if %{with debug_build}
CheckPython debug
-%endif # with_debug_build
+%endif # with debug_build
CheckPython optimized
-%endif # run_selftest_suite
+%endif # with tests
# ======================================================
@@ -1298,7 +1308,7 @@ fi
%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
%exclude %{pylibdir}/ensurepip/_bundled
-%if 0%{?with_rewheel}
+%if %{with rewheel}
%dir %{pylibdir}/ensurepip/rewheel/
%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
%{pylibdir}/ensurepip/rewheel/*.py
@@ -1367,7 +1377,7 @@ fi
%{dynload_dir}/_dbm.%{SOABI_optimized}.so
%{dynload_dir}/_decimal.%{SOABI_optimized}.so
%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
-%if %{with_gdbm}
+%if %{with gdbm}
%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
%endif
%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
@@ -1495,7 +1505,7 @@ fi
%{_libdir}/%{py_INSTSONAME_optimized}
%{_libdir}/libpython3.so
-%if 0%{?with_systemtap}
+%if %{with systemtap}
%dir %(dirname %{tapsetdir})
%dir %{tapsetdir}
%{tapsetdir}/%{libpython_stp_optimized}
@@ -1567,7 +1577,7 @@ fi
# Hence the manifest is the combination of analogous files in the manifests of
# all of the other subpackages
-%if 0%{?with_debug_build}
+%if %{with debug_build}
%files debug
%defattr(-,root,root,-)
@@ -1602,7 +1612,7 @@ fi
%{dynload_dir}/_dbm.%{SOABI_debug}.so
%{dynload_dir}/_decimal.%{SOABI_debug}.so
%{dynload_dir}/_elementtree.%{SOABI_debug}.so
-%if %{with_gdbm}
+%if %{with gdbm}
%{dynload_dir}/_gdbm.%{SOABI_debug}.so
%endif
%{dynload_dir}/_hashlib.%{SOABI_debug}.so
@@ -1649,7 +1659,7 @@ fi
# now; they're listed below, under "-devel":
%{_libdir}/%{py_INSTSONAME_debug}
-%if 0%{?with_systemtap}
+%if %{with systemtap}
%dir %(dirname %{tapsetdir})
%dir %{tapsetdir}
%{tapsetdir}/%{libpython_stp_debug}
@@ -1677,7 +1687,7 @@ fi
%{dynload_dir}/_testcapi.%{SOABI_debug}.so
%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
-%endif # with_debug_build
+%endif # with debug_build
# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from
# ldconfig (rhbz:562980).
@@ -1700,6 +1710,10 @@ fi
# ======================================================
%changelog
+* Wed Aug 16 2017 Petr Viktorin <pviktori(a)redhat.com> - 3.6.2-9
+- Use bconds for configuring the build
+- Reorganize the initial sections
+
* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
- Have /usr/bin/2to3 (rhbz#1111275)
- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
commit b0aea52b4034891c2efd7daa8803de889daceb0a
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed Aug 16 15:36:09 2017 +0200
2to3 fixes
* Have /usr/bin/2to3 (rhbz#1111275)
* Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
diff --git a/python3.spec b/python3.spec
index 17330aa..cc950f3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -577,19 +577,31 @@ want to install the python3-docs package, which contains Python
documentation.
%package tools
-Summary: A collection of tools included with Python
+Summary: A collection of tools included with Python including 2to3 and idle
Group: Development/Tools
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tkinter = %{version}-%{release}
+Provides: %{name}-2to3 = %{version}-%{release}
+Provides: %{name}-idle = %{version}-%{release}
+Provides: 2to3 = %{version}-%{release}
+Provides: idle3 = %{version}-%{release}
+
%description tools
-This package contains several tools included with Python
+This package contains several tools included with Python including 2to3
+and idle.
%package tkinter
Summary: A GUI toolkit for Python
Group: Development/Languages
Requires: %{name} = %{version}-%{release}
+#
https://bugzilla.redhat.com/show_bug.cgi?id=1111275
+# /usr/bin/2to3 was moved from here
+# TODO Remove in Fedora 29
+Conflicts: python2-tools < 2.7.13-17
+Conflicts: python-tools < 2.7.13-17
+
%description tkinter
The Tkinter (Tk interface) program is a graphical user interface for
the Python scripting language.
@@ -906,8 +918,6 @@ InstallPython optimized \
install -d -m 0755 ${RPM_BUILD_ROOT}%{pylibdir}/site-packages/__pycache__
-mv ${RPM_BUILD_ROOT}%{_bindir}/2to3 ${RPM_BUILD_ROOT}%{_bindir}/python3-2to3
-
# add idle3 to menu
install -D -m 0644 Lib/idlelib/Icons/idle_16.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
install -D -m 0644 Lib/idlelib/Icons/idle_32.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
@@ -1513,7 +1523,8 @@ fi
%files tools
%defattr(-,root,root,755)
-%{_bindir}/python3-2to3
+%{_bindir}/2to3
+# TODO: Remove 2to3-3.7 once rebased to 3.7
%{_bindir}/2to3-%{pybasever}
%{_bindir}/idle*
%{pylibdir}/Tools
@@ -1689,6 +1700,10 @@ fi
# ======================================================
%changelog
+* Wed Aug 16 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.2-8
+- Have /usr/bin/2to3 (rhbz#1111275)
+- Provide 2to3 and idle3, list them in summary and description (rhbz#1076401)
+
* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
- Revert "Add --executable option to install.py command"
This enhancement is currently not needed and it can possibly
commit 58f92d897bc4ecae6ef7ceb0a5977498ada905f4
Author: Michal Cyprian <mcyprian(a)redhat.com>
Date: Fri Aug 11 13:01:28 2017 +0200
Revert "Add --executable option to install.py command"
This enhancement is currently not needed and it can possibly
collide with `pip --editable`option
Reverts commit ef5c6fe479f00fb1dd84307ecb0f3e3aaef955a2.
diff --git a/00252-add-executable-option.patch b/00252-add-executable-option.patch
deleted file mode 100644
index b3bf721..0000000
--- a/00252-add-executable-option.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-diff --git a/Lib/distutils/cmd.py b/Lib/distutils/cmd.py
-index c89d5ef..dd61621 100644
---- a/Lib/distutils/cmd.py
-+++ b/Lib/distutils/cmd.py
-@@ -296,7 +296,8 @@ class Command:
- finalized command object.
- """
- cmd_obj = self.distribution.get_command_obj(command, create)
-- cmd_obj.ensure_finalized()
-+ if cmd_obj is not None:
-+ cmd_obj.ensure_finalized()
- return cmd_obj
-
- # XXX rename to 'get_reinitialized_command()'? (should do the
-diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
-index 8174192..30ca739 100644
---- a/Lib/distutils/command/install.py
-+++ b/Lib/distutils/command/install.py
-@@ -122,6 +122,8 @@ class install(Command):
- "force installation (overwrite any existing files)"),
- ('skip-build', None,
- "skip rebuilding everything (for testing/debugging)"),
-+ ('executable=', 'e',
-+ "specify final destination interpreter path (install.py)"),
-
- # Where to install documentation (eventually!)
- #('doc-format=', None, "format of documentation to
generate"),
-@@ -194,6 +196,7 @@ class install(Command):
- # directory not in sys.path.
- self.force = 0
- self.skip_build = 0
-+ self.executable = None
- self.warn_dir = 1
-
- # These are only here as a conduit from the 'build' command to the
-@@ -365,6 +368,9 @@ class install(Command):
- ('build_base', 'build_base'),
- ('build_lib', 'build_lib'))
-
-+ if self.executable is None:
-+ self.executable = os.path.normpath(sys.executable)
-+
- # Punt on doc directories for now -- after all, we're punting on
- # documentation completely!
-
diff --git a/python3.spec b/python3.spec
index ba8c992..17330aa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -417,12 +417,6 @@ Patch243: 00243-fix-mips64-triplet.patch
# Fedora Change:
https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
Patch251: 00251-change-user-install-location.patch
-# 00252
-# Add executable option to install.py command to make it work for
-# scripts specified as an entry_points
-# Reported upstream:
https://bugs.python.org/issue29411
-Patch252: 00252-add-executable-option.patch
-
# 00262 #
# Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
#
https://www.python.org/dev/peps/pep-0538/
@@ -721,7 +715,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch243 -p1
%patch251 -p1
-%patch252 -p1
%patch262 -p1
%ifarch aarch64
@@ -1696,6 +1689,11 @@ fi
# ======================================================
%changelog
+* Fri Aug 11 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.2-7
+- Revert "Add --executable option to install.py command"
+ This enhancement is currently not needed and it can possibly
+ collide with `pip --editable`option
+
* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
- Fix the "urllib FTP protocol stream injection" vulnerability
Resolves: rhbz#1478916
commit 2c3b2229eb44215d3bf9cc53ea07d2aa93ae7c82
Author: Iryna Shcherbina <ishcherb(a)redhat.com>
Date: Mon Aug 7 18:26:47 2017 +0200
Fix the "urllib FTP protocol stream injection" vulnerability (rhbz#1478916)
diff --git a/00272-fix-ftplib-to-reject-newlines.patch
b/00272-fix-ftplib-to-reject-newlines.patch
new file mode 100644
index 0000000..66486a8
--- /dev/null
+++ b/00272-fix-ftplib-to-reject-newlines.patch
@@ -0,0 +1,58 @@
+From 8c2d4cf092c5f0335e7982392a33927579c4d512 Mon Sep 17 00:00:00 2001
+From: Dong-hee Na <donghee.na92(a)gmail.com>
+Date: Wed, 26 Jul 2017 21:11:25 +0900
+Subject: [PATCH] [3.6] bpo-30119: fix ftplib.FTP.putline() to throw an error
+ for a illegal command (#1214) (#2886)
+
+---
+ Lib/ftplib.py | 2 ++
+ Lib/test/test_ftplib.py | 6 +++++-
+ Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst | 2 ++
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+ create mode 100644 Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
+
+diff --git a/Lib/ftplib.py b/Lib/ftplib.py
+index 8f36f537e8a..a02e595cb02 100644
+--- a/Lib/ftplib.py
++++ b/Lib/ftplib.py
+@@ -186,6 +186,8 @@ def sanitize(self, s):
+
+ # Internal: send one line to the server, appending CRLF
+ def putline(self, line):
++ if '\r' in line or '\n' in line:
++ raise ValueError('an illegal newline character should not be
contained')
+ line = line + CRLF
+ if self.debugging > 1:
+ print('*put*', self.sanitize(line))
+diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
+index 12fabc5e8be..a561e9efa03 100644
+--- a/Lib/test/test_ftplib.py
++++ b/Lib/test/test_ftplib.py
+@@ -484,6 +484,9 @@ def test_sanitize(self):
+ self.assertEqual(self.client.sanitize('PASS 12345'), repr('PASS
*****'))
+
+ def test_exceptions(self):
++ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r\n0')
++ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\n0')
++ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r0')
+ self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 400')
+ self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 499')
+ self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'echo 500')
+@@ -492,7 +495,8 @@ def test_exceptions(self):
+
+ def test_all_errors(self):
+ exceptions = (ftplib.error_reply, ftplib.error_temp, ftplib.error_perm,
+- ftplib.error_proto, ftplib.Error, OSError, EOFError)
++ ftplib.error_proto, ftplib.Error, OSError,
++ EOFError)
+ for x in exceptions:
+ try:
+ raise x('exception not included in all_errors set')
+diff --git a/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
+new file mode 100644
+index 00000000000..a37d3703842
+--- /dev/null
++++ b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst
+@@ -0,0 +1,2 @@
++ftplib.FTP.putline() now throws ValueError on commands that contains CR or
++LF. Patch by Dong-hee Na.
diff --git a/python3.spec b/python3.spec
index 91978da..ba8c992 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -449,6 +449,13 @@ Patch270: 00270-fix-ssl-alpn-hook-test.patch
# Reported upstream:
http://bugs.python.org/issue31034
Patch271: 00271-asyncio-get-default-signal-handler.patch
+# 00272 #
+# Reject newline characters in ftplib.FTP.putline() arguments to
+# avoid FTP protocol stream injection via malicious URLs.
+# rhbz#1478916
+# Fixed upstream:
http://bugs.python.org/issue30119
+Patch272: 00272-fix-ftplib-to-reject-newlines.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -723,6 +730,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch270 -p1
%patch271 -p1
+%patch272 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1688,6 +1696,10 @@ fi
# ======================================================
%changelog
+* Mon Aug 07 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.2-6
+- Fix the "urllib FTP protocol stream injection" vulnerability
+Resolves: rhbz#1478916
+
* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
bsddb), however, no longer needod for Python 3
commit 7ce2b353052bd12424d70271b36b537c14ad7d0b
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Tue Aug 1 16:59:32 2017 +0200
Dropped BuildRequires on db4-devel
- it was useful for Python 2 (module bsddb), however, no longer needod for
Python 3
- Tested building Python 3 with and without the dependency, all tests pass and
filelists of resulting RPMs are identical
diff --git a/python3.spec b/python3.spec
index 0bb71e1..91978da 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -148,7 +148,6 @@ BuildRequires: autoconf
BuildRequires: bluez-libs-devel
BuildRequires: bzip2
BuildRequires: bzip2-devel
-BuildRequires: db4-devel >= 4.7
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# it (in pyexpat) in order to enable the fix in Python-3.2.3 for CVE-2012-0876:
@@ -1689,6 +1688,12 @@ fi
# ======================================================
%changelog
+* Tue Aug 01 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.2-5
+- Dropped BuildRequires on db4-devel which was useful for Python 2 (module
+ bsddb), however, no longer needod for Python 3
+- Tested building Python 3 with and without the dependency, all tests pass and
+ filelists of resulting RPMs are identical
+
* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
- Do not generate debuginfo subpackages (#1476593)
- Rebuild with binutils fix for ppc64le (#1475636)
commit e49a729d352532f7bda630fab441c7465f0a7930
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Jul 31 14:02:39 2017 +0200
Make debuginfo packages parallel installable
diff --git a/python3.spec b/python3.spec
index 38fe5ac..0bb71e1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -882,7 +882,7 @@ make install DESTDIR=%{buildroot} INSTALL="install -p"
EXTRA_CFLAGS="$MoreCFlags
#
%if 0%{?with_gdb_hooks}
DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
- PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName.debug-gdb.py
+ PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
mkdir -p %{buildroot}$DirHoldingGdbPy
cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
commit c6fe5c680bcaa684fb4a73bfceba37a2469e02cf
Author: Florian Weimer <fweimer(a)redhat.com>
Date: Sun Jul 30 17:13:49 2017 +0200
Do not generate debuginfo subpackages (#1476593)
Rebuild with binutils fix for ppc64le (#1475636)
diff --git a/python3.spec b/python3.spec
index 6b6d0a3..38fe5ac 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -1681,12 +1681,18 @@ fi
# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
# payload file would be unpackaged)
+# Workaround for rhbz#1476593
+%undefine _debuginfo_subpackages
# ======================================================
# Finally, the changelog:
# ======================================================
%changelog
+* Sun Jul 30 2017 Florian Weimer <fweimer(a)redhat.com> - 3.6.2-4
+- Do not generate debuginfo subpackages (#1476593)
+- Rebuild with binutils fix for ppc64le (#1475636)
+
* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
commit 4cc9b2e33c5622f9a683d9dcef4ec3307980f5d6
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Thu Jul 27 12:26:00 2017 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index afce2a0..6b6d0a3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -1687,6 +1687,9 @@ fi
# ======================================================
%changelog
+* Thu Jul 27 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.2-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
- Make test_asyncio to not depend on the current SIGHUP signal handler.
commit 3a226ae7d71b76c0edd50b904a0f4323722a1eb6
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jul 25 18:03:55 2017 +0200
Make sure that we get the default signal handler for test_asyncio,
The parent process may have decided to ignore SIGHUP, and signal handlers
are inherited which can cause the test to hang in koji.
diff --git a/00271-asyncio-get-default-signal-handler.patch
b/00271-asyncio-get-default-signal-handler.patch
new file mode 100644
index 0000000..8b1bf77
--- /dev/null
+++ b/00271-asyncio-get-default-signal-handler.patch
@@ -0,0 +1,99 @@
+diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
+index 492a84a2313..9746678607c 100644
+--- a/Lib/test/test_asyncio/test_events.py
++++ b/Lib/test/test_asyncio/test_events.py
+@@ -1980,19 +1980,26 @@ def test_subprocess_terminate(self):
+
+ @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
+ def test_subprocess_send_signal(self):
+- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
+-
+- connect = self.loop.subprocess_exec(
+- functools.partial(MySubprocessProtocol, self.loop),
+- sys.executable, prog)
+- transp, proto = self.loop.run_until_complete(connect)
+- self.assertIsInstance(proto, MySubprocessProtocol)
+- self.loop.run_until_complete(proto.connected)
+-
+- transp.send_signal(signal.SIGHUP)
+- self.loop.run_until_complete(proto.completed)
+- self.assertEqual(-signal.SIGHUP, proto.returncode)
+- transp.close()
++ # bpo-31034: Make sure that we get the default signal handler (killing
++ # the process). The parent process may have decided to ignore SIGHUP,
++ # and signal handlers are inherited.
++ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL)
++ try:
++ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
++
++ connect = self.loop.subprocess_exec(
++ functools.partial(MySubprocessProtocol, self.loop),
++ sys.executable, prog)
++ transp, proto = self.loop.run_until_complete(connect)
++ self.assertIsInstance(proto, MySubprocessProtocol)
++ self.loop.run_until_complete(proto.connected)
++
++ transp.send_signal(signal.SIGHUP)
++ self.loop.run_until_complete(proto.completed)
++ self.assertEqual(-signal.SIGHUP, proto.returncode)
++ transp.close()
++ finally:
++ signal.signal(signal.SIGHUP, old_handler)
+
+ def test_subprocess_stderr(self):
+ prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
+diff --git a/Lib/test/test_asyncio/test_subprocess.py
b/Lib/test/test_asyncio/test_subprocess.py
+index 2e14a8a9735..e8822c36698 100644
+--- a/Lib/test/test_asyncio/test_subprocess.py
++++ b/Lib/test/test_asyncio/test_subprocess.py
+@@ -166,25 +166,32 @@ def test_terminate(self):
+
+ @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
+ def test_send_signal(self):
+- code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
+- args = [sys.executable, '-c', code]
+- create = asyncio.create_subprocess_exec(*args,
+- stdout=subprocess.PIPE,
+- loop=self.loop)
+- proc = self.loop.run_until_complete(create)
+-
+- @asyncio.coroutine
+- def send_signal(proc):
+- # basic synchronization to wait until the program is sleeping
+- line = yield from proc.stdout.readline()
+- self.assertEqual(line, b'sleeping\n')
++ # bpo-31034: Make sure that we get the default signal handler (killing
++ # the process). The parent process may have decided to ignore SIGHUP,
++ # and signal handlers are inherited.
++ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL)
++ try:
++ code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
++ args = [sys.executable, '-c', code]
++ create = asyncio.create_subprocess_exec(*args,
++ stdout=subprocess.PIPE,
++ loop=self.loop)
++ proc = self.loop.run_until_complete(create)
+
+- proc.send_signal(signal.SIGHUP)
+- returncode = (yield from proc.wait())
+- return returncode
+-
+- returncode = self.loop.run_until_complete(send_signal(proc))
+- self.assertEqual(-signal.SIGHUP, returncode)
++ @asyncio.coroutine
++ def send_signal(proc):
++ # basic synchronization to wait until the program is sleeping
++ line = yield from proc.stdout.readline()
++ self.assertEqual(line, b'sleeping\n')
++
++ proc.send_signal(signal.SIGHUP)
++ returncode = (yield from proc.wait())
++ return returncode
++
++ returncode = self.loop.run_until_complete(send_signal(proc))
++ self.assertEqual(-signal.SIGHUP, returncode)
++ finally:
++ signal.signal(signal.SIGHUP, old_handler)
+
+ def prepare_broken_pipe_test(self):
+ # buffer large enough to feed the whole pipe buffer
diff --git a/python3.spec b/python3.spec
index 302dabb..afce2a0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -444,6 +444,12 @@ Patch264: 00264-skip-test-failing-on-aarch64.patch
# Fixed upstream:
http://bugs.python.org/issue30714
Patch270: 00270-fix-ssl-alpn-hook-test.patch
+# 00271 #
+# Make test_asyncio to not depend on the current signal handler
+# as this can make it hang on koji, since it ignores SIGHUP.
+# Reported upstream:
http://bugs.python.org/issue31034
+Patch271: 00271-asyncio-get-default-signal-handler.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -717,6 +723,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%endif
%patch270 -p1
+%patch271 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1680,6 +1687,9 @@ fi
# ======================================================
%changelog
+* Tue Jul 25 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-2
+- Make test_asyncio to not depend on the current SIGHUP signal handler.
+
* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
- Update to Python 3.6.2
commit 5b6a3e0e34f46702773ad1082df3b782c1a8b7ac
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Jul 20 17:50:38 2017 +0200
Replace the "--verbose" flag with "-wW" when invoking the test
suite, so that the tests are run in non-verbose mode by default and failed tests are rerun
in verbose mode.
Also add the "--slowest" flag when invoking the test suite to
list the ten slowest tests at the end of the test run.
diff --git a/python3.spec b/python3.spec
index f088855..302dabb 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1177,7 +1177,7 @@ CheckPython() {
# aarch64, see upstream bug
http://bugs.python.org/issue21131
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- --verbose --findleaks \
+ -wW --slowest --findleaks \
-x test_distutils \
%ifarch ppc64le aarch64
-x test_faulthandler \
commit a94422417ac24993a018cb80fc3b00f2d337f18f
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Jul 19 14:25:35 2017 +0200
Remove unused patches
diff --git a/00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
b/00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
deleted file mode 100644
index e224fc6..0000000
--- a/00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- Python-3.3.2/setup.py.orig 2013-07-01 15:23:24.377711044 +0200
-+++ Python-3.3.2/setup.py 2013-07-01 15:23:34.094676496 +0200
-@@ -1882,7 +1882,8 @@
- if not line:
- ffi_inc = None
- break
-- if line.startswith('#define LIBFFI_H'):
-+ if line.startswith('#define LIBFFI_H') or \
-+ line.startswith('#define ffi_wrapper_h'):
- break
- ffi_lib = None
- if ffi_inc is not None:
diff --git a/00196-test-gdb-match-addr-before-builtin.patch
b/00196-test-gdb-match-addr-before-builtin.patch
deleted file mode 100644
index dc40c82..0000000
--- a/00196-test-gdb-match-addr-before-builtin.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-Subject: python3.test gdb match addr before builtin
-From: Michel Normand <normand(a)linux.vnet.ibm.com>
-
-For ppc64le archi and python3... and gdb... versions
-the test_gdb.py need a change of re.match to handle address before the builtin_id word.
-Of course there is no error if this substring is not present.
-===
-...
-#0 0x00003fffb7dd0898 in builtin_id (self=<module at remote 0x3fffb7901440>,
v=<unknown at remote 0x3fffb7f68910>) at
/builddir/build/BUILD/Python-3.3.2/Python/bltinmodule.c:966
-....xxxxxxxxxxxxxxxxxxxxxx <= added regexp
-===
-
-Signed-off-by: Michel Normand <normand(a)linux.vnet.ibm.com>
----
- Lib/test/test_gdb.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-Index: Python-3.3.2/Lib/test/test_gdb.py
-===================================================================
---- Python-3.3.2.orig/Lib/test/test_gdb.py
-+++ Python-3.3.2/Lib/test/test_gdb.py
-@@ -230,7 +230,7 @@ class DebuggerTests(unittest.TestCase):
- # gdb can insert additional '\n' and space characters in various places
- # in its output, depending on the width of the terminal it's connected
- # to (using its "wrap_here" function)
-- m =
re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*',
-+ m = re.match('.*#0\s+(?:
0x[0-9a-f]+\s+in\s+)?builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*',
- gdb_output, re.DOTALL)
- if not m:
- self.fail('Unexpected gdb output: %r\n%s' % (gdb_output,
gdb_output))
diff --git a/00249-fix-out-of-tree-dtrace-builds.patch
b/00249-fix-out-of-tree-dtrace-builds.patch
deleted file mode 100644
index d5de53c..0000000
--- a/00249-fix-out-of-tree-dtrace-builds.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 28df0e1..42f811c 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -867,6 +867,7 @@ Python/frozen.o: Python/importlib.h Python/importlib_external.h
- # follow our naming conventions. dtrace(1) uses the output filename to generate
- # an include guard, so we can't use a pipeline to transform its output.
- Include/pydtrace_probes.h: $(srcdir)/Include/pydtrace.d
-+ @$(MKDIR_P) Include
- $(DTRACE) $(DFLAGS) -o $@ -h -s $<
- : sed in-place edit with POSIX-only tools
- sed 's/PYTHON_/PyDTrace_/' $@ > $@.tmp
diff --git a/00258-fix-test_aead_aes_gcm.patch b/00258-fix-test_aead_aes_gcm.patch
deleted file mode 100644
index 1d061fd..0000000
--- a/00258-fix-test_aead_aes_gcm.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
-index 8992a01..74170f4 100644
---- a/Lib/test/test_socket.py
-+++ b/Lib/test/test_socket.py
-@@ -5458,6 +5458,7 @@ class LinuxKernelCryptoAPI(unittest.TestCase):
- self.assertEqual(dec, msg * multiplier)
-
- @support.requires_linux_version(4, 3) # see test_aes_cbc
-+ @unittest.skip('Failure on Kernel 4.9+')
- def test_aead_aes_gcm(self):
- key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
- iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
diff --git a/00261-use-proper-command-line-parsing-in-_testembed.patch
b/00261-use-proper-command-line-parsing-in-_testembed.patch
deleted file mode 100644
index 49db110..0000000
--- a/00261-use-proper-command-line-parsing-in-_testembed.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
-index 6c3625d..2a53f3d 100644
---- a/Lib/test/test_capi.py
-+++ b/Lib/test/test_capi.py
-@@ -385,7 +385,7 @@ class EmbeddingTests(unittest.TestCase):
-
- def test_subinterps(self):
- # This is just a "don't crash" test
-- out, err = self.run_embedded_interpreter()
-+ out, err =
self.run_embedded_interpreter("repeated_init_and_subinterpreters")
- if support.verbose:
- print()
- print(out)
-diff --git a/Programs/_testembed.c b/Programs/_testembed.c
-index 3968399..a68d4fa 100644
---- a/Programs/_testembed.c
-+++ b/Programs/_testembed.c
-@@ -33,7 +33,7 @@ static void print_subinterp(void)
- );
- }
-
--static void test_repeated_init_and_subinterpreters(void)
-+static int test_repeated_init_and_subinterpreters(void)
- {
- PyThreadState *mainstate, *substate;
- #ifdef WITH_THREAD
-@@ -70,6 +70,7 @@ static void test_repeated_init_and_subinterpreters(void)
- PyEval_RestoreThread(mainstate);
- Py_Finalize();
- }
-+ return 0;
- }
-
- /*****************************************************
-@@ -103,7 +104,7 @@ static void check_stdio_details(const char *encoding, const char *
errors)
- Py_Finalize();
- }
-
--static void test_forced_io_encoding(void)
-+static int test_forced_io_encoding(void)
- {
- /* Check various combinations */
- printf("--- Use defaults ---\n");
-@@ -122,19 +123,51 @@ static void test_forced_io_encoding(void)
- printf("Unexpected success calling Py_SetStandardStreamEncoding");
- }
- Py_Finalize();
-+ return 0;
- }
-
--/* Different embedding tests */
--int main(int argc, char *argv[])
-+/* *********************************************************
-+ * List of test cases and the function that implements it.
-+ *
-+ * Names are compared case-sensitively with the first
-+ * argument. If no match is found, or no first argument was
-+ * provided, the names of all test cases are printed and
-+ * the exit code will be -1.
-+ *
-+ * The int returned from test functions is used as the exit
-+ * code, and test_capi treats all non-zero exit codes as a
-+ * failed test.
-+ *********************************************************/
-+struct TestCase
- {
-+ const char *name;
-+ int (*func)(void);
-+};
-+
-+static struct TestCase TestCases[] = {
-+ { "forced_io_encoding", test_forced_io_encoding },
-+ { "repeated_init_and_subinterpreters",
test_repeated_init_and_subinterpreters },
-+ { NULL, NULL }
-+};
-
-- /* TODO: Check the argument string to allow for more test cases */
-+int main(int argc, char *argv[])
-+{
- if (argc > 1) {
-- /* For now: assume "forced_io_encoding */
-- test_forced_io_encoding();
-- } else {
-- /* Run the original embedding test case by default */
-- test_repeated_init_and_subinterpreters();
-+ for (struct TestCase *tc = TestCases; tc && tc->name; tc++) {
-+ if (strcmp(argv[1], tc->name) == 0)
-+ return (*tc->func)();
-+ }
- }
-- return 0;
-+
-+ /* No match found, or no test name provided, so display usage */
-+ printf("Python " PY_VERSION " _testembed executable for embedded
interpreter tests\n"
-+ "Normally executed via 'EmbeddingTests' in
Lib/test/test_capi.py\n\n"
-+ "Usage: %s TESTNAME\n\nAll available tests:\n", argv[0]);
-+ for (struct TestCase *tc = TestCases; tc && tc->name; tc++) {
-+ printf(" %s\n", tc->name);
-+ }
-+
-+ /* Non-zero exit code will cause test_capi.py tests to fail.
-+ This is intentional. */
-+ return -1;
- }
diff --git a/00269-fix-multiple-compilations-issue-with-pgo-builds.patch
b/00269-fix-multiple-compilations-issue-with-pgo-builds.patch
deleted file mode 100644
index a911feb..0000000
--- a/00269-fix-multiple-compilations-issue-with-pgo-builds.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 0e1d0af..42ab191 100644
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -989,7 +989,7 @@ TESTTIMEOUT= 1200
-
- # Run a basic set of regression tests.
- # This excludes some tests that are particularly resource-intensive.
--test: all platform
-+test: @DEF_MAKE_RULE@ platform
- $(TESTRUNNER) $(TESTOPTS)
-
- # Run the full test suite twice - once without .pyc files, and once with.
-@@ -999,7 +999,7 @@ test: all platform
- # the bytecode read from a .pyc file had the bug, sometimes the directly
- # generated bytecode. This is sometimes a very shy bug needing a lot of
- # sample data.
--testall: all platform
-+testall: @DEF_MAKE_RULE@ platform
- -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
- $(TESTPYTHON) -E $(srcdir)/Lib/compileall.py
- -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
-@@ -1008,7 +1008,7 @@ testall: all platform
-
- # Run the test suite for both architectures in a Universal build on OSX.
- # Must be run on an Intel box.
--testuniversal: all platform
-+testuniversal: @DEF_MAKE_RULE@ platform
- if [ `arch` != 'i386' ];then \
- echo "This can only be used on OSX/i386" ;\
- exit 1 ;\
-@@ -1031,7 +1031,7 @@ QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3
\
- test_multiprocessing_forkserver \
- test_mailbox test_socket test_poll \
- test_select test_zipfile test_concurrent_futures
--quicktest: all platform
-+quicktest: @DEF_MAKE_RULE@ platform
- $(TESTRUNNER) $(QUICKTESTOPTS)
-
-
-@@ -1368,7 +1368,7 @@ LIBPL= $(LIBDEST)/config-$(LDVERSION)-$(MULTIARCH)
- # pkgconfig directory
- LIBPC= $(LIBDIR)/pkgconfig
-
--libainstall: all python-config
-+libainstall: @DEF_MAKE_RULE@ python-config
- @for i in $(LIBDIR) $(LIBPL) $(LIBPC); \
- do \
- if test ! -d $(DESTDIR)$$i; then \
-@@ -1616,7 +1616,7 @@ distclean: clobber
- -exec rm -f {} ';'
-
- # Check for smelly exported symbols (not starting with Py/_Py)
--smelly: all
-+smelly: @DEF_MAKE_RULE@
- nm -p $(LIBRARY) | \
- sed -n "/ [TDB] /s/.* //p" | grep -v "^_*Py" | sort -u; \
-
-@@ -1653,7 +1653,7 @@ funny:
- -o -print
-
- # Perform some verification checks on any modified files.
--patchcheck: all
-+patchcheck: @DEF_MAKE_RULE@
- $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
-
- # Dependencies
diff --git a/temporarily-disable-tests-requiring-SIGHUP.patch
b/temporarily-disable-tests-requiring-SIGHUP.patch
deleted file mode 100644
index 30ceb94..0000000
--- a/temporarily-disable-tests-requiring-SIGHUP.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff -up Python-3.4.0/Lib/test/test_asyncio/test_events.py.orig
Python-3.4.0/Lib/test/test_asyncio/test_events.py
---- Python-3.4.0/Lib/test/test_asyncio/test_events.py.orig 2014-04-15 13:18:49.696215288
+0200
-+++ Python-3.4.0/Lib/test/test_asyncio/test_events.py 2014-04-15 13:18:56.104258453
+0200
-@@ -1528,7 +1528,7 @@ class SubprocessTestsMixin:
- self.check_terminated(proto.returncode)
- transp.close()
-
-- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
-+ @unittest.skipIf(True, "Temporarily skipped (rhbz#1088233)")
- def test_subprocess_send_signal(self):
- prog = os.path.join(os.path.dirname(__file__), 'echo.py')
-
-
-diff -up Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py.orig
Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py
---- Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py.orig 2014-04-17
12:03:32.777827520 +0200
-+++ Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py 2014-04-17 12:04:37.614210481
+0200
-@@ -108,7 +108,7 @@ class SubprocessMixin:
- else:
- self.assertEqual(-signal.SIGTERM, returncode)
-
-- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
-+ @unittest.skipIf(True, "Temporarily skipped (rhbz#1088233)")
- def test_send_signal(self):
- code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
- args = [sys.executable, '-c', code]
commit f13050e2f3c3d6cacd218ee50859d93357b62f81
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jul 18 16:48:45 2017 +0200
Update the PEP 538 backport
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index 856ef77..d749bac 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -124,13 +124,14 @@ index ca5f9c2..7aa460b 100644
def assert_python_ok(*args, **env_vars):
diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py
new file mode 100644
-index 0000000..a4b4626
+index 0000000..635c98f
--- /dev/null
+++ b/Lib/test/test_c_locale_coercion.py
-@@ -0,0 +1,353 @@
+@@ -0,0 +1,371 @@
+# Tests the attempted automatic coercion of the C locale to a UTF-8 locale
+
+import unittest
++import locale
+import os
+import sys
+import sysconfig
@@ -146,7 +147,14 @@ index 0000000..a4b4626
+
+# Set our expectation for the default encoding used in the C locale
+# for the filesystem encoding and the standard streams
-+C_LOCALE_STREAM_ENCODING = "ascii"
++
++# AIX uses iso8859-1 in the C locale, other *nix platforms use ASCII
++if sys.platform.startswith("aix"):
++ C_LOCALE_STREAM_ENCODING = "iso8859-1"
++else:
++ C_LOCALE_STREAM_ENCODING = "ascii"
++
++# FS encoding is UTF-8 on macOS, other *nix platforms use the locale encoding
+if sys.platform == "darwin":
+ C_LOCALE_FS_ENCODING = "utf-8"
+else:
@@ -162,24 +170,34 @@ index 0000000..a4b4626
+
+# In order to get the warning messages to match up as expected, the candidate
+# order here must much the target locale order in Python/pylifecycle.c
-+_C_UTF8_LOCALES = ("C.UTF-8", "C.utf8") #, "UTF-8")
-+
-+# XXX (ncoghlan): Using UTF-8 as a target locale is currently disabled due to
-+# problems encountered on *BSD systems with those test cases
-+# For additional details see:
-+# nl_langinfo CODESET error:
https://bugs.python.org/issue30647
-+# locale handling differences:
https://bugs.python.org/issue30672
++_C_UTF8_LOCALES = ("C.UTF-8", "C.utf8", "UTF-8")
+
+# There's no reliable cross-platform way of checking locale alias
+# lists, so the only way of knowing which of these locales will work
+# is to try them with locale.setlocale(). We do that in a subprocess
+# to avoid altering the locale of the test runner.
++#
++# If the relevant locale module attributes exist, and we're not on a platform
++# where we expect it to always succeed, we also check that
++# `locale.nl_langinfo(locale.CODESET)` works, as if it fails, the interpreter
++# will skip locale coercion for that particular target locale
++_check_nl_langinfo_CODESET = bool(
++ sys.platform not in ("darwin", "linux") and
++ hasattr(locale, "nl_langinfo") and
++ hasattr(locale, "CODESET")
++)
++
+def _set_locale_in_subprocess(locale_name):
+ cmd_fmt = "import locale; print(locale.setlocale(locale.LC_CTYPE,
'{}'))"
++ if _check_nl_langinfo_CODESET:
++ # If there's no valid CODESET, we expect coercion to be skipped
++ cmd_fmt += "; import sys; sys.exit(not
locale.nl_langinfo(locale.CODESET))"
+ cmd = cmd_fmt.format(locale_name)
+ result, py_cmd = run_python_until_end("-c", cmd, __isolated=True)
+ return result.rc == 0
+
++
++
+_fields = "fsencoding stdin_info stdout_info stderr_info lang lc_ctype
lc_all"
+_EncodingDetails = namedtuple("EncodingDetails", _fields)
+
@@ -695,7 +713,7 @@ index a7afbc7..03f8295 100644
for (i = 0; i < argc; i++) {
PyMem_RawFree(argv_copy2[i]);
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index a4f7f82..743d9b6 100644
+index a4f7f82..3843297 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -167,6 +167,7 @@ Py_SetStandardStreamEncoding(const char *encoding, const char
*errors)
@@ -706,7 +724,7 @@ index a4f7f82..743d9b6 100644
/* Global initializations. Can be undone by Py_FinalizeEx(). Don't
call this twice without an intervening Py_FinalizeEx() call. When
initializations fail, a fatal error is issued and the function does
-@@ -301,6 +302,181 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
+@@ -301,6 +302,183 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
}
@@ -779,18 +797,10 @@ index a4f7f82..743d9b6 100644
+static _LocaleCoercionTarget _TARGET_LOCALES[] = {
+ {"C.UTF-8"},
+ {"C.utf8"},
-+ /* {"UTF-8"}, */
++ {"UTF-8"},
+ {NULL}
+};
+
-+/* XXX (ncoghlan): Using UTF-8 as a target locale is currently disabled due to
-+ * problems encountered on *BSD systems with those test cases
-+ * For additional details see:
-+ * nl_langinfo CODESET error:
https://bugs.python.org/issue30647
-+ * locale handling differences:
https://bugs.python.org/issue30672
-+ */
-+
-+
+static char *
+get_default_standard_stream_error_handler(void)
+{
@@ -873,6 +883,16 @@ index a4f7f82..743d9b6 100644
+ const char *new_locale = setlocale(LC_CTYPE,
+ target->locale_name);
+ if (new_locale != NULL) {
++#if !defined(__APPLE__) && defined(HAVE_LANGINFO_H) && defined(CODESET)
++ /* Also ensure that nl_langinfo works in this locale */
++ char *codeset = nl_langinfo(CODESET);
++ if (!codeset || *codeset == '\0') {
++ /* CODESET is not set or empty, so skip coercion */
++ new_locale = NULL;
++ setlocale(LC_CTYPE, "");
++ continue;
++ }
++#endif
+ /* Successfully configured locale, so make it the default */
+ _coerce_default_locale_settings(target);
+ return;
@@ -888,7 +908,7 @@ index a4f7f82..743d9b6 100644
void
_Py_InitializeEx_Private(int install_sigs, int install_importlib)
{
-@@ -315,11 +491,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
+@@ -315,11 +493,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
initialized = 1;
_Py_Finalizing = NULL;
@@ -909,7 +929,7 @@ index a4f7f82..743d9b6 100644
#endif
if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
-@@ -1242,12 +1426,8 @@ initstdio(void)
+@@ -1242,12 +1428,8 @@ initstdio(void)
}
}
if (!errors && !(pythonioencoding && *pythonioencoding)) {
commit 4ff21139d780d1b13cbb8e6525e611feb426a6aa
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jul 18 16:40:02 2017 +0200
Update to Python 3.6.2
Rebased patch 180.
Dropped patches 249, 258, 269 as they have been upstreamed.
diff --git a/00180-python-add-support-for-ppc64p7.patch
b/00180-python-add-support-for-ppc64p7.patch
index 022944a..054f9f3 100644
--- a/00180-python-add-support-for-ppc64p7.patch
+++ b/00180-python-add-support-for-ppc64p7.patch
@@ -1,12 +1,13 @@
-diff -r de35eae9048a config.sub
---- a/config.sub Wed Apr 24 23:33:20 2013 +0200
-+++ b/config.sub Thu Apr 25 08:51:00 2013 +0200
-@@ -1008,7 +1008,7 @@
+diff --git a/config.sub b/config.sub
+index 40ea5df..932128b 100755
+--- a/config.sub
++++ b/config.sub
+@@ -1045,7 +1045,7 @@ case $basic_machine in
;;
ppc64) basic_machine=powerpc64-unknown
;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed
's/^[^-]*-//'`
;;
- ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ ppc64le | powerpc64little)
basic_machine=powerpc64le-unknown
diff --git a/python3.spec b/python3.spec
index 9c82d21..f088855 100644
--- a/python3.spec
+++ b/python3.spec
@@ -132,8 +132,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.1
-Release: 10%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -411,12 +411,6 @@ Patch206: 00206-remove-hf-from-arm-triplet.patch
# Fedora needs the default mips64-linux-gnu
Patch243: 00243-fix-mips64-triplet.patch
-# 00249 #
-# Fix builds using the --with-dtrace flag as the rpmbuild
-# of python is an out of tree build
-# Not yet fixed upstream:
http://bugs.python.org/issue28787
-Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
-
# 00251
# Set values of prefix and exec_prefix in distutils install command
# to /usr/local if executable is /usr/bin/python* and RPM build
@@ -430,12 +424,6 @@ Patch251: 00251-change-user-install-location.patch
# Reported upstream:
https://bugs.python.org/issue29411
Patch252: 00252-add-executable-option.patch
-# 00258 #
-# Kernel 4.9 introduced some changes to its crypto API
-# making test_aead_aes_gcm fail, so skipping the test for now
-# Reported upstream:
http://bugs.python.org/issue29324
-Patch258: 00258-fix-test_aead_aes_gcm.patch
-
# 00262 #
# Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
#
https://www.python.org/dev/peps/pep-0538/
@@ -450,12 +438,6 @@ Patch262: 00262-pep538_coerce_legacy_c_locale.patch
# Reported upstream:
http://bugs.python.org/issue29804
Patch264: 00264-skip-test-failing-on-aarch64.patch
-# 00269 #
-# Fix python's recompilation with common build commands when using
-# profile guided optimizations.
-# Fixed upstream:
http://bugs.python.org/issue29243
-Patch269: 00269-fix-multiple-compilations-issue-with-pgo-builds.patch
-
# 00270 #
# Fix test_alpn_protocols from test_ssl as openssl > 1.1.0f
# changed the behaviour of the ALPN hook.
@@ -726,17 +708,14 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch205 -p1
%patch206 -p1
%patch243 -p1
-%patch249 -p1
%patch251 -p1
%patch252 -p1
-%patch258 -p1
%patch262 -p1
%ifarch aarch64
%patch264 -p1
%endif
-%patch269 -p1
%patch270 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
@@ -1701,6 +1680,9 @@ fi
# ======================================================
%changelog
+* Tue Jul 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.2-1
+- Update to Python 3.6.2
+
* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
- Update to the latest upstream implementation of PEP 538
diff --git a/sources b/sources
index 9bb64d1..af1a1e7 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.1.tar.xz) =
8605fb7019386fec227d4b06d06f00ae500a8a89df289bfe6141bb56196c75483a60cc0ee553930742b31cefce68add5ccf226e0f27b7b915f5026d597e1ac29
+SHA512 (Python-3.6.2.tar.xz) =
a8270a09a9e9b39f69ece6cdade2fa964665d2107b5acbad4453f1b921107b329c697c137185928fb4a576fc0f2ae2a98dbf26a8b7ea17219e990ddbc216db8b
commit 46034c8139e9ae1077d3f777689c074b90a6b990
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Jun 28 15:46:50 2017 +0200
Provide additional references for patches 251 and 252
diff --git a/python3.spec b/python3.spec
index 583c706..9c82d21 100644
--- a/python3.spec
+++ b/python3.spec
@@ -421,11 +421,13 @@ Patch249: 00249-fix-out-of-tree-dtrace-builds.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
+# Fedora Change:
https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
Patch251: 00251-change-user-install-location.patch
# 00252
# Add executable option to install.py command to make it work for
# scripts specified as an entry_points
+# Reported upstream:
https://bugs.python.org/issue29411
Patch252: 00252-add-executable-option.patch
# 00258 #
commit 7e7918aaddfee38280ec59be3eccebd20574c651
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Tue Jun 27 18:02:44 2017 +0200
Fix for a build failure when with_debug_build=0
diff --git a/python3.spec b/python3.spec
index d6687c7..583c706 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1145,6 +1145,7 @@ echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+%if 0%{?with_debug_build}
# Rename the -debug script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_debug}-{,`uname -m`-}config
echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_debug}-`uname -m`-config
"$@"' > \
@@ -1152,11 +1153,13 @@ echo -e '#!/bin/sh\nexec `dirname
$0`/python%{LDVERSION_debug}-`uname -m`-config
echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_debug}-`uname -m`-config. Look around to see available arches."
>&2' >> \
%{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
+%endif # with_debug_build
# System Python: Copy the executable to libexec
mkdir -p %{buildroot}%{_libexecdir}
cp %{buildroot}%{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
+
# ======================================================
# Running the upstream test suite
# ======================================================
commit 252962389ce9dd580711d948620b40468df07030
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jun 27 15:38:30 2017 +0200
Update to the latest implementation of PEP 538.
Remove patch 261 as it was only required for the previous implementation
of PEP 538.
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index 7802567..856ef77 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -1,8 +1,8 @@
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
-index 08dc311..c6ec147 100644
+index 195f63f..8ecd70f 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
-@@ -713,6 +713,40 @@ conflict.
+@@ -713,6 +713,45 @@ conflict.
.. versionadded:: 3.6
@@ -35,6 +35,11 @@ index 08dc311..c6ec147 100644
+ :data:`sys.stdin` and :data:`sys.stdout` to ``surrogateescape``. This
+ behavior can be overridden using :envvar:`PYTHONIOENCODING` as usual.
+
++ For debugging purposes, setting ``PYTHONCOERCECLOCALE=warn`` will cause
++ Python to emit warning messages on ``stderr`` if either the locale coercion
++ activates, or else if a locale that *would* have triggered coercion is
++ still active when the Python runtime is initialized.
++
+ Availability: \*nix
+
+ .. versionadded:: 3.7
@@ -44,10 +49,10 @@ index 08dc311..c6ec147 100644
~~~~~~~~~~~~~~~~~~~~
diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
-index 1e74647..b3ac848 100644
+index ca5f9c2..7aa460b 100644
--- a/Lib/test/support/script_helper.py
+++ b/Lib/test/support/script_helper.py
-@@ -48,8 +48,35 @@ def interpreter_requires_environment():
+@@ -51,8 +51,35 @@ def interpreter_requires_environment():
return __cached_interp_requires_environment
@@ -85,7 +90,7 @@ index 1e74647..b3ac848 100644
# Executing the interpreter in a subprocess
-@@ -107,30 +134,7 @@ def run_python_until_end(*args, **env_vars):
+@@ -110,30 +137,7 @@ def run_python_until_end(*args, **env_vars):
def _assert_python(expected_success, *args, **env_vars):
res, cmd_line = run_python_until_end(*args, **env_vars)
if (res.rc and expected_success) or (not res.rc and not expected_success):
@@ -119,10 +124,10 @@ index 1e74647..b3ac848 100644
def assert_python_ok(*args, **env_vars):
diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py
new file mode 100644
-index 0000000..ad6ecac
+index 0000000..a4b4626
--- /dev/null
+++ b/Lib/test/test_c_locale_coercion.py
-@@ -0,0 +1,269 @@
+@@ -0,0 +1,353 @@
+# Tests the attempted automatic coercion of the C locale to a UTF-8 locale
+
+import unittest
@@ -139,14 +144,31 @@ index 0000000..ad6ecac
+ interpreter_requires_environment,
+)
+
++# Set our expectation for the default encoding used in the C locale
++# for the filesystem encoding and the standard streams
++C_LOCALE_STREAM_ENCODING = "ascii"
++if sys.platform == "darwin":
++ C_LOCALE_FS_ENCODING = "utf-8"
++else:
++ C_LOCALE_FS_ENCODING = C_LOCALE_STREAM_ENCODING
++
++# Note that the above is probably still wrong in some cases, such as:
++# * Windows when PYTHONLEGACYWINDOWSFSENCODING is set
++# * AIX and any other platforms that use latin-1 in the C locale
++#
++# Options for dealing with this:
++# * Don't set PYTHON_COERCE_C_LOCALE on such platforms (e.g. Windows doesn't)
++# * Fix the test expectations to match the actual platform behaviour
++
+# In order to get the warning messages to match up as expected, the candidate
+# order here must much the target locale order in Python/pylifecycle.c
-+_C_UTF8_LOCALES = (
-+ # Entries: (Target locale, expected env var updates)
-+ ("C.UTF-8", "LC_CTYPE & LANG"),
-+ ("C.utf8", "LC_CTYPE & LANG"),
-+ ("UTF-8", "LC_CTYPE"),
-+)
++_C_UTF8_LOCALES = ("C.UTF-8", "C.utf8") #, "UTF-8")
++
++# XXX (ncoghlan): Using UTF-8 as a target locale is currently disabled due to
++# problems encountered on *BSD systems with those test cases
++# For additional details see:
++# nl_langinfo CODESET error:
https://bugs.python.org/issue30647
++# locale handling differences:
https://bugs.python.org/issue30672
+
+# There's no reliable cross-platform way of checking locale alias
+# lists, so the only way of knowing which of these locales will work
@@ -158,28 +180,39 @@ index 0000000..ad6ecac
+ result, py_cmd = run_python_until_end("-c", cmd, __isolated=True)
+ return result.rc == 0
+
-+_EncodingDetails = namedtuple("EncodingDetails",
-+ "fsencoding stdin_info stdout_info
stderr_info")
++_fields = "fsencoding stdin_info stdout_info stderr_info lang lc_ctype
lc_all"
++_EncodingDetails = namedtuple("EncodingDetails", _fields)
+
+class EncodingDetails(_EncodingDetails):
++ # XXX (ncoghlan): Using JSON for child state reporting may be less fragile
+ CHILD_PROCESS_SCRIPT = ";".join([
-+ "import sys",
++ "import sys, os",
+ "print(sys.getfilesystemencoding())",
+ "print(sys.stdin.encoding + ':' + sys.stdin.errors)",
+ "print(sys.stdout.encoding + ':' + sys.stdout.errors)",
+ "print(sys.stderr.encoding + ':' + sys.stderr.errors)",
++ "print(os.environ.get('LANG', 'not set'))",
++ "print(os.environ.get('LC_CTYPE', 'not set'))",
++ "print(os.environ.get('LC_ALL', 'not set'))",
+ ])
+
+ @classmethod
-+ def get_expected_details(cls, expected_fsencoding):
++ def get_expected_details(cls, coercion_expected, fs_encoding, stream_encoding,
env_vars):
+ """Returns expected child process details for a given
encoding"""
-+ _stream = expected_fsencoding + ":{}"
++ _stream = stream_encoding + ":{}"
+ # stdin and stdout should use surrogateescape either because the
+ # coercion triggered, or because the C locale was detected
+ stream_info = 2*[_stream.format("surrogateescape")]
+ # stderr should always use backslashreplace
+ stream_info.append(_stream.format("backslashreplace"))
-+ return dict(cls(expected_fsencoding, *stream_info)._asdict())
++ expected_lang = env_vars.get("LANG", "not set").lower()
++ if coercion_expected:
++ expected_lc_ctype = CLI_COERCION_TARGET.lower()
++ else:
++ expected_lc_ctype = env_vars.get("LC_CTYPE", "not
set").lower()
++ expected_lc_all = env_vars.get("LC_ALL", "not set").lower()
++ env_info = expected_lang, expected_lc_ctype, expected_lc_all
++ return dict(cls(fs_encoding, *stream_info, *env_info)._asdict())
+
+ @staticmethod
+ def _handle_output_variations(data):
@@ -215,99 +248,99 @@ index 0000000..ad6ecac
+ result.fail(py_cmd)
+ # All subprocess outputs in this test case should be pure ASCII
+ adjusted_output = cls._handle_output_variations(result.out)
-+ stdout_lines = adjusted_output.decode("ascii").rstrip().splitlines()
++ stdout_lines = adjusted_output.decode("ascii").splitlines()
+ child_encoding_details = dict(cls(*stdout_lines)._asdict())
+ stderr_lines = result.err.decode("ascii").rstrip().splitlines()
+ return child_encoding_details, stderr_lines
+
+
-+class _ChildProcessEncodingTestCase(unittest.TestCase):
-+ # Base class to check for expected encoding details in a child process
-+
-+ def _check_child_encoding_details(self,
-+ env_vars,
-+ expected_fsencoding,
-+ expected_warning):
-+ """Check the C locale handling for the given process environment
-+
-+ Parameters:
-+ expected_fsencoding: the encoding the child is expected to report
-+ allow_c_locale: setting to use for PYTHONALLOWCLOCALE
-+ None: don't set the variable at all
-+ str: the value set in the child's environment
-+ """
-+ result = EncodingDetails.get_child_details(env_vars)
-+ encoding_details, stderr_lines = result
-+ self.assertEqual(encoding_details,
-+ EncodingDetails.get_expected_details(
-+ expected_fsencoding))
-+ self.assertEqual(stderr_lines, expected_warning)
-+
+# Details of the shared library warning emitted at runtime
-+LIBRARY_C_LOCALE_WARNING = (
++LEGACY_LOCALE_WARNING = (
+ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
+ "encoding), which may cause Unicode compatibility problems. Using C.UTF-8,
"
+ "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
+ "locales is recommended."
+)
+
-+(a)unittest.skipUnless(sysconfig.get_config_var("PY_WARN_ON_C_LOCALE"),
-+ "C locale runtime warning disabled at build time")
-+class LocaleWarningTests(_ChildProcessEncodingTestCase):
-+ # Test warning emitted when running in the C locale
-+
-+ def test_library_c_locale_warning(self):
-+ self.maxDiff = None
-+ for locale_to_set in ("C", "POSIX",
"invalid.ascii"):
-+ var_dict = {
-+ "LC_ALL": locale_to_set
-+ }
-+ with self.subTest(forced_locale=locale_to_set):
-+ self._check_child_encoding_details(var_dict,
-+ "ascii",
-+ [LIBRARY_C_LOCALE_WARNING])
-+
+# Details of the CLI locale coercion warning emitted at runtime
+CLI_COERCION_WARNING_FMT = (
-+ "Python detected LC_CTYPE=C: {} coerced to {} (set another locale "
++ "Python detected LC_CTYPE=C: LC_CTYPE coerced to {} (set another locale "
+ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior)."
+)
+
-+class _LocaleCoercionTargetsTestCase(_ChildProcessEncodingTestCase):
-+ # Base class for test cases that rely on coercion targets being defined
+
-+ available_targets = []
-+ targets_required = True
++AVAILABLE_TARGETS = None
++CLI_COERCION_TARGET = None
++CLI_COERCION_WARNING = None
+
-+ @classmethod
-+ def setUpClass(cls):
-+ first_target_locale = first_env_updates = None
-+ available_targets = cls.available_targets
-+ # Find the target locales available in the current system
-+ for target_locale, env_updates in _C_UTF8_LOCALES:
-+ if _set_locale_in_subprocess(target_locale):
-+ available_targets.append(target_locale)
-+ if first_target_locale is None:
-+ first_target_locale = target_locale
-+ first_env_updates = env_updates
-+ if cls.targets_required and not available_targets:
-+ raise unittest.SkipTest("No C-with-UTF-8 locale available")
-+ # Expect coercion to use the first available locale
-+ cls.EXPECTED_COERCION_WARNING = CLI_COERCION_WARNING_FMT.format(
-+ first_env_updates, first_target_locale
++def setUpModule():
++ global AVAILABLE_TARGETS
++ global CLI_COERCION_TARGET
++ global CLI_COERCION_WARNING
++
++ if AVAILABLE_TARGETS is not None:
++ # initialization already done
++ return
++ AVAILABLE_TARGETS = []
++
++ # Find the target locales available in the current system
++ for target_locale in _C_UTF8_LOCALES:
++ if _set_locale_in_subprocess(target_locale):
++ AVAILABLE_TARGETS.append(target_locale)
++
++ if AVAILABLE_TARGETS:
++ # Coercion is expected to use the first available target locale
++ CLI_COERCION_TARGET = AVAILABLE_TARGETS[0]
++ CLI_COERCION_WARNING = CLI_COERCION_WARNING_FMT.format(CLI_COERCION_TARGET)
++
++
++class _LocaleHandlingTestCase(unittest.TestCase):
++ # Base class to check expected locale handling behaviour
++
++ def _check_child_encoding_details(self,
++ env_vars,
++ expected_fs_encoding,
++ expected_stream_encoding,
++ expected_warnings,
++ coercion_expected):
++ """Check the C locale handling for the given process environment
++
++ Parameters:
++ expected_fs_encoding: expected sys.getfilesystemencoding() result
++ expected_stream_encoding: expected encoding for standard streams
++ expected_warning: stderr output to expect (if any)
++ """
++ result = EncodingDetails.get_child_details(env_vars)
++ encoding_details, stderr_lines = result
++ expected_details = EncodingDetails.get_expected_details(
++ coercion_expected,
++ expected_fs_encoding,
++ expected_stream_encoding,
++ env_vars
+ )
++ self.assertEqual(encoding_details, expected_details)
++ if expected_warnings is None:
++ expected_warnings = []
++ self.assertEqual(stderr_lines, expected_warnings)
+
+
-+class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase):
++class LocaleConfigurationTests(_LocaleHandlingTestCase):
+ # Test explicit external configuration via the process environment
+
++ def setUpClass():
++ # This relies on setupModule() having been run, so it can't be
++ # handled via the @unittest.skipUnless decorator
++ if not AVAILABLE_TARGETS:
++ raise unittest.SkipTest("No C-with-UTF-8 locale available")
++
+ def test_external_target_locale_configuration(self):
++
+ # Explicitly setting a target locale should give the same behaviour as
+ # is seen when implicitly coercing to that target locale
+ self.maxDiff = None
+
-+ expected_warning = []
-+ expected_fsencoding = "utf-8"
++ expected_fs_encoding = "utf-8"
++ expected_stream_encoding = "utf-8"
+
+ base_var_dict = {
+ "LANG": "",
@@ -315,47 +348,71 @@ index 0000000..ad6ecac
+ "LC_ALL": "",
+ }
+ for env_var in ("LANG", "LC_CTYPE"):
-+ for locale_to_set in self.available_targets:
++ for locale_to_set in AVAILABLE_TARGETS:
++ # XXX (ncoghlan): LANG=UTF-8 doesn't appear to work as
++ # expected, so skip that combination for now
++ # See
https://bugs.python.org/issue30672 for discussion
++ if env_var == "LANG" and locale_to_set == "UTF-8":
++ continue
++
+ with self.subTest(env_var=env_var,
+ configured_locale=locale_to_set):
+ var_dict = base_var_dict.copy()
+ var_dict[env_var] = locale_to_set
+ self._check_child_encoding_details(var_dict,
-+ expected_fsencoding,
-+ expected_warning)
++ expected_fs_encoding,
++ expected_stream_encoding,
++ expected_warnings=None,
++ coercion_expected=False)
+
+
+
+(a)test.support.cpython_only
+(a)unittest.skipUnless(sysconfig.get_config_var("PY_COERCE_C_LOCALE"),
+ "C locale coercion disabled at build time")
-+class LocaleCoercionTests(_LocaleCoercionTargetsTestCase):
++class LocaleCoercionTests(_LocaleHandlingTestCase):
+ # Test implicit reconfiguration of the environment during CLI startup
+
-+ def _check_c_locale_coercion(self, expected_fsencoding, coerce_c_locale):
++ def _check_c_locale_coercion(self,
++ fs_encoding, stream_encoding,
++ coerce_c_locale,
++ expected_warnings=None,
++ coercion_expected=True,
++ **extra_vars):
+ """Check the C locale handling for various configurations
+
+ Parameters:
-+ expected_fsencoding: the encoding the child is expected to report
-+ allow_c_locale: setting to use for PYTHONALLOWCLOCALE
++ fs_encoding: expected sys.getfilesystemencoding() result
++ stream_encoding: expected encoding for standard streams
++ coerce_c_locale: setting to use for PYTHONCOERCECLOCALE
+ None: don't set the variable at all
+ str: the value set in the child's environment
++ expected_warnings: expected warning lines on stderr
++ extra_vars: additional environment variables to set in subprocess
+ """
-+
-+ # Check for expected warning on stderr if C locale is coerced
+ self.maxDiff = None
+
-+ expected_warning = []
-+ if coerce_c_locale != "0":
-+ expected_warning.append(self.EXPECTED_COERCION_WARNING)
++ if not AVAILABLE_TARGETS:
++ # Locale coercion is disabled when there aren't any target locales
++ fs_encoding = C_LOCALE_FS_ENCODING
++ stream_encoding = C_LOCALE_STREAM_ENCODING
++ coercion_expected = False
++ if expected_warnings:
++ expected_warnings = [LEGACY_LOCALE_WARNING]
+
+ base_var_dict = {
+ "LANG": "",
+ "LC_CTYPE": "",
+ "LC_ALL": "",
+ }
++ base_var_dict.update(extra_vars)
+ for env_var in ("LANG", "LC_CTYPE"):
+ for locale_to_set in ("", "C", "POSIX",
"invalid.ascii"):
++ # XXX (ncoghlan): *BSD platforms don't behave as expected in the
++ # POSIX locale, so we skip that for now
++ # See
https://bugs.python.org/issue30672 for discussion
++ if locale_to_set == "POSIX":
++ continue
+ with self.subTest(env_var=env_var,
+ nominal_locale=locale_to_set,
+ PYTHONCOERCECLOCALE=coerce_c_locale):
@@ -363,40 +420,72 @@ index 0000000..ad6ecac
+ var_dict[env_var] = locale_to_set
+ if coerce_c_locale is not None:
+ var_dict["PYTHONCOERCECLOCALE"] = coerce_c_locale
++ # Check behaviour on successful coercion
+ self._check_child_encoding_details(var_dict,
-+ expected_fsencoding,
-+ expected_warning)
++ fs_encoding,
++ stream_encoding,
++ expected_warnings,
++ coercion_expected)
+
+ def test_test_PYTHONCOERCECLOCALE_not_set(self):
+ # This should coerce to the first available target locale by default
-+ self._check_c_locale_coercion("utf-8", coerce_c_locale=None)
++ self._check_c_locale_coercion("utf-8", "utf-8",
coerce_c_locale=None)
+
+ def test_PYTHONCOERCECLOCALE_not_zero(self):
-+ # *Any* string other that "0" is considered "set" for our
purposes
++ # *Any* string other than "0" is considered "set" for our
purposes
+ # and hence should result in the locale coercion being enabled
+ for setting in ("", "1", "true",
"false"):
-+ self._check_c_locale_coercion("utf-8", coerce_c_locale=setting)
++ self._check_c_locale_coercion("utf-8", "utf-8",
coerce_c_locale=setting)
++
++ def test_PYTHONCOERCECLOCALE_set_to_warn(self):
++ # PYTHONCOERCECLOCALE=warn enables runtime warnings for legacy locales
++ self._check_c_locale_coercion("utf-8", "utf-8",
++ coerce_c_locale="warn",
++ expected_warnings=[CLI_COERCION_WARNING])
++
+
+ def test_PYTHONCOERCECLOCALE_set_to_zero(self):
+ # The setting "0" should result in the locale coercion being disabled
-+ self._check_c_locale_coercion("ascii", coerce_c_locale="0")
-+
++ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
++ C_LOCALE_STREAM_ENCODING,
++ coerce_c_locale="0",
++ coercion_expected=False)
++ # Setting LC_ALL=C shouldn't make any difference to the behaviour
++ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
++ C_LOCALE_STREAM_ENCODING,
++ coerce_c_locale="0",
++ LC_ALL="C",
++ coercion_expected=False)
++
++ def test_LC_ALL_set_to_C(self):
++ # Setting LC_ALL should render the locale coercion ineffective
++ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
++ C_LOCALE_STREAM_ENCODING,
++ coerce_c_locale=None,
++ LC_ALL="C",
++ coercion_expected=False)
++ # And result in a warning about a lack of locale compatibility
++ self._check_c_locale_coercion(C_LOCALE_FS_ENCODING,
++ C_LOCALE_STREAM_ENCODING,
++ coerce_c_locale="warn",
++ LC_ALL="C",
++ expected_warnings=[LEGACY_LOCALE_WARNING],
++ coercion_expected=False)
+
+def test_main():
+ test.support.run_unittest(
+ LocaleConfigurationTests,
-+ LocaleCoercionTests,
-+ LocaleWarningTests
++ LocaleCoercionTests
+ )
+ test.support.reap_children()
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
-index eb3e2c5..f677d88 100644
+index 6c3625d..009f542 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
-@@ -369,14 +369,15 @@ def setUp(self):
+@@ -369,14 +369,21 @@ class EmbeddingTests(unittest.TestCase):
def tearDown(self):
os.chdir(self.oldcwd)
@@ -405,6 +494,12 @@ index eb3e2c5..f677d88 100644
"""Runs a test in the embedded interpreter"""
cmd = [self.test_exe]
cmd.extend(args)
++ if env is not None and sys.platform == 'win32':
++ # Windows requires at least the SYSTEMROOT environment variable to
++ # start Python.
++ env = env.copy()
++ env['SYSTEMROOT'] = os.environ['SYSTEMROOT']
++
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
@@ -414,22 +509,31 @@ index eb3e2c5..f677d88 100644
(out, err) = p.communicate()
self.assertEqual(p.returncode, 0,
"bad returncode %d, stderr is %r" %
-@@ -386,7 +387,7 @@ def run_embedded_interpreter(self, *args):
+@@ -386,31 +393,21 @@ class EmbeddingTests(unittest.TestCase):
def test_subinterps(self):
# This is just a "don't crash" test
- out, err =
self.run_embedded_interpreter("repeated_init_and_subinterpreters")
+ out, err = self.run_embedded_interpreter()
- if support.verbose:
+ if support.verbose > 1:
print()
print(out)
print(err)
-@@ -403,13 +404,14 @@ def _get_default_pipe_encoding():
+- @staticmethod
+- def _get_default_pipe_encoding():
+- rp, wp = os.pipe()
+- try:
+- with os.fdopen(wp, 'w') as w:
+- default_pipe_encoding = w.encoding
+- finally:
+- os.close(rp)
+- return default_pipe_encoding
+-
def test_forced_io_encoding(self):
# Checks forced configuration of embedded interpreter IO streams
- out, err = self.run_embedded_interpreter("forced_io_encoding")
- if support.verbose:
-+ env = {"PYTHONIOENCODING": "UTF-8:surrogateescape"}
++ env = dict(os.environ, PYTHONIOENCODING="utf-8:surrogateescape")
+ out, err = self.run_embedded_interpreter("forced_io_encoding",
env=env)
+ if support.verbose > 1:
print()
@@ -437,16 +541,28 @@ index eb3e2c5..f677d88 100644
print(err)
- expected_errors = sys.__stdout__.errors
- expected_stdin_encoding = sys.__stdin__.encoding
+- expected_pipe_encoding = self._get_default_pipe_encoding()
++ expected_stream_encoding = "utf-8"
+ expected_errors = "surrogateescape"
-+ expected_stdin_encoding = "UTF-8"
- expected_pipe_encoding = self._get_default_pipe_encoding()
expected_output = '\n'.join([
"--- Use defaults ---",
+ "Expected encoding: default",
+@@ -437,8 +434,8 @@ class EmbeddingTests(unittest.TestCase):
+ "stdout: latin-1:replace",
+ "stderr: latin-1:backslashreplace"])
+ expected_output = expected_output.format(
+- in_encoding=expected_stdin_encoding,
+- out_encoding=expected_pipe_encoding,
++ in_encoding=expected_stream_encoding,
++ out_encoding=expected_stream_encoding,
+ errors=expected_errors)
+ # This is useful if we ever trip over odd platform behaviour
+ self.maxDiff = None
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
-index 958d282..c4c6850 100644
+index ae2bcd4..0a302ff 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
-@@ -8,8 +8,9 @@
+@@ -9,8 +9,9 @@ import sys
import subprocess
import tempfile
from test.support import script_helper, is_android
@@ -458,7 +574,7 @@ index 958d282..c4c6850 100644
# XXX (ncoghlan): Move to script_helper and make consistent with run_python
-@@ -150,6 +151,7 @@ def test_undecodable_code(self):
+@@ -151,6 +152,7 @@ class CmdLineTest(unittest.TestCase):
env = os.environ.copy()
# Use C locale to get ascii for the locale encoding
env['LC_ALL'] = 'C'
@@ -467,10 +583,10 @@ index 958d282..c4c6850 100644
b'import locale; '
b'print(ascii("' + undecodable + b'"), '
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
-index ed78e2a..3844812 100644
+index df9ebd4..63145e4 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
-@@ -682,6 +682,7 @@ def c_locale_get_error_handler(self, isolated=False, encoding=None):
+@@ -680,6 +680,7 @@ class SysModuleTest(unittest.TestCase):
# Force the POSIX locale
env = os.environ.copy()
env["LC_ALL"] = "C"
@@ -478,8 +594,25 @@ index ed78e2a..3844812 100644
code = '\n'.join((
'import sys',
'def dump(name):',
+diff --git a/Modules/main.c b/Modules/main.c
+index dd50211..f20cf24 100644
+--- a/Modules/main.c
++++ b/Modules/main.c
+@@ -105,7 +105,11 @@ static const char usage_6[] =
+ " predictable seed.\n"
+ "PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
+ " on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
+-" hooks.\n";
++" hooks.\n"
++
++"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
++" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
++" locale coercion and locale compatibility warnings on stderr.\n";
+
+ static int
+ usage(int exitcode, const wchar_t* program)
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
-index a68d4fa..280bf50 100644
+index 3968399..1bd2bbf 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -1,4 +1,5 @@
@@ -562,7 +695,7 @@ index a7afbc7..03f8295 100644
for (i = 0; i < argc; i++) {
PyMem_RawFree(argv_copy2[i]);
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index c0f41b3..278a5af 100644
+index a4f7f82..743d9b6 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -167,6 +167,7 @@ Py_SetStandardStreamEncoding(const char *encoding, const char
*errors)
@@ -573,7 +706,7 @@ index c0f41b3..278a5af 100644
/* Global initializations. Can be undone by Py_FinalizeEx(). Don't
call this twice without an intervening Py_FinalizeEx() call. When
initializations fail, a fatal error is issued and the function does
-@@ -302,6 +303,167 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
+@@ -301,6 +302,181 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
}
@@ -600,22 +733,64 @@ index c0f41b3..278a5af 100644
+int
+_Py_LegacyLocaleDetected(void)
+{
++#ifndef MS_WINDOWS
++ /* On non-Windows systems, the C locale is considered a legacy locale */
++ /* XXX (ncoghlan): some platforms (notably Mac OS X) don't appear to treat
++ * the POSIX locale as a simple alias for the C locale, so
++ * we may also want to check for that explicitly.
++ */
+ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
+ return ctype_loc != NULL && strcmp(ctype_loc, "C") == 0;
++#else
++ /* Windows uses code pages instead of locales, so no locale is legacy */
++ return 0;
++#endif
++}
++
++
++static const char *_C_LOCALE_WARNING =
++ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
++ "encoding), which may cause Unicode compatibility problems. Using C.UTF-8,
"
++ "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
++ "locales is recommended.\n";
++
++static int
++_legacy_locale_warnings_enabled(void)
++{
++ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
++ return (coerce_c_locale != NULL &&
++ strncmp(coerce_c_locale, "warn", 5) == 0);
++}
++
++static void
++_emit_stderr_warning_for_legacy_locale(void)
++{
++ if (_legacy_locale_warnings_enabled()) {
++ if (_Py_LegacyLocaleDetected()) {
++ fprintf(stderr, "%s", _C_LOCALE_WARNING);
++ }
++ }
+}
+
+typedef struct _CandidateLocale {
+ const char *locale_name; /* The locale to try as a coercion target */
-+ int set_LANG; /* Whether to set LANG in addition to LC_CTYPE */
+} _LocaleCoercionTarget;
+
+static _LocaleCoercionTarget _TARGET_LOCALES[] = {
-+ { "C.UTF-8", 1 },
-+ { "C.utf8", 1},
-+ { "UTF-8", 0 },
-+ { NULL, 0 }
++ {"C.UTF-8"},
++ {"C.utf8"},
++ /* {"UTF-8"}, */
++ {NULL}
+};
+
++/* XXX (ncoghlan): Using UTF-8 as a target locale is currently disabled due to
++ * problems encountered on *BSD systems with those test cases
++ * For additional details see:
++ * nl_langinfo CODESET error:
https://bugs.python.org/issue30647
++ * locale handling differences:
https://bugs.python.org/issue30672
++ */
++
++
+static char *
+get_default_standard_stream_error_handler(void)
+{
@@ -626,6 +801,7 @@ index c0f41b3..278a5af 100644
+ return "surrogateescape";
+ }
+
++#ifdef PY_COERCE_C_LOCALE
+ /* "surrogateescape" is the default in locale coercion target locales
*/
+ const _LocaleCoercionTarget *target = NULL;
+ for (target = _TARGET_LOCALES; target->locale_name; target++) {
@@ -633,6 +809,7 @@ index c0f41b3..278a5af 100644
+ return "surrogateescape";
+ }
+ }
++#endif
+ }
+
+ /* Otherwise return NULL to request the typical default error handler */
@@ -641,52 +818,34 @@ index c0f41b3..278a5af 100644
+
+#ifdef PY_COERCE_C_LOCALE
+static const char *_C_LOCALE_COERCION_WARNING =
-+ "Python detected LC_CTYPE=C: %.20s coerced to %.20s (set another locale "
++ "Python detected LC_CTYPE=C: LC_CTYPE coerced to %.20s (set another locale
"
+ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n";
+
+static void
+_coerce_default_locale_settings(const _LocaleCoercionTarget *target)
+{
-+ const char *env_vars_updated = "LC_CTYPE";
++
+ const char *newloc = target->locale_name;
+
+ /* Reset locale back to currently configured defaults */
+ setlocale(LC_ALL, "");
+
-+ /* Set the relevant locale environment variables */
++ /* Set the relevant locale environment variable */
+ if (setenv("LC_CTYPE", newloc, 1)) {
+ fprintf(stderr,
+ "Error setting LC_CTYPE, skipping C locale coercion\n");
+ return;
+ }
-+ if (target->set_LANG) {
-+ if (setenv("LANG", newloc, 1) == 0) {
-+ env_vars_updated = "LC_CTYPE & LANG";
-+ } else {
-+ fprintf(stderr,
-+ "Error setting LANG during C locale coercion\n");
-+ }
++ if (_legacy_locale_warnings_enabled()) {
++ fprintf(stderr, _C_LOCALE_COERCION_WARNING, newloc);
+ }
-+ fprintf(stderr, _C_LOCALE_COERCION_WARNING, env_vars_updated, newloc);
+
+ /* Reconfigure with the overridden environment variables */
+ setlocale(LC_ALL, "");
+}
-+
-+static int
-+c_locale_coercion_is_expected(void)
-+{
-+ /* This may be called prior to Py_Initialize, so we don't call any other
-+ * Python APIs, and we ignore the -E and -I flags
-+ */
-+ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
-+ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
-+ return 1;
-+ }
-+ return 0;
-+}
+#endif
+
++
+void
+_Py_CoerceLegacyLocale(void)
+{
@@ -697,9 +856,15 @@ index c0f41b3..278a5af 100644
+ * to give end users a way to force even scripts that are otherwise
+ * isolated from their environment to use the legacy ASCII-centric C
+ * locale.
-+ */
-+ if (c_locale_coercion_is_expected()) {
-+ /* PYTHONCOERCECLOCALE is not set, or is not set to exactly "0" */
++ *
++ * Ignoring -E and -I is safe from a security perspective, as we only use
++ * the setting to turn *off* the implicit locale coercion, and anyone with
++ * access to the process environment already has the ability to set
++ * `LC_ALL=C` to override the C level locale settings anyway.
++ */
++ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
++ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
++ /* PYTHONCOERCECLOCALE is not set, or is set to something other than
"0" */
+ const char *locale_override = getenv("LC_ALL");
+ if (locale_override == NULL || *locale_override == '\0') {
+ /* LC_ALL is also not set (or is set to an empty string) */
@@ -720,28 +885,10 @@ index c0f41b3..278a5af 100644
+}
+
+
-+#ifdef PY_WARN_ON_C_LOCALE
-+static const char *_C_LOCALE_WARNING =
-+ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
-+ "encoding), which may cause Unicode compatibility problems. Using C.UTF-8,
"
-+ "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
-+ "locales is recommended.\n";
-+
-+static void
-+_emit_stderr_warning_for_c_locale(void)
-+{
-+ if (c_locale_coercion_is_expected()) {
-+ if (_Py_LegacyLocaleDetected()) {
-+ fprintf(stderr, "%s", _C_LOCALE_WARNING);
-+ }
-+ }
-+}
-+#endif
-+
void
_Py_InitializeEx_Private(int install_sigs, int install_importlib)
{
-@@ -316,11 +478,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
+@@ -315,11 +491,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
initialized = 1;
_Py_Finalizing = NULL;
@@ -752,17 +899,17 @@ index c0f41b3..278a5af 100644
+ */
+ setlocale(LC_CTYPE, "C.UTF-8");
+#else
++#ifndef MS_WINDOWS
/* Set up the LC_CTYPE locale, so we can obtain
the locale's charset without having to switch
locales. */
setlocale(LC_CTYPE, "");
-+#ifdef PY_WARN_ON_C_LOCALE
-+ _emit_stderr_warning_for_c_locale();
++ _emit_stderr_warning_for_legacy_locale();
+#endif
#endif
if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
-@@ -1252,12 +1422,8 @@ initstdio(void)
+@@ -1242,12 +1426,8 @@ initstdio(void)
}
}
if (!errors && !(pythonioencoding && *pythonioencoding)) {
@@ -778,7 +925,7 @@ index c0f41b3..278a5af 100644
}
diff --git a/configure b/configure
-index c9340c6..8b1bd5b 100755
+index 2915246..39e5a27 100755
--- a/configure
+++ b/configure
@@ -834,6 +834,8 @@ with_thread
@@ -790,7 +937,7 @@ index c9340c6..8b1bd5b 100755
with_valgrind
with_dtrace
with_fpectl
-@@ -1538,6 +1540,12 @@ Optional Packages:
+@@ -1527,6 +1529,12 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-pymalloc disable/enable specialized mallocs
@@ -803,7 +950,7 @@ index c9340c6..8b1bd5b 100755
--with-valgrind Enable Valgrind support
--with(out)-dtrace disable/enable DTrace support
--with-fpectl enable SIGFPE catching
-@@ -11030,6 +11038,52 @@ fi
+@@ -11010,6 +11018,52 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pymalloc" >&5
$as_echo "$with_pymalloc" >&6; }
@@ -857,10 +1004,10 @@ index c9340c6..8b1bd5b 100755
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-valgrind"
>&5
$as_echo_n "checking for --with-valgrind... " >&6; }
diff --git a/configure.ac b/configure.ac
-index e065ce5..c455ebd 100644
+index 67dfba3..b9c9f04 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -3304,6 +3304,40 @@ then
+@@ -3279,6 +3279,40 @@ then
fi
AC_MSG_RESULT($with_pymalloc)
@@ -902,10 +1049,10 @@ index e065ce5..c455ebd 100644
AC_MSG_CHECKING([for --with-valgrind])
AC_ARG_WITH([valgrind],
diff --git a/pyconfig.h.in b/pyconfig.h.in
-index 0a3d59e..fa2792b 100644
+index b10c57f..0a6f3e2 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
-@@ -1247,9 +1247,15 @@
+@@ -1244,9 +1244,15 @@
/* Define as the preferred size in bits of long digits */
#undef PYLONG_BITS_IN_DIGIT
diff --git a/python3.spec b/python3.spec
index 9ac8875..d6687c7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -434,11 +434,6 @@ Patch252: 00252-add-executable-option.patch
# Reported upstream:
http://bugs.python.org/issue29324
Patch258: 00258-fix-test_aead_aes_gcm.patch
-# 00261 #
-# Use proper command line parsing in _testembed
-# Fixed upstream:
http://bugs.python.org/issue24932
-Patch261: 00261-use-proper-command-line-parsing-in-_testembed.patch
-
# 00262 #
# Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
#
https://www.python.org/dev/peps/pep-0538/
@@ -733,7 +728,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch251 -p1
%patch252 -p1
%patch258 -p1
-%patch261 -p1
%patch262 -p1
%ifarch aarch64
@@ -1702,6 +1696,9 @@ fi
# ======================================================
%changelog
+* Tue Jun 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-10
+- Update to the latest upstream implementation of PEP 538
+
* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
- Make pip and distutils in user environment install into separate location
commit 332b947dfc8d0f0d3a4525864b121d0f239beb4d
Author: Michal Cyprian <mcyprian(a)redhat.com>
Date: Mon Jun 26 16:32:56 2017 +0200
Make pip and distutils in user environment install into separate location
diff --git a/00251-change-user-install-location.patch
b/00251-change-user-install-location.patch
new file mode 100644
index 0000000..1dcd9f2
--- /dev/null
+++ b/00251-change-user-install-location.patch
@@ -0,0 +1,46 @@
+diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
+index 9d31d13..ed44a93 100644
+--- a/Lib/distutils/command/install.py
++++ b/Lib/distutils/command/install.py
+@@ -424,8 +424,18 @@ 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 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 = ""
++
++ 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 4744eb0..b5fe571 100644
+--- a/Lib/site.py
++++ b/Lib/site.py
+@@ -326,7 +326,15 @@ 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 the executable is /usr/bin/python*
++ and RPM build is not detected to make sudo pip installed packages visible.
++
++ """
++ if (ENABLE_USER_SITE and sys.executable.startswith("/usr/bin/python")
++ 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)
diff --git a/python3.spec b/python3.spec
index af93948..9ac8875 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -417,6 +417,12 @@ Patch243: 00243-fix-mips64-triplet.patch
# Not yet fixed upstream:
http://bugs.python.org/issue28787
Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
+# 00251
+# 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
+Patch251: 00251-change-user-install-location.patch
+
# 00252
# Add executable option to install.py command to make it work for
# scripts specified as an entry_points
@@ -724,6 +730,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch243 -p1
%patch249 -p1
+%patch251 -p1
%patch252 -p1
%patch258 -p1
%patch261 -p1
@@ -1695,6 +1702,9 @@ fi
# ======================================================
%changelog
+* Mon Jun 26 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.1-9
+- Make pip and distutils in user environment install into separate location
+
* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
- Fix test_alpn_protocols from test_ssl
- Do not require rebundled setuptools dependencies
commit b5403ba5eb1365bd25d6dbe0481e8bc817220ffb
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Sat Jun 24 17:24:42 2017 +0200
Fix test_alpn_protocols from test_ssl
diff --git a/00260-require-setuptools-dependencies.patch
b/00260-require-setuptools-dependencies.patch
deleted file mode 100644
index 2e3ac20..0000000
--- a/00260-require-setuptools-dependencies.patch
+++ /dev/null
@@ -1,183 +0,0 @@
-diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
-index 9f5d151..4dfa8a1 100644
---- a/Lib/ensurepip/__init__.py
-+++ b/Lib/ensurepip/__init__.py
-@@ -8,13 +8,25 @@ import tempfile
- __all__ = ["version", "bootstrap"]
-
-
--_SETUPTOOLS_VERSION = "28.8.0"
-+_SETUPTOOLS_VERSION = "34.2.0"
-
- _PIP_VERSION = "9.0.1"
-
-+_SIX_VERSION = "1.10.0"
-+
-+_APPDIRS_VERSION = "1.4.0"
-+
-+_PACKAGING_VERSION = "16.8"
-+
-+_PYPARSING_VERSION = "2.1.10"
-+
- _PROJECTS = [
-- ("setuptools", _SETUPTOOLS_VERSION),
-- ("pip", _PIP_VERSION),
-+ ("setuptools", _SETUPTOOLS_VERSION),
-+ ("pip", _PIP_VERSION),
-+ ("six", _SIX_VERSION),
-+ ("appdirs", _APPDIRS_VERSION),
-+ ("packaging", _PACKAGING_VERSION),
-+ ("pyparsing", _PYPARSING_VERSION)
- ]
-
-
-diff --git a/Lib/test/test_ensurepip.py b/Lib/test/test_ensurepip.py
-index 9b04c18..23664c4 100644
---- a/Lib/test/test_ensurepip.py
-+++ b/Lib/test/test_ensurepip.py
-@@ -40,13 +40,14 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "install", "--no-index", "--find-links",
-- unittest.mock.ANY, "setuptools", "pip",
-+ unittest.mock.ANY,
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-
- additional_paths = self.run_pip.call_args[0][1]
-- self.assertEqual(len(additional_paths), 2)
-+ self.assertEqual(len(additional_paths), 6)
-
- def test_bootstrapping_with_root(self):
- ensurepip.bootstrap(root="/foo/bar/")
-@@ -55,7 +56,7 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
- [
- "install", "--no-index", "--find-links",
- unittest.mock.ANY, "--root", "/foo/bar/",
-- "setuptools", "pip",
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-@@ -66,7 +67,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "install", "--no-index", "--find-links",
-- unittest.mock.ANY, "--user", "setuptools",
"pip",
-+ unittest.mock.ANY, "--user",
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-@@ -77,7 +79,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "install", "--no-index", "--find-links",
-- unittest.mock.ANY, "--upgrade", "setuptools",
"pip",
-+ unittest.mock.ANY, "--upgrade",
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-@@ -88,7 +91,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "install", "--no-index", "--find-links",
-- unittest.mock.ANY, "-v", "setuptools",
"pip",
-+ unittest.mock.ANY, "-v",
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-@@ -99,7 +103,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "install", "--no-index", "--find-links",
-- unittest.mock.ANY, "-vv", "setuptools",
"pip",
-+ unittest.mock.ANY, "-vv",
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-@@ -110,7 +115,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "install", "--no-index", "--find-links",
-- unittest.mock.ANY, "-vvv", "setuptools",
"pip",
-+ unittest.mock.ANY, "-vvv",
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-@@ -186,8 +192,8 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
-
- self.run_pip.assert_called_once_with(
- [
-- "uninstall", "-y",
"--disable-pip-version-check", "pip",
-- "setuptools",
-+ "uninstall", "-y",
"--disable-pip-version-check",
-+ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
- ]
- )
-
-@@ -197,8 +203,8 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
-
- self.run_pip.assert_called_once_with(
- [
-- "uninstall", "-y",
"--disable-pip-version-check", "-v", "pip",
-- "setuptools",
-+ "uninstall", "-y",
"--disable-pip-version-check", "-v",
-+ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
- ]
- )
-
-@@ -208,8 +214,8 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
-
- self.run_pip.assert_called_once_with(
- [
-- "uninstall", "-y",
"--disable-pip-version-check", "-vv", "pip",
-- "setuptools",
-+ "uninstall", "-y",
"--disable-pip-version-check", "-vv",
-+ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
- ]
- )
-
-@@ -220,7 +226,7 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "uninstall", "-y",
"--disable-pip-version-check", "-vvv",
-- "pip", "setuptools",
-+ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
- ]
- )
-
-@@ -260,13 +266,14 @@ class TestBootstrappingMainFunction(EnsurepipMixin,
unittest.TestCase):
- self.run_pip.assert_called_once_with(
- [
- "install", "--no-index", "--find-links",
-- unittest.mock.ANY, "setuptools", "pip",
-+ unittest.mock.ANY,
-+ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
- ],
- unittest.mock.ANY,
- )
-
- additional_paths = self.run_pip.call_args[0][1]
-- self.assertEqual(len(additional_paths), 2)
-+ self.assertEqual(len(additional_paths), 6)
-
- class TestUninstallationMainFunction(EnsurepipMixin, unittest.TestCase):
-
-@@ -284,8 +291,8 @@ class TestUninstallationMainFunction(EnsurepipMixin,
unittest.TestCase):
-
- self.run_pip.assert_called_once_with(
- [
-- "uninstall", "-y",
"--disable-pip-version-check", "pip",
-- "setuptools",
-+ "uninstall", "-y",
"--disable-pip-version-check", "pyparsing", "packaging",
-+ "appdirs", "six", "pip",
"setuptools",
- ]
- )
-
diff --git a/00270-fix-ssl-alpn-hook-test.patch b/00270-fix-ssl-alpn-hook-test.patch
new file mode 100644
index 0000000..97b433e
--- /dev/null
+++ b/00270-fix-ssl-alpn-hook-test.patch
@@ -0,0 +1,16 @@
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+index d203cdd..c128dae 100644
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -3256,8 +3256,9 @@ if _have_threads:
+ except ssl.SSLError as e:
+ stats = e
+
+- if expected is None and IS_OPENSSL_1_1:
+- # OpenSSL 1.1.0 raises handshake error
++ if (expected is None and IS_OPENSSL_1_1
++ and ssl.OPENSSL_VERSION_INFO < (1, 1, 0, 6)):
++ # OpenSSL 1.1.0 to 1.1.0e raises handshake error
+ self.assertIsInstance(stats, ssl.SSLError)
+ else:
+ msg = "failed trying %s (s) and %s (c).\n" \
diff --git a/python3.spec b/python3.spec
index 21892d5..af93948 100644
--- a/python3.spec
+++ b/python3.spec
@@ -133,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -453,6 +453,12 @@ Patch264: 00264-skip-test-failing-on-aarch64.patch
# Fixed upstream:
http://bugs.python.org/issue29243
Patch269: 00269-fix-multiple-compilations-issue-with-pgo-builds.patch
+# 00270 #
+# Fix test_alpn_protocols from test_ssl as openssl > 1.1.0f
+# changed the behaviour of the ALPN hook.
+# Fixed upstream:
http://bugs.python.org/issue30714
+Patch270: 00270-fix-ssl-alpn-hook-test.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -728,6 +734,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%endif
%patch269 -p1
+%patch270 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1688,6 +1695,10 @@ fi
# ======================================================
%changelog
+* Fri Jun 23 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-8
+- Fix test_alpn_protocols from test_ssl
+- Do not require rebundled setuptools dependencies
+
* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
- Added a dependency to the devel subpackage on python3-rpm-generators which
have been excised out of rpm-build
commit 3f280d64adee5afc57f353aed13c2e4e0ff2df00
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Jun 19 11:10:58 2017 +0200
setuptools from version 36.0.0 rebundled its dependencies so we don't have to
require them in order for rewheel to work, so dropping patch 260 as well.
diff --git a/python3.spec b/python3.spec
index 842815e..21892d5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -194,10 +194,6 @@ BuildRequires: zlib-devel
%if 0%{?with_rewheel}
BuildRequires: python3-setuptools
-BuildRequires: python3-six
-BuildRequires: python3-pyparsing
-BuildRequires: python3-appdirs
-BuildRequires: python3-packaging
BuildRequires: python3-pip
%endif
@@ -432,15 +428,6 @@ Patch252: 00252-add-executable-option.patch
# Reported upstream:
http://bugs.python.org/issue29324
Patch258: 00258-fix-test_aead_aes_gcm.patch
-# 00260 #
-# setuptools from version 34.0.0 and onwards, unbundled its dependencies
-# and started requiring them so when rewheel mode is enabled we will have
-# to BuildRequire the new dependencies, in order for the virtualenv's to work
properly
-# setuptools change:
https://setuptools.readthedocs.io/en/latest/history.html#v34-0-0
-# Reported upstream:
http://bugs.python.org/issue29523
-#
https://github.com/python/cpython/pull/67
-Patch260: 00260-require-setuptools-dependencies.patch
-
# 00261 #
# Use proper command line parsing in _testembed
# Fixed upstream:
http://bugs.python.org/issue24932
@@ -733,7 +720,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch249 -p1
%patch252 -p1
%patch258 -p1
-%patch260 -p1
%patch261 -p1
%patch262 -p1
commit bb9ca6b393d9ee89f6da107dd371b79473aebaa6
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Fri May 5 16:47:58 2017 +0200
Add dependency to the devel subpackage on python3-rpm-generators
... which have been excised out of rpm-build.
Involves: rhbz#1410631, rhbz#1444925
diff --git a/python3.spec b/python3.spec
index c25f196..842815e 100644
--- a/python3.spec
+++ b/python3.spec
@@ -8,9 +8,15 @@
# and other packages, in order to rebase Python 3 one has to build in the
# following order:
#
-# 1. gdb without python support (add %%global _without_python 1 on top of gdb's SPEC
file)
+# 1. At the same time:
+# - gdb without python support (add %%global _without_python 1 on top of gdb's
SPEC file)
+# - python-rpm-generators with bootstrapping_python set to 1
+# (this can be done also during step 2., but should be done before 3.)
# 2. python3 with with_rewheel set to 0
-# 3. gdb with python support (remove %%global _without_python 1 on top of gdb's SPEC
file)
+# 3. At the same time:
+# - gdb with python support (remove %%global _without_python 1 on top of gdb's
SPEC file)
+# - python-rpm-generators with bootstrapping_python set to 0
+# (this can be done at any later step without negative effects)
# 4. rpm
# 5. python-setuptools with bootstrap set to 1
# 6. python-pip with build_wheel set to 0
@@ -127,7 +133,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -572,6 +578,7 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
BuildRequires: python-rpm-macros
Requires: python-rpm-macros
Requires: python3-rpm-macros
+Requires: python3-rpm-generators
Conflicts: %{name} < %{version}-%{release}
%description devel
@@ -1695,6 +1702,12 @@ fi
# ======================================================
%changelog
+* Tue May 16 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-7
+- Added a dependency to the devel subpackage on python3-rpm-generators which
+ have been excised out of rpm-build
+- Updated notes on bootstrapping Python on top of this specfile accordingly
+- Involves: rhbz#1410631, rhbz#1444925
+
* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
- Enable profile guided optimizations for x86_64 and i686 architectures
- Update to a newer implementation of PEP 538
commit afb0016f9d576733d43ff478931d6fb066f224e4
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Tue May 16 11:06:53 2017 +0200
Polishing the Notes on bootstrapping Python
diff --git a/python3.spec b/python3.spec
index 6545d83..c25f196 100644
--- a/python3.spec
+++ b/python3.spec
@@ -4,25 +4,29 @@
# NOTES ON BOOTSTRAPING PYTHON 3.6:
#
-# Due to dependency cycle between Python, gdb, rpm, pip, setuptools and
-# wheel, in order to rebase Python 3, one has to build in the following order:
+# Due to a dependency cycle between Python, gdb, rpm, pip, setuptools, wheel,
+# and other packages, in order to rebase Python 3 one has to build in the
+# following order:
#
-# 1) gdb without python support (add %%global _without_python 1 on top of gdb's SPEC
file)
-# 2) python3 with with_rewheel set to 0
-# 3) gdb with python support (remove %%global _without_python 1 on top of gdb's SPEC
file)
-# 4) rpm
-# 5) python-setuptools with bootstrap set to 1
-# 6) python-pip with build_wheel set to 0
-# 7) python-wheel with %%bcond_without bootstrap
-# 8) python-setuptools with bootstrap set to 0 and also with_check set to 0
-# 9) python-pip with build_wheel set to 1
-# 10) pyparsing
-# 11) python3 with with_rewheel set to 1
+# 1. gdb without python support (add %%global _without_python 1 on top of gdb's SPEC
file)
+# 2. python3 with with_rewheel set to 0
+# 3. gdb with python support (remove %%global _without_python 1 on top of gdb's SPEC
file)
+# 4. rpm
+# 5. python-setuptools with bootstrap set to 1
+# 6. python-pip with build_wheel set to 0
+# 7. python-wheel with %%bcond_without bootstrap
+# 8. python-setuptools with bootstrap set to 0 and also with_check set to 0
+# 9. python-pip with build_wheel set to 1
+# 10. pyparsing
+# 11. python3 with with_rewheel set to 1
#
-# Then the most important packages have to be built, starting from their various leaf
dependencies
-# recursively. After these have been built, a targeted rebuild should be requested for
the rest.
-# Currently these packages are recommended to have been built before a targeted rebuild
after a python abi change:
-# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt.
+# Then the most important packages have to be built, starting from their
+# various leaf dependencies recursively. After these have been built, a
+# targeted rebuild should be requested for the rest.
+#
+# Currently these packages are recommended to have been built before a targeted
+# rebuild after a python abi change:
+# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt
%global with_rewheel 1
commit 2287f0c54b02245807e4dfec8daef6340b345fbf
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue May 9 17:05:44 2017 +0200
Fix conditional macro
diff --git a/python3.spec b/python3.spec
index ff229f8..6545d83 100644
--- a/python3.spec
+++ b/python3.spec
@@ -835,7 +835,7 @@ BuildPython optimized \
"--without-ensurepip --enable-optimizations" \
%else
"--without-ensurepip" \
-%end
+%endif
true
# ======================================================
commit 27c558eb663e30c60d0b70e5067d43b925fb18da
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue May 9 16:57:18 2017 +0200
Added patch for fixing recompilation of Python when using common
build commands and the --enable-optimizations flag.
Enable profile guided optimizations for x86_64 and i686 architectures
diff --git a/00269-fix-multiple-compilations-issue-with-pgo-builds.patch
b/00269-fix-multiple-compilations-issue-with-pgo-builds.patch
new file mode 100644
index 0000000..a911feb
--- /dev/null
+++ b/00269-fix-multiple-compilations-issue-with-pgo-builds.patch
@@ -0,0 +1,67 @@
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 0e1d0af..42ab191 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -989,7 +989,7 @@ TESTTIMEOUT= 1200
+
+ # Run a basic set of regression tests.
+ # This excludes some tests that are particularly resource-intensive.
+-test: all platform
++test: @DEF_MAKE_RULE@ platform
+ $(TESTRUNNER) $(TESTOPTS)
+
+ # Run the full test suite twice - once without .pyc files, and once with.
+@@ -999,7 +999,7 @@ test: all platform
+ # the bytecode read from a .pyc file had the bug, sometimes the directly
+ # generated bytecode. This is sometimes a very shy bug needing a lot of
+ # sample data.
+-testall: all platform
++testall: @DEF_MAKE_RULE@ platform
+ -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
+ $(TESTPYTHON) -E $(srcdir)/Lib/compileall.py
+ -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f
+@@ -1008,7 +1008,7 @@ testall: all platform
+
+ # Run the test suite for both architectures in a Universal build on OSX.
+ # Must be run on an Intel box.
+-testuniversal: all platform
++testuniversal: @DEF_MAKE_RULE@ platform
+ if [ `arch` != 'i386' ];then \
+ echo "This can only be used on OSX/i386" ;\
+ exit 1 ;\
+@@ -1031,7 +1031,7 @@ QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3
\
+ test_multiprocessing_forkserver \
+ test_mailbox test_socket test_poll \
+ test_select test_zipfile test_concurrent_futures
+-quicktest: all platform
++quicktest: @DEF_MAKE_RULE@ platform
+ $(TESTRUNNER) $(QUICKTESTOPTS)
+
+
+@@ -1368,7 +1368,7 @@ LIBPL= $(LIBDEST)/config-$(LDVERSION)-$(MULTIARCH)
+ # pkgconfig directory
+ LIBPC= $(LIBDIR)/pkgconfig
+
+-libainstall: all python-config
++libainstall: @DEF_MAKE_RULE@ python-config
+ @for i in $(LIBDIR) $(LIBPL) $(LIBPC); \
+ do \
+ if test ! -d $(DESTDIR)$$i; then \
+@@ -1616,7 +1616,7 @@ distclean: clobber
+ -exec rm -f {} ';'
+
+ # Check for smelly exported symbols (not starting with Py/_Py)
+-smelly: all
++smelly: @DEF_MAKE_RULE@
+ nm -p $(LIBRARY) | \
+ sed -n "/ [TDB] /s/.* //p" | grep -v "^_*Py" | sort -u; \
+
+@@ -1653,7 +1653,7 @@ funny:
+ -o -print
+
+ # Perform some verification checks on any modified files.
+-patchcheck: all
++patchcheck: @DEF_MAKE_RULE@
+ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
+
+ # Dependencies
diff --git a/python3.spec b/python3.spec
index 9a29f09..ff229f8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -123,7 +123,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -443,6 +443,19 @@ Patch261: 00261-use-proper-command-line-parsing-in-_testembed.patch
# Original proposal:
https://bugzilla.redhat.com/show_bug.cgi?id=1404918
Patch262: 00262-pep538_coerce_legacy_c_locale.patch
+# 00264 #
+# test_pass_by_value was added in Python 3.6.1 and on aarch64
+# it is catching an error that was there, but wasn't tested before.
+# Therefore skipping the test on aarch64 until fixed upstream.
+# Reported upstream:
http://bugs.python.org/issue29804
+Patch264: 00264-skip-test-failing-on-aarch64.patch
+
+# 00269 #
+# Fix python's recompilation with common build commands when using
+# profile guided optimizations.
+# Fixed upstream:
http://bugs.python.org/issue29243
+Patch269: 00269-fix-multiple-compilations-issue-with-pgo-builds.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -452,14 +465,6 @@ Patch262: 00262-pep538_coerce_legacy_c_locale.patch
#
#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
-# 00264 #
-# test_pass_by_value was added in Python 3.6.1 and on aarch64
-# it is catching an error that was there, but wasn't tested before.
-# Therefore skipping the test on aarch64 until fixed upstream.
-# Reported upstream:
http://bugs.python.org/issue29804
-Patch264: 00264-skip-test-failing-on-aarch64.patch
-
-
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -725,6 +730,8 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch264 -p1
%endif
+%patch269 -p1
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -824,7 +831,11 @@ BuildPython debug \
BuildPython optimized \
python \
python%{pybasever} \
+%ifarch %{ix86} x86_64
+ "--without-ensurepip --enable-optimizations" \
+%else
"--without-ensurepip" \
+%end
true
# ======================================================
@@ -1680,6 +1691,11 @@ fi
# ======================================================
%changelog
+* Tue May 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-6
+- Enable profile guided optimizations for x86_64 and i686 architectures
+- Update to a newer implementation of PEP 538
+- Update description to reflect that Python 3 is now the default Python
+
* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
- Update PEP 538 to the latest upstream implementation
commit 51bb7c4cc20ee7e52adfa7bc5ad80ef5937323e3
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue May 9 14:44:40 2017 +0200
Update to a newer implementation of PEP 538
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index 462f2aa..7802567 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -1,5 +1,5 @@
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
-index 195f63f..0d0a127 100644
+index 08dc311..c6ec147 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
@@ -713,6 +713,40 @@ conflict.
@@ -44,10 +44,10 @@ index 195f63f..0d0a127 100644
~~~~~~~~~~~~~~~~~~~~
diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
-index ca5f9c2..7aa460b 100644
+index 1e74647..b3ac848 100644
--- a/Lib/test/support/script_helper.py
+++ b/Lib/test/support/script_helper.py
-@@ -51,8 +51,35 @@ def interpreter_requires_environment():
+@@ -48,8 +48,35 @@ def interpreter_requires_environment():
return __cached_interp_requires_environment
@@ -85,7 +85,7 @@ index ca5f9c2..7aa460b 100644
# Executing the interpreter in a subprocess
-@@ -110,30 +137,7 @@ def run_python_until_end(*args, **env_vars):
+@@ -107,30 +134,7 @@ def run_python_until_end(*args, **env_vars):
def _assert_python(expected_success, *args, **env_vars):
res, cmd_line = run_python_until_end(*args, **env_vars)
if (res.rc and expected_success) or (not res.rc and not expected_success):
@@ -117,11 +117,286 @@ index ca5f9c2..7aa460b 100644
return res
def assert_python_ok(*args, **env_vars):
+diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py
+new file mode 100644
+index 0000000..ad6ecac
+--- /dev/null
++++ b/Lib/test/test_c_locale_coercion.py
+@@ -0,0 +1,269 @@
++# Tests the attempted automatic coercion of the C locale to a UTF-8 locale
++
++import unittest
++import os
++import sys
++import sysconfig
++import shutil
++import subprocess
++from collections import namedtuple
++
++import test.support
++from test.support.script_helper import (
++ run_python_until_end,
++ interpreter_requires_environment,
++)
++
++# In order to get the warning messages to match up as expected, the candidate
++# order here must much the target locale order in Python/pylifecycle.c
++_C_UTF8_LOCALES = (
++ # Entries: (Target locale, expected env var updates)
++ ("C.UTF-8", "LC_CTYPE & LANG"),
++ ("C.utf8", "LC_CTYPE & LANG"),
++ ("UTF-8", "LC_CTYPE"),
++)
++
++# There's no reliable cross-platform way of checking locale alias
++# lists, so the only way of knowing which of these locales will work
++# is to try them with locale.setlocale(). We do that in a subprocess
++# to avoid altering the locale of the test runner.
++def _set_locale_in_subprocess(locale_name):
++ cmd_fmt = "import locale; print(locale.setlocale(locale.LC_CTYPE,
'{}'))"
++ cmd = cmd_fmt.format(locale_name)
++ result, py_cmd = run_python_until_end("-c", cmd, __isolated=True)
++ return result.rc == 0
++
++_EncodingDetails = namedtuple("EncodingDetails",
++ "fsencoding stdin_info stdout_info
stderr_info")
++
++class EncodingDetails(_EncodingDetails):
++ CHILD_PROCESS_SCRIPT = ";".join([
++ "import sys",
++ "print(sys.getfilesystemencoding())",
++ "print(sys.stdin.encoding + ':' + sys.stdin.errors)",
++ "print(sys.stdout.encoding + ':' + sys.stdout.errors)",
++ "print(sys.stderr.encoding + ':' + sys.stderr.errors)",
++ ])
++
++ @classmethod
++ def get_expected_details(cls, expected_fsencoding):
++ """Returns expected child process details for a given
encoding"""
++ _stream = expected_fsencoding + ":{}"
++ # stdin and stdout should use surrogateescape either because the
++ # coercion triggered, or because the C locale was detected
++ stream_info = 2*[_stream.format("surrogateescape")]
++ # stderr should always use backslashreplace
++ stream_info.append(_stream.format("backslashreplace"))
++ return dict(cls(expected_fsencoding, *stream_info)._asdict())
++
++ @staticmethod
++ def _handle_output_variations(data):
++ """Adjust the output to handle platform specific idiosyncrasies
++
++ * Some platforms report ASCII as ANSI_X3.4-1968
++ * Some platforms report ASCII as US-ASCII
++ * Some platforms report UTF-8 instead of utf-8
++ """
++ data = data.replace(b"ANSI_X3.4-1968", b"ascii")
++ data = data.replace(b"US-ASCII", b"ascii")
++ data = data.lower()
++ return data
++
++ @classmethod
++ def get_child_details(cls, env_vars):
++ """Retrieves fsencoding and standard stream details from a child
process
++
++ Returns (encoding_details, stderr_lines):
++
++ - encoding_details: EncodingDetails for eager decoding
++ - stderr_lines: result of calling splitlines() on the stderr output
++
++ The child is run in isolated mode if the current interpreter supports
++ that.
++ """
++ result, py_cmd = run_python_until_end(
++ "-c", cls.CHILD_PROCESS_SCRIPT,
++ __isolated=True,
++ **env_vars
++ )
++ if not result.rc == 0:
++ result.fail(py_cmd)
++ # All subprocess outputs in this test case should be pure ASCII
++ adjusted_output = cls._handle_output_variations(result.out)
++ stdout_lines = adjusted_output.decode("ascii").rstrip().splitlines()
++ child_encoding_details = dict(cls(*stdout_lines)._asdict())
++ stderr_lines = result.err.decode("ascii").rstrip().splitlines()
++ return child_encoding_details, stderr_lines
++
++
++class _ChildProcessEncodingTestCase(unittest.TestCase):
++ # Base class to check for expected encoding details in a child process
++
++ def _check_child_encoding_details(self,
++ env_vars,
++ expected_fsencoding,
++ expected_warning):
++ """Check the C locale handling for the given process environment
++
++ Parameters:
++ expected_fsencoding: the encoding the child is expected to report
++ allow_c_locale: setting to use for PYTHONALLOWCLOCALE
++ None: don't set the variable at all
++ str: the value set in the child's environment
++ """
++ result = EncodingDetails.get_child_details(env_vars)
++ encoding_details, stderr_lines = result
++ self.assertEqual(encoding_details,
++ EncodingDetails.get_expected_details(
++ expected_fsencoding))
++ self.assertEqual(stderr_lines, expected_warning)
++
++# Details of the shared library warning emitted at runtime
++LIBRARY_C_LOCALE_WARNING = (
++ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
++ "encoding), which may cause Unicode compatibility problems. Using C.UTF-8,
"
++ "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
++ "locales is recommended."
++)
++
++(a)unittest.skipUnless(sysconfig.get_config_var("PY_WARN_ON_C_LOCALE"),
++ "C locale runtime warning disabled at build time")
++class LocaleWarningTests(_ChildProcessEncodingTestCase):
++ # Test warning emitted when running in the C locale
++
++ def test_library_c_locale_warning(self):
++ self.maxDiff = None
++ for locale_to_set in ("C", "POSIX",
"invalid.ascii"):
++ var_dict = {
++ "LC_ALL": locale_to_set
++ }
++ with self.subTest(forced_locale=locale_to_set):
++ self._check_child_encoding_details(var_dict,
++ "ascii",
++ [LIBRARY_C_LOCALE_WARNING])
++
++# Details of the CLI locale coercion warning emitted at runtime
++CLI_COERCION_WARNING_FMT = (
++ "Python detected LC_CTYPE=C: {} coerced to {} (set another locale "
++ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior)."
++)
++
++class _LocaleCoercionTargetsTestCase(_ChildProcessEncodingTestCase):
++ # Base class for test cases that rely on coercion targets being defined
++
++ available_targets = []
++ targets_required = True
++
++ @classmethod
++ def setUpClass(cls):
++ first_target_locale = first_env_updates = None
++ available_targets = cls.available_targets
++ # Find the target locales available in the current system
++ for target_locale, env_updates in _C_UTF8_LOCALES:
++ if _set_locale_in_subprocess(target_locale):
++ available_targets.append(target_locale)
++ if first_target_locale is None:
++ first_target_locale = target_locale
++ first_env_updates = env_updates
++ if cls.targets_required and not available_targets:
++ raise unittest.SkipTest("No C-with-UTF-8 locale available")
++ # Expect coercion to use the first available locale
++ cls.EXPECTED_COERCION_WARNING = CLI_COERCION_WARNING_FMT.format(
++ first_env_updates, first_target_locale
++ )
++
++
++class LocaleConfigurationTests(_LocaleCoercionTargetsTestCase):
++ # Test explicit external configuration via the process environment
++
++ def test_external_target_locale_configuration(self):
++ # Explicitly setting a target locale should give the same behaviour as
++ # is seen when implicitly coercing to that target locale
++ self.maxDiff = None
++
++ expected_warning = []
++ expected_fsencoding = "utf-8"
++
++ base_var_dict = {
++ "LANG": "",
++ "LC_CTYPE": "",
++ "LC_ALL": "",
++ }
++ for env_var in ("LANG", "LC_CTYPE"):
++ for locale_to_set in self.available_targets:
++ with self.subTest(env_var=env_var,
++ configured_locale=locale_to_set):
++ var_dict = base_var_dict.copy()
++ var_dict[env_var] = locale_to_set
++ self._check_child_encoding_details(var_dict,
++ expected_fsencoding,
++ expected_warning)
++
++
++
++(a)test.support.cpython_only
++(a)unittest.skipUnless(sysconfig.get_config_var("PY_COERCE_C_LOCALE"),
++ "C locale coercion disabled at build time")
++class LocaleCoercionTests(_LocaleCoercionTargetsTestCase):
++ # Test implicit reconfiguration of the environment during CLI startup
++
++ def _check_c_locale_coercion(self, expected_fsencoding, coerce_c_locale):
++ """Check the C locale handling for various configurations
++
++ Parameters:
++ expected_fsencoding: the encoding the child is expected to report
++ allow_c_locale: setting to use for PYTHONALLOWCLOCALE
++ None: don't set the variable at all
++ str: the value set in the child's environment
++ """
++
++ # Check for expected warning on stderr if C locale is coerced
++ self.maxDiff = None
++
++ expected_warning = []
++ if coerce_c_locale != "0":
++ expected_warning.append(self.EXPECTED_COERCION_WARNING)
++
++ base_var_dict = {
++ "LANG": "",
++ "LC_CTYPE": "",
++ "LC_ALL": "",
++ }
++ for env_var in ("LANG", "LC_CTYPE"):
++ for locale_to_set in ("", "C", "POSIX",
"invalid.ascii"):
++ with self.subTest(env_var=env_var,
++ nominal_locale=locale_to_set,
++ PYTHONCOERCECLOCALE=coerce_c_locale):
++ var_dict = base_var_dict.copy()
++ var_dict[env_var] = locale_to_set
++ if coerce_c_locale is not None:
++ var_dict["PYTHONCOERCECLOCALE"] = coerce_c_locale
++ self._check_child_encoding_details(var_dict,
++ expected_fsencoding,
++ expected_warning)
++
++ def test_test_PYTHONCOERCECLOCALE_not_set(self):
++ # This should coerce to the first available target locale by default
++ self._check_c_locale_coercion("utf-8", coerce_c_locale=None)
++
++ def test_PYTHONCOERCECLOCALE_not_zero(self):
++ # *Any* string other that "0" is considered "set" for our
purposes
++ # and hence should result in the locale coercion being enabled
++ for setting in ("", "1", "true",
"false"):
++ self._check_c_locale_coercion("utf-8", coerce_c_locale=setting)
++
++ def test_PYTHONCOERCECLOCALE_set_to_zero(self):
++ # The setting "0" should result in the locale coercion being disabled
++ self._check_c_locale_coercion("ascii", coerce_c_locale="0")
++
++
++def test_main():
++ test.support.run_unittest(
++ LocaleConfigurationTests,
++ LocaleCoercionTests,
++ LocaleWarningTests
++ )
++ test.support.reap_children()
++
++if __name__ == "__main__":
++ test_main()
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
-index 2a53f3d..391ca15 100644
+index eb3e2c5..f677d88 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
-@@ -369,14 +369,15 @@ class EmbeddingTests(unittest.TestCase):
+@@ -369,14 +369,15 @@ def setUp(self):
def tearDown(self):
os.chdir(self.oldcwd)
@@ -139,7 +414,7 @@ index 2a53f3d..391ca15 100644
(out, err) = p.communicate()
self.assertEqual(p.returncode, 0,
"bad returncode %d, stderr is %r" %
-@@ -386,7 +387,7 @@ class EmbeddingTests(unittest.TestCase):
+@@ -386,7 +387,7 @@ def run_embedded_interpreter(self, *args):
def test_subinterps(self):
# This is just a "don't crash" test
out, err =
self.run_embedded_interpreter("repeated_init_and_subinterpreters")
@@ -148,7 +423,7 @@ index 2a53f3d..391ca15 100644
print()
print(out)
print(err)
-@@ -403,13 +404,14 @@ class EmbeddingTests(unittest.TestCase):
+@@ -403,13 +404,14 @@ def _get_default_pipe_encoding():
def test_forced_io_encoding(self):
# Checks forced configuration of embedded interpreter IO streams
@@ -168,10 +443,10 @@ index 2a53f3d..391ca15 100644
expected_output = '\n'.join([
"--- Use defaults ---",
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
-index ae2bcd4..0a302ff 100644
+index 958d282..c4c6850 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
-@@ -9,8 +9,9 @@ import sys
+@@ -8,8 +8,9 @@
import subprocess
import tempfile
from test.support import script_helper, is_android
@@ -183,7 +458,7 @@ index ae2bcd4..0a302ff 100644
# XXX (ncoghlan): Move to script_helper and make consistent with run_python
-@@ -151,6 +152,7 @@ class CmdLineTest(unittest.TestCase):
+@@ -150,6 +151,7 @@ def test_undecodable_code(self):
env = os.environ.copy()
# Use C locale to get ascii for the locale encoding
env['LC_ALL'] = 'C'
@@ -192,10 +467,10 @@ index ae2bcd4..0a302ff 100644
b'import locale; '
b'print(ascii("' + undecodable + b'"), '
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
-index df9ebd4..63145e4 100644
+index ed78e2a..3844812 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
-@@ -680,6 +680,7 @@ class SysModuleTest(unittest.TestCase):
+@@ -682,6 +682,7 @@ def c_locale_get_error_handler(self, isolated=False, encoding=None):
# Force the POSIX locale
env = os.environ.copy()
env["LC_ALL"] = "C"
@@ -204,7 +479,7 @@ index df9ebd4..63145e4 100644
'import sys',
'def dump(name):',
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
-index a68d4fa..e28de1c 100644
+index a68d4fa..280bf50 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -1,4 +1,5 @@
@@ -214,35 +489,6 @@ index a68d4fa..e28de1c 100644
#include <stdio.h>
/*********************************************************
-@@ -126,6 +127,20 @@ static int test_forced_io_encoding(void)
- return 0;
- }
-
-+static int test_c_locale_warning(void)
-+{
-+#ifdef PY_WARN_ON_C_LOCALE
-+ /* Force use of the C locale */
-+ setenv("LC_ALL", "C", 1);
-+
-+ _testembed_Py_Initialize();
-+ Py_Finalize();
-+#else
-+ printf("C locale compatibility warning disabled at compile time\n");
-+#endif
-+ return 0;
-+}
-+
- /* *********************************************************
- * List of test cases and the function that implements it.
- *
-@@ -147,6 +162,7 @@ struct TestCase
- static struct TestCase TestCases[] = {
- { "forced_io_encoding", test_forced_io_encoding },
- { "repeated_init_and_subinterpreters",
test_repeated_init_and_subinterpreters },
-+ { "c_locale_warning", test_c_locale_warning },
- { NULL, NULL }
- };
-
diff --git a/Programs/python.c b/Programs/python.c
index a7afbc7..03f8295 100644
--- a/Programs/python.c
@@ -316,7 +562,7 @@ index a7afbc7..03f8295 100644
for (i = 0; i < argc; i++) {
PyMem_RawFree(argv_copy2[i]);
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index a4f7f82..261ed34 100644
+index c0f41b3..278a5af 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -167,6 +167,7 @@ Py_SetStandardStreamEncoding(const char *encoding, const char
*errors)
@@ -327,7 +573,7 @@ index a4f7f82..261ed34 100644
/* Global initializations. Can be undone by Py_FinalizeEx(). Don't
call this twice without an intervening Py_FinalizeEx() call. When
initializations fail, a fatal error is issued and the function does
-@@ -301,6 +302,173 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
+@@ -302,6 +303,167 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
}
@@ -359,14 +605,14 @@ index a4f7f82..261ed34 100644
+}
+
+typedef struct _CandidateLocale {
-+ const char *locale_name;
-+ int category;
++ const char *locale_name; /* The locale to try as a coercion target */
++ int set_LANG; /* Whether to set LANG in addition to LC_CTYPE */
+} _LocaleCoercionTarget;
+
+static _LocaleCoercionTarget _TARGET_LOCALES[] = {
-+ { "C.UTF-8", LC_ALL },
-+ { "C.utf8", LC_ALL },
-+ { "UTF-8", LC_CTYPE },
++ { "C.UTF-8", 1 },
++ { "C.utf8", 1},
++ { "UTF-8", 0 },
+ { NULL, 0 }
+};
+
@@ -401,37 +647,27 @@ index a4f7f82..261ed34 100644
+static void
+_coerce_default_locale_settings(const _LocaleCoercionTarget *target)
+{
++ const char *env_vars_updated = "LC_CTYPE";
+ const char *newloc = target->locale_name;
-+ int category = target->category;
+
+ /* Reset locale back to currently configured defaults */
+ setlocale(LC_ALL, "");
+
+ /* Set the relevant locale environment variables */
-+ if (category == LC_ALL) {
-+ const char *env_vars_updated = "LC_ALL & LANG";
-+ if (setenv("LC_ALL", newloc, 1)) {
-+ fprintf(stderr,
-+ "Error setting LC_ALL, skipping C locale coercion\n");
-+ return;
-+ }
-+ if (setenv("LANG", newloc, 1)) {
++ if (setenv("LC_CTYPE", newloc, 1)) {
++ fprintf(stderr,
++ "Error setting LC_CTYPE, skipping C locale coercion\n");
++ return;
++ }
++ if (target->set_LANG) {
++ if (setenv("LANG", newloc, 1) == 0) {
++ env_vars_updated = "LC_CTYPE & LANG";
++ } else {
+ fprintf(stderr,
+ "Error setting LANG during C locale coercion\n");
-+ env_vars_updated = "LC_ALL";
+ }
-+ fprintf(stderr, _C_LOCALE_COERCION_WARNING, env_vars_updated, newloc);
-+ } else if (category == LC_CTYPE) {
-+ if (setenv("LC_CTYPE", newloc, 1)) {
-+ fprintf(stderr,
-+ "Error setting LC_CTYPE, skipping C locale coercion\n");
-+ return;
-+ }
-+ fprintf(stderr, _C_LOCALE_COERCION_WARNING, "LC_CTYPE", newloc);
-+ } else {
-+ fprintf(stderr, "Locale coercion must target LC_ALL or LC_CTYPE\n");
-+ return;
+ }
++ fprintf(stderr, _C_LOCALE_COERCION_WARNING, env_vars_updated, newloc);
+
+ /* Reconfigure with the overridden environment variables */
+ setlocale(LC_ALL, "");
@@ -464,14 +700,18 @@ index a4f7f82..261ed34 100644
+ */
+ if (c_locale_coercion_is_expected()) {
+ /* PYTHONCOERCECLOCALE is not set, or is not set to exactly "0" */
-+ const _LocaleCoercionTarget *target = NULL;
-+ for (target = _TARGET_LOCALES; target->locale_name; target++) {
-+ const char *reconfigured_locale = setlocale(target->category,
-+ target->locale_name);
-+ if (reconfigured_locale != NULL) {
-+ /* Successfully configured locale, so make it the default */
-+ _coerce_default_locale_settings(target);
-+ return;
++ const char *locale_override = getenv("LC_ALL");
++ if (locale_override == NULL || *locale_override == '\0') {
++ /* LC_ALL is also not set (or is set to an empty string) */
++ const _LocaleCoercionTarget *target = NULL;
++ for (target = _TARGET_LOCALES; target->locale_name; target++) {
++ const char *new_locale = setlocale(LC_CTYPE,
++ target->locale_name);
++ if (new_locale != NULL) {
++ /* Successfully configured locale, so make it the default */
++ _coerce_default_locale_settings(target);
++ return;
++ }
+ }
+ }
+ }
@@ -501,7 +741,7 @@ index a4f7f82..261ed34 100644
void
_Py_InitializeEx_Private(int install_sigs, int install_importlib)
{
-@@ -315,11 +483,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
+@@ -316,11 +478,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
initialized = 1;
_Py_Finalizing = NULL;
@@ -522,7 +762,7 @@ index a4f7f82..261ed34 100644
#endif
if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
-@@ -1242,12 +1418,8 @@ initstdio(void)
+@@ -1252,12 +1422,8 @@ initstdio(void)
}
}
if (!errors && !(pythonioencoding && *pythonioencoding)) {
@@ -538,7 +778,7 @@ index a4f7f82..261ed34 100644
}
diff --git a/configure b/configure
-index 2915246..39e5a27 100755
+index c9340c6..8b1bd5b 100755
--- a/configure
+++ b/configure
@@ -834,6 +834,8 @@ with_thread
@@ -550,7 +790,7 @@ index 2915246..39e5a27 100755
with_valgrind
with_dtrace
with_fpectl
-@@ -1527,6 +1529,12 @@ Optional Packages:
+@@ -1538,6 +1540,12 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-pymalloc disable/enable specialized mallocs
@@ -563,7 +803,7 @@ index 2915246..39e5a27 100755
--with-valgrind Enable Valgrind support
--with(out)-dtrace disable/enable DTrace support
--with-fpectl enable SIGFPE catching
-@@ -11010,6 +11018,52 @@ fi
+@@ -11030,6 +11038,52 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pymalloc" >&5
$as_echo "$with_pymalloc" >&6; }
@@ -617,10 +857,10 @@ index 2915246..39e5a27 100755
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-valgrind"
>&5
$as_echo_n "checking for --with-valgrind... " >&6; }
diff --git a/configure.ac b/configure.ac
-index 67dfba3..b9c9f04 100644
+index e065ce5..c455ebd 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -3279,6 +3279,40 @@ then
+@@ -3304,6 +3304,40 @@ then
fi
AC_MSG_RESULT($with_pymalloc)
@@ -662,10 +902,10 @@ index 67dfba3..b9c9f04 100644
AC_MSG_CHECKING([for --with-valgrind])
AC_ARG_WITH([valgrind],
diff --git a/pyconfig.h.in b/pyconfig.h.in
-index b10c57f..0a6f3e2 100644
+index 0a3d59e..fa2792b 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
-@@ -1244,9 +1244,15 @@
+@@ -1247,9 +1247,15 @@
/* Define as the preferred size in bits of long digits */
#undef PYLONG_BITS_IN_DIGIT
commit 62458614805e7f14d98b55730d0358dd8bdf7e43
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue May 9 11:43:22 2017 +0200
Change description, to reflect that python3 is now the default Python
Also enhance verbosity for the descriptions of subpackages
diff --git a/python3.spec b/python3.spec
index aec30b2..9a29f09 100644
--- a/python3.spec
+++ b/python3.spec
@@ -491,13 +491,24 @@ Requires: python3-pip
%endif
%description
-Python 3 is a new version of the language that is incompatible with the 2.x
-line of releases. The language is mostly the same, but many details, especially
-how built-in objects like dictionaries and strings work, have changed
-considerably, and a lot of deprecated features have finally been removed.
+Python is an interpreted, interactive, object-oriented programming
+language often compared to Tcl, Perl, Scheme or Java. Python includes
+modules, classes, exceptions, very high level dynamic data types
+and dynamic typing. Python supports interfaces to many system calls and
+libraries, as well as to various windowing systems (X11, Motif, Tk,
+Mac and MFC).
+
+Programmers can write new built-in modules for Python in C or C++.
+Python can be used as an extension language for applications that
+need a programmable interface.
+
+Note that documentation for Python is provided in the python3-docs package.
+
+This package provides the "python3" executable; most of the actual
+implementation is within the "python3-libs" and "system-python-libs"
packages.
%package libs
-Summary: Python 3 runtime libraries
+Summary: Python runtime libraries
Group: Development/Libraries
# For Modularity purpose we need not to include the dist-tag int he dependency
%if %(d="%{?dist}"; [ "${d#module-base-runtime-}x" !=
"${d}x" ] && echo 1 || echo 0)
@@ -515,7 +526,10 @@ Provides: python3-enum34 = 1.0.4-5%{?dist}
Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
%description libs
-This package contains files used to embed Python 3 into applications.
+This package contains runtime libraries for use by Python:
+- the libpython dynamic library, for use by applications that embed Python as
+a scripting language, and by the main "python3" executable
+- the Python standard library
%package -n system-python
Summary: System Python executable
@@ -542,7 +556,7 @@ Requires: glibc%{?_isa} >= 2.24.90-26
This package contains files used to embed System Python into applications.
%package devel
-Summary: Libraries and header files needed for Python 3 development
+Summary: Libraries and header files needed for Python development
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
@@ -552,29 +566,36 @@ Requires: python3-rpm-macros
Conflicts: %{name} < %{version}-%{release}
%description devel
-This package contains libraries and header files used to build applications
-with and native libraries for Python 3
+The Python programming language's interpreter can be extended with
+dynamically loaded extensions and can be embedded in other programs.
+This package contains the header files and libraries needed to do
+these types of tasks.
+
+Install python3-devel if you want to develop Python extensions. The
+python3 package will also need to be installed. You'll probably also
+want to install the python3-docs package, which contains Python
+documentation.
%package tools
-Summary: A collection of tools included with Python 3
+Summary: A collection of tools included with Python
Group: Development/Tools
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tkinter = %{version}-%{release}
%description tools
-This package contains several tools included with Python 3
+This package contains several tools included with Python
%package tkinter
-Summary: A GUI toolkit for Python 3
+Summary: A GUI toolkit for Python
Group: Development/Languages
Requires: %{name} = %{version}-%{release}
%description tkinter
-The Tkinter (Tk interface) program is an graphical user interface for
+The Tkinter (Tk interface) program is a graphical user interface for
the Python scripting language.
%package test
-Summary: The test modules from the main python 3 package
+Summary: The test modules from the main python3 package
Group: Development/Languages
Requires: %{name} = %{version}-%{release}
Requires: %{name}-tools = %{version}-%{release}
@@ -585,11 +606,11 @@ These are in a separate package to save space, as they are almost
never used
in production.
You might want to install the python3-test package if you're developing
-python 3 code that uses more than just unittest and/or test_support.py.
+python code that uses more than just unittest and/or test_support.py.
%if 0%{?with_debug_build}
%package debug
-Summary: Debug version of the Python 3 runtime
+Summary: Debug version of the Python runtime
Group: Applications/System
# The debug build is an all-in-one package version of the regular build, and
@@ -603,20 +624,20 @@ Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
Requires: %{name}-tools%{?_isa} = %{version}-%{release}
%description debug
-python3-debug provides a version of the Python 3 runtime with numerous debugging
+python3-debug provides a version of the Python runtime with numerous debugging
features enabled, aimed at advanced Python users, such as developers of Python
extension modules.
-This version uses more memory and will be slower than the regular Python 3 build,
+This version uses more memory and will be slower than the regular Python build,
but is useful for tracking down reference-counting issues, and other bugs.
The bytecodes are unchanged, so that .pyc files are compatible between the two
-versions of Python 3, but the debugging features mean that C/C++ extension
+versions of Python, but the debugging features mean that C/C++ extension
modules are ABI-incompatible with those built for the standard runtime.
-It shares installation directories with the standard Python 3 runtime, so that
-.py and .pyc files can be shared. All compiled extension modules gain a "_d"
-suffix ("foo_d.so" rather than "foo.so") so that each Python 3
implementation
+It shares installation directories with the standard Python runtime, so that
+.py and .pyc files can be shared. All compiled extension modules gain a "_d"
+suffix ("foo_d.so" rather than "foo.so") so that each Python
implementation
can load its own extensions.
%endif # with_debug_build
commit 31fe33b583978fe0075269527bf0eba08d233db9
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Sat May 6 23:27:11 2017 +0200
Update PEP 538 to the latest upstream implementation
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index a13b644..462f2aa 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -1,34 +1,39 @@
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
-index c0e64d6..0bb28da 100644
+index 195f63f..0d0a127 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
-@@ -711,6 +711,35 @@ conflict.
+@@ -713,6 +713,40 @@ conflict.
.. versionadded:: 3.6
+
+.. envvar:: PYTHONCOERCECLOCALE
+
-+ If set to a non-empty string, causes the main Python command line application
++ If set to the value ``0``, causes the main Python command line application
+ to skip coercing the legacy ASCII-based C locale to a more capable UTF-8
+ based alternative. Note that this setting is checked even when the
+ :option:`-E` or :option:`-I` options are used, as it is handled prior to
+ the processing of command line options.
+
-+ If this variable is *not* set, and the current locale reported for the
-+ ``LC_CTYPE`` category is the default ``C`` locale, then the Python CLI will
-+ attempt to configure one of the following locales for the given locale
-+ categories before loading the interpreter runtime:
++ If this variable is *not* set, or is set to a value other than ``0``, and
++ the current locale reported for the ``LC_CTYPE`` category is the default
++ ``C`` locale, then the Python CLI will attempt to configure one of the
++ following locales for the given locale categories before loading the
++ interpreter runtime:
+
-+ * ``C.UTF-8` (``LC_ALL``)
-+ * ``C.utf8` (``LC_ALL``)
-+ * ``UTF-8` (``LC_CTYPE``)
++ * ``C.UTF-8`` (``LC_ALL``)
++ * ``C.utf8`` (``LC_ALL``)
++ * ``UTF-8`` (``LC_CTYPE``)
+
+ If setting one of these locale categories succeeds, then the matching
-+ environment variables will be set (both ``LC_ALL` and ``LANG`` for the
-+ ``LC_ALL`` category, and ``LC_CTYPE`` for the ``LC_CTYPE`` category),
-+ and (if not already set to a non-empty string) :envvar:`PYTHONIOENCODING`
-+ will be set to ``utf-8:surrogateescape``.
++ environment variables will be set (both ``LC_ALL`` and ``LANG`` for the
++ ``LC_ALL`` category, and ``LC_CTYPE`` for the ``LC_CTYPE`` category) in
++ the current process environment before the Python runtime is initialized.
++
++ Configuring one of these locales (either explicitly or via the above
++ implicit locale coercion) will automatically set the error handler for
++ :data:`sys.stdin` and :data:`sys.stdout` to ``surrogateescape``. This
++ behavior can be overridden using :envvar:`PYTHONIOENCODING` as usual.
+
+ Availability: \*nix
+
@@ -39,7 +44,7 @@ index c0e64d6..0bb28da 100644
~~~~~~~~~~~~~~~~~~~~
diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
-index 80889b1..1a1a862 100644
+index ca5f9c2..7aa460b 100644
--- a/Lib/test/support/script_helper.py
+++ b/Lib/test/support/script_helper.py
@@ -51,8 +51,35 @@ def interpreter_requires_environment():
@@ -80,7 +85,7 @@ index 80889b1..1a1a862 100644
# Executing the interpreter in a subprocess
-@@ -99,30 +126,7 @@ def run_python_until_end(*args, **env_vars):
+@@ -110,30 +137,7 @@ def run_python_until_end(*args, **env_vars):
def _assert_python(expected_success, *args, **env_vars):
res, cmd_line = run_python_until_end(*args, **env_vars)
if (res.rc and expected_success) or (not res.rc and not expected_success):
@@ -113,10 +118,28 @@ index 80889b1..1a1a862 100644
def assert_python_ok(*args, **env_vars):
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
-index 2a53f3d..ece84af 100644
+index 2a53f3d..391ca15 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
-@@ -386,7 +386,7 @@ class EmbeddingTests(unittest.TestCase):
+@@ -369,14 +369,15 @@ class EmbeddingTests(unittest.TestCase):
+ def tearDown(self):
+ os.chdir(self.oldcwd)
+
+- def run_embedded_interpreter(self, *args):
++ def run_embedded_interpreter(self, *args, env=None):
+ """Runs a test in the embedded interpreter"""
+ cmd = [self.test_exe]
+ cmd.extend(args)
+ p = subprocess.Popen(cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+- universal_newlines=True)
++ universal_newlines=True,
++ env=env)
+ (out, err) = p.communicate()
+ self.assertEqual(p.returncode, 0,
+ "bad returncode %d, stderr is %r" %
+@@ -386,7 +387,7 @@ class EmbeddingTests(unittest.TestCase):
def test_subinterps(self):
# This is just a "don't crash" test
out, err =
self.run_embedded_interpreter("repeated_init_and_subinterpreters")
@@ -125,11 +148,14 @@ index 2a53f3d..ece84af 100644
print()
print(out)
print(err)
-@@ -404,14 +404,15 @@ class EmbeddingTests(unittest.TestCase):
+@@ -403,13 +404,14 @@ class EmbeddingTests(unittest.TestCase):
+
def test_forced_io_encoding(self):
# Checks forced configuration of embedded interpreter IO streams
- out, err = self.run_embedded_interpreter("forced_io_encoding")
+- out, err = self.run_embedded_interpreter("forced_io_encoding")
- if support.verbose:
++ env = {"PYTHONIOENCODING": "UTF-8:surrogateescape"}
++ out, err = self.run_embedded_interpreter("forced_io_encoding",
env=env)
+ if support.verbose > 1:
print()
print(out)
@@ -140,12 +166,9 @@ index 2a53f3d..ece84af 100644
+ expected_stdin_encoding = "UTF-8"
expected_pipe_encoding = self._get_default_pipe_encoding()
expected_output = '\n'.join([
-+ "Setting PYTHONIOENCODING=UTF-8:surrogateescape",
"--- Use defaults ---",
- "Expected encoding: default",
- "Expected errors: default",
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
-index b71bb9f..56867fc 100644
+index ae2bcd4..0a302ff 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -9,8 +9,9 @@ import sys
@@ -181,7 +204,7 @@ index df9ebd4..63145e4 100644
'import sys',
'def dump(name):',
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
-index a68d4fa..1494452 100644
+index a68d4fa..e28de1c 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -1,4 +1,5 @@
@@ -191,17 +214,7 @@ index a68d4fa..1494452 100644
#include <stdio.h>
/*********************************************************
-@@ -106,6 +107,9 @@ static void check_stdio_details(const char *encoding, const char *
errors)
-
- static int test_forced_io_encoding(void)
- {
-+ /* Ensure consistent "defaults" */
-+ printf("Setting PYTHONIOENCODING=UTF-8:surrogateescape\n");
-+ setenv("PYTHONIOENCODING", "UTF-8:surrogateescape", 1);
- /* Check various combinations */
- printf("--- Use defaults ---\n");
- check_stdio_details(NULL, NULL);
-@@ -126,6 +130,20 @@ static int test_forced_io_encoding(void)
+@@ -126,6 +127,20 @@ static int test_forced_io_encoding(void)
return 0;
}
@@ -222,7 +235,7 @@ index a68d4fa..1494452 100644
/* *********************************************************
* List of test cases and the function that implements it.
*
-@@ -147,6 +165,7 @@ struct TestCase
+@@ -147,6 +162,7 @@ struct TestCase
static struct TestCase TestCases[] = {
{ "forced_io_encoding", test_forced_io_encoding },
{ "repeated_init_and_subinterpreters",
test_repeated_init_and_subinterpreters },
@@ -231,14 +244,14 @@ index a68d4fa..1494452 100644
};
diff --git a/Programs/python.c b/Programs/python.c
-index a7afbc7..b5edebb 100644
+index a7afbc7..03f8295 100644
--- a/Programs/python.c
+++ b/Programs/python.c
-@@ -15,6 +15,110 @@ wmain(int argc, wchar_t **argv)
+@@ -15,6 +15,21 @@ wmain(int argc, wchar_t **argv)
}
#else
-+/* Helpers to better handle the legacy C locale
++/* Access private pylifecycle helper API to better handle the legacy C locale
+ *
+ * The legacy C locale assumes ASCII as the default text encoding, which
+ * causes problems not only for the CPython runtime, but also other
@@ -250,11 +263,100 @@ index a7afbc7..b5edebb 100644
+ * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
+ *
+ */
++extern int _Py_LegacyLocaleDetected(void);
++extern void _Py_CoerceLegacyLocale(void);
+
-+#ifdef PY_COERCE_C_LOCALE
-+static const char *_C_LOCALE_COERCION_WARNING =
-+ "Python detected LC_CTYPE=C: %.20s coerced to %.20s (set another locale "
-+ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behaviour).\n";
+ int
+ main(int argc, char **argv)
+ {
+@@ -25,7 +40,11 @@ main(int argc, char **argv)
+ char *oldloc;
+
+ /* Force malloc() allocator to bootstrap Python */
++#ifdef Py_DEBUG
++ (void)_PyMem_SetupAllocators("malloc_debug");
++# else
+ (void)_PyMem_SetupAllocators("malloc");
++# endif
+
+ argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
+ argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
+@@ -49,7 +68,21 @@ main(int argc, char **argv)
+ return 1;
+ }
+
++#ifdef __ANDROID__
++ /* Passing "" to setlocale() on Android requests the C locale rather
++ * than checking environment variables, so request C.UTF-8 explicitly
++ */
++ setlocale(LC_ALL, "C.UTF-8");
++#else
++ /* Reconfigure the locale to the default for this process */
+ setlocale(LC_ALL, "");
++#endif
++
++ if (_Py_LegacyLocaleDetected()) {
++ _Py_CoerceLegacyLocale();
++ }
++
++ /* Convert from char to wchar_t based on the locale settings */
+ for (i = 0; i < argc; i++) {
+ argv_copy[i] = Py_DecodeLocale(argv[i], NULL);
+ if (!argv_copy[i]) {
+@@ -70,7 +103,11 @@ main(int argc, char **argv)
+
+ /* Force again malloc() allocator to release memory blocks allocated
+ before Py_Main() */
++#ifdef Py_DEBUG
++ (void)_PyMem_SetupAllocators("malloc_debug");
++# else
+ (void)_PyMem_SetupAllocators("malloc");
++# endif
+
+ for (i = 0; i < argc; i++) {
+ PyMem_RawFree(argv_copy2[i]);
+diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
+index a4f7f82..261ed34 100644
+--- a/Python/pylifecycle.c
++++ b/Python/pylifecycle.c
+@@ -167,6 +167,7 @@ Py_SetStandardStreamEncoding(const char *encoding, const char
*errors)
+ return 0;
+ }
+
++
+ /* Global initializations. Can be undone by Py_FinalizeEx(). Don't
+ call this twice without an intervening Py_FinalizeEx() call. When
+ initializations fail, a fatal error is issued and the function does
+@@ -301,6 +302,173 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
+ }
+
+
++/* Helper functions to better handle the legacy C locale
++ *
++ * The legacy C locale assumes ASCII as the default text encoding, which
++ * causes problems not only for the CPython runtime, but also other
++ * components like GNU readline.
++ *
++ * Accordingly, when the CLI detects it, it attempts to coerce it to a
++ * more capable UTF-8 based alternative as follows:
++ *
++ * if (_Py_LegacyLocaleDetected()) {
++ * _Py_CoerceLegacyLocale();
++ * }
++ *
++ * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
++ *
++ * Locale coercion also impacts the default error handler for the standard
++ * streams: while the usual default is "strict", the default for the legacy
++ * C locale and for any of the coercion target locales is "surrogateescape".
++ */
++
++int
++_Py_LegacyLocaleDetected(void)
++{
++ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
++ return ctype_loc != NULL && strcmp(ctype_loc, "C") == 0;
++}
+
+typedef struct _CandidateLocale {
+ const char *locale_name;
@@ -268,7 +370,35 @@ index a7afbc7..b5edebb 100644
+ { NULL, 0 }
+};
+
-+void
++static char *
++get_default_standard_stream_error_handler(void)
++{
++ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
++ if (ctype_loc != NULL) {
++ /* "surrogateescape" is the default in the legacy C locale */
++ if (strcmp(ctype_loc, "C") == 0) {
++ return "surrogateescape";
++ }
++
++ /* "surrogateescape" is the default in locale coercion target locales
*/
++ const _LocaleCoercionTarget *target = NULL;
++ for (target = _TARGET_LOCALES; target->locale_name; target++) {
++ if (strcmp(ctype_loc, target->locale_name) == 0) {
++ return "surrogateescape";
++ }
++ }
++ }
++
++ /* Otherwise return NULL to request the typical default error handler */
++ return NULL;
++}
++
++#ifdef PY_COERCE_C_LOCALE
++static const char *_C_LOCALE_COERCION_WARNING =
++ "Python detected LC_CTYPE=C: %.20s coerced to %.20s (set another locale "
++ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n";
++
++static void
+_coerce_default_locale_settings(const _LocaleCoercionTarget *target)
+{
+ const char *newloc = target->locale_name;
@@ -303,28 +433,36 @@ index a7afbc7..b5edebb 100644
+ return;
+ }
+
-+ /* Set PYTHONIOENCODING if not already set */
-+ if (setenv("PYTHONIOENCODING", "utf-8:surrogateescape", 0)) {
-+ fprintf(stderr,
-+ "Error setting PYTHONIOENCODING during C locale coercion\n");
-+ }
-+
+ /* Reconfigure with the overridden environment variables */
+ setlocale(LC_ALL, "");
+}
+
-+void
-+_handle_legacy_c_locale(void)
++static int
++c_locale_coercion_is_expected(void)
+{
++ /* This may be called prior to Py_Initialize, so we don't call any other
++ * Python APIs, and we ignore the -E and -I flags
++ */
+ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
-+ /* We ignore the Python -E and -I flags here, as we need to sort out
++ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
++ return 1;
++ }
++ return 0;
++}
++#endif
++
++void
++_Py_CoerceLegacyLocale(void)
++{
++#ifdef PY_COERCE_C_LOCALE
++ /* We ignore the Python -E and -I flags here, as the CLI needs to sort out
+ * the locale settings *before* we try to do anything with the command
+ * line arguments. For cross-platform debugging purposes, we also need
+ * to give end users a way to force even scripts that are otherwise
+ * isolated from their environment to use the legacy ASCII-centric C
+ * locale.
+ */
-+ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
++ if (c_locale_coercion_is_expected()) {
+ /* PYTHONCOERCECLOCALE is not set, or is not set to exactly "0" */
+ const _LocaleCoercionTarget *target = NULL;
+ for (target = _TARGET_LOCALES; target->locale_name; target++) {
@@ -336,50 +474,12 @@ index a7afbc7..b5edebb 100644
+ return;
+ }
+ }
-+
+ }
+ /* No C locale warning here, as Py_Initialize will emit one later */
-+}
-+#endif
-+
- int
- main(int argc, char **argv)
- {
-@@ -49,7 +153,26 @@ main(int argc, char **argv)
- return 1;
- }
-
-+#ifdef __ANDROID__
-+ /* Passing "" to setlocale() on Android requests the C locale rather
-+ * than checking environment variables, so request C.UTF-8 explicitly
-+ */
-+ setlocale(LC_ALL, "C.UTF-8");
-+#else
-+ /* Reconfigure the locale to the default for this process */
- setlocale(LC_ALL, "");
+#endif
++}
+
-+#ifdef PY_COERCE_C_LOCALE
-+ /* When the LC_CTYPE category still claims to be using the C locale,
-+ assume configuration error and try for a UTF-8 based locale instead */
-+ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
-+ if (ctype_loc != NULL && strcmp(ctype_loc, "C") == 0) {
-+ _handle_legacy_c_locale();
-+ }
-+#endif
+
-+ /* Convert from char to wchar_t based on the locale settings */
- for (i = 0; i < argc; i++) {
- argv_copy[i] = Py_DecodeLocale(argv[i], NULL);
- if (!argv_copy[i]) {
-diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
-index a4f7f82..dd58dc9 100644
---- a/Python/pylifecycle.c
-+++ b/Python/pylifecycle.c
-@@ -301,6 +301,31 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
- }
-
-
+#ifdef PY_WARN_ON_C_LOCALE
+static const char *_C_LOCALE_WARNING =
+ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
@@ -390,15 +490,8 @@ index a4f7f82..dd58dc9 100644
+static void
+_emit_stderr_warning_for_c_locale(void)
+{
-+ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
-+ /* We don't emit a warning if locale coercion has been explicitly disabled.
-+ *
-+ * For consistency with the corresponding check in Programs/python.c
-+ * we ignore the Python -E and -I flags here.
-+ */
-+ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
-+ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
-+ if (ctype_loc != NULL && strcmp(ctype_loc, "C") == 0) {
++ if (c_locale_coercion_is_expected()) {
++ if (_Py_LegacyLocaleDetected()) {
+ fprintf(stderr, "%s", _C_LOCALE_WARNING);
+ }
+ }
@@ -408,7 +501,7 @@ index a4f7f82..dd58dc9 100644
void
_Py_InitializeEx_Private(int install_sigs, int install_importlib)
{
-@@ -315,11 +340,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
+@@ -315,11 +483,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
initialized = 1;
_Py_Finalizing = NULL;
@@ -429,8 +522,23 @@ index a4f7f82..dd58dc9 100644
#endif
if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
+@@ -1242,12 +1418,8 @@ initstdio(void)
+ }
+ }
+ if (!errors && !(pythonioencoding && *pythonioencoding)) {
+- /* When the LC_CTYPE locale is the POSIX locale ("C locale"),
+- stdin and stdout use the surrogateescape error handler by
+- default, instead of the strict error handler. */
+- char *loc = setlocale(LC_CTYPE, NULL);
+- if (loc != NULL && strcmp(loc, "C") == 0)
+- errors = "surrogateescape";
++ /* Choose the default error handler based on the current locale */
++ errors = get_default_standard_stream_error_handler();
+ }
+ }
+
diff --git a/configure b/configure
-index 6bcddb7..13052d6 100755
+index 2915246..39e5a27 100755
--- a/configure
+++ b/configure
@@ -834,6 +834,8 @@ with_thread
@@ -455,7 +563,7 @@ index 6bcddb7..13052d6 100755
--with-valgrind Enable Valgrind support
--with(out)-dtrace disable/enable DTrace support
--with-fpectl enable SIGFPE catching
-@@ -11016,6 +11024,52 @@ fi
+@@ -11010,6 +11018,52 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pymalloc" >&5
$as_echo "$with_pymalloc" >&6; }
@@ -509,10 +617,10 @@ index 6bcddb7..13052d6 100755
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-valgrind"
>&5
$as_echo_n "checking for --with-valgrind... " >&6; }
diff --git a/configure.ac b/configure.ac
-index e222c21..a1653e7 100644
+index 67dfba3..b9c9f04 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -3287,6 +3287,40 @@ then
+@@ -3279,6 +3279,40 @@ then
fi
AC_MSG_RESULT($with_pymalloc)
@@ -554,10 +662,10 @@ index e222c21..a1653e7 100644
AC_MSG_CHECKING([for --with-valgrind])
AC_ARG_WITH([valgrind],
diff --git a/pyconfig.h.in b/pyconfig.h.in
-index e7a836c..11e0798 100644
+index b10c57f..0a6f3e2 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
-@@ -1241,9 +1241,15 @@
+@@ -1244,9 +1244,15 @@
/* Define as the preferred size in bits of long digits */
#undef PYLONG_BITS_IN_DIGIT
diff --git a/python3.spec b/python3.spec
index 996c52e..aec30b2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -123,7 +123,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -1659,6 +1659,9 @@ fi
# ======================================================
%changelog
+* Fri May 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-5
+- Update PEP 538 to the latest upstream implementation
+
* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
- Enable link time optimizations
- Move windows executables to the devel subpackage (rhbz#1426257)
commit bbbc440d2ceeb415c96bce032a266cad6450e911
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Apr 18 13:51:54 2017 +0200
system-python-libs subpackage was shipping some windows executables
which are used as templates, for creating windows installers for python
modules. These executables are moved to the devel subpackage.
Resolves: rhbz#1426257
diff --git a/python3.spec b/python3.spec
index 8fff5ba..996c52e 100644
--- a/python3.spec
+++ b/python3.spec
@@ -123,7 +123,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -1403,7 +1403,7 @@ fi
%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/distutils/README
%{pylibdir}/distutils/command
-
+%exclude %{pylibdir}/distutils/command/wininst-*.exe
%dir %{pylibdir}/email/
%dir %{pylibdir}/email/__pycache__/
@@ -1468,6 +1468,7 @@ fi
%defattr(-,root,root)
%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
+%{pylibdir}/distutils/command/wininst-*.exe
%{_includedir}/python%{LDVERSION_optimized}/*.h
%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
@@ -1658,6 +1659,10 @@ fi
# ======================================================
%changelog
+* Tue Apr 18 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-4
+- Enable link time optimizations
+- Move windows executables to the devel subpackage (rhbz#1426257)
+
* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
- Rename python3.Xdm-config script from -debug to be arch specific
Resolves: rhbz#1179073
commit 3f69bcd6281fb23f32c2a1bab786dba3ff25c697
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Apr 18 13:48:56 2017 +0200
Enable link time optimizations
diff --git a/python3.spec b/python3.spec
index a501288..8fff5ba 100644
--- a/python3.spec
+++ b/python3.spec
@@ -760,6 +760,7 @@ BuildPython() {
--with-system-ffi \
--enable-loadable-sqlite-extensions \
--with-dtrace \
+ --with-lto \
%if 0%{?with_systemtap}
--with-systemtap \
%endif
commit 3a35e0ba67ad2d10d7176f0c6f1285693b3092a6
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Thu Apr 13 16:20:52 2017 +0200
Rename python3.Xdm-config script from -debug to be arch specific (rhbz#1179073)
diff --git a/python3.spec b/python3.spec
index 9ab4201..a501288 100644
--- a/python3.spec
+++ b/python3.spec
@@ -123,7 +123,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -1099,7 +1099,7 @@ sed \
%endif # with_systemtap
-# Rename the script that differs on different arches to arch specific name
+# Rename the -devel script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,`uname -m`-}config
echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname -m`-config
"$@"' > \
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
@@ -1107,6 +1107,14 @@ echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+# Rename the -debug script that differs on different arches to arch specific name
+mv %{buildroot}%{_bindir}/python%{LDVERSION_debug}-{,`uname -m`-}config
+echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_debug}-`uname -m`-config
"$@"' > \
+ %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
+echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_debug}-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
+ chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_debug}-config
+
# System Python: Copy the executable to libexec
mkdir -p %{buildroot}%{_libexecdir}
cp %{buildroot}%{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
@@ -1610,6 +1618,7 @@ fi
%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
%{_includedir}/python%{LDVERSION_debug}
%{_bindir}/python%{LDVERSION_debug}-config
+%{_bindir}/python%{LDVERSION_debug}-*-config
%{_libdir}/libpython%{LDVERSION_debug}.so
%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
@@ -1648,6 +1657,10 @@ fi
# ======================================================
%changelog
+* Thu Apr 13 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-3
+- Rename python3.Xdm-config script from -debug to be arch specific
+Resolves: rhbz#1179073
+
* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
- Install the Makefile in its proper location (rhbz#1438219)
commit bea97d96d29c1893f4c695da96a9d62f69618ff6
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Apr 5 18:08:56 2017 +0200
Since upstream issue 23968, the platform directory changed to include the
architectures,
however patch205 was not updated to reflect that and as a result the Makefile and
various
other files were installed at another directory (rhbz#1438219).
This commit updates the patch205 so the files are installed at the correct locations.
diff --git a/00205-make-libpl-respect-lib64.patch b/00205-make-libpl-respect-lib64.patch
index 4a6703b..3e7c797 100644
--- a/00205-make-libpl-respect-lib64.patch
+++ b/00205-make-libpl-respect-lib64.patch
@@ -6,7 +6,7 @@ diff -up Python-3.5.0/Makefile.pre.in.lib Python-3.5.0/Makefile.pre.in
# Install the library and miscellaneous stuff needed for extending/embedding
# This goes into $(exec_prefix)
-LIBPL= @LIBPL@
-+LIBPL= $(LIBDEST)/config-$(LDVERSION)
++LIBPL= $(LIBDEST)/config-$(LDVERSION)-$(MULTIARCH)
# pkgconfig directory
LIBPC= $(LIBDIR)/pkgconfig
diff --git a/python3.spec b/python3.spec
index bcb9a92..9ab4201 100644
--- a/python3.spec
+++ b/python3.spec
@@ -123,7 +123,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -1441,8 +1441,8 @@ fi
# "Makefile" and the config-32/64.h file are needed by
# distutils/sysconfig.py:_init_posix(), so we include them in the core
# package, along with their parent directories (bug 531901):
-%dir %{pylibdir}/config-%{LDVERSION_optimized}/
-%{pylibdir}/config-%{LDVERSION_optimized}/Makefile
+%dir %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
%dir %{_includedir}/python%{LDVERSION_optimized}/
%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
@@ -1457,8 +1457,8 @@ fi
%files devel
%defattr(-,root,root)
-%{pylibdir}/config-%{LDVERSION_optimized}/*
-%exclude %{pylibdir}/config-%{LDVERSION_optimized}/Makefile
+%{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/*
+%exclude %{pylibdir}/config-%{LDVERSION_optimized}-%{_arch}-linux%{_gnu}/Makefile
%{_includedir}/python%{LDVERSION_optimized}/*.h
%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
@@ -1607,7 +1607,7 @@ fi
%endif
# Analog of the -devel subpackage's files:
-%{pylibdir}/config-%{LDVERSION_debug}
+%{pylibdir}/config-%{LDVERSION_debug}-%{_arch}-linux%{_gnu}
%{_includedir}/python%{LDVERSION_debug}
%{_bindir}/python%{LDVERSION_debug}-config
%{_libdir}/libpython%{LDVERSION_debug}.so
@@ -1648,6 +1648,9 @@ fi
# ======================================================
%changelog
+* Wed Apr 05 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.1-2
+- Install the Makefile in its proper location (rhbz#1438219)
+
* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
- Update to version 3.6.1 final
commit b603b2d8f9e246c69ef20284d4f1108d70ec9564
Author: Iryna Shcherbina <ishcherb(a)redhat.com>
Date: Wed Mar 22 11:05:15 2017 +0100
Update to version 3.6.1 final
diff --git a/python3.spec b/python3.spec
index 09bfb02..bcb9a92 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,9 +24,6 @@
# Currently these packages are recommended to have been built before a targeted rebuild
after a python abi change:
# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt.
-# First release cadidate
-%global prerel rc1
-
%global with_rewheel 1
%global pybasever 3.6
@@ -126,7 +123,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 0.2.%{?prerel}%{?dist}
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -199,7 +196,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{?prerel}....
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
@@ -1651,6 +1648,9 @@ fi
# ======================================================
%changelog
+* Wed Mar 22 2017 Iryna Shcherbina <ishcherb(a)redhat.com> - 3.6.1-1
+- Update to version 3.6.1 final
+
* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
diff --git a/sources b/sources
index 676f3bf..9bb64d1 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.1rc1.tar.xz) =
21ae75db2a568ba85af5510d45c3616595ae00b9f5008d78b926340980b4728f4fd393d2ecd435d2902cd25aba50a8b98f5cdbfa651da75c8f164909bc4730be
+SHA512 (Python-3.6.1.tar.xz) =
8605fb7019386fec227d4b06d06f00ae500a8a89df289bfe6141bb56196c75483a60cc0ee553930742b31cefce68add5ccf226e0f27b7b915f5026d597e1ac29
commit 628b06df1b62db16171b025b2f81af03a12b774d
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Tue Mar 21 11:51:35 2017 +0100
Fix syntax error in %py_byte_compile macro (rhbz#1433569)
diff --git a/macros.pybytecompile3.6 b/macros.pybytecompile3.6
index 96d1826..3968c6e 100644
--- a/macros.pybytecompile3.6
+++ b/macros.pybytecompile3.6
@@ -6,5 +6,5 @@
%py_byte_compile()\
python_binary="%1"\
bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]], optimize=opt) for opt in range(2) for
f in sys.argv[1:]]' || :\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2], optimize=opt) for opt in range(2) for f
in sys.argv[1:]]' || :\
%{nil}
diff --git a/python3.spec b/python3.spec
index 042ff25..09bfb02 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 0.1.%{?prerel}%{?dist}
+Release: 0.2.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
@@ -1651,6 +1651,9 @@ fi
# ======================================================
%changelog
+* Tue Mar 21 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.1-0.2.rc1
+- Fix syntax error in %%py_byte_compile macro (rhbz#1433569)
+
* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
- Update to Python 3.6.1 release candidate 1
- Add patch 264 to skip a known test failure on aarch64
commit aba719b9fe1ff39da29d24bf9a43f6d80ea83362
Author: Iryna Shcherbina <ishcherb(a)redhat.com>
Date: Tue Mar 14 17:52:25 2017 +0100
Update to Python 3.6.1 release candidate 1
- Remove patches 250, 253, 254 as the changes are already in Python 3.6.1rc1
- Update patch 157 to work with the new Python codebase
- Remove README file from site-packages (upstream issue24633)
- Rename README to README.rst according to upstream change (upstream PR#2)
- Add patch 264 to skip a known test failure on aarch64 (upstream issue29804)
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
index 43bd394..03f3e02 100644
--- a/00157-uid-gid-overflows.patch
+++ b/00157-uid-gid-overflows.patch
@@ -1,6 +1,8 @@
---- Python-3.4.0b1/Lib/test/test_os.py.orig 2013-11-27 12:07:32.368411798 +0100
-+++ Python-3.4.0b1/Lib/test/test_os.py 2013-11-27 12:12:11.220265174 +0100
-@@ -1319,30 +1319,36 @@
+diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
+index e9fdb07..ea60e6e 100644
+--- a/Lib/test/test_os.py
++++ b/Lib/test/test_os.py
+@@ -1723,30 +1723,36 @@ class PosixUidGidTests(unittest.TestCase):
def test_setuid(self):
if os.getuid() != 0:
self.assertRaises(OSError, os.setuid, 0)
@@ -37,7 +39,7 @@
self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
-@@ -1358,6 +1364,8 @@
+@@ -1762,6 +1768,8 @@ class PosixUidGidTests(unittest.TestCase):
def test_setregid(self):
if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
self.assertRaises(OSError, os.setregid, 0, 0)
@@ -46,17 +48,21 @@
self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
---- Python-3.4.0b1/Lib/test/test_pwd.py.orig 2013-11-24 21:36:55.000000000 +0100
-+++ Python-3.4.0b1/Lib/test/test_pwd.py 2013-11-27 12:07:32.369411798 +0100
-@@ -89,9 +89,9 @@
+diff --git a/Lib/test/test_pwd.py b/Lib/test/test_pwd.py
+index ac9cff7..db98159 100644
+--- a/Lib/test/test_pwd.py
++++ b/Lib/test/test_pwd.py
+@@ -104,11 +104,11 @@ class PwdTest(unittest.TestCase):
# In some cases, byuids isn't a complete list of all users in the
# system, so if we try to pick a value not in byuids (via a perturbing
# loop, say), pwd.getpwuid() might still be able to find data for that
- # uid. Using sys.maxint may provoke the same problems, but hopefully
+ # uid. Using 2**32 - 2 may provoke the same problems, but hopefully
# it will be a more repeatable failure.
+ # Android accepts a very large span of uids including sys.maxsize and
+ # -1; it raises KeyError with 1 or 2 for example.
- fakeuid = sys.maxsize
+ fakeuid = 2**32 - 2
self.assertNotIn(fakeuid, byuids)
- self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
-
+ if not support.is_android:
+ self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
diff --git a/00250-getentropy.patch b/00250-getentropy.patch
deleted file mode 100644
index 6d0025a..0000000
--- a/00250-getentropy.patch
+++ /dev/null
@@ -1,171 +0,0 @@
-diff -r ee1390c9b585 Python/random.c
---- a/Python/random.c Wed Jan 04 12:02:30 2017 +0100
-+++ b/Python/random.c Wed Jan 04 18:32:21 2017 +0100
-@@ -77,45 +77,8 @@ win32_urandom(unsigned char *buffer, Py_
- return 0;
- }
-
--/* Issue #25003: Don't use getentropy() on Solaris (available since
-- * Solaris 11.3), it is blocking whereas os.urandom() should not block. */
--#elif defined(HAVE_GETENTROPY) && !defined(sun)
--#define PY_GETENTROPY 1
--
--/* Fill buffer with size pseudo-random bytes generated by getentropy().
-- Return 0 on success, or raise an exception and return -1 on error.
--
-- If raise is zero, don't raise an exception on error. */
--static int
--py_getentropy(char *buffer, Py_ssize_t size, int raise)
--{
-- while (size > 0) {
-- Py_ssize_t len = Py_MIN(size, 256);
-- int res;
-+#else /* !MS_WINDOWS */
-
-- if (raise) {
-- Py_BEGIN_ALLOW_THREADS
-- res = getentropy(buffer, len);
-- Py_END_ALLOW_THREADS
-- }
-- else {
-- res = getentropy(buffer, len);
-- }
--
-- if (res < 0) {
-- if (raise) {
-- PyErr_SetFromErrno(PyExc_OSError);
-- }
-- return -1;
-- }
--
-- buffer += len;
-- size -= len;
-- }
-- return 0;
--}
--
--#else
-
- #if defined(HAVE_GETRANDOM) || defined(HAVE_GETRANDOM_SYSCALL)
- #define PY_GETRANDOM 1
-@@ -217,6 +180,59 @@ py_getrandom(void *buffer, Py_ssize_t si
- }
- return 1;
- }
-+
-+/* Issue #25003: Don't use getentropy() on Solaris (available since
-+ * Solaris 11.3), it is blocking whereas os.urandom() should not block. */
-+#elif defined(HAVE_GETENTROPY) && !defined(sun)
-+#define PY_GETENTROPY 1
-+
-+/* Fill buffer with size pseudo-random bytes generated by getentropy().
-+ Return 1 on success, or raise an exception and return -1 on error.
-+
-+ If raise is zero, don't raise an exception on error. */
-+static int
-+py_getentropy(char *buffer, Py_ssize_t size, int raise)
-+{
-+ /* Is getentropy() supported by the running kernel? Set to 0 if
-+ getentropy() failed with ENOSYS. */
-+ static int getentropy_works = 1;
-+
-+ if (!getentropy_works) {
-+ return 0;
-+ }
-+
-+ while (size > 0) {
-+ Py_ssize_t len = Py_MIN(size, 256);
-+ int res;
-+
-+ if (raise) {
-+ Py_BEGIN_ALLOW_THREADS
-+ res = getentropy(buffer, len);
-+ Py_END_ALLOW_THREADS
-+ }
-+ else {
-+ res = getentropy(buffer, len);
-+ }
-+
-+ if (res < 0) {
-+ /* ENOSYS: the inner syscall is not supported by the running
-+ kernel. */
-+ if (errno == ENOSYS) {
-+ getentropy_works = 0;
-+ return 0;
-+ }
-+
-+ if (raise) {
-+ PyErr_SetFromErrno(PyExc_OSError);
-+ }
-+ return -1;
-+ }
-+
-+ buffer += len;
-+ size -= len;
-+ }
-+ return 1;
-+}
- #endif
-
- static struct {
-@@ -236,7 +252,7 @@ dev_urandom(char *buffer, Py_ssize_t siz
- {
- int fd;
- Py_ssize_t n;
--#ifdef PY_GETRANDOM
-+#if defined(PY_GETRANDOM) || defined(PY_GETENTROPY)
- int res;
- #endif
-
-@@ -244,17 +260,20 @@ dev_urandom(char *buffer, Py_ssize_t siz
-
- #ifdef PY_GETRANDOM
- res = py_getrandom(buffer, size, blocking, raise);
-+#elif defined(PY_GETENTROPY)
-+ res = py_getentropy(buffer, size, raise);
-+#endif
-+#if defined(PY_GETRANDOM) || defined(PY_GETENTROPY)
- if (res < 0) {
- return -1;
- }
- if (res == 1) {
- return 0;
- }
-- /* getrandom() failed with ENOSYS or EPERM,
-- fall back on reading /dev/urandom */
-+ /* function failed with ENOSYS or EPERM, fall back on reading
-+ from /dev/urandom */
- #endif
-
--
- if (raise) {
- struct _Py_stat_struct st;
-
-@@ -349,8 +368,8 @@ dev_urandom_close(void)
- urandom_cache.fd = -1;
- }
- }
-+#endif /* !MS_WINDOWS */
-
--#endif
-
- /* Fill buffer with pseudo-random bytes generated by a linear congruent
- generator (LCG):
-@@ -395,8 +414,6 @@ pyurandom(void *buffer, Py_ssize_t size,
-
- #ifdef MS_WINDOWS
- return win32_urandom((unsigned char *)buffer, size, raise);
--#elif defined(PY_GETENTROPY)
-- return py_getentropy(buffer, size, raise);
- #else
- return dev_urandom(buffer, size, blocking, raise);
- #endif
-@@ -491,8 +508,6 @@ void
- CryptReleaseContext(hCryptProv, 0);
- hCryptProv = 0;
- }
--#elif defined(PY_GETENTROPY)
-- /* nothing to clean */
- #else
- dev_urandom_close();
- #endif
diff --git a/00253-fix-HAVE_LONG_LONG-compatibility.patch
b/00253-fix-HAVE_LONG_LONG-compatibility.patch
deleted file mode 100644
index 7951e63..0000000
--- a/00253-fix-HAVE_LONG_LONG-compatibility.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-
-# HG changeset patch
-# User Victor Stinner <victor.stinner(a)gmail.com>
-# Date 1483653533 -3600
-# Node ID fad67c66885f0bd9ebafe2a54f0fa12b5a8fe3bf
-# Parent 52d671684342cd2dcc804566d4c755634d3210a8
-Issue #27961: Define HAVE_LONG_LONG as 1.
-
-Fix backward compatibility issue, HAVE_LONG_LONG was defined but empty, whereas
-it is defined as 1 in Python 3.5.
-
-diff --git a/Include/pyport.h b/Include/pyport.h
---- a/Include/pyport.h
-+++ b/Include/pyport.h
-@@ -39,7 +39,7 @@ Used in: Py_SAFE_DOWNCAST
-
- // long long is required. Ensure HAVE_LONG_LONG is defined for compatibility.
- #ifndef HAVE_LONG_LONG
--#define HAVE_LONG_LONG
-+#define HAVE_LONG_LONG 1
- #endif
- #ifndef PY_LONG_LONG
- #define PY_LONG_LONG long long
-
diff --git a/00254-make-Random.seed-actually-use-OS-randomness.patch
b/00254-make-Random.seed-actually-use-OS-randomness.patch
deleted file mode 100644
index e5ecb38..0000000
--- a/00254-make-Random.seed-actually-use-OS-randomness.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c
-index 63759d5..0d3282d 100644
---- a/Modules/_randommodule.c
-+++ b/Modules/_randommodule.c
-@@ -245,7 +245,7 @@ random_seed(RandomObject *self, PyObject *args)
- return NULL;
-
- if (arg == NULL || arg == Py_None) {
-- if (random_seed_urandom(self) >= 0) {
-+ if (random_seed_urandom(self) < 0) {
- PyErr_Clear();
-
- /* Reading system entropy failed, fall back on the worst entropy:
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
index e267b50..a13b644 100644
--- a/00262-pep538_coerce_legacy_c_locale.patch
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -151,7 +151,7 @@ index b71bb9f..56867fc 100644
@@ -9,8 +9,9 @@ import sys
import subprocess
import tempfile
- from test.support import script_helper
+ from test.support import script_helper, is_android
-from test.support.script_helper import (spawn_python, kill_python, assert_python_ok,
- assert_python_failure)
+from test.support.script_helper import (
diff --git a/00264-skip-test-failing-on-aarch64.patch
b/00264-skip-test-failing-on-aarch64.patch
new file mode 100644
index 0000000..edda219
--- /dev/null
+++ b/00264-skip-test-failing-on-aarch64.patch
@@ -0,0 +1,12 @@
+diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
+index 3eded77..ad7859a 100644
+--- a/Lib/ctypes/test/test_structures.py
++++ b/Lib/ctypes/test/test_structures.py
+@@ -392,6 +392,7 @@ class StructureTestCase(unittest.TestCase):
+ (1, 0, 0, 0, 0, 0))
+ self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7))
+
++ @unittest.skip('Fails on aarch64:
http://bugs.python.org/issue29804')
+ def test_pass_by_value(self):
+ # This should mirror the structure in Modules/_ctypes/_ctypes_test.c
+ class X(Structure):
diff --git a/python3.spec b/python3.spec
index 85c4142..042ff25 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,6 +24,8 @@
# Currently these packages are recommended to have been built before a targeted rebuild
after a python abi change:
# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt.
+# First release cadidate
+%global prerel rc1
%global with_rewheel 1
@@ -123,8 +125,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.0
-Release: 21%{?dist}
+Version: %{pybasever}.1
+Release: 0.1.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
@@ -197,7 +199,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{?prerel}....
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
@@ -412,28 +414,11 @@ Patch243: 00243-fix-mips64-triplet.patch
# Not yet fixed upstream:
http://bugs.python.org/issue28787
Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
-# 00250 #
-# After glibc-2.24.90, Python 3 failed to start on EL7 kernel
-# rhbz#1410175:
https://bugzilla.redhat.com/show_bug.cgi?id=1410175
-#
http://bugs.python.org/issue29157
-Patch250: 00250-getentropy.patch
-
# 00252
# Add executable option to install.py command to make it work for
# scripts specified as an entry_points
Patch252: 00252-add-executable-option.patch
-# 00253 #
-# Define HAVE_LONG_LONG as 1 instead of blank for backwards compatibility
-# Fixed upstream:
https://hg.python.org/cpython/rev/fad67c66885f
-Patch253: 00253-fix-HAVE_LONG_LONG-compatibility.patch
-
-# 00254 #
-# Fix error check, so that Random.seed actually uses OS randomness
-# rhbz#1412275:
https://bugzilla.redhat.com/show_bug.cgi?id=1412275
-# Fixed upstream:
https://bugs.python.org/issue29085
-Patch254: 00254-make-Random.seed-actually-use-OS-randomness.patch
-
# 00258 #
# Kernel 4.9 introduced some changes to its crypto API
# making test_aead_aes_gcm fail, so skipping the test for now
@@ -470,6 +455,13 @@ Patch262: 00262-pep538_coerce_legacy_c_locale.patch
#
#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+# 00264 #
+# test_pass_by_value was added in Python 3.6.1 and on aarch64
+# it is catching an error that was there, but wasn't tested before.
+# Therefore skipping the test on aarch64 until fixed upstream.
+# Reported upstream:
http://bugs.python.org/issue29804
+Patch264: 00264-skip-test-failing-on-aarch64.patch
+
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
@@ -705,15 +697,16 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch243 -p1
%patch249 -p1
-%patch250 -p1
%patch252 -p1
-%patch253 -p1
-%patch254 -p1
%patch258 -p1
%patch260 -p1
%patch261 -p1
%patch262 -p1
+%ifarch aarch64
+%patch264 -p1
+%endif
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -1219,7 +1212,7 @@ fi
%files
%defattr(-, root, root)
%license LICENSE
-%doc README
+%doc README.rst
%{_bindir}/pydoc*
%{_bindir}/python3
%{_bindir}/python%{pybasever}
@@ -1231,7 +1224,7 @@ fi
%files libs
%defattr(-,root,root,-)
%license LICENSE
-%doc README
+%doc README.rst
%{pylibdir}/lib2to3
%exclude %{pylibdir}/lib2to3/tests
@@ -1296,13 +1289,13 @@ fi
%files -n system-python
%defattr(-,root,root,-)
%license LICENSE
-%doc README
+%doc README.rst
%{_libexecdir}/system-python
%files -n system-python-libs
%defattr(-,root,root,-)
%license LICENSE
-%doc README
+%doc README.rst
%dir %{pylibdir}
%dir %{dynload_dir}
@@ -1375,7 +1368,6 @@ fi
%dir %{pylibdir}/site-packages/
%dir %{pylibdir}/site-packages/__pycache__/
-%{pylibdir}/site-packages/README
%{pylibdir}/site-packages/README.txt
%{pylibdir}/*.py
%dir %{pylibdir}/__pycache__/
@@ -1659,6 +1651,10 @@ fi
# ======================================================
%changelog
+* Thu Mar 16 2017 Iryna Shcherbina <ishcherb(a)redaht.com> - 3.6.1-0.1.rc1
+- Update to Python 3.6.1 release candidate 1
+- Add patch 264 to skip a known test failure on aarch64
+
* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
- Use proper command line parsing in _testembed
- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
diff --git a/sources b/sources
index 7b47bed..676f3bf 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (Python-3.6.0.tar.xz) =
9d06bee9172bc0bfd2d280fd1c27ea712f3258cfbfd2e2aeb734d0a6710998d5deeefc5d6e72251750dd9493d35461511ceaa187a29dea700ca238ff6ac1dbb2
+SHA512 (Python-3.6.1rc1.tar.xz) =
21ae75db2a568ba85af5510d45c3616595ae00b9f5008d78b926340980b4728f4fd393d2ecd435d2902cd25aba50a8b98f5cdbfa651da75c8f164909bc4730be
commit 3b36b495e58df146c9e12fb503d60efe1509c40b
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Mar 13 14:53:53 2017 +0100
Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
Fedora self-contained change:
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
Since the backport is based on some changes done for the bpo-24932, these changes were
backported as well
with the 261 patch, which will be removed when python3 is rebased to 3.6.1
diff --git a/00261-use-proper-command-line-parsing-in-_testembed.patch
b/00261-use-proper-command-line-parsing-in-_testembed.patch
new file mode 100644
index 0000000..49db110
--- /dev/null
+++ b/00261-use-proper-command-line-parsing-in-_testembed.patch
@@ -0,0 +1,104 @@
+diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
+index 6c3625d..2a53f3d 100644
+--- a/Lib/test/test_capi.py
++++ b/Lib/test/test_capi.py
+@@ -385,7 +385,7 @@ class EmbeddingTests(unittest.TestCase):
+
+ def test_subinterps(self):
+ # This is just a "don't crash" test
+- out, err = self.run_embedded_interpreter()
++ out, err =
self.run_embedded_interpreter("repeated_init_and_subinterpreters")
+ if support.verbose:
+ print()
+ print(out)
+diff --git a/Programs/_testembed.c b/Programs/_testembed.c
+index 3968399..a68d4fa 100644
+--- a/Programs/_testembed.c
++++ b/Programs/_testembed.c
+@@ -33,7 +33,7 @@ static void print_subinterp(void)
+ );
+ }
+
+-static void test_repeated_init_and_subinterpreters(void)
++static int test_repeated_init_and_subinterpreters(void)
+ {
+ PyThreadState *mainstate, *substate;
+ #ifdef WITH_THREAD
+@@ -70,6 +70,7 @@ static void test_repeated_init_and_subinterpreters(void)
+ PyEval_RestoreThread(mainstate);
+ Py_Finalize();
+ }
++ return 0;
+ }
+
+ /*****************************************************
+@@ -103,7 +104,7 @@ static void check_stdio_details(const char *encoding, const char *
errors)
+ Py_Finalize();
+ }
+
+-static void test_forced_io_encoding(void)
++static int test_forced_io_encoding(void)
+ {
+ /* Check various combinations */
+ printf("--- Use defaults ---\n");
+@@ -122,19 +123,51 @@ static void test_forced_io_encoding(void)
+ printf("Unexpected success calling Py_SetStandardStreamEncoding");
+ }
+ Py_Finalize();
++ return 0;
+ }
+
+-/* Different embedding tests */
+-int main(int argc, char *argv[])
++/* *********************************************************
++ * List of test cases and the function that implements it.
++ *
++ * Names are compared case-sensitively with the first
++ * argument. If no match is found, or no first argument was
++ * provided, the names of all test cases are printed and
++ * the exit code will be -1.
++ *
++ * The int returned from test functions is used as the exit
++ * code, and test_capi treats all non-zero exit codes as a
++ * failed test.
++ *********************************************************/
++struct TestCase
+ {
++ const char *name;
++ int (*func)(void);
++};
++
++static struct TestCase TestCases[] = {
++ { "forced_io_encoding", test_forced_io_encoding },
++ { "repeated_init_and_subinterpreters",
test_repeated_init_and_subinterpreters },
++ { NULL, NULL }
++};
+
+- /* TODO: Check the argument string to allow for more test cases */
++int main(int argc, char *argv[])
++{
+ if (argc > 1) {
+- /* For now: assume "forced_io_encoding */
+- test_forced_io_encoding();
+- } else {
+- /* Run the original embedding test case by default */
+- test_repeated_init_and_subinterpreters();
++ for (struct TestCase *tc = TestCases; tc && tc->name; tc++) {
++ if (strcmp(argv[1], tc->name) == 0)
++ return (*tc->func)();
++ }
+ }
+- return 0;
++
++ /* No match found, or no test name provided, so display usage */
++ printf("Python " PY_VERSION " _testembed executable for embedded
interpreter tests\n"
++ "Normally executed via 'EmbeddingTests' in
Lib/test/test_capi.py\n\n"
++ "Usage: %s TESTNAME\n\nAll available tests:\n", argv[0]);
++ for (struct TestCase *tc = TestCases; tc && tc->name; tc++) {
++ printf(" %s\n", tc->name);
++ }
++
++ /* Non-zero exit code will cause test_capi.py tests to fail.
++ This is intentional. */
++ return -1;
+ }
diff --git a/00262-pep538_coerce_legacy_c_locale.patch
b/00262-pep538_coerce_legacy_c_locale.patch
new file mode 100644
index 0000000..e267b50
--- /dev/null
+++ b/00262-pep538_coerce_legacy_c_locale.patch
@@ -0,0 +1,575 @@
+diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
+index c0e64d6..0bb28da 100644
+--- a/Doc/using/cmdline.rst
++++ b/Doc/using/cmdline.rst
+@@ -711,6 +711,35 @@ conflict.
+
+ .. versionadded:: 3.6
+
++
++.. envvar:: PYTHONCOERCECLOCALE
++
++ If set to a non-empty string, causes the main Python command line application
++ to skip coercing the legacy ASCII-based C locale to a more capable UTF-8
++ based alternative. Note that this setting is checked even when the
++ :option:`-E` or :option:`-I` options are used, as it is handled prior to
++ the processing of command line options.
++
++ If this variable is *not* set, and the current locale reported for the
++ ``LC_CTYPE`` category is the default ``C`` locale, then the Python CLI will
++ attempt to configure one of the following locales for the given locale
++ categories before loading the interpreter runtime:
++
++ * ``C.UTF-8` (``LC_ALL``)
++ * ``C.utf8` (``LC_ALL``)
++ * ``UTF-8` (``LC_CTYPE``)
++
++ If setting one of these locale categories succeeds, then the matching
++ environment variables will be set (both ``LC_ALL` and ``LANG`` for the
++ ``LC_ALL`` category, and ``LC_CTYPE`` for the ``LC_CTYPE`` category),
++ and (if not already set to a non-empty string) :envvar:`PYTHONIOENCODING`
++ will be set to ``utf-8:surrogateescape``.
++
++ Availability: \*nix
++
++ .. versionadded:: 3.7
++ See :pep:`538` for more details.
++
+ Debug-mode variables
+ ~~~~~~~~~~~~~~~~~~~~
+
+diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py
+index 80889b1..1a1a862 100644
+--- a/Lib/test/support/script_helper.py
++++ b/Lib/test/support/script_helper.py
+@@ -51,8 +51,35 @@ def interpreter_requires_environment():
+ return __cached_interp_requires_environment
+
+
+-_PythonRunResult = collections.namedtuple("_PythonRunResult",
+- ("rc", "out",
"err"))
++class _PythonRunResult(collections.namedtuple("_PythonRunResult",
++ ("rc", "out",
"err"))):
++ """Helper for reporting Python subprocess run
results"""
++ def fail(self, cmd_line):
++ """Provide helpful details about failed subcommand
runs"""
++ # Limit to 80 lines to ASCII characters
++ maxlen = 80 * 100
++ out, err = self.out, self.err
++ if len(out) > maxlen:
++ out = b'(... truncated stdout ...)' + out[-maxlen:]
++ if len(err) > maxlen:
++ err = b'(... truncated stderr ...)' + err[-maxlen:]
++ out = out.decode('ascii', 'replace').rstrip()
++ err = err.decode('ascii', 'replace').rstrip()
++ raise AssertionError("Process return code is %d\n"
++ "command line: %r\n"
++ "\n"
++ "stdout:\n"
++ "---\n"
++ "%s\n"
++ "---\n"
++ "\n"
++ "stderr:\n"
++ "---\n"
++ "%s\n"
++ "---"
++ % (self.rc, cmd_line,
++ out,
++ err))
+
+
+ # Executing the interpreter in a subprocess
+@@ -99,30 +126,7 @@ def run_python_until_end(*args, **env_vars):
+ def _assert_python(expected_success, *args, **env_vars):
+ res, cmd_line = run_python_until_end(*args, **env_vars)
+ if (res.rc and expected_success) or (not res.rc and not expected_success):
+- # Limit to 80 lines to ASCII characters
+- maxlen = 80 * 100
+- out, err = res.out, res.err
+- if len(out) > maxlen:
+- out = b'(... truncated stdout ...)' + out[-maxlen:]
+- if len(err) > maxlen:
+- err = b'(... truncated stderr ...)' + err[-maxlen:]
+- out = out.decode('ascii', 'replace').rstrip()
+- err = err.decode('ascii', 'replace').rstrip()
+- raise AssertionError("Process return code is %d\n"
+- "command line: %r\n"
+- "\n"
+- "stdout:\n"
+- "---\n"
+- "%s\n"
+- "---\n"
+- "\n"
+- "stderr:\n"
+- "---\n"
+- "%s\n"
+- "---"
+- % (res.rc, cmd_line,
+- out,
+- err))
++ res.fail(cmd_line)
+ return res
+
+ def assert_python_ok(*args, **env_vars):
+diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
+index 2a53f3d..ece84af 100644
+--- a/Lib/test/test_capi.py
++++ b/Lib/test/test_capi.py
+@@ -386,7 +386,7 @@ class EmbeddingTests(unittest.TestCase):
+ def test_subinterps(self):
+ # This is just a "don't crash" test
+ out, err =
self.run_embedded_interpreter("repeated_init_and_subinterpreters")
+- if support.verbose:
++ if support.verbose > 1:
+ print()
+ print(out)
+ print(err)
+@@ -404,14 +404,15 @@ class EmbeddingTests(unittest.TestCase):
+ def test_forced_io_encoding(self):
+ # Checks forced configuration of embedded interpreter IO streams
+ out, err = self.run_embedded_interpreter("forced_io_encoding")
+- if support.verbose:
++ if support.verbose > 1:
+ print()
+ print(out)
+ print(err)
+- expected_errors = sys.__stdout__.errors
+- expected_stdin_encoding = sys.__stdin__.encoding
++ expected_errors = "surrogateescape"
++ expected_stdin_encoding = "UTF-8"
+ expected_pipe_encoding = self._get_default_pipe_encoding()
+ expected_output = '\n'.join([
++ "Setting PYTHONIOENCODING=UTF-8:surrogateescape",
+ "--- Use defaults ---",
+ "Expected encoding: default",
+ "Expected errors: default",
+diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
+index b71bb9f..56867fc 100644
+--- a/Lib/test/test_cmd_line.py
++++ b/Lib/test/test_cmd_line.py
+@@ -9,8 +9,9 @@ import sys
+ import subprocess
+ import tempfile
+ from test.support import script_helper
+-from test.support.script_helper import (spawn_python, kill_python, assert_python_ok,
+- assert_python_failure)
++from test.support.script_helper import (
++ spawn_python, kill_python, assert_python_ok, assert_python_failure
++)
+
+
+ # XXX (ncoghlan): Move to script_helper and make consistent with run_python
+@@ -151,6 +152,7 @@ class CmdLineTest(unittest.TestCase):
+ env = os.environ.copy()
+ # Use C locale to get ascii for the locale encoding
+ env['LC_ALL'] = 'C'
++ env['PYTHONCOERCECLOCALE'] = '0'
+ code = (
+ b'import locale; '
+ b'print(ascii("' + undecodable + b'"), '
+diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
+index df9ebd4..63145e4 100644
+--- a/Lib/test/test_sys.py
++++ b/Lib/test/test_sys.py
+@@ -680,6 +680,7 @@ class SysModuleTest(unittest.TestCase):
+ # Force the POSIX locale
+ env = os.environ.copy()
+ env["LC_ALL"] = "C"
++ env["PYTHONCOERCECLOCALE"] = "0"
+ code = '\n'.join((
+ 'import sys',
+ 'def dump(name):',
+diff --git a/Programs/_testembed.c b/Programs/_testembed.c
+index a68d4fa..1494452 100644
+--- a/Programs/_testembed.c
++++ b/Programs/_testembed.c
+@@ -1,4 +1,5 @@
+-#include <Python.h>
++#include "Python.h"
++#include "pyconfig.h"
+ #include <stdio.h>
+
+ /*********************************************************
+@@ -106,6 +107,9 @@ static void check_stdio_details(const char *encoding, const char *
errors)
+
+ static int test_forced_io_encoding(void)
+ {
++ /* Ensure consistent "defaults" */
++ printf("Setting PYTHONIOENCODING=UTF-8:surrogateescape\n");
++ setenv("PYTHONIOENCODING", "UTF-8:surrogateescape", 1);
+ /* Check various combinations */
+ printf("--- Use defaults ---\n");
+ check_stdio_details(NULL, NULL);
+@@ -126,6 +130,20 @@ static int test_forced_io_encoding(void)
+ return 0;
+ }
+
++static int test_c_locale_warning(void)
++{
++#ifdef PY_WARN_ON_C_LOCALE
++ /* Force use of the C locale */
++ setenv("LC_ALL", "C", 1);
++
++ _testembed_Py_Initialize();
++ Py_Finalize();
++#else
++ printf("C locale compatibility warning disabled at compile time\n");
++#endif
++ return 0;
++}
++
+ /* *********************************************************
+ * List of test cases and the function that implements it.
+ *
+@@ -147,6 +165,7 @@ struct TestCase
+ static struct TestCase TestCases[] = {
+ { "forced_io_encoding", test_forced_io_encoding },
+ { "repeated_init_and_subinterpreters",
test_repeated_init_and_subinterpreters },
++ { "c_locale_warning", test_c_locale_warning },
+ { NULL, NULL }
+ };
+
+diff --git a/Programs/python.c b/Programs/python.c
+index a7afbc7..b5edebb 100644
+--- a/Programs/python.c
++++ b/Programs/python.c
+@@ -15,6 +15,110 @@ wmain(int argc, wchar_t **argv)
+ }
+ #else
+
++/* Helpers to better handle the legacy C locale
++ *
++ * The legacy C locale assumes ASCII as the default text encoding, which
++ * causes problems not only for the CPython runtime, but also other
++ * components like GNU readline.
++ *
++ * Accordingly, when the CLI detects it, it attempts to coerce it to a
++ * more capable UTF-8 based alternative.
++ *
++ * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
++ *
++ */
++
++#ifdef PY_COERCE_C_LOCALE
++static const char *_C_LOCALE_COERCION_WARNING =
++ "Python detected LC_CTYPE=C: %.20s coerced to %.20s (set another locale "
++ "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behaviour).\n";
++
++typedef struct _CandidateLocale {
++ const char *locale_name;
++ int category;
++} _LocaleCoercionTarget;
++
++static _LocaleCoercionTarget _TARGET_LOCALES[] = {
++ { "C.UTF-8", LC_ALL },
++ { "C.utf8", LC_ALL },
++ { "UTF-8", LC_CTYPE },
++ { NULL, 0 }
++};
++
++void
++_coerce_default_locale_settings(const _LocaleCoercionTarget *target)
++{
++ const char *newloc = target->locale_name;
++ int category = target->category;
++
++ /* Reset locale back to currently configured defaults */
++ setlocale(LC_ALL, "");
++
++ /* Set the relevant locale environment variables */
++ if (category == LC_ALL) {
++ const char *env_vars_updated = "LC_ALL & LANG";
++ if (setenv("LC_ALL", newloc, 1)) {
++ fprintf(stderr,
++ "Error setting LC_ALL, skipping C locale coercion\n");
++ return;
++ }
++ if (setenv("LANG", newloc, 1)) {
++ fprintf(stderr,
++ "Error setting LANG during C locale coercion\n");
++ env_vars_updated = "LC_ALL";
++ }
++ fprintf(stderr, _C_LOCALE_COERCION_WARNING, env_vars_updated, newloc);
++ } else if (category == LC_CTYPE) {
++ if (setenv("LC_CTYPE", newloc, 1)) {
++ fprintf(stderr,
++ "Error setting LC_CTYPE, skipping C locale coercion\n");
++ return;
++ }
++ fprintf(stderr, _C_LOCALE_COERCION_WARNING, "LC_CTYPE", newloc);
++ } else {
++ fprintf(stderr, "Locale coercion must target LC_ALL or LC_CTYPE\n");
++ return;
++ }
++
++ /* Set PYTHONIOENCODING if not already set */
++ if (setenv("PYTHONIOENCODING", "utf-8:surrogateescape", 0)) {
++ fprintf(stderr,
++ "Error setting PYTHONIOENCODING during C locale coercion\n");
++ }
++
++ /* Reconfigure with the overridden environment variables */
++ setlocale(LC_ALL, "");
++}
++
++void
++_handle_legacy_c_locale(void)
++{
++ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
++ /* We ignore the Python -E and -I flags here, as we need to sort out
++ * the locale settings *before* we try to do anything with the command
++ * line arguments. For cross-platform debugging purposes, we also need
++ * to give end users a way to force even scripts that are otherwise
++ * isolated from their environment to use the legacy ASCII-centric C
++ * locale.
++ */
++ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
++ /* PYTHONCOERCECLOCALE is not set, or is not set to exactly "0" */
++ const _LocaleCoercionTarget *target = NULL;
++ for (target = _TARGET_LOCALES; target->locale_name; target++) {
++ const char *reconfigured_locale = setlocale(target->category,
++ target->locale_name);
++ if (reconfigured_locale != NULL) {
++ /* Successfully configured locale, so make it the default */
++ _coerce_default_locale_settings(target);
++ return;
++ }
++ }
++
++ }
++ /* No C locale warning here, as Py_Initialize will emit one later */
++}
++#endif
++
+ int
+ main(int argc, char **argv)
+ {
+@@ -49,7 +153,26 @@ main(int argc, char **argv)
+ return 1;
+ }
+
++#ifdef __ANDROID__
++ /* Passing "" to setlocale() on Android requests the C locale rather
++ * than checking environment variables, so request C.UTF-8 explicitly
++ */
++ setlocale(LC_ALL, "C.UTF-8");
++#else
++ /* Reconfigure the locale to the default for this process */
+ setlocale(LC_ALL, "");
++#endif
++
++#ifdef PY_COERCE_C_LOCALE
++ /* When the LC_CTYPE category still claims to be using the C locale,
++ assume configuration error and try for a UTF-8 based locale instead */
++ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
++ if (ctype_loc != NULL && strcmp(ctype_loc, "C") == 0) {
++ _handle_legacy_c_locale();
++ }
++#endif
++
++ /* Convert from char to wchar_t based on the locale settings */
+ for (i = 0; i < argc; i++) {
+ argv_copy[i] = Py_DecodeLocale(argv[i], NULL);
+ if (!argv_copy[i]) {
+diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
+index a4f7f82..dd58dc9 100644
+--- a/Python/pylifecycle.c
++++ b/Python/pylifecycle.c
+@@ -301,6 +301,31 @@ import_init(PyInterpreterState *interp, PyObject *sysmod)
+ }
+
+
++#ifdef PY_WARN_ON_C_LOCALE
++static const char *_C_LOCALE_WARNING =
++ "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII
"
++ "encoding), which may cause Unicode compatibility problems. Using C.UTF-8,
"
++ "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
++ "locales is recommended.\n";
++
++static void
++_emit_stderr_warning_for_c_locale(void)
++{
++ const char *coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
++ /* We don't emit a warning if locale coercion has been explicitly disabled.
++ *
++ * For consistency with the corresponding check in Programs/python.c
++ * we ignore the Python -E and -I flags here.
++ */
++ if (coerce_c_locale == NULL || strncmp(coerce_c_locale, "0", 2) != 0) {
++ const char *ctype_loc = setlocale(LC_CTYPE, NULL);
++ if (ctype_loc != NULL && strcmp(ctype_loc, "C") == 0) {
++ fprintf(stderr, "%s", _C_LOCALE_WARNING);
++ }
++ }
++}
++#endif
++
+ void
+ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
+ {
+@@ -315,11 +340,19 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
+ initialized = 1;
+ _Py_Finalizing = NULL;
+
+-#ifdef HAVE_SETLOCALE
++#ifdef __ANDROID__
++ /* Passing "" to setlocale() on Android requests the C locale rather
++ * than checking environment variables, so request C.UTF-8 explicitly
++ */
++ setlocale(LC_CTYPE, "C.UTF-8");
++#else
+ /* Set up the LC_CTYPE locale, so we can obtain
+ the locale's charset without having to switch
+ locales. */
+ setlocale(LC_CTYPE, "");
++#ifdef PY_WARN_ON_C_LOCALE
++ _emit_stderr_warning_for_c_locale();
++#endif
+ #endif
+
+ if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
+diff --git a/configure b/configure
+index 6bcddb7..13052d6 100755
+--- a/configure
++++ b/configure
+@@ -834,6 +834,8 @@ with_thread
+ enable_ipv6
+ with_doc_strings
+ with_pymalloc
++with_c_locale_coercion
++with_c_locale_warning
+ with_valgrind
+ with_dtrace
+ with_fpectl
+@@ -1527,6 +1529,12 @@ Optional Packages:
+ deprecated; use --with(out)-threads
+ --with(out)-doc-strings disable/enable documentation strings
+ --with(out)-pymalloc disable/enable specialized mallocs
++ --with(out)-c-locale-coercion
++ disable/enable C locale coercion to a UTF-8 based
++ locale
++ --with(out)-c-locale-warning
++ disable/enable locale compatibility warning in the C
++ locale
+ --with-valgrind Enable Valgrind support
+ --with(out)-dtrace disable/enable DTrace support
+ --with-fpectl enable SIGFPE catching
+@@ -11016,6 +11024,52 @@ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pymalloc" >&5
+ $as_echo "$with_pymalloc" >&6; }
+
++# Check for --with-c-locale-coercion
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for
--with-c-locale-coercion" >&5
++$as_echo_n "checking for --with-c-locale-coercion... " >&6; }
++
++# Check whether --with-c-locale-coercion was given.
++if test "${with_c_locale_coercion+set}" = set; then :
++ withval=$with_c_locale_coercion;
++fi
++
++
++if test -z "$with_c_locale_coercion"
++then
++ with_c_locale_coercion="yes"
++fi
++if test "$with_c_locale_coercion" != "no"
++then
++
++$as_echo "#define PY_COERCE_C_LOCALE 1" >>confdefs.h
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_c_locale_coercion"
>&5
++$as_echo "$with_c_locale_coercion" >&6; }
++
++# Check for --with-c-locale-warning
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-c-locale-warning"
>&5
++$as_echo_n "checking for --with-c-locale-warning... " >&6; }
++
++# Check whether --with-c-locale-warning was given.
++if test "${with_c_locale_warning+set}" = set; then :
++ withval=$with_c_locale_warning;
++fi
++
++
++if test -z "$with_c_locale_warning"
++then
++ with_c_locale_warning="yes"
++fi
++if test "$with_c_locale_warning" != "no"
++then
++
++$as_echo "#define PY_WARN_ON_C_LOCALE 1" >>confdefs.h
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_c_locale_warning"
>&5
++$as_echo "$with_c_locale_warning" >&6; }
++
+ # Check for Valgrind support
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-valgrind"
>&5
+ $as_echo_n "checking for --with-valgrind... " >&6; }
+diff --git a/configure.ac b/configure.ac
+index e222c21..a1653e7 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -3287,6 +3287,40 @@ then
+ fi
+ AC_MSG_RESULT($with_pymalloc)
+
++# Check for --with-c-locale-coercion
++AC_MSG_CHECKING(for --with-c-locale-coercion)
++AC_ARG_WITH(c-locale-coercion,
++ AS_HELP_STRING([--with(out)-c-locale-coercion],
++ [disable/enable C locale coercion to a UTF-8 based locale]))
++
++if test -z "$with_c_locale_coercion"
++then
++ with_c_locale_coercion="yes"
++fi
++if test "$with_c_locale_coercion" != "no"
++then
++ AC_DEFINE(PY_COERCE_C_LOCALE, 1,
++ [Define if you want to coerce the C locale to a UTF-8 based locale])
++fi
++AC_MSG_RESULT($with_c_locale_coercion)
++
++# Check for --with-c-locale-warning
++AC_MSG_CHECKING(for --with-c-locale-warning)
++AC_ARG_WITH(c-locale-warning,
++ AS_HELP_STRING([--with(out)-c-locale-warning],
++ [disable/enable locale compatibility warning in the C locale]))
++
++if test -z "$with_c_locale_warning"
++then
++ with_c_locale_warning="yes"
++fi
++if test "$with_c_locale_warning" != "no"
++then
++ AC_DEFINE(PY_WARN_ON_C_LOCALE, 1,
++ [Define to emit a locale compatibility warning in the C locale])
++fi
++AC_MSG_RESULT($with_c_locale_warning)
++
+ # Check for Valgrind support
+ AC_MSG_CHECKING([for --with-valgrind])
+ AC_ARG_WITH([valgrind],
+diff --git a/pyconfig.h.in b/pyconfig.h.in
+index e7a836c..11e0798 100644
+--- a/pyconfig.h.in
++++ b/pyconfig.h.in
+@@ -1241,9 +1241,15 @@
+ /* Define as the preferred size in bits of long digits */
+ #undef PYLONG_BITS_IN_DIGIT
+
++/* Define if you want to coerce the C locale to a UTF-8 based locale */
++#undef PY_COERCE_C_LOCALE
++
+ /* Define to printf format modifier for Py_ssize_t */
+ #undef PY_FORMAT_SIZE_T
+
++/* Define to emit a locale compatibility warning in the C locale */
++#undef PY_WARN_ON_C_LOCALE
++
+ /* Define if you want to build an interpreter with many run-time checks. */
+ #undef Py_DEBUG
+
diff --git a/python3.spec b/python3.spec
index 7882ff6..85c4142 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 20%{?dist}
+Release: 21%{?dist}
License: Python
Group: Development/Languages
@@ -449,6 +449,18 @@ Patch258: 00258-fix-test_aead_aes_gcm.patch
#
https://github.com/python/cpython/pull/67
Patch260: 00260-require-setuptools-dependencies.patch
+# 00261 #
+# Use proper command line parsing in _testembed
+# Fixed upstream:
http://bugs.python.org/issue24932
+Patch261: 00261-use-proper-command-line-parsing-in-_testembed.patch
+
+# 00262 #
+# Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
+#
https://www.python.org/dev/peps/pep-0538/
+# Fedora Change:
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
+# Original proposal:
https://bugzilla.redhat.com/show_bug.cgi?id=1404918
+Patch262: 00262-pep538_coerce_legacy_c_locale.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -699,6 +711,8 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch254 -p1
%patch258 -p1
%patch260 -p1
+%patch261 -p1
+%patch262 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1645,6 +1659,11 @@ fi
# ======================================================
%changelog
+* Fri Mar 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-21
+- Use proper command line parsing in _testembed
+- Backport of PEP 538: Coercing the legacy C locale to a UTF-8 based locale
+
https://fedoraproject.org/wiki/Changes/python3_c.utf-8_locale
+
* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
commit 860f392aef95af78914c856543195f77528391c9
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Feb 28 14:33:44 2017 +0100
Add AppData and desktop file for IDLE 3 (rhbz#1392049)
diff --git a/idle3.appdata.xml b/idle3.appdata.xml
new file mode 100644
index 0000000..94f87a2
--- /dev/null
+++ b/idle3.appdata.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Copyright 2017 Zbigniew Jdrzejewski-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 Pythons 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&...
+ <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(a)in.waw.pl</update_contact>
+</application>
diff --git a/idle3.desktop b/idle3.desktop
new file mode 100644
index 0000000..dc1d3c3
--- /dev/null
+++ b/idle3.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Name=IDLE 3
+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;
\ No newline at end of file
diff --git a/python3.spec b/python3.spec
index 1599b60..7882ff6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 19%{?dist}
+Release: 20%{?dist}
License: Python
Group: Development/Languages
@@ -162,6 +162,8 @@ BuildRequires: openssl-devel
BuildRequires: pkgconfig
BuildRequires: readline-devel
BuildRequires: sqlite-devel
+BuildRequires: desktop-file-utils
+BuildRequires: libappstream-glib
BuildRequires: systemtap-sdt-devel
BuildRequires: systemtap-devel
@@ -223,6 +225,12 @@ Source8: check-pyc-and-pyo-timestamps.py
# A simple macro that enables packages to require system-python(abi) instead of
python(abi)
Source9: macros.systempython
+# Desktop menu entry for idle3
+Source10: idle3.desktop
+
+# AppData file for idle3
+Source11: idle3.appdata.xml
+
# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
@@ -870,6 +878,17 @@ install -d -m 0755
${RPM_BUILD_ROOT}%{pylibdir}/site-packages/__pycache__
mv ${RPM_BUILD_ROOT}%{_bindir}/2to3 ${RPM_BUILD_ROOT}%{_bindir}/python3-2to3
+# add idle3 to menu
+install -D -m 0644 Lib/idlelib/Icons/idle_16.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/16x16/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_32.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/32x32/apps/idle3.png
+install -D -m 0644 Lib/idlelib/Icons/idle_48.png
${RPM_BUILD_ROOT}%{_datadir}/icons/hicolor/48x48/apps/idle3.png
+desktop-file-install --dir=${RPM_BUILD_ROOT}%{_datadir}/applications %{SOURCE10}
+
+# Install and validate appdata file
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/appdata
+cp -a %{SOURCE11} ${RPM_BUILD_ROOT}%{_datadir}/appdata
+appstream-util validate-relax --nonet
${RPM_BUILD_ROOT}%{_datadir}/appdata/idle3.appdata.xml
+
# Development tools
install -m755 -d ${RPM_BUILD_ROOT}%{pylibdir}/Tools
install Tools/README ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
@@ -1171,7 +1190,17 @@ rm -fr %{buildroot}
%postun -n system-python-libs -p /sbin/ldconfig
+%post
+/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
+
+%postun
+if [ $1 -eq 0 ] ; then
+ /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
+ /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+fi
+%posttrans
+/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
%files
%defattr(-, root, root)
@@ -1448,6 +1477,9 @@ rm -fr %{buildroot}
%{_bindir}/idle*
%{pylibdir}/Tools
%doc %{pylibdir}/Doc
+%{_datadir}/appdata/idle3.appdata.xml
+%{_datadir}/applications/idle3.desktop
+%{_datadir}/icons/hicolor/*/apps/idle3.*
%files tkinter
%defattr(-,root,root,755)
@@ -1613,6 +1645,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Feb 27 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-20
+- Add desktop entry and appdata.xml file for IDLE 3 (rhbz#1392049)
+
* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
- Revert "Set values of prefix and exec_prefix to /usr/local for
/usr/bin/python* executables..." to prevent build failures
commit bbccd649abc2d4cd646b9cc2c0889e3bd897e501
Author: Michal Cyprian <mcyprian(a)redhat.com>
Date: Fri Feb 24 14:57:15 2017 +0100
Revert "Set values of prefix and exec_prefix to /usr/local for..."
- Prevent build failures of packages using alternate build tools
- This reverts commit 24515db173c9d3d65e1e24fc29fb9be88227bf52
diff --git a/00251-set-python3-prefixes.patch b/00251-set-python3-prefixes.patch
deleted file mode 100644
index c3043bf..0000000
--- a/00251-set-python3-prefixes.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-diff --git a/Lib/site.py b/Lib/site.py
-index ad1033e..f2fb028 100644
---- a/Lib/site.py
-+++ b/Lib/site.py
-@@ -537,6 +537,23 @@ def execusercustomize():
- (err.__class__.__name__, err))
-
-
-+def set_prefixes():
-+ """Set values of prefix and exec_prefix to /usr/local if executable
is
-+ /usr/bin/python* to make pip and distutils install into separate location.
-+
-+ New value of sys.prefix is inserted to PREFIXES list that contains
-+ it's previous value. Both paths /usr/lib/pythonX.Y/site-packages and
-+ /usr/local/lib/pythonX.Y/site-packages will be included in sys.path.
-+ """
-+ global PREFIXES
-+ global ENABLE_USER_SITE
-+
-+ if sys.executable.startswith("/usr/bin/python"):
-+ sys.prefix = sys.exec_prefix = "/usr/local"
-+ if ENABLE_USER_SITE:
-+ PREFIXES.insert(0, sys.prefix)
-+
-+
- def main():
- """Add standard site-specific directories to the module search path.
-
-@@ -550,6 +567,7 @@ def main():
- known_paths = venv(known_paths)
- if ENABLE_USER_SITE is None:
- ENABLE_USER_SITE = check_enableusersite()
-+ set_prefixes()
- known_paths = addusersitepackages(known_paths)
- known_paths = addsitepackages(known_paths)
- setquit()
diff --git a/python3.spec b/python3.spec
index 2ce5024..1599b60 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 18%{?dist}
+Release: 19%{?dist}
License: Python
Group: Development/Languages
@@ -410,11 +410,6 @@ Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
#
http://bugs.python.org/issue29157
Patch250: 00250-getentropy.patch
-# 00251
-# Set values of prefix and exec_prefix to /usr/local if executable is
-# /usr/bin/python* to make pip and distutils install into separate location
-Patch251: 00251-set-python3-prefixes.patch
-
# 00252
# Add executable option to install.py command to make it work for
# scripts specified as an entry_points
@@ -481,12 +476,6 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Obsoletes: python%{pyshortver}
Provides: python%{pyshortver} = %{version}-%{release}
-%if 0%{?_module_build}
-Requires: system-python = %{version}
-%else
-Requires: system-python = %{version}-%{release}
-%endif
-
%if 0%{with_rewheel}
Requires: python3-setuptools
Requires: python3-pip
@@ -502,7 +491,7 @@ considerably, and a lot of deprecated features have finally been
removed.
Summary: Python 3 runtime libraries
Group: Development/Libraries
# For Modularity purpose we need not to include the dist-tag int he dependency
-%if 0%{?_module_build}
+%if %(d="%{?dist}"; [ "${d#module-base-runtime-}x" !=
"${d}x" ] && echo 1 || echo 0)
Requires: system-python-libs%{?_isa} = %{version}
%else
Requires: system-python-libs%{?_isa} = %{version}-%{release}
@@ -697,7 +686,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch243 -p1
%patch249 -p1
%patch250 -p1
-%patch251 -p1
%patch252 -p1
%patch253 -p1
%patch254 -p1
@@ -1625,6 +1613,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Feb 24 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-19
+- Revert "Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables..." to prevent build failures
+ of packages using alternate build tools
+
* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
- Set values of prefix and exec_prefix to /usr/local for
/usr/bin/python* executables
commit 24515db173c9d3d65e1e24fc29fb9be88227bf52
Author: Michal Cyprian <mcyprian(a)redhat.com>
Date: Tue Feb 21 11:17:54 2017 +0100
Set values of prefix and exec_prefix to /usr/local for
/usr/bin/python* executables to make pip and distutils
install to the separate location
- Use new %%_module_build macro
diff --git a/00251-set-python3-prefixes.patch b/00251-set-python3-prefixes.patch
new file mode 100644
index 0000000..c3043bf
--- /dev/null
+++ b/00251-set-python3-prefixes.patch
@@ -0,0 +1,36 @@
+diff --git a/Lib/site.py b/Lib/site.py
+index ad1033e..f2fb028 100644
+--- a/Lib/site.py
++++ b/Lib/site.py
+@@ -537,6 +537,23 @@ def execusercustomize():
+ (err.__class__.__name__, err))
+
+
++def set_prefixes():
++ """Set values of prefix and exec_prefix to /usr/local if executable
is
++ /usr/bin/python* to make pip and distutils install into separate location.
++
++ New value of sys.prefix is inserted to PREFIXES list that contains
++ it's previous value. Both paths /usr/lib/pythonX.Y/site-packages and
++ /usr/local/lib/pythonX.Y/site-packages will be included in sys.path.
++ """
++ global PREFIXES
++ global ENABLE_USER_SITE
++
++ if sys.executable.startswith("/usr/bin/python"):
++ sys.prefix = sys.exec_prefix = "/usr/local"
++ if ENABLE_USER_SITE:
++ PREFIXES.insert(0, sys.prefix)
++
++
+ def main():
+ """Add standard site-specific directories to the module search path.
+
+@@ -550,6 +567,7 @@ def main():
+ known_paths = venv(known_paths)
+ if ENABLE_USER_SITE is None:
+ ENABLE_USER_SITE = check_enableusersite()
++ set_prefixes()
+ known_paths = addusersitepackages(known_paths)
+ known_paths = addsitepackages(known_paths)
+ setquit()
diff --git a/python3.spec b/python3.spec
index da8010c..2ce5024 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 13%{?dist}
+Release: 18%{?dist}
License: Python
Group: Development/Languages
@@ -410,6 +410,11 @@ Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
#
http://bugs.python.org/issue29157
Patch250: 00250-getentropy.patch
+# 00251
+# Set values of prefix and exec_prefix to /usr/local if executable is
+# /usr/bin/python* to make pip and distutils install into separate location
+Patch251: 00251-set-python3-prefixes.patch
+
# 00252
# Add executable option to install.py command to make it work for
# scripts specified as an entry_points
@@ -476,6 +481,12 @@ Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Obsoletes: python%{pyshortver}
Provides: python%{pyshortver} = %{version}-%{release}
+%if 0%{?_module_build}
+Requires: system-python = %{version}
+%else
+Requires: system-python = %{version}-%{release}
+%endif
+
%if 0%{with_rewheel}
Requires: python3-setuptools
Requires: python3-pip
@@ -491,7 +502,7 @@ considerably, and a lot of deprecated features have finally been
removed.
Summary: Python 3 runtime libraries
Group: Development/Libraries
# For Modularity purpose we need not to include the dist-tag int he dependency
-%if %(d="%{?dist}"; [ "${d#module-base-runtime-}x" !=
"${d}x" ] && echo 1 || echo 0)
+%if 0%{?_module_build}
Requires: system-python-libs%{?_isa} = %{version}
%else
Requires: system-python-libs%{?_isa} = %{version}-%{release}
@@ -686,6 +697,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch243 -p1
%patch249 -p1
%patch250 -p1
+%patch251 -p1
%patch252 -p1
%patch253 -p1
%patch254 -p1
@@ -1613,6 +1625,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Feb 21 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-18
+- Set values of prefix and exec_prefix to /usr/local for
+ /usr/bin/python* executables
+- Use new %%_module_build macro
+
* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
- Add --executable option to install.py command
commit ef5c6fe479f00fb1dd84307ecb0f3e3aaef955a2
Author: Michal Cyprian <mcyprian(a)redhat.com>
Date: Tue Feb 21 10:38:18 2017 +0100
Add --executable option to install.py command
diff --git a/00252-add-executable-option.patch b/00252-add-executable-option.patch
new file mode 100644
index 0000000..b3bf721
--- /dev/null
+++ b/00252-add-executable-option.patch
@@ -0,0 +1,45 @@
+diff --git a/Lib/distutils/cmd.py b/Lib/distutils/cmd.py
+index c89d5ef..dd61621 100644
+--- a/Lib/distutils/cmd.py
++++ b/Lib/distutils/cmd.py
+@@ -296,7 +296,8 @@ class Command:
+ finalized command object.
+ """
+ cmd_obj = self.distribution.get_command_obj(command, create)
+- cmd_obj.ensure_finalized()
++ if cmd_obj is not None:
++ cmd_obj.ensure_finalized()
+ return cmd_obj
+
+ # XXX rename to 'get_reinitialized_command()'? (should do the
+diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
+index 8174192..30ca739 100644
+--- a/Lib/distutils/command/install.py
++++ b/Lib/distutils/command/install.py
+@@ -122,6 +122,8 @@ class install(Command):
+ "force installation (overwrite any existing files)"),
+ ('skip-build', None,
+ "skip rebuilding everything (for testing/debugging)"),
++ ('executable=', 'e',
++ "specify final destination interpreter path (install.py)"),
+
+ # Where to install documentation (eventually!)
+ #('doc-format=', None, "format of documentation to
generate"),
+@@ -194,6 +196,7 @@ class install(Command):
+ # directory not in sys.path.
+ self.force = 0
+ self.skip_build = 0
++ self.executable = None
+ self.warn_dir = 1
+
+ # These are only here as a conduit from the 'build' command to the
+@@ -365,6 +368,9 @@ class install(Command):
+ ('build_base', 'build_base'),
+ ('build_lib', 'build_lib'))
+
++ if self.executable is None:
++ self.executable = os.path.normpath(sys.executable)
++
+ # Punt on doc directories for now -- after all, we're punting on
+ # documentation completely!
+
diff --git a/python3.spec b/python3.spec
index 29904b1..da8010c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
Group: Development/Languages
@@ -410,6 +410,11 @@ Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
#
http://bugs.python.org/issue29157
Patch250: 00250-getentropy.patch
+# 00252
+# Add executable option to install.py command to make it work for
+# scripts specified as an entry_points
+Patch252: 00252-add-executable-option.patch
+
# 00253 #
# Define HAVE_LONG_LONG as 1 instead of blank for backwards compatibility
# Fixed upstream:
https://hg.python.org/cpython/rev/fad67c66885f
@@ -681,6 +686,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch243 -p1
%patch249 -p1
%patch250 -p1
+%patch252 -p1
%patch253 -p1
%patch254 -p1
%patch258 -p1
@@ -1607,6 +1613,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Feb 17 2017 Michal Cyprian <mcyprian(a)redhat.com> - 3.6.0-13
+- Add --executable option to install.py command
+
* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
in order for the virtualenvs to work properly
commit 7973de8b00d4be10a162ddba58157e7a3669b043
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Feb 17 10:26:59 2017 +0100
BuildRequire the new dependencies of python-setuptools when rewheel mode is enabled
and add a patch to adjust the upstream test suite to account for these dependencies,
since without them, the virtualenv's would not install anything in their
site-packages
directory thus making pip unusable inside virtualenv's.
diff --git a/00260-require-setuptools-dependencies.patch
b/00260-require-setuptools-dependencies.patch
new file mode 100644
index 0000000..2e3ac20
--- /dev/null
+++ b/00260-require-setuptools-dependencies.patch
@@ -0,0 +1,183 @@
+diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
+index 9f5d151..4dfa8a1 100644
+--- a/Lib/ensurepip/__init__.py
++++ b/Lib/ensurepip/__init__.py
+@@ -8,13 +8,25 @@ import tempfile
+ __all__ = ["version", "bootstrap"]
+
+
+-_SETUPTOOLS_VERSION = "28.8.0"
++_SETUPTOOLS_VERSION = "34.2.0"
+
+ _PIP_VERSION = "9.0.1"
+
++_SIX_VERSION = "1.10.0"
++
++_APPDIRS_VERSION = "1.4.0"
++
++_PACKAGING_VERSION = "16.8"
++
++_PYPARSING_VERSION = "2.1.10"
++
+ _PROJECTS = [
+- ("setuptools", _SETUPTOOLS_VERSION),
+- ("pip", _PIP_VERSION),
++ ("setuptools", _SETUPTOOLS_VERSION),
++ ("pip", _PIP_VERSION),
++ ("six", _SIX_VERSION),
++ ("appdirs", _APPDIRS_VERSION),
++ ("packaging", _PACKAGING_VERSION),
++ ("pyparsing", _PYPARSING_VERSION)
+ ]
+
+
+diff --git a/Lib/test/test_ensurepip.py b/Lib/test/test_ensurepip.py
+index 9b04c18..23664c4 100644
+--- a/Lib/test/test_ensurepip.py
++++ b/Lib/test/test_ensurepip.py
+@@ -40,13 +40,14 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "install", "--no-index", "--find-links",
+- unittest.mock.ANY, "setuptools", "pip",
++ unittest.mock.ANY,
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+
+ additional_paths = self.run_pip.call_args[0][1]
+- self.assertEqual(len(additional_paths), 2)
++ self.assertEqual(len(additional_paths), 6)
+
+ def test_bootstrapping_with_root(self):
+ ensurepip.bootstrap(root="/foo/bar/")
+@@ -55,7 +56,7 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
+ [
+ "install", "--no-index", "--find-links",
+ unittest.mock.ANY, "--root", "/foo/bar/",
+- "setuptools", "pip",
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+@@ -66,7 +67,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "install", "--no-index", "--find-links",
+- unittest.mock.ANY, "--user", "setuptools",
"pip",
++ unittest.mock.ANY, "--user",
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+@@ -77,7 +79,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "install", "--no-index", "--find-links",
+- unittest.mock.ANY, "--upgrade", "setuptools",
"pip",
++ unittest.mock.ANY, "--upgrade",
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+@@ -88,7 +91,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "install", "--no-index", "--find-links",
+- unittest.mock.ANY, "-v", "setuptools",
"pip",
++ unittest.mock.ANY, "-v",
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+@@ -99,7 +103,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "install", "--no-index", "--find-links",
+- unittest.mock.ANY, "-vv", "setuptools",
"pip",
++ unittest.mock.ANY, "-vv",
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+@@ -110,7 +115,8 @@ class TestBootstrap(EnsurepipMixin, unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "install", "--no-index", "--find-links",
+- unittest.mock.ANY, "-vvv", "setuptools",
"pip",
++ unittest.mock.ANY, "-vvv",
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+@@ -186,8 +192,8 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
+
+ self.run_pip.assert_called_once_with(
+ [
+- "uninstall", "-y",
"--disable-pip-version-check", "pip",
+- "setuptools",
++ "uninstall", "-y",
"--disable-pip-version-check",
++ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
+ ]
+ )
+
+@@ -197,8 +203,8 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
+
+ self.run_pip.assert_called_once_with(
+ [
+- "uninstall", "-y",
"--disable-pip-version-check", "-v", "pip",
+- "setuptools",
++ "uninstall", "-y",
"--disable-pip-version-check", "-v",
++ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
+ ]
+ )
+
+@@ -208,8 +214,8 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
+
+ self.run_pip.assert_called_once_with(
+ [
+- "uninstall", "-y",
"--disable-pip-version-check", "-vv", "pip",
+- "setuptools",
++ "uninstall", "-y",
"--disable-pip-version-check", "-vv",
++ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
+ ]
+ )
+
+@@ -220,7 +226,7 @@ class TestUninstall(EnsurepipMixin, unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "uninstall", "-y",
"--disable-pip-version-check", "-vvv",
+- "pip", "setuptools",
++ "pyparsing", "packaging", "appdirs",
"six", "pip", "setuptools",
+ ]
+ )
+
+@@ -260,13 +266,14 @@ class TestBootstrappingMainFunction(EnsurepipMixin,
unittest.TestCase):
+ self.run_pip.assert_called_once_with(
+ [
+ "install", "--no-index", "--find-links",
+- unittest.mock.ANY, "setuptools", "pip",
++ unittest.mock.ANY,
++ "setuptools", "pip", "six",
"appdirs", "packaging", "pyparsing",
+ ],
+ unittest.mock.ANY,
+ )
+
+ additional_paths = self.run_pip.call_args[0][1]
+- self.assertEqual(len(additional_paths), 2)
++ self.assertEqual(len(additional_paths), 6)
+
+ class TestUninstallationMainFunction(EnsurepipMixin, unittest.TestCase):
+
+@@ -284,8 +291,8 @@ class TestUninstallationMainFunction(EnsurepipMixin,
unittest.TestCase):
+
+ self.run_pip.assert_called_once_with(
+ [
+- "uninstall", "-y",
"--disable-pip-version-check", "pip",
+- "setuptools",
++ "uninstall", "-y",
"--disable-pip-version-check", "pyparsing", "packaging",
++ "appdirs", "six", "pip",
"setuptools",
+ ]
+ )
+
diff --git a/python3.spec b/python3.spec
index bcfd9f8..29904b1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
Group: Development/Languages
@@ -183,6 +183,10 @@ BuildRequires: zlib-devel
%if 0%{?with_rewheel}
BuildRequires: python3-setuptools
+BuildRequires: python3-six
+BuildRequires: python3-pyparsing
+BuildRequires: python3-appdirs
+BuildRequires: python3-packaging
BuildRequires: python3-pip
%endif
@@ -423,6 +427,15 @@ Patch254: 00254-make-Random.seed-actually-use-OS-randomness.patch
# Reported upstream:
http://bugs.python.org/issue29324
Patch258: 00258-fix-test_aead_aes_gcm.patch
+# 00260 #
+# setuptools from version 34.0.0 and onwards, unbundled its dependencies
+# and started requiring them so when rewheel mode is enabled we will have
+# to BuildRequire the new dependencies, in order for the virtualenv's to work
properly
+# setuptools change:
https://setuptools.readthedocs.io/en/latest/history.html#v34-0-0
+# Reported upstream:
http://bugs.python.org/issue29523
+#
https://github.com/python/cpython/pull/67
+Patch260: 00260-require-setuptools-dependencies.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -671,6 +684,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch253 -p1
%patch254 -p1
%patch258 -p1
+%patch260 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1593,6 +1607,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Feb 15 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-12
+- BuildRequire the new dependencies of setuptools when rewheel mode is enabled
+in order for the virtualenvs to work properly
+
* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
commit 45bc6145e3e4ae715144e83c383c99a7b530dd4b
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Sat Feb 11 11:04:03 2017 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index 0f704b3..bcfd9f8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
Group: Development/Languages
@@ -1593,6 +1593,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sat Feb 11 2017 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.6.0-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
- Add missing %%license macro
commit ea14453e6c16eb374a2d52006c1ec90366897fe6
Author: Stephen Gallagher <sgallagh(a)redhat.com>
Date: Wed Feb 1 20:52:15 2017 -0500
Add missing %license macro
diff --git a/python3.spec b/python3.spec
index 91af13e..0f704b3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -1155,7 +1155,8 @@ rm -fr %{buildroot}
%files
%defattr(-, root, root)
-%doc LICENSE README
+%license LICENSE
+%doc README
%{_bindir}/pydoc*
%{_bindir}/python3
%{_bindir}/python%{pybasever}
@@ -1166,7 +1167,8 @@ rm -fr %{buildroot}
%files libs
%defattr(-,root,root,-)
-%doc LICENSE README
+%license LICENSE
+%doc README
%{pylibdir}/lib2to3
%exclude %{pylibdir}/lib2to3/tests
@@ -1230,12 +1232,14 @@ rm -fr %{buildroot}
%files -n system-python
%defattr(-,root,root,-)
-%doc LICENSE README
+%license LICENSE
+%doc README
%{_libexecdir}/system-python
%files -n system-python-libs
%defattr(-,root,root,-)
-%doc LICENSE README
+%license LICENSE
+%doc README
%dir %{pylibdir}
%dir %{dynload_dir}
@@ -1589,6 +1593,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Feb 01 2017 Stephen Gallagher <sgallagh(a)redhat.com> - 3.6.0-10
+- Add missing %%license macro
+
* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
- Modify the runtime dependency of python3-libs on system-python-libs again,
because previous attempt didn't work properly with dnf resolving mechanism
commit d80b542352bf3094ee6e97a773e3981a1c6d5ad7
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Thu Jan 26 14:06:38 2017 +0100
Modify differently the runtime dependency of python3-libs on system-python-libs
because previous attempt didn't work properly with dnf resolving mechanism
diff --git a/python3.spec b/python3.spec
index c86f199..91af13e 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 7%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -472,7 +472,12 @@ considerably, and a lot of deprecated features have finally been
removed.
%package libs
Summary: Python 3 runtime libraries
Group: Development/Libraries
+# For Modularity purpose we need not to include the dist-tag int he dependency
+%if %(d="%{?dist}"; [ "${d#module-base-runtime-}x" !=
"${d}x" ] && echo 1 || echo 0)
+Requires: system-python-libs%{?_isa} = %{version}
+%else
Requires: system-python-libs%{?_isa} = %{version}-%{release}
+%endif
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# this symbol (in pyexpat), so we must explicitly state this dependency to
@@ -1584,6 +1589,14 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Jan 26 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-9
+- Modify the runtime dependency of python3-libs on system-python-libs again,
+ because previous attempt didn't work properly with dnf resolving mechanism
+
+* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
+- Modify the runtime dependency of python3-libs on system-python-libs to use
+ just the version and release number, but not the dist tag due to Modularity
+
* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
- Skip test_aead_aes_gcm during rpmbuild
commit adf44e02850d40a961db9f653d0e0966a5cb72bb
Author: Igor Gnatenko <ignatenko(a)redhat.com>
Date: Wed Jan 25 21:12:31 2017 +0100
Revert "Modify the runtime dependency of python3-libs on
system-python-libs"
This broke everything, rpm/dnf/libsolv/etc. doesn't know what is *partial*
dependency. Either you specify full release, or you don't specify it at all.
This reverts commit 738f034638325adbf8fc8165aaa498fc9fb71cc9.
Signed-off-by: Igor Gnatenko <ignatenko(a)redhat.com>
diff --git a/python3.spec b/python3.spec
index a701991..c86f199 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,15 +124,10 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 8%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
-# Get just the release number out of the Release tag (omit the dist tag)
-# This is used for python3-libs subpackage to be able to Require
-# system-python-libs subpackage without using the dist tag, as it clashes
-# with Modularity use cases.
-%global relnum %(echo %{release} | sed 's/%{?dist}$//')
# =======================
# Build-time requirements
@@ -477,7 +472,7 @@ considerably, and a lot of deprecated features have finally been
removed.
%package libs
Summary: Python 3 runtime libraries
Group: Development/Libraries
-Requires: system-python-libs%{?_isa} = %{version}-%{relnum}
+Requires: system-python-libs%{?_isa} = %{version}-%{release}
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# this symbol (in pyexpat), so we must explicitly state this dependency to
@@ -1589,10 +1584,6 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
-- Modify the runtime dependency of python3-libs on system-python-libs to use
- just the version and release number, but not the dist tag due to Modularity
-
* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
- Skip test_aead_aes_gcm during rpmbuild
commit 738f034638325adbf8fc8165aaa498fc9fb71cc9
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Wed Jan 25 14:15:32 2017 +0100
Modify the runtime dependency of python3-libs on system-python-libs
to use just the version and release number, but not the dist tag due to Modularity
diff --git a/python3.spec b/python3.spec
index c86f199..a701991 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,10 +124,15 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
+# Get just the release number out of the Release tag (omit the dist tag)
+# This is used for python3-libs subpackage to be able to Require
+# system-python-libs subpackage without using the dist tag, as it clashes
+# with Modularity use cases.
+%global relnum %(echo %{release} | sed 's/%{?dist}$//')
# =======================
# Build-time requirements
@@ -472,7 +477,7 @@ considerably, and a lot of deprecated features have finally been
removed.
%package libs
Summary: Python 3 runtime libraries
Group: Development/Libraries
-Requires: system-python-libs%{?_isa} = %{version}-%{release}
+Requires: system-python-libs%{?_isa} = %{version}-%{relnum}
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# this symbol (in pyexpat), so we must explicitly state this dependency to
@@ -1584,6 +1589,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Jan 25 2017 Tomas Orsava <torsava(a)redhat.com> - 3.6.0-8
+- Modify the runtime dependency of python3-libs on system-python-libs to use
+ just the version and release number, but not the dist tag due to Modularity
+
* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
- Skip test_aead_aes_gcm during rpmbuild
commit ae3f901913a5810beb1e3039474202ddc19136ae
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Jan 19 20:56:23 2017 +0100
Skip test_aead_aes_gcm during rpmbuild
diff --git a/00258-fix-test_aead_aes_gcm.patch b/00258-fix-test_aead_aes_gcm.patch
new file mode 100644
index 0000000..1d061fd
--- /dev/null
+++ b/00258-fix-test_aead_aes_gcm.patch
@@ -0,0 +1,12 @@
+diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
+index 8992a01..74170f4 100644
+--- a/Lib/test/test_socket.py
++++ b/Lib/test/test_socket.py
+@@ -5458,6 +5458,7 @@ class LinuxKernelCryptoAPI(unittest.TestCase):
+ self.assertEqual(dec, msg * multiplier)
+
+ @support.requires_linux_version(4, 3) # see test_aes_cbc
++ @unittest.skip('Failure on Kernel 4.9+')
+ def test_aead_aes_gcm(self):
+ key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
+ iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
diff --git a/python3.spec b/python3.spec
index 99242fe..c86f199 100644
--- a/python3.spec
+++ b/python3.spec
@@ -417,6 +417,12 @@ Patch253: 00253-fix-HAVE_LONG_LONG-compatibility.patch
# Fixed upstream:
https://bugs.python.org/issue29085
Patch254: 00254-make-Random.seed-actually-use-OS-randomness.patch
+# 00258 #
+# Kernel 4.9 introduced some changes to its crypto API
+# making test_aead_aes_gcm fail, so skipping the test for now
+# Reported upstream:
http://bugs.python.org/issue29324
+Patch258: 00258-fix-test_aead_aes_gcm.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -659,6 +665,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch250 -p1
%patch253 -p1
%patch254 -p1
+%patch258 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1579,6 +1586,7 @@ rm -fr %{buildroot}
%changelog
* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
+- Skip test_aead_aes_gcm during rpmbuild
* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
- Rebuild for readline 7.x
commit 79728f702eb9456be4f46e8c3db34ef59ca1b731
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Jan 16 14:28:13 2017 +0100
Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
diff --git a/00254-make-Random.seed-actually-use-OS-randomness.patch
b/00254-make-Random.seed-actually-use-OS-randomness.patch
new file mode 100644
index 0000000..e5ecb38
--- /dev/null
+++ b/00254-make-Random.seed-actually-use-OS-randomness.patch
@@ -0,0 +1,13 @@
+diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c
+index 63759d5..0d3282d 100644
+--- a/Modules/_randommodule.c
++++ b/Modules/_randommodule.c
+@@ -245,7 +245,7 @@ random_seed(RandomObject *self, PyObject *args)
+ return NULL;
+
+ if (arg == NULL || arg == Py_None) {
+- if (random_seed_urandom(self) >= 0) {
++ if (random_seed_urandom(self) < 0) {
+ PyErr_Clear();
+
+ /* Reading system entropy failed, fall back on the worst entropy:
diff --git a/python3.spec b/python3.spec
index 41f5508..99242fe 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -411,6 +411,12 @@ Patch250: 00250-getentropy.patch
# Fixed upstream:
https://hg.python.org/cpython/rev/fad67c66885f
Patch253: 00253-fix-HAVE_LONG_LONG-compatibility.patch
+# 00254 #
+# Fix error check, so that Random.seed actually uses OS randomness
+# rhbz#1412275:
https://bugzilla.redhat.com/show_bug.cgi?id=1412275
+# Fixed upstream:
https://bugs.python.org/issue29085
+Patch254: 00254-make-Random.seed-actually-use-OS-randomness.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -652,6 +658,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch249 -p1
%patch250 -p1
%patch253 -p1
+%patch254 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1570,6 +1577,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jan 16 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-7
+- Fix error check, so that Random.seed actually uses OS randomness (rhbz#1412275)
+
* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
- Rebuild for readline 7.x
commit 2294d6496ca6638a84ae5b107a729e359c9d5f87
Author: Igor Gnatenko <ignatenko(a)redhat.com>
Date: Thu Jan 12 17:30:38 2017 +0100
Rebuild for readline 7.x
Signed-off-by: Igor Gnatenko <ignatenko(a)redhat.com>
diff --git a/python3.spec b/python3.spec
index ae9ea34..41f5508 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -1570,6 +1570,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Jan 12 2017 Igor Gnatenko <ignatenko(a)redhat.com> - 3.6.0-6
+- Rebuild for readline 7.x
+
* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
commit ae0e9fd8d2f14a1ac50cc0147068f8368cb8becf
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Jan 12 11:15:34 2017 +0100
Require arch specific glibc
diff --git a/python3.spec b/python3.spec
index 4ee6eb3..ae9ea34 100644
--- a/python3.spec
+++ b/python3.spec
@@ -492,7 +492,7 @@ Group: Development/Libraries
Requires: expat >= 2.1.0
# Python 3 built with glibc >= 2.24.90-26 needs to require it (rhbz#1410644).
-Requires: glibc >= 2.24.90-26
+Requires: glibc%{?_isa} >= 2.24.90-26
%description -n system-python-libs
This package contains files used to embed System Python into applications.
commit 69d3bbb6fe9cd56fa83ee852f88e63b6a7e4a412
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 10 22:12:21 2017 +0100
Always include the rewheel patch at the SRPM
diff --git a/python3.spec b/python3.spec
index 86d6fb1..4ee6eb3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -375,9 +375,7 @@ Patch188:
00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
# Add the rewheel module, allowing to recreate wheels from already installed
# ones
#
https://github.com/bkabrda/rewheel
-%if 0%{with_rewheel}
Patch189: 00189-add-rewheel-module.patch
-%endif
# 00205 #
# LIBPL variable in makefile takes LIBPL from configure.ac
commit a5e3562540887f4b53367cd36388cc7b13d1b6c0
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Jan 10 17:01:29 2017 +0100
Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
diff --git a/python3.spec b/python3.spec
index d60791b..86d6fb1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -493,6 +493,8 @@ Group: Development/Libraries
%define __requires_exclude ^(/usr/bin/python3.*|python\\(abi\\) = 3\\..*)$
Requires: expat >= 2.1.0
+# Python 3 built with glibc >= 2.24.90-26 needs to require it (rhbz#1410644).
+Requires: glibc >= 2.24.90-26
%description -n system-python-libs
This package contains files used to embed System Python into applications.
@@ -1570,6 +1572,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Jan 10 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-5
+- Require glibc >= 2.24.90-26 for system-python-libs (rhbz#1410644)
+
* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
- Define HAVE_LONG_LONG as 1 for backwards compatibility
commit f75890a6e8c377e371190b117044b1f53d016044
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Jan 9 13:25:30 2017 +0100
Fix wrong patch name
diff --git a/python3.spec b/python3.spec
index dbe32aa..d60791b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -411,7 +411,7 @@ Patch250: 00250-getentropy.patch
# 00253 #
# Define HAVE_LONG_LONG as 1 instead of blank for backwards compatibility
# Fixed upstream:
https://hg.python.org/cpython/rev/fad67c66885f
-Patch253: fix-HAVE_LONG_LONG-compatibility.patch
+Patch253: 00253-fix-HAVE_LONG_LONG-compatibility.patch
# (New patches go here ^^^)
#
commit 0da740b7bce4b8deddccb997c9ad7048af82e18d
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Jan 9 13:18:07 2017 +0100
Define HAVE_LONG_LONG as 1 for backwards compatibility.
diff --git a/00253-fix-HAVE_LONG_LONG-compatibility.patch
b/00253-fix-HAVE_LONG_LONG-compatibility.patch
new file mode 100644
index 0000000..7951e63
--- /dev/null
+++ b/00253-fix-HAVE_LONG_LONG-compatibility.patch
@@ -0,0 +1,24 @@
+
+# HG changeset patch
+# User Victor Stinner <victor.stinner(a)gmail.com>
+# Date 1483653533 -3600
+# Node ID fad67c66885f0bd9ebafe2a54f0fa12b5a8fe3bf
+# Parent 52d671684342cd2dcc804566d4c755634d3210a8
+Issue #27961: Define HAVE_LONG_LONG as 1.
+
+Fix backward compatibility issue, HAVE_LONG_LONG was defined but empty, whereas
+it is defined as 1 in Python 3.5.
+
+diff --git a/Include/pyport.h b/Include/pyport.h
+--- a/Include/pyport.h
++++ b/Include/pyport.h
+@@ -39,7 +39,7 @@ Used in: Py_SAFE_DOWNCAST
+
+ // long long is required. Ensure HAVE_LONG_LONG is defined for compatibility.
+ #ifndef HAVE_LONG_LONG
+-#define HAVE_LONG_LONG
++#define HAVE_LONG_LONG 1
+ #endif
+ #ifndef PY_LONG_LONG
+ #define PY_LONG_LONG long long
+
diff --git a/python3.spec b/python3.spec
index da35c9a..dbe32aa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -408,6 +408,11 @@ Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
#
http://bugs.python.org/issue29157
Patch250: 00250-getentropy.patch
+# 00253 #
+# Define HAVE_LONG_LONG as 1 instead of blank for backwards compatibility
+# Fixed upstream:
https://hg.python.org/cpython/rev/fad67c66885f
+Patch253: fix-HAVE_LONG_LONG-compatibility.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -646,6 +651,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch243 -p1
%patch249 -p1
%patch250 -p1
+%patch253 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1564,6 +1570,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jan 09 2017 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-4
+- Define HAVE_LONG_LONG as 1 for backwards compatibility
+
* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
commit 1abbc727d4648834e71ded0a926dfedbbc20147d
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jan 6 11:08:15 2017 +0100
Fix bogus release in %changelog
diff --git a/python3.spec b/python3.spec
index 43908f6..da35c9a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1564,7 +1564,7 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-2
+* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-3
- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
commit 6bb1189dedf6516082bfc230bff3eafd8f9e4770
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Jan 5 18:52:42 2017 +0100
Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
diff --git a/00250-getentropy.patch b/00250-getentropy.patch
new file mode 100644
index 0000000..6d0025a
--- /dev/null
+++ b/00250-getentropy.patch
@@ -0,0 +1,171 @@
+diff -r ee1390c9b585 Python/random.c
+--- a/Python/random.c Wed Jan 04 12:02:30 2017 +0100
++++ b/Python/random.c Wed Jan 04 18:32:21 2017 +0100
+@@ -77,45 +77,8 @@ win32_urandom(unsigned char *buffer, Py_
+ return 0;
+ }
+
+-/* Issue #25003: Don't use getentropy() on Solaris (available since
+- * Solaris 11.3), it is blocking whereas os.urandom() should not block. */
+-#elif defined(HAVE_GETENTROPY) && !defined(sun)
+-#define PY_GETENTROPY 1
+-
+-/* Fill buffer with size pseudo-random bytes generated by getentropy().
+- Return 0 on success, or raise an exception and return -1 on error.
+-
+- If raise is zero, don't raise an exception on error. */
+-static int
+-py_getentropy(char *buffer, Py_ssize_t size, int raise)
+-{
+- while (size > 0) {
+- Py_ssize_t len = Py_MIN(size, 256);
+- int res;
++#else /* !MS_WINDOWS */
+
+- if (raise) {
+- Py_BEGIN_ALLOW_THREADS
+- res = getentropy(buffer, len);
+- Py_END_ALLOW_THREADS
+- }
+- else {
+- res = getentropy(buffer, len);
+- }
+-
+- if (res < 0) {
+- if (raise) {
+- PyErr_SetFromErrno(PyExc_OSError);
+- }
+- return -1;
+- }
+-
+- buffer += len;
+- size -= len;
+- }
+- return 0;
+-}
+-
+-#else
+
+ #if defined(HAVE_GETRANDOM) || defined(HAVE_GETRANDOM_SYSCALL)
+ #define PY_GETRANDOM 1
+@@ -217,6 +180,59 @@ py_getrandom(void *buffer, Py_ssize_t si
+ }
+ return 1;
+ }
++
++/* Issue #25003: Don't use getentropy() on Solaris (available since
++ * Solaris 11.3), it is blocking whereas os.urandom() should not block. */
++#elif defined(HAVE_GETENTROPY) && !defined(sun)
++#define PY_GETENTROPY 1
++
++/* Fill buffer with size pseudo-random bytes generated by getentropy().
++ Return 1 on success, or raise an exception and return -1 on error.
++
++ If raise is zero, don't raise an exception on error. */
++static int
++py_getentropy(char *buffer, Py_ssize_t size, int raise)
++{
++ /* Is getentropy() supported by the running kernel? Set to 0 if
++ getentropy() failed with ENOSYS. */
++ static int getentropy_works = 1;
++
++ if (!getentropy_works) {
++ return 0;
++ }
++
++ while (size > 0) {
++ Py_ssize_t len = Py_MIN(size, 256);
++ int res;
++
++ if (raise) {
++ Py_BEGIN_ALLOW_THREADS
++ res = getentropy(buffer, len);
++ Py_END_ALLOW_THREADS
++ }
++ else {
++ res = getentropy(buffer, len);
++ }
++
++ if (res < 0) {
++ /* ENOSYS: the inner syscall is not supported by the running
++ kernel. */
++ if (errno == ENOSYS) {
++ getentropy_works = 0;
++ return 0;
++ }
++
++ if (raise) {
++ PyErr_SetFromErrno(PyExc_OSError);
++ }
++ return -1;
++ }
++
++ buffer += len;
++ size -= len;
++ }
++ return 1;
++}
+ #endif
+
+ static struct {
+@@ -236,7 +252,7 @@ dev_urandom(char *buffer, Py_ssize_t siz
+ {
+ int fd;
+ Py_ssize_t n;
+-#ifdef PY_GETRANDOM
++#if defined(PY_GETRANDOM) || defined(PY_GETENTROPY)
+ int res;
+ #endif
+
+@@ -244,17 +260,20 @@ dev_urandom(char *buffer, Py_ssize_t siz
+
+ #ifdef PY_GETRANDOM
+ res = py_getrandom(buffer, size, blocking, raise);
++#elif defined(PY_GETENTROPY)
++ res = py_getentropy(buffer, size, raise);
++#endif
++#if defined(PY_GETRANDOM) || defined(PY_GETENTROPY)
+ if (res < 0) {
+ return -1;
+ }
+ if (res == 1) {
+ return 0;
+ }
+- /* getrandom() failed with ENOSYS or EPERM,
+- fall back on reading /dev/urandom */
++ /* function failed with ENOSYS or EPERM, fall back on reading
++ from /dev/urandom */
+ #endif
+
+-
+ if (raise) {
+ struct _Py_stat_struct st;
+
+@@ -349,8 +368,8 @@ dev_urandom_close(void)
+ urandom_cache.fd = -1;
+ }
+ }
++#endif /* !MS_WINDOWS */
+
+-#endif
+
+ /* Fill buffer with pseudo-random bytes generated by a linear congruent
+ generator (LCG):
+@@ -395,8 +414,6 @@ pyurandom(void *buffer, Py_ssize_t size,
+
+ #ifdef MS_WINDOWS
+ return win32_urandom((unsigned char *)buffer, size, raise);
+-#elif defined(PY_GETENTROPY)
+- return py_getentropy(buffer, size, raise);
+ #else
+ return dev_urandom(buffer, size, blocking, raise);
+ #endif
+@@ -491,8 +508,6 @@ void
+ CryptReleaseContext(hCryptProv, 0);
+ hCryptProv = 0;
+ }
+-#elif defined(PY_GETENTROPY)
+- /* nothing to clean */
+ #else
+ dev_urandom_close();
+ #endif
diff --git a/python3.spec b/python3.spec
index 14aaccf..43908f6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -124,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 1%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -402,6 +402,12 @@ Patch243: 00243-fix-mips64-triplet.patch
# Not yet fixed upstream:
http://bugs.python.org/issue28787
Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
+# 00250 #
+# After glibc-2.24.90, Python 3 failed to start on EL7 kernel
+# rhbz#1410175:
https://bugzilla.redhat.com/show_bug.cgi?id=1410175
+#
http://bugs.python.org/issue29157
+Patch250: 00250-getentropy.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -639,6 +645,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch243 -p1
%patch249 -p1
+%patch250 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1557,6 +1564,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Jan 05 2017 Miro Hronok <mhroncok(a)redhat.com> - 3.6.0-2
+- Don't blow up on EL7 kernel (random generator) (rhbz#1410175)
+
* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
- Update to Python 3.6.0 final
commit e79e900d64a9b503c98a876f6e54e343f39feaa8
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Dec 27 21:44:58 2016 +0100
Update to Python 3.6.0 final
Remove patch 250 as it is now upstream
Upload the 3.6.0 final sources
diff --git a/00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
b/00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
deleted file mode 100644
index 9084dd6..0000000
--- a/00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-
-# HG changeset patch
-# User Benjamin Peterson <benjamin(a)python.org>
-# Date 1481183668 28800
-# Node ID 4745d801cae2d57e3432313acd0b76b8b4cc9c75
-# Parent 148c46d180b2a1510097a1eae79845b61190c879
-guard HAVE_LONG_LONG definition to prevent redefinition (#28898)
-
-diff --git a/Include/pyport.h b/Include/pyport.h
---- a/Include/pyport.h
-+++ b/Include/pyport.h
-@@ -37,9 +37,10 @@ Used in: Py_SAFE_DOWNCAST
- * integral synonyms. Only define the ones we actually need.
- */
-
--// long long is required now. Define HAVE_LONG_LONG unconditionally for
--// compatibility.
-+// long long is required. Ensure HAVE_LONG_LONG is defined for compatibility.
-+#ifndef HAVE_LONG_LONG
- #define HAVE_LONG_LONG
-+#endif
- #ifndef PY_LONG_LONG
- #define PY_LONG_LONG long long
- /* If LLONG_MAX is defined in limits.h, use that. */
-
diff --git a/python3.spec b/python3.spec
index f89a4ee..14aaccf 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,8 +24,6 @@
# Currently these packages are recommended to have been built before a targeted rebuild
after a python abi change:
# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt.
-# First release candidate
-%global prerel rc1
%global with_rewheel 1
@@ -126,7 +124,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.6.%{?prerel}%{?dist}
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -193,7 +191,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
@@ -404,13 +402,6 @@ Patch243: 00243-fix-mips64-triplet.patch
# Not yet fixed upstream:
http://bugs.python.org/issue28787
Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
-# 00250 #
-# Guard HAVE_LONG_LONG definition in pyport.h as gdb also sets this
-# and by defining it unconditionally in python will make compilation of
-# gdb to fail.
-# FIXED UPSTREAM:
http://bugs.python.org/issue28898
-Patch250: 00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
-
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -648,7 +639,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch243 -p1
%patch249 -p1
-%patch250 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1567,6 +1557,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Dec 27 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-1
+- Update to Python 3.6.0 final
+
* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
- Enable rewheel
diff --git a/sources b/sources
index d215082..7b47bed 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-f079686c1b76052c96b38642ab341d2e Python-3.6.0rc1.tar.xz
+SHA512 (Python-3.6.0.tar.xz) =
9d06bee9172bc0bfd2d280fd1c27ea712f3258cfbfd2e2aeb734d0a6710998d5deeefc5d6e72251750dd9493d35461511ceaa187a29dea700ca238ff6ac1dbb2
commit eefe1394164e2de6fd3d758f4eb1cc3d77d507ed
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Dec 14 13:46:15 2016 +0100
Fill the missing pieces at the boostraping documentation
diff --git a/python3.spec b/python3.spec
index c0b9389..f89a4ee 100644
--- a/python3.spec
+++ b/python3.spec
@@ -4,15 +4,25 @@
# NOTES ON BOOTSTRAPING PYTHON 3.6:
#
-# Due to dependency cycle between Python, pip, setuptools and
-# wheel caused by the rewheel patch, one has to build in the
-# following order:
+# Due to dependency cycle between Python, gdb, rpm, pip, setuptools and
+# wheel, in order to rebase Python 3, one has to build in the following order:
#
-# 1) python3 with with_rewheel set to 0
-# 2) python3-setuptools and python3-pip with with_rewheel set to 0
-# 3) python3-wheel
-# 4) python3-setuptools and python3-pip with with_rewheel set to 1
-# 5) python3 with with_rewheel set to 1
+# 1) gdb without python support (add %%global _without_python 1 on top of gdb's SPEC
file)
+# 2) python3 with with_rewheel set to 0
+# 3) gdb with python support (remove %%global _without_python 1 on top of gdb's SPEC
file)
+# 4) rpm
+# 5) python-setuptools with bootstrap set to 1
+# 6) python-pip with build_wheel set to 0
+# 7) python-wheel with %%bcond_without bootstrap
+# 8) python-setuptools with bootstrap set to 0 and also with_check set to 0
+# 9) python-pip with build_wheel set to 1
+# 10) pyparsing
+# 11) python3 with with_rewheel set to 1
+#
+# Then the most important packages have to be built, starting from their various leaf
dependencies
+# recursively. After these have been built, a targeted rebuild should be requested for
the rest.
+# Currently these packages are recommended to have been built before a targeted rebuild
after a python abi change:
+# python-sphinx, pytest, python-requests, cloud-init, dnf, anaconda, abrt.
# First release candidate
%global prerel rc1
commit efda0ca6f2ad574867364dc8168b9c73138c867a
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Sat Dec 10 15:20:04 2016 +0100
Enable rewheel
Use https URL
diff --git a/python3.spec b/python3.spec
index 7901c68..c0b9389 100644
--- a/python3.spec
+++ b/python3.spec
@@ -17,7 +17,7 @@
# First release candidate
%global prerel rc1
-%global with_rewheel 0
+%global with_rewheel 1
%global pybasever 3.6
@@ -116,7 +116,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.5.%{?prerel}%{?dist}
+Release: 0.6.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
@@ -421,7 +421,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-root
# Additional metadata, and subpackages
# ======================================================
-URL:
http://www.python.org/
+URL:
https://www.python.org/
# See notes in bug 532118:
Provides: python(abi) = %{pybasever}
@@ -1557,6 +1557,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Dec 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.6.rc1
+- Enable rewheel
+
* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
- Update to Python 3.6.0 release candidate 1
commit 7319c29d6062d43f15c6aefab7c7e02d0cd8a99a
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Dec 9 20:27:46 2016 +0100
Upload sources for 3.6.0rc1
diff --git a/sources b/sources
index aeb1966..d215082 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-8906efbacfcdc7c3c9198aeefafd159e Python-3.5.2.tar.xz
+f079686c1b76052c96b38642ab341d2e Python-3.6.0rc1.tar.xz
commit d55596820d3275d1edcd429ed4550a84ba40f5d7
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Dec 9 16:23:34 2016 +0100
Fix changelog entry's chronological order
diff --git a/python3.spec b/python3.spec
index 6580d84..7901c68 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1560,7 +1560,7 @@ rm -fr %{buildroot}
* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
- Update to Python 3.6.0 release candidate 1
-* Fri Dec 02 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
- Update to Python 3.6.0 beta 4
* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
commit f9258e6d7fcf34244dd3e72f93d3ef0f17533355
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Dec 8 11:29:35 2016 +0100
Added patch for guarding HAVE_LONG_LONG definition in pyport.h
as it is also defined by GDB, and by building GDB with python support
will make GDB's compilation fail due to redefinition error.
(upstream issue28898)
diff --git a/00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
b/00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
new file mode 100644
index 0000000..9084dd6
--- /dev/null
+++ b/00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
@@ -0,0 +1,25 @@
+
+# HG changeset patch
+# User Benjamin Peterson <benjamin(a)python.org>
+# Date 1481183668 28800
+# Node ID 4745d801cae2d57e3432313acd0b76b8b4cc9c75
+# Parent 148c46d180b2a1510097a1eae79845b61190c879
+guard HAVE_LONG_LONG definition to prevent redefinition (#28898)
+
+diff --git a/Include/pyport.h b/Include/pyport.h
+--- a/Include/pyport.h
++++ b/Include/pyport.h
+@@ -37,9 +37,10 @@ Used in: Py_SAFE_DOWNCAST
+ * integral synonyms. Only define the ones we actually need.
+ */
+
+-// long long is required now. Define HAVE_LONG_LONG unconditionally for
+-// compatibility.
++// long long is required. Ensure HAVE_LONG_LONG is defined for compatibility.
++#ifndef HAVE_LONG_LONG
+ #define HAVE_LONG_LONG
++#endif
+ #ifndef PY_LONG_LONG
+ #define PY_LONG_LONG long long
+ /* If LLONG_MAX is defined in limits.h, use that. */
+
diff --git a/python3.spec b/python3.spec
index def96b6..6580d84 100644
--- a/python3.spec
+++ b/python3.spec
@@ -394,6 +394,13 @@ Patch243: 00243-fix-mips64-triplet.patch
# Not yet fixed upstream:
http://bugs.python.org/issue28787
Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
+# 00250 #
+# Guard HAVE_LONG_LONG definition in pyport.h as gdb also sets this
+# and by defining it unconditionally in python will make compilation of
+# gdb to fail.
+# FIXED UPSTREAM:
http://bugs.python.org/issue28898
+Patch250: 00250-guard-HAVE_LONG_LONG-definition-to-prevent-redefinition.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -631,6 +638,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch243 -p1
%patch249 -p1
+%patch250 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit 97cc10c62ab639ed619ca112dad683d32d697646
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Dec 7 13:55:41 2016 +0100
Update to Python 3.6.0 release candidate 1
diff --git a/python3.spec b/python3.spec
index 4b0e5f7..def96b6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,8 +14,8 @@
# 4) python3-setuptools and python3-pip with with_rewheel set to 1
# 5) python3 with with_rewheel set to 1
-# Fourth beta prerelease
-%global prerel b4
+# First release candidate
+%global prerel rc1
%global with_rewheel 0
@@ -116,7 +116,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.4.%{?prerel}%{?dist}
+Release: 0.5.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
@@ -1549,6 +1549,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Dec 07 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.5.rc1
+- Update to Python 3.6.0 release candidate 1
+
* Fri Dec 02 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
- Update to Python 3.6.0 beta 4
commit 3b1225f950d1529801f566642799fc83744c1d08
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Dec 2 16:20:56 2016 +0100
Update to Python 3.6.0 beta 4
Disable rewheel
diff --git a/python3.spec b/python3.spec
index cb177ab..4b0e5f7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,10 +14,10 @@
# 4) python3-setuptools and python3-pip with with_rewheel set to 1
# 5) python3 with with_rewheel set to 1
-# Third beta prerelease
-%global prerel b3
+# Fourth beta prerelease
+%global prerel b4
-%global with_rewheel 1
+%global with_rewheel 0
%global pybasever 3.6
@@ -116,7 +116,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.3.%{?prerel}%{?dist}
+Release: 0.4.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
@@ -1549,6 +1549,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Dec 02 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.6.0-0.4.b4
+- Update to Python 3.6.0 beta 4
+
* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
- Set to work with pip version 9.0.1
commit af1b222b2b840bbfc8679baf99a0a23631320b73
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Dec 2 16:12:46 2016 +0100
Enable --with-dtrace configure flag (upstream issue21590)
Add patch to fix out of tree --with-dtrace build (upstream issue28787)
diff --git a/00249-fix-out-of-tree-dtrace-builds.patch
b/00249-fix-out-of-tree-dtrace-builds.patch
new file mode 100644
index 0000000..d5de53c
--- /dev/null
+++ b/00249-fix-out-of-tree-dtrace-builds.patch
@@ -0,0 +1,12 @@
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 28df0e1..42f811c 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -867,6 +867,7 @@ Python/frozen.o: Python/importlib.h Python/importlib_external.h
+ # follow our naming conventions. dtrace(1) uses the output filename to generate
+ # an include guard, so we can't use a pipeline to transform its output.
+ Include/pydtrace_probes.h: $(srcdir)/Include/pydtrace.d
++ @$(MKDIR_P) Include
+ $(DTRACE) $(DFLAGS) -o $@ -h -s $<
+ : sed in-place edit with POSIX-only tools
+ sed 's/PYTHON_/PyDTrace_/' $@ > $@.tmp
diff --git a/python3.spec b/python3.spec
index 459ab56..cb177ab 100644
--- a/python3.spec
+++ b/python3.spec
@@ -155,12 +155,11 @@ BuildRequires: pkgconfig
BuildRequires: readline-devel
BuildRequires: sqlite-devel
-%if 0%{?with_systemtap}
BuildRequires: systemtap-sdt-devel
+BuildRequires: systemtap-devel
# (this introduces a dependency on "python", in that systemtap-sdt-devel's
# /usr/bin/dtrace is a python 2 script)
%global tapsetdir /usr/share/systemtap/tapset
-%endif # with_systemtap
BuildRequires: tar
BuildRequires: tcl-devel
@@ -389,6 +388,12 @@ Patch206: 00206-remove-hf-from-arm-triplet.patch
# Fedora needs the default mips64-linux-gnu
Patch243: 00243-fix-mips64-triplet.patch
+# 00249 #
+# Fix builds using the --with-dtrace flag as the rpmbuild
+# of python is an out of tree build
+# Not yet fixed upstream:
http://bugs.python.org/issue28787
+Patch249: 00249-fix-out-of-tree-dtrace-builds.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -625,6 +630,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch205 -p1
%patch206 -p1
%patch243 -p1
+%patch249 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -681,6 +687,7 @@ BuildPython() {
--with-system-expat \
--with-system-ffi \
--enable-loadable-sqlite-extensions \
+ --with-dtrace \
%if 0%{?with_systemtap}
--with-systemtap \
%endif
commit 1b092958f3e255956903b47f3703cdbe3a8b672e
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Nov 2 17:16:07 2016 +0100
Update to 3.6.0 beta 3
Revert the -x flag workaround for excluded tests as it has been fixed upstream
(upstream issue28409)
Remove the _sysconfigdata_ files as they are now removed properly (upstream
issue28046)
Renamed _futures module to _asyncio (upstream issue28428)
diff --git a/python3.spec b/python3.spec
index ad3399b..459ab56 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,8 +14,8 @@
# 4) python3-setuptools and python3-pip with with_rewheel set to 1
# 5) python3 with with_rewheel set to 1
-# Second beta prerelease
-%global prerel b2
+# Third beta prerelease
+%global prerel b3
%global with_rewheel 1
@@ -116,7 +116,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.2.%{?prerel}%{?dist}
+Release: 0.3.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
@@ -184,7 +184,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/3.6.0/Python-3.6.0b2.tar.xz
+Source:
https://www.python.org/ftp/python/%{version}/Python-%{version}%{prerel}.t...
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
@@ -1060,13 +1060,13 @@ CheckPython() {
--verbose --findleaks \
-x test_distutils \
%ifarch ppc64le aarch64
- test_faulthandler \
+ -x test_faulthandler \
%endif
%ifarch %{mips64}
- test_ctypes \
+ -x test_ctypes \
%endif
%ifarch %{power64} s390 s390x armv7hl aarch64 %{mips}
- test_gdb
+ -x test_gdb
%endif
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1199,10 +1199,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_sha3.%{SOABI_optimized}.so
%{dynload_dir}/_sha512.%{SOABI_optimized}.so
-%{dynload_dir}/_sysconfigdata_%{ABIFLAGS_optimized}_linux_%{_arch}-linux%{_gnu}.py
-%dir %{dynload_dir}/__pycache__/
-%{dynload_dir}/__pycache__/_sysconfigdata_%{ABIFLAGS_optimized}_linux_%{_arch}-linux%{_gnu}%{bytecode_suffixes}
-
+%{dynload_dir}/_asyncio.%{SOABI_optimized}.so
%{dynload_dir}/_bisect.%{SOABI_optimized}.so
%{dynload_dir}/_bz2.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
@@ -1219,7 +1216,6 @@ rm -fr %{buildroot}
%{dynload_dir}/_dbm.%{SOABI_optimized}.so
%{dynload_dir}/_decimal.%{SOABI_optimized}.so
%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
-%{dynload_dir}/_futures.%{SOABI_optimized}.so
%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
%endif
@@ -1434,9 +1430,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_sha3.%{SOABI_debug}.so
%{dynload_dir}/_sha512.%{SOABI_debug}.so
-%{dynload_dir}/_sysconfigdata_%{ABIFLAGS_debug}_linux_%{_arch}-linux%{_gnu}.py
-%{dynload_dir}/__pycache__/_sysconfigdata_%{ABIFLAGS_debug}_linux_%{_arch}-linux%{_gnu}%{bytecode_suffixes}
-
+%{dynload_dir}/_asyncio.%{SOABI_debug}.so
%{dynload_dir}/_bisect.%{SOABI_debug}.so
%{dynload_dir}/_bz2.%{SOABI_debug}.so
%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
@@ -1453,7 +1447,6 @@ rm -fr %{buildroot}
%{dynload_dir}/_dbm.%{SOABI_debug}.so
%{dynload_dir}/_decimal.%{SOABI_debug}.so
%{dynload_dir}/_elementtree.%{SOABI_debug}.so
-%{dynload_dir}/_futures.%{SOABI_debug}.so
%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_debug}.so
%endif
commit 1f40c0cbd186c2743dc30c3bad6773b8d49e7902
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Nov 1 15:05:11 2016 +0100
Remove --with-tsc configure flag as it has been removed upstream. Also removing patch
143 related to that flag.
Relevant upstream commit:
https://hg.python.org/cpython/rev/2310a5b75fae
diff --git a/00143-tsc-on-ppc.patch b/00143-tsc-on-ppc.patch
deleted file mode 100644
index 7d3e876..0000000
--- a/00143-tsc-on-ppc.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-diff -up Python-2.7.2/Python/ceval.c.tsc-on-ppc Python-2.7.2/Python/ceval.c
---- Python-2.7.2/Python/ceval.c.tsc-on-ppc 2011-08-23 14:59:48.051300849 -0400
-+++ Python-2.7.2/Python/ceval.c 2011-08-23 15:33:25.412162902 -0400
-@@ -37,24 +37,42 @@ typedef unsigned long long uint64;
- */
- #if defined(__ppc__) || defined (__powerpc__)
-
--#define READ_TIMESTAMP(var) ppc_getcounter(&var)
-+#if defined( __powerpc64__) || defined(__LP64__)
-+/* 64-bit PowerPC */
-+#define READ_TIMESTAMP(var) ppc64_getcounter(&var)
-+static void
-+ppc64_getcounter(uint64 *v)
-+{
-+ /* On 64-bit PowerPC we can read the 64-bit timebase directly into a
-+ 64-bit register */
-+ uint64 timebase;
-+#ifdef _ARCH_PWR4
-+ asm volatile ("mfspr %0,268" : "=r" (timebase));
-+#else
-+ asm volatile ("mftb %0" : "=r" (timebase));
-+#endif
-+ *v = timebase;
-+}
-+
-+#else
-+/* 32-bit PowerPC */
-+#define READ_TIMESTAMP(var) ppc32_getcounter(&var)
-
- static void
--ppc_getcounter(uint64 *v)
-+ppc32_getcounter(uint64 *v)
- {
-- unsigned long tbu, tb, tbu2;
-+ union { long long ll; long ii[2]; } u;
-+ long tmp;
-
- loop:
-- asm volatile ("mftbu %0" : "=r" (tbu) );
-- asm volatile ("mftb %0" : "=r" (tb) );
-- asm volatile ("mftbu %0" : "=r" (tbu2));
-- if (__builtin_expect(tbu != tbu2, 0)) goto loop;
--
-- /* The slightly peculiar way of writing the next lines is
-- compiled better by GCC than any other way I tried. */
-- ((long*)(v))[0] = tbu;
-- ((long*)(v))[1] = tb;
-+ asm volatile ("mftbu %0" : "=r" (u.ii[0]) );
-+ asm volatile ("mftb %0" : "=r" (u.ii[1]) );
-+ asm volatile ("mftbu %0" : "=r" (tmp));
-+ if (__builtin_expect(u.ii[0] != tmp, 0)) goto loop;
-+
-+ *v = u.ll;
- }
-+#endif /* powerpc 32/64 bit */
-
- #elif defined(__i386__)
-
diff --git a/python3.spec b/python3.spec
index 6d3ef9b..ad3399b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -258,12 +258,6 @@ Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
# Some tests within distutils fail when run in an rpmbuild:
Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
-# 00143 #
-# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
-# aliasing violations (rhbz#698726)
-# Sent upstream as
http://bugs.python.org/issue12872
-Patch143: 00143-tsc-on-ppc.patch
-
# 00146 #
# Support OpenSSL FIPS mode (e.g. when OPENSSL_FORCE_FIPS_MODE=1 is set)
# - handle failures from OpenSSL (e.g. on attempts to use MD5 in a
@@ -613,7 +607,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch111 -p1
%patch132 -p1
%patch137 -p1
-#patch143 -p1 -b .tsc-on-ppc
#patch146 -p1
%patch155 -p1
%patch157 -p1
@@ -719,7 +712,7 @@ BuildPython debug \
python-debug \
python%{pybasever}-debug \
%ifarch %{ix86} x86_64 ppc %{power64}
- "--with-pydebug --with-tsc --without-ensurepip" \
+ "--with-pydebug --without-ensurepip" \
%else
"--with-pydebug --without-ensurepip" \
%endif
commit ace4eac581ebdd507c5e3867bd7f73b7f67133b6
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Oct 12 14:04:47 2016 +0200
Fix rewheel's module regex (related upstream issue27364 and issue28128).
Enable tests.
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
index 5d514be..53a26ca 100644
--- a/00189-add-rewheel-module.patch
+++ b/00189-add-rewheel-module.patch
@@ -119,7 +119,7 @@ diff -Nur Python-3.4.1/Lib/ensurepip/rewheel/__init__.py
Python-3.4.1-rewheel/Li
+ for project in projects:
+ path = None
+ for sp in sys_sitepack:
-+ dist_info_re = os.path.join(sp, project) +
'-[^\{0}]+\.dist-info'.format(os.sep)
++ dist_info_re = os.path.join(sp, project) +
r'-[^\{0}]+\.dist-info'.format(os.sep)
+ candidates = [os.path.join(sp, p) for p in os.listdir(sp)]
+ # filter out candidate dirs based on the above regexp
+ filtered = [c for c in candidates if re.match(dist_info_re, c)]
diff --git a/python3.spec b/python3.spec
index a66c9e8..6d3ef9b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -87,7 +87,7 @@
%global with_computed_gotos yes
# Turn this to 0 to turn off the "check" phase:
-%global run_selftest_suite 0
+%global run_selftest_suite 1
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
commit 062c68f0569463e62d3636e2e3e663117c247d23
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Oct 11 20:14:31 2016 +0200
Add the files of asyncio.future's C implementation to the respective %files
section (upstream issue26081)
diff --git a/python3.spec b/python3.spec
index fbb41cb..a66c9e8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1226,6 +1226,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_dbm.%{SOABI_optimized}.so
%{dynload_dir}/_decimal.%{SOABI_optimized}.so
%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
+%{dynload_dir}/_futures.%{SOABI_optimized}.so
%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
%endif
@@ -1459,6 +1460,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_dbm.%{SOABI_debug}.so
%{dynload_dir}/_decimal.%{SOABI_debug}.so
%{dynload_dir}/_elementtree.%{SOABI_debug}.so
+%{dynload_dir}/_futures.%{SOABI_debug}.so
%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_debug}.so
%endif
commit a744d8670aa7810bd3c7bc945cb5a732985e5c7e
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Oct 11 20:03:32 2016 +0200
Drop patch 184 as it is implemented upstream now (upstream issue26661)
diff --git a/python3.spec b/python3.spec
index 02135f4..fbb41cb 100644
--- a/python3.spec
+++ b/python3.spec
@@ -346,14 +346,6 @@ Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# Not appropriate for upstream, Fedora-specific naming
Patch180: 00180-python-add-support-for-ppc64p7.patch
-# 00184 #
-# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=979696
-# Fixes build of ctypes against libffi with multilib wrapper
-# Python recognizes ffi.h only if it contains "#define LIBFFI_H",
-# but the wrapper doesn't contain that, which makes the build fail
-# We patch this by also accepting "#define ffi_wrapper_h"
-Patch184: 00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
-
# 00186 #
# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=1023607
# Previously, this fixed a problem where some *.py files were not being
@@ -630,7 +622,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch170 -p1
%patch178 -p1
%patch180 -p1
-%patch184 -p1
%patch186 -p1
%patch188 -p1
commit 067a255b229bea094399a9b4a9a78634a4205ff0
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Oct 11 19:56:27 2016 +0200
Update to 3.6.0b2
diff --git a/python3.spec b/python3.spec
index bdd19c4..02135f4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,8 +14,8 @@
# 4) python3-setuptools and python3-pip with with_rewheel set to 1
# 5) python3 with with_rewheel set to 1
-# First beta prerelease
-%global prerel b1
+# Second beta prerelease
+%global prerel b2
%global with_rewheel 1
@@ -116,7 +116,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.1.%{?prerel}%{?dist}
+Release: 0.2.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
@@ -184,7 +184,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
https://www.python.org/ftp/python/3.6.0/Python-3.6.0b1.tar.xz
+Source:
https://www.python.org/ftp/python/3.6.0/Python-3.6.0b2.tar.xz
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
commit c426ceabbeffe623d4d16978e6308717913ffbf0
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Oct 11 19:47:55 2016 +0200
Fix the excluded tests due to -x flag not working properly (upstream issue28409)
diff --git a/python3.spec b/python3.spec
index 2f7cec5..bdd19c4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1076,13 +1076,13 @@ CheckPython() {
--verbose --findleaks \
-x test_distutils \
%ifarch ppc64le aarch64
- -x test_faulthandler \
+ test_faulthandler \
%endif
%ifarch %{mips64}
- -x test_ctypes \
+ test_ctypes \
%endif
%ifarch %{power64} s390 s390x armv7hl aarch64 %{mips}
- -x test_gdb
+ test_gdb
%endif
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
commit 1c8e9a60f480e5d360133a1ac042c723a0d34212
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Oct 7 19:22:17 2016 +0200
Add the cryptography algorithms files to the respective file sections since
the hashlib patch was dropped, so we are using currently python's implementation
of these algorithms
instead of the OpenSSL's ones. Relevant upstream issue26470.
Remove the plat-linux directory and add the system configuration data files(upstream
issue28046)
diff --git a/python3.spec b/python3.spec
index 2107279..2f7cec5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -52,9 +52,10 @@
# For example,
# foo/bar.py
# now has bytecode at:
-# foo/__pycache__/bar.cpython-35.pyc
-# foo/__pycache__/bar.cpython-35.pyo
-%global bytecode_suffixes .cpython-36*.py?
+# foo/__pycache__/bar.cpython-36.pyc
+# foo/__pycache__/bar.cpython-36.opt-1.pyc
+# foo/__pycache__/bar.cpython-36.opt-2.pyc
+%global bytecode_suffixes .cpython-36*.pyc
# Python's configure script defines SOVERSION, and this is used in the Makefile
# to determine INSTSONAME, the name of the libpython DSO:
@@ -1207,10 +1208,16 @@ rm -fr %{buildroot}
%dir %{pylibdir}
%dir %{dynload_dir}
+%{dynload_dir}/_blake2.%{SOABI_optimized}.so
%{dynload_dir}/_md5.%{SOABI_optimized}.so
+%{dynload_dir}/_sha1.%{SOABI_optimized}.so
%{dynload_dir}/_sha256.%{SOABI_optimized}.so
+%{dynload_dir}/_sha3.%{SOABI_optimized}.so
%{dynload_dir}/_sha512.%{SOABI_optimized}.so
-%{dynload_dir}/_sha1.%{SOABI_optimized}.so
+
+%{dynload_dir}/_sysconfigdata_%{ABIFLAGS_optimized}_linux_%{_arch}-linux%{_gnu}.py
+%dir %{dynload_dir}/__pycache__/
+%{dynload_dir}/__pycache__/_sysconfigdata_%{ABIFLAGS_optimized}_linux_%{_arch}-linux%{_gnu}%{bytecode_suffixes}
%{dynload_dir}/_bisect.%{SOABI_optimized}.so
%{dynload_dir}/_bz2.%{SOABI_optimized}.so
@@ -1274,6 +1281,7 @@ rm -fr %{buildroot}
%dir %{pylibdir}/site-packages/
%dir %{pylibdir}/site-packages/__pycache__/
%{pylibdir}/site-packages/README
+%{pylibdir}/site-packages/README.txt
%{pylibdir}/*.py
%dir %{pylibdir}/__pycache__/
%{pylibdir}/__pycache__/*%{bytecode_suffixes}
@@ -1328,7 +1336,6 @@ rm -fr %{buildroot}
%{pylibdir}/logging
%{pylibdir}/multiprocessing
-%{pylibdir}/plat-linux
%dir %{pylibdir}/sqlite3/
%dir %{pylibdir}/sqlite3/__pycache__/
@@ -1435,10 +1442,15 @@ rm -fr %{buildroot}
# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
+%{dynload_dir}/_blake2.%{SOABI_debug}.so
%{dynload_dir}/_md5.%{SOABI_debug}.so
+%{dynload_dir}/_sha1.%{SOABI_debug}.so
%{dynload_dir}/_sha256.%{SOABI_debug}.so
+%{dynload_dir}/_sha3.%{SOABI_debug}.so
%{dynload_dir}/_sha512.%{SOABI_debug}.so
-%{dynload_dir}/_sha1.%{SOABI_debug}.so
+
+%{dynload_dir}/_sysconfigdata_%{ABIFLAGS_debug}_linux_%{_arch}-linux%{_gnu}.py
+%{dynload_dir}/__pycache__/_sysconfigdata_%{ABIFLAGS_debug}_linux_%{_arch}-linux%{_gnu}%{bytecode_suffixes}
%{dynload_dir}/_bisect.%{SOABI_debug}.so
%{dynload_dir}/_bz2.%{SOABI_debug}.so
commit 390d524690b0a73d98f1608618f3251b9ad98d82
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Sep 29 16:19:02 2016 +0200
Disable test suite
diff --git a/python3.spec b/python3.spec
index b0d8d7a..2107279 100644
--- a/python3.spec
+++ b/python3.spec
@@ -86,7 +86,7 @@
%global with_computed_gotos yes
# Turn this to 0 to turn off the "check" phase:
-%global run_selftest_suite 1
+%global run_selftest_suite 0
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
commit 0424a4f70ec7ba21682b825e67ac5bca85813558
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Sep 29 16:17:06 2016 +0200
Rebased patches 102, 111, 170 in order to apply cleanly for the new sources.
Dropped patches 209, 242, 247 as they are already upstream.
Dropped patches 143 and 146 for now.
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 35a442e..8e9ae4e 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,5 +1,5 @@
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
-index 67db007..b16fe0f 100644
+index 9474e9c..c0ce4c6 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
@@ -20,7 +20,7 @@ index 67db007..b16fe0f 100644
'scripts': '$base/bin',
'data' : '$base',
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
-index e5c493d..a4846eb 100644
+index 026cca7..6d3e077 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -132,8 +132,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
@@ -38,7 +38,7 @@ index e5c493d..a4846eb 100644
return libpython
else:
diff --git a/Lib/site.py b/Lib/site.py
-index 3f78ef5..ad1033e 100644
+index a84e3bb..ba0d3ea 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -303,11 +303,15 @@ def getsitepackages(prefixes=None):
@@ -49,7 +49,7 @@ index 3f78ef5..ad1033e 100644
+ "python" + sys.version[:3],
+ "site-packages"))
sitepackages.append(os.path.join(prefix, "lib",
- "python" + sys.version[:3],
+ "python%d.%d" % sys.version_info[:2],
"site-packages"))
else:
sitepackages.append(prefix)
@@ -58,7 +58,7 @@ index 3f78ef5..ad1033e 100644
if sys.platform == "darwin":
# for framework builds *only* we add the standard Apple
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
-index 61451b2..b021cce 100644
+index b9bbfe5..2a5f29c 100644
--- a/Lib/sysconfig.py
+++ b/Lib/sysconfig.py
@@ -20,10 +20,10 @@ __all__ = [
@@ -90,7 +90,7 @@ index 61451b2..b021cce 100644
'scripts': '{userbase}/bin',
'data': '{userbase}',
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
-index da20a3d..f38ce06 100644
+index f698927..bc977b5 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -248,8 +248,8 @@ class HelperFunctionsTests(unittest.TestCase):
@@ -98,17 +98,17 @@ index da20a3d..f38ce06 100644
elif os.sep == '/':
# OS X non-framwework builds, Linux, FreeBSD, etc
- self.assertEqual(len(dirs), 1)
-- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
+- wanted = os.path.join('xoxo', 'lib',
+ self.assertEqual(len(dirs), 2)
-+ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
++ wanted = os.path.join('xoxo', 'lib64',
+ 'python%d.%d' % sys.version_info[:2],
'site-packages')
self.assertEqual(dirs[0], wanted)
- else:
diff --git a/Makefile.pre.in b/Makefile.pre.in
-index 58d4258..e8364f0 100644
+index 8fa7934..a693917 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -125,7 +125,7 @@ LIBDIR= @libdir@
+@@ -126,7 +126,7 @@ LIBDIR= @libdir@
MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
@@ -118,7 +118,7 @@ index 58d4258..e8364f0 100644
# Detailed destination directories
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index 18deb60..27ca814 100644
+index 65b47a3..eaa756c 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -494,7 +494,7 @@ calculate_path(void)
@@ -149,7 +149,7 @@ index 18deb60..27ca814 100644
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
diff --git a/setup.py b/setup.py
-index be33c46..f2779cc 100644
+index 0f2dfc4..da37896 100644
--- a/setup.py
+++ b/setup.py
@@ -492,7 +492,7 @@ class PyBuildExt(build_ext):
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 006bb90..6929fda 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,19 +1,20 @@
-diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec/Makefile.pre.in
---- cpython-59223da36dec/Makefile.pre.in.no-static-lib 2012-08-07 16:43:43.296466422
-0400
-+++ cpython-59223da36dec/Makefile.pre.in 2012-08-07 16:44:13.299464371 -0400
-@@ -550,7 +550,7 @@ clinic: $(BUILDPYTHON)
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 70e5927..04c8e3d 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -556,7 +556,7 @@ clinic: $(BUILDPYTHON) $(srcdir)/Modules/_blake2/blake2s_impl.c
$(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-+$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
++$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
-@@ -480,18 +480,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
- _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
+@@ -601,18 +601,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
+
-# Build static library
-# avoid long command lines, same as LIBRARY_OBJS
-$(LIBRARY): $(LIBRARY_OBJS)
@@ -22,14 +23,14 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS) Python/frozen.o
-- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS)
- $(AR) $(ARFLAGS) $@ $(MODOBJS)
- $(RANLIB) $@
-
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -674,7 +674,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
+@@ -702,7 +690,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
echo "-----------------------------------------------"; \
fi
@@ -38,7 +39,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1354,18 +1354,6 @@ libainstall: all python-config
+@@ -1382,18 +1370,6 @@ libainstall: all python-config
else true; \
fi; \
done
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
index 9e34c21..f491733 100644
--- a/00170-gc-assertions.patch
+++ b/00170-gc-assertions.patch
@@ -1,8 +1,8 @@
-Index: Include/object.h
-===================================================================
---- Include/object.h (revision 87911)
-+++ Include/object.h (working copy)
-@@ -914,6 +914,49 @@
+diff --git a/Include/object.h b/Include/object.h
+index 0c88603..e3413e8 100644
+--- a/Include/object.h
++++ b/Include/object.h
+@@ -1059,6 +1059,49 @@ PyAPI_FUNC(void)
_PyObject_DebugTypeStats(FILE *out);
#endif /* ifndef Py_LIMITED_API */
@@ -52,63 +52,38 @@ Index: Include/object.h
#ifdef __cplusplus
}
#endif
-Index: Objects/object.c
-===================================================================
---- Objects/object.c (revision 87911)
-+++ Objects/object.c (working copy)
-@@ -1899,6 +1899,35 @@
- }
- }
-
-+PyAPI_FUNC(void)
-+_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
-+ const char *file, int line, const char *function)
-+{
-+ fprintf(stderr,
-+ "%s:%d: %s: Assertion \"%s\" failed.\n",
-+ file, line, function, expr);
-+ if (msg) {
-+ fprintf(stderr, "%s\n", msg);
-+ }
-+
-+ fflush(stderr);
-+
-+ if (obj) {
-+ /* This might succeed or fail, but we're about to abort, so at least
-+ try to provide any extra info we can: */
-+ _PyObject_Dump(obj);
-+ }
-+ else {
-+ fprintf(stderr, "NULL object\n");
-+ }
-+
-+ fflush(stdout);
-+ fflush(stderr);
-+
-+ /* Terminate the process: */
-+ abort();
-+}
-+
- #ifndef Py_TRACE_REFS
- /* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
- Define this here, so we can undefine the macro. */
-Index: Lib/test/test_gc.py
-===================================================================
---- Lib/test/test_gc.py (revision 87911)
-+++ Lib/test/test_gc.py (working copy)
-@@ -1,7 +1,7 @@
+diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
+index e727499..6efcafb 100644
+--- a/Lib/test/test_gc.py
++++ b/Lib/test/test_gc.py
+@@ -1,10 +1,11 @@
import unittest
from test.support import (verbose, refcount_test, run_unittest,
- strip_python_stderr, cpython_only, start_threads,
-- temp_dir)
-+ temp_dir, import_module)
+ strip_python_stderr, cpython_only, start_threads,
+- temp_dir, requires_type_collecting)
++ temp_dir, import_module, requires_type_collecting)
from test.support.script_helper import assert_python_ok, make_script
import sys
-@@ -512,6 +512,48 @@
++import sysconfig
+ import time
+ import gc
+ import weakref
+@@ -50,6 +51,8 @@ class GC_Detector(object):
+ # gc collects it.
+ self.wr = weakref.ref(C1055820(666), it_happened)
+
++BUILD_WITH_NDEBUG = ('-DNDEBUG' in
sysconfig.get_config_vars()['PY_CFLAGS'])
++
+ @with_tp_del
+ class Uncollectable(object):
+ """Create a reference cycle with multiple __del__ methods.
+@@ -862,6 +865,50 @@ class GCCallbackTests(unittest.TestCase):
self.assertEqual(len(gc.garbage), 0)
++ @unittest.skipIf(BUILD_WITH_NDEBUG,
++ 'built with -NDEBUG')
+ def test_refcount_errors(self):
+ self.preclean()
+ # Verify the "handling" of objects with broken refcounts
@@ -154,9 +129,10 @@ Index: Lib/test/test_gc.py
class GCTogglingTests(unittest.TestCase):
def setUp(self):
gc.enable()
-diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
---- Modules/gcmodule.c.orig2 2014-12-08 10:54:14.251742911 +0100
-+++ Modules/gcmodule.c 2014-12-08 10:52:45.674771917 +0100
+diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
+index 0c6f444..87edd5a 100644
+--- a/Modules/gcmodule.c
++++ b/Modules/gcmodule.c
@@ -341,7 +341,8 @@ update_refs(PyGC_Head *containers)
{
PyGC_Head *gc = containers->gc.gc_next;
@@ -188,7 +164,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
if (_PyGCHead_REFS(gc) > 0)
_PyGCHead_DECREF(gc);
}
-@@ -436,9 +440,10 @@ visit_reachable(PyObject *op, PyGC_Head
+@@ -436,9 +440,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
* If gc_refs == GC_UNTRACKED, it must be ignored.
*/
else {
@@ -202,7 +178,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
}
}
return 0;
-@@ -480,7 +485,7 @@ move_unreachable(PyGC_Head *young, PyGC_
+@@ -480,7 +485,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
*/
PyObject *op = FROM_GC(gc);
traverseproc traverse = Py_TYPE(op)->tp_traverse;
@@ -211,7 +187,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
_PyGCHead_SET_REFS(gc, GC_REACHABLE);
(void) traverse(op,
(visitproc)visit_reachable,
-@@ -543,7 +548,7 @@ move_legacy_finalizers(PyGC_Head *unreac
+@@ -543,7 +548,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head
*finalizers)
for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
PyObject *op = FROM_GC(gc);
@@ -220,7 +196,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
next = gc->gc.gc_next;
if (has_legacy_finalizer(op)) {
-@@ -619,7 +624,7 @@ handle_weakrefs(PyGC_Head *unreachable,
+@@ -619,7 +624,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
PyWeakReference **wrlist;
op = FROM_GC(gc);
@@ -229,7 +205,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
next = gc->gc.gc_next;
if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
-@@ -640,9 +645,9 @@ handle_weakrefs(PyGC_Head *unreachable,
+@@ -640,9 +645,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
* the callback pointer intact. Obscure: it also
* changes *wrlist.
*/
@@ -241,7 +217,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
if (wr->wr_callback == NULL)
continue; /* no callback */
-@@ -676,7 +681,7 @@ handle_weakrefs(PyGC_Head *unreachable,
+@@ -676,7 +681,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
*/
if (IS_TENTATIVELY_UNREACHABLE(wr))
continue;
@@ -250,7 +226,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
/* Create a new reference so that wr can't go away
* before we can process it again.
-@@ -685,7 +690,8 @@ handle_weakrefs(PyGC_Head *unreachable,
+@@ -685,7 +690,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
/* Move wr to wrcb_to_call, for the next pass. */
wrasgc = AS_GC(wr);
@@ -260,7 +236,7 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
next isn't, so they can't
be the same */
gc_list_move(wrasgc, &wrcb_to_call);
-@@ -701,11 +707,11 @@ handle_weakrefs(PyGC_Head *unreachable,
+@@ -701,11 +707,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
gc = wrcb_to_call.gc.gc_next;
op = FROM_GC(gc);
@@ -292,35 +268,43 @@ diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
if (_PyGCHead_REFS(gc) != 0)
return -1;
}
-diff -up Lib/test/test_gc.py.old Lib/test/test_gc.py
---- Lib/test/test_gc.py.old 2014-12-10 11:19:33.503982288 +0100
-+++ Lib/test/test_gc.py 2014-12-10 11:21:13.220021364 +0100
-@@ -49,6 +49,8 @@ class GC_Detector(object):
- # gc collects it.
- self.wr = weakref.ref(C1055820(666), it_happened)
+diff --git a/Objects/object.c b/Objects/object.c
+index 559794f..a47d47f 100644
+--- a/Objects/object.c
++++ b/Objects/object.c
+@@ -2022,6 +2022,35 @@ _PyTrash_thread_destroy_chain(void)
+ }
+ }
-+BUILD_WITH_NDEBUG = ('-DNDEBUG' in
sysconfig.get_config_vars()['PY_CFLAGS'])
++PyAPI_FUNC(void)
++_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
++ const char *file, int line, const char *function)
++{
++ fprintf(stderr,
++ "%s:%d: %s: Assertion \"%s\" failed.\n",
++ file, line, function, expr);
++ if (msg) {
++ fprintf(stderr, "%s\n", msg);
++ }
+
- @with_tp_del
- class Uncollectable(object):
- """Create a reference cycle with multiple __del__ methods.
-@@ -854,6 +856,8 @@ class GCCallbackTests(unittest.TestCase)
- self.assertEqual(len(gc.garbage), 0)
-
-
-+ @unittest.skipIf(BUILD_WITH_NDEBUG,
-+ 'built with -NDEBUG')
- def test_refcount_errors(self):
- self.preclean()
- # Verify the "handling" of objects with broken refcounts
-diff -up Lib/test/test_gc.py.old Lib/test/test_gc.py
---- Lib/test/test_gc.py.old 2014-12-10 12:50:58.252121318 +0100
-+++ Lib/test/test_gc.py 2014-12-10 12:51:08.594266653 +0100
-@@ -4,6 +4,7 @@ from test.support import (verbose, refco
- from test.support.script_helper import assert_python_ok, make_script
-
- import sys
-+import sysconfig
- import time
- import gc
- import weakref
++ fflush(stderr);
++
++ if (obj) {
++ /* This might succeed or fail, but we're about to abort, so at least
++ try to provide any extra info we can: */
++ _PyObject_Dump(obj);
++ }
++ else {
++ fprintf(stderr, "NULL object\n");
++ }
++
++ fflush(stdout);
++ fflush(stderr);
++
++ /* Terminate the process: */
++ abort();
++}
++
+ #ifndef Py_TRACE_REFS
+ /* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
+ Define this here, so we can undefine the macro. */
diff --git a/00209-fix-test-pyexpat-failure.patch b/00209-fix-test-pyexpat-failure.patch
deleted file mode 100644
index 7b40280..0000000
--- a/00209-fix-test-pyexpat-failure.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -r 682a8e36dd18 Lib/test/test_pyexpat.py
---- a/Lib/test/test_pyexpat.py Tue Jul 05 17:08:52 2016 +0300
-+++ b/Lib/test/test_pyexpat.py Thu Jul 07 17:04:35 2016 +0800
-@@ -656,11 +656,9 @@
- # \xc2\x85 is UTF-8 encoded U+0085 (NEXT LINE)
- xml = b"<?xml version\xc2\x85='1.0'?>\r\n"
- parser = expat.ParserCreate()
-- try:
-+ err_pattern = r'XML declaration not well-formed: line 1, column \d+'
-+ with self.assertRaisesRegex(expat.ExpatError, err_pattern):
- parser.Parse(xml, True)
-- self.fail()
-- except expat.ExpatError as e:
-- self.assertEqual(str(e), 'XML declaration not well-formed: line 1,
column 14')
-
- class ErrorMessageTest(unittest.TestCase):
- def test_codes(self):
diff --git a/00242-CVE-2016-1000110-httpoxy.patch b/00242-CVE-2016-1000110-httpoxy.patch
deleted file mode 100644
index 244ebec..0000000
--- a/00242-CVE-2016-1000110-httpoxy.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
-index 24a4156..d2c7991 100644
---- a/Doc/howto/urllib2.rst
-+++ b/Doc/howto/urllib2.rst
-@@ -538,6 +538,11 @@ setting up a `Basic Authentication`_ handler: ::
- through a proxy. However, this can be enabled by extending urllib.request as
- shown in the recipe [#]_.
-
-+.. note::
-+
-+ ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; see
-+ the documentation on :func:`~urllib.request.getproxies`.
-+
-
- Sockets and Layers
- ==================
-diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
-index 6c1bfb8..1291aeb 100644
---- a/Doc/library/urllib.request.rst
-+++ b/Doc/library/urllib.request.rst
-@@ -173,6 +173,16 @@ The :mod:`urllib.request` module defines the following functions:
- If both lowercase and uppercase environment variables exist (and disagree),
- lowercase is preferred.
-
-+ .. note::
-+
-+ If the environment variable ``REQUEST_METHOD`` is set, which usually
-+ indicates your script is running in a CGI environment, the environment
-+ variable ``HTTP_PROXY`` (uppercase ``_PROXY``) will be ignored. This is
-+ because that variable can be injected by a client using the "Proxy:"
HTTP
-+ header. If you need to use an HTTP proxy in a CGI environment, either use
-+ ``ProxyHandler`` explicitly, or make sure the variable name is in
-+ lowercase (or at least the ``_proxy`` suffix).
-+
-
- The following classes are provided:
-
-@@ -280,6 +290,11 @@ The following classes are provided:
- list of hostname suffixes, optionally with ``:port`` appended, for example
- ``cern.ch,ncsa.uiuc.edu,some.host:8080``.
-
-+ .. note::
-+
-+ ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set;
-+ see the documentation on :func:`~urllib.request.getproxies`.
-+
-
- .. class:: HTTPPasswordMgr()
-
-diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
-index 5d05f8d..c26c52a 100644
---- a/Lib/test/test_urllib.py
-+++ b/Lib/test/test_urllib.py
-@@ -232,6 +232,18 @@ class ProxyTests(unittest.TestCase):
-
self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com:8888'))
-
self.assertTrue(urllib.request.proxy_bypass_environment('newdomain.com:1234'))
-
-+ def test_proxy_cgi_ignore(self):
-+ try:
-+ self.env.set('HTTP_PROXY', 'http://somewhere:3128')
-+ proxies = urllib.request.getproxies_environment()
-+ self.assertEqual('http://somewhere:3128', proxies['http'])
-+ self.env.set('REQUEST_METHOD', 'GET')
-+ proxies = urllib.request.getproxies_environment()
-+ self.assertNotIn('http', proxies)
-+ finally:
-+ self.env.unset('REQUEST_METHOD')
-+ self.env.unset('HTTP_PROXY')
-+
- def test_proxy_bypass_environment_host_match(self):
- bypass = urllib.request.proxy_bypass_environment
- self.env.set('NO_PROXY',
-diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
-index 1731fe3..3be327d 100644
---- a/Lib/urllib/request.py
-+++ b/Lib/urllib/request.py
-@@ -2412,6 +2412,12 @@ def getproxies_environment():
- name = name.lower()
- if value and name[-6:] == '_proxy':
- proxies[name[:-6]] = value
-+ # CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY
-+ # (non-all-lowercase) as it may be set from the web server by a "Proxy:"
-+ # header from the client
-+ # If "proxy" is lowercase, it will still be used thanks to the next block
-+ if 'REQUEST_METHOD' in os.environ:
-+ proxies.pop('http', None)
- for name, value in os.environ.items():
- if name[-6:] == '_proxy':
- name = name.lower()
diff --git a/00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
b/00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
deleted file mode 100644
index 5760d67..0000000
--- a/00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
+++ /dev/null
@@ -1,1314 +0,0 @@
-
-# HG changeset patch
-# User Christian Heimes <christian(a)python.org>
-# Date 1473110345 -7200
-# Node ID 5c75b315152b714f7c84258ea511b461e2c06154
-# Parent 82467d0dbaea31a7971d1429ca5f4a251a995f33
-Issue #26470: Port ssl and hashlib module to OpenSSL 1.1.0.
-
-diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
---- a/Doc/library/ssl.rst
-+++ b/Doc/library/ssl.rst
-@@ -178,7 +178,7 @@ instead.
- use. Typically, the server chooses a particular protocol version, and the
- client must adapt to the server's choice. Most of the versions are not
- interoperable with the other versions. If not specified, the default is
-- :data:`PROTOCOL_SSLv23`; it provides the most compatibility with other
-+ :data:`PROTOCOL_TLS`; it provides the most compatibility with other
- versions.
-
- Here's a table showing which versions in a client (down the side) can connect
-@@ -187,11 +187,11 @@ instead.
- .. table::
-
- ======================== ========= ========= ========== =========
=========== ===========
-- *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
**TLSv1.1** **TLSv1.2**
-+ *client* / **server** **SSLv2** **SSLv3** **TLS** **TLSv1**
**TLSv1.1** **TLSv1.2**
- ------------------------ --------- --------- ---------- ---------
----------- -----------
- *SSLv2* yes no yes no no
no
- *SSLv3* no yes yes no no
no
-- *SSLv23* no yes yes yes yes
yes
-+ *TLS* (*SSLv23*) no yes yes yes yes
yes
- *TLSv1* no no yes yes no
no
- *TLSv1.1* no no yes no yes
no
- *TLSv1.2* no no yes no no
yes
-@@ -244,7 +244,7 @@ purposes.
- :const:`None`, this function can choose to trust the system's default
- CA certificates instead.
-
-- The settings are: :data:`PROTOCOL_SSLv23`, :data:`OP_NO_SSLv2`, and
-+ The settings are: :data:`PROTOCOL_TLS`, :data:`OP_NO_SSLv2`, and
- :data:`OP_NO_SSLv3` with high encryption cipher suites without RC4 and
- without unauthenticated cipher suites. Passing :data:`~Purpose.SERVER_AUTH`
- as *purpose* sets :data:`~SSLContext.verify_mode` to :data:`CERT_REQUIRED`
-@@ -316,6 +316,11 @@ Random generation
-
- .. versionadded:: 3.3
-
-+ .. deprecated:: 3.5.3
-+
-+ OpenSSL has deprecated :func:`ssl.RAND_pseudo_bytes`, use
-+ :func:`ssl.RAND_bytes` instead.
-+
- .. function:: RAND_status()
-
- Return ``True`` if the SSL pseudo-random number generator has been seeded
-@@ -334,7 +339,7 @@ Random generation
- See
http://egd.sourceforge.net/ or
http://prngd.sourceforge.net/ for sources
- of entropy-gathering daemons.
-
-- Availability: not available with LibreSSL.
-+ Availability: not available with LibreSSL and OpenSSL > 1.1.0
-
- .. function:: RAND_add(bytes, entropy)
-
-@@ -409,7 +414,7 @@ Certificate handling
- previously. Return an integer (no fractions of a second in the
- input format)
-
--.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None)
-+.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None)
-
- Given the address ``addr`` of an SSL-protected server, as a (*hostname*,
- *port-number*) pair, fetches the server's certificate, and returns it as a
-@@ -425,7 +430,7 @@ Certificate handling
-
- .. versionchanged:: 3.5
- The default *ssl_version* is changed from :data:`PROTOCOL_SSLv3` to
-- :data:`PROTOCOL_SSLv23` for maximum compatibility with modern servers.
-+ :data:`PROTOCOL_TLS` for maximum compatibility with modern servers.
-
- .. function:: DER_cert_to_PEM_cert(DER_cert_bytes)
-
-@@ -451,6 +456,9 @@ Certificate handling
- * :attr:`openssl_capath_env` - OpenSSL's environment key that points to a
capath,
- * :attr:`openssl_capath` - hard coded path to a capath directory
-
-+ Availability: LibreSSL ignores the environment vars
-+ :attr:`openssl_cafile_env` and :attr:`openssl_capath_env`
-+
- .. versionadded:: 3.4
-
- .. function:: enum_certificates(store_name)
-@@ -568,11 +576,21 @@ Constants
-
- .. versionadded:: 3.4.4
-
--.. data:: PROTOCOL_SSLv23
-+.. data:: PROTOCOL_TLS
-
- Selects the highest protocol version that both the client and server support.
- Despite the name, this option can select "TLS" protocols as well as
"SSL".
-
-+ .. versionadded:: 3.5.3
-+
-+.. data:: PROTOCOL_SSLv23
-+
-+ Alias for data:`PROTOCOL_TLS`.
-+
-+ .. deprecated:: 3.5.3
-+
-+ Use data:`PROTOCOL_TLS` instead.
-+
- .. data:: PROTOCOL_SSLv2
-
- Selects SSL version 2 as the channel encryption protocol.
-@@ -584,6 +602,10 @@ Constants
-
- SSL version 2 is insecure. Its use is highly discouraged.
-
-+ .. deprecated:: 3.5.3
-+
-+ OpenSSL has removed support for SSLv2.
-+
- .. data:: PROTOCOL_SSLv3
-
- Selects SSL version 3 as the channel encryption protocol.
-@@ -595,10 +617,20 @@ Constants
-
- SSL version 3 is insecure. Its use is highly discouraged.
-
-+ .. deprecated:: 3.5.3
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: PROTOCOL_TLSv1
-
- Selects TLS version 1.0 as the channel encryption protocol.
-
-+ .. deprecated:: 3.5.3
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: PROTOCOL_TLSv1_1
-
- Selects TLS version 1.1 as the channel encryption protocol.
-@@ -606,6 +638,11 @@ Constants
-
- .. versionadded:: 3.4
-
-+ .. deprecated:: 3.5.3
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: PROTOCOL_TLSv1_2
-
- Selects TLS version 1.2 as the channel encryption protocol. This is the
-@@ -614,6 +651,11 @@ Constants
-
- .. versionadded:: 3.4
-
-+ .. deprecated:: 3.5.3
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: OP_ALL
-
- Enables workarounds for various bugs present in other SSL implementations.
-@@ -625,23 +667,32 @@ Constants
- .. data:: OP_NO_SSLv2
-
- Prevents an SSLv2 connection. This option is only applicable in
-- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
-+ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
- choosing SSLv2 as the protocol version.
-
- .. versionadded:: 3.2
-
-+ .. deprecated:: 3.5.3
-+
-+ SSLv2 is deprecated
-+
-+
- .. data:: OP_NO_SSLv3
-
- Prevents an SSLv3 connection. This option is only applicable in
-- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
-+ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
- choosing SSLv3 as the protocol version.
-
- .. versionadded:: 3.2
-
-+ .. deprecated:: 3.5.3
-+
-+ SSLv3 is deprecated
-+
- .. data:: OP_NO_TLSv1
-
- Prevents a TLSv1 connection. This option is only applicable in
-- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
-+ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
- choosing TLSv1 as the protocol version.
-
- .. versionadded:: 3.2
-@@ -649,7 +700,7 @@ Constants
- .. data:: OP_NO_TLSv1_1
-
- Prevents a TLSv1.1 connection. This option is only applicable in conjunction
-- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.1 as
-+ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.1 as
- the protocol version. Available only with openssl version 1.0.1+.
-
- .. versionadded:: 3.4
-@@ -657,7 +708,7 @@ Constants
- .. data:: OP_NO_TLSv1_2
-
- Prevents a TLSv1.2 connection. This option is only applicable in conjunction
-- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.2 as
-+ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.2 as
- the protocol version. Available only with openssl version 1.0.1+.
-
- .. versionadded:: 3.4
-@@ -1081,17 +1132,21 @@ such as SSL configuration options, certi
- It also manages a cache of SSL sessions for server-side sockets, in order
- to speed up repeated connections from the same clients.
-
--.. class:: SSLContext(protocol)
--
-- Create a new SSL context. You must pass *protocol* which must be one
-+.. class:: SSLContext(protocol=PROTOCOL_TLS)
-+
-+ Create a new SSL context. You may pass *protocol* which must be one
- of the ``PROTOCOL_*`` constants defined in this module.
-- :data:`PROTOCOL_SSLv23` is currently recommended for maximum
-- interoperability.
-+ :data:`PROTOCOL_TLS` is currently recommended for maximum
-+ interoperability and default value.
-
- .. seealso::
- :func:`create_default_context` lets the :mod:`ssl` module choose
- security settings for a given purpose.
-
-+ .. versionchanged:: 3.5.3
-+
-+ :data:`PROTOCOL_TLS` is the default value.
-+
-
- :class:`SSLContext` objects have the following methods and attributes:
-
-@@ -1232,6 +1287,9 @@ to speed up repeated connections from th
- This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is
- False.
-
-+ OpenSSL 1.1.0+ will abort the handshake and raise :exc:`SSLError` when
-+ both sides support ALPN but cannot agree on a protocol.
-+
- .. versionadded:: 3.5
-
- .. method:: SSLContext.set_npn_protocols(protocols)
-@@ -1598,7 +1656,7 @@ If you prefer to tune security settings
- a context from scratch (but beware that you might not get the settings
- right)::
-
-- >>> context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
-+ >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS)
- >>> context.verify_mode = ssl.CERT_REQUIRED
- >>> context.check_hostname = True
- >>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
-@@ -1999,15 +2057,17 @@ Protocol versions
-
- SSL versions 2 and 3 are considered insecure and are therefore dangerous to
- use. If you want maximum compatibility between clients and servers, it is
--recommended to use :const:`PROTOCOL_SSLv23` as the protocol version and then
-+recommended to use :const:`PROTOCOL_TLS` as the protocol version and then
- disable SSLv2 and SSLv3 explicitly using the :data:`SSLContext.options`
- attribute::
-
-- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
-+ context = ssl.SSLContext(ssl.PROTOCOL_TLS)
- context.options |= ssl.OP_NO_SSLv2
- context.options |= ssl.OP_NO_SSLv3
--
--The SSL context created above will only allow TLSv1 and later (if
-+ context.options |= ssl.OP_NO_TLSv1
-+ context.options |= ssl.OP_NO_TLSv1_1
-+
-+The SSL context created above will only allow TLSv1.2 and later (if
- supported by your system) connections.
-
- Cipher selection
-diff --git a/Lib/ssl.py b/Lib/ssl.py
---- a/Lib/ssl.py
-+++ b/Lib/ssl.py
-@@ -51,6 +51,7 @@ The following constants identify various
- PROTOCOL_SSLv2
- PROTOCOL_SSLv3
- PROTOCOL_SSLv23
-+PROTOCOL_TLS
- PROTOCOL_TLSv1
- PROTOCOL_TLSv1_1
- PROTOCOL_TLSv1_2
-@@ -128,9 +129,10 @@ from _ssl import _OPENSSL_API_VERSION
-
- _IntEnum._convert(
- '_SSLMethod', __name__,
-- lambda name: name.startswith('PROTOCOL_'),
-+ lambda name: name.startswith('PROTOCOL_') and name !=
'PROTOCOL_SSLv23',
- source=_ssl)
-
-+PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_TLS
- _PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
-
- try:
-@@ -357,13 +359,13 @@ class SSLContext(_SSLContext):
- __slots__ = ('protocol', '__weakref__')
- _windows_cert_stores = ("CA", "ROOT")
-
-- def __new__(cls, protocol, *args, **kwargs):
-+ def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
- self = _SSLContext.__new__(cls, protocol)
- if protocol != _SSLv2_IF_EXISTS:
- self.set_ciphers(_DEFAULT_CIPHERS)
- return self
-
-- def __init__(self, protocol):
-+ def __init__(self, protocol=PROTOCOL_TLS):
- self.protocol = protocol
-
- def wrap_socket(self, sock, server_side=False,
-@@ -438,7 +440,7 @@ def create_default_context(purpose=Purpo
- if not isinstance(purpose, _ASN1Object):
- raise TypeError(purpose)
-
-- context = SSLContext(PROTOCOL_SSLv23)
-+ context = SSLContext(PROTOCOL_TLS)
-
- # SSLv2 considered harmful.
- context.options |= OP_NO_SSLv2
-@@ -475,7 +477,7 @@ def create_default_context(purpose=Purpo
- context.load_default_certs(purpose)
- return context
-
--def _create_unverified_context(protocol=PROTOCOL_SSLv23, *, cert_reqs=None,
-+def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=None,
- check_hostname=False, purpose=Purpose.SERVER_AUTH,
- certfile=None, keyfile=None,
- cafile=None, capath=None, cadata=None):
-@@ -666,7 +668,7 @@ class SSLSocket(socket):
-
- def __init__(self, sock=None, keyfile=None, certfile=None,
- server_side=False, cert_reqs=CERT_NONE,
-- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
-+ ssl_version=PROTOCOL_TLS, ca_certs=None,
- do_handshake_on_connect=True,
- family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
- suppress_ragged_eofs=True, npn_protocols=None, ciphers=None,
-@@ -1056,7 +1058,7 @@ class SSLSocket(socket):
-
- def wrap_socket(sock, keyfile=None, certfile=None,
- server_side=False, cert_reqs=CERT_NONE,
-- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
-+ ssl_version=PROTOCOL_TLS, ca_certs=None,
- do_handshake_on_connect=True,
- suppress_ragged_eofs=True,
- ciphers=None):
-@@ -1125,7 +1127,7 @@ def PEM_cert_to_DER_cert(pem_cert_string
- d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
- return base64.decodebytes(d.encode('ASCII', 'strict'))
-
--def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None):
-+def get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None):
- """Retrieve the certificate from the server at the specified
address,
- and return it as a PEM-encoded string.
- If 'ca_certs' is specified, validate the server cert against it.
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -23,6 +23,9 @@ ssl = support.import_module("ssl")
-
- PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
- HOST = support.HOST
-+IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
-+IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
-+
-
- def data_file(*name):
- return os.path.join(os.path.dirname(__file__), *name)
-@@ -143,8 +146,8 @@ class BasicSocketTests(unittest.TestCase
- def test_str_for_enums(self):
- # Make sure that the PROTOCOL_* constants have enum-like string
- # reprs.
-- proto = ssl.PROTOCOL_SSLv23
-- self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_SSLv23')
-+ proto = ssl.PROTOCOL_TLS
-+ self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_TLS')
- ctx = ssl.SSLContext(proto)
- self.assertIs(ctx.protocol, proto)
-
-@@ -312,8 +315,8 @@ class BasicSocketTests(unittest.TestCase
- self.assertGreaterEqual(status, 0)
- self.assertLessEqual(status, 15)
- # Version string as returned by {Open,Libre}SSL, the format might change
-- if "LibreSSL" in s:
-- self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major,
minor)),
-+ if IS_LIBRESSL:
-+ self.assertTrue(s.startswith("LibreSSL {:d}".format(major)),
- (s, t, hex(n)))
- else:
- self.assertTrue(s.startswith("OpenSSL
{:d}.{:d}.{:d}".format(major, minor, fix)),
-@@ -790,7 +793,8 @@ class ContextTests(unittest.TestCase):
- def test_constructor(self):
- for protocol in PROTOCOLS:
- ssl.SSLContext(protocol)
-- self.assertRaises(TypeError, ssl.SSLContext)
-+ ctx = ssl.SSLContext()
-+ self.assertEqual(ctx.protocol, ssl.PROTOCOL_TLS)
- self.assertRaises(ValueError, ssl.SSLContext, -1)
- self.assertRaises(ValueError, ssl.SSLContext, 42)
-
-@@ -811,15 +815,15 @@ class ContextTests(unittest.TestCase):
- def test_options(self):
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
- # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
-- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
-- ctx.options)
-+ default = (ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3)
-+ if not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0):
-+ default |= ssl.OP_NO_COMPRESSION
-+ self.assertEqual(default, ctx.options)
- ctx.options |= ssl.OP_NO_TLSv1
-- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 |
ssl.OP_NO_TLSv1,
-- ctx.options)
-+ self.assertEqual(default | ssl.OP_NO_TLSv1, ctx.options)
- if can_clear_options():
-- ctx.options = (ctx.options & ~ssl.OP_NO_SSLv2) | ssl.OP_NO_TLSv1
-- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_TLSv1 | ssl.OP_NO_SSLv3,
-- ctx.options)
-+ ctx.options = (ctx.options & ~ssl.OP_NO_TLSv1)
-+ self.assertEqual(default, ctx.options)
- ctx.options = 0
- # Ubuntu has OP_NO_SSLv3 forced on by default
- self.assertEqual(0, ctx.options & ~ssl.OP_NO_SSLv3)
-@@ -1155,6 +1159,7 @@ class ContextTests(unittest.TestCase):
- self.assertRaises(TypeError, ctx.load_default_certs, 'SERVER_AUTH')
-
- @unittest.skipIf(sys.platform == "win32", "not-Windows
specific")
-+ @unittest.skipIf(IS_LIBRESSL, "LibreSSL doesn't support env vars")
- def test_load_default_certs_env(self):
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
- with support.EnvironmentVarGuard() as env:
-@@ -1750,13 +1755,13 @@ class NetworkedBIOTests(unittest.TestCas
- sslobj = ctx.wrap_bio(incoming, outgoing, False, REMOTE_HOST)
- self.assertIs(sslobj._sslobj.owner, sslobj)
- self.assertIsNone(sslobj.cipher())
-- self.assertIsNone(sslobj.shared_ciphers())
-+ self.assertIsNotNone(sslobj.shared_ciphers())
- self.assertRaises(ValueError, sslobj.getpeercert)
- if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
- self.assertIsNone(sslobj.get_channel_binding('tls-unique'))
- self.ssl_io_loop(sock, incoming, outgoing, sslobj.do_handshake)
- self.assertTrue(sslobj.cipher())
-- self.assertIsNone(sslobj.shared_ciphers())
-+ self.assertIsNotNone(sslobj.shared_ciphers())
- self.assertTrue(sslobj.getpeercert())
- if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
- self.assertTrue(sslobj.get_channel_binding('tls-unique'))
-@@ -2993,7 +2998,7 @@ else:
- with context.wrap_socket(socket.socket()) as s:
- self.assertIs(s.version(), None)
- s.connect((HOST, server.port))
-- self.assertEqual(s.version(), "TLSv1")
-+ self.assertEqual(s.version(), 'TLSv1')
- self.assertIs(s.version(), None)
-
- @unittest.skipUnless(ssl.HAS_ECDH, "test requires ECDH-enabled
OpenSSL")
-@@ -3135,24 +3140,36 @@ else:
- (['http/3.0', 'http/4.0'], None)
- ]
- for client_protocols, expected in protocol_tests:
-- server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
-+ server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
- server_context.load_cert_chain(CERTFILE)
- server_context.set_alpn_protocols(server_protocols)
-- client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
-+ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
- client_context.load_cert_chain(CERTFILE)
- client_context.set_alpn_protocols(client_protocols)
-- stats = server_params_test(client_context, server_context,
-- chatty=True, connectionchatty=True)
--
-- msg = "failed trying %s (s) and %s (c).\n" \
-- "was expecting %s, but got %%s from the %%s" \
-- % (str(server_protocols), str(client_protocols),
-- str(expected))
-- client_result = stats['client_alpn_protocol']
-- self.assertEqual(client_result, expected, msg % (client_result,
"client"))
-- server_result = stats['server_alpn_protocols'][-1] \
-- if len(stats['server_alpn_protocols']) else
'nothing'
-- self.assertEqual(server_result, expected, msg % (server_result,
"server"))
-+
-+ try:
-+ stats = server_params_test(client_context,
-+ server_context,
-+ chatty=True,
-+ connectionchatty=True)
-+ except ssl.SSLError as e:
-+ stats = e
-+
-+ if expected is None and IS_OPENSSL_1_1:
-+ # OpenSSL 1.1.0 raises handshake error
-+ self.assertIsInstance(stats, ssl.SSLError)
-+ else:
-+ msg = "failed trying %s (s) and %s (c).\n" \
-+ "was expecting %s, but got %%s from the %%s" \
-+ % (str(server_protocols), str(client_protocols),
-+ str(expected))
-+ client_result = stats['client_alpn_protocol']
-+ self.assertEqual(client_result, expected,
-+ msg % (client_result, "client"))
-+ server_result = stats['server_alpn_protocols'][-1] \
-+ if len(stats['server_alpn_protocols']) else
'nothing'
-+ self.assertEqual(server_result, expected,
-+ msg % (server_result, "server"))
-
- def test_selected_npn_protocol(self):
- # selected_npn_protocol() is None unless NPN is used
-@@ -3300,13 +3317,23 @@ else:
- client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
- client_context.verify_mode = ssl.CERT_REQUIRED
- client_context.load_verify_locations(SIGNING_CA)
-- client_context.set_ciphers("RC4")
-- server_context.set_ciphers("AES:RC4")
-+ if ssl.OPENSSL_VERSION_INFO >= (1, 0, 2):
-+ client_context.set_ciphers("AES128:AES256")
-+ server_context.set_ciphers("AES256")
-+ alg1 = "AES256"
-+ alg2 = "AES-256"
-+ else:
-+ client_context.set_ciphers("AES:3DES")
-+ server_context.set_ciphers("3DES")
-+ alg1 = "3DES"
-+ alg2 = "DES-CBC3"
-+
- stats = server_params_test(client_context, server_context)
- ciphers = stats['server_shared_ciphers'][0]
- self.assertGreater(len(ciphers), 0)
- for name, tls_version, bits in ciphers:
-- self.assertIn("RC4", name.split("-"))
-+ if not alg1 in name.split("-") and alg2 not in name:
-+ self.fail(name)
-
- def test_read_write_after_close_raises_valuerror(self):
- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
-
-diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
---- a/Modules/_hashopenssl.c
-+++ b/Modules/_hashopenssl.c
-@@ -21,7 +21,6 @@
-
- /* EVP is the preferred interface to hashing in OpenSSL */
- #include <openssl/evp.h>
--#include <openssl/hmac.h>
- /* We use the object interface to discover what hashes OpenSSL supports. */
- #include <openssl/objects.h>
- #include "openssl/err.h"
-@@ -32,11 +31,22 @@
- #define HASH_OBJ_CONSTRUCTOR 0
- #endif
-
-+#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER)
-+/* OpenSSL < 1.1.0 */
-+#define EVP_MD_CTX_new EVP_MD_CTX_create
-+#define EVP_MD_CTX_free EVP_MD_CTX_destroy
-+#define HAS_FAST_PKCS5_PBKDF2_HMAC 0
-+#include <openssl/hmac.h>
-+#else
-+/* OpenSSL >= 1.1.0 */
-+#define HAS_FAST_PKCS5_PBKDF2_HMAC 1
-+#endif
-+
-
- typedef struct {
- PyObject_HEAD
- PyObject *name; /* name of this hash algorithm */
-- EVP_MD_CTX ctx; /* OpenSSL message digest context */
-+ EVP_MD_CTX *ctx; /* OpenSSL message digest context */
- #ifdef WITH_THREAD
- PyThread_type_lock lock; /* OpenSSL context lock */
- #endif
-@@ -48,7 +58,6 @@ static PyTypeObject EVPtype;
-
- #define DEFINE_CONSTS_FOR_NEW(Name) \
- static PyObject *CONST_ ## Name ## _name_obj = NULL; \
-- static EVP_MD_CTX CONST_new_ ## Name ## _ctx; \
- static EVP_MD_CTX *CONST_new_ ## Name ## _ctx_p = NULL;
-
- DEFINE_CONSTS_FOR_NEW(md5)
-@@ -59,19 +68,57 @@ DEFINE_CONSTS_FOR_NEW(sha384)
- DEFINE_CONSTS_FOR_NEW(sha512)
-
-
-+/* LCOV_EXCL_START */
-+static PyObject *
-+_setException(PyObject *exc)
-+{
-+ unsigned long errcode;
-+ const char *lib, *func, *reason;
-+
-+ errcode = ERR_peek_last_error();
-+ if (!errcode) {
-+ PyErr_SetString(exc, "unknown reasons");
-+ return NULL;
-+ }
-+ ERR_clear_error();
-+
-+ lib = ERR_lib_error_string(errcode);
-+ func = ERR_func_error_string(errcode);
-+ reason = ERR_reason_error_string(errcode);
-+
-+ if (lib && func) {
-+ PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
-+ }
-+ else if (lib) {
-+ PyErr_Format(exc, "[%s] %s", lib, reason);
-+ }
-+ else {
-+ PyErr_SetString(exc, reason);
-+ }
-+ return NULL;
-+}
-+/* LCOV_EXCL_STOP */
-+
- static EVPobject *
- newEVPobject(PyObject *name)
- {
- EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, &EVPtype);
-+ if (retval == NULL) {
-+ return NULL;
-+ }
-+
-+ retval->ctx = EVP_MD_CTX_new();
-+ if (retval->ctx == NULL) {
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
-
- /* save the name for .name to return */
-- if (retval != NULL) {
-- Py_INCREF(name);
-- retval->name = name;
-+ Py_INCREF(name);
-+ retval->name = name;
- #ifdef WITH_THREAD
-- retval->lock = NULL;
-+ retval->lock = NULL;
- #endif
-- }
-
- return retval;
- }
-@@ -86,7 +133,7 @@ EVP_hash(EVPobject *self, const void *vp
- process = MUNCH_SIZE;
- else
- process = Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int);
-- EVP_DigestUpdate(&self->ctx, (const void*)cp, process);
-+ EVP_DigestUpdate(self->ctx, (const void*)cp, process);
- len -= process;
- cp += process;
- }
-@@ -101,16 +148,19 @@ EVP_dealloc(EVPobject *self)
- if (self->lock != NULL)
- PyThread_free_lock(self->lock);
- #endif
-- EVP_MD_CTX_cleanup(&self->ctx);
-+ EVP_MD_CTX_free(self->ctx);
- Py_XDECREF(self->name);
- PyObject_Del(self);
- }
-
--static void locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
-+static int
-+locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
- {
-+ int result;
- ENTER_HASHLIB(self);
-- EVP_MD_CTX_copy(new_ctx_p, &self->ctx);
-+ result = EVP_MD_CTX_copy(new_ctx_p, self->ctx);
- LEAVE_HASHLIB(self);
-+ return result;
- }
-
- /* External methods for a hash object */
-@@ -126,7 +176,9 @@ EVP_copy(EVPobject *self, PyObject *unus
- if ( (newobj = newEVPobject(self->name))==NULL)
- return NULL;
-
-- locked_EVP_MD_CTX_copy(&newobj->ctx, self);
-+ if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) {
-+ return _setException(PyExc_ValueError);
-+ }
- return (PyObject *)newobj;
- }
-
-@@ -137,16 +189,24 @@ static PyObject *
- EVP_digest(EVPobject *self, PyObject *unused)
- {
- unsigned char digest[EVP_MAX_MD_SIZE];
-- EVP_MD_CTX temp_ctx;
-+ EVP_MD_CTX *temp_ctx;
- PyObject *retval;
- unsigned int digest_size;
-
-- locked_EVP_MD_CTX_copy(&temp_ctx, self);
-- digest_size = EVP_MD_CTX_size(&temp_ctx);
-- EVP_DigestFinal(&temp_ctx, digest, NULL);
-+ temp_ctx = EVP_MD_CTX_new();
-+ if (temp_ctx == NULL) {
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
-+
-+ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
-+ return _setException(PyExc_ValueError);
-+ }
-+ digest_size = EVP_MD_CTX_size(temp_ctx);
-+ EVP_DigestFinal(temp_ctx, digest, NULL);
-
- retval = PyBytes_FromStringAndSize((const char *)digest, digest_size);
-- EVP_MD_CTX_cleanup(&temp_ctx);
-+ EVP_MD_CTX_free(temp_ctx);
- return retval;
- }
-
-@@ -157,15 +217,23 @@ static PyObject *
- EVP_hexdigest(EVPobject *self, PyObject *unused)
- {
- unsigned char digest[EVP_MAX_MD_SIZE];
-- EVP_MD_CTX temp_ctx;
-+ EVP_MD_CTX *temp_ctx;
- unsigned int digest_size;
-
-+ temp_ctx = EVP_MD_CTX_new();
-+ if (temp_ctx == NULL) {
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
-+
- /* Get the raw (binary) digest value */
-- locked_EVP_MD_CTX_copy(&temp_ctx, self);
-- digest_size = EVP_MD_CTX_size(&temp_ctx);
-- EVP_DigestFinal(&temp_ctx, digest, NULL);
-+ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
-+ return _setException(PyExc_ValueError);
-+ }
-+ digest_size = EVP_MD_CTX_size(temp_ctx);
-+ EVP_DigestFinal(temp_ctx, digest, NULL);
-
-- EVP_MD_CTX_cleanup(&temp_ctx);
-+ EVP_MD_CTX_free(temp_ctx);
-
- return _Py_strhex((const char *)digest, digest_size);
- }
-@@ -219,7 +287,7 @@ static PyObject *
- EVP_get_block_size(EVPobject *self, void *closure)
- {
- long block_size;
-- block_size = EVP_MD_CTX_block_size(&self->ctx);
-+ block_size = EVP_MD_CTX_block_size(self->ctx);
- return PyLong_FromLong(block_size);
- }
-
-@@ -227,7 +295,7 @@ static PyObject *
- EVP_get_digest_size(EVPobject *self, void *closure)
- {
- long size;
-- size = EVP_MD_CTX_size(&self->ctx);
-+ size = EVP_MD_CTX_size(self->ctx);
- return PyLong_FromLong(size);
- }
-
-@@ -288,7 +356,7 @@ EVP_tp_init(EVPobject *self, PyObject *a
- PyBuffer_Release(&view);
- return -1;
- }
-- EVP_DigestInit(&self->ctx, digest);
-+ EVP_DigestInit(self->ctx, digest);
-
- self->name = name_obj;
- Py_INCREF(self->name);
-@@ -385,9 +453,9 @@ EVPnew(PyObject *name_obj,
- return NULL;
-
- if (initial_ctx) {
-- EVP_MD_CTX_copy(&self->ctx, initial_ctx);
-+ EVP_MD_CTX_copy(self->ctx, initial_ctx);
- } else {
-- EVP_DigestInit(&self->ctx, digest);
-+ EVP_DigestInit(self->ctx, digest);
- }
-
- if (cp && len) {
-@@ -453,6 +521,7 @@ EVP_new(PyObject *self, PyObject *args,
-
- #define PY_PBKDF2_HMAC 1
-
-+#if !HAS_FAST_PKCS5_PBKDF2_HMAC
- /* Improved implementation of PKCS5_PBKDF2_HMAC()
- *
- * PKCS5_PBKDF2_HMAC_fast() hashes the password exactly one time instead of
-@@ -534,37 +603,8 @@ PKCS5_PBKDF2_HMAC_fast(const char *pass,
- HMAC_CTX_cleanup(&hctx_tpl);
- return 1;
- }
-+#endif
-
--/* LCOV_EXCL_START */
--static PyObject *
--_setException(PyObject *exc)
--{
-- unsigned long errcode;
-- const char *lib, *func, *reason;
--
-- errcode = ERR_peek_last_error();
-- if (!errcode) {
-- PyErr_SetString(exc, "unknown reasons");
-- return NULL;
-- }
-- ERR_clear_error();
--
-- lib = ERR_lib_error_string(errcode);
-- func = ERR_func_error_string(errcode);
-- reason = ERR_reason_error_string(errcode);
--
-- if (lib && func) {
-- PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
-- }
-- else if (lib) {
-- PyErr_Format(exc, "[%s] %s", lib, reason);
-- }
-- else {
-- PyErr_SetString(exc, reason);
-- }
-- return NULL;
--}
--/* LCOV_EXCL_STOP */
-
- PyDoc_STRVAR(pbkdf2_hmac__doc__,
- "pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\
-@@ -646,10 +686,17 @@ pbkdf2_hmac(PyObject *self, PyObject *ar
- key = PyBytes_AS_STRING(key_obj);
-
- Py_BEGIN_ALLOW_THREADS
-+#if HAS_FAST_PKCS5_PBKDF2_HMAC
-+ retval = PKCS5_PBKDF2_HMAC((char*)password.buf, (int)password.len,
-+ (unsigned char *)salt.buf, (int)salt.len,
-+ iterations, digest, dklen,
-+ (unsigned char *)key);
-+#else
- retval = PKCS5_PBKDF2_HMAC_fast((char*)password.buf, (int)password.len,
- (unsigned char *)salt.buf, (int)salt.len,
- iterations, digest, dklen,
- (unsigned char *)key);
-+#endif
- Py_END_ALLOW_THREADS
-
- if (!retval) {
-@@ -768,7 +815,7 @@ generate_hash_name_list(void)
- if (CONST_ ## NAME ## _name_obj == NULL) { \
- CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
- if (EVP_get_digestbyname(#NAME)) { \
-- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
-+ CONST_new_ ## NAME ## _ctx_p = EVP_MD_CTX_new(); \
- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME));
\
- } \
- } \
-diff --git a/Modules/_ssl.c b/Modules/_ssl.c
---- a/Modules/_ssl.c
-+++ b/Modules/_ssl.c
-@@ -55,6 +55,14 @@ static PySocketModule_APIObject PySocket
- #include <sys/poll.h>
- #endif
-
-+/* Don't warn about deprecated functions */
-+#ifdef __GNUC__
-+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-+#endif
-+#ifdef __clang__
-+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-+#endif
-+
- /* Include OpenSSL header files */
- #include "openssl/rsa.h"
- #include "openssl/crypto.h"
-@@ -91,6 +99,10 @@ struct py_ssl_library_code {
- /* Include generated data (error codes) */
- #include "_ssl_data.h"
-
-+#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) &&
!defined(LIBRESSL_VERSION_NUMBER)
-+# define OPENSSL_VERSION_1_1 1
-+#endif
-+
- /* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
-
http://www.openssl.org/news/changelog.html
- */
-@@ -117,6 +129,72 @@ struct py_ssl_library_code {
- # define HAVE_ALPN
- #endif
-
-+#ifdef OPENSSL_VERSION_1_1
-+/* OpenSSL 1.1.0+ */
-+#ifndef OPENSSL_NO_SSL2
-+#define OPENSSL_NO_SSL2
-+#endif
-+#else /* OpenSSL < 1.1.0 */
-+#if defined(WITH_THREAD)
-+#define HAVE_OPENSSL_CRYPTO_LOCK
-+#endif
-+
-+#define TLS_method SSLv23_method
-+
-+static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
-+{
-+ return ne->set;
-+}
-+
-+#ifndef OPENSSL_NO_COMP
-+static int COMP_get_type(const COMP_METHOD *meth)
-+{
-+ return meth->type;
-+}
-+
-+static const char *COMP_get_name(const COMP_METHOD *meth)
-+{
-+ return meth->name;
-+}
-+#endif
-+
-+static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
-+{
-+ return ctx->default_passwd_callback;
-+}
-+
-+static void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx)
-+{
-+ return ctx->default_passwd_callback_userdata;
-+}
-+
-+static int X509_OBJECT_get_type(X509_OBJECT *x)
-+{
-+ return x->type;
-+}
-+
-+static X509 *X509_OBJECT_get0_X509(X509_OBJECT *x)
-+{
-+ return x->data.x509;
-+}
-+
-+static int BIO_up_ref(BIO *b)
-+{
-+ CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO);
-+ return 1;
-+}
-+
-+static STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) {
-+ return store->objs;
-+}
-+
-+static X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *store)
-+{
-+ return store->param;
-+}
-+#endif /* OpenSSL < 1.1.0 or LibreSSL */
-+
-+
- enum py_ssl_error {
- /* these mirror ssl.h */
- PY_SSL_ERROR_NONE,
-@@ -147,7 +225,7 @@ enum py_ssl_cert_requirements {
- enum py_ssl_version {
- PY_SSL_VERSION_SSL2,
- PY_SSL_VERSION_SSL3=1,
-- PY_SSL_VERSION_SSL23,
-+ PY_SSL_VERSION_TLS,
- #if HAVE_TLSv1_2
- PY_SSL_VERSION_TLS1,
- PY_SSL_VERSION_TLS1_1,
-@@ -527,8 +605,8 @@ newPySSLSocket(PySSLContext *sslctx, PyS
- /* BIOs are reference counted and SSL_set_bio borrows our reference.
- * To prevent a double free in memory_bio_dealloc() we need to take an
- * extra reference here. */
-- CRYPTO_add(&inbio->bio->references, 1, CRYPTO_LOCK_BIO);
-- CRYPTO_add(&outbio->bio->references, 1, CRYPTO_LOCK_BIO);
-+ BIO_up_ref(inbio->bio);
-+ BIO_up_ref(outbio->bio);
- SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
- }
- mode = SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;
-@@ -738,7 +816,7 @@ static PyObject *
-
- /* check to see if we've gotten to a new RDN */
- if (rdn_level >= 0) {
-- if (rdn_level != entry->set) {
-+ if (rdn_level != X509_NAME_ENTRY_set(entry)) {
- /* yes, new RDN */
- /* add old RDN to DN */
- rdnt = PyList_AsTuple(rdn);
-@@ -755,7 +833,7 @@ static PyObject *
- goto fail0;
- }
- }
-- rdn_level = entry->set;
-+ rdn_level = X509_NAME_ENTRY_set(entry);
-
- /* now add this attribute to the current RDN */
- name = X509_NAME_ENTRY_get_object(entry);
-@@ -853,18 +931,18 @@ static PyObject *
- goto fail;
- }
-
-- p = ext->value->data;
-+ p = X509_EXTENSION_get_data(ext)->data;
- if (method->it)
- names = (GENERAL_NAMES*)
- (ASN1_item_d2i(NULL,
- &p,
-- ext->value->length,
-+ X509_EXTENSION_get_data(ext)->length,
- ASN1_ITEM_ptr(method->it)));
- else
- names = (GENERAL_NAMES*)
- (method->d2i(NULL,
- &p,
-- ext->value->length));
-+ X509_EXTENSION_get_data(ext)->length));
-
- for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
- /* get a rendering of each name in the set of names */
-@@ -1075,13 +1153,11 @@ static PyObject *
- int i, j;
- PyObject *lst, *res = NULL;
-
--#if OPENSSL_VERSION_NUMBER < 0x10001000L
-- dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
--#else
-+#if OPENSSL_VERSION_NUMBER >= 0x10001000L
- /* Calls x509v3_cache_extensions and sets up crldp */
- X509_check_ca(certificate);
-- dps = certificate->crldp;
- #endif
-+ dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
-
- if (dps == NULL)
- return Py_None;
-@@ -1451,14 +1527,13 @@ static PyObject *
- _ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
- /*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
- {
-- SSL_SESSION *sess = SSL_get_session(self->ssl);
- STACK_OF(SSL_CIPHER) *ciphers;
- int i;
- PyObject *res;
-
-- if (!sess || !sess->ciphers)
-+ ciphers = SSL_get_ciphers(self->ssl);
-+ if (!ciphers)
- Py_RETURN_NONE;
-- ciphers = sess->ciphers;
- res = PyList_New(sk_SSL_CIPHER_num(ciphers));
- if (!res)
- return NULL;
-@@ -1567,9 +1642,9 @@ static PyObject *
- if (self->ssl == NULL)
- Py_RETURN_NONE;
- comp_method = SSL_get_current_compression(self->ssl);
-- if (comp_method == NULL || comp_method->type == NID_undef)
-+ if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
- Py_RETURN_NONE;
-- short_name = OBJ_nid2sn(comp_method->type);
-+ short_name = COMP_get_name(comp_method);
- if (short_name == NULL)
- Py_RETURN_NONE;
- return PyUnicode_DecodeFSDefault(short_name);
-@@ -2255,8 +2330,8 @@ static PyObject *
- else if (proto_version == PY_SSL_VERSION_SSL2)
- ctx = SSL_CTX_new(SSLv2_method());
- #endif
-- else if (proto_version == PY_SSL_VERSION_SSL23)
-- ctx = SSL_CTX_new(SSLv23_method());
-+ else if (proto_version == PY_SSL_VERSION_TLS)
-+ ctx = SSL_CTX_new(TLS_method());
- else
- proto_version = -1;
- PySSL_END_ALLOW_THREADS
-@@ -2318,8 +2393,9 @@ static PyObject *
- #ifndef OPENSSL_NO_ECDH
- /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use
- prime256v1 by default. This is Apache mod_ssl's initialization
-- policy, so we should be safe. */
--#if defined(SSL_CTX_set_ecdh_auto)
-+ policy, so we should be safe. OpenSSL 1.1 has it enabled by default.
-+ */
-+#if defined(SSL_CTX_set_ecdh_auto) && !defined(OPENSSL_VERSION_1_1)
- SSL_CTX_set_ecdh_auto(self->ctx, 1);
- #else
- {
-@@ -2586,10 +2662,12 @@ static PyObject *
- get_verify_flags(PySSLContext *self, void *c)
- {
- X509_STORE *store;
-+ X509_VERIFY_PARAM *param;
- unsigned long flags;
-
- store = SSL_CTX_get_cert_store(self->ctx);
-- flags = X509_VERIFY_PARAM_get_flags(store->param);
-+ param = X509_STORE_get0_param(store);
-+ flags = X509_VERIFY_PARAM_get_flags(param);
- return PyLong_FromUnsignedLong(flags);
- }
-
-@@ -2597,22 +2675,24 @@ static int
- set_verify_flags(PySSLContext *self, PyObject *arg, void *c)
- {
- X509_STORE *store;
-+ X509_VERIFY_PARAM *param;
- unsigned long new_flags, flags, set, clear;
-
- if (!PyArg_Parse(arg, "k", &new_flags))
- return -1;
- store = SSL_CTX_get_cert_store(self->ctx);
-- flags = X509_VERIFY_PARAM_get_flags(store->param);
-+ param = X509_STORE_get0_param(store);
-+ flags = X509_VERIFY_PARAM_get_flags(param);
- clear = flags & ~new_flags;
- set = ~flags & new_flags;
- if (clear) {
-- if (!X509_VERIFY_PARAM_clear_flags(store->param, clear)) {
-+ if (!X509_VERIFY_PARAM_clear_flags(param, clear)) {
- _setSSLError(NULL, 0, __FILE__, __LINE__);
- return -1;
- }
- }
- if (set) {
-- if (!X509_VERIFY_PARAM_set_flags(store->param, set)) {
-+ if (!X509_VERIFY_PARAM_set_flags(param, set)) {
- _setSSLError(NULL, 0, __FILE__, __LINE__);
- return -1;
- }
-@@ -2789,8 +2869,8 @@ static PyObject *
- /*[clinic end generated code: output=9480bc1c380e2095 input=7cf9ac673cbee6fc]*/
- {
- PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
-- pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback;
-- void *orig_passwd_userdata = self->ctx->default_passwd_callback_userdata;
-+ pem_password_cb *orig_passwd_cb = SSL_CTX_get_default_passwd_cb(self->ctx);
-+ void *orig_passwd_userdata = SSL_CTX_get_default_passwd_cb_userdata(self->ctx);
- _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
- int r;
-
-@@ -2917,8 +2997,9 @@ static int
- cert = d2i_X509_bio(biobuf, NULL);
- } else {
- cert = PEM_read_bio_X509(biobuf, NULL,
-- self->ctx->default_passwd_callback,
--
self->ctx->default_passwd_callback_userdata);
-+ SSL_CTX_get_default_passwd_cb(self->ctx),
-+
SSL_CTX_get_default_passwd_cb_userdata(self->ctx)
-+ );
- }
- if (cert == NULL) {
- break;
-@@ -3444,25 +3525,24 @@ static PyObject *
- /*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
- {
- X509_STORE *store;
-+ STACK_OF(X509_OBJECT) *objs;
- X509_OBJECT *obj;
-- int x509 = 0, crl = 0, pkey = 0, ca = 0, i;
-+ int x509 = 0, crl = 0, ca = 0, i;
-
- store = SSL_CTX_get_cert_store(self->ctx);
-- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
-- obj = sk_X509_OBJECT_value(store->objs, i);
-- switch (obj->type) {
-+ objs = X509_STORE_get0_objects(store);
-+ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
-+ obj = sk_X509_OBJECT_value(objs, i);
-+ switch (X509_OBJECT_get_type(obj)) {
- case X509_LU_X509:
- x509++;
-- if (X509_check_ca(obj->data.x509)) {
-+ if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
- ca++;
- }
- break;
- case X509_LU_CRL:
- crl++;
- break;
-- case X509_LU_PKEY:
-- pkey++;
-- break;
- default:
- /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
- * As far as I can tell they are internal states and never
-@@ -3492,6 +3572,7 @@ static PyObject *
- /*[clinic end generated code: output=0d58f148f37e2938 input=6887b5a09b7f9076]*/
- {
- X509_STORE *store;
-+ STACK_OF(X509_OBJECT) *objs;
- PyObject *ci = NULL, *rlist = NULL;
- int i;
-
-@@ -3500,17 +3581,18 @@ static PyObject *
- }
-
- store = SSL_CTX_get_cert_store(self->ctx);
-- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
-+ objs = X509_STORE_get0_objects(store);
-+ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
- X509_OBJECT *obj;
- X509 *cert;
-
-- obj = sk_X509_OBJECT_value(store->objs, i);
-- if (obj->type != X509_LU_X509) {
-+ obj = sk_X509_OBJECT_value(objs, i);
-+ if (X509_OBJECT_get_type(obj) != X509_LU_X509) {
- /* not a x509 cert */
- continue;
- }
- /* CA for any purpose */
-- cert = obj->data.x509;
-+ cert = X509_OBJECT_get0_X509(obj);
- if (!X509_check_ca(cert)) {
- continue;
- }
-@@ -4374,10 +4456,12 @@ static PyMethodDef PySSL_methods[] = {
- };
-
-
--#ifdef WITH_THREAD
-+#ifdef HAVE_OPENSSL_CRYPTO_LOCK
-
- /* an implementation of OpenSSL threading operations in terms
-- of the Python C thread library */
-+ * of the Python C thread library
-+ * Only used up to 1.0.2. OpenSSL 1.1.0+ has its own locking code.
-+ */
-
- static PyThread_type_lock *_ssl_locks = NULL;
-
-@@ -4458,7 +4542,7 @@ static int _setup_ssl_threads(void) {
- return 1;
- }
-
--#endif /* def HAVE_THREAD */
-+#endif /* HAVE_OPENSSL_CRYPTO_LOCK for WITH_THREAD && OpenSSL < 1.1.0 */
-
- PyDoc_STRVAR(module_doc,
- "Implementation module for SSL socket operations. See the socket module\n\
-@@ -4527,11 +4611,16 @@ PyInit__ssl(void)
- SSL_load_error_strings();
- SSL_library_init();
- #ifdef WITH_THREAD
-+#ifdef HAVE_OPENSSL_CRYPTO_LOCK
- /* note that this will start threading if not already started */
- if (!_setup_ssl_threads()) {
- return NULL;
- }
-+#elif OPENSSL_VERSION_1_1 && defined(OPENSSL_THREADS)
-+ /* OpenSSL 1.1.0 builtin thread support is enabled */
-+ _ssl_locks_count++;
- #endif
-+#endif /* WITH_THREAD */
- OpenSSL_add_all_algorithms();
-
- /* Add symbols to module dict */
-@@ -4678,7 +4767,9 @@ PyInit__ssl(void)
- PY_SSL_VERSION_SSL3);
- #endif
- PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
-- PY_SSL_VERSION_SSL23);
-+ PY_SSL_VERSION_TLS);
-+ PyModule_AddIntConstant(m, "PROTOCOL_TLS",
-+ PY_SSL_VERSION_TLS);
- PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
- PY_SSL_VERSION_TLS1);
- #if HAVE_TLSv1_2
-
-diff --git a/Modules/_ssl.c b/Modules/_ssl.c
---- a/Modules/_ssl.c
-+++ b/Modules/_ssl.c
-@@ -151,11 +151,6 @@ static int COMP_get_type(const COMP_METH
- {
- return meth->type;
- }
--
--static const char *COMP_get_name(const COMP_METHOD *meth)
--{
-- return meth->name;
--}
- #endif
-
- static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
-@@ -1644,7 +1639,7 @@ static PyObject *
- comp_method = SSL_get_current_compression(self->ssl);
- if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
- Py_RETURN_NONE;
-- short_name = COMP_get_name(comp_method);
-+ short_name = OBJ_nid2sn(COMP_get_type(comp_method));
- if (short_name == NULL)
- Py_RETURN_NONE;
- return PyUnicode_DecodeFSDefault(short_name);
diff --git a/python3.spec b/python3.spec
index 6f2a462..b0d8d7a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -395,20 +395,6 @@ Patch205: 00205-make-libpl-respect-lib64.patch
# by debian but fedora infra uses only eabi without hf
Patch206: 00206-remove-hf-from-arm-triplet.patch
-# 00209 #
-# Fix test breakage with version 2.2.0 of Expat
-# rhbz#1353918:
https://bugzilla.redhat.com/show_bug.cgi?id=1353918
-# FIXED UPSTREAM:
http://bugs.python.org/issue27369
-Patch209: 00209-fix-test-pyexpat-failure.patch
-
-# 00242 #
-# HTTPoxy attack (CVE-2016-1000110)
-#
https://httpoxy.org/
-# FIXED UPSTREAM:
http://bugs.python.org/issue27568
-# Based on a patch by Rmi Rampin
-# Resolves: rhbz#1359177
-Patch242: 00242-CVE-2016-1000110-httpoxy.patch
-
# 00243 #
# Fix the triplet used on 64-bit MIPS
# rhbz#1322526:
https://bugzilla.redhat.com/show_bug.cgi?id=1322526
@@ -416,13 +402,6 @@ Patch242: 00242-CVE-2016-1000110-httpoxy.patch
# Fedora needs the default mips64-linux-gnu
Patch243: 00243-fix-mips64-triplet.patch
-# 00247 #
-# Port ssl and hashlib modules to OpenSSL 1.1.0.
-# As of F26, OpenSSL is rebased to 1.1.0, so in order for python
-# to not FTBFS we need to backport this patch from 3.5.3
-# FIXED UPSTREAM:
https://bugs.python.org/issue26470
-Patch247: 00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
-
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -641,13 +620,13 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch111 -p1
%patch132 -p1
%patch137 -p1
-%patch143 -p1 -b .tsc-on-ppc
+#patch143 -p1 -b .tsc-on-ppc
#patch146 -p1
%patch155 -p1
%patch157 -p1
%patch160 -p1
%patch163 -p1
-%patch170 -p0
+%patch170 -p1
%patch178 -p1
%patch180 -p1
%patch184 -p1
@@ -660,10 +639,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch205 -p1
%patch206 -p1
-%patch209 -p1
-%patch242 -p1
%patch243 -p1
-%patch247 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit 95f9e1aed8e2178708b8f15101b508c801a7a8c1
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Sep 29 15:41:39 2016 +0200
Python now uses by default the system libffi, on linux systems (upstream issue26661
and issue27979)
diff --git a/python3.spec b/python3.spec
index ba67522..6f2a462 100644
--- a/python3.spec
+++ b/python3.spec
@@ -604,11 +604,6 @@ cp -a %{SOURCE7} .
# Remove embedded copy of expat:
rm -r Modules/expat || exit 1
-# Remove embedded copy of libffi:
-for SUBDIR in darwin libffi libffi_arm_wince libffi_msvc libffi_osx ; do
- rm -r Modules/_ctypes/$SUBDIR || exit 1 ;
-done
-
# Remove embedded copy of zlib:
rm -r Modules/zlib || exit 1
commit e9db5d378a51b7c26ba7e334a3de3bc2f2c29868
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Sep 29 15:21:37 2016 +0200
Disable system-tap as it is now implemented upstream in a different way (upstream
issue21590)
diff --git a/python3.spec b/python3.spec
index 573d936..ba67522 100644
--- a/python3.spec
+++ b/python3.spec
@@ -71,7 +71,7 @@
%global with_gdb_hooks 1
-%global with_systemtap 1
+%global with_systemtap 0
# some arches don't have valgrind so we need to disable its support on them
%ifnarch s390 %{mips} riscv64
commit b6897674bed3f4f85fd86ac0d70830df618e80af
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Sep 27 21:06:04 2016 +0200
Update to 3.6.0 first beta.
Rename the macros.pybytecompile3.5 file to macros.pybytecompile3.6.
Rename all the respective sections in the SPEC file for python 3.6.
diff --git a/macros.pybytecompile3.5 b/macros.pybytecompile3.5
deleted file mode 100644
index 96d1826..0000000
--- a/macros.pybytecompile3.5
+++ /dev/null
@@ -1,10 +0,0 @@
-# Note that the path could itself be a python file, or a directory
-
-# Python's compile_all module only works on directories, and requires a max
-# recursion depth
-
-%py_byte_compile()\
-python_binary="%1"\
-bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]], optimize=opt) for opt in range(2) for
f in sys.argv[1:]]' || :\
-%{nil}
diff --git a/macros.pybytecompile3.6 b/macros.pybytecompile3.6
new file mode 100644
index 0000000..96d1826
--- /dev/null
+++ b/macros.pybytecompile3.6
@@ -0,0 +1,10 @@
+# Note that the path could itself be a python file, or a directory
+
+# Python's compile_all module only works on directories, and requires a max
+# recursion depth
+
+%py_byte_compile()\
+python_binary="%1"\
+bytecode_compilation_path="%2"\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]], optimize=opt) for opt in range(2) for
f in sys.argv[1:]]' || :\
+%{nil}
diff --git a/python3.spec b/python3.spec
index 999f24a..573d936 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,7 +2,7 @@
# Conditionals and other variables controlling the build
# ======================================================
-# NOTES ON BOOTSTRAPING PYTHON 3.5:
+# NOTES ON BOOTSTRAPING PYTHON 3.6:
#
# Due to dependency cycle between Python, pip, setuptools and
# wheel caused by the rewheel patch, one has to build in the
@@ -14,12 +14,15 @@
# 4) python3-setuptools and python3-pip with with_rewheel set to 1
# 5) python3 with with_rewheel set to 1
+# First beta prerelease
+%global prerel b1
+
%global with_rewheel 1
-%global pybasever 3.5
+%global pybasever 3.6
# pybasever without the dot:
-%global pyshortver 35
+%global pyshortver 36
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -51,7 +54,7 @@
# now has bytecode at:
# foo/__pycache__/bar.cpython-35.pyc
# foo/__pycache__/bar.cpython-35.pyo
-%global bytecode_suffixes .cpython-35*.py?
+%global bytecode_suffixes .cpython-36*.py?
# Python's configure script defines SOVERSION, and this is used in the Makefile
# to determine INSTSONAME, the name of the libpython DSO:
@@ -111,8 +114,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.2
-Release: 7%{?dist}
+Version: %{pybasever}.0
+Release: 0.1.%{?prerel}%{?dist}
License: Python
Group: Development/Languages
commit 8398dc4b6b7c1e96ba28f9297e0ed58618e107e9
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Sep 27 21:02:29 2016 +0200
Update source URL to point to 3.6.0 beta1
diff --git a/python3.spec b/python3.spec
index de1f5e3..999f24a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -180,7 +180,7 @@ BuildRequires: python3-pip
# Source code and patches
# =======================
-Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
+Source:
https://www.python.org/ftp/python/3.6.0/Python-3.6.0b1.tar.xz
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
commit ddb16c68d95603cc11233c520544adf92c3741fe
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Dec 5 13:46:29 2016 +0100
Rebuild for pip version 9.0.1
diff --git a/python3.spec b/python3.spec
index 863c1fc..de1f5e3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -623,7 +623,7 @@ rm -r Modules/zlib || exit 1
#done
%if 0%{with_rewheel}
-%global pip_version 8.1.2
+%global pip_version 9.0.1
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
%endif
@@ -1577,6 +1577,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Dec 05 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-7
+- Set to work with pip version 9.0.1
+
* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
- Use proper patch numbering and base upstream branch for
porting ssl and hashlib modules to OpenSSL 1.1.0
commit f7bd058f3c36e9e60e0fc65516a817153c8c597a
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Wed Oct 12 16:52:17 2016 +0200
Port ssl and hashlib modules to OpenSSL 1.1.0 and drop hashlib patch
diff --git a/00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
b/00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
new file mode 100644
index 0000000..5760d67
--- /dev/null
+++ b/00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
@@ -0,0 +1,1314 @@
+
+# HG changeset patch
+# User Christian Heimes <christian(a)python.org>
+# Date 1473110345 -7200
+# Node ID 5c75b315152b714f7c84258ea511b461e2c06154
+# Parent 82467d0dbaea31a7971d1429ca5f4a251a995f33
+Issue #26470: Port ssl and hashlib module to OpenSSL 1.1.0.
+
+diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
+--- a/Doc/library/ssl.rst
++++ b/Doc/library/ssl.rst
+@@ -178,7 +178,7 @@ instead.
+ use. Typically, the server chooses a particular protocol version, and the
+ client must adapt to the server's choice. Most of the versions are not
+ interoperable with the other versions. If not specified, the default is
+- :data:`PROTOCOL_SSLv23`; it provides the most compatibility with other
++ :data:`PROTOCOL_TLS`; it provides the most compatibility with other
+ versions.
+
+ Here's a table showing which versions in a client (down the side) can connect
+@@ -187,11 +187,11 @@ instead.
+ .. table::
+
+ ======================== ========= ========= ========== =========
=========== ===========
+- *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
**TLSv1.1** **TLSv1.2**
++ *client* / **server** **SSLv2** **SSLv3** **TLS** **TLSv1**
**TLSv1.1** **TLSv1.2**
+ ------------------------ --------- --------- ---------- ---------
----------- -----------
+ *SSLv2* yes no yes no no
no
+ *SSLv3* no yes yes no no
no
+- *SSLv23* no yes yes yes yes
yes
++ *TLS* (*SSLv23*) no yes yes yes yes
yes
+ *TLSv1* no no yes yes no
no
+ *TLSv1.1* no no yes no yes
no
+ *TLSv1.2* no no yes no no
yes
+@@ -244,7 +244,7 @@ purposes.
+ :const:`None`, this function can choose to trust the system's default
+ CA certificates instead.
+
+- The settings are: :data:`PROTOCOL_SSLv23`, :data:`OP_NO_SSLv2`, and
++ The settings are: :data:`PROTOCOL_TLS`, :data:`OP_NO_SSLv2`, and
+ :data:`OP_NO_SSLv3` with high encryption cipher suites without RC4 and
+ without unauthenticated cipher suites. Passing :data:`~Purpose.SERVER_AUTH`
+ as *purpose* sets :data:`~SSLContext.verify_mode` to :data:`CERT_REQUIRED`
+@@ -316,6 +316,11 @@ Random generation
+
+ .. versionadded:: 3.3
+
++ .. deprecated:: 3.5.3
++
++ OpenSSL has deprecated :func:`ssl.RAND_pseudo_bytes`, use
++ :func:`ssl.RAND_bytes` instead.
++
+ .. function:: RAND_status()
+
+ Return ``True`` if the SSL pseudo-random number generator has been seeded
+@@ -334,7 +339,7 @@ Random generation
+ See
http://egd.sourceforge.net/ or
http://prngd.sourceforge.net/ for sources
+ of entropy-gathering daemons.
+
+- Availability: not available with LibreSSL.
++ Availability: not available with LibreSSL and OpenSSL > 1.1.0
+
+ .. function:: RAND_add(bytes, entropy)
+
+@@ -409,7 +414,7 @@ Certificate handling
+ previously. Return an integer (no fractions of a second in the
+ input format)
+
+-.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None)
++.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None)
+
+ Given the address ``addr`` of an SSL-protected server, as a (*hostname*,
+ *port-number*) pair, fetches the server's certificate, and returns it as a
+@@ -425,7 +430,7 @@ Certificate handling
+
+ .. versionchanged:: 3.5
+ The default *ssl_version* is changed from :data:`PROTOCOL_SSLv3` to
+- :data:`PROTOCOL_SSLv23` for maximum compatibility with modern servers.
++ :data:`PROTOCOL_TLS` for maximum compatibility with modern servers.
+
+ .. function:: DER_cert_to_PEM_cert(DER_cert_bytes)
+
+@@ -451,6 +456,9 @@ Certificate handling
+ * :attr:`openssl_capath_env` - OpenSSL's environment key that points to a
capath,
+ * :attr:`openssl_capath` - hard coded path to a capath directory
+
++ Availability: LibreSSL ignores the environment vars
++ :attr:`openssl_cafile_env` and :attr:`openssl_capath_env`
++
+ .. versionadded:: 3.4
+
+ .. function:: enum_certificates(store_name)
+@@ -568,11 +576,21 @@ Constants
+
+ .. versionadded:: 3.4.4
+
+-.. data:: PROTOCOL_SSLv23
++.. data:: PROTOCOL_TLS
+
+ Selects the highest protocol version that both the client and server support.
+ Despite the name, this option can select "TLS" protocols as well as
"SSL".
+
++ .. versionadded:: 3.5.3
++
++.. data:: PROTOCOL_SSLv23
++
++ Alias for data:`PROTOCOL_TLS`.
++
++ .. deprecated:: 3.5.3
++
++ Use data:`PROTOCOL_TLS` instead.
++
+ .. data:: PROTOCOL_SSLv2
+
+ Selects SSL version 2 as the channel encryption protocol.
+@@ -584,6 +602,10 @@ Constants
+
+ SSL version 2 is insecure. Its use is highly discouraged.
+
++ .. deprecated:: 3.5.3
++
++ OpenSSL has removed support for SSLv2.
++
+ .. data:: PROTOCOL_SSLv3
+
+ Selects SSL version 3 as the channel encryption protocol.
+@@ -595,10 +617,20 @@ Constants
+
+ SSL version 3 is insecure. Its use is highly discouraged.
+
++ .. deprecated:: 3.5.3
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: PROTOCOL_TLSv1
+
+ Selects TLS version 1.0 as the channel encryption protocol.
+
++ .. deprecated:: 3.5.3
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: PROTOCOL_TLSv1_1
+
+ Selects TLS version 1.1 as the channel encryption protocol.
+@@ -606,6 +638,11 @@ Constants
+
+ .. versionadded:: 3.4
+
++ .. deprecated:: 3.5.3
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: PROTOCOL_TLSv1_2
+
+ Selects TLS version 1.2 as the channel encryption protocol. This is the
+@@ -614,6 +651,11 @@ Constants
+
+ .. versionadded:: 3.4
+
++ .. deprecated:: 3.5.3
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: OP_ALL
+
+ Enables workarounds for various bugs present in other SSL implementations.
+@@ -625,23 +667,32 @@ Constants
+ .. data:: OP_NO_SSLv2
+
+ Prevents an SSLv2 connection. This option is only applicable in
+- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
++ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
+ choosing SSLv2 as the protocol version.
+
+ .. versionadded:: 3.2
+
++ .. deprecated:: 3.5.3
++
++ SSLv2 is deprecated
++
++
+ .. data:: OP_NO_SSLv3
+
+ Prevents an SSLv3 connection. This option is only applicable in
+- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
++ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
+ choosing SSLv3 as the protocol version.
+
+ .. versionadded:: 3.2
+
++ .. deprecated:: 3.5.3
++
++ SSLv3 is deprecated
++
+ .. data:: OP_NO_TLSv1
+
+ Prevents a TLSv1 connection. This option is only applicable in
+- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
++ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
+ choosing TLSv1 as the protocol version.
+
+ .. versionadded:: 3.2
+@@ -649,7 +700,7 @@ Constants
+ .. data:: OP_NO_TLSv1_1
+
+ Prevents a TLSv1.1 connection. This option is only applicable in conjunction
+- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.1 as
++ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.1 as
+ the protocol version. Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
+@@ -657,7 +708,7 @@ Constants
+ .. data:: OP_NO_TLSv1_2
+
+ Prevents a TLSv1.2 connection. This option is only applicable in conjunction
+- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.2 as
++ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.2 as
+ the protocol version. Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
+@@ -1081,17 +1132,21 @@ such as SSL configuration options, certi
+ It also manages a cache of SSL sessions for server-side sockets, in order
+ to speed up repeated connections from the same clients.
+
+-.. class:: SSLContext(protocol)
+-
+- Create a new SSL context. You must pass *protocol* which must be one
++.. class:: SSLContext(protocol=PROTOCOL_TLS)
++
++ Create a new SSL context. You may pass *protocol* which must be one
+ of the ``PROTOCOL_*`` constants defined in this module.
+- :data:`PROTOCOL_SSLv23` is currently recommended for maximum
+- interoperability.
++ :data:`PROTOCOL_TLS` is currently recommended for maximum
++ interoperability and default value.
+
+ .. seealso::
+ :func:`create_default_context` lets the :mod:`ssl` module choose
+ security settings for a given purpose.
+
++ .. versionchanged:: 3.5.3
++
++ :data:`PROTOCOL_TLS` is the default value.
++
+
+ :class:`SSLContext` objects have the following methods and attributes:
+
+@@ -1232,6 +1287,9 @@ to speed up repeated connections from th
+ This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is
+ False.
+
++ OpenSSL 1.1.0+ will abort the handshake and raise :exc:`SSLError` when
++ both sides support ALPN but cannot agree on a protocol.
++
+ .. versionadded:: 3.5
+
+ .. method:: SSLContext.set_npn_protocols(protocols)
+@@ -1598,7 +1656,7 @@ If you prefer to tune security settings
+ a context from scratch (but beware that you might not get the settings
+ right)::
+
+- >>> context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
++ >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS)
+ >>> context.verify_mode = ssl.CERT_REQUIRED
+ >>> context.check_hostname = True
+ >>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
+@@ -1999,15 +2057,17 @@ Protocol versions
+
+ SSL versions 2 and 3 are considered insecure and are therefore dangerous to
+ use. If you want maximum compatibility between clients and servers, it is
+-recommended to use :const:`PROTOCOL_SSLv23` as the protocol version and then
++recommended to use :const:`PROTOCOL_TLS` as the protocol version and then
+ disable SSLv2 and SSLv3 explicitly using the :data:`SSLContext.options`
+ attribute::
+
+- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
++ context = ssl.SSLContext(ssl.PROTOCOL_TLS)
+ context.options |= ssl.OP_NO_SSLv2
+ context.options |= ssl.OP_NO_SSLv3
+-
+-The SSL context created above will only allow TLSv1 and later (if
++ context.options |= ssl.OP_NO_TLSv1
++ context.options |= ssl.OP_NO_TLSv1_1
++
++The SSL context created above will only allow TLSv1.2 and later (if
+ supported by your system) connections.
+
+ Cipher selection
+diff --git a/Lib/ssl.py b/Lib/ssl.py
+--- a/Lib/ssl.py
++++ b/Lib/ssl.py
+@@ -51,6 +51,7 @@ The following constants identify various
+ PROTOCOL_SSLv2
+ PROTOCOL_SSLv3
+ PROTOCOL_SSLv23
++PROTOCOL_TLS
+ PROTOCOL_TLSv1
+ PROTOCOL_TLSv1_1
+ PROTOCOL_TLSv1_2
+@@ -128,9 +129,10 @@ from _ssl import _OPENSSL_API_VERSION
+
+ _IntEnum._convert(
+ '_SSLMethod', __name__,
+- lambda name: name.startswith('PROTOCOL_'),
++ lambda name: name.startswith('PROTOCOL_') and name !=
'PROTOCOL_SSLv23',
+ source=_ssl)
+
++PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_TLS
+ _PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
+
+ try:
+@@ -357,13 +359,13 @@ class SSLContext(_SSLContext):
+ __slots__ = ('protocol', '__weakref__')
+ _windows_cert_stores = ("CA", "ROOT")
+
+- def __new__(cls, protocol, *args, **kwargs):
++ def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
+ self = _SSLContext.__new__(cls, protocol)
+ if protocol != _SSLv2_IF_EXISTS:
+ self.set_ciphers(_DEFAULT_CIPHERS)
+ return self
+
+- def __init__(self, protocol):
++ def __init__(self, protocol=PROTOCOL_TLS):
+ self.protocol = protocol
+
+ def wrap_socket(self, sock, server_side=False,
+@@ -438,7 +440,7 @@ def create_default_context(purpose=Purpo
+ if not isinstance(purpose, _ASN1Object):
+ raise TypeError(purpose)
+
+- context = SSLContext(PROTOCOL_SSLv23)
++ context = SSLContext(PROTOCOL_TLS)
+
+ # SSLv2 considered harmful.
+ context.options |= OP_NO_SSLv2
+@@ -475,7 +477,7 @@ def create_default_context(purpose=Purpo
+ context.load_default_certs(purpose)
+ return context
+
+-def _create_unverified_context(protocol=PROTOCOL_SSLv23, *, cert_reqs=None,
++def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=None,
+ check_hostname=False, purpose=Purpose.SERVER_AUTH,
+ certfile=None, keyfile=None,
+ cafile=None, capath=None, cadata=None):
+@@ -666,7 +668,7 @@ class SSLSocket(socket):
+
+ def __init__(self, sock=None, keyfile=None, certfile=None,
+ server_side=False, cert_reqs=CERT_NONE,
+- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
++ ssl_version=PROTOCOL_TLS, ca_certs=None,
+ do_handshake_on_connect=True,
+ family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
+ suppress_ragged_eofs=True, npn_protocols=None, ciphers=None,
+@@ -1056,7 +1058,7 @@ class SSLSocket(socket):
+
+ def wrap_socket(sock, keyfile=None, certfile=None,
+ server_side=False, cert_reqs=CERT_NONE,
+- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
++ ssl_version=PROTOCOL_TLS, ca_certs=None,
+ do_handshake_on_connect=True,
+ suppress_ragged_eofs=True,
+ ciphers=None):
+@@ -1125,7 +1127,7 @@ def PEM_cert_to_DER_cert(pem_cert_string
+ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
+ return base64.decodebytes(d.encode('ASCII', 'strict'))
+
+-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None):
++def get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None):
+ """Retrieve the certificate from the server at the specified
address,
+ and return it as a PEM-encoded string.
+ If 'ca_certs' is specified, validate the server cert against it.
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -23,6 +23,9 @@ ssl = support.import_module("ssl")
+
+ PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
+ HOST = support.HOST
++IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
++IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
++
+
+ def data_file(*name):
+ return os.path.join(os.path.dirname(__file__), *name)
+@@ -143,8 +146,8 @@ class BasicSocketTests(unittest.TestCase
+ def test_str_for_enums(self):
+ # Make sure that the PROTOCOL_* constants have enum-like string
+ # reprs.
+- proto = ssl.PROTOCOL_SSLv23
+- self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_SSLv23')
++ proto = ssl.PROTOCOL_TLS
++ self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_TLS')
+ ctx = ssl.SSLContext(proto)
+ self.assertIs(ctx.protocol, proto)
+
+@@ -312,8 +315,8 @@ class BasicSocketTests(unittest.TestCase
+ self.assertGreaterEqual(status, 0)
+ self.assertLessEqual(status, 15)
+ # Version string as returned by {Open,Libre}SSL, the format might change
+- if "LibreSSL" in s:
+- self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major,
minor)),
++ if IS_LIBRESSL:
++ self.assertTrue(s.startswith("LibreSSL {:d}".format(major)),
+ (s, t, hex(n)))
+ else:
+ self.assertTrue(s.startswith("OpenSSL
{:d}.{:d}.{:d}".format(major, minor, fix)),
+@@ -790,7 +793,8 @@ class ContextTests(unittest.TestCase):
+ def test_constructor(self):
+ for protocol in PROTOCOLS:
+ ssl.SSLContext(protocol)
+- self.assertRaises(TypeError, ssl.SSLContext)
++ ctx = ssl.SSLContext()
++ self.assertEqual(ctx.protocol, ssl.PROTOCOL_TLS)
+ self.assertRaises(ValueError, ssl.SSLContext, -1)
+ self.assertRaises(ValueError, ssl.SSLContext, 42)
+
+@@ -811,15 +815,15 @@ class ContextTests(unittest.TestCase):
+ def test_options(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
+- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
+- ctx.options)
++ default = (ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3)
++ if not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0):
++ default |= ssl.OP_NO_COMPRESSION
++ self.assertEqual(default, ctx.options)
+ ctx.options |= ssl.OP_NO_TLSv1
+- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 |
ssl.OP_NO_TLSv1,
+- ctx.options)
++ self.assertEqual(default | ssl.OP_NO_TLSv1, ctx.options)
+ if can_clear_options():
+- ctx.options = (ctx.options & ~ssl.OP_NO_SSLv2) | ssl.OP_NO_TLSv1
+- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_TLSv1 | ssl.OP_NO_SSLv3,
+- ctx.options)
++ ctx.options = (ctx.options & ~ssl.OP_NO_TLSv1)
++ self.assertEqual(default, ctx.options)
+ ctx.options = 0
+ # Ubuntu has OP_NO_SSLv3 forced on by default
+ self.assertEqual(0, ctx.options & ~ssl.OP_NO_SSLv3)
+@@ -1155,6 +1159,7 @@ class ContextTests(unittest.TestCase):
+ self.assertRaises(TypeError, ctx.load_default_certs, 'SERVER_AUTH')
+
+ @unittest.skipIf(sys.platform == "win32", "not-Windows
specific")
++ @unittest.skipIf(IS_LIBRESSL, "LibreSSL doesn't support env vars")
+ def test_load_default_certs_env(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ with support.EnvironmentVarGuard() as env:
+@@ -1750,13 +1755,13 @@ class NetworkedBIOTests(unittest.TestCas
+ sslobj = ctx.wrap_bio(incoming, outgoing, False, REMOTE_HOST)
+ self.assertIs(sslobj._sslobj.owner, sslobj)
+ self.assertIsNone(sslobj.cipher())
+- self.assertIsNone(sslobj.shared_ciphers())
++ self.assertIsNotNone(sslobj.shared_ciphers())
+ self.assertRaises(ValueError, sslobj.getpeercert)
+ if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
+ self.assertIsNone(sslobj.get_channel_binding('tls-unique'))
+ self.ssl_io_loop(sock, incoming, outgoing, sslobj.do_handshake)
+ self.assertTrue(sslobj.cipher())
+- self.assertIsNone(sslobj.shared_ciphers())
++ self.assertIsNotNone(sslobj.shared_ciphers())
+ self.assertTrue(sslobj.getpeercert())
+ if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
+ self.assertTrue(sslobj.get_channel_binding('tls-unique'))
+@@ -2993,7 +2998,7 @@ else:
+ with context.wrap_socket(socket.socket()) as s:
+ self.assertIs(s.version(), None)
+ s.connect((HOST, server.port))
+- self.assertEqual(s.version(), "TLSv1")
++ self.assertEqual(s.version(), 'TLSv1')
+ self.assertIs(s.version(), None)
+
+ @unittest.skipUnless(ssl.HAS_ECDH, "test requires ECDH-enabled
OpenSSL")
+@@ -3135,24 +3140,36 @@ else:
+ (['http/3.0', 'http/4.0'], None)
+ ]
+ for client_protocols, expected in protocol_tests:
+- server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
++ server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
+ server_context.load_cert_chain(CERTFILE)
+ server_context.set_alpn_protocols(server_protocols)
+- client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
++ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
+ client_context.load_cert_chain(CERTFILE)
+ client_context.set_alpn_protocols(client_protocols)
+- stats = server_params_test(client_context, server_context,
+- chatty=True, connectionchatty=True)
+-
+- msg = "failed trying %s (s) and %s (c).\n" \
+- "was expecting %s, but got %%s from the %%s" \
+- % (str(server_protocols), str(client_protocols),
+- str(expected))
+- client_result = stats['client_alpn_protocol']
+- self.assertEqual(client_result, expected, msg % (client_result,
"client"))
+- server_result = stats['server_alpn_protocols'][-1] \
+- if len(stats['server_alpn_protocols']) else
'nothing'
+- self.assertEqual(server_result, expected, msg % (server_result,
"server"))
++
++ try:
++ stats = server_params_test(client_context,
++ server_context,
++ chatty=True,
++ connectionchatty=True)
++ except ssl.SSLError as e:
++ stats = e
++
++ if expected is None and IS_OPENSSL_1_1:
++ # OpenSSL 1.1.0 raises handshake error
++ self.assertIsInstance(stats, ssl.SSLError)
++ else:
++ msg = "failed trying %s (s) and %s (c).\n" \
++ "was expecting %s, but got %%s from the %%s" \
++ % (str(server_protocols), str(client_protocols),
++ str(expected))
++ client_result = stats['client_alpn_protocol']
++ self.assertEqual(client_result, expected,
++ msg % (client_result, "client"))
++ server_result = stats['server_alpn_protocols'][-1] \
++ if len(stats['server_alpn_protocols']) else
'nothing'
++ self.assertEqual(server_result, expected,
++ msg % (server_result, "server"))
+
+ def test_selected_npn_protocol(self):
+ # selected_npn_protocol() is None unless NPN is used
+@@ -3300,13 +3317,23 @@ else:
+ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ client_context.verify_mode = ssl.CERT_REQUIRED
+ client_context.load_verify_locations(SIGNING_CA)
+- client_context.set_ciphers("RC4")
+- server_context.set_ciphers("AES:RC4")
++ if ssl.OPENSSL_VERSION_INFO >= (1, 0, 2):
++ client_context.set_ciphers("AES128:AES256")
++ server_context.set_ciphers("AES256")
++ alg1 = "AES256"
++ alg2 = "AES-256"
++ else:
++ client_context.set_ciphers("AES:3DES")
++ server_context.set_ciphers("3DES")
++ alg1 = "3DES"
++ alg2 = "DES-CBC3"
++
+ stats = server_params_test(client_context, server_context)
+ ciphers = stats['server_shared_ciphers'][0]
+ self.assertGreater(len(ciphers), 0)
+ for name, tls_version, bits in ciphers:
+- self.assertIn("RC4", name.split("-"))
++ if not alg1 in name.split("-") and alg2 not in name:
++ self.fail(name)
+
+ def test_read_write_after_close_raises_valuerror(self):
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+
+diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
+--- a/Modules/_hashopenssl.c
++++ b/Modules/_hashopenssl.c
+@@ -21,7 +21,6 @@
+
+ /* EVP is the preferred interface to hashing in OpenSSL */
+ #include <openssl/evp.h>
+-#include <openssl/hmac.h>
+ /* We use the object interface to discover what hashes OpenSSL supports. */
+ #include <openssl/objects.h>
+ #include "openssl/err.h"
+@@ -32,11 +31,22 @@
+ #define HASH_OBJ_CONSTRUCTOR 0
+ #endif
+
++#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER)
++/* OpenSSL < 1.1.0 */
++#define EVP_MD_CTX_new EVP_MD_CTX_create
++#define EVP_MD_CTX_free EVP_MD_CTX_destroy
++#define HAS_FAST_PKCS5_PBKDF2_HMAC 0
++#include <openssl/hmac.h>
++#else
++/* OpenSSL >= 1.1.0 */
++#define HAS_FAST_PKCS5_PBKDF2_HMAC 1
++#endif
++
+
+ typedef struct {
+ PyObject_HEAD
+ PyObject *name; /* name of this hash algorithm */
+- EVP_MD_CTX ctx; /* OpenSSL message digest context */
++ EVP_MD_CTX *ctx; /* OpenSSL message digest context */
+ #ifdef WITH_THREAD
+ PyThread_type_lock lock; /* OpenSSL context lock */
+ #endif
+@@ -48,7 +58,6 @@ static PyTypeObject EVPtype;
+
+ #define DEFINE_CONSTS_FOR_NEW(Name) \
+ static PyObject *CONST_ ## Name ## _name_obj = NULL; \
+- static EVP_MD_CTX CONST_new_ ## Name ## _ctx; \
+ static EVP_MD_CTX *CONST_new_ ## Name ## _ctx_p = NULL;
+
+ DEFINE_CONSTS_FOR_NEW(md5)
+@@ -59,19 +68,57 @@ DEFINE_CONSTS_FOR_NEW(sha384)
+ DEFINE_CONSTS_FOR_NEW(sha512)
+
+
++/* LCOV_EXCL_START */
++static PyObject *
++_setException(PyObject *exc)
++{
++ unsigned long errcode;
++ const char *lib, *func, *reason;
++
++ errcode = ERR_peek_last_error();
++ if (!errcode) {
++ PyErr_SetString(exc, "unknown reasons");
++ return NULL;
++ }
++ ERR_clear_error();
++
++ lib = ERR_lib_error_string(errcode);
++ func = ERR_func_error_string(errcode);
++ reason = ERR_reason_error_string(errcode);
++
++ if (lib && func) {
++ PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
++ }
++ else if (lib) {
++ PyErr_Format(exc, "[%s] %s", lib, reason);
++ }
++ else {
++ PyErr_SetString(exc, reason);
++ }
++ return NULL;
++}
++/* LCOV_EXCL_STOP */
++
+ static EVPobject *
+ newEVPobject(PyObject *name)
+ {
+ EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, &EVPtype);
++ if (retval == NULL) {
++ return NULL;
++ }
++
++ retval->ctx = EVP_MD_CTX_new();
++ if (retval->ctx == NULL) {
++ PyErr_NoMemory();
++ return NULL;
++ }
+
+ /* save the name for .name to return */
+- if (retval != NULL) {
+- Py_INCREF(name);
+- retval->name = name;
++ Py_INCREF(name);
++ retval->name = name;
+ #ifdef WITH_THREAD
+- retval->lock = NULL;
++ retval->lock = NULL;
+ #endif
+- }
+
+ return retval;
+ }
+@@ -86,7 +133,7 @@ EVP_hash(EVPobject *self, const void *vp
+ process = MUNCH_SIZE;
+ else
+ process = Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int);
+- EVP_DigestUpdate(&self->ctx, (const void*)cp, process);
++ EVP_DigestUpdate(self->ctx, (const void*)cp, process);
+ len -= process;
+ cp += process;
+ }
+@@ -101,16 +148,19 @@ EVP_dealloc(EVPobject *self)
+ if (self->lock != NULL)
+ PyThread_free_lock(self->lock);
+ #endif
+- EVP_MD_CTX_cleanup(&self->ctx);
++ EVP_MD_CTX_free(self->ctx);
+ Py_XDECREF(self->name);
+ PyObject_Del(self);
+ }
+
+-static void locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
++static int
++locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
+ {
++ int result;
+ ENTER_HASHLIB(self);
+- EVP_MD_CTX_copy(new_ctx_p, &self->ctx);
++ result = EVP_MD_CTX_copy(new_ctx_p, self->ctx);
+ LEAVE_HASHLIB(self);
++ return result;
+ }
+
+ /* External methods for a hash object */
+@@ -126,7 +176,9 @@ EVP_copy(EVPobject *self, PyObject *unus
+ if ( (newobj = newEVPobject(self->name))==NULL)
+ return NULL;
+
+- locked_EVP_MD_CTX_copy(&newobj->ctx, self);
++ if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) {
++ return _setException(PyExc_ValueError);
++ }
+ return (PyObject *)newobj;
+ }
+
+@@ -137,16 +189,24 @@ static PyObject *
+ EVP_digest(EVPobject *self, PyObject *unused)
+ {
+ unsigned char digest[EVP_MAX_MD_SIZE];
+- EVP_MD_CTX temp_ctx;
++ EVP_MD_CTX *temp_ctx;
+ PyObject *retval;
+ unsigned int digest_size;
+
+- locked_EVP_MD_CTX_copy(&temp_ctx, self);
+- digest_size = EVP_MD_CTX_size(&temp_ctx);
+- EVP_DigestFinal(&temp_ctx, digest, NULL);
++ temp_ctx = EVP_MD_CTX_new();
++ if (temp_ctx == NULL) {
++ PyErr_NoMemory();
++ return NULL;
++ }
++
++ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
++ return _setException(PyExc_ValueError);
++ }
++ digest_size = EVP_MD_CTX_size(temp_ctx);
++ EVP_DigestFinal(temp_ctx, digest, NULL);
+
+ retval = PyBytes_FromStringAndSize((const char *)digest, digest_size);
+- EVP_MD_CTX_cleanup(&temp_ctx);
++ EVP_MD_CTX_free(temp_ctx);
+ return retval;
+ }
+
+@@ -157,15 +217,23 @@ static PyObject *
+ EVP_hexdigest(EVPobject *self, PyObject *unused)
+ {
+ unsigned char digest[EVP_MAX_MD_SIZE];
+- EVP_MD_CTX temp_ctx;
++ EVP_MD_CTX *temp_ctx;
+ unsigned int digest_size;
+
++ temp_ctx = EVP_MD_CTX_new();
++ if (temp_ctx == NULL) {
++ PyErr_NoMemory();
++ return NULL;
++ }
++
+ /* Get the raw (binary) digest value */
+- locked_EVP_MD_CTX_copy(&temp_ctx, self);
+- digest_size = EVP_MD_CTX_size(&temp_ctx);
+- EVP_DigestFinal(&temp_ctx, digest, NULL);
++ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
++ return _setException(PyExc_ValueError);
++ }
++ digest_size = EVP_MD_CTX_size(temp_ctx);
++ EVP_DigestFinal(temp_ctx, digest, NULL);
+
+- EVP_MD_CTX_cleanup(&temp_ctx);
++ EVP_MD_CTX_free(temp_ctx);
+
+ return _Py_strhex((const char *)digest, digest_size);
+ }
+@@ -219,7 +287,7 @@ static PyObject *
+ EVP_get_block_size(EVPobject *self, void *closure)
+ {
+ long block_size;
+- block_size = EVP_MD_CTX_block_size(&self->ctx);
++ block_size = EVP_MD_CTX_block_size(self->ctx);
+ return PyLong_FromLong(block_size);
+ }
+
+@@ -227,7 +295,7 @@ static PyObject *
+ EVP_get_digest_size(EVPobject *self, void *closure)
+ {
+ long size;
+- size = EVP_MD_CTX_size(&self->ctx);
++ size = EVP_MD_CTX_size(self->ctx);
+ return PyLong_FromLong(size);
+ }
+
+@@ -288,7 +356,7 @@ EVP_tp_init(EVPobject *self, PyObject *a
+ PyBuffer_Release(&view);
+ return -1;
+ }
+- EVP_DigestInit(&self->ctx, digest);
++ EVP_DigestInit(self->ctx, digest);
+
+ self->name = name_obj;
+ Py_INCREF(self->name);
+@@ -385,9 +453,9 @@ EVPnew(PyObject *name_obj,
+ return NULL;
+
+ if (initial_ctx) {
+- EVP_MD_CTX_copy(&self->ctx, initial_ctx);
++ EVP_MD_CTX_copy(self->ctx, initial_ctx);
+ } else {
+- EVP_DigestInit(&self->ctx, digest);
++ EVP_DigestInit(self->ctx, digest);
+ }
+
+ if (cp && len) {
+@@ -453,6 +521,7 @@ EVP_new(PyObject *self, PyObject *args,
+
+ #define PY_PBKDF2_HMAC 1
+
++#if !HAS_FAST_PKCS5_PBKDF2_HMAC
+ /* Improved implementation of PKCS5_PBKDF2_HMAC()
+ *
+ * PKCS5_PBKDF2_HMAC_fast() hashes the password exactly one time instead of
+@@ -534,37 +603,8 @@ PKCS5_PBKDF2_HMAC_fast(const char *pass,
+ HMAC_CTX_cleanup(&hctx_tpl);
+ return 1;
+ }
++#endif
+
+-/* LCOV_EXCL_START */
+-static PyObject *
+-_setException(PyObject *exc)
+-{
+- unsigned long errcode;
+- const char *lib, *func, *reason;
+-
+- errcode = ERR_peek_last_error();
+- if (!errcode) {
+- PyErr_SetString(exc, "unknown reasons");
+- return NULL;
+- }
+- ERR_clear_error();
+-
+- lib = ERR_lib_error_string(errcode);
+- func = ERR_func_error_string(errcode);
+- reason = ERR_reason_error_string(errcode);
+-
+- if (lib && func) {
+- PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
+- }
+- else if (lib) {
+- PyErr_Format(exc, "[%s] %s", lib, reason);
+- }
+- else {
+- PyErr_SetString(exc, reason);
+- }
+- return NULL;
+-}
+-/* LCOV_EXCL_STOP */
+
+ PyDoc_STRVAR(pbkdf2_hmac__doc__,
+ "pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\
+@@ -646,10 +686,17 @@ pbkdf2_hmac(PyObject *self, PyObject *ar
+ key = PyBytes_AS_STRING(key_obj);
+
+ Py_BEGIN_ALLOW_THREADS
++#if HAS_FAST_PKCS5_PBKDF2_HMAC
++ retval = PKCS5_PBKDF2_HMAC((char*)password.buf, (int)password.len,
++ (unsigned char *)salt.buf, (int)salt.len,
++ iterations, digest, dklen,
++ (unsigned char *)key);
++#else
+ retval = PKCS5_PBKDF2_HMAC_fast((char*)password.buf, (int)password.len,
+ (unsigned char *)salt.buf, (int)salt.len,
+ iterations, digest, dklen,
+ (unsigned char *)key);
++#endif
+ Py_END_ALLOW_THREADS
+
+ if (!retval) {
+@@ -768,7 +815,7 @@ generate_hash_name_list(void)
+ if (CONST_ ## NAME ## _name_obj == NULL) { \
+ CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
+ if (EVP_get_digestbyname(#NAME)) { \
+- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
++ CONST_new_ ## NAME ## _ctx_p = EVP_MD_CTX_new(); \
+ EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME));
\
+ } \
+ } \
+diff --git a/Modules/_ssl.c b/Modules/_ssl.c
+--- a/Modules/_ssl.c
++++ b/Modules/_ssl.c
+@@ -55,6 +55,14 @@ static PySocketModule_APIObject PySocket
+ #include <sys/poll.h>
+ #endif
+
++/* Don't warn about deprecated functions */
++#ifdef __GNUC__
++#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
++#endif
++#ifdef __clang__
++#pragma clang diagnostic ignored "-Wdeprecated-declarations"
++#endif
++
+ /* Include OpenSSL header files */
+ #include "openssl/rsa.h"
+ #include "openssl/crypto.h"
+@@ -91,6 +99,10 @@ struct py_ssl_library_code {
+ /* Include generated data (error codes) */
+ #include "_ssl_data.h"
+
++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) &&
!defined(LIBRESSL_VERSION_NUMBER)
++# define OPENSSL_VERSION_1_1 1
++#endif
++
+ /* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
+
http://www.openssl.org/news/changelog.html
+ */
+@@ -117,6 +129,72 @@ struct py_ssl_library_code {
+ # define HAVE_ALPN
+ #endif
+
++#ifdef OPENSSL_VERSION_1_1
++/* OpenSSL 1.1.0+ */
++#ifndef OPENSSL_NO_SSL2
++#define OPENSSL_NO_SSL2
++#endif
++#else /* OpenSSL < 1.1.0 */
++#if defined(WITH_THREAD)
++#define HAVE_OPENSSL_CRYPTO_LOCK
++#endif
++
++#define TLS_method SSLv23_method
++
++static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
++{
++ return ne->set;
++}
++
++#ifndef OPENSSL_NO_COMP
++static int COMP_get_type(const COMP_METHOD *meth)
++{
++ return meth->type;
++}
++
++static const char *COMP_get_name(const COMP_METHOD *meth)
++{
++ return meth->name;
++}
++#endif
++
++static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
++{
++ return ctx->default_passwd_callback;
++}
++
++static void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx)
++{
++ return ctx->default_passwd_callback_userdata;
++}
++
++static int X509_OBJECT_get_type(X509_OBJECT *x)
++{
++ return x->type;
++}
++
++static X509 *X509_OBJECT_get0_X509(X509_OBJECT *x)
++{
++ return x->data.x509;
++}
++
++static int BIO_up_ref(BIO *b)
++{
++ CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO);
++ return 1;
++}
++
++static STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) {
++ return store->objs;
++}
++
++static X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *store)
++{
++ return store->param;
++}
++#endif /* OpenSSL < 1.1.0 or LibreSSL */
++
++
+ enum py_ssl_error {
+ /* these mirror ssl.h */
+ PY_SSL_ERROR_NONE,
+@@ -147,7 +225,7 @@ enum py_ssl_cert_requirements {
+ enum py_ssl_version {
+ PY_SSL_VERSION_SSL2,
+ PY_SSL_VERSION_SSL3=1,
+- PY_SSL_VERSION_SSL23,
++ PY_SSL_VERSION_TLS,
+ #if HAVE_TLSv1_2
+ PY_SSL_VERSION_TLS1,
+ PY_SSL_VERSION_TLS1_1,
+@@ -527,8 +605,8 @@ newPySSLSocket(PySSLContext *sslctx, PyS
+ /* BIOs are reference counted and SSL_set_bio borrows our reference.
+ * To prevent a double free in memory_bio_dealloc() we need to take an
+ * extra reference here. */
+- CRYPTO_add(&inbio->bio->references, 1, CRYPTO_LOCK_BIO);
+- CRYPTO_add(&outbio->bio->references, 1, CRYPTO_LOCK_BIO);
++ BIO_up_ref(inbio->bio);
++ BIO_up_ref(outbio->bio);
+ SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
+ }
+ mode = SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;
+@@ -738,7 +816,7 @@ static PyObject *
+
+ /* check to see if we've gotten to a new RDN */
+ if (rdn_level >= 0) {
+- if (rdn_level != entry->set) {
++ if (rdn_level != X509_NAME_ENTRY_set(entry)) {
+ /* yes, new RDN */
+ /* add old RDN to DN */
+ rdnt = PyList_AsTuple(rdn);
+@@ -755,7 +833,7 @@ static PyObject *
+ goto fail0;
+ }
+ }
+- rdn_level = entry->set;
++ rdn_level = X509_NAME_ENTRY_set(entry);
+
+ /* now add this attribute to the current RDN */
+ name = X509_NAME_ENTRY_get_object(entry);
+@@ -853,18 +931,18 @@ static PyObject *
+ goto fail;
+ }
+
+- p = ext->value->data;
++ p = X509_EXTENSION_get_data(ext)->data;
+ if (method->it)
+ names = (GENERAL_NAMES*)
+ (ASN1_item_d2i(NULL,
+ &p,
+- ext->value->length,
++ X509_EXTENSION_get_data(ext)->length,
+ ASN1_ITEM_ptr(method->it)));
+ else
+ names = (GENERAL_NAMES*)
+ (method->d2i(NULL,
+ &p,
+- ext->value->length));
++ X509_EXTENSION_get_data(ext)->length));
+
+ for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
+ /* get a rendering of each name in the set of names */
+@@ -1075,13 +1153,11 @@ static PyObject *
+ int i, j;
+ PyObject *lst, *res = NULL;
+
+-#if OPENSSL_VERSION_NUMBER < 0x10001000L
+- dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
+-#else
++#if OPENSSL_VERSION_NUMBER >= 0x10001000L
+ /* Calls x509v3_cache_extensions and sets up crldp */
+ X509_check_ca(certificate);
+- dps = certificate->crldp;
+ #endif
++ dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
+
+ if (dps == NULL)
+ return Py_None;
+@@ -1451,14 +1527,13 @@ static PyObject *
+ _ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
+ /*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
+ {
+- SSL_SESSION *sess = SSL_get_session(self->ssl);
+ STACK_OF(SSL_CIPHER) *ciphers;
+ int i;
+ PyObject *res;
+
+- if (!sess || !sess->ciphers)
++ ciphers = SSL_get_ciphers(self->ssl);
++ if (!ciphers)
+ Py_RETURN_NONE;
+- ciphers = sess->ciphers;
+ res = PyList_New(sk_SSL_CIPHER_num(ciphers));
+ if (!res)
+ return NULL;
+@@ -1567,9 +1642,9 @@ static PyObject *
+ if (self->ssl == NULL)
+ Py_RETURN_NONE;
+ comp_method = SSL_get_current_compression(self->ssl);
+- if (comp_method == NULL || comp_method->type == NID_undef)
++ if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
+ Py_RETURN_NONE;
+- short_name = OBJ_nid2sn(comp_method->type);
++ short_name = COMP_get_name(comp_method);
+ if (short_name == NULL)
+ Py_RETURN_NONE;
+ return PyUnicode_DecodeFSDefault(short_name);
+@@ -2255,8 +2330,8 @@ static PyObject *
+ else if (proto_version == PY_SSL_VERSION_SSL2)
+ ctx = SSL_CTX_new(SSLv2_method());
+ #endif
+- else if (proto_version == PY_SSL_VERSION_SSL23)
+- ctx = SSL_CTX_new(SSLv23_method());
++ else if (proto_version == PY_SSL_VERSION_TLS)
++ ctx = SSL_CTX_new(TLS_method());
+ else
+ proto_version = -1;
+ PySSL_END_ALLOW_THREADS
+@@ -2318,8 +2393,9 @@ static PyObject *
+ #ifndef OPENSSL_NO_ECDH
+ /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use
+ prime256v1 by default. This is Apache mod_ssl's initialization
+- policy, so we should be safe. */
+-#if defined(SSL_CTX_set_ecdh_auto)
++ policy, so we should be safe. OpenSSL 1.1 has it enabled by default.
++ */
++#if defined(SSL_CTX_set_ecdh_auto) && !defined(OPENSSL_VERSION_1_1)
+ SSL_CTX_set_ecdh_auto(self->ctx, 1);
+ #else
+ {
+@@ -2586,10 +2662,12 @@ static PyObject *
+ get_verify_flags(PySSLContext *self, void *c)
+ {
+ X509_STORE *store;
++ X509_VERIFY_PARAM *param;
+ unsigned long flags;
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+- flags = X509_VERIFY_PARAM_get_flags(store->param);
++ param = X509_STORE_get0_param(store);
++ flags = X509_VERIFY_PARAM_get_flags(param);
+ return PyLong_FromUnsignedLong(flags);
+ }
+
+@@ -2597,22 +2675,24 @@ static int
+ set_verify_flags(PySSLContext *self, PyObject *arg, void *c)
+ {
+ X509_STORE *store;
++ X509_VERIFY_PARAM *param;
+ unsigned long new_flags, flags, set, clear;
+
+ if (!PyArg_Parse(arg, "k", &new_flags))
+ return -1;
+ store = SSL_CTX_get_cert_store(self->ctx);
+- flags = X509_VERIFY_PARAM_get_flags(store->param);
++ param = X509_STORE_get0_param(store);
++ flags = X509_VERIFY_PARAM_get_flags(param);
+ clear = flags & ~new_flags;
+ set = ~flags & new_flags;
+ if (clear) {
+- if (!X509_VERIFY_PARAM_clear_flags(store->param, clear)) {
++ if (!X509_VERIFY_PARAM_clear_flags(param, clear)) {
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ return -1;
+ }
+ }
+ if (set) {
+- if (!X509_VERIFY_PARAM_set_flags(store->param, set)) {
++ if (!X509_VERIFY_PARAM_set_flags(param, set)) {
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ return -1;
+ }
+@@ -2789,8 +2869,8 @@ static PyObject *
+ /*[clinic end generated code: output=9480bc1c380e2095 input=7cf9ac673cbee6fc]*/
+ {
+ PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
+- pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback;
+- void *orig_passwd_userdata = self->ctx->default_passwd_callback_userdata;
++ pem_password_cb *orig_passwd_cb = SSL_CTX_get_default_passwd_cb(self->ctx);
++ void *orig_passwd_userdata = SSL_CTX_get_default_passwd_cb_userdata(self->ctx);
+ _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
+ int r;
+
+@@ -2917,8 +2997,9 @@ static int
+ cert = d2i_X509_bio(biobuf, NULL);
+ } else {
+ cert = PEM_read_bio_X509(biobuf, NULL,
+- self->ctx->default_passwd_callback,
+-
self->ctx->default_passwd_callback_userdata);
++ SSL_CTX_get_default_passwd_cb(self->ctx),
++
SSL_CTX_get_default_passwd_cb_userdata(self->ctx)
++ );
+ }
+ if (cert == NULL) {
+ break;
+@@ -3444,25 +3525,24 @@ static PyObject *
+ /*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
+ {
+ X509_STORE *store;
++ STACK_OF(X509_OBJECT) *objs;
+ X509_OBJECT *obj;
+- int x509 = 0, crl = 0, pkey = 0, ca = 0, i;
++ int x509 = 0, crl = 0, ca = 0, i;
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
+- obj = sk_X509_OBJECT_value(store->objs, i);
+- switch (obj->type) {
++ objs = X509_STORE_get0_objects(store);
++ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
++ obj = sk_X509_OBJECT_value(objs, i);
++ switch (X509_OBJECT_get_type(obj)) {
+ case X509_LU_X509:
+ x509++;
+- if (X509_check_ca(obj->data.x509)) {
++ if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
+ ca++;
+ }
+ break;
+ case X509_LU_CRL:
+ crl++;
+ break;
+- case X509_LU_PKEY:
+- pkey++;
+- break;
+ default:
+ /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
+ * As far as I can tell they are internal states and never
+@@ -3492,6 +3572,7 @@ static PyObject *
+ /*[clinic end generated code: output=0d58f148f37e2938 input=6887b5a09b7f9076]*/
+ {
+ X509_STORE *store;
++ STACK_OF(X509_OBJECT) *objs;
+ PyObject *ci = NULL, *rlist = NULL;
+ int i;
+
+@@ -3500,17 +3581,18 @@ static PyObject *
+ }
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
++ objs = X509_STORE_get0_objects(store);
++ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
+ X509_OBJECT *obj;
+ X509 *cert;
+
+- obj = sk_X509_OBJECT_value(store->objs, i);
+- if (obj->type != X509_LU_X509) {
++ obj = sk_X509_OBJECT_value(objs, i);
++ if (X509_OBJECT_get_type(obj) != X509_LU_X509) {
+ /* not a x509 cert */
+ continue;
+ }
+ /* CA for any purpose */
+- cert = obj->data.x509;
++ cert = X509_OBJECT_get0_X509(obj);
+ if (!X509_check_ca(cert)) {
+ continue;
+ }
+@@ -4374,10 +4456,12 @@ static PyMethodDef PySSL_methods[] = {
+ };
+
+
+-#ifdef WITH_THREAD
++#ifdef HAVE_OPENSSL_CRYPTO_LOCK
+
+ /* an implementation of OpenSSL threading operations in terms
+- of the Python C thread library */
++ * of the Python C thread library
++ * Only used up to 1.0.2. OpenSSL 1.1.0+ has its own locking code.
++ */
+
+ static PyThread_type_lock *_ssl_locks = NULL;
+
+@@ -4458,7 +4542,7 @@ static int _setup_ssl_threads(void) {
+ return 1;
+ }
+
+-#endif /* def HAVE_THREAD */
++#endif /* HAVE_OPENSSL_CRYPTO_LOCK for WITH_THREAD && OpenSSL < 1.1.0 */
+
+ PyDoc_STRVAR(module_doc,
+ "Implementation module for SSL socket operations. See the socket module\n\
+@@ -4527,11 +4611,16 @@ PyInit__ssl(void)
+ SSL_load_error_strings();
+ SSL_library_init();
+ #ifdef WITH_THREAD
++#ifdef HAVE_OPENSSL_CRYPTO_LOCK
+ /* note that this will start threading if not already started */
+ if (!_setup_ssl_threads()) {
+ return NULL;
+ }
++#elif OPENSSL_VERSION_1_1 && defined(OPENSSL_THREADS)
++ /* OpenSSL 1.1.0 builtin thread support is enabled */
++ _ssl_locks_count++;
+ #endif
++#endif /* WITH_THREAD */
+ OpenSSL_add_all_algorithms();
+
+ /* Add symbols to module dict */
+@@ -4678,7 +4767,9 @@ PyInit__ssl(void)
+ PY_SSL_VERSION_SSL3);
+ #endif
+ PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
+- PY_SSL_VERSION_SSL23);
++ PY_SSL_VERSION_TLS);
++ PyModule_AddIntConstant(m, "PROTOCOL_TLS",
++ PY_SSL_VERSION_TLS);
+ PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
+ PY_SSL_VERSION_TLS1);
+ #if HAVE_TLSv1_2
+
+diff --git a/Modules/_ssl.c b/Modules/_ssl.c
+--- a/Modules/_ssl.c
++++ b/Modules/_ssl.c
+@@ -151,11 +151,6 @@ static int COMP_get_type(const COMP_METH
+ {
+ return meth->type;
+ }
+-
+-static const char *COMP_get_name(const COMP_METHOD *meth)
+-{
+- return meth->name;
+-}
+ #endif
+
+ static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
+@@ -1644,7 +1639,7 @@ static PyObject *
+ comp_method = SSL_get_current_compression(self->ssl);
+ if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
+ Py_RETURN_NONE;
+- short_name = COMP_get_name(comp_method);
++ short_name = OBJ_nid2sn(COMP_get_type(comp_method));
+ if (short_name == NULL)
+ Py_RETURN_NONE;
+ return PyUnicode_DecodeFSDefault(short_name);
diff --git a/Python-3.5.2-openssl11.patch b/Python-3.5.2-openssl11.patch
deleted file mode 100644
index bb9cf5d..0000000
--- a/Python-3.5.2-openssl11.patch
+++ /dev/null
@@ -1,1307 +0,0 @@
-diff -up Python-3.5.2/Doc/library/ssl.rst.openssl11 Python-3.5.2/Doc/library/ssl.rst
---- Python-3.5.2/Doc/library/ssl.rst.openssl11 2016-06-25 23:38:35.000000000 +0200
-+++ Python-3.5.2/Doc/library/ssl.rst 2016-10-10 16:34:37.695049119 +0200
-@@ -49,6 +49,12 @@ For more sophisticated applications, the
- helps manage settings and certificates, which can then be inherited
- by SSL sockets created through the :meth:`SSLContext.wrap_socket` method.
-
-+.. versionchanged:: 3.6
-+
-+ OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported.
-+ In the future the ssl module will require at least OpenSSL 1.0.2 or
-+ 1.1.0.
-+
-
- Functions, Constants, and Exceptions
- ------------------------------------
-@@ -178,7 +184,7 @@ instead.
- use. Typically, the server chooses a particular protocol version, and the
- client must adapt to the server's choice. Most of the versions are not
- interoperable with the other versions. If not specified, the default is
-- :data:`PROTOCOL_SSLv23`; it provides the most compatibility with other
-+ :data:`PROTOCOL_TLS`; it provides the most compatibility with other
- versions.
-
- Here's a table showing which versions in a client (down the side) can connect
-@@ -187,11 +193,11 @@ instead.
- .. table::
-
- ======================== ========= ========= ========== =========
=========== ===========
-- *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
**TLSv1.1** **TLSv1.2**
-+ *client* / **server** **SSLv2** **SSLv3** **TLS** **TLSv1**
**TLSv1.1** **TLSv1.2**
- ------------------------ --------- --------- ---------- ---------
----------- -----------
- *SSLv2* yes no yes no no
no
- *SSLv3* no yes yes no no
no
-- *SSLv23* no yes yes yes yes
yes
-+ *TLS* (*SSLv23*) no yes yes yes yes
yes
- *TLSv1* no no yes yes no
no
- *TLSv1.1* no no yes no yes
no
- *TLSv1.2* no no yes no no
yes
-@@ -244,7 +250,7 @@ purposes.
- :const:`None`, this function can choose to trust the system's default
- CA certificates instead.
-
-- The settings are: :data:`PROTOCOL_SSLv23`, :data:`OP_NO_SSLv2`, and
-+ The settings are: :data:`PROTOCOL_TLS`, :data:`OP_NO_SSLv2`, and
- :data:`OP_NO_SSLv3` with high encryption cipher suites without RC4 and
- without unauthenticated cipher suites. Passing :data:`~Purpose.SERVER_AUTH`
- as *purpose* sets :data:`~SSLContext.verify_mode` to :data:`CERT_REQUIRED`
-@@ -316,6 +322,11 @@ Random generation
-
- .. versionadded:: 3.3
-
-+ .. deprecated:: 3.6
-+
-+ OpenSSL has deprecated :func:`ssl.RAND_pseudo_bytes`, use
-+ :func:`ssl.RAND_bytes` instead.
-+
- .. function:: RAND_status()
-
- Return ``True`` if the SSL pseudo-random number generator has been seeded
-@@ -334,7 +345,7 @@ Random generation
- See
http://egd.sourceforge.net/ or
http://prngd.sourceforge.net/ for sources
- of entropy-gathering daemons.
-
-- Availability: not available with LibreSSL.
-+ Availability: not available with LibreSSL and OpenSSL > 1.1.0
-
- .. function:: RAND_add(bytes, entropy)
-
-@@ -409,7 +420,7 @@ Certificate handling
- previously. Return an integer (no fractions of a second in the
- input format)
-
--.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None)
-+.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None)
-
- Given the address ``addr`` of an SSL-protected server, as a (*hostname*,
- *port-number*) pair, fetches the server's certificate, and returns it as a
-@@ -425,7 +436,7 @@ Certificate handling
-
- .. versionchanged:: 3.5
- The default *ssl_version* is changed from :data:`PROTOCOL_SSLv3` to
-- :data:`PROTOCOL_SSLv23` for maximum compatibility with modern servers.
-+ :data:`PROTOCOL_TLS` for maximum compatibility with modern servers.
-
- .. function:: DER_cert_to_PEM_cert(DER_cert_bytes)
-
-@@ -451,6 +462,9 @@ Certificate handling
- * :attr:`openssl_capath_env` - OpenSSL's environment key that points to a
capath,
- * :attr:`openssl_capath` - hard coded path to a capath directory
-
-+ Availability: LibreSSL ignores the environment vars
-+ :attr:`openssl_cafile_env` and :attr:`openssl_capath_env`
-+
- .. versionadded:: 3.4
-
- .. function:: enum_certificates(store_name)
-@@ -568,11 +582,21 @@ Constants
-
- .. versionadded:: 3.4.4
-
--.. data:: PROTOCOL_SSLv23
-+.. data:: PROTOCOL_TLS
-
- Selects the highest protocol version that both the client and server support.
- Despite the name, this option can select "TLS" protocols as well as
"SSL".
-
-+ .. versionadded:: 3.6
-+
-+.. data:: PROTOCOL_SSLv23
-+
-+ Alias for data:`PROTOCOL_TLS`.
-+
-+ .. deprecated:: 3.6
-+
-+ Use data:`PROTOCOL_TLS` instead.
-+
- .. data:: PROTOCOL_SSLv2
-
- Selects SSL version 2 as the channel encryption protocol.
-@@ -584,6 +608,10 @@ Constants
-
- SSL version 2 is insecure. Its use is highly discouraged.
-
-+ .. deprecated:: 3.6
-+
-+ OpenSSL has removed support for SSLv2.
-+
- .. data:: PROTOCOL_SSLv3
-
- Selects SSL version 3 as the channel encryption protocol.
-@@ -595,10 +623,20 @@ Constants
-
- SSL version 3 is insecure. Its use is highly discouraged.
-
-+ .. deprecated:: 3.6
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: PROTOCOL_TLSv1
-
- Selects TLS version 1.0 as the channel encryption protocol.
-
-+ .. deprecated:: 3.6
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: PROTOCOL_TLSv1_1
-
- Selects TLS version 1.1 as the channel encryption protocol.
-@@ -606,6 +644,11 @@ Constants
-
- .. versionadded:: 3.4
-
-+ .. deprecated:: 3.6
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: PROTOCOL_TLSv1_2
-
- Selects TLS version 1.2 as the channel encryption protocol. This is the
-@@ -614,6 +657,11 @@ Constants
-
- .. versionadded:: 3.4
-
-+ .. deprecated:: 3.6
-+
-+ OpenSSL has deprecated all version specific protocols. Use the default
-+ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
-+
- .. data:: OP_ALL
-
- Enables workarounds for various bugs present in other SSL implementations.
-@@ -625,23 +673,32 @@ Constants
- .. data:: OP_NO_SSLv2
-
- Prevents an SSLv2 connection. This option is only applicable in
-- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
-+ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
- choosing SSLv2 as the protocol version.
-
- .. versionadded:: 3.2
-
-+ .. deprecated:: 3.6
-+
-+ SSLv2 is deprecated
-+
-+
- .. data:: OP_NO_SSLv3
-
- Prevents an SSLv3 connection. This option is only applicable in
-- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
-+ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
- choosing SSLv3 as the protocol version.
-
- .. versionadded:: 3.2
-
-+ .. deprecated:: 3.6
-+
-+ SSLv3 is deprecated
-+
- .. data:: OP_NO_TLSv1
-
- Prevents a TLSv1 connection. This option is only applicable in
-- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
-+ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
- choosing TLSv1 as the protocol version.
-
- .. versionadded:: 3.2
-@@ -649,7 +706,7 @@ Constants
- .. data:: OP_NO_TLSv1_1
-
- Prevents a TLSv1.1 connection. This option is only applicable in conjunction
-- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.1 as
-+ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.1 as
- the protocol version. Available only with openssl version 1.0.1+.
-
- .. versionadded:: 3.4
-@@ -657,7 +714,7 @@ Constants
- .. data:: OP_NO_TLSv1_2
-
- Prevents a TLSv1.2 connection. This option is only applicable in conjunction
-- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.2 as
-+ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.2 as
- the protocol version. Available only with openssl version 1.0.1+.
-
- .. versionadded:: 3.4
-@@ -1081,17 +1138,21 @@ such as SSL configuration options, certi
- It also manages a cache of SSL sessions for server-side sockets, in order
- to speed up repeated connections from the same clients.
-
--.. class:: SSLContext(protocol)
-+.. class:: SSLContext(protocol=PROTOCOL_TLS)
-
-- Create a new SSL context. You must pass *protocol* which must be one
-+ Create a new SSL context. You may pass *protocol* which must be one
- of the ``PROTOCOL_*`` constants defined in this module.
-- :data:`PROTOCOL_SSLv23` is currently recommended for maximum
-- interoperability.
-+ :data:`PROTOCOL_TLS` is currently recommended for maximum
-+ interoperability and default value.
-
- .. seealso::
- :func:`create_default_context` lets the :mod:`ssl` module choose
- security settings for a given purpose.
-
-+ .. versionchanged:: 3.6
-+
-+ :data:`PROTOCOL_TLS` is the default value.
-+
-
- :class:`SSLContext` objects have the following methods and attributes:
-
-@@ -1232,6 +1293,9 @@ to speed up repeated connections from th
- This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is
- False.
-
-+ OpenSSL 1.1.0+ will abort the handshake and raise :exc:`SSLError` when
-+ both sides support ALPN but cannot agree on a protocol.
-+
- .. versionadded:: 3.5
-
- .. method:: SSLContext.set_npn_protocols(protocols)
-@@ -1598,7 +1662,7 @@ If you prefer to tune security settings
- a context from scratch (but beware that you might not get the settings
- right)::
-
-- >>> context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
-+ >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS)
- >>> context.verify_mode = ssl.CERT_REQUIRED
- >>> context.check_hostname = True
- >>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
-@@ -1999,15 +2063,17 @@ Protocol versions
-
- SSL versions 2 and 3 are considered insecure and are therefore dangerous to
- use. If you want maximum compatibility between clients and servers, it is
--recommended to use :const:`PROTOCOL_SSLv23` as the protocol version and then
-+recommended to use :const:`PROTOCOL_TLS` as the protocol version and then
- disable SSLv2 and SSLv3 explicitly using the :data:`SSLContext.options`
- attribute::
-
-- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
-+ context = ssl.SSLContext(ssl.PROTOCOL_TLS)
- context.options |= ssl.OP_NO_SSLv2
- context.options |= ssl.OP_NO_SSLv3
-+ context.options |= ssl.OP_NO_TLSv1
-+ context.options |= ssl.OP_NO_TLSv1_1
-
--The SSL context created above will only allow TLSv1 and later (if
-+The SSL context created above will only allow TLSv1.2 and later (if
- supported by your system) connections.
-
- Cipher selection
-diff -up Python-3.5.2/Lib/ssl.py.openssl11 Python-3.5.2/Lib/ssl.py
---- Python-3.5.2/Lib/ssl.py.openssl11 2016-06-25 23:38:36.000000000 +0200
-+++ Python-3.5.2/Lib/ssl.py 2016-10-10 16:34:37.695049119 +0200
-@@ -51,6 +51,7 @@ The following constants identify various
- PROTOCOL_SSLv2
- PROTOCOL_SSLv3
- PROTOCOL_SSLv23
-+PROTOCOL_TLS
- PROTOCOL_TLSv1
- PROTOCOL_TLSv1_1
- PROTOCOL_TLSv1_2
-@@ -128,9 +129,10 @@ from _ssl import _OPENSSL_API_VERSION
-
- _IntEnum._convert(
- '_SSLMethod', __name__,
-- lambda name: name.startswith('PROTOCOL_'),
-+ lambda name: name.startswith('PROTOCOL_') and name !=
'PROTOCOL_SSLv23',
- source=_ssl)
-
-+PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_TLS
- _PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
-
- try:
-@@ -357,13 +359,13 @@ class SSLContext(_SSLContext):
- __slots__ = ('protocol', '__weakref__')
- _windows_cert_stores = ("CA", "ROOT")
-
-- def __new__(cls, protocol, *args, **kwargs):
-+ def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
- self = _SSLContext.__new__(cls, protocol)
- if protocol != _SSLv2_IF_EXISTS:
- self.set_ciphers(_DEFAULT_CIPHERS)
- return self
-
-- def __init__(self, protocol):
-+ def __init__(self, protocol=PROTOCOL_TLS):
- self.protocol = protocol
-
- def wrap_socket(self, sock, server_side=False,
-@@ -438,7 +440,7 @@ def create_default_context(purpose=Purpo
- if not isinstance(purpose, _ASN1Object):
- raise TypeError(purpose)
-
-- context = SSLContext(PROTOCOL_SSLv23)
-+ context = SSLContext(PROTOCOL_TLS)
-
- # SSLv2 considered harmful.
- context.options |= OP_NO_SSLv2
-@@ -475,7 +477,7 @@ def create_default_context(purpose=Purpo
- context.load_default_certs(purpose)
- return context
-
--def _create_unverified_context(protocol=PROTOCOL_SSLv23, *, cert_reqs=None,
-+def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=None,
- check_hostname=False, purpose=Purpose.SERVER_AUTH,
- certfile=None, keyfile=None,
- cafile=None, capath=None, cadata=None):
-@@ -666,7 +668,7 @@ class SSLSocket(socket):
-
- def __init__(self, sock=None, keyfile=None, certfile=None,
- server_side=False, cert_reqs=CERT_NONE,
-- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
-+ ssl_version=PROTOCOL_TLS, ca_certs=None,
- do_handshake_on_connect=True,
- family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
- suppress_ragged_eofs=True, npn_protocols=None, ciphers=None,
-@@ -1056,7 +1058,7 @@ class SSLSocket(socket):
-
- def wrap_socket(sock, keyfile=None, certfile=None,
- server_side=False, cert_reqs=CERT_NONE,
-- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
-+ ssl_version=PROTOCOL_TLS, ca_certs=None,
- do_handshake_on_connect=True,
- suppress_ragged_eofs=True,
- ciphers=None):
-@@ -1125,7 +1127,7 @@ def PEM_cert_to_DER_cert(pem_cert_string
- d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
- return base64.decodebytes(d.encode('ASCII', 'strict'))
-
--def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None):
-+def get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None):
- """Retrieve the certificate from the server at the specified
address,
- and return it as a PEM-encoded string.
- If 'ca_certs' is specified, validate the server cert against it.
-diff -up Python-3.5.2/Lib/test/test_ssl.py.openssl11 Python-3.5.2/Lib/test/test_ssl.py
---- Python-3.5.2/Lib/test/test_ssl.py.openssl11 2016-06-25 23:38:37.000000000 +0200
-+++ Python-3.5.2/Lib/test/test_ssl.py 2016-10-10 16:37:52.812573136 +0200
-@@ -23,6 +23,9 @@ ssl = support.import_module("ssl")
-
- PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
- HOST = support.HOST
-+IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
-+IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
-+
-
- def data_file(*name):
- return os.path.join(os.path.dirname(__file__), *name)
-@@ -143,8 +146,8 @@ class BasicSocketTests(unittest.TestCase
- def test_str_for_enums(self):
- # Make sure that the PROTOCOL_* constants have enum-like string
- # reprs.
-- proto = ssl.PROTOCOL_SSLv23
-- self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_SSLv23')
-+ proto = ssl.PROTOCOL_TLS
-+ self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_TLS')
- ctx = ssl.SSLContext(proto)
- self.assertIs(ctx.protocol, proto)
-
-@@ -312,8 +315,8 @@ class BasicSocketTests(unittest.TestCase
- self.assertGreaterEqual(status, 0)
- self.assertLessEqual(status, 15)
- # Version string as returned by {Open,Libre}SSL, the format might change
-- if "LibreSSL" in s:
-- self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major,
minor)),
-+ if IS_LIBRESSL:
-+ self.assertTrue(s.startswith("LibreSSL {:d}".format(major)),
- (s, t, hex(n)))
- else:
- self.assertTrue(s.startswith("OpenSSL
{:d}.{:d}.{:d}".format(major, minor, fix)),
-@@ -790,7 +793,8 @@ class ContextTests(unittest.TestCase):
- def test_constructor(self):
- for protocol in PROTOCOLS:
- ssl.SSLContext(protocol)
-- self.assertRaises(TypeError, ssl.SSLContext)
-+ ctx = ssl.SSLContext()
-+ self.assertEqual(ctx.protocol, ssl.PROTOCOL_TLS)
- self.assertRaises(ValueError, ssl.SSLContext, -1)
- self.assertRaises(ValueError, ssl.SSLContext, 42)
-
-@@ -811,15 +815,15 @@ class ContextTests(unittest.TestCase):
- def test_options(self):
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
- # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
-- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
-- ctx.options)
-+ default = (ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3)
-+ if not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0):
-+ default |= ssl.OP_NO_COMPRESSION
-+ self.assertEqual(default, ctx.options)
- ctx.options |= ssl.OP_NO_TLSv1
-- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 |
ssl.OP_NO_TLSv1,
-- ctx.options)
-+ self.assertEqual(default | ssl.OP_NO_TLSv1, ctx.options)
- if can_clear_options():
-- ctx.options = (ctx.options & ~ssl.OP_NO_SSLv2) | ssl.OP_NO_TLSv1
-- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_TLSv1 | ssl.OP_NO_SSLv3,
-- ctx.options)
-+ ctx.options = (ctx.options & ~ssl.OP_NO_TLSv1)
-+ self.assertEqual(default, ctx.options)
- ctx.options = 0
- # Ubuntu has OP_NO_SSLv3 forced on by default
- self.assertEqual(0, ctx.options & ~ssl.OP_NO_SSLv3)
-@@ -1155,6 +1159,7 @@ class ContextTests(unittest.TestCase):
- self.assertRaises(TypeError, ctx.load_default_certs, 'SERVER_AUTH')
-
- @unittest.skipIf(sys.platform == "win32", "not-Windows
specific")
-+ @unittest.skipIf(IS_LIBRESSL, "LibreSSL doesn't support env vars")
- def test_load_default_certs_env(self):
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
- with support.EnvironmentVarGuard() as env:
-@@ -1750,13 +1755,13 @@ class NetworkedBIOTests(unittest.TestCas
- sslobj = ctx.wrap_bio(incoming, outgoing, False, REMOTE_HOST)
- self.assertIs(sslobj._sslobj.owner, sslobj)
- self.assertIsNone(sslobj.cipher())
-- self.assertIsNone(sslobj.shared_ciphers())
-+ self.assertIsNotNone(sslobj.shared_ciphers())
- self.assertRaises(ValueError, sslobj.getpeercert)
- if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
- self.assertIsNone(sslobj.get_channel_binding('tls-unique'))
- self.ssl_io_loop(sock, incoming, outgoing, sslobj.do_handshake)
- self.assertTrue(sslobj.cipher())
-- self.assertIsNone(sslobj.shared_ciphers())
-+ self.assertIsNotNone(sslobj.shared_ciphers())
- self.assertTrue(sslobj.getpeercert())
- if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
- self.assertTrue(sslobj.get_channel_binding('tls-unique'))
-@@ -2980,7 +2985,7 @@ else:
- with context.wrap_socket(socket.socket()) as s:
- self.assertIs(s.version(), None)
- s.connect((HOST, server.port))
-- self.assertEqual(s.version(), "TLSv1")
-+ self.assertEqual(s.version(), 'TLSv1')
- self.assertIs(s.version(), None)
-
- @unittest.skipUnless(ssl.HAS_ECDH, "test requires ECDH-enabled
OpenSSL")
-@@ -3122,24 +3127,36 @@ else:
- (['http/3.0', 'http/4.0'], None)
- ]
- for client_protocols, expected in protocol_tests:
-- server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
-+ server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
- server_context.load_cert_chain(CERTFILE)
- server_context.set_alpn_protocols(server_protocols)
-- client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
-+ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
- client_context.load_cert_chain(CERTFILE)
- client_context.set_alpn_protocols(client_protocols)
-- stats = server_params_test(client_context, server_context,
-- chatty=True, connectionchatty=True)
-
-- msg = "failed trying %s (s) and %s (c).\n" \
-- "was expecting %s, but got %%s from the %%s" \
-- % (str(server_protocols), str(client_protocols),
-- str(expected))
-- client_result = stats['client_alpn_protocol']
-- self.assertEqual(client_result, expected, msg % (client_result,
"client"))
-- server_result = stats['server_alpn_protocols'][-1] \
-- if len(stats['server_alpn_protocols']) else
'nothing'
-- self.assertEqual(server_result, expected, msg % (server_result,
"server"))
-+ try:
-+ stats = server_params_test(client_context,
-+ server_context,
-+ chatty=True,
-+ connectionchatty=True)
-+ except ssl.SSLError as e:
-+ stats = e
-+
-+ if expected is None and IS_OPENSSL_1_1:
-+ # OpenSSL 1.1.0 raises handshake error
-+ self.assertIsInstance(stats, ssl.SSLError)
-+ else:
-+ msg = "failed trying %s (s) and %s (c).\n" \
-+ "was expecting %s, but got %%s from the %%s" \
-+ % (str(server_protocols), str(client_protocols),
-+ str(expected))
-+ client_result = stats['client_alpn_protocol']
-+ self.assertEqual(client_result, expected,
-+ msg % (client_result, "client"))
-+ server_result = stats['server_alpn_protocols'][-1] \
-+ if len(stats['server_alpn_protocols']) else
'nothing'
-+ self.assertEqual(server_result, expected,
-+ msg % (server_result, "server"))
-
- def test_selected_npn_protocol(self):
- # selected_npn_protocol() is None unless NPN is used
-@@ -3287,13 +3304,23 @@ else:
- client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
- client_context.verify_mode = ssl.CERT_REQUIRED
- client_context.load_verify_locations(SIGNING_CA)
-- client_context.set_ciphers("RC4")
-- server_context.set_ciphers("AES:RC4")
-+ if ssl.OPENSSL_VERSION_INFO >= (1, 0, 2):
-+ client_context.set_ciphers("AES128:AES256")
-+ server_context.set_ciphers("AES256")
-+ alg1 = "AES256"
-+ alg2 = "AES-256"
-+ else:
-+ client_context.set_ciphers("AES:3DES")
-+ server_context.set_ciphers("3DES")
-+ alg1 = "3DES"
-+ alg2 = "DES-CBC3"
-+
- stats = server_params_test(client_context, server_context)
- ciphers = stats['server_shared_ciphers'][0]
- self.assertGreater(len(ciphers), 0)
- for name, tls_version, bits in ciphers:
-- self.assertIn("RC4", name.split("-"))
-+ if not alg1 in name.split("-") and alg2 not in name:
-+ self.fail(name)
-
- def test_read_write_after_close_raises_valuerror(self):
- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
-diff -up Python-3.5.2/Modules/_hashopenssl.c.openssl11
Python-3.5.2/Modules/_hashopenssl.c
---- Python-3.5.2/Modules/_hashopenssl.c.openssl11 2016-10-10 16:34:15.460533587 +0200
-+++ Python-3.5.2/Modules/_hashopenssl.c 2016-10-10 17:07:28.883123976 +0200
-@@ -23,7 +23,6 @@
- #include <openssl/ssl.h>
- #include <openssl/err.h>
- #include <openssl/evp.h>
--#include <openssl/hmac.h>
- /* We use the object interface to discover what hashes OpenSSL supports. */
- #include <openssl/objects.h>
- #include "openssl/err.h"
-@@ -34,11 +33,22 @@
- #define HASH_OBJ_CONSTRUCTOR 0
- #endif
-
-+#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER)
-+/* OpenSSL < 1.1.0 */
-+#define EVP_MD_CTX_new EVP_MD_CTX_create
-+#define EVP_MD_CTX_free EVP_MD_CTX_destroy
-+#define HAS_FAST_PKCS5_PBKDF2_HMAC 0
-+#include <openssl/hmac.h>
-+#else
-+/* OpenSSL >= 1.1.0 */
-+#define HAS_FAST_PKCS5_PBKDF2_HMAC 1
-+#endif
-+
-
- typedef struct {
- PyObject_HEAD
- PyObject *name; /* name of this hash algorithm */
-- EVP_MD_CTX ctx; /* OpenSSL message digest context */
-+ EVP_MD_CTX *ctx; /* OpenSSL message digest context */
- #ifdef WITH_THREAD
- PyThread_type_lock lock; /* OpenSSL context lock */
- #endif
-@@ -51,9 +61,6 @@ static PyTypeObject EVPtype;
- We have one of these per algorithm */
- typedef struct {
- PyObject *name_obj;
-- EVP_MD_CTX ctxs[2];
-- /* ctx_ptrs will point to ctxs unless an error occurred, when it will
-- be NULL: */
- EVP_MD_CTX *ctx_ptrs[2];
- PyObject *error_msgs[2];
- } EVPCachedInfo;
-@@ -69,19 +76,57 @@ DEFINE_CONSTS_FOR_NEW(sha384)
- DEFINE_CONSTS_FOR_NEW(sha512)
-
-
-+/* LCOV_EXCL_START */
-+static PyObject *
-+_setException(PyObject *exc)
-+{
-+ unsigned long errcode;
-+ const char *lib, *func, *reason;
-+
-+ errcode = ERR_peek_last_error();
-+ if (!errcode) {
-+ PyErr_SetString(exc, "unknown reasons");
-+ return NULL;
-+ }
-+ ERR_clear_error();
-+
-+ lib = ERR_lib_error_string(errcode);
-+ func = ERR_func_error_string(errcode);
-+ reason = ERR_reason_error_string(errcode);
-+
-+ if (lib && func) {
-+ PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
-+ }
-+ else if (lib) {
-+ PyErr_Format(exc, "[%s] %s", lib, reason);
-+ }
-+ else {
-+ PyErr_SetString(exc, reason);
-+ }
-+ return NULL;
-+}
-+/* LCOV_EXCL_STOP */
-+
- static EVPobject *
- newEVPobject(PyObject *name)
- {
- EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, &EVPtype);
-+ if (retval == NULL) {
-+ return NULL;
-+ }
-+
-+ retval->ctx = EVP_MD_CTX_new();
-+ if (retval->ctx == NULL) {
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
-
- /* save the name for .name to return */
-- if (retval != NULL) {
-- Py_INCREF(name);
-- retval->name = name;
-+ Py_INCREF(name);
-+ retval->name = name;
- #ifdef WITH_THREAD
-- retval->lock = NULL;
-+ retval->lock = NULL;
- #endif
-- }
-
- return retval;
- }
-@@ -96,7 +141,7 @@ EVP_hash(EVPobject *self, const void *vp
- process = MUNCH_SIZE;
- else
- process = Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int);
-- EVP_DigestUpdate(&self->ctx, (const void*)cp, process);
-+ EVP_DigestUpdate(self->ctx, (const void*)cp, process);
- len -= process;
- cp += process;
- }
-@@ -153,16 +198,19 @@ EVP_dealloc(EVPobject *self)
- if (self->lock != NULL)
- PyThread_free_lock(self->lock);
- #endif
-- EVP_MD_CTX_cleanup(&self->ctx);
-+ EVP_MD_CTX_free(self->ctx);
- Py_XDECREF(self->name);
- PyObject_Del(self);
- }
-
--static void locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
-+static int
-+locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
- {
-+ int result;
- ENTER_HASHLIB(self);
-- EVP_MD_CTX_copy(new_ctx_p, &self->ctx);
-+ result = EVP_MD_CTX_copy(new_ctx_p, self->ctx);
- LEAVE_HASHLIB(self);
-+ return result;
- }
-
- /* External methods for a hash object */
-@@ -178,7 +226,9 @@ EVP_copy(EVPobject *self, PyObject *unus
- if ( (newobj = newEVPobject(self->name))==NULL)
- return NULL;
-
-- locked_EVP_MD_CTX_copy(&newobj->ctx, self);
-+ if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) {
-+ return _setException(PyExc_ValueError);
-+ }
- return (PyObject *)newobj;
- }
-
-@@ -189,16 +239,24 @@ static PyObject *
- EVP_digest(EVPobject *self, PyObject *unused)
- {
- unsigned char digest[EVP_MAX_MD_SIZE];
-- EVP_MD_CTX temp_ctx;
-+ EVP_MD_CTX *temp_ctx;
- PyObject *retval;
- unsigned int digest_size;
-
-- locked_EVP_MD_CTX_copy(&temp_ctx, self);
-- digest_size = EVP_MD_CTX_size(&temp_ctx);
-- EVP_DigestFinal(&temp_ctx, digest, NULL);
-+ temp_ctx = EVP_MD_CTX_new();
-+ if (temp_ctx == NULL) {
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
-+
-+ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
-+ return _setException(PyExc_ValueError);
-+ }
-+ digest_size = EVP_MD_CTX_size(temp_ctx);
-+ EVP_DigestFinal(temp_ctx, digest, NULL);
-
- retval = PyBytes_FromStringAndSize((const char *)digest, digest_size);
-- EVP_MD_CTX_cleanup(&temp_ctx);
-+ EVP_MD_CTX_free(temp_ctx);
- return retval;
- }
-
-@@ -209,15 +267,23 @@ static PyObject *
- EVP_hexdigest(EVPobject *self, PyObject *unused)
- {
- unsigned char digest[EVP_MAX_MD_SIZE];
-- EVP_MD_CTX temp_ctx;
-+ EVP_MD_CTX *temp_ctx;
- unsigned int digest_size;
-
-+ temp_ctx = EVP_MD_CTX_new();
-+ if (temp_ctx == NULL) {
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
-+
- /* Get the raw (binary) digest value */
-- locked_EVP_MD_CTX_copy(&temp_ctx, self);
-- digest_size = EVP_MD_CTX_size(&temp_ctx);
-- EVP_DigestFinal(&temp_ctx, digest, NULL);
-+ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
-+ return _setException(PyExc_ValueError);
-+ }
-+ digest_size = EVP_MD_CTX_size(temp_ctx);
-+ EVP_DigestFinal(temp_ctx, digest, NULL);
-
-- EVP_MD_CTX_cleanup(&temp_ctx);
-+ EVP_MD_CTX_free(temp_ctx);
-
- return _Py_strhex((const char *)digest, digest_size);
- }
-@@ -271,7 +337,7 @@ static PyObject *
- EVP_get_block_size(EVPobject *self, void *closure)
- {
- long block_size;
-- block_size = EVP_MD_CTX_block_size(&self->ctx);
-+ block_size = EVP_MD_CTX_block_size(self->ctx);
- return PyLong_FromLong(block_size);
- }
-
-@@ -279,7 +345,7 @@ static PyObject *
- EVP_get_digest_size(EVPobject *self, void *closure)
- {
- long size;
-- size = EVP_MD_CTX_size(&self->ctx);
-+ size = EVP_MD_CTX_size(self->ctx);
- return PyLong_FromLong(size);
- }
-
-@@ -341,8 +407,8 @@ EVP_tp_init(EVPobject *self, PyObject *a
- PyBuffer_Release(&view);
- return -1;
- }
-- mc_ctx_init(&self->ctx, usedforsecurity);
-- if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
-+ mc_ctx_init(self->ctx, usedforsecurity);
-+ if (!EVP_DigestInit_ex(self->ctx, digest, NULL)) {
- set_evp_exception();
- PyBuffer_Release(&view);
- return -1;
-@@ -444,10 +510,10 @@ EVPnew(PyObject *name_obj,
- return NULL;
-
- if (initial_ctx) {
-- EVP_MD_CTX_copy(&self->ctx, initial_ctx);
-+ EVP_MD_CTX_copy(self->ctx, initial_ctx);
- } else {
-- mc_ctx_init(&self->ctx, usedforsecurity);
-- if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
-+ mc_ctx_init(self->ctx, usedforsecurity);
-+ if (!EVP_DigestInit_ex(self->ctx, digest, NULL)) {
- set_evp_exception();
- Py_DECREF(self);
- return NULL;
-@@ -526,6 +592,7 @@ EVP_new(PyObject *self, PyObject *args,
-
- #define PY_PBKDF2_HMAC 1
-
-+#if !HAS_FAST_PKCS5_PBKDF2_HMAC
- /* Improved implementation of PKCS5_PBKDF2_HMAC()
- *
- * PKCS5_PBKDF2_HMAC_fast() hashes the password exactly one time instead of
-@@ -607,37 +674,8 @@ PKCS5_PBKDF2_HMAC_fast(const char *pass,
- HMAC_CTX_cleanup(&hctx_tpl);
- return 1;
- }
-+#endif
-
--/* LCOV_EXCL_START */
--static PyObject *
--_setException(PyObject *exc)
--{
-- unsigned long errcode;
-- const char *lib, *func, *reason;
--
-- errcode = ERR_peek_last_error();
-- if (!errcode) {
-- PyErr_SetString(exc, "unknown reasons");
-- return NULL;
-- }
-- ERR_clear_error();
--
-- lib = ERR_lib_error_string(errcode);
-- func = ERR_func_error_string(errcode);
-- reason = ERR_reason_error_string(errcode);
--
-- if (lib && func) {
-- PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
-- }
-- else if (lib) {
-- PyErr_Format(exc, "[%s] %s", lib, reason);
-- }
-- else {
-- PyErr_SetString(exc, reason);
-- }
-- return NULL;
--}
--/* LCOV_EXCL_STOP */
-
- PyDoc_STRVAR(pbkdf2_hmac__doc__,
- "pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\
-@@ -719,10 +757,17 @@ pbkdf2_hmac(PyObject *self, PyObject *ar
- key = PyBytes_AS_STRING(key_obj);
-
- Py_BEGIN_ALLOW_THREADS
-+#if HAS_FAST_PKCS5_PBKDF2_HMAC
-+ retval = PKCS5_PBKDF2_HMAC((char*)password.buf, (int)password.len,
-+ (unsigned char *)salt.buf, (int)salt.len,
-+ iterations, digest, dklen,
-+ (unsigned char *)key);
-+#else
- retval = PKCS5_PBKDF2_HMAC_fast((char*)password.buf, (int)password.len,
- (unsigned char *)salt.buf, (int)salt.len,
- iterations, digest, dklen,
- (unsigned char *)key);
-+#endif
- Py_END_ALLOW_THREADS
-
- if (!retval) {
-@@ -890,13 +935,15 @@ init_constructor_constant(EVPCachedInfo
- if (EVP_get_digestbyname(name)) {
- int i;
- for (i=0; i<2; i++) {
-- mc_ctx_init(&cached_info->ctxs[i], i);
-- if (EVP_DigestInit_ex(&cached_info->ctxs[i],
-+ cached_info->ctx_ptrs[i] = EVP_MD_CTX_new();
-+ if (cached_info->ctx_ptrs[i] == NULL)
-+ break;
-+ mc_ctx_init(cached_info->ctx_ptrs[i], i);
-+ if (EVP_DigestInit_ex(cached_info->ctx_ptrs[i],
- EVP_get_digestbyname(name), NULL)) {
-- /* Success: */
-- cached_info->ctx_ptrs[i] = &cached_info->ctxs[i];
- } else {
- /* Failure: */
-+ EVP_MD_CTX_free(cached_info->ctx_ptrs[i]);
- cached_info->ctx_ptrs[i] = NULL;
- cached_info->error_msgs[i] = error_msg_for_last_error();
- }
-diff -up Python-3.5.2/Modules/_ssl.c.openssl11 Python-3.5.2/Modules/_ssl.c
---- Python-3.5.2/Modules/_ssl.c.openssl11 2016-06-25 23:38:38.000000000 +0200
-+++ Python-3.5.2/Modules/_ssl.c 2016-10-10 16:34:37.699049212 +0200
-@@ -55,6 +55,14 @@ static PySocketModule_APIObject PySocket
- #include <sys/poll.h>
- #endif
-
-+/* Don't warn about deprecated functions */
-+#ifdef __GNUC__
-+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-+#endif
-+#ifdef __clang__
-+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-+#endif
-+
- /* Include OpenSSL header files */
- #include "openssl/rsa.h"
- #include "openssl/crypto.h"
-@@ -91,6 +99,10 @@ struct py_ssl_library_code {
- /* Include generated data (error codes) */
- #include "_ssl_data.h"
-
-+#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) &&
!defined(LIBRESSL_VERSION_NUMBER)
-+# define OPENSSL_VERSION_1_1 1
-+#endif
-+
- /* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
-
http://www.openssl.org/news/changelog.html
- */
-@@ -113,6 +125,72 @@ struct py_ssl_library_code {
- # define HAVE_ALPN
- #endif
-
-+#ifdef OPENSSL_VERSION_1_1
-+/* OpenSSL 1.1.0+ */
-+#ifndef OPENSSL_NO_SSL2
-+#define OPENSSL_NO_SSL2
-+#endif
-+#else /* OpenSSL < 1.1.0 */
-+#if defined(WITH_THREAD)
-+#define HAVE_OPENSSL_CRYPTO_LOCK
-+#endif
-+
-+#define TLS_method SSLv23_method
-+
-+static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
-+{
-+ return ne->set;
-+}
-+
-+#ifndef OPENSSL_NO_COMP
-+static int COMP_get_type(const COMP_METHOD *meth)
-+{
-+ return meth->type;
-+}
-+
-+static const char *COMP_get_name(const COMP_METHOD *meth)
-+{
-+ return meth->name;
-+}
-+#endif
-+
-+static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
-+{
-+ return ctx->default_passwd_callback;
-+}
-+
-+static void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx)
-+{
-+ return ctx->default_passwd_callback_userdata;
-+}
-+
-+static int X509_OBJECT_get_type(X509_OBJECT *x)
-+{
-+ return x->type;
-+}
-+
-+static X509 *X509_OBJECT_get0_X509(X509_OBJECT *x)
-+{
-+ return x->data.x509;
-+}
-+
-+static int BIO_up_ref(BIO *b)
-+{
-+ CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO);
-+ return 1;
-+}
-+
-+static STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) {
-+ return store->objs;
-+}
-+
-+static X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *store)
-+{
-+ return store->param;
-+}
-+#endif /* OpenSSL < 1.1.0 or LibreSSL */
-+
-+
- enum py_ssl_error {
- /* these mirror ssl.h */
- PY_SSL_ERROR_NONE,
-@@ -143,7 +221,7 @@ enum py_ssl_cert_requirements {
- enum py_ssl_version {
- PY_SSL_VERSION_SSL2,
- PY_SSL_VERSION_SSL3=1,
-- PY_SSL_VERSION_SSL23,
-+ PY_SSL_VERSION_TLS,
- #if HAVE_TLSv1_2
- PY_SSL_VERSION_TLS1,
- PY_SSL_VERSION_TLS1_1,
-@@ -524,8 +602,8 @@ newPySSLSocket(PySSLContext *sslctx, PyS
- /* BIOs are reference counted and SSL_set_bio borrows our reference.
- * To prevent a double free in memory_bio_dealloc() we need to take an
- * extra reference here. */
-- CRYPTO_add(&inbio->bio->references, 1, CRYPTO_LOCK_BIO);
-- CRYPTO_add(&outbio->bio->references, 1, CRYPTO_LOCK_BIO);
-+ BIO_up_ref(inbio->bio);
-+ BIO_up_ref(outbio->bio);
- SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
- }
- mode = SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;
-@@ -736,7 +814,7 @@ _create_tuple_for_X509_NAME (X509_NAME *
-
- /* check to see if we've gotten to a new RDN */
- if (rdn_level >= 0) {
-- if (rdn_level != entry->set) {
-+ if (rdn_level != X509_NAME_ENTRY_set(entry)) {
- /* yes, new RDN */
- /* add old RDN to DN */
- rdnt = PyList_AsTuple(rdn);
-@@ -753,7 +831,7 @@ _create_tuple_for_X509_NAME (X509_NAME *
- goto fail0;
- }
- }
-- rdn_level = entry->set;
-+ rdn_level = X509_NAME_ENTRY_set(entry);
-
- /* now add this attribute to the current RDN */
- name = X509_NAME_ENTRY_get_object(entry);
-@@ -851,18 +929,18 @@ _get_peer_alt_names (X509 *certificate)
- goto fail;
- }
-
-- p = ext->value->data;
-+ p = X509_EXTENSION_get_data(ext)->data;
- if (method->it)
- names = (GENERAL_NAMES*)
- (ASN1_item_d2i(NULL,
- &p,
-- ext->value->length,
-+ X509_EXTENSION_get_data(ext)->length,
- ASN1_ITEM_ptr(method->it)));
- else
- names = (GENERAL_NAMES*)
- (method->d2i(NULL,
- &p,
-- ext->value->length));
-+ X509_EXTENSION_get_data(ext)->length));
-
- for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
- /* get a rendering of each name in the set of names */
-@@ -1073,13 +1151,11 @@ _get_crl_dp(X509 *certificate) {
- int i, j;
- PyObject *lst, *res = NULL;
-
--#if OPENSSL_VERSION_NUMBER < 0x10001000L
-- dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
--#else
-+#if OPENSSL_VERSION_NUMBER >= 0x10001000L
- /* Calls x509v3_cache_extensions and sets up crldp */
- X509_check_ca(certificate);
-- dps = certificate->crldp;
- #endif
-+ dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
-
- if (dps == NULL)
- return Py_None;
-@@ -1449,14 +1525,13 @@ static PyObject *
- _ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
- /*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
- {
-- SSL_SESSION *sess = SSL_get_session(self->ssl);
- STACK_OF(SSL_CIPHER) *ciphers;
- int i;
- PyObject *res;
-
-- if (!sess || !sess->ciphers)
-+ ciphers = SSL_get_ciphers(self->ssl);
-+ if (!ciphers)
- Py_RETURN_NONE;
-- ciphers = sess->ciphers;
- res = PyList_New(sk_SSL_CIPHER_num(ciphers));
- if (!res)
- return NULL;
-@@ -1565,9 +1640,9 @@ _ssl__SSLSocket_compression_impl(PySSLSo
- if (self->ssl == NULL)
- Py_RETURN_NONE;
- comp_method = SSL_get_current_compression(self->ssl);
-- if (comp_method == NULL || comp_method->type == NID_undef)
-+ if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
- Py_RETURN_NONE;
-- short_name = OBJ_nid2sn(comp_method->type);
-+ short_name = COMP_get_name(comp_method);
- if (short_name == NULL)
- Py_RETURN_NONE;
- return PyUnicode_DecodeFSDefault(short_name);
-@@ -2245,8 +2320,8 @@ _ssl__SSLContext_impl(PyTypeObject *type
- else if (proto_version == PY_SSL_VERSION_SSL2)
- ctx = SSL_CTX_new(SSLv2_method());
- #endif
-- else if (proto_version == PY_SSL_VERSION_SSL23)
-- ctx = SSL_CTX_new(SSLv23_method());
-+ else if (proto_version == PY_SSL_VERSION_TLS)
-+ ctx = SSL_CTX_new(TLS_method());
- else
- proto_version = -1;
- PySSL_END_ALLOW_THREADS
-@@ -2308,8 +2383,9 @@ _ssl__SSLContext_impl(PyTypeObject *type
- #ifndef OPENSSL_NO_ECDH
- /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use
- prime256v1 by default. This is Apache mod_ssl's initialization
-- policy, so we should be safe. */
--#if defined(SSL_CTX_set_ecdh_auto)
-+ policy, so we should be safe. OpenSSL 1.1 has it enabled by default.
-+ */
-+#if defined(SSL_CTX_set_ecdh_auto) && !defined(OPENSSL_VERSION_1_1)
- SSL_CTX_set_ecdh_auto(self->ctx, 1);
- #else
- {
-@@ -2576,10 +2652,12 @@ static PyObject *
- get_verify_flags(PySSLContext *self, void *c)
- {
- X509_STORE *store;
-+ X509_VERIFY_PARAM *param;
- unsigned long flags;
-
- store = SSL_CTX_get_cert_store(self->ctx);
-- flags = X509_VERIFY_PARAM_get_flags(store->param);
-+ param = X509_STORE_get0_param(store);
-+ flags = X509_VERIFY_PARAM_get_flags(param);
- return PyLong_FromUnsignedLong(flags);
- }
-
-@@ -2587,22 +2665,24 @@ static int
- set_verify_flags(PySSLContext *self, PyObject *arg, void *c)
- {
- X509_STORE *store;
-+ X509_VERIFY_PARAM *param;
- unsigned long new_flags, flags, set, clear;
-
- if (!PyArg_Parse(arg, "k", &new_flags))
- return -1;
- store = SSL_CTX_get_cert_store(self->ctx);
-- flags = X509_VERIFY_PARAM_get_flags(store->param);
-+ param = X509_STORE_get0_param(store);
-+ flags = X509_VERIFY_PARAM_get_flags(param);
- clear = flags & ~new_flags;
- set = ~flags & new_flags;
- if (clear) {
-- if (!X509_VERIFY_PARAM_clear_flags(store->param, clear)) {
-+ if (!X509_VERIFY_PARAM_clear_flags(param, clear)) {
- _setSSLError(NULL, 0, __FILE__, __LINE__);
- return -1;
- }
- }
- if (set) {
-- if (!X509_VERIFY_PARAM_set_flags(store->param, set)) {
-+ if (!X509_VERIFY_PARAM_set_flags(param, set)) {
- _setSSLError(NULL, 0, __FILE__, __LINE__);
- return -1;
- }
-@@ -2779,8 +2859,8 @@ _ssl__SSLContext_load_cert_chain_impl(Py
- /*[clinic end generated code: output=9480bc1c380e2095 input=7cf9ac673cbee6fc]*/
- {
- PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
-- pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback;
-- void *orig_passwd_userdata = self->ctx->default_passwd_callback_userdata;
-+ pem_password_cb *orig_passwd_cb = SSL_CTX_get_default_passwd_cb(self->ctx);
-+ void *orig_passwd_userdata = SSL_CTX_get_default_passwd_cb_userdata(self->ctx);
- _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
- int r;
-
-@@ -2907,8 +2987,9 @@ _add_ca_certs(PySSLContext *self, void *
- cert = d2i_X509_bio(biobuf, NULL);
- } else {
- cert = PEM_read_bio_X509(biobuf, NULL,
-- self->ctx->default_passwd_callback,
--
self->ctx->default_passwd_callback_userdata);
-+ SSL_CTX_get_default_passwd_cb(self->ctx),
-+
SSL_CTX_get_default_passwd_cb_userdata(self->ctx)
-+ );
- }
- if (cert == NULL) {
- break;
-@@ -3434,25 +3515,24 @@ _ssl__SSLContext_cert_store_stats_impl(P
- /*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
- {
- X509_STORE *store;
-+ STACK_OF(X509_OBJECT) *objs;
- X509_OBJECT *obj;
-- int x509 = 0, crl = 0, pkey = 0, ca = 0, i;
-+ int x509 = 0, crl = 0, ca = 0, i;
-
- store = SSL_CTX_get_cert_store(self->ctx);
-- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
-- obj = sk_X509_OBJECT_value(store->objs, i);
-- switch (obj->type) {
-+ objs = X509_STORE_get0_objects(store);
-+ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
-+ obj = sk_X509_OBJECT_value(objs, i);
-+ switch (X509_OBJECT_get_type(obj)) {
- case X509_LU_X509:
- x509++;
-- if (X509_check_ca(obj->data.x509)) {
-+ if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
- ca++;
- }
- break;
- case X509_LU_CRL:
- crl++;
- break;
-- case X509_LU_PKEY:
-- pkey++;
-- break;
- default:
- /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
- * As far as I can tell they are internal states and never
-@@ -3482,6 +3562,7 @@ _ssl__SSLContext_get_ca_certs_impl(PySSL
- /*[clinic end generated code: output=0d58f148f37e2938 input=6887b5a09b7f9076]*/
- {
- X509_STORE *store;
-+ STACK_OF(X509_OBJECT) *objs;
- PyObject *ci = NULL, *rlist = NULL;
- int i;
-
-@@ -3490,17 +3571,18 @@ _ssl__SSLContext_get_ca_certs_impl(PySSL
- }
-
- store = SSL_CTX_get_cert_store(self->ctx);
-- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
-+ objs = X509_STORE_get0_objects(store);
-+ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
- X509_OBJECT *obj;
- X509 *cert;
-
-- obj = sk_X509_OBJECT_value(store->objs, i);
-- if (obj->type != X509_LU_X509) {
-+ obj = sk_X509_OBJECT_value(objs, i);
-+ if (X509_OBJECT_get_type(obj) != X509_LU_X509) {
- /* not a x509 cert */
- continue;
- }
- /* CA for any purpose */
-- cert = obj->data.x509;
-+ cert = X509_OBJECT_get0_X509(obj);
- if (!X509_check_ca(cert)) {
- continue;
- }
-@@ -4364,10 +4446,12 @@ static PyMethodDef PySSL_methods[] = {
- };
-
-
--#ifdef WITH_THREAD
-+#ifdef HAVE_OPENSSL_CRYPTO_LOCK
-
- /* an implementation of OpenSSL threading operations in terms
-- of the Python C thread library */
-+ * of the Python C thread library
-+ * Only used up to 1.0.2. OpenSSL 1.1.0+ has its own locking code.
-+ */
-
- static PyThread_type_lock *_ssl_locks = NULL;
-
-@@ -4448,7 +4532,7 @@ static int _setup_ssl_threads(void) {
- return 1;
- }
-
--#endif /* def HAVE_THREAD */
-+#endif /* HAVE_OPENSSL_CRYPTO_LOCK for WITH_THREAD && OpenSSL < 1.1.0 */
-
- PyDoc_STRVAR(module_doc,
- "Implementation module for SSL socket operations. See the socket module\n\
-@@ -4517,11 +4601,16 @@ PyInit__ssl(void)
- SSL_load_error_strings();
- SSL_library_init();
- #ifdef WITH_THREAD
-+#ifdef HAVE_OPENSSL_CRYPTO_LOCK
- /* note that this will start threading if not already started */
- if (!_setup_ssl_threads()) {
- return NULL;
- }
-+#elif OPENSSL_VERSION_1_1 && defined(OPENSSL_THREADS)
-+ /* OpenSSL 1.1.0 builtin thread support is enabled */
-+ _ssl_locks_count++;
- #endif
-+#endif /* WITH_THREAD */
- OpenSSL_add_all_algorithms();
-
- /* Add symbols to module dict */
-@@ -4668,7 +4757,9 @@ PyInit__ssl(void)
- PY_SSL_VERSION_SSL3);
- #endif
- PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
-- PY_SSL_VERSION_SSL23);
-+ PY_SSL_VERSION_TLS);
-+ PyModule_AddIntConstant(m, "PROTOCOL_TLS",
-+ PY_SSL_VERSION_TLS);
- PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
- PY_SSL_VERSION_TLS1);
- #if HAVE_TLSv1_2
diff --git a/python3.spec b/python3.spec
index 66f3f76..863c1fc 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -413,8 +413,12 @@ Patch242: 00242-CVE-2016-1000110-httpoxy.patch
# Fedora needs the default mips64-linux-gnu
Patch243: 00243-fix-mips64-triplet.patch
-# Make it build with OpenSSL-1.1.0 based on upstream patch
-Patch244: Python-3.5.2-openssl11.patch
+# 00247 #
+# Port ssl and hashlib modules to OpenSSL 1.1.0.
+# As of F26, OpenSSL is rebased to 1.1.0, so in order for python
+# to not FTBFS we need to backport this patch from 3.5.3
+# FIXED UPSTREAM:
https://bugs.python.org/issue26470
+Patch247: 00247-port-ssl-and-hashlib-to-OpenSSL-1.1.0.patch
# (New patches go here ^^^)
#
@@ -605,6 +609,8 @@ done
# Remove embedded copy of zlib:
rm -r Modules/zlib || exit 1
+## Disabling hashlib patch for now as it needs to be reimplemented
+## for OpenSSL 1.1.0.
# Don't build upstream Python's implementation of these crypto algorithms;
# instead rely on _hashlib and OpenSSL.
#
@@ -612,9 +618,9 @@ rm -r Modules/zlib || exit 1
# OpenSSL (and thus respects FIPS mode), and does not fall back to _md5
# TODO: there seems to be no OpenSSL support in Python for sha3 so far
# when it is there, also remove _sha3/ dir
-for f in md5module.c sha1module.c sha256module.c sha512module.c; do
- rm Modules/$f
-done
+#for f in md5module.c sha1module.c sha256module.c sha512module.c; do
+# rm Modules/$f
+#done
%if 0%{with_rewheel}
%global pip_version 8.1.2
@@ -638,7 +644,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch132 -p1
%patch137 -p1
%patch143 -p1 -b .tsc-on-ppc
-%patch146 -p1
+#patch146 -p1
%patch155 -p1
%patch157 -p1
%patch160 -p1
@@ -659,7 +665,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch209 -p1
%patch242 -p1
%patch243 -p1
-%patch244 -p1
+%patch247 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1226,6 +1232,12 @@ rm -fr %{buildroot}
%doc LICENSE README
%dir %{pylibdir}
%dir %{dynload_dir}
+
+%{dynload_dir}/_md5.%{SOABI_optimized}.so
+%{dynload_dir}/_sha256.%{SOABI_optimized}.so
+%{dynload_dir}/_sha512.%{SOABI_optimized}.so
+%{dynload_dir}/_sha1.%{SOABI_optimized}.so
+
%{dynload_dir}/_bisect.%{SOABI_optimized}.so
%{dynload_dir}/_bz2.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
@@ -1448,6 +1460,12 @@ rm -fr %{buildroot}
# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
+
+%{dynload_dir}/_md5.%{SOABI_debug}.so
+%{dynload_dir}/_sha256.%{SOABI_debug}.so
+%{dynload_dir}/_sha512.%{SOABI_debug}.so
+%{dynload_dir}/_sha1.%{SOABI_debug}.so
+
%{dynload_dir}/_bisect.%{SOABI_debug}.so
%{dynload_dir}/_bz2.%{SOABI_debug}.so
%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
@@ -1559,6 +1577,12 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Oct 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-6
+- Use proper patch numbering and base upstream branch for
+porting ssl and hashlib modules to OpenSSL 1.1.0
+- Drop hashlib patch for now
+- Add riscv64 arch to 64bit and no-valgrind arches
+
* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
- Make it build with OpenSSL-1.1.0 based on upstream patch
commit 55d65adde06c9230da88f54f92cf98d35fa37e16
Author: Tomas Mraz <tmraz(a)fedoraproject.org>
Date: Tue Oct 11 18:30:54 2016 +0200
Fix changelog date in previous commit.
diff --git a/python3.spec b/python3.spec
index 73aca06..66f3f76 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1559,7 +1559,7 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Tue Oct 10 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
+* Tue Oct 11 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
- Make it build with OpenSSL-1.1.0 based on upstream patch
* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
commit 38b026e0ce779b25113228cf0d823c0cfef758e9
Author: Tomas Mraz <tmraz(a)fedoraproject.org>
Date: Tue Oct 11 18:29:03 2016 +0200
Make it build with OpenSSL-1.1.0 based on upstream patch
diff --git a/Python-3.5.2-openssl11.patch b/Python-3.5.2-openssl11.patch
new file mode 100644
index 0000000..bb9cf5d
--- /dev/null
+++ b/Python-3.5.2-openssl11.patch
@@ -0,0 +1,1307 @@
+diff -up Python-3.5.2/Doc/library/ssl.rst.openssl11 Python-3.5.2/Doc/library/ssl.rst
+--- Python-3.5.2/Doc/library/ssl.rst.openssl11 2016-06-25 23:38:35.000000000 +0200
++++ Python-3.5.2/Doc/library/ssl.rst 2016-10-10 16:34:37.695049119 +0200
+@@ -49,6 +49,12 @@ For more sophisticated applications, the
+ helps manage settings and certificates, which can then be inherited
+ by SSL sockets created through the :meth:`SSLContext.wrap_socket` method.
+
++.. versionchanged:: 3.6
++
++ OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported.
++ In the future the ssl module will require at least OpenSSL 1.0.2 or
++ 1.1.0.
++
+
+ Functions, Constants, and Exceptions
+ ------------------------------------
+@@ -178,7 +184,7 @@ instead.
+ use. Typically, the server chooses a particular protocol version, and the
+ client must adapt to the server's choice. Most of the versions are not
+ interoperable with the other versions. If not specified, the default is
+- :data:`PROTOCOL_SSLv23`; it provides the most compatibility with other
++ :data:`PROTOCOL_TLS`; it provides the most compatibility with other
+ versions.
+
+ Here's a table showing which versions in a client (down the side) can connect
+@@ -187,11 +193,11 @@ instead.
+ .. table::
+
+ ======================== ========= ========= ========== =========
=========== ===========
+- *client* / **server** **SSLv2** **SSLv3** **SSLv23** **TLSv1**
**TLSv1.1** **TLSv1.2**
++ *client* / **server** **SSLv2** **SSLv3** **TLS** **TLSv1**
**TLSv1.1** **TLSv1.2**
+ ------------------------ --------- --------- ---------- ---------
----------- -----------
+ *SSLv2* yes no yes no no
no
+ *SSLv3* no yes yes no no
no
+- *SSLv23* no yes yes yes yes
yes
++ *TLS* (*SSLv23*) no yes yes yes yes
yes
+ *TLSv1* no no yes yes no
no
+ *TLSv1.1* no no yes no yes
no
+ *TLSv1.2* no no yes no no
yes
+@@ -244,7 +250,7 @@ purposes.
+ :const:`None`, this function can choose to trust the system's default
+ CA certificates instead.
+
+- The settings are: :data:`PROTOCOL_SSLv23`, :data:`OP_NO_SSLv2`, and
++ The settings are: :data:`PROTOCOL_TLS`, :data:`OP_NO_SSLv2`, and
+ :data:`OP_NO_SSLv3` with high encryption cipher suites without RC4 and
+ without unauthenticated cipher suites. Passing :data:`~Purpose.SERVER_AUTH`
+ as *purpose* sets :data:`~SSLContext.verify_mode` to :data:`CERT_REQUIRED`
+@@ -316,6 +322,11 @@ Random generation
+
+ .. versionadded:: 3.3
+
++ .. deprecated:: 3.6
++
++ OpenSSL has deprecated :func:`ssl.RAND_pseudo_bytes`, use
++ :func:`ssl.RAND_bytes` instead.
++
+ .. function:: RAND_status()
+
+ Return ``True`` if the SSL pseudo-random number generator has been seeded
+@@ -334,7 +345,7 @@ Random generation
+ See
http://egd.sourceforge.net/ or
http://prngd.sourceforge.net/ for sources
+ of entropy-gathering daemons.
+
+- Availability: not available with LibreSSL.
++ Availability: not available with LibreSSL and OpenSSL > 1.1.0
+
+ .. function:: RAND_add(bytes, entropy)
+
+@@ -409,7 +420,7 @@ Certificate handling
+ previously. Return an integer (no fractions of a second in the
+ input format)
+
+-.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None)
++.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None)
+
+ Given the address ``addr`` of an SSL-protected server, as a (*hostname*,
+ *port-number*) pair, fetches the server's certificate, and returns it as a
+@@ -425,7 +436,7 @@ Certificate handling
+
+ .. versionchanged:: 3.5
+ The default *ssl_version* is changed from :data:`PROTOCOL_SSLv3` to
+- :data:`PROTOCOL_SSLv23` for maximum compatibility with modern servers.
++ :data:`PROTOCOL_TLS` for maximum compatibility with modern servers.
+
+ .. function:: DER_cert_to_PEM_cert(DER_cert_bytes)
+
+@@ -451,6 +462,9 @@ Certificate handling
+ * :attr:`openssl_capath_env` - OpenSSL's environment key that points to a
capath,
+ * :attr:`openssl_capath` - hard coded path to a capath directory
+
++ Availability: LibreSSL ignores the environment vars
++ :attr:`openssl_cafile_env` and :attr:`openssl_capath_env`
++
+ .. versionadded:: 3.4
+
+ .. function:: enum_certificates(store_name)
+@@ -568,11 +582,21 @@ Constants
+
+ .. versionadded:: 3.4.4
+
+-.. data:: PROTOCOL_SSLv23
++.. data:: PROTOCOL_TLS
+
+ Selects the highest protocol version that both the client and server support.
+ Despite the name, this option can select "TLS" protocols as well as
"SSL".
+
++ .. versionadded:: 3.6
++
++.. data:: PROTOCOL_SSLv23
++
++ Alias for data:`PROTOCOL_TLS`.
++
++ .. deprecated:: 3.6
++
++ Use data:`PROTOCOL_TLS` instead.
++
+ .. data:: PROTOCOL_SSLv2
+
+ Selects SSL version 2 as the channel encryption protocol.
+@@ -584,6 +608,10 @@ Constants
+
+ SSL version 2 is insecure. Its use is highly discouraged.
+
++ .. deprecated:: 3.6
++
++ OpenSSL has removed support for SSLv2.
++
+ .. data:: PROTOCOL_SSLv3
+
+ Selects SSL version 3 as the channel encryption protocol.
+@@ -595,10 +623,20 @@ Constants
+
+ SSL version 3 is insecure. Its use is highly discouraged.
+
++ .. deprecated:: 3.6
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: PROTOCOL_TLSv1
+
+ Selects TLS version 1.0 as the channel encryption protocol.
+
++ .. deprecated:: 3.6
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: PROTOCOL_TLSv1_1
+
+ Selects TLS version 1.1 as the channel encryption protocol.
+@@ -606,6 +644,11 @@ Constants
+
+ .. versionadded:: 3.4
+
++ .. deprecated:: 3.6
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: PROTOCOL_TLSv1_2
+
+ Selects TLS version 1.2 as the channel encryption protocol. This is the
+@@ -614,6 +657,11 @@ Constants
+
+ .. versionadded:: 3.4
+
++ .. deprecated:: 3.6
++
++ OpenSSL has deprecated all version specific protocols. Use the default
++ protocol data:`PROTOCOL_TLS` with flags like data:`OP_NO_SSLv3` instead.
++
+ .. data:: OP_ALL
+
+ Enables workarounds for various bugs present in other SSL implementations.
+@@ -625,23 +673,32 @@ Constants
+ .. data:: OP_NO_SSLv2
+
+ Prevents an SSLv2 connection. This option is only applicable in
+- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
++ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
+ choosing SSLv2 as the protocol version.
+
+ .. versionadded:: 3.2
+
++ .. deprecated:: 3.6
++
++ SSLv2 is deprecated
++
++
+ .. data:: OP_NO_SSLv3
+
+ Prevents an SSLv3 connection. This option is only applicable in
+- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
++ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
+ choosing SSLv3 as the protocol version.
+
+ .. versionadded:: 3.2
+
++ .. deprecated:: 3.6
++
++ SSLv3 is deprecated
++
+ .. data:: OP_NO_TLSv1
+
+ Prevents a TLSv1 connection. This option is only applicable in
+- conjunction with :const:`PROTOCOL_SSLv23`. It prevents the peers from
++ conjunction with :const:`PROTOCOL_TLS`. It prevents the peers from
+ choosing TLSv1 as the protocol version.
+
+ .. versionadded:: 3.2
+@@ -649,7 +706,7 @@ Constants
+ .. data:: OP_NO_TLSv1_1
+
+ Prevents a TLSv1.1 connection. This option is only applicable in conjunction
+- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.1 as
++ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.1 as
+ the protocol version. Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
+@@ -657,7 +714,7 @@ Constants
+ .. data:: OP_NO_TLSv1_2
+
+ Prevents a TLSv1.2 connection. This option is only applicable in conjunction
+- with :const:`PROTOCOL_SSLv23`. It prevents the peers from choosing TLSv1.2 as
++ with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.2 as
+ the protocol version. Available only with openssl version 1.0.1+.
+
+ .. versionadded:: 3.4
+@@ -1081,17 +1138,21 @@ such as SSL configuration options, certi
+ It also manages a cache of SSL sessions for server-side sockets, in order
+ to speed up repeated connections from the same clients.
+
+-.. class:: SSLContext(protocol)
++.. class:: SSLContext(protocol=PROTOCOL_TLS)
+
+- Create a new SSL context. You must pass *protocol* which must be one
++ Create a new SSL context. You may pass *protocol* which must be one
+ of the ``PROTOCOL_*`` constants defined in this module.
+- :data:`PROTOCOL_SSLv23` is currently recommended for maximum
+- interoperability.
++ :data:`PROTOCOL_TLS` is currently recommended for maximum
++ interoperability and default value.
+
+ .. seealso::
+ :func:`create_default_context` lets the :mod:`ssl` module choose
+ security settings for a given purpose.
+
++ .. versionchanged:: 3.6
++
++ :data:`PROTOCOL_TLS` is the default value.
++
+
+ :class:`SSLContext` objects have the following methods and attributes:
+
+@@ -1232,6 +1293,9 @@ to speed up repeated connections from th
+ This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is
+ False.
+
++ OpenSSL 1.1.0+ will abort the handshake and raise :exc:`SSLError` when
++ both sides support ALPN but cannot agree on a protocol.
++
+ .. versionadded:: 3.5
+
+ .. method:: SSLContext.set_npn_protocols(protocols)
+@@ -1598,7 +1662,7 @@ If you prefer to tune security settings
+ a context from scratch (but beware that you might not get the settings
+ right)::
+
+- >>> context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
++ >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS)
+ >>> context.verify_mode = ssl.CERT_REQUIRED
+ >>> context.check_hostname = True
+ >>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
+@@ -1999,15 +2063,17 @@ Protocol versions
+
+ SSL versions 2 and 3 are considered insecure and are therefore dangerous to
+ use. If you want maximum compatibility between clients and servers, it is
+-recommended to use :const:`PROTOCOL_SSLv23` as the protocol version and then
++recommended to use :const:`PROTOCOL_TLS` as the protocol version and then
+ disable SSLv2 and SSLv3 explicitly using the :data:`SSLContext.options`
+ attribute::
+
+- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
++ context = ssl.SSLContext(ssl.PROTOCOL_TLS)
+ context.options |= ssl.OP_NO_SSLv2
+ context.options |= ssl.OP_NO_SSLv3
++ context.options |= ssl.OP_NO_TLSv1
++ context.options |= ssl.OP_NO_TLSv1_1
+
+-The SSL context created above will only allow TLSv1 and later (if
++The SSL context created above will only allow TLSv1.2 and later (if
+ supported by your system) connections.
+
+ Cipher selection
+diff -up Python-3.5.2/Lib/ssl.py.openssl11 Python-3.5.2/Lib/ssl.py
+--- Python-3.5.2/Lib/ssl.py.openssl11 2016-06-25 23:38:36.000000000 +0200
++++ Python-3.5.2/Lib/ssl.py 2016-10-10 16:34:37.695049119 +0200
+@@ -51,6 +51,7 @@ The following constants identify various
+ PROTOCOL_SSLv2
+ PROTOCOL_SSLv3
+ PROTOCOL_SSLv23
++PROTOCOL_TLS
+ PROTOCOL_TLSv1
+ PROTOCOL_TLSv1_1
+ PROTOCOL_TLSv1_2
+@@ -128,9 +129,10 @@ from _ssl import _OPENSSL_API_VERSION
+
+ _IntEnum._convert(
+ '_SSLMethod', __name__,
+- lambda name: name.startswith('PROTOCOL_'),
++ lambda name: name.startswith('PROTOCOL_') and name !=
'PROTOCOL_SSLv23',
+ source=_ssl)
+
++PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_TLS
+ _PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
+
+ try:
+@@ -357,13 +359,13 @@ class SSLContext(_SSLContext):
+ __slots__ = ('protocol', '__weakref__')
+ _windows_cert_stores = ("CA", "ROOT")
+
+- def __new__(cls, protocol, *args, **kwargs):
++ def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
+ self = _SSLContext.__new__(cls, protocol)
+ if protocol != _SSLv2_IF_EXISTS:
+ self.set_ciphers(_DEFAULT_CIPHERS)
+ return self
+
+- def __init__(self, protocol):
++ def __init__(self, protocol=PROTOCOL_TLS):
+ self.protocol = protocol
+
+ def wrap_socket(self, sock, server_side=False,
+@@ -438,7 +440,7 @@ def create_default_context(purpose=Purpo
+ if not isinstance(purpose, _ASN1Object):
+ raise TypeError(purpose)
+
+- context = SSLContext(PROTOCOL_SSLv23)
++ context = SSLContext(PROTOCOL_TLS)
+
+ # SSLv2 considered harmful.
+ context.options |= OP_NO_SSLv2
+@@ -475,7 +477,7 @@ def create_default_context(purpose=Purpo
+ context.load_default_certs(purpose)
+ return context
+
+-def _create_unverified_context(protocol=PROTOCOL_SSLv23, *, cert_reqs=None,
++def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=None,
+ check_hostname=False, purpose=Purpose.SERVER_AUTH,
+ certfile=None, keyfile=None,
+ cafile=None, capath=None, cadata=None):
+@@ -666,7 +668,7 @@ class SSLSocket(socket):
+
+ def __init__(self, sock=None, keyfile=None, certfile=None,
+ server_side=False, cert_reqs=CERT_NONE,
+- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
++ ssl_version=PROTOCOL_TLS, ca_certs=None,
+ do_handshake_on_connect=True,
+ family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
+ suppress_ragged_eofs=True, npn_protocols=None, ciphers=None,
+@@ -1056,7 +1058,7 @@ class SSLSocket(socket):
+
+ def wrap_socket(sock, keyfile=None, certfile=None,
+ server_side=False, cert_reqs=CERT_NONE,
+- ssl_version=PROTOCOL_SSLv23, ca_certs=None,
++ ssl_version=PROTOCOL_TLS, ca_certs=None,
+ do_handshake_on_connect=True,
+ suppress_ragged_eofs=True,
+ ciphers=None):
+@@ -1125,7 +1127,7 @@ def PEM_cert_to_DER_cert(pem_cert_string
+ d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
+ return base64.decodebytes(d.encode('ASCII', 'strict'))
+
+-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None):
++def get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None):
+ """Retrieve the certificate from the server at the specified
address,
+ and return it as a PEM-encoded string.
+ If 'ca_certs' is specified, validate the server cert against it.
+diff -up Python-3.5.2/Lib/test/test_ssl.py.openssl11 Python-3.5.2/Lib/test/test_ssl.py
+--- Python-3.5.2/Lib/test/test_ssl.py.openssl11 2016-06-25 23:38:37.000000000 +0200
++++ Python-3.5.2/Lib/test/test_ssl.py 2016-10-10 16:37:52.812573136 +0200
+@@ -23,6 +23,9 @@ ssl = support.import_module("ssl")
+
+ PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
+ HOST = support.HOST
++IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
++IS_OPENSSL_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0)
++
+
+ def data_file(*name):
+ return os.path.join(os.path.dirname(__file__), *name)
+@@ -143,8 +146,8 @@ class BasicSocketTests(unittest.TestCase
+ def test_str_for_enums(self):
+ # Make sure that the PROTOCOL_* constants have enum-like string
+ # reprs.
+- proto = ssl.PROTOCOL_SSLv23
+- self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_SSLv23')
++ proto = ssl.PROTOCOL_TLS
++ self.assertEqual(str(proto), '_SSLMethod.PROTOCOL_TLS')
+ ctx = ssl.SSLContext(proto)
+ self.assertIs(ctx.protocol, proto)
+
+@@ -312,8 +315,8 @@ class BasicSocketTests(unittest.TestCase
+ self.assertGreaterEqual(status, 0)
+ self.assertLessEqual(status, 15)
+ # Version string as returned by {Open,Libre}SSL, the format might change
+- if "LibreSSL" in s:
+- self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major,
minor)),
++ if IS_LIBRESSL:
++ self.assertTrue(s.startswith("LibreSSL {:d}".format(major)),
+ (s, t, hex(n)))
+ else:
+ self.assertTrue(s.startswith("OpenSSL
{:d}.{:d}.{:d}".format(major, minor, fix)),
+@@ -790,7 +793,8 @@ class ContextTests(unittest.TestCase):
+ def test_constructor(self):
+ for protocol in PROTOCOLS:
+ ssl.SSLContext(protocol)
+- self.assertRaises(TypeError, ssl.SSLContext)
++ ctx = ssl.SSLContext()
++ self.assertEqual(ctx.protocol, ssl.PROTOCOL_TLS)
+ self.assertRaises(ValueError, ssl.SSLContext, -1)
+ self.assertRaises(ValueError, ssl.SSLContext, 42)
+
+@@ -811,15 +815,15 @@ class ContextTests(unittest.TestCase):
+ def test_options(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
+- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
+- ctx.options)
++ default = (ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3)
++ if not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0):
++ default |= ssl.OP_NO_COMPRESSION
++ self.assertEqual(default, ctx.options)
+ ctx.options |= ssl.OP_NO_TLSv1
+- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 |
ssl.OP_NO_TLSv1,
+- ctx.options)
++ self.assertEqual(default | ssl.OP_NO_TLSv1, ctx.options)
+ if can_clear_options():
+- ctx.options = (ctx.options & ~ssl.OP_NO_SSLv2) | ssl.OP_NO_TLSv1
+- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_TLSv1 | ssl.OP_NO_SSLv3,
+- ctx.options)
++ ctx.options = (ctx.options & ~ssl.OP_NO_TLSv1)
++ self.assertEqual(default, ctx.options)
+ ctx.options = 0
+ # Ubuntu has OP_NO_SSLv3 forced on by default
+ self.assertEqual(0, ctx.options & ~ssl.OP_NO_SSLv3)
+@@ -1155,6 +1159,7 @@ class ContextTests(unittest.TestCase):
+ self.assertRaises(TypeError, ctx.load_default_certs, 'SERVER_AUTH')
+
+ @unittest.skipIf(sys.platform == "win32", "not-Windows
specific")
++ @unittest.skipIf(IS_LIBRESSL, "LibreSSL doesn't support env vars")
+ def test_load_default_certs_env(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ with support.EnvironmentVarGuard() as env:
+@@ -1750,13 +1755,13 @@ class NetworkedBIOTests(unittest.TestCas
+ sslobj = ctx.wrap_bio(incoming, outgoing, False, REMOTE_HOST)
+ self.assertIs(sslobj._sslobj.owner, sslobj)
+ self.assertIsNone(sslobj.cipher())
+- self.assertIsNone(sslobj.shared_ciphers())
++ self.assertIsNotNone(sslobj.shared_ciphers())
+ self.assertRaises(ValueError, sslobj.getpeercert)
+ if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
+ self.assertIsNone(sslobj.get_channel_binding('tls-unique'))
+ self.ssl_io_loop(sock, incoming, outgoing, sslobj.do_handshake)
+ self.assertTrue(sslobj.cipher())
+- self.assertIsNone(sslobj.shared_ciphers())
++ self.assertIsNotNone(sslobj.shared_ciphers())
+ self.assertTrue(sslobj.getpeercert())
+ if 'tls-unique' in ssl.CHANNEL_BINDING_TYPES:
+ self.assertTrue(sslobj.get_channel_binding('tls-unique'))
+@@ -2980,7 +2985,7 @@ else:
+ with context.wrap_socket(socket.socket()) as s:
+ self.assertIs(s.version(), None)
+ s.connect((HOST, server.port))
+- self.assertEqual(s.version(), "TLSv1")
++ self.assertEqual(s.version(), 'TLSv1')
+ self.assertIs(s.version(), None)
+
+ @unittest.skipUnless(ssl.HAS_ECDH, "test requires ECDH-enabled
OpenSSL")
+@@ -3122,24 +3127,36 @@ else:
+ (['http/3.0', 'http/4.0'], None)
+ ]
+ for client_protocols, expected in protocol_tests:
+- server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
++ server_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
+ server_context.load_cert_chain(CERTFILE)
+ server_context.set_alpn_protocols(server_protocols)
+- client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
++ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
+ client_context.load_cert_chain(CERTFILE)
+ client_context.set_alpn_protocols(client_protocols)
+- stats = server_params_test(client_context, server_context,
+- chatty=True, connectionchatty=True)
+
+- msg = "failed trying %s (s) and %s (c).\n" \
+- "was expecting %s, but got %%s from the %%s" \
+- % (str(server_protocols), str(client_protocols),
+- str(expected))
+- client_result = stats['client_alpn_protocol']
+- self.assertEqual(client_result, expected, msg % (client_result,
"client"))
+- server_result = stats['server_alpn_protocols'][-1] \
+- if len(stats['server_alpn_protocols']) else
'nothing'
+- self.assertEqual(server_result, expected, msg % (server_result,
"server"))
++ try:
++ stats = server_params_test(client_context,
++ server_context,
++ chatty=True,
++ connectionchatty=True)
++ except ssl.SSLError as e:
++ stats = e
++
++ if expected is None and IS_OPENSSL_1_1:
++ # OpenSSL 1.1.0 raises handshake error
++ self.assertIsInstance(stats, ssl.SSLError)
++ else:
++ msg = "failed trying %s (s) and %s (c).\n" \
++ "was expecting %s, but got %%s from the %%s" \
++ % (str(server_protocols), str(client_protocols),
++ str(expected))
++ client_result = stats['client_alpn_protocol']
++ self.assertEqual(client_result, expected,
++ msg % (client_result, "client"))
++ server_result = stats['server_alpn_protocols'][-1] \
++ if len(stats['server_alpn_protocols']) else
'nothing'
++ self.assertEqual(server_result, expected,
++ msg % (server_result, "server"))
+
+ def test_selected_npn_protocol(self):
+ # selected_npn_protocol() is None unless NPN is used
+@@ -3287,13 +3304,23 @@ else:
+ client_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+ client_context.verify_mode = ssl.CERT_REQUIRED
+ client_context.load_verify_locations(SIGNING_CA)
+- client_context.set_ciphers("RC4")
+- server_context.set_ciphers("AES:RC4")
++ if ssl.OPENSSL_VERSION_INFO >= (1, 0, 2):
++ client_context.set_ciphers("AES128:AES256")
++ server_context.set_ciphers("AES256")
++ alg1 = "AES256"
++ alg2 = "AES-256"
++ else:
++ client_context.set_ciphers("AES:3DES")
++ server_context.set_ciphers("3DES")
++ alg1 = "3DES"
++ alg2 = "DES-CBC3"
++
+ stats = server_params_test(client_context, server_context)
+ ciphers = stats['server_shared_ciphers'][0]
+ self.assertGreater(len(ciphers), 0)
+ for name, tls_version, bits in ciphers:
+- self.assertIn("RC4", name.split("-"))
++ if not alg1 in name.split("-") and alg2 not in name:
++ self.fail(name)
+
+ def test_read_write_after_close_raises_valuerror(self):
+ context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
+diff -up Python-3.5.2/Modules/_hashopenssl.c.openssl11
Python-3.5.2/Modules/_hashopenssl.c
+--- Python-3.5.2/Modules/_hashopenssl.c.openssl11 2016-10-10 16:34:15.460533587 +0200
++++ Python-3.5.2/Modules/_hashopenssl.c 2016-10-10 17:07:28.883123976 +0200
+@@ -23,7 +23,6 @@
+ #include <openssl/ssl.h>
+ #include <openssl/err.h>
+ #include <openssl/evp.h>
+-#include <openssl/hmac.h>
+ /* We use the object interface to discover what hashes OpenSSL supports. */
+ #include <openssl/objects.h>
+ #include "openssl/err.h"
+@@ -34,11 +33,22 @@
+ #define HASH_OBJ_CONSTRUCTOR 0
+ #endif
+
++#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER)
++/* OpenSSL < 1.1.0 */
++#define EVP_MD_CTX_new EVP_MD_CTX_create
++#define EVP_MD_CTX_free EVP_MD_CTX_destroy
++#define HAS_FAST_PKCS5_PBKDF2_HMAC 0
++#include <openssl/hmac.h>
++#else
++/* OpenSSL >= 1.1.0 */
++#define HAS_FAST_PKCS5_PBKDF2_HMAC 1
++#endif
++
+
+ typedef struct {
+ PyObject_HEAD
+ PyObject *name; /* name of this hash algorithm */
+- EVP_MD_CTX ctx; /* OpenSSL message digest context */
++ EVP_MD_CTX *ctx; /* OpenSSL message digest context */
+ #ifdef WITH_THREAD
+ PyThread_type_lock lock; /* OpenSSL context lock */
+ #endif
+@@ -51,9 +61,6 @@ static PyTypeObject EVPtype;
+ We have one of these per algorithm */
+ typedef struct {
+ PyObject *name_obj;
+- EVP_MD_CTX ctxs[2];
+- /* ctx_ptrs will point to ctxs unless an error occurred, when it will
+- be NULL: */
+ EVP_MD_CTX *ctx_ptrs[2];
+ PyObject *error_msgs[2];
+ } EVPCachedInfo;
+@@ -69,19 +76,57 @@ DEFINE_CONSTS_FOR_NEW(sha384)
+ DEFINE_CONSTS_FOR_NEW(sha512)
+
+
++/* LCOV_EXCL_START */
++static PyObject *
++_setException(PyObject *exc)
++{
++ unsigned long errcode;
++ const char *lib, *func, *reason;
++
++ errcode = ERR_peek_last_error();
++ if (!errcode) {
++ PyErr_SetString(exc, "unknown reasons");
++ return NULL;
++ }
++ ERR_clear_error();
++
++ lib = ERR_lib_error_string(errcode);
++ func = ERR_func_error_string(errcode);
++ reason = ERR_reason_error_string(errcode);
++
++ if (lib && func) {
++ PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
++ }
++ else if (lib) {
++ PyErr_Format(exc, "[%s] %s", lib, reason);
++ }
++ else {
++ PyErr_SetString(exc, reason);
++ }
++ return NULL;
++}
++/* LCOV_EXCL_STOP */
++
+ static EVPobject *
+ newEVPobject(PyObject *name)
+ {
+ EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, &EVPtype);
++ if (retval == NULL) {
++ return NULL;
++ }
++
++ retval->ctx = EVP_MD_CTX_new();
++ if (retval->ctx == NULL) {
++ PyErr_NoMemory();
++ return NULL;
++ }
+
+ /* save the name for .name to return */
+- if (retval != NULL) {
+- Py_INCREF(name);
+- retval->name = name;
++ Py_INCREF(name);
++ retval->name = name;
+ #ifdef WITH_THREAD
+- retval->lock = NULL;
++ retval->lock = NULL;
+ #endif
+- }
+
+ return retval;
+ }
+@@ -96,7 +141,7 @@ EVP_hash(EVPobject *self, const void *vp
+ process = MUNCH_SIZE;
+ else
+ process = Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int);
+- EVP_DigestUpdate(&self->ctx, (const void*)cp, process);
++ EVP_DigestUpdate(self->ctx, (const void*)cp, process);
+ len -= process;
+ cp += process;
+ }
+@@ -153,16 +198,19 @@ EVP_dealloc(EVPobject *self)
+ if (self->lock != NULL)
+ PyThread_free_lock(self->lock);
+ #endif
+- EVP_MD_CTX_cleanup(&self->ctx);
++ EVP_MD_CTX_free(self->ctx);
+ Py_XDECREF(self->name);
+ PyObject_Del(self);
+ }
+
+-static void locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
++static int
++locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self)
+ {
++ int result;
+ ENTER_HASHLIB(self);
+- EVP_MD_CTX_copy(new_ctx_p, &self->ctx);
++ result = EVP_MD_CTX_copy(new_ctx_p, self->ctx);
+ LEAVE_HASHLIB(self);
++ return result;
+ }
+
+ /* External methods for a hash object */
+@@ -178,7 +226,9 @@ EVP_copy(EVPobject *self, PyObject *unus
+ if ( (newobj = newEVPobject(self->name))==NULL)
+ return NULL;
+
+- locked_EVP_MD_CTX_copy(&newobj->ctx, self);
++ if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) {
++ return _setException(PyExc_ValueError);
++ }
+ return (PyObject *)newobj;
+ }
+
+@@ -189,16 +239,24 @@ static PyObject *
+ EVP_digest(EVPobject *self, PyObject *unused)
+ {
+ unsigned char digest[EVP_MAX_MD_SIZE];
+- EVP_MD_CTX temp_ctx;
++ EVP_MD_CTX *temp_ctx;
+ PyObject *retval;
+ unsigned int digest_size;
+
+- locked_EVP_MD_CTX_copy(&temp_ctx, self);
+- digest_size = EVP_MD_CTX_size(&temp_ctx);
+- EVP_DigestFinal(&temp_ctx, digest, NULL);
++ temp_ctx = EVP_MD_CTX_new();
++ if (temp_ctx == NULL) {
++ PyErr_NoMemory();
++ return NULL;
++ }
++
++ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
++ return _setException(PyExc_ValueError);
++ }
++ digest_size = EVP_MD_CTX_size(temp_ctx);
++ EVP_DigestFinal(temp_ctx, digest, NULL);
+
+ retval = PyBytes_FromStringAndSize((const char *)digest, digest_size);
+- EVP_MD_CTX_cleanup(&temp_ctx);
++ EVP_MD_CTX_free(temp_ctx);
+ return retval;
+ }
+
+@@ -209,15 +267,23 @@ static PyObject *
+ EVP_hexdigest(EVPobject *self, PyObject *unused)
+ {
+ unsigned char digest[EVP_MAX_MD_SIZE];
+- EVP_MD_CTX temp_ctx;
++ EVP_MD_CTX *temp_ctx;
+ unsigned int digest_size;
+
++ temp_ctx = EVP_MD_CTX_new();
++ if (temp_ctx == NULL) {
++ PyErr_NoMemory();
++ return NULL;
++ }
++
+ /* Get the raw (binary) digest value */
+- locked_EVP_MD_CTX_copy(&temp_ctx, self);
+- digest_size = EVP_MD_CTX_size(&temp_ctx);
+- EVP_DigestFinal(&temp_ctx, digest, NULL);
++ if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) {
++ return _setException(PyExc_ValueError);
++ }
++ digest_size = EVP_MD_CTX_size(temp_ctx);
++ EVP_DigestFinal(temp_ctx, digest, NULL);
+
+- EVP_MD_CTX_cleanup(&temp_ctx);
++ EVP_MD_CTX_free(temp_ctx);
+
+ return _Py_strhex((const char *)digest, digest_size);
+ }
+@@ -271,7 +337,7 @@ static PyObject *
+ EVP_get_block_size(EVPobject *self, void *closure)
+ {
+ long block_size;
+- block_size = EVP_MD_CTX_block_size(&self->ctx);
++ block_size = EVP_MD_CTX_block_size(self->ctx);
+ return PyLong_FromLong(block_size);
+ }
+
+@@ -279,7 +345,7 @@ static PyObject *
+ EVP_get_digest_size(EVPobject *self, void *closure)
+ {
+ long size;
+- size = EVP_MD_CTX_size(&self->ctx);
++ size = EVP_MD_CTX_size(self->ctx);
+ return PyLong_FromLong(size);
+ }
+
+@@ -341,8 +407,8 @@ EVP_tp_init(EVPobject *self, PyObject *a
+ PyBuffer_Release(&view);
+ return -1;
+ }
+- mc_ctx_init(&self->ctx, usedforsecurity);
+- if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
++ mc_ctx_init(self->ctx, usedforsecurity);
++ if (!EVP_DigestInit_ex(self->ctx, digest, NULL)) {
+ set_evp_exception();
+ PyBuffer_Release(&view);
+ return -1;
+@@ -444,10 +510,10 @@ EVPnew(PyObject *name_obj,
+ return NULL;
+
+ if (initial_ctx) {
+- EVP_MD_CTX_copy(&self->ctx, initial_ctx);
++ EVP_MD_CTX_copy(self->ctx, initial_ctx);
+ } else {
+- mc_ctx_init(&self->ctx, usedforsecurity);
+- if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
++ mc_ctx_init(self->ctx, usedforsecurity);
++ if (!EVP_DigestInit_ex(self->ctx, digest, NULL)) {
+ set_evp_exception();
+ Py_DECREF(self);
+ return NULL;
+@@ -526,6 +592,7 @@ EVP_new(PyObject *self, PyObject *args,
+
+ #define PY_PBKDF2_HMAC 1
+
++#if !HAS_FAST_PKCS5_PBKDF2_HMAC
+ /* Improved implementation of PKCS5_PBKDF2_HMAC()
+ *
+ * PKCS5_PBKDF2_HMAC_fast() hashes the password exactly one time instead of
+@@ -607,37 +674,8 @@ PKCS5_PBKDF2_HMAC_fast(const char *pass,
+ HMAC_CTX_cleanup(&hctx_tpl);
+ return 1;
+ }
++#endif
+
+-/* LCOV_EXCL_START */
+-static PyObject *
+-_setException(PyObject *exc)
+-{
+- unsigned long errcode;
+- const char *lib, *func, *reason;
+-
+- errcode = ERR_peek_last_error();
+- if (!errcode) {
+- PyErr_SetString(exc, "unknown reasons");
+- return NULL;
+- }
+- ERR_clear_error();
+-
+- lib = ERR_lib_error_string(errcode);
+- func = ERR_func_error_string(errcode);
+- reason = ERR_reason_error_string(errcode);
+-
+- if (lib && func) {
+- PyErr_Format(exc, "[%s: %s] %s", lib, func, reason);
+- }
+- else if (lib) {
+- PyErr_Format(exc, "[%s] %s", lib, reason);
+- }
+- else {
+- PyErr_SetString(exc, reason);
+- }
+- return NULL;
+-}
+-/* LCOV_EXCL_STOP */
+
+ PyDoc_STRVAR(pbkdf2_hmac__doc__,
+ "pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) -> key\n\
+@@ -719,10 +757,17 @@ pbkdf2_hmac(PyObject *self, PyObject *ar
+ key = PyBytes_AS_STRING(key_obj);
+
+ Py_BEGIN_ALLOW_THREADS
++#if HAS_FAST_PKCS5_PBKDF2_HMAC
++ retval = PKCS5_PBKDF2_HMAC((char*)password.buf, (int)password.len,
++ (unsigned char *)salt.buf, (int)salt.len,
++ iterations, digest, dklen,
++ (unsigned char *)key);
++#else
+ retval = PKCS5_PBKDF2_HMAC_fast((char*)password.buf, (int)password.len,
+ (unsigned char *)salt.buf, (int)salt.len,
+ iterations, digest, dklen,
+ (unsigned char *)key);
++#endif
+ Py_END_ALLOW_THREADS
+
+ if (!retval) {
+@@ -890,13 +935,15 @@ init_constructor_constant(EVPCachedInfo
+ if (EVP_get_digestbyname(name)) {
+ int i;
+ for (i=0; i<2; i++) {
+- mc_ctx_init(&cached_info->ctxs[i], i);
+- if (EVP_DigestInit_ex(&cached_info->ctxs[i],
++ cached_info->ctx_ptrs[i] = EVP_MD_CTX_new();
++ if (cached_info->ctx_ptrs[i] == NULL)
++ break;
++ mc_ctx_init(cached_info->ctx_ptrs[i], i);
++ if (EVP_DigestInit_ex(cached_info->ctx_ptrs[i],
+ EVP_get_digestbyname(name), NULL)) {
+- /* Success: */
+- cached_info->ctx_ptrs[i] = &cached_info->ctxs[i];
+ } else {
+ /* Failure: */
++ EVP_MD_CTX_free(cached_info->ctx_ptrs[i]);
+ cached_info->ctx_ptrs[i] = NULL;
+ cached_info->error_msgs[i] = error_msg_for_last_error();
+ }
+diff -up Python-3.5.2/Modules/_ssl.c.openssl11 Python-3.5.2/Modules/_ssl.c
+--- Python-3.5.2/Modules/_ssl.c.openssl11 2016-06-25 23:38:38.000000000 +0200
++++ Python-3.5.2/Modules/_ssl.c 2016-10-10 16:34:37.699049212 +0200
+@@ -55,6 +55,14 @@ static PySocketModule_APIObject PySocket
+ #include <sys/poll.h>
+ #endif
+
++/* Don't warn about deprecated functions */
++#ifdef __GNUC__
++#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
++#endif
++#ifdef __clang__
++#pragma clang diagnostic ignored "-Wdeprecated-declarations"
++#endif
++
+ /* Include OpenSSL header files */
+ #include "openssl/rsa.h"
+ #include "openssl/crypto.h"
+@@ -91,6 +99,10 @@ struct py_ssl_library_code {
+ /* Include generated data (error codes) */
+ #include "_ssl_data.h"
+
++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) &&
!defined(LIBRESSL_VERSION_NUMBER)
++# define OPENSSL_VERSION_1_1 1
++#endif
++
+ /* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
+
http://www.openssl.org/news/changelog.html
+ */
+@@ -113,6 +125,72 @@ struct py_ssl_library_code {
+ # define HAVE_ALPN
+ #endif
+
++#ifdef OPENSSL_VERSION_1_1
++/* OpenSSL 1.1.0+ */
++#ifndef OPENSSL_NO_SSL2
++#define OPENSSL_NO_SSL2
++#endif
++#else /* OpenSSL < 1.1.0 */
++#if defined(WITH_THREAD)
++#define HAVE_OPENSSL_CRYPTO_LOCK
++#endif
++
++#define TLS_method SSLv23_method
++
++static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
++{
++ return ne->set;
++}
++
++#ifndef OPENSSL_NO_COMP
++static int COMP_get_type(const COMP_METHOD *meth)
++{
++ return meth->type;
++}
++
++static const char *COMP_get_name(const COMP_METHOD *meth)
++{
++ return meth->name;
++}
++#endif
++
++static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
++{
++ return ctx->default_passwd_callback;
++}
++
++static void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx)
++{
++ return ctx->default_passwd_callback_userdata;
++}
++
++static int X509_OBJECT_get_type(X509_OBJECT *x)
++{
++ return x->type;
++}
++
++static X509 *X509_OBJECT_get0_X509(X509_OBJECT *x)
++{
++ return x->data.x509;
++}
++
++static int BIO_up_ref(BIO *b)
++{
++ CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO);
++ return 1;
++}
++
++static STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) {
++ return store->objs;
++}
++
++static X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *store)
++{
++ return store->param;
++}
++#endif /* OpenSSL < 1.1.0 or LibreSSL */
++
++
+ enum py_ssl_error {
+ /* these mirror ssl.h */
+ PY_SSL_ERROR_NONE,
+@@ -143,7 +221,7 @@ enum py_ssl_cert_requirements {
+ enum py_ssl_version {
+ PY_SSL_VERSION_SSL2,
+ PY_SSL_VERSION_SSL3=1,
+- PY_SSL_VERSION_SSL23,
++ PY_SSL_VERSION_TLS,
+ #if HAVE_TLSv1_2
+ PY_SSL_VERSION_TLS1,
+ PY_SSL_VERSION_TLS1_1,
+@@ -524,8 +602,8 @@ newPySSLSocket(PySSLContext *sslctx, PyS
+ /* BIOs are reference counted and SSL_set_bio borrows our reference.
+ * To prevent a double free in memory_bio_dealloc() we need to take an
+ * extra reference here. */
+- CRYPTO_add(&inbio->bio->references, 1, CRYPTO_LOCK_BIO);
+- CRYPTO_add(&outbio->bio->references, 1, CRYPTO_LOCK_BIO);
++ BIO_up_ref(inbio->bio);
++ BIO_up_ref(outbio->bio);
+ SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
+ }
+ mode = SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;
+@@ -736,7 +814,7 @@ _create_tuple_for_X509_NAME (X509_NAME *
+
+ /* check to see if we've gotten to a new RDN */
+ if (rdn_level >= 0) {
+- if (rdn_level != entry->set) {
++ if (rdn_level != X509_NAME_ENTRY_set(entry)) {
+ /* yes, new RDN */
+ /* add old RDN to DN */
+ rdnt = PyList_AsTuple(rdn);
+@@ -753,7 +831,7 @@ _create_tuple_for_X509_NAME (X509_NAME *
+ goto fail0;
+ }
+ }
+- rdn_level = entry->set;
++ rdn_level = X509_NAME_ENTRY_set(entry);
+
+ /* now add this attribute to the current RDN */
+ name = X509_NAME_ENTRY_get_object(entry);
+@@ -851,18 +929,18 @@ _get_peer_alt_names (X509 *certificate)
+ goto fail;
+ }
+
+- p = ext->value->data;
++ p = X509_EXTENSION_get_data(ext)->data;
+ if (method->it)
+ names = (GENERAL_NAMES*)
+ (ASN1_item_d2i(NULL,
+ &p,
+- ext->value->length,
++ X509_EXTENSION_get_data(ext)->length,
+ ASN1_ITEM_ptr(method->it)));
+ else
+ names = (GENERAL_NAMES*)
+ (method->d2i(NULL,
+ &p,
+- ext->value->length));
++ X509_EXTENSION_get_data(ext)->length));
+
+ for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
+ /* get a rendering of each name in the set of names */
+@@ -1073,13 +1151,11 @@ _get_crl_dp(X509 *certificate) {
+ int i, j;
+ PyObject *lst, *res = NULL;
+
+-#if OPENSSL_VERSION_NUMBER < 0x10001000L
+- dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
+-#else
++#if OPENSSL_VERSION_NUMBER >= 0x10001000L
+ /* Calls x509v3_cache_extensions and sets up crldp */
+ X509_check_ca(certificate);
+- dps = certificate->crldp;
+ #endif
++ dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
+
+ if (dps == NULL)
+ return Py_None;
+@@ -1449,14 +1525,13 @@ static PyObject *
+ _ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
+ /*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
+ {
+- SSL_SESSION *sess = SSL_get_session(self->ssl);
+ STACK_OF(SSL_CIPHER) *ciphers;
+ int i;
+ PyObject *res;
+
+- if (!sess || !sess->ciphers)
++ ciphers = SSL_get_ciphers(self->ssl);
++ if (!ciphers)
+ Py_RETURN_NONE;
+- ciphers = sess->ciphers;
+ res = PyList_New(sk_SSL_CIPHER_num(ciphers));
+ if (!res)
+ return NULL;
+@@ -1565,9 +1640,9 @@ _ssl__SSLSocket_compression_impl(PySSLSo
+ if (self->ssl == NULL)
+ Py_RETURN_NONE;
+ comp_method = SSL_get_current_compression(self->ssl);
+- if (comp_method == NULL || comp_method->type == NID_undef)
++ if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
+ Py_RETURN_NONE;
+- short_name = OBJ_nid2sn(comp_method->type);
++ short_name = COMP_get_name(comp_method);
+ if (short_name == NULL)
+ Py_RETURN_NONE;
+ return PyUnicode_DecodeFSDefault(short_name);
+@@ -2245,8 +2320,8 @@ _ssl__SSLContext_impl(PyTypeObject *type
+ else if (proto_version == PY_SSL_VERSION_SSL2)
+ ctx = SSL_CTX_new(SSLv2_method());
+ #endif
+- else if (proto_version == PY_SSL_VERSION_SSL23)
+- ctx = SSL_CTX_new(SSLv23_method());
++ else if (proto_version == PY_SSL_VERSION_TLS)
++ ctx = SSL_CTX_new(TLS_method());
+ else
+ proto_version = -1;
+ PySSL_END_ALLOW_THREADS
+@@ -2308,8 +2383,9 @@ _ssl__SSLContext_impl(PyTypeObject *type
+ #ifndef OPENSSL_NO_ECDH
+ /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use
+ prime256v1 by default. This is Apache mod_ssl's initialization
+- policy, so we should be safe. */
+-#if defined(SSL_CTX_set_ecdh_auto)
++ policy, so we should be safe. OpenSSL 1.1 has it enabled by default.
++ */
++#if defined(SSL_CTX_set_ecdh_auto) && !defined(OPENSSL_VERSION_1_1)
+ SSL_CTX_set_ecdh_auto(self->ctx, 1);
+ #else
+ {
+@@ -2576,10 +2652,12 @@ static PyObject *
+ get_verify_flags(PySSLContext *self, void *c)
+ {
+ X509_STORE *store;
++ X509_VERIFY_PARAM *param;
+ unsigned long flags;
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+- flags = X509_VERIFY_PARAM_get_flags(store->param);
++ param = X509_STORE_get0_param(store);
++ flags = X509_VERIFY_PARAM_get_flags(param);
+ return PyLong_FromUnsignedLong(flags);
+ }
+
+@@ -2587,22 +2665,24 @@ static int
+ set_verify_flags(PySSLContext *self, PyObject *arg, void *c)
+ {
+ X509_STORE *store;
++ X509_VERIFY_PARAM *param;
+ unsigned long new_flags, flags, set, clear;
+
+ if (!PyArg_Parse(arg, "k", &new_flags))
+ return -1;
+ store = SSL_CTX_get_cert_store(self->ctx);
+- flags = X509_VERIFY_PARAM_get_flags(store->param);
++ param = X509_STORE_get0_param(store);
++ flags = X509_VERIFY_PARAM_get_flags(param);
+ clear = flags & ~new_flags;
+ set = ~flags & new_flags;
+ if (clear) {
+- if (!X509_VERIFY_PARAM_clear_flags(store->param, clear)) {
++ if (!X509_VERIFY_PARAM_clear_flags(param, clear)) {
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ return -1;
+ }
+ }
+ if (set) {
+- if (!X509_VERIFY_PARAM_set_flags(store->param, set)) {
++ if (!X509_VERIFY_PARAM_set_flags(param, set)) {
+ _setSSLError(NULL, 0, __FILE__, __LINE__);
+ return -1;
+ }
+@@ -2779,8 +2859,8 @@ _ssl__SSLContext_load_cert_chain_impl(Py
+ /*[clinic end generated code: output=9480bc1c380e2095 input=7cf9ac673cbee6fc]*/
+ {
+ PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
+- pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback;
+- void *orig_passwd_userdata = self->ctx->default_passwd_callback_userdata;
++ pem_password_cb *orig_passwd_cb = SSL_CTX_get_default_passwd_cb(self->ctx);
++ void *orig_passwd_userdata = SSL_CTX_get_default_passwd_cb_userdata(self->ctx);
+ _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
+ int r;
+
+@@ -2907,8 +2987,9 @@ _add_ca_certs(PySSLContext *self, void *
+ cert = d2i_X509_bio(biobuf, NULL);
+ } else {
+ cert = PEM_read_bio_X509(biobuf, NULL,
+- self->ctx->default_passwd_callback,
+-
self->ctx->default_passwd_callback_userdata);
++ SSL_CTX_get_default_passwd_cb(self->ctx),
++
SSL_CTX_get_default_passwd_cb_userdata(self->ctx)
++ );
+ }
+ if (cert == NULL) {
+ break;
+@@ -3434,25 +3515,24 @@ _ssl__SSLContext_cert_store_stats_impl(P
+ /*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
+ {
+ X509_STORE *store;
++ STACK_OF(X509_OBJECT) *objs;
+ X509_OBJECT *obj;
+- int x509 = 0, crl = 0, pkey = 0, ca = 0, i;
++ int x509 = 0, crl = 0, ca = 0, i;
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
+- obj = sk_X509_OBJECT_value(store->objs, i);
+- switch (obj->type) {
++ objs = X509_STORE_get0_objects(store);
++ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
++ obj = sk_X509_OBJECT_value(objs, i);
++ switch (X509_OBJECT_get_type(obj)) {
+ case X509_LU_X509:
+ x509++;
+- if (X509_check_ca(obj->data.x509)) {
++ if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
+ ca++;
+ }
+ break;
+ case X509_LU_CRL:
+ crl++;
+ break;
+- case X509_LU_PKEY:
+- pkey++;
+- break;
+ default:
+ /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
+ * As far as I can tell they are internal states and never
+@@ -3482,6 +3562,7 @@ _ssl__SSLContext_get_ca_certs_impl(PySSL
+ /*[clinic end generated code: output=0d58f148f37e2938 input=6887b5a09b7f9076]*/
+ {
+ X509_STORE *store;
++ STACK_OF(X509_OBJECT) *objs;
+ PyObject *ci = NULL, *rlist = NULL;
+ int i;
+
+@@ -3490,17 +3571,18 @@ _ssl__SSLContext_get_ca_certs_impl(PySSL
+ }
+
+ store = SSL_CTX_get_cert_store(self->ctx);
+- for (i = 0; i < sk_X509_OBJECT_num(store->objs); i++) {
++ objs = X509_STORE_get0_objects(store);
++ for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
+ X509_OBJECT *obj;
+ X509 *cert;
+
+- obj = sk_X509_OBJECT_value(store->objs, i);
+- if (obj->type != X509_LU_X509) {
++ obj = sk_X509_OBJECT_value(objs, i);
++ if (X509_OBJECT_get_type(obj) != X509_LU_X509) {
+ /* not a x509 cert */
+ continue;
+ }
+ /* CA for any purpose */
+- cert = obj->data.x509;
++ cert = X509_OBJECT_get0_X509(obj);
+ if (!X509_check_ca(cert)) {
+ continue;
+ }
+@@ -4364,10 +4446,12 @@ static PyMethodDef PySSL_methods[] = {
+ };
+
+
+-#ifdef WITH_THREAD
++#ifdef HAVE_OPENSSL_CRYPTO_LOCK
+
+ /* an implementation of OpenSSL threading operations in terms
+- of the Python C thread library */
++ * of the Python C thread library
++ * Only used up to 1.0.2. OpenSSL 1.1.0+ has its own locking code.
++ */
+
+ static PyThread_type_lock *_ssl_locks = NULL;
+
+@@ -4448,7 +4532,7 @@ static int _setup_ssl_threads(void) {
+ return 1;
+ }
+
+-#endif /* def HAVE_THREAD */
++#endif /* HAVE_OPENSSL_CRYPTO_LOCK for WITH_THREAD && OpenSSL < 1.1.0 */
+
+ PyDoc_STRVAR(module_doc,
+ "Implementation module for SSL socket operations. See the socket module\n\
+@@ -4517,11 +4601,16 @@ PyInit__ssl(void)
+ SSL_load_error_strings();
+ SSL_library_init();
+ #ifdef WITH_THREAD
++#ifdef HAVE_OPENSSL_CRYPTO_LOCK
+ /* note that this will start threading if not already started */
+ if (!_setup_ssl_threads()) {
+ return NULL;
+ }
++#elif OPENSSL_VERSION_1_1 && defined(OPENSSL_THREADS)
++ /* OpenSSL 1.1.0 builtin thread support is enabled */
++ _ssl_locks_count++;
+ #endif
++#endif /* WITH_THREAD */
+ OpenSSL_add_all_algorithms();
+
+ /* Add symbols to module dict */
+@@ -4668,7 +4757,9 @@ PyInit__ssl(void)
+ PY_SSL_VERSION_SSL3);
+ #endif
+ PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
+- PY_SSL_VERSION_SSL23);
++ PY_SSL_VERSION_TLS);
++ PyModule_AddIntConstant(m, "PROTOCOL_TLS",
++ PY_SSL_VERSION_TLS);
+ PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
+ PY_SSL_VERSION_TLS1);
+ #if HAVE_TLSv1_2
diff --git a/python3.spec b/python3.spec
index 97245ae..73aca06 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -413,6 +413,9 @@ Patch242: 00242-CVE-2016-1000110-httpoxy.patch
# Fedora needs the default mips64-linux-gnu
Patch243: 00243-fix-mips64-triplet.patch
+# Make it build with OpenSSL-1.1.0 based on upstream patch
+Patch244: Python-3.5.2-openssl11.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
@@ -656,6 +659,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch209 -p1
%patch242 -p1
%patch243 -p1
+%patch244 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1555,6 +1559,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Oct 10 2016 Tom Mrz <tmraz(a)redhat.com> - 3.5.2-5
+- Make it build with OpenSSL-1.1.0 based on upstream patch
+
* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
- Obsolete and Provide python35 package
commit c3e3d7792d2ad77cd9dd71e3c0658712c7fb0153
Author: Richard W.M. Jones <rjones(a)redhat.com>
Date: Sun Oct 9 11:08:09 2016 +0100
Add riscv64 to list of 64 bit arches.
diff --git a/python3.spec b/python3.spec
index da2d3d5..97245ae 100644
--- a/python3.spec
+++ b/python3.spec
@@ -860,7 +860,7 @@ install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/
%global _pyconfig32_h pyconfig-32.h
%global _pyconfig64_h pyconfig-64.h
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64}
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64} riscv64
%global _pyconfig_h %{_pyconfig64_h}
%else
%global _pyconfig_h %{_pyconfig32_h}
commit 05c99bb32e22ed9e04f8554c851e3c21e9e6e6ca
Author: Richard W.M. Jones <rjones(a)redhat.com>
Date: Sat Oct 8 07:17:21 2016 +0100
No valgrind available on riscv64.
diff --git a/python3.spec b/python3.spec
index 3988238..da2d3d5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -71,7 +71,7 @@
%global with_systemtap 1
# some arches don't have valgrind so we need to disable its support on them
-%ifnarch s390 %{mips}
+%ifnarch s390 %{mips} riscv64
%global with_valgrind 1
%else
%global with_valgrind 0
commit 1768987fbca92f1ea4820046c3f294c8b50ec949
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Sep 13 17:08:19 2016 +0200
Provide python35 for ensuring upgrade path from F23->f25
diff --git a/python3.spec b/python3.spec
index 5e106aa..3988238 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -440,6 +440,14 @@ Provides: python(abi) = %{pybasever}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+# In order to support multiple python interpreters, apart from the system python3,
+# for development purposes, new packages were introduced which can be installed in
parallel
+# with the main python3 package (e.g. 1369688), with the naming scheme
'python<version>',
+# however in order to keep the upgrade path clean we need to Obsolete and Provide
+# these packages at the main python3 package.
+Obsoletes: python%{pyshortver}
+Provides: python%{pyshortver} = %{version}-%{release}
+
%if 0%{with_rewheel}
Requires: python3-setuptools
Requires: python3-pip
@@ -1547,6 +1555,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Sep 14 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-4
+- Obsolete and Provide python35 package
+
* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
- Update %py_byte_compile macro
- Remove unused configure flags (rhbz#1374357)
commit 5941d2af7fabbec1245fc4215c4643bc19c516b8
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Sep 12 14:45:49 2016 +0200
Remove unused configure flags and update %py_byte_compile macro
diff --git a/macros.pybytecompile3.5 b/macros.pybytecompile3.5
index a8b79b2..96d1826 100644
--- a/macros.pybytecompile3.5
+++ b/macros.pybytecompile3.5
@@ -6,7 +6,5 @@
%py_byte_compile()\
python_binary="%1"\
bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
-\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]], optimize=opt) for opt in range(2) for
f in sys.argv[1:]]' || :\
%{nil}
diff --git a/python3.spec b/python3.spec
index c88d1a0..5e106aa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -735,9 +735,9 @@ BuildPython debug \
python-debug \
python%{pybasever}-debug \
%ifarch %{ix86} x86_64 ppc %{power64}
- "--with-pydebug --with-tsc --with-count-allocs --with-call-profile
--without-ensurepip" \
+ "--with-pydebug --with-tsc --without-ensurepip" \
%else
- "--with-pydebug --with-count-allocs --with-call-profile --without-ensurepip"
\
+ "--with-pydebug --without-ensurepip" \
%endif
false \
-O0
@@ -1547,6 +1547,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Sep 12 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.2-3
+- Update %py_byte_compile macro
+- Remove unused configure flags (rhbz#1374357)
+
* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
recompile optimized .pyc files
commit b2fa0070fc17759cbb41123dc7cb7b118467f771
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Fri Sep 9 13:27:29 2016 +0200
Fixed .pyc bytecompilation
- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
recompile optimized .pyc files
- Removed .pyo 'bytecompilation with the newly installed interpreter', as
.pyo
files are no more
- Resolves rhbz#1373635
diff --git a/python3.spec b/python3.spec
index 980347d..c88d1a0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -953,16 +953,11 @@ iconv -f iso8859-1 -t utf-8 %{buildroot}/%{pylibdir}/Demo/rpc/README
> README.co
# Do bytecompilation with the newly installed interpreter.
# This is similar to the script in macros.pybytecompile
-# compile *.pyo
-find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2]) for f in
sys.argv[1:]]' || :
# compile *.pyc
find %{buildroot} -type f -a -name "*.py" -print0 | \
LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
- xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=0) for f
in sys.argv[1:]]' || :
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=opt) for
opt in range(3) for f in sys.argv[1:]]' || :
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
find %{buildroot} \
@@ -1552,6 +1547,13 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Sep 09 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-2
+- Updated .pyc 'bytecompilation with the newly installed interpreter' to also
+ recompile optimized .pyc files
+- Removed .pyo 'bytecompilation with the newly installed interpreter', as .pyo
+ files are no more
+- Resolves rhbz#1373635
+
* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
- Rebased to version 3.5.2
- Set to work with pip version 8.1.2
commit ea6fb09bb5e8a4dc55c3c7baba1d574eab711d01
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Tue Aug 16 14:11:24 2016 +0200
New sources have to be commited separately of course
diff --git a/sources b/sources
index 106fda6..aeb1966 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-e9ea6f2623fffcdd871b7b19113fde80 Python-3.5.1.tar.xz
+8906efbacfcdc7c3c9198aeefafd159e Python-3.5.2.tar.xz
commit 6cd1c5f46379304831d14e0590c17b7ee458025b
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Mon Aug 15 12:39:18 2016 +0200
Rebased to Python 3.5.2
diff --git a/00102-lib64.patch b/00102-lib64.patch
index be67b9b..35a442e 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -1,6 +1,8 @@
---- Python-3.4.0b1/Lib/distutils/command/install.py.lib64 2013-11-24
21:36:54.000000000 +0100
-+++ Python-3.4.0b1/Lib/distutils/command/install.py 2013-11-27 11:10:43.821150774
+0100
-@@ -45,14 +45,14 @@ else:
+diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
+index 67db007..b16fe0f 100644
+--- 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',
@@ -17,9 +19,11 @@
'headers': '$base/include/python/$dist_name',
'scripts': '$base/bin',
'data' : '$base',
---- Python-3.4.0b1/Lib/distutils/sysconfig.py.lib64 2013-11-24 21:36:54.000000000 +0100
-+++ Python-3.4.0b1/Lib/distutils/sysconfig.py 2013-11-27 11:10:43.821150774 +0100
-@@ -141,8 +141,12 @@
+diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
+index e5c493d..a4846eb 100644
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -132,8 +132,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
prefix = plat_specific and EXEC_PREFIX or PREFIX
if os.name == "posix":
@@ -33,9 +37,11 @@
if standard_lib:
return libpython
else:
---- Python-3.4.0b1/Lib/site.py.lib64 2013-11-24 21:36:54.000000000 +0100
-+++ Python-3.4.0b1/Lib/site.py 2013-11-27 11:10:43.822150773 +0100
-@@ -304,11 +304,15 @@
+diff --git a/Lib/site.py b/Lib/site.py
+index 3f78ef5..ad1033e 100644
+--- a/Lib/site.py
++++ b/Lib/site.py
+@@ -303,11 +303,15 @@ def getsitepackages(prefixes=None):
seen.add(prefix)
if os.sep == '/':
@@ -51,9 +57,11 @@
sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
if sys.platform == "darwin":
# for framework builds *only* we add the standard Apple
---- Python-3.4.0b1/Lib/sysconfig.py.lib64 2013-11-24 21:36:54.000000000 +0100
-+++ Python-3.4.0b1/Lib/sysconfig.py 2013-11-27 11:10:43.822150773 +0100
-@@ -20,10 +20,10 @@
+diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
+index 61451b2..b021cce 100644
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -20,10 +20,10 @@ __all__ = [
_INSTALL_SCHEMES = {
'posix_prefix': {
@@ -67,7 +75,7 @@
'include':
'{installed_base}/include/python{py_version_short}{abiflags}',
'platinclude':
-@@ -61,10 +61,10 @@
+@@ -61,10 +61,10 @@ _INSTALL_SCHEMES = {
'data': '{userbase}',
},
'posix_user': {
@@ -81,9 +89,11 @@
'include': '{userbase}/include/python{py_version_short}',
'scripts': '{userbase}/bin',
'data': '{userbase}',
---- Python-3.4.0b1/Lib/test/test_site.py.lib64 2013-11-24 21:36:55.000000000 +0100
-+++ Python-3.4.0b1/Lib/test/test_site.py 2013-11-27 11:10:43.822150773 +0100
-@@ -244,8 +244,8 @@
+diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
+index da20a3d..f38ce06 100644
+--- a/Lib/test/test_site.py
++++ b/Lib/test/test_site.py
+@@ -248,8 +248,8 @@ class HelperFunctionsTests(unittest.TestCase):
self.assertEqual(dirs[1], wanted)
elif os.sep == '/':
# OS X non-framwework builds, Linux, FreeBSD, etc
@@ -94,9 +104,11 @@
'site-packages')
self.assertEqual(dirs[0], wanted)
else:
---- Python-3.4.0b1/Makefile.pre.in.lib64 2013-11-27 11:10:43.814150786 +0100
-+++ Python-3.4.0b1/Makefile.pre.in 2013-11-27 11:10:43.823150771 +0100
-@@ -115,7 +115,7 @@
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index 58d4258..e8364f0 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -125,7 +125,7 @@ LIBDIR= @libdir@
MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
@@ -105,20 +117,11 @@
ABIFLAGS= @ABIFLAGS@
# Detailed destination directories
---- Python-3.4.0b1/Modules/getpath.c.lib64 2013-11-24 21:36:56.000000000 +0100
-+++ Python-3.4.0b1/Modules/getpath.c 2013-11-27 11:17:33.619449704 +0100
-@@ -122,8 +122,8 @@
- #endif
-
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
-+#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
-+ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
- #endif
-
- #ifndef LANDMARK
-@@ -498,7 +498,7 @@
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index 18deb60..27ca814 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -494,7 +494,7 @@ calculate_path(void)
_pythonpath = Py_DecodeLocale(PYTHONPATH, NULL);
_prefix = Py_DecodeLocale(PREFIX, NULL);
_exec_prefix = Py_DecodeLocale(EXEC_PREFIX, NULL);
@@ -127,7 +130,7 @@
if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
Py_FatalError(
-@@ -687,7 +687,7 @@
+@@ -683,7 +683,7 @@ calculate_path(void)
}
else
wcsncpy(zip_path, _prefix, MAXPATHLEN);
@@ -136,7 +139,7 @@
bufsz = wcslen(zip_path); /* Replace "00" with version */
zip_path[bufsz - 6] = VERSION[0];
zip_path[bufsz - 5] = VERSION[2];
-@@ -699,7 +699,7 @@
+@@ -695,7 +695,7 @@ calculate_path(void)
fprintf(stderr,
"Could not find platform dependent libraries
<exec_prefix>\n");
wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
@@ -145,9 +148,11 @@
}
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
---- Python-3.4.0b1/setup.py.lib64 2013-11-24 21:36:56.000000000 +0100
-+++ Python-3.4.0b1/setup.py 2013-11-27 11:10:43.824150769 +0100
-@@ -441,7 +441,7 @@
+diff --git a/setup.py b/setup.py
+index be33c46..f2779cc 100644
+--- a/setup.py
++++ b/setup.py
+@@ -492,7 +492,7 @@ class PyBuildExt(build_ext):
# directories (i.e. '.' and 'Include') must be first. See
issue
# 10520.
if not cross_compiling:
@@ -156,7 +161,7 @@
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:
-@@ -718,11 +718,11 @@
+@@ -780,11 +780,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
elif self.compiler.find_library_file(lib_dirs +
@@ -170,7 +175,7 @@
extra_link_args=readline_extra_link_args,
libraries=readline_libs) )
else:
-@@ -759,8 +759,8 @@
+@@ -821,8 +821,8 @@ class PyBuildExt(build_ext):
if krb5_h:
ssl_incs += krb5_h
ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index 3d92c34..e0cdce0 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -1,6 +1,8 @@
---- Python-3.4.0b1/Lib/hashlib.py.hashlib-fips 2013-11-24 21:36:54.000000000 +0100
-+++ Python-3.4.0b1/Lib/hashlib.py 2013-11-27 11:45:17.073617547 +0100
-@@ -23,6 +23,16 @@
+diff --git a/Lib/hashlib.py b/Lib/hashlib.py
+index 316cece..b7ad879 100644
+--- a/Lib/hashlib.py
++++ b/Lib/hashlib.py
+@@ -23,6 +23,16 @@ the zlib module.
Choose your hash function wisely. Some have known collision weaknesses.
sha384 and sha512 will be slow on 32 bit platforms.
@@ -17,7 +19,7 @@
Hash objects have these methods:
- update(arg): Update the hash object with the bytes in arg. Repeated calls
are equivalent to a single call with the concatenation of all
-@@ -63,6 +73,19 @@
+@@ -62,6 +72,18 @@ algorithms_available = set(__always_supported)
__all__ = __always_supported + ('new', 'algorithms_guaranteed',
'algorithms_available', 'pbkdf2_hmac')
@@ -33,11 +35,10 @@
+ kwargs.pop('usedforsecurity')
+ return func(*args, **kwargs)
+ return inner
-+
__builtin_constructor_cache = {}
-@@ -108,34 +131,41 @@
+@@ -100,31 +122,39 @@ def __get_openssl_constructor(name):
f = getattr(_hashlib, 'openssl_' + name)
# Allow the C module to raise ValueError. The function will be
# defined but the hash not actually available thanks to OpenSSL.
@@ -88,11 +89,8 @@
+ # because we want to make sure that Fedora uses everything from OpenSSL
return __get_builtin_constructor(name)(data)
--
- try:
- import _hashlib
- new = __hash_new
-@@ -215,7 +245,10 @@
+
+@@ -207,7 +237,10 @@ for __func_name in __always_supported:
# try them all, some may not work due to the OpenSSL
# version not supporting that algorithm.
try:
@@ -104,14 +102,17 @@
except ValueError:
import logging
logging.exception('code for hash %s was not found.', __func_name)
-@@ -223,3 +256,4 @@
+@@ -215,3 +248,4 @@ for __func_name in __always_supported:
# Cleanup locals()
del __always_supported, __func_name, __get_hash
del __py_new, __hash_new, __get_openssl_constructor
+del __ignore_usedforsecurity
---- Python-3.4.0b1/Lib/test/test_hashlib.py 2013-11-27 11:55:42.769601363 +0100
-+++ Python-3.4.0b1/Lib/test/test_hashlib.py 2013-11-28 09:33:03.929008508 +0100
-@@ -24,7 +24,22 @@
+\ No newline at end of file
+diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
+index c9b113e..60e2392 100644
+--- a/Lib/test/test_hashlib.py
++++ b/Lib/test/test_hashlib.py
+@@ -24,7 +24,22 @@ from test.support import _4G, bigmemtest, import_fresh_module
COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
@@ -135,7 +136,7 @@
def hexstr(s):
assert isinstance(s, bytes), repr(s)
-@@ -34,6 +49,16 @@
+@@ -34,6 +49,16 @@ def hexstr(s):
r += h[(i >> 4) & 0xF] + h[i & 0xF]
return r
@@ -152,7 +153,7 @@
class HashLibTestCase(unittest.TestCase):
supported_hash_names = ( 'md5', 'MD5', 'sha1',
'SHA1',
-@@ -66,11 +91,11 @@
+@@ -63,11 +88,11 @@ class HashLibTestCase(unittest.TestCase):
# For each algorithm, test the direct constructor and the use
# of hashlib.new given the algorithm name.
for algorithm, constructors in self.constructors_to_test.items():
@@ -167,7 +168,7 @@
constructors.add(_test_algorithm_via_hashlib_new)
_hashlib = self._conditional_import_module('_hashlib')
-@@ -82,26 +107,12 @@
+@@ -79,27 +104,12 @@ class HashLibTestCase(unittest.TestCase):
for algorithm, constructors in self.constructors_to_test.items():
constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
if constructor:
@@ -192,10 +193,11 @@
- if _sha512:
- add_builtin_constructor('sha384')
- add_builtin_constructor('sha512')
-
+-
super(HashLibTestCase, self).__init__(*args, **kwargs)
-@@ -157,9 +169,6 @@
+ @property
+@@ -148,9 +158,6 @@ class HashLibTestCase(unittest.TestCase):
else:
del sys.modules['_md5']
self.assertRaises(TypeError, get_builtin_constructor, 3)
@@ -205,7 +207,7 @@
def test_hexdigest(self):
for cons in self.hash_constructors:
-@@ -558,6 +567,65 @@
+@@ -433,6 +440,64 @@ class HashLibTestCase(unittest.TestCase):
self.assertEqual(expected_hash, hasher.hexdigest())
@@ -267,21 +269,23 @@
+
+ m = _hashlib.new('md5', b'abc\n', usedforsecurity=False)
+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
-+
class KDFTests(unittest.TestCase):
-@@ -639,6 +707,7 @@
- with self.assertRaisesRegex(ValueError, 'unsupported hash type'):
- pbkdf2('unknown', b'pass', b'salt', 1)
-
+@@ -516,7 +581,7 @@ class KDFTests(unittest.TestCase):
+ out = pbkdf2(hash_name='sha1', password=b'password',
salt=b'salt',
+ iterations=1, dklen=None)
+ self.assertEqual(out, self.pbkdf2_results['sha1'][0][0])
+-
+ @unittest.skip('skipped on Fedora, as we always use OpenSSL pbkdf2_hmac')
def test_pbkdf2_hmac_py(self):
self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac)
---- Python-3.4.0b1/Modules/_hashopenssl.c.hashlib-fips 2013-11-24 21:36:56.000000000
+0100
-+++ Python-3.4.0b1/Modules/_hashopenssl.c 2013-11-27 12:01:57.443537463 +0100
-@@ -19,6 +19,8 @@
+diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
+index 44765ac..b8cf490 100644
+--- a/Modules/_hashopenssl.c
++++ b/Modules/_hashopenssl.c
+@@ -20,6 +20,8 @@
/* EVP is the preferred interface to hashing in OpenSSL */
@@ -290,7 +294,7 @@
#include <openssl/evp.h>
#include <openssl/hmac.h>
/* We use the object interface to discover what hashes OpenSSL supports. */
-@@ -48,11 +50,19 @@
+@@ -45,11 +47,19 @@ typedef struct {
static PyTypeObject EVPtype;
@@ -314,7 +318,7 @@
DEFINE_CONSTS_FOR_NEW(md5)
DEFINE_CONSTS_FOR_NEW(sha1)
-@@ -97,6 +107,48 @@
+@@ -92,6 +102,48 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len)
}
}
@@ -363,7 +367,7 @@
/* Internal methods for a hash object */
static void
-@@ -281,15 +333,16 @@
+@@ -259,15 +311,16 @@ EVP_repr(EVPobject *self)
static int
EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds)
{
@@ -383,7 +387,7 @@
return -1;
}
-@@ -310,7 +363,12 @@
+@@ -288,7 +341,12 @@ EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds)
PyBuffer_Release(&view);
return -1;
}
@@ -397,7 +401,7 @@
self->name = name_obj;
Py_INCREF(self->name);
-@@ -394,7 +452,8 @@
+@@ -372,7 +430,8 @@ static PyTypeObject EVPtype = {
static PyObject *
EVPnew(PyObject *name_obj,
const EVP_MD *digest, const EVP_MD_CTX *initial_ctx,
@@ -407,7 +411,7 @@
{
EVPobject *self;
-@@ -409,7 +468,12 @@
+@@ -387,7 +446,12 @@ EVPnew(PyObject *name_obj,
if (initial_ctx) {
EVP_MD_CTX_copy(&self->ctx, initial_ctx);
} else {
@@ -421,7 +425,7 @@
}
if (cp && len) {
-@@ -433,21 +497,29 @@
+@@ -411,21 +475,29 @@ PyDoc_STRVAR(EVP_new__doc__,
An optional string argument may be provided and will be\n\
automatically hashed.\n\
\n\
@@ -455,17 +459,17 @@
return NULL;
}
-@@ -461,7 +533,8 @@
+@@ -439,7 +511,8 @@ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict)
digest = EVP_get_digestbyname(name);
- ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, view.len);
+ ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, view.len,
-+ usedforsecurity);
++ usedforsecurity);
if (data_obj)
PyBuffer_Release(&view);
-@@ -742,57 +815,115 @@
+@@ -722,57 +795,114 @@ generate_hash_name_list(void)
/*
@@ -508,8 +512,8 @@
+ return implement_specific_EVP_new(self, args, kwdict, \
+ "|Oi:" #NAME, \
+ &cached_info_ ## NAME ); \
-+ }
-+
+ }
+
+static PyObject *
+implement_specific_EVP_new(PyObject *self, PyObject *args, PyObject *kwdict,
+ const char *format,
@@ -554,8 +558,8 @@
+ } else {
+ PyErr_SetString(PyExc_ValueError, "Error initializing hash");
+ }
- }
-
++ }
++
+ if (data_obj)
+ PyBuffer_Release(&view);
+
@@ -614,11 +618,10 @@
+ }
+ }
+}
-+
GEN_CONSTRUCTOR(md5)
GEN_CONSTRUCTOR(sha1)
-@@ -843,13 +974,10 @@
+@@ -819,13 +949,10 @@ PyInit__hashlib(void)
{
PyObject *m, *openssl_md_meth_names;
diff --git a/00200-gettext-plural-fix.patch b/00200-gettext-plural-fix.patch
deleted file mode 100644
index 93b817b..0000000
--- a/00200-gettext-plural-fix.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up Python-2.5.1/Lib/gettext.py.plural Python-2.5.1/Lib/gettext.py
---- Python-2.5.1/Lib/gettext.py.plural 2007-09-10 11:38:57.000000000 -0400
-+++ Python-2.5.1/Lib/gettext.py 2007-09-10 11:39:00.000000000 -0400
-@@ -299,6 +299,8 @@ class GNUTranslations(NullTranslations):
- item = b_item.decode().strip()
- if not item:
- continue
-+ if item.startswith("#"):
-+ continue
- if ':' in item:
- k, v = item.split(':', 1)
- k = k.strip().lower()
diff --git a/00201-fix-memory-leak-in-gdbm.patch b/00201-fix-memory-leak-in-gdbm.patch
deleted file mode 100644
index 48839d5..0000000
--- a/00201-fix-memory-leak-in-gdbm.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- Modules/_gdbmmodule.c.orig 2013-07-08 14:54:27.803790151 +0200
-+++ Modules/_gdbmmodule.c 2013-07-08 14:55:25.006672443 +0200
-@@ -106,6 +106,7 @@
- if(okey.dsize) free(okey.dptr);
- okey=key;
- }
-+ if(okey.dsize) free(okey.dptr);
- dp->di_size = size;
- }
- return dp->di_size;
diff --git a/00203-disable-threading-test-koji.patch
b/00203-disable-threading-test-koji.patch
deleted file mode 100644
index 70010fb..0000000
--- a/00203-disable-threading-test-koji.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-3.4.3/Lib/test/test_threading.py.mstuchli
Python-3.4.3/Lib/test/test_threading.py
---- Python-3.4.3/Lib/test/test_threading.py.mstuchli 2015-03-10 10:00:42.917355215 +0100
-+++ Python-3.4.3/Lib/test/test_threading.py 2015-03-10 10:00:47.735373842 +0100
-@@ -988,6 +988,7 @@ class ThreadingExceptionTests(BaseTestCa
- self.assertIn("ZeroDivisionError", err)
- self.assertNotIn("Unhandled exception", err)
-
-+ @unittest.skip('Fails in Koji due to mishandled signals')
- def test_print_exception_stderr_is_none_1(self):
- script = r"""if True:
- import sys
diff --git a/00207-math-once.patch b/00207-math-once.patch
deleted file mode 100644
index 572ed59..0000000
--- a/00207-math-once.patch
+++ /dev/null
@@ -1,56 +0,0 @@
---- Python-3.5.1/Makefile.pre.in.kh 2015-12-17 05:51:08.466546157 -0500
-+++ Python-3.5.1/Makefile.pre.in 2015-12-17 05:52:26.207761635 -0500
-@@ -587,11 +587,15 @@ pybuilddir.txt: $(BUILDPYTHON)
- exit 1 ; \
- fi
-
-+# This is shared by the math and cmath modules
-+Modules/_math.o: Modules/_math.c Modules/_math.h
-+ $(CC) -c $(CCSHARED) $(PY_CORE_CFLAGS) -o $@ $<
-+
- # Build the shared modules
- # Under GNU make, MAKEFLAGS are sorted and normalized; the 's' for
- # -s, --silent or --quiet is always the first char.
- # Under BSD make, MAKEFLAGS might be " -s -v x=y".
--sharedmods: $(BUILDPYTHON) pybuilddir.txt
-+sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
- @case "$$MAKEFLAGS" in \
- *\ -s*|s*) quiet="-q";; \
- *) quiet="";; \
---- Python-3.5.1/Misc/NEWS.kh 2015-12-17 05:53:40.898929946 -0500
-+++ Python-3.5.1/Misc/NEWS 2015-12-17 05:54:28.599676136 -0500
-@@ -464,6 +464,10 @@ Build
- - Issue #24986: It is now possible to build Python on Windows without errors
- when external libraries are not available.
-
-+- Issue #24421: Compile Modules/_math.c once, before building extensions.
-+ Previously it could fail to compile properly if the math and cmath builds
-+ were concurrent.
-+
- Windows
- -------
-
---- Python-3.5.1/setup.py.kh 2015-12-17 06:38:30.950955607 -0500
-+++ Python-3.5.1/setup.py 2015-12-17 06:42:32.074722493 -0500
-@@ -582,13 +582,17 @@ class PyBuildExt(build_ext):
-
- # array objects
- exts.append( Extension('array', ['arraymodule.c']) )
-+
-+ shared_math = 'Modules/_math.o'
- # complex math library functions
-- exts.append( Extension('cmath', ['cmathmodule.c',
'_math.c'],
-- depends=['_math.h'],
-+ exts.append( Extension('cmath', ['cmathmodule.c'],
-+ extra_objects=[shared_math],
-+ depends=['_math.h', shared_math],
- libraries=math_libs) )
- # math library functions, e.g. sin()
-- exts.append( Extension('math', ['mathmodule.c',
'_math.c'],
-- depends=['_math.h'],
-+ exts.append( Extension('math', ['mathmodule.c'],
-+ extra_objects=[shared_math],
-+ depends=['_math.h', shared_math],
- libraries=math_libs) )
-
- # time libraries: librt may be needed for clock_gettime()
diff --git a/00208-disable-test_with_pip-on-ppc.patch
b/00208-disable-test_with_pip-on-ppc.patch
deleted file mode 100644
index 00b98ae..0000000
--- a/00208-disable-test_with_pip-on-ppc.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-3.5.1/Lib/test/test_venv.py.1292467 Python-3.5.1/Lib/test/test_venv.py
---- Python-3.5.1/Lib/test/test_venv.py.1292467 2015-12-21 13:37:44.740190595 +0100
-+++ Python-3.5.1/Lib/test/test_venv.py 2015-12-21 13:40:25.707911828 +0100
-@@ -319,6 +319,7 @@ class EnsurePipTest(BaseTest):
-
- # Requesting pip fails without SSL (
http://bugs.python.org/issue19744)
- @unittest.skipIf(ssl is None, ensurepip._MISSING_SSL_MESSAGE)
-+ @unittest.skip('rhbz#1292467')
- def test_with_pip(self):
- rmtree(self.env_dir)
- with EnvironmentVarGuard() as envvars:
diff --git a/00237-Raise-an-error-when-STARTTLS-fails.patch
b/00237-Raise-an-error-when-STARTTLS-fails.patch
deleted file mode 100644
index 9083e61..0000000
--- a/00237-Raise-an-error-when-STARTTLS-fails.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 761db274ca898f8a92348ed5979d3d3c1b0d634a Mon Sep 17 00:00:00 2001
-From: Tomas Orsava <torsava(a)redhat.com>
-Date: Fri, 17 Jun 2016 16:08:11 +0200
-Subject: [PATCH] Raise an error when STARTTLS fails
-
-CVE-2016-0772 python: smtplib StartTLS stripping attack
-rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
-rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
-
-Based on an upstream change by Benjamin Peterson <benjamin(a)python.org>
-- in changeset 101887:d590114c2394 3.4
--
https://hg.python.org/cpython/rev/d590114c2394
----
- Lib/smtplib.py | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/Lib/smtplib.py b/Lib/smtplib.py
-index 4756973..dfbf5f9 100755
---- a/Lib/smtplib.py
-+++ b/Lib/smtplib.py
-@@ -773,6 +773,11 @@ class SMTP:
- self.ehlo_resp = None
- self.esmtp_features = {}
- self.does_esmtp = 0
-+ else:
-+ # RFC 3207:
-+ # 501 Syntax error (no parameters allowed)
-+ # 454 TLS not available due to temporary reason
-+ raise SMTPResponseException(resp, reply)
- return (resp, reply)
-
- def sendmail(self, from_addr, to_addrs, msg, mail_options=[],
---
-2.5.5
-
diff --git a/00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
b/00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
deleted file mode 100644
index e2c8581..0000000
--- a/00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 531dfa4bcfe55d5cd1524425944b07c5b02bddf9 Mon Sep 17 00:00:00 2001
-From: Charalampos Stratakis <cstratak(a)redhat.com>
-Date: Fri, 8 Jul 2016 17:16:41 +0200
-Subject: [PATCH] CVE-2016-5636 fix
-
----
- Modules/zipimport.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/Modules/zipimport.c b/Modules/zipimport.c
-index 06abb31..4d0d1de 100644
---- a/Modules/zipimport.c
-+++ b/Modules/zipimport.c
-@@ -1076,6 +1076,10 @@ get_data(PyObject *archive, PyObject *toc_entry)
- &date, &crc)) {
- return NULL;
- }
-+ if (data_size < 0) {
-+ PyErr_Format(ZipImportError, "negative data size");
-+ return NULL;
-+ }
-
- fp = _Py_fopen_obj(archive, "rb");
- if (!fp)
-@@ -1112,6 +1116,11 @@ get_data(PyObject *archive, PyObject *toc_entry)
- }
- file_offset += l; /* Start of file data */
-
-+ if (data_size > LONG_MAX - 1) {
-+ fclose(fp);
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
- bytes_size = compress == 0 ? data_size : data_size + 1;
- if (bytes_size == 0)
- bytes_size++;
---
-2.7.4
-
diff --git a/00242-CVE-2016-1000110-httpoxy.patch b/00242-CVE-2016-1000110-httpoxy.patch
index 7c17b31..244ebec 100644
--- a/00242-CVE-2016-1000110-httpoxy.patch
+++ b/00242-CVE-2016-1000110-httpoxy.patch
@@ -1,20 +1,8 @@
-
-# HG changeset patch
-# User Senthil Kumaran <senthil(a)uthcode.com>
-# Date 1469947146 25200
-# Node ID a0ac52ed8f7918222603b584ec8fc93d9b7bc0a5
-# Parent 4cb94e561e2db9865fb4d752f2bceefca4c6819a# Parent
3c19023c9fec5a615c25598468b44fade89049ce
-[merge from 3.4] - Prevent HTTPoxy attack (CVE-2016-1000110)
-
-Ignore the HTTP_PROXY variable when REQUEST_METHOD environment is set, which
-indicates that the script is in CGI mode.
-
-Issue #27568 Reported and patch contributed by Rmi Rampin.
-
diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
+index 24a4156..d2c7991 100644
--- a/Doc/howto/urllib2.rst
+++ b/Doc/howto/urllib2.rst
-@@ -538,6 +538,11 @@ setting up a `Basic Authentication`_ han
+@@ -538,6 +538,11 @@ setting up a `Basic Authentication`_ handler: ::
through a proxy. However, this can be enabled by extending urllib.request as
shown in the recipe [#]_.
@@ -27,11 +15,12 @@ diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
Sockets and Layers
==================
diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
+index 6c1bfb8..1291aeb 100644
--- a/Doc/library/urllib.request.rst
+++ b/Doc/library/urllib.request.rst
-@@ -166,6 +166,16 @@ The :mod:`urllib.request` module defines the following functions:
- cannot find it, looks for proxy information from Mac OSX System
- Configuration for Mac OS X and Windows Systems Registry for Windows.
+@@ -173,6 +173,16 @@ The :mod:`urllib.request` module defines the following functions:
+ If both lowercase and uppercase environment variables exist (and disagree),
+ lowercase is preferred.
+ .. note::
+
@@ -46,25 +35,25 @@ diff --git a/Doc/library/urllib.request.rst
b/Doc/library/urllib.request.rst
The following classes are provided:
-@@ -275,6 +285,12 @@ The following classes are provided:
+@@ -280,6 +290,11 @@ The following classes are provided:
+ list of hostname suffixes, optionally with ``:port`` appended, for example
+ ``cern.ch,ncsa.uiuc.edu,some.host:8080``.
- To disable autodetected proxy pass an empty dictionary.
-
-+ .. note::
++ .. note::
+
+ ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set;
+ see the documentation on :func:`~urllib.request.getproxies`.
+
-+
.. class:: HTTPPasswordMgr()
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
+index 5d05f8d..c26c52a 100644
--- a/Lib/test/test_urllib.py
+++ b/Lib/test/test_urllib.py
-@@ -225,6 +225,18 @@ class ProxyTests(unittest.TestCase):
- self.env.set('NO_PROXY', 'localhost,
anotherdomain.com,
newdomain.com')
-
self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com'))
+@@ -232,6 +232,18 @@ class ProxyTests(unittest.TestCase):
+
self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com:8888'))
+
self.assertTrue(urllib.request.proxy_bypass_environment('newdomain.com:1234'))
+ def test_proxy_cgi_ignore(self):
+ try:
@@ -78,13 +67,14 @@ diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
+ self.env.unset('REQUEST_METHOD')
+ self.env.unset('HTTP_PROXY')
+
- class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin):
- """Test urlopen() opening a fake http connection."""
-
+ def test_proxy_bypass_environment_host_match(self):
+ bypass = urllib.request.proxy_bypass_environment
+ self.env.set('NO_PROXY',
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
+index 1731fe3..3be327d 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
-@@ -2394,6 +2394,12 @@ def getproxies_environment():
+@@ -2412,6 +2412,12 @@ def getproxies_environment():
name = name.lower()
if value and name[-6:] == '_proxy':
proxies[name[:-6]] = value
@@ -93,8 +83,7 @@ diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
+ # header from the client
+ # If "proxy" is lowercase, it will still be used thanks to the next block
+ if 'REQUEST_METHOD' in os.environ:
-+ proxies.pop('http', None)
- return proxies
-
- def proxy_bypass_environment(host):
-
++ proxies.pop('http', None)
+ for name, value in os.environ.items():
+ if name[-6:] == '_proxy':
+ name = name.lower()
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
deleted file mode 100644
index 903cbf0..0000000
--- a/05000-autotool-intermediates.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2013-04-09 14:52:49.831773426 +0200
-+++ ./configure 2013-04-09 14:52:53.204765347 +0200
-@@ -802,6 +802,8 @@ with_thread
- enable_ipv6
- with_doc_strings
- with_tsc
-+with_count_allocs
-+with_call_profile
- with_pymalloc
- with_valgrind
- with_systemtap
-@@ -1479,6 +1481,8 @@ Optional Packages:
- deprecated; use --with(out)-threads
- --with(out)-doc-strings disable/enable documentation strings
- --with(out)-tsc enable/disable timestamp counter profile
-+ --with(out)count-allocs enable/disable per-type instance accounting
-+ --with(out)-call-profile enable/disable statistics on function call invocation
- --with(out)-pymalloc disable/enable specialized mallocs
- --with-valgrind Enable Valgrind support
- --with(out)-systemtap disable/enable SystemTap support
-@@ -10117,6 +10121,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
- $as_echo "yes" >&6; }
-+else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-count-allocs"
>&5
-+$as_echo_n "checking for --with-count-allocs... " >&6; }
-+
-+# Check whether --with-count-allocs was given.
-+if test "${with_count_allocs+set}" = set; then :
-+ withval=$with_count_allocs;
-+if test "$withval" != no
-+then
-+
-+$as_echo "#define COUNT_ALLOCS 1" >>confdefs.h
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-call-profile"
>&5
-+$as_echo_n "checking for --with-call-profile... " >&6; }
-+
-+# Check whether --with-call-profile was given.
-+if test "${with_call_profile+set}" = set; then :
-+ withval=$with_call_profile;
-+if test "$withval" != no
-+then
-+
-+$as_echo "#define CALL_PROFILE 1" >>confdefs.h
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
- else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
- $as_echo "no" >&6; }
- fi
diff --git a/python3.spec b/python3.spec
index af7d7f3..980347d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -111,8 +111,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.1
-Release: 15%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -382,31 +382,6 @@ Patch188:
00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
Patch189: 00189-add-rewheel-module.patch
%endif
-# 00194 #
-# Tests requiring SIGHUP to work don't work in Koji
-# see rhbz#1088233
-Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
-
-# 00196 #
-# Fix test_gdb failure on ppc64le
-Patch196: 00196-test-gdb-match-addr-before-builtin.patch
-
-# 00200 #
-# Fix for gettext plural form headers (lines that begin with "#")
-# Note: Backported from scl
-Patch200: 00200-gettext-plural-fix.patch
-
-# 00201 #
-# Fixes memory leak in gdbm module (rhbz#977308)
-# This was upstreamed as a part of bigger patch, but for our purposes
-# this is ok:
http://bugs.python.org/issue18404
-# Note: Backported from scl
-Patch201: 00201-fix-memory-leak-in-gdbm.patch
-
-# 00203 #
-# test_threading fails in koji dues to it's handling of signals
-Patch203: 00203-disable-threading-test-koji.patch
-
# 00205 #
# LIBPL variable in makefile takes LIBPL from configure.ac
# but the LIBPL variable defined there doesn't respect libdir macro
@@ -417,40 +392,12 @@ Patch205: 00205-make-libpl-respect-lib64.patch
# by debian but fedora infra uses only eabi without hf
Patch206: 00206-remove-hf-from-arm-triplet.patch
-# 00207 #
-# Avoid truncated _math.o files caused by parallel builds
-# modified version of
https://bugs.python.org/issue24421
-# rhbz#1292461
-Patch207: 00207-math-once.patch
-
-# 00208 #
-# test_with_pip (test.test_venv.EnsurePipTest) fails on ppc64*
-# rhbz#1292467
-Patch208: 00208-disable-test_with_pip-on-ppc.patch
-
# 00209 #
# Fix test breakage with version 2.2.0 of Expat
# rhbz#1353918:
https://bugzilla.redhat.com/show_bug.cgi?id=1353918
# FIXED UPSTREAM:
http://bugs.python.org/issue27369
Patch209: 00209-fix-test-pyexpat-failure.patch
-# 00237 #
-# CVE-2016-0772 python: smtplib StartTLS stripping attack
-# rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
-# rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
-# FIXED UPSTREAM:
https://hg.python.org/cpython/rev/d590114c2394
-# Raise an error when STARTTLS fails
-Patch237: 00237-Raise-an-error-when-STARTTLS-fails.patch
-
-# 00241 #
-# CVE-2016-5636:
http://seclists.org/oss-sec/2016/q2/560
-# rhbz#1345859:
https://bugzilla.redhat.com/show_bug.cgi?id=1345859
-#
https://hg.python.org/cpython/rev/10dad6da1b28/
-#
https://hg.python.org/cpython/rev/5533a9e02b21
-# Fix possible integer overflow and heap corruption in zipimporter.get_data()
-# FIXED UPSTREAM:
https://bugs.python.org/issue26171
-Patch241: 00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
-
# 00242 #
# HTTPoxy attack (CVE-2016-1000110)
#
https://httpoxy.org/
@@ -659,7 +606,7 @@ for f in md5module.c sha1module.c sha256module.c sha512module.c; do
done
%if 0%{with_rewheel}
-%global pip_version 7.1.0
+%global pip_version 8.1.2
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
%endif
@@ -696,16 +643,9 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch189 -p1
%endif
-%patch194 -p1
-%patch196 -p1
-%patch203 -p1
%patch205 -p1
%patch206 -p1
-%patch207 -p1
-%patch208 -p1
%patch209 -p1
-%patch237 -p1
-%patch241 -p1
%patch242 -p1
%patch243 -p1
@@ -1612,6 +1552,15 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Aug 15 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.2-1
+- Rebased to version 3.5.2
+- Set to work with pip version 8.1.2
+- Removed patches 207, 237, 241 as fixes are already contained in Python 3.5.2
+- Removed arch or environment specific patches 194, 196, 203, and 208
+ as test builds indicate they are no longer needed
+- Updated patches 102, 146, and 242 to work with the new Python codebase
+- Removed patches 200, 201, 5000 which weren't even being applied
+
* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
- Fix for CVE-2016-1000110 HTTPoxy attack
- SPEC file cleanup
commit 77a5f91947dbea6917e148dc452c091f2507136a
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Tue Aug 9 14:27:26 2016 +0200
Fix for CVE-2016-1000110 HTTPoxy attack
diff --git a/00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
b/00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
deleted file mode 100644
index e2c8581..0000000
--- a/00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 531dfa4bcfe55d5cd1524425944b07c5b02bddf9 Mon Sep 17 00:00:00 2001
-From: Charalampos Stratakis <cstratak(a)redhat.com>
-Date: Fri, 8 Jul 2016 17:16:41 +0200
-Subject: [PATCH] CVE-2016-5636 fix
-
----
- Modules/zipimport.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/Modules/zipimport.c b/Modules/zipimport.c
-index 06abb31..4d0d1de 100644
---- a/Modules/zipimport.c
-+++ b/Modules/zipimport.c
-@@ -1076,6 +1076,10 @@ get_data(PyObject *archive, PyObject *toc_entry)
- &date, &crc)) {
- return NULL;
- }
-+ if (data_size < 0) {
-+ PyErr_Format(ZipImportError, "negative data size");
-+ return NULL;
-+ }
-
- fp = _Py_fopen_obj(archive, "rb");
- if (!fp)
-@@ -1112,6 +1116,11 @@ get_data(PyObject *archive, PyObject *toc_entry)
- }
- file_offset += l; /* Start of file data */
-
-+ if (data_size > LONG_MAX - 1) {
-+ fclose(fp);
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
- bytes_size = compress == 0 ? data_size : data_size + 1;
- if (bytes_size == 0)
- bytes_size++;
---
-2.7.4
-
diff --git a/00209-fix-test-pyexpat-failure.patch b/00209-fix-test-pyexpat-failure.patch
new file mode 100644
index 0000000..7b40280
--- /dev/null
+++ b/00209-fix-test-pyexpat-failure.patch
@@ -0,0 +1,17 @@
+diff -r 682a8e36dd18 Lib/test/test_pyexpat.py
+--- a/Lib/test/test_pyexpat.py Tue Jul 05 17:08:52 2016 +0300
++++ b/Lib/test/test_pyexpat.py Thu Jul 07 17:04:35 2016 +0800
+@@ -656,11 +656,9 @@
+ # \xc2\x85 is UTF-8 encoded U+0085 (NEXT LINE)
+ xml = b"<?xml version\xc2\x85='1.0'?>\r\n"
+ parser = expat.ParserCreate()
+- try:
++ err_pattern = r'XML declaration not well-formed: line 1, column \d+'
++ with self.assertRaisesRegex(expat.ExpatError, err_pattern):
+ parser.Parse(xml, True)
+- self.fail()
+- except expat.ExpatError as e:
+- self.assertEqual(str(e), 'XML declaration not well-formed: line 1,
column 14')
+
+ class ErrorMessageTest(unittest.TestCase):
+ def test_codes(self):
diff --git a/00210-Raise-an-error-when-STARTTLS-fails.patch
b/00210-Raise-an-error-when-STARTTLS-fails.patch
deleted file mode 100644
index 9083e61..0000000
--- a/00210-Raise-an-error-when-STARTTLS-fails.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 761db274ca898f8a92348ed5979d3d3c1b0d634a Mon Sep 17 00:00:00 2001
-From: Tomas Orsava <torsava(a)redhat.com>
-Date: Fri, 17 Jun 2016 16:08:11 +0200
-Subject: [PATCH] Raise an error when STARTTLS fails
-
-CVE-2016-0772 python: smtplib StartTLS stripping attack
-rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
-rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
-
-Based on an upstream change by Benjamin Peterson <benjamin(a)python.org>
-- in changeset 101887:d590114c2394 3.4
--
https://hg.python.org/cpython/rev/d590114c2394
----
- Lib/smtplib.py | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/Lib/smtplib.py b/Lib/smtplib.py
-index 4756973..dfbf5f9 100755
---- a/Lib/smtplib.py
-+++ b/Lib/smtplib.py
-@@ -773,6 +773,11 @@ class SMTP:
- self.ehlo_resp = None
- self.esmtp_features = {}
- self.does_esmtp = 0
-+ else:
-+ # RFC 3207:
-+ # 501 Syntax error (no parameters allowed)
-+ # 454 TLS not available due to temporary reason
-+ raise SMTPResponseException(resp, reply)
- return (resp, reply)
-
- def sendmail(self, from_addr, to_addrs, msg, mail_options=[],
---
-2.5.5
-
diff --git a/00211-fix-test-pyexpat-failure.patch b/00211-fix-test-pyexpat-failure.patch
deleted file mode 100644
index 7b40280..0000000
--- a/00211-fix-test-pyexpat-failure.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -r 682a8e36dd18 Lib/test/test_pyexpat.py
---- a/Lib/test/test_pyexpat.py Tue Jul 05 17:08:52 2016 +0300
-+++ b/Lib/test/test_pyexpat.py Thu Jul 07 17:04:35 2016 +0800
-@@ -656,11 +656,9 @@
- # \xc2\x85 is UTF-8 encoded U+0085 (NEXT LINE)
- xml = b"<?xml version\xc2\x85='1.0'?>\r\n"
- parser = expat.ParserCreate()
-- try:
-+ err_pattern = r'XML declaration not well-formed: line 1, column \d+'
-+ with self.assertRaisesRegex(expat.ExpatError, err_pattern):
- parser.Parse(xml, True)
-- self.fail()
-- except expat.ExpatError as e:
-- self.assertEqual(str(e), 'XML declaration not well-formed: line 1,
column 14')
-
- class ErrorMessageTest(unittest.TestCase):
- def test_codes(self):
diff --git a/00237-Raise-an-error-when-STARTTLS-fails.patch
b/00237-Raise-an-error-when-STARTTLS-fails.patch
new file mode 100644
index 0000000..9083e61
--- /dev/null
+++ b/00237-Raise-an-error-when-STARTTLS-fails.patch
@@ -0,0 +1,35 @@
+From 761db274ca898f8a92348ed5979d3d3c1b0d634a Mon Sep 17 00:00:00 2001
+From: Tomas Orsava <torsava(a)redhat.com>
+Date: Fri, 17 Jun 2016 16:08:11 +0200
+Subject: [PATCH] Raise an error when STARTTLS fails
+
+CVE-2016-0772 python: smtplib StartTLS stripping attack
+rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
+rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
+
+Based on an upstream change by Benjamin Peterson <benjamin(a)python.org>
+- in changeset 101887:d590114c2394 3.4
+-
https://hg.python.org/cpython/rev/d590114c2394
+---
+ Lib/smtplib.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/Lib/smtplib.py b/Lib/smtplib.py
+index 4756973..dfbf5f9 100755
+--- a/Lib/smtplib.py
++++ b/Lib/smtplib.py
+@@ -773,6 +773,11 @@ class SMTP:
+ self.ehlo_resp = None
+ self.esmtp_features = {}
+ self.does_esmtp = 0
++ else:
++ # RFC 3207:
++ # 501 Syntax error (no parameters allowed)
++ # 454 TLS not available due to temporary reason
++ raise SMTPResponseException(resp, reply)
+ return (resp, reply)
+
+ def sendmail(self, from_addr, to_addrs, msg, mail_options=[],
+--
+2.5.5
+
diff --git a/00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
b/00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
new file mode 100644
index 0000000..e2c8581
--- /dev/null
+++ b/00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
@@ -0,0 +1,39 @@
+From 531dfa4bcfe55d5cd1524425944b07c5b02bddf9 Mon Sep 17 00:00:00 2001
+From: Charalampos Stratakis <cstratak(a)redhat.com>
+Date: Fri, 8 Jul 2016 17:16:41 +0200
+Subject: [PATCH] CVE-2016-5636 fix
+
+---
+ Modules/zipimport.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/Modules/zipimport.c b/Modules/zipimport.c
+index 06abb31..4d0d1de 100644
+--- a/Modules/zipimport.c
++++ b/Modules/zipimport.c
+@@ -1076,6 +1076,10 @@ get_data(PyObject *archive, PyObject *toc_entry)
+ &date, &crc)) {
+ return NULL;
+ }
++ if (data_size < 0) {
++ PyErr_Format(ZipImportError, "negative data size");
++ return NULL;
++ }
+
+ fp = _Py_fopen_obj(archive, "rb");
+ if (!fp)
+@@ -1112,6 +1116,11 @@ get_data(PyObject *archive, PyObject *toc_entry)
+ }
+ file_offset += l; /* Start of file data */
+
++ if (data_size > LONG_MAX - 1) {
++ fclose(fp);
++ PyErr_NoMemory();
++ return NULL;
++ }
+ bytes_size = compress == 0 ? data_size : data_size + 1;
+ if (bytes_size == 0)
+ bytes_size++;
+--
+2.7.4
+
diff --git a/00242-CVE-2016-1000110-httpoxy.patch b/00242-CVE-2016-1000110-httpoxy.patch
new file mode 100644
index 0000000..7c17b31
--- /dev/null
+++ b/00242-CVE-2016-1000110-httpoxy.patch
@@ -0,0 +1,100 @@
+
+# HG changeset patch
+# User Senthil Kumaran <senthil(a)uthcode.com>
+# Date 1469947146 25200
+# Node ID a0ac52ed8f7918222603b584ec8fc93d9b7bc0a5
+# Parent 4cb94e561e2db9865fb4d752f2bceefca4c6819a# Parent
3c19023c9fec5a615c25598468b44fade89049ce
+[merge from 3.4] - Prevent HTTPoxy attack (CVE-2016-1000110)
+
+Ignore the HTTP_PROXY variable when REQUEST_METHOD environment is set, which
+indicates that the script is in CGI mode.
+
+Issue #27568 Reported and patch contributed by Rmi Rampin.
+
+diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst
+--- a/Doc/howto/urllib2.rst
++++ b/Doc/howto/urllib2.rst
+@@ -538,6 +538,11 @@ setting up a `Basic Authentication`_ han
+ through a proxy. However, this can be enabled by extending urllib.request as
+ shown in the recipe [#]_.
+
++.. note::
++
++ ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; see
++ the documentation on :func:`~urllib.request.getproxies`.
++
+
+ Sockets and Layers
+ ==================
+diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
+--- a/Doc/library/urllib.request.rst
++++ b/Doc/library/urllib.request.rst
+@@ -166,6 +166,16 @@ The :mod:`urllib.request` module defines the following functions:
+ cannot find it, looks for proxy information from Mac OSX System
+ Configuration for Mac OS X and Windows Systems Registry for Windows.
+
++ .. note::
++
++ If the environment variable ``REQUEST_METHOD`` is set, which usually
++ indicates your script is running in a CGI environment, the environment
++ variable ``HTTP_PROXY`` (uppercase ``_PROXY``) will be ignored. This is
++ because that variable can be injected by a client using the "Proxy:"
HTTP
++ header. If you need to use an HTTP proxy in a CGI environment, either use
++ ``ProxyHandler`` explicitly, or make sure the variable name is in
++ lowercase (or at least the ``_proxy`` suffix).
++
+
+ The following classes are provided:
+
+@@ -275,6 +285,12 @@ The following classes are provided:
+
+ To disable autodetected proxy pass an empty dictionary.
+
++ .. note::
++
++ ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set;
++ see the documentation on :func:`~urllib.request.getproxies`.
++
++
+
+ .. class:: HTTPPasswordMgr()
+
+diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
+--- a/Lib/test/test_urllib.py
++++ b/Lib/test/test_urllib.py
+@@ -225,6 +225,18 @@ class ProxyTests(unittest.TestCase):
+ self.env.set('NO_PROXY', 'localhost,
anotherdomain.com,
newdomain.com')
+
self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com'))
+
++ def test_proxy_cgi_ignore(self):
++ try:
++ self.env.set('HTTP_PROXY', 'http://somewhere:3128')
++ proxies = urllib.request.getproxies_environment()
++ self.assertEqual('http://somewhere:3128', proxies['http'])
++ self.env.set('REQUEST_METHOD', 'GET')
++ proxies = urllib.request.getproxies_environment()
++ self.assertNotIn('http', proxies)
++ finally:
++ self.env.unset('REQUEST_METHOD')
++ self.env.unset('HTTP_PROXY')
++
+ class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin):
+ """Test urlopen() opening a fake http connection."""
+
+diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
+--- a/Lib/urllib/request.py
++++ b/Lib/urllib/request.py
+@@ -2394,6 +2394,12 @@ def getproxies_environment():
+ name = name.lower()
+ if value and name[-6:] == '_proxy':
+ proxies[name[:-6]] = value
++ # CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY
++ # (non-all-lowercase) as it may be set from the web server by a "Proxy:"
++ # header from the client
++ # If "proxy" is lowercase, it will still be used thanks to the next block
++ if 'REQUEST_METHOD' in os.environ:
++ proxies.pop('http', None)
+ return proxies
+
+ def proxy_bypass_environment(host):
+
diff --git a/00242-fix-mips64-triplet.patch b/00242-fix-mips64-triplet.patch
deleted file mode 100644
index 91bf6af..0000000
--- a/00242-fix-mips64-triplet.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-diff -urp Python-3.5.0/configure p/configure
---- Python-3.5.0/configure 2016-02-25 16:12:12.615184011 +0000
-+++ p/configure 2016-02-25 16:13:01.293412517 +0000
-@@ -5133,7 +5133,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64el-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64el-linux-gnuabi64
-+ mips64el-linux-gnu
- # else
- # error unknown platform triplet
- # endif
-@@ -5143,7 +5143,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64-linux-gnuabi64
-+ mips64-linux-gnu
- # else
- # error unknown platform triplet
- # endif
-diff -urp Python-3.5.0/configure.ac p/configure.ac
---- Python-3.5.0/configure.ac 2016-02-25 16:12:11.663159985 +0000
-+++ p/configure.ac 2016-02-25 16:13:18.814854710 +0000
-@@ -784,7 +784,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64el-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64el-linux-gnuabi64
-+ mips64el-linux-gnu
- # else
- # error unknown platform triplet
- # endif
-@@ -794,7 +794,7 @@ cat >> conftest.c <<EOF
- # elif _MIPS_SIM == _ABIN32
- mips64-linux-gnuabin32
- # elif _MIPS_SIM == _ABI64
-- mips64-linux-gnuabi64
-+ mips64-linux-gnu
- # else
- # error unknown platform triplet
- # endif
diff --git a/00243-fix-mips64-triplet.patch b/00243-fix-mips64-triplet.patch
new file mode 100644
index 0000000..91bf6af
--- /dev/null
+++ b/00243-fix-mips64-triplet.patch
@@ -0,0 +1,42 @@
+diff -urp Python-3.5.0/configure p/configure
+--- Python-3.5.0/configure 2016-02-25 16:12:12.615184011 +0000
++++ p/configure 2016-02-25 16:13:01.293412517 +0000
+@@ -5133,7 +5133,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64el-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64el-linux-gnuabi64
++ mips64el-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+@@ -5143,7 +5143,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64-linux-gnuabi64
++ mips64-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+diff -urp Python-3.5.0/configure.ac p/configure.ac
+--- Python-3.5.0/configure.ac 2016-02-25 16:12:11.663159985 +0000
++++ p/configure.ac 2016-02-25 16:13:18.814854710 +0000
+@@ -784,7 +784,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64el-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64el-linux-gnuabi64
++ mips64el-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+@@ -794,7 +794,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64-linux-gnuabi64
++ mips64-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
diff --git a/python3.spec b/python3.spec
index 4794e45..af7d7f3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,7 +2,7 @@
# Conditionals and other variables controlling the build
# ======================================================
-# NOTES ON BOOTSTRAPING PYTHON 3.4:
+# NOTES ON BOOTSTRAPING PYTHON 3.5:
#
# Due to dependency cycle between Python, pip, setuptools and
# wheel caused by the rewheel patch, one has to build in the
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 14%{?dist}
+Release: 15%{?dist}
License: Python
Group: Development/Languages
@@ -429,54 +429,52 @@ Patch207: 00207-math-once.patch
Patch208: 00208-disable-test_with_pip-on-ppc.patch
# 00209 #
-# CVE-2016-5636:
http://seclists.org/oss-sec/2016/q2/560
-# rhbz#1345859:
https://bugzilla.redhat.com/show_bug.cgi?id=1345859
-#
https://hg.python.org/cpython/rev/10dad6da1b28/
-#
https://hg.python.org/cpython/rev/5533a9e02b21
-# Fix possible integer overflow and heap corruption in zipimporter.get_data()
-# FIXED UPSTREAM:
https://bugs.python.org/issue26171
-Patch209: 00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
+# Fix test breakage with version 2.2.0 of Expat
+# rhbz#1353918:
https://bugzilla.redhat.com/show_bug.cgi?id=1353918
+# FIXED UPSTREAM:
http://bugs.python.org/issue27369
+Patch209: 00209-fix-test-pyexpat-failure.patch
-# 00210 #
+# 00237 #
# CVE-2016-0772 python: smtplib StartTLS stripping attack
# rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
# rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
# FIXED UPSTREAM:
https://hg.python.org/cpython/rev/d590114c2394
# Raise an error when STARTTLS fails
-Patch210: 00210-Raise-an-error-when-STARTTLS-fails.patch
+Patch237: 00237-Raise-an-error-when-STARTTLS-fails.patch
-# 00211 #
-# Fix test breakage with version 2.2.0 of Expat
-# rhbz#1353918:
https://bugzilla.redhat.com/show_bug.cgi?id=1353918
-# NOT YET FIXED UPSTREAM:
http://bugs.python.org/issue27369
-Patch211: 00211-fix-test-pyexpat-failure.patch
+# 00241 #
+# CVE-2016-5636:
http://seclists.org/oss-sec/2016/q2/560
+# rhbz#1345859:
https://bugzilla.redhat.com/show_bug.cgi?id=1345859
+#
https://hg.python.org/cpython/rev/10dad6da1b28/
+#
https://hg.python.org/cpython/rev/5533a9e02b21
+# Fix possible integer overflow and heap corruption in zipimporter.get_data()
+# FIXED UPSTREAM:
https://bugs.python.org/issue26171
+Patch241: 00241-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
# 00242 #
+# HTTPoxy attack (CVE-2016-1000110)
+#
https://httpoxy.org/
+# FIXED UPSTREAM:
http://bugs.python.org/issue27568
+# Based on a patch by Rmi Rampin
+# Resolves: rhbz#1359177
+Patch242: 00242-CVE-2016-1000110-httpoxy.patch
+
+# 00243 #
# Fix the triplet used on 64-bit MIPS
# rhbz#1322526:
https://bugzilla.redhat.com/show_bug.cgi?id=1322526
# Upstream uses Debian-like style mips64-linux-gnuabi64
# Fedora needs the default mips64-linux-gnu
-Patch242: 00242-fix-mips64-triplet.patch
+Patch243: 00243-fix-mips64-triplet.patch
# (New patches go here ^^^)
#
-# When adding new patches to "python" and "python3" in Fedora 17
onwards,
-# please try to keep the patch numbers in-sync between the two specfiles:
-#
-# - use the same patch number across both specfiles for conceptually-equivalent
-# fixes, ideally with the same name
-#
-# - when a patch is relevant to both specfiles, use the same introductory
-# comment in both specfiles where possible (to improve "diff" output when
-# comparing them)
+# When adding new patches to "python" and "python3" in Fedora, EL,
etc.,
+# please try to keep the patch numbers in-sync between all specfiles.
#
-# - when a patch is only relevant for one of the two specfiles, leave a gap
-# in the patch numbering in the other specfile, adding a comment when
-# omitting a patch, both in the manifest section here, and in the "prep"
-# phase below
+# More information, and a patch number catalog, is at:
#
-# Hopefully this will make it easier to ensure that all relevant fixes are
-# applied to both versions.
+#
https://fedoraproject.org/wiki/SIGs/Python/PythonPatches
+
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
@@ -706,9 +704,10 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch207 -p1
%patch208 -p1
%patch209 -p1
-%patch210 -p1
-%patch211 -p1
+%patch237 -p1
+%patch241 -p1
%patch242 -p1
+%patch243 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1613,6 +1612,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Aug 09 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-15
+- Fix for CVE-2016-1000110 HTTPoxy attack
+- SPEC file cleanup
+
* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
- Build properly on MIPS
commit 4bc70e0cc0a30f16574dcbd5539be950c5f5717f
Author: Michal Toman <mtoman(a)fedoraproject.org>
Date: Mon Aug 1 20:24:18 2016 +0200
Build properly on MIPS
diff --git a/00242-fix-mips64-triplet.patch b/00242-fix-mips64-triplet.patch
new file mode 100644
index 0000000..91bf6af
--- /dev/null
+++ b/00242-fix-mips64-triplet.patch
@@ -0,0 +1,42 @@
+diff -urp Python-3.5.0/configure p/configure
+--- Python-3.5.0/configure 2016-02-25 16:12:12.615184011 +0000
++++ p/configure 2016-02-25 16:13:01.293412517 +0000
+@@ -5133,7 +5133,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64el-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64el-linux-gnuabi64
++ mips64el-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+@@ -5143,7 +5143,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64-linux-gnuabi64
++ mips64-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+diff -urp Python-3.5.0/configure.ac p/configure.ac
+--- Python-3.5.0/configure.ac 2016-02-25 16:12:11.663159985 +0000
++++ p/configure.ac 2016-02-25 16:13:18.814854710 +0000
+@@ -784,7 +784,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64el-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64el-linux-gnuabi64
++ mips64el-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
+@@ -794,7 +794,7 @@ cat >> conftest.c <<EOF
+ # elif _MIPS_SIM == _ABIN32
+ mips64-linux-gnuabin32
+ # elif _MIPS_SIM == _ABI64
+- mips64-linux-gnuabi64
++ mips64-linux-gnu
+ # else
+ # error unknown platform triplet
+ # endif
diff --git a/python3.spec b/python3.spec
index ff4a021..4794e45 100644
--- a/python3.spec
+++ b/python3.spec
@@ -71,7 +71,7 @@
%global with_systemtap 1
# some arches don't have valgrind so we need to disable its support on them
-%ifnarch s390
+%ifnarch s390 %{mips}
%global with_valgrind 1
%else
%global with_valgrind 0
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 13%{?dist}
+Release: 14%{?dist}
License: Python
Group: Development/Languages
@@ -451,6 +451,13 @@ Patch210: 00210-Raise-an-error-when-STARTTLS-fails.patch
# NOT YET FIXED UPSTREAM:
http://bugs.python.org/issue27369
Patch211: 00211-fix-test-pyexpat-failure.patch
+# 00242 #
+# Fix the triplet used on 64-bit MIPS
+# rhbz#1322526:
https://bugzilla.redhat.com/show_bug.cgi?id=1322526
+# Upstream uses Debian-like style mips64-linux-gnuabi64
+# Fedora needs the default mips64-linux-gnu
+Patch242: 00242-fix-mips64-triplet.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -701,6 +708,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch209 -p1
%patch210 -p1
%patch211 -p1
+%patch242 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -905,7 +913,7 @@ install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/
%global _pyconfig32_h pyconfig-32.h
%global _pyconfig64_h pyconfig-64.h
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64}
%global _pyconfig_h %{_pyconfig64_h}
%else
%global _pyconfig_h %{_pyconfig32_h}
@@ -1064,7 +1072,7 @@ ln -s \
# Install a tapset for this libpython into tapsetdir, fixing up the path to the
# library:
mkdir -p %{buildroot}%{tapsetdir}
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64 %{mips64}
%global libpython_stp_optimized libpython%{pybasever}-64.stp
%global libpython_stp_debug libpython%{pybasever}-debug-64.stp
%else
@@ -1143,7 +1151,10 @@ CheckPython() {
%ifarch ppc64le aarch64
-x test_faulthandler \
%endif
- %ifarch %{power64} s390 s390x armv7hl aarch64
+ %ifarch %{mips64}
+ -x test_ctypes \
+ %endif
+ %ifarch %{power64} s390 s390x armv7hl aarch64 %{mips}
-x test_gdb
%endif
@@ -1602,6 +1613,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Aug 01 2016 Michal Toman <mtoman(a)fedoraproject.org> - 3.5.1-14
+- Build properly on MIPS
+
* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
-
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
commit 18346f1df188262f951685262f979c55982bb21f
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Tue Jul 19 12:17:53 2016 +0000
-
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
diff --git a/python3.spec b/python3.spec
index d094297..ff4a021 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
Group: Development/Languages
@@ -1602,6 +1602,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Jul 19 2016 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.5.1-13
+-
https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_...
+
* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
- Refactor patch for properly fixing CVE-2016-5636
commit 3702d0d8e2d9c1af62b1d8928cee8a90fb02d11d
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Jul 8 18:47:00 2016 +0200
Refactor patch for properly fixing CVE-2016-5636
diff --git a/00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
b/00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
new file mode 100644
index 0000000..e2c8581
--- /dev/null
+++ b/00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
@@ -0,0 +1,39 @@
+From 531dfa4bcfe55d5cd1524425944b07c5b02bddf9 Mon Sep 17 00:00:00 2001
+From: Charalampos Stratakis <cstratak(a)redhat.com>
+Date: Fri, 8 Jul 2016 17:16:41 +0200
+Subject: [PATCH] CVE-2016-5636 fix
+
+---
+ Modules/zipimport.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/Modules/zipimport.c b/Modules/zipimport.c
+index 06abb31..4d0d1de 100644
+--- a/Modules/zipimport.c
++++ b/Modules/zipimport.c
+@@ -1076,6 +1076,10 @@ get_data(PyObject *archive, PyObject *toc_entry)
+ &date, &crc)) {
+ return NULL;
+ }
++ if (data_size < 0) {
++ PyErr_Format(ZipImportError, "negative data size");
++ return NULL;
++ }
+
+ fp = _Py_fopen_obj(archive, "rb");
+ if (!fp)
+@@ -1112,6 +1116,11 @@ get_data(PyObject *archive, PyObject *toc_entry)
+ }
+ file_offset += l; /* Start of file data */
+
++ if (data_size > LONG_MAX - 1) {
++ fclose(fp);
++ PyErr_NoMemory();
++ return NULL;
++ }
+ bytes_size = compress == 0 ? data_size : data_size + 1;
+ if (bytes_size == 0)
+ bytes_size++;
+--
+2.7.4
+
diff --git a/00209-prevent-buffer-overflow-in-zipimport-module.patch
b/00209-prevent-buffer-overflow-in-zipimport-module.patch
deleted file mode 100644
index ea23556..0000000
--- a/00209-prevent-buffer-overflow-in-zipimport-module.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/Modules/zipimport.c b/Modules/zipimport.c
-index 06abb31..914bf5d 100644
---- a/Modules/zipimport.c
-+++ b/Modules/zipimport.c
-@@ -1112,6 +1112,11 @@ get_data(PyObject *archive, PyObject *toc_entry)
- }
- file_offset += l; /* Start of file data */
-
-+ if (data_size > LONG_MAX - 1) {
-+ fclose(fp);
-+ PyErr_NoMemory();
-+ return NULL;
-+ }
- bytes_size = compress == 0 ? data_size : data_size + 1;
- if (bytes_size == 0)
- bytes_size++;
diff --git a/python3.spec b/python3.spec
index 01c9966..d094297 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
Group: Development/Languages
@@ -375,7 +375,6 @@ Patch186: 00186-dont-raise-from-py_compile.patch
Patch188: 00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
# 00189 #
-#
# Add the rewheel module, allowing to recreate wheels from already installed
# ones
#
https://github.com/bkabrda/rewheel
@@ -383,12 +382,12 @@ Patch188:
00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
Patch189: 00189-add-rewheel-module.patch
%endif
+# 00194 #
# Tests requiring SIGHUP to work don't work in Koji
# see rhbz#1088233
Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
-# 00196
-#
+# 00196 #
# Fix test_gdb failure on ppc64le
Patch196: 00196-test-gdb-match-addr-before-builtin.patch
@@ -404,31 +403,39 @@ Patch200: 00200-gettext-plural-fix.patch
# Note: Backported from scl
Patch201: 00201-fix-memory-leak-in-gdbm.patch
+# 00203 #
# test_threading fails in koji dues to it's handling of signals
Patch203: 00203-disable-threading-test-koji.patch
+# 00205 #
# LIBPL variable in makefile takes LIBPL from configure.ac
# but the LIBPL variable defined there doesn't respect libdir macro
Patch205: 00205-make-libpl-respect-lib64.patch
+# 00206 #
# Remove hf flag from arm triplet which is used
# by debian but fedora infra uses only eabi without hf
Patch206: 00206-remove-hf-from-arm-triplet.patch
+# 00207 #
# Avoid truncated _math.o files caused by parallel builds
# modified version of
https://bugs.python.org/issue24421
# rhbz#1292461
Patch207: 00207-math-once.patch
+# 00208 #
# test_with_pip (test.test_venv.EnsurePipTest) fails on ppc64*
# rhbz#1292467
Patch208: 00208-disable-test_with_pip-on-ppc.patch
-#
https://bugs.python.org/issue26171
+# 00209 #
+# CVE-2016-5636:
http://seclists.org/oss-sec/2016/q2/560
+# rhbz#1345859:
https://bugzilla.redhat.com/show_bug.cgi?id=1345859
#
https://hg.python.org/cpython/rev/10dad6da1b28/
+#
https://hg.python.org/cpython/rev/5533a9e02b21
# Fix possible integer overflow and heap corruption in zipimporter.get_data()
-# FIXED UPSTREAM
-Patch209: 00209-prevent-buffer-overflow-in-zipimport-module.patch
+# FIXED UPSTREAM:
https://bugs.python.org/issue26171
+Patch209: 00209-CVE-2016-5636-buffer-overflow-in-zipimport-module-fix.patch
# 00210 #
# CVE-2016-0772 python: smtplib StartTLS stripping attack
@@ -1595,6 +1602,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-12
+- Refactor patch for properly fixing CVE-2016-5636
+
* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
- Fix test_pyexpat failure with Expat version of 2.2.0
commit 92512b0b144636b67b041adce8eff6f575bb8369
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Fri Jul 8 16:47:33 2016 +0200
Fix test_pyexpat failure with Expat 2.2.0
diff --git a/00211-fix-test-pyexpat-failure.patch b/00211-fix-test-pyexpat-failure.patch
new file mode 100644
index 0000000..7b40280
--- /dev/null
+++ b/00211-fix-test-pyexpat-failure.patch
@@ -0,0 +1,17 @@
+diff -r 682a8e36dd18 Lib/test/test_pyexpat.py
+--- a/Lib/test/test_pyexpat.py Tue Jul 05 17:08:52 2016 +0300
++++ b/Lib/test/test_pyexpat.py Thu Jul 07 17:04:35 2016 +0800
+@@ -656,11 +656,9 @@
+ # \xc2\x85 is UTF-8 encoded U+0085 (NEXT LINE)
+ xml = b"<?xml version\xc2\x85='1.0'?>\r\n"
+ parser = expat.ParserCreate()
+- try:
++ err_pattern = r'XML declaration not well-formed: line 1, column \d+'
++ with self.assertRaisesRegex(expat.ExpatError, err_pattern):
+ parser.Parse(xml, True)
+- self.fail()
+- except expat.ExpatError as e:
+- self.assertEqual(str(e), 'XML declaration not well-formed: line 1,
column 14')
+
+ class ErrorMessageTest(unittest.TestCase):
+ def test_codes(self):
diff --git a/python3.spec b/python3.spec
index 2a88e09..01c9966 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
Group: Development/Languages
@@ -438,6 +438,12 @@ Patch209: 00209-prevent-buffer-overflow-in-zipimport-module.patch
# Raise an error when STARTTLS fails
Patch210: 00210-Raise-an-error-when-STARTTLS-fails.patch
+# 00211 #
+# Fix test breakage with version 2.2.0 of Expat
+# rhbz#1353918:
https://bugzilla.redhat.com/show_bug.cgi?id=1353918
+# NOT YET FIXED UPSTREAM:
http://bugs.python.org/issue27369
+Patch211: 00211-fix-test-pyexpat-failure.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -687,6 +693,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch208 -p1
%patch209 -p1
%patch210 -p1
+%patch211 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1588,6 +1595,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 08 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-11
+- Fix test_pyexpat failure with Expat version of 2.2.0
+
* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
- Move xml module to system-python-libs
commit 347356c0991e96f023ce2b45b217c3bae994dbf5
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Jul 8 14:03:34 2016 +0200
Move xml module to system-python-libs
diff --git a/python3.spec b/python3.spec
index 9c912f5..2a88e09 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -1205,7 +1205,6 @@ rm -fr %{buildroot}
%{pylibdir}/venv/scripts
%{pylibdir}/wsgiref
-%{pylibdir}/xml
%{pylibdir}/xmlrpc
%dir %{pylibdir}/ensurepip/
@@ -1383,6 +1382,7 @@ rm -fr %{buildroot}
%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
%{pylibdir}/urllib
+%{pylibdir}/xml
%if "%{_lib}" == "lib64"
%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
@@ -1588,6 +1588,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 08 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-10
+- Move xml module to system-python-libs
+
* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
- Raise an error when STARTTLS fails
commit 99ac2fc8f31758394c30a123aae6a8588ea8f256
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Mon Jun 20 13:14:00 2016 +0200
Added an info note about adding new patches
Due to an omission, it was not included in this branch yet.
diff --git a/python3.spec b/python3.spec
index dd7d5e1..9c912f5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -438,6 +438,26 @@ Patch209: 00209-prevent-buffer-overflow-in-zipimport-module.patch
# Raise an error when STARTTLS fails
Patch210: 00210-Raise-an-error-when-STARTTLS-fails.patch
+# (New patches go here ^^^)
+#
+# When adding new patches to "python" and "python3" in Fedora 17
onwards,
+# please try to keep the patch numbers in-sync between the two specfiles:
+#
+# - use the same patch number across both specfiles for conceptually-equivalent
+# fixes, ideally with the same name
+#
+# - when a patch is relevant to both specfiles, use the same introductory
+# comment in both specfiles where possible (to improve "diff" output when
+# comparing them)
+#
+# - when a patch is only relevant for one of the two specfiles, leave a gap
+# in the patch numbering in the other specfile, adding a comment when
+# omitting a patch, both in the manifest section here, and in the "prep"
+# phase below
+#
+# Hopefully this will make it easier to ensure that all relevant fixes are
+# applied to both versions.
+
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
commit 8f231d01cd1587d61c990fafd61b722294187db7
Author: Tomas Orsava <torsava(a)redhat.com>
Date: Fri Jun 17 16:14:12 2016 +0200
Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack (rhbz#1303647)
Raise an error when STARTTLS fails.
- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
diff --git a/00210-Raise-an-error-when-STARTTLS-fails.patch
b/00210-Raise-an-error-when-STARTTLS-fails.patch
new file mode 100644
index 0000000..9083e61
--- /dev/null
+++ b/00210-Raise-an-error-when-STARTTLS-fails.patch
@@ -0,0 +1,35 @@
+From 761db274ca898f8a92348ed5979d3d3c1b0d634a Mon Sep 17 00:00:00 2001
+From: Tomas Orsava <torsava(a)redhat.com>
+Date: Fri, 17 Jun 2016 16:08:11 +0200
+Subject: [PATCH] Raise an error when STARTTLS fails
+
+CVE-2016-0772 python: smtplib StartTLS stripping attack
+rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
+rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
+
+Based on an upstream change by Benjamin Peterson <benjamin(a)python.org>
+- in changeset 101887:d590114c2394 3.4
+-
https://hg.python.org/cpython/rev/d590114c2394
+---
+ Lib/smtplib.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/Lib/smtplib.py b/Lib/smtplib.py
+index 4756973..dfbf5f9 100755
+--- a/Lib/smtplib.py
++++ b/Lib/smtplib.py
+@@ -773,6 +773,11 @@ class SMTP:
+ self.ehlo_resp = None
+ self.esmtp_features = {}
+ self.does_esmtp = 0
++ else:
++ # RFC 3207:
++ # 501 Syntax error (no parameters allowed)
++ # 454 TLS not available due to temporary reason
++ raise SMTPResponseException(resp, reply)
+ return (resp, reply)
+
+ def sendmail(self, from_addr, to_addrs, msg, mail_options=[],
+--
+2.5.5
+
diff --git a/python3.spec b/python3.spec
index 7cb9e1a..dd7d5e1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -430,6 +430,14 @@ Patch208: 00208-disable-test_with_pip-on-ppc.patch
# FIXED UPSTREAM
Patch209: 00209-prevent-buffer-overflow-in-zipimport-module.patch
+# 00210 #
+# CVE-2016-0772 python: smtplib StartTLS stripping attack
+# rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
+# rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
+# FIXED UPSTREAM:
https://hg.python.org/cpython/rev/d590114c2394
+# Raise an error when STARTTLS fails
+Patch210: 00210-Raise-an-error-when-STARTTLS-fails.patch
+
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -658,6 +666,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch207 -p1
%patch208 -p1
%patch209 -p1
+%patch210 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1559,6 +1568,13 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Jun 16 2016 Tomas Orsava <torsava(a)redhat.com> - 3.5.1-9
+- Fix for: CVE-2016-0772 python: smtplib StartTLS stripping attack
+- Raise an error when STARTTLS fails
+- rhbz#1303647:
https://bugzilla.redhat.com/show_bug.cgi?id=1303647
+- rhbz#1346345:
https://bugzilla.redhat.com/show_bug.cgi?id=1346345
+- Fixed upstream:
https://hg.python.org/cpython/rev/d590114c2394
+
* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
commit 5279a7c9ec838beec62177f885a584fc990d59a0
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Mon Jun 13 17:52:30 2016 +0200
Fix possible integer overflow and heap corruption in zipimport module
diff --git a/00209-prevent-buffer-overflow-in-zipimport-module.patch
b/00209-prevent-buffer-overflow-in-zipimport-module.patch
new file mode 100644
index 0000000..ea23556
--- /dev/null
+++ b/00209-prevent-buffer-overflow-in-zipimport-module.patch
@@ -0,0 +1,16 @@
+diff --git a/Modules/zipimport.c b/Modules/zipimport.c
+index 06abb31..914bf5d 100644
+--- a/Modules/zipimport.c
++++ b/Modules/zipimport.c
+@@ -1112,6 +1112,11 @@ get_data(PyObject *archive, PyObject *toc_entry)
+ }
+ file_offset += l; /* Start of file data */
+
++ if (data_size > LONG_MAX - 1) {
++ fclose(fp);
++ PyErr_NoMemory();
++ return NULL;
++ }
+ bytes_size = compress == 0 ? data_size : data_size + 1;
+ if (bytes_size == 0)
+ bytes_size++;
diff --git a/python3.spec b/python3.spec
index aaa31ef..7cb9e1a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -424,6 +424,12 @@ Patch207: 00207-math-once.patch
# rhbz#1292467
Patch208: 00208-disable-test_with_pip-on-ppc.patch
+#
https://bugs.python.org/issue26171
+#
https://hg.python.org/cpython/rev/10dad6da1b28/
+# Fix possible integer overflow and heap corruption in zipimporter.get_data()
+# FIXED UPSTREAM
+Patch209: 00209-prevent-buffer-overflow-in-zipimport-module.patch
+
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -651,6 +657,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch207 -p1
%patch208 -p1
+%patch209 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1552,6 +1559,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jun 13 2016 Charalampos Stratakis <cstratak(a)redhat.com> - 3.5.1-8
+- Added patch for fixing possible integer overflow and heap corruption in
zipimporter.get_data()
+
* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
- Move distutils to system-python-libs
commit d2c2647ea92cdfdd289ccb6504da77b8e20e0358
Author: Robert Kuska <rkuska(a)gmail.com>
Date: Thu Mar 31 12:33:48 2016 +0200
Remove Patch179 as test_gdb pass on arm without problems
diff --git a/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
b/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
deleted file mode 100644
index 2112730..0000000
--- a/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
+++ /dev/null
@@ -1,48 +0,0 @@
---- a/Tools/gdb/libpython.py 2013-04-06 03:41:58.000000000 -0400
-+++ b/Tools/gdb/libpython.py 2013-04-24 03:51:04.720540343 -0400
-@@ -274,6 +274,9 @@
- self.tp_name = tp_name
- self.address = address
-
-+ def __len__(self):
-+ return len(repr(self))
-+
- def __repr__(self):
- # For the NULL pointer, we have no way of knowing a type, so
- # special-case it as per
-@@ -881,6 +884,8 @@
- filename = self.filename()
- try:
- f = open(os_fsencode(filename), 'r')
-+ except TypeError: # filename is FakeRepr
-+ return None
- except IOError:
- return None
- with f:
-@@ -1523,9 +1528,12 @@
-
- def print_summary(self):
- if self.is_evalframeex():
-- pyop = self.get_pyop()
-- if pyop:
-+ try:
-+ pyop = self.get_pyop()
- line = pyop.get_truncated_repr(MAX_OUTPUT_LEN)
-+ except:
-+ pyop = None
-+ if pyop:
- write_unicode(sys.stdout, '#%i %s\n' % (self.get_index(),
line))
- if not pyop.is_optimized_out():
- line = pyop.current_line()
-@@ -1542,7 +1550,10 @@
-
- def print_traceback(self):
- if self.is_evalframeex():
-- pyop = self.get_pyop()
-+ try:
-+ pyop = self.get_pyop()
-+ except:
-+ pyop = None
- if pyop:
- pyop.print_traceback()
- if not pyop.is_optimized_out():
diff --git a/python3.spec b/python3.spec
index 1c21ce0..aaa31ef 100644
--- a/python3.spec
+++ b/python3.spec
@@ -337,15 +337,6 @@ Patch170: 00170-gc-assertions.patch
# Does not affect python2 AFAICS (different sysconfig values initialization)
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
-# 00179 #
-# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=951802
-# Reported upstream in
http://bugs.python.org/issue17737
-# This patch basically looks at every frame and if it is somehow corrupted,
-# it just stops printing the traceback - it doesn't fix the actual bug.
-# This bug seems to only affect ARM.
-# Doesn't seem to affect Python 2 AFAICS.
-Patch179: 00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
-
# 00180 #
# Enable building on ppc64p7
# Not appropriate for upstream, Fedora-specific naming
@@ -644,7 +635,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch163 -p1
%patch170 -p0
%patch178 -p1
-%patch179 -p1
%patch180 -p1
%patch184 -p1
%patch186 -p1
commit c63af87347e126396c89a46c6f9067c2e8dbf254
Author: Robert Kuska <rkuska(a)gmail.com>
Date: Tue Mar 29 13:15:46 2016 +0200
Remove Patch173 as test.support.bind_port seems to work
diff --git a/00173-workaround-ENOPROTOOPT-in-bind_port.patch
b/00173-workaround-ENOPROTOOPT-in-bind_port.patch
deleted file mode 100644
index 8d8b0bc..0000000
--- a/00173-workaround-ENOPROTOOPT-in-bind_port.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- Python-3.4.0b1/Lib/test/support/__init__.py.orig 2013-11-27 12:14:26.507216624 +0100
-+++ Python-3.4.0b1/Lib/test/support/__init__.py 2013-11-27 12:17:01.490805587 +0100
-@@ -593,7 +593,8 @@
- if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
- raise TestFailed("tests should never set the SO_REUSEADDR "
\
- "socket option on TCP/IP sockets!")
-- if hasattr(socket, 'SO_REUSEPORT'):
-+ if hasattr(socket, 'SO_REUSEPORT') \
-+ and 'WITHIN_PYTHON_RPM_BUILD' not in os.environ: # rhbz#913732
- try:
- if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
- raise TestFailed("tests should never set the SO_REUSEPORT
" \
diff --git a/python3.spec b/python3.spec
index 70b3dab..1c21ce0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -331,11 +331,6 @@ Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
# (rhbz#850013
Patch170: 00170-gc-assertions.patch
-# 00173 #
-# Workaround for ENOPROTOOPT seen in Koji withi test.support.bind_port()
-# (rhbz#913732)
-Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
-
# 00178 #
# Don't duplicate various FLAGS in sysconfig values
#
http://bugs.python.org/issue17679
@@ -648,11 +643,10 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch160 -p1
%patch163 -p1
%patch170 -p0
-%patch173 -p1
%patch178 -p1
%patch179 -p1
%patch180 -p1
-%patch184 -p1
+%patch184 -p1
%patch186 -p1
%patch188 -p1
commit a0e3ab8621e36e705afd0c07da9f1b98c437ae3f
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 24 16:53:25 2016 +0100
Remove white spaces
diff --git a/python3.spec b/python3.spec
index 154f9b6..70b3dab 100644
--- a/python3.spec
+++ b/python3.spec
@@ -87,7 +87,7 @@
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
-#
+#
# Unfortunately, rpmbuild's infrastructure requires us to jump through some
# hoops to avoid byte-compiling with the system python 2 version:
# /usr/lib/rpm/redhat/macros sets up build policy that (amongst other things)
@@ -100,7 +100,7 @@
%{!?__debug_package:/usr/lib/rpm/brp-strip %{__strip}} \
/usr/lib/rpm/brp-strip-static-archive %{__strip} \
/usr/lib/rpm/brp-strip-comment-note %{__strip} %{__objdump} \
- /usr/lib/rpm/brp-python-hardlink
+ /usr/lib/rpm/brp-python-hardlink
# to remove the invocation of brp-python-bytecompile, whilst keeping the
# invocation of brp-python-hardlink (since this should still work for python3
# pyc/pyo files)
@@ -320,14 +320,14 @@ Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
# Not yet sent upstream
Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
-# 00170 #
-# In debug builds, try to print repr() when a C-level assert fails in the
-# garbage collector (typically indicating a reference-counting error
-# somewhere else e.g in an extension module)
-# Backported to 2.7 from a patch I sent upstream for py3k
-#
http://bugs.python.org/issue9263 (rhbz#614680)
-# hiding the proposed new macros/functions within gcmodule.c to avoid exposing
-# them within the extension API.
+# 00170 #
+# In debug builds, try to print repr() when a C-level assert fails in the
+# garbage collector (typically indicating a reference-counting error
+# somewhere else e.g in an extension module)
+# Backported to 2.7 from a patch I sent upstream for py3k
+#
http://bugs.python.org/issue9263 (rhbz#614680)
+# hiding the proposed new macros/functions within gcmodule.c to avoid exposing
+# them within the extension API.
# (rhbz#850013
Patch170: 00170-gc-assertions.patch
@@ -406,17 +406,17 @@ Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
# Fix test_gdb failure on ppc64le
Patch196: 00196-test-gdb-match-addr-before-builtin.patch
-# 00200 #
-# Fix for gettext plural form headers (lines that begin with "#")
+# 00200 #
+# Fix for gettext plural form headers (lines that begin with "#")
# Note: Backported from scl
Patch200: 00200-gettext-plural-fix.patch
-# 00201 #
-# Fixes memory leak in gdbm module (rhbz#977308)
-# This was upstreamed as a part of bigger patch, but for our purposes
-# this is ok:
http://bugs.python.org/issue18404
+# 00201 #
+# Fixes memory leak in gdbm module (rhbz#977308)
+# This was upstreamed as a part of bigger patch, but for our purposes
+# this is ok:
http://bugs.python.org/issue18404
# Note: Backported from scl
-Patch201: 00201-fix-memory-leak-in-gdbm.patch
+Patch201: 00201-fix-memory-leak-in-gdbm.patch
# test_threading fails in koji dues to it's handling of signals
Patch203: 00203-disable-threading-test-koji.patch
@@ -698,7 +698,7 @@ export LDFLAGS="$RPM_LD_FLAGS `pkg-config --libs-only-L
openssl`"
# Define a function, for how to perform a "build" of python for a given
# configuration:
BuildPython() {
- ConfName=$1
+ ConfName=$1
BinaryName=$2
SymlinkName=$3
ExtraConfigArgs=$4
@@ -779,7 +779,7 @@ mkdir -p %{buildroot}%{_prefix} %{buildroot}%{_mandir}
InstallPython() {
- ConfName=$1
+ ConfName=$1
PyInstSoName=$2
MoreCFlags=$3
@@ -964,7 +964,7 @@ find %{buildroot}/ -name \*.py -exec sed -i 's/\r//' {} \;
# Fix an encoding:
iconv -f iso8859-1 -t utf-8 %{buildroot}/%{pylibdir}/Demo/rpc/README > README.conv
&& mv -f README.conv %{buildroot}/%{pylibdir}/Demo/rpc/README
-# Note that
+# Note that
# %{pylibdir}/Demo/distutils/test2to3/setup.py
# is in iso-8859-1 encoding, and that this is deliberate; this is test data
# for the 2to3 tool, and one of the functions of the 2to3 tool is to fixup
@@ -1005,7 +1005,7 @@ for Module in %{buildroot}/%{dynload_dir}/*.so ; do
*.%{SOABI_debug})
ldd $Module | grep %{py_INSTSONAME_optimized} &&
(echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
-
+
;;
*.%{SOABI_optimized})
ldd $Module | grep %{py_INSTSONAME_debug} &&
@@ -1088,7 +1088,7 @@ find %{buildroot} -type f -a -name "*.py" -print0 | \
topdir=$(pwd)
CheckPython() {
- ConfName=$1
+ ConfName=$1
ConfDir=$(pwd)/build/$ConfName
echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1551,15 +1551,15 @@ rm -fr %{buildroot}
# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from
# ldconfig (rhbz:562980).
-#
+#
# The /usr/lib/rpm/redhat/macros defines %__debug_package to use
# debugfiles.list, and it appears that everything below /usr/lib/debug and
# (/usr/src/debug) gets added to this file (via LISTFILES) in
# /usr/lib/rpm/find-debuginfo.sh
-#
+#
# Hence by installing it below /usr/lib/debug we ensure it is added to the
# -debuginfo subpackage
-# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
+# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
# payload file would be unpackaged)
@@ -1977,7 +1977,7 @@ ppc to avoid aliasing violations (patch 130; rhbz#698726)
- add %%python3_version to the rpm macros (rhbz#719082)
* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
-- disable some tests on sparc arches
+- disable some tests on sparc arches
* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
commit 47ab1524060e28e389134fe60fd9f40897a846ea
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 24 16:51:41 2016 +0100
Actualy use gc-assertions patch
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
index 1144cc2..9e34c21 100644
--- a/00170-gc-assertions.patch
+++ b/00170-gc-assertions.patch
@@ -96,13 +96,14 @@ Index: Lib/test/test_gc.py
===================================================================
--- Lib/test/test_gc.py (revision 87911)
+++ Lib/test/test_gc.py (working copy)
-@@ -1,6 +1,6 @@
+@@ -1,7 +1,7 @@
import unittest
from test.support import (verbose, refcount_test, run_unittest,
-- strip_python_stderr, cpython_only)
-+ strip_python_stderr, cpython_only, import_module)
- from test.script_helper import assert_python_ok, make_script, temp_dir
-
+ strip_python_stderr, cpython_only, start_threads,
+- temp_dir)
++ temp_dir, import_module)
+ from test.support.script_helper import assert_python_ok, make_script
+
import sys
@@ -512,6 +512,48 @@
self.assertEqual(len(gc.garbage), 0)
@@ -316,7 +317,7 @@ diff -up Lib/test/test_gc.py.old Lib/test/test_gc.py
--- Lib/test/test_gc.py.old 2014-12-10 12:50:58.252121318 +0100
+++ Lib/test/test_gc.py 2014-12-10 12:51:08.594266653 +0100
@@ -4,6 +4,7 @@ from test.support import (verbose, refco
- from test.script_helper import assert_python_ok, make_script, temp_dir
+ from test.support.script_helper import assert_python_ok, make_script
import sys
+import sysconfig
diff --git a/python3.spec b/python3.spec
index fa2c82a..154f9b6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -647,6 +647,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch157 -p1
%patch160 -p1
%patch163 -p1
+%patch170 -p0
%patch173 -p1
%patch178 -p1
%patch179 -p1
commit 0a93f9db1068342de8b5ea7bcca4e9355f937bd8
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 24 12:12:20 2016 +0100
Remove ppc specific patch which skipped check_interrupted_write tests
diff --git a/00164-disable-interrupted_write-tests-on-ppc.patch
b/00164-disable-interrupted_write-tests-on-ppc.patch
deleted file mode 100644
index 5641b4b..0000000
--- a/00164-disable-interrupted_write-tests-on-ppc.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-diff -up Python-3.4.2/Lib/test/test_exceptions.py.ppc
Python-3.4.2/Lib/test/test_exceptions.py
---- Python-3.4.2/Lib/test/test_exceptions.py.ppc 2014-10-08 04:18:13.000000000 -0400
-+++ Python-3.4.2/Lib/test/test_exceptions.py 2015-01-12 05:56:15.922833055 -0500
-@@ -429,6 +429,7 @@ class ExceptionTests(unittest.TestCase):
- self.assertIsNone(e.__context__)
- self.assertIsNone(e.__cause__)
-
-+ @unittest.skip('rhbz#846849')
- def testChainingDescriptors(self):
- try:
- raise Exception()
-diff -up Python-3.4.2/Lib/test/test_io.py.ppc Python-3.4.2/Lib/test/test_io.py
---- Python-3.4.2/Lib/test/test_io.py.ppc 2015-01-12 05:56:15.922833055 -0500
-+++ Python-3.4.2/Lib/test/test_io.py 2015-01-12 05:58:23.482833055 -0500
-@@ -3296,12 +3296,15 @@ class SignalsTest(unittest.TestCase):
- if e.errno != errno.EBADF:
- raise
-
-+ @unittest.skip('rhbz#846849')
- def test_interrupted_write_unbuffered(self):
- self.check_interrupted_write(b"xy", b"xy",
mode="wb", buffering=0)
-
-+ @unittest.skip('rhbz#846849')
- def test_interrupted_write_buffered(self):
- self.check_interrupted_write(b"xy", b"xy",
mode="wb")
-
-+ @unittest.skip('rhbz#846849')
- # Issue #22331: The test hangs on FreeBSD 7.2
- @support.requires_freebsd_version(8)
- def test_interrupted_write_text(self):
-diff -up Python-3.4.2/Lib/test/test_raise.py.ppc Python-3.4.2/Lib/test/test_raise.py
---- Python-3.4.2/Lib/test/test_raise.py.ppc 2014-10-08 04:18:14.000000000 -0400
-+++ Python-3.4.2/Lib/test/test_raise.py 2015-01-12 05:56:15.922833055 -0500
-@@ -151,6 +151,7 @@ class TestRaise(unittest.TestCase):
-
- class TestCause(unittest.TestCase):
-
-+ @unittest.skip('rhbz#846849')
- def testCauseSyntax(self):
- try:
- try:
-diff -up Python-3.4.2/Lib/test/test_traceback.py.ppc
Python-3.4.2/Lib/test/test_traceback.py
---- Python-3.4.2/Lib/test/test_traceback.py.ppc 2014-10-08 04:18:14.000000000 -0400
-+++ Python-3.4.2/Lib/test/test_traceback.py 2015-01-12 05:56:15.922833055 -0500
-@@ -314,6 +314,7 @@ class BaseExceptionReportingTests:
- self.check_zero_div(blocks[0])
- self.assertIn('inner_raise() # Marker', blocks[2])
-
-+ @unittest.skip('rhbz#846849')
- def test_context_suppression(self):
- try:
- try:
diff --git a/python3.spec b/python3.spec
index c81b3b0..fa2c82a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -320,12 +320,6 @@ Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
# Not yet sent upstream
Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
-# 0164 #
-# some tests in test._io interrupted_write-* fail on PPC (rhbz#846849)
-# testChainingDescriptors test in test_exceptions fails on PPc, too (rhbz#846849)
-# disable those tests so that rebuilds on PPC can continue
-Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
-
# 00170 #
# In debug builds, try to print repr() when a C-level assert fails in the
# garbage collector (typically indicating a reference-counting error
@@ -653,9 +647,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch157 -p1
%patch160 -p1
%patch163 -p1
-%ifarch ppc %{power64}
-%patch164 -p1
-%endif
%patch173 -p1
%patch178 -p1
%patch179 -p1
commit 20b919fd08680e18ee30f7c074926c8f1856f485
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 17 14:35:52 2016 +0100
Remove arm specific test skip patches139&140 rhbz#1318565
diff --git a/00139-skip-test_float-known-failure-on-arm.patch
b/00139-skip-test_float-known-failure-on-arm.patch
deleted file mode 100644
index 9d0bfad..0000000
--- a/00139-skip-test_float-known-failure-on-arm.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-2.7.2/Lib/test/test_float.py.skip-test_float-known-failure-on-arm
Python-2.7.2/Lib/test/test_float.py
---- Python-2.7.2/Lib/test/test_float.py.skip-test_float-known-failure-on-arm 2011-09-08
19:34:09.000986128 -0400
-+++ Python-2.7.2/Lib/test/test_float.py 2011-09-08 19:34:57.969982779 -0400
-@@ -1072,6 +1072,7 @@ class HexFloatTestCase(unittest.TestCase
- self.identical(got, expected)
-
-
-+ @unittest.skip('Known failure on ARM:
http://bugs.python.org/issue8265')
- def test_from_hex(self):
- MIN = self.MIN;
- MAX = self.MAX;
diff --git a/python3-arm-skip-failing-fragile-test.patch
b/python3-arm-skip-failing-fragile-test.patch
deleted file mode 100644
index 3c2fa09..0000000
--- a/python3-arm-skip-failing-fragile-test.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- Python-3.3.2/Lib/test/test_gdb.py.orig 2013-07-26 09:52:15.533852708 -0500
-+++ Python-3.3.2/Lib/test/test_gdb.py 2013-07-26 15:07:53.733623014 -0500
-@@ -729,8 +729,7 @@
- foo\(1, 2, 3\)
- ''')
-
-- @unittest.skipUnless(_thread,
-- "Python was compiled without thread support")
-+ @unittest.skip('Known failure on ARM:
https://bugzilla.redhat.com/show_bug.cgi?id=986713')
- def test_threads(self):
- 'Verify that "py-bt" indicates threads that are waiting for the
GIL'
- cmd = '''
diff --git a/python3.spec b/python3.spec
index 1132dd1..c81b3b0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -254,14 +254,6 @@ Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
# Some tests within distutils fail when run in an rpmbuild:
Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
-# 00139 #
-# ARM-specific: skip known failure in test_float:
-#
http://bugs.python.org/issue8265 (rhbz#706253)
-Patch139: 00139-skip-test_float-known-failure-on-arm.patch
-
-# ideally short lived patch disabling a test thats fragile on different arches
-Patch140: python3-arm-skip-failing-fragile-test.patch
-
# 00143 #
# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
# aliasing violations (rhbz#698726)
@@ -655,10 +647,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch111 -p1
%patch132 -p1
%patch137 -p1
-%ifarch %{arm}
-%patch139 -p1
-%patch140 -p1
-%endif
%patch143 -p1 -b .tsc-on-ppc
%patch146 -p1
%patch155 -p1
commit 83d6e884b39594f16ad9e06e1743987d23cafc9e
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 17 13:01:56 2016 +0100
Remove patch150 as the issue was already fixed rhbz#1318565
diff --git a/00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
b/00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
deleted file mode 100644
index 73b6356..0000000
--- a/00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-3.2.2/Lib/test/test_cmath.py.ppc Python-3.2.2/Lib/test/test_cmath.py
---- Python-3.2.2/Lib/test/test_cmath.py.ppc 2011-12-07 23:43:55.000000000 +0100
-+++ Python-3.2.2/Lib/test/test_cmath.py 2011-12-07 23:49:44.000000000 +0100
-@@ -95,6 +95,7 @@ class CMathTests(unittest.TestCase):
- self.assertFloatIdentical(x.real, y.real)
- self.assertFloatIdentical(x.imag, y.imag)
-
-+ @unittest.skip('Known failure on PPC: glibc bug
https://bugzilla.redhat.com/show_bug.cgi?id=750811')
- def rAssertAlmostEqual(self, a, b, rel_err = 2e-15, abs_err = 5e-323,
- msg=None):
- """Fail if the two floating-point numbers are not almost equal.
diff --git a/python3.spec b/python3.spec
index 9bd2f33..1132dd1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -292,13 +292,6 @@ Patch143: 00143-tsc-on-ppc.patch
# implementation and OpenSSL still doesn't support it. For now, they're
harmless.
Patch146: 00146-hashlib-fips.patch
-# 00150 #
-# temporarily disable rAssertAlmostEqual in test_cmath on PPC (bz #750811)
-# caused by a glibc bug. This patch can be removed when we have a glibc with
-# the patch mentioned here:
-#
http://sourceware.org/bugzilla/show_bug.cgi?id=13472
-Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
-
# 00155 #
# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
# generating SELinux denials on "import ctypes" and "import uuid"
when
@@ -668,9 +661,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%endif
%patch143 -p1 -b .tsc-on-ppc
%patch146 -p1
-%ifarch ppc %{power64}
-%patch150 -p1
-%endif
%patch155 -p1
%patch157 -p1
%patch160 -p1
commit f2e5fa9a56909387416302069bf40fd3b4fcbc8e
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 17 10:51:32 2016 +0100
Remove _expectedFailureInRpmBuild also from unittest/__init__
diff --git a/00132-add-rpmbuild-hooks-to-unittest.patch
b/00132-add-rpmbuild-hooks-to-unittest.patch
index 334dc51..77dc6ec 100644
--- a/00132-add-rpmbuild-hooks-to-unittest.patch
+++ b/00132-add-rpmbuild-hooks-to-unittest.patch
@@ -40,7 +40,7 @@ diff -up
Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest Py
from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
- skipUnless, expectedFailure)
+ skipUnless, expectedFailure,
-+ _skipInRpmBuild, _expectedFailureInRpmBuild)
++ _skipInRpmBuild)
from .suite import BaseTestSuite, TestSuite
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
findTestCases)
commit a1c0d073e20f5dc5d1f21c5f8d205c75490f821a
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 17 10:40:36 2016 +0100
Remove unused _expectedFailureInRpmbuild function rhbz#1301033
diff --git a/00132-add-rpmbuild-hooks-to-unittest.patch
b/00132-add-rpmbuild-hooks-to-unittest.patch
index 041abce..334dc51 100644
--- a/00132-add-rpmbuild-hooks-to-unittest.patch
+++ b/00132-add-rpmbuild-hooks-to-unittest.patch
@@ -9,7 +9,7 @@ diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest
Python
import logging
import pprint
import re
-@@ -101,5 +102,42 @@ def expectedFailure(func):
+@@ -101,5 +102,21 @@ def expectedFailure(func):
raise self.test_case.failureException(msg)
+# Non-standard/downstream-only hooks for handling issues with specific test
@@ -28,27 +28,6 @@ diff -up
Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
+ else:
+ return _id
+
-+def _expectedFailureInRpmBuild(func):
-+ """
-+ Non-standard/downstream-only decorator for marking a specific unit test
-+ as expected to fail within the %check of an rpmbuild.
-+
-+ Specifically, this takes effect when WITHIN_PYTHON_RPM_BUILD is set within
-+ the environment, and has no effect otherwise.
-+ """
-+ @functools.wraps(func)
-+ def wrapper(*args, **kwargs):
-+ if 'WITHIN_PYTHON_RPM_BUILD' in os.environ:
-+ try:
-+ func(*args, **kwargs)
-+ except Exception:
-+ raise _ExpectedFailure(sys.exc_info())
-+ raise _UnexpectedSuccess
-+ else:
-+ # Call directly:
-+ func(*args, **kwargs)
-+ return wrapper
-+
class _AssertRaisesBaseContext(_BaseTestCaseContext):
def __init__(self, expected, test_case, expected_regex=None):
commit 28c36c694a58195d4d3f22a6a02c500eea1d321f
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 17 10:20:48 2016 +0100
Remove accidentally added patch
diff --git a/python3.spec b/python3.spec
index 49ff1e5..9bd2f33 100644
--- a/python3.spec
+++ b/python3.spec
@@ -459,8 +459,6 @@ Patch207: 00207-math-once.patch
# rhbz#1292467
Patch208: 00208-disable-test_with_pip-on-ppc.patch
-Patch209:0001-Expected-failure-hook.patch
-
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -699,7 +697,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch207 -p1
%patch208 -p1
-%patch209 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit e7488abc3bca561893d9d936d5073d4ace2b2e21
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Mar 17 10:18:47 2016 +0100
Removed patch131 rhbz#1318565
diff --git a/00131-disable-tests-in-test_io.patch b/00131-disable-tests-in-test_io.patch
deleted file mode 100644
index d81a2d0..0000000
--- a/00131-disable-tests-in-test_io.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io
Python-2.7.2/Lib/test/test_io.py
---- Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io 2011-09-01
14:18:45.963304089 -0400
-+++ Python-2.7.2/Lib/test/test_io.py 2011-09-01 15:08:53.796098413 -0400
-@@ -2669,6 +2669,7 @@ class SignalsTest(unittest.TestCase):
- self.check_interrupted_read_retry(lambda x: x,
- mode="r")
-
-+ @unittest.skip('rhbz#732998')
- @unittest.skipUnless(threading, 'Threading required for this test.')
- def check_interrupted_write_retry(self, item, **fdopen_kwargs):
- """Check that a buffered write, when it gets interrupted (either
diff --git a/python3.spec b/python3.spec
index 5e0ffa3..49ff1e5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -232,13 +232,6 @@ Patch104: 00104-lib64-fix-for-test_install.patch
# Downstream only: not appropriate for upstream
Patch111: 00111-no-static-lib.patch
-# 00131 #
-# The four tests in test_io built on top of check_interrupted_write_retry
-# fail when built in Koji, for ppc and ppc64; for some reason, the SIGALRM
-# handlers are never called, and the call to write runs to completion
-# (rhbz#732998)
-Patch131: 00131-disable-tests-in-test_io.patch
-
# 00132 #
# Add non-standard hooks to unittest for use in the "check" phase below, when
# running selftests within the build:
@@ -466,6 +459,8 @@ Patch207: 00207-math-once.patch
# rhbz#1292467
Patch208: 00208-disable-test_with_pip-on-ppc.patch
+Patch209:0001-Expected-failure-hook.patch
+
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -667,9 +662,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch104 -p1
%endif
%patch111 -p1
-%ifarch ppc %{power64}
-%patch131 -p1
-%endif
%patch132 -p1
%patch137 -p1
%ifarch %{arm}
@@ -707,6 +699,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch206 -p1
%patch207 -p1
%patch208 -p1
+%patch209 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit a6cf4230e2e85589b019a88fee4bbf7ccc44d358
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri Mar 4 14:30:32 2016 +0100
Move distutils to system-python-libs
diff --git a/python3.spec b/python3.spec
index 64fcb82..5e0ffa3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -1213,13 +1213,6 @@ rm -fr %{buildroot}
%{pylibdir}/unittest/*.py
%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/distutils/
-%dir %{pylibdir}/distutils/__pycache__/
-%{pylibdir}/distutils/*.py
-%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/distutils/README
-%{pylibdir}/distutils/command
-
%dir %{pylibdir}/asyncio/
%dir %{pylibdir}/asyncio/__pycache__/
%{pylibdir}/asyncio/*.py
@@ -1367,6 +1360,14 @@ rm -fr %{buildroot}
%{pylibdir}/dbm/*.py
%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
+%dir %{pylibdir}/distutils/
+%dir %{pylibdir}/distutils/__pycache__/
+%{pylibdir}/distutils/*.py
+%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/distutils/README
+%{pylibdir}/distutils/command
+
+
%dir %{pylibdir}/email/
%dir %{pylibdir}/email/__pycache__/
%{pylibdir}/email/*.py
@@ -1607,6 +1608,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Mar 04 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-7
+- Move distutils to system-python-libs
+
* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
- Provide python3-enum34
commit ca48cc1b555ad83cc0c7092d90f75f0bb52e4ed6
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu Feb 25 21:04:08 2016 +0100
Remove trailing whitespace
diff --git a/python3.spec b/python3.spec
index 17495a7..64fcb82 100644
--- a/python3.spec
+++ b/python3.spec
@@ -519,7 +519,7 @@ Provides: system-python(abi) = %{pybasever}
%description -n system-python
System Python provides a binary interpreter which uses system-python-libs,
a subset of standard Python library considered essential to run various tools,
-requiring Python, that consider themselves "system tools".
+requiring Python, that consider themselves "system tools".
%package -n system-python-libs
Summary: System Python runtime libraries
commit 60fd88ff14c0b39d2e0cbe29595c9844e8bb5b11
Author: Charalampos Stratakis <cstratak(a)redhat.com>
Date: Thu Feb 25 17:47:06 2016 +0100
SPEC file cleanup
diff --git a/python3.spec b/python3.spec
index f10a160..17495a7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -517,15 +517,14 @@ Requires: system-python-libs%{?_isa} = %{version}-%{release}
Provides: system-python(abi) = %{pybasever}
%description -n system-python
-System Python TODO description
+System Python provides a binary interpreter which uses system-python-libs,
+a subset of standard Python library considered essential to run various tools,
+requiring Python, that consider themselves "system tools".
%package -n system-python-libs
Summary: System Python runtime libraries
Group: Development/Libraries
-# Remove some requires so this does not pull python3 back
-# TODO this does not work, whyyyyyyy?
-#%%global __provides_exclude_from ^/usr/(lib|lib64)/python.*$
%define __requires_exclude ^(/usr/bin/python3.*|python\\(abi\\) = 3\\..*)$
Requires: expat >= 2.1.0
commit 60aba0a6b8ddcd68db99cf998574c79bf239f57c
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Feb 16 18:22:04 2016 +0100
Provide system python subpackages and macro
Move some modules back to python3-libs
diff --git a/find-provides-without-python-sonames.sh
b/find-provides-without-python-sonames.sh
deleted file mode 100755
index 7a9e224..0000000
--- a/find-provides-without-python-sonames.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-# The standard find-provides script
-# adds provides lines for all SONAME directives in all shared libraries,
-# even if those libraries are not in the LD_LIBRARY_PATH
-
-# This leads to the rpm having a redundant Provides "foo.so" for all of the
-# various foo.so Python c modules
-
-# So we strip out all /usr/lib/python lines first, before running them through
-# the standard script:
-grep -v "/usr/lib/python" | grep -v "/usr/lib64/python" | \
- /usr/lib/rpm/redhat/find-provides
-
-exit 0
diff --git a/macros.systempython b/macros.systempython
new file mode 100644
index 0000000..b7d1e91
--- /dev/null
+++ b/macros.systempython
@@ -0,0 +1,4 @@
+%system_python_abi %{expand: \
+%global __requires_exclude ^python\\\\(abi\\\\) = 3\\\\..$
+Requires: system-python(abi) = %{python3_version}
+}
diff --git a/python3.spec b/python3.spec
index f905fe0..f10a160 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -182,12 +182,6 @@ BuildRequires: python3-pip
Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
-# Avoid having various bogus auto-generated Provides lines for the various
-# python c modules' SONAMEs:
-Source1: find-provides-without-python-sonames.sh
-%global _use_internal_dependency_generator 0
-%global __find_provides %{SOURCE1}
-
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
# with different Python runtimes as necessary:
@@ -211,6 +205,9 @@ Source7: pyfuntop.stp
# Written by bkabrda
Source8: check-pyc-and-pyo-timestamps.py
+# A simple macro that enables packages to require system-python(abi) instead of
python(abi)
+Source9: macros.systempython
+
# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
@@ -500,7 +497,7 @@ considerably, and a lot of deprecated features have finally been
removed.
%package libs
Summary: Python 3 runtime libraries
Group: Development/Libraries
-#Requires: %{name} = %{version}-%{release}
+Requires: system-python-libs%{?_isa} = %{version}-%{release}
# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
# this symbol (in pyexpat), so we must explicitly state this dependency to
@@ -513,6 +510,29 @@ Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
%description libs
This package contains files used to embed Python 3 into applications.
+%package -n system-python
+Summary: System Python executable
+Group: Development/Libraries
+Requires: system-python-libs%{?_isa} = %{version}-%{release}
+Provides: system-python(abi) = %{pybasever}
+
+%description -n system-python
+System Python TODO description
+
+%package -n system-python-libs
+Summary: System Python runtime libraries
+Group: Development/Libraries
+
+# Remove some requires so this does not pull python3 back
+# TODO this does not work, whyyyyyyy?
+#%%global __provides_exclude_from ^/usr/(lib|lib64)/python.*$
+%define __requires_exclude ^(/usr/bin/python3.*|python\\(abi\\) = 3\\..*)$
+
+Requires: expat >= 2.1.0
+
+%description -n system-python-libs
+This package contains files used to embed System Python into applications.
+
%package devel
Summary: Libraries and header files needed for Python 3 development
Group: Development/Libraries
@@ -598,7 +618,6 @@ can load its own extensions.
%prep
%setup -q -n Python-%{version}%{?prerel}
-chmod +x %{SOURCE1}
%if 0%{?with_systemtap}
# Provide an example of usage of the tapset:
@@ -1012,6 +1031,7 @@ find %{buildroot} \
# Install macros for rpm:
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
+install -m 644 %{SOURCE9} %{buildroot}/%{_rpmconfigdir}/macros.d/
# Ensure that the curses module was linked against libncursesw.so, rather than
# libncurses.so (bug 539917)
@@ -1085,6 +1105,10 @@ echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+# System Python: Copy the executable to libexec
+mkdir -p %{buildroot}%{_libexecdir}
+cp %{buildroot}%{_bindir}/python%{pybasever} %{buildroot}%{_libexecdir}/system-python
+
# ======================================================
# Running the upstream test suite
# ======================================================
@@ -1161,6 +1185,10 @@ rm -fr %{buildroot}
%postun libs -p /sbin/ldconfig
+%post -n system-python-libs -p /sbin/ldconfig
+
+%postun -n system-python-libs -p /sbin/ldconfig
+
%files
@@ -1177,6 +1205,83 @@ rm -fr %{buildroot}
%files libs
%defattr(-,root,root,-)
%doc LICENSE README
+
+%{pylibdir}/lib2to3
+%exclude %{pylibdir}/lib2to3/tests
+
+%dir %{pylibdir}/unittest/
+%dir %{pylibdir}/unittest/__pycache__/
+%{pylibdir}/unittest/*.py
+%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/distutils/
+%dir %{pylibdir}/distutils/__pycache__/
+%{pylibdir}/distutils/*.py
+%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/distutils/README
+%{pylibdir}/distutils/command
+
+%dir %{pylibdir}/asyncio/
+%dir %{pylibdir}/asyncio/__pycache__/
+%{pylibdir}/asyncio/*.py
+%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/venv/
+%dir %{pylibdir}/venv/__pycache__/
+%{pylibdir}/venv/*.py
+%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/venv/scripts
+
+%{pylibdir}/wsgiref
+%{pylibdir}/xml
+%{pylibdir}/xmlrpc
+
+%dir %{pylibdir}/ensurepip/
+%dir %{pylibdir}/ensurepip/__pycache__/
+%{pylibdir}/ensurepip/*.py
+%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+%exclude %{pylibdir}/ensurepip/_bundled
+
+%if 0%{?with_rewheel}
+%dir %{pylibdir}/ensurepip/rewheel/
+%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
+%{pylibdir}/ensurepip/rewheel/*.py
+%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
+%endif
+
+%{pylibdir}/idlelib
+
+%dir %{pylibdir}/test/
+%dir %{pylibdir}/test/__pycache__/
+%dir %{pylibdir}/test/support/
+%dir %{pylibdir}/test/support/__pycache__/
+%{pylibdir}/test/__init__.py
+%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%{pylibdir}/test/support/__init__.py
+%{pylibdir}/test/support/__pycache__/__init__%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/
+%dir %{pylibdir}/concurrent/__pycache__/
+%{pylibdir}/concurrent/*.py
+%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/futures/
+%dir %{pylibdir}/concurrent/futures/__pycache__/
+%{pylibdir}/concurrent/futures/*.py
+%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
+
+%{pylibdir}/pydoc_data
+
+##################################################################################
+
+%files -n system-python
+%defattr(-,root,root,-)
+%doc LICENSE README
+%{_libexecdir}/system-python
+
+%files -n system-python-libs
+%defattr(-,root,root,-)
+%doc LICENSE README
%dir %{pylibdir}
%dir %{dynload_dir}
%{dynload_dir}/_bisect.%{SOABI_optimized}.so
@@ -1245,26 +1350,11 @@ rm -fr %{buildroot}
%dir %{pylibdir}/__pycache__/
%{pylibdir}/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/asyncio/
-%dir %{pylibdir}/asyncio/__pycache__/
-%{pylibdir}/asyncio/*.py
-%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
-
%dir %{pylibdir}/collections/
%dir %{pylibdir}/collections/__pycache__/
%{pylibdir}/collections/*.py
%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/concurrent/
-%dir %{pylibdir}/concurrent/__pycache__/
-%{pylibdir}/concurrent/*.py
-%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
-
-%dir %{pylibdir}/concurrent/futures/
-%dir %{pylibdir}/concurrent/futures/__pycache__/
-%{pylibdir}/concurrent/futures/*.py
-%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
-
%dir %{pylibdir}/ctypes/
%dir %{pylibdir}/ctypes/__pycache__/
%{pylibdir}/ctypes/*.py
@@ -1278,13 +1368,6 @@ rm -fr %{buildroot}
%{pylibdir}/dbm/*.py
%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/distutils/
-%dir %{pylibdir}/distutils/__pycache__/
-%{pylibdir}/distutils/*.py
-%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/distutils/README
-%{pylibdir}/distutils/command
-
%dir %{pylibdir}/email/
%dir %{pylibdir}/email/__pycache__/
%{pylibdir}/email/*.py
@@ -1294,22 +1377,8 @@ rm -fr %{buildroot}
%{pylibdir}/encodings
-%dir %{pylibdir}/ensurepip/
-%dir %{pylibdir}/ensurepip/__pycache__/
-%{pylibdir}/ensurepip/*.py
-%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
-%exclude %{pylibdir}/ensurepip/_bundled
-
-%if 0%{?with_rewheel}
-%dir %{pylibdir}/ensurepip/rewheel/
-%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
-%{pylibdir}/ensurepip/rewheel/*.py
-%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
-%endif
-
%{pylibdir}/html
%{pylibdir}/http
-%{pylibdir}/idlelib
%dir %{pylibdir}/importlib/
%dir %{pylibdir}/importlib/__pycache__/
@@ -1321,47 +1390,20 @@ rm -fr %{buildroot}
%{pylibdir}/json/*.py
%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/lib2to3
-%exclude %{pylibdir}/lib2to3/tests
%{pylibdir}/logging
%{pylibdir}/multiprocessing
%{pylibdir}/plat-linux
-%{pylibdir}/pydoc_data
%dir %{pylibdir}/sqlite3/
%dir %{pylibdir}/sqlite3/__pycache__/
%{pylibdir}/sqlite3/*.py
%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/test/
-%dir %{pylibdir}/test/__pycache__/
-%dir %{pylibdir}/test/support/
-%dir %{pylibdir}/test/support/__pycache__/
-%{pylibdir}/test/__init__.py
-%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%{pylibdir}/test/support/__init__.py
-%{pylibdir}/test/support/__pycache__/__init__%{bytecode_suffixes}
-
%exclude %{pylibdir}/turtle.py
%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
-%dir %{pylibdir}/unittest/
-%dir %{pylibdir}/unittest/__pycache__/
-%{pylibdir}/unittest/*.py
-%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
-
%{pylibdir}/urllib
-%dir %{pylibdir}/venv/
-%dir %{pylibdir}/venv/__pycache__/
-%{pylibdir}/venv/*.py
-%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/venv/scripts
-
-%{pylibdir}/wsgiref
-%{pylibdir}/xml
-%{pylibdir}/xmlrpc
-
%if "%{_lib}" == "lib64"
%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
@@ -1401,6 +1443,7 @@ rm -fr %{buildroot}
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
+%{_rpmconfigdir}/macros.d/macros.systempython
%files tools
%defattr(-,root,root,755)
@@ -1565,9 +1608,12 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-5
+* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-6
- Provide python3-enum34
+* Fri Feb 19 2016 Miro Hronok <mhroncok(a)redhat.com> - 3.5.1-5
+- Provide System Python packages and macros
+
* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
commit 82c3ceef41db9ec9ae702bffc6ccdbb6f3fe37c0
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Wed Feb 24 14:38:24 2016 +0100
Provide python3-enum34
diff --git a/python3.spec b/python3.spec
index 7016dca..f905fe0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -507,6 +507,8 @@ Group: Development/Libraries
# prevent "import pyexpat" from failing with a linker error if someone
hasn't
# yet upgraded expat:
Requires: expat >= 2.1.0
+Provides: python3-enum34 = 1.0.4-5%{?dist}
+Obsoletes: python3-enum34 < 1.0.4-5%{?dist}
%description libs
This package contains files used to embed Python 3 into applications.
@@ -1563,6 +1565,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Feb 24 2016 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-5
+- Provide python3-enum34
+
* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
commit aa74fec275a9889c70baee027e46a641c2f5af75
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Thu Feb 4 21:30:47 2016 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index 927ca14..7016dca 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -1563,6 +1563,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Feb 04 2016 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.5.1-4
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
- Drop python3 macros, require python/python3-rpm-macros
commit 1eeebcf2be36539fb2ace754bb55d272199b26b0
Author: Orion Poplawski <orion(a)cora.nwra.com>
Date: Wed Jan 13 12:03:23 2016 -0700
Drop python3 macros, require python/python3-rpm-macros
diff --git a/macros.python3.5 b/macros.python3.5
deleted file mode 100644
index a633c72..0000000
--- a/macros.python3.5
+++ /dev/null
@@ -1,16 +0,0 @@
-%__python3 /usr/bin/python3
-%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
-%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
-%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
-%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
-%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
-
-%py3_shbang_opts -s
-
-%py3_build() %{expand:\
-CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} build
--executable="%{__python3} %{py3_shbang_opts}" %{?1}\
-}
-
-%py3_install() %{expand:\
-CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} install -O1
--skip-build --root %{buildroot} %{?1}\
-}
diff --git a/python3.spec b/python3.spec
index c520731..927ca14 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -188,10 +188,6 @@ Source1: find-provides-without-python-sonames.sh
%global _use_internal_dependency_generator 0
%global __find_provides %{SOURCE1}
-# Supply various useful macros for building python 3 modules:
-# __python3, python3_sitelib, python3_sitearch
-Source2: macros.python%{pybasever}
-
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
# with different Python runtimes as necessary:
@@ -520,8 +516,9 @@ Summary: Libraries and header files needed for Python 3 development
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
-BuildRequires: python-macros
-Requires: python-macros
+BuildRequires: python-rpm-macros
+Requires: python-rpm-macros
+Requires: python3-rpm-macros
Conflicts: %{name} < %{version}-%{release}
%description devel
@@ -1012,7 +1009,6 @@ find %{buildroot} \
# Install macros for rpm:
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
-install -m 644 %{SOURCE2} %{buildroot}/%{_rpmconfigdir}/macros.d/
install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
# Ensure that the curses module was linked against libncursesw.so, rather than
@@ -1402,7 +1398,6 @@ rm -fr %{buildroot}
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
-%{_rpmconfigdir}/macros.d/macros.python%{pybasever}
%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
%files tools
@@ -1568,6 +1563,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Jan 13 2016 Orion Poplwski <orion(a)cora.nwra.com> - 3.5.1-2
+- Drop python3 macros, require python/python3-rpm-macros
+
* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
- Update to 3.5.1
- Removed patch 199 and 207 (upstream)
commit f8ddd4439059f7c43ad97cf8e94c0ab0b384c52f
Author: Karsten Hopp <karsten(a)redhat.com>
Date: Mon Dec 21 16:41:52 2015 +0100
bump release
diff --git a/python3.spec b/python3.spec
index bb393e2..c520731 100644
--- a/python3.spec
+++ b/python3.spec
@@ -112,7 +112,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
commit e3c54b759572589a85d3771f86b2921810b8b114
Author: Karsten Hopp <karsten(a)redhat.com>
Date: Mon Dec 21 15:55:55 2015 +0100
Avoid truncated _math.o files caused by parallel builds
rhbz#1292461
disable failing test_with_pip (test.test_venv.EnsurePipTest) on ppc64*
Use a larger stack size on ppc64 (rhbz#1292462)
diff --git a/00207-math-once.patch b/00207-math-once.patch
new file mode 100644
index 0000000..572ed59
--- /dev/null
+++ b/00207-math-once.patch
@@ -0,0 +1,56 @@
+--- Python-3.5.1/Makefile.pre.in.kh 2015-12-17 05:51:08.466546157 -0500
++++ Python-3.5.1/Makefile.pre.in 2015-12-17 05:52:26.207761635 -0500
+@@ -587,11 +587,15 @@ pybuilddir.txt: $(BUILDPYTHON)
+ exit 1 ; \
+ fi
+
++# This is shared by the math and cmath modules
++Modules/_math.o: Modules/_math.c Modules/_math.h
++ $(CC) -c $(CCSHARED) $(PY_CORE_CFLAGS) -o $@ $<
++
+ # Build the shared modules
+ # Under GNU make, MAKEFLAGS are sorted and normalized; the 's' for
+ # -s, --silent or --quiet is always the first char.
+ # Under BSD make, MAKEFLAGS might be " -s -v x=y".
+-sharedmods: $(BUILDPYTHON) pybuilddir.txt
++sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
+ @case "$$MAKEFLAGS" in \
+ *\ -s*|s*) quiet="-q";; \
+ *) quiet="";; \
+--- Python-3.5.1/Misc/NEWS.kh 2015-12-17 05:53:40.898929946 -0500
++++ Python-3.5.1/Misc/NEWS 2015-12-17 05:54:28.599676136 -0500
+@@ -464,6 +464,10 @@ Build
+ - Issue #24986: It is now possible to build Python on Windows without errors
+ when external libraries are not available.
+
++- Issue #24421: Compile Modules/_math.c once, before building extensions.
++ Previously it could fail to compile properly if the math and cmath builds
++ were concurrent.
++
+ Windows
+ -------
+
+--- Python-3.5.1/setup.py.kh 2015-12-17 06:38:30.950955607 -0500
++++ Python-3.5.1/setup.py 2015-12-17 06:42:32.074722493 -0500
+@@ -582,13 +582,17 @@ class PyBuildExt(build_ext):
+
+ # array objects
+ exts.append( Extension('array', ['arraymodule.c']) )
++
++ shared_math = 'Modules/_math.o'
+ # complex math library functions
+- exts.append( Extension('cmath', ['cmathmodule.c',
'_math.c'],
+- depends=['_math.h'],
++ exts.append( Extension('cmath', ['cmathmodule.c'],
++ extra_objects=[shared_math],
++ depends=['_math.h', shared_math],
+ libraries=math_libs) )
+ # math library functions, e.g. sin()
+- exts.append( Extension('math', ['mathmodule.c',
'_math.c'],
+- depends=['_math.h'],
++ exts.append( Extension('math', ['mathmodule.c'],
++ extra_objects=[shared_math],
++ depends=['_math.h', shared_math],
+ libraries=math_libs) )
+
+ # time libraries: librt may be needed for clock_gettime()
diff --git a/00208-disable-test_with_pip-on-ppc.patch
b/00208-disable-test_with_pip-on-ppc.patch
new file mode 100644
index 0000000..00b98ae
--- /dev/null
+++ b/00208-disable-test_with_pip-on-ppc.patch
@@ -0,0 +1,11 @@
+diff -up Python-3.5.1/Lib/test/test_venv.py.1292467 Python-3.5.1/Lib/test/test_venv.py
+--- Python-3.5.1/Lib/test/test_venv.py.1292467 2015-12-21 13:37:44.740190595 +0100
++++ Python-3.5.1/Lib/test/test_venv.py 2015-12-21 13:40:25.707911828 +0100
+@@ -319,6 +319,7 @@ class EnsurePipTest(BaseTest):
+
+ # Requesting pip fails without SSL (
http://bugs.python.org/issue19744)
+ @unittest.skipIf(ssl is None, ensurepip._MISSING_SSL_MESSAGE)
++ @unittest.skip('rhbz#1292467')
+ def test_with_pip(self):
+ rmtree(self.env_dir)
+ with EnvironmentVarGuard() as envvars:
diff --git a/python3.spec b/python3.spec
index d9c3414..bb393e2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -464,6 +464,15 @@ Patch205: 00205-make-libpl-respect-lib64.patch
# by debian but fedora infra uses only eabi without hf
Patch206: 00206-remove-hf-from-arm-triplet.patch
+# Avoid truncated _math.o files caused by parallel builds
+# modified version of
https://bugs.python.org/issue24421
+# rhbz#1292461
+Patch207: 00207-math-once.patch
+
+# test_with_pip (test.test_venv.EnsurePipTest) fails on ppc64*
+# rhbz#1292467
+Patch208: 00208-disable-test_with_pip-on-ppc.patch
+
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -679,6 +688,8 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch203 -p1
%patch205 -p1
%patch206 -p1
+%patch207 -p1
+%patch208 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -706,6 +717,7 @@ export LINKCC="gcc"
export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
export LDFLAGS="$RPM_LD_FLAGS `pkg-config --libs-only-L openssl`"
+
# Define a function, for how to perform a "build" of python for a given
# configuration:
BuildPython() {
@@ -1087,6 +1099,11 @@ find %{buildroot} -type f -a -name "*.py" -print0 | \
PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
+# For ppc64 we need a larger stack than default (rhbz#1292462)
+%ifarch %{power64}
+ ulimit -a
+ ulimit -s 16384
+%endif
topdir=$(pwd)
CheckPython() {
commit e06dbe093e3fe28f919a9d9f0d9e684155de6f7c
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Dec 14 20:01:49 2015 +0100
Add source for 3.5.1
diff --git a/sources b/sources
index 3e50267..106fda6 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-d149d2812f10cbe04c042232e7964171 Python-3.5.0.tar.xz
+e9ea6f2623fffcdd871b7b19113fde80 Python-3.5.1.tar.xz
commit e248727c4f0963582cb34a7b1b26f929839419ac
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Dec 14 19:59:02 2015 +0100
Update to 3.5.1, remove unused patches (199, 207)
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 5d92895..0ab0387 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -667,9 +667,9 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
# Header files
@@ -1345,6 +1354,7 @@ clean: pycremoval
- -rm -f pybuilddir.txt
-rm -f Lib/lib2to3/*Grammar*.pickle
-rm -f Programs/_testembed Programs/_freeze_importlib
+ -rm -rf build
+ -rm -f $(srcdir)/Python/pysystemtap.h
profile-removal:
diff --git a/00199-alter-tests-to-reflect-sslv3-disabled.patch
b/00199-alter-tests-to-reflect-sslv3-disabled.patch
deleted file mode 100644
index 68df8d5..0000000
--- a/00199-alter-tests-to-reflect-sslv3-disabled.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-diff -up Python-3.4.2/Lib/test/test_ssl.py.ssl Python-3.4.2/Lib/test/test_ssl.py
---- Python-3.4.2/Lib/test/test_ssl.py.ssl 2014-12-11 12:25:21.886928225 +0100
-+++ Python-3.4.2/Lib/test/test_ssl.py 2014-12-11 12:25:00.284746529 +0100
-@@ -674,10 +674,7 @@ class ContextTests(unittest.TestCase):
- @skip_if_broken_ubuntu_ssl
- def test_options(self):
- ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
-- # OP_ALL | OP_NO_SSLv2 is the default value
-- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2,
-- ctx.options)
-- ctx.options |= ssl.OP_NO_SSLv3
-+ # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
- ctx.options)
- if can_clear_options():
-@@ -2186,7 +2180,7 @@ else:
- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False)
- if no_sslv2_implies_sslv3_hello():
- # No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs
-- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23,
'SSLv3',
-+ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False,
- client_options=ssl.OP_NO_SSLv2)
-
- @skip_if_broken_ubuntu_ssl
-diff -up Python-3.4.3/Lib/test/test_ssl.py.foo Python-3.4.3/Lib/test/test_ssl.py
---- Python-3.4.3/Lib/test/test_ssl.py.foo 2015-03-12 10:08:58.268065970 +0100
-+++ Python-3.4.3/Lib/test/test_ssl.py 2015-03-12 10:10:09.733347118 +0100
-@@ -2168,17 +2168,17 @@ else:
- " SSL2 client to SSL23 server test unexpectedly
failed:\n %s\n"
- % str(x))
- if hasattr(ssl, 'PROTOCOL_SSLv3'):
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3,
'SSLv3')
-+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1,
'TLSv1')
-
- if hasattr(ssl, 'PROTOCOL_SSLv3'):
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3,
'SSLv3', ssl.CERT_OPTIONAL)
-+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_OPTIONAL)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_OPTIONAL)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, 'TLSv1',
ssl.CERT_OPTIONAL)
-
- if hasattr(ssl, 'PROTOCOL_SSLv3'):
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3,
'SSLv3', ssl.CERT_REQUIRED)
-+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_REQUIRED)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_REQUIRED)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, 'TLSv1',
ssl.CERT_REQUIRED)
-
diff --git a/00207-hide-atomic-symbols.patch b/00207-hide-atomic-symbols.patch
deleted file mode 100644
index d8871a0..0000000
--- a/00207-hide-atomic-symbols.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-
-# HG changeset patch
-# User Victor Stinner <victor.stinner(a)gmail.com>
-# Date 1442581594 -7200
-# Node ID d4fcb362f7c66b25b22ddc0d27db0cc96acc727b
-# Parent d04a0954e142f873adee88ec5bc1c1d81cd46bc4
-Issue #25150: Hide the private _Py_atomic_xxx symbols from the public
-Python.h header to fix a compilation error with OpenMP. PyThreadState_GET()
-becomes an alias to PyThreadState_Get() to avoid ABI incompatibilies.
-
-It is important that the _PyThreadState_Current variable is always accessed
-with the same implementation of pyatomic.h. Use the PyThreadState_Get()
-function so extension modules will all reuse the same implementation.
-
-diff --git a/Include/pyatomic.h b/Include/pyatomic.h
---- a/Include/pyatomic.h
-+++ b/Include/pyatomic.h
-@@ -1,8 +1,6 @@
--/* Issue #23644: <stdatomic.h> is incompatible with C++, see:
--
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932 */
--#if !defined(Py_LIMITED_API) && !defined(__cplusplus)
- #ifndef Py_ATOMIC_H
- #define Py_ATOMIC_H
-+#ifdef Py_BUILD_CORE
-
- #include "dynamic_annotations.h"
-
-@@ -248,5 +246,5 @@ static __inline__ void
- #define _Py_atomic_load_relaxed(ATOMIC_VAL) \
- _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed)
-
-+#endif /* Py_BUILD_CORE */
- #endif /* Py_ATOMIC_H */
--#endif /* Py_LIMITED_API */
-diff --git a/Include/pystate.h b/Include/pystate.h
---- a/Include/pystate.h
-+++ b/Include/pystate.h
-@@ -177,20 +177,13 @@ PyAPI_FUNC(int) PyThreadState_SetAsyncEx
- /* Variable and macro for in-line access to current thread state */
-
- /* Assuming the current thread holds the GIL, this is the
-- PyThreadState for the current thread.
--
-- Issue #23644: pyatomic.h is incompatible with C++ (yet). Disable
-- PyThreadState_GET() optimization: declare it as an alias to
-- PyThreadState_Get(), as done for limited API. */
--#if !defined(Py_LIMITED_API) && !defined(__cplusplus)
-+ PyThreadState for the current thread. */
-+#ifdef Py_BUILD_CORE
- PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current;
--#endif
--
--#if defined(Py_DEBUG) || defined(Py_LIMITED_API) || defined(__cplusplus)
--#define PyThreadState_GET() PyThreadState_Get()
-+# define PyThreadState_GET() \
-+ ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
- #else
--#define PyThreadState_GET() \
-- ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
-+# define PyThreadState_GET() PyThreadState_Get()
- #endif
-
- typedef
diff --git a/python3.spec b/python3.spec
index b874b81..d9c3414 100644
--- a/python3.spec
+++ b/python3.spec
@@ -111,8 +111,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.0
-Release: 5%{?dist}
+Version: %{pybasever}.1
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -441,11 +441,6 @@ Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
# Fix test_gdb failure on ppc64le
Patch196: 00196-test-gdb-match-addr-before-builtin.patch
-# OpenSSL disabled SSLv3 in SSLv23 method
-# This patch alters python tests to reflect this change
-# Issue:
http://bugs.python.org/issue22638 Upstream discussion about SSLv3 in Python
-Patch199: 00199-alter-tests-to-reflect-sslv3-disabled.patch
-
# 00200 #
# Fix for gettext plural form headers (lines that begin with "#")
# Note: Backported from scl
@@ -469,11 +464,6 @@ Patch205: 00205-make-libpl-respect-lib64.patch
# by debian but fedora infra uses only eabi without hf
Patch206: 00206-remove-hf-from-arm-triplet.patch
-#
https://bugs.python.org/issue25150
-# Hide the private _Py_atomic_xxx symbols from the public
-# Python.h header to fix a compilation error with OpenMP.
-Patch207: 00207-hide-atomic-symbols.patch
-
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -686,11 +676,9 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch194 -p1
%patch196 -p1
-%patch199 -p1
%patch203 -p1
%patch205 -p1
%patch206 -p1
-%patch207 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1563,6 +1551,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Dec 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.1-1
+- Update to 3.5.1
+- Removed patch 199 and 207 (upstream)
+
* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
- Remove versioned libpython from devel package
commit bbc4c0dbf76bd9bc0d3b89d795244a39dcde02d9
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Dec 14 17:00:16 2015 +0100
[cleanup] Remove autotooling and its patch
rhbz#1291325
diff --git a/python3.spec b/python3.spec
index 02b3e63..b874b81 100644
--- a/python3.spec
+++ b/python3.spec
@@ -106,34 +106,6 @@
# pyc/pyo files)
-# We need to get a newer configure generated out of configure.in for the following
-# patches:
-# patch 55 (systemtap)
-# patch 113 (more config flags)
-#
-# For patch 55 (systemtap), we need to get a new header for configure to use
-#
-# configure.in requires autoconf-2.65, but the version in Fedora is currently
-# autoconf-2.66
-#
-# For now, we'll generate a patch to the generated configure script and
-# pyconfig.h.in on a machine that has a local copy of autoconf 2.65
-#
-# Instructions on obtaining such a copy can be seen at
-#
http://bugs.python.org/issue7997
-#
-# To make it easy to regenerate the patch, this specfile can be run in two
-# ways:
-# (i) regenerate_autotooling_patch 0 : the normal approach: prep the
-# source tree using a pre-generated patch to the "configure" script, and do a
-# full build
-# (ii) regenerate_autotooling_patch 1 : intended to be run on a developer's
-# workstation: prep the source tree without patching configure, then rerun a
-# local copy of autoconf-2.65, regenerate the patch, then exit, without doing
-# the rest of the build
-%global regenerate_autotooling_patch 0
-
-
# ==================
# Top-level metadata
# ==================
@@ -502,33 +474,6 @@ Patch206: 00206-remove-hf-from-arm-triplet.patch
# Python.h header to fix a compilation error with OpenMP.
Patch207: 00207-hide-atomic-symbols.patch
-
-
-# (New patches go here ^^^)
-#
-# When adding new patches to "python" and "python3" in Fedora 17
onwards,
-# please try to keep the patch numbers in-sync between the two specfiles:
-#
-# - use the same patch number across both specfiles for conceptually-equivalent
-# fixes, ideally with the same name
-#
-# - when a patch is relevant to both specfiles, use the same introductory
-# comment in both specfiles where possible (to improve "diff" output when
-# comparing them)
-#
-# - when a patch is only relevant for one of the two specfiles, leave a gap
-# in the patch numbering in the other specfile, adding a comment when
-# omitting a patch, both in the manifest section here, and in the "prep"
-# phase below
-#
-# Hopefully this will make it easier to ensure that all relevant fixes are
-# applied to both versions.
-
-# This is the generated patch to "configure"; see the description of
-# %{regenerate_autotooling_patch}
-# above:
-Patch5000: 05000-autotool-intermediates.patch
-
# add correct arch for ppc64/ppc64le
# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
Patch5001: python3-powerppc-arch.patch
@@ -757,12 +702,6 @@ sed --in-place \
--expression="s|http://docs.python.org/library|http://docs.python.org/%{pybasever}/library|g"
\
Lib/pydoc.py || exit 1
-%if ! 0%{regenerate_autotooling_patch}
-# Normally we apply the patch to "configure"
-# We don't apply the patch if we're working towards regenerating it
-%patch5000 -p0 -b .autotool-intermediates
-%endif
-
%patch5001 -p1
# ======================================================
@@ -779,29 +718,6 @@ export LINKCC="gcc"
export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
export LDFLAGS="$RPM_LD_FLAGS `pkg-config --libs-only-L openssl`"
-%if 0%{regenerate_autotooling_patch}
-# If enabled, this code regenerates the patch to "configure", using a
-# local copy of autoconf-2.65, then exits the build
-#
-# The following assumes that the copy is installed to ~/autoconf-2.65/bin
-# as per these instructions:
-#
http://bugs.python.org/issue7997
-
-for f in pyconfig.h.in configure ; do
- cp $f $f.autotool-intermediates ;
-done
-
-# Rerun the autotools:
-autoreconf
-
-# Regenerate the patch:
-gendiff . .autotool-intermediates > %{PATCH5000}
-
-
-# Exit the build
-exit 1
-%endif
-
# Define a function, for how to perform a "build" of python for a given
# configuration:
BuildPython() {
commit 5182e811f0cb3d455015cd121b42b85e842ddcf8
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Dec 14 15:57:49 2015 +0100
Enable tests
diff --git a/python3.spec b/python3.spec
index 437a516..02b3e63 100644
--- a/python3.spec
+++ b/python3.spec
@@ -83,7 +83,7 @@
%global with_computed_gotos yes
# Turn this to 0 to turn off the "check" phase:
-%global run_selftest_suite 0
+%global run_selftest_suite 1
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
commit 19aade22cbfa57dc500f5fa82229b4b9ed0b4c30
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Dec 14 15:57:16 2015 +0100
[cleanup] Remove COUNT_ALLOCS patches, see rhbz#1291325
diff --git a/00113-more-configuration-flags.patch b/00113-more-configuration-flags.patch
deleted file mode 100644
index 1067af1..0000000
--- a/00113-more-configuration-flags.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-diff -up Python-3.3.0b1/configure.ac.more-configuration-flags
Python-3.3.0b1/configure.ac
---- Python-3.3.0b1/configure.ac.more-configuration-flags 2012-07-20 13:25:33.232864839
-0400
-+++ Python-3.3.0b1/configure.ac 2012-07-20 13:25:33.314863815 -0400
-@@ -2585,6 +2585,30 @@ else AC_MSG_RESULT(no)
- fi],
- [AC_MSG_RESULT(no)])
-
-+AC_MSG_CHECKING(for --with-count-allocs)
-+AC_ARG_WITH(count-allocs,
-+[ --with(out)count-allocs enable/disable per-type instance accounting], [
-+if test "$withval" != no
-+then
-+ AC_DEFINE(COUNT_ALLOCS, 1,
-+ [Define to keep records of the number of instances of each type])
-+ AC_MSG_RESULT(yes)
-+else AC_MSG_RESULT(no)
-+fi],
-+[AC_MSG_RESULT(no)])
-+
-+AC_MSG_CHECKING(for --with-call-profile)
-+AC_ARG_WITH(call-profile,
-+[ --with(out)-call-profile enable/disable statistics on function call invocation], [
-+if test "$withval" != no
-+then
-+ AC_DEFINE(CALL_PROFILE, 1,
-+ [Define to keep records on function call invocation])
-+ AC_MSG_RESULT(yes)
-+else AC_MSG_RESULT(no)
-+fi],
-+[AC_MSG_RESULT(no)])
-+
- # Check for Python-specific malloc support
- AC_MSG_CHECKING(for --with-pymalloc)
- AC_ARG_WITH(pymalloc,
-diff -up Python-3.3.0b1/pyconfig.h.in.more-configuration-flags
Python-3.3.0b1/pyconfig.h.in
---- Python-3.3.0b1/pyconfig.h.in.more-configuration-flags 2012-07-20 13:25:33.000000000
-0400
-+++ Python-3.3.0b1/pyconfig.h.in 2012-07-20 13:26:02.826494869 -0400
-@@ -12,6 +12,12 @@
- support for AIX C++ shared extension modules. */
- #undef AIX_GENUINE_CPLUSPLUS
-
-+/* Define to keep records on function call invocation */
-+#undef CALL_PROFILE
-+
-+/* Define to keep records of the number of instances of each type */
-+#undef COUNT_ALLOCS
-+
- /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
- mixed-endian order (byte order 45670123) */
- #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
diff --git a/00125-less-verbose-COUNT_ALLOCS.patch
b/00125-less-verbose-COUNT_ALLOCS.patch
deleted file mode 100644
index fea9a4e..0000000
--- a/00125-less-verbose-COUNT_ALLOCS.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff -up Python-3.5.0b3/Python/pylifecycle.c.ms Python-3.5.0b3/Python/pylifecycle.c
---- Python-3.5.0b3/Python/pylifecycle.c.ms 2015-07-08 10:12:40.470623896 +0200
-+++ Python-3.5.0b3/Python/pylifecycle.c 2015-07-08 10:13:50.141169162 +0200
-@@ -612,7 +612,16 @@ Py_Finalize(void)
-
- /* Debugging stuff */
- #ifdef COUNT_ALLOCS
-- dump_counts(stdout);
-+ /* This is a downstream Fedora modification.
-+ The upstream default with COUNT_ALLOCS is to always dump the counts to
-+ stdout on exit. For our debug builds its useful to have the info from
-+ COUNT_ALLOCS available, but the stdout info here gets in the way, so
-+ we make it optional, wrapping it in an environment variable (modelled
-+ on the other PYTHONDUMP* env variables):
-+ */
-+ if (Py_GETENV("PYTHONDUMPCOUNTS"))
-+ dump_counts(stdout);
-+
- #endif
- /* dump hash stats */
- _PyHash_Fini();
diff --git a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
deleted file mode 100644
index 5fa9bd4..0000000
--- a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff -up Python-3.3.0b2/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys
Python-3.3.0b2/Lib/test/test_sys.py
---- Python-3.3.0b2/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys 2012-08-11
02:54:16.000000000 -0400
-+++ Python-3.3.0b2/Lib/test/test_sys.py 2012-08-13 14:50:15.253720597 -0400
-@@ -835,12 +835,17 @@ class SizeofTest(unittest.TestCase):
- # type
- # static type: PyTypeObject
- s = vsize('P2n15Pl4Pn9Pn11PIP')
-+ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
-+ if hasattr(sys, 'getcounts'):
-+ s += struct.calcsize('3P2P')
- check(int, s)
- # (PyTypeObject + PyAsyncMethods + PyNumberMethods + PyMappingMethods +
- # PySequenceMethods + PyBufferProcs + 4P)
- s = vsize('P2n17Pl4Pn9Pn11PIP') + struct.calcsize('34P 3P 3P 10P 2P
4P')
- # Separate block for PyDictKeysObject with 4 entries
- s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P")
-+ if hasattr(sys, 'getcounts'):
-+ s += struct.calcsize('3P2P')
- # class
- class newstyleclass(object): pass
- check(newstyleclass, s)
diff --git a/00135-fix-test-within-test_weakref-in-debug-build.patch
b/00135-fix-test-within-test_weakref-in-debug-build.patch
deleted file mode 100644
index 6ed7801..0000000
--- a/00135-fix-test-within-test_weakref-in-debug-build.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -up Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix
Python-3.2b2/Lib/test/test_weakref.py
---- Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix 2010-12-28
20:33:46.963364990 -0500
-+++ Python-3.2b2/Lib/test/test_weakref.py 2010-12-28 20:35:44.115935248 -0500
-@@ -583,9 +583,10 @@ class ReferencesTestCase(TestBase):
- # been cleared without their callbacks executing. OTOH, the weakref
- # to C is bound to a function local (wr), and wasn't trash, so that
- # callback should have been invoked when C went away.
-- self.assertEqual(alist, ["C went away"])
-- # The remaining weakref should be dead now (its callback ran).
-- self.assertEqual(wr(), None)
-+ if not hasattr(sys, 'getcounts'):
-+ self.assertEqual(alist, ["C went away"])
-+ # The remaining weakref should be dead now (its callback ran).
-+ self.assertEqual(wr(), None)
-
- del alist[:]
- gc.collect()
diff --git a/00141-fix-tests_with_COUNT_ALLOCS.patch
b/00141-fix-tests_with_COUNT_ALLOCS.patch
deleted file mode 100644
index 96a2fbf..0000000
--- a/00141-fix-tests_with_COUNT_ALLOCS.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-diff -r e245b0d7209b Lib/test/test_gc.py
---- a/Lib/test/test_gc.py Sun Oct 20 02:01:29 2013 -0700
-+++ b/Lib/test/test_gc.py Fri Nov 08 13:25:29 2013 +0100
-@@ -127,10 +127,16 @@
- del a
- self.assertNotEqual(gc.collect(), 0)
- del B, C
-- self.assertNotEqual(gc.collect(), 0)
-+ if hasattr(sys, 'getcounts'):
-+ self.assertEqual(gc.collect(), 0)
-+ else:
-+ self.assertNotEqual(gc.collect(), 0)
- A.a = A()
- del A
-- self.assertNotEqual(gc.collect(), 0)
-+ if hasattr(sys, 'getcounts'):
-+ self.assertEqual(gc.collect(), 0)
-+ else:
-+ self.assertNotEqual(gc.collect(), 0)
- self.assertEqual(gc.collect(), 0)
-
- def test_method(self):
-@@ -618,6 +624,8 @@
- stderr = run_command(code % "gc.DEBUG_SAVEALL")
- self.assertNotIn(b"uncollectable objects at shutdown", stderr)
-
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_gc_main_module_at_shutdown(self):
- # Create a reference cycle through the __main__ module and check
- # it gets collected at interpreter shutdown.
-@@ -632,6 +640,8 @@
- rc, out, err = assert_python_ok('-c', code)
- self.assertEqual(out.strip(), b'__del__ called')
-
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_gc_ordinary_module_at_shutdown(self):
- # Same as above, but with a non-__main__ module.
- with temp_dir() as script_dir:
-diff -r e245b0d7209b Lib/test/test_module.py
---- a/Lib/test/test_module.py Sun Oct 20 02:01:29 2013 -0700
-+++ b/Lib/test/test_module.py Fri Nov 08 13:25:29 2013 +0100
-@@ -81,6 +81,8 @@
- gc_collect()
- self.assertEqual(f().__dict__["bar"], 4)
-
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_clear_dict_in_ref_cycle(self):
- destroyed = []
- m = ModuleType("foo")
-@@ -96,6 +98,8 @@
- gc_collect()
- self.assertEqual(destroyed, [1])
-
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_weakref(self):
- m = ModuleType("foo")
- wr = weakref.ref(m)
-@@ -190,6 +194,8 @@
- self.assertEqual(r[-len(ends_with):], ends_with,
- '{!r} does not end with {!r}'.format(r, ends_with))
-
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'skipping since COUNT_ALLOCS was used, see issue19527')
- def test_module_finalization_at_shutdown(self):
- # Module globals and builtins should still be available during shutdown
- rc, out, err = assert_python_ok("-c", "from test import
final_a")
---- a/Lib/test/test_io.py.orig 2014-01-09 14:43:44.000000000 +0100
-+++ b/Lib/test/test_io.py 2014-01-09 14:50:30.839597351 +0100
-@@ -2611,6 +2611,8 @@
- """.format(iomod=iomod, kwargs=kwargs)
- return assert_python_ok("-c", code)
-
-+ @unittest.skipIf(hasattr(sys, 'getrefcount'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_create_at_shutdown_without_encoding(self):
- rc, out, err = self._check_create_at_shutdown()
- if err:
-@@ -2621,6 +2623,8 @@
- else:
- self.assertEqual("ok", out.decode().strip())
-
-+ @unittest.skipIf(hasattr(sys, 'getrefcount'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_create_at_shutdown_with_encoding(self):
- rc, out, err = self._check_create_at_shutdown(encoding='utf-8',
- errors='strict')
---- a/Lib/test/test_logging.py.orig 2014-01-09 14:53:07.016388198 +0100
-+++ b/Lib/test/test_logging.py 2014-01-09 14:54:25.654282973 +0100
-@@ -3398,6 +3398,8 @@
- logging.setLoggerClass(logging.Logger)
- self.assertEqual(logging.getLoggerClass(), logging.Logger)
-
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_logging_at_shutdown(self):
- # Issue #20037
- code = """if 1:
-
---- a/Lib/test/test_warnings/__init__.py.orig 2014-01-09 15:10:12.454997100 +0100
-+++ b/Lib/test/test_warnings/__init__.py 2014-01-09 15:11:14.028913478 +0100
-@@ -780,6 +780,8 @@
- assert_python_ok('-c', 'pass', '-W',
'always', PYTHONPATH=cwd)
-
- class FinalizationTest(unittest.TestCase):
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_finalization(self):
- # Issue #19421: warnings.warn() should not crash
- # during Python finalization
diff --git a/python3.spec b/python3.spec
index 91b2633..437a516 100644
--- a/python3.spec
+++ b/python3.spec
@@ -267,22 +267,6 @@ Patch104: 00104-lib64-fix-for-test_install.patch
# Downstream only: not appropriate for upstream
Patch111: 00111-no-static-lib.patch
-# 00113 #
-# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
-# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
-# so that if they are enabled, they will be in that build's pyconfig.h, so that
-# extension modules will reliably use them
-# Not yet sent upstream
-Patch113: 00113-more-configuration-flags.patch
-
-# 00125 #
-# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
-# emitting debug info to stdout on exit is too verbose and makes it harder to
-# use the debug build. Add a "PYTHONDUMPCOUNTS" environment variable which
-# must be set to enable the output on exit
-# Not yet sent upstream
-Patch125: 00125-less-verbose-COUNT_ALLOCS.patch
-
# 00131 #
# The four tests in test_io built on top of check_interrupted_write_retry
# fail when built in Koji, for ppc and ppc64; for some reason, the SIGALRM
@@ -308,18 +292,6 @@ Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
# 00133-skip-test_dl.patch is not relevant for python3: the "dl" module no
# longer exists
-# 00134 #
-# Fix a failure in test_sys.py when configured with COUNT_ALLOCS enabled
-# Not yet sent upstream
-Patch134: 00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
-
-# 00135 #
-# test_weakref's test_callback_in_cycle_resurrection doesn't work with
-# COUNT_ALLOCS, as the metrics keep "C" alive. Work around this for our
-# debug build:
-# Not yet sent upstream
-Patch135: 00135-fix-test-within-test_weakref-in-debug-build.patch
-
# 00137 #
# Some tests within distutils fail when run in an rpmbuild:
Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
@@ -332,13 +304,6 @@ Patch139: 00139-skip-test_float-known-failure-on-arm.patch
# ideally short lived patch disabling a test thats fragile on different arches
Patch140: python3-arm-skip-failing-fragile-test.patch
-# 00141 #
-# Fix tests for case when tests for case when configured with
-# COUNT_ALLOCS (debug build):
http://bugs.python.org/issue19527
-# Applies to: test_gc, test_module, test_io, test_logging, test_warnings,
-# test_threading
-Patch141: 00141-fix-tests_with_COUNT_ALLOCS.patch
-
# 00143 #
# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
# aliasing violations (rhbz#698726)
@@ -740,26 +705,16 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch102 -p1
%patch104 -p1
%endif
-
-
%patch111 -p1
-%patch113 -p1
-
-%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
-
%ifarch ppc %{power64}
%patch131 -p1
%endif
-
%patch132 -p1
-%patch134 -p1
-%patch135 -p1
%patch137 -p1
%ifarch %{arm}
%patch139 -p1
%patch140 -p1
%endif
-%patch141 -p1
%patch143 -p1 -b .tsc-on-ppc
%patch146 -p1
%ifarch ppc %{power64}
commit 7883cb72b02699a8509ee60662eb265024f61b0e
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Dec 14 13:34:09 2015 +0100
[cleanup] Remove unused patches
diff --git a/00003-remove-mimeaudio-tests.patch b/00003-remove-mimeaudio-tests.patch
deleted file mode 100644
index 8341363..0000000
--- a/00003-remove-mimeaudio-tests.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-diff -up Python-3.3.0rc1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests
Python-3.3.0rc1/Lib/test/test_email/test_email.py
---- Python-3.3.0rc1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests 2012-08-25
15:22:10.000000000 -0400
-+++ Python-3.3.0rc1/Lib/test/test_email/test_email.py 2012-08-27 11:00:11.936964586
-0400
-@@ -1321,47 +1321,6 @@ Blah blah blah
- self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n')
-
-
--# Test the basic MIMEAudio class
--class TestMIMEAudio(unittest.TestCase):
-- def setUp(self):
-- with openfile('audiotest.au', 'rb') as fp:
-- self._audiodata = fp.read()
-- self._au = MIMEAudio(self._audiodata)
--
-- def test_guess_minor_type(self):
-- self.assertEqual(self._au.get_content_type(), 'audio/basic')
--
-- def test_encoding(self):
-- payload = self._au.get_payload()
-- self.assertEqual(base64.decodebytes(bytes(payload, 'ascii')),
-- self._audiodata)
--
-- def test_checkSetMinor(self):
-- au = MIMEAudio(self._audiodata, 'fish')
-- self.assertEqual(au.get_content_type(), 'audio/fish')
--
-- def test_add_header(self):
-- eq = self.assertEqual
-- unless = self.assertTrue
-- self._au.add_header('Content-Disposition', 'attachment',
-- filename='audiotest.au')
-- eq(self._au['content-disposition'],
-- 'attachment; filename="audiotest.au"')
-- eq(self._au.get_params(header='content-disposition'),
-- [('attachment', ''), ('filename',
'audiotest.au')])
-- eq(self._au.get_param('filename',
header='content-disposition'),
-- 'audiotest.au')
-- missing = []
-- eq(self._au.get_param('attachment',
header='content-disposition'), '')
-- unless(self._au.get_param('foo', failobj=missing,
-- header='content-disposition') is missing)
-- # Try some missing stuff
-- unless(self._au.get_param('foobar', missing) is missing)
-- unless(self._au.get_param('attachment', missing,
-- header='foobar') is missing)
--
--
--
- # Test the basic MIMEImage class
- class TestMIMEImage(unittest.TestCase):
- def setUp(self):
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
deleted file mode 100644
index 8b0a76c..0000000
--- a/00153-fix-test_gdb-noise.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
-+++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
-@@ -96,6 +96,15 @@ class DebuggerTests(unittest.TestCase):
- # Generate a list of commands in gdb's language:
- commands = ['set breakpoint pending yes',
- 'break %s' % breakpoint,
-+
-+ # GDB as of Fedora 17 onwards can distinguish between the
-+ # value of a variable at entry vs current value:
-+ #
http://sourceware.org/gdb/onlinedocs/gdb/Variables.html
-+ # which leads to the selftests failing with errors like this:
-+ # AssertionError: 'v@entry=()' != '()'
-+ # Disable this:
-+ 'set print entry-values no',
-+
- 'run']
- if cmds_after_breakpoint:
- commands += cmds_after_breakpoint
---- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
-+++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
-@@ -144,6 +153,10 @@
- 'Missing separate debuginfo for ',
- 'Try: zypper install -C ',
- )
-+ ignore_patterns += ('warning: Unable to open',
-+ 'Missing separate debuginfo for',
-+ 'Try: yum --disablerepo=',
-+ 'Undefined set print command')
- for line in errlines:
- if not line.startswith(ignore_patterns):
- unexpected_errlines.append(line)
diff --git a/00156-gdb-autoload-safepath.patch b/00156-gdb-autoload-safepath.patch
deleted file mode 100644
index 1e57e9f..0000000
--- a/00156-gdb-autoload-safepath.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-diff -up Python-3.2.3/Lib/test/test_gdb.py.gdb-autoload-safepath
Python-3.2.3/Lib/test/test_gdb.py
---- Python-3.2.3/Lib/test/test_gdb.py.gdb-autoload-safepath 2012-04-30 17:16:24.092706954
-0400
-+++ Python-3.2.3/Lib/test/test_gdb.py 2012-04-30 17:17:13.275703592 -0400
-@@ -46,6 +46,19 @@ def gdb_has_frame_select():
-
- HAS_PYUP_PYDOWN = gdb_has_frame_select()
-
-+def gdb_has_autoload_safepath():
-+ # Recent GDBs will only auto-load scripts from certain safe
-+ # locations, so we will need to turn off this protection.
-+ # However, if the GDB doesn't have it, then the following
-+ # command will generate noise on stderr (rhbz#817072):
-+ cmd = "--eval-command=set auto-load safe-path /"
-+ p = subprocess.Popen(["gdb", "--batch", cmd],
-+ stderr=subprocess.PIPE)
-+ _, stderr = p.communicate()
-+ return b'"on" or "off" expected.' not in stderr
-+
-+HAS_AUTOLOAD_SAFEPATH = gdb_has_autoload_safepath()
-+
- BREAKPOINT_FN='builtin_id'
-
- class DebuggerTests(unittest.TestCase):
-@@ -106,15 +119,28 @@ class DebuggerTests(unittest.TestCase):
- 'set print entry-values no',
-
- 'run']
-+
-+ if HAS_AUTOLOAD_SAFEPATH:
-+ # Recent GDBs will only auto-load scripts from certain safe
-+ # locations.
-+ # Where necessary, turn off this protection to ensure that
-+ # our -gdb.py script can be loaded - but not on earlier gdb builds
-+ # as this would generate noise on stderr (rhbz#817072):
-+ init_commands = ['set auto-load safe-path /']
-+ else:
-+ init_commands = []
-+
- if cmds_after_breakpoint:
- commands += cmds_after_breakpoint
- else:
- commands += ['backtrace']
-
-+ # print init_commands
- # print commands
-
- # Use "commands" to generate the arguments with which to invoke
"gdb":
- args = ["gdb", "--batch", "-nx"]
-+ args += ['--init-eval-command=%s' % cmd for cmd in init_commands]
- args += ['--eval-command=%s' % cmd for cmd in commands]
- args += ["--args",
- sys.executable]
diff --git a/00175-fix-configure-Wformat.patch b/00175-fix-configure-Wformat.patch
deleted file mode 100644
index 9f42568..0000000
--- a/00175-fix-configure-Wformat.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up Python-3.3.0/configure.ac.fix-configure-Wformat Python-3.3.0/configure.ac
---- Python-3.3.0/configure.ac.fix-configure-Wformat 2013-03-25 16:09:09.127667472 -0400
-+++ Python-3.3.0/configure.ac 2013-03-25 16:09:16.442666967 -0400
-@@ -1308,7 +1308,7 @@ if test "$GCC" = "yes"
- then
- AC_MSG_CHECKING(whether gcc supports ParseTuple __format__)
- save_CFLAGS=$CFLAGS
-- CFLAGS="$CFLAGS -Werror"
-+ CFLAGS="$CFLAGS -Werror -Wformat"
- AC_COMPILE_IFELSE([
- AC_LANG_PROGRAM([[void f(char*,...)__attribute((format(PyArg_ParseTuple, 1, 2)));]],
[[]])
- ],[
diff --git a/00176-upstream-issue16754-so-extension.patch
b/00176-upstream-issue16754-so-extension.patch
deleted file mode 100644
index 4af618a..0000000
--- a/00176-upstream-issue16754-so-extension.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-3.3.0/Lib/distutils/sysconfig.py 2012-09-29 10:00:28.000000000 +0200
-+++ Python-3.3.0/Lib/distutils/sysconfig.py 2012-12-22 20:14:49.661337174 +0100
-@@ -228,7 +228,7 @@ def customize_compiler(compiler):
- linker_exe=cc,
- archiver=archiver)
-
-- compiler.shared_lib_extension = so_ext
-+ #compiler.shared_lib_extension = so_ext
-
-
- def get_config_h_filename():
diff --git a/00187-change-match_hostname-to-follow-RFC-6125.patch
b/00187-change-match_hostname-to-follow-RFC-6125.patch
deleted file mode 100644
index 0c07ecc..0000000
--- a/00187-change-match_hostname-to-follow-RFC-6125.patch
+++ /dev/null
@@ -1,188 +0,0 @@
---- a/Doc/library/ssl.rst
-+++ b/Doc/library/ssl.rst
-@@ -283,10 +283,10 @@ Certificate handling
- Verify that *cert* (in decoded format as returned by
- :meth:`SSLSocket.getpeercert`) matches the given *hostname*. The rules
- applied are those for checking the identity of HTTPS servers as outlined
-- in :rfc:`2818`, except that IP addresses are not currently supported.
-- In addition to HTTPS, this function should be suitable for checking the
-- identity of servers in various SSL-based protocols such as FTPS, IMAPS,
-- POPS and others.
-+ in :rfc:`2818` and :rfc:`6125`, except that IP addresses are not currently
-+ supported. In addition to HTTPS, this function should be suitable for
-+ checking the identity of servers in various SSL-based protocols such as
-+ FTPS, IMAPS, POPS and others.
-
- :exc:`CertificateError` is raised on failure. On success, the function
- returns nothing::
-@@ -301,6 +301,13 @@ Certificate handling
-
- .. versionadded:: 3.2
-
-+ .. versionchanged:: 3.3.3
-+ The function now follows :rfc:`6125`, section 6.4.3 and does neither
-+ match multiple wildcards (e.g. ``*.*.com`` or ``*a*.example.org``) nor
-+ a wildcard inside an internationalized domain names (IDN) fragment.
-+ IDN A-labels such as ``www*.xn--pthon-kva.org`` are still supported,
-+ but ``x*.python.org`` no longer matches ``xn--tda.python.org``.
-+
- .. function:: cert_time_to_seconds(timestring)
-
- Returns a floating-point value containing a normal seconds-after-the-epoch
-unchanged:
---- a/Lib/ssl.py
-+++ b/Lib/ssl.py
-@@ -129,25 +129,53 @@ class CertificateError(ValueError):
- pass
-
-
--def _dnsname_to_pat(dn, max_wildcards=1):
-+def _dnsname_match(dn, hostname, max_wildcards=1):
-+ """Matching according to RFC 6125, section 6.4.3
-+
-+
http://tools.ietf.org/html/rfc6125#section-6.4.3
-+ """
- pats = []
-- for frag in dn.split(r'.'):
-- if frag.count('*') > max_wildcards:
-- # Issue #17980: avoid denials of service by refusing more
-- # than one wildcard per fragment. A survery of established
-- # policy among SSL implementations showed it to be a
-- # reasonable choice.
-- raise CertificateError(
-- "too many wildcards in certificate DNS name: " + repr(dn))
-- if frag == '*':
-- # When '*' is a fragment by itself, it matches a non-empty dotless
-- # fragment.
-- pats.append('[^.]+')
-- else:
-- # Otherwise, '*' matches any dotless fragment.
-- frag = re.escape(frag)
-- pats.append(frag.replace(r'\*', '[^.]*'))
-- return re.compile(r'\A' + r'\.'.join(pats) + r'\Z',
re.IGNORECASE)
-+ if not dn:
-+ return False
-+
-+ leftmost, *remainder = dn.split(r'.')
-+
-+ wildcards = leftmost.count('*')
-+ if wildcards > max_wildcards:
-+ # Issue #17980: avoid denials of service by refusing more
-+ # than one wildcard per fragment. A survery of established
-+ # policy among SSL implementations showed it to be a
-+ # reasonable choice.
-+ raise CertificateError(
-+ "too many wildcards in certificate DNS name: " + repr(dn))
-+
-+ # speed up common case w/o wildcards
-+ if not wildcards:
-+ return dn.lower() == hostname.lower()
-+
-+ # RFC 6125, section 6.4.3, subitem 1.
-+ # The client SHOULD NOT attempt to match a presented identifier in which
-+ # the wildcard character comprises a label other than the left-most label.
-+ if leftmost == '*':
-+ # When '*' is a fragment by itself, it matches a non-empty dotless
-+ # fragment.
-+ pats.append('[^.]+')
-+ elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
-+ # RFC 6125, section 6.4.3, subitem 3.
-+ # The client SHOULD NOT attempt to match a presented identifier
-+ # where the wildcard character is embedded within an A-label or
-+ # U-label of an internationalized domain name.
-+ pats.append(re.escape(leftmost))
-+ else:
-+ # Otherwise, '*' matches any dotless string, e.g. www*
-+ pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
-+
-+ # add the remaining fragments, ignore any wildcards
-+ for frag in remainder:
-+ pats.append(re.escape(frag))
-+
-+ pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z',
re.IGNORECASE)
-+ return pat.match(hostname)
-
-
- def match_hostname(cert, hostname):
-unchanged:
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -304,11 +304,7 @@ class BasicSocketTests(unittest.TestCase
- fail(cert, 'Xa.com')
- fail(cert, '.a.com')
-
-- cert = {'subject': ((('commonName', 'a.*.com'),),)}
-- ok(cert, 'a.foo.com')
-- fail(cert, 'a..com')
-- fail(cert, 'a.com')
--
-+ # only match one left-most wildcard
- cert = {'subject': ((('commonName', 'f*.com'),),)}
- ok(cert, 'foo.com')
- ok(cert, 'f.com')
-@@ -323,6 +319,36 @@ class BasicSocketTests(unittest.TestCase
- fail(cert, 'example.org')
- fail(cert, 'null.python.org')
-
-+ # error cases with wildcards
-+ cert = {'subject': ((('commonName', '*.*.a.com'),),)}
-+ fail(cert, 'bar.foo.a.com')
-+ fail(cert, 'a.com')
-+ fail(cert, 'Xa.com')
-+ fail(cert, '.a.com')
-+
-+ cert = {'subject': ((('commonName', 'a.*.com'),),)}
-+ fail(cert, 'a.foo.com')
-+ fail(cert, 'a..com')
-+ fail(cert, 'a.com')
-+
-+ # wildcard doesn't match IDNA prefix 'xn--'
-+ idna =
'pthon.python.org'.encode("idna").decode("ascii")
-+ cert = {'subject': ((('commonName', idna),),)}
-+ ok(cert, idna)
-+ cert = {'subject': ((('commonName',
'x*.python.org'),),)}
-+ fail(cert, idna)
-+ cert = {'subject': ((('commonName',
'xn--p*.python.org'),),)}
-+ fail(cert, idna)
-+
-+ # wildcard in first fragment and IDNA A-labels in sequent fragments
-+ # are supported.
-+ idna =
'www*.pythn.org'.encode("idna").decode("ascii")
-+ cert = {'subject': ((('commonName', idna),),)}
-+ ok(cert,
'www.pythn.org'.encode("idna").decode("ascii"))
-+ ok(cert,
'www1.pythn.org'.encode("idna").decode("ascii"))
-+ fail(cert,
'ftp.pythn.org'.encode("idna").decode("ascii"))
-+ fail(cert,
'pythn.org'.encode("idna").decode("ascii"))
-+
- # Slightly fake real-world example
- cert = {'notAfter': 'Jun 26 21:41:46 2011 GMT',
- 'subject': ((('commonName',
'linuxfrz.org'),),),
-@@ -383,7 +409,7 @@ class BasicSocketTests(unittest.TestCase
- cert = {'subject': ((('commonName', 'a*b.com'),),)}
- ok(cert, 'axxb.com')
- cert = {'subject': ((('commonName', 'a*b.co*'),),)}
-- ok(cert, 'axxb.com')
-+ fail(cert, 'axxb.com')
- cert = {'subject': ((('commonName', 'a*b*.com'),),)}
- with self.assertRaises(ssl.CertificateError) as cm:
- ssl.match_hostname(cert, 'axxbxxc.com')
---- a/Lib/ssl.py
-+++ b/Lib/ssl.py
-@@ -192,7 +192,7 @@ def match_hostname(cert, hostname):
- san = cert.get('subjectAltName', ())
- for key, value in san:
- if key == 'DNS':
-- if _dnsname_to_pat(value).match(hostname):
-+ if _dnsname_match(value, hostname):
- return
- dnsnames.append(value)
- if not dnsnames:
-@@ -203,7 +203,7 @@ def match_hostname(cert, hostname):
- # XXX according to RFC 2818, the most specific Common Name
- # must be used.
- if key == 'commonName':
-- if _dnsname_to_pat(value).match(hostname):
-+ if _dnsname_match(value, hostname):
- return
- dnsnames.append(value)
- if len(dnsnames) > 1:
diff --git a/00192-buffer-overflow.patch b/00192-buffer-overflow.patch
deleted file mode 100644
index 73d3ece..0000000
--- a/00192-buffer-overflow.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-
-# HG changeset patch
-# User Benjamin Peterson <benjamin(a)python.org>
-# Date 1389672775 18000
-# Node ID 7f176a45211ff3cb85a2fbdc75f7979d642bb563
-# Parent ed1c27b68068c942c6e845bdf8e987e963d50920# Parent
9c56217e5c793685eeaf0ee224848c402bdf1e4c
-merge 3.2 (#20246)
-
-diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
---- a/Lib/test/test_socket.py
-+++ b/Lib/test/test_socket.py
-@@ -4538,6 +4538,14 @@ class BufferIOTest(SocketConnectedTest):
-
- _testRecvFromIntoMemoryview = _testRecvFromIntoArray
-
-+ def testRecvFromIntoSmallBuffer(self):
-+ # See issue #20246.
-+ buf = bytearray(8)
-+ self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
-+
-+ def _testRecvFromIntoSmallBuffer(self):
-+ self.serv_conn.send(MSG*2048)
-+
-
- TIPC_STYPE = 2000
- TIPC_LOWER = 200
-diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
---- a/Modules/socketmodule.c
-+++ b/Modules/socketmodule.c
-@@ -2935,6 +2935,11 @@ sock_recvfrom_into(PySocketSockObject *s
- if (recvlen == 0) {
- /* If nbytes was not specified, use the buffer's length */
- recvlen = buflen;
-+ } else if (recvlen > buflen) {
-+ PyBuffer_Release(&pbuf);
-+ PyErr_SetString(PyExc_ValueError,
-+ "nbytes is greater than the length of the buffer");
-+ return NULL;
- }
-
- readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
-
diff --git a/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
b/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
deleted file mode 100644
index bdf2e75..0000000
--- a/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-
-# HG changeset patch
-# User Brett Cannon <brett(a)python.org>
-# Date 1393602285 18000
-# Node ID 432cb56db05d73f55d211501bf0dfc767768923b
-# Parent ade5e4922a54cb84c99ec924ab7c700a014893da
-Issue #20778: Fix modulefinder to work with bytecode-only modules.
-
-Bug filed and initial attempt at a patch by Bohuslav Kabrda.
-
-diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
---- a/Lib/modulefinder.py
-+++ b/Lib/modulefinder.py
-@@ -287,7 +287,7 @@ class ModuleFinder:
- if fp.read(4) != imp.get_magic():
- self.msgout(2, "raise ImportError: Bad magic number",
pathname)
- raise ImportError("Bad magic number in %s" % pathname)
-- fp.read(4)
-+ fp.read(8) # Skip mtime and size.
- co = marshal.load(fp)
- else:
- co = None
-diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py
---- a/Lib/test/test_modulefinder.py
-+++ b/Lib/test/test_modulefinder.py
-@@ -1,5 +1,7 @@
- import os
- import errno
-+import importlib.machinery
-+import py_compile
- import shutil
- import unittest
- import tempfile
-@@ -208,6 +210,14 @@ a/module.py
- from . import *
- """]
-
-+bytecode_test = [
-+ "a",
-+ ["a"],
-+ [],
-+ [],
-+ ""
-+]
-+
-
- def open_file(path):
- dirname = os.path.dirname(path)
-@@ -288,6 +298,16 @@ class ModuleFinderTest(unittest.TestCase
- def test_relative_imports_4(self):
- self._do_test(relative_import_test_4)
-
-+ def test_bytecode(self):
-+ base_path = os.path.join(TEST_DIR, 'a')
-+ source_path = base_path + importlib.machinery.SOURCE_SUFFIXES[0]
-+ bytecode_path = base_path + importlib.machinery.BYTECODE_SUFFIXES[0]
-+ with open_file(source_path) as file:
-+ file.write('testing_modulefinder = True\n')
-+ py_compile.compile(source_path, cfile=bytecode_path)
-+ os.remove(source_path)
-+ self._do_test(bytecode_test)
-+
-
- def test_main():
- support.run_unittest(ModuleFinderTest)
diff --git a/00202-fix-undefined-behaviour-in-faulthandler.patch
b/00202-fix-undefined-behaviour-in-faulthandler.patch
deleted file mode 100644
index b333e15..0000000
--- a/00202-fix-undefined-behaviour-in-faulthandler.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-
-# HG changeset patch
-# User Victor Stinner <victor.stinner(a)gmail.com>
-# Date 1423661015 -3600
-# Node ID 689092296ad31951f8f919fc06b49450e648e93d
-# Parent 645f3d750be139ce0198e15e221da07b22289a92
-Issue #23433: Fix faulthandler._stack_overflow()
-
-Fix undefined behaviour: don't compare pointers. Use Py_uintptr_t type instead
-of void*. It fixes test_faulthandler on Fedora 22 which now uses GCC 5.
-
-diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
---- a/Modules/faulthandler.c
-+++ b/Modules/faulthandler.c
-@@ -911,12 +911,12 @@ faulthandler_fatal_error_py(PyObject *se
- }
-
- #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
--static void*
--stack_overflow(void *min_sp, void *max_sp, size_t *depth)
-+static Py_uintptr_t
-+stack_overflow(Py_uintptr_t min_sp, Py_uintptr_t max_sp, size_t *depth)
- {
- /* allocate 4096 bytes on the stack at each call */
- unsigned char buffer[4096];
-- void *sp = &buffer;
-+ Py_uintptr_t sp = (Py_uintptr_t)&buffer;
- *depth += 1;
- if (sp < min_sp || max_sp < sp)
- return sp;
-@@ -929,7 +929,8 @@ static PyObject *
- faulthandler_stack_overflow(PyObject *self)
- {
- size_t depth, size;
-- char *sp = (char *)&depth, *stop;
-+ Py_uintptr_t sp = (Py_uintptr_t)&depth;
-+ Py_uintptr_t stop;
-
- depth = 0;
- stop = stack_overflow(sp - STACK_OVERFLOW_MAX_SIZE,
-
diff --git a/00204-increase-dh-keys-size.patch b/00204-increase-dh-keys-size.patch
deleted file mode 100644
index e75d992..0000000
--- a/00204-increase-dh-keys-size.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-
-# HG changeset patch
-# User Benjamin Peterson <benjamin(a)python.org>
-# Date 1427947446 14400
-# Node ID 1ad7c0253abe1252128d61c3d0127d22144cb354
-# Parent 47451f6e7e7528a6647dbdc435e9a9f5c13c0080
-replace 512 bit dh key with a 2014 bit one (closes #23844)
-
-Patch by Cdric Krier.
-
-diff --git a/Lib/test/dh1024.pem b/Lib/test/dh1024.pem
-new file mode 100644
---- /dev/null
-+++ b/Lib/test/dh1024.pem
-@@ -0,0 +1,7 @@
-+-----BEGIN DH PARAMETERS-----
-+MIGHAoGBAIbzw1s9CT8SV5yv6L7esdAdZYZjPi3qWFs61CYTFFQnf2s/d09NYaJt
-+rrvJhIzWavqnue71qXCf83/J3nz3FEwUU/L0mGyheVbsSHiI64wUo3u50wK5Igo0
-+RNs/LD0irs7m0icZ//hijafTU+JOBiuA8zMI+oZfU7BGuc9XrUprAgEC
-+-----END DH PARAMETERS-----
-+
-+Generated with: openssl dhparam -out dh1024.pem 1024
-diff --git a/Lib/test/dh512.pem b/Lib/test/dh512.pem
-deleted file mode 100644
---- a/Lib/test/dh512.pem
-+++ /dev/null
-@@ -1,9 +0,0 @@
-------BEGIN DH PARAMETERS-----
--MEYCQQD1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWak
--XUGfnHy9iUsiGSa6q6Jew1XpKgVfAgEC
-------END DH PARAMETERS-----
--
--These are the 512 bit DH parameters from "Assigned Number for SKIP Protocols"
--(http://www.skip-vpn.org/spec/numbers.html).
--See there for how they were generated.
--Note that g is not a generator, but this is not a problem since p is a safe prime.
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -64,7 +64,7 @@ BADKEY = data_file("badkey.pem")
- NOKIACERT = data_file("nokia.pem")
- NULLBYTECERT = data_file("nullbytecert.pem")
-
--DHFILE = data_file("dh512.pem")
-+DHFILE = data_file("dh1024.pem")
- BYTES_DHFILE = os.fsencode(DHFILE)
-
-
-
diff --git a/python-3.1.2-fix-expat-issue9054.patch
b/python-3.1.2-fix-expat-issue9054.patch
deleted file mode 100644
index f1a4640..0000000
--- a/python-3.1.2-fix-expat-issue9054.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-Index: Modules/pyexpat.c
-===================================================================
---- Modules/pyexpat.c (revision 81539)
-+++ Modules/pyexpat.c (working copy)
-@@ -415,6 +415,9 @@
- PyObject *args;
- PyObject *temp;
-
-+ if (!have_handler(self, CharacterData))
-+ return -1;
-+
- args = PyTuple_New(1);
- if (args == NULL)
- return -1;
diff --git a/python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
b/python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
deleted file mode 100644
index 68eb618..0000000
--- a/python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up Python-3.2a1/Lib/test/test_imp.py.apply-our-changes-to-expected-shebang
Python-3.2a1/Lib/test/test_imp.py
---- Python-3.2a1/Lib/test/test_imp.py.apply-our-changes-to-expected-shebang 2010-08-02
15:57:49.151002176 -0400
-+++ Python-3.2a1/Lib/test/test_imp.py 2010-08-02 15:58:40.428010729 -0400
-@@ -52,7 +52,7 @@ class ImportTests(unittest.TestCase):
- self.assertNotEqual(fp, None)
- self.assertEqual(fp.encoding, "iso-8859-1")
- self.assertEqual(fp.tell(), 0)
-- self.assertEqual(fp.readline(), '#!/usr/bin/env python3\n')
-+ self.assertEqual(fp.readline(), '#!/usr/bin/python3.2\n')
- fp.close()
-
- fp, filename, info = imp.find_module("tokenize")
diff --git a/python-3.2a1-debug-build.patch b/python-3.2a1-debug-build.patch
deleted file mode 100644
index 49fb182..0000000
--- a/python-3.2a1-debug-build.patch
+++ /dev/null
@@ -1,290 +0,0 @@
-diff -up Python-3.2a1/configure.in.debug-build Python-3.2a1/configure.in
---- Python-3.2a1/configure.in.debug-build 2010-08-20 16:06:24.616082276 -0400
-+++ Python-3.2a1/configure.in 2010-08-20 16:06:24.632127011 -0400
-@@ -584,7 +584,7 @@ AC_SUBST(LIBRARY)
- AC_MSG_CHECKING(LIBRARY)
- if test -z "$LIBRARY"
- then
-- LIBRARY='libpython$(VERSION).a'
-+ LIBRARY='libpython$(VERSION)$(DEBUG_EXT).a'
- fi
- AC_MSG_RESULT($LIBRARY)
-
-@@ -726,8 +726,8 @@ if test $enable_shared = "yes"; then
- INSTSONAME="$LDLIBRARY".$SOVERSION
- ;;
- Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*)
-- LDLIBRARY='libpython$(VERSION).so'
-- BLDLIBRARY='-L. -lpython$(VERSION)'
-+ LDLIBRARY='libpython$(VERSION)$(DEBUG_EXT).so'
-+ BLDLIBRARY='-L. -lpython$(VERSION)$(DEBUG_EXT)'
- RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
- case $ac_sys_system in
- FreeBSD*)
-@@ -825,6 +825,14 @@ else AC_MSG_RESULT(no); Py_DEBUG='false'
- fi],
- [AC_MSG_RESULT(no)])
-
-+if test "$Py_DEBUG" = 'true'
-+then
-+ DEBUG_EXT=_d
-+ DEBUG_SUFFIX=-debug
-+fi
-+AC_SUBST(DEBUG_EXT)
-+AC_SUBST(DEBUG_SUFFIX)
-+
- # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
- # merged with this chunk of code?
-
-diff -up Python-3.2a1/Lib/distutils/command/build_ext.py.debug-build
Python-3.2a1/Lib/distutils/command/build_ext.py
---- Python-3.2a1/Lib/distutils/command/build_ext.py.debug-build 2010-07-22
08:50:05.000000000 -0400
-+++ Python-3.2a1/Lib/distutils/command/build_ext.py 2010-08-20 16:06:24.633125472 -0400
-@@ -673,7 +673,10 @@ class build_ext(Command):
- so_ext = get_config_var('SO')
- if os.name == 'nt' and self.debug:
- return os.path.join(*ext_path) + '_d' + so_ext
-- return os.path.join(*ext_path) + so_ext
-+
-+ # Similarly, extensions in debug mode are named 'module_d.so', to
-+ # avoid adding the _d to the SO config variable:
-+ return os.path.join(*ext_path) + (sys.pydebug and "_d" or
"") + so_ext
-
- def get_export_symbols(self, ext):
- """Return the list of symbols that a shared extension has to
-@@ -754,6 +757,8 @@ class build_ext(Command):
- template = "python%d.%d"
- pythonlib = (template %
- (sys.hexversion >> 24, (sys.hexversion >> 16)
& 0xff))
-+ if sys.pydebug:
-+ pythonlib += '_d'
- return ext.libraries + [pythonlib]
- else:
- return ext.libraries
-diff -up Python-3.2a1/Lib/distutils/sysconfig.py.debug-build
Python-3.2a1/Lib/distutils/sysconfig.py
---- Python-3.2a1/Lib/distutils/sysconfig.py.debug-build 2010-08-20 16:06:24.623083865
-0400
-+++ Python-3.2a1/Lib/distutils/sysconfig.py 2010-08-20 16:06:24.633125472 -0400
-@@ -83,7 +83,8 @@ def get_python_inc(plat_specific=0, pref
- else:
- incdir = os.path.join(get_config_var('srcdir'),
'Include')
- return os.path.normpath(incdir)
-- return os.path.join(prefix, "include", "python" +
get_python_version())
-+ return os.path.join(prefix, "include",
-+ "python" + get_python_version() + (sys.pydebug and
'-debug' or ''))
- elif os.name == "nt":
- return os.path.join(prefix, "include")
- elif os.name == "mac":
-@@ -229,7 +230,7 @@ def get_makefile_filename():
- if python_build:
- return os.path.join(os.path.dirname(sys.executable), "Makefile")
- lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
-- return os.path.join(lib_dir, "config", "Makefile")
-+ return os.path.join(lib_dir, "config" + (sys.pydebug and
"-debug" or ""), "Makefile")
-
-
- def parse_config_h(fp, g=None):
-diff -up Python-3.2a1/Makefile.pre.in.debug-build Python-3.2a1/Makefile.pre.in
---- Python-3.2a1/Makefile.pre.in.debug-build 2010-08-20 16:06:24.624081000 -0400
-+++ Python-3.2a1/Makefile.pre.in 2010-08-20 16:06:57.287084214 -0400
-@@ -105,8 +105,8 @@ SCRIPTDIR= $(prefix)/lib64
- # Detailed destination directories
- BINLIBDEST= $(LIBDIR)/python$(VERSION)
- LIBDEST= $(SCRIPTDIR)/python$(VERSION)
--INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)
--CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)
-+INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
-+CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
- LIBP= $(LIBDIR)/python$(VERSION)
-
- # Symbols used for using shared libraries
-@@ -120,6 +120,12 @@ DESTSHARED= $(BINLIBDEST)/lib-dynload
- EXE= @EXEEXT@
- BUILDEXE= @BUILDEXEEXT@
-
-+# DEBUG_EXT is used by ELF files (names and SONAMEs); it will be "_d" for a
debug build
-+# DEBUG_SUFFIX is used by filesystem paths; it will be "-debug" for a debug
build
-+# Both will be empty in an optimized build
-+DEBUG_EXT= @DEBUG_EXT@
-+DEBUG_SUFFIX= @DEBUG_SUFFIX@
-+
- # Short name and location for Mac OS X Python framework
- UNIVERSALSDK=@UNIVERSALSDK@
- PYTHONFRAMEWORK= @PYTHONFRAMEWORK@
-@@ -183,7 +189,7 @@ LIBOBJDIR= Python/
- LIBOBJS= @LIBOBJS@
-
- PYTHON= python$(EXE)
--BUILDPYTHON= python$(BUILDEXE)
-+BUILDPYTHON= python$(BUILD_SUFFIX)$(BUILDEXE)
-
- # The task to run while instrument when building the profile-opt target
- PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
-@@ -433,7 +439,7 @@ sharedmods: $(BUILDPYTHON)
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)'
LDFLAGS='$(PY_LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E
$(srcdir)/setup.py build;; \
- esac
-
--libpython$(VERSION).so: $(LIBRARY_OBJS)
-+libpython$(VERSION)$(DEBUG_EXT).so: $(LIBRARY_OBJS)
- if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(LDSHARED) $(PY_LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS)
$(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
- $(LN) -f $(INSTSONAME) $@; \
-@@ -817,7 +823,7 @@ altbininstall: $(BUILDPYTHON)
- else true; \
- fi; \
- done
-- $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE)
-+ $(INSTALL_PROGRAM) $(BUILDPYTHON)
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
- if test -f $(LDLIBRARY); then \
- if test -n "$(DLLLIBRARY)" ; then \
- $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \
-@@ -831,15 +837,15 @@ altbininstall: $(BUILDPYTHON)
- fi
-
- bininstall: altbininstall
-- -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
-- then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
-+ -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
-+ then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
- else true; \
- fi
-- (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(EXE) $(PYTHON)3$(EXE))
-- -rm -f $(DESTDIR)$(BINDIR)/python3-config
-- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config)
-- -rm -f $(DESTDIR)$(LIBPC)/python3.pc
-- (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python3.pc)
-+ (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
$(PYTHON)3$(DEBUG_SUFFIX)$(EXE))
-+ -rm -f $(DESTDIR)$(BINDIR)/python3$(DEBUG_SUFFIX)-config
-+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(DEBUG_SUFFIX)-config
python3$(DEBUG_SUFFIX)-config)
-+ -rm -f $(DESTDIR)$(LIBPC)/python3$(DEBUG_SUFFIX).pc
-+ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)$(DEBUG_SUFFIX).pc
python3$(DEBUG_SUFFIX).pc)
-
- # Install the manual page
- maninstall:
-@@ -965,10 +971,10 @@ $(srcdir)/Lib/$(PLATDIR):
- export EXE; EXE="$(BUILDEXE)"; \
- cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen
-
--python-config: $(srcdir)/Misc/python-config.in
-+python$(DEBUG_SUFFIX)-config: $(srcdir)/Misc/python-config.in
- # Substitution happens here, as the completely-expanded BINDIR
- # is not available in configure
-- sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(EXE)," <
$(srcdir)/Misc/python-config.in >python-config
-+ sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)," <
$(srcdir)/Misc/python-config.in >python$(DEBUG_SUFFIX)-config
-
- # Install the include files
- INCLDIRSTOMAKE=$(INCLUDEDIR) $(CONFINCLUDEDIR) $(INCLUDEPY) $(CONFINCLUDEPY)
-@@ -990,12 +996,12 @@ inclinstall:
-
- # Install the library and miscellaneous stuff needed for extending/embedding
- # This goes into $(exec_prefix)
--LIBPL= $(LIBP)/config
-+LIBPL= $(LIBP)/config$(DEBUG_SUFFIX)
-
- # pkgconfig directory
- LIBPC= $(LIBDIR)/pkgconfig
-
--libainstall: all python-config
-+libainstall: all python$(DEBUG_SUFFIX)-config
- @for i in $(LIBDIR) $(LIBP) $(LIBPL) $(LIBPC); \
- do \
- if test ! -d $(DESTDIR)$$i; then \
-@@ -1011,11 +1017,11 @@ libainstall: all python-config
- $(INSTALL_DATA) Modules/Setup $(DESTDIR)$(LIBPL)/Setup
- $(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local
- $(INSTALL_DATA) Modules/Setup.config $(DESTDIR)$(LIBPL)/Setup.config
-- $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION).pc
-+ $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION)$(DEBUG_SUFFIX).pc
- $(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup
- $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh
-- $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(VERSION)-config
-- rm python-config
-+ $(INSTALL_SCRIPT) python$(DEBUG_SUFFIX)-config
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)-config
-+ rm python$(DEBUG_SUFFIX)-config
- @if [ -s Modules/python.exp -a \
- "`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ];
then \
- echo; echo "Installing support files for building shared extension modules on
AIX:"; \
-diff -up Python-3.2a1/Misc/python-config.in.debug-build
Python-3.2a1/Misc/python-config.in
---- Python-3.2a1/Misc/python-config.in.debug-build 2010-04-06 17:30:42.000000000 -0400
-+++ Python-3.2a1/Misc/python-config.in 2010-08-20 16:06:24.635124366 -0400
-@@ -45,7 +45,7 @@ for opt in opt_flags:
-
- elif opt in ('--libs', '--ldflags'):
- libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
-- libs.append('-lpython'+pyver)
-+ libs.append('-lpython' + pyver + (sys.pydebug and "_d" or
""))
- # add the prefix/lib/pythonX.Y/config dir, but only if there is no
- # shared library in prefix/lib/.
- if opt == '--ldflags':
-diff -up Python-3.2a1/Modules/makesetup.debug-build Python-3.2a1/Modules/makesetup
---- Python-3.2a1/Modules/makesetup.debug-build 2010-07-09 12:30:58.000000000 -0400
-+++ Python-3.2a1/Modules/makesetup 2010-08-20 16:06:24.635124366 -0400
-@@ -233,7 +233,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
- *$mod.o*) base=$mod;;
- *) base=${mod}module;;
- esac
-- file="$srcdir/$base\$(SO)"
-+ file="$srcdir/$base\$(DEBUG_EXT)\$(SO)"
- case $doconfig in
- no) SHAREDMODS="$SHAREDMODS $file";;
- esac
-diff -up Python-3.2a1/Python/dynload_shlib.c.debug-build
Python-3.2a1/Python/dynload_shlib.c
---- Python-3.2a1/Python/dynload_shlib.c.debug-build 2010-05-09 11:52:27.000000000 -0400
-+++ Python-3.2a1/Python/dynload_shlib.c 2010-08-20 16:06:24.635124366 -0400
-@@ -46,11 +46,16 @@ const struct filedescr _PyImport_DynLoad
- {"module.exe", "rb", C_EXTENSION},
- {"MODULE.EXE", "rb", C_EXTENSION},
- #else
-+#ifdef Py_DEBUG
-+ {"_d.so", "rb", C_EXTENSION},
-+ {"module_d.so", "rb", C_EXTENSION},
-+#else
- {".so", "rb", C_EXTENSION},
- {"module.so", "rb", C_EXTENSION},
--#endif
--#endif
--#endif
-+#endif /* Py_DEBUG */
-+#endif /* __VMS */
-+#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
-+#endif /* __CYGWIN__ */
- {0, 0}
- };
-
-diff -up Python-3.2a1/Python/sysmodule.c.debug-build Python-3.2a1/Python/sysmodule.c
---- Python-3.2a1/Python/sysmodule.c.debug-build 2010-07-06 06:53:30.000000000 -0400
-+++ Python-3.2a1/Python/sysmodule.c 2010-08-20 16:06:24.636251716 -0400
-@@ -1598,6 +1598,12 @@ _PySys_Init(void)
- WindowsVersionType.tp_new = NULL;
- #endif
-
-+#ifdef Py_DEBUG
-+ PyDict_SetItemString(sysdict, "pydebug", Py_True);
-+#else
-+ PyDict_SetItemString(sysdict, "pydebug", Py_False);
-+#endif
-+
- /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
- #ifndef PY_NO_SHORT_FLOAT_REPR
- SET_SYS_FROM_STRING("float_repr_style",
-diff -up Python-3.2a1/runtests.sh.debug-build Python-3.2a1/runtests.sh
---- Python-3.2a1/runtests.sh.debug-build 2008-10-17 08:05:40.000000000 -0400
-+++ Python-3.2a1/runtests.sh 2010-08-20 16:06:24.637251276 -0400
-@@ -16,11 +16,14 @@ Flags (arguments starting with '-') are
- regrtest.py, except for -x, which is processed here."
-
- # Choose the Python binary.
--case `uname` in
--Darwin) PYTHON=./python.exe;;
--CYGWIN*) PYTHON=./python.exe;;
--*) PYTHON=./python;;
--esac
-+if [ -z $PYTHON ]
-+then
-+ case `uname` in
-+ Darwin) PYTHON=./python.exe;;
-+ CYGWIN*) PYTHON=./python.exe;;
-+ *) PYTHON=./python;;
-+ esac
-+fi
-
- PYTHON="$PYTHON -bb"
-
diff --git a/python-3.2a1-fix-parallel-make.patch b/python-3.2a1-fix-parallel-make.patch
deleted file mode 100644
index b6189b5..0000000
--- a/python-3.2a1-fix-parallel-make.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-diff -up Python-3.2a1/Makefile.pre.in.parallel-grammar Python-3.2a1/Makefile.pre.in
---- Python-3.2a1/Makefile.pre.in.parallel-grammar 2010-08-20 15:09:13.613527156 -0400
-+++ Python-3.2a1/Makefile.pre.in 2010-08-20 15:10:31.428135355 -0400
-@@ -222,6 +222,7 @@ IO_OBJS= \
-
- ##########################################################################
- # Grammar
-+GRAMMAR_STAMP= $(srcdir)/grammar-stamp
- GRAMMAR_H= $(srcdir)/Include/graminit.h
- GRAMMAR_C= $(srcdir)/Python/graminit.c
- GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar
-@@ -557,9 +558,24 @@ Modules/python.o: $(srcdir)/Modules/pyth
-
- $(IO_OBJS): $(IO_H)
-
--$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-+# GNU "make" interprets rules with two dependents as two copies of the rule.
-+#
-+# In a parallel build this can lead to pgen being run twice, once for each of
-+# GRAMMAR_H and GRAMMAR_C, leading to race conditions in which the compiler
-+# reads a partially-overwritten copy of one of these files, leading to syntax
-+# errors (or linker errors if the fragment happens to be syntactically valid C)
-+#
-+# See
http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
-+# for more information
-+#
-+# Introduce ".grammar-stamp" as a contrived single output from PGEN to avoid
-+# this:
-+$(GRAMMAR_H) $(GRAMMAR_C): $(GRAMMAR_STAMP)
-+
-+$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
- -@$(INSTALL) -d Include
- -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
-+ touch $(GRAMMAR_STAMP)
-
- $(PGEN): $(PGENOBJS)
- $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
diff --git a/python-3.2b2-fix-ppc-debug-build.patch
b/python-3.2b2-fix-ppc-debug-build.patch
deleted file mode 100644
index e9c7176..0000000
--- a/python-3.2b2-fix-ppc-debug-build.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-diff -up Python-3.2b2/Python/ceval.c.fix-ppc-debug-build Python-3.2b2/Python/ceval.c
---- Python-3.2b2/Python/ceval.c.fix-ppc-debug-build 2011-01-05 16:37:27.007598805 -0500
-+++ Python-3.2b2/Python/ceval.c 2011-01-05 16:45:06.562652472 -0500
-@@ -30,10 +30,11 @@
-
- typedef unsigned long long uint64;
-
--#if defined(__ppc__) /* <- Don't know if this is the correct symbol; this
-- section should work for GCC on any PowerPC
-- platform, irrespective of OS.
-- POWER? Who knows :-) */
-+/* PowerPC suppport.
-+ "__ppc__" appears to be the preprocessor definition to detect on OS X,
whereas
-+ "__powerpc__" appears to be the correct one for Linux with GCC
-+*/
-+#if defined(__ppc__) || defined (__powerpc__)
-
- #define READ_TIMESTAMP(var) ppc_getcounter(&var)
-
diff --git a/python-3.2rc1-s390-tsc.patch b/python-3.2rc1-s390-tsc.patch
deleted file mode 100644
index fc4a6b9..0000000
--- a/python-3.2rc1-s390-tsc.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -up Python-3.2rc1/Python/ceval.c.s390-tsc Python-3.2rc1/Python/ceval.c
---- Python-3.2rc1/Python/ceval.c.s390-tsc 2011-02-04 05:11:27.585224435 -0500
-+++ Python-3.2rc1/Python/ceval.c 2011-02-04 05:12:38.065223933 -0500
-@@ -74,6 +74,13 @@ ppc_getcounter(uint64 *v)
- "=a" (((int*)&(val))[0]), "=d"
(((int*)&(val))[1]));
-
-
-+#elif defined(__s390__)
-+
-+/* covers both s390 and s390x */
-+
-+#define READ_TIMESTAMP(val) \
-+ __asm__ __volatile__("stck %0" : "=Q" (val) : : "cc")
-+
- #else
-
- #error "Don't know how to implement timestamp counter for this
architecture"
diff --git a/python3.spec b/python3.spec
index 70de93a..91b2633 100644
--- a/python3.spec
+++ b/python3.spec
@@ -247,10 +247,6 @@ Source8: check-pyc-and-pyo-timestamps.py
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
-# Some tests were removed due to audiotest.au not being packaged. This was
-# however added to the archive in 3.3.1, so we no longer delete the tests.
-# Patch3: 00003-remove-mimeaudio-tests.patch
-
# 00055 #
# Systemtap support: add statically-defined probe points
# Patch sent upstream as
http://bugs.python.org/issue14776
@@ -271,10 +267,6 @@ Patch104: 00104-lib64-fix-for-test_install.patch
# Downstream only: not appropriate for upstream
Patch111: 00111-no-static-lib.patch
-# 00112 #
-# Patch112: python-2.7rc1-debug-build.patch: this is not relevant to Python 3,
-# for 3.2 onwards
-
# 00113 #
# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
@@ -283,10 +275,6 @@ Patch111: 00111-no-static-lib.patch
# Not yet sent upstream
Patch113: 00113-more-configuration-flags.patch
-# 00114 #
-# Upstream as of Python 3.4.0.b2
-# Patch114: 00114-statvfs-f_flag-constants.patch
-
# 00125 #
# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
# emitting debug info to stdout on exit is too verbose and makes it harder to
@@ -295,11 +283,6 @@ Patch113: 00113-more-configuration-flags.patch
# Not yet sent upstream
Patch125: 00125-less-verbose-COUNT_ALLOCS.patch
-# 00130 #
-# Python 2's:
-# Patch130: python-2.7.2-add-extension-suffix-to-python-config.patch
-# is not relevant to Python 3 (for 3.2 onwards)
-
# 00131 #
# The four tests in test_io built on top of check_interrupted_write_retry
# fail when built in Koji, for ppc and ppc64; for some reason, the SIGALRM
@@ -337,18 +320,10 @@ Patch134: 00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
# Not yet sent upstream
Patch135: 00135-fix-test-within-test_weakref-in-debug-build.patch
-# 00136 #
-# Patch136: 00136-skip-tests-of-seeking-stdin-in-rpmbuild.patch does not seem
-# to be needed by python3
-
# 00137 #
# Some tests within distutils fail when run in an rpmbuild:
Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
-# 00138 #
-# Patch138: 00138-fix-distutils-tests-in-debug-build.patch is not relevant for
-# python3
-
# 00139 #
# ARM-specific: skip known failure in test_float:
#
http://bugs.python.org/issue8265 (rhbz#706253)
@@ -357,9 +332,6 @@ Patch139: 00139-skip-test_float-known-failure-on-arm.patch
# ideally short lived patch disabling a test thats fragile on different arches
Patch140: python3-arm-skip-failing-fragile-test.patch
-# Patch140: 00140-skip-test_ctypes-known-failure-on-sparc.patch does not appear
-# to be relevant for python3
-
# 00141 #
# Fix tests for case when tests for case when configured with
# COUNT_ALLOCS (debug build):
http://bugs.python.org/issue19527
@@ -373,17 +345,6 @@ Patch141: 00141-fix-tests_with_COUNT_ALLOCS.patch
# Sent upstream as
http://bugs.python.org/issue12872
Patch143: 00143-tsc-on-ppc.patch
-# 00144 #
-# (Optionally) disable the gdbm module:
-# python.spec's
-# Patch144: 00144-no-gdbm.patch
-# is not needed in python3.spec
-
-# 00145 #
-# python.spec's
-# Patch145: 00145-force-sys-platform-to-be-linux2.patch
-# is upstream for Python 3 as of 3.2.2
-
# 00146 #
# Support OpenSSL FIPS mode (e.g. when OPENSSL_FORCE_FIPS_MODE=1 is set)
# - handle failures from OpenSSL (e.g. on attempts to use MD5 in a
@@ -408,20 +369,6 @@ Patch143: 00143-tsc-on-ppc.patch
# implementation and OpenSSL still doesn't support it. For now, they're
harmless.
Patch146: 00146-hashlib-fips.patch
-# 00147 #
-# Add a sys._debugmallocstats() function
-# Sent upstream as
http://bugs.python.org/issue14785
-# Upstream as of Python 3.3.0
-# Patch147: 00147-add-debug-malloc-stats.patch
-
-# 00148 #
-# Upstream as of Python 3.2.3:
-# Patch148: 00148-gdbm-1.9-magic-values.patch
-
-# 00149 #
-# Upstream as of Python 3.2.3:
-# Patch149: 00149-backport-issue11254-pycache-bytecompilation-fix.patch
-
# 00150 #
# temporarily disable rAssertAlmostEqual in test_cmath on PPC (bz #750811)
# caused by a glibc bug. This patch can be removed when we have a glibc with
@@ -429,42 +376,12 @@ Patch146: 00146-hashlib-fips.patch
#
http://sourceware.org/bugzilla/show_bug.cgi?id=13472
Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
-# 00151 #
-# python.spec had:
-# Patch151: 00151-fork-deadlock.patch
-
-# 00152 #
-# Fix a regex in test_gdb so that it doesn't choke when gdb provides a full
-# path to Python/bltinmodule.c:
-# Committed upstream as 77824:abcd29c9a791 as part of fix for
-#
http://bugs.python.org/issue12605
-# Patch152: 00152-fix-test-gdb-regex.patch
-
-# 00153 #
-# Strip out lines of the form "warning: Unable to open ..." from gdb's
stderr
-# when running test_gdb.py; also cope with change to gdb in F17 onwards in
-# which values are printed as "v@entry" rather than just "v":
-# Not yet sent upstream
-# Upstream as of 3.4.3
-# Patch153: 00153-fix-test_gdb-noise.patch
-
-# 00154 #
-# python3.spec on f15 has:
-# Patch154: 00154-skip-urllib-test-requiring-working-DNS.patch
-
# 00155 #
# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
# generating SELinux denials on "import ctypes" and "import uuid"
when
# embedding Python within httpd (rhbz#814391)
Patch155: 00155-avoid-ctypes-thunks.patch
-# 00156 #
-# Recent builds of gdb will only auto-load scripts from certain safe
-# locations. Turn off this protection when running test_gdb in the selftest
-# suite to ensure that it can load our -gdb.py script (rhbz#817072):
-# Upsream as of 3.4.3
-# Patch156: 00156-gdb-autoload-safepath.patch
-
# 00157 #
# Update uid/gid handling throughout the standard library: uid_t and gid_t are
# unsigned 32-bit values, but existing code often passed them through C long
@@ -481,14 +398,6 @@ Patch155: 00155-avoid-ctypes-thunks.patch
# (rhbz#697470)
Patch157: 00157-uid-gid-overflows.patch
-# 00158 #
-# Upstream as of Python 3.3.1
-
-# 00159 #
-# Patch159: 00159-correct-libdb-include-path.patch
-# in python.spec
-# TODO: python3 status?
-
# 00160 #
# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
# header files in the build chroot, but may not be supported in the running
@@ -497,12 +406,6 @@ Patch157: 00157-uid-gid-overflows.patch
# Not yet sent upstream
Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
-# 00161 #
-# (Was only needed for Python 3.3.0b1)
-
-# 00162 #
-# (Was only needed for Python 3.3.0b1)
-
# 00163 #
# Some tests within test_socket fail intermittently when run inside Koji;
# disable them using unittest._skipInRpmBuild
@@ -515,31 +418,6 @@ Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
# disable those tests so that rebuilds on PPC can continue
Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
-# 00165 #
-# python.spec has:
-# Patch165: 00165-crypt-module-salt-backport.patch
-# which is a backport from 3.3 and thus not relevant to "python3"
-
-# 00166 #
-# Patch166: 00166-fix-fake-repr-in-gdb-hooks.patch
-# in python.spec
-# TODO: python3 status?
-
-# 00167 #
-# Patch167: 00167-disable-stack-navigation-tests-when-optimized-in-test_gdb.patch
-# in python.spec
-# TODO: python3 status?
-
-# 00168 #
-# Patch168: 00168-distutils-cflags.patch
-# in python.spec
-# TODO: python3 status?
-
-# 00169 #
-# Patch169: 00169-avoid-implicit-usage-of-md5-in-multiprocessing.patch
-# in python.spec
-# TODO: python3 status?
-
# 00170 #
# In debug builds, try to print repr() when a C-level assert fails in the
# garbage collector (typically indicating a reference-counting error
@@ -551,37 +429,11 @@ Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
# (rhbz#850013
Patch170: 00170-gc-assertions.patch
-# 00171 #
-# python.spec had:
-# Patch171: 00171-raise-correct-exception-when-dev-urandom-is-missing.patch
-# TODO: python3 status?
-
-# 00172 #
-# python.spec had:
-# Patch172: 00172-use-poll-for-multiprocessing-socket-connection.patch
-# TODO: python3 status?
-
# 00173 #
# Workaround for ENOPROTOOPT seen in Koji withi test.support.bind_port()
# (rhbz#913732)
Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
-# 00174 #
-# Patch174: 00174-fix-for-usr-move.patch
-# TODO: python3 status?
-
-# 00175 #
-# Upstream as of Python 3.3.2
-# Patch175: 00175-fix-configure-Wformat.patch
-
-# 00176 #
-# Fixed upstream as of Python 3.3.1
-# Patch176: 00176-upstream-issue16754-so-extension.patch
-
-# 00177 #
-# Fixed upstream as of Python 3.4.0.b2
-# Patch177: 00177-platform-unicode.patch
-
# 00178 #
# Don't duplicate various FLAGS in sysconfig values
#
http://bugs.python.org/issue17679
@@ -602,19 +454,6 @@ Patch179:
00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
# Not appropriate for upstream, Fedora-specific naming
Patch180: 00180-python-add-support-for-ppc64p7.patch
-# 00181 #
-# python.spec has
-# Patch181: 00181-allow-arbitrary-timeout-in-condition-wait.patch
-# Does not affect python3
-
-# 00182 #
-# Fixed upstream as of Python 3.3.2
-# Patch182: 00182-fix-test_gdb-test_threads.patch
-
-# 00183 #
-# Fixed upstream as of Python 3.4.0a4
-# Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
-
# 00184 #
# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=979696
# Fixes build of ctypes against libffi with multilib wrapper
@@ -623,10 +462,6 @@ Patch180: 00180-python-add-support-for-ppc64p7.patch
# We patch this by also accepting "#define ffi_wrapper_h"
Patch184: 00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
-# 00185 #
-# Fixed upstream as of Python 3.4.0a4
-# Patch185: 00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
-
# 00186 #
# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=1023607
# Previously, this fixed a problem where some *.py files were not being
@@ -636,10 +471,6 @@ Patch184:
00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
# This was fixed upstream, but the test hasn't been merged yet, so we keep it
Patch186: 00186-dont-raise-from-py_compile.patch
-# 00187 #
-# Fixed upstream as of Python 3.4.0b1
-# Patch187: 00187-remove-pthread-atfork.patch
-
# 00188 #
# Downstream only patch that should be removed when we compile all guaranteed
# hashlib algorithms properly. The problem is this:
@@ -664,48 +495,15 @@ Patch188:
00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
Patch189: 00189-add-rewheel-module.patch
%endif
-# 00190 #
-#
-# Fix tests with SQLite >= 3.8.4
-#
http://bugs.python.org/issue20901
-#
http://hg.python.org/cpython/rev/4d626a9df062
-# FIXED UPSTREAM
-# Patch190: 00190-fix-tests-with-sqlite-3.8.4.patch
-
-# 00193
-#
-# Skip correct number of *.pyc file bytes in ModuleFinder.load_module
-# rhbz#1060338
-#
http://bugs.python.org/issue20778
-# FIXED UPSTREAM
-# Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
-
# Tests requiring SIGHUP to work don't work in Koji
# see rhbz#1088233
Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
-# 00195
-#
-# Don't declare Werror=declaration-after-statement for extension
-# modules through setup.py
-#
http://bugs.python.org/issue21121
-# FIXED UPSTREAM
-# Patch195: 00195-dont-add-Werror-declaration-after-statement.patch
-
# 00196
#
# Fix test_gdb failure on ppc64le
Patch196: 00196-test-gdb-match-addr-before-builtin.patch
-# 00197
-#
-# The CGIHTTPServer Python module did not properly handle URL-encoded
-# path separators in URLs. This may have enabled attackers to disclose a CGI
-# script's source code or execute arbitrary scripts in the server's
-# document root.
-# FIXED UPSTREAM
-# Patch197: 00197-fix-CVE-2014-4650.patch
-
# OpenSSL disabled SSLv3 in SSLv23 method
# This patch alters python tests to reflect this change
# Issue:
http://bugs.python.org/issue22638 Upstream discussion about SSLv3 in Python
@@ -723,19 +521,9 @@ Patch200: 00200-gettext-plural-fix.patch
# Note: Backported from scl
Patch201: 00201-fix-memory-leak-in-gdbm.patch
-# 00202 #
-# Fixes undefined behaviour in faulthandler which caused test to hang on x86_64
-#
http://bugs.python.org/issue23433
-# FIXED UPSTREAM
-#Patch202: 00202-fix-undefined-behaviour-in-faulthandler.patch
-
# test_threading fails in koji dues to it's handling of signals
Patch203: 00203-disable-threading-test-koji.patch
-# openssl requires DH keys to be > 768bits
-# FIXED UPSTREAM
-# Patch204: 00204-increase-dh-keys-size.patch
-
# LIBPL variable in makefile takes LIBPL from configure.ac
# but the LIBPL variable defined there doesn't respect libdir macro
Patch205: 00205-make-libpl-respect-lib64.patch
@@ -943,7 +731,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
# Apply patches:
#
%patch1 -p1
-# 3: upstream as of Python 3.3.1
%if 0%{?with_systemtap}
%patch55 -p1 -b .systemtap
@@ -956,9 +743,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch111 -p1
-# 112: not for python3
%patch113 -p1
-# 00114: Upstream as of Python 3.4.0.b2
%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
@@ -967,83 +752,42 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%endif
%patch132 -p1
-# 00133: not for python3
%patch134 -p1
%patch135 -p1
-# 00136: not for python3
%patch137 -p1
-# 00138: not for python3
%ifarch %{arm}
%patch139 -p1
%patch140 -p1
%endif
-# 00140: not for python3
%patch141 -p1
%patch143 -p1 -b .tsc-on-ppc
-# 00144: not for python3
-# 00145: not for python3
%patch146 -p1
-# 00147: upstream as of Python 3.3.0
-# 00148: upstream as of Python 3.2.3
-# 00149: upstream as of Python 3.2.3
%ifarch ppc %{power64}
%patch150 -p1
%endif
-# 00151: not for python3
-# 00152: upstream as of Python 3.3.0b2
-# 00153: upstream as of Python 3.4.3
-# 00154: not for this branch
%patch155 -p1
-# 00156: upstream as of 3.4.3
%patch157 -p1
-#00158: FIXME
-#00159: FIXME
%patch160 -p1
-# 00161: was only needed for Python 3.3.0b1
-# 00162: was only needed for Python 3.3.0b1
%patch163 -p1
%ifarch ppc %{power64}
%patch164 -p1
%endif
-#00165: TODO
-#00166: TODO
-#00167: TODO
-#00168: TODO
-#00169: TODO
-#00170: TODO
-#00171: TODO
-#00172: TODO
%patch173 -p1
-#00174: TODO
-# 00175: upstream as of Python 3.3.2
-# 00176: upstream as of Python 3.3.1
-# 00177: upstream as of Python 3.4.0.b2
%patch178 -p1
%patch179 -p1
%patch180 -p1
-# 00181: not for python3
-# 00182: upstream as of Python 3.3.2
-# 00183 upstream as of Python 3.4.0a4
%patch184 -p1
-# 00185 upstream as of Python 3.4.0a4
%patch186 -p1
-# 00187: upstream as of Python 3.4.0b1
%patch188 -p1
%if 0%{with_rewheel}
%patch189 -p1
%endif
-# 00190: upstream as of Python 3.4.1
-# 00193: upstream as of Python 3.4.1
%patch194 -p1
-# 00195: upstream as of Python 3.4.2
%patch196 -p1
-# 00197: upstream as of Python 3.4.2
%patch199 -p1
-# 00202: upstream as of 3.5.0b3
%patch203 -p1
-# 00204: upstream as of 3.5.0b3
%patch205 -p1
%patch206 -p1
%patch207 -p1
commit e769a593968acf4dd3e34831034be35f5e1122c6
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Sun Nov 15 10:02:16 2015 +0100
Remove versioned libpython from devel package
diff --git a/python3.spec b/python3.spec
index 5b2a2d2..70de93a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -1779,7 +1779,6 @@ rm -fr %{buildroot}
%{_bindir}/python%{LDVERSION_optimized}-config
%{_bindir}/python%{LDVERSION_optimized}-*-config
%{_libdir}/libpython%{LDVERSION_optimized}.so
-%{_libdir}/libpython%{LDVERSION_optimized}.so.1.0
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
@@ -1949,6 +1948,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun Nov 15 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-5
+- Remove versioned libpython from devel package
+
* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
- add correct arch for ppc64/ppc64le to fix build failure
commit 0efd3d31cb9d167779a790169c65a84da7919822
Author: Than Ngo <than(a)redhat.com>
Date: Fri Nov 13 18:50:47 2015 +0100
add correct arch for ppc64/ppc64le to fix build failure, it should be
ppc64le-linux-gnu/ppc64-linux-gnu instead powerpc64le-linux-gnu/powerpc64-linux-gnu
http://ppc.koji.fedoraproject.org/koji/taskinfo?taskID=2900961
diff --git a/python3-powerppc-arch.patch b/python3-powerppc-arch.patch
new file mode 100644
index 0000000..10f0201
--- /dev/null
+++ b/python3-powerppc-arch.patch
@@ -0,0 +1,30 @@
+diff -up Python-3.5.0/configure.ac.than Python-3.5.0/configure.ac
+--- Python-3.5.0/configure.ac.than 2015-11-13 11:51:32.039560172 -0500
++++ Python-3.5.0/configure.ac 2015-11-13 11:52:11.670168157 -0500
+@@ -804,9 +804,9 @@ cat >> conftest.c <<EOF
+ powerpc-linux-gnuspe
+ # elif defined(__powerpc64__)
+ # if defined(__LITTLE_ENDIAN__)
+- powerpc64le-linux-gnu
++ ppc64le-linux-gnu
+ # else
+- powerpc64-linux-gnu
++ ppc64-linux-gnu
+ # endif
+ # elif defined(__powerpc__)
+ powerpc-linux-gnu
+diff -up Python-3.5.0/configure.than Python-3.5.0/configure
+--- Python-3.5.0/configure.than 2015-11-13 12:13:19.039658399 -0500
++++ Python-3.5.0/configure 2015-11-13 12:13:35.199906857 -0500
+@@ -5153,9 +5153,9 @@ cat >> conftest.c <<EOF
+ powerpc-linux-gnuspe
+ # elif defined(__powerpc64__)
+ # if defined(__LITTLE_ENDIAN__)
+- powerpc64le-linux-gnu
++ ppc64le-linux-gnu
+ # else
+- powerpc64-linux-gnu
++ ppc64-linux-gnu
+ # endif
+ # elif defined(__powerpc__)
+ powerpc-linux-gnu
diff --git a/python3.spec b/python3.spec
index bcc552e..5b2a2d2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -776,6 +776,10 @@ Patch207: 00207-hide-atomic-symbols.patch
# above:
Patch5000: 05000-autotool-intermediates.patch
+# add correct arch for ppc64/ppc64le
+# it should be ppc64le-linux-gnu/ppc64-linux-gnu instead
powerpc64le-linux-gnu/powerpc64-linux-gnu
+Patch5001: python3-powerppc-arch.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-root
# ======================================================
@@ -1060,6 +1064,8 @@ sed --in-place \
%patch5000 -p0 -b .autotool-intermediates
%endif
+%patch5001 -p1
+
# ======================================================
# Configuring and building the code:
# ======================================================
@@ -1943,6 +1949,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Nov 13 2015 Than Ngo <than(a)redhat.com> 3.5.0-4
+- add correct arch for ppc64/ppc64le to fix build failure
+
* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
- Hide the private _Py_atomic_xxx symbols from public header
commit 08374589d7432f605237c68f9c63de5aa2fc25a5
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Wed Nov 11 10:35:39 2015 +0100
Hide the private _Py_atomic_xxx symbols from public header
diff --git a/00207-hide-atomic-symbols.patch b/00207-hide-atomic-symbols.patch
new file mode 100644
index 0000000..d8871a0
--- /dev/null
+++ b/00207-hide-atomic-symbols.patch
@@ -0,0 +1,63 @@
+
+# HG changeset patch
+# User Victor Stinner <victor.stinner(a)gmail.com>
+# Date 1442581594 -7200
+# Node ID d4fcb362f7c66b25b22ddc0d27db0cc96acc727b
+# Parent d04a0954e142f873adee88ec5bc1c1d81cd46bc4
+Issue #25150: Hide the private _Py_atomic_xxx symbols from the public
+Python.h header to fix a compilation error with OpenMP. PyThreadState_GET()
+becomes an alias to PyThreadState_Get() to avoid ABI incompatibilies.
+
+It is important that the _PyThreadState_Current variable is always accessed
+with the same implementation of pyatomic.h. Use the PyThreadState_Get()
+function so extension modules will all reuse the same implementation.
+
+diff --git a/Include/pyatomic.h b/Include/pyatomic.h
+--- a/Include/pyatomic.h
++++ b/Include/pyatomic.h
+@@ -1,8 +1,6 @@
+-/* Issue #23644: <stdatomic.h> is incompatible with C++, see:
+-
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932 */
+-#if !defined(Py_LIMITED_API) && !defined(__cplusplus)
+ #ifndef Py_ATOMIC_H
+ #define Py_ATOMIC_H
++#ifdef Py_BUILD_CORE
+
+ #include "dynamic_annotations.h"
+
+@@ -248,5 +246,5 @@ static __inline__ void
+ #define _Py_atomic_load_relaxed(ATOMIC_VAL) \
+ _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed)
+
++#endif /* Py_BUILD_CORE */
+ #endif /* Py_ATOMIC_H */
+-#endif /* Py_LIMITED_API */
+diff --git a/Include/pystate.h b/Include/pystate.h
+--- a/Include/pystate.h
++++ b/Include/pystate.h
+@@ -177,20 +177,13 @@ PyAPI_FUNC(int) PyThreadState_SetAsyncEx
+ /* Variable and macro for in-line access to current thread state */
+
+ /* Assuming the current thread holds the GIL, this is the
+- PyThreadState for the current thread.
+-
+- Issue #23644: pyatomic.h is incompatible with C++ (yet). Disable
+- PyThreadState_GET() optimization: declare it as an alias to
+- PyThreadState_Get(), as done for limited API. */
+-#if !defined(Py_LIMITED_API) && !defined(__cplusplus)
++ PyThreadState for the current thread. */
++#ifdef Py_BUILD_CORE
+ PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current;
+-#endif
+-
+-#if defined(Py_DEBUG) || defined(Py_LIMITED_API) || defined(__cplusplus)
+-#define PyThreadState_GET() PyThreadState_Get()
++# define PyThreadState_GET() \
++ ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
+ #else
+-#define PyThreadState_GET() \
+- ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
++# define PyThreadState_GET() PyThreadState_Get()
+ #endif
+
+ typedef
diff --git a/python3.spec b/python3.spec
index b2281e2..bcc552e 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -744,6 +744,11 @@ Patch205: 00205-make-libpl-respect-lib64.patch
# by debian but fedora infra uses only eabi without hf
Patch206: 00206-remove-hf-from-arm-triplet.patch
+#
https://bugs.python.org/issue25150
+# Hide the private _Py_atomic_xxx symbols from the public
+# Python.h header to fix a compilation error with OpenMP.
+Patch207: 00207-hide-atomic-symbols.patch
+
# (New patches go here ^^^)
@@ -1037,6 +1042,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
# 00204: upstream as of 3.5.0b3
%patch205 -p1
%patch206 -p1
+%patch207 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1746,7 +1752,7 @@ rm -fr %{buildroot}
%dir %{_includedir}/python%{LDVERSION_optimized}/
%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-#%{_libdir}/%{py_INSTSONAME_optimized}
+%{_libdir}/%{py_INSTSONAME_optimized}
%{_libdir}/libpython3.so
%if 0%{?with_systemtap}
%dir %(dirname %{tapsetdir})
@@ -1888,7 +1894,7 @@ rm -fr %{buildroot}
# do for the regular build above (bug 531901), since they're all in one package
# now; they're listed below, under "-devel":
-#%{_libdir}/%{py_INSTSONAME_debug}
+%{_libdir}/%{py_INSTSONAME_debug}
%if 0%{?with_systemtap}
%dir %(dirname %{tapsetdir})
%dir %{tapsetdir}
@@ -1937,6 +1943,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Nov 11 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-3
+- Hide the private _Py_atomic_xxx symbols from public header
+
* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
- Rebuild with wheel set to 1
commit b0795dd21b84bdc2fa4ccf9d59684746537ae9fc
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Wed Oct 14 11:21:24 2015 +0200
Rebuild with wheel set to 1
diff --git a/python3.spec b/python3.spec
index b6a8f83..b2281e2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,7 +14,7 @@
# 4) python3-setuptools and python3-pip with with_rewheel set to 1
# 5) python3 with with_rewheel set to 1
-%global with_rewheel 0
+%global with_rewheel 1
%global pybasever 3.5
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -1937,6 +1937,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Oct 14 2015 Robert Kuska <rkuska(a)redhat.com> - 3.5.0-2
+- Rebuild with wheel set to 1
+
* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
- Update to 3.5.0
commit 2f6352e7fbba25a14791276c85c263aacbc5c2f3
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Wed Sep 23 15:06:03 2015 +0200
Add also patch from previous commit
diff --git a/00206-remove-hf-from-arm-triplet.patch
b/00206-remove-hf-from-arm-triplet.patch
new file mode 100644
index 0000000..c5f309c
--- /dev/null
+++ b/00206-remove-hf-from-arm-triplet.patch
@@ -0,0 +1,15 @@
+diff -up Python-3.5.0/configure.ac.eabi Python-3.5.0/configure.ac
+--- Python-3.5.0/configure.eabi 2015-09-23 13:52:20.756909744 +0200
++++ Python-3.5.0/configure 2015-09-23 13:52:46.859163629 +0200
+@@ -762,9 +762,9 @@ cat >> conftest.c <<EOF
+ alpha-linux-gnu
+ # elif defined(__ARM_EABI__) && defined(__ARM_PCS_VFP)
+ # if defined(__ARMEL__)
+- arm-linux-gnueabihf
++ arm-linux-gnueabi
+ # else
+- armeb-linux-gnueabihf
++ armeb-linux-gnueabi
+ # endif
+ # elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP)
+ # if defined(__ARMEL__)
commit 08f37368e9c6faa4dad9678ad4add43b5ef06f3c
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Wed Sep 23 15:03:18 2015 +0200
Remove hf from arm triplet
diff --git a/python3.spec b/python3.spec
index 4bb612c..b6a8f83 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,8 +39,8 @@
%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux-gnu
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux-gnu
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
# All bytecode files are now in a __pycache__ subdirectory, with a name
# reflecting the version of the bytecode (to permit sharing of python libraries
@@ -740,6 +740,10 @@ Patch203: 00203-disable-threading-test-koji.patch
# but the LIBPL variable defined there doesn't respect libdir macro
Patch205: 00205-make-libpl-respect-lib64.patch
+# Remove hf flag from arm triplet which is used
+# by debian but fedora infra uses only eabi without hf
+Patch206: 00206-remove-hf-from-arm-triplet.patch
+
# (New patches go here ^^^)
@@ -1032,6 +1036,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch203 -p1
# 00204: upstream as of 3.5.0b3
%patch205 -p1
+%patch206 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1275,8 +1280,8 @@ install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/
%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux-gnu
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux-gnu
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux%{_gnu}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux%{_gnu}
%if 0%{?with_debug_build}
%global PyIncludeDirs python%{LDVERSION_optimized} python%{LDVERSION_debug}
commit 05bd57fd4a0224418afaec9b80fbd10c2b5f4dd1
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Wed Sep 23 11:30:57 2015 +0200
Rename macros to 3.5
diff --git a/macros.pybytecompile3.4 b/macros.pybytecompile3.4
deleted file mode 100644
index a8b79b2..0000000
--- a/macros.pybytecompile3.4
+++ /dev/null
@@ -1,12 +0,0 @@
-# Note that the path could itself be a python file, or a directory
-
-# Python's compile_all module only works on directories, and requires a max
-# recursion depth
-
-%py_byte_compile()\
-python_binary="%1"\
-bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
-\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
-%{nil}
diff --git a/macros.pybytecompile3.5 b/macros.pybytecompile3.5
new file mode 100644
index 0000000..a8b79b2
--- /dev/null
+++ b/macros.pybytecompile3.5
@@ -0,0 +1,12 @@
+# Note that the path could itself be a python file, or a directory
+
+# Python's compile_all module only works on directories, and requires a max
+# recursion depth
+
+%py_byte_compile()\
+python_binary="%1"\
+bytecode_compilation_path="%2"\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+%{nil}
diff --git a/macros.python3.4 b/macros.python3.4
deleted file mode 100644
index a633c72..0000000
--- a/macros.python3.4
+++ /dev/null
@@ -1,16 +0,0 @@
-%__python3 /usr/bin/python3
-%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
-%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
-%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
-%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
-%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
-
-%py3_shbang_opts -s
-
-%py3_build() %{expand:\
-CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} build
--executable="%{__python3} %{py3_shbang_opts}" %{?1}\
-}
-
-%py3_install() %{expand:\
-CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} install -O1
--skip-build --root %{buildroot} %{?1}\
-}
diff --git a/macros.python3.5 b/macros.python3.5
new file mode 100644
index 0000000..a633c72
--- /dev/null
+++ b/macros.python3.5
@@ -0,0 +1,16 @@
+%__python3 /usr/bin/python3
+%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
+%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
+%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
+%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
+%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
+
+%py3_shbang_opts -s
+
+%py3_build() %{expand:\
+CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} build
--executable="%{__python3} %{py3_shbang_opts}" %{?1}\
+}
+
+%py3_install() %{expand:\
+CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} install -O1
--skip-build --root %{buildroot} %{?1}\
+}
commit 64cc450f086c8f5b7c1299dc214ee222957c0696
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Wed Sep 23 11:26:32 2015 +0200
Add python-3.5.0 source files
diff --git a/sources b/sources
index 9900d70..3e50267 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-7d092d1bba6e17f0d9bd21b49e441dd5 Python-3.4.3.tar.xz
+d149d2812f10cbe04c042232e7964171 Python-3.5.0.tar.xz
commit a52deaab9aa74a2896f2e75d7f55e8b4673488db
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Sep 21 15:55:00 2015 +0200
Make LIBPL variable respect libdir macro
diff --git a/00205-make-libpl-respect-lib64.patch b/00205-make-libpl-respect-lib64.patch
new file mode 100644
index 0000000..4a6703b
--- /dev/null
+++ b/00205-make-libpl-respect-lib64.patch
@@ -0,0 +1,12 @@
+diff -up Python-3.5.0/Makefile.pre.in.lib Python-3.5.0/Makefile.pre.in
+--- Python-3.5.0/Makefile.pre.in.lib 2015-09-21 15:39:47.928286620 +0200
++++ Python-3.5.0/Makefile.pre.in 2015-09-21 15:42:58.004042762 +0200
+@@ -1340,7 +1340,7 @@ inclinstall:
+
+ # Install the library and miscellaneous stuff needed for extending/embedding
+ # This goes into $(exec_prefix)
+-LIBPL= @LIBPL@
++LIBPL= $(LIBDEST)/config-$(LDVERSION)
+
+ # pkgconfig directory
+ LIBPC= $(LIBDIR)/pkgconfig
diff --git a/python3.spec b/python3.spec
index a384d1d..4bb612c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -736,6 +736,10 @@ Patch203: 00203-disable-threading-test-koji.patch
# FIXED UPSTREAM
# Patch204: 00204-increase-dh-keys-size.patch
+# LIBPL variable in makefile takes LIBPL from configure.ac
+# but the LIBPL variable defined there doesn't respect libdir macro
+Patch205: 00205-make-libpl-respect-lib64.patch
+
# (New patches go here ^^^)
@@ -1027,6 +1031,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
# 00202: upstream as of 3.5.0b3
%patch203 -p1
# 00204: upstream as of 3.5.0b3
+%patch205 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit 7035fe28761540699a1c363f3fe10af1423468f9
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Mon Sep 21 15:37:07 2015 +0200
Remove forgotten $(LIBRARY) from Patch111
(and also enable it)
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index d55ac0a..006bb90 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -6,7 +6,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
# Build the interpreter
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-+$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
diff --git a/python3.spec b/python3.spec
index 13e17a8..a384d1d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -736,7 +736,6 @@ Patch203: 00203-disable-threading-test-koji.patch
# FIXED UPSTREAM
# Patch204: 00204-increase-dh-keys-size.patch
-Patch205: config-to-lib64.patch
# (New patches go here ^^^)
@@ -939,7 +938,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%endif
-#%patch111 -p1
+%patch111 -p1
# 112: not for python3
%patch113 -p1
# 00114: Upstream as of Python 3.4.0.b2
@@ -1028,7 +1027,6 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
# 00202: upstream as of 3.5.0b3
%patch203 -p1
# 00204: upstream as of 3.5.0b3
-%patch205 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit abb2ff8b0538a27f07bc0edebdee9c20502d4e31
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Wed Sep 16 08:36:17 2015 +0200
First step towards 3.5.0
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 3200c15..5d92895 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -650,7 +650,7 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
+Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h \
+ $(srcdir)/Python/ceval_systemtap.h @SYSTEMTAPDEPS@
- Python/frozen.o: Python/importlib.h
+ Python/frozen.o: Python/importlib.h Python/importlib_external.h
@@ -724,6 +726,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py
@@ -669,26 +669,11 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
@@ -1345,6 +1354,7 @@ clean: pycremoval
-rm -f pybuilddir.txt
-rm -f Lib/lib2to3/*Grammar*.pickle
- -rm -f Modules/_testembed Modules/_freeze_importlib
+ -rm -f Programs/_testembed Programs/_freeze_importlib
+ -rm -f $(srcdir)/Python/pysystemtap.h
profile-removal:
find . -name '*.gc??' -exec rm -f {} ';'
-diff -up Python-3.3.0rc2/Misc/NEWS.systemtap Python-3.3.0rc2/Misc/NEWS
---- Python-3.3.0rc2/Misc/NEWS.systemtap 2012-09-09 05:11:05.000000000 -0400
-+++ Python-3.3.0rc2/Misc/NEWS 2012-09-10 09:17:21.120511781 -0400
-@@ -619,6 +619,11 @@ Core and Builtins
-
- - Issue #15038: Optimize python Locks on Windows.
-
-+- Issue #14776: Added a new --with-systemtap configure-time option, which adds
-+ static markers for SystemTap so that SystemTap scripts can observe bytecode
-+ frames being entered and exited and so generate reports on what Python code
-+ is being exectuted.
-+
- Library
- -------
-
diff -up Python-3.3.0rc2/pyconfig.h.in.systemtap Python-3.3.0rc2/pyconfig.h.in
--- Python-3.3.0rc2/pyconfig.h.in.systemtap 2012-09-09 05:11:14.000000000 -0400
+++ Python-3.3.0rc2/pyconfig.h.in 2012-09-10 09:17:21.120511781 -0400
diff --git a/00102-lib64.patch b/00102-lib64.patch
index db5fd95..be67b9b 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -35,7 +35,7 @@
else:
--- Python-3.4.0b1/Lib/site.py.lib64 2013-11-24 21:36:54.000000000 +0100
+++ Python-3.4.0b1/Lib/site.py 2013-11-27 11:10:43.822150773 +0100
-@@ -304,12 +304,16 @@
+@@ -304,11 +304,15 @@
seen.add(prefix)
if os.sep == '/':
@@ -45,7 +45,6 @@
sitepackages.append(os.path.join(prefix, "lib",
"python" + sys.version[:3],
"site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
else:
sitepackages.append(prefix)
+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
@@ -84,25 +83,17 @@
'data': '{userbase}',
--- Python-3.4.0b1/Lib/test/test_site.py.lib64 2013-11-24 21:36:55.000000000 +0100
+++ Python-3.4.0b1/Lib/test/test_site.py 2013-11-27 11:10:43.822150773 +0100
-@@ -244,12 +244,15 @@
- self.assertEqual(dirs[2], wanted)
+@@ -244,8 +244,8 @@
+ self.assertEqual(dirs[1], wanted)
elif os.sep == '/':
# OS X non-framwework builds, Linux, FreeBSD, etc
-- self.assertEqual(len(dirs), 2)
+- self.assertEqual(len(dirs), 1)
- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ self.assertEqual(len(dirs), 3)
++ self.assertEqual(len(dirs), 2)
+ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
'site-packages')
self.assertEqual(dirs[0], wanted)
-- wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ 'site-packages')
- self.assertEqual(dirs[1], wanted)
-+ wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ self.assertEqual(dirs[2], wanted)
else:
- # other platforms
- self.assertEqual(len(dirs), 2)
--- Python-3.4.0b1/Makefile.pre.in.lib64 2013-11-27 11:10:43.814150786 +0100
+++ Python-3.4.0b1/Makefile.pre.in 2013-11-27 11:10:43.823150771 +0100
@@ -115,7 +115,7 @@
@@ -128,11 +119,11 @@
#ifndef LANDMARK
@@ -498,7 +498,7 @@
- _pythonpath = _Py_char2wchar(PYTHONPATH, NULL);
- _prefix = _Py_char2wchar(PREFIX, NULL);
- _exec_prefix = _Py_char2wchar(EXEC_PREFIX, NULL);
-- lib_python = _Py_char2wchar("lib/python" VERSION, NULL);
-+ lib_python = _Py_char2wchar("lib64/python" VERSION, NULL);
+ _pythonpath = Py_DecodeLocale(PYTHONPATH, NULL);
+ _prefix = Py_DecodeLocale(PREFIX, NULL);
+ _exec_prefix = Py_DecodeLocale(EXEC_PREFIX, NULL);
+- lib_python = Py_DecodeLocale("lib/python" VERSION, NULL);
++ lib_python = Py_DecodeLocale("lib64/python" VERSION, NULL);
if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
Py_FatalError(
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index bd1bc40..d55ac0a 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,13 +1,13 @@
diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec/Makefile.pre.in
--- cpython-59223da36dec/Makefile.pre.in.no-static-lib 2012-08-07 16:43:43.296466422
-0400
+++ cpython-59223da36dec/Makefile.pre.in 2012-08-07 16:44:13.299464371 -0400
-@@ -464,7 +464,7 @@ coverage:
+@@ -550,7 +550,7 @@ clinic: $(BUILDPYTHON)
$(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make
# Build the interpreter
--$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
+-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) pybuilddir.txt
@@ -480,18 +480,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
@@ -29,16 +29,16 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -581,7 +569,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
+@@ -674,7 +674,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
echo "-----------------------------------------------"; \
fi
--Modules/_testembed: Modules/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-+Modules/_testembed: Modules/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+-Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++Programs/_testembed: Programs/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1155,18 +1143,6 @@ libainstall: all python-config
+@@ -1354,18 +1354,6 @@ libainstall: all python-config
else true; \
fi; \
done
@@ -55,5 +55,5 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
- fi; \
- fi
$(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
- $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ $(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o
$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/00125-less-verbose-COUNT_ALLOCS.patch
b/00125-less-verbose-COUNT_ALLOCS.patch
index 8e441a2..fea9a4e 100644
--- a/00125-less-verbose-COUNT_ALLOCS.patch
+++ b/00125-less-verbose-COUNT_ALLOCS.patch
@@ -1,20 +1,21 @@
-diff -up Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS
Python-2.7/Python/pythonrun.c
---- Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS 2010-08-17 14:49:33.321913909
-0400
-+++ Python-2.7/Python/pythonrun.c 2010-08-17 14:54:48.750910403 -0400
-@@ -470,7 +470,15 @@ Py_Finalize(void)
+diff -up Python-3.5.0b3/Python/pylifecycle.c.ms Python-3.5.0b3/Python/pylifecycle.c
+--- Python-3.5.0b3/Python/pylifecycle.c.ms 2015-07-08 10:12:40.470623896 +0200
++++ Python-3.5.0b3/Python/pylifecycle.c 2015-07-08 10:13:50.141169162 +0200
+@@ -612,7 +612,16 @@ Py_Finalize(void)
/* Debugging stuff */
#ifdef COUNT_ALLOCS
- dump_counts(stdout);
+ /* This is a downstream Fedora modification.
-+ The upstream default with COUNT_ALLOCS is to always dump the counts to
-+ stdout on exit. For our debug builds its useful to have the info from
-+ COUNT_ALLOCS available, but the stdout info here gets in the way, so
-+ we make it optional, wrapping it in an environment variable (modelled
-+ on the other PYTHONDUMP* env variables):
++ The upstream default with COUNT_ALLOCS is to always dump the counts to
++ stdout on exit. For our debug builds its useful to have the info from
++ COUNT_ALLOCS available, but the stdout info here gets in the way, so
++ we make it optional, wrapping it in an environment variable (modelled
++ on the other PYTHONDUMP* env variables):
+ */
+ if (Py_GETENV("PYTHONDUMPCOUNTS"))
+ dump_counts(stdout);
++
#endif
/* dump hash stats */
_PyHash_Fini();
diff --git a/00132-add-rpmbuild-hooks-to-unittest.patch
b/00132-add-rpmbuild-hooks-to-unittest.patch
index 20930ac..041abce 100644
--- a/00132-add-rpmbuild-hooks-to-unittest.patch
+++ b/00132-add-rpmbuild-hooks-to-unittest.patch
@@ -9,10 +9,9 @@ diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest
Python
import logging
import pprint
import re
-@@ -101,6 +102,43 @@ def expectedFailure(func):
+@@ -101,5 +102,42 @@ def expectedFailure(func):
raise self.test_case.failureException(msg)
-
+# Non-standard/downstream-only hooks for handling issues with specific test
+# cases:
+
@@ -52,7 +51,7 @@ diff -up
Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
+
class _AssertRaisesBaseContext(_BaseTestCaseContext):
- def __init__(self, expected, test_case, callable_obj=None,
+ def __init__(self, expected, test_case, expected_regex=None):
diff -up Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest
Python-3.2.2/Lib/unittest/__init__.py
--- Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest 2011-09-03
12:16:44.000000000 -0400
+++ Python-3.2.2/Lib/unittest/__init__.py 2011-09-09 06:35:16.366568382 -0400
diff --git a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
index afd8685..5fa9bd4 100644
--- a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+++ b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
@@ -9,9 +9,9 @@ diff -up
Python-3.3.0b2/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sy
+ if hasattr(sys, 'getcounts'):
+ s += struct.calcsize('3P2P')
check(int, s)
- # (PyTypeObject + PyNumberMethods + PyMappingMethods +
+ # (PyTypeObject + PyAsyncMethods + PyNumberMethods + PyMappingMethods +
# PySequenceMethods + PyBufferProcs + 4P)
- s = vsize('P2n15Pl4Pn9Pn11PIP') + struct.calcsize('34P 3P 10P 2P
4P')
+ s = vsize('P2n17Pl4Pn9Pn11PIP') + struct.calcsize('34P 3P 3P 10P 2P
4P')
# Separate block for PyDictKeysObject with 4 entries
s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P")
+ if hasattr(sys, 'getcounts'):
diff --git a/00141-fix-tests_with_COUNT_ALLOCS.patch
b/00141-fix-tests_with_COUNT_ALLOCS.patch
index 7193a8d..96a2fbf 100644
--- a/00141-fix-tests_with_COUNT_ALLOCS.patch
+++ b/00141-fix-tests_with_COUNT_ALLOCS.patch
@@ -100,8 +100,8 @@ diff -r e245b0d7209b Lib/test/test_module.py
# Issue #20037
code = """if 1:
---- a/Lib/test/test_warnings.py.orig 2014-01-09 15:10:12.454997100 +0100
-+++ b/Lib/test/test_warnings.py 2014-01-09 15:11:14.028913478 +0100
+--- a/Lib/test/test_warnings/__init__.py.orig 2014-01-09 15:10:12.454997100 +0100
++++ b/Lib/test/test_warnings/__init__.py 2014-01-09 15:11:14.028913478 +0100
@@ -780,6 +780,8 @@
assert_python_ok('-c', 'pass', '-W',
'always', PYTHONPATH=cwd)
diff --git a/00199-alter-tests-to-reflect-sslv3-disabled.patch
b/00199-alter-tests-to-reflect-sslv3-disabled.patch
index c7fb9ff..68df8d5 100644
--- a/00199-alter-tests-to-reflect-sslv3-disabled.patch
+++ b/00199-alter-tests-to-reflect-sslv3-disabled.patch
@@ -17,7 +17,7 @@ diff -up Python-3.4.2/Lib/test/test_ssl.py.ssl
Python-3.4.2/Lib/test/test_ssl.py
try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False)
if no_sslv2_implies_sslv3_hello():
# No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs
-- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, True,
+- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23,
'SSLv3',
+ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False,
client_options=ssl.OP_NO_SSLv2)
@@ -29,20 +29,20 @@ diff -up Python-3.4.3/Lib/test/test_ssl.py.foo
Python-3.4.3/Lib/test/test_ssl.py
" SSL2 client to SSL23 server test unexpectedly
failed:\n %s\n"
% str(x))
if hasattr(ssl, 'PROTOCOL_SSLv3'):
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True)
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3,
'SSLv3')
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1,
'TLSv1')
if hasattr(ssl, 'PROTOCOL_SSLv3'):
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_OPTIONAL)
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3,
'SSLv3', ssl.CERT_OPTIONAL)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_OPTIONAL)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_OPTIONAL)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True,
ssl.CERT_OPTIONAL)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, 'TLSv1',
ssl.CERT_OPTIONAL)
if hasattr(ssl, 'PROTOCOL_SSLv3'):
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_REQUIRED)
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3,
'SSLv3', ssl.CERT_REQUIRED)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_REQUIRED)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_REQUIRED)
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True,
ssl.CERT_REQUIRED)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, 'TLSv1',
ssl.CERT_REQUIRED)
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
index 5fd11cc..aab0cc1 100644
--- a/check-pyc-and-pyo-timestamps.py
+++ b/check-pyc-and-pyo-timestamps.py
@@ -17,6 +17,15 @@ not_compiled = [
'test/badsyntax_future8.py',
'test/badsyntax_future9.py',
'test/badsyntax_future10.py',
+ 'test/badsyntax_async1.py',
+ 'test/badsyntax_async2.py',
+ 'test/badsyntax_async3.py',
+ 'test/badsyntax_async4.py',
+ 'test/badsyntax_async5.py',
+ 'test/badsyntax_async6.py',
+ 'test/badsyntax_async7.py',
+ 'test/badsyntax_async8.py',
+ 'test/badsyntax_async9.py',
'test/badsyntax_pep3120.py',
'lib2to3/tests/data/bom.py',
'lib2to3/tests/data/crlf.py',
diff --git a/python3.spec b/python3.spec
index 6270e66..13e17a8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,12 +14,12 @@
# 4) python3-setuptools and python3-pip with with_rewheel set to 1
# 5) python3 with with_rewheel set to 1
-%global with_rewheel 1
+%global with_rewheel 0
-%global pybasever 3.4
+%global pybasever 3.5
# pybasever without the dot:
-%global pyshortver 34
+%global pyshortver 35
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -39,8 +39,8 @@
%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux-gnu
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux-gnu
# All bytecode files are now in a __pycache__ subdirectory, with a name
# reflecting the version of the bytecode (to permit sharing of python libraries
@@ -49,9 +49,9 @@
# For example,
# foo/bar.py
# now has bytecode at:
-# foo/__pycache__/bar.cpython-34.pyc
-# foo/__pycache__/bar.cpython-34.pyo
-%global bytecode_suffixes .cpython-34.py?
+# foo/__pycache__/bar.cpython-35.pyc
+# foo/__pycache__/bar.cpython-35.pyo
+%global bytecode_suffixes .cpython-35*.py?
# Python's configure script defines SOVERSION, and this is used in the Makefile
# to determine INSTSONAME, the name of the libpython DSO:
@@ -83,7 +83,7 @@
%global with_computed_gotos yes
# Turn this to 0 to turn off the "check" phase:
-%global run_selftest_suite 1
+%global run_selftest_suite 0
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
@@ -139,8 +139,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.3
-Release: 5%{?dist}
+Version: %{pybasever}.0
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -726,13 +726,17 @@ Patch201: 00201-fix-memory-leak-in-gdbm.patch
# 00202 #
# Fixes undefined behaviour in faulthandler which caused test to hang on x86_64
#
http://bugs.python.org/issue23433
-Patch202: 00202-fix-undefined-behaviour-in-faulthandler.patch
+# FIXED UPSTREAM
+#Patch202: 00202-fix-undefined-behaviour-in-faulthandler.patch
# test_threading fails in koji dues to it's handling of signals
Patch203: 00203-disable-threading-test-koji.patch
# openssl requires DH keys to be > 768bits
-Patch204: 00204-increase-dh-keys-size.patch
+# FIXED UPSTREAM
+# Patch204: 00204-increase-dh-keys-size.patch
+
+Patch205: config-to-lib64.patch
# (New patches go here ^^^)
@@ -935,7 +939,7 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%endif
-%patch111 -p1
+#%patch111 -p1
# 112: not for python3
%patch113 -p1
# 00114: Upstream as of Python 3.4.0.b2
@@ -1021,9 +1025,10 @@ sed -r -i s/'_PIP_VERSION =
"[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en
%patch196 -p1
# 00197: upstream as of Python 3.4.2
%patch199 -p1
-%patch202 -p1
+# 00202: upstream as of 3.5.0b3
%patch203 -p1
-%patch204 -p1
+# 00204: upstream as of 3.5.0b3
+%patch205 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1267,8 +1272,8 @@ install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/
%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
-%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}
-%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}-%{_arch}-linux-gnu
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}-%{_arch}-linux-gnu
%if 0%{?with_debug_build}
%global PyIncludeDirs python%{LDVERSION_optimized} python%{LDVERSION_debug}
@@ -1589,7 +1594,8 @@ rm -fr %{buildroot}
%{dynload_dir}/spwd.%{SOABI_optimized}.so
%{dynload_dir}/syslog.%{SOABI_optimized}.so
%{dynload_dir}/termios.%{SOABI_optimized}.so
-%{dynload_dir}/time.%{SOABI_optimized}.so
+#%{dynload_dir}/time.%{SOABI_optimized}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_optimized}.so
%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
%{dynload_dir}/zlib.%{SOABI_optimized}.so
@@ -1732,7 +1738,7 @@ rm -fr %{buildroot}
%dir %{_includedir}/python%{LDVERSION_optimized}/
%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
-%{_libdir}/%{py_INSTSONAME_optimized}
+#%{_libdir}/%{py_INSTSONAME_optimized}
%{_libdir}/libpython3.so
%if 0%{?with_systemtap}
%dir %(dirname %{tapsetdir})
@@ -1753,6 +1759,7 @@ rm -fr %{buildroot}
%{_bindir}/python%{LDVERSION_optimized}-config
%{_bindir}/python%{LDVERSION_optimized}-*-config
%{_libdir}/libpython%{LDVERSION_optimized}.so
+%{_libdir}/libpython%{LDVERSION_optimized}.so.1.0
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
@@ -1864,7 +1871,8 @@ rm -fr %{buildroot}
%{dynload_dir}/spwd.%{SOABI_debug}.so
%{dynload_dir}/syslog.%{SOABI_debug}.so
%{dynload_dir}/termios.%{SOABI_debug}.so
-%{dynload_dir}/time.%{SOABI_debug}.so
+#%{dynload_dir}/time.%{SOABI_debug}.so
+%{dynload_dir}/_testmultiphase.%{SOABI_debug}.so
%{dynload_dir}/unicodedata.%{SOABI_debug}.so
%{dynload_dir}/zlib.%{SOABI_debug}.so
@@ -1872,7 +1880,7 @@ rm -fr %{buildroot}
# do for the regular build above (bug 531901), since they're all in one package
# now; they're listed below, under "-devel":
-%{_libdir}/%{py_INSTSONAME_debug}
+#%{_libdir}/%{py_INSTSONAME_debug}
%if 0%{?with_systemtap}
%dir %(dirname %{tapsetdir})
%dir %{tapsetdir}
@@ -1884,6 +1892,7 @@ rm -fr %{buildroot}
%{_includedir}/python%{LDVERSION_debug}
%{_bindir}/python%{LDVERSION_debug}-config
%{_libdir}/libpython%{LDVERSION_debug}.so
+%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
# Analog of the -tools subpackage's files:
@@ -1920,6 +1929,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Sep 15 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.5.0-1
+- Update to 3.5.0
+
* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
- python3-devel: Require python-macros for version independant macros such as
python_provide. See fpc#281 and fpc#534.
commit 8c7d263caba25ce45fd826cee539aade0d5f67db
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Wed Aug 12 14:21:34 2015 +0200
Bump pip version
diff --git a/python3.spec b/python3.spec
index efa0cda..6270e66 100644
--- a/python3.spec
+++ b/python3.spec
@@ -915,7 +915,7 @@ for f in md5module.c sha1module.c sha256module.c sha512module.c; do
done
%if 0%{with_rewheel}
-%global pip_version 7.0.3
+%global pip_version 7.1.0
sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
%endif
commit 8d338b77849f269e5605dc22a12e93c799a136f9
Author: Thomas Spura <thomas.spura(a)gmail.com>
Date: Mon Jun 29 13:34:22 2015 +0200
python3-devel: Require python-macros
This picks up version independant macros such as python_provide.
See fpc#281 and fpc#534 for more details.
diff --git a/macros.python3.4 b/macros.python3.4
index 395af00..a633c72 100644
--- a/macros.python3.4
+++ b/macros.python3.4
@@ -4,3 +4,13 @@
%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
+
+%py3_shbang_opts -s
+
+%py3_build() %{expand:\
+CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} build
--executable="%{__python3} %{py3_shbang_opts}" %{?1}\
+}
+
+%py3_install() %{expand:\
+CFLAGS="%{optflags}" %{__python3} %{py_setup} %{?py_setup_args} install -O1
--skip-build --root %{buildroot} %{?1}\
+}
diff --git a/python3.spec b/python3.spec
index 6f243c3..efa0cda 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -803,10 +803,12 @@ Summary: Libraries and header files needed for Python 3 development
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+BuildRequires: python-macros
+Requires: python-macros
Conflicts: %{name} < %{version}-%{release}
%description devel
-This package contains libraries and header files used to build applications
+This package contains libraries and header files used to build applications
with and native libraries for Python 3
%package tools
@@ -1918,6 +1920,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jun 29 2015 Thomas Spura <tomspur(a)fedoraproject.org> - 3.4.3-4
+- python3-devel: Require python-macros for version independant macros such as
+ python_provide. See fpc#281 and fpc#534.
+
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
commit 8f7e21547a06389b6bf34bdc897e1423a80f2c4c
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Fri Jun 19 11:58:26 2015 +0200
Increase testsuite's DH key size
diff --git a/00204-increase-dh-keys-size.patch b/00204-increase-dh-keys-size.patch
new file mode 100644
index 0000000..e75d992
--- /dev/null
+++ b/00204-increase-dh-keys-size.patch
@@ -0,0 +1,49 @@
+
+# HG changeset patch
+# User Benjamin Peterson <benjamin(a)python.org>
+# Date 1427947446 14400
+# Node ID 1ad7c0253abe1252128d61c3d0127d22144cb354
+# Parent 47451f6e7e7528a6647dbdc435e9a9f5c13c0080
+replace 512 bit dh key with a 2014 bit one (closes #23844)
+
+Patch by Cdric Krier.
+
+diff --git a/Lib/test/dh1024.pem b/Lib/test/dh1024.pem
+new file mode 100644
+--- /dev/null
++++ b/Lib/test/dh1024.pem
+@@ -0,0 +1,7 @@
++-----BEGIN DH PARAMETERS-----
++MIGHAoGBAIbzw1s9CT8SV5yv6L7esdAdZYZjPi3qWFs61CYTFFQnf2s/d09NYaJt
++rrvJhIzWavqnue71qXCf83/J3nz3FEwUU/L0mGyheVbsSHiI64wUo3u50wK5Igo0
++RNs/LD0irs7m0icZ//hijafTU+JOBiuA8zMI+oZfU7BGuc9XrUprAgEC
++-----END DH PARAMETERS-----
++
++Generated with: openssl dhparam -out dh1024.pem 1024
+diff --git a/Lib/test/dh512.pem b/Lib/test/dh512.pem
+deleted file mode 100644
+--- a/Lib/test/dh512.pem
++++ /dev/null
+@@ -1,9 +0,0 @@
+------BEGIN DH PARAMETERS-----
+-MEYCQQD1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWak
+-XUGfnHy9iUsiGSa6q6Jew1XpKgVfAgEC
+------END DH PARAMETERS-----
+-
+-These are the 512 bit DH parameters from "Assigned Number for SKIP Protocols"
+-(http://www.skip-vpn.org/spec/numbers.html).
+-See there for how they were generated.
+-Note that g is not a generator, but this is not a problem since p is a safe prime.
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -64,7 +64,7 @@ BADKEY = data_file("badkey.pem")
+ NOKIACERT = data_file("nokia.pem")
+ NULLBYTECERT = data_file("nullbytecert.pem")
+
+-DHFILE = data_file("dh512.pem")
++DHFILE = data_file("dh1024.pem")
+ BYTES_DHFILE = os.fsencode(DHFILE)
+
+
+
diff --git a/python3.spec b/python3.spec
index fcd3d15..6f243c3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -731,6 +731,9 @@ Patch202: 00202-fix-undefined-behaviour-in-faulthandler.patch
# test_threading fails in koji dues to it's handling of signals
Patch203: 00203-disable-threading-test-koji.patch
+# openssl requires DH keys to be > 768bits
+Patch204: 00204-increase-dh-keys-size.patch
+
# (New patches go here ^^^)
#
@@ -909,6 +912,11 @@ for f in md5module.c sha1module.c sha256module.c sha512module.c; do
rm Modules/$f
done
+%if 0%{with_rewheel}
+%global pip_version 7.0.3
+sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION =
"%{pip_version}"'/ Lib/ensurepip/__init__.py
+%endif
+
#
# Apply patches:
#
@@ -1013,6 +1021,7 @@ done
%patch199 -p1
%patch202 -p1
%patch203 -p1
+%patch204 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1131,7 +1140,7 @@ BuildPython debug \
"--with-pydebug --with-count-allocs --with-call-profile --without-ensurepip"
\
%endif
false \
- -O1
+ -O0
%endif # with_debug_build
BuildPython optimized \
@@ -1206,7 +1215,7 @@ make install DESTDIR=%{buildroot} INSTALL="install -p"
EXTRA_CFLAGS="$MoreCFlags
%if 0%{?with_debug_build}
InstallPython debug \
%{py_INSTSONAME_debug} \
- -O1
+ -O0
%endif # with_debug_build
# Now the optimized build:
@@ -1912,6 +1921,11 @@ rm -fr %{buildroot}
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-4
+- Use 1024bit DH key in test_ssl
+- Use -O0 when compiling -debug build
+- Update pip version variable to the version we actually ship
+
* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
- Make relocating Python by changing _prefix actually work
Resolves: rhbz#1231801
commit 2699e3706a785759a6abda5d19c727f0b1ced3d9
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Fri Jun 19 11:56:26 2015 +0200
Make relocating Python by changing _prefix work
diff --git a/python3.spec b/python3.spec
index 7c6b68b..fcd3d15 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1236,7 +1236,7 @@ cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdir}/test/audiotest.au
%if "%{_lib}" == "lib64"
-install -d -m 0755 %{buildroot}/usr/lib/python%{pybasever}/site-packages/__pycache__
+install -d -m 0755
%{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages/__pycache__
%endif
# Make python3-devel multilib-ready (bug #192747, #139911)
@@ -1912,6 +1912,10 @@ rm -fr %{buildroot}
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+* Wed Jun 17 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-3
+- Make relocating Python by changing _prefix actually work
+Resolves: rhbz#1231801
+
* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
commit 6f1b657649526cba3a267f03bf973c1807719002
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Thu Jun 18 21:30:10 2015 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index 01bba67..7c6b68b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -1909,6 +1909,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Jun 18 2015 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.3-3
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
commit 3b7dcebf399c67228916767bb92e75dd2613baa8
Author: Peter Robinson <pbrobinson(a)gmail.com>
Date: Mon May 4 20:35:50 2015 +0100
Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
diff --git a/python3.spec b/python3.spec
index aff858c..01bba67 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -1472,7 +1472,7 @@ CheckPython() {
%ifarch ppc64le aarch64
-x test_faulthandler \
%endif
- %ifarch %{power64} s390 s390x armv7hl
+ %ifarch %{power64} s390 s390x armv7hl aarch64
-x test_gdb
%endif
@@ -1909,6 +1909,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon May 4 2015 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.3-2
+- Disable test_gdb on aarch64 (rhbz#1196181), it joins all other non x86 arches
+
* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
- Updated to 3.4.3
- BuildPython now accepts additional build options
commit e0a5a56c7c3994adc66b92d3913ce9235e482096
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Mon Apr 13 09:43:17 2015 +0200
Add new sources for 3.4.3
diff --git a/sources b/sources
index 849668a..9900d70 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-36fc7327c02c6f12fa24fc9ba78039e3 Python-3.4.2.tar.xz
+7d092d1bba6e17f0d9bd21b49e441dd5 Python-3.4.3.tar.xz
commit 318f360969a625371c3aa2239bf61bc2601f5e8a
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Wed Mar 25 14:35:47 2015 +0100
Update to 4.3.4
diff --git a/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
b/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
index 8a6bc46..0457093 100644
--- a/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
+++ b/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
@@ -7,6 +7,6 @@ diff -up
Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py.skip-distutils-tests
+(a)unittest._skipInRpmBuild("don't try to nest one rpm build inside another rpm
build")
class BuildRpmTestCase(support.TempdirManager,
+ support.EnvironGuard,
support.LoggingSilencer,
- unittest.TestCase):
diff -up
Python-3.2.2/Lib/distutils/tests/test_build_ext.py.skip-distutils-tests-that-fail-in-rpmbuild
Python-3.2.2/Lib/distutils/tests/test_build_ext.py
diff --git a/00199-alter-tests-to-reflect-sslv3-disabled.patch
b/00199-alter-tests-to-reflect-sslv3-disabled.patch
index f35eff9..c7fb9ff 100644
--- a/00199-alter-tests-to-reflect-sslv3-disabled.patch
+++ b/00199-alter-tests-to-reflect-sslv3-disabled.patch
@@ -13,37 +13,36 @@ diff -up Python-3.4.2/Lib/test/test_ssl.py.ssl
Python-3.4.2/Lib/test/test_ssl.py
self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
ctx.options)
if can_clear_options():
-@@ -2149,21 +2146,18 @@ else:
- sys.stdout.write(
+@@ -2186,7 +2180,7 @@ else:
+ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False)
+ if no_sslv2_implies_sslv3_hello():
+ # No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs
+- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, True,
++ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False,
+ client_options=ssl.OP_NO_SSLv2)
+
+ @skip_if_broken_ubuntu_ssl
+diff -up Python-3.4.3/Lib/test/test_ssl.py.foo Python-3.4.3/Lib/test/test_ssl.py
+--- Python-3.4.3/Lib/test/test_ssl.py.foo 2015-03-12 10:08:58.268065970 +0100
++++ Python-3.4.3/Lib/test/test_ssl.py 2015-03-12 10:10:09.733347118 +0100
+@@ -2168,17 +2168,17 @@ else:
" SSL2 client to SSL23 server test unexpectedly
failed:\n %s\n"
% str(x))
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True)
-+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False)
+ if hasattr(ssl, 'PROTOCOL_SSLv3'):
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True)
++ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True)
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_OPTIONAL)
-+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_OPTIONAL)
+ if hasattr(ssl, 'PROTOCOL_SSLv3'):
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_OPTIONAL)
++ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_OPTIONAL)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_OPTIONAL)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True,
ssl.CERT_OPTIONAL)
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_REQUIRED)
-+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_REQUIRED)
+ if hasattr(ssl, 'PROTOCOL_SSLv3'):
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_REQUIRED)
++ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_REQUIRED)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_REQUIRED)
try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True,
ssl.CERT_REQUIRED)
-- # Server with specific SSL options
-- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
-- server_options=ssl.OP_NO_SSLv3)
- # Will choose TLSv1
- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
- server_options=ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3)
-@@ -2186,7 +2180,7 @@ else:
- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False)
- if no_sslv2_implies_sslv3_hello():
- # No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs
-- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, True,
-+ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False,
- client_options=ssl.OP_NO_SSLv2)
-
- @skip_if_broken_ubuntu_ssl
diff --git a/00203-disable-threading-test-koji.patch
b/00203-disable-threading-test-koji.patch
new file mode 100644
index 0000000..70010fb
--- /dev/null
+++ b/00203-disable-threading-test-koji.patch
@@ -0,0 +1,11 @@
+diff -up Python-3.4.3/Lib/test/test_threading.py.mstuchli
Python-3.4.3/Lib/test/test_threading.py
+--- Python-3.4.3/Lib/test/test_threading.py.mstuchli 2015-03-10 10:00:42.917355215 +0100
++++ Python-3.4.3/Lib/test/test_threading.py 2015-03-10 10:00:47.735373842 +0100
+@@ -988,6 +988,7 @@ class ThreadingExceptionTests(BaseTestCa
+ self.assertIn("ZeroDivisionError", err)
+ self.assertNotIn("Unhandled exception", err)
+
++ @unittest.skip('Fails in Koji due to mishandled signals')
+ def test_print_exception_stderr_is_none_1(self):
+ script = r"""if True:
+ import sys
diff --git a/macros.pybytecompile b/macros.pybytecompile
deleted file mode 100644
index a8b79b2..0000000
--- a/macros.pybytecompile
+++ /dev/null
@@ -1,12 +0,0 @@
-# Note that the path could itself be a python file, or a directory
-
-# Python's compile_all module only works on directories, and requires a max
-# recursion depth
-
-%py_byte_compile()\
-python_binary="%1"\
-bytecode_compilation_path="%2"\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
-\
-find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
-%{nil}
diff --git a/macros.pybytecompile3.4 b/macros.pybytecompile3.4
new file mode 100644
index 0000000..a8b79b2
--- /dev/null
+++ b/macros.pybytecompile3.4
@@ -0,0 +1,12 @@
+# Note that the path could itself be a python file, or a directory
+
+# Python's compile_all module only works on directories, and requires a max
+# recursion depth
+
+%py_byte_compile()\
+python_binary="%1"\
+bytecode_compilation_path="%2"\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+%{nil}
diff --git a/macros.python3 b/macros.python3
deleted file mode 100644
index 395af00..0000000
--- a/macros.python3
+++ /dev/null
@@ -1,6 +0,0 @@
-%__python3 /usr/bin/python3
-%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
-%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
-%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
-%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
-%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
diff --git a/macros.python3.4 b/macros.python3.4
new file mode 100644
index 0000000..395af00
--- /dev/null
+++ b/macros.python3.4
@@ -0,0 +1,6 @@
+%__python3 /usr/bin/python3
+%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
+%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
+%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
+%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
+%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
diff --git a/python3.spec b/python3.spec
index 12167d8..aff858c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -139,8 +139,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.2
-Release: 7%{?dist}
+Version: %{pybasever}.3
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -218,12 +218,12 @@ Source1: find-provides-without-python-sonames.sh
# Supply various useful macros for building python 3 modules:
# __python3, python3_sitelib, python3_sitearch
-Source2: macros.python3
+Source2: macros.python%{pybasever}
# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
# to enable specfiles to selectively byte-compile individual files and paths
# with different Python runtimes as necessary:
-Source3: macros.pybytecompile
+Source3: macros.pybytecompile%{pybasever}
# Systemtap tapset to make it easier to use the systemtap static probes
# (actually a template; LIBRARY_PATH will get fixed up during install)
@@ -445,7 +445,8 @@ Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
# when running test_gdb.py; also cope with change to gdb in F17 onwards in
# which values are printed as "v@entry" rather than just "v":
# Not yet sent upstream
-Patch153: 00153-fix-test_gdb-noise.patch
+# Upstream as of 3.4.3
+# Patch153: 00153-fix-test_gdb-noise.patch
# 00154 #
# python3.spec on f15 has:
@@ -461,8 +462,8 @@ Patch155: 00155-avoid-ctypes-thunks.patch
# Recent builds of gdb will only auto-load scripts from certain safe
# locations. Turn off this protection when running test_gdb in the selftest
# suite to ensure that it can load our -gdb.py script (rhbz#817072):
-# Not yet sent upstream
-Patch156: 00156-gdb-autoload-safepath.patch
+# Upsream as of 3.4.3
+# Patch156: 00156-gdb-autoload-safepath.patch
# 00157 #
# Update uid/gid handling throughout the standard library: uid_t and gid_t are
@@ -722,8 +723,14 @@ Patch200: 00200-gettext-plural-fix.patch
# Note: Backported from scl
Patch201: 00201-fix-memory-leak-in-gdbm.patch
+# 00202 #
+# Fixes undefined behaviour in faulthandler which caused test to hang on x86_64
+#
http://bugs.python.org/issue23433
Patch202: 00202-fix-undefined-behaviour-in-faulthandler.patch
+# test_threading fails in koji dues to it's handling of signals
+Patch203: 00203-disable-threading-test-koji.patch
+
# (New patches go here ^^^)
#
@@ -954,10 +961,10 @@ done
%endif
# 00151: not for python3
# 00152: upstream as of Python 3.3.0b2
-%patch153 -p0
+# 00153: upstream as of Python 3.4.3
# 00154: not for this branch
%patch155 -p1
-%patch156 -p1
+# 00156: upstream as of 3.4.3
%patch157 -p1
#00158: FIXME
#00159: FIXME
@@ -1005,6 +1012,7 @@ done
# 00197: upstream as of Python 3.4.2
%patch199 -p1
%patch202 -p1
+%patch203 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1067,6 +1075,7 @@ BuildPython() {
SymlinkName=$3
ExtraConfigArgs=$4
PathFixWithThisBinary=$5
+ MoreCFlags=$6
ConfDir=build/$ConfName
@@ -1104,8 +1113,7 @@ BuildPython() {
# missing symbol AnnotateRWLockDestroy
#
# Invoke the build:
- # TODO: it seems that 3.4.0a4 fails with %{?_smp_flags}, have to figure out why
- make EXTRA_CFLAGS="$CFLAGS"
+ make EXTRA_CFLAGS="$CFLAGS $MoreCFlags" %{?_smp_mflags}
popd
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfDir
@@ -1122,7 +1130,8 @@ BuildPython debug \
%else
"--with-pydebug --with-count-allocs --with-call-profile --without-ensurepip"
\
%endif
- false
+ false \
+ -O1
%endif # with_debug_build
BuildPython optimized \
@@ -1144,6 +1153,7 @@ InstallPython() {
ConfName=$1
PyInstSoName=$2
+ MoreCFlags=$3
ConfDir=build/$ConfName
@@ -1152,7 +1162,7 @@ InstallPython() {
pushd $ConfDir
-make install DESTDIR=%{buildroot} INSTALL="install -p"
+make install DESTDIR=%{buildroot} INSTALL="install -p"
EXTRA_CFLAGS="$MoreCFlags"
popd
@@ -1195,7 +1205,8 @@ make install DESTDIR=%{buildroot} INSTALL="install -p"
# Install the "debug" build first, so that we can move some files aside
%if 0%{?with_debug_build}
InstallPython debug \
- %{py_INSTSONAME_debug}
+ %{py_INSTSONAME_debug} \
+ -O1
%endif # with_debug_build
# Now the optimized build:
@@ -1457,10 +1468,11 @@ CheckPython() {
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
--verbose --findleaks \
+ -x test_distutils \
%ifarch ppc64le aarch64
-x test_faulthandler \
%endif
- %ifarch %{power64} s390 s390x
+ %ifarch %{power64} s390 s390x armv7hl
-x test_gdb
%endif
@@ -1733,8 +1745,8 @@ rm -fr %{buildroot}
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
-%{_rpmconfigdir}/macros.d/macros.python3
-%{_rpmconfigdir}/macros.d/macros.pybytecompile
+%{_rpmconfigdir}/macros.d/macros.python%{pybasever}
+%{_rpmconfigdir}/macros.d/macros.pybytecompile%{pybasever}
%files tools
%defattr(-,root,root,755)
@@ -1897,6 +1909,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Mar 12 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.3-1
+- Updated to 3.4.3
+- BuildPython now accepts additional build options
+- Temporarily disabled test_gdb on arm (rhbz#1196181)
+
* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
(
http://bugs.python.org/issue23433)
diff --git a/temporarily-disable-tests-requiring-SIGHUP.patch
b/temporarily-disable-tests-requiring-SIGHUP.patch
index 2e88678..30ceb94 100644
--- a/temporarily-disable-tests-requiring-SIGHUP.patch
+++ b/temporarily-disable-tests-requiring-SIGHUP.patch
@@ -2,8 +2,8 @@ diff -up Python-3.4.0/Lib/test/test_asyncio/test_events.py.orig
Python-3.4.0/Lib
--- Python-3.4.0/Lib/test/test_asyncio/test_events.py.orig 2014-04-15 13:18:49.696215288
+0200
+++ Python-3.4.0/Lib/test/test_asyncio/test_events.py 2014-04-15 13:18:56.104258453
+0200
@@ -1528,7 +1528,7 @@ class SubprocessTestsMixin:
- self.loop.run_until_complete(proto.completed)
self.check_terminated(proto.returncode)
+ transp.close()
- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
+ @unittest.skipIf(True, "Temporarily skipped (rhbz#1088233)")
commit aca03e4c3a4fd6bfe760a0d3b9b8c277884b800c
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Wed Feb 25 13:26:34 2015 +0100
Fixed undefined behaviour in faulthandler
diff --git a/00202-fix-undefined-behaviour-in-faulthandler.patch
b/00202-fix-undefined-behaviour-in-faulthandler.patch
new file mode 100644
index 0000000..b333e15
--- /dev/null
+++ b/00202-fix-undefined-behaviour-in-faulthandler.patch
@@ -0,0 +1,41 @@
+
+# HG changeset patch
+# User Victor Stinner <victor.stinner(a)gmail.com>
+# Date 1423661015 -3600
+# Node ID 689092296ad31951f8f919fc06b49450e648e93d
+# Parent 645f3d750be139ce0198e15e221da07b22289a92
+Issue #23433: Fix faulthandler._stack_overflow()
+
+Fix undefined behaviour: don't compare pointers. Use Py_uintptr_t type instead
+of void*. It fixes test_faulthandler on Fedora 22 which now uses GCC 5.
+
+diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
+--- a/Modules/faulthandler.c
++++ b/Modules/faulthandler.c
+@@ -911,12 +911,12 @@ faulthandler_fatal_error_py(PyObject *se
+ }
+
+ #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
+-static void*
+-stack_overflow(void *min_sp, void *max_sp, size_t *depth)
++static Py_uintptr_t
++stack_overflow(Py_uintptr_t min_sp, Py_uintptr_t max_sp, size_t *depth)
+ {
+ /* allocate 4096 bytes on the stack at each call */
+ unsigned char buffer[4096];
+- void *sp = &buffer;
++ Py_uintptr_t sp = (Py_uintptr_t)&buffer;
+ *depth += 1;
+ if (sp < min_sp || max_sp < sp)
+ return sp;
+@@ -929,7 +929,8 @@ static PyObject *
+ faulthandler_stack_overflow(PyObject *self)
+ {
+ size_t depth, size;
+- char *sp = (char *)&depth, *stop;
++ Py_uintptr_t sp = (Py_uintptr_t)&depth;
++ Py_uintptr_t stop;
+
+ depth = 0;
+ stop = stack_overflow(sp - STACK_OVERFLOW_MAX_SIZE,
+
diff --git a/python3.spec b/python3.spec
index fef1746..12167d8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -722,6 +722,8 @@ Patch200: 00200-gettext-plural-fix.patch
# Note: Backported from scl
Patch201: 00201-fix-memory-leak-in-gdbm.patch
+Patch202: 00202-fix-undefined-behaviour-in-faulthandler.patch
+
# (New patches go here ^^^)
#
@@ -1002,6 +1004,7 @@ done
%patch196 -p1
# 00197: upstream as of Python 3.4.2
%patch199 -p1
+%patch202 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1894,6 +1897,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Feb 25 2015 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-7
+- Fixed undefined behaviour in faulthandler which caused test to hang on x86_64
+ (
http://bugs.python.org/issue23433)
+
* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
- Rebuilt for Fedora 23 Change
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
commit 9d940a7ac525550ce8509c900730fb12bcde5283
Author: Till Maas <opensource(a)till.name>
Date: Sat Feb 21 22:29:06 2015 +0100
Rebuilt for Fedora 23 Change
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
diff --git a/python3.spec b/python3.spec
index 8336069..fef1746 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -1894,6 +1894,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sat Feb 21 2015 Till Maas <opensource(a)till.name> - 3.4.2-6
+- Rebuilt for Fedora 23 Change
+
https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-...
+
* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
- Own systemtap dirs (#710733)
commit 11842a3a5a027ca9c646810e0d36376c952e84ad
Author: Ville Skytt <ville.skytta(a)iki.fi>
Date: Tue Feb 17 21:45:32 2015 +0200
Own systemtap dirs (#710733)
diff --git a/python3.spec b/python3.spec
index 8857301..8336069 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -1709,6 +1709,8 @@ rm -fr %{buildroot}
%{_libdir}/%{py_INSTSONAME_optimized}
%{_libdir}/libpython3.so
%if 0%{?with_systemtap}
+%dir %(dirname %{tapsetdir})
+%dir %{tapsetdir}
%{tapsetdir}/%{libpython_stp_optimized}
%doc systemtap-example.stp pyfuntop.stp
%endif
@@ -1846,6 +1848,8 @@ rm -fr %{buildroot}
%{_libdir}/%{py_INSTSONAME_debug}
%if 0%{?with_systemtap}
+%dir %(dirname %{tapsetdir})
+%dir %{tapsetdir}
%{tapsetdir}/%{libpython_stp_debug}
%endif
@@ -1890,6 +1894,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Feb 17 2015 Ville Skytt <ville.skytta(a)iki.fi> - 3.4.2-5
+- Own systemtap dirs (#710733)
+
* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
- build with valgrind on ppc64le
- disable test_gdb on s390(x) until rhbz#1181034 is resolved
commit 70025c7217a5b9a0d4502efb121b9d62ba602ce4
Author: Dan Hork <dan(a)danny.cz>
Date: Mon Jan 12 07:02:47 2015 -0500
- build with valgrind on ppc64le
- disable test_gdb on s390(x) until rhbz#1181034 is resolved
diff --git a/00164-disable-interrupted_write-tests-on-ppc.patch
b/00164-disable-interrupted_write-tests-on-ppc.patch
index 0db8092..5641b4b 100644
--- a/00164-disable-interrupted_write-tests-on-ppc.patch
+++ b/00164-disable-interrupted_write-tests-on-ppc.patch
@@ -1,7 +1,7 @@
-diff -up Python-3.3.0b1/Lib/test/test_exceptions.py.846849
Python-3.3.0b1/Lib/test/test_exceptions.py
---- Python-3.3.0b1/Lib/test/test_exceptions.py.846849 2012-06-26 22:19:47.000000000
+0200
-+++ Python-3.3.0b1/Lib/test/test_exceptions.py 2012-08-13 17:41:28.845403486 +0200
-@@ -401,6 +401,7 @@ class ExceptionTests(unittest.TestCase):
+diff -up Python-3.4.2/Lib/test/test_exceptions.py.ppc
Python-3.4.2/Lib/test/test_exceptions.py
+--- Python-3.4.2/Lib/test/test_exceptions.py.ppc 2014-10-08 04:18:13.000000000 -0400
++++ Python-3.4.2/Lib/test/test_exceptions.py 2015-01-12 05:56:15.922833055 -0500
+@@ -429,6 +429,7 @@ class ExceptionTests(unittest.TestCase):
self.assertIsNone(e.__context__)
self.assertIsNone(e.__cause__)
@@ -9,10 +9,10 @@ diff -up Python-3.3.0b1/Lib/test/test_exceptions.py.846849
Python-3.3.0b1/Lib/te
def testChainingDescriptors(self):
try:
raise Exception()
-diff -up Python-3.3.0b1/Lib/test/test_io.py.846849 Python-3.3.0b1/Lib/test/test_io.py
---- Python-3.3.0b1/Lib/test/test_io.py.846849 2012-06-26 22:19:48.000000000 +0200
-+++ Python-3.3.0b1/Lib/test/test_io.py 2012-08-13 17:41:28.846403451 +0200
-@@ -2938,12 +2938,15 @@ class SignalsTest(unittest.TestCase):
+diff -up Python-3.4.2/Lib/test/test_io.py.ppc Python-3.4.2/Lib/test/test_io.py
+--- Python-3.4.2/Lib/test/test_io.py.ppc 2015-01-12 05:56:15.922833055 -0500
++++ Python-3.4.2/Lib/test/test_io.py 2015-01-12 05:58:23.482833055 -0500
+@@ -3296,12 +3296,15 @@ class SignalsTest(unittest.TestCase):
if e.errno != errno.EBADF:
raise
@@ -25,12 +25,12 @@ diff -up Python-3.3.0b1/Lib/test/test_io.py.846849
Python-3.3.0b1/Lib/test/test_
self.check_interrupted_write(b"xy", b"xy",
mode="wb")
+ @unittest.skip('rhbz#846849')
+ # Issue #22331: The test hangs on FreeBSD 7.2
+ @support.requires_freebsd_version(8)
def test_interrupted_write_text(self):
- self.check_interrupted_write("xy", b"xy",
mode="w", encoding="ascii")
-
-diff -up Python-3.3.0b1/Lib/test/test_raise.py.846849
Python-3.3.0b1/Lib/test/test_raise.py
---- Python-3.3.0b1/Lib/test/test_raise.py.846849 2012-08-13 17:42:16.719714213 +0200
-+++ Python-3.3.0b1/Lib/test/test_raise.py 2012-08-13 17:43:02.544097272 +0200
+diff -up Python-3.4.2/Lib/test/test_raise.py.ppc Python-3.4.2/Lib/test/test_raise.py
+--- Python-3.4.2/Lib/test/test_raise.py.ppc 2014-10-08 04:18:14.000000000 -0400
++++ Python-3.4.2/Lib/test/test_raise.py 2015-01-12 05:56:15.922833055 -0500
@@ -151,6 +151,7 @@ class TestRaise(unittest.TestCase):
class TestCause(unittest.TestCase):
@@ -39,10 +39,10 @@ diff -up Python-3.3.0b1/Lib/test/test_raise.py.846849
Python-3.3.0b1/Lib/test/te
def testCauseSyntax(self):
try:
try:
-diff -up Python-3.3.0b1/Lib/test/test_traceback.py.846849
Python-3.3.0b1/Lib/test/test_traceback.py
---- Python-3.3.0b1/Lib/test/test_traceback.py.846849 2012-08-13 17:44:19.714374275 +0200
-+++ Python-3.3.0b1/Lib/test/test_traceback.py 2012-08-13 17:44:43.515534435 +0200
-@@ -246,6 +246,7 @@ class BaseExceptionReportingTests:
+diff -up Python-3.4.2/Lib/test/test_traceback.py.ppc
Python-3.4.2/Lib/test/test_traceback.py
+--- Python-3.4.2/Lib/test/test_traceback.py.ppc 2014-10-08 04:18:14.000000000 -0400
++++ Python-3.4.2/Lib/test/test_traceback.py 2015-01-12 05:56:15.922833055 -0500
+@@ -314,6 +314,7 @@ class BaseExceptionReportingTests:
self.check_zero_div(blocks[0])
self.assertIn('inner_raise() # Marker', blocks[2])
diff --git a/python3.spec b/python3.spec
index cbe48d0..8857301 100644
--- a/python3.spec
+++ b/python3.spec
@@ -71,7 +71,7 @@
%global with_systemtap 1
# some arches don't have valgrind so we need to disable its support on them
-%ifnarch s390 ppc64le
+%ifnarch s390
%global with_valgrind 1
%else
%global with_valgrind 0
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -1457,7 +1457,7 @@ CheckPython() {
%ifarch ppc64le aarch64
-x test_faulthandler \
%endif
- %ifarch %{power64}
+ %ifarch %{power64} s390 s390x
-x test_gdb
%endif
@@ -1890,6 +1890,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jan 12 2015 Dan Hork <dan[at]danny.cz> - 3.4.2-4
+- build with valgrind on ppc64le
+- disable test_gdb on s390(x) until rhbz#1181034 is resolved
+
* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
- New patches: 170 (gc asserts), 200 (gettext headers),
201 (gdbm memory leak)
commit 86a9a20d91dbbe13a03fe87a7dcf0e39f2e6136e
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Tue Dec 16 13:41:03 2014 +0100
Backport patches from other pythons versions
diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch
new file mode 100644
index 0000000..1144cc2
--- /dev/null
+++ b/00170-gc-assertions.patch
@@ -0,0 +1,325 @@
+Index: Include/object.h
+===================================================================
+--- Include/object.h (revision 87911)
++++ Include/object.h (working copy)
+@@ -914,6 +914,49 @@
+ _PyObject_DebugTypeStats(FILE *out);
+ #endif /* ifndef Py_LIMITED_API */
+
++/*
++ Define a pair of assertion macros.
++
++ These work like the regular C assert(), in that they will abort the
++ process with a message on stderr if the given condition fails to hold,
++ but compile away to nothing if NDEBUG is defined.
++
++ However, before aborting, Python will also try to call _PyObject_Dump() on
++ the given object. This may be of use when investigating bugs in which a
++ particular object is corrupt (e.g. buggy a tp_visit method in an extension
++ module breaking the garbage collector), to help locate the broken objects.
++
++ The WITH_MSG variant allows you to supply an additional message that Python
++ will attempt to print to stderr, after the object dump.
++*/
++#ifdef NDEBUG
++/* No debugging: compile away the assertions: */
++#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) ((void)0)
++#else
++/* With debugging: generate checks: */
++#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) \
++ ((expr) \
++ ? (void)(0) \
++ : _PyObject_AssertFailed((obj), \
++ (msg), \
++ (__STRING(expr)), \
++ (__FILE__), \
++ (__LINE__), \
++ (__PRETTY_FUNCTION__)))
++#endif
++
++#define PyObject_ASSERT(obj, expr) \
++ PyObject_ASSERT_WITH_MSG(obj, expr, NULL)
++
++/*
++ Declare and define the entrypoint even when NDEBUG is defined, to avoid
++ causing compiler/linker errors when building extensions without NDEBUG
++ against a Python built with NDEBUG defined
++*/
++PyAPI_FUNC(void) _PyObject_AssertFailed(PyObject *, const char *,
++ const char *, const char *, int,
++ const char *);
++
+ #ifdef __cplusplus
+ }
+ #endif
+Index: Objects/object.c
+===================================================================
+--- Objects/object.c (revision 87911)
++++ Objects/object.c (working copy)
+@@ -1899,6 +1899,35 @@
+ }
+ }
+
++PyAPI_FUNC(void)
++_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
++ const char *file, int line, const char *function)
++{
++ fprintf(stderr,
++ "%s:%d: %s: Assertion \"%s\" failed.\n",
++ file, line, function, expr);
++ if (msg) {
++ fprintf(stderr, "%s\n", msg);
++ }
++
++ fflush(stderr);
++
++ if (obj) {
++ /* This might succeed or fail, but we're about to abort, so at least
++ try to provide any extra info we can: */
++ _PyObject_Dump(obj);
++ }
++ else {
++ fprintf(stderr, "NULL object\n");
++ }
++
++ fflush(stdout);
++ fflush(stderr);
++
++ /* Terminate the process: */
++ abort();
++}
++
+ #ifndef Py_TRACE_REFS
+ /* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
+ Define this here, so we can undefine the macro. */
+Index: Lib/test/test_gc.py
+===================================================================
+--- Lib/test/test_gc.py (revision 87911)
++++ Lib/test/test_gc.py (working copy)
+@@ -1,6 +1,6 @@
+ import unittest
+ from test.support import (verbose, refcount_test, run_unittest,
+- strip_python_stderr, cpython_only)
++ strip_python_stderr, cpython_only, import_module)
+ from test.script_helper import assert_python_ok, make_script, temp_dir
+
+ import sys
+@@ -512,6 +512,48 @@
+ self.assertEqual(len(gc.garbage), 0)
+
+
++ def test_refcount_errors(self):
++ self.preclean()
++ # Verify the "handling" of objects with broken refcounts
++ import_module("ctypes") #skip if not supported
++
++ import subprocess
++ code = '''if 1:
++ a = []
++ b = [a]
++
++ # Simulate the refcount of "a" being too low (compared to the
++ # references held on it by live data), but keeping it above zero
++ # (to avoid deallocating it):
++ import ctypes
++ ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))
++
++ # The garbage collector should now have a fatal error when it reaches
++ # the broken object:
++ import gc
++ gc.collect()
++ '''
++ p = subprocess.Popen([sys.executable, "-c", code],
++ stdout=subprocess.PIPE,
++ stderr=subprocess.PIPE)
++ stdout, stderr = p.communicate()
++ p.stdout.close()
++ p.stderr.close()
++ # Verify that stderr has a useful error message:
++ self.assertRegex(stderr,
++ b'Modules/gcmodule.c:[0-9]+: visit_decref: Assertion
"\(\(gc\)->gc.gc_refs >> \(1\)\) != 0" failed.')
++ self.assertRegex(stderr,
++ b'refcount was too small')
++ self.assertRegex(stderr,
++ b'object : \[\]')
++ self.assertRegex(stderr,
++ b'type : list')
++ self.assertRegex(stderr,
++ b'refcount: 1')
++ self.assertRegex(stderr,
++ b'address : 0x[0-9a-f]+')
++
++
+ class GCTogglingTests(unittest.TestCase):
+ def setUp(self):
+ gc.enable()
+diff -up Modules/gcmodule.c.orig2 Modules/gcmodule.c
+--- Modules/gcmodule.c.orig2 2014-12-08 10:54:14.251742911 +0100
++++ Modules/gcmodule.c 2014-12-08 10:52:45.674771917 +0100
+@@ -341,7 +341,8 @@ update_refs(PyGC_Head *containers)
+ {
+ PyGC_Head *gc = containers->gc.gc_next;
+ for (; gc != containers; gc = gc->gc.gc_next) {
+- assert(_PyGCHead_REFS(gc) == GC_REACHABLE);
++ PyObject_ASSERT(FROM_GC(gc),
++ _PyGCHead_REFS(gc) == GC_REACHABLE);
+ _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
+ /* Python's cyclic gc should never see an incoming refcount
+ * of 0: if something decref'ed to 0, it should have been
+@@ -361,7 +362,8 @@ update_refs(PyGC_Head *containers)
+ * so serious that maybe this should be a release-build
+ * check instead of an assert?
+ */
+- assert(_PyGCHead_REFS(gc) != 0);
++ PyObject_ASSERT(FROM_GC(gc),
++ _PyGCHead_REFS(gc) != 0);
+ }
+ }
+
+@@ -376,7 +378,9 @@ visit_decref(PyObject *op, void *data)
+ * generation being collected, which can be recognized
+ * because only they have positive gc_refs.
+ */
+- assert(_PyGCHead_REFS(gc) != 0); /* else refcount was too small */
++ PyObject_ASSERT_WITH_MSG(FROM_GC(gc),
++ _PyGCHead_REFS(gc) != 0,
++ "refcount was too small"); /* else refcount was too
small */
+ if (_PyGCHead_REFS(gc) > 0)
+ _PyGCHead_DECREF(gc);
+ }
+@@ -436,9 +440,10 @@ visit_reachable(PyObject *op, PyGC_Head
+ * If gc_refs == GC_UNTRACKED, it must be ignored.
+ */
+ else {
+- assert(gc_refs > 0
+- || gc_refs == GC_REACHABLE
+- || gc_refs == GC_UNTRACKED);
++ PyObject_ASSERT(FROM_GC(gc),
++ gc_refs > 0
++ || gc_refs == GC_REACHABLE
++ || gc_refs == GC_UNTRACKED);
+ }
+ }
+ return 0;
+@@ -480,7 +485,7 @@ move_unreachable(PyGC_Head *young, PyGC_
+ */
+ PyObject *op = FROM_GC(gc);
+ traverseproc traverse = Py_TYPE(op)->tp_traverse;
+- assert(_PyGCHead_REFS(gc) > 0);
++ PyObject_ASSERT(op, _PyGCHead_REFS(gc) > 0);
+ _PyGCHead_SET_REFS(gc, GC_REACHABLE);
+ (void) traverse(op,
+ (visitproc)visit_reachable,
+@@ -543,7 +548,7 @@ move_legacy_finalizers(PyGC_Head *unreac
+ for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
+ PyObject *op = FROM_GC(gc);
+
+- assert(IS_TENTATIVELY_UNREACHABLE(op));
++ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
+ next = gc->gc.gc_next;
+
+ if (has_legacy_finalizer(op)) {
+@@ -619,7 +624,7 @@ handle_weakrefs(PyGC_Head *unreachable,
+ PyWeakReference **wrlist;
+
+ op = FROM_GC(gc);
+- assert(IS_TENTATIVELY_UNREACHABLE(op));
++ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
+ next = gc->gc.gc_next;
+
+ if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
+@@ -640,9 +645,9 @@ handle_weakrefs(PyGC_Head *unreachable,
+ * the callback pointer intact. Obscure: it also
+ * changes *wrlist.
+ */
+- assert(wr->wr_object == op);
++ PyObject_ASSERT(wr->wr_object, wr->wr_object == op);
+ _PyWeakref_ClearRef(wr);
+- assert(wr->wr_object == Py_None);
++ PyObject_ASSERT(wr->wr_object, wr->wr_object == Py_None);
+ if (wr->wr_callback == NULL)
+ continue; /* no callback */
+
+@@ -676,7 +681,7 @@ handle_weakrefs(PyGC_Head *unreachable,
+ */
+ if (IS_TENTATIVELY_UNREACHABLE(wr))
+ continue;
+- assert(IS_REACHABLE(wr));
++ PyObject_ASSERT(op, IS_REACHABLE(wr));
+
+ /* Create a new reference so that wr can't go away
+ * before we can process it again.
+@@ -685,7 +690,8 @@ handle_weakrefs(PyGC_Head *unreachable,
+
+ /* Move wr to wrcb_to_call, for the next pass. */
+ wrasgc = AS_GC(wr);
+- assert(wrasgc != next); /* wrasgc is reachable, but
++ PyObject_ASSERT(op, wrasgc != next);
++ /* wrasgc is reachable, but
+ next isn't, so they can't
+ be the same */
+ gc_list_move(wrasgc, &wrcb_to_call);
+@@ -701,11 +707,11 @@ handle_weakrefs(PyGC_Head *unreachable,
+
+ gc = wrcb_to_call.gc.gc_next;
+ op = FROM_GC(gc);
+- assert(IS_REACHABLE(op));
+- assert(PyWeakref_Check(op));
++ PyObject_ASSERT(op, IS_REACHABLE(op));
++ PyObject_ASSERT(op, PyWeakref_Check(op));
+ wr = (PyWeakReference *)op;
+ callback = wr->wr_callback;
+- assert(callback != NULL);
++ PyObject_ASSERT(op, callback != NULL);
+
+ /* copy-paste of weakrefobject.c's handle_callback() */
+ temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
+@@ -822,12 +828,14 @@ check_garbage(PyGC_Head *collectable)
+ for (gc = collectable->gc.gc_next; gc != collectable;
+ gc = gc->gc.gc_next) {
+ _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
+- assert(_PyGCHead_REFS(gc) != 0);
++ PyObject_ASSERT(FROM_GC(gc),
++ _PyGCHead_REFS(gc) != 0);
+ }
+ subtract_refs(collectable);
+ for (gc = collectable->gc.gc_next; gc != collectable;
+ gc = gc->gc.gc_next) {
+- assert(_PyGCHead_REFS(gc) >= 0);
++ PyObject_ASSERT(FROM_GC(gc),
++ _PyGCHead_REFS(gc) >= 0);
+ if (_PyGCHead_REFS(gc) != 0)
+ return -1;
+ }
+diff -up Lib/test/test_gc.py.old Lib/test/test_gc.py
+--- Lib/test/test_gc.py.old 2014-12-10 11:19:33.503982288 +0100
++++ Lib/test/test_gc.py 2014-12-10 11:21:13.220021364 +0100
+@@ -49,6 +49,8 @@ class GC_Detector(object):
+ # gc collects it.
+ self.wr = weakref.ref(C1055820(666), it_happened)
+
++BUILD_WITH_NDEBUG = ('-DNDEBUG' in
sysconfig.get_config_vars()['PY_CFLAGS'])
++
+ @with_tp_del
+ class Uncollectable(object):
+ """Create a reference cycle with multiple __del__ methods.
+@@ -854,6 +856,8 @@ class GCCallbackTests(unittest.TestCase)
+ self.assertEqual(len(gc.garbage), 0)
+
+
++ @unittest.skipIf(BUILD_WITH_NDEBUG,
++ 'built with -NDEBUG')
+ def test_refcount_errors(self):
+ self.preclean()
+ # Verify the "handling" of objects with broken refcounts
+diff -up Lib/test/test_gc.py.old Lib/test/test_gc.py
+--- Lib/test/test_gc.py.old 2014-12-10 12:50:58.252121318 +0100
++++ Lib/test/test_gc.py 2014-12-10 12:51:08.594266653 +0100
+@@ -4,6 +4,7 @@ from test.support import (verbose, refco
+ from test.script_helper import assert_python_ok, make_script, temp_dir
+
+ import sys
++import sysconfig
+ import time
+ import gc
+ import weakref
diff --git a/00200-gettext-plural-fix.patch b/00200-gettext-plural-fix.patch
new file mode 100644
index 0000000..93b817b
--- /dev/null
+++ b/00200-gettext-plural-fix.patch
@@ -0,0 +1,12 @@
+diff -up Python-2.5.1/Lib/gettext.py.plural Python-2.5.1/Lib/gettext.py
+--- Python-2.5.1/Lib/gettext.py.plural 2007-09-10 11:38:57.000000000 -0400
++++ Python-2.5.1/Lib/gettext.py 2007-09-10 11:39:00.000000000 -0400
+@@ -299,6 +299,8 @@ class GNUTranslations(NullTranslations):
+ item = b_item.decode().strip()
+ if not item:
+ continue
++ if item.startswith("#"):
++ continue
+ if ':' in item:
+ k, v = item.split(':', 1)
+ k = k.strip().lower()
diff --git a/00201-fix-memory-leak-in-gdbm.patch b/00201-fix-memory-leak-in-gdbm.patch
new file mode 100644
index 0000000..48839d5
--- /dev/null
+++ b/00201-fix-memory-leak-in-gdbm.patch
@@ -0,0 +1,10 @@
+--- Modules/_gdbmmodule.c.orig 2013-07-08 14:54:27.803790151 +0200
++++ Modules/_gdbmmodule.c 2013-07-08 14:55:25.006672443 +0200
+@@ -106,6 +106,7 @@
+ if(okey.dsize) free(okey.dptr);
+ okey=key;
+ }
++ if(okey.dsize) free(okey.dptr);
+ dp->di_size = size;
+ }
+ return dp->di_size;
diff --git a/python3.spec b/python3.spec
index 916bc6c..cbe48d0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -539,10 +539,16 @@ Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
# in python.spec
# TODO: python3 status?
-# 00170 #
-# Patch170: 00170-gc-assertions.patch
-# in python.spec
-# TODO: python3 status?
+# 00170 #
+# In debug builds, try to print repr() when a C-level assert fails in the
+# garbage collector (typically indicating a reference-counting error
+# somewhere else e.g in an extension module)
+# Backported to 2.7 from a patch I sent upstream for py3k
+#
http://bugs.python.org/issue9263 (rhbz#614680)
+# hiding the proposed new macros/functions within gcmodule.c to avoid exposing
+# them within the extension API.
+# (rhbz#850013
+Patch170: 00170-gc-assertions.patch
# 00171 #
# python.spec had:
@@ -704,6 +710,18 @@ Patch196: 00196-test-gdb-match-addr-before-builtin.patch
# Issue:
http://bugs.python.org/issue22638 Upstream discussion about SSLv3 in Python
Patch199: 00199-alter-tests-to-reflect-sslv3-disabled.patch
+# 00200 #
+# Fix for gettext plural form headers (lines that begin with "#")
+# Note: Backported from scl
+Patch200: 00200-gettext-plural-fix.patch
+
+# 00201 #
+# Fixes memory leak in gdbm module (rhbz#977308)
+# This was upstreamed as a part of bigger patch, but for our purposes
+# this is ok:
http://bugs.python.org/issue18404
+# Note: Backported from scl
+Patch201: 00201-fix-memory-leak-in-gdbm.patch
+
# (New patches go here ^^^)
#
@@ -1872,6 +1890,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Dec 16 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-3
+- New patches: 170 (gc asserts), 200 (gettext headers),
+ 201 (gdbm memory leak)
+
* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
- OpenSSL disabled SSLv3 in SSLv23 method
commit 6afc2ff1f853da2b195af10118ede45305af0ace
Author: Robert Kuska <rkuska(a)redhat.com>
Date: Thu Dec 11 14:39:08 2014 +0100
Update tests to reflect latest changes in OpenSSL SSLv23 method
diff --git a/00199-alter-tests-to-reflect-sslv3-disabled.patch
b/00199-alter-tests-to-reflect-sslv3-disabled.patch
new file mode 100644
index 0000000..f35eff9
--- /dev/null
+++ b/00199-alter-tests-to-reflect-sslv3-disabled.patch
@@ -0,0 +1,49 @@
+diff -up Python-3.4.2/Lib/test/test_ssl.py.ssl Python-3.4.2/Lib/test/test_ssl.py
+--- Python-3.4.2/Lib/test/test_ssl.py.ssl 2014-12-11 12:25:21.886928225 +0100
++++ Python-3.4.2/Lib/test/test_ssl.py 2014-12-11 12:25:00.284746529 +0100
+@@ -674,10 +674,7 @@ class ContextTests(unittest.TestCase):
+ @skip_if_broken_ubuntu_ssl
+ def test_options(self):
+ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
+- # OP_ALL | OP_NO_SSLv2 is the default value
+- self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2,
+- ctx.options)
+- ctx.options |= ssl.OP_NO_SSLv3
++ # OP_ALL | OP_NO_SSLv2 | OP_NO_SSLv3 is the default value
+ self.assertEqual(ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3,
+ ctx.options)
+ if can_clear_options():
+@@ -2149,21 +2146,18 @@ else:
+ sys.stdout.write(
+ " SSL2 client to SSL23 server test unexpectedly
failed:\n %s\n"
+ % str(x))
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True)
++ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True)
+
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_OPTIONAL)
++ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_OPTIONAL)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_OPTIONAL)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True,
ssl.CERT_OPTIONAL)
+
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True,
ssl.CERT_REQUIRED)
++ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
ssl.CERT_REQUIRED)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
ssl.CERT_REQUIRED)
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True,
ssl.CERT_REQUIRED)
+
+- # Server with specific SSL options
+- try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, False,
+- server_options=ssl.OP_NO_SSLv3)
+ # Will choose TLSv1
+ try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True,
+ server_options=ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3)
+@@ -2186,7 +2180,7 @@ else:
+ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False)
+ if no_sslv2_implies_sslv3_hello():
+ # No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs
+- try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, True,
++ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False,
+ client_options=ssl.OP_NO_SSLv2)
+
+ @skip_if_broken_ubuntu_ssl
diff --git a/python3.spec b/python3.spec
index bfe1482..916bc6c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -699,6 +699,11 @@ Patch196: 00196-test-gdb-match-addr-before-builtin.patch
# FIXED UPSTREAM
# Patch197: 00197-fix-CVE-2014-4650.patch
+# OpenSSL disabled SSLv3 in SSLv23 method
+# This patch alters python tests to reflect this change
+# Issue:
http://bugs.python.org/issue22638 Upstream discussion about SSLv3 in Python
+Patch199: 00199-alter-tests-to-reflect-sslv3-disabled.patch
+
# (New patches go here ^^^)
#
@@ -978,6 +983,7 @@ done
# 00195: upstream as of Python 3.4.2
%patch196 -p1
# 00197: upstream as of Python 3.4.2
+%patch199 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1866,6 +1872,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Dec 11 2014 Robert Kuska <rkuska(a)redhat.com> - 3.4.2-2
+- OpenSSL disabled SSLv3 in SSLv23 method
+
* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
- Update to 3.4.2
- Refreshed patches: 156 (gdb autoload)
commit a8e96a15a3a304941150406730bdec774c271637
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Thu Nov 13 10:58:03 2014 +0100
Update to Python 3.4.2
diff --git a/00156-gdb-autoload-safepath.patch b/00156-gdb-autoload-safepath.patch
index ac2aa40..1e57e9f 100644
--- a/00156-gdb-autoload-safepath.patch
+++ b/00156-gdb-autoload-safepath.patch
@@ -45,7 +45,7 @@ diff -up Python-3.2.3/Lib/test/test_gdb.py.gdb-autoload-safepath
Python-3.2.3/Li
# print commands
# Use "commands" to generate the arguments with which to invoke
"gdb":
- args = ["gdb", "--batch"]
+ args = ["gdb", "--batch", "-nx"]
+ args += ['--init-eval-command=%s' % cmd for cmd in init_commands]
args += ['--eval-command=%s' % cmd for cmd in commands]
args += ["--args",
diff --git a/00195-dont-add-Werror-declaration-after-statement.patch
b/00195-dont-add-Werror-declaration-after-statement.patch
deleted file mode 100644
index 506d9ea..0000000
--- a/00195-dont-add-Werror-declaration-after-statement.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-diff --git a/Makefile.pre.in b/Makefile.pre.in
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -71,12 +71,17 @@
- BASECFLAGS= @BASECFLAGS@
- BASECPPFLAGS= @BASECPPFLAGS@
- CONFIGURE_CFLAGS= @CFLAGS@
-+# CFLAGS_NODIST is used for building the interpreter and stdlib C extensions.
-+# Use it when a compiler flag should _not_ be part of the distutils CFLAGS
-+# once Python is installed (Issue #21121).
-+CONFIGURE_CFLAGS_NODIST=@CFLAGS_NODIST@
- CONFIGURE_CPPFLAGS= @CPPFLAGS@
- CONFIGURE_LDFLAGS= @LDFLAGS@
- # Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the
- # command line to append to these values without stomping the pre-set
- # values.
- PY_CFLAGS= $(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)
-+PY_CFLAGS_NODIST=$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST)
- # Both CPPFLAGS and LDFLAGS need to contain the shell's value for setup.py to
- # be able to build extension modules using the directories specified in the
- # environment variables
-@@ -91,7 +96,7 @@
- # Extra C flags added for building the interpreter object files.
- CFLAGSFORSHARED=@CFLAGSFORSHARED@
- # C flags used for building the interpreter object files
--PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE
-+PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)
-DPy_BUILD_CORE
-
-
- # Machine-dependent subdirectories
-diff --git a/configure b/configure
---- a/configure
-+++ b/configure
-@@ -662,6 +662,7 @@
- LIBTOOL_CRUFT
- OTHER_LIBTOOL_OPT
- UNIVERSAL_ARCH_FLAGS
-+CFLAGS_NODIST
- BASECFLAGS
- OPT
- ABIFLAGS
-@@ -6504,7 +6505,7 @@
-
- if test $ac_cv_declaration_after_statement_warning = yes
- then
-- BASECFLAGS="$BASECFLAGS -Werror=declaration-after-statement"
-+ CFLAGS_NODIST="$CFLAGS_NODIST -Werror=declaration-after-statement"
- fi
-
- # if using gcc on alpha, use -mieee to get (near) full IEEE 754
-diff --git a/configure.ac b/configure.ac
---- a/configure.ac
-+++ b/configure.ac
-@@ -1147,6 +1147,7 @@
- fi
-
- AC_SUBST(BASECFLAGS)
-+AC_SUBST(CFLAGS_NODIST)
-
- # The -arch flags for universal builds on OSX
- UNIVERSAL_ARCH_FLAGS=
-@@ -1231,7 +1232,7 @@
-
- if test $ac_cv_declaration_after_statement_warning = yes
- then
-- BASECFLAGS="$BASECFLAGS -Werror=declaration-after-statement"
-+ CFLAGS_NODIST="$CFLAGS_NODIST -Werror=declaration-after-statement"
- fi
-
- # if using gcc on alpha, use -mieee to get (near) full IEEE 754
-diff --git a/setup.py b/setup.py
---- a/setup.py
-+++ b/setup.py
-@@ -19,6 +19,12 @@
-
- cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
-
-+# Add special CFLAGS reserved for building the interpreter and the stdlib
-+# modules (Issue #21121).
-+cflags = sysconfig.get_config_var('CFLAGS')
-+py_cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST')
-+sysconfig.get_config_vars()['CFLAGS'] = cflags + ' ' + py_cflags_nodist
-+
- def get_platform():
- # cross build
- if "_PYTHON_HOST_PLATFORM" in os.environ:
diff --git a/00197-fix-CVE-2014-4650.patch b/00197-fix-CVE-2014-4650.patch
deleted file mode 100644
index 6ab8137..0000000
--- a/00197-fix-CVE-2014-4650.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-# HG changeset patch
-# User Benjamin Peterson <benjamin(a)python.org>
-# Date 1402796473 25200
-# Node ID 847e288d6e93dba049c280f40979e16a1378d0f6
-# Parent 6f1f387759913d91cb307d2783b3a40c48fe7424# Parent
5676797f3a3eccaf38e2c500e77ed39c68923cc9
-merge 3.3 (#21766)
-
-diff --git a/Lib/http/server.py b/Lib/http/server.py
---- a/Lib/http/server.py
-+++ b/Lib/http/server.py
-@@ -977,7 +977,7 @@ class CGIHTTPRequestHandler(SimpleHTTPRe
- (and the next character is a '/' or the end of the string).
-
- """
-- collapsed_path = _url_collapse_path(self.path)
-+ collapsed_path = _url_collapse_path(urllib.parse.unquote(self.path))
- dir_sep = collapsed_path.find('/', 1)
- head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:]
- if head in self.cgi_directories:
-diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
---- a/Lib/test/test_httpservers.py
-+++ b/Lib/test/test_httpservers.py
-@@ -485,6 +485,11 @@ class CGIHTTPServerTestCase(BaseTestCase
- (res.read(), res.getheader('Content-type'), res.status))
- self.assertEqual(os.environ['SERVER_SOFTWARE'], signature)
-
-+ def test_urlquote_decoding_in_cgi_check(self):
-+ res = self.request('/cgi-bin%2ffile1.py')
-+ self.assertEqual((b'Hello World\n', 'text/html', 200),
-+ (res.read(), res.getheader('Content-type'), res.status))
-+
-
- class SocketlessRequestHandler(SimpleHTTPRequestHandler):
- def __init__(self):
diff --git a/python3.spec b/python3.spec
index cc4b01d..bfe1482 100644
--- a/python3.spec
+++ b/python3.spec
@@ -139,8 +139,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.1
-Release: 16%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -682,7 +682,8 @@ Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
# Don't declare Werror=declaration-after-statement for extension
# modules through setup.py
#
http://bugs.python.org/issue21121
-Patch195: 00195-dont-add-Werror-declaration-after-statement.patch
+# FIXED UPSTREAM
+# Patch195: 00195-dont-add-Werror-declaration-after-statement.patch
# 00196
#
@@ -695,7 +696,8 @@ Patch196: 00196-test-gdb-match-addr-before-builtin.patch
# path separators in URLs. This may have enabled attackers to disclose a CGI
# script's source code or execute arbitrary scripts in the server's
# document root.
-Patch197: 00197-fix-CVE-2014-4650.patch
+# FIXED UPSTREAM
+# Patch197: 00197-fix-CVE-2014-4650.patch
# (New patches go here ^^^)
@@ -973,9 +975,9 @@ done
# 00190: upstream as of Python 3.4.1
# 00193: upstream as of Python 3.4.1
%patch194 -p1
-%patch195 -p1
+# 00195: upstream as of Python 3.4.2
%patch196 -p1
-%patch197 -p1
+# 00197: upstream as of Python 3.4.2
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1722,7 +1724,6 @@ rm -fr %{buildroot}
%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
%dir %{pylibdir}/turtledemo
%{pylibdir}/turtledemo/*.py
-%{pylibdir}/turtledemo/*.txt
%{pylibdir}/turtledemo/*.cfg
%dir %{pylibdir}/turtledemo/__pycache__/
%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
@@ -1865,6 +1866,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Nov 13 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.2-1
+- Update to 3.4.2
+- Refreshed patches: 156 (gdb autoload)
+- Removed: 195 (Werror declaration), 197 (CVE-2014-4650)
+
* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
- Fix CVE-2014-4650 - CGIHTTPServer URL handling
Resolves: rhbz#1113529
diff --git a/sources b/sources
index f2258f0..849668a 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-6cafc183b4106476dd73d5738d7f616a Python-3.4.1.tar.xz
+36fc7327c02c6f12fa24fc9ba78039e3 Python-3.4.2.tar.xz
diff --git a/temporarily-disable-tests-requiring-SIGHUP.patch
b/temporarily-disable-tests-requiring-SIGHUP.patch
index 88ac230..2e88678 100644
--- a/temporarily-disable-tests-requiring-SIGHUP.patch
+++ b/temporarily-disable-tests-requiring-SIGHUP.patch
@@ -21,5 +21,5 @@ diff -up Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py.orig
Python-3.4.0
- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
+ @unittest.skipIf(True, "Temporarily skipped (rhbz#1088233)")
def test_send_signal(self):
- args = PROGRAM_BLOCKED
- create = asyncio.create_subprocess_exec(*args, loop=self.loop)
+ code = 'import time; print("sleeping", flush=True);
time.sleep(3600)'
+ args = [sys.executable, '-c', code]
commit e0539fb2e7dc339695f36bbb31459b2e3c7ae749
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Mon Nov 3 15:03:12 2014 +0100
Fix CVE-2014-4650 - CGIHTTPServer URL handling
Resolves: rhbz#1113529
diff --git a/00197-fix-CVE-2014-4650.patch b/00197-fix-CVE-2014-4650.patch
new file mode 100644
index 0000000..6ab8137
--- /dev/null
+++ b/00197-fix-CVE-2014-4650.patch
@@ -0,0 +1,34 @@
+# HG changeset patch
+# User Benjamin Peterson <benjamin(a)python.org>
+# Date 1402796473 25200
+# Node ID 847e288d6e93dba049c280f40979e16a1378d0f6
+# Parent 6f1f387759913d91cb307d2783b3a40c48fe7424# Parent
5676797f3a3eccaf38e2c500e77ed39c68923cc9
+merge 3.3 (#21766)
+
+diff --git a/Lib/http/server.py b/Lib/http/server.py
+--- a/Lib/http/server.py
++++ b/Lib/http/server.py
+@@ -977,7 +977,7 @@ class CGIHTTPRequestHandler(SimpleHTTPRe
+ (and the next character is a '/' or the end of the string).
+
+ """
+- collapsed_path = _url_collapse_path(self.path)
++ collapsed_path = _url_collapse_path(urllib.parse.unquote(self.path))
+ dir_sep = collapsed_path.find('/', 1)
+ head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:]
+ if head in self.cgi_directories:
+diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
+--- a/Lib/test/test_httpservers.py
++++ b/Lib/test/test_httpservers.py
+@@ -485,6 +485,11 @@ class CGIHTTPServerTestCase(BaseTestCase
+ (res.read(), res.getheader('Content-type'), res.status))
+ self.assertEqual(os.environ['SERVER_SOFTWARE'], signature)
+
++ def test_urlquote_decoding_in_cgi_check(self):
++ res = self.request('/cgi-bin%2ffile1.py')
++ self.assertEqual((b'Hello World\n', 'text/html', 200),
++ (res.read(), res.getheader('Content-type'), res.status))
++
+
+ class SocketlessRequestHandler(SimpleHTTPRequestHandler):
+ def __init__(self):
diff --git a/python3.spec b/python3.spec
index 02b9d14..cc4b01d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 15%{?dist}
+Release: 16%{?dist}
License: Python
Group: Development/Languages
@@ -689,6 +689,14 @@ Patch195: 00195-dont-add-Werror-declaration-after-statement.patch
# Fix test_gdb failure on ppc64le
Patch196: 00196-test-gdb-match-addr-before-builtin.patch
+# 00197
+#
+# The CGIHTTPServer Python module did not properly handle URL-encoded
+# path separators in URLs. This may have enabled attackers to disclose a CGI
+# script's source code or execute arbitrary scripts in the server's
+# document root.
+Patch197: 00197-fix-CVE-2014-4650.patch
+
# (New patches go here ^^^)
#
@@ -967,6 +975,7 @@ done
%patch194 -p1
%patch195 -p1
%patch196 -p1
+%patch197 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1856,7 +1865,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> .1-15
+* Mon Nov 03 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-16
+- Fix CVE-2014-4650 - CGIHTTPServer URL handling
+Resolves: rhbz#1113529
+
+* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-15
- exclude test_gdb on ppc* (rhbz#1132488)
* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
commit 8d54999cc40b74b704ce09e1fb91e4918b9dfa7f
Author: Karsten Hopp <karsten(a)redhat.com>
Date: Sun Sep 7 12:29:29 2014 +0200
exclude test_gdb on ppc* (rhbz#1132488)
diff --git a/python3.spec b/python3.spec
index 0fc0639..02b9d14 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 14%{?dist}
+Release: 15%{?dist}
License: Python
Group: Development/Languages
@@ -1420,7 +1420,10 @@ CheckPython() {
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
--verbose --findleaks \
%ifarch ppc64le aarch64
- -x test_faulthandler
+ -x test_faulthandler \
+ %endif
+ %ifarch %{power64}
+ -x test_gdb
%endif
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1853,6 +1856,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun Sep 07 2014 Karsten Hopp <karsten(a)redhat.com> .1-15
+- exclude test_gdb on ppc* (rhbz#1132488)
+
* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
commit ed631dfc76b4b509db4605404db3b80545f6399a
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Thu Aug 21 16:40:42 2014 +0200
Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
index ddb39f9..5d514be 100644
--- a/00189-add-rewheel-module.patch
+++ b/00189-add-rewheel-module.patch
@@ -1,6 +1,6 @@
-unchanged:
---- Python-3.4.0rc3/Lib/ensurepip/__init__.py 2014-03-10 07:56:33.000000000 +0100
-+++ Python-3.4.0rc3-rewheel/Lib/ensurepip/__init__.py 2014-03-12 09:57:12.917120853
+0100
+diff -Nur Python-3.4.1/Lib/ensurepip/__init__.py
Python-3.4.1-rewheel/Lib/ensurepip/__init__.py
+--- Python-3.4.1/Lib/ensurepip/__init__.py 2014-08-21 10:49:30.792695824 +0200
++++ Python-3.4.1-rewheel/Lib/ensurepip/__init__.py 2014-08-21 10:10:41.958341726 +0200
@@ -1,8 +1,10 @@
import os
import os.path
@@ -12,7 +12,7 @@ unchanged:
__all__ = ["version", "bootstrap"]
-@@ -38,6 +40,8 @@ def _run_pip(args, additional_paths=None
+@@ -38,6 +40,8 @@
# Install the bundled software
import pip
@@ -21,14 +21,10 @@ unchanged:
pip.main(args)
-@@ -87,20 +90,39 @@ def bootstrap(*, root=None, upgrade=Fals
+@@ -87,20 +91,39 @@
# omit pip and easy_install
os.environ["ENSUREPIP_OPTIONS"] = "install"
-- with tempfile.TemporaryDirectory() as tmpdir:
-- # Put our bundled wheels into a temporary directory and construct the
-- # additional paths that need added to sys.path
-- additional_paths = []
+ whls = []
+ rewheel_dir = None
+ # try to see if we have system-wide versions of _PROJECTS
@@ -45,25 +41,28 @@ unchanged:
+ else:
+ # if we don't have all the _PROJECTS installed system-wide,
+ # let's just fall back to bundled wheels
- for project, version in _PROJECTS:
-- wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
-- whl = pkgutil.get_data(
++ for project, version in _PROJECTS:
+ whl = os.path.join(
+ os.path.dirname(__file__),
-- "ensurepip",
-- "_bundled/{}".format(wheel_name),
+ "_bundled",
+ "{}-{}-py2.py3-none-any.whl".format(project, version)
- )
++ )
++ whls.append(whl)
++
+ with tempfile.TemporaryDirectory() as tmpdir:
+ # Put our bundled wheels into a temporary directory and construct the
+ # additional paths that need added to sys.path
+ additional_paths = []
+- for project, version in _PROJECTS:
+- wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
+- whl = pkgutil.get_data(
+- "ensurepip",
+- "_bundled/{}".format(wheel_name),
+- )
- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
- fp.write(whl)
-+ whls.append(whl)
-
+-
- additional_paths.append(os.path.join(tmpdir, wheel_name))
-+ with tempfile.TemporaryDirectory() as tmpdir:
-+ # Put our bundled wheels into a temporary directory and construct the
-+ # additional paths that need added to sys.path
-+ additional_paths = []
+ for whl in whls:
+ shutil.copy(whl, tmpdir)
+ additional_paths.append(os.path.join(tmpdir, os.path.basename(whl)))
@@ -72,11 +71,12 @@ unchanged:
# Construct the arguments to be passed to the pip command
args = ["install", "--no-index", "--find-links",
tmpdir]
-unchanged:
---- Python-3.4.0rc3/Lib/ensurepip/rewheel/__init__.py 1970-01-01 01:00:00.000000000
+0100
-+++ Python-3.4.0rc3-rewheel/Lib/ensurepip/rewheel/__init__.py 2014-03-12
09:55:30.413152104 +0100
-@@ -0,0 +1,136 @@
+diff -Nur Python-3.4.1/Lib/ensurepip/rewheel/__init__.py
Python-3.4.1-rewheel/Lib/ensurepip/rewheel/__init__.py
+--- Python-3.4.1/Lib/ensurepip/rewheel/__init__.py 1970-01-01 01:00:00.000000000 +0100
++++ Python-3.4.1-rewheel/Lib/ensurepip/rewheel/__init__.py 2014-08-21 10:11:22.560320121
+0200
+@@ -0,0 +1,143 @@
+import argparse
++import codecs
+import csv
+import email.parser
+import os
@@ -162,10 +162,14 @@ unchanged:
+
+def get_wheel_name(record_path):
+ """Return proper name of the wheel, without .whl."""
++
+ wheel_info_path = os.path.join(os.path.dirname(record_path), 'WHEEL')
-+ wheel_info = email.parser.Parser().parsestr(open(wheel_info_path).read())
++ with codecs.open(wheel_info_path, encoding='utf-8') as wheel_info_file:
++ wheel_info = email.parser.Parser().parsestr(wheel_info_file.read())
++
+ metadata_path = os.path.join(os.path.dirname(record_path), 'METADATA')
-+ metadata = email.parser.Parser().parsestr(open(metadata_path).read())
++ with codecs.open(metadata_path, encoding='utf-8') as metadata_file:
++ metadata = email.parser.Parser().parsestr(metadata_file.read())
+
+ # construct name parts according to wheel spec
+ distribution = metadata.get('Name')
@@ -187,7 +191,9 @@ unchanged:
+ - list of files that shouldn't be written or need some processing
+ (pyc and pyo files, scripts)
+ """
-+ record_contents = open(os.path.join(site_dir, record_relpath)).read()
++ record_file_path = os.path.join(site_dir, record_relpath)
++ with codecs.open(record_file_path, encoding='utf-8') as record_file:
++ record_contents = record_file.read()
+ # temporary fix for
https://github.com/pypa/pip/issues/1376
+ # we need to ignore files under ".data" directory
+ data_dir = os.path.dirname(record_relpath).strip(os.path.sep)
@@ -212,11 +218,10 @@ unchanged:
+ else:
+ pass # bad RECORD or empty line
+ return to_write, to_omit
-only in patch2:
-unchanged:
---- Python-3.4.0/Makefile.pre.in 2014-04-01 12:02:48.188136172 +0200
-+++ Python-3.4.0-new/Makefile.pre.in 2014-04-01 12:03:23.770394025 +0200
-@@ -1140,7 +1140,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter
+diff -Nur Python-3.4.1/Makefile.pre.in Python-3.4.1-rewheel/Makefile.pre.in
+--- Python-3.4.1/Makefile.pre.in 2014-08-21 10:49:31.512695040 +0200
++++ Python-3.4.1-rewheel/Makefile.pre.in 2014-08-21 10:10:41.961341722 +0200
+@@ -1145,7 +1145,7 @@
test/test_asyncio \
collections concurrent concurrent/futures encodings \
email email/mime test/test_email test/test_email/data \
diff --git a/python3.spec b/python3.spec
index 3a51ca0..0fc0639 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 13%{?dist}
+Release: 14%{?dist}
License: Python
Group: Development/Languages
@@ -1853,6 +1853,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Aug 21 2014 Slavek Kabrda <bkabrda(a)redhat.com> - 3.4.1-14
+- Update rewheel patch with fix from
https://github.com/bkabrda/rewheel/pull/1
+
* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
commit 2d77c4da1bcd0e617eb2c819207d0bbe5a32ce86
Author: Peter Robinson <pbrobinson(a)fedoraproject.org>
Date: Sun Aug 17 22:05:56 2014 +0000
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index 2596e4f..3a51ca0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
Group: Development/Languages
@@ -1853,6 +1853,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun Aug 17 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-13
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
- aarch64 has valgrind, just list those that don't support it
commit 8430e60b7bf430abf5981c28da74ad999ec8ddda
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Tue Jul 1 12:14:53 2014 +0200
Back to Bash wrapper, as upstream in 3.4 also uses Bash for some reasons
This reverts commit 95a55939d74997721acfb6e9b190a815c3e41fc1.
This reverts commit 41a68301c70978d906d1b08d4aaa85337d1de3fc.
diff --git a/config.py b/config.py
deleted file mode 100644
index b40b483..0000000
--- a/config.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/python3.4m
-# -*- python -*-
-
-import sys
-import subprocess
-ver = sys.version[:3]
-arch = subprocess.check_output('uname
-m'.split()).decode("utf-8").rstrip()
-call = ['python{ver}m-{arch}-config'.format(ver=ver, arch=arch)] + sys.argv[1:]
-retval = subprocess.call(call)
-if retval == 127:
- print('Could not find python{ver}m-{arch}-config. Look around to see available
arches.'.format(ver=ver, arch=arch), file=sys.stderr)
diff --git a/python3.spec b/python3.spec
index e956ab5..2596e4f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 13%{?dist}
+Release: 12%{?dist}
License: Python
Group: Development/Languages
@@ -243,9 +243,6 @@ Source7: pyfuntop.stp
# Written by bkabrda
Source8: check-pyc-and-pyo-timestamps.py
-# Python wrapper arounf pythonXXm-config to be able to keep python3-devel multiarch
-Source9: config.py
-
# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
@@ -1384,8 +1381,11 @@ sed \
# Rename the script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,`uname -m`-}config
-cp %{SOURCE9} %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
-chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname -m`-config
"$@"' > \
+ %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+ chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
# ======================================================
# Running the upstream test suite
@@ -1853,9 +1853,6 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Mon Jun 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-13
-- Rewrite the config wrapper from Bash to Python, so it can be interpreted with Python
-
* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
- aarch64 has valgrind, just list those that don't support it
commit 41a68301c70978d906d1b08d4aaa85337d1de3fc
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jun 30 19:11:22 2014 +0200
Header of config script improval
diff --git a/config.py b/config.py
index 964d5d9..b40b483 100644
--- a/config.py
+++ b/config.py
@@ -1,4 +1,6 @@
-#!/bin/python3
+#!/usr/bin/python3.4m
+# -*- python -*-
+
import sys
import subprocess
ver = sys.version[:3]
commit 95a55939d74997721acfb6e9b190a815c3e41fc1
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon Jun 30 18:53:45 2014 +0200
Rewrite the config wrapper from Bash to Python, so it can be interpreted with Python
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..964d5d9
--- /dev/null
+++ b/config.py
@@ -0,0 +1,9 @@
+#!/bin/python3
+import sys
+import subprocess
+ver = sys.version[:3]
+arch = subprocess.check_output('uname
-m'.split()).decode("utf-8").rstrip()
+call = ['python{ver}m-{arch}-config'.format(ver=ver, arch=arch)] + sys.argv[1:]
+retval = subprocess.call(call)
+if retval == 127:
+ print('Could not find python{ver}m-{arch}-config. Look around to see available
arches.'.format(ver=ver, arch=arch), file=sys.stderr)
diff --git a/python3.spec b/python3.spec
index 2596e4f..e956ab5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
Group: Development/Languages
@@ -243,6 +243,9 @@ Source7: pyfuntop.stp
# Written by bkabrda
Source8: check-pyc-and-pyo-timestamps.py
+# Python wrapper arounf pythonXXm-config to be able to keep python3-devel multiarch
+Source9: config.py
+
# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
@@ -1381,11 +1384,8 @@ sed \
# Rename the script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,`uname -m`-}config
-echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname -m`-config
"$@"' > \
- %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
-echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname -m`-config. Look around to see available arches."
>&2' >> \
- %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
- chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+cp %{SOURCE9} %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
# ======================================================
# Running the upstream test suite
@@ -1853,6 +1853,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jun 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-13
+- Rewrite the config wrapper from Bash to Python, so it can be interpreted with Python
+
* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
- aarch64 has valgrind, just list those that don't support it
commit 9012997174030631046c5489f87c2341f07a1758
Author: Peter Robinson <pbrobinson(a)gmail.com>
Date: Sun Jun 8 16:27:22 2014 +0100
aarch64 has valgrind, just list those that don't support it with a ifnarch
diff --git a/python3.spec b/python3.spec
index 867c42d..2596e4f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -71,7 +71,7 @@
%global with_systemtap 1
# some arches don't have valgrind so we need to disable its support on them
-%ifarch %{ix86} x86_64 ppc ppc64 ppc64p7 s390x %{arm}
+%ifnarch s390 ppc64le
%global with_valgrind 1
%else
%global with_valgrind 0
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
Group: Development/Languages
@@ -1853,6 +1853,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun Jun 8 2014 Peter Robinson <pbrobinson(a)fedoraproject.org> 3.4.1-12
+- aarch64 has valgrind, just list those that don't support it
+
* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
commit a292e5b2122f0082a73d677659f5c111ecbb6ad0
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Sat Jun 7 19:38:08 2014 -0500
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index e154bee..867c42d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
Group: Development/Languages
@@ -1853,6 +1853,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun Jun 08 2014 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.4.1-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
- bump release and rebuild to link with the correct tcl/tk libs on ppcle
commit cb99f9f0e58934179176280671dbda223a5c2c65
Author: Karsten Hopp <karsten(a)redhat.com>
Date: Wed Jun 4 23:16:38 2014 +0200
bump release and rebuild to link with the correct tcl/tk libs on ppcle
diff --git a/python3.spec b/python3.spec
index 622890c..e154bee 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -1853,6 +1853,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Jun 04 2014 Karsten Hopp <karsten(a)redhat.com> 3.4.1-10
+- bump release and rebuild to link with the correct tcl/tk libs on ppcle
+
* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
- Change paths to bundled projects in rewheel patch
commit 1014fca077e1a1a399c3718553afd5cc1d24ab9a
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Tue Jun 3 22:28:46 2014 +0200
Change paths to bundled projects in rewheel patch
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
index b3804b8..ddb39f9 100644
--- a/00189-add-rewheel-module.patch
+++ b/00189-add-rewheel-module.patch
@@ -21,7 +21,7 @@ unchanged:
pip.main(args)
-@@ -87,20 +90,40 @@ def bootstrap(*, root=None, upgrade=Fals
+@@ -87,20 +90,39 @@ def bootstrap(*, root=None, upgrade=Fals
# omit pip and easy_install
os.environ["ENSUREPIP_OPTIONS"] = "install"
@@ -50,9 +50,9 @@ unchanged:
- whl = pkgutil.get_data(
+ whl = os.path.join(
+ os.path.dirname(__file__),
- "ensurepip",
+- "ensurepip",
- "_bundled/{}".format(wheel_name),
-+ "bundled",
++ "_bundled",
+ "{}-{}-py2.py3-none-any.whl".format(project, version)
)
- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
diff --git a/python3.spec b/python3.spec
index 7bc69d4..622890c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -140,7 +140,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -1853,6 +1853,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Jun 03 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-9
+- Change paths to bundled projects in rewheel patch
+
* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
- In config script, use uname -m to write the arch
commit 95668bdbb2159a95132df13cb8e78dc6406fabaa
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Fri May 30 11:52:51 2014 +0200
Add explanation of the bootstraping process
diff --git a/python3.spec b/python3.spec
index aad4eaa..7bc69d4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,6 +2,18 @@
# Conditionals and other variables controlling the build
# ======================================================
+# NOTES ON BOOTSTRAPING PYTHON 3.4:
+#
+# Due to dependency cycle between Python, pip, setuptools and
+# wheel caused by the rewheel patch, one has to build in the
+# following order:
+#
+# 1) python3 with with_rewheel set to 0
+# 2) python3-setuptools and python3-pip with with_rewheel set to 0
+# 3) python3-wheel
+# 4) python3-setuptools and python3-pip with with_rewheel set to 1
+# 5) python3 with with_rewheel set to 1
+
%global with_rewheel 1
%global pybasever 3.4
commit f188880d6c23c753712e546a55670b20d530786f
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Fri May 30 11:41:17 2014 +0200
In config script, use uname -m to write the arch
diff --git a/python3.spec b/python3.spec
index 052ecf0..aad4eaa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -1368,9 +1368,11 @@ sed \
%endif # with_systemtap
# Rename the script that differs on different arches to arch specific name
-mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,%{_arch}-}config
+mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,`uname -m`-}config
echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname -m`-config
"$@"' > \
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+echo '[ $? -eq 127 ] && echo "Could not find
python%{LDVERSION_optimized}-`uname -m`-config. Look around to see available arches."
>&2' >> \
+ %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
# ======================================================
@@ -1671,7 +1673,7 @@ rm -fr %{buildroot}
%{_bindir}/python3-config
%{_bindir}/python%{pybasever}-config
%{_bindir}/python%{LDVERSION_optimized}-config
-%{_bindir}/python%{LDVERSION_optimized}-%{_arch}-config
+%{_bindir}/python%{LDVERSION_optimized}-*-config
%{_libdir}/libpython%{LDVERSION_optimized}.so
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
@@ -1839,6 +1841,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri May 30 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-8
+- In config script, use uname -m to write the arch
+
* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
- update the arch list where valgrind exists - %%power64 includes also
ppc64le which is not supported yet
commit 2a2186c47077a32af506ad0490ed62623ef760ea
Author: Dan Hork <dan(a)danny.cz>
Date: Thu May 29 18:10:59 2014 +0200
- update the arch list where valgrind exists - %power64 includes also
ppc64le which is not supported yet
diff --git a/python3.spec b/python3.spec
index dde76a4..052ecf0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -59,7 +59,7 @@
%global with_systemtap 1
# some arches don't have valgrind so we need to disable its support on them
-%ifarch %{ix86} x86_64 ppc %{power64} s390x %{arm}
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64p7 s390x %{arm}
%global with_valgrind 1
%else
%global with_valgrind 0
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -1839,6 +1839,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 29 2014 Dan Hork <dan[at]danny.cz> - 3.4.1-7
+- update the arch list where valgrind exists - %%power64 includes also
+ ppc64le which is not supported yet
+
* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
- Forward arguments to the arch specific config script
Resolves: rhbz#1102683
commit 567c9678bebd59fb785a6a6fc4e93cfd3e1f01db
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu May 29 15:17:39 2014 +0200
Forward arguments to the arch specific config script
Resolves: rhbz#1102683
diff --git a/python3.spec b/python3.spec
index d3b33d1..dde76a4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -1369,7 +1369,7 @@ sed \
# Rename the script that differs on different arches to arch specific name
mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,%{_arch}-}config
-echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname
-m`-config' > \
+echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname -m`-config
"$@"' > \
%{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
@@ -1839,6 +1839,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 29 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-6
+- Forward arguments to the arch specific config script
+Resolves: rhbz#1102683
+
* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
- Rename python3.Xm-config script to arch specific.
Resolves: rhbz#1091815
commit 3d53dceca1baf5e3d20ac3bcc1c72a32cbd7a6ad
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Wed May 28 15:08:24 2014 +0200
Rename python3.Xm-config script to arch specific.
Resolves: rhbz#1091815
diff --git a/python3.spec b/python3.spec
index 9eae9f1..d3b33d1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -1367,6 +1367,11 @@ sed \
%endif # with_systemtap
+# Rename the script that differs on different arches to arch specific name
+mv %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-{,%{_arch}-}config
+echo -e '#!/bin/sh\nexec `dirname $0`/python%{LDVERSION_optimized}-`uname
-m`-config' > \
+ %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
+ chmod +x %{buildroot}%{_bindir}/python%{LDVERSION_optimized}-config
# ======================================================
# Running the upstream test suite
@@ -1666,6 +1671,7 @@ rm -fr %{buildroot}
%{_bindir}/python3-config
%{_bindir}/python%{pybasever}-config
%{_bindir}/python%{LDVERSION_optimized}-config
+%{_bindir}/python%{LDVERSION_optimized}-%{_arch}-config
%{_libdir}/libpython%{LDVERSION_optimized}.so
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
@@ -1833,6 +1839,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed May 28 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-5
+- Rename python3.Xm-config script to arch specific.
+Resolves: rhbz#1091815
+
* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
- Use python3-*, not python-* runtime requires on setuptools and pip
- rebuild for tcl-8.6
commit 29b96892f1b5c872d4f066f154164c39ec5c14de
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed May 28 09:27:08 2014 +0200
Also exclude test_faulthandler on aarch64
diff --git a/python3.spec b/python3.spec
index 706c95b..9eae9f1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1395,10 +1395,12 @@ CheckPython() {
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
# @unittest._expectedFailureInRpmBuild
+ # test_faulthandler.test_register_chain currently fails on ppc64le and
+ # aarch64, see upstream bug
http://bugs.python.org/issue21131
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
--verbose --findleaks \
- %ifarch ppc64le
+ %ifarch ppc64le aarch64
-x test_faulthandler
%endif
commit aeae72b51ce0317c715702d9de736703b8c4e006
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Tue May 27 13:17:25 2014 -0500
add message about building for tcl-8.6
diff --git a/python3.spec b/python3.spec
index 6223b38..706c95b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1833,6 +1833,7 @@ rm -fr %{buildroot}
%changelog
* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
- Use python3-*, not python-* runtime requires on setuptools and pip
+- rebuild for tcl-8.6
* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
- Update the rewheel module
commit f30edc5e6d1a5f3f2842d35883bbd2cbe09de648
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Tue May 27 17:33:00 2014 +0200
Use python3-*, not python-* runtime requires on setuptools and pip
diff --git a/python3.spec b/python3.spec
index 9bbdca5..6223b38 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -717,8 +717,8 @@ Provides: python(abi) = %{pybasever}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
%if 0%{with_rewheel}
-Requires: python-setuptools
-Requires: python-pip
+Requires: python3-setuptools
+Requires: python3-pip
%endif
%description
@@ -1831,6 +1831,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue May 27 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.1-4
+- Use python3-*, not python-* runtime requires on setuptools and pip
+
* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
- Update the rewheel module
commit bea65b85a17373a6cb10aecfcfc8d81d87f9718a
Merge: c21eb4a cfa9e52
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Tue May 27 17:15:10 2014 +0200
Merge branch 'python3.4'
Conflicts:
python3.spec
diff --cc python3.spec
index 4fda253,c373aee..9bbdca5
--- a/python3.spec
+++ b/python3.spec
@@@ -640,9 -658,25 +658,26 @@@ Patch189: 00189-add-rewheel-module.patc
# Skip correct number of *.pyc file bytes in ModuleFinder.load_module
# rhbz#1060338
#
http://bugs.python.org/issue20778
- Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
+ # FIXED UPSTREAM
+ # Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
+
+ # Tests requiring SIGHUP to work don't work in Koji
+ # see rhbz#1088233
+ Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
+
+ # 00195
+ #
+ # Don't declare Werror=declaration-after-statement for extension
+ # modules through setup.py
+ #
http://bugs.python.org/issue21121
+ Patch195: 00195-dont-add-Werror-declaration-after-statement.patch
+
+ # 00196
+ #
+ # Fix test_gdb failure on ppc64le
+ Patch196: 00196-test-gdb-match-addr-before-builtin.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
commit cfa9e5212dede627c2069b9877cec6c9d7007971
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Tue May 27 12:42:42 2014 +0200
Update rewheel module
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
index ad80e9f..b3804b8 100644
--- a/00189-add-rewheel-module.patch
+++ b/00189-add-rewheel-module.patch
@@ -75,7 +75,7 @@ unchanged:
unchanged:
--- Python-3.4.0rc3/Lib/ensurepip/rewheel/__init__.py 1970-01-01 01:00:00.000000000
+0100
+++ Python-3.4.0rc3-rewheel/Lib/ensurepip/rewheel/__init__.py 2014-03-12
09:55:30.413152104 +0100
-@@ -0,0 +1,133 @@
+@@ -0,0 +1,136 @@
+import argparse
+import csv
+import email.parser
@@ -126,7 +126,10 @@ unchanged:
+ # if we have 0 or 2 or more dirs, something is wrong...
+ if len(filtered) == 1:
+ path = filtered[0]
-+ records.append(os.path.join(path, 'RECORD'))
++ if path is not None:
++ records.append(os.path.join(path, 'RECORD'))
++ else:
++ records.append(None)
+ return records
+
+def rewheel_from_record(record_path, outdir):
diff --git a/python3.spec b/python3.spec
index d962c3f..c373aee 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -1396,8 +1396,8 @@ CheckPython() {
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
--verbose --findleaks \
- %ifarch %{arm}
- -x test_faulthandler test_gdb
+ %ifarch ppc64le
+ -x test_faulthandler
%endif
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1829,6 +1829,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue May 27 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-3
+- Update the rewheel module
+
* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
- Fix multilib dependencies.
Resolves: rhbz#1091815
commit c75d3be7c820e642618d317a468e3773de91c8ab
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Mon May 26 19:38:24 2014 +0200
Fix multilib dependencies.
Resolves: rhbz#1091815
diff --git a/python3.spec b/python3.spec
index 414c0c9..d962c3f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -743,7 +743,8 @@ This package contains files used to embed Python 3 into applications.
%package devel
Summary: Libraries and header files needed for Python 3 development
Group: Development/Libraries
-Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
Conflicts: %{name} < %{version}-%{release}
%description devel
@@ -1828,6 +1829,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon May 26 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.1-2
+- Fix multilib dependencies.
+Resolves: rhbz#1091815
+
* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
- Update to Python 3.4.1
commit e602f7a288df4597d9d1ae56d8c079da61f45c0e
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Mon May 26 00:20:13 2014 +0200
Update to Python 3.4.1
diff --git a/00190-fix-tests-with-sqlite-3.8.4.patch
b/00190-fix-tests-with-sqlite-3.8.4.patch
deleted file mode 100644
index 8a94f5c..0000000
--- a/00190-fix-tests-with-sqlite-3.8.4.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-
-# HG changeset patch
-# User Benjamin Peterson <benjamin(a)python.org>
-# Date 1394679139 18000
-# Node ID 4d626a9df062104b61c44c8a5be8b0fd52fae953
-# Parent 6f93ab911d5dafcde364013e21723259fe2c85a8# Parent
dbc9e3ed5e9f1bd11240eaa971f6c75d6a7013b5
-merge 3.3 (#20901)
-
-diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py
---- a/Lib/sqlite3/test/hooks.py
-+++ b/Lib/sqlite3/test/hooks.py
-@@ -162,7 +162,7 @@ class ProgressTests(unittest.TestCase):
- create table bar (a, b)
- """)
- second_count = len(progress_calls)
-- self.assertGreater(first_count, second_count)
-+ self.assertGreaterEqual(first_count, second_count)
-
- def CheckCancelOperation(self):
- """
-
diff --git a/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
b/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
deleted file mode 100644
index 4a82309..0000000
--- a/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-
-# HG changeset patch
-# User Brett Cannon <brett(a)python.org>
-# Date 1393602285 18000
-# Node ID 432cb56db05d73f55d211501bf0dfc767768923b
-# Parent ade5e4922a54cb84c99ec924ab7c700a014893da
-Issue #20778: Fix modulefinder to work with bytecode-only modules.
-
-Bug filed and initial attempt at a patch by Bohuslav Kabrda.
-
-diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
---- a/Lib/modulefinder.py
-+++ b/Lib/modulefinder.py
-@@ -290,7 +290,7 @@ class ModuleFinder:
- if fp.read(4) != imp.get_magic():
- self.msgout(2, "raise ImportError: Bad magic number",
pathname)
- raise ImportError("Bad magic number in %s" % pathname)
-- fp.read(4)
-+ fp.read(8) # Skip mtime and size.
- co = marshal.load(fp)
- else:
- co = None
-diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py
---- a/Lib/test/test_modulefinder.py
-+++ b/Lib/test/test_modulefinder.py
-@@ -1,5 +1,7 @@
- import os
- import errno
-+import importlib.machinery
-+import py_compile
- import shutil
- import unittest
- import tempfile
-@@ -208,6 +210,14 @@ a/module.py
- from . import *
- """]
-
-+bytecode_test = [
-+ "a",
-+ ["a"],
-+ [],
-+ [],
-+ ""
-+]
-+
-
- def open_file(path):
- dirname = os.path.dirname(path)
-@@ -288,6 +298,16 @@ class ModuleFinderTest(unittest.TestCase
- def test_relative_imports_4(self):
- self._do_test(relative_import_test_4)
-
-+ def test_bytecode(self):
-+ base_path = os.path.join(TEST_DIR, 'a')
-+ source_path = base_path + importlib.machinery.SOURCE_SUFFIXES[0]
-+ bytecode_path = base_path + importlib.machinery.BYTECODE_SUFFIXES[0]
-+ with open_file(source_path) as file:
-+ file.write('testing_modulefinder = True\n')
-+ py_compile.compile(source_path, cfile=bytecode_path)
-+ os.remove(source_path)
-+ self._do_test(bytecode_test)
-+
-
- def test_main():
- support.run_unittest(ModuleFinderTest)
diff --git a/python3.spec b/python3.spec
index f5c1464..414c0c9 100644
--- a/python3.spec
+++ b/python3.spec
@@ -127,8 +127,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.0
-Release: 8%{?dist}
+Version: %{pybasever}.1
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -650,14 +650,16 @@ Patch189: 00189-add-rewheel-module.patch
# Fix tests with SQLite >= 3.8.4
#
http://bugs.python.org/issue20901
#
http://hg.python.org/cpython/rev/4d626a9df062
-Patch190: 00190-fix-tests-with-sqlite-3.8.4.patch
+# FIXED UPSTREAM
+# Patch190: 00190-fix-tests-with-sqlite-3.8.4.patch
# 00193
#
# Skip correct number of *.pyc file bytes in ModuleFinder.load_module
# rhbz#1060338
#
http://bugs.python.org/issue20778
-Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
+# FIXED UPSTREAM
+# Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
# Tests requiring SIGHUP to work don't work in Koji
# see rhbz#1088233
@@ -946,8 +948,8 @@ done
%patch189 -p1
%endif
-%patch190 -p1
-%patch193 -p1
+# 00190: upstream as of Python 3.4.1
+# 00193: upstream as of Python 3.4.1
%patch194 -p1
%patch195 -p1
%patch196 -p1
@@ -1826,6 +1828,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.1-1
+- Update to Python 3.4.1
+
* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
- Fix test_gdb failure on ppc64le
Resolves: rhbz#1095355
diff --git a/sources b/sources
index 3f1acf8..f2258f0 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-77c22725e14af3d71022cbfdebff4903 Python-3.4.0.tar.xz
+6cafc183b4106476dd73d5738d7f616a Python-3.4.1.tar.xz
diff --git a/temporarily-disable-tests-requiring-SIGHUP.patch
b/temporarily-disable-tests-requiring-SIGHUP.patch
index 130970f..88ac230 100644
--- a/temporarily-disable-tests-requiring-SIGHUP.patch
+++ b/temporarily-disable-tests-requiring-SIGHUP.patch
@@ -8,8 +8,8 @@ diff -up Python-3.4.0/Lib/test/test_asyncio/test_events.py.orig
Python-3.4.0/Lib
- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
+ @unittest.skipIf(True, "Temporarily skipped (rhbz#1088233)")
def test_subprocess_send_signal(self):
- proto = None
- transp = None
+ prog = os.path.join(os.path.dirname(__file__), 'echo.py')
+
diff -up Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py.orig
Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py
--- Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py.orig 2014-04-17
12:03:32.777827520 +0200
commit da5702456fe9a29451b32c3985f9225a61671777
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Sun May 25 23:35:06 2014 +0200
Fix test_gdb failure on ppc64le (rhbz#1095355)
diff --git a/00196-test-gdb-match-addr-before-builtin.patch
b/00196-test-gdb-match-addr-before-builtin.patch
new file mode 100644
index 0000000..dc40c82
--- /dev/null
+++ b/00196-test-gdb-match-addr-before-builtin.patch
@@ -0,0 +1,30 @@
+Subject: python3.test gdb match addr before builtin
+From: Michel Normand <normand(a)linux.vnet.ibm.com>
+
+For ppc64le archi and python3... and gdb... versions
+the test_gdb.py need a change of re.match to handle address before the builtin_id word.
+Of course there is no error if this substring is not present.
+===
+...
+#0 0x00003fffb7dd0898 in builtin_id (self=<module at remote 0x3fffb7901440>,
v=<unknown at remote 0x3fffb7f68910>) at
/builddir/build/BUILD/Python-3.3.2/Python/bltinmodule.c:966
+....xxxxxxxxxxxxxxxxxxxxxx <= added regexp
+===
+
+Signed-off-by: Michel Normand <normand(a)linux.vnet.ibm.com>
+---
+ Lib/test/test_gdb.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: Python-3.3.2/Lib/test/test_gdb.py
+===================================================================
+--- Python-3.3.2.orig/Lib/test/test_gdb.py
++++ Python-3.3.2/Lib/test/test_gdb.py
+@@ -230,7 +230,7 @@ class DebuggerTests(unittest.TestCase):
+ # gdb can insert additional '\n' and space characters in various places
+ # in its output, depending on the width of the terminal it's connected
+ # to (using its "wrap_here" function)
+- m =
re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*',
++ m = re.match('.*#0\s+(?:
0x[0-9a-f]+\s+in\s+)?builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*',
+ gdb_output, re.DOTALL)
+ if not m:
+ self.fail('Unexpected gdb output: %r\n%s' % (gdb_output,
gdb_output))
diff --git a/python3.spec b/python3.spec
index e278396..f5c1464 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -670,6 +670,11 @@ Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
#
http://bugs.python.org/issue21121
Patch195: 00195-dont-add-Werror-declaration-after-statement.patch
+# 00196
+#
+# Fix test_gdb failure on ppc64le
+Patch196: 00196-test-gdb-match-addr-before-builtin.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -945,6 +950,7 @@ done
%patch193 -p1
%patch194 -p1
%patch195 -p1
+%patch196 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1820,6 +1826,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun May 25 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-8
+- Fix test_gdb failure on ppc64le
+Resolves: rhbz#1095355
+
* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
- Add macro %%python3_version_nodots
commit 8ab4c2d31ffea4398650ddb23c3c9f3048f5021b
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu May 22 13:25:18 2014 +0200
Add macro %python3_version_nodots
diff --git a/macros.python3 b/macros.python3
index d6d913c..395af00 100644
--- a/macros.python3
+++ b/macros.python3
@@ -2,4 +2,5 @@
%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
+%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
diff --git a/python3.spec b/python3.spec
index 123b7ad..e278396 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -1820,6 +1820,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.4.0-7
+- Add macro %%python3_version_nodots
+
* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
- Disable test_faulthandler, test_gdb on aarch64
Resolves: rhbz#1045193
commit c21eb4aa375e86f6c74e3ceee6b3461793ccf87d
Author: Miro Hronok <miro(a)hroncok.cz>
Date: Thu May 22 13:23:29 2014 +0200
Add macro %python3_version_nodots
diff --git a/macros.python3 b/macros.python3
index d6d913c..395af00 100644
--- a/macros.python3
+++ b/macros.python3
@@ -2,4 +2,5 @@
%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
+%python3_version_nodots %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3].replace('.',''))")
%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
diff --git a/python3.spec b/python3.spec
index 171a931..4fda253 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 13%{?dist}
+Release: 14%{?dist}
License: Python
Group: Development/Languages
@@ -1755,6 +1755,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 22 2014 Miro Hronok <mhroncok(a)redhat.com> - 3.3.2-14
+- Add macro %%python3_version_nodots
+
* Wed May 21 2014 Jaroslav karvada <jskarvad(a)redhat.com> - 3.3.2-13
- Rebuilt for
https://fedoraproject.org/wiki/Changes/f21tcl86
commit 3a3febacac01f9d9ebb2587eb93a4c76280cc930
Author: Jaroslav karvada <jskarvad(a)redhat.com>
Date: Wed May 21 12:35:44 2014 +0200
- Rebuilt for
https://fedoraproject.org/wiki/Changes/f21tcl86
diff --git a/python3.spec b/python3.spec
index 792c205..171a931 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
Group: Development/Languages
@@ -1755,6 +1755,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed May 21 2014 Jaroslav karvada <jskarvad(a)redhat.com> - 3.3.2-13
+- Rebuilt for
https://fedoraproject.org/wiki/Changes/f21tcl86
+
* Wed Mar 05 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-12
- Fix loading of pyc files by ModuleFinder.load_module.
Resolves: rhbz#1060338
commit 1746188b354ae0b1641dbeed2009913a63e538ae
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Sun May 18 23:39:35 2014 +0200
Disable test_faulthandler, test_gdb on aarch64 (rhbz#1045193)
diff --git a/python3.spec b/python3.spec
index 6425f47..123b7ad 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -1386,7 +1386,10 @@ CheckPython() {
# @unittest._expectedFailureInRpmBuild
WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- --verbose --findleaks
+ --verbose --findleaks \
+ %ifarch %{arm}
+ -x test_faulthandler test_gdb
+ %endif
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1817,6 +1820,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun May 18 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-6
+- Disable test_faulthandler, test_gdb on aarch64
+Resolves: rhbz#1045193
+
* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
- Don't add Werror=declaration-after-statement for extension
modules through setup.py (PyBT#21121)
commit 06247262fead50272b205e7b98e99450c31cacd3
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Fri May 16 15:11:42 2014 +0200
Don't add declaration-after-statement for extension modules
diff --git a/00195-dont-add-Werror-declaration-after-statement.patch
b/00195-dont-add-Werror-declaration-after-statement.patch
new file mode 100644
index 0000000..506d9ea
--- /dev/null
+++ b/00195-dont-add-Werror-declaration-after-statement.patch
@@ -0,0 +1,86 @@
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -71,12 +71,17 @@
+ BASECFLAGS= @BASECFLAGS@
+ BASECPPFLAGS= @BASECPPFLAGS@
+ CONFIGURE_CFLAGS= @CFLAGS@
++# CFLAGS_NODIST is used for building the interpreter and stdlib C extensions.
++# Use it when a compiler flag should _not_ be part of the distutils CFLAGS
++# once Python is installed (Issue #21121).
++CONFIGURE_CFLAGS_NODIST=@CFLAGS_NODIST@
+ CONFIGURE_CPPFLAGS= @CPPFLAGS@
+ CONFIGURE_LDFLAGS= @LDFLAGS@
+ # Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the
+ # command line to append to these values without stomping the pre-set
+ # values.
+ PY_CFLAGS= $(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)
++PY_CFLAGS_NODIST=$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST)
+ # Both CPPFLAGS and LDFLAGS need to contain the shell's value for setup.py to
+ # be able to build extension modules using the directories specified in the
+ # environment variables
+@@ -91,7 +96,7 @@
+ # Extra C flags added for building the interpreter object files.
+ CFLAGSFORSHARED=@CFLAGSFORSHARED@
+ # C flags used for building the interpreter object files
+-PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE
++PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)
-DPy_BUILD_CORE
+
+
+ # Machine-dependent subdirectories
+diff --git a/configure b/configure
+--- a/configure
++++ b/configure
+@@ -662,6 +662,7 @@
+ LIBTOOL_CRUFT
+ OTHER_LIBTOOL_OPT
+ UNIVERSAL_ARCH_FLAGS
++CFLAGS_NODIST
+ BASECFLAGS
+ OPT
+ ABIFLAGS
+@@ -6504,7 +6505,7 @@
+
+ if test $ac_cv_declaration_after_statement_warning = yes
+ then
+- BASECFLAGS="$BASECFLAGS -Werror=declaration-after-statement"
++ CFLAGS_NODIST="$CFLAGS_NODIST -Werror=declaration-after-statement"
+ fi
+
+ # if using gcc on alpha, use -mieee to get (near) full IEEE 754
+diff --git a/configure.ac b/configure.ac
+--- a/configure.ac
++++ b/configure.ac
+@@ -1147,6 +1147,7 @@
+ fi
+
+ AC_SUBST(BASECFLAGS)
++AC_SUBST(CFLAGS_NODIST)
+
+ # The -arch flags for universal builds on OSX
+ UNIVERSAL_ARCH_FLAGS=
+@@ -1231,7 +1232,7 @@
+
+ if test $ac_cv_declaration_after_statement_warning = yes
+ then
+- BASECFLAGS="$BASECFLAGS -Werror=declaration-after-statement"
++ CFLAGS_NODIST="$CFLAGS_NODIST -Werror=declaration-after-statement"
+ fi
+
+ # if using gcc on alpha, use -mieee to get (near) full IEEE 754
+diff --git a/setup.py b/setup.py
+--- a/setup.py
++++ b/setup.py
+@@ -19,6 +19,12 @@
+
+ cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
+
++# Add special CFLAGS reserved for building the interpreter and the stdlib
++# modules (Issue #21121).
++cflags = sysconfig.get_config_var('CFLAGS')
++py_cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST')
++sysconfig.get_config_vars()['CFLAGS'] = cflags + ' ' + py_cflags_nodist
++
+ def get_platform():
+ # cross build
+ if "_PYTHON_HOST_PLATFORM" in os.environ:
diff --git a/python3.spec b/python3.spec
index 4069f50..6425f47 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -663,6 +663,13 @@ Patch193:
00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
# see rhbz#1088233
Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
+# 00195
+#
+# Don't declare Werror=declaration-after-statement for extension
+# modules through setup.py
+#
http://bugs.python.org/issue21121
+Patch195: 00195-dont-add-Werror-declaration-after-statement.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -937,6 +944,7 @@ done
%patch190 -p1
%patch193 -p1
%patch194 -p1
+%patch195 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1809,6 +1817,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri May 16 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-5
+- Don't add Werror=declaration-after-statement for extension
+ modules through setup.py (PyBT#21121)
+
* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
- Add setuptools and pip to Requires
commit f498010aff91098dbc3b3e7f8eb364f0c9d2b39a
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Mon May 12 09:51:48 2014 +0200
Add setuptools and pip to Requires
diff --git a/python3.spec b/python3.spec
index 7878923..4069f50 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -701,6 +701,11 @@ Provides: python(abi) = %{pybasever}
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+%if 0%{with_rewheel}
+Requires: python-setuptools
+Requires: python-pip
+%endif
+
%description
Python 3 is a new version of the language that is incompatible with the 2.x
line of releases. The language is mostly the same, but many details, especially
@@ -1804,6 +1809,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon May 12 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-4
+- Add setuptools and pip to Requires
+
* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
- Point __os_install_post to correct brp-* files
commit 86b7a9ddd956a4f3f72ef992b05f58fab25a2d43
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Tue Apr 29 14:30:05 2014 +0200
Build with rewheel
diff --git a/python3.spec b/python3.spec
index 521cce6..7878923 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,7 +2,7 @@
# Conditionals and other variables controlling the build
# ======================================================
-%global with_rewheel 0
+%global with_rewheel 1
%global pybasever 3.4
commit 516eb7a2338eafeb82ac18519e0f530334b1339a
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Tue Apr 29 11:26:29 2014 +0200
Point __os_install_post to correct brp-* files
New version of redhat-rpm-cofig no longer contains them in
/usr/lib/rpm/redhat
diff --git a/python3.spec b/python3.spec
index 54b4f31..521cce6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -84,11 +84,11 @@
# (/usr/bin/python, rather than the freshly built python), thus leading to
# numerous syntax errors, and incorrect magic numbers in the .pyc files. We
# thus override __os_install_post to avoid invoking this script:
-%global __os_install_post /usr/lib/rpm/redhat/brp-compress \
- %{!?__debug_package:/usr/lib/rpm/redhat/brp-strip %{__strip}} \
- /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \
- /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \
- /usr/lib/rpm/redhat/brp-python-hardlink
+%global __os_install_post /usr/lib/rpm/brp-compress \
+ %{!?__debug_package:/usr/lib/rpm/brp-strip %{__strip}} \
+ /usr/lib/rpm/brp-strip-static-archive %{__strip} \
+ /usr/lib/rpm/brp-strip-comment-note %{__strip} %{__objdump} \
+ /usr/lib/rpm/brp-python-hardlink
# to remove the invocation of brp-python-bytecompile, whilst keeping the
# invocation of brp-python-hardlink (since this should still work for python3
# pyc/pyo files)
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -1804,6 +1804,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Apr 29 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-3
+- Point __os_install_post to correct brp-* files
+
* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
commit 7d579ea103c5cfaedfc229aea45f49db3dd0c361
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Fri Apr 18 09:50:21 2014 +0200
Temporarily disable tests requiring SIGHUP (rhbz#1088233)
diff --git a/python3.spec b/python3.spec
index e152006..54b4f31 100644
--- a/python3.spec
+++ b/python3.spec
@@ -128,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -659,6 +659,10 @@ Patch190: 00190-fix-tests-with-sqlite-3.8.4.patch
#
http://bugs.python.org/issue20778
Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
+# Tests requiring SIGHUP to work don't work in Koji
+# see rhbz#1088233
+Patch194: temporarily-disable-tests-requiring-SIGHUP.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -927,6 +931,7 @@ done
%patch190 -p1
%patch193 -p1
+%patch194 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1539,10 +1544,12 @@ rm -fr %{buildroot}
%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
%exclude %{pylibdir}/ensurepip/_bundled
+%if 0%{?with_rewheel}
%dir %{pylibdir}/ensurepip/rewheel/
%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
%{pylibdir}/ensurepip/rewheel/*.py
%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
+%endif
%{pylibdir}/html
%{pylibdir}/http
@@ -1797,6 +1804,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-2
+- Temporarily disable tests requiring SIGHUP (rhbz#1088233)
+
* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
- Update to Python 3.4 final
- Add patch adding the rewheel module
diff --git a/temporarily-disable-tests-requiring-SIGHUP.patch
b/temporarily-disable-tests-requiring-SIGHUP.patch
new file mode 100644
index 0000000..130970f
--- /dev/null
+++ b/temporarily-disable-tests-requiring-SIGHUP.patch
@@ -0,0 +1,25 @@
+diff -up Python-3.4.0/Lib/test/test_asyncio/test_events.py.orig
Python-3.4.0/Lib/test/test_asyncio/test_events.py
+--- Python-3.4.0/Lib/test/test_asyncio/test_events.py.orig 2014-04-15 13:18:49.696215288
+0200
++++ Python-3.4.0/Lib/test/test_asyncio/test_events.py 2014-04-15 13:18:56.104258453
+0200
+@@ -1528,7 +1528,7 @@ class SubprocessTestsMixin:
+ self.loop.run_until_complete(proto.completed)
+ self.check_terminated(proto.returncode)
+
+- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
++ @unittest.skipIf(True, "Temporarily skipped (rhbz#1088233)")
+ def test_subprocess_send_signal(self):
+ proto = None
+ transp = None
+
+diff -up Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py.orig
Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py
+--- Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py.orig 2014-04-17
12:03:32.777827520 +0200
++++ Python-3.4.0/Lib/test/test_asyncio/test_subprocess.py 2014-04-17 12:04:37.614210481
+0200
+@@ -108,7 +108,7 @@ class SubprocessMixin:
+ else:
+ self.assertEqual(-signal.SIGTERM, returncode)
+
+- @unittest.skipIf(sys.platform == 'win32', "Don't have
SIGHUP")
++ @unittest.skipIf(True, "Temporarily skipped (rhbz#1088233)")
+ def test_send_signal(self):
+ args = PROGRAM_BLOCKED
+ create = asyncio.create_subprocess_exec(*args, loop=self.loop)
commit c0b9737a796625319337578f2c29f8c7bf901a3b
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Tue Apr 15 11:07:53 2014 +0200
Upload new sources
diff --git a/sources b/sources
index acfd2af..3f1acf8 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-c94b78ea3b68a9bbc9906af4d5b4fdc7 Python-3.3.2.tar.xz
+77c22725e14af3d71022cbfdebff4903 Python-3.4.0.tar.xz
commit 11fb599edb14569b903abafeed7fd2349d96dfbf
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Tue Apr 15 09:52:32 2014 +0200
Update to Python 3.4 final
Also merge patches from master and add the rewheel module
diff --git a/00189-add-rewheel-module.patch b/00189-add-rewheel-module.patch
new file mode 100644
index 0000000..ad80e9f
--- /dev/null
+++ b/00189-add-rewheel-module.patch
@@ -0,0 +1,224 @@
+unchanged:
+--- Python-3.4.0rc3/Lib/ensurepip/__init__.py 2014-03-10 07:56:33.000000000 +0100
++++ Python-3.4.0rc3-rewheel/Lib/ensurepip/__init__.py 2014-03-12 09:57:12.917120853
+0100
+@@ -1,8 +1,10 @@
+ import os
+ import os.path
+ import pkgutil
++import shutil
+ import sys
+ import tempfile
++from ensurepip import rewheel
+
+
+ __all__ = ["version", "bootstrap"]
+@@ -38,6 +40,8 @@ def _run_pip(args, additional_paths=None
+
+ # Install the bundled software
+ import pip
++ if args[0] in ["install", "list", "wheel"]:
++ args.append('--pre')
+ pip.main(args)
+
+
+@@ -87,20 +90,40 @@ def bootstrap(*, root=None, upgrade=Fals
+ # omit pip and easy_install
+ os.environ["ENSUREPIP_OPTIONS"] = "install"
+
+- with tempfile.TemporaryDirectory() as tmpdir:
+- # Put our bundled wheels into a temporary directory and construct the
+- # additional paths that need added to sys.path
+- additional_paths = []
++ whls = []
++ rewheel_dir = None
++ # try to see if we have system-wide versions of _PROJECTS
++ dep_records = rewheel.find_system_records([p[0] for p in _PROJECTS])
++ # TODO: check if system-wide versions are the newest ones
++ # if --upgrade is used?
++ if all(dep_records):
++ # if we have all _PROJECTS installed system-wide, we'll recreate
++ # wheels from them and install those
++ rewheel_dir = tempfile.TemporaryDirectory()
++ for dr in dep_records:
++ new_whl = rewheel.rewheel_from_record(dr, rewheel_dir.name)
++ whls.append(os.path.join(rewheel_dir.name, new_whl))
++ else:
++ # if we don't have all the _PROJECTS installed system-wide,
++ # let's just fall back to bundled wheels
+ for project, version in _PROJECTS:
+- wheel_name = "{}-{}-py2.py3-none-any.whl".format(project,
version)
+- whl = pkgutil.get_data(
++ whl = os.path.join(
++ os.path.dirname(__file__),
+ "ensurepip",
+- "_bundled/{}".format(wheel_name),
++ "bundled",
++ "{}-{}-py2.py3-none-any.whl".format(project, version)
+ )
+- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
+- fp.write(whl)
++ whls.append(whl)
+
+- additional_paths.append(os.path.join(tmpdir, wheel_name))
++ with tempfile.TemporaryDirectory() as tmpdir:
++ # Put our bundled wheels into a temporary directory and construct the
++ # additional paths that need added to sys.path
++ additional_paths = []
++ for whl in whls:
++ shutil.copy(whl, tmpdir)
++ additional_paths.append(os.path.join(tmpdir, os.path.basename(whl)))
++ if rewheel_dir:
++ rewheel_dir.cleanup()
+
+ # Construct the arguments to be passed to the pip command
+ args = ["install", "--no-index", "--find-links",
tmpdir]
+unchanged:
+--- Python-3.4.0rc3/Lib/ensurepip/rewheel/__init__.py 1970-01-01 01:00:00.000000000
+0100
++++ Python-3.4.0rc3-rewheel/Lib/ensurepip/rewheel/__init__.py 2014-03-12
09:55:30.413152104 +0100
+@@ -0,0 +1,133 @@
++import argparse
++import csv
++import email.parser
++import os
++import io
++import re
++import site
++import subprocess
++import sys
++import zipfile
++
++def run():
++ parser = argparse.ArgumentParser(description='Recreate wheel of package with
given RECORD.')
++ parser.add_argument('record_path',
++ help='Path to RECORD file')
++ parser.add_argument('-o', '--output-dir',
++ help='Dir where to place the wheel, defaults to current
working dir.',
++ dest='outdir',
++ default=os.path.curdir)
++
++ ns = parser.parse_args()
++ retcode = 0
++ try:
++ print(rewheel_from_record(**vars(ns)))
++ except BaseException as e:
++ print('Failed: {}'.format(e))
++ retcode = 1
++ sys.exit(1)
++
++def find_system_records(projects):
++ """Return list of paths to RECORD files for system-installed
projects.
++
++ If a project is not installed, the resulting list contains None instead
++ of a path to its RECORD
++ """
++ records = []
++ # get system site-packages dirs
++ sys_sitepack = site.getsitepackages([sys.base_prefix, sys.base_exec_prefix])
++ sys_sitepack = [sp for sp in sys_sitepack if os.path.exists(sp)]
++ # try to find all projects in all system site-packages
++ for project in projects:
++ path = None
++ for sp in sys_sitepack:
++ dist_info_re = os.path.join(sp, project) +
'-[^\{0}]+\.dist-info'.format(os.sep)
++ candidates = [os.path.join(sp, p) for p in os.listdir(sp)]
++ # filter out candidate dirs based on the above regexp
++ filtered = [c for c in candidates if re.match(dist_info_re, c)]
++ # if we have 0 or 2 or more dirs, something is wrong...
++ if len(filtered) == 1:
++ path = filtered[0]
++ records.append(os.path.join(path, 'RECORD'))
++ return records
++
++def rewheel_from_record(record_path, outdir):
++ """Recreates a whee of package with given record_path and returns
path
++ to the newly created wheel."""
++ site_dir = os.path.dirname(os.path.dirname(record_path))
++ record_relpath = record_path[len(site_dir):].strip(os.path.sep)
++ to_write, to_omit = get_records_to_pack(site_dir, record_relpath)
++ new_wheel_name = get_wheel_name(record_path)
++ new_wheel_path = os.path.join(outdir, new_wheel_name + '.whl')
++
++ new_wheel = zipfile.ZipFile(new_wheel_path, mode='w',
compression=zipfile.ZIP_DEFLATED)
++ # we need to write a new record with just the files that we will write,
++ # e.g. not binaries and *.pyc/*.pyo files
++ new_record = io.StringIO()
++ writer = csv.writer(new_record)
++
++ # handle files that we can write straight away
++ for f, sha_hash, size in to_write:
++ new_wheel.write(os.path.join(site_dir, f), arcname=f)
++ writer.writerow([f, sha_hash,size])
++
++ # rewrite the old wheel file with a new computed one
++ writer.writerow([record_relpath, '', ''])
++ new_wheel.writestr(record_relpath, new_record.getvalue())
++
++ new_wheel.close()
++
++ return new_wheel.filename
++
++def get_wheel_name(record_path):
++ """Return proper name of the wheel, without .whl."""
++ wheel_info_path = os.path.join(os.path.dirname(record_path), 'WHEEL')
++ wheel_info = email.parser.Parser().parsestr(open(wheel_info_path).read())
++ metadata_path = os.path.join(os.path.dirname(record_path), 'METADATA')
++ metadata = email.parser.Parser().parsestr(open(metadata_path).read())
++
++ # construct name parts according to wheel spec
++ distribution = metadata.get('Name')
++ version = metadata.get('Version')
++ build_tag = '' # nothing for now
++ lang_tag = []
++ for t in wheel_info.get_all('Tag'):
++ lang_tag.append(t.split('-')[0])
++ lang_tag = '.'.join(lang_tag)
++ abi_tag, plat_tag = wheel_info.get('Tag').split('-')[1:3]
++ # leave out build tag, if it is empty
++ to_join = filter(None, [distribution, version, build_tag, lang_tag, abi_tag,
plat_tag])
++ return '-'.join(list(to_join))
++
++def get_records_to_pack(site_dir, record_relpath):
++ """Accepts path of sitedir and path of RECORD file relative to it.
++ Returns two lists:
++ - list of files that can be written to new RECORD straight away
++ - list of files that shouldn't be written or need some processing
++ (pyc and pyo files, scripts)
++ """
++ record_contents = open(os.path.join(site_dir, record_relpath)).read()
++ # temporary fix for
https://github.com/pypa/pip/issues/1376
++ # we need to ignore files under ".data" directory
++ data_dir = os.path.dirname(record_relpath).strip(os.path.sep)
++ data_dir = data_dir[:-len('dist-info')] + 'data'
++
++ to_write = []
++ to_omit = []
++ for l in record_contents.splitlines():
++ spl = l.split(',')
++ if len(spl) == 3:
++ # new record will omit (or write differently):
++ # - abs paths, paths with ".." (entry points),
++ # - pyc+pyo files
++ # - the old RECORD file
++ # TODO: is there any better way to recognize an entry point?
++ if os.path.isabs(spl[0]) or spl[0].startswith('..') or \
++ spl[0].endswith('.pyc') or spl[0].endswith('.pyo') or \
++ spl[0] == record_relpath or spl[0].startswith(data_dir):
++ to_omit.append(spl)
++ else:
++ to_write.append(spl)
++ else:
++ pass # bad RECORD or empty line
++ return to_write, to_omit
+only in patch2:
+unchanged:
+--- Python-3.4.0/Makefile.pre.in 2014-04-01 12:02:48.188136172 +0200
++++ Python-3.4.0-new/Makefile.pre.in 2014-04-01 12:03:23.770394025 +0200
+@@ -1140,7 +1140,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter
+ test/test_asyncio \
+ collections concurrent concurrent/futures encodings \
+ email email/mime test/test_email test/test_email/data \
+- ensurepip ensurepip/_bundled \
++ ensurepip ensurepip/_bundled ensurepip/rewheel \
+ html json test/test_json http dbm xmlrpc \
+ sqlite3 sqlite3/test \
+ logging csv wsgiref urllib \
diff --git a/00190-fix-tests-with-sqlite-3.8.4.patch
b/00190-fix-tests-with-sqlite-3.8.4.patch
new file mode 100644
index 0000000..8a94f5c
--- /dev/null
+++ b/00190-fix-tests-with-sqlite-3.8.4.patch
@@ -0,0 +1,21 @@
+
+# HG changeset patch
+# User Benjamin Peterson <benjamin(a)python.org>
+# Date 1394679139 18000
+# Node ID 4d626a9df062104b61c44c8a5be8b0fd52fae953
+# Parent 6f93ab911d5dafcde364013e21723259fe2c85a8# Parent
dbc9e3ed5e9f1bd11240eaa971f6c75d6a7013b5
+merge 3.3 (#20901)
+
+diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py
+--- a/Lib/sqlite3/test/hooks.py
++++ b/Lib/sqlite3/test/hooks.py
+@@ -162,7 +162,7 @@ class ProgressTests(unittest.TestCase):
+ create table bar (a, b)
+ """)
+ second_count = len(progress_calls)
+- self.assertGreater(first_count, second_count)
++ self.assertGreaterEqual(first_count, second_count)
+
+ def CheckCancelOperation(self):
+ """
+
diff --git a/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
b/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
new file mode 100644
index 0000000..4a82309
--- /dev/null
+++ b/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
@@ -0,0 +1,65 @@
+
+# HG changeset patch
+# User Brett Cannon <brett(a)python.org>
+# Date 1393602285 18000
+# Node ID 432cb56db05d73f55d211501bf0dfc767768923b
+# Parent ade5e4922a54cb84c99ec924ab7c700a014893da
+Issue #20778: Fix modulefinder to work with bytecode-only modules.
+
+Bug filed and initial attempt at a patch by Bohuslav Kabrda.
+
+diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
+--- a/Lib/modulefinder.py
++++ b/Lib/modulefinder.py
+@@ -290,7 +290,7 @@ class ModuleFinder:
+ if fp.read(4) != imp.get_magic():
+ self.msgout(2, "raise ImportError: Bad magic number",
pathname)
+ raise ImportError("Bad magic number in %s" % pathname)
+- fp.read(4)
++ fp.read(8) # Skip mtime and size.
+ co = marshal.load(fp)
+ else:
+ co = None
+diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py
+--- a/Lib/test/test_modulefinder.py
++++ b/Lib/test/test_modulefinder.py
+@@ -1,5 +1,7 @@
+ import os
+ import errno
++import importlib.machinery
++import py_compile
+ import shutil
+ import unittest
+ import tempfile
+@@ -208,6 +210,14 @@ a/module.py
+ from . import *
+ """]
+
++bytecode_test = [
++ "a",
++ ["a"],
++ [],
++ [],
++ ""
++]
++
+
+ def open_file(path):
+ dirname = os.path.dirname(path)
+@@ -288,6 +298,16 @@ class ModuleFinderTest(unittest.TestCase
+ def test_relative_imports_4(self):
+ self._do_test(relative_import_test_4)
+
++ def test_bytecode(self):
++ base_path = os.path.join(TEST_DIR, 'a')
++ source_path = base_path + importlib.machinery.SOURCE_SUFFIXES[0]
++ bytecode_path = base_path + importlib.machinery.BYTECODE_SUFFIXES[0]
++ with open_file(source_path) as file:
++ file.write('testing_modulefinder = True\n')
++ py_compile.compile(source_path, cfile=bytecode_path)
++ os.remove(source_path)
++ self._do_test(bytecode_test)
++
+
+ def test_main():
+ support.run_unittest(ModuleFinderTest)
diff --git a/python3.spec b/python3.spec
index 9967e52..e152006 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,14 +2,13 @@
# Conditionals and other variables controlling the build
# ======================================================
+%global with_rewheel 0
+
%global pybasever 3.4
# pybasever without the dot:
%global pyshortver 34
-# prereleasetag
-%global prerel rc2
-
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -129,7 +128,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: %{?prerel:0.}1%{?prerel:.%{prerel}}%{?dist}
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -187,12 +186,17 @@ BuildRequires: valgrind-devel
BuildRequires: xz-devel
BuildRequires: zlib-devel
+%if 0%{?with_rewheel}
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%endif
+
# =======================
# Source code and patches
# =======================
-Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}%{?prerel}.t...
+Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -632,6 +636,28 @@ Patch186: 00186-dont-raise-from-py_compile.patch
# relying on this will fail (test_filename_changing_on_output_single_dir)
Patch188: 00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
+# 00189 #
+#
+# Add the rewheel module, allowing to recreate wheels from already installed
+# ones
+#
https://github.com/bkabrda/rewheel
+%if 0%{with_rewheel}
+Patch189: 00189-add-rewheel-module.patch
+%endif
+
+# 00190 #
+#
+# Fix tests with SQLite >= 3.8.4
+#
http://bugs.python.org/issue20901
+#
http://hg.python.org/cpython/rev/4d626a9df062
+Patch190: 00190-fix-tests-with-sqlite-3.8.4.patch
+
+# 00193
+#
+# Skip correct number of *.pyc file bytes in ModuleFinder.load_module
+# rhbz#1060338
+#
http://bugs.python.org/issue20778
+Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
# (New patches go here ^^^)
#
@@ -895,6 +921,13 @@ done
# 00187: upstream as of Python 3.4.0b1
%patch188 -p1
+%if 0%{with_rewheel}
+%patch189 -p1
+%endif
+
+%patch190 -p1
+%patch193 -p1
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -1506,6 +1539,11 @@ rm -fr %{buildroot}
%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
%exclude %{pylibdir}/ensurepip/_bundled
+%dir %{pylibdir}/ensurepip/rewheel/
+%dir %{pylibdir}/ensurepip/rewheel/__pycache__/
+%{pylibdir}/ensurepip/rewheel/*.py
+%{pylibdir}/ensurepip/rewheel/__pycache__/*%{bytecode_suffixes}
+
%{pylibdir}/html
%{pylibdir}/http
%{pylibdir}/idlelib
@@ -1759,6 +1797,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Apr 15 2014 Matej Stuchlik <mstuchli(a)redhat.com> - 3.4.0-1
+- Update to Python 3.4 final
+- Add patch adding the rewheel module
+- Merge patches from master
+
* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
- Update to Python 3.4 beta 2.
- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
commit e9b7bf0d4baa2fa3a0ce39fc2377e5d5d9252639
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Fri Mar 7 10:59:27 2014 +0100
Update to Python 3.4 RC2
diff --git a/00141-fix-tests_with_COUNT_ALLOCS.patch
b/00141-fix-tests_with_COUNT_ALLOCS.patch
index 0c19f2a..7193a8d 100644
--- a/00141-fix-tests_with_COUNT_ALLOCS.patch
+++ b/00141-fix-tests_with_COUNT_ALLOCS.patch
@@ -99,21 +99,11 @@ diff -r e245b0d7209b Lib/test/test_module.py
def test_logging_at_shutdown(self):
# Issue #20037
code = """if 1:
---- a/Lib/test/test_threading.py.orig 2014-01-09 15:09:23.902063074 +0100
-+++ b/Lib/test/test_threading.py 2014-01-09 15:09:07.622085202 +0100
-@@ -617,6 +617,8 @@
- t.join()
- self.assertRaises(ValueError, bs.release)
-
-+ @unittest.skipIf(hasattr(sys, 'getcounts'),
-+ 'types are immortal if COUNT_ALLOCS is used')
- def test_locals_at_exit(self):
- # Issue #19466: thread locals must not be deleted before destructors
- # are called
---- a/Lib/test/test_warnings.py.orig 2014-01-09 15:10:12.454997100 +0100
-+++ b/Lib/test/test_warnings.py 2014-01-09 15:11:14.028913478 +0100
-@@ -801,6 +801,8 @@
- self.assertEqual(retcode, 0)
+
+--- a/Lib/test/test_warnings.py.orig 2014-01-09 15:10:12.454997100 +0100
++++ b/Lib/test/test_warnings.py 2014-01-09 15:11:14.028913478 +0100
+@@ -780,6 +780,8 @@
+ assert_python_ok('-c', 'pass', '-W',
'always', PYTHONPATH=cwd)
class FinalizationTest(unittest.TestCase):
+ @unittest.skipIf(hasattr(sys, 'getcounts'),
diff --git a/python3.spec b/python3.spec
index f40cf34..9967e52 100644
--- a/python3.spec
+++ b/python3.spec
@@ -8,7 +8,7 @@
%global pyshortver 34
# prereleasetag
-%global prerel b2
+%global prerel rc2
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
commit bdf58d653fed5fbb5ccd0d8ca8fd3691a1426c8e
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed Mar 5 09:02:54 2014 +0100
Fix loading of pyc files by ModuleFinder.load_module.
Resolves: rhbz#1060338
diff --git a/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
b/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
new file mode 100644
index 0000000..bdf2e75
--- /dev/null
+++ b/00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
@@ -0,0 +1,65 @@
+
+# HG changeset patch
+# User Brett Cannon <brett(a)python.org>
+# Date 1393602285 18000
+# Node ID 432cb56db05d73f55d211501bf0dfc767768923b
+# Parent ade5e4922a54cb84c99ec924ab7c700a014893da
+Issue #20778: Fix modulefinder to work with bytecode-only modules.
+
+Bug filed and initial attempt at a patch by Bohuslav Kabrda.
+
+diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py
+--- a/Lib/modulefinder.py
++++ b/Lib/modulefinder.py
+@@ -287,7 +287,7 @@ class ModuleFinder:
+ if fp.read(4) != imp.get_magic():
+ self.msgout(2, "raise ImportError: Bad magic number",
pathname)
+ raise ImportError("Bad magic number in %s" % pathname)
+- fp.read(4)
++ fp.read(8) # Skip mtime and size.
+ co = marshal.load(fp)
+ else:
+ co = None
+diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py
+--- a/Lib/test/test_modulefinder.py
++++ b/Lib/test/test_modulefinder.py
+@@ -1,5 +1,7 @@
+ import os
+ import errno
++import importlib.machinery
++import py_compile
+ import shutil
+ import unittest
+ import tempfile
+@@ -208,6 +210,14 @@ a/module.py
+ from . import *
+ """]
+
++bytecode_test = [
++ "a",
++ ["a"],
++ [],
++ [],
++ ""
++]
++
+
+ def open_file(path):
+ dirname = os.path.dirname(path)
+@@ -288,6 +298,16 @@ class ModuleFinderTest(unittest.TestCase
+ def test_relative_imports_4(self):
+ self._do_test(relative_import_test_4)
+
++ def test_bytecode(self):
++ base_path = os.path.join(TEST_DIR, 'a')
++ source_path = base_path + importlib.machinery.SOURCE_SUFFIXES[0]
++ bytecode_path = base_path + importlib.machinery.BYTECODE_SUFFIXES[0]
++ with open_file(source_path) as file:
++ file.write('testing_modulefinder = True\n')
++ py_compile.compile(source_path, cfile=bytecode_path)
++ os.remove(source_path)
++ self._do_test(bytecode_test)
++
+
+ def test_main():
+ support.run_unittest(ModuleFinderTest)
diff --git a/python3.spec b/python3.spec
index 272817b..792c205 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
Group: Development/Languages
@@ -635,6 +635,13 @@ Patch187: 00187-change-match_hostname-to-follow-RFC-6125.patch
# rhbz#1062375
Patch192: 00192-buffer-overflow.patch
+# 00193
+#
+# Skip correct number of *.pyc file bytes in ModuleFinder.load_module
+# rhbz#1060338
+#
http://bugs.python.org/issue20778
+Patch193: 00193-skip-correct-num-of-pycfile-bytes-in-modulefinder.patch
+
# (New patches go here ^^^)
#
@@ -898,6 +905,7 @@ done
%patch186 -p1
%patch187 -p1
%patch192 -p1
+%patch193 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1747,6 +1755,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Mar 05 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-12
+- Fix loading of pyc files by ModuleFinder.load_module.
+Resolves: rhbz#1060338
+
* Wed Feb 19 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-11
- Enable loading sqlite extensions.
Resolves: rhbz#1066938
commit b8daf7369b0668afc22cef128bfe97ae872d3ac8
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed Feb 19 14:30:28 2014 +0100
Enable loading sqlite extensions.
Resolves: rhbz#1066938
diff --git a/python3.spec b/python3.spec
index 34359f7..272817b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
Group: Development/Languages
@@ -978,6 +978,7 @@ BuildPython() {
--with-dbmliborder=gdbm:ndbm:bdb \
--with-system-expat \
--with-system-ffi \
+ --enable-loadable-sqlite-extensions \
%if 0%{?with_systemtap}
--with-systemtap \
%endif
@@ -1746,6 +1747,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Feb 19 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-11
+- Enable loading sqlite extensions.
+Resolves: rhbz#1066938
+
* Mon Feb 10 2014 Tomas Radej <tradej(a)redhat.com> - 3.3.2-10
- Fixed buffer overflow (upstream patch)
Resolves: rhbz#1062374
commit c8f16f3941f17a64cba4c418c37b4ebc857a8a49
Author: Tomas Radej <tradej(a)redhat.com>
Date: Mon Feb 10 14:42:12 2014 +0100
Fixed buffer overflow (upstream patch)
Resolves: rhbz#1062374
diff --git a/00192-buffer-overflow.patch b/00192-buffer-overflow.patch
new file mode 100644
index 0000000..73d3ece
--- /dev/null
+++ b/00192-buffer-overflow.patch
@@ -0,0 +1,42 @@
+
+# HG changeset patch
+# User Benjamin Peterson <benjamin(a)python.org>
+# Date 1389672775 18000
+# Node ID 7f176a45211ff3cb85a2fbdc75f7979d642bb563
+# Parent ed1c27b68068c942c6e845bdf8e987e963d50920# Parent
9c56217e5c793685eeaf0ee224848c402bdf1e4c
+merge 3.2 (#20246)
+
+diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
+--- a/Lib/test/test_socket.py
++++ b/Lib/test/test_socket.py
+@@ -4538,6 +4538,14 @@ class BufferIOTest(SocketConnectedTest):
+
+ _testRecvFromIntoMemoryview = _testRecvFromIntoArray
+
++ def testRecvFromIntoSmallBuffer(self):
++ # See issue #20246.
++ buf = bytearray(8)
++ self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
++
++ def _testRecvFromIntoSmallBuffer(self):
++ self.serv_conn.send(MSG*2048)
++
+
+ TIPC_STYPE = 2000
+ TIPC_LOWER = 200
+diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
+--- a/Modules/socketmodule.c
++++ b/Modules/socketmodule.c
+@@ -2935,6 +2935,11 @@ sock_recvfrom_into(PySocketSockObject *s
+ if (recvlen == 0) {
+ /* If nbytes was not specified, use the buffer's length */
+ recvlen = buflen;
++ } else if (recvlen > buflen) {
++ PyBuffer_Release(&pbuf);
++ PyErr_SetString(PyExc_ValueError,
++ "nbytes is greater than the length of the buffer");
++ return NULL;
+ }
+
+ readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
+
diff --git a/python3.spec b/python3.spec
index ff415ac..34359f7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -629,6 +629,13 @@ Patch186: 00186-dont-raise-from-py_compile.patch
# See
http://bugs.python.org/issue17997#msg194950 for more.
Patch187: 00187-change-match_hostname-to-follow-RFC-6125.patch
+# 00192 #
+#
+# Fixing buffer overflow (upstream patch)
+# rhbz#1062375
+Patch192: 00192-buffer-overflow.patch
+
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -890,6 +897,7 @@ done
%patch185 -p1
%patch186 -p1
%patch187 -p1
+%patch192 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1738,6 +1746,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Feb 10 2014 Tomas Radej <tradej(a)redhat.com> - 3.3.2-10
+- Fixed buffer overflow (upstream patch)
+Resolves: rhbz#1062374
+
* Tue Feb 04 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-9
- Install macros in _rpmconfigdir.
commit a39396d0b501df1ebf6ec6f010f8829919ce4665
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Tue Feb 4 13:35:09 2014 +0100
Install RPM macro files to proper directory.
diff --git a/python3.spec b/python3.spec
index caba63c..ff415ac 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -1232,9 +1232,9 @@ find %{buildroot} \
-perm 555 -exec chmod 755 {} \;
# Install macros for rpm:
-mkdir -p %{buildroot}/%{_sysconfdir}/rpm
-install -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/rpm
-install -m 644 %{SOURCE3} %{buildroot}/%{_sysconfdir}/rpm
+mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d/
+install -m 644 %{SOURCE2} %{buildroot}/%{_rpmconfigdir}/macros.d/
+install -m 644 %{SOURCE3} %{buildroot}/%{_rpmconfigdir}/macros.d/
# Ensure that the curses module was linked against libncursesw.so, rather than
# libncurses.so (bug 539917)
@@ -1577,8 +1577,8 @@ rm -fr %{buildroot}
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
-%{_sysconfdir}/rpm/macros.python3
-%{_sysconfdir}/rpm/macros.pybytecompile
+%{_rpmconfigdir}/macros.d/macros.python3
+%{_rpmconfigdir}/macros.d/macros.pybytecompile
%files tools
%defattr(-,root,root,755)
@@ -1738,6 +1738,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Feb 04 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-9
+- Install macros in _rpmconfigdir.
+
* Tue Nov 05 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-8
- Changed behavior of ssl.match_hostname() to follow RFC 6125 (rhbz#1023742)
commit db2025edc1db34cf911aacf07e32cc9cef189608
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Thu Jan 9 15:23:20 2014 +0100
Fix tests introduced in beta 2 failing because of COUNT_ALLOCS
diff --git a/00141-fix-tests_with_COUNT_ALLOCS.patch
b/00141-fix-tests_with_COUNT_ALLOCS.patch
index 44be26e..0c19f2a 100644
--- a/00141-fix-tests_with_COUNT_ALLOCS.patch
+++ b/00141-fix-tests_with_COUNT_ALLOCS.patch
@@ -68,3 +68,56 @@ diff -r e245b0d7209b Lib/test/test_module.py
def test_module_finalization_at_shutdown(self):
# Module globals and builtins should still be available during shutdown
rc, out, err = assert_python_ok("-c", "from test import
final_a")
+--- a/Lib/test/test_io.py.orig 2014-01-09 14:43:44.000000000 +0100
++++ b/Lib/test/test_io.py 2014-01-09 14:50:30.839597351 +0100
+@@ -2611,6 +2611,8 @@
+ """.format(iomod=iomod, kwargs=kwargs)
+ return assert_python_ok("-c", code)
+
++ @unittest.skipIf(hasattr(sys, 'getrefcount'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_create_at_shutdown_without_encoding(self):
+ rc, out, err = self._check_create_at_shutdown()
+ if err:
+@@ -2621,6 +2623,8 @@
+ else:
+ self.assertEqual("ok", out.decode().strip())
+
++ @unittest.skipIf(hasattr(sys, 'getrefcount'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_create_at_shutdown_with_encoding(self):
+ rc, out, err = self._check_create_at_shutdown(encoding='utf-8',
+ errors='strict')
+--- a/Lib/test/test_logging.py.orig 2014-01-09 14:53:07.016388198 +0100
++++ b/Lib/test/test_logging.py 2014-01-09 14:54:25.654282973 +0100
+@@ -3398,6 +3398,8 @@
+ logging.setLoggerClass(logging.Logger)
+ self.assertEqual(logging.getLoggerClass(), logging.Logger)
+
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_logging_at_shutdown(self):
+ # Issue #20037
+ code = """if 1:
+--- a/Lib/test/test_threading.py.orig 2014-01-09 15:09:23.902063074 +0100
++++ b/Lib/test/test_threading.py 2014-01-09 15:09:07.622085202 +0100
+@@ -617,6 +617,8 @@
+ t.join()
+ self.assertRaises(ValueError, bs.release)
+
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_locals_at_exit(self):
+ # Issue #19466: thread locals must not be deleted before destructors
+ # are called
+--- a/Lib/test/test_warnings.py.orig 2014-01-09 15:10:12.454997100 +0100
++++ b/Lib/test/test_warnings.py 2014-01-09 15:11:14.028913478 +0100
+@@ -801,6 +801,8 @@
+ self.assertEqual(retcode, 0)
+
+ class FinalizationTest(unittest.TestCase):
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_finalization(self):
+ # Issue #19421: warnings.warn() should not crash
+ # during Python finalization
diff --git a/python3.spec b/python3.spec
index efe5d3b..f40cf34 100644
--- a/python3.spec
+++ b/python3.spec
@@ -53,7 +53,7 @@
%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
-%global with_debug_build 0
+%global with_debug_build 1
%global with_gdb_hooks 1
@@ -345,8 +345,10 @@ Patch140: python3-arm-skip-failing-fragile-test.patch
# to be relevant for python3
# 00141 #
-# Fix test_gc and test_module tests for case when configured with COUNT_ALLOCS:
-#
http://bugs.python.org/issue19527
+# Fix tests for case when tests for case when configured with
+# COUNT_ALLOCS (debug build):
http://bugs.python.org/issue19527
+# Applies to: test_gc, test_module, test_io, test_logging, test_warnings,
+# test_threading
Patch141: 00141-fix-tests_with_COUNT_ALLOCS.patch
# 00143 #
commit de14a01ddc9cc2cd7a5209020ad5460c3dcab7a6
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed Jan 8 10:37:25 2014 +0100
Temporarily add BR: net-tools to workaround upstream reported test issue
diff --git a/python3.spec b/python3.spec
index 2053757..efe5d3b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -161,6 +161,8 @@ BuildRequires: libffi-devel
BuildRequires: libGL-devel
BuildRequires: libX11-devel
BuildRequires: ncurses-devel
+# workaround
http://bugs.python.org/issue19804 (test_uuid requires ifconfig)
+BuildRequires: net-tools
BuildRequires: openssl-devel
BuildRequires: pkgconfig
BuildRequires: readline-devel
commit 61fd48d1a4a485f80045c2291f182066e4857652
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed Jan 8 10:01:56 2014 +0100
Update to Python 3.4 beta 2.
- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index ddd5e77..3200c15 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -89,9 +89,9 @@ diff -up Python-3.3.0rc2/Doc/howto/index.rst.systemtap
Python-3.3.0rc2/Doc/howto
--- Python-3.3.0rc2/Doc/howto/index.rst.systemtap 2012-09-09 05:10:51.000000000 -0400
+++ Python-3.3.0rc2/Doc/howto/index.rst 2012-09-10 09:17:21.117511779 -0400
@@ -29,4 +29,5 @@ Currently, the HOWTOs are:
- webservers.rst
argparse.rst
ipaddress.rst
+ clinic.rst
+ instrumentation.rst
diff -up Python-3.3.0rc2/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0rc2/Doc/howto/instrumentation.rst
diff --git a/00114-statvfs-f_flag-constants.patch b/00114-statvfs-f_flag-constants.patch
deleted file mode 100644
index ea99e08..0000000
--- a/00114-statvfs-f_flag-constants.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-diff -up Python-3.3.0b1/Modules/posixmodule.c.statvfs-f_flag-constants
Python-3.3.0b1/Modules/posixmodule.c
---- Python-3.3.0b1/Modules/posixmodule.c.statvfs-f_flag-constants 2012-06-26
16:19:54.000000000 -0400
-+++ Python-3.3.0b1/Modules/posixmodule.c 2012-07-20 13:39:18.595546387 -0400
-@@ -11665,6 +11665,35 @@ all_ins(PyObject *d)
- if (PyModule_AddIntMacro(m, ST_NOSUID)) return -1;
- #endif /* ST_NOSUID */
-
-+ /* GNU extensions */
-+#ifdef ST_NODEV
-+ if (PyModule_AddIntMacro(m, ST_NODEV)) return -1;
-+#endif /* ST_NODEV */
-+#ifdef ST_NOEXEC
-+ if (PyModule_AddIntMacro(m, ST_NOEXEC)) return -1;
-+#endif /* ST_NOEXEC */
-+#ifdef ST_SYNCHRONOUS
-+ if (PyModule_AddIntMacro(m, ST_SYNCHRONOUS)) return -1;
-+#endif /* ST_SYNCHRONOUS */
-+#ifdef ST_MANDLOCK
-+ if (PyModule_AddIntMacro(m, ST_MANDLOCK)) return -1;
-+#endif /* ST_MANDLOCK */
-+#ifdef ST_WRITE
-+ if (PyModule_AddIntMacro(m, ST_WRITE)) return -1;
-+#endif /* ST_WRITE */
-+#ifdef ST_APPEND
-+ if (PyModule_AddIntMacro(m, ST_APPEND)) return -1;
-+#endif /* ST_APPEND */
-+#ifdef ST_NOATIME
-+ if (PyModule_AddIntMacro(m, ST_NOATIME)) return -1;
-+#endif /* ST_NOATIME */
-+#ifdef ST_NODIRATIME
-+ if (PyModule_AddIntMacro(m, ST_NODIRATIME)) return -1;
-+#endif /* ST_NODIRATIME */
-+#ifdef ST_RELATIME
-+ if (PyModule_AddIntMacro(m, ST_RELATIME)) return -1;
-+#endif /* ST_RELATIME */
-+
- /* FreeBSD sendfile() constants */
- #ifdef SF_NODISKIO
- if (PyModule_AddIntMacro(m, SF_NODISKIO)) return -1;
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index 7cd79ef..3d92c34 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -167,7 +167,7 @@
constructors.add(_test_algorithm_via_hashlib_new)
_hashlib = self._conditional_import_module('_hashlib')
-@@ -82,26 +107,13 @@
+@@ -82,26 +107,12 @@
for algorithm, constructors in self.constructors_to_test.items():
constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
if constructor:
@@ -192,10 +192,9 @@
- if _sha512:
- add_builtin_constructor('sha384')
- add_builtin_constructor('sha512')
-+ # TODO: remove this after sha3 is available through OpenSSL
- _sha3 = self._conditional_import_module('_sha3')
- if _sha3:
- add_builtin_constructor('sha3_224')
+
+ super(HashLibTestCase, self).__init__(*args, **kwargs)
+
@@ -157,9 +169,6 @@
else:
del sys.modules['_md5']
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
index 87c9396..8b0a76c 100644
--- a/00153-fix-test_gdb-noise.patch
+++ b/00153-fix-test_gdb-noise.patch
@@ -19,8 +19,8 @@
--- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
+++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
@@ -144,6 +153,10 @@
- '"set sysroot"?',
- 'warning: Source file is more recent than executable.',
+ 'Missing separate debuginfo for ',
+ 'Try: zypper install -C ',
)
+ ignore_patterns += ('warning: Unable to open',
+ 'Missing separate debuginfo for',
diff --git a/00177-platform-unicode.patch b/00177-platform-unicode.patch
deleted file mode 100644
index 7d847e1..0000000
--- a/00177-platform-unicode.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: Python-3.3.0/Lib/platform.py
-===================================================================
---- Python-3.3.0.orig/Lib/platform.py
-+++ Python-3.3.0/Lib/platform.py
-@@ -331,7 +331,7 @@ def linux_distribution(distname='', vers
- return _dist_try_harder(distname,version,id)
-
- # Read the first line
-- with open('/etc/'+file, 'r') as f:
-+ with open('/etc/'+file, 'r', encoding='utf-8',
errors='surrogateescape') as f:
- firstline = f.readline()
- _distname, _version, _id = _parse_release_file(firstline)
-
diff --git a/python3.spec b/python3.spec
index d53f8eb..2053757 100644
--- a/python3.spec
+++ b/python3.spec
@@ -8,7 +8,7 @@
%global pyshortver 34
# prereleasetag
-%global prerel b1
+%global prerel b2
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -53,7 +53,7 @@
%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
-%global with_debug_build 1
+%global with_debug_build 0
%global with_gdb_hooks 1
@@ -266,10 +266,8 @@ Patch111: 00111-no-static-lib.patch
Patch113: 00113-more-configuration-flags.patch
# 00114 #
-# Add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
-# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
-# Not yet sent upstream
-Patch114: 00114-statvfs-f_flag-constants.patch
+# Upstream as of Python 3.4.0.b2
+# Patch114: 00114-statvfs-f_flag-constants.patch
# 00125 #
# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
@@ -381,9 +379,13 @@ Patch143: 00143-tsc-on-ppc.patch
# - don't build the _md5 and _sha* modules; rely on the _hashlib implementation
# of hashlib
# (rhbz#563986)
-# Note: for now we're using sha3 from Python tarball, not from OpenSSL, since
-# OpenSSL didn't implement it yet. When OpenSSL implements it again,
-# we will need to rm -rf Modules/_sha3 in prep and adapt the patch.
+# Note: Up to Python 3.4.0.b1, upstream had their own implementation of what
+# they assumed would become sha3. This patch was adapted to give it the
+# usedforsecurity argument, even though it did nothing (OpenSSL didn't have
+# sha3 implementation at that time).In 3.4.0.b2, sha3 implementation was reverted
+# (see
http://bugs.python.org/issue16113), but the alterations were left in the
+# patch, since they may be useful again if upstream decides to rerevert sha3
+# implementation and OpenSSL still doesn't support it. For now, they're
harmless.
Patch146: 00146-hashlib-fips.patch
# 00147 #
@@ -550,11 +552,8 @@ Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
# Patch176: 00176-upstream-issue16754-so-extension.patch
# 00177 #
-# Patch for potential unicode error when determining OS release names
-#
http://bugs.python.org/issue17429
-# (rhbz#922149)
-# Does not affect python2 (python2 uses a byte string so it doesn't need to decode)
-Patch177: 00177-platform-unicode.patch
+# Fixed upstream as of Python 3.4.0.b2
+# Patch177: 00177-platform-unicode.patch
# 00178 #
# Don't duplicate various FLAGS in sysconfig values
@@ -820,7 +819,7 @@ done
%patch111 -p1
# 112: not for python3
%patch113 -p1
-%patch114 -p1
+# 00114: Upstream as of Python 3.4.0.b2
%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
@@ -879,7 +878,7 @@ done
#00174: TODO
# 00175: upstream as of Python 3.3.2
# 00176: upstream as of Python 3.3.1
-%patch177 -p1
+# 00177: upstream as of Python 3.4.0.b2
%patch178 -p1
%patch179 -p1
%patch180 -p1
@@ -1413,8 +1412,6 @@ rm -fr %{buildroot}
%{dynload_dir}/_pickle.%{SOABI_optimized}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
%{dynload_dir}/_random.%{SOABI_optimized}.so
-# TODO: remove _sha3 when it reaches OpenSSL
-%{dynload_dir}/_sha3.%{SOABI_optimized}.so
%{dynload_dir}/_socket.%{SOABI_optimized}.so
%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
%{dynload_dir}/_ssl.%{SOABI_optimized}.so
@@ -1681,8 +1678,6 @@ rm -fr %{buildroot}
%{dynload_dir}/_pickle.%{SOABI_debug}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
%{dynload_dir}/_random.%{SOABI_debug}.so
-# TODO: remove _sha3 when it reaches OpenSSL
-%{dynload_dir}/_sha3.%{SOABI_debug}.so
%{dynload_dir}/_socket.%{SOABI_debug}.so
%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
%{dynload_dir}/_ssl.%{SOABI_debug}.so
@@ -1760,6 +1755,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Jan 08 2014 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b2
+- Update to Python 3.4 beta 2.
+- Refreshed patches: 55 (systemtap), 146 (hashlib-fips), 154 (test_gdb noise)
+- Dropped patches: 114 (statvfs constants), 177 (platform unicode)
+
* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
- Update to Python 3.4 beta 1.
- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
commit 3aee76e8b684942740e3b2600f3817f0ae0c3529
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Thu Nov 28 10:43:42 2013 +0100
Add opcode module to %files
diff --git a/python3.spec b/python3.spec
index 41beef6..d53f8eb 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1409,6 +1409,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_lzma.%{SOABI_optimized}.so
%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
+%{dynload_dir}/_opcode.%{SOABI_optimized}.so
%{dynload_dir}/_pickle.%{SOABI_optimized}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
%{dynload_dir}/_random.%{SOABI_optimized}.so
@@ -1676,6 +1677,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_lzma.%{SOABI_debug}.so
%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
+%{dynload_dir}/_opcode.%{SOABI_debug}.so
%{dynload_dir}/_pickle.%{SOABI_debug}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
%{dynload_dir}/_random.%{SOABI_debug}.so
commit cb97d2916653265a7d7a033b14f406d9031a772a
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Thu Nov 28 10:27:48 2013 +0100
Use --without-ensurepip configuration option for now.
diff --git a/python3.spec b/python3.spec
index 1e61ab1..41beef6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1003,9 +1003,9 @@ BuildPython debug \
python-debug \
python%{pybasever}-debug \
%ifarch %{ix86} x86_64 ppc %{power64}
- "--with-pydebug --with-tsc --with-count-allocs --with-call-profile" \
+ "--with-pydebug --with-tsc --with-count-allocs --with-call-profile
--without-ensurepip" \
%else
- "--with-pydebug --with-count-allocs --with-call-profile" \
+ "--with-pydebug --with-count-allocs --with-call-profile --without-ensurepip"
\
%endif
false
%endif # with_debug_build
@@ -1013,7 +1013,7 @@ BuildPython debug \
BuildPython optimized \
python \
python%{pybasever} \
- "" \
+ "--without-ensurepip" \
true
# ======================================================
@@ -1497,6 +1497,13 @@ rm -fr %{buildroot}
%doc %{pylibdir}/email/architecture.rst
%{pylibdir}/encodings
+
+%dir %{pylibdir}/ensurepip/
+%dir %{pylibdir}/ensurepip/__pycache__/
+%{pylibdir}/ensurepip/*.py
+%{pylibdir}/ensurepip/__pycache__/*%{bytecode_suffixes}
+%exclude %{pylibdir}/ensurepip/_bundled
+
%{pylibdir}/html
%{pylibdir}/http
%{pylibdir}/idlelib
commit 8fffc96443cc58c2b1c819a4b94166e5b88ba643
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Thu Nov 28 10:07:21 2013 +0100
Fix the hashlib-fips patch to work flawlessly once again
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index b4d38c7..7cd79ef 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -109,12 +109,16 @@
del __always_supported, __func_name, __get_hash
del __py_new, __hash_new, __get_openssl_constructor
+del __ignore_usedforsecurity
---- Python-3.4.0b1/Lib/test/test_hashlib.py.hashlib-fips 2013-11-24 21:36:55.000000000
+0100
-+++ Python-3.4.0b1/Lib/test/test_hashlib.py 2013-11-27 11:55:42.769601363 +0100
-@@ -26,6 +26,20 @@
- c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
- py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
+--- Python-3.4.0b1/Lib/test/test_hashlib.py 2013-11-27 11:55:42.769601363 +0100
++++ Python-3.4.0b1/Lib/test/test_hashlib.py 2013-11-28 09:33:03.929008508 +0100
+@@ -24,7 +24,22 @@
+ COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
+ c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
+-py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
++# skipped on Fedora, since we always use OpenSSL implementation
++# py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
++
+def openssl_enforces_fips():
+ # Use the "openssl" command (if present) to try to determine if the local
+ # OpenSSL is configured to enforce FIPS
@@ -128,11 +132,10 @@
+ stdout, stderr = p.communicate(input=b'abc')
+ return b'unknown cipher' in stderr
+OPENSSL_ENFORCES_FIPS = openssl_enforces_fips()
-+
+
def hexstr(s):
assert isinstance(s, bytes), repr(s)
- h = "0123456789abcdef"
-@@ -34,6 +48,16 @@
+@@ -34,6 +49,16 @@
r += h[(i >> 4) & 0xF] + h[i & 0xF]
return r
@@ -149,7 +152,7 @@
class HashLibTestCase(unittest.TestCase):
supported_hash_names = ( 'md5', 'MD5', 'sha1',
'SHA1',
-@@ -66,11 +90,11 @@
+@@ -66,11 +91,11 @@
# For each algorithm, test the direct constructor and the use
# of hashlib.new given the algorithm name.
for algorithm, constructors in self.constructors_to_test.items():
@@ -164,7 +167,7 @@
constructors.add(_test_algorithm_via_hashlib_new)
_hashlib = self._conditional_import_module('_hashlib')
-@@ -82,27 +106,13 @@
+@@ -82,26 +107,13 @@
for algorithm, constructors in self.constructors_to_test.items():
constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
if constructor:
@@ -189,12 +192,21 @@
- if _sha512:
- add_builtin_constructor('sha384')
- add_builtin_constructor('sha512')
-- _sha3 = self._conditional_import_module('_sha3')
+ # TODO: remove this after sha3 is available through OpenSSL
+ _sha3 = self._conditional_import_module('_sha3')
if _sha3:
add_builtin_constructor('sha3_224')
- add_builtin_constructor('sha3_256')
-@@ -558,6 +568,65 @@
+@@ -157,9 +169,6 @@
+ else:
+ del sys.modules['_md5']
+ self.assertRaises(TypeError, get_builtin_constructor, 3)
+- constructor = get_builtin_constructor('md5')
+- self.assertIs(constructor, _md5.md5)
+- self.assertEqual(sorted(builtin_constructor_cache), ['MD5',
'md5'])
+
+ def test_hexdigest(self):
+ for cons in self.hash_constructors:
+@@ -558,6 +567,65 @@
self.assertEqual(expected_hash, hasher.hexdigest())
@@ -260,7 +272,7 @@
class KDFTests(unittest.TestCase):
-@@ -639,6 +708,7 @@
+@@ -639,6 +707,7 @@
with self.assertRaisesRegex(ValueError, 'unsupported hash type'):
pbkdf2('unknown', b'pass', b'salt', 1)
commit aa3d055181c5413be4735d5c4cf3684a72195b79
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed Nov 27 13:42:09 2013 +0100
Add __ignore_usedforsecurity to patch 00146 (accidentaly omitted when rebasing
patch).
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index f2cd3db..b4d38c7 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -17,7 +17,27 @@
Hash objects have these methods:
- update(arg): Update the hash object with the bytes in arg. Repeated calls
are equivalent to a single call with the concatenation of all
-@@ -108,34 +118,41 @@
+@@ -63,6 +73,19 @@
+ __all__ = __always_supported + ('new', 'algorithms_guaranteed',
+ 'algorithms_available', 'pbkdf2_hmac')
+
++import functools
++def __ignore_usedforsecurity(func):
++ """Used for sha3_* functions. Until OpenSSL implements them, we want
++ to use them from Python _sha3 module, but we want them to accept
++ usedforsecurity argument too."""
++ # TODO: remove this function when OpenSSL implements sha3
++ @functools.wraps(func)
++ def inner(*args, **kwargs):
++ if 'usedforsecurity' in kwargs:
++ kwargs.pop('usedforsecurity')
++ return func(*args, **kwargs)
++ return inner
++
+
+ __builtin_constructor_cache = {}
+
+@@ -108,34 +131,41 @@
f = getattr(_hashlib, 'openssl_' + name)
# Allow the C module to raise ValueError. The function will be
# defined but the hash not actually available thanks to OpenSSL.
@@ -72,7 +92,7 @@
try:
import _hashlib
new = __hash_new
-@@ -215,7 +232,10 @@
+@@ -215,7 +245,10 @@
# try them all, some may not work due to the OpenSSL
# version not supporting that algorithm.
try:
@@ -84,7 +104,7 @@
except ValueError:
import logging
logging.exception('code for hash %s was not found.', __func_name)
-@@ -223,3 +243,4 @@
+@@ -223,3 +256,4 @@
# Cleanup locals()
del __always_supported, __func_name, __get_hash
del __py_new, __hash_new, __get_openssl_constructor
commit 0ef730720cd7ab286ed38a1762ea96783577ba7e
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed Nov 27 13:33:51 2013 +0100
Fix typo in lib64 patch
diff --git a/00102-lib64.patch b/00102-lib64.patch
index 8f21624..db5fd95 100644
--- a/00102-lib64.patch
+++ b/00102-lib64.patch
@@ -132,7 +132,7 @@
_prefix = _Py_char2wchar(PREFIX, NULL);
_exec_prefix = _Py_char2wchar(EXEC_PREFIX, NULL);
- lib_python = _Py_char2wchar("lib/python" VERSION, NULL);
-+ lib_python = _Py_char2wchar("lib/python64" VERSION, NULL);
++ lib_python = _Py_char2wchar("lib64/python" VERSION, NULL);
if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
Py_FatalError(
commit bf351679373737f7b826b0840533b203eb15e4e4
Author: Slavek Kabrda <bkabrda(a)redhat.com>
Date: Wed Nov 27 13:03:43 2013 +0100
Update to Python 3.4 beta 1.
- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
- Removed patch 00187 (remove pthread atfork; upstreamed)
diff --git a/00102-lib64.patch b/00102-lib64.patch
new file mode 100644
index 0000000..8f21624
--- /dev/null
+++ b/00102-lib64.patch
@@ -0,0 +1,192 @@
+--- Python-3.4.0b1/Lib/distutils/command/install.py.lib64 2013-11-24
21:36:54.000000000 +0100
++++ Python-3.4.0b1/Lib/distutils/command/install.py 2013-11-27 11:10:43.821150774
+0100
+@@ -45,14 +45,14 @@ else:
+ 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',
+--- Python-3.4.0b1/Lib/distutils/sysconfig.py.lib64 2013-11-24 21:36:54.000000000 +0100
++++ Python-3.4.0b1/Lib/distutils/sysconfig.py 2013-11-27 11:10:43.821150774 +0100
+@@ -141,8 +141,12 @@
+ 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:
+--- Python-3.4.0b1/Lib/site.py.lib64 2013-11-24 21:36:54.000000000 +0100
++++ Python-3.4.0b1/Lib/site.py 2013-11-27 11:10:43.822150773 +0100
+@@ -304,12 +304,16 @@
+ 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" + sys.version[:3],
+ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
+ else:
+ sitepackages.append(prefix)
++ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
+ if sys.platform == "darwin":
+ # for framework builds *only* we add the standard Apple
+--- Python-3.4.0b1/Lib/sysconfig.py.lib64 2013-11-24 21:36:54.000000000 +0100
++++ Python-3.4.0b1/Lib/sysconfig.py 2013-11-27 11:10:43.822150773 +0100
+@@ -20,10 +20,10 @@
+
+ _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':
+@@ -61,10 +61,10 @@
+ '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}',
+--- Python-3.4.0b1/Lib/test/test_site.py.lib64 2013-11-24 21:36:55.000000000 +0100
++++ Python-3.4.0b1/Lib/test/test_site.py 2013-11-27 11:10:43.822150773 +0100
+@@ -244,12 +244,15 @@
+ self.assertEqual(dirs[2], wanted)
+ elif os.sep == '/':
+ # OS X non-framwework builds, Linux, FreeBSD, etc
+- self.assertEqual(len(dirs), 2)
+- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ self.assertEqual(len(dirs), 3)
++ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
+ 'site-packages')
+ self.assertEqual(dirs[0], wanted)
+- wanted = os.path.join('xoxo', 'lib', 'site-python')
++ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ 'site-packages')
+ self.assertEqual(dirs[1], wanted)
++ wanted = os.path.join('xoxo', 'lib', 'site-python')
++ self.assertEqual(dirs[2], wanted)
+ else:
+ # other platforms
+ self.assertEqual(len(dirs), 2)
+--- Python-3.4.0b1/Makefile.pre.in.lib64 2013-11-27 11:10:43.814150786 +0100
++++ Python-3.4.0b1/Makefile.pre.in 2013-11-27 11:10:43.823150771 +0100
+@@ -115,7 +115,7 @@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/lib64
+ ABIFLAGS= @ABIFLAGS@
+
+ # Detailed destination directories
+--- Python-3.4.0b1/Modules/getpath.c.lib64 2013-11-24 21:36:56.000000000 +0100
++++ Python-3.4.0b1/Modules/getpath.c 2013-11-27 11:17:33.619449704 +0100
+@@ -122,8 +122,8 @@
+ #endif
+
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
++ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
+ #endif
+
+ #ifndef LANDMARK
+@@ -498,7 +498,7 @@
+ _pythonpath = _Py_char2wchar(PYTHONPATH, NULL);
+ _prefix = _Py_char2wchar(PREFIX, NULL);
+ _exec_prefix = _Py_char2wchar(EXEC_PREFIX, NULL);
+- lib_python = _Py_char2wchar("lib/python" VERSION, NULL);
++ lib_python = _Py_char2wchar("lib/python64" VERSION, NULL);
+
+ if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
+ Py_FatalError(
+@@ -687,7 +687,7 @@
+ }
+ else
+ wcsncpy(zip_path, _prefix, MAXPATHLEN);
+- joinpath(zip_path, L"lib/python00.zip");
++ joinpath(zip_path, L"lib64/python00.zip");
+ bufsz = wcslen(zip_path); /* Replace "00" with version */
+ zip_path[bufsz - 6] = VERSION[0];
+ zip_path[bufsz - 5] = VERSION[2];
+@@ -699,7 +699,7 @@
+ fprintf(stderr,
+ "Could not find platform dependent libraries
<exec_prefix>\n");
+ wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
+- joinpath(exec_prefix, L"lib/lib-dynload");
++ joinpath(exec_prefix, L"lib64/lib-dynload");
+ }
+ /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+
+--- Python-3.4.0b1/setup.py.lib64 2013-11-24 21:36:56.000000000 +0100
++++ Python-3.4.0b1/setup.py 2013-11-27 11:10:43.824150769 +0100
+@@ -441,7 +441,7 @@
+ # directories (i.e. '.' and 'Include') must be first. See
issue
+ # 10520.
+ if not cross_compiling:
+- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
++ add_dir_to_list(self.compiler.library_dirs, '/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:
+@@ -718,11 +718,11 @@
+ elif curses_library:
+ readline_libs.append(curses_library)
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/lib64/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( 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:
+@@ -759,8 +759,8 @@
+ if krb5_h:
+ ssl_incs += krb5_h
+ ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
+- ['/usr/local/ssl/lib',
+- '/usr/contrib/ssl/lib/'
++ ['/usr/local/ssl/lib64',
++ '/usr/contrib/ssl/lib64/'
+ ] )
+
+ if (ssl_incs is not None and
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index f74bc87..bd1bc40 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -2,7 +2,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
--- cpython-59223da36dec/Makefile.pre.in.no-static-lib 2012-08-07 16:43:43.296466422
-0400
+++ cpython-59223da36dec/Makefile.pre.in 2012-08-07 16:44:13.299464371 -0400
@@ -464,7 +464,7 @@ coverage:
- $(MAKE) coverage-lcov
+ $(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make
# Build the interpreter
-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
diff --git a/00125-less-verbose-COUNT_ALLOCS.patch
b/00125-less-verbose-COUNT_ALLOCS.patch
index 8cef015..8e441a2 100644
--- a/00125-less-verbose-COUNT_ALLOCS.patch
+++ b/00125-less-verbose-COUNT_ALLOCS.patch
@@ -16,5 +16,5 @@ diff -up Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS
Python-2.7/Pyth
+ if (Py_GETENV("PYTHONDUMPCOUNTS"))
+ dump_counts(stdout);
#endif
-
- PRINT_TOTAL_REFS();
+ /* dump hash stats */
+ _PyHash_Fini();
diff --git a/00141-fix-tests_with_COUNT_ALLOCS.patch
b/00141-fix-tests_with_COUNT_ALLOCS.patch
index b60ee69..44be26e 100644
--- a/00141-fix-tests_with_COUNT_ALLOCS.patch
+++ b/00141-fix-tests_with_COUNT_ALLOCS.patch
@@ -60,8 +60,8 @@ diff -r e245b0d7209b Lib/test/test_module.py
m = ModuleType("foo")
wr = weakref.ref(m)
@@ -190,6 +194,8 @@
- self.assertEqual(r[:25], "<module 'unittest' from '")
- self.assertEqual(r[-13:], "__init__.py'>")
+ self.assertEqual(r[-len(ends_with):], ends_with,
+ '{!r} does not end with {!r}'.format(r, ends_with))
+ @unittest.skipIf(hasattr(sys, 'getcounts'),
+ 'skipping since COUNT_ALLOCS was used, see issue19527')
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index 221ab50..f2cd3db 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -1,5 +1,5 @@
---- Python-3.4.0a4/Lib/hashlib.py.hashlib-fips 2013-11-07 13:29:43.046881440 +0100
-+++ Python-3.4.0a4/Lib/hashlib.py 2013-11-07 13:42:04.438486289 +0100
+--- Python-3.4.0b1/Lib/hashlib.py.hashlib-fips 2013-11-24 21:36:54.000000000 +0100
++++ Python-3.4.0b1/Lib/hashlib.py 2013-11-27 11:45:17.073617547 +0100
@@ -23,6 +23,16 @@
Choose your hash function wisely. Some have known collision weaknesses.
sha384 and sha512 will be slow on 32 bit platforms.
@@ -17,27 +17,7 @@
Hash objects have these methods:
- update(arg): Update the hash object with the bytes in arg. Repeated calls
are equivalent to a single call with the concatenation of all
-@@ -64,6 +74,19 @@
- 'algorithms_available', 'pbkdf2_hmac')
-
-
-+import functools
-+def __ignore_usedforsecurity(func):
-+ """Used for sha3_* functions. Until OpenSSL implements them, we want
-+ to use them from Python _sha3 module, but we want them to accept
-+ usedforsecurity argument too."""
-+ # TODO: remove this function when OpenSSL implements sha3
-+ @functools.wraps(func)
-+ def inner(*args, **kwargs):
-+ if 'usedforsecurity' in kwargs:
-+ kwargs.pop('usedforsecurity')
-+ return func(*args, **kwargs)
-+ return inner
-+
- def __get_builtin_constructor(name):
- try:
- if name in ('SHA1', 'sha1'):
-@@ -109,34 +132,41 @@
+@@ -108,34 +118,41 @@
f = getattr(_hashlib, 'openssl_' + name)
# Allow the C module to raise ValueError. The function will be
# defined but the hash not actually available thanks to OpenSSL.
@@ -92,7 +72,7 @@
try:
import _hashlib
new = __hash_new
-@@ -216,7 +246,10 @@
+@@ -215,7 +232,10 @@
# try them all, some may not work due to the OpenSSL
# version not supporting that algorithm.
try:
@@ -104,13 +84,13 @@
except ValueError:
import logging
logging.exception('code for hash %s was not found.', __func_name)
-@@ -224,3 +257,4 @@
+@@ -223,3 +243,4 @@
# Cleanup locals()
del __always_supported, __func_name, __get_hash
del __py_new, __hash_new, __get_openssl_constructor
+del __ignore_usedforsecurity
---- Python-3.4.0a4/Lib/test/test_hashlib.py.hashlib-fips 2013-11-07 13:43:08.763454594
+0100
-+++ Python-3.4.0a4/Lib/test/test_hashlib.py 2013-11-07 13:55:23.233038101 +0100
+--- Python-3.4.0b1/Lib/test/test_hashlib.py.hashlib-fips 2013-11-24 21:36:55.000000000
+0100
++++ Python-3.4.0b1/Lib/test/test_hashlib.py 2013-11-27 11:55:42.769601363 +0100
@@ -26,6 +26,20 @@
c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
@@ -164,32 +144,37 @@
constructors.add(_test_algorithm_via_hashlib_new)
_hashlib = self._conditional_import_module('_hashlib')
-@@ -82,22 +106,9 @@
+@@ -82,27 +106,13 @@
for algorithm, constructors in self.constructors_to_test.items():
constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
if constructor:
- constructors.add(constructor)
+ constructors.add(suppress_fips(constructor))
+ def add_builtin_constructor(name):
+ constructor = getattr(hashlib, "__get_builtin_constructor")(name)
+ self.constructors_to_test[name].add(constructor)
+
- _md5 = self._conditional_import_module('_md5')
- if _md5:
-- self.constructors_to_test['md5'].add(_md5.md5)
+- add_builtin_constructor('md5')
- _sha1 = self._conditional_import_module('_sha1')
- if _sha1:
-- self.constructors_to_test['sha1'].add(_sha1.sha1)
+- add_builtin_constructor('sha1')
- _sha256 = self._conditional_import_module('_sha256')
- if _sha256:
-- self.constructors_to_test['sha224'].add(_sha256.sha224)
-- self.constructors_to_test['sha256'].add(_sha256.sha256)
+- add_builtin_constructor('sha224')
+- add_builtin_constructor('sha256')
- _sha512 = self._conditional_import_module('_sha512')
- if _sha512:
-- self.constructors_to_test['sha384'].add(_sha512.sha384)
-- self.constructors_to_test['sha512'].add(_sha512.sha512)
+- add_builtin_constructor('sha384')
+- add_builtin_constructor('sha512')
+- _sha3 = self._conditional_import_module('_sha3')
+ # TODO: remove this after sha3 is available through OpenSSL
- _sha3 = self._conditional_import_module('_sha3')
if _sha3:
- self.constructors_to_test['sha3_224'].add(_sha3.sha3_224)
-@@ -547,6 +558,65 @@
+ add_builtin_constructor('sha3_224')
+ add_builtin_constructor('sha3_256')
+@@ -558,6 +568,65 @@
self.assertEqual(expected_hash, hasher.hexdigest())
@@ -255,7 +240,7 @@
class KDFTests(unittest.TestCase):
-@@ -628,6 +698,7 @@
+@@ -639,6 +708,7 @@
with self.assertRaisesRegex(ValueError, 'unsupported hash type'):
pbkdf2('unknown', b'pass', b'salt', 1)
@@ -263,8 +248,8 @@
def test_pbkdf2_hmac_py(self):
self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac)
---- Python-3.4.0a4/Modules/_hashopenssl.c.hashlib-fips 2013-11-07 13:55:47.466025086
+0100
-+++ Python-3.4.0a4/Modules/_hashopenssl.c 2013-11-07 14:14:32.745272791 +0100
+--- Python-3.4.0b1/Modules/_hashopenssl.c.hashlib-fips 2013-11-24 21:36:56.000000000
+0100
++++ Python-3.4.0b1/Modules/_hashopenssl.c 2013-11-27 12:01:57.443537463 +0100
@@ -19,6 +19,8 @@
@@ -298,7 +283,7 @@
DEFINE_CONSTS_FOR_NEW(md5)
DEFINE_CONSTS_FOR_NEW(sha1)
-@@ -125,6 +135,48 @@
+@@ -97,6 +107,48 @@
}
}
@@ -347,7 +332,7 @@
/* Internal methods for a hash object */
static void
-@@ -309,15 +361,16 @@
+@@ -281,15 +333,16 @@
static int
EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds)
{
@@ -367,7 +352,7 @@
return -1;
}
-@@ -338,7 +391,12 @@
+@@ -310,7 +363,12 @@
PyBuffer_Release(&view);
return -1;
}
@@ -381,7 +366,7 @@
self->name = name_obj;
Py_INCREF(self->name);
-@@ -422,7 +480,8 @@
+@@ -394,7 +452,8 @@
static PyObject *
EVPnew(PyObject *name_obj,
const EVP_MD *digest, const EVP_MD_CTX *initial_ctx,
@@ -391,7 +376,7 @@
{
EVPobject *self;
-@@ -437,7 +495,12 @@
+@@ -409,7 +468,12 @@
if (initial_ctx) {
EVP_MD_CTX_copy(&self->ctx, initial_ctx);
} else {
@@ -405,7 +390,7 @@
}
if (cp && len) {
-@@ -461,21 +524,29 @@
+@@ -433,21 +497,29 @@
An optional string argument may be provided and will be\n\
automatically hashed.\n\
\n\
@@ -439,7 +424,7 @@
return NULL;
}
-@@ -489,7 +560,8 @@
+@@ -461,7 +533,8 @@
digest = EVP_get_digestbyname(name);
@@ -449,7 +434,7 @@
if (data_obj)
PyBuffer_Release(&view);
-@@ -744,57 +816,115 @@
+@@ -742,57 +815,115 @@
/*
@@ -602,11 +587,12 @@
GEN_CONSTRUCTOR(md5)
GEN_CONSTRUCTOR(sha1)
-@@ -845,12 +974,10 @@
+@@ -843,13 +974,10 @@
{
PyObject *m, *openssl_md_meth_names;
- OpenSSL_add_all_digests();
+- ERR_load_crypto_strings();
+ SSL_load_error_strings();
+ SSL_library_init();
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
index bf82b60..43bd394 100644
--- a/00157-uid-gid-overflows.patch
+++ b/00157-uid-gid-overflows.patch
@@ -1,56 +1,54 @@
-diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_os.py
---- Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
-+++ Python-3.3.0b1/Lib/test/test_os.py 2012-07-20 14:21:46.856688739 -0400
-@@ -1174,30 +1174,36 @@ if sys.platform != 'win32':
- def test_setuid(self):
- if os.getuid() != 0:
- self.assertRaises(OSError, os.setuid, 0)
-+ self.assertRaises(TypeError, os.setuid, 'not an int')
- self.assertRaises(OverflowError, os.setuid, 1<<32)
+--- Python-3.4.0b1/Lib/test/test_os.py.orig 2013-11-27 12:07:32.368411798 +0100
++++ Python-3.4.0b1/Lib/test/test_os.py 2013-11-27 12:12:11.220265174 +0100
+@@ -1319,30 +1319,36 @@
+ def test_setuid(self):
+ if os.getuid() != 0:
+ self.assertRaises(OSError, os.setuid, 0)
++ self.assertRaises(TypeError, os.setuid, 'not an int')
+ self.assertRaises(OverflowError, os.setuid, 1<<32)
- if hasattr(os, 'setgid'):
- def test_setgid(self):
- if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(OSError, os.setgid, 0)
-+ self.assertRaises(TypeError, os.setgid, 'not an int')
- self.assertRaises(OverflowError, os.setgid, 1<<32)
+ @unittest.skipUnless(hasattr(os, 'setgid'), 'test needs
os.setgid()')
+ def test_setgid(self):
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
+ self.assertRaises(OSError, os.setgid, 0)
++ self.assertRaises(TypeError, os.setgid, 'not an int')
+ self.assertRaises(OverflowError, os.setgid, 1<<32)
- if hasattr(os, 'seteuid'):
- def test_seteuid(self):
- if os.getuid() != 0:
- self.assertRaises(OSError, os.seteuid, 0)
-+ self.assertRaises(TypeError, os.seteuid, 'not an int')
- self.assertRaises(OverflowError, os.seteuid, 1<<32)
+ @unittest.skipUnless(hasattr(os, 'seteuid'), 'test needs
os.seteuid()')
+ def test_seteuid(self):
+ if os.getuid() != 0:
+ self.assertRaises(OSError, os.seteuid, 0)
++ self.assertRaises(TypeError, os.seteuid, 'not an int')
+ self.assertRaises(OverflowError, os.seteuid, 1<<32)
- if hasattr(os, 'setegid'):
- def test_setegid(self):
- if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(OSError, os.setegid, 0)
-+ self.assertRaises(TypeError, os.setegid, 'not an int')
- self.assertRaises(OverflowError, os.setegid, 1<<32)
+ @unittest.skipUnless(hasattr(os, 'setegid'), 'test needs
os.setegid()')
+ def test_setegid(self):
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
+ self.assertRaises(OSError, os.setegid, 0)
++ self.assertRaises(TypeError, os.setegid, 'not an int')
+ self.assertRaises(OverflowError, os.setegid, 1<<32)
- if hasattr(os, 'setreuid'):
- def test_setreuid(self):
- if os.getuid() != 0:
- self.assertRaises(OSError, os.setreuid, 0, 0)
-+ self.assertRaises(TypeError, os.setreuid, 'not an int', 0)
-+ self.assertRaises(TypeError, os.setreuid, 0, 'not an int')
- self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
- self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
+ @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs
os.setreuid()')
+ def test_setreuid(self):
+ if os.getuid() != 0:
+ self.assertRaises(OSError, os.setreuid, 0, 0)
++ self.assertRaises(TypeError, os.setreuid, 'not an int', 0)
++ self.assertRaises(TypeError, os.setreuid, 0, 'not an int')
+ self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
+ self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
-@@ -1212,6 +1218,8 @@ if sys.platform != 'win32':
- def test_setregid(self):
- if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(OSError, os.setregid, 0, 0)
-+ self.assertRaises(TypeError, os.setregid, 'not an int', 0)
-+ self.assertRaises(TypeError, os.setregid, 0, 'not an int')
- self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
- self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
+@@ -1358,6 +1364,8 @@
+ def test_setregid(self):
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
+ self.assertRaises(OSError, os.setregid, 0, 0)
++ self.assertRaises(TypeError, os.setregid, 'not an int', 0)
++ self.assertRaises(TypeError, os.setregid, 0, 'not an int')
+ self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
+ self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
-diff -up Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_pwd.py
---- Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
-+++ Python-3.3.0b1/Lib/test/test_pwd.py 2012-07-20 14:21:46.857688726 -0400
-@@ -87,9 +87,9 @@ class PwdTest(unittest.TestCase):
+--- Python-3.4.0b1/Lib/test/test_pwd.py.orig 2013-11-24 21:36:55.000000000 +0100
++++ Python-3.4.0b1/Lib/test/test_pwd.py 2013-11-27 12:07:32.369411798 +0100
+@@ -89,9 +89,9 @@
# In some cases, byuids isn't a complete list of all users in the
# system, so if we try to pick a value not in byuids (via a perturbing
# loop, say), pwd.getpwuid() might still be able to find data for that
diff --git a/00173-workaround-ENOPROTOOPT-in-bind_port.patch
b/00173-workaround-ENOPROTOOPT-in-bind_port.patch
index 498322c..8d8b0bc 100644
--- a/00173-workaround-ENOPROTOOPT-in-bind_port.patch
+++ b/00173-workaround-ENOPROTOOPT-in-bind_port.patch
@@ -1,13 +1,12 @@
-diff -up Python-3.3.0/Lib/test/support.py.rhbz913732 Python-3.3.0/Lib/test/support.py
---- Python-3.4.0a4/Lib/test/support/__init__.py.rhbz913732 2013-03-04 16:25:53.885258476
-0500
-+++ Python-3.4.0a4/Lib/test/support/__init__.py 2013-03-04 16:25:58.499258157 -0500
-@@ -544,7 +544,8 @@ def bind_port(sock, host=HOST):
+--- Python-3.4.0b1/Lib/test/support/__init__.py.orig 2013-11-27 12:14:26.507216624 +0100
++++ Python-3.4.0b1/Lib/test/support/__init__.py 2013-11-27 12:17:01.490805587 +0100
+@@ -593,7 +593,8 @@
if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
raise TestFailed("tests should never set the SO_REUSEADDR "
\
"socket option on TCP/IP sockets!")
- if hasattr(socket, 'SO_REUSEPORT'):
+ if hasattr(socket, 'SO_REUSEPORT') \
+ and 'WITHIN_PYTHON_RPM_BUILD' not in os.environ: # rhbz#913732
- if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
- raise TestFailed("tests should never set the SO_REUSEPORT "
\
- "socket option on TCP/IP sockets!")
+ try:
+ if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
+ raise TestFailed("tests should never set the SO_REUSEPORT
" \
diff --git a/00187-remove-pthread-atfork.patch b/00187-remove-pthread-atfork.patch
deleted file mode 100644
index 04af52d..0000000
--- a/00187-remove-pthread-atfork.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-diff -r 6fdbb81b4020 -r 705f2addd0f0 Modules/_ssl.c
---- a/Modules/_ssl.c Tue Oct 29 12:14:55 2013 +0100
-+++ b/Modules/_ssl.c Tue Oct 29 21:11:55 2013 +0100
-@@ -19,9 +19,6 @@
- #ifdef WITH_THREAD
- #include "pythread.h"
-
--#ifdef HAVE_PTHREAD_ATFORK
--# include <pthread.h>
--#endif
-
- #define PySSL_BEGIN_ALLOW_THREADS_S(save) \
- do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
-@@ -2950,64 +2947,6 @@
- Returns number of bytes read. Raises SSLError if connection to EGD\n\
- fails or if it does not provide enough data to seed PRNG.");
-
--/* Seed OpenSSL's PRNG at fork(),
http://bugs.python.org/issue18747
-- *
-- * The parent handler seeds the PRNG from pseudo-random data like pid, the
-- * current time (miliseconds or seconds) and an uninitialized array.
-- * The array contains stack variables that are impossible to predict
-- * on most systems, e.g. function return address (subject to ASLR), the
-- * stack protection canary and automatic variables.
-- * The code is inspired by Apache's ssl_rand_seed() function.
-- *
-- * Note:
-- * The code uses pthread_atfork() until Python has a proper atfork API. The
-- * handlers are not removed from the child process. A parent handler is used
-- * instead of a child handler because fork() is supposed to be async-signal
-- * safe but the handler calls unsafe functions.
-- */
--
--#if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
--#define PYSSL_RAND_ATFORK 1
--
--static void
--PySSL_RAND_atfork_parent(void)
--{
-- struct {
-- char stack[128]; /* uninitialized (!) stack data, 128 is an
-- arbitrary number. */
-- pid_t pid; /* current pid */
-- _PyTime_timeval tp; /* current time */
-- } seed;
--
--#ifdef WITH_VALGRIND
-- VALGRIND_MAKE_MEM_DEFINED(seed.stack, sizeof(seed.stack));
--#endif
-- seed.pid = getpid();
-- _PyTime_gettimeofday(&(seed.tp));
-- RAND_add((unsigned char *)&seed, sizeof(seed), 0.0);
--}
--
--static int
--PySSL_RAND_atfork(void)
--{
-- static int registered = 0;
-- int retval;
--
-- if (registered)
-- return 0;
--
-- retval = pthread_atfork(NULL, /* prepare */
-- PySSL_RAND_atfork_parent, /* parent */
-- NULL); /* child */
-- if (retval != 0) {
-- PyErr_SetFromErrno(PyExc_OSError);
-- return -1;
-- }
-- registered = 1;
-- return 0;
--}
--#endif /* HAVE_PTHREAD_ATFORK */
--
- #endif /* HAVE_OPENSSL_RAND */
-
-
-@@ -3623,10 +3561,5 @@
- if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
- return NULL;
-
--#ifdef PYSSL_RAND_ATFORK
-- if (PySSL_RAND_atfork() == -1)
-- return NULL;
--#endif
--
- return m;
- }
diff --git a/python-3.3.0b1-lib64.patch b/python-3.3.0b1-lib64.patch
deleted file mode 100644
index afbdc6c..0000000
--- a/python-3.3.0b1-lib64.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-diff -up cpython-59223da36dec/Lib/distutils/command/install.py.lib64
cpython-59223da36dec/Lib/distutils/command/install.py
---- cpython-59223da36dec/Lib/distutils/command/install.py.lib64 2012-08-07
06:10:57.000000000 -0400
-+++ cpython-59223da36dec/Lib/distutils/command/install.py 2012-08-07 16:41:00.573477549
-0400
-@@ -45,14 +45,14 @@ else:
- 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',
-diff -up cpython-59223da36dec/Lib/distutils/sysconfig.py.lib64
cpython-59223da36dec/Lib/distutils/sysconfig.py
---- cpython-59223da36dec/Lib/distutils/sysconfig.py.lib64 2012-08-07 06:10:57.000000000
-0400
-+++ cpython-59223da36dec/Lib/distutils/sysconfig.py 2012-08-07 16:41:00.573477549 -0400
-@@ -139,8 +139,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:
-diff -up cpython-59223da36dec/Lib/site.py.lib64 cpython-59223da36dec/Lib/site.py
---- cpython-59223da36dec/Lib/site.py.lib64 2012-08-07 06:10:57.000000000 -0400
-+++ cpython-59223da36dec/Lib/site.py 2012-08-07 16:41:00.573477549 -0400
-@@ -303,12 +303,16 @@ 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" + sys.version[:3],
- "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
- else:
- sitepackages.append(prefix)
-+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
- if sys.platform == "darwin":
- # for framework builds *only* we add the standard Apple
-diff -up cpython-59223da36dec/Lib/sysconfig.py.lib64
cpython-59223da36dec/Lib/sysconfig.py
---- cpython-59223da36dec/Lib/sysconfig.py.lib64 2012-08-07 06:10:57.000000000 -0400
-+++ cpython-59223da36dec/Lib/sysconfig.py 2012-08-07 16:41:00.574477549 -0400
-@@ -21,10 +21,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':
-@@ -81,10 +81,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}',
-diff -up cpython-59223da36dec/Lib/test/test_site.py.lib64
cpython-59223da36dec/Lib/test/test_site.py
---- cpython-59223da36dec/Lib/test/test_site.py.lib64 2012-08-07 06:10:57.000000000 -0400
-+++ cpython-59223da36dec/Lib/test/test_site.py 2012-08-07 16:41:00.574477549 -0400
-@@ -239,12 +239,15 @@ class HelperFunctionsTests(unittest.Test
- self.assertEqual(dirs[2], wanted)
- elif os.sep == '/':
- # OS X non-framwework builds, Linux, FreeBSD, etc
-- self.assertEqual(len(dirs), 2)
-- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ self.assertEqual(len(dirs), 3)
-+ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
- 'site-packages')
- self.assertEqual(dirs[0], wanted)
-- wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ 'site-packages')
- self.assertEqual(dirs[1], wanted)
-+ wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ self.assertEqual(dirs[2], wanted)
- else:
- # other platforms
- self.assertEqual(len(dirs), 2)
-diff -up cpython-59223da36dec/Makefile.pre.in.lib64 cpython-59223da36dec/Makefile.pre.in
---- cpython-59223da36dec/Makefile.pre.in.lib64 2012-08-07 16:41:00.557477550 -0400
-+++ cpython-59223da36dec/Makefile.pre.in 2012-08-07 16:41:00.575477549 -0400
-@@ -108,7 +108,7 @@ LIBDIR= @libdir@
- MANDIR= @mandir@
- INCLUDEDIR= @includedir@
- CONFINCLUDEDIR= $(exec_prefix)/include
--SCRIPTDIR= $(prefix)/lib
-+SCRIPTDIR= $(prefix)/lib64
- ABIFLAGS= @ABIFLAGS@
-
- # Detailed destination directories
-diff -up cpython-59223da36dec/Modules/getpath.c.lib64
cpython-59223da36dec/Modules/getpath.c
---- cpython-59223da36dec/Modules/getpath.c.lib64 2012-08-07 06:10:57.000000000 -0400
-+++ cpython-59223da36dec/Modules/getpath.c 2012-08-07 16:41:00.575477549 -0400
-@@ -122,8 +122,8 @@
- #endif
-
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
-+#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
-+ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
- #endif
-
- #ifndef LANDMARK
-@@ -135,7 +135,7 @@ static wchar_t exec_prefix[MAXPATHLEN+1]
- static wchar_t progpath[MAXPATHLEN+1];
- static wchar_t *module_search_path = NULL;
- static int module_search_path_malloced = 0;
--static wchar_t *lib_python = L"lib/python" VERSION;
-+static wchar_t *lib_python = L"lib64/python" VERSION;
-
- static void
- reduce(wchar_t *dir)
-@@ -677,7 +677,7 @@ calculate_path(void)
- }
- else
- wcsncpy(zip_path, _prefix, MAXPATHLEN);
-- joinpath(zip_path, L"lib/python00.zip");
-+ joinpath(zip_path, L"lib64/python00.zip");
- bufsz = wcslen(zip_path); /* Replace "00" with version */
- zip_path[bufsz - 6] = VERSION[0];
- zip_path[bufsz - 5] = VERSION[2];
-@@ -687,7 +687,7 @@ calculate_path(void)
- fprintf(stderr,
- "Could not find platform dependent libraries
<exec_prefix>\n");
- wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
-- joinpath(exec_prefix, L"lib/lib-dynload");
-+ joinpath(exec_prefix, L"lib64/lib-dynload");
- }
- /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
-
-diff -up cpython-59223da36dec/setup.py.lib64 cpython-59223da36dec/setup.py
---- cpython-59223da36dec/setup.py.lib64 2012-08-07 06:10:57.000000000 -0400
-+++ cpython-59223da36dec/setup.py 2012-08-07 16:41:32.153475390 -0400
-@@ -438,7 +438,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:
-@@ -708,11 +708,11 @@ class PyBuildExt(build_ext):
- elif curses_library:
- readline_libs.append(curses_library)
- elif self.compiler.find_library_file(lib_dirs +
-- ['/usr/lib/termcap'],
-+ ['/usr/lib64/termcap'],
- 'termcap'):
- readline_libs.append('termcap')
- exts.append( 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:
-@@ -749,8 +749,8 @@ class PyBuildExt(build_ext):
- if krb5_h:
- ssl_incs += krb5_h
- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-- ['/usr/local/ssl/lib',
-- '/usr/contrib/ssl/lib/'
-+ ['/usr/local/ssl/lib64',
-+ '/usr/contrib/ssl/lib64/'
- ] )
-
- if (ssl_incs is not None and
diff --git a/python3.spec b/python3.spec
index c7c5f66..1e61ab1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -8,7 +8,7 @@
%global pyshortver 34
# prereleasetag
-%global prerel a4
+%global prerel b1
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -240,7 +240,7 @@ Patch1: Python-3.1.1-rpath.patch
# (where sys.getfilesystemencoding() == 'ascii')
Patch55: 00055-systemtap.patch
-Patch102: python-3.3.0b1-lib64.patch
+Patch102: 00102-lib64.patch
# 00104 #
# Only used when "%{_lib}" == "lib64"
@@ -611,8 +611,8 @@ Patch184:
00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
Patch186: 00186-dont-raise-from-py_compile.patch
# 00187 #
-# Temporarily add this upstream patch, should be in next upstream release
-Patch187: 00187-remove-pthread-atfork.patch
+# Fixed upstream as of Python 3.4.0b1
+# Patch187: 00187-remove-pthread-atfork.patch
# 00188 #
# Downstream only patch that should be removed when we compile all guaranteed
@@ -889,7 +889,7 @@ done
%patch184 -p1
# 00185 upstream as of Python 3.4.0a4
%patch186 -p1
-%patch187 -p1
+# 00187: upstream as of Python 3.4.0b1
%patch188 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
@@ -1751,6 +1751,13 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Nov 25 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.b1
+- Update to Python 3.4 beta 1.
+- Refreshed patches: 102 (lib64), 111 (no static lib), 125 (less verbose COUNT
+ALLOCS), 141 (fix COUNT_ALLOCS in test_module), 146 (hashlib fips),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port)
+- Removed patch 00187 (remove pthread atfork; upstreamed)
+
* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
- Update to Python 3.4 alpha 4.
- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
commit b282179093636d68aa917b5b98ff9e406beb2b44
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Nov 8 14:59:25 2013 +0100
Add asyncio, _sha3 and _testimportmultiple to files.
diff --git a/python3.spec b/python3.spec
index 25fb779..c7c5f66 100644
--- a/python3.spec
+++ b/python3.spec
@@ -795,7 +795,8 @@ rm -r Modules/zlib || exit 1
#
# For example, in our builds hashlib.md5 is implemented within _hashlib via
# OpenSSL (and thus respects FIPS mode), and does not fall back to _md5
-# TODO: there seems to be no OpenSSL support in Python for sha3, investigate
+# TODO: there seems to be no OpenSSL support in Python for sha3 so far
+# when it is there, also remove _sha3/ dir
for f in md5module.c sha1module.c sha256module.c sha512module.c; do
rm Modules/$f
done
@@ -1411,6 +1412,8 @@ rm -fr %{buildroot}
%{dynload_dir}/_pickle.%{SOABI_optimized}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
%{dynload_dir}/_random.%{SOABI_optimized}.so
+# TODO: remove _sha3 when it reaches OpenSSL
+%{dynload_dir}/_sha3.%{SOABI_optimized}.so
%{dynload_dir}/_socket.%{SOABI_optimized}.so
%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
%{dynload_dir}/_ssl.%{SOABI_optimized}.so
@@ -1446,6 +1449,11 @@ rm -fr %{buildroot}
%dir %{pylibdir}/__pycache__/
%{pylibdir}/__pycache__/*%{bytecode_suffixes}
+%dir %{pylibdir}/asyncio/
+%dir %{pylibdir}/asyncio/__pycache__/
+%{pylibdir}/asyncio/*.py
+%{pylibdir}/asyncio/__pycache__/*%{bytecode_suffixes}
+
%dir %{pylibdir}/collections/
%dir %{pylibdir}/collections/__pycache__/
%{pylibdir}/collections/*.py
@@ -1613,6 +1621,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
%{pylibdir}/lib2to3/tests
%{pylibdir}/tkinter/test
%{pylibdir}/unittest/test
@@ -1663,6 +1672,8 @@ rm -fr %{buildroot}
%{dynload_dir}/_pickle.%{SOABI_debug}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
%{dynload_dir}/_random.%{SOABI_debug}.so
+# TODO: remove _sha3 when it reaches OpenSSL
+%{dynload_dir}/_sha3.%{SOABI_debug}.so
%{dynload_dir}/_socket.%{SOABI_debug}.so
%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
%{dynload_dir}/_ssl.%{SOABI_debug}.so
@@ -1717,6 +1728,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
%{dynload_dir}/_testcapi.%{SOABI_debug}.so
+%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
%endif # with_debug_build
commit e5c246c5f5745353863087f247ad0bee36341422
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Nov 8 14:32:40 2013 +0100
Change test/support in files to match upstream
diff --git a/python3.spec b/python3.spec
index 501bfc0..25fb779 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1517,10 +1517,12 @@ rm -fr %{buildroot}
%dir %{pylibdir}/test/
%dir %{pylibdir}/test/__pycache__/
+%dir %{pylibdir}/test/support/
+%dir %{pylibdir}/test/support/__pycache__/
%{pylibdir}/test/__init__.py
-%{pylibdir}/test/support.py
%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
-%{pylibdir}/test/__pycache__/support%{bytecode_suffixes}
+%{pylibdir}/test/support/__init__.py
+%{pylibdir}/test/support/__pycache__/__init__%{bytecode_suffixes}
%exclude %{pylibdir}/turtle.py
%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
commit 671e4bf0ee7af79422ac0ce0bcecdaa4645457cd
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Nov 8 14:08:24 2013 +0100
atexit now gets linked into libpython3.X.so
diff --git a/python3.spec b/python3.spec
index 09a5bbf..501bfc0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1416,7 +1416,6 @@ rm -fr %{buildroot}
%{dynload_dir}/_ssl.%{SOABI_optimized}.so
%{dynload_dir}/_struct.%{SOABI_optimized}.so
%{dynload_dir}/array.%{SOABI_optimized}.so
-%{dynload_dir}/atexit.%{SOABI_optimized}.so
%{dynload_dir}/audioop.%{SOABI_optimized}.so
%{dynload_dir}/binascii.%{SOABI_optimized}.so
%{dynload_dir}/cmath.%{SOABI_optimized}.so
@@ -1667,7 +1666,6 @@ rm -fr %{buildroot}
%{dynload_dir}/_ssl.%{SOABI_debug}.so
%{dynload_dir}/_struct.%{SOABI_debug}.so
%{dynload_dir}/array.%{SOABI_debug}.so
-%{dynload_dir}/atexit.%{SOABI_debug}.so
%{dynload_dir}/audioop.%{SOABI_debug}.so
%{dynload_dir}/binascii.%{SOABI_debug}.so
%{dynload_dir}/cmath.%{SOABI_debug}.so
commit 84c534ef77a9975aa0a3b03bffe448e8995ec0a0
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Nov 8 13:33:44 2013 +0100
Disable tests in debug build that are irrelevant and fail because of COUNT_ALLOCS
diff --git a/00141-fix-test_gc_with_COUNT_ALLOCS.patch
b/00141-fix-test_gc_with_COUNT_ALLOCS.patch
deleted file mode 100644
index 337e39e..0000000
--- a/00141-fix-test_gc_with_COUNT_ALLOCS.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff -up Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_gc.py
---- Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS 2010-12-28
20:39:40.779059772 -0500
-+++ Python-3.2b2/Lib/test/test_gc.py 2010-12-28 20:41:15.890940017 -0500
-@@ -102,10 +102,16 @@ class GCTests(unittest.TestCase):
- del a
- self.assertNotEqual(gc.collect(), 0)
- del B, C
-- self.assertNotEqual(gc.collect(), 0)
-+ if hasattr(sys, 'getcounts'):
-+ self.assertEqual(gc.collect(), 0)
-+ else:
-+ self.assertNotEqual(gc.collect(), 0)
- A.a = A()
- del A
-- self.assertNotEqual(gc.collect(), 0)
-+ if hasattr(sys, 'getcounts'):
-+ self.assertEqual(gc.collect(), 0)
-+ else:
-+ self.assertNotEqual(gc.collect(), 0)
- self.assertEqual(gc.collect(), 0)
-
- def test_method(self):
diff --git a/00141-fix-tests_with_COUNT_ALLOCS.patch
b/00141-fix-tests_with_COUNT_ALLOCS.patch
new file mode 100644
index 0000000..b60ee69
--- /dev/null
+++ b/00141-fix-tests_with_COUNT_ALLOCS.patch
@@ -0,0 +1,70 @@
+diff -r e245b0d7209b Lib/test/test_gc.py
+--- a/Lib/test/test_gc.py Sun Oct 20 02:01:29 2013 -0700
++++ b/Lib/test/test_gc.py Fri Nov 08 13:25:29 2013 +0100
+@@ -127,10 +127,16 @@
+ del a
+ self.assertNotEqual(gc.collect(), 0)
+ del B, C
+- self.assertNotEqual(gc.collect(), 0)
++ if hasattr(sys, 'getcounts'):
++ self.assertEqual(gc.collect(), 0)
++ else:
++ self.assertNotEqual(gc.collect(), 0)
+ A.a = A()
+ del A
+- self.assertNotEqual(gc.collect(), 0)
++ if hasattr(sys, 'getcounts'):
++ self.assertEqual(gc.collect(), 0)
++ else:
++ self.assertNotEqual(gc.collect(), 0)
+ self.assertEqual(gc.collect(), 0)
+
+ def test_method(self):
+@@ -618,6 +624,8 @@
+ stderr = run_command(code % "gc.DEBUG_SAVEALL")
+ self.assertNotIn(b"uncollectable objects at shutdown", stderr)
+
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_gc_main_module_at_shutdown(self):
+ # Create a reference cycle through the __main__ module and check
+ # it gets collected at interpreter shutdown.
+@@ -632,6 +640,8 @@
+ rc, out, err = assert_python_ok('-c', code)
+ self.assertEqual(out.strip(), b'__del__ called')
+
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_gc_ordinary_module_at_shutdown(self):
+ # Same as above, but with a non-__main__ module.
+ with temp_dir() as script_dir:
+diff -r e245b0d7209b Lib/test/test_module.py
+--- a/Lib/test/test_module.py Sun Oct 20 02:01:29 2013 -0700
++++ b/Lib/test/test_module.py Fri Nov 08 13:25:29 2013 +0100
+@@ -81,6 +81,8 @@
+ gc_collect()
+ self.assertEqual(f().__dict__["bar"], 4)
+
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_clear_dict_in_ref_cycle(self):
+ destroyed = []
+ m = ModuleType("foo")
+@@ -96,6 +98,8 @@
+ gc_collect()
+ self.assertEqual(destroyed, [1])
+
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'types are immortal if COUNT_ALLOCS is used')
+ def test_weakref(self):
+ m = ModuleType("foo")
+ wr = weakref.ref(m)
+@@ -190,6 +194,8 @@
+ self.assertEqual(r[:25], "<module 'unittest' from '")
+ self.assertEqual(r[-13:], "__init__.py'>")
+
++ @unittest.skipIf(hasattr(sys, 'getcounts'),
++ 'skipping since COUNT_ALLOCS was used, see issue19527')
+ def test_module_finalization_at_shutdown(self):
+ # Module globals and builtins should still be available during shutdown
+ rc, out, err = assert_python_ok("-c", "from test import
final_a")
diff --git a/python3.spec b/python3.spec
index 1382490..09a5bbf 100644
--- a/python3.spec
+++ b/python3.spec
@@ -345,9 +345,9 @@ Patch140: python3-arm-skip-failing-fragile-test.patch
# to be relevant for python3
# 00141 #
-# Fix test_gc's test_newinstance case when configured with COUNT_ALLOCS:
-# Not yet sent upstream
-Patch141: 00141-fix-test_gc_with_COUNT_ALLOCS.patch
+# Fix test_gc and test_module tests for case when configured with COUNT_ALLOCS:
+#
http://bugs.python.org/issue19527
+Patch141: 00141-fix-tests_with_COUNT_ALLOCS.patch
# 00143 #
# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
commit f2d9a8144badc4976c1fbdda609bdb004329964a
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Nov 8 08:09:40 2013 +0100
Don't hardode Python version in venv binary, use the pybasever macro there.
diff --git a/python3.spec b/python3.spec
index ef695e9..1382490 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1374,7 +1374,7 @@ rm -fr %{buildroot}
%{_bindir}/python%{pybasever}
%{_bindir}/python%{pybasever}m
%{_bindir}/pyvenv
-%{_bindir}/pyvenv-3.3
+%{_bindir}/pyvenv-%{pybasever}
%{_mandir}/*/*
%files libs
commit f0b0ffc86c70e6dcf520f3b6a91540766b8d6c56
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu Nov 7 15:59:40 2013 +0100
Rebase the hashlib patch + adapt it to _sha3 being used from stdlib
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index 18b6a44..221ab50 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -1,7 +1,6 @@
-diff -up Python-3.2.2/Lib/hashlib.py.hashlib-fips Python-3.2.2/Lib/hashlib.py
---- Python-3.2.2/Lib/hashlib.py.hashlib-fips 2011-09-03 12:16:41.000000000 -0400
-+++ Python-3.2.2/Lib/hashlib.py 2011-09-14 01:55:48.090252006 -0400
-@@ -23,6 +23,16 @@ the zlib module.
+--- Python-3.4.0a4/Lib/hashlib.py.hashlib-fips 2013-11-07 13:29:43.046881440 +0100
++++ Python-3.4.0a4/Lib/hashlib.py 2013-11-07 13:42:04.438486289 +0100
+@@ -23,6 +23,16 @@
Choose your hash function wisely. Some have known collision weaknesses.
sha384 and sha512 will be slow on 32 bit platforms.
@@ -18,7 +17,27 @@ diff -up Python-3.2.2/Lib/hashlib.py.hashlib-fips
Python-3.2.2/Lib/hashlib.py
Hash objects have these methods:
- update(arg): Update the hash object with the bytes in arg. Repeated calls
are equivalent to a single call with the concatenation of all
-@@ -96,33 +106,36 @@ def __get_openssl_constructor(name):
+@@ -64,6 +74,19 @@
+ 'algorithms_available', 'pbkdf2_hmac')
+
+
++import functools
++def __ignore_usedforsecurity(func):
++ """Used for sha3_* functions. Until OpenSSL implements them, we want
++ to use them from Python _sha3 module, but we want them to accept
++ usedforsecurity argument too."""
++ # TODO: remove this function when OpenSSL implements sha3
++ @functools.wraps(func)
++ def inner(*args, **kwargs):
++ if 'usedforsecurity' in kwargs:
++ kwargs.pop('usedforsecurity')
++ return func(*args, **kwargs)
++ return inner
++
+ def __get_builtin_constructor(name):
+ try:
+ if name in ('SHA1', 'sha1'):
+@@ -109,34 +132,41 @@
f = getattr(_hashlib, 'openssl_' + name)
# Allow the C module to raise ValueError. The function will be
# defined but the hash not actually available thanks to OpenSSL.
@@ -30,16 +49,17 @@ diff -up Python-3.2.2/Lib/hashlib.py.hashlib-fips
Python-3.2.2/Lib/hashlib.py
# Use the C function directly (very fast)
return f
except (AttributeError, ValueError):
-- return __get_builtin_constructor(name)
-+ raise
++ # TODO: We want to just raise here when OpenSSL implements sha3
++ # because we want to make sure that Fedora uses everything from OpenSSL
+ return __get_builtin_constructor(name)
-+def __py_new(name, data=b'', usedforsecurity=True):
-+ """new(name, data=b'', usedforsecurity=True) - Return a new
hashing object using
-+ the named algorithm; optionally initialized with data (which must be bytes).
-def __py_new(name, data=b''):
- """new(name, data=b'') - Return a new hashing object using
the named algorithm;
- optionally initialized with data (which must be bytes).
++def __py_new(name, data=b'', usedforsecurity=True):
++ """new(name, data=b'', usedforsecurity=True) - Return a new
hashing object using
++ the named algorithm; optionally initialized with data (which must be bytes).
+ The 'usedforsecurity' keyword argument does nothing, and is for
compatibilty
+ with the OpenSSL implementation
"""
@@ -64,16 +84,34 @@ diff -up Python-3.2.2/Lib/hashlib.py.hashlib-fips
Python-3.2.2/Lib/hashlib.py
- # hash, try using our builtin implementations.
- # This allows for SHA224/256 and SHA384/512 support even though
- # the OpenSSL library prior to 0.9.8 doesn't provide them.
-- return __get_builtin_constructor(name)(data)
--
-+ raise
++ # TODO: We want to just raise here when OpenSSL implements sha3
++ # because we want to make sure that Fedora uses everything from OpenSSL
+ return __get_builtin_constructor(name)(data)
+-
try:
import _hashlib
-diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/test/test_hashlib.py
---- Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips 2011-09-03 12:16:43.000000000
-0400
-+++ Python-3.2.2/Lib/test/test_hashlib.py 2011-09-14 01:45:48.462251974 -0400
-@@ -22,6 +22,20 @@ from test.support import _4G, precisionb
+ new = __hash_new
+@@ -216,7 +246,10 @@
+ # try them all, some may not work due to the OpenSSL
+ # version not supporting that algorithm.
+ try:
+- globals()[__func_name] = __get_hash(__func_name)
++ func = __get_hash(__func_name)
++ if 'sha3_' in __func_name:
++ func = __ignore_usedforsecurity(func)
++ globals()[__func_name] = func
+ except ValueError:
+ import logging
+ logging.exception('code for hash %s was not found.', __func_name)
+@@ -224,3 +257,4 @@
+ # Cleanup locals()
+ del __always_supported, __func_name, __get_hash
+ del __py_new, __hash_new, __get_openssl_constructor
++del __ignore_usedforsecurity
+--- Python-3.4.0a4/Lib/test/test_hashlib.py.hashlib-fips 2013-11-07 13:43:08.763454594
+0100
++++ Python-3.4.0a4/Lib/test/test_hashlib.py 2013-11-07 13:55:23.233038101 +0100
+@@ -26,6 +26,20 @@
c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
@@ -94,7 +132,7 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
def hexstr(s):
assert isinstance(s, bytes), repr(s)
h = "0123456789abcdef"
-@@ -31,6 +44,16 @@ def hexstr(s):
+@@ -34,6 +48,16 @@
r += h[(i >> 4) & 0xF] + h[i & 0xF]
return r
@@ -111,7 +149,7 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
class HashLibTestCase(unittest.TestCase):
supported_hash_names = ( 'md5', 'MD5', 'sha1',
'SHA1',
-@@ -59,11 +82,11 @@ class HashLibTestCase(unittest.TestCase)
+@@ -66,11 +90,11 @@
# For each algorithm, test the direct constructor and the use
# of hashlib.new given the algorithm name.
for algorithm, constructors in self.constructors_to_test.items():
@@ -126,12 +164,13 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
constructors.add(_test_algorithm_via_hashlib_new)
_hashlib = self._conditional_import_module('_hashlib')
-@@ -75,22 +98,7 @@ class HashLibTestCase(unittest.TestCase)
+@@ -82,22 +106,9 @@
for algorithm, constructors in self.constructors_to_test.items():
constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
if constructor:
- constructors.add(constructor)
--
++ constructors.add(suppress_fips(constructor))
+
- _md5 = self._conditional_import_module('_md5')
- if _md5:
- self.constructors_to_test['md5'].add(_md5.md5)
@@ -146,51 +185,11 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
- if _sha512:
- self.constructors_to_test['sha384'].add(_sha512.sha384)
- self.constructors_to_test['sha512'].add(_sha512.sha512)
-+ constructors.add(suppress_fips(constructor))
++ # TODO: remove this after sha3 is available through OpenSSL
_sha3 = self._conditional_import_module('_sha3')
if _sha3:
self.constructors_to_test['sha3_224'].add(_sha3.sha3_224)
-@@ -138,7 +146,7 @@ class HashLibTestCase(unittest.TestCase)
-
- def test_hexdigest(self):
- for cons in self.hash_constructors:
-- h = cons()
-+ h = cons(usedforsecurity=False)
- assert isinstance(h.digest(), bytes), name
- self.assertEqual(hexstr(h.digest()), h.hexdigest())
-
-@@ -149,12 +157,12 @@ class HashLibTestCase(unittest.TestCase)
- cees = b'c' * 126
-
- for name in self.supported_hash_names:
-- m1 = cons()
-+ m1 = cons(usedforsecurity=False)
- m1.update(aas)
- m1.update(bees)
- m1.update(cees)
-
-- m2 = cons()
-+ m2 = cons(usedforsecurity=False)
- m2.update(aas + bees + cees)
- self.assertEqual(m1.digest(), m2.digest())
-
-@@ -324,13 +332,13 @@ class HashLibTestCase(unittest.TestCase)
- # for multithreaded operation (which is hardwired to 2048).
- gil_minsize = 2048
-
-- m = hashlib.md5()
-+ m = hashlib.md5(usedforsecurity=False)
- m.update(b'1')
- m.update(b'#' * gil_minsize)
- m.update(b'1')
- self.assertEqual(m.hexdigest(), 'cb1e1a2cbc80be75e19935d621fb9b21')
-
-- m = hashlib.md5(b'x' * gil_minsize)
-+ m = hashlib.md5(b'x' * gil_minsize, usedforsecurity=False)
- self.assertEqual(m.hexdigest(), 'cfb767f225d58469c5de3632a8803958')
-
- @unittest.skipUnless(threading, 'Threading required for this test.')
-@@ -370,6 +378,67 @@ class HashLibTestCase(unittest.TestCase)
+@@ -547,6 +558,65 @@
self.assertEqual(expected_hash, hasher.hexdigest())
@@ -246,31 +245,36 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
+ m = _hashlib.new('md5', usedforsecurity=False)
+ m.update(b'abc\n')
+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
-+
++
+ m = _hashlib.openssl_md5(b'abc\n', usedforsecurity=False)
+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
+
+ m = _hashlib.new('md5', b'abc\n', usedforsecurity=False)
+ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
-+
-+
+
- def test_main():
- support.run_unittest(HashLibTestCase)
-diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_hashopenssl.c
---- Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips 2011-09-03 12:16:46.000000000 -0400
-+++ Python-3.2.2/Modules/_hashopenssl.c 2011-09-14 00:52:41.225252001 -0400
-@@ -37,6 +37,8 @@
- #endif
+ class KDFTests(unittest.TestCase):
+
+@@ -628,6 +698,7 @@
+ with self.assertRaisesRegex(ValueError, 'unsupported hash type'):
+ pbkdf2('unknown', b'pass', b'salt', 1)
+
++ @unittest.skip('skipped on Fedora, as we always use OpenSSL pbkdf2_hmac')
+ def test_pbkdf2_hmac_py(self):
+ self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac)
+
+--- Python-3.4.0a4/Modules/_hashopenssl.c.hashlib-fips 2013-11-07 13:55:47.466025086
+0100
++++ Python-3.4.0a4/Modules/_hashopenssl.c 2013-11-07 14:14:32.745272791 +0100
+@@ -19,6 +19,8 @@
+
/* EVP is the preferred interface to hashing in OpenSSL */
+#include <openssl/ssl.h>
+#include <openssl/err.h>
#include <openssl/evp.h>
+ #include <openssl/hmac.h>
/* We use the object interface to discover what hashes OpenSSL supports. */
- #include <openssl/objects.h>
-@@ -68,11 +70,19 @@ typedef struct {
+@@ -48,11 +50,19 @@
static PyTypeObject EVPtype;
@@ -294,7 +298,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
DEFINE_CONSTS_FOR_NEW(md5)
DEFINE_CONSTS_FOR_NEW(sha1)
-@@ -117,6 +127,48 @@ EVP_hash(EVPobject *self, const void *vp
+@@ -125,6 +135,48 @@
}
}
@@ -343,7 +347,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
/* Internal methods for a hash object */
static void
-@@ -303,15 +355,16 @@ EVP_repr(EVPobject *self)
+@@ -309,15 +361,16 @@
static int
EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds)
{
@@ -363,7 +367,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
return -1;
}
-@@ -332,7 +385,12 @@ EVP_tp_init(EVPobject *self, PyObject *a
+@@ -338,7 +391,12 @@
PyBuffer_Release(&view);
return -1;
}
@@ -377,7 +381,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
self->name = name_obj;
Py_INCREF(self->name);
-@@ -416,7 +474,8 @@ static PyTypeObject EVPtype = {
+@@ -422,7 +480,8 @@
static PyObject *
EVPnew(PyObject *name_obj,
const EVP_MD *digest, const EVP_MD_CTX *initial_ctx,
@@ -387,7 +391,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
{
EVPobject *self;
-@@ -431,7 +490,12 @@ EVPnew(PyObject *name_obj,
+@@ -437,7 +495,12 @@
if (initial_ctx) {
EVP_MD_CTX_copy(&self->ctx, initial_ctx);
} else {
@@ -401,7 +405,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
}
if (cp && len) {
-@@ -455,21 +519,29 @@ PyDoc_STRVAR(EVP_new__doc__,
+@@ -461,21 +524,29 @@
An optional string argument may be provided and will be\n\
automatically hashed.\n\
\n\
@@ -435,7 +439,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
return NULL;
}
-@@ -483,7 +555,8 @@ EVP_new(PyObject *self, PyObject *args,
+@@ -489,7 +560,8 @@
digest = EVP_get_digestbyname(name);
@@ -445,7 +449,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
if (data_obj)
PyBuffer_Release(&view);
-@@ -547,58 +620,115 @@ generate_hash_name_list(void)
+@@ -744,57 +816,115 @@
/*
@@ -462,7 +466,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
#define GEN_CONSTRUCTOR(NAME) \
static PyObject * \
- EVP_new_ ## NAME (PyObject *self, PyObject *args) \
-+ EVP_new_ ## NAME (PyObject *self, PyObject *args, PyObject *kwdict) \
++ EVP_new_ ## NAME (PyObject *self, PyObject *args, PyObject *kwdict) \
{ \
- PyObject *data_obj = NULL; \
- Py_buffer view = { 0 }; \
@@ -488,8 +492,8 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
+ return implement_specific_EVP_new(self, args, kwdict, \
+ "|Oi:" #NAME, \
+ &cached_info_ ## NAME ); \
- }
-
++ }
++
+static PyObject *
+implement_specific_EVP_new(PyObject *self, PyObject *args, PyObject *kwdict,
+ const char *format,
@@ -534,8 +538,8 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
+ } else {
+ PyErr_SetString(PyExc_ValueError, "Error initializing hash");
+ }
-+ }
-+
+ }
+
+ if (data_obj)
+ PyBuffer_Release(&view);
+
@@ -561,10 +565,9 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME));
\
- } \
- } \
--} while (0);
+/*
+ Macro/function pair to set up the constructors.
-
++
+ Try to initialize a context for each hash twice, once with
+ EVP_MD_CTX_FLAG_NON_FIPS_ALLOW and once without.
+
@@ -573,7 +576,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
+*/
+#define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \
+ init_constructor_constant(&cached_info_ ## NAME, #NAME); \
-+} while (0);
+ } while (0);
+static void
+init_constructor_constant(EVPCachedInfo *cached_info, const char *name)
+{
@@ -595,11 +598,11 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
+ }
+ }
+}
-+
++
+
GEN_CONSTRUCTOR(md5)
GEN_CONSTRUCTOR(sha1)
- #ifdef _OPENSSL_SUPPORTS_SHA2
-@@ -641,12 +774,10 @@ PyInit__hashlib(void)
+@@ -845,12 +974,10 @@
{
PyObject *m, *openssl_md_meth_names;
diff --git a/python3.spec b/python3.spec
index e2fae48..ef695e9 100644
--- a/python3.spec
+++ b/python3.spec
@@ -381,8 +381,10 @@ Patch143: 00143-tsc-on-ppc.patch
# - don't build the _md5 and _sha* modules; rely on the _hashlib implementation
# of hashlib
# (rhbz#563986)
-# TODO: figure out how to update properly for sha3
-# Patch146: 00146-hashlib-fips.patch
+# Note: for now we're using sha3 from Python tarball, not from OpenSSL, since
+# OpenSSL didn't implement it yet. When OpenSSL implements it again,
+# we will need to rm -rf Modules/_sha3 in prep and adapt the patch.
+Patch146: 00146-hashlib-fips.patch
# 00147 #
# Add a sys._debugmallocstats() function
@@ -841,7 +843,7 @@ done
%patch143 -p1 -b .tsc-on-ppc
# 00144: not for python3
# 00145: not for python3
-#patch146 -p1
+%patch146 -p1
# 00147: upstream as of Python 3.3.0
# 00148: upstream as of Python 3.2.3
# 00149: upstream as of Python 3.2.3
commit 0153564bb6b35c94ea754bc33d029fd0db0cd2ee
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Nov 6 14:58:05 2013 +0100
Add a temporary workaround for lib2to3 tests failure (to be removed when we figure out
things about hashlib+fips patch)
diff --git a/00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
b/00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
new file mode 100644
index 0000000..90af30d
--- /dev/null
+++ b/00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
@@ -0,0 +1,11 @@
+diff -r 28c04e954bb6 Lib/lib2to3/main.py
+--- a/Lib/lib2to3/main.py Tue Oct 29 22:25:55 2013 -0400
++++ b/Lib/lib2to3/main.py Wed Nov 06 14:33:07 2013 +0100
+@@ -213,6 +213,7 @@
+
+ # Set up logging handler
+ level = logging.DEBUG if options.verbose else logging.INFO
++ logging.root.handlers = []
+ logging.basicConfig(format='%(name)s: %(message)s', level=level)
+ logger = logging.getLogger('lib2to3.main')
+
diff --git a/python3.spec b/python3.spec
index d792c03..e2fae48 100644
--- a/python3.spec
+++ b/python3.spec
@@ -612,6 +612,21 @@ Patch186: 00186-dont-raise-from-py_compile.patch
# Temporarily add this upstream patch, should be in next upstream release
Patch187: 00187-remove-pthread-atfork.patch
+# 00188 #
+# Downstream only patch that should be removed when we compile all guaranteed
+# hashlib algorithms properly. The problem is this:
+# - during tests, test_hashlib is imported and executed before test_lib2to3
+# - if at least one hash function has failed, trying to import it triggers an
+# exception that is being caught and exception is logged:
+#
http://hg.python.org/cpython/file/2de806c8b070/Lib/hashlib.py#l217
+# - logging the exception makes logging module run basicConfig
+# - when lib2to3 tests are run again, lib2to3 runs basicConfig again, which
+# doesn't do anything, because it was run previously
+# (logging.root.handlers != []), which means that the default setup
+# (most importantly logging level) is not overriden. That means that a test
+# relying on this will fail (test_filename_changing_on_output_single_dir)
+Patch188: 00188-fix-lib2to3-tests-when-hashlib-doesnt-compile-properly.patch
+
# (New patches go here ^^^)
#
@@ -872,6 +887,7 @@ done
# 00185 upstream as of Python 3.4.0a4
%patch186 -p1
%patch187 -p1
+%patch188 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit 54afb027bd0b97c24477a536e9b4dfb6fc45b61b
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Tue Nov 5 12:22:13 2013 +0100
Change behavior of ssl.match_hostname() to follow RFC 6125 (rhbz#1023742)
diff --git a/00187-change-match_hostname-to-follow-RFC-6125.patch
b/00187-change-match_hostname-to-follow-RFC-6125.patch
new file mode 100644
index 0000000..0c07ecc
--- /dev/null
+++ b/00187-change-match_hostname-to-follow-RFC-6125.patch
@@ -0,0 +1,188 @@
+--- a/Doc/library/ssl.rst
++++ b/Doc/library/ssl.rst
+@@ -283,10 +283,10 @@ Certificate handling
+ Verify that *cert* (in decoded format as returned by
+ :meth:`SSLSocket.getpeercert`) matches the given *hostname*. The rules
+ applied are those for checking the identity of HTTPS servers as outlined
+- in :rfc:`2818`, except that IP addresses are not currently supported.
+- In addition to HTTPS, this function should be suitable for checking the
+- identity of servers in various SSL-based protocols such as FTPS, IMAPS,
+- POPS and others.
++ in :rfc:`2818` and :rfc:`6125`, except that IP addresses are not currently
++ supported. In addition to HTTPS, this function should be suitable for
++ checking the identity of servers in various SSL-based protocols such as
++ FTPS, IMAPS, POPS and others.
+
+ :exc:`CertificateError` is raised on failure. On success, the function
+ returns nothing::
+@@ -301,6 +301,13 @@ Certificate handling
+
+ .. versionadded:: 3.2
+
++ .. versionchanged:: 3.3.3
++ The function now follows :rfc:`6125`, section 6.4.3 and does neither
++ match multiple wildcards (e.g. ``*.*.com`` or ``*a*.example.org``) nor
++ a wildcard inside an internationalized domain names (IDN) fragment.
++ IDN A-labels such as ``www*.xn--pthon-kva.org`` are still supported,
++ but ``x*.python.org`` no longer matches ``xn--tda.python.org``.
++
+ .. function:: cert_time_to_seconds(timestring)
+
+ Returns a floating-point value containing a normal seconds-after-the-epoch
+unchanged:
+--- a/Lib/ssl.py
++++ b/Lib/ssl.py
+@@ -129,25 +129,53 @@ class CertificateError(ValueError):
+ pass
+
+
+-def _dnsname_to_pat(dn, max_wildcards=1):
++def _dnsname_match(dn, hostname, max_wildcards=1):
++ """Matching according to RFC 6125, section 6.4.3
++
++
http://tools.ietf.org/html/rfc6125#section-6.4.3
++ """
+ pats = []
+- for frag in dn.split(r'.'):
+- if frag.count('*') > max_wildcards:
+- # Issue #17980: avoid denials of service by refusing more
+- # than one wildcard per fragment. A survery of established
+- # policy among SSL implementations showed it to be a
+- # reasonable choice.
+- raise CertificateError(
+- "too many wildcards in certificate DNS name: " + repr(dn))
+- if frag == '*':
+- # When '*' is a fragment by itself, it matches a non-empty dotless
+- # fragment.
+- pats.append('[^.]+')
+- else:
+- # Otherwise, '*' matches any dotless fragment.
+- frag = re.escape(frag)
+- pats.append(frag.replace(r'\*', '[^.]*'))
+- return re.compile(r'\A' + r'\.'.join(pats) + r'\Z',
re.IGNORECASE)
++ if not dn:
++ return False
++
++ leftmost, *remainder = dn.split(r'.')
++
++ wildcards = leftmost.count('*')
++ if wildcards > max_wildcards:
++ # Issue #17980: avoid denials of service by refusing more
++ # than one wildcard per fragment. A survery of established
++ # policy among SSL implementations showed it to be a
++ # reasonable choice.
++ raise CertificateError(
++ "too many wildcards in certificate DNS name: " + repr(dn))
++
++ # speed up common case w/o wildcards
++ if not wildcards:
++ return dn.lower() == hostname.lower()
++
++ # RFC 6125, section 6.4.3, subitem 1.
++ # The client SHOULD NOT attempt to match a presented identifier in which
++ # the wildcard character comprises a label other than the left-most label.
++ if leftmost == '*':
++ # When '*' is a fragment by itself, it matches a non-empty dotless
++ # fragment.
++ pats.append('[^.]+')
++ elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
++ # RFC 6125, section 6.4.3, subitem 3.
++ # The client SHOULD NOT attempt to match a presented identifier
++ # where the wildcard character is embedded within an A-label or
++ # U-label of an internationalized domain name.
++ pats.append(re.escape(leftmost))
++ else:
++ # Otherwise, '*' matches any dotless string, e.g. www*
++ pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
++
++ # add the remaining fragments, ignore any wildcards
++ for frag in remainder:
++ pats.append(re.escape(frag))
++
++ pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z',
re.IGNORECASE)
++ return pat.match(hostname)
+
+
+ def match_hostname(cert, hostname):
+unchanged:
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -304,11 +304,7 @@ class BasicSocketTests(unittest.TestCase
+ fail(cert, 'Xa.com')
+ fail(cert, '.a.com')
+
+- cert = {'subject': ((('commonName', 'a.*.com'),),)}
+- ok(cert, 'a.foo.com')
+- fail(cert, 'a..com')
+- fail(cert, 'a.com')
+-
++ # only match one left-most wildcard
+ cert = {'subject': ((('commonName', 'f*.com'),),)}
+ ok(cert, 'foo.com')
+ ok(cert, 'f.com')
+@@ -323,6 +319,36 @@ class BasicSocketTests(unittest.TestCase
+ fail(cert, 'example.org')
+ fail(cert, 'null.python.org')
+
++ # error cases with wildcards
++ cert = {'subject': ((('commonName', '*.*.a.com'),),)}
++ fail(cert, 'bar.foo.a.com')
++ fail(cert, 'a.com')
++ fail(cert, 'Xa.com')
++ fail(cert, '.a.com')
++
++ cert = {'subject': ((('commonName', 'a.*.com'),),)}
++ fail(cert, 'a.foo.com')
++ fail(cert, 'a..com')
++ fail(cert, 'a.com')
++
++ # wildcard doesn't match IDNA prefix 'xn--'
++ idna =
'pthon.python.org'.encode("idna").decode("ascii")
++ cert = {'subject': ((('commonName', idna),),)}
++ ok(cert, idna)
++ cert = {'subject': ((('commonName',
'x*.python.org'),),)}
++ fail(cert, idna)
++ cert = {'subject': ((('commonName',
'xn--p*.python.org'),),)}
++ fail(cert, idna)
++
++ # wildcard in first fragment and IDNA A-labels in sequent fragments
++ # are supported.
++ idna =
'www*.pythn.org'.encode("idna").decode("ascii")
++ cert = {'subject': ((('commonName', idna),),)}
++ ok(cert,
'www.pythn.org'.encode("idna").decode("ascii"))
++ ok(cert,
'www1.pythn.org'.encode("idna").decode("ascii"))
++ fail(cert,
'ftp.pythn.org'.encode("idna").decode("ascii"))
++ fail(cert,
'pythn.org'.encode("idna").decode("ascii"))
++
+ # Slightly fake real-world example
+ cert = {'notAfter': 'Jun 26 21:41:46 2011 GMT',
+ 'subject': ((('commonName',
'linuxfrz.org'),),),
+@@ -383,7 +409,7 @@ class BasicSocketTests(unittest.TestCase
+ cert = {'subject': ((('commonName', 'a*b.com'),),)}
+ ok(cert, 'axxb.com')
+ cert = {'subject': ((('commonName', 'a*b.co*'),),)}
+- ok(cert, 'axxb.com')
++ fail(cert, 'axxb.com')
+ cert = {'subject': ((('commonName', 'a*b*.com'),),)}
+ with self.assertRaises(ssl.CertificateError) as cm:
+ ssl.match_hostname(cert, 'axxbxxc.com')
+--- a/Lib/ssl.py
++++ b/Lib/ssl.py
+@@ -192,7 +192,7 @@ def match_hostname(cert, hostname):
+ san = cert.get('subjectAltName', ())
+ for key, value in san:
+ if key == 'DNS':
+- if _dnsname_to_pat(value).match(hostname):
++ if _dnsname_match(value, hostname):
+ return
+ dnsnames.append(value)
+ if not dnsnames:
+@@ -203,7 +203,7 @@ def match_hostname(cert, hostname):
+ # XXX according to RFC 2818, the most specific Common Name
+ # must be used.
+ if key == 'commonName':
+- if _dnsname_to_pat(value).match(hostname):
++ if _dnsname_match(value, hostname):
+ return
+ dnsnames.append(value)
+ if len(dnsnames) > 1:
diff --git a/python3.spec b/python3.spec
index f445372..caba63c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -623,6 +623,11 @@ Patch185:
00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
# continuing bytecompilation for other files.
Patch186: 00186-dont-raise-from-py_compile.patch
+# 00187 #
+# Fix for rhbz#1023742
+# Change behavior of ssl.match_hostname() to follow RFC 6125
+# See
http://bugs.python.org/issue17997#msg194950 for more.
+Patch187: 00187-change-match_hostname-to-follow-RFC-6125.patch
# (New patches go here ^^^)
#
@@ -884,6 +889,7 @@ done
%patch184 -p1
%patch185 -p1
%patch186 -p1
+%patch187 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1732,6 +1738,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Nov 05 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-8
+- Changed behavior of ssl.match_hostname() to follow RFC 6125 (rhbz#1023742)
+
* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
- Bytecompile all *.py files properly during build (rhbz#1023607)
commit dfb79526a33fa8566c47f83f076a9d6ac676bcfc
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Tue Nov 5 15:38:57 2013 +0100
Temporarily turn of multicore build differently, using -J1 broke test_distutils
diff --git a/python3.spec b/python3.spec
index 71fa457..d792c03 100644
--- a/python3.spec
+++ b/python3.spec
@@ -970,8 +970,8 @@ BuildPython() {
# missing symbol AnnotateRWLockDestroy
#
# Invoke the build:
- # TODO: it seems that 3.4.0a4 fails without -J1, have to figure out why
- make EXTRA_CFLAGS="$CFLAGS -J1" %{?_smp_mflags}
+ # TODO: it seems that 3.4.0a4 fails with %{?_smp_flags}, have to figure out why
+ make EXTRA_CFLAGS="$CFLAGS"
popd
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfDir
commit f5250ecae71c9215886d2cf76d00c9f0662532be
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Tue Nov 5 12:39:14 2013 +0100
Update to Python 3.4 alpha 4.
- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
from py_compile)
- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
Koji), 142 (the mock issue that caused this is fixed)
- Added patch 187 (remove thread atfork) - will be in next version
- Refreshed script for checking pyc and pyo timestamps with new ignored files.
- The fips patch is disabled for now until upstream makes a final decision
what to do with sha3 implementation for 3.4.0.
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 90b876b..ddd5e77 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -650,8 +650,8 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
+Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h \
+ $(srcdir)/Python/ceval_systemtap.h @SYSTEMTAPDEPS@
- Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
- $(BYTESTR_DEPS)
+ Python/frozen.o: Python/importlib.h
+
@@ -724,6 +726,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py
$(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
Objects/typeslots.inc
@@ -735,8 +735,8 @@ diff -up Python-3.3.0rc2/Python/ceval.c.systemtap
Python-3.3.0rc2/Python/ceval.c
+ }
+
Py_LeaveRecursiveCall();
+ f->f_executing = 0;
tstate->frame = f->f_back;
-
diff -up Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap
Python-3.3.0rc2/Python/ceval_systemtap.h
--- Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap 2012-09-10 09:17:21.122511781
-0400
+++ Python-3.3.0rc2/Python/ceval_systemtap.h 2012-09-10 09:17:21.122511781 -0400
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index bd63852..f74bc87 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -2,7 +2,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
--- cpython-59223da36dec/Makefile.pre.in.no-static-lib 2012-08-07 16:43:43.296466422
-0400
+++ cpython-59223da36dec/Makefile.pre.in 2012-08-07 16:44:13.299464371 -0400
@@ -464,7 +464,7 @@ coverage:
-
+ $(MAKE) coverage-lcov
# Build the interpreter
-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
@@ -11,7 +11,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
platform: $(BUILDPYTHON) pybuilddir.txt
@@ -480,18 +480,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
- $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
+ _TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
-# Build static library
diff --git a/00114-statvfs-f_flag-constants.patch b/00114-statvfs-f_flag-constants.patch
index af0d780..ea99e08 100644
--- a/00114-statvfs-f_flag-constants.patch
+++ b/00114-statvfs-f_flag-constants.patch
@@ -2,38 +2,38 @@ diff -up Python-3.3.0b1/Modules/posixmodule.c.statvfs-f_flag-constants
Python-3.
--- Python-3.3.0b1/Modules/posixmodule.c.statvfs-f_flag-constants 2012-06-26
16:19:54.000000000 -0400
+++ Python-3.3.0b1/Modules/posixmodule.c 2012-07-20 13:39:18.595546387 -0400
@@ -11665,6 +11665,35 @@ all_ins(PyObject *d)
- if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
+ if (PyModule_AddIntMacro(m, ST_NOSUID)) return -1;
#endif /* ST_NOSUID */
+ /* GNU extensions */
+#ifdef ST_NODEV
-+ if (ins(d, "ST_NODEV", (long)ST_NODEV)) return -1;
++ if (PyModule_AddIntMacro(m, ST_NODEV)) return -1;
+#endif /* ST_NODEV */
+#ifdef ST_NOEXEC
-+ if (ins(d, "ST_NOEXEC", (long)ST_NOEXEC)) return -1;
++ if (PyModule_AddIntMacro(m, ST_NOEXEC)) return -1;
+#endif /* ST_NOEXEC */
+#ifdef ST_SYNCHRONOUS
-+ if (ins(d, "ST_SYNCHRONOUS", (long)ST_SYNCHRONOUS)) return -1;
++ if (PyModule_AddIntMacro(m, ST_SYNCHRONOUS)) return -1;
+#endif /* ST_SYNCHRONOUS */
+#ifdef ST_MANDLOCK
-+ if (ins(d, "ST_MANDLOCK", (long)ST_MANDLOCK)) return -1;
++ if (PyModule_AddIntMacro(m, ST_MANDLOCK)) return -1;
+#endif /* ST_MANDLOCK */
+#ifdef ST_WRITE
-+ if (ins(d, "ST_WRITE", (long)ST_WRITE)) return -1;
++ if (PyModule_AddIntMacro(m, ST_WRITE)) return -1;
+#endif /* ST_WRITE */
+#ifdef ST_APPEND
-+ if (ins(d, "ST_APPEND", (long)ST_APPEND)) return -1;
++ if (PyModule_AddIntMacro(m, ST_APPEND)) return -1;
+#endif /* ST_APPEND */
+#ifdef ST_NOATIME
-+ if (ins(d, "ST_NOATIME", (long)ST_NOATIME)) return -1;
++ if (PyModule_AddIntMacro(m, ST_NOATIME)) return -1;
+#endif /* ST_NOATIME */
+#ifdef ST_NODIRATIME
-+ if (ins(d, "ST_NODIRATIME", (long)ST_NODIRATIME)) return -1;
++ if (PyModule_AddIntMacro(m, ST_NODIRATIME)) return -1;
+#endif /* ST_NODIRATIME */
+#ifdef ST_RELATIME
-+ if (ins(d, "ST_RELATIME", (long)ST_RELATIME)) return -1;
++ if (PyModule_AddIntMacro(m, ST_RELATIME)) return -1;
+#endif /* ST_RELATIME */
+
/* FreeBSD sendfile() constants */
#ifdef SF_NODISKIO
- if (ins(d, "SF_NODISKIO", (long)SF_NODISKIO)) return -1;
+ if (PyModule_AddIntMacro(m, SF_NODISKIO)) return -1;
diff --git a/00132-add-rpmbuild-hooks-to-unittest.patch
b/00132-add-rpmbuild-hooks-to-unittest.patch
index fdfbab8..20930ac 100644
--- a/00132-add-rpmbuild-hooks-to-unittest.patch
+++ b/00132-add-rpmbuild-hooks-to-unittest.patch
@@ -6,11 +6,11 @@ diff -up
Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
import functools
import difflib
+import os
+ import logging
import pprint
import re
- import warnings
@@ -101,6 +102,43 @@ def expectedFailure(func):
- return wrapper
+ raise self.test_case.failureException(msg)
+# Non-standard/downstream-only hooks for handling issues with specific test
@@ -50,7 +50,7 @@ diff -up
Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
+ func(*args, **kwargs)
+ return wrapper
+
- class _AssertRaisesBaseContext(object):
+ class _AssertRaisesBaseContext(_BaseTestCaseContext):
def __init__(self, expected, test_case, callable_obj=None,
diff -up Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest
Python-3.2.2/Lib/unittest/__init__.py
diff --git a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
index 087705c..afd8685 100644
--- a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+++ b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
@@ -4,14 +4,14 @@ diff -up
Python-3.3.0b2/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sy
@@ -835,12 +835,17 @@ class SizeofTest(unittest.TestCase):
# type
# static type: PyTypeObject
- s = vsize('P2n15Pl4Pn9Pn11PI')
+ s = vsize('P2n15Pl4Pn9Pn11PIP')
+ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
+ if hasattr(sys, 'getcounts'):
+ s += struct.calcsize('3P2P')
check(int, s)
# (PyTypeObject + PyNumberMethods + PyMappingMethods +
# PySequenceMethods + PyBufferProcs + 4P)
- s = vsize('P2n15Pl4Pn9Pn11PI') + struct.calcsize('34P 3P 10P 2P
4P')
+ s = vsize('P2n15Pl4Pn9Pn11PIP') + struct.calcsize('34P 3P 10P 2P
4P')
# Separate block for PyDictKeysObject with 4 entries
s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P")
+ if hasattr(sys, 'getcounts'):
diff --git a/00142-skip-failing-pty-tests-in-rpmbuild.patch
b/00142-skip-failing-pty-tests-in-rpmbuild.patch
deleted file mode 100644
index 414ffcd..0000000
--- a/00142-skip-failing-pty-tests-in-rpmbuild.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff -up Python-2.7.2/Lib/test/test_openpty.py.skip-failing-pty-tests-in-rpmbuild
Python-2.7.2/Lib/test/test_openpty.py
---- Python-2.7.2/Lib/test/test_openpty.py.skip-failing-pty-tests-in-rpmbuild 2011-09-09
05:09:28.698920379 -0400
-+++ Python-2.7.2/Lib/test/test_openpty.py 2011-09-09 05:10:54.805914490 -0400
-@@ -8,6 +8,7 @@ if not hasattr(os, "openpty"):
-
-
- class OpenptyTest(unittest.TestCase):
-+ @unittest._skipInRpmBuild('sometimes fails in Koji, possibly due to a mock issue
(rhbz#714627)')
- def test(self):
- master, slave = os.openpty()
- if not os.isatty(slave):
-diff -up Python-2.7.2/Lib/test/test_pty.py.skip-failing-pty-tests-in-rpmbuild
Python-2.7.2/Lib/test/test_pty.py
---- Python-2.7.2/Lib/test/test_pty.py.skip-failing-pty-tests-in-rpmbuild 2011-09-09
05:09:36.781919825 -0400
-+++ Python-2.7.2/Lib/test/test_pty.py 2011-09-09 05:11:14.741913127 -0400
-@@ -109,6 +109,7 @@ class PtyTest(unittest.TestCase):
- os.close(master_fd)
-
-
-+ @unittest._skipInRpmBuild('sometimes fails in Koji, possibly due to a mock issue
(rhbz#714627)')
- def test_fork(self):
- debug("calling pty.fork()")
- pid, master_fd = pty.fork()
diff --git a/00143-tsc-on-ppc.patch b/00143-tsc-on-ppc.patch
index 447c6e3..7d3e876 100644
--- a/00143-tsc-on-ppc.patch
+++ b/00143-tsc-on-ppc.patch
@@ -31,7 +31,7 @@ diff -up Python-2.7.2/Python/ceval.c.tsc-on-ppc
Python-2.7.2/Python/ceval.c
-ppc_getcounter(uint64 *v)
+ppc32_getcounter(uint64 *v)
{
-- register unsigned long tbu, tb, tbu2;
+- unsigned long tbu, tb, tbu2;
+ union { long long ll; long ii[2]; } u;
+ long tmp;
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index f22d9bd..18b6a44 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -73,9 +73,9 @@ diff -up Python-3.2.2/Lib/hashlib.py.hashlib-fips
Python-3.2.2/Lib/hashlib.py
diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/test/test_hashlib.py
--- Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips 2011-09-03 12:16:43.000000000
-0400
+++ Python-3.2.2/Lib/test/test_hashlib.py 2011-09-14 01:45:48.462251974 -0400
-@@ -22,6 +22,19 @@ from test.support import _4G, precisionb
- # Were we compiled --with-pydebug or with #define Py_DEBUG?
- COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
+@@ -22,6 +22,20 @@ from test.support import _4G, precisionb
+ c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
+ py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
+def openssl_enforces_fips():
+ # Use the "openssl" command (if present) to try to determine if the local
@@ -90,9 +90,10 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
+ stdout, stderr = p.communicate(input=b'abc')
+ return b'unknown cipher' in stderr
+OPENSSL_ENFORCES_FIPS = openssl_enforces_fips()
-
++
def hexstr(s):
assert isinstance(s, bytes), repr(s)
+ h = "0123456789abcdef"
@@ -31,6 +44,16 @@ def hexstr(s):
r += h[(i >> 4) & 0xF] + h[i & 0xF]
return r
@@ -146,15 +147,15 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
- self.constructors_to_test['sha384'].add(_sha512.sha384)
- self.constructors_to_test['sha512'].add(_sha512.sha512)
+ constructors.add(suppress_fips(constructor))
-
- super(HashLibTestCase, self).__init__(*args, **kwargs)
-
+ _sha3 = self._conditional_import_module('_sha3')
+ if _sha3:
+ self.constructors_to_test['sha3_224'].add(_sha3.sha3_224)
@@ -138,7 +146,7 @@ class HashLibTestCase(unittest.TestCase)
def test_hexdigest(self):
- for name in self.supported_hash_names:
-- h = hashlib.new(name)
-+ h = hashlib.new(name, usedforsecurity=False)
+ for cons in self.hash_constructors:
+- h = cons()
++ h = cons(usedforsecurity=False)
assert isinstance(h.digest(), bytes), name
self.assertEqual(hexstr(h.digest()), h.hexdigest())
@@ -162,14 +163,14 @@ diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/tes
cees = b'c' * 126
for name in self.supported_hash_names:
-- m1 = hashlib.new(name)
-+ m1 = hashlib.new(name, usedforsecurity=False)
+- m1 = cons()
++ m1 = cons(usedforsecurity=False)
m1.update(aas)
m1.update(bees)
m1.update(cees)
-- m2 = hashlib.new(name)
-+ m2 = hashlib.new(name, usedforsecurity=False)
+- m2 = cons()
++ m2 = cons(usedforsecurity=False)
m2.update(aas + bees + cees)
self.assertEqual(m1.digest(), m2.digest())
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
index 50a0917..87c9396 100644
--- a/00153-fix-test_gdb-noise.patch
+++ b/00153-fix-test_gdb-noise.patch
@@ -19,8 +19,8 @@
--- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
+++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
@@ -144,6 +153,10 @@
- 'Do you need "set solib-search-path" or '
'"set sysroot"?',
+ 'warning: Source file is more recent than executable.',
)
+ ignore_patterns += ('warning: Unable to open',
+ 'Missing separate debuginfo for',
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
index 0f48df5..bf82b60 100644
--- a/00157-uid-gid-overflows.patch
+++ b/00157-uid-gid-overflows.patch
@@ -4,35 +4,35 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
@@ -1174,30 +1174,36 @@ if sys.platform != 'win32':
def test_setuid(self):
if os.getuid() != 0:
- self.assertRaises(os.error, os.setuid, 0)
+ self.assertRaises(OSError, os.setuid, 0)
+ self.assertRaises(TypeError, os.setuid, 'not an int')
self.assertRaises(OverflowError, os.setuid, 1<<32)
if hasattr(os, 'setgid'):
def test_setgid(self):
if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(os.error, os.setgid, 0)
+ self.assertRaises(OSError, os.setgid, 0)
+ self.assertRaises(TypeError, os.setgid, 'not an int')
self.assertRaises(OverflowError, os.setgid, 1<<32)
if hasattr(os, 'seteuid'):
def test_seteuid(self):
if os.getuid() != 0:
- self.assertRaises(os.error, os.seteuid, 0)
+ self.assertRaises(OSError, os.seteuid, 0)
+ self.assertRaises(TypeError, os.seteuid, 'not an int')
self.assertRaises(OverflowError, os.seteuid, 1<<32)
if hasattr(os, 'setegid'):
def test_setegid(self):
if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(os.error, os.setegid, 0)
+ self.assertRaises(OSError, os.setegid, 0)
+ self.assertRaises(TypeError, os.setegid, 'not an int')
self.assertRaises(OverflowError, os.setegid, 1<<32)
if hasattr(os, 'setreuid'):
def test_setreuid(self):
if os.getuid() != 0:
- self.assertRaises(os.error, os.setreuid, 0, 0)
+ self.assertRaises(OSError, os.setreuid, 0, 0)
+ self.assertRaises(TypeError, os.setreuid, 'not an int', 0)
+ self.assertRaises(TypeError, os.setreuid, 0, 'not an int')
self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
@@ -41,7 +41,7 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
@@ -1212,6 +1218,8 @@ if sys.platform != 'win32':
def test_setregid(self):
if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
- self.assertRaises(os.error, os.setregid, 0, 0)
+ self.assertRaises(OSError, os.setregid, 0, 0)
+ self.assertRaises(TypeError, os.setregid, 'not an int', 0)
+ self.assertRaises(TypeError, os.setregid, 0, 'not an int')
self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
diff --git a/00173-workaround-ENOPROTOOPT-in-bind_port.patch
b/00173-workaround-ENOPROTOOPT-in-bind_port.patch
index a62c3a4..498322c 100644
--- a/00173-workaround-ENOPROTOOPT-in-bind_port.patch
+++ b/00173-workaround-ENOPROTOOPT-in-bind_port.patch
@@ -1,6 +1,6 @@
diff -up Python-3.3.0/Lib/test/support.py.rhbz913732 Python-3.3.0/Lib/test/support.py
---- Python-3.3.0/Lib/test/support.py.rhbz913732 2013-03-04 16:25:53.885258476 -0500
-+++ Python-3.3.0/Lib/test/support.py 2013-03-04 16:25:58.499258157 -0500
+--- Python-3.4.0a4/Lib/test/support/__init__.py.rhbz913732 2013-03-04 16:25:53.885258476
-0500
++++ Python-3.4.0a4/Lib/test/support/__init__.py 2013-03-04 16:25:58.499258157 -0500
@@ -544,7 +544,8 @@ def bind_port(sock, host=HOST):
if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
raise TestFailed("tests should never set the SO_REUSEADDR "
\
@@ -11,4 +11,3 @@ diff -up Python-3.3.0/Lib/test/support.py.rhbz913732
Python-3.3.0/Lib/test/suppo
if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
raise TestFailed("tests should never set the SO_REUSEPORT "
\
"socket option on TCP/IP sockets!")
-diff -up Python-3.3.0/Lib/test/test_support.py.rhbz913732
Python-3.3.0/Lib/test/test_support.py
diff --git a/00182-fix-test_gdb-test_threads.patch
b/00182-fix-test_gdb-test_threads.patch
deleted file mode 100644
index 41de5b2..0000000
--- a/00182-fix-test_gdb-test_threads.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -up Python-3.3.1/Misc/NEWS.fix-test_gdb-test_threads Python-3.3.1/Misc/NEWS
-diff -up Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads
Python-3.3.1/Tools/gdb/libpython.py
---- Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads 2013-05-09
12:12:01.621592211 -0400
-+++ Python-3.3.1/Tools/gdb/libpython.py 2013-05-09 12:12:01.632592209 -0400
-@@ -1465,7 +1465,7 @@ class Frame(object):
- # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
- name = self._gdbframe.name()
- if name:
-- return name.startswith('pthread_cond_timedwait')
-+ return 'pthread_cond_timedwait' in name
-
- def is_gc_collect(self):
- '''Is this frame "collect" within the
garbage-collector?'''
diff --git a/00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
b/00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
deleted file mode 100644
index 888b43b..0000000
--- a/00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-# HG changeset patch
-# User Antoine Pitrou <solipsis(a)pitrou.net>
-# Date 1368892602 -7200
-# Node ID c627638753e2d25a98950585b259104a025937a9
-# Parent 9682241dc8fcb4b1aef083bd30860efa070c3d6d
-Issue #17980: Fix possible abuse of ssl.match_hostname() for denial of service using
certificates with many wildcards (CVE-2013-2099).
-
-diff --git a/Lib/ssl.py b/Lib/ssl.py
---- a/Lib/ssl.py
-+++ b/Lib/ssl.py
-@@ -129,9 +129,16 @@ class CertificateError(ValueError):
- pass
-
-
--def _dnsname_to_pat(dn):
-+def _dnsname_to_pat(dn, max_wildcards=1):
- pats = []
- for frag in dn.split(r'.'):
-+ if frag.count('*') > max_wildcards:
-+ # Issue #17980: avoid denials of service by refusing more
-+ # than one wildcard per fragment. A survery of established
-+ # policy among SSL implementations showed it to be a
-+ # reasonable choice.
-+ raise CertificateError(
-+ "too many wildcards in certificate DNS name: " + repr(dn))
- if frag == '*':
- # When '*' is a fragment by itself, it matches a non-empty dotless
- # fragment.
-diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
---- a/Lib/test/test_ssl.py
-+++ b/Lib/test/test_ssl.py
-@@ -349,6 +349,17 @@ class BasicSocketTests(unittest.TestCase
- self.assertRaises(ValueError, ssl.match_hostname, None, 'example.com')
- self.assertRaises(ValueError, ssl.match_hostname, {}, 'example.com')
-
-+ # Issue #17980: avoid denials of service by refusing more than one
-+ # wildcard per fragment.
-+ cert = {'subject': ((('commonName', 'a*b.com'),),)}
-+ ok(cert, 'axxb.com')
-+ cert = {'subject': ((('commonName', 'a*b.co*'),),)}
-+ ok(cert, 'axxb.com')
-+ cert = {'subject': ((('commonName', 'a*b*.com'),),)}
-+ with self.assertRaises(ssl.CertificateError) as cm:
-+ ssl.match_hostname(cert, 'axxbxxc.com')
-+ self.assertIn("too many wildcards", str(cm.exception))
-+
- def test_server_side(self):
- # server_hostname doesn't work for server sockets
- ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
diff --git a/00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
b/00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
deleted file mode 100644
index 41db4d2..0000000
--- a/00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
+++ /dev/null
@@ -1,241 +0,0 @@
-diff -r e0f86c3b3685 Lib/test/nullbytecert.pem
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/Lib/test/nullbytecert.pem Sun Aug 11 18:17:23 2013 +0200
-@@ -0,0 +1,90 @@
-+Certificate:
-+ Data:
-+ Version: 3 (0x2)
-+ Serial Number: 0 (0x0)
-+ Signature Algorithm: sha1WithRSAEncryption
-+ Issuer: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python
Core Development,
CN=null.python.org\x00example.org/emailAddress=python-dev@python.org
-+ Validity
-+ Not Before: Aug 7 13:11:52 2013 GMT
-+ Not After : Aug 7 13:12:52 2013 GMT
-+ Subject: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python
Core Development,
CN=null.python.org\x00example.org/emailAddress=python-dev@python.org
-+ Subject Public Key Info:
-+ Public Key Algorithm: rsaEncryption
-+ Public-Key: (2048 bit)
-+ Modulus:
-+ 00:b5:ea:ed:c9:fb:46:7d:6f:3b:76:80:dd:3a:f3:
-+ 03:94:0b:a7:a6:db:ec:1d:df:ff:23:74:08:9d:97:
-+ 16:3f:a3:a4:7b:3e:1b:0e:96:59:25:03:a7:26:e2:
-+ 88:a9:cf:79:cd:f7:04:56:b0:ab:79:32:6e:59:c1:
-+ 32:30:54:eb:58:a8:cb:91:f0:42:a5:64:27:cb:d4:
-+ 56:31:88:52:ad:cf:bd:7f:f0:06:64:1f:cc:27:b8:
-+ a3:8b:8c:f3:d8:29:1f:25:0b:f5:46:06:1b:ca:02:
-+ 45:ad:7b:76:0a:9c:bf:bb:b9:ae:0d:16:ab:60:75:
-+ ae:06:3e:9c:7c:31:dc:92:2f:29:1a:e0:4b:0c:91:
-+ 90:6c:e9:37:c5:90:d7:2a:d7:97:15:a3:80:8f:5d:
-+ 7b:49:8f:54:30:d4:97:2c:1c:5b:37:b5:ab:69:30:
-+ 68:43:d3:33:78:4b:02:60:f5:3c:44:80:a1:8f:e7:
-+ f0:0f:d1:5e:87:9e:46:cf:62:fc:f9:bf:0c:65:12:
-+ f1:93:c8:35:79:3f:c8:ec:ec:47:f5:ef:be:44:d5:
-+ ae:82:1e:2d:9a:9f:98:5a:67:65:e1:74:70:7c:cb:
-+ d3:c2:ce:0e:45:49:27:dc:e3:2d:d4:fb:48:0e:2f:
-+ 9e:77:b8:14:46:c0:c4:36:ca:02:ae:6a:91:8c:da:
-+ 2f:85
-+ Exponent: 65537 (0x10001)
-+ X509v3 extensions:
-+ X509v3 Basic Constraints: critical
-+ CA:FALSE
-+ X509v3 Subject Key Identifier:
-+ 88:5A:55:C0:52:FF:61:CD:52:A3:35:0F:EA:5A:9C:24:38:22:F7:5C
-+ X509v3 Key Usage:
-+ Digital Signature, Non Repudiation, Key Encipherment
-+ X509v3 Subject Alternative Name:
-+ *************************************************************
-+ WARNING: The values for DNS, email and URI are WRONG. OpenSSL
-+ doesn't print the text after a NULL byte.
-+ *************************************************************
-+
DNS:altnull.python.org, email:null@python.org,
URI:http://null.python.org, IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1
-+ Signature Algorithm: sha1WithRSAEncryption
-+ ac:4f:45:ef:7d:49:a8:21:70:8e:88:59:3e:d4:36:42:70:f5:
-+ a3:bd:8b:d7:a8:d0:58:f6:31:4a:b1:a4:a6:dd:6f:d9:e8:44:
-+ 3c:b6:0a:71:d6:7f:b1:08:61:9d:60:ce:75:cf:77:0c:d2:37:
-+ 86:02:8d:5e:5d:f9:0f:71:b4:16:a8:c1:3d:23:1c:f1:11:b3:
-+ 56:6e:ca:d0:8d:34:94:e6:87:2a:99:f2:ae:ae:cc:c2:e8:86:
-+ de:08:a8:7f:c5:05:fa:6f:81:a7:82:e6:d0:53:9d:34:f4:ac:
-+ 3e:40:fe:89:57:7a:29:a4:91:7e:0b:c6:51:31:e5:10:2f:a4:
-+ 60:76:cd:95:51:1a:be:8b:a1:b0:fd:ad:52:bd:d7:1b:87:60:
-+ d2:31:c7:17:c4:18:4f:2d:08:25:a3:a7:4f:b7:92:ca:e2:f5:
-+ 25:f1:54:75:81:9d:b3:3d:61:a2:f7:da:ed:e1:c6:6f:2c:60:
-+ 1f:d8:6f:c5:92:05:ab:c9:09:62:49:a9:14:ad:55:11:cc:d6:
-+ 4a:19:94:99:97:37:1d:81:5f:8b:cf:a3:a8:96:44:51:08:3d:
-+ 0b:05:65:12:eb:b6:70:80:88:48:72:4f:c6:c2:da:cf:cd:8e:
-+ 5b:ba:97:2f:60:b4:96:56:49:5e:3a:43:76:63:04:be:2a:f6:
-+ c1:ca:a9:94
-+-----BEGIN CERTIFICATE-----
-+MIIE2DCCA8CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBxTELMAkGA1UEBhMCVVMx
-+DzANBgNVBAgMBk9yZWdvbjESMBAGA1UEBwwJQmVhdmVydG9uMSMwIQYDVQQKDBpQ
-+eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEgMB4GA1UECwwXUHl0aG9uIENvcmUg
-+RGV2ZWxvcG1lbnQxJDAiBgNVBAMMG251bGwucHl0aG9uLm9yZwBleGFtcGxlLm9y
-+ZzEkMCIGCSqGSIb3DQEJARYVcHl0aG9uLWRldkBweXRob24ub3JnMB4XDTEzMDgw
-+NzEzMTE1MloXDTEzMDgwNzEzMTI1MlowgcUxCzAJBgNVBAYTAlVTMQ8wDQYDVQQI
-+DAZPcmVnb24xEjAQBgNVBAcMCUJlYXZlcnRvbjEjMCEGA1UECgwaUHl0aG9uIFNv
-+ZnR3YXJlIEZvdW5kYXRpb24xIDAeBgNVBAsMF1B5dGhvbiBDb3JlIERldmVsb3Bt
-+ZW50MSQwIgYDVQQDDBtudWxsLnB5dGhvbi5vcmcAZXhhbXBsZS5vcmcxJDAiBgkq
-+hkiG9w0BCQEWFXB5dGhvbi1kZXZAcHl0aG9uLm9yZzCCASIwDQYJKoZIhvcNAQEB
-+BQADggEPADCCAQoCggEBALXq7cn7Rn1vO3aA3TrzA5QLp6bb7B3f/yN0CJ2XFj+j
-+pHs+Gw6WWSUDpybiiKnPec33BFawq3kyblnBMjBU61ioy5HwQqVkJ8vUVjGIUq3P
-+vX/wBmQfzCe4o4uM89gpHyUL9UYGG8oCRa17dgqcv7u5rg0Wq2B1rgY+nHwx3JIv
-+KRrgSwyRkGzpN8WQ1yrXlxWjgI9de0mPVDDUlywcWze1q2kwaEPTM3hLAmD1PESA
-+oY/n8A/RXoeeRs9i/Pm/DGUS8ZPINXk/yOzsR/XvvkTVroIeLZqfmFpnZeF0cHzL
-+08LODkVJJ9zjLdT7SA4vnne4FEbAxDbKAq5qkYzaL4UCAwEAAaOB0DCBzTAMBgNV
-+HRMBAf8EAjAAMB0GA1UdDgQWBBSIWlXAUv9hzVKjNQ/qWpwkOCL3XDALBgNVHQ8E
-+BAMCBeAwgZAGA1UdEQSBiDCBhYIeYWx0bnVsbC5weXRob24ub3JnAGV4YW1wbGUu
-+Y29tgSBudWxsQHB5dGhvbi5vcmcAdXNlckBleGFtcGxlLm9yZ4YpaHR0cDovL251
-+bGwucHl0aG9uLm9yZwBodHRwOi8vZXhhbXBsZS5vcmeHBMAAAgGHECABDbgAAAAA
-+AAAAAAAAAAEwDQYJKoZIhvcNAQEFBQADggEBAKxPRe99SaghcI6IWT7UNkJw9aO9
-+i9eo0Fj2MUqxpKbdb9noRDy2CnHWf7EIYZ1gznXPdwzSN4YCjV5d+Q9xtBaowT0j
-+HPERs1ZuytCNNJTmhyqZ8q6uzMLoht4IqH/FBfpvgaeC5tBTnTT0rD5A/olXeimk
-+kX4LxlEx5RAvpGB2zZVRGr6LobD9rVK91xuHYNIxxxfEGE8tCCWjp0+3ksri9SXx
-+VHWBnbM9YaL32u3hxm8sYB/Yb8WSBavJCWJJqRStVRHM1koZlJmXNx2BX4vPo6iW
-+RFEIPQsFZRLrtnCAiEhyT8bC2s/Njlu6ly9gtJZWSV46Q3ZjBL4q9sHKqZQ=
-+-----END CERTIFICATE-----
-diff -r e0f86c3b3685 Lib/test/test_ssl.py
---- a/Lib/test/test_ssl.py Sun Aug 11 13:04:50 2013 +0300
-+++ b/Lib/test/test_ssl.py Sun Aug 11 18:17:23 2013 +0200
-@@ -55,6 +55,7 @@
- WRONGCERT = data_file("XXXnonexisting.pem")
- BADKEY = data_file("badkey.pem")
- NOKIACERT = data_file("nokia.pem")
-+NULLBYTECERT = data_file("nullbytecert.pem")
-
- DHFILE = data_file("dh512.pem")
- BYTES_DHFILE = os.fsencode(DHFILE)
-@@ -162,6 +163,27 @@
- ('DNS', 'projects.forum.nokia.com'))
- )
-
-+ def test_parse_cert_CVE_2013_4073(self):
-+ p = ssl._ssl._test_decode_cert(NULLBYTECERT)
-+ if support.verbose:
-+ sys.stdout.write("\n" + pprint.pformat(p) + "\n")
-+ subject = ((('countryName', 'US'),),
-+ (('stateOrProvinceName', 'Oregon'),),
-+ (('localityName', 'Beaverton'),),
-+ (('organizationName', 'Python Software
Foundation'),),
-+ (('organizationalUnitName', 'Python Core
Development'),),
-+ (('commonName', 'null.python.org\x00example.org'),),
-+ (('emailAddress', 'python-dev(a)python.org'),))
-+ self.assertEqual(p['subject'], subject)
-+ self.assertEqual(p['issuer'], subject)
-+ self.assertEqual(p['subjectAltName'],
-+ (('DNS', 'altnull.python.org\x00example.com'),
-+ ('email',
'null@python.org\x00user(a)example.org'),
-+ ('URI',
'http://null.python.org\x00http://example.org'),
-+ ('IP Address', '192.0.2.1'),
-+ ('IP Address', '2001:DB8:0:0:0:0:0:1\n'))
-+ )
-+
- def test_DER_to_PEM(self):
- with open(SVN_PYTHON_ORG_ROOT_CERT, 'r') as f:
- pem = f.read()
-@@ -294,6 +316,13 @@
- fail(cert, 'foo.a.com')
- fail(cert, 'bar.foo.com')
-
-+ # NULL bytes are bad, CVE-2013-4073
-+ cert = {'subject': ((('commonName',
-+ 'null.python.org\x00example.org'),),)}
-+ ok(cert, 'null.python.org\x00example.org') # or raise an error?
-+ fail(cert, 'example.org')
-+ fail(cert, 'null.python.org')
-+
- # Slightly fake real-world example
- cert = {'notAfter': 'Jun 26 21:41:46 2011 GMT',
- 'subject': ((('commonName',
'linuxfrz.org'),),),
-diff -r e0f86c3b3685 Modules/_ssl.c
---- a/Modules/_ssl.c Sun Aug 11 13:04:50 2013 +0300
-+++ b/Modules/_ssl.c Sun Aug 11 18:17:23 2013 +0200
-@@ -771,12 +771,14 @@
- ext->value->length));
-
- for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
--
- /* get a rendering of each name in the set of names */
-+ int gntype;
-+ ASN1_STRING *as = NULL;
-
- name = sk_GENERAL_NAME_value(names, j);
-- if (name->type == GEN_DIRNAME) {
--
-+ gntype = name-> type;
-+ switch (gntype) {
-+ case GEN_DIRNAME:
- /* we special-case DirName as a tuple of
- tuples of attributes */
-
-@@ -798,11 +800,62 @@
- goto fail;
- }
- PyTuple_SET_ITEM(t, 1, v);
-+ break;
-
-- } else {
-+ case GEN_EMAIL:
-+ case GEN_DNS:
-+ case GEN_URI:
-+ /* GENERAL_NAME_print() doesn't handle NUL bytes in ASN1_string
-+ correctly. */
-+ t = PyTuple_New(2);
-+ if (t == NULL)
-+ goto fail;
-+ switch (gntype) {
-+ case GEN_EMAIL:
-+ v = PyUnicode_FromString("email");
-+ as = name->d.rfc822Name;
-+ break;
-+ case GEN_DNS:
-+ v = PyUnicode_FromString("DNS");
-+ as = name->d.dNSName;
-+ break;
-+ case GEN_URI:
-+ v = PyUnicode_FromString("URI");
-+ as = name->d.uniformResourceIdentifier;
-+ break;
-+ }
-+ if (v == NULL) {
-+ Py_DECREF(t);
-+ goto fail;
-+ }
-+ PyTuple_SET_ITEM(t, 0, v);
-+ v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_data(as),
-+ ASN1_STRING_length(as));
-+ if (v == NULL) {
-+ Py_DECREF(t);
-+ goto fail;
-+ }
-+ PyTuple_SET_ITEM(t, 1, v);
-+ break;
-
-+ default:
- /* for everything else, we use the OpenSSL print form */
--
-+ switch (gntype) {
-+ /* check for new general name type */
-+ case GEN_OTHERNAME:
-+ case GEN_X400:
-+ case GEN_EDIPARTY:
-+ case GEN_IPADD:
-+ case GEN_RID:
-+ break;
-+ default:
-+ if (PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
-+ "Unknown general name type %d",
-+ gntype) == -1) {
-+ goto fail;
-+ }
-+ break;
-+ }
- (void) BIO_reset(biobuf);
- GENERAL_NAME_print(biobuf, name);
- len = BIO_gets(biobuf, buf, sizeof(buf)-1);
-@@ -829,6 +882,7 @@
- goto fail;
- }
- PyTuple_SET_ITEM(t, 1, v);
-+ break;
- }
-
- /* and add that rendering to the list */
diff --git a/00186-dont-raise-from-py_compile.patch
b/00186-dont-raise-from-py_compile.patch
index 1e7fb06..25c4a9d 100644
--- a/00186-dont-raise-from-py_compile.patch
+++ b/00186-dont-raise-from-py_compile.patch
@@ -1,30 +1,3 @@
-diff -r 7fa3e824a4ee Lib/py_compile.py
---- a/Lib/py_compile.py Tue Oct 29 22:25:06 2013 -0400
-+++ b/Lib/py_compile.py Wed Oct 30 11:08:31 2013 +0100
-@@ -108,15 +108,15 @@
- byte-compile all installed files (or all files in selected
- directories).
- """
-- with tokenize.open(file) as f:
-- try:
-- st = os.fstat(f.fileno())
-- except AttributeError:
-- st = os.stat(file)
-- timestamp = int(st.st_mtime)
-- size = st.st_size & 0xFFFFFFFF
-- codestring = f.read()
- try:
-+ with tokenize.open(file) as f:
-+ try:
-+ st = os.fstat(f.fileno())
-+ except AttributeError:
-+ st = os.stat(file)
-+ timestamp = int(st.st_mtime)
-+ size = st.st_size & 0xFFFFFFFF
-+ codestring = f.read()
- codeobject = builtins.compile(codestring, dfile or file, 'exec',
- optimize=optimize)
- except Exception as err:
diff -r 7fa3e824a4ee Lib/test/test_py_compile.py
--- a/Lib/test/test_py_compile.py Tue Oct 29 22:25:06 2013 -0400
+++ b/Lib/test/test_py_compile.py Wed Oct 30 11:08:31 2013 +0100
@@ -36,6 +9,6 @@ diff -r 7fa3e824a4ee Lib/test/test_py_compile.py
+ bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py')
+ self.assertIsNone(py_compile.compile(bad_coding, doraise=False))
+
- def test_main():
- support.run_unittest(PyCompileTests)
-
+ def test_relative_path(self):
+ py_compile.compile(os.path.relpath(self.source_path),
+ os.path.relpath(self.pyc_path))
diff --git a/00187-remove-pthread-atfork.patch b/00187-remove-pthread-atfork.patch
new file mode 100644
index 0000000..04af52d
--- /dev/null
+++ b/00187-remove-pthread-atfork.patch
@@ -0,0 +1,89 @@
+diff -r 6fdbb81b4020 -r 705f2addd0f0 Modules/_ssl.c
+--- a/Modules/_ssl.c Tue Oct 29 12:14:55 2013 +0100
++++ b/Modules/_ssl.c Tue Oct 29 21:11:55 2013 +0100
+@@ -19,9 +19,6 @@
+ #ifdef WITH_THREAD
+ #include "pythread.h"
+
+-#ifdef HAVE_PTHREAD_ATFORK
+-# include <pthread.h>
+-#endif
+
+ #define PySSL_BEGIN_ALLOW_THREADS_S(save) \
+ do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
+@@ -2950,64 +2947,6 @@
+ Returns number of bytes read. Raises SSLError if connection to EGD\n\
+ fails or if it does not provide enough data to seed PRNG.");
+
+-/* Seed OpenSSL's PRNG at fork(),
http://bugs.python.org/issue18747
+- *
+- * The parent handler seeds the PRNG from pseudo-random data like pid, the
+- * current time (miliseconds or seconds) and an uninitialized array.
+- * The array contains stack variables that are impossible to predict
+- * on most systems, e.g. function return address (subject to ASLR), the
+- * stack protection canary and automatic variables.
+- * The code is inspired by Apache's ssl_rand_seed() function.
+- *
+- * Note:
+- * The code uses pthread_atfork() until Python has a proper atfork API. The
+- * handlers are not removed from the child process. A parent handler is used
+- * instead of a child handler because fork() is supposed to be async-signal
+- * safe but the handler calls unsafe functions.
+- */
+-
+-#if defined(HAVE_PTHREAD_ATFORK) && defined(WITH_THREAD)
+-#define PYSSL_RAND_ATFORK 1
+-
+-static void
+-PySSL_RAND_atfork_parent(void)
+-{
+- struct {
+- char stack[128]; /* uninitialized (!) stack data, 128 is an
+- arbitrary number. */
+- pid_t pid; /* current pid */
+- _PyTime_timeval tp; /* current time */
+- } seed;
+-
+-#ifdef WITH_VALGRIND
+- VALGRIND_MAKE_MEM_DEFINED(seed.stack, sizeof(seed.stack));
+-#endif
+- seed.pid = getpid();
+- _PyTime_gettimeofday(&(seed.tp));
+- RAND_add((unsigned char *)&seed, sizeof(seed), 0.0);
+-}
+-
+-static int
+-PySSL_RAND_atfork(void)
+-{
+- static int registered = 0;
+- int retval;
+-
+- if (registered)
+- return 0;
+-
+- retval = pthread_atfork(NULL, /* prepare */
+- PySSL_RAND_atfork_parent, /* parent */
+- NULL); /* child */
+- if (retval != 0) {
+- PyErr_SetFromErrno(PyExc_OSError);
+- return -1;
+- }
+- registered = 1;
+- return 0;
+-}
+-#endif /* HAVE_PTHREAD_ATFORK */
+-
+ #endif /* HAVE_OPENSSL_RAND */
+
+
+@@ -3623,10 +3561,5 @@
+ if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
+ return NULL;
+
+-#ifdef PYSSL_RAND_ATFORK
+- if (PySSL_RAND_atfork() == -1)
+- return NULL;
+-#endif
+-
+ return m;
+ }
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
index bcd5baf..5fd11cc 100644
--- a/check-pyc-and-pyo-timestamps.py
+++ b/check-pyc-and-pyo-timestamps.py
@@ -16,10 +16,12 @@ not_compiled = [
'test/badsyntax_future7.py',
'test/badsyntax_future8.py',
'test/badsyntax_future9.py',
+ 'test/badsyntax_future10.py',
'test/badsyntax_pep3120.py',
'lib2to3/tests/data/bom.py',
'lib2to3/tests/data/crlf.py',
'lib2to3/tests/data/different_encoding.py',
+ 'lib2to3/tests/data/false_encoding.py',
'lib2to3/tests/data/py2_test_grammar.py',
'.debug-gdb.py',
]
diff --git a/python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
b/python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
deleted file mode 100644
index 6f43c72..0000000
--- a/python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up Python-3.2.1/Lib/test/test_subprocess.py.non-readable-path
Python-3.2.1/Lib/test/test_subprocess.py
---- Python-3.2.1/Lib/test/test_subprocess.py.non-readable-path 2011-07-09
02:58:51.000000000 -0400
-+++ Python-3.2.1/Lib/test/test_subprocess.py 2011-07-11 11:34:16.284426005 -0400
-@@ -618,7 +618,7 @@ class ProcessTestCase(BaseTestCase):
- for i in range(1024):
- # Windows raises IOError. Others raise OSError.
- with self.assertRaises(EnvironmentError) as c:
-- subprocess.Popen(['nonexisting_i_hope'],
-+ subprocess.Popen(['/usr/bin/nonexisting_i_hope'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- # ignore errors that indicate the command was not found
diff --git a/python-3.3.0b1-lib64.patch b/python-3.3.0b1-lib64.patch
index 5ae03aa..afbdc6c 100644
--- a/python-3.3.0b1-lib64.patch
+++ b/python-3.3.0b1-lib64.patch
@@ -39,9 +39,9 @@ diff -up cpython-59223da36dec/Lib/site.py.lib64
cpython-59223da36dec/Lib/site.py
--- cpython-59223da36dec/Lib/site.py.lib64 2012-08-07 06:10:57.000000000 -0400
+++ cpython-59223da36dec/Lib/site.py 2012-08-07 16:41:00.573477549 -0400
@@ -303,12 +303,16 @@ def getsitepackages(prefixes=None):
- if sys.platform in ('os2emx', 'riscos'):
- sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
- elif os.sep == '/':
+ seen.add(prefix)
+
+ if os.sep == '/':
+ sitepackages.append(os.path.join(prefix, "lib64",
+ "python" + sys.version[:3],
+ "site-packages"))
diff --git a/python3.spec b/python3.spec
index f445372..71fa457 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,10 +2,13 @@
# Conditionals and other variables controlling the build
# ======================================================
-%global pybasever 3.3
+%global pybasever 3.4
# pybasever without the dot:
-%global pyshortver 33
+%global pyshortver 34
+
+# prereleasetag
+%global prerel a4
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -35,9 +38,9 @@
# For example,
# foo/bar.py
# now has bytecode at:
-# foo/__pycache__/bar.cpython-33.pyc
-# foo/__pycache__/bar.cpython-33.pyo
-%global bytecode_suffixes .cpython-33.py?
+# foo/__pycache__/bar.cpython-34.pyc
+# foo/__pycache__/bar.cpython-34.pyo
+%global bytecode_suffixes .cpython-34.py?
# Python's configure script defines SOVERSION, and this is used in the Makefile
# to determine INSTSONAME, the name of the libpython DSO:
@@ -125,8 +128,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.2
-Release: 7%{?dist}
+Version: %{pybasever}.0
+Release: %{?prerel:0.}1%{?prerel:.%{prerel}}%{?dist}
License: Python
Group: Development/Languages
@@ -187,7 +190,7 @@ BuildRequires: zlib-devel
# Source code and patches
# =======================
-Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
+Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}%{?prerel}.t...
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -276,17 +279,6 @@ Patch114: 00114-statvfs-f_flag-constants.patch
# Not yet sent upstream
Patch125: 00125-less-verbose-COUNT_ALLOCS.patch
-# In my koji builds, /root/bin is in the PATH for some reason
-# This leads to test_subprocess.py failing, due to "test_leaking_fds_on_error"
-# trying every dir in PATH for "nonexisting_i_hope", which leads to it raising
-# OSError: [Errno 13] Permission denied
-# when it tries to read /root/bin, rather than raising "No such file"
-#
-# Work around this by specifying an absolute path for the non-existant
-# executable
-# Not yet sent upstream
-Patch129: python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
-
# 00130 #
# Python 2's:
# Patch130: python-2.7.2-add-extension-suffix-to-python-config.patch
@@ -357,10 +349,6 @@ Patch140: python3-arm-skip-failing-fragile-test.patch
# Not yet sent upstream
Patch141: 00141-fix-test_gc_with_COUNT_ALLOCS.patch
-# 00142 #
-# Some pty tests fail when run in mock (rhbz#714627):
-Patch142: 00142-skip-failing-pty-tests-in-rpmbuild.patch
-
# 00143 #
# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
# aliasing violations (rhbz#698726)
@@ -393,7 +381,8 @@ Patch143: 00143-tsc-on-ppc.patch
# - don't build the _md5 and _sha* modules; rely on the _hashlib implementation
# of hashlib
# (rhbz#563986)
-Patch146: 00146-hashlib-fips.patch
+# TODO: figure out how to update properly for sha3
+# Patch146: 00146-hashlib-fips.patch
# 00147 #
# Add a sys._debugmallocstats() function
@@ -595,10 +584,8 @@ Patch180: 00180-python-add-support-for-ppc64p7.patch
# Patch182: 00182-fix-test_gdb-test_threads.patch
# 00183 #
-# Upstream fix for CVE-2013-2099 (ssl.match_hostname DOS)
-#
http://bugs.python.org/issue17980
-#
http://hg.python.org/cpython/rev/c627638753e2
-Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
+# Fixed upstream as of Python 3.4.0a4
+# Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
# 00184 #
# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=979696
@@ -609,20 +596,22 @@ Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
Patch184: 00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
# 00185 #
-# Fix for CVE-2013-4238 --
-# SSL module fails to handle NULL bytes inside subjectAltNames general names
-#
http://bugs.python.org/issue18709
-# rhbz#996399
-Patch185: 00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
+# Fixed upstream as of Python 3.4.0a4
+# Patch185: 00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
# 00186 #
# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=1023607
-# Fixes the problem of some *.py files not being bytecompiled properly
-# during build. This was result of py_compile.compile raising exception
-# when trying to convert test file with bad encoding, and thus not
-# continuing bytecompilation for other files.
+# Previously, this fixed a problem where some *.py files were not being
+# bytecompiled properly during build. This was result of py_compile.compile
+# raising exception when trying to convert test file with bad encoding, and
+# thus not continuing bytecompilation for other files.
+# This was fixed upstream, but the test hasn't been merged yet, so we keep it
Patch186: 00186-dont-raise-from-py_compile.patch
+# 00187 #
+# Temporarily add this upstream patch, should be in next upstream release
+Patch187: 00187-remove-pthread-atfork.patch
+
# (New patches go here ^^^)
#
@@ -762,7 +751,7 @@ can load its own extensions.
# ======================================================
%prep
-%setup -q -n Python-%{version}
+%setup -q -n Python-%{version}%{?prerel}
chmod +x %{SOURCE1}
%if 0%{?with_systemtap}
@@ -789,6 +778,7 @@ rm -r Modules/zlib || exit 1
#
# For example, in our builds hashlib.md5 is implemented within _hashlib via
# OpenSSL (and thus respects FIPS mode), and does not fall back to _md5
+# TODO: there seems to be no OpenSSL support in Python for sha3, investigate
for f in md5module.c sha1module.c sha256module.c sha512module.c; do
rm Modules/$f
done
@@ -816,8 +806,6 @@ done
%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
-%patch129 -p1
-
%ifarch ppc %{power64}
%patch131 -p1
%endif
@@ -835,11 +823,10 @@ done
%endif
# 00140: not for python3
%patch141 -p1
-%patch142 -p1
%patch143 -p1 -b .tsc-on-ppc
# 00144: not for python3
# 00145: not for python3
-%patch146 -p1
+#patch146 -p1
# 00147: upstream as of Python 3.3.0
# 00148: upstream as of Python 3.2.3
# 00149: upstream as of Python 3.2.3
@@ -880,10 +867,11 @@ done
%patch180 -p1
# 00181: not for python3
# 00182: upstream as of Python 3.3.2
-%patch183 -p1
-%patch184 -p1
-%patch185 -p1
+# 00183 upstream as of Python 3.4.0a4
+%patch184 -p1
+# 00185 upstream as of Python 3.4.0a4
%patch186 -p1
+%patch187 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -982,7 +970,8 @@ BuildPython() {
# missing symbol AnnotateRWLockDestroy
#
# Invoke the build:
- make EXTRA_CFLAGS="$CFLAGS" %{?_smp_mflags}
+ # TODO: it seems that 3.4.0a4 fails without -J1, have to figure out why
+ make EXTRA_CFLAGS="$CFLAGS -J1" %{?_smp_mflags}
popd
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfDir
@@ -1732,6 +1721,20 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Nov 04 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.4.0-0.1.a4
+- Update to Python 3.4 alpha 4.
+- Refreshed patches: 55 (systemtap), 102 (lib64), 111 (no static lib),
+114 (statvfs flags), 132 (unittest rpmbuild hooks), 134 (fix COUNT_ALLOCS in
+test_sys), 143 (tsc on ppc64), 146 (hashlib fips), 153 (test gdb noise),
+157 (UID+GID overflows), 173 (ENOPROTOOPT in bind_port), 186 (dont raise
+from py_compile)
+- Removed patches: 129 (test_subprocess nonreadable dir - no longer fails in
+Koji), 142 (the mock issue that caused this is fixed)
+- Added patch 187 (remove thread atfork) - will be in next version
+- Refreshed script for checking pyc and pyo timestamps with new ignored files.
+- The fips patch is disabled for now until upstream makes a final decision
+what to do with sha3 implementation for 3.4.0.
+
* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
- Bytecompile all *.py files properly during build (rhbz#1023607)
commit 3dbbc14e760256f1b8bf22b0a64e0234c4708ac5
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Oct 30 10:50:01 2013 +0100
Bytecompile all *.py files properly during build (rhbz#1023607)
diff --git a/00186-dont-raise-from-py_compile.patch
b/00186-dont-raise-from-py_compile.patch
new file mode 100644
index 0000000..1e7fb06
--- /dev/null
+++ b/00186-dont-raise-from-py_compile.patch
@@ -0,0 +1,41 @@
+diff -r 7fa3e824a4ee Lib/py_compile.py
+--- a/Lib/py_compile.py Tue Oct 29 22:25:06 2013 -0400
++++ b/Lib/py_compile.py Wed Oct 30 11:08:31 2013 +0100
+@@ -108,15 +108,15 @@
+ byte-compile all installed files (or all files in selected
+ directories).
+ """
+- with tokenize.open(file) as f:
+- try:
+- st = os.fstat(f.fileno())
+- except AttributeError:
+- st = os.stat(file)
+- timestamp = int(st.st_mtime)
+- size = st.st_size & 0xFFFFFFFF
+- codestring = f.read()
+ try:
++ with tokenize.open(file) as f:
++ try:
++ st = os.fstat(f.fileno())
++ except AttributeError:
++ st = os.stat(file)
++ timestamp = int(st.st_mtime)
++ size = st.st_size & 0xFFFFFFFF
++ codestring = f.read()
+ codeobject = builtins.compile(codestring, dfile or file, 'exec',
+ optimize=optimize)
+ except Exception as err:
+diff -r 7fa3e824a4ee Lib/test/test_py_compile.py
+--- a/Lib/test/test_py_compile.py Tue Oct 29 22:25:06 2013 -0400
++++ b/Lib/test/test_py_compile.py Wed Oct 30 11:08:31 2013 +0100
+@@ -54,6 +54,10 @@
+ self.assertTrue(os.path.exists(self.pyc_path))
+ self.assertFalse(os.path.exists(self.cache_path))
+
++ def test_bad_coding(self):
++ bad_coding = os.path.join(os.path.dirname(__file__), 'bad_coding2.py')
++ self.assertIsNone(py_compile.compile(bad_coding, doraise=False))
++
+ def test_main():
+ support.run_unittest(PyCompileTests)
+
diff --git a/check-pyc-and-pyo-timestamps.py b/check-pyc-and-pyo-timestamps.py
new file mode 100644
index 0000000..bcd5baf
--- /dev/null
+++ b/check-pyc-and-pyo-timestamps.py
@@ -0,0 +1,48 @@
+"""Checks if all *.pyc and *.pyo files have later mtime than their *.py
files."""
+
+import imp
+import os
+import sys
+
+# list of test and other files that we expect not to have bytecode
+not_compiled = [
+ 'test/bad_coding.py',
+ 'test/bad_coding2.py',
+ 'test/badsyntax_3131.py',
+ 'test/badsyntax_future3.py',
+ 'test/badsyntax_future4.py',
+ 'test/badsyntax_future5.py',
+ 'test/badsyntax_future6.py',
+ 'test/badsyntax_future7.py',
+ 'test/badsyntax_future8.py',
+ 'test/badsyntax_future9.py',
+ 'test/badsyntax_pep3120.py',
+ 'lib2to3/tests/data/bom.py',
+ 'lib2to3/tests/data/crlf.py',
+ 'lib2to3/tests/data/different_encoding.py',
+ 'lib2to3/tests/data/py2_test_grammar.py',
+ '.debug-gdb.py',
+]
+failed = 0
+
+def bytecode_expected(source):
+ for f in not_compiled:
+ if source.endswith(f):
+ return False
+ return True
+
+compiled = filter(lambda f: bytecode_expected(f), sys.argv[1:])
+for f in compiled:
+ # check both pyo and pyc
+ to_check = map(lambda b: imp.cache_from_source(f, b), (True, False))
+ f_mtime = os.path.getmtime(f)
+ for c in to_check:
+ c_mtime = os.path.getmtime(c)
+ if c_mtime < f_mtime:
+ sys.stderr.write('Failed bytecompilation timestamps check: ')
+ sys.stderr.write('Bytecode file {} is older than source file
{}.\n'.format(c, f))
+ failed += 1
+
+if failed:
+ sys.stderr.write('\n{} files failed bytecompilation timestamps
check.\n'.format(failed))
+ sys.exit(1)
diff --git a/python3.spec b/python3.spec
index 9ad3e67..f445372 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -217,6 +217,10 @@ Source6: systemtap-example.stp
# Written by dmalcolm; not yet sent upstream
Source7: pyfuntop.stp
+# A simple script to check timestamps of bytecode files
+# Run in check section with Python that is currently being built
+# Written by bkabrda
+Source8: check-pyc-and-pyo-timestamps.py
# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
# Was Patch0 in ivazquez' python3000 specfile:
@@ -611,6 +615,14 @@ Patch184:
00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
# rhbz#996399
Patch185: 00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
+# 00186 #
+# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=1023607
+# Fixes the problem of some *.py files not being bytecompiled properly
+# during build. This was result of py_compile.compile raising exception
+# when trying to convert test file with bad encoding, and thus not
+# continuing bytecompilation for other files.
+Patch186: 00186-dont-raise-from-py_compile.patch
+
# (New patches go here ^^^)
#
@@ -871,6 +883,7 @@ done
%patch183 -p1
%patch184 -p1
%patch185 -p1
+%patch186 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1200,12 +1213,12 @@ iconv -f iso8859-1 -t utf-8
%{buildroot}/%{pylibdir}/Demo/rpc/README > README.co
# compile *.pyo
find %{buildroot} -type f -a -name "*.py" -print0 | \
LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}python%{pybasever}
%{buildroot}/%{_libdir}python%{pybasever}/site-packages" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2]) for f in
sys.argv[1:]]' || :
# compile *.pyc
find %{buildroot} -type f -a -name "*.py" -print0 | \
LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
- PYTHONPATH="%{buildroot}%{_libdir}python%{pybasever}
%{buildroot}/%{_libdir}python%{pybasever}/site-packages" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=0) for f
in sys.argv[1:]]' || :
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
@@ -1287,6 +1300,14 @@ sed \
# ======================================================
%check
+
+# first of all, check timestamps of bytecode files
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}/python%{pybasever}
%{buildroot}%{_libdir}/python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} %{SOURCE8}
+
+
topdir=$(pwd)
CheckPython() {
ConfName=$1
@@ -1711,6 +1732,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Oct 30 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-7
+- Bytecompile all *.py files properly during build (rhbz#1023607)
+
* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
- Added fix for CVE-2013-4238 (rhbz#996399)
commit 8aaa11c1b0cdd553f60b88709f460d7cd5576c4a
Author: Matej Stuchlik <mstuchli(a)redhat.com>
Date: Fri Aug 23 10:12:43 2013 +0200
Added fix for CVE-2013-4238 (rhbz#996399)
diff --git a/00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
b/00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
new file mode 100644
index 0000000..41db4d2
--- /dev/null
+++ b/00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
@@ -0,0 +1,241 @@
+diff -r e0f86c3b3685 Lib/test/nullbytecert.pem
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/Lib/test/nullbytecert.pem Sun Aug 11 18:17:23 2013 +0200
+@@ -0,0 +1,90 @@
++Certificate:
++ Data:
++ Version: 3 (0x2)
++ Serial Number: 0 (0x0)
++ Signature Algorithm: sha1WithRSAEncryption
++ Issuer: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python
Core Development,
CN=null.python.org\x00example.org/emailAddress=python-dev@python.org
++ Validity
++ Not Before: Aug 7 13:11:52 2013 GMT
++ Not After : Aug 7 13:12:52 2013 GMT
++ Subject: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python
Core Development,
CN=null.python.org\x00example.org/emailAddress=python-dev@python.org
++ Subject Public Key Info:
++ Public Key Algorithm: rsaEncryption
++ Public-Key: (2048 bit)
++ Modulus:
++ 00:b5:ea:ed:c9:fb:46:7d:6f:3b:76:80:dd:3a:f3:
++ 03:94:0b:a7:a6:db:ec:1d:df:ff:23:74:08:9d:97:
++ 16:3f:a3:a4:7b:3e:1b:0e:96:59:25:03:a7:26:e2:
++ 88:a9:cf:79:cd:f7:04:56:b0:ab:79:32:6e:59:c1:
++ 32:30:54:eb:58:a8:cb:91:f0:42:a5:64:27:cb:d4:
++ 56:31:88:52:ad:cf:bd:7f:f0:06:64:1f:cc:27:b8:
++ a3:8b:8c:f3:d8:29:1f:25:0b:f5:46:06:1b:ca:02:
++ 45:ad:7b:76:0a:9c:bf:bb:b9:ae:0d:16:ab:60:75:
++ ae:06:3e:9c:7c:31:dc:92:2f:29:1a:e0:4b:0c:91:
++ 90:6c:e9:37:c5:90:d7:2a:d7:97:15:a3:80:8f:5d:
++ 7b:49:8f:54:30:d4:97:2c:1c:5b:37:b5:ab:69:30:
++ 68:43:d3:33:78:4b:02:60:f5:3c:44:80:a1:8f:e7:
++ f0:0f:d1:5e:87:9e:46:cf:62:fc:f9:bf:0c:65:12:
++ f1:93:c8:35:79:3f:c8:ec:ec:47:f5:ef:be:44:d5:
++ ae:82:1e:2d:9a:9f:98:5a:67:65:e1:74:70:7c:cb:
++ d3:c2:ce:0e:45:49:27:dc:e3:2d:d4:fb:48:0e:2f:
++ 9e:77:b8:14:46:c0:c4:36:ca:02:ae:6a:91:8c:da:
++ 2f:85
++ Exponent: 65537 (0x10001)
++ X509v3 extensions:
++ X509v3 Basic Constraints: critical
++ CA:FALSE
++ X509v3 Subject Key Identifier:
++ 88:5A:55:C0:52:FF:61:CD:52:A3:35:0F:EA:5A:9C:24:38:22:F7:5C
++ X509v3 Key Usage:
++ Digital Signature, Non Repudiation, Key Encipherment
++ X509v3 Subject Alternative Name:
++ *************************************************************
++ WARNING: The values for DNS, email and URI are WRONG. OpenSSL
++ doesn't print the text after a NULL byte.
++ *************************************************************
++
DNS:altnull.python.org, email:null@python.org,
URI:http://null.python.org, IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1
++ Signature Algorithm: sha1WithRSAEncryption
++ ac:4f:45:ef:7d:49:a8:21:70:8e:88:59:3e:d4:36:42:70:f5:
++ a3:bd:8b:d7:a8:d0:58:f6:31:4a:b1:a4:a6:dd:6f:d9:e8:44:
++ 3c:b6:0a:71:d6:7f:b1:08:61:9d:60:ce:75:cf:77:0c:d2:37:
++ 86:02:8d:5e:5d:f9:0f:71:b4:16:a8:c1:3d:23:1c:f1:11:b3:
++ 56:6e:ca:d0:8d:34:94:e6:87:2a:99:f2:ae:ae:cc:c2:e8:86:
++ de:08:a8:7f:c5:05:fa:6f:81:a7:82:e6:d0:53:9d:34:f4:ac:
++ 3e:40:fe:89:57:7a:29:a4:91:7e:0b:c6:51:31:e5:10:2f:a4:
++ 60:76:cd:95:51:1a:be:8b:a1:b0:fd:ad:52:bd:d7:1b:87:60:
++ d2:31:c7:17:c4:18:4f:2d:08:25:a3:a7:4f:b7:92:ca:e2:f5:
++ 25:f1:54:75:81:9d:b3:3d:61:a2:f7:da:ed:e1:c6:6f:2c:60:
++ 1f:d8:6f:c5:92:05:ab:c9:09:62:49:a9:14:ad:55:11:cc:d6:
++ 4a:19:94:99:97:37:1d:81:5f:8b:cf:a3:a8:96:44:51:08:3d:
++ 0b:05:65:12:eb:b6:70:80:88:48:72:4f:c6:c2:da:cf:cd:8e:
++ 5b:ba:97:2f:60:b4:96:56:49:5e:3a:43:76:63:04:be:2a:f6:
++ c1:ca:a9:94
++-----BEGIN CERTIFICATE-----
++MIIE2DCCA8CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBxTELMAkGA1UEBhMCVVMx
++DzANBgNVBAgMBk9yZWdvbjESMBAGA1UEBwwJQmVhdmVydG9uMSMwIQYDVQQKDBpQ
++eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEgMB4GA1UECwwXUHl0aG9uIENvcmUg
++RGV2ZWxvcG1lbnQxJDAiBgNVBAMMG251bGwucHl0aG9uLm9yZwBleGFtcGxlLm9y
++ZzEkMCIGCSqGSIb3DQEJARYVcHl0aG9uLWRldkBweXRob24ub3JnMB4XDTEzMDgw
++NzEzMTE1MloXDTEzMDgwNzEzMTI1MlowgcUxCzAJBgNVBAYTAlVTMQ8wDQYDVQQI
++DAZPcmVnb24xEjAQBgNVBAcMCUJlYXZlcnRvbjEjMCEGA1UECgwaUHl0aG9uIFNv
++ZnR3YXJlIEZvdW5kYXRpb24xIDAeBgNVBAsMF1B5dGhvbiBDb3JlIERldmVsb3Bt
++ZW50MSQwIgYDVQQDDBtudWxsLnB5dGhvbi5vcmcAZXhhbXBsZS5vcmcxJDAiBgkq
++hkiG9w0BCQEWFXB5dGhvbi1kZXZAcHl0aG9uLm9yZzCCASIwDQYJKoZIhvcNAQEB
++BQADggEPADCCAQoCggEBALXq7cn7Rn1vO3aA3TrzA5QLp6bb7B3f/yN0CJ2XFj+j
++pHs+Gw6WWSUDpybiiKnPec33BFawq3kyblnBMjBU61ioy5HwQqVkJ8vUVjGIUq3P
++vX/wBmQfzCe4o4uM89gpHyUL9UYGG8oCRa17dgqcv7u5rg0Wq2B1rgY+nHwx3JIv
++KRrgSwyRkGzpN8WQ1yrXlxWjgI9de0mPVDDUlywcWze1q2kwaEPTM3hLAmD1PESA
++oY/n8A/RXoeeRs9i/Pm/DGUS8ZPINXk/yOzsR/XvvkTVroIeLZqfmFpnZeF0cHzL
++08LODkVJJ9zjLdT7SA4vnne4FEbAxDbKAq5qkYzaL4UCAwEAAaOB0DCBzTAMBgNV
++HRMBAf8EAjAAMB0GA1UdDgQWBBSIWlXAUv9hzVKjNQ/qWpwkOCL3XDALBgNVHQ8E
++BAMCBeAwgZAGA1UdEQSBiDCBhYIeYWx0bnVsbC5weXRob24ub3JnAGV4YW1wbGUu
++Y29tgSBudWxsQHB5dGhvbi5vcmcAdXNlckBleGFtcGxlLm9yZ4YpaHR0cDovL251
++bGwucHl0aG9uLm9yZwBodHRwOi8vZXhhbXBsZS5vcmeHBMAAAgGHECABDbgAAAAA
++AAAAAAAAAAEwDQYJKoZIhvcNAQEFBQADggEBAKxPRe99SaghcI6IWT7UNkJw9aO9
++i9eo0Fj2MUqxpKbdb9noRDy2CnHWf7EIYZ1gznXPdwzSN4YCjV5d+Q9xtBaowT0j
++HPERs1ZuytCNNJTmhyqZ8q6uzMLoht4IqH/FBfpvgaeC5tBTnTT0rD5A/olXeimk
++kX4LxlEx5RAvpGB2zZVRGr6LobD9rVK91xuHYNIxxxfEGE8tCCWjp0+3ksri9SXx
++VHWBnbM9YaL32u3hxm8sYB/Yb8WSBavJCWJJqRStVRHM1koZlJmXNx2BX4vPo6iW
++RFEIPQsFZRLrtnCAiEhyT8bC2s/Njlu6ly9gtJZWSV46Q3ZjBL4q9sHKqZQ=
++-----END CERTIFICATE-----
+diff -r e0f86c3b3685 Lib/test/test_ssl.py
+--- a/Lib/test/test_ssl.py Sun Aug 11 13:04:50 2013 +0300
++++ b/Lib/test/test_ssl.py Sun Aug 11 18:17:23 2013 +0200
+@@ -55,6 +55,7 @@
+ WRONGCERT = data_file("XXXnonexisting.pem")
+ BADKEY = data_file("badkey.pem")
+ NOKIACERT = data_file("nokia.pem")
++NULLBYTECERT = data_file("nullbytecert.pem")
+
+ DHFILE = data_file("dh512.pem")
+ BYTES_DHFILE = os.fsencode(DHFILE)
+@@ -162,6 +163,27 @@
+ ('DNS', 'projects.forum.nokia.com'))
+ )
+
++ def test_parse_cert_CVE_2013_4073(self):
++ p = ssl._ssl._test_decode_cert(NULLBYTECERT)
++ if support.verbose:
++ sys.stdout.write("\n" + pprint.pformat(p) + "\n")
++ subject = ((('countryName', 'US'),),
++ (('stateOrProvinceName', 'Oregon'),),
++ (('localityName', 'Beaverton'),),
++ (('organizationName', 'Python Software
Foundation'),),
++ (('organizationalUnitName', 'Python Core
Development'),),
++ (('commonName', 'null.python.org\x00example.org'),),
++ (('emailAddress', 'python-dev(a)python.org'),))
++ self.assertEqual(p['subject'], subject)
++ self.assertEqual(p['issuer'], subject)
++ self.assertEqual(p['subjectAltName'],
++ (('DNS', 'altnull.python.org\x00example.com'),
++ ('email',
'null@python.org\x00user(a)example.org'),
++ ('URI',
'http://null.python.org\x00http://example.org'),
++ ('IP Address', '192.0.2.1'),
++ ('IP Address', '2001:DB8:0:0:0:0:0:1\n'))
++ )
++
+ def test_DER_to_PEM(self):
+ with open(SVN_PYTHON_ORG_ROOT_CERT, 'r') as f:
+ pem = f.read()
+@@ -294,6 +316,13 @@
+ fail(cert, 'foo.a.com')
+ fail(cert, 'bar.foo.com')
+
++ # NULL bytes are bad, CVE-2013-4073
++ cert = {'subject': ((('commonName',
++ 'null.python.org\x00example.org'),),)}
++ ok(cert, 'null.python.org\x00example.org') # or raise an error?
++ fail(cert, 'example.org')
++ fail(cert, 'null.python.org')
++
+ # Slightly fake real-world example
+ cert = {'notAfter': 'Jun 26 21:41:46 2011 GMT',
+ 'subject': ((('commonName',
'linuxfrz.org'),),),
+diff -r e0f86c3b3685 Modules/_ssl.c
+--- a/Modules/_ssl.c Sun Aug 11 13:04:50 2013 +0300
++++ b/Modules/_ssl.c Sun Aug 11 18:17:23 2013 +0200
+@@ -771,12 +771,14 @@
+ ext->value->length));
+
+ for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
+-
+ /* get a rendering of each name in the set of names */
++ int gntype;
++ ASN1_STRING *as = NULL;
+
+ name = sk_GENERAL_NAME_value(names, j);
+- if (name->type == GEN_DIRNAME) {
+-
++ gntype = name-> type;
++ switch (gntype) {
++ case GEN_DIRNAME:
+ /* we special-case DirName as a tuple of
+ tuples of attributes */
+
+@@ -798,11 +800,62 @@
+ goto fail;
+ }
+ PyTuple_SET_ITEM(t, 1, v);
++ break;
+
+- } else {
++ case GEN_EMAIL:
++ case GEN_DNS:
++ case GEN_URI:
++ /* GENERAL_NAME_print() doesn't handle NUL bytes in ASN1_string
++ correctly. */
++ t = PyTuple_New(2);
++ if (t == NULL)
++ goto fail;
++ switch (gntype) {
++ case GEN_EMAIL:
++ v = PyUnicode_FromString("email");
++ as = name->d.rfc822Name;
++ break;
++ case GEN_DNS:
++ v = PyUnicode_FromString("DNS");
++ as = name->d.dNSName;
++ break;
++ case GEN_URI:
++ v = PyUnicode_FromString("URI");
++ as = name->d.uniformResourceIdentifier;
++ break;
++ }
++ if (v == NULL) {
++ Py_DECREF(t);
++ goto fail;
++ }
++ PyTuple_SET_ITEM(t, 0, v);
++ v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_data(as),
++ ASN1_STRING_length(as));
++ if (v == NULL) {
++ Py_DECREF(t);
++ goto fail;
++ }
++ PyTuple_SET_ITEM(t, 1, v);
++ break;
+
++ default:
+ /* for everything else, we use the OpenSSL print form */
+-
++ switch (gntype) {
++ /* check for new general name type */
++ case GEN_OTHERNAME:
++ case GEN_X400:
++ case GEN_EDIPARTY:
++ case GEN_IPADD:
++ case GEN_RID:
++ break;
++ default:
++ if (PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
++ "Unknown general name type %d",
++ gntype) == -1) {
++ goto fail;
++ }
++ break;
++ }
+ (void) BIO_reset(biobuf);
+ GENERAL_NAME_print(biobuf, name);
+ len = BIO_gets(biobuf, buf, sizeof(buf)-1);
+@@ -829,6 +882,7 @@
+ goto fail;
+ }
+ PyTuple_SET_ITEM(t, 1, v);
++ break;
+ }
+
+ /* and add that rendering to the list */
diff --git a/python3.spec b/python3.spec
index 2563d98..9ad3e67 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -604,6 +604,12 @@ Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
# We patch this by also accepting "#define ffi_wrapper_h"
Patch184: 00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
+# 00185 #
+# Fix for CVE-2013-4238 --
+# SSL module fails to handle NULL bytes inside subjectAltNames general names
+#
http://bugs.python.org/issue18709
+# rhbz#996399
+Patch185: 00185-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
# (New patches go here ^^^)
@@ -864,6 +870,7 @@ done
# 00182: upstream as of Python 3.3.2
%patch183 -p1
%patch184 -p1
+%patch185 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1704,6 +1711,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Aug 23 2013 Matej Stuchlik <mstuchli(a)redhat.com> - 3.3.2-6
+- Added fix for CVE-2013-4238 (rhbz#996399)
+
* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
- fix up indentation in arm patch
commit fbccd698d330081dd5f4cf1c6b828a185176176d
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Fri Jul 26 15:09:54 2013 -0500
fix up indentation in arm patch
diff --git a/python3.spec b/python3.spec
index 96e194a..2563d98 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -1704,6 +1704,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-5
+- fix up indentation in arm patch
+
* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
- disable a test that fails on arm
- enable valgrind support on arm arches
commit 24d06d1fa4bcfa2a27922c6e53bee09512bbad95
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Fri Jul 26 15:08:13 2013 -0500
fix up indentation
diff --git a/python3-arm-skip-failing-fragile-test.patch
b/python3-arm-skip-failing-fragile-test.patch
index affe99a..3c2fa09 100644
--- a/python3-arm-skip-failing-fragile-test.patch
+++ b/python3-arm-skip-failing-fragile-test.patch
@@ -1,12 +1,12 @@
--- Python-3.3.2/Lib/test/test_gdb.py.orig 2013-07-26 09:52:15.533852708 -0500
-+++ Python-3.3.2/Lib/test/test_gdb.py 2013-07-26 12:08:36.338848587 -0500
++++ Python-3.3.2/Lib/test/test_gdb.py 2013-07-26 15:07:53.733623014 -0500
@@ -729,8 +729,7 @@
foo\(1, 2, 3\)
''')
- @unittest.skipUnless(_thread,
- "Python was compiled without thread support")
-+ @unittest.skip('Known failure on ARM:
https://bugzilla.redhat.com/show_bug.cgi?id=986713')
++ @unittest.skip('Known failure on ARM:
https://bugzilla.redhat.com/show_bug.cgi?id=986713')
def test_threads(self):
'Verify that "py-bt" indicates threads that are waiting for the
GIL'
cmd = '''
commit 486eb43517e1ebc1cf5c24e1b53a3c88f83fa874
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Fri Jul 26 12:13:47 2013 -0500
disable a test that fails on arm
- enable valgrind support on arm arches
diff --git a/python3-arm-skip-failing-fragile-test.patch
b/python3-arm-skip-failing-fragile-test.patch
new file mode 100644
index 0000000..affe99a
--- /dev/null
+++ b/python3-arm-skip-failing-fragile-test.patch
@@ -0,0 +1,12 @@
+--- Python-3.3.2/Lib/test/test_gdb.py.orig 2013-07-26 09:52:15.533852708 -0500
++++ Python-3.3.2/Lib/test/test_gdb.py 2013-07-26 12:08:36.338848587 -0500
+@@ -729,8 +729,7 @@
+ foo\(1, 2, 3\)
+ ''')
+
+- @unittest.skipUnless(_thread,
+- "Python was compiled without thread support")
++ @unittest.skip('Known failure on ARM:
https://bugzilla.redhat.com/show_bug.cgi?id=986713')
+ def test_threads(self):
+ 'Verify that "py-bt" indicates threads that are waiting for the
GIL'
+ cmd = '''
diff --git a/python3.spec b/python3.spec
index 08ad043..96e194a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -57,7 +57,7 @@
%global with_systemtap 1
# some arches don't have valgrind so we need to disable its support on them
-%ifarch %{ix86} x86_64 ppc %{power64} s390x
+%ifarch %{ix86} x86_64 ppc %{power64} s390x %{arm}
%global with_valgrind 1
%else
%global with_valgrind 0
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -342,7 +342,9 @@ Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
#
http://bugs.python.org/issue8265 (rhbz#706253)
Patch139: 00139-skip-test_float-known-failure-on-arm.patch
-# 00140 #
+# ideally short lived patch disabling a test thats fragile on different arches
+Patch140: python3-arm-skip-failing-fragile-test.patch
+
# Patch140: 00140-skip-test_ctypes-known-failure-on-sparc.patch does not appear
# to be relevant for python3
@@ -603,6 +605,7 @@ Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
Patch184: 00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -810,6 +813,7 @@ done
# 00138: not for python3
%ifarch %{arm}
%patch139 -p1
+%patch140 -p1
%endif
# 00140: not for python3
%patch141 -p1
@@ -1700,6 +1704,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 26 2013 Dennis Gilmore <dennis(a)ausil.us> - 3.3.2-4
+- disable a test that fails on arm
+- enable valgrind support on arm arches
+
* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
commit 001a27780cc890539b77728dfdee06384be4d54b
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Tue Jul 2 08:21:42 2013 +0200
Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
diff --git a/00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
b/00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
new file mode 100644
index 0000000..e224fc6
--- /dev/null
+++ b/00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
@@ -0,0 +1,12 @@
+--- Python-3.3.2/setup.py.orig 2013-07-01 15:23:24.377711044 +0200
++++ Python-3.3.2/setup.py 2013-07-01 15:23:34.094676496 +0200
+@@ -1882,7 +1882,8 @@
+ if not line:
+ ffi_inc = None
+ break
+- if line.startswith('#define LIBFFI_H'):
++ if line.startswith('#define LIBFFI_H') or \
++ line.startswith('#define ffi_wrapper_h'):
+ break
+ ffi_lib = None
+ if ffi_inc is not None:
diff --git a/python3.spec b/python3.spec
index 93d8ab7..08ad043 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -594,6 +594,14 @@ Patch180: 00180-python-add-support-for-ppc64p7.patch
#
http://hg.python.org/cpython/rev/c627638753e2
Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
+# 00184 #
+# Fix for
https://bugzilla.redhat.com/show_bug.cgi?id=979696
+# Fixes build of ctypes against libffi with multilib wrapper
+# Python recognizes ffi.h only if it contains "#define LIBFFI_H",
+# but the wrapper doesn't contain that, which makes the build fail
+# We patch this by also accepting "#define ffi_wrapper_h"
+Patch184: 00184-ctypes-should-build-with-libffi-multilib-wrapper.patch
+
# (New patches go here ^^^)
#
@@ -851,6 +859,7 @@ done
# 00181: not for python3
# 00182: upstream as of Python 3.3.2
%patch183 -p1
+%patch184 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1691,6 +1700,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Jul 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-3
+- Fix build with libffi containing multilib wrapper for ffi.h (rhbz#979696).
+
* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
- Add patch for CVE-2013-2099 (rhbz#963261).
commit 20822507e4c23fe36898fdab7fbc7e3003d4d866
Merge: fda6bed 22e1cc9
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Mon May 20 09:12:45 2013 +0200
Add patch for CVE-2013-2099 (rhbz#963261).
commit 22e1cc9fb879ab1b423c8ba939738b9e7ac6a797
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Mon May 20 08:04:03 2013 +0200
Add patch for CVE-2013-2099 (rhbz#963261).
diff --git a/00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
b/00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
new file mode 100644
index 0000000..888b43b
--- /dev/null
+++ b/00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
@@ -0,0 +1,49 @@
+# HG changeset patch
+# User Antoine Pitrou <solipsis(a)pitrou.net>
+# Date 1368892602 -7200
+# Node ID c627638753e2d25a98950585b259104a025937a9
+# Parent 9682241dc8fcb4b1aef083bd30860efa070c3d6d
+Issue #17980: Fix possible abuse of ssl.match_hostname() for denial of service using
certificates with many wildcards (CVE-2013-2099).
+
+diff --git a/Lib/ssl.py b/Lib/ssl.py
+--- a/Lib/ssl.py
++++ b/Lib/ssl.py
+@@ -129,9 +129,16 @@ class CertificateError(ValueError):
+ pass
+
+
+-def _dnsname_to_pat(dn):
++def _dnsname_to_pat(dn, max_wildcards=1):
+ pats = []
+ for frag in dn.split(r'.'):
++ if frag.count('*') > max_wildcards:
++ # Issue #17980: avoid denials of service by refusing more
++ # than one wildcard per fragment. A survery of established
++ # policy among SSL implementations showed it to be a
++ # reasonable choice.
++ raise CertificateError(
++ "too many wildcards in certificate DNS name: " + repr(dn))
+ if frag == '*':
+ # When '*' is a fragment by itself, it matches a non-empty dotless
+ # fragment.
+diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
+--- a/Lib/test/test_ssl.py
++++ b/Lib/test/test_ssl.py
+@@ -349,6 +349,17 @@ class BasicSocketTests(unittest.TestCase
+ self.assertRaises(ValueError, ssl.match_hostname, None, 'example.com')
+ self.assertRaises(ValueError, ssl.match_hostname, {}, 'example.com')
+
++ # Issue #17980: avoid denials of service by refusing more than one
++ # wildcard per fragment.
++ cert = {'subject': ((('commonName', 'a*b.com'),),)}
++ ok(cert, 'axxb.com')
++ cert = {'subject': ((('commonName', 'a*b.co*'),),)}
++ ok(cert, 'axxb.com')
++ cert = {'subject': ((('commonName', 'a*b*.com'),),)}
++ with self.assertRaises(ssl.CertificateError) as cm:
++ ssl.match_hostname(cert, 'axxbxxc.com')
++ self.assertIn("too many wildcards", str(cm.exception))
++
+ def test_server_side(self):
+ # server_hostname doesn't work for server sockets
+ ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
diff --git a/python3.spec b/python3.spec
index a35ec9d..93d8ab7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -584,10 +584,16 @@ Patch180: 00180-python-add-support-for-ppc64p7.patch
# Patch181: 00181-allow-arbitrary-timeout-in-condition-wait.patch
# Does not affect python3
-# 00181 #
+# 00182 #
# Fixed upstream as of Python 3.3.2
# Patch182: 00182-fix-test_gdb-test_threads.patch
+# 00183 #
+# Upstream fix for CVE-2013-2099 (ssl.match_hostname DOS)
+#
http://bugs.python.org/issue17980
+#
http://hg.python.org/cpython/rev/c627638753e2
+Patch183: 00183-cve-2013-2099-fix-ssl-match_hostname-dos.patch
+
# (New patches go here ^^^)
#
@@ -844,6 +850,7 @@ done
%patch180 -p1
# 00181: not for python3
# 00182: upstream as of Python 3.3.2
+%patch183 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1684,6 +1691,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon May 20 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-2
+- Add patch for CVE-2013-2099 (rhbz#963261).
+
* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
- Updated to Python 3.3.2.
- Refreshed patches: 153 (gdb test noise)
commit fda6bedf044b9ea96b1cfc3324f575c06cf92c55
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu May 16 16:49:09 2013 +0200
Drop the forgotten gdb test patch that was merged upstream
diff --git a/python3.spec b/python3.spec
index a7d1d97..a35ec9d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -585,12 +585,8 @@ Patch180: 00180-python-add-support-for-ppc64p7.patch
# Does not affect python3
# 00181 #
-# Fix test.test_gdb.PyBtTests.test_threads on ppc64
-# Cherrypicked from upstream commit:
-#
http://hg.python.org/cpython/rev/f4a6b731905a/
-# for upstream issue
http://bugs.python.org/issue17833
-# (rhbz#960010)
-Patch182: 00182-fix-test_gdb-test_threads.patch
+# Fixed upstream as of Python 3.3.2
+# Patch182: 00182-fix-test_gdb-test_threads.patch
# (New patches go here ^^^)
@@ -847,7 +843,7 @@ done
%patch179 -p1
%patch180 -p1
# 00181: not for python3
-%patch182 -p1
+# 00182: upstream as of Python 3.3.2
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1691,7 +1687,8 @@ rm -fr %{buildroot}
* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
- Updated to Python 3.3.2.
- Refreshed patches: 153 (gdb test noise)
-- Dropped patches: 175 (configure -Wformat, fixed upstream)
+- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
+test threads)
- Synced patch numbers with python.spec.
* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
commit d4ea6cd7259c332e0c009f71593b09ea45ff151a
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu May 16 16:49:09 2013 +0200
Drop the forgotten gdb test patch that was merged upstream
diff --git a/python3.spec b/python3.spec
index a7d1d97..a35ec9d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -585,12 +585,8 @@ Patch180: 00180-python-add-support-for-ppc64p7.patch
# Does not affect python3
# 00181 #
-# Fix test.test_gdb.PyBtTests.test_threads on ppc64
-# Cherrypicked from upstream commit:
-#
http://hg.python.org/cpython/rev/f4a6b731905a/
-# for upstream issue
http://bugs.python.org/issue17833
-# (rhbz#960010)
-Patch182: 00182-fix-test_gdb-test_threads.patch
+# Fixed upstream as of Python 3.3.2
+# Patch182: 00182-fix-test_gdb-test_threads.patch
# (New patches go here ^^^)
@@ -847,7 +843,7 @@ done
%patch179 -p1
%patch180 -p1
# 00181: not for python3
-%patch182 -p1
+# 00182: upstream as of Python 3.3.2
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1691,7 +1687,8 @@ rm -fr %{buildroot}
* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
- Updated to Python 3.3.2.
- Refreshed patches: 153 (gdb test noise)
-- Dropped patches: 175 (configure -Wformat, fixed upstream)
+- Dropped patches: 175 (configure -Wformat, fixed upstream), 182 (gdb
+test threads)
- Synced patch numbers with python.spec.
* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
commit a60a842ced8fcad62b87b67539a2ecfa4d21d2ec
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu May 16 16:35:48 2013 +0200
Updated to Python 3.3.2.
- Refreshed patches: 153 (gdb test noise)
- Dropped patches: 175 (configure -Wformat, fixed upstream)
- Synced patch numbers with python.spec.
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
index c65787f..50a0917 100644
--- a/00153-fix-test_gdb-noise.patch
+++ b/00153-fix-test_gdb-noise.patch
@@ -1,7 +1,6 @@
-diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59223da36dec/Lib/test/test_gdb.py
---- cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise 2012-08-07
06:10:57.000000000 -0400
-+++ cpython-59223da36dec/Lib/test/test_gdb.py 2012-08-07 17:13:46.592343113 -0400
-@@ -115,6 +115,15 @@ class DebuggerTests(unittest.TestCase):
+--- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
++++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
+@@ -96,6 +96,15 @@ class DebuggerTests(unittest.TestCase):
# Generate a list of commands in gdb's language:
commands = ['set breakpoint pending yes',
'break %s' % breakpoint,
@@ -17,20 +16,16 @@ diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59
'run']
if cmds_after_breakpoint:
commands += cmds_after_breakpoint
-@@ -154,8 +163,16 @@ class DebuggerTests(unittest.TestCase):
- 'Do you need "set solib-search-path" or '
- '"set sysroot"?\n',
- '')
-+ err = '\n'.join([line
-+ for line in err.splitlines()
-+ if not line.startswith('warning: Unable to open')
-+ if not line.startswith('Missing separate debuginfo
for')
-+ if not line.startswith('Try: yum --disablerepo=')
-+ # In case 'set print entry-values no' failed:
-+ if not line.startswith('Undefined set print
command')])
-
- # Ensure no unexpected error messages:
-+ self.maxDiff = None
- self.assertEqual(err, '')
- return out
-
+--- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
++++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
+@@ -144,6 +153,10 @@
+ 'Do you need "set solib-search-path" or '
+ '"set sysroot"?',
+ )
++ ignore_patterns += ('warning: Unable to open',
++ 'Missing separate debuginfo for',
++ 'Try: yum --disablerepo=',
++ 'Undefined set print command')
+ for line in errlines:
+ if not line.startswith(ignore_patterns):
+ unexpected_errlines.append(line)
diff --git a/00181-fix-test_gdb-test_threads.patch
b/00181-fix-test_gdb-test_threads.patch
deleted file mode 100644
index 41de5b2..0000000
--- a/00181-fix-test_gdb-test_threads.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -up Python-3.3.1/Misc/NEWS.fix-test_gdb-test_threads Python-3.3.1/Misc/NEWS
-diff -up Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads
Python-3.3.1/Tools/gdb/libpython.py
---- Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads 2013-05-09
12:12:01.621592211 -0400
-+++ Python-3.3.1/Tools/gdb/libpython.py 2013-05-09 12:12:01.632592209 -0400
-@@ -1465,7 +1465,7 @@ class Frame(object):
- # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
- name = self._gdbframe.name()
- if name:
-- return name.startswith('pthread_cond_timedwait')
-+ return 'pthread_cond_timedwait' in name
-
- def is_gc_collect(self):
- '''Is this frame "collect" within the
garbage-collector?'''
diff --git a/00182-fix-test_gdb-test_threads.patch
b/00182-fix-test_gdb-test_threads.patch
new file mode 100644
index 0000000..41de5b2
--- /dev/null
+++ b/00182-fix-test_gdb-test_threads.patch
@@ -0,0 +1,13 @@
+diff -up Python-3.3.1/Misc/NEWS.fix-test_gdb-test_threads Python-3.3.1/Misc/NEWS
+diff -up Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads
Python-3.3.1/Tools/gdb/libpython.py
+--- Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads 2013-05-09
12:12:01.621592211 -0400
++++ Python-3.3.1/Tools/gdb/libpython.py 2013-05-09 12:12:01.632592209 -0400
+@@ -1465,7 +1465,7 @@ class Frame(object):
+ # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
+ name = self._gdbframe.name()
+ if name:
+- return name.startswith('pthread_cond_timedwait')
++ return 'pthread_cond_timedwait' in name
+
+ def is_gc_collect(self):
+ '''Is this frame "collect" within the
garbage-collector?'''
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
index 1a0c3c6..903cbf0 100644
--- a/05000-autotool-intermediates.patch
+++ b/05000-autotool-intermediates.patch
@@ -19,15 +19,6 @@ diff -up ./configure.autotool-intermediates ./configure
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
--with(out)-systemtap disable/enable SystemTap support
-@@ -6529,7 +6533,7 @@ then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports ParseTuple
__format__" >&5
- $as_echo_n "checking whether gcc supports ParseTuple __format__... "
>&6; }
- save_CFLAGS=$CFLAGS
-- CFLAGS="$CFLAGS -Werror"
-+ CFLAGS="$CFLAGS -Werror -Wformat"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h. */
-
@@ -10117,6 +10121,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -79,16 +70,3 @@ diff -up ./configure.autotool-intermediates ./configure
else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
-diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2013-04-09 14:52:49.829773431 +0200
-+++ ./pyconfig.h.in 2013-04-09 14:52:53.488764667 +0200
-@@ -1193,9 +1193,6 @@
- /* Define if setpgrp() must be called as setpgrp(0, 0). */
- #undef SETPGRP_HAVE_ARG
-
--/* Define this to be extension of shared libraries (including the dot!). */
--#undef SHLIB_EXT
--
- /* Define if i>>j for signed int i does not extend the sign bit when i < 0 */
- #undef SIGNED_RIGHT_SHIFT_ZERO_FILLS
-
diff --git a/python3.spec b/python3.spec
index e66e9bf..a7d1d97 100644
--- a/python3.spec
+++ b/python3.spec
@@ -125,8 +125,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.1
-Release: 4%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -545,13 +545,8 @@ Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
# TODO: python3 status?
# 00175 #
-# Fix for configure.ac mistakenly detecting
-# checking whether gcc supports ParseTuple __format__... yes
-# when it doesn't, when compiling with gcc 4.8
-#
-# Sent upstream as
http://bugs.python.org/issue17547
-# (rhbz#927358)
-Patch175: 00175-fix-configure-Wformat.patch
+# Upstream as of Python 3.3.2
+# Patch175: 00175-fix-configure-Wformat.patch
# 00176 #
# Fixed upstream as of Python 3.3.1
@@ -585,12 +580,18 @@ Patch179:
00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
Patch180: 00180-python-add-support-for-ppc64p7.patch
# 00181 #
+# python.spec has
+# Patch181: 00181-allow-arbitrary-timeout-in-condition-wait.patch
+# Does not affect python3
+
+# 00181 #
# Fix test.test_gdb.PyBtTests.test_threads on ppc64
# Cherrypicked from upstream commit:
#
http://hg.python.org/cpython/rev/f4a6b731905a/
# for upstream issue
http://bugs.python.org/issue17833
# (rhbz#960010)
-Patch181: 00181-fix-test_gdb-test_threads.patch
+Patch182: 00182-fix-test_gdb-test_threads.patch
+
# (New patches go here ^^^)
#
@@ -815,7 +816,7 @@ done
%endif
# 00151: not for python3
# 00152: upstream as of Python 3.3.0b2
-%patch153 -p1
+%patch153 -p0
# 00154: not for this branch
%patch155 -p1
%patch156 -p1
@@ -839,13 +840,14 @@ done
#00172: TODO
%patch173 -p1
#00174: TODO
-%patch175 -p1
+# 00175: upstream as of Python 3.3.2
# 00176: upstream as of Python 3.3.1
%patch177 -p1
%patch178 -p1
%patch179 -p1
%patch180 -p1
-%patch181 -p1
+# 00181: not for python3
+%patch182 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1686,6 +1688,12 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
+- Updated to Python 3.3.2.
+- Refreshed patches: 153 (gdb test noise)
+- Dropped patches: 175 (configure -Wformat, fixed upstream)
+- Synced patch numbers with python.spec.
+
* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
diff --git a/sources b/sources
index b8490ab..acfd2af 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-993232d9f4d9b4863cc1ec69a792e9cd Python-3.3.1.tar.xz
+c94b78ea3b68a9bbc9906af4d5b4fdc7 Python-3.3.2.tar.xz
commit c298168d5462a13238e7e401b5524236305dd635
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu May 16 16:35:48 2013 +0200
Updated to Python 3.3.2.
- Refreshed patches: 153 (gdb test noise)
- Dropped patches: 175 (configure -Wformat, fixed upstream)
- Synced patch numbers with python.spec.
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
index c65787f..50a0917 100644
--- a/00153-fix-test_gdb-noise.patch
+++ b/00153-fix-test_gdb-noise.patch
@@ -1,7 +1,6 @@
-diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59223da36dec/Lib/test/test_gdb.py
---- cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise 2012-08-07
06:10:57.000000000 -0400
-+++ cpython-59223da36dec/Lib/test/test_gdb.py 2012-08-07 17:13:46.592343113 -0400
-@@ -115,6 +115,15 @@ class DebuggerTests(unittest.TestCase):
+--- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
++++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
+@@ -96,6 +96,15 @@ class DebuggerTests(unittest.TestCase):
# Generate a list of commands in gdb's language:
commands = ['set breakpoint pending yes',
'break %s' % breakpoint,
@@ -17,20 +16,16 @@ diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59
'run']
if cmds_after_breakpoint:
commands += cmds_after_breakpoint
-@@ -154,8 +163,16 @@ class DebuggerTests(unittest.TestCase):
- 'Do you need "set solib-search-path" or '
- '"set sysroot"?\n',
- '')
-+ err = '\n'.join([line
-+ for line in err.splitlines()
-+ if not line.startswith('warning: Unable to open')
-+ if not line.startswith('Missing separate debuginfo
for')
-+ if not line.startswith('Try: yum --disablerepo=')
-+ # In case 'set print entry-values no' failed:
-+ if not line.startswith('Undefined set print
command')])
-
- # Ensure no unexpected error messages:
-+ self.maxDiff = None
- self.assertEqual(err, '')
- return out
-
+--- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
++++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
+@@ -144,6 +153,10 @@
+ 'Do you need "set solib-search-path" or '
+ '"set sysroot"?',
+ )
++ ignore_patterns += ('warning: Unable to open',
++ 'Missing separate debuginfo for',
++ 'Try: yum --disablerepo=',
++ 'Undefined set print command')
+ for line in errlines:
+ if not line.startswith(ignore_patterns):
+ unexpected_errlines.append(line)
diff --git a/00181-fix-test_gdb-test_threads.patch
b/00181-fix-test_gdb-test_threads.patch
deleted file mode 100644
index 41de5b2..0000000
--- a/00181-fix-test_gdb-test_threads.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -up Python-3.3.1/Misc/NEWS.fix-test_gdb-test_threads Python-3.3.1/Misc/NEWS
-diff -up Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads
Python-3.3.1/Tools/gdb/libpython.py
---- Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads 2013-05-09
12:12:01.621592211 -0400
-+++ Python-3.3.1/Tools/gdb/libpython.py 2013-05-09 12:12:01.632592209 -0400
-@@ -1465,7 +1465,7 @@ class Frame(object):
- # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
- name = self._gdbframe.name()
- if name:
-- return name.startswith('pthread_cond_timedwait')
-+ return 'pthread_cond_timedwait' in name
-
- def is_gc_collect(self):
- '''Is this frame "collect" within the
garbage-collector?'''
diff --git a/00182-fix-test_gdb-test_threads.patch
b/00182-fix-test_gdb-test_threads.patch
new file mode 100644
index 0000000..41de5b2
--- /dev/null
+++ b/00182-fix-test_gdb-test_threads.patch
@@ -0,0 +1,13 @@
+diff -up Python-3.3.1/Misc/NEWS.fix-test_gdb-test_threads Python-3.3.1/Misc/NEWS
+diff -up Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads
Python-3.3.1/Tools/gdb/libpython.py
+--- Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads 2013-05-09
12:12:01.621592211 -0400
++++ Python-3.3.1/Tools/gdb/libpython.py 2013-05-09 12:12:01.632592209 -0400
+@@ -1465,7 +1465,7 @@ class Frame(object):
+ # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
+ name = self._gdbframe.name()
+ if name:
+- return name.startswith('pthread_cond_timedwait')
++ return 'pthread_cond_timedwait' in name
+
+ def is_gc_collect(self):
+ '''Is this frame "collect" within the
garbage-collector?'''
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
index 1a0c3c6..903cbf0 100644
--- a/05000-autotool-intermediates.patch
+++ b/05000-autotool-intermediates.patch
@@ -19,15 +19,6 @@ diff -up ./configure.autotool-intermediates ./configure
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
--with(out)-systemtap disable/enable SystemTap support
-@@ -6529,7 +6533,7 @@ then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports ParseTuple
__format__" >&5
- $as_echo_n "checking whether gcc supports ParseTuple __format__... "
>&6; }
- save_CFLAGS=$CFLAGS
-- CFLAGS="$CFLAGS -Werror"
-+ CFLAGS="$CFLAGS -Werror -Wformat"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h. */
-
@@ -10117,6 +10121,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -79,16 +70,3 @@ diff -up ./configure.autotool-intermediates ./configure
else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
-diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2013-04-09 14:52:49.829773431 +0200
-+++ ./pyconfig.h.in 2013-04-09 14:52:53.488764667 +0200
-@@ -1193,9 +1193,6 @@
- /* Define if setpgrp() must be called as setpgrp(0, 0). */
- #undef SETPGRP_HAVE_ARG
-
--/* Define this to be extension of shared libraries (including the dot!). */
--#undef SHLIB_EXT
--
- /* Define if i>>j for signed int i does not extend the sign bit when i < 0 */
- #undef SIGNED_RIGHT_SHIFT_ZERO_FILLS
-
diff --git a/python3.spec b/python3.spec
index e66e9bf..a7d1d97 100644
--- a/python3.spec
+++ b/python3.spec
@@ -125,8 +125,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.1
-Release: 4%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -545,13 +545,8 @@ Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
# TODO: python3 status?
# 00175 #
-# Fix for configure.ac mistakenly detecting
-# checking whether gcc supports ParseTuple __format__... yes
-# when it doesn't, when compiling with gcc 4.8
-#
-# Sent upstream as
http://bugs.python.org/issue17547
-# (rhbz#927358)
-Patch175: 00175-fix-configure-Wformat.patch
+# Upstream as of Python 3.3.2
+# Patch175: 00175-fix-configure-Wformat.patch
# 00176 #
# Fixed upstream as of Python 3.3.1
@@ -585,12 +580,18 @@ Patch179:
00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
Patch180: 00180-python-add-support-for-ppc64p7.patch
# 00181 #
+# python.spec has
+# Patch181: 00181-allow-arbitrary-timeout-in-condition-wait.patch
+# Does not affect python3
+
+# 00181 #
# Fix test.test_gdb.PyBtTests.test_threads on ppc64
# Cherrypicked from upstream commit:
#
http://hg.python.org/cpython/rev/f4a6b731905a/
# for upstream issue
http://bugs.python.org/issue17833
# (rhbz#960010)
-Patch181: 00181-fix-test_gdb-test_threads.patch
+Patch182: 00182-fix-test_gdb-test_threads.patch
+
# (New patches go here ^^^)
#
@@ -815,7 +816,7 @@ done
%endif
# 00151: not for python3
# 00152: upstream as of Python 3.3.0b2
-%patch153 -p1
+%patch153 -p0
# 00154: not for this branch
%patch155 -p1
%patch156 -p1
@@ -839,13 +840,14 @@ done
#00172: TODO
%patch173 -p1
#00174: TODO
-%patch175 -p1
+# 00175: upstream as of Python 3.3.2
# 00176: upstream as of Python 3.3.1
%patch177 -p1
%patch178 -p1
%patch179 -p1
%patch180 -p1
-%patch181 -p1
+# 00181: not for python3
+%patch182 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1686,6 +1688,12 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 16 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.2-1
+- Updated to Python 3.3.2.
+- Refreshed patches: 153 (gdb test noise)
+- Dropped patches: 175 (configure -Wformat, fixed upstream)
+- Synced patch numbers with python.spec.
+
* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
diff --git a/sources b/sources
index b8490ab..acfd2af 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-993232d9f4d9b4863cc1ec69a792e9cd Python-3.3.1.tar.xz
+c94b78ea3b68a9bbc9906af4d5b4fdc7 Python-3.3.2.tar.xz
commit 9d658b4031a765b4b2fc7a4cfde5337736019c42
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Thu May 9 12:19:36 2013 -0400
3.3.1-4: fix test.test_gdb.PyBtTests.test_threads on ppc64 (rhbz#960010)
* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
diff --git a/00181-fix-test_gdb-test_threads.patch
b/00181-fix-test_gdb-test_threads.patch
new file mode 100644
index 0000000..41de5b2
--- /dev/null
+++ b/00181-fix-test_gdb-test_threads.patch
@@ -0,0 +1,13 @@
+diff -up Python-3.3.1/Misc/NEWS.fix-test_gdb-test_threads Python-3.3.1/Misc/NEWS
+diff -up Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads
Python-3.3.1/Tools/gdb/libpython.py
+--- Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads 2013-05-09
12:12:01.621592211 -0400
++++ Python-3.3.1/Tools/gdb/libpython.py 2013-05-09 12:12:01.632592209 -0400
+@@ -1465,7 +1465,7 @@ class Frame(object):
+ # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
+ name = self._gdbframe.name()
+ if name:
+- return name.startswith('pthread_cond_timedwait')
++ return 'pthread_cond_timedwait' in name
+
+ def is_gc_collect(self):
+ '''Is this frame "collect" within the
garbage-collector?'''
diff --git a/python3.spec b/python3.spec
index 481e9ca..e66e9bf 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -584,6 +584,14 @@ Patch179:
00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
# Not appropriate for upstream, Fedora-specific naming
Patch180: 00180-python-add-support-for-ppc64p7.patch
+# 00181 #
+# Fix test.test_gdb.PyBtTests.test_threads on ppc64
+# Cherrypicked from upstream commit:
+#
http://hg.python.org/cpython/rev/f4a6b731905a/
+# for upstream issue
http://bugs.python.org/issue17833
+# (rhbz#960010)
+Patch181: 00181-fix-test_gdb-test_threads.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -837,6 +845,7 @@ done
%patch178 -p1
%patch179 -p1
%patch180 -p1
+%patch181 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1677,6 +1686,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
+- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
+
* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
- Add patch that enables building on ppc64p7 (replace the sed, so that
we get consistent with python2 spec and it's more obvious that we're doing it.
commit 721c1efdac18333767c4d2aec7ab33cd44458183
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Thu May 9 12:12:53 2013 -0400
3.3.1-4: fix test.test_gdb.PyBtTests.test_threads on ppc64 (rhbz#960010)
* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
diff --git a/00181-fix-test_gdb-test_threads.patch
b/00181-fix-test_gdb-test_threads.patch
new file mode 100644
index 0000000..41de5b2
--- /dev/null
+++ b/00181-fix-test_gdb-test_threads.patch
@@ -0,0 +1,13 @@
+diff -up Python-3.3.1/Misc/NEWS.fix-test_gdb-test_threads Python-3.3.1/Misc/NEWS
+diff -up Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads
Python-3.3.1/Tools/gdb/libpython.py
+--- Python-3.3.1/Tools/gdb/libpython.py.fix-test_gdb-test_threads 2013-05-09
12:12:01.621592211 -0400
++++ Python-3.3.1/Tools/gdb/libpython.py 2013-05-09 12:12:01.632592209 -0400
+@@ -1465,7 +1465,7 @@ class Frame(object):
+ # This assumes the _POSIX_THREADS version of Python/ceval_gil.h:
+ name = self._gdbframe.name()
+ if name:
+- return name.startswith('pthread_cond_timedwait')
++ return 'pthread_cond_timedwait' in name
+
+ def is_gc_collect(self):
+ '''Is this frame "collect" within the
garbage-collector?'''
diff --git a/python3.spec b/python3.spec
index 481e9ca..e66e9bf 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -584,6 +584,14 @@ Patch179:
00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
# Not appropriate for upstream, Fedora-specific naming
Patch180: 00180-python-add-support-for-ppc64p7.patch
+# 00181 #
+# Fix test.test_gdb.PyBtTests.test_threads on ppc64
+# Cherrypicked from upstream commit:
+#
http://hg.python.org/cpython/rev/f4a6b731905a/
+# for upstream issue
http://bugs.python.org/issue17833
+# (rhbz#960010)
+Patch181: 00181-fix-test_gdb-test_threads.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -837,6 +845,7 @@ done
%patch178 -p1
%patch179 -p1
%patch180 -p1
+%patch181 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1677,6 +1686,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 9 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.1-4
+- fix test.test_gdb.PyBtTests.test_threads on ppc64 (patch 181; rhbz#960010)
+
* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
- Add patch that enables building on ppc64p7 (replace the sed, so that
we get consistent with python2 spec and it's more obvious that we're doing it.
commit f9db6e6f659d4b086e5cea8b8ce0aad925ee606e
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu May 2 09:41:28 2013 +0200
Add patch that enables building on ppc64p7 (replace the sed, so that
we get consistent with python2 spec and it's more obvious that we're doing
it.
diff --git a/00180-python-add-support-for-ppc64p7.patch
b/00180-python-add-support-for-ppc64p7.patch
new file mode 100644
index 0000000..022944a
--- /dev/null
+++ b/00180-python-add-support-for-ppc64p7.patch
@@ -0,0 +1,12 @@
+diff -r de35eae9048a config.sub
+--- a/config.sub Wed Apr 24 23:33:20 2013 +0200
++++ b/config.sub Thu Apr 25 08:51:00 2013 +0200
+@@ -1008,7 +1008,7 @@
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed
's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
diff --git a/python3.spec b/python3.spec
index eeeba9c..481e9ca 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -579,6 +579,11 @@ Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# Doesn't seem to affect Python 2 AFAICS.
Patch179: 00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
+# 00180 #
+# Enable building on ppc64p7
+# Not appropriate for upstream, Fedora-specific naming
+Patch180: 00180-python-add-support-for-ppc64p7.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -831,6 +836,7 @@ done
%patch177 -p1
%patch178 -p1
%patch179 -p1
+%patch180 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -848,9 +854,6 @@ sed --in-place \
%patch5000 -p0 -b .autotool-intermediates
%endif
-# Add target for optimized Power7 binaries:
-sed -i -e "s/ppc64-\*/ppc64-\* \| ppc64p7-\*/" config.sub
-
# ======================================================
# Configuring and building the code:
# ======================================================
@@ -1674,6 +1677,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
+- Add patch that enables building on ppc64p7 (replace the sed, so that
+we get consistent with python2 spec and it's more obvious that we're doing it.
+
* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
- Add fix for gdb tests failing on arm, rhbz#951802.
commit 69d4e5d3533e4404ae7d42d537d29fd6861a8eae
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu May 2 09:41:28 2013 +0200
Add patch that enables building on ppc64p7 (replace the sed, so that
we get consistent with python2 spec and it's more obvious that we're doing
it.
diff --git a/00180-python-add-support-for-ppc64p7.patch
b/00180-python-add-support-for-ppc64p7.patch
new file mode 100644
index 0000000..022944a
--- /dev/null
+++ b/00180-python-add-support-for-ppc64p7.patch
@@ -0,0 +1,12 @@
+diff -r de35eae9048a config.sub
+--- a/config.sub Wed Apr 24 23:33:20 2013 +0200
++++ b/config.sub Thu Apr 25 08:51:00 2013 +0200
+@@ -1008,7 +1008,7 @@
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed
's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
diff --git a/python3.spec b/python3.spec
index eeeba9c..481e9ca 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -579,6 +579,11 @@ Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# Doesn't seem to affect Python 2 AFAICS.
Patch179: 00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
+# 00180 #
+# Enable building on ppc64p7
+# Not appropriate for upstream, Fedora-specific naming
+Patch180: 00180-python-add-support-for-ppc64p7.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -831,6 +836,7 @@ done
%patch177 -p1
%patch178 -p1
%patch179 -p1
+%patch180 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -848,9 +854,6 @@ sed --in-place \
%patch5000 -p0 -b .autotool-intermediates
%endif
-# Add target for optimized Power7 binaries:
-sed -i -e "s/ppc64-\*/ppc64-\* \| ppc64p7-\*/" config.sub
-
# ======================================================
# Configuring and building the code:
# ======================================================
@@ -1674,6 +1677,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu May 02 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-3
+- Add patch that enables building on ppc64p7 (replace the sed, so that
+we get consistent with python2 spec and it's more obvious that we're doing it.
+
* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
- Add fix for gdb tests failing on arm, rhbz#951802.
commit 88d5ef166c7e8facc4fcd175c57daf8322ba564b
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Apr 24 11:47:45 2013 +0200
Add fix for gdb tests failing on arm, rhbz#951802.
diff --git a/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
b/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
new file mode 100644
index 0000000..2112730
--- /dev/null
+++ b/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
@@ -0,0 +1,48 @@
+--- a/Tools/gdb/libpython.py 2013-04-06 03:41:58.000000000 -0400
++++ b/Tools/gdb/libpython.py 2013-04-24 03:51:04.720540343 -0400
+@@ -274,6 +274,9 @@
+ self.tp_name = tp_name
+ self.address = address
+
++ def __len__(self):
++ return len(repr(self))
++
+ def __repr__(self):
+ # For the NULL pointer, we have no way of knowing a type, so
+ # special-case it as per
+@@ -881,6 +884,8 @@
+ filename = self.filename()
+ try:
+ f = open(os_fsencode(filename), 'r')
++ except TypeError: # filename is FakeRepr
++ return None
+ except IOError:
+ return None
+ with f:
+@@ -1523,9 +1528,12 @@
+
+ def print_summary(self):
+ if self.is_evalframeex():
+- pyop = self.get_pyop()
+- if pyop:
++ try:
++ pyop = self.get_pyop()
+ line = pyop.get_truncated_repr(MAX_OUTPUT_LEN)
++ except:
++ pyop = None
++ if pyop:
+ write_unicode(sys.stdout, '#%i %s\n' % (self.get_index(),
line))
+ if not pyop.is_optimized_out():
+ line = pyop.current_line()
+@@ -1542,7 +1550,10 @@
+
+ def print_traceback(self):
+ if self.is_evalframeex():
+- pyop = self.get_pyop()
++ try:
++ pyop = self.get_pyop()
++ except:
++ pyop = None
+ if pyop:
+ pyop.print_traceback()
+ if not pyop.is_optimized_out():
diff --git a/python3.spec b/python3.spec
index 307a3d7..eeeba9c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -570,6 +570,15 @@ Patch177: 00177-platform-unicode.patch
# Does not affect python2 AFAICS (different sysconfig values initialization)
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
+# 00179 #
+# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=951802
+# Reported upstream in
http://bugs.python.org/issue17737
+# This patch basically looks at every frame and if it is somehow corrupted,
+# it just stops printing the traceback - it doesn't fix the actual bug.
+# This bug seems to only affect ARM.
+# Doesn't seem to affect Python 2 AFAICS.
+Patch179: 00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -821,6 +830,7 @@ done
# 00176: upstream as of Python 3.3.1
%patch177 -p1
%patch178 -p1
+%patch179 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1664,6 +1674,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
+- Add fix for gdb tests failing on arm, rhbz#951802.
+
* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
- Updated to Python 3.3.1.
- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
commit b935d25938262c5161ab89752972f642f7dea5b6
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Apr 24 11:47:45 2013 +0200
Add fix for gdb tests failing on arm, rhbz#951802.
diff --git a/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
b/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
new file mode 100644
index 0000000..2112730
--- /dev/null
+++ b/00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
@@ -0,0 +1,48 @@
+--- a/Tools/gdb/libpython.py 2013-04-06 03:41:58.000000000 -0400
++++ b/Tools/gdb/libpython.py 2013-04-24 03:51:04.720540343 -0400
+@@ -274,6 +274,9 @@
+ self.tp_name = tp_name
+ self.address = address
+
++ def __len__(self):
++ return len(repr(self))
++
+ def __repr__(self):
+ # For the NULL pointer, we have no way of knowing a type, so
+ # special-case it as per
+@@ -881,6 +884,8 @@
+ filename = self.filename()
+ try:
+ f = open(os_fsencode(filename), 'r')
++ except TypeError: # filename is FakeRepr
++ return None
+ except IOError:
+ return None
+ with f:
+@@ -1523,9 +1528,12 @@
+
+ def print_summary(self):
+ if self.is_evalframeex():
+- pyop = self.get_pyop()
+- if pyop:
++ try:
++ pyop = self.get_pyop()
+ line = pyop.get_truncated_repr(MAX_OUTPUT_LEN)
++ except:
++ pyop = None
++ if pyop:
+ write_unicode(sys.stdout, '#%i %s\n' % (self.get_index(),
line))
+ if not pyop.is_optimized_out():
+ line = pyop.current_line()
+@@ -1542,7 +1550,10 @@
+
+ def print_traceback(self):
+ if self.is_evalframeex():
+- pyop = self.get_pyop()
++ try:
++ pyop = self.get_pyop()
++ except:
++ pyop = None
+ if pyop:
+ pyop.print_traceback()
+ if not pyop.is_optimized_out():
diff --git a/python3.spec b/python3.spec
index 307a3d7..eeeba9c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -570,6 +570,15 @@ Patch177: 00177-platform-unicode.patch
# Does not affect python2 AFAICS (different sysconfig values initialization)
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
+# 00179 #
+# Workaround for
https://bugzilla.redhat.com/show_bug.cgi?id=951802
+# Reported upstream in
http://bugs.python.org/issue17737
+# This patch basically looks at every frame and if it is somehow corrupted,
+# it just stops printing the traceback - it doesn't fix the actual bug.
+# This bug seems to only affect ARM.
+# Doesn't seem to affect Python 2 AFAICS.
+Patch179: 00179-dont-raise-error-on-gdb-corrupted-frames-in-backtrace.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -821,6 +830,7 @@ done
# 00176: upstream as of Python 3.3.1
%patch177 -p1
%patch178 -p1
+%patch179 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1664,6 +1674,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Apr 24 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-2
+- Add fix for gdb tests failing on arm, rhbz#951802.
+
* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
- Updated to Python 3.3.1.
- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
commit 50232369f6457c004e0390c1d3a18b826a96c9a9
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Apr 10 14:30:09 2013 +0200
Updated to Python 3.3.1.
- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
keeping few more downstream tests)
- Removed patches: 3 (audiotest.au made it to upstream tarball)
- Removed workaround for
http://bugs.python.org/issue14774, discussed in
http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 577538a..90b876b 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -653,8 +653,8 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
$(BYTESTR_DEPS)
@@ -724,6 +726,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
- $(srcdir)/Objects/typeslots.inc: $(srcdir)/Include/typeslots.h
$(srcdir)/Objects/typeslots.py
- $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
$(srcdir)/Objects/typeslots.inc
+ Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py
+ $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
Objects/typeslots.inc
+# Only needed with --with-systemtap; not a public header:
+$(srcdir)/Python/pysystemtap.h: $(srcdir)/Python/pysystemtap.d
@@ -667,8 +667,8 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
# Header files
@@ -1345,6 +1354,7 @@ clean: pycremoval
+ -rm -f pybuilddir.txt
-rm -f Lib/lib2to3/*Grammar*.pickle
- -rm -f $(SYSCONFIGDATA)
-rm -f Modules/_testembed Modules/_freeze_importlib
+ -rm -f $(srcdir)/Python/pysystemtap.h
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 91b24b8..bd63852 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -9,7 +9,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
- platform: $(BUILDPYTHON) $(SYSCONFIGDATA)
+ platform: $(BUILDPYTHON) pybuilddir.txt
@@ -480,18 +480,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -44,7 +44,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
done
- @if test -d $(LIBRARY); then :; else \
- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-- if test "$(SO)" = .dll; then \
+- if test "$(SHLIB_SUFFIX)" = .dll; then \
- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
- else \
- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index da83205..f22d9bd 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -285,7 +285,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
+} EVPCachedInfo;
-#define DEFINE_CONSTS_FOR_NEW(Name) \
-- static PyObject *CONST_ ## Name ## _name_obj; \
+- static PyObject *CONST_ ## Name ## _name_obj = NULL; \
- static EVP_MD_CTX CONST_new_ ## Name ## _ctx; \
- static EVP_MD_CTX *CONST_new_ ## Name ## _ctx_p = NULL;
+#define DEFINE_CONSTS_FOR_NEW(Name) \
@@ -444,7 +444,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
if (data_obj)
PyBuffer_Release(&view);
-@@ -547,55 +620,115 @@ generate_hash_name_list(void)
+@@ -547,58 +620,115 @@ generate_hash_name_list(void)
/*
@@ -550,12 +550,15 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
" hash object; optionally initialized with a string") \
}
--/* used in the init function to setup a constructor */
+-/* used in the init function to setup a constructor: initialize OpenSSL
+- constructor constants if they haven't been initialized already. */
-#define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \
-- CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
-- if (EVP_get_digestbyname(#NAME)) { \
-- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
-- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME)); \
+- if (CONST_ ## NAME ## _name_obj == NULL) { \
+- CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
+- if (EVP_get_digestbyname(#NAME)) { \
+- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
+- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME));
\
+- } \
- } \
-} while (0);
+/*
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
index cc9ed8c..c65787f 100644
--- a/00153-fix-test_gdb-noise.patch
+++ b/00153-fix-test_gdb-noise.patch
@@ -18,10 +18,9 @@ diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59
if cmds_after_breakpoint:
commands += cmds_after_breakpoint
@@ -154,8 +163,16 @@ class DebuggerTests(unittest.TestCase):
- err = err.replace("warning: Cannot initialize thread debugging"
- " library: Debugger service failed\n",
+ 'Do you need "set solib-search-path" or '
+ '"set sysroot"?\n',
'')
--
+ err = '\n'.join([line
+ for line in err.splitlines()
+ if not line.startswith('warning: Unable to open')
@@ -29,7 +28,7 @@ diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59
+ if not line.startswith('Try: yum --disablerepo=')
+ # In case 'set print entry-values no' failed:
+ if not line.startswith('Undefined set print
command')])
-+
+
# Ensure no unexpected error messages:
+ self.maxDiff = None
self.assertEqual(err, '')
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
index ab4cb0c..0f48df5 100644
--- a/00157-uid-gid-overflows.patch
+++ b/00157-uid-gid-overflows.patch
@@ -1,32 +1,3 @@
-diff -up Python-3.3.0b1/Include/modsupport.h.uid-gid-overflows
Python-3.3.0b1/Include/modsupport.h
---- Python-3.3.0b1/Include/modsupport.h.uid-gid-overflows 2012-06-26 16:19:40.000000000
-0400
-+++ Python-3.3.0b1/Include/modsupport.h 2012-07-20 14:21:46.854688763 -0400
-@@ -8,6 +8,7 @@ extern "C" {
- /* Module support interface */
-
- #include <stdarg.h>
-+#include <sys/types.h>
-
- /* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier
- to mean Py_ssize_t */
-@@ -125,6 +126,17 @@ PyAPI_FUNC(PyObject *) PyModule_Create2(
- PyAPI_DATA(char *) _Py_PackageContext;
- #endif
-
-+/*
-+ Non-standard extension: support for dealing with uid_t and gid_t without
-+ integer overflow
-+ */
-+
-+PyAPI_FUNC(PyObject *) _PyObject_FromUid(uid_t uid);
-+PyAPI_FUNC(PyObject *) _PyObject_FromGid(gid_t gid);
-+
-+PyAPI_FUNC(int) _PyArg_ParseUid(PyObject *in_obj, uid_t *out_uid);
-+PyAPI_FUNC(int) _PyArg_ParseGid(PyObject *in_obj, gid_t *out_gid);
-+
- #ifdef __cplusplus
- }
- #endif
diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_os.py
--- Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
+++ Python-3.3.0b1/Lib/test/test_os.py 2012-07-20 14:21:46.856688739 -0400
@@ -39,7 +10,7 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
if hasattr(os, 'setgid'):
def test_setgid(self):
- if os.getuid() != 0:
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
self.assertRaises(os.error, os.setgid, 0)
+ self.assertRaises(TypeError, os.setgid, 'not an int')
self.assertRaises(OverflowError, os.setgid, 1<<32)
@@ -53,7 +24,7 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
if hasattr(os, 'setegid'):
def test_setegid(self):
- if os.getuid() != 0:
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
self.assertRaises(os.error, os.setegid, 0)
+ self.assertRaises(TypeError, os.setegid, 'not an int')
self.assertRaises(OverflowError, os.setegid, 1<<32)
@@ -69,62 +40,13 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
@@ -1212,6 +1218,8 @@ if sys.platform != 'win32':
def test_setregid(self):
- if os.getuid() != 0:
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
self.assertRaises(os.error, os.setregid, 0, 0)
+ self.assertRaises(TypeError, os.setregid, 'not an int', 0)
+ self.assertRaises(TypeError, os.setregid, 0, 'not an int')
self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
-diff -up Python-3.3.0b1/Lib/test/test_posix.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_posix.py
---- Python-3.3.0b1/Lib/test/test_posix.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
-+++ Python-3.3.0b1/Lib/test/test_posix.py 2012-07-20 14:21:46.857688726 -0400
-@@ -387,10 +387,17 @@ class PosixTester(unittest.TestCase):
- else:
- self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
-
-- def _test_all_chown_common(self, chown_func, first_param):
-+ def _test_all_chown_common(self, chown_func, stat_func, first_param):
- """Common code for chown, fchown and lchown
tests."""
- # test a successful chown call
- chown_func(first_param, os.getuid(), os.getgid())
-+ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
-+ self.assertEqual(stat_func(first_param).st_gid, os.getgid())
-+
-+ # verify that -1 works as a "do-nothing" option:
-+ chown_func(first_param, -1, -1)
-+ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
-+ self.assertEqual(stat_func(first_param).st_gid, os.getgid())
-
- if os.getuid() == 0:
- try:
-@@ -421,7 +428,7 @@ class PosixTester(unittest.TestCase):
-
- # re-create the file
- support.create_empty_file(support.TESTFN)
-- self._test_all_chown_common(posix.chown, support.TESTFN)
-+ self._test_all_chown_common(posix.chown, posix.stat, support.TESTFN)
-
- @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs
os.fchown()")
- def test_fchown(self):
-@@ -431,7 +438,7 @@ class PosixTester(unittest.TestCase):
- test_file = open(support.TESTFN, 'w')
- try:
- fd = test_file.fileno()
-- self._test_all_chown_common(posix.fchown, fd)
-+ self._test_all_chown_common(posix.fchown, posix.fstat, fd)
- finally:
- test_file.close()
-
-@@ -440,7 +447,7 @@ class PosixTester(unittest.TestCase):
- os.unlink(support.TESTFN)
- # create a symlink
- os.symlink(_DUMMY_SYMLINK, support.TESTFN)
-- self._test_all_chown_common(posix.lchown, support.TESTFN)
-+ self._test_all_chown_common(posix.lchown, posix.lstat, support.TESTFN)
-
- def test_chdir(self):
- if hasattr(posix, 'chdir'):
diff -up Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_pwd.py
--- Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
+++ Python-3.3.0b1/Lib/test/test_pwd.py 2012-07-20 14:21:46.857688726 -0400
@@ -140,557 +62,3 @@ diff -up Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.3.0b1/Li
self.assertNotIn(fakeuid, byuids)
self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
-diff -up Python-3.3.0b1/Modules/grpmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/grpmodule.c
---- Python-3.3.0b1/Modules/grpmodule.c.uid-gid-overflows 2012-06-26 16:19:54.000000000
-0400
-+++ Python-3.3.0b1/Modules/grpmodule.c 2012-07-20 14:21:46.858688713 -0400
-@@ -69,7 +69,7 @@ mkgrent(struct group *p)
- Py_INCREF(Py_None);
- }
- #endif
-- SET(setIndex++, PyLong_FromLong((long) p->gr_gid));
-+ SET(setIndex++, _PyObject_FromGid(p->gr_gid));
- SET(setIndex++, w);
- #undef SET
-
-@@ -84,18 +84,16 @@ mkgrent(struct group *p)
- static PyObject *
- grp_getgrgid(PyObject *self, PyObject *pyo_id)
- {
-- PyObject *py_int_id;
-- unsigned int gid;
-+ gid_t gid;
- struct group *p;
-
-- py_int_id = PyNumber_Long(pyo_id);
-- if (!py_int_id)
-- return NULL;
-- gid = PyLong_AS_LONG(py_int_id);
-- Py_DECREF(py_int_id);
-+ if (!_PyArg_ParseGid(pyo_id, &gid)) {
-+ return NULL;
-+ }
-
- if ((p = getgrgid(gid)) == NULL) {
-- PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);
-+ PyErr_Format(PyExc_KeyError,
-+ "getgrgid(): gid not found: %lu", (unsigned long)gid);
- return NULL;
- }
- return mkgrent(p);
-diff -up Python-3.3.0b1/Modules/posixmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/posixmodule.c
---- Python-3.3.0b1/Modules/posixmodule.c.uid-gid-overflows 2012-07-20 14:21:46.788689588
-0400
-+++ Python-3.3.0b1/Modules/posixmodule.c 2012-07-20 14:24:19.626778849 -0400
-@@ -2151,8 +2151,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
- PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
- #endif
- PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
-- PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long)st->st_uid));
-- PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long)st->st_gid));
-+ PyStructSequence_SET_ITEM(v, 4, _PyObject_FromUid(st->st_uid));
-+ PyStructSequence_SET_ITEM(v, 5, _PyObject_FromGid(st->st_gid));
- #ifdef HAVE_LARGEFILE_SUPPORT
- PyStructSequence_SET_ITEM(v, 6,
- PyLong_FromLongLong((PY_LONG_LONG)st->st_size));
-@@ -2957,7 +2957,6 @@ static PyObject *
- posix_chown(PyObject *self, PyObject *args, PyObject *kwargs)
- {
- path_t path;
-- long uid_l, gid_l;
- uid_t uid;
- gid_t gid;
- int dir_fd = DEFAULT_DIR_FD;
-@@ -2971,9 +2970,10 @@ posix_chown(PyObject *self, PyObject *ar
- #ifdef HAVE_FCHOWN
- path.allow_fd = 1;
- #endif
-- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&ll|$O&p:chown",
keywords,
-+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O&O&O&|$O&p:chown", keywords,
- path_converter, &path,
-- &uid_l, &gid_l,
-+ _PyArg_ParseUid, &uid,
-+ _PyArg_ParseGid, &gid,
- #ifdef HAVE_FCHOWNAT
- dir_fd_converter, &dir_fd,
- #else
-@@ -3004,8 +3004,6 @@ posix_chown(PyObject *self, PyObject *ar
- #endif
-
- Py_BEGIN_ALLOW_THREADS
-- uid = (uid_t)uid_l;
-- gid = (uid_t)gid_l;
- #ifdef HAVE_FCHOWN
- if (path.fd != -1)
- result = fchown(path.fd, uid, gid);
-@@ -3049,12 +3047,15 @@ static PyObject *
- posix_fchown(PyObject *self, PyObject *args)
- {
- int fd;
-- long uid, gid;
-+ uid_t uid;
-+ gid_t gid;
- int res;
-- if (!PyArg_ParseTuple(args, "ill:fchown", &fd, &uid, &gid))
-+ if (!PyArg_ParseTuple(args, "iO&O&:chown", &fd,
-+ _PyArg_ParseUid, &uid,
-+ _PyArg_ParseGid, &gid))
- return NULL;
- Py_BEGIN_ALLOW_THREADS
-- res = fchown(fd, (uid_t) uid, (gid_t) gid);
-+ res = fchown(fd, uid, gid);
- Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error();
-@@ -3074,15 +3075,17 @@ posix_lchown(PyObject *self, PyObject *a
- {
- PyObject *opath;
- char *path;
-- long uid, gid;
-+ uid_t uid;
-+ gid_t gid;
- int res;
-- if (!PyArg_ParseTuple(args, "O&ll:lchown",
-+ if (!PyArg_ParseTuple(args, "O&O&O&:lchown",
- PyUnicode_FSConverter, &opath,
-- &uid, &gid))
-+ _PyArg_ParseUid, &uid,
-+ _PyArg_ParseGid, &gid))
- return NULL;
- path = PyBytes_AsString(opath);
- Py_BEGIN_ALLOW_THREADS
-- res = lchown(path, (uid_t) uid, (gid_t) gid);
-+ res = lchown(path, uid, gid);
- Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
-@@ -6184,7 +6187,7 @@ Return the current process's effective g
- static PyObject *
- posix_getegid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)getegid());
-+ return _PyObject_FromGid(getegid());
- }
- #endif
-
-@@ -6197,7 +6200,7 @@ Return the current process's effective u
- static PyObject *
- posix_geteuid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)geteuid());
-+ return _PyObject_FromUid(geteuid());
- }
- #endif
-
-@@ -6210,7 +6213,7 @@ Return the current process's group id.")
- static PyObject *
- posix_getgid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)getgid());
-+ return _PyObject_FromGid(getgid());
- }
- #endif
-
-@@ -6349,7 +6352,7 @@ posix_getgroups(PyObject *self, PyObject
- if (result != NULL) {
- int i;
- for (i = 0; i < n; ++i) {
-- PyObject *o = PyLong_FromLong((long)alt_grouplist[i]);
-+ PyObject *o = _PyObject_FromGid(alt_grouplist[i]);
- if (o == NULL) {
- Py_DECREF(result);
- result = NULL;
-@@ -6380,14 +6383,15 @@ posix_initgroups(PyObject *self, PyObjec
- PyObject *oname;
- char *username;
- int res;
-- long gid;
-+ gid_t gid;
-
-- if (!PyArg_ParseTuple(args, "O&l:initgroups",
-- PyUnicode_FSConverter, &oname, &gid))
-+ if (!PyArg_ParseTuple(args, "O&O&:initgroups",
-+ PyUnicode_FSConverter, &oname,
-+ _PyArg_ParseGid, &gid))
- return NULL;
- username = PyBytes_AS_STRING(oname);
-
-- res = initgroups(username, (gid_t) gid);
-+ res = initgroups(username, gid);
- Py_DECREF(oname);
- if (res == -1)
- return PyErr_SetFromErrno(PyExc_OSError);
-@@ -6562,7 +6566,7 @@ Return the current process's user id.");
- static PyObject *
- posix_getuid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)getuid());
-+ return _PyObject_FromUid(getuid());
- }
- #endif
-
-@@ -6702,15 +6706,9 @@ Set the current process's user id.");
- static PyObject *
- posix_setuid(PyObject *self, PyObject *args)
- {
-- long uid_arg;
- uid_t uid;
-- if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg))
-- return NULL;
-- uid = uid_arg;
-- if (uid != uid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "user id too big");
-+ if (!PyArg_ParseTuple(args, "O&:setuid", _PyArg_ParseUid, &uid))
- return NULL;
-- }
- if (setuid(uid) < 0)
- return posix_error();
- Py_INCREF(Py_None);
-@@ -6727,15 +6725,9 @@ Set the current process's effective user
- static PyObject *
- posix_seteuid (PyObject *self, PyObject *args)
- {
-- long euid_arg;
- uid_t euid;
-- if (!PyArg_ParseTuple(args, "l", &euid_arg))
-+ if (!PyArg_ParseTuple(args, "O&:seteuid", _PyArg_ParseUid,
&euid))
- return NULL;
-- euid = euid_arg;
-- if (euid != euid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "user id too big");
-- return NULL;
-- }
- if (seteuid(euid) < 0) {
- return posix_error();
- } else {
-@@ -6753,15 +6745,9 @@ Set the current process's effective grou
- static PyObject *
- posix_setegid (PyObject *self, PyObject *args)
- {
-- long egid_arg;
- gid_t egid;
-- if (!PyArg_ParseTuple(args, "l", &egid_arg))
-- return NULL;
-- egid = egid_arg;
-- if (egid != egid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "group id too big");
-+ if (!PyArg_ParseTuple(args, "O&:setegid", _PyArg_ParseGid,
&egid))
- return NULL;
-- }
- if (setegid(egid) < 0) {
- return posix_error();
- } else {
-@@ -6779,23 +6765,11 @@ Set the current process's real and effec
- static PyObject *
- posix_setreuid (PyObject *self, PyObject *args)
- {
-- long ruid_arg, euid_arg;
- uid_t ruid, euid;
-- if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
-- return NULL;
-- if (ruid_arg == -1)
-- ruid = (uid_t)-1; /* let the compiler choose how -1 fits */
-- else
-- ruid = ruid_arg; /* otherwise, assign from our long */
-- if (euid_arg == -1)
-- euid = (uid_t)-1;
-- else
-- euid = euid_arg;
-- if ((euid_arg != -1 && euid != euid_arg) ||
-- (ruid_arg != -1 && ruid != ruid_arg)) {
-- PyErr_SetString(PyExc_OverflowError, "user id too big");
-+ if (!PyArg_ParseTuple(args, "O&O&",
-+ _PyArg_ParseUid, &ruid,
-+ _PyArg_ParseUid, &euid))
- return NULL;
-- }
- if (setreuid(ruid, euid) < 0) {
- return posix_error();
- } else {
-@@ -6813,23 +6787,11 @@ Set the current process's real and effec
- static PyObject *
- posix_setregid (PyObject *self, PyObject *args)
- {
-- long rgid_arg, egid_arg;
- gid_t rgid, egid;
-- if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
-- return NULL;
-- if (rgid_arg == -1)
-- rgid = (gid_t)-1; /* let the compiler choose how -1 fits */
-- else
-- rgid = rgid_arg; /* otherwise, assign from our long */
-- if (egid_arg == -1)
-- egid = (gid_t)-1;
-- else
-- egid = egid_arg;
-- if ((egid_arg != -1 && egid != egid_arg) ||
-- (rgid_arg != -1 && rgid != rgid_arg)) {
-- PyErr_SetString(PyExc_OverflowError, "group id too big");
-+ if (!PyArg_ParseTuple(args, "O&O&",
-+ _PyArg_ParseGid, &rgid,
-+ _PyArg_ParseGid, &egid))
- return NULL;
-- }
- if (setregid(rgid, egid) < 0) {
- return posix_error();
- } else {
-@@ -6847,15 +6809,9 @@ Set the current process's group id.");
- static PyObject *
- posix_setgid(PyObject *self, PyObject *args)
- {
-- long gid_arg;
- gid_t gid;
-- if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg))
-+ if (!PyArg_ParseTuple(args, "O&:setgid", _PyArg_ParseGid, &gid))
- return NULL;
-- gid = gid_arg;
-- if (gid != gid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "group id too big");
-- return NULL;
-- }
- if (setgid(gid) < 0)
- return posix_error();
- Py_INCREF(Py_None);
-@@ -6888,27 +6844,9 @@ posix_setgroups(PyObject *self, PyObject
- elem = PySequence_GetItem(groups, i);
- if (!elem)
- return NULL;
-- if (!PyLong_Check(elem)) {
-- PyErr_SetString(PyExc_TypeError,
-- "groups must be integers");
-+ if (!_PyArg_ParseGid(elem, &grouplist[i])) {
- Py_DECREF(elem);
- return NULL;
-- } else {
-- unsigned long x = PyLong_AsUnsignedLong(elem);
-- if (PyErr_Occurred()) {
-- PyErr_SetString(PyExc_TypeError,
-- "group id too big");
-- Py_DECREF(elem);
-- return NULL;
-- }
-- grouplist[i] = x;
-- /* read back the value to see if it fitted in gid_t */
-- if (grouplist[i] != x) {
-- PyErr_SetString(PyExc_TypeError,
-- "group id too big");
-- Py_DECREF(elem);
-- return NULL;
-- }
- }
- Py_DECREF(elem);
- }
-@@ -10388,9 +10326,11 @@ Set the current process's real, effectiv
- static PyObject*
- posix_setresuid (PyObject *self, PyObject *args)
- {
-- /* We assume uid_t is no larger than a long. */
-- long ruid, euid, suid;
-- if (!PyArg_ParseTuple(args, "lll", &ruid, &euid, &suid))
-+ uid_t ruid, euid, suid;
-+ if (!PyArg_ParseTuple(args, "O&O&O&",
-+ _PyArg_ParseUid, &ruid,
-+ _PyArg_ParseUid, &euid,
-+ _PyArg_ParseUid, &suid))
- return NULL;
- if (setresuid(ruid, euid, suid) < 0)
- return posix_error();
-@@ -10406,9 +10346,11 @@ Set the current process's real, effectiv
- static PyObject*
- posix_setresgid (PyObject *self, PyObject *args)
- {
-- /* We assume uid_t is no larger than a long. */
-- long rgid, egid, sgid;
-- if (!PyArg_ParseTuple(args, "lll", &rgid, &egid, &sgid))
-+ gid_t rgid, egid, sgid;
-+ if (!PyArg_ParseTuple(args, "O&O&O&",
-+ _PyArg_ParseGid, &rgid,
-+ _PyArg_ParseGid, &egid,
-+ _PyArg_ParseGid, &sgid))
- return NULL;
- if (setresgid(rgid, egid, sgid) < 0)
- return posix_error();
-@@ -10425,14 +10367,13 @@ static PyObject*
- posix_getresuid (PyObject *self, PyObject *noargs)
- {
- uid_t ruid, euid, suid;
-- long l_ruid, l_euid, l_suid;
-+ PyObject *obj_ruid, *obj_euid, *obj_suid;
- if (getresuid(&ruid, &euid, &suid) < 0)
- return posix_error();
-- /* Force the values into long's as we don't know the size of uid_t. */
-- l_ruid = ruid;
-- l_euid = euid;
-- l_suid = suid;
-- return Py_BuildValue("(lll)", l_ruid, l_euid, l_suid);
-+ obj_ruid = _PyObject_FromUid(ruid);
-+ obj_euid = _PyObject_FromUid(euid);
-+ obj_suid = _PyObject_FromUid(suid);
-+ return Py_BuildValue("(NNN)", obj_ruid, obj_euid, obj_suid);
- }
- #endif
-
-@@ -10445,14 +10386,13 @@ static PyObject*
- posix_getresgid (PyObject *self, PyObject *noargs)
- {
- uid_t rgid, egid, sgid;
-- long l_rgid, l_egid, l_sgid;
-+ PyObject *obj_rgid, *obj_egid, *obj_sgid;
- if (getresgid(&rgid, &egid, &sgid) < 0)
- return posix_error();
-- /* Force the values into long's as we don't know the size of uid_t. */
-- l_rgid = rgid;
-- l_egid = egid;
-- l_sgid = sgid;
-- return Py_BuildValue("(lll)", l_rgid, l_egid, l_sgid);
-+ obj_rgid = _PyObject_FromGid(rgid);
-+ obj_egid = _PyObject_FromGid(egid);
-+ obj_sgid = _PyObject_FromGid(sgid);
-+ return Py_BuildValue("(NNN)", obj_rgid, obj_egid, obj_sgid);
- }
- #endif
-
-diff -up Python-3.3.0b1/Modules/pwdmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/pwdmodule.c
---- Python-3.3.0b1/Modules/pwdmodule.c.uid-gid-overflows 2012-06-26 16:19:54.000000000
-0400
-+++ Python-3.3.0b1/Modules/pwdmodule.c 2012-07-20 14:21:46.861688675 -0400
-@@ -74,8 +74,8 @@ mkpwent(struct passwd *p)
- #else
- SETS(setIndex++, p->pw_passwd);
- #endif
-- SETI(setIndex++, p->pw_uid);
-- SETI(setIndex++, p->pw_gid);
-+ PyStructSequence_SET_ITEM(v, setIndex++, _PyObject_FromUid(p->pw_uid));
-+ PyStructSequence_SET_ITEM(v, setIndex++, _PyObject_FromGid(p->pw_gid));
- #ifdef __VMS
- SETS(setIndex++, "");
- #else
-@@ -104,13 +104,14 @@ See help(pwd) for more on password datab
- static PyObject *
- pwd_getpwuid(PyObject *self, PyObject *args)
- {
-- unsigned int uid;
-+ uid_t uid;
- struct passwd *p;
-- if (!PyArg_ParseTuple(args, "I:getpwuid", &uid))
-+ if (!PyArg_ParseTuple(args, "O&:getpwuid",
-+ _PyArg_ParseUid, &uid))
- return NULL;
- if ((p = getpwuid(uid)) == NULL) {
- PyErr_Format(PyExc_KeyError,
-- "getpwuid(): uid not found: %d", uid);
-+ "getpwuid(): uid not found: %lu", (unsigned long)uid);
- return NULL;
- }
- return mkpwent(p);
-diff -up Python-3.3.0b1/Python/getargs.c.uid-gid-overflows
Python-3.3.0b1/Python/getargs.c
---- Python-3.3.0b1/Python/getargs.c.uid-gid-overflows 2012-06-26 16:19:57.000000000
-0400
-+++ Python-3.3.0b1/Python/getargs.c 2012-07-20 14:21:46.861688675 -0400
-@@ -4,6 +4,7 @@
- #include "Python.h"
-
- #include <ctype.h>
-+#include <limits.h>
-
-
- #ifdef __cplusplus
-@@ -1807,6 +1808,102 @@ _PyArg_NoKeywords(const char *funcname,
- funcname);
- return 0;
- }
-+
-+PyObject *
-+_PyObject_FromUid(uid_t uid)
-+{
-+ return PyLong_FromUnsignedLong((uid_t)uid);
-+}
-+
-+PyObject *
-+_PyObject_FromGid(gid_t gid)
-+{
-+ return PyLong_FromUnsignedLong((gid_t)gid);
-+}
-+
-+int
-+_PyArg_ParseUid(PyObject *in_obj, uid_t *out_uid)
-+{
-+ PyObject *index, *number = NULL;
-+ long sl;
-+ unsigned long ul;
-+
-+ assert(out_uid);
-+
-+ index = PyNumber_Index(in_obj);
-+ if (index != NULL) {
-+ number = PyNumber_Long(index);
-+ Py_DECREF(index);
-+ }
-+ if (number == NULL) {
-+ PyErr_SetString(PyExc_TypeError, "user id must be integer");
-+ return 0;
-+ }
-+
-+ /* Special case: support -1 (e.g. for use by chown) */
-+ sl = PyLong_AsLong(number);
-+ if (PyErr_Occurred()) {
-+ PyErr_Clear();
-+ } else if (sl == -1) {
-+ Py_DECREF(number);
-+ *out_uid = (uid_t)-1;
-+ return 1;
-+ }
-+
-+ /* Otherwise, it must be >= 0 */
-+ ul = PyLong_AsUnsignedLong(number);
-+ Py_DECREF(number);
-+ *out_uid = ul;
-+ /* read back the value to see if it fitted in uid_t */
-+ if (PyErr_Occurred() || *out_uid != ul) {
-+ PyErr_SetString(PyExc_OverflowError,
-+ "user id is not in range(-1, 2^32-1)");
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+int
-+_PyArg_ParseGid(PyObject *in_obj, gid_t *out_gid)
-+{
-+ PyObject *index, *number = NULL;
-+ long sl;
-+ unsigned long ul;
-+
-+ assert(out_gid);
-+
-+ index = PyNumber_Index(in_obj);
-+ if (index != NULL) {
-+ number = PyNumber_Long(index);
-+ Py_DECREF(index);
-+ }
-+ if (number == NULL) {
-+ PyErr_SetString(PyExc_TypeError, "group id must be integer");
-+ return 0;
-+ }
-+
-+ /* Special case: support -1 (e.g. for use by chown) */
-+ sl = PyLong_AsLong(number);
-+ if (PyErr_Occurred()) {
-+ PyErr_Clear();
-+ } else if (sl == -1) {
-+ Py_DECREF(number);
-+ *out_gid = (gid_t)-1;
-+ return 1;
-+ }
-+
-+ ul = PyLong_AsUnsignedLong(number);
-+ Py_DECREF(number);
-+ *out_gid = ul;
-+ /* read back the value to see if it fitted in gid_t */
-+ if (PyErr_Occurred() || *out_gid != ul) {
-+ PyErr_SetString(PyExc_OverflowError,
-+ "group id is not in range(-1, 2^32-1)");
-+ return 0;
-+ }
-+ return 1;
-+}
-+
- #ifdef __cplusplus
- };
- #endif
diff --git a/00178-dont-duplicate-flags-in-sysconfig.patch
b/00178-dont-duplicate-flags-in-sysconfig.patch
new file mode 100644
index 0000000..fc49b30
--- /dev/null
+++ b/00178-dont-duplicate-flags-in-sysconfig.patch
@@ -0,0 +1,30 @@
+diff -r 39b9b05c3085 Lib/distutils/sysconfig.py
+--- a/Lib/distutils/sysconfig.py Wed Apr 10 00:27:23 2013 +0200
++++ b/Lib/distutils/sysconfig.py Wed Apr 10 10:14:18 2013 +0200
+@@ -362,7 +362,10 @@
+ done[n] = item = ""
+ if found:
+ after = value[m.end():]
+- value = value[:m.start()] + item + after
++ value = value[:m.start()]
++ if item.strip() not in value:
++ value += item
++ value += after
+ if "$" in after:
+ notdone[name] = value
+ else:
+diff -r 39b9b05c3085 Lib/sysconfig.py
+--- a/Lib/sysconfig.py Wed Apr 10 00:27:23 2013 +0200
++++ b/Lib/sysconfig.py Wed Apr 10 10:14:18 2013 +0200
+@@ -296,7 +296,10 @@
+
+ if found:
+ after = value[m.end():]
+- value = value[:m.start()] + item + after
++ value = value[:m.start()]
++ if item.strip() not in value:
++ value += item
++ value += after
+ if "$" in after:
+ notdone[name] = value
+ else:
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
index 38df469..1a0c3c6 100644
--- a/05000-autotool-intermediates.patch
+++ b/05000-autotool-intermediates.patch
@@ -1,7 +1,7 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2013-03-25 16:11:38.140657282 -0400
-+++ ./configure 2013-03-25 16:11:46.922656680 -0400
-@@ -779,6 +779,8 @@ with_thread
+--- ./configure.autotool-intermediates 2013-04-09 14:52:49.831773426 +0200
++++ ./configure 2013-04-09 14:52:53.204765347 +0200
+@@ -802,6 +802,8 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -10,7 +10,7 @@ diff -up ./configure.autotool-intermediates ./configure
with_pymalloc
with_valgrind
with_systemtap
-@@ -1457,6 +1459,8 @@ Optional Packages:
+@@ -1479,6 +1481,8 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -19,7 +19,7 @@ diff -up ./configure.autotool-intermediates ./configure
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
--with(out)-systemtap disable/enable SystemTap support
-@@ -6471,7 +6475,7 @@ then
+@@ -6529,7 +6533,7 @@ then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports ParseTuple
__format__" >&5
$as_echo_n "checking whether gcc supports ParseTuple __format__... "
>&6; }
save_CFLAGS=$CFLAGS
@@ -28,7 +28,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-@@ -10008,6 +10012,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
+@@ -10117,6 +10121,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -80,3 +80,15 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "no" >&6; }
fi
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
+--- ./pyconfig.h.in.autotool-intermediates 2013-04-09 14:52:49.829773431 +0200
++++ ./pyconfig.h.in 2013-04-09 14:52:53.488764667 +0200
+@@ -1193,9 +1193,6 @@
+ /* Define if setpgrp() must be called as setpgrp(0, 0). */
+ #undef SETPGRP_HAVE_ARG
+
+-/* Define this to be extension of shared libraries (including the dot!). */
+-#undef SHLIB_EXT
+-
+ /* Define if i>>j for signed int i does not extend the sign bit when i < 0 */
+ #undef SIGNED_RIGHT_SHIFT_ZERO_FILLS
+
diff --git a/python3.spec b/python3.spec
index 93e7a3f..307a3d7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -125,8 +125,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.0
-Release: 10%{?dist}
+Version: %{pybasever}.1
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -222,9 +222,9 @@ Source7: pyfuntop.stp
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
-# The four TestMIMEAudio tests fail due to "audiotest.au" not being packaged.
-# It's simplest to remove them:
-Patch3: 00003-remove-mimeaudio-tests.patch
+# Some tests were removed due to audiotest.au not being packaged. This was
+# however added to the archive in 3.3.1, so we no longer delete the tests.
+# Patch3: 00003-remove-mimeaudio-tests.patch
# 00055 #
# Systemtap support: add statically-defined probe points
@@ -462,9 +462,7 @@ Patch156: 00156-gdb-autoload-safepath.patch
Patch157: 00157-uid-gid-overflows.patch
# 00158 #
-# Patch158: 00158-fix-hashlib-leak.patch
-# in python.spec
-# TODO: python3 status?
+# Upstream as of Python 3.3.1
# 00159 #
# Patch159: 00159-correct-libdb-include-path.patch
@@ -528,13 +526,13 @@ Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
# TODO: python3 status?
# 00171 #
+# python.spec had:
# Patch171: 00171-raise-correct-exception-when-dev-urandom-is-missing.patch
-# in python.spec
# TODO: python3 status?
# 00172 #
+# python.spec had:
# Patch172: 00172-use-poll-for-multiprocessing-socket-connection.patch
-# in python.spec
# TODO: python3 status?
# 00173 #
@@ -556,12 +554,8 @@ Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
Patch175: 00175-fix-configure-Wformat.patch
# 00176 #
-# Potential patch for so extensions being wrong since SOABI in upstream python3.
-#
http://bugs.python.org/issue16754
-# (rhbz#889784)
-# Does not affect python2 (python2 does not have compiled extensions with the
-# problematic information)
-Patch176: 00176-upstream-issue16754-so-extension.patch
+# Fixed upstream as of Python 3.3.1
+# Patch176: 00176-upstream-issue16754-so-extension.patch
# 00177 #
# Patch for potential unicode error when determining OS release names
@@ -570,6 +564,11 @@ Patch176: 00176-upstream-issue16754-so-extension.patch
# Does not affect python2 (python2 uses a byte string so it doesn't need to decode)
Patch177: 00177-platform-unicode.patch
+# 00178 #
+# Don't duplicate various FLAGS in sysconfig values
+#
http://bugs.python.org/issue17679
+# Does not affect python2 AFAICS (different sysconfig values initialization)
+Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# (New patches go here ^^^)
#
@@ -744,7 +743,7 @@ done
# Apply patches:
#
%patch1 -p1
-%patch3 -p1 -b .remove-mimeaudio-tests
+# 3: upstream as of Python 3.3.1
%if 0%{?with_systemtap}
%patch55 -p1 -b .systemtap
@@ -819,8 +818,9 @@ done
%patch173 -p1
#00174: TODO
%patch175 -p1
-%patch176 -p1
+# 00176: upstream as of Python 3.3.1
%patch177 -p1
+%patch178 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -868,7 +868,7 @@ for f in pyconfig.h.in configure ; do
done
# Rerun the autotools:
-PATH=~/autoconf-2.65/bin:$PATH autoreconf
+autoreconf
# Regenerate the patch:
gendiff . .autotool-intermediates > %{PATCH5000}
@@ -969,12 +969,6 @@ InstallPython() {
pushd $ConfDir
- # Workaround for
http://bugs.python.org/issue14774 : Lib/_sysconfigdata.py
- # is in the srcdir but contains per-config data.
- # Regenerate it each time:
- rm -f ../../Lib/_sysconfigdata.py
- make $topdir/Lib/_sysconfigdata.py
-
make install DESTDIR=%{buildroot} INSTALL="install -p"
popd
@@ -1256,13 +1250,6 @@ CheckPython() {
# Note that we're running the tests using the version of the code in the
# builddir, not in the buildroot.
- # Workaround for
http://bugs.python.org/issue14774, as per the install
- # stanza (albeit from a different directory):
- rm -f Lib/_sysconfigdata.py
- pushd $ConfDir
- make $topdir/Lib/_sysconfigdata.py
- popd
-
# Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
@@ -1677,6 +1664,15 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
+- Updated to Python 3.3.1.
+- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
+153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
+keeping few more downstream tests)
+- Removed patches: 3 (audiotest.au made it to upstream tarball)
+- Removed workaround for
http://bugs.python.org/issue14774, discussed in
+http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
+
* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
diff --git a/sources b/sources
index 3f2585f..b8490ab 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-2e7533b4009ac4adae62a7797a442e7a Python-3.3.0.tar.xz
+993232d9f4d9b4863cc1ec69a792e9cd Python-3.3.1.tar.xz
commit 58f477b403222ea6c13d5d7358551b606cddc0f8
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Apr 10 14:30:09 2013 +0200
Updated to Python 3.3.1.
- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
keeping few more downstream tests)
- Removed patches: 3 (audiotest.au made it to upstream tarball)
- Removed workaround for
http://bugs.python.org/issue14774, discussed in
http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 577538a..90b876b 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -653,8 +653,8 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
$(BYTESTR_DEPS)
@@ -724,6 +726,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
- $(srcdir)/Objects/typeslots.inc: $(srcdir)/Include/typeslots.h
$(srcdir)/Objects/typeslots.py
- $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
$(srcdir)/Objects/typeslots.inc
+ Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py
+ $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
Objects/typeslots.inc
+# Only needed with --with-systemtap; not a public header:
+$(srcdir)/Python/pysystemtap.h: $(srcdir)/Python/pysystemtap.d
@@ -667,8 +667,8 @@ diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap
Python-3.3.0rc2/Makefile.pre.
# Header files
@@ -1345,6 +1354,7 @@ clean: pycremoval
+ -rm -f pybuilddir.txt
-rm -f Lib/lib2to3/*Grammar*.pickle
- -rm -f $(SYSCONFIGDATA)
-rm -f Modules/_testembed Modules/_freeze_importlib
+ -rm -f $(srcdir)/Python/pysystemtap.h
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 91b24b8..bd63852 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -9,7 +9,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
- platform: $(BUILDPYTHON) $(SYSCONFIGDATA)
+ platform: $(BUILDPYTHON) pybuilddir.txt
@@ -480,18 +480,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -44,7 +44,7 @@ diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec
done
- @if test -d $(LIBRARY); then :; else \
- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-- if test "$(SO)" = .dll; then \
+- if test "$(SHLIB_SUFFIX)" = .dll; then \
- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
- else \
- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
index da83205..f22d9bd 100644
--- a/00146-hashlib-fips.patch
+++ b/00146-hashlib-fips.patch
@@ -285,7 +285,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
+} EVPCachedInfo;
-#define DEFINE_CONSTS_FOR_NEW(Name) \
-- static PyObject *CONST_ ## Name ## _name_obj; \
+- static PyObject *CONST_ ## Name ## _name_obj = NULL; \
- static EVP_MD_CTX CONST_new_ ## Name ## _ctx; \
- static EVP_MD_CTX *CONST_new_ ## Name ## _ctx_p = NULL;
+#define DEFINE_CONSTS_FOR_NEW(Name) \
@@ -444,7 +444,7 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
if (data_obj)
PyBuffer_Release(&view);
-@@ -547,55 +620,115 @@ generate_hash_name_list(void)
+@@ -547,58 +620,115 @@ generate_hash_name_list(void)
/*
@@ -550,12 +550,15 @@ diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_
" hash object; optionally initialized with a string") \
}
--/* used in the init function to setup a constructor */
+-/* used in the init function to setup a constructor: initialize OpenSSL
+- constructor constants if they haven't been initialized already. */
-#define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \
-- CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
-- if (EVP_get_digestbyname(#NAME)) { \
-- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
-- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME)); \
+- if (CONST_ ## NAME ## _name_obj == NULL) { \
+- CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
+- if (EVP_get_digestbyname(#NAME)) { \
+- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
+- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME));
\
+- } \
- } \
-} while (0);
+/*
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
index cc9ed8c..c65787f 100644
--- a/00153-fix-test_gdb-noise.patch
+++ b/00153-fix-test_gdb-noise.patch
@@ -18,10 +18,9 @@ diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59
if cmds_after_breakpoint:
commands += cmds_after_breakpoint
@@ -154,8 +163,16 @@ class DebuggerTests(unittest.TestCase):
- err = err.replace("warning: Cannot initialize thread debugging"
- " library: Debugger service failed\n",
+ 'Do you need "set solib-search-path" or '
+ '"set sysroot"?\n',
'')
--
+ err = '\n'.join([line
+ for line in err.splitlines()
+ if not line.startswith('warning: Unable to open')
@@ -29,7 +28,7 @@ diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59
+ if not line.startswith('Try: yum --disablerepo=')
+ # In case 'set print entry-values no' failed:
+ if not line.startswith('Undefined set print
command')])
-+
+
# Ensure no unexpected error messages:
+ self.maxDiff = None
self.assertEqual(err, '')
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
index ab4cb0c..0f48df5 100644
--- a/00157-uid-gid-overflows.patch
+++ b/00157-uid-gid-overflows.patch
@@ -1,32 +1,3 @@
-diff -up Python-3.3.0b1/Include/modsupport.h.uid-gid-overflows
Python-3.3.0b1/Include/modsupport.h
---- Python-3.3.0b1/Include/modsupport.h.uid-gid-overflows 2012-06-26 16:19:40.000000000
-0400
-+++ Python-3.3.0b1/Include/modsupport.h 2012-07-20 14:21:46.854688763 -0400
-@@ -8,6 +8,7 @@ extern "C" {
- /* Module support interface */
-
- #include <stdarg.h>
-+#include <sys/types.h>
-
- /* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier
- to mean Py_ssize_t */
-@@ -125,6 +126,17 @@ PyAPI_FUNC(PyObject *) PyModule_Create2(
- PyAPI_DATA(char *) _Py_PackageContext;
- #endif
-
-+/*
-+ Non-standard extension: support for dealing with uid_t and gid_t without
-+ integer overflow
-+ */
-+
-+PyAPI_FUNC(PyObject *) _PyObject_FromUid(uid_t uid);
-+PyAPI_FUNC(PyObject *) _PyObject_FromGid(gid_t gid);
-+
-+PyAPI_FUNC(int) _PyArg_ParseUid(PyObject *in_obj, uid_t *out_uid);
-+PyAPI_FUNC(int) _PyArg_ParseGid(PyObject *in_obj, gid_t *out_gid);
-+
- #ifdef __cplusplus
- }
- #endif
diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_os.py
--- Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
+++ Python-3.3.0b1/Lib/test/test_os.py 2012-07-20 14:21:46.856688739 -0400
@@ -39,7 +10,7 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
if hasattr(os, 'setgid'):
def test_setgid(self):
- if os.getuid() != 0:
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
self.assertRaises(os.error, os.setgid, 0)
+ self.assertRaises(TypeError, os.setgid, 'not an int')
self.assertRaises(OverflowError, os.setgid, 1<<32)
@@ -53,7 +24,7 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
if hasattr(os, 'setegid'):
def test_setegid(self):
- if os.getuid() != 0:
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
self.assertRaises(os.error, os.setegid, 0)
+ self.assertRaises(TypeError, os.setegid, 'not an int')
self.assertRaises(OverflowError, os.setegid, 1<<32)
@@ -69,62 +40,13 @@ diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib
@@ -1212,6 +1218,8 @@ if sys.platform != 'win32':
def test_setregid(self):
- if os.getuid() != 0:
+ if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
self.assertRaises(os.error, os.setregid, 0, 0)
+ self.assertRaises(TypeError, os.setregid, 'not an int', 0)
+ self.assertRaises(TypeError, os.setregid, 0, 'not an int')
self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
-diff -up Python-3.3.0b1/Lib/test/test_posix.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_posix.py
---- Python-3.3.0b1/Lib/test/test_posix.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
-+++ Python-3.3.0b1/Lib/test/test_posix.py 2012-07-20 14:21:46.857688726 -0400
-@@ -387,10 +387,17 @@ class PosixTester(unittest.TestCase):
- else:
- self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
-
-- def _test_all_chown_common(self, chown_func, first_param):
-+ def _test_all_chown_common(self, chown_func, stat_func, first_param):
- """Common code for chown, fchown and lchown
tests."""
- # test a successful chown call
- chown_func(first_param, os.getuid(), os.getgid())
-+ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
-+ self.assertEqual(stat_func(first_param).st_gid, os.getgid())
-+
-+ # verify that -1 works as a "do-nothing" option:
-+ chown_func(first_param, -1, -1)
-+ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
-+ self.assertEqual(stat_func(first_param).st_gid, os.getgid())
-
- if os.getuid() == 0:
- try:
-@@ -421,7 +428,7 @@ class PosixTester(unittest.TestCase):
-
- # re-create the file
- support.create_empty_file(support.TESTFN)
-- self._test_all_chown_common(posix.chown, support.TESTFN)
-+ self._test_all_chown_common(posix.chown, posix.stat, support.TESTFN)
-
- @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs
os.fchown()")
- def test_fchown(self):
-@@ -431,7 +438,7 @@ class PosixTester(unittest.TestCase):
- test_file = open(support.TESTFN, 'w')
- try:
- fd = test_file.fileno()
-- self._test_all_chown_common(posix.fchown, fd)
-+ self._test_all_chown_common(posix.fchown, posix.fstat, fd)
- finally:
- test_file.close()
-
-@@ -440,7 +447,7 @@ class PosixTester(unittest.TestCase):
- os.unlink(support.TESTFN)
- # create a symlink
- os.symlink(_DUMMY_SYMLINK, support.TESTFN)
-- self._test_all_chown_common(posix.lchown, support.TESTFN)
-+ self._test_all_chown_common(posix.lchown, posix.lstat, support.TESTFN)
-
- def test_chdir(self):
- if hasattr(posix, 'chdir'):
diff -up Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_pwd.py
--- Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
+++ Python-3.3.0b1/Lib/test/test_pwd.py 2012-07-20 14:21:46.857688726 -0400
@@ -140,557 +62,3 @@ diff -up Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.3.0b1/Li
self.assertNotIn(fakeuid, byuids)
self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
-diff -up Python-3.3.0b1/Modules/grpmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/grpmodule.c
---- Python-3.3.0b1/Modules/grpmodule.c.uid-gid-overflows 2012-06-26 16:19:54.000000000
-0400
-+++ Python-3.3.0b1/Modules/grpmodule.c 2012-07-20 14:21:46.858688713 -0400
-@@ -69,7 +69,7 @@ mkgrent(struct group *p)
- Py_INCREF(Py_None);
- }
- #endif
-- SET(setIndex++, PyLong_FromLong((long) p->gr_gid));
-+ SET(setIndex++, _PyObject_FromGid(p->gr_gid));
- SET(setIndex++, w);
- #undef SET
-
-@@ -84,18 +84,16 @@ mkgrent(struct group *p)
- static PyObject *
- grp_getgrgid(PyObject *self, PyObject *pyo_id)
- {
-- PyObject *py_int_id;
-- unsigned int gid;
-+ gid_t gid;
- struct group *p;
-
-- py_int_id = PyNumber_Long(pyo_id);
-- if (!py_int_id)
-- return NULL;
-- gid = PyLong_AS_LONG(py_int_id);
-- Py_DECREF(py_int_id);
-+ if (!_PyArg_ParseGid(pyo_id, &gid)) {
-+ return NULL;
-+ }
-
- if ((p = getgrgid(gid)) == NULL) {
-- PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);
-+ PyErr_Format(PyExc_KeyError,
-+ "getgrgid(): gid not found: %lu", (unsigned long)gid);
- return NULL;
- }
- return mkgrent(p);
-diff -up Python-3.3.0b1/Modules/posixmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/posixmodule.c
---- Python-3.3.0b1/Modules/posixmodule.c.uid-gid-overflows 2012-07-20 14:21:46.788689588
-0400
-+++ Python-3.3.0b1/Modules/posixmodule.c 2012-07-20 14:24:19.626778849 -0400
-@@ -2151,8 +2151,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
- PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
- #endif
- PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
-- PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long)st->st_uid));
-- PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long)st->st_gid));
-+ PyStructSequence_SET_ITEM(v, 4, _PyObject_FromUid(st->st_uid));
-+ PyStructSequence_SET_ITEM(v, 5, _PyObject_FromGid(st->st_gid));
- #ifdef HAVE_LARGEFILE_SUPPORT
- PyStructSequence_SET_ITEM(v, 6,
- PyLong_FromLongLong((PY_LONG_LONG)st->st_size));
-@@ -2957,7 +2957,6 @@ static PyObject *
- posix_chown(PyObject *self, PyObject *args, PyObject *kwargs)
- {
- path_t path;
-- long uid_l, gid_l;
- uid_t uid;
- gid_t gid;
- int dir_fd = DEFAULT_DIR_FD;
-@@ -2971,9 +2970,10 @@ posix_chown(PyObject *self, PyObject *ar
- #ifdef HAVE_FCHOWN
- path.allow_fd = 1;
- #endif
-- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&ll|$O&p:chown",
keywords,
-+ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O&O&O&|$O&p:chown", keywords,
- path_converter, &path,
-- &uid_l, &gid_l,
-+ _PyArg_ParseUid, &uid,
-+ _PyArg_ParseGid, &gid,
- #ifdef HAVE_FCHOWNAT
- dir_fd_converter, &dir_fd,
- #else
-@@ -3004,8 +3004,6 @@ posix_chown(PyObject *self, PyObject *ar
- #endif
-
- Py_BEGIN_ALLOW_THREADS
-- uid = (uid_t)uid_l;
-- gid = (uid_t)gid_l;
- #ifdef HAVE_FCHOWN
- if (path.fd != -1)
- result = fchown(path.fd, uid, gid);
-@@ -3049,12 +3047,15 @@ static PyObject *
- posix_fchown(PyObject *self, PyObject *args)
- {
- int fd;
-- long uid, gid;
-+ uid_t uid;
-+ gid_t gid;
- int res;
-- if (!PyArg_ParseTuple(args, "ill:fchown", &fd, &uid, &gid))
-+ if (!PyArg_ParseTuple(args, "iO&O&:chown", &fd,
-+ _PyArg_ParseUid, &uid,
-+ _PyArg_ParseGid, &gid))
- return NULL;
- Py_BEGIN_ALLOW_THREADS
-- res = fchown(fd, (uid_t) uid, (gid_t) gid);
-+ res = fchown(fd, uid, gid);
- Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error();
-@@ -3074,15 +3075,17 @@ posix_lchown(PyObject *self, PyObject *a
- {
- PyObject *opath;
- char *path;
-- long uid, gid;
-+ uid_t uid;
-+ gid_t gid;
- int res;
-- if (!PyArg_ParseTuple(args, "O&ll:lchown",
-+ if (!PyArg_ParseTuple(args, "O&O&O&:lchown",
- PyUnicode_FSConverter, &opath,
-- &uid, &gid))
-+ _PyArg_ParseUid, &uid,
-+ _PyArg_ParseGid, &gid))
- return NULL;
- path = PyBytes_AsString(opath);
- Py_BEGIN_ALLOW_THREADS
-- res = lchown(path, (uid_t) uid, (gid_t) gid);
-+ res = lchown(path, uid, gid);
- Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
-@@ -6184,7 +6187,7 @@ Return the current process's effective g
- static PyObject *
- posix_getegid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)getegid());
-+ return _PyObject_FromGid(getegid());
- }
- #endif
-
-@@ -6197,7 +6200,7 @@ Return the current process's effective u
- static PyObject *
- posix_geteuid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)geteuid());
-+ return _PyObject_FromUid(geteuid());
- }
- #endif
-
-@@ -6210,7 +6213,7 @@ Return the current process's group id.")
- static PyObject *
- posix_getgid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)getgid());
-+ return _PyObject_FromGid(getgid());
- }
- #endif
-
-@@ -6349,7 +6352,7 @@ posix_getgroups(PyObject *self, PyObject
- if (result != NULL) {
- int i;
- for (i = 0; i < n; ++i) {
-- PyObject *o = PyLong_FromLong((long)alt_grouplist[i]);
-+ PyObject *o = _PyObject_FromGid(alt_grouplist[i]);
- if (o == NULL) {
- Py_DECREF(result);
- result = NULL;
-@@ -6380,14 +6383,15 @@ posix_initgroups(PyObject *self, PyObjec
- PyObject *oname;
- char *username;
- int res;
-- long gid;
-+ gid_t gid;
-
-- if (!PyArg_ParseTuple(args, "O&l:initgroups",
-- PyUnicode_FSConverter, &oname, &gid))
-+ if (!PyArg_ParseTuple(args, "O&O&:initgroups",
-+ PyUnicode_FSConverter, &oname,
-+ _PyArg_ParseGid, &gid))
- return NULL;
- username = PyBytes_AS_STRING(oname);
-
-- res = initgroups(username, (gid_t) gid);
-+ res = initgroups(username, gid);
- Py_DECREF(oname);
- if (res == -1)
- return PyErr_SetFromErrno(PyExc_OSError);
-@@ -6562,7 +6566,7 @@ Return the current process's user id.");
- static PyObject *
- posix_getuid(PyObject *self, PyObject *noargs)
- {
-- return PyLong_FromLong((long)getuid());
-+ return _PyObject_FromUid(getuid());
- }
- #endif
-
-@@ -6702,15 +6706,9 @@ Set the current process's user id.");
- static PyObject *
- posix_setuid(PyObject *self, PyObject *args)
- {
-- long uid_arg;
- uid_t uid;
-- if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg))
-- return NULL;
-- uid = uid_arg;
-- if (uid != uid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "user id too big");
-+ if (!PyArg_ParseTuple(args, "O&:setuid", _PyArg_ParseUid, &uid))
- return NULL;
-- }
- if (setuid(uid) < 0)
- return posix_error();
- Py_INCREF(Py_None);
-@@ -6727,15 +6725,9 @@ Set the current process's effective user
- static PyObject *
- posix_seteuid (PyObject *self, PyObject *args)
- {
-- long euid_arg;
- uid_t euid;
-- if (!PyArg_ParseTuple(args, "l", &euid_arg))
-+ if (!PyArg_ParseTuple(args, "O&:seteuid", _PyArg_ParseUid,
&euid))
- return NULL;
-- euid = euid_arg;
-- if (euid != euid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "user id too big");
-- return NULL;
-- }
- if (seteuid(euid) < 0) {
- return posix_error();
- } else {
-@@ -6753,15 +6745,9 @@ Set the current process's effective grou
- static PyObject *
- posix_setegid (PyObject *self, PyObject *args)
- {
-- long egid_arg;
- gid_t egid;
-- if (!PyArg_ParseTuple(args, "l", &egid_arg))
-- return NULL;
-- egid = egid_arg;
-- if (egid != egid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "group id too big");
-+ if (!PyArg_ParseTuple(args, "O&:setegid", _PyArg_ParseGid,
&egid))
- return NULL;
-- }
- if (setegid(egid) < 0) {
- return posix_error();
- } else {
-@@ -6779,23 +6765,11 @@ Set the current process's real and effec
- static PyObject *
- posix_setreuid (PyObject *self, PyObject *args)
- {
-- long ruid_arg, euid_arg;
- uid_t ruid, euid;
-- if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
-- return NULL;
-- if (ruid_arg == -1)
-- ruid = (uid_t)-1; /* let the compiler choose how -1 fits */
-- else
-- ruid = ruid_arg; /* otherwise, assign from our long */
-- if (euid_arg == -1)
-- euid = (uid_t)-1;
-- else
-- euid = euid_arg;
-- if ((euid_arg != -1 && euid != euid_arg) ||
-- (ruid_arg != -1 && ruid != ruid_arg)) {
-- PyErr_SetString(PyExc_OverflowError, "user id too big");
-+ if (!PyArg_ParseTuple(args, "O&O&",
-+ _PyArg_ParseUid, &ruid,
-+ _PyArg_ParseUid, &euid))
- return NULL;
-- }
- if (setreuid(ruid, euid) < 0) {
- return posix_error();
- } else {
-@@ -6813,23 +6787,11 @@ Set the current process's real and effec
- static PyObject *
- posix_setregid (PyObject *self, PyObject *args)
- {
-- long rgid_arg, egid_arg;
- gid_t rgid, egid;
-- if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
-- return NULL;
-- if (rgid_arg == -1)
-- rgid = (gid_t)-1; /* let the compiler choose how -1 fits */
-- else
-- rgid = rgid_arg; /* otherwise, assign from our long */
-- if (egid_arg == -1)
-- egid = (gid_t)-1;
-- else
-- egid = egid_arg;
-- if ((egid_arg != -1 && egid != egid_arg) ||
-- (rgid_arg != -1 && rgid != rgid_arg)) {
-- PyErr_SetString(PyExc_OverflowError, "group id too big");
-+ if (!PyArg_ParseTuple(args, "O&O&",
-+ _PyArg_ParseGid, &rgid,
-+ _PyArg_ParseGid, &egid))
- return NULL;
-- }
- if (setregid(rgid, egid) < 0) {
- return posix_error();
- } else {
-@@ -6847,15 +6809,9 @@ Set the current process's group id.");
- static PyObject *
- posix_setgid(PyObject *self, PyObject *args)
- {
-- long gid_arg;
- gid_t gid;
-- if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg))
-+ if (!PyArg_ParseTuple(args, "O&:setgid", _PyArg_ParseGid, &gid))
- return NULL;
-- gid = gid_arg;
-- if (gid != gid_arg) {
-- PyErr_SetString(PyExc_OverflowError, "group id too big");
-- return NULL;
-- }
- if (setgid(gid) < 0)
- return posix_error();
- Py_INCREF(Py_None);
-@@ -6888,27 +6844,9 @@ posix_setgroups(PyObject *self, PyObject
- elem = PySequence_GetItem(groups, i);
- if (!elem)
- return NULL;
-- if (!PyLong_Check(elem)) {
-- PyErr_SetString(PyExc_TypeError,
-- "groups must be integers");
-+ if (!_PyArg_ParseGid(elem, &grouplist[i])) {
- Py_DECREF(elem);
- return NULL;
-- } else {
-- unsigned long x = PyLong_AsUnsignedLong(elem);
-- if (PyErr_Occurred()) {
-- PyErr_SetString(PyExc_TypeError,
-- "group id too big");
-- Py_DECREF(elem);
-- return NULL;
-- }
-- grouplist[i] = x;
-- /* read back the value to see if it fitted in gid_t */
-- if (grouplist[i] != x) {
-- PyErr_SetString(PyExc_TypeError,
-- "group id too big");
-- Py_DECREF(elem);
-- return NULL;
-- }
- }
- Py_DECREF(elem);
- }
-@@ -10388,9 +10326,11 @@ Set the current process's real, effectiv
- static PyObject*
- posix_setresuid (PyObject *self, PyObject *args)
- {
-- /* We assume uid_t is no larger than a long. */
-- long ruid, euid, suid;
-- if (!PyArg_ParseTuple(args, "lll", &ruid, &euid, &suid))
-+ uid_t ruid, euid, suid;
-+ if (!PyArg_ParseTuple(args, "O&O&O&",
-+ _PyArg_ParseUid, &ruid,
-+ _PyArg_ParseUid, &euid,
-+ _PyArg_ParseUid, &suid))
- return NULL;
- if (setresuid(ruid, euid, suid) < 0)
- return posix_error();
-@@ -10406,9 +10346,11 @@ Set the current process's real, effectiv
- static PyObject*
- posix_setresgid (PyObject *self, PyObject *args)
- {
-- /* We assume uid_t is no larger than a long. */
-- long rgid, egid, sgid;
-- if (!PyArg_ParseTuple(args, "lll", &rgid, &egid, &sgid))
-+ gid_t rgid, egid, sgid;
-+ if (!PyArg_ParseTuple(args, "O&O&O&",
-+ _PyArg_ParseGid, &rgid,
-+ _PyArg_ParseGid, &egid,
-+ _PyArg_ParseGid, &sgid))
- return NULL;
- if (setresgid(rgid, egid, sgid) < 0)
- return posix_error();
-@@ -10425,14 +10367,13 @@ static PyObject*
- posix_getresuid (PyObject *self, PyObject *noargs)
- {
- uid_t ruid, euid, suid;
-- long l_ruid, l_euid, l_suid;
-+ PyObject *obj_ruid, *obj_euid, *obj_suid;
- if (getresuid(&ruid, &euid, &suid) < 0)
- return posix_error();
-- /* Force the values into long's as we don't know the size of uid_t. */
-- l_ruid = ruid;
-- l_euid = euid;
-- l_suid = suid;
-- return Py_BuildValue("(lll)", l_ruid, l_euid, l_suid);
-+ obj_ruid = _PyObject_FromUid(ruid);
-+ obj_euid = _PyObject_FromUid(euid);
-+ obj_suid = _PyObject_FromUid(suid);
-+ return Py_BuildValue("(NNN)", obj_ruid, obj_euid, obj_suid);
- }
- #endif
-
-@@ -10445,14 +10386,13 @@ static PyObject*
- posix_getresgid (PyObject *self, PyObject *noargs)
- {
- uid_t rgid, egid, sgid;
-- long l_rgid, l_egid, l_sgid;
-+ PyObject *obj_rgid, *obj_egid, *obj_sgid;
- if (getresgid(&rgid, &egid, &sgid) < 0)
- return posix_error();
-- /* Force the values into long's as we don't know the size of uid_t. */
-- l_rgid = rgid;
-- l_egid = egid;
-- l_sgid = sgid;
-- return Py_BuildValue("(lll)", l_rgid, l_egid, l_sgid);
-+ obj_rgid = _PyObject_FromGid(rgid);
-+ obj_egid = _PyObject_FromGid(egid);
-+ obj_sgid = _PyObject_FromGid(sgid);
-+ return Py_BuildValue("(NNN)", obj_rgid, obj_egid, obj_sgid);
- }
- #endif
-
-diff -up Python-3.3.0b1/Modules/pwdmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/pwdmodule.c
---- Python-3.3.0b1/Modules/pwdmodule.c.uid-gid-overflows 2012-06-26 16:19:54.000000000
-0400
-+++ Python-3.3.0b1/Modules/pwdmodule.c 2012-07-20 14:21:46.861688675 -0400
-@@ -74,8 +74,8 @@ mkpwent(struct passwd *p)
- #else
- SETS(setIndex++, p->pw_passwd);
- #endif
-- SETI(setIndex++, p->pw_uid);
-- SETI(setIndex++, p->pw_gid);
-+ PyStructSequence_SET_ITEM(v, setIndex++, _PyObject_FromUid(p->pw_uid));
-+ PyStructSequence_SET_ITEM(v, setIndex++, _PyObject_FromGid(p->pw_gid));
- #ifdef __VMS
- SETS(setIndex++, "");
- #else
-@@ -104,13 +104,14 @@ See help(pwd) for more on password datab
- static PyObject *
- pwd_getpwuid(PyObject *self, PyObject *args)
- {
-- unsigned int uid;
-+ uid_t uid;
- struct passwd *p;
-- if (!PyArg_ParseTuple(args, "I:getpwuid", &uid))
-+ if (!PyArg_ParseTuple(args, "O&:getpwuid",
-+ _PyArg_ParseUid, &uid))
- return NULL;
- if ((p = getpwuid(uid)) == NULL) {
- PyErr_Format(PyExc_KeyError,
-- "getpwuid(): uid not found: %d", uid);
-+ "getpwuid(): uid not found: %lu", (unsigned long)uid);
- return NULL;
- }
- return mkpwent(p);
-diff -up Python-3.3.0b1/Python/getargs.c.uid-gid-overflows
Python-3.3.0b1/Python/getargs.c
---- Python-3.3.0b1/Python/getargs.c.uid-gid-overflows 2012-06-26 16:19:57.000000000
-0400
-+++ Python-3.3.0b1/Python/getargs.c 2012-07-20 14:21:46.861688675 -0400
-@@ -4,6 +4,7 @@
- #include "Python.h"
-
- #include <ctype.h>
-+#include <limits.h>
-
-
- #ifdef __cplusplus
-@@ -1807,6 +1808,102 @@ _PyArg_NoKeywords(const char *funcname,
- funcname);
- return 0;
- }
-+
-+PyObject *
-+_PyObject_FromUid(uid_t uid)
-+{
-+ return PyLong_FromUnsignedLong((uid_t)uid);
-+}
-+
-+PyObject *
-+_PyObject_FromGid(gid_t gid)
-+{
-+ return PyLong_FromUnsignedLong((gid_t)gid);
-+}
-+
-+int
-+_PyArg_ParseUid(PyObject *in_obj, uid_t *out_uid)
-+{
-+ PyObject *index, *number = NULL;
-+ long sl;
-+ unsigned long ul;
-+
-+ assert(out_uid);
-+
-+ index = PyNumber_Index(in_obj);
-+ if (index != NULL) {
-+ number = PyNumber_Long(index);
-+ Py_DECREF(index);
-+ }
-+ if (number == NULL) {
-+ PyErr_SetString(PyExc_TypeError, "user id must be integer");
-+ return 0;
-+ }
-+
-+ /* Special case: support -1 (e.g. for use by chown) */
-+ sl = PyLong_AsLong(number);
-+ if (PyErr_Occurred()) {
-+ PyErr_Clear();
-+ } else if (sl == -1) {
-+ Py_DECREF(number);
-+ *out_uid = (uid_t)-1;
-+ return 1;
-+ }
-+
-+ /* Otherwise, it must be >= 0 */
-+ ul = PyLong_AsUnsignedLong(number);
-+ Py_DECREF(number);
-+ *out_uid = ul;
-+ /* read back the value to see if it fitted in uid_t */
-+ if (PyErr_Occurred() || *out_uid != ul) {
-+ PyErr_SetString(PyExc_OverflowError,
-+ "user id is not in range(-1, 2^32-1)");
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+int
-+_PyArg_ParseGid(PyObject *in_obj, gid_t *out_gid)
-+{
-+ PyObject *index, *number = NULL;
-+ long sl;
-+ unsigned long ul;
-+
-+ assert(out_gid);
-+
-+ index = PyNumber_Index(in_obj);
-+ if (index != NULL) {
-+ number = PyNumber_Long(index);
-+ Py_DECREF(index);
-+ }
-+ if (number == NULL) {
-+ PyErr_SetString(PyExc_TypeError, "group id must be integer");
-+ return 0;
-+ }
-+
-+ /* Special case: support -1 (e.g. for use by chown) */
-+ sl = PyLong_AsLong(number);
-+ if (PyErr_Occurred()) {
-+ PyErr_Clear();
-+ } else if (sl == -1) {
-+ Py_DECREF(number);
-+ *out_gid = (gid_t)-1;
-+ return 1;
-+ }
-+
-+ ul = PyLong_AsUnsignedLong(number);
-+ Py_DECREF(number);
-+ *out_gid = ul;
-+ /* read back the value to see if it fitted in gid_t */
-+ if (PyErr_Occurred() || *out_gid != ul) {
-+ PyErr_SetString(PyExc_OverflowError,
-+ "group id is not in range(-1, 2^32-1)");
-+ return 0;
-+ }
-+ return 1;
-+}
-+
- #ifdef __cplusplus
- };
- #endif
diff --git a/00178-dont-duplicate-flags-in-sysconfig.patch
b/00178-dont-duplicate-flags-in-sysconfig.patch
new file mode 100644
index 0000000..fc49b30
--- /dev/null
+++ b/00178-dont-duplicate-flags-in-sysconfig.patch
@@ -0,0 +1,30 @@
+diff -r 39b9b05c3085 Lib/distutils/sysconfig.py
+--- a/Lib/distutils/sysconfig.py Wed Apr 10 00:27:23 2013 +0200
++++ b/Lib/distutils/sysconfig.py Wed Apr 10 10:14:18 2013 +0200
+@@ -362,7 +362,10 @@
+ done[n] = item = ""
+ if found:
+ after = value[m.end():]
+- value = value[:m.start()] + item + after
++ value = value[:m.start()]
++ if item.strip() not in value:
++ value += item
++ value += after
+ if "$" in after:
+ notdone[name] = value
+ else:
+diff -r 39b9b05c3085 Lib/sysconfig.py
+--- a/Lib/sysconfig.py Wed Apr 10 00:27:23 2013 +0200
++++ b/Lib/sysconfig.py Wed Apr 10 10:14:18 2013 +0200
+@@ -296,7 +296,10 @@
+
+ if found:
+ after = value[m.end():]
+- value = value[:m.start()] + item + after
++ value = value[:m.start()]
++ if item.strip() not in value:
++ value += item
++ value += after
+ if "$" in after:
+ notdone[name] = value
+ else:
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
index 38df469..1a0c3c6 100644
--- a/05000-autotool-intermediates.patch
+++ b/05000-autotool-intermediates.patch
@@ -1,7 +1,7 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2013-03-25 16:11:38.140657282 -0400
-+++ ./configure 2013-03-25 16:11:46.922656680 -0400
-@@ -779,6 +779,8 @@ with_thread
+--- ./configure.autotool-intermediates 2013-04-09 14:52:49.831773426 +0200
++++ ./configure 2013-04-09 14:52:53.204765347 +0200
+@@ -802,6 +802,8 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -10,7 +10,7 @@ diff -up ./configure.autotool-intermediates ./configure
with_pymalloc
with_valgrind
with_systemtap
-@@ -1457,6 +1459,8 @@ Optional Packages:
+@@ -1479,6 +1481,8 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -19,7 +19,7 @@ diff -up ./configure.autotool-intermediates ./configure
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
--with(out)-systemtap disable/enable SystemTap support
-@@ -6471,7 +6475,7 @@ then
+@@ -6529,7 +6533,7 @@ then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports ParseTuple
__format__" >&5
$as_echo_n "checking whether gcc supports ParseTuple __format__... "
>&6; }
save_CFLAGS=$CFLAGS
@@ -28,7 +28,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-@@ -10008,6 +10012,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
+@@ -10117,6 +10121,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -80,3 +80,15 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "no" >&6; }
fi
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
+--- ./pyconfig.h.in.autotool-intermediates 2013-04-09 14:52:49.829773431 +0200
++++ ./pyconfig.h.in 2013-04-09 14:52:53.488764667 +0200
+@@ -1193,9 +1193,6 @@
+ /* Define if setpgrp() must be called as setpgrp(0, 0). */
+ #undef SETPGRP_HAVE_ARG
+
+-/* Define this to be extension of shared libraries (including the dot!). */
+-#undef SHLIB_EXT
+-
+ /* Define if i>>j for signed int i does not extend the sign bit when i < 0 */
+ #undef SIGNED_RIGHT_SHIFT_ZERO_FILLS
+
diff --git a/python3.spec b/python3.spec
index 93e7a3f..307a3d7 100644
--- a/python3.spec
+++ b/python3.spec
@@ -125,8 +125,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.0
-Release: 10%{?dist}
+Version: %{pybasever}.1
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -222,9 +222,9 @@ Source7: pyfuntop.stp
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
-# The four TestMIMEAudio tests fail due to "audiotest.au" not being packaged.
-# It's simplest to remove them:
-Patch3: 00003-remove-mimeaudio-tests.patch
+# Some tests were removed due to audiotest.au not being packaged. This was
+# however added to the archive in 3.3.1, so we no longer delete the tests.
+# Patch3: 00003-remove-mimeaudio-tests.patch
# 00055 #
# Systemtap support: add statically-defined probe points
@@ -462,9 +462,7 @@ Patch156: 00156-gdb-autoload-safepath.patch
Patch157: 00157-uid-gid-overflows.patch
# 00158 #
-# Patch158: 00158-fix-hashlib-leak.patch
-# in python.spec
-# TODO: python3 status?
+# Upstream as of Python 3.3.1
# 00159 #
# Patch159: 00159-correct-libdb-include-path.patch
@@ -528,13 +526,13 @@ Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
# TODO: python3 status?
# 00171 #
+# python.spec had:
# Patch171: 00171-raise-correct-exception-when-dev-urandom-is-missing.patch
-# in python.spec
# TODO: python3 status?
# 00172 #
+# python.spec had:
# Patch172: 00172-use-poll-for-multiprocessing-socket-connection.patch
-# in python.spec
# TODO: python3 status?
# 00173 #
@@ -556,12 +554,8 @@ Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
Patch175: 00175-fix-configure-Wformat.patch
# 00176 #
-# Potential patch for so extensions being wrong since SOABI in upstream python3.
-#
http://bugs.python.org/issue16754
-# (rhbz#889784)
-# Does not affect python2 (python2 does not have compiled extensions with the
-# problematic information)
-Patch176: 00176-upstream-issue16754-so-extension.patch
+# Fixed upstream as of Python 3.3.1
+# Patch176: 00176-upstream-issue16754-so-extension.patch
# 00177 #
# Patch for potential unicode error when determining OS release names
@@ -570,6 +564,11 @@ Patch176: 00176-upstream-issue16754-so-extension.patch
# Does not affect python2 (python2 uses a byte string so it doesn't need to decode)
Patch177: 00177-platform-unicode.patch
+# 00178 #
+# Don't duplicate various FLAGS in sysconfig values
+#
http://bugs.python.org/issue17679
+# Does not affect python2 AFAICS (different sysconfig values initialization)
+Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
# (New patches go here ^^^)
#
@@ -744,7 +743,7 @@ done
# Apply patches:
#
%patch1 -p1
-%patch3 -p1 -b .remove-mimeaudio-tests
+# 3: upstream as of Python 3.3.1
%if 0%{?with_systemtap}
%patch55 -p1 -b .systemtap
@@ -819,8 +818,9 @@ done
%patch173 -p1
#00174: TODO
%patch175 -p1
-%patch176 -p1
+# 00176: upstream as of Python 3.3.1
%patch177 -p1
+%patch178 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -868,7 +868,7 @@ for f in pyconfig.h.in configure ; do
done
# Rerun the autotools:
-PATH=~/autoconf-2.65/bin:$PATH autoreconf
+autoreconf
# Regenerate the patch:
gendiff . .autotool-intermediates > %{PATCH5000}
@@ -969,12 +969,6 @@ InstallPython() {
pushd $ConfDir
- # Workaround for
http://bugs.python.org/issue14774 : Lib/_sysconfigdata.py
- # is in the srcdir but contains per-config data.
- # Regenerate it each time:
- rm -f ../../Lib/_sysconfigdata.py
- make $topdir/Lib/_sysconfigdata.py
-
make install DESTDIR=%{buildroot} INSTALL="install -p"
popd
@@ -1256,13 +1250,6 @@ CheckPython() {
# Note that we're running the tests using the version of the code in the
# builddir, not in the buildroot.
- # Workaround for
http://bugs.python.org/issue14774, as per the install
- # stanza (albeit from a different directory):
- rm -f Lib/_sysconfigdata.py
- pushd $ConfDir
- make $topdir/Lib/_sysconfigdata.py
- popd
-
# Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
@@ -1677,6 +1664,15 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Apr 09 2013 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.3.1-1
+- Updated to Python 3.3.1.
+- Refreshed patches: 55 (systemtap), 111 (no static lib), 146 (hashlib fips),
+153 (fix test_gdb noise), 157 (uid, gid overflow - fixed upstream, just
+keeping few more downstream tests)
+- Removed patches: 3 (audiotest.au made it to upstream tarball)
+- Removed workaround for
http://bugs.python.org/issue14774, discussed in
+http://bugs.python.org/issue15298 and fixed in revision 24d52d3060e8.
+
* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
diff --git a/sources b/sources
index 3f2585f..b8490ab 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-2e7533b4009ac4adae62a7797a442e7a Python-3.3.0.tar.xz
+993232d9f4d9b4863cc1ec69a792e9cd Python-3.3.1.tar.xz
commit b4d586e1005658bde584c457ea1c34790a298c3a
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Mar 25 16:12:35 2013 -0400
3.3.0-10: fix gcc 4.8 incompatibility (rhbz#927358)
* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
diff --git a/00175-fix-configure-Wformat.patch b/00175-fix-configure-Wformat.patch
new file mode 100644
index 0000000..9f42568
--- /dev/null
+++ b/00175-fix-configure-Wformat.patch
@@ -0,0 +1,12 @@
+diff -up Python-3.3.0/configure.ac.fix-configure-Wformat Python-3.3.0/configure.ac
+--- Python-3.3.0/configure.ac.fix-configure-Wformat 2013-03-25 16:09:09.127667472 -0400
++++ Python-3.3.0/configure.ac 2013-03-25 16:09:16.442666967 -0400
+@@ -1308,7 +1308,7 @@ if test "$GCC" = "yes"
+ then
+ AC_MSG_CHECKING(whether gcc supports ParseTuple __format__)
+ save_CFLAGS=$CFLAGS
+- CFLAGS="$CFLAGS -Werror"
++ CFLAGS="$CFLAGS -Werror -Wformat"
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[void f(char*,...)__attribute((format(PyArg_ParseTuple, 1, 2)));]],
[[]])
+ ],[
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
index bd9aeca..38df469 100644
--- a/05000-autotool-intermediates.patch
+++ b/05000-autotool-intermediates.patch
@@ -1,6 +1,6 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2012-08-07 17:21:25.249311751 -0400
-+++ ./configure 2012-08-07 17:21:35.503311049 -0400
+--- ./configure.autotool-intermediates 2013-03-25 16:11:38.140657282 -0400
++++ ./configure 2013-03-25 16:11:46.922656680 -0400
@@ -779,6 +779,8 @@ with_thread
enable_ipv6
with_doc_strings
@@ -19,10 +19,28 @@ diff -up ./configure.autotool-intermediates ./configure
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
--with(out)-systemtap disable/enable SystemTap support
-@@ -10017,6 +10021,50 @@ $as_echo "no" >&6; }
- fi
+@@ -6471,7 +6475,7 @@ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports ParseTuple
__format__" >&5
+ $as_echo_n "checking whether gcc supports ParseTuple __format__... "
>&6; }
+ save_CFLAGS=$CFLAGS
+- CFLAGS="$CFLAGS -Werror"
++ CFLAGS="$CFLAGS -Werror -Wformat"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+@@ -10008,6 +10012,50 @@ $as_echo "#define WITH_TSC 1" >>confdefs
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ $as_echo "yes" >&6; }
++else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-count-allocs"
>&5
+$as_echo_n "checking for --with-count-allocs... " >&6; }
+
@@ -58,16 +76,7 @@ diff -up ./configure.autotool-intermediates ./configure
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
-+else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+
- # Check for Python-specific malloc support
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
- $as_echo_n "checking for --with-pymalloc... " >&6; }
+ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
diff --git a/python3.spec b/python3.spec
index 83d11d9..93e7a3f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -547,8 +547,13 @@ Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
# TODO: python3 status?
# 00175 #
-# Patch175: 00175-fix-configure-Wformat.patch
-# TODO: python3 status?
+# Fix for configure.ac mistakenly detecting
+# checking whether gcc supports ParseTuple __format__... yes
+# when it doesn't, when compiling with gcc 4.8
+#
+# Sent upstream as
http://bugs.python.org/issue17547
+# (rhbz#927358)
+Patch175: 00175-fix-configure-Wformat.patch
# 00176 #
# Potential patch for so extensions being wrong since SOABI in upstream python3.
@@ -813,7 +818,7 @@ done
#00172: TODO
%patch173 -p1
#00174: TODO
-#00175: TODO
+%patch175 -p1
%patch176 -p1
%patch177 -p1
@@ -1672,6 +1677,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-10
+- fix gcc 4.8 incompatibility (rhbz#927358); regenerate autotool intermediates
+
* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
- renumber patches to keep them in sync with python.spec
commit ff7dfb66f168e51c37928ac97e6ddd2ed49f1459
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Mar 25 16:01:59 2013 -0400
3.3.0-9: renumber patches to keep them in sync with python.spec
* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
- renumber patches to keep them in sync with python.spec
Specifically, renumber:
00174 -> 00176
00175 -> 00177
diff --git a/00174-upstream-issue16754-so-extension.patch
b/00174-upstream-issue16754-so-extension.patch
deleted file mode 100644
index 4af618a..0000000
--- a/00174-upstream-issue16754-so-extension.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-3.3.0/Lib/distutils/sysconfig.py 2012-09-29 10:00:28.000000000 +0200
-+++ Python-3.3.0/Lib/distutils/sysconfig.py 2012-12-22 20:14:49.661337174 +0100
-@@ -228,7 +228,7 @@ def customize_compiler(compiler):
- linker_exe=cc,
- archiver=archiver)
-
-- compiler.shared_lib_extension = so_ext
-+ #compiler.shared_lib_extension = so_ext
-
-
- def get_config_h_filename():
diff --git a/00175-platform-unicode.patch b/00175-platform-unicode.patch
deleted file mode 100644
index 7d847e1..0000000
--- a/00175-platform-unicode.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: Python-3.3.0/Lib/platform.py
-===================================================================
---- Python-3.3.0.orig/Lib/platform.py
-+++ Python-3.3.0/Lib/platform.py
-@@ -331,7 +331,7 @@ def linux_distribution(distname='', vers
- return _dist_try_harder(distname,version,id)
-
- # Read the first line
-- with open('/etc/'+file, 'r') as f:
-+ with open('/etc/'+file, 'r', encoding='utf-8',
errors='surrogateescape') as f:
- firstline = f.readline()
- _distname, _version, _id = _parse_release_file(firstline)
-
diff --git a/00176-upstream-issue16754-so-extension.patch
b/00176-upstream-issue16754-so-extension.patch
new file mode 100644
index 0000000..4af618a
--- /dev/null
+++ b/00176-upstream-issue16754-so-extension.patch
@@ -0,0 +1,11 @@
+--- Python-3.3.0/Lib/distutils/sysconfig.py 2012-09-29 10:00:28.000000000 +0200
++++ Python-3.3.0/Lib/distutils/sysconfig.py 2012-12-22 20:14:49.661337174 +0100
+@@ -228,7 +228,7 @@ def customize_compiler(compiler):
+ linker_exe=cc,
+ archiver=archiver)
+
+- compiler.shared_lib_extension = so_ext
++ #compiler.shared_lib_extension = so_ext
+
+
+ def get_config_h_filename():
diff --git a/00177-platform-unicode.patch b/00177-platform-unicode.patch
new file mode 100644
index 0000000..7d847e1
--- /dev/null
+++ b/00177-platform-unicode.patch
@@ -0,0 +1,13 @@
+Index: Python-3.3.0/Lib/platform.py
+===================================================================
+--- Python-3.3.0.orig/Lib/platform.py
++++ Python-3.3.0/Lib/platform.py
+@@ -331,7 +331,7 @@ def linux_distribution(distname='', vers
+ return _dist_try_harder(distname,version,id)
+
+ # Read the first line
+- with open('/etc/'+file, 'r') as f:
++ with open('/etc/'+file, 'r', encoding='utf-8',
errors='surrogateescape') as f:
+ firstline = f.readline()
+ _distname, _version, _id = _parse_release_file(firstline)
+
diff --git a/python3.spec b/python3.spec
index 9f3dcaa..83d11d9 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -542,18 +542,29 @@ Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
# (rhbz#913732)
Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
+# 00174 #
+# Patch174: 00174-fix-for-usr-move.patch
+# TODO: python3 status?
+
+# 00175 #
+# Patch175: 00175-fix-configure-Wformat.patch
+# TODO: python3 status?
+
+# 00176 #
# Potential patch for so extensions being wrong since SOABI in upstream python3.
#
http://bugs.python.org/issue16754
# (rhbz#889784)
# Does not affect python2 (python2 does not have compiled extensions with the
# problematic information)
-Patch174: 00174-upstream-issue16754-so-extension.patch
+Patch176: 00176-upstream-issue16754-so-extension.patch
+# 00177 #
# Patch for potential unicode error when determining OS release names
#
http://bugs.python.org/issue17429
# (rhbz#922149)
# Does not affect python2 (python2 uses a byte string so it doesn't need to decode)
-Patch175: 00175-platform-unicode.patch
+Patch177: 00177-platform-unicode.patch
+
# (New patches go here ^^^)
#
@@ -801,8 +812,10 @@ done
#00171: TODO
#00172: TODO
%patch173 -p1
-%patch174 -p1
-%patch175 -p1
+#00174: TODO
+#00175: TODO
+%patch176 -p1
+%patch177 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1659,6 +1672,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Mar 25 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-9
+- renumber patches to keep them in sync with python.spec
+
* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
- Fix error in platform.platform() when non-ascii byte strings are decoded to
unicode (rhbz#922149)
commit 76e9a6b729746eb92dc60253c437218271fdf5a1
Author: Toshio Kuratomi <toshio(a)fedoraproject.org>
Date: Fri Mar 15 14:26:38 2013 -0700
Bump release and build
diff --git a/python3.spec b/python3.spec
index 78e558d..9f3dcaa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
commit 7c28d2c61c81676b361ec69972820588e2eeed31
Author: Toshio Kuratomi <toshio(a)fedoraproject.org>
Date: Fri Mar 15 14:25:57 2013 -0700
Fix error in platform.platform() when non-ascii byte strings are decoded to
unicode (rhbz#922149)
diff --git a/00174-upstream-issue16754-so-extension.patch
b/00174-upstream-issue16754-so-extension.patch
new file mode 100644
index 0000000..4af618a
--- /dev/null
+++ b/00174-upstream-issue16754-so-extension.patch
@@ -0,0 +1,11 @@
+--- Python-3.3.0/Lib/distutils/sysconfig.py 2012-09-29 10:00:28.000000000 +0200
++++ Python-3.3.0/Lib/distutils/sysconfig.py 2012-12-22 20:14:49.661337174 +0100
+@@ -228,7 +228,7 @@ def customize_compiler(compiler):
+ linker_exe=cc,
+ archiver=archiver)
+
+- compiler.shared_lib_extension = so_ext
++ #compiler.shared_lib_extension = so_ext
+
+
+ def get_config_h_filename():
diff --git a/00175-platform-unicode.patch b/00175-platform-unicode.patch
new file mode 100644
index 0000000..7d847e1
--- /dev/null
+++ b/00175-platform-unicode.patch
@@ -0,0 +1,13 @@
+Index: Python-3.3.0/Lib/platform.py
+===================================================================
+--- Python-3.3.0.orig/Lib/platform.py
++++ Python-3.3.0/Lib/platform.py
+@@ -331,7 +331,7 @@ def linux_distribution(distname='', vers
+ return _dist_try_harder(distname,version,id)
+
+ # Read the first line
+- with open('/etc/'+file, 'r') as f:
++ with open('/etc/'+file, 'r', encoding='utf-8',
errors='surrogateescape') as f:
+ firstline = f.readline()
+ _distname, _version, _id = _parse_release_file(firstline)
+
diff --git a/python3-upstream-issue16754-so-extension.patch
b/python3-upstream-issue16754-so-extension.patch
deleted file mode 100644
index 4af618a..0000000
--- a/python3-upstream-issue16754-so-extension.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-3.3.0/Lib/distutils/sysconfig.py 2012-09-29 10:00:28.000000000 +0200
-+++ Python-3.3.0/Lib/distutils/sysconfig.py 2012-12-22 20:14:49.661337174 +0100
-@@ -228,7 +228,7 @@ def customize_compiler(compiler):
- linker_exe=cc,
- archiver=archiver)
-
-- compiler.shared_lib_extension = so_ext
-+ #compiler.shared_lib_extension = so_ext
-
-
- def get_config_h_filename():
diff --git a/python3.spec b/python3.spec
index 4c74e0c..78e558d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -545,7 +545,15 @@ Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
# Potential patch for so extensions being wrong since SOABI in upstream python3.
#
http://bugs.python.org/issue16754
# (rhbz#889784)
-Patch174: python3-upstream-issue16754-so-extension.patch
+# Does not affect python2 (python2 does not have compiled extensions with the
+# problematic information)
+Patch174: 00174-upstream-issue16754-so-extension.patch
+
+# Patch for potential unicode error when determining OS release names
+#
http://bugs.python.org/issue17429
+# (rhbz#922149)
+# Does not affect python2 (python2 uses a byte string so it doesn't need to decode)
+Patch175: 00175-platform-unicode.patch
# (New patches go here ^^^)
#
@@ -794,6 +802,7 @@ done
#00172: TODO
%patch173 -p1
%patch174 -p1
+%patch175 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1650,7 +1659,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - .0-7
+* Fri Mar 15 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-8
+- Fix error in platform.platform() when non-ascii byte strings are decoded to
+ unicode (rhbz#922149)
+
+* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.3.0-7
- Fix up shared library extension (rhbz#889784)
* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
commit e7214707e2370f5a9083d3bfd29f2e6919682d53
Author: Toshio Kuratomi <toshio(a)fedoraproject.org>
Date: Thu Mar 14 08:18:03 2013 -0700
Fix up shared library extension (rhbz#889784)
diff --git a/python3-upstream-issue16754-so-extension.patch
b/python3-upstream-issue16754-so-extension.patch
new file mode 100644
index 0000000..4af618a
--- /dev/null
+++ b/python3-upstream-issue16754-so-extension.patch
@@ -0,0 +1,11 @@
+--- Python-3.3.0/Lib/distutils/sysconfig.py 2012-09-29 10:00:28.000000000 +0200
++++ Python-3.3.0/Lib/distutils/sysconfig.py 2012-12-22 20:14:49.661337174 +0100
+@@ -228,7 +228,7 @@ def customize_compiler(compiler):
+ linker_exe=cc,
+ archiver=archiver)
+
+- compiler.shared_lib_extension = so_ext
++ #compiler.shared_lib_extension = so_ext
+
+
+ def get_config_h_filename():
diff --git a/python3.spec b/python3.spec
index 85fbdab..4c74e0c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -542,6 +542,11 @@ Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
# (rhbz#913732)
Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
+# Potential patch for so extensions being wrong since SOABI in upstream python3.
+#
http://bugs.python.org/issue16754
+# (rhbz#889784)
+Patch174: python3-upstream-issue16754-so-extension.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -788,6 +793,7 @@ done
#00171: TODO
#00172: TODO
%patch173 -p1
+%patch174 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1644,6 +1650,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Mar 14 2013 Toshio Kuratomi <toshio(a)fedoraproject.org> - .0-7
+- Fix up shared library extension (rhbz#889784)
+
* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
- add ppc64p7 build target, optimized for Power7
commit 42e503c07a2243ef6f12ffc5102de3d39019a54c
Author: Karsten Hopp <karsten(a)redhat.com>
Date: Thu Mar 7 15:45:58 2013 +0100
add ppc64p7 build target, optimized for Power7
diff --git a/python3.spec b/python3.spec
index 2950bf2..85fbdab 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -805,6 +805,8 @@ sed --in-place \
%patch5000 -p0 -b .autotool-intermediates
%endif
+# Add target for optimized Power7 binaries:
+sed -i -e "s/ppc64-\*/ppc64-\* \| ppc64p7-\*/" config.sub
# ======================================================
# Configuring and building the code:
@@ -1642,6 +1644,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Mar 07 2013 Karsten Hopp <karsten(a)redhat.com> 3.3.0-6
+- add ppc64p7 build target, optimized for Power7
+
* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
- add workaround for ENOPROTOOPT seen running selftests in Koji
(rhbz#913732)
commit 260ceea047a1580c1fd10aa3ce84c4ab26d1d81f
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Mar 4 16:30:51 2013 -0500
3.3.0-5: add workaround for ENOPROTOOPT seen running selftests in Koji (rhbz#913732)
* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
- add workaround for ENOPROTOOPT seen running selftests in Koji
(rhbz#913732)
diff --git a/00173-workaround-ENOPROTOOPT-in-bind_port.patch
b/00173-workaround-ENOPROTOOPT-in-bind_port.patch
new file mode 100644
index 0000000..a62c3a4
--- /dev/null
+++ b/00173-workaround-ENOPROTOOPT-in-bind_port.patch
@@ -0,0 +1,14 @@
+diff -up Python-3.3.0/Lib/test/support.py.rhbz913732 Python-3.3.0/Lib/test/support.py
+--- Python-3.3.0/Lib/test/support.py.rhbz913732 2013-03-04 16:25:53.885258476 -0500
++++ Python-3.3.0/Lib/test/support.py 2013-03-04 16:25:58.499258157 -0500
+@@ -544,7 +544,8 @@ def bind_port(sock, host=HOST):
+ if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1:
+ raise TestFailed("tests should never set the SO_REUSEADDR "
\
+ "socket option on TCP/IP sockets!")
+- if hasattr(socket, 'SO_REUSEPORT'):
++ if hasattr(socket, 'SO_REUSEPORT') \
++ and 'WITHIN_PYTHON_RPM_BUILD' not in os.environ: # rhbz#913732
+ if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1:
+ raise TestFailed("tests should never set the SO_REUSEPORT "
\
+ "socket option on TCP/IP sockets!")
+diff -up Python-3.3.0/Lib/test/test_support.py.rhbz913732
Python-3.3.0/Lib/test/test_support.py
diff --git a/python3.spec b/python3.spec
index 1ce8cc5..2950bf2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -497,6 +497,51 @@ Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
# disable those tests so that rebuilds on PPC can continue
Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
+# 00165 #
+# python.spec has:
+# Patch165: 00165-crypt-module-salt-backport.patch
+# which is a backport from 3.3 and thus not relevant to "python3"
+
+# 00166 #
+# Patch166: 00166-fix-fake-repr-in-gdb-hooks.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00167 #
+# Patch167: 00167-disable-stack-navigation-tests-when-optimized-in-test_gdb.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00168 #
+# Patch168: 00168-distutils-cflags.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00169 #
+# Patch169: 00169-avoid-implicit-usage-of-md5-in-multiprocessing.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00170 #
+# Patch170: 00170-gc-assertions.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00171 #
+# Patch171: 00171-raise-correct-exception-when-dev-urandom-is-missing.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00172 #
+# Patch172: 00172-use-poll-for-multiprocessing-socket-connection.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00173 #
+# Workaround for ENOPROTOOPT seen in Koji withi test.support.bind_port()
+# (rhbz#913732)
+Patch173: 00173-workaround-ENOPROTOOPT-in-bind_port.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -734,6 +779,15 @@ done
%ifarch ppc %{power64}
%patch164 -p1
%endif
+#00165: TODO
+#00166: TODO
+#00167: TODO
+#00168: TODO
+#00169: TODO
+#00170: TODO
+#00171: TODO
+#00172: TODO
+%patch173 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1588,6 +1642,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-5
+- add workaround for ENOPROTOOPT seen running selftests in Koji
+(rhbz#913732)
+
* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
commit 19e1adc11eea263c8d8063f44e6c6ce790c345fe
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Sun Mar 3 20:05:58 2013 -0500
3.3.0-4: remove config flag from /etc/rpm/macros.{python3|pybytecompile}
https://fedorahosted.org/fpc/ticket/259
diff --git a/python3.spec b/python3.spec
index eff865f..1ce8cc5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -1427,8 +1427,8 @@ rm -fr %{buildroot}
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
-%config(noreplace) %{_sysconfdir}/rpm/macros.python3
-%config(noreplace) %{_sysconfdir}/rpm/macros.pybytecompile
+%{_sysconfdir}/rpm/macros.python3
+%{_sysconfdir}/rpm/macros.pybytecompile
%files tools
%defattr(-,root,root,755)
@@ -1588,6 +1588,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Mar 4 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-4
+- remove config flag from /etc/rpm/macros.{python3|pybytecompile}
+
* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
- add aarch64 (rhbz#909783)
commit a2f645393c076a44c71984dd20fe34ea67877b74
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Sun Feb 10 23:30:34 2013 -0500
3.3.0-3: add aarch64 (rhbz#909783)
diff --git a/python3.spec b/python3.spec
index c0e807b..eff865f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -966,7 +966,7 @@ install -d -m 0755
%{buildroot}/usr/lib/python%{pybasever}/site-packages/__pycac
%global _pyconfig32_h pyconfig-32.h
%global _pyconfig64_h pyconfig-64.h
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64
%global _pyconfig_h %{_pyconfig64_h}
%else
%global _pyconfig_h %{_pyconfig32_h}
@@ -1125,7 +1125,7 @@ ln -s \
# Install a tapset for this libpython into tapsetdir, fixing up the path to the
# library:
mkdir -p %{buildroot}%{tapsetdir}
-%ifarch %{power64} s390x x86_64 ia64 alpha sparc64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64 aarch64
%global libpython_stp_optimized libpython%{pybasever}-64.stp
%global libpython_stp_debug libpython%{pybasever}-debug-64.stp
%else
@@ -1588,6 +1588,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Feb 11 2013 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-3
+- add aarch64 (rhbz#909783)
+
* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
- add BR on bluez-libs-devel (rhbz#879720)
commit 81ac8c85fc5a41f563d2c4aba878708a9425a6be
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Dec 11 15:42:13 2012 -0500
3.3.0-2: add BR on bluez-libs-devel (rhbz#879720)
diff --git a/python3.spec b/python3.spec
index e02b762..c0e807b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -126,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -138,6 +138,7 @@ Group: Development/Languages
# (keep this list alphabetized)
BuildRequires: autoconf
+BuildRequires: bluez-libs-devel
BuildRequires: bzip2
BuildRequires: bzip2-devel
BuildRequires: db4-devel >= 4.7
@@ -1587,6 +1588,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Nov 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-2
+- add BR on bluez-libs-devel (rhbz#879720)
+
* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
- 3.3.0rc3 -> 3.3.0; drop alphatag
commit 513a269422409ff7f19e864cbd628ca2c4395d62
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Sat Sep 29 17:54:42 2012 -0400
3.3.0
3.3.0rc3 -> 3.3.0; drop alphatag
diff --git a/python3.spec b/python3.spec
index ee780be..e02b762 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,6 @@
# ======================================================
%global pybasever 3.3
-%global alphatag rc3
# pybasever without the dot:
%global pyshortver 33
@@ -127,7 +126,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.6.%{alphatag}%{?dist}
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -187,7 +186,7 @@ BuildRequires: zlib-devel
# Source code and patches
# =======================
-Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}%{alphatag}....
+Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -635,7 +634,7 @@ can load its own extensions.
# ======================================================
%prep
-%setup -q -n Python-%{version}%{alphatag}
+%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
%if 0%{?with_systemtap}
@@ -1588,6 +1587,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sat Sep 29 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-1
+- 3.3.0rc3 -> 3.3.0; drop alphatag
+
* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
- 3.3.0rc2 -> 3.3.0rc3
diff --git a/sources b/sources
index b139ef1..3f2585f 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-796124c4ab8008c21720dcecd5411a41 Python-3.3.0rc3.tar.xz
+2e7533b4009ac4adae62a7797a442e7a Python-3.3.0.tar.xz
commit 3705b6491b278b81d0363a4bcb5266f08bc9d856
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Sep 24 16:36:40 2012 -0400
3.3.0-0.6.rc3
3.3.0rc2 -> 3.3.0rc3
diff --git a/python3.spec b/python3.spec
index 14525f4..ee780be 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,7 @@
# ======================================================
%global pybasever 3.3
-%global alphatag rc2
+%global alphatag rc3
# pybasever without the dot:
%global pyshortver 33
@@ -127,7 +127,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.5.%{alphatag}%{?dist}
+Release: 0.6.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
@@ -1588,6 +1588,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Sep 24 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.6.rc3
+- 3.3.0rc2 -> 3.3.0rc3
+
* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
diff --git a/sources b/sources
index 54bc84f..b139ef1 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-968af637fe7860ec83e0df4fe5a58590 Python-3.3.0rc2.tar.xz
+796124c4ab8008c21720dcecd5411a41 Python-3.3.0rc3.tar.xz
commit 78727dec4a14119f34bd4272bab26201aac30940
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Sep 10 10:48:19 2012 -0400
3.3.0-0.5.rc2
3.3.0rc1 -> 3.3.0rc2; refresh patch 55
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 7bc55f2..577538a 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -1,6 +1,6 @@
-diff -up Python-3.3.0rc1/configure.ac.systemtap Python-3.3.0rc1/configure.ac
---- Python-3.3.0rc1/configure.ac.systemtap 2012-08-25 15:22:13.000000000 -0400
-+++ Python-3.3.0rc1/configure.ac 2012-08-27 11:00:36.593962900 -0400
+diff -up Python-3.3.0rc2/configure.ac.systemtap Python-3.3.0rc2/configure.ac
+--- Python-3.3.0rc2/configure.ac.systemtap 2012-09-09 05:11:14.000000000 -0400
++++ Python-3.3.0rc2/configure.ac 2012-09-10 09:17:21.114511781 -0400
@@ -2678,6 +2678,23 @@ if test "$with_valgrind" != no; then
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -25,9 +25,9 @@ diff -up Python-3.3.0rc1/configure.ac.systemtap
Python-3.3.0rc1/configure.ac
# -I${DLINCLDIR} is added to the compile rule for importdl.o
AC_SUBST(DLINCLDIR)
DLINCLDIR=.
-diff -up Python-3.3.0rc1/configure.systemtap Python-3.3.0rc1/configure
---- Python-3.3.0rc1/configure.systemtap 2012-08-25 15:22:13.000000000 -0400
-+++ Python-3.3.0rc1/configure 2012-08-27 11:00:36.595962898 -0400
+diff -up Python-3.3.0rc2/configure.systemtap Python-3.3.0rc2/configure
+--- Python-3.3.0rc2/configure.systemtap 2012-09-09 05:11:14.000000000 -0400
++++ Python-3.3.0rc2/configure 2012-09-10 09:17:21.116511780 -0400
@@ -618,6 +618,8 @@ TRUE
MACHDEP_OBJS
DYNLOADFILE
@@ -85,18 +85,18 @@ diff -up Python-3.3.0rc1/configure.systemtap
Python-3.3.0rc1/configure
# -I${DLINCLDIR} is added to the compile rule for importdl.o
DLINCLDIR=.
-diff -up Python-3.3.0rc1/Doc/howto/index.rst.systemtap
Python-3.3.0rc1/Doc/howto/index.rst
---- Python-3.3.0rc1/Doc/howto/index.rst.systemtap 2012-08-25 15:22:08.000000000 -0400
-+++ Python-3.3.0rc1/Doc/howto/index.rst 2012-08-27 11:00:36.596962898 -0400
+diff -up Python-3.3.0rc2/Doc/howto/index.rst.systemtap
Python-3.3.0rc2/Doc/howto/index.rst
+--- Python-3.3.0rc2/Doc/howto/index.rst.systemtap 2012-09-09 05:10:51.000000000 -0400
++++ Python-3.3.0rc2/Doc/howto/index.rst 2012-09-10 09:17:21.117511779 -0400
@@ -29,4 +29,5 @@ Currently, the HOWTOs are:
webservers.rst
argparse.rst
ipaddress.rst
+ instrumentation.rst
-diff -up Python-3.3.0rc1/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0rc1/Doc/howto/instrumentation.rst
---- Python-3.3.0rc1/Doc/howto/instrumentation.rst.systemtap 2012-08-27 11:00:36.596962898
-0400
-+++ Python-3.3.0rc1/Doc/howto/instrumentation.rst 2012-08-27 11:00:36.596962898 -0400
+diff -up Python-3.3.0rc2/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0rc2/Doc/howto/instrumentation.rst
+--- Python-3.3.0rc2/Doc/howto/instrumentation.rst.systemtap 2012-09-10 09:17:21.117511779
-0400
++++ Python-3.3.0rc2/Doc/howto/instrumentation.rst 2012-09-10 09:17:21.117511779 -0400
@@ -0,0 +1,295 @@
+.. _instrumentation:
+
@@ -393,9 +393,9 @@ diff -up Python-3.3.0rc1/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0rc1
+ delete fn_calls;
+ }
+
-diff -up Python-3.3.0rc1/Lib/test/test_systemtap.py.systemtap
Python-3.3.0rc1/Lib/test/test_systemtap.py
---- Python-3.3.0rc1/Lib/test/test_systemtap.py.systemtap 2012-08-27 11:00:36.596962898
-0400
-+++ Python-3.3.0rc1/Lib/test/test_systemtap.py 2012-08-27 11:00:36.596962898 -0400
+diff -up Python-3.3.0rc2/Lib/test/test_systemtap.py.systemtap
Python-3.3.0rc2/Lib/test/test_systemtap.py
+--- Python-3.3.0rc2/Lib/test/test_systemtap.py.systemtap 2012-09-10 09:17:21.117511779
-0400
++++ Python-3.3.0rc2/Lib/test/test_systemtap.py 2012-09-10 09:17:21.117511779 -0400
@@ -0,0 +1,234 @@
+# Verify that systemtap static probes work
+#
@@ -631,9 +631,9 @@ diff -up Python-3.3.0rc1/Lib/test/test_systemtap.py.systemtap
Python-3.3.0rc1/Li
+
+if __name__ == "__main__":
+ test_main()
-diff -up Python-3.3.0rc1/Makefile.pre.in.systemtap Python-3.3.0rc1/Makefile.pre.in
---- Python-3.3.0rc1/Makefile.pre.in.systemtap 2012-08-25 15:22:11.000000000 -0400
-+++ Python-3.3.0rc1/Makefile.pre.in 2012-08-27 11:08:51.950929030 -0400
+diff -up Python-3.3.0rc2/Makefile.pre.in.systemtap Python-3.3.0rc2/Makefile.pre.in
+--- Python-3.3.0rc2/Makefile.pre.in.systemtap 2012-09-09 05:11:05.000000000 -0400
++++ Python-3.3.0rc2/Makefile.pre.in 2012-09-10 09:19:51.195501518 -0400
@@ -363,6 +363,7 @@ PYTHON_OBJS= \
Python/formatter_unicode.o \
Python/fileutils.o \
@@ -666,18 +666,18 @@ diff -up Python-3.3.0rc1/Makefile.pre.in.systemtap
Python-3.3.0rc1/Makefile.pre.
############################################################################
# Header files
-@@ -1343,6 +1352,7 @@ clean: pycremoval
- -rm -f $(srcdir)/Lib/lib2to3/*Grammar*.pickle
+@@ -1345,6 +1354,7 @@ clean: pycremoval
+ -rm -f Lib/lib2to3/*Grammar*.pickle
-rm -f $(SYSCONFIGDATA)
-rm -f Modules/_testembed Modules/_freeze_importlib
+ -rm -f $(srcdir)/Python/pysystemtap.h
profile-removal:
find . -name '*.gc??' -exec rm -f {} ';'
-diff -up Python-3.3.0rc1/Misc/NEWS.systemtap Python-3.3.0rc1/Misc/NEWS
---- Python-3.3.0rc1/Misc/NEWS.systemtap 2012-08-25 15:22:11.000000000 -0400
-+++ Python-3.3.0rc1/Misc/NEWS 2012-08-27 11:00:36.599962901 -0400
-@@ -560,6 +560,11 @@ Core and Builtins
+diff -up Python-3.3.0rc2/Misc/NEWS.systemtap Python-3.3.0rc2/Misc/NEWS
+--- Python-3.3.0rc2/Misc/NEWS.systemtap 2012-09-09 05:11:05.000000000 -0400
++++ Python-3.3.0rc2/Misc/NEWS 2012-09-10 09:17:21.120511781 -0400
+@@ -619,6 +619,11 @@ Core and Builtins
- Issue #15038: Optimize python Locks on Windows.
@@ -689,9 +689,9 @@ diff -up Python-3.3.0rc1/Misc/NEWS.systemtap
Python-3.3.0rc1/Misc/NEWS
Library
-------
-diff -up Python-3.3.0rc1/pyconfig.h.in.systemtap Python-3.3.0rc1/pyconfig.h.in
---- Python-3.3.0rc1/pyconfig.h.in.systemtap 2012-08-25 15:22:13.000000000 -0400
-+++ Python-3.3.0rc1/pyconfig.h.in 2012-08-27 11:00:36.600962901 -0400
+diff -up Python-3.3.0rc2/pyconfig.h.in.systemtap Python-3.3.0rc2/pyconfig.h.in
+--- Python-3.3.0rc2/pyconfig.h.in.systemtap 2012-09-09 05:11:14.000000000 -0400
++++ Python-3.3.0rc2/pyconfig.h.in 2012-09-10 09:17:21.120511781 -0400
@@ -1306,6 +1306,9 @@
/* Define if you want to compile in Python-specific mallocs */
#undef WITH_PYMALLOC
@@ -702,9 +702,9 @@ diff -up Python-3.3.0rc1/pyconfig.h.in.systemtap
Python-3.3.0rc1/pyconfig.h.in
/* Define if you want to compile in rudimentary thread support */
#undef WITH_THREAD
-diff -up Python-3.3.0rc1/Python/ceval.c.systemtap Python-3.3.0rc1/Python/ceval.c
---- Python-3.3.0rc1/Python/ceval.c.systemtap 2012-08-25 15:22:12.000000000 -0400
-+++ Python-3.3.0rc1/Python/ceval.c 2012-08-27 11:00:36.600962901 -0400
+diff -up Python-3.3.0rc2/Python/ceval.c.systemtap Python-3.3.0rc2/Python/ceval.c
+--- Python-3.3.0rc2/Python/ceval.c.systemtap 2012-09-09 05:11:12.000000000 -0400
++++ Python-3.3.0rc2/Python/ceval.c 2012-09-10 09:17:21.122511781 -0400
@@ -18,6 +18,8 @@
#include <ctype.h>
@@ -737,9 +737,9 @@ diff -up Python-3.3.0rc1/Python/ceval.c.systemtap
Python-3.3.0rc1/Python/ceval.c
Py_LeaveRecursiveCall();
tstate->frame = f->f_back;
-diff -up Python-3.3.0rc1/Python/ceval_systemtap.h.systemtap
Python-3.3.0rc1/Python/ceval_systemtap.h
---- Python-3.3.0rc1/Python/ceval_systemtap.h.systemtap 2012-08-27 11:00:36.601962901
-0400
-+++ Python-3.3.0rc1/Python/ceval_systemtap.h 2012-08-27 11:00:36.601962901 -0400
+diff -up Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap
Python-3.3.0rc2/Python/ceval_systemtap.h
+--- Python-3.3.0rc2/Python/ceval_systemtap.h.systemtap 2012-09-10 09:17:21.122511781
-0400
++++ Python-3.3.0rc2/Python/ceval_systemtap.h 2012-09-10 09:17:21.122511781 -0400
@@ -0,0 +1,86 @@
+/*
+ Support for SystemTap static markers
@@ -827,9 +827,9 @@ diff -up Python-3.3.0rc1/Python/ceval_systemtap.h.systemtap
Python-3.3.0rc1/Pyth
+#define systemtap_function_return(f)
+
+#endif
-diff -up Python-3.3.0rc1/Python/pysystemtap.d.systemtap
Python-3.3.0rc1/Python/pysystemtap.d
---- Python-3.3.0rc1/Python/pysystemtap.d.systemtap 2012-08-27 11:00:36.601962901 -0400
-+++ Python-3.3.0rc1/Python/pysystemtap.d 2012-08-27 11:00:36.601962901 -0400
+diff -up Python-3.3.0rc2/Python/pysystemtap.d.systemtap
Python-3.3.0rc2/Python/pysystemtap.d
+--- Python-3.3.0rc2/Python/pysystemtap.d.systemtap 2012-09-10 09:17:21.122511781 -0400
++++ Python-3.3.0rc2/Python/pysystemtap.d 2012-09-10 09:17:21.122511781 -0400
@@ -0,0 +1,4 @@
+provider python {
+ probe function__entry(const char *, const char *, int, PyFrameObject *);
diff --git a/python3.spec b/python3.spec
index 9a4e291..14525f4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,7 @@
# ======================================================
%global pybasever 3.3
-%global alphatag rc1
+%global alphatag rc2
# pybasever without the dot:
%global pyshortver 33
@@ -127,7 +127,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.4.%{alphatag}%{?dist}
+Release: 0.5.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
@@ -1588,6 +1588,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Sep 10 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.5.rc2
+- 3.3.0rc1 -> 3.3.0rc2; refresh patch 55
+
* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
diff --git a/sources b/sources
index f7514b7..54bc84f 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-5b67eb7f471577f8429abf15a2087e7c Python-3.3.0rc1.tar.xz
+968af637fe7860ec83e0df4fe5a58590 Python-3.3.0rc2.tar.xz
commit 92d712a0d868c29205ffe9c5ed8b95c147edc5d0
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Aug 27 12:54:05 2012 -0400
3.3.0-0.4.rc1
3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
diff --git a/00003-remove-mimeaudio-tests.patch b/00003-remove-mimeaudio-tests.patch
index 3c5ed1d..8341363 100644
--- a/00003-remove-mimeaudio-tests.patch
+++ b/00003-remove-mimeaudio-tests.patch
@@ -1,8 +1,8 @@
-diff -up cpython-59223da36dec/Lib/test/test_email/test_email.py.remove-mimeaudio-tests
cpython-59223da36dec/Lib/test/test_email/test_email.py
----
cpython-59223da36dec/Lib/test/test_email/test_email.py.remove-mimeaudio-tests 2012-08-07
16:39:41.698482943 -0400
-+++ cpython-59223da36dec/Lib/test/test_email/test_email.py 2012-08-07 16:39:47.861482521
-0400
-@@ -1307,47 +1307,6 @@ Blah blah blah
- if x.startswith('>From ')]), 2)
+diff -up Python-3.3.0rc1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests
Python-3.3.0rc1/Lib/test/test_email/test_email.py
+--- Python-3.3.0rc1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests 2012-08-25
15:22:10.000000000 -0400
++++ Python-3.3.0rc1/Lib/test/test_email/test_email.py 2012-08-27 11:00:11.936964586
-0400
+@@ -1321,47 +1321,6 @@ Blah blah blah
+ self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n')
-# Test the basic MIMEAudio class
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 9375ff0..7bc55f2 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -1,6 +1,6 @@
-diff -up Python-3.3.0b2/configure.ac.systemtap Python-3.3.0b2/configure.ac
---- Python-3.3.0b2/configure.ac.systemtap 2012-08-11 02:54:25.000000000 -0400
-+++ Python-3.3.0b2/configure.ac 2012-08-13 15:24:22.968120645 -0400
+diff -up Python-3.3.0rc1/configure.ac.systemtap Python-3.3.0rc1/configure.ac
+--- Python-3.3.0rc1/configure.ac.systemtap 2012-08-25 15:22:13.000000000 -0400
++++ Python-3.3.0rc1/configure.ac 2012-08-27 11:00:36.593962900 -0400
@@ -2678,6 +2678,23 @@ if test "$with_valgrind" != no; then
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -25,9 +25,9 @@ diff -up Python-3.3.0b2/configure.ac.systemtap
Python-3.3.0b2/configure.ac
# -I${DLINCLDIR} is added to the compile rule for importdl.o
AC_SUBST(DLINCLDIR)
DLINCLDIR=.
-diff -up Python-3.3.0b2/configure.systemtap Python-3.3.0b2/configure
---- Python-3.3.0b2/configure.systemtap 2012-08-11 02:54:25.000000000 -0400
-+++ Python-3.3.0b2/configure 2012-08-13 15:24:22.973120583 -0400
+diff -up Python-3.3.0rc1/configure.systemtap Python-3.3.0rc1/configure
+--- Python-3.3.0rc1/configure.systemtap 2012-08-25 15:22:13.000000000 -0400
++++ Python-3.3.0rc1/configure 2012-08-27 11:00:36.595962898 -0400
@@ -618,6 +618,8 @@ TRUE
MACHDEP_OBJS
DYNLOADFILE
@@ -85,18 +85,18 @@ diff -up Python-3.3.0b2/configure.systemtap Python-3.3.0b2/configure
# -I${DLINCLDIR} is added to the compile rule for importdl.o
DLINCLDIR=.
-diff -up Python-3.3.0b2/Doc/howto/index.rst.systemtap Python-3.3.0b2/Doc/howto/index.rst
---- Python-3.3.0b2/Doc/howto/index.rst.systemtap 2012-08-11 02:54:06.000000000 -0400
-+++ Python-3.3.0b2/Doc/howto/index.rst 2012-08-13 15:24:22.973120584 -0400
+diff -up Python-3.3.0rc1/Doc/howto/index.rst.systemtap
Python-3.3.0rc1/Doc/howto/index.rst
+--- Python-3.3.0rc1/Doc/howto/index.rst.systemtap 2012-08-25 15:22:08.000000000 -0400
++++ Python-3.3.0rc1/Doc/howto/index.rst 2012-08-27 11:00:36.596962898 -0400
@@ -29,4 +29,5 @@ Currently, the HOWTOs are:
webservers.rst
argparse.rst
ipaddress.rst
+ instrumentation.rst
-diff -up Python-3.3.0b2/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0b2/Doc/howto/instrumentation.rst
---- Python-3.3.0b2/Doc/howto/instrumentation.rst.systemtap 2012-08-13 15:24:22.975120558
-0400
-+++ Python-3.3.0b2/Doc/howto/instrumentation.rst 2012-08-13 15:24:22.975120558 -0400
+diff -up Python-3.3.0rc1/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0rc1/Doc/howto/instrumentation.rst
+--- Python-3.3.0rc1/Doc/howto/instrumentation.rst.systemtap 2012-08-27 11:00:36.596962898
-0400
++++ Python-3.3.0rc1/Doc/howto/instrumentation.rst 2012-08-27 11:00:36.596962898 -0400
@@ -0,0 +1,295 @@
+.. _instrumentation:
+
@@ -393,9 +393,9 @@ diff -up Python-3.3.0b2/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0b2/D
+ delete fn_calls;
+ }
+
-diff -up Python-3.3.0b2/Lib/test/test_systemtap.py.systemtap
Python-3.3.0b2/Lib/test/test_systemtap.py
---- Python-3.3.0b2/Lib/test/test_systemtap.py.systemtap 2012-08-13 15:24:22.976120545
-0400
-+++ Python-3.3.0b2/Lib/test/test_systemtap.py 2012-08-13 15:42:44.278352371 -0400
+diff -up Python-3.3.0rc1/Lib/test/test_systemtap.py.systemtap
Python-3.3.0rc1/Lib/test/test_systemtap.py
+--- Python-3.3.0rc1/Lib/test/test_systemtap.py.systemtap 2012-08-27 11:00:36.596962898
-0400
++++ Python-3.3.0rc1/Lib/test/test_systemtap.py 2012-08-27 11:00:36.596962898 -0400
@@ -0,0 +1,234 @@
+# Verify that systemtap static probes work
+#
@@ -631,9 +631,9 @@ diff -up Python-3.3.0b2/Lib/test/test_systemtap.py.systemtap
Python-3.3.0b2/Lib/
+
+if __name__ == "__main__":
+ test_main()
-diff -up Python-3.3.0b2/Makefile.pre.in.systemtap Python-3.3.0b2/Makefile.pre.in
---- Python-3.3.0b2/Makefile.pre.in.systemtap 2012-08-11 02:54:18.000000000 -0400
-+++ Python-3.3.0b2/Makefile.pre.in 2012-08-13 15:24:22.977120532 -0400
+diff -up Python-3.3.0rc1/Makefile.pre.in.systemtap Python-3.3.0rc1/Makefile.pre.in
+--- Python-3.3.0rc1/Makefile.pre.in.systemtap 2012-08-25 15:22:11.000000000 -0400
++++ Python-3.3.0rc1/Makefile.pre.in 2012-08-27 11:08:51.950929030 -0400
@@ -363,6 +363,7 @@ PYTHON_OBJS= \
Python/formatter_unicode.o \
Python/fileutils.o \
@@ -667,17 +667,17 @@ diff -up Python-3.3.0b2/Makefile.pre.in.systemtap
Python-3.3.0b2/Makefile.pre.in
# Header files
@@ -1343,6 +1352,7 @@ clean: pycremoval
- -rm -f Lib/lib2to3/*Grammar*.pickle
+ -rm -f $(srcdir)/Lib/lib2to3/*Grammar*.pickle
-rm -f $(SYSCONFIGDATA)
-rm -f Modules/_testembed Modules/_freeze_importlib
+ -rm -f $(srcdir)/Python/pysystemtap.h
profile-removal:
find . -name '*.gc??' -exec rm -f {} ';'
-diff -up Python-3.3.0b2/Misc/NEWS.systemtap Python-3.3.0b2/Misc/NEWS
---- Python-3.3.0b2/Misc/NEWS.systemtap 2012-08-11 02:54:18.000000000 -0400
-+++ Python-3.3.0b2/Misc/NEWS 2012-08-13 15:24:22.980120496 -0400
-@@ -403,6 +403,11 @@ Core and Builtins
+diff -up Python-3.3.0rc1/Misc/NEWS.systemtap Python-3.3.0rc1/Misc/NEWS
+--- Python-3.3.0rc1/Misc/NEWS.systemtap 2012-08-25 15:22:11.000000000 -0400
++++ Python-3.3.0rc1/Misc/NEWS 2012-08-27 11:00:36.599962901 -0400
+@@ -560,6 +560,11 @@ Core and Builtins
- Issue #15038: Optimize python Locks on Windows.
@@ -689,9 +689,9 @@ diff -up Python-3.3.0b2/Misc/NEWS.systemtap Python-3.3.0b2/Misc/NEWS
Library
-------
-diff -up Python-3.3.0b2/pyconfig.h.in.systemtap Python-3.3.0b2/pyconfig.h.in
---- Python-3.3.0b2/pyconfig.h.in.systemtap 2012-08-11 02:54:25.000000000 -0400
-+++ Python-3.3.0b2/pyconfig.h.in 2012-08-13 15:24:22.981120483 -0400
+diff -up Python-3.3.0rc1/pyconfig.h.in.systemtap Python-3.3.0rc1/pyconfig.h.in
+--- Python-3.3.0rc1/pyconfig.h.in.systemtap 2012-08-25 15:22:13.000000000 -0400
++++ Python-3.3.0rc1/pyconfig.h.in 2012-08-27 11:00:36.600962901 -0400
@@ -1306,6 +1306,9 @@
/* Define if you want to compile in Python-specific mallocs */
#undef WITH_PYMALLOC
@@ -702,9 +702,9 @@ diff -up Python-3.3.0b2/pyconfig.h.in.systemtap
Python-3.3.0b2/pyconfig.h.in
/* Define if you want to compile in rudimentary thread support */
#undef WITH_THREAD
-diff -up Python-3.3.0b2/Python/ceval.c.systemtap Python-3.3.0b2/Python/ceval.c
---- Python-3.3.0b2/Python/ceval.c.systemtap 2012-08-11 02:54:24.000000000 -0400
-+++ Python-3.3.0b2/Python/ceval.c 2012-08-13 15:24:22.982120470 -0400
+diff -up Python-3.3.0rc1/Python/ceval.c.systemtap Python-3.3.0rc1/Python/ceval.c
+--- Python-3.3.0rc1/Python/ceval.c.systemtap 2012-08-25 15:22:12.000000000 -0400
++++ Python-3.3.0rc1/Python/ceval.c 2012-08-27 11:00:36.600962901 -0400
@@ -18,6 +18,8 @@
#include <ctype.h>
@@ -737,9 +737,9 @@ diff -up Python-3.3.0b2/Python/ceval.c.systemtap
Python-3.3.0b2/Python/ceval.c
Py_LeaveRecursiveCall();
tstate->frame = f->f_back;
-diff -up Python-3.3.0b2/Python/ceval_systemtap.h.systemtap
Python-3.3.0b2/Python/ceval_systemtap.h
---- Python-3.3.0b2/Python/ceval_systemtap.h.systemtap 2012-08-13 15:24:22.983120457
-0400
-+++ Python-3.3.0b2/Python/ceval_systemtap.h 2012-08-13 15:24:22.983120457 -0400
+diff -up Python-3.3.0rc1/Python/ceval_systemtap.h.systemtap
Python-3.3.0rc1/Python/ceval_systemtap.h
+--- Python-3.3.0rc1/Python/ceval_systemtap.h.systemtap 2012-08-27 11:00:36.601962901
-0400
++++ Python-3.3.0rc1/Python/ceval_systemtap.h 2012-08-27 11:00:36.601962901 -0400
@@ -0,0 +1,86 @@
+/*
+ Support for SystemTap static markers
@@ -827,9 +827,9 @@ diff -up Python-3.3.0b2/Python/ceval_systemtap.h.systemtap
Python-3.3.0b2/Python
+#define systemtap_function_return(f)
+
+#endif
-diff -up Python-3.3.0b2/Python/pysystemtap.d.systemtap
Python-3.3.0b2/Python/pysystemtap.d
---- Python-3.3.0b2/Python/pysystemtap.d.systemtap 2012-08-13 15:24:22.983120457 -0400
-+++ Python-3.3.0b2/Python/pysystemtap.d 2012-08-13 15:24:22.983120457 -0400
+diff -up Python-3.3.0rc1/Python/pysystemtap.d.systemtap
Python-3.3.0rc1/Python/pysystemtap.d
+--- Python-3.3.0rc1/Python/pysystemtap.d.systemtap 2012-08-27 11:00:36.601962901 -0400
++++ Python-3.3.0rc1/Python/pysystemtap.d 2012-08-27 11:00:36.601962901 -0400
@@ -0,0 +1,4 @@
+provider python {
+ probe function__entry(const char *, const char *, int, PyFrameObject *);
diff --git a/python3.spec b/python3.spec
index 8466e7f..9a4e291 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,7 @@
# ======================================================
%global pybasever 3.3
-%global alphatag b2
+%global alphatag rc1
# pybasever without the dot:
%global pyshortver 33
@@ -127,7 +127,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.3.%{alphatag}%{?dist}
+Release: 0.4.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
@@ -1588,6 +1588,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Aug 27 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.4.rc1
+- 3.3.0b2 -> 3.3.0rc1; refresh patches 3, 55
+
* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
diff --git a/sources b/sources
index 470145a..f7514b7 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-9caeb68335bb19ef36a6bc83467b0ae4 Python-3.3.0b2.tar.xz
+5b67eb7f471577f8429abf15a2087e7c Python-3.3.0rc1.tar.xz
commit 62d7207dd06806bc830fcb77d74fc758dd29f9bc
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Aug 13 21:11:12 2012 -0400
3.3.0-0.3.b2
* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
correctly when LANG=C (patch 55); importlib.test was moved to
test.test_importlib upstream
diff --git a/00003-remove-mimeaudio-tests.patch b/00003-remove-mimeaudio-tests.patch
index 08ae10a..3c5ed1d 100644
--- a/00003-remove-mimeaudio-tests.patch
+++ b/00003-remove-mimeaudio-tests.patch
@@ -1,8 +1,8 @@
-diff -up Python-3.3.0b1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests
Python-3.3.0b1/Lib/test/test_email/test_email.py
---- Python-3.3.0b1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests 2012-06-26
16:19:47.000000000 -0400
-+++ Python-3.3.0b1/Lib/test/test_email/test_email.py 2012-07-20 12:04:45.316472136 -0400
-@@ -1285,47 +1285,6 @@ Blah blah blah
-
+diff -up cpython-59223da36dec/Lib/test/test_email/test_email.py.remove-mimeaudio-tests
cpython-59223da36dec/Lib/test/test_email/test_email.py
+---
cpython-59223da36dec/Lib/test/test_email/test_email.py.remove-mimeaudio-tests 2012-08-07
16:39:41.698482943 -0400
++++ cpython-59223da36dec/Lib/test/test_email/test_email.py 2012-08-07 16:39:47.861482521
-0400
+@@ -1307,47 +1307,6 @@ Blah blah blah
+ if x.startswith('>From ')]), 2)
-# Test the basic MIMEAudio class
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index 33b82d4..9375ff0 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -1,7 +1,7 @@
-diff -up Python-3.3.0b1/configure.ac.systemtap Python-3.3.0b1/configure.ac
---- Python-3.3.0b1/configure.ac.systemtap 2012-06-26 16:19:58.000000000 -0400
-+++ Python-3.3.0b1/configure.ac 2012-07-20 13:05:39.221792032 -0400
-@@ -2616,6 +2616,23 @@ if test "$with_valgrind" != no; then
+diff -up Python-3.3.0b2/configure.ac.systemtap Python-3.3.0b2/configure.ac
+--- Python-3.3.0b2/configure.ac.systemtap 2012-08-11 02:54:25.000000000 -0400
++++ Python-3.3.0b2/configure.ac 2012-08-13 15:24:22.968120645 -0400
+@@ -2678,6 +2678,23 @@ if test "$with_valgrind" != no; then
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -25,10 +25,10 @@ diff -up Python-3.3.0b1/configure.ac.systemtap
Python-3.3.0b1/configure.ac
# -I${DLINCLDIR} is added to the compile rule for importdl.o
AC_SUBST(DLINCLDIR)
DLINCLDIR=.
-diff -up Python-3.3.0b1/configure.systemtap Python-3.3.0b1/configure
---- Python-3.3.0b1/configure.systemtap 2012-06-26 16:19:58.000000000 -0400
-+++ Python-3.3.0b1/configure 2012-07-20 13:05:39.220792044 -0400
-@@ -638,6 +638,8 @@ TRUE
+diff -up Python-3.3.0b2/configure.systemtap Python-3.3.0b2/configure
+--- Python-3.3.0b2/configure.systemtap 2012-08-11 02:54:25.000000000 -0400
++++ Python-3.3.0b2/configure 2012-08-13 15:24:22.973120583 -0400
+@@ -618,6 +618,8 @@ TRUE
MACHDEP_OBJS
DYNLOADFILE
DLINCLDIR
@@ -37,7 +37,7 @@ diff -up Python-3.3.0b1/configure.systemtap Python-3.3.0b1/configure
THREADOBJ
LDLAST
USE_THREAD_MODULE
-@@ -793,6 +795,7 @@ with_doc_strings
+@@ -779,6 +781,7 @@ with_doc_strings
with_tsc
with_pymalloc
with_valgrind
@@ -45,7 +45,7 @@ diff -up Python-3.3.0b1/configure.systemtap Python-3.3.0b1/configure
with_fpectl
with_libm
with_libc
-@@ -1468,6 +1471,7 @@ Optional Packages:
+@@ -1456,6 +1459,7 @@ Optional Packages:
--with(out)-tsc enable/disable timestamp counter profile
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
@@ -53,7 +53,7 @@ diff -up Python-3.3.0b1/configure.systemtap Python-3.3.0b1/configure
--with-fpectl enable SIGFPE catching
--with-libm=STRING math library
--with-libc=STRING C library
-@@ -9639,6 +9643,31 @@ fi
+@@ -10065,6 +10069,31 @@ fi
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -85,18 +85,18 @@ diff -up Python-3.3.0b1/configure.systemtap Python-3.3.0b1/configure
# -I${DLINCLDIR} is added to the compile rule for importdl.o
DLINCLDIR=.
-diff -up Python-3.3.0b1/Doc/howto/index.rst.systemtap Python-3.3.0b1/Doc/howto/index.rst
---- Python-3.3.0b1/Doc/howto/index.rst.systemtap 2012-06-26 16:19:37.000000000 -0400
-+++ Python-3.3.0b1/Doc/howto/index.rst 2012-07-20 13:05:39.215792107 -0400
+diff -up Python-3.3.0b2/Doc/howto/index.rst.systemtap Python-3.3.0b2/Doc/howto/index.rst
+--- Python-3.3.0b2/Doc/howto/index.rst.systemtap 2012-08-11 02:54:06.000000000 -0400
++++ Python-3.3.0b2/Doc/howto/index.rst 2012-08-13 15:24:22.973120584 -0400
@@ -29,4 +29,5 @@ Currently, the HOWTOs are:
webservers.rst
argparse.rst
ipaddress.rst
+ instrumentation.rst
-diff -up Python-3.3.0b1/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0b1/Doc/howto/instrumentation.rst
---- Python-3.3.0b1/Doc/howto/instrumentation.rst.systemtap 2012-07-20 13:05:39.215792107
-0400
-+++ Python-3.3.0b1/Doc/howto/instrumentation.rst 2012-07-20 13:05:39.215792107 -0400
+diff -up Python-3.3.0b2/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0b2/Doc/howto/instrumentation.rst
+--- Python-3.3.0b2/Doc/howto/instrumentation.rst.systemtap 2012-08-13 15:24:22.975120558
-0400
++++ Python-3.3.0b2/Doc/howto/instrumentation.rst 2012-08-13 15:24:22.975120558 -0400
@@ -0,0 +1,295 @@
+.. _instrumentation:
+
@@ -393,10 +393,10 @@ diff -up Python-3.3.0b1/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0b1/D
+ delete fn_calls;
+ }
+
-diff -up Python-3.3.0b1/Lib/test/test_systemtap.py.systemtap
Python-3.3.0b1/Lib/test/test_systemtap.py
---- Python-3.3.0b1/Lib/test/test_systemtap.py.systemtap 2012-07-20 13:05:39.215792107
-0400
-+++ Python-3.3.0b1/Lib/test/test_systemtap.py 2012-07-20 13:05:39.215792107 -0400
-@@ -0,0 +1,205 @@
+diff -up Python-3.3.0b2/Lib/test/test_systemtap.py.systemtap
Python-3.3.0b2/Lib/test/test_systemtap.py
+--- Python-3.3.0b2/Lib/test/test_systemtap.py.systemtap 2012-08-13 15:24:22.976120545
-0400
++++ Python-3.3.0b2/Lib/test/test_systemtap.py 2012-08-13 15:42:44.278352371 -0400
+@@ -0,0 +1,234 @@
+# Verify that systemtap static probes work
+#
+import subprocess
@@ -567,10 +567,10 @@ diff -up Python-3.3.0b1/Lib/test/test_systemtap.py.systemtap
Python-3.3.0b1/Lib/
+ self.assertIn(b'=> <module> in <string>:1', out,
+ msg="stdout: %s\nstderr: %s\n" % (out, err))
+
-+ def test_encoding(self):
-+ # Ensure that scripts and function names containing non-Latin 1 code
++ def test_function_encoding(self):
++ # Ensure that function names containing non-Latin 1 code
+ # points are handled:
-+ pythonfile = TESTFN + '_.py'
++ pythonfile = TESTFN
+ try:
+ unlink(pythonfile)
+ f = open(pythonfile, "wb")
@@ -597,15 +597,44 @@ diff -up Python-3.3.0b1/Lib/test/test_systemtap.py.systemtap
Python-3.3.0b1/Lib/
+ finally:
+ unlink(pythonfile)
+
++ @unittest.skipIf(sys.getfilesystemencoding() == 'ascii',
++ 'the test filename is not encodable with ASCII')
++ def test_filename_encoding(self):
++ # Ensure that scripts names containing non-Latin 1 code
++ # points are handled:
++ pythonfile = TESTFN + '_.py'
++ try:
++ unlink(pythonfile)
++ f = open(pythonfile, "wb")
++ f.write("""
++def foo():
++ '''Function with non-ASCII identifier; I believe this reads
"mojibake"'''
++ print("hello world!")
++
++foo()
++""".encode('utf-8'))
++ f.close()
++
++ out, err = invoke_python_under_systemtap(hierarchy_script,
++ pythonfile=pythonfile)
++ out_utf8 = out.decode('utf-8')
++ with ErrorDumper(out, err):
++ self.assertIn('=> <module> in %s:2' % pythonfile,
out_utf8)
++ self.assertIn(' => foo in %s:2' % pythonfile, out_utf8)
++ self.assertIn(' <= foo in %s:4' % pythonfile, out_utf8)
++ self.assertIn('<= <module> in %s:6' % pythonfile,
out_utf8)
++ finally:
++ unlink(pythonfile)
++
+def test_main():
+ run_unittest(SystemtapTests)
+
+if __name__ == "__main__":
+ test_main()
-diff -up Python-3.3.0b1/Makefile.pre.in.systemtap Python-3.3.0b1/Makefile.pre.in
---- Python-3.3.0b1/Makefile.pre.in.systemtap 2012-06-26 16:19:51.000000000 -0400
-+++ Python-3.3.0b1/Makefile.pre.in 2012-07-20 13:05:39.216792095 -0400
-@@ -358,6 +358,7 @@ PYTHON_OBJS= \
+diff -up Python-3.3.0b2/Makefile.pre.in.systemtap Python-3.3.0b2/Makefile.pre.in
+--- Python-3.3.0b2/Makefile.pre.in.systemtap 2012-08-11 02:54:18.000000000 -0400
++++ Python-3.3.0b2/Makefile.pre.in 2012-08-13 15:24:22.977120532 -0400
+@@ -363,6 +363,7 @@ PYTHON_OBJS= \
Python/formatter_unicode.o \
Python/fileutils.o \
Python/$(DYNLOADFILE) \
@@ -613,7 +642,7 @@ diff -up Python-3.3.0b1/Makefile.pre.in.systemtap
Python-3.3.0b1/Makefile.pre.in
$(LIBOBJS) \
$(MACHDEP_OBJS) \
$(THREADOBJ)
-@@ -708,7 +709,8 @@ Objects/setobject.o: $(srcdir)/Objects/s
+@@ -713,7 +714,8 @@ Objects/setobject.o: $(srcdir)/Objects/s
$(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
$(OPCODETARGETGEN) $(OPCODETARGETS_H)
@@ -623,7 +652,7 @@ diff -up Python-3.3.0b1/Makefile.pre.in.systemtap
Python-3.3.0b1/Makefile.pre.in
Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
$(BYTESTR_DEPS)
-@@ -719,6 +721,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
+@@ -724,6 +726,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
$(srcdir)/Objects/typeslots.inc: $(srcdir)/Include/typeslots.h
$(srcdir)/Objects/typeslots.py
$(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
$(srcdir)/Objects/typeslots.inc
@@ -637,7 +666,7 @@ diff -up Python-3.3.0b1/Makefile.pre.in.systemtap
Python-3.3.0b1/Makefile.pre.in
############################################################################
# Header files
-@@ -1335,6 +1344,7 @@ clean: pycremoval
+@@ -1343,6 +1352,7 @@ clean: pycremoval
-rm -f Lib/lib2to3/*Grammar*.pickle
-rm -f $(SYSCONFIGDATA)
-rm -f Modules/_testembed Modules/_freeze_importlib
@@ -645,10 +674,10 @@ diff -up Python-3.3.0b1/Makefile.pre.in.systemtap
Python-3.3.0b1/Makefile.pre.in
profile-removal:
find . -name '*.gc??' -exec rm -f {} ';'
-diff -up Python-3.3.0b1/Misc/NEWS.systemtap Python-3.3.0b1/Misc/NEWS
---- Python-3.3.0b1/Misc/NEWS.systemtap 2012-06-26 16:19:51.000000000 -0400
-+++ Python-3.3.0b1/Misc/NEWS 2012-07-20 13:05:39.217792083 -0400
-@@ -55,6 +55,11 @@ Core and Builtins
+diff -up Python-3.3.0b2/Misc/NEWS.systemtap Python-3.3.0b2/Misc/NEWS
+--- Python-3.3.0b2/Misc/NEWS.systemtap 2012-08-11 02:54:18.000000000 -0400
++++ Python-3.3.0b2/Misc/NEWS 2012-08-13 15:24:22.980120496 -0400
+@@ -403,6 +403,11 @@ Core and Builtins
- Issue #15038: Optimize python Locks on Windows.
@@ -660,9 +689,9 @@ diff -up Python-3.3.0b1/Misc/NEWS.systemtap Python-3.3.0b1/Misc/NEWS
Library
-------
-diff -up Python-3.3.0b1/pyconfig.h.in.systemtap Python-3.3.0b1/pyconfig.h.in
---- Python-3.3.0b1/pyconfig.h.in.systemtap 2012-06-26 16:19:58.000000000 -0400
-+++ Python-3.3.0b1/pyconfig.h.in 2012-07-20 13:05:39.222792020 -0400
+diff -up Python-3.3.0b2/pyconfig.h.in.systemtap Python-3.3.0b2/pyconfig.h.in
+--- Python-3.3.0b2/pyconfig.h.in.systemtap 2012-08-11 02:54:25.000000000 -0400
++++ Python-3.3.0b2/pyconfig.h.in 2012-08-13 15:24:22.981120483 -0400
@@ -1306,6 +1306,9 @@
/* Define if you want to compile in Python-specific mallocs */
#undef WITH_PYMALLOC
@@ -673,9 +702,9 @@ diff -up Python-3.3.0b1/pyconfig.h.in.systemtap
Python-3.3.0b1/pyconfig.h.in
/* Define if you want to compile in rudimentary thread support */
#undef WITH_THREAD
-diff -up Python-3.3.0b1/Python/ceval.c.systemtap Python-3.3.0b1/Python/ceval.c
---- Python-3.3.0b1/Python/ceval.c.systemtap 2012-06-26 16:19:56.000000000 -0400
-+++ Python-3.3.0b1/Python/ceval.c 2012-07-20 13:05:39.218792070 -0400
+diff -up Python-3.3.0b2/Python/ceval.c.systemtap Python-3.3.0b2/Python/ceval.c
+--- Python-3.3.0b2/Python/ceval.c.systemtap 2012-08-11 02:54:24.000000000 -0400
++++ Python-3.3.0b2/Python/ceval.c 2012-08-13 15:24:22.982120470 -0400
@@ -18,6 +18,8 @@
#include <ctype.h>
@@ -708,9 +737,9 @@ diff -up Python-3.3.0b1/Python/ceval.c.systemtap
Python-3.3.0b1/Python/ceval.c
Py_LeaveRecursiveCall();
tstate->frame = f->f_back;
-diff -up Python-3.3.0b1/Python/ceval_systemtap.h.systemtap
Python-3.3.0b1/Python/ceval_systemtap.h
---- Python-3.3.0b1/Python/ceval_systemtap.h.systemtap 2012-07-20 13:05:39.218792070
-0400
-+++ Python-3.3.0b1/Python/ceval_systemtap.h 2012-07-20 13:05:39.218792070 -0400
+diff -up Python-3.3.0b2/Python/ceval_systemtap.h.systemtap
Python-3.3.0b2/Python/ceval_systemtap.h
+--- Python-3.3.0b2/Python/ceval_systemtap.h.systemtap 2012-08-13 15:24:22.983120457
-0400
++++ Python-3.3.0b2/Python/ceval_systemtap.h 2012-08-13 15:24:22.983120457 -0400
@@ -0,0 +1,86 @@
+/*
+ Support for SystemTap static markers
@@ -798,9 +827,9 @@ diff -up Python-3.3.0b1/Python/ceval_systemtap.h.systemtap
Python-3.3.0b1/Python
+#define systemtap_function_return(f)
+
+#endif
-diff -up Python-3.3.0b1/Python/pysystemtap.d.systemtap
Python-3.3.0b1/Python/pysystemtap.d
---- Python-3.3.0b1/Python/pysystemtap.d.systemtap 2012-07-20 13:05:39.218792070 -0400
-+++ Python-3.3.0b1/Python/pysystemtap.d 2012-07-20 13:05:39.218792070 -0400
+diff -up Python-3.3.0b2/Python/pysystemtap.d.systemtap
Python-3.3.0b2/Python/pysystemtap.d
+--- Python-3.3.0b2/Python/pysystemtap.d.systemtap 2012-08-13 15:24:22.983120457 -0400
++++ Python-3.3.0b2/Python/pysystemtap.d 2012-08-13 15:24:22.983120457 -0400
@@ -0,0 +1,4 @@
+provider python {
+ probe function__entry(const char *, const char *, int, PyFrameObject *);
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 8ba0fd7..91b24b8 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,7 +1,7 @@
-diff -up Python-3.3.0b1/Makefile.pre.in.no-static-lib Python-3.3.0b1/Makefile.pre.in
---- Python-3.3.0b1/Makefile.pre.in.no-static-lib 2012-07-20 13:20:34.056605058 -0400
-+++ Python-3.3.0b1/Makefile.pre.in 2012-07-20 13:21:41.540761389 -0400
-@@ -458,7 +458,7 @@ coverage:
+diff -up cpython-59223da36dec/Makefile.pre.in.no-static-lib
cpython-59223da36dec/Makefile.pre.in
+--- cpython-59223da36dec/Makefile.pre.in.no-static-lib 2012-08-07 16:43:43.296466422
-0400
++++ cpython-59223da36dec/Makefile.pre.in 2012-08-07 16:44:13.299464371 -0400
+@@ -464,7 +464,7 @@ coverage:
# Build the interpreter
@@ -10,9 +10,9 @@ diff -up Python-3.3.0b1/Makefile.pre.in.no-static-lib
Python-3.3.0b1/Makefile.pr
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
platform: $(BUILDPYTHON) $(SYSCONFIGDATA)
-@@ -475,18 +475,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
- esac
+@@ -480,18 +480,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
+ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
+ $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
-# Build static library
-# avoid long command lines, same as LIBRARY_OBJS
@@ -29,7 +29,7 @@ diff -up Python-3.3.0b1/Makefile.pre.in.no-static-lib
Python-3.3.0b1/Makefile.pr
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -576,7 +564,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
+@@ -581,7 +569,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
echo "-----------------------------------------------"; \
fi
@@ -38,7 +38,7 @@ diff -up Python-3.3.0b1/Makefile.pre.in.no-static-lib
Python-3.3.0b1/Makefile.pr
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1150,18 +1138,6 @@ libainstall: all python-config
+@@ -1155,18 +1143,6 @@ libainstall: all python-config
else true; \
fi; \
done
diff --git a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
index 379385f..087705c 100644
--- a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+++ b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
@@ -1,21 +1,21 @@
-diff -up Python-3.3.0b1/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys
Python-3.3.0b1/Lib/test/test_sys.py
---- Python-3.3.0b1/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys 2012-07-23
11:18:52.524602807 -0400
-+++ Python-3.3.0b1/Lib/test/test_sys.py 2012-07-23 11:25:54.641325620 -0400
-@@ -863,12 +863,17 @@ class SizeofTest(unittest.TestCase):
+diff -up Python-3.3.0b2/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys
Python-3.3.0b2/Lib/test/test_sys.py
+--- Python-3.3.0b2/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys 2012-08-11
02:54:16.000000000 -0400
++++ Python-3.3.0b2/Lib/test/test_sys.py 2012-08-13 14:50:15.253720597 -0400
+@@ -835,12 +835,17 @@ class SizeofTest(unittest.TestCase):
# type
# static type: PyTypeObject
- s = size(vh + 'P2P15Pl4PP9PP11PI')
+ s = vsize('P2n15Pl4Pn9Pn11PI')
+ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
+ if hasattr(sys, 'getcounts'):
-+ s += size('3P2P')
++ s += struct.calcsize('3P2P')
check(int, s)
# (PyTypeObject + PyNumberMethods + PyMappingMethods +
# PySequenceMethods + PyBufferProcs + 4P)
- s = size(vh + 'P2P15Pl4PP9PP11PI') + size('34P 3P 10P 2P 4P')
+ s = vsize('P2n15Pl4Pn9Pn11PI') + struct.calcsize('34P 3P 10P 2P
4P')
# Separate block for PyDictKeysObject with 4 entries
- s += size("PPPP") + 4*size("PPP")
+ s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P")
+ if hasattr(sys, 'getcounts'):
-+ s += size('3P2P')
++ s += struct.calcsize('3P2P')
# class
class newstyleclass(object): pass
check(newstyleclass, s)
diff --git a/00152-fix-test-gdb-regex.patch b/00152-fix-test-gdb-regex.patch
deleted file mode 100644
index 4e31c2e..0000000
--- a/00152-fix-test-gdb-regex.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Lib/test/test_gdb.py.old 2012-04-11 19:35:13.512681203 -0400
-+++ Lib/test/test_gdb.py 2012-04-11 19:39:52.567192540 -0400
-@@ -159,7 +159,7 @@ class DebuggerTests(unittest.TestCase):
- # gdb can insert additional '\n' and space characters in various places
- # in its output, depending on the width of the terminal it's connected
- # to (using its "wrap_here" function)
-- m =
re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+Python/bltinmodule.c.*',
-+ m =
re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*',
- gdb_output, re.DOTALL)
- if not m:
- self.fail('Unexpected gdb output: %r\n%s' % (gdb_output,
gdb_output))
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
index bc5ee63..cc9ed8c 100644
--- a/00153-fix-test_gdb-noise.patch
+++ b/00153-fix-test_gdb-noise.patch
@@ -1,6 +1,7 @@
---- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
-+++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
-@@ -96,6 +96,15 @@ class DebuggerTests(unittest.TestCase):
+diff -up cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise
cpython-59223da36dec/Lib/test/test_gdb.py
+--- cpython-59223da36dec/Lib/test/test_gdb.py.fix-test_gdb-noise 2012-08-07
06:10:57.000000000 -0400
++++ cpython-59223da36dec/Lib/test/test_gdb.py 2012-08-07 17:13:46.592343113 -0400
+@@ -115,6 +115,15 @@ class DebuggerTests(unittest.TestCase):
# Generate a list of commands in gdb's language:
commands = ['set breakpoint pending yes',
'break %s' % breakpoint,
@@ -16,10 +17,11 @@
'run']
if cmds_after_breakpoint:
commands += cmds_after_breakpoint
-@@ -135,8 +144,16 @@ class DebuggerTests(unittest.TestCase):
+@@ -154,8 +163,16 @@ class DebuggerTests(unittest.TestCase):
err = err.replace("warning: Cannot initialize thread debugging"
" library: Debugger service failed\n",
'')
+-
+ err = '\n'.join([line
+ for line in err.splitlines()
+ if not line.startswith('warning: Unable to open')
@@ -27,9 +29,9 @@
+ if not line.startswith('Try: yum --disablerepo=')
+ # In case 'set print entry-values no' failed:
+ if not line.startswith('Undefined set print
command')])
-
++
# Ensure no unexpected error messages:
+ self.maxDiff = None
self.assertEqual(err, '')
-
return out
+
diff --git a/00160-disable-test_fs_holes-in-rpm-build.patch
b/00160-disable-test_fs_holes-in-rpm-build.patch
index c0b0777..9fa91d5 100644
--- a/00160-disable-test_fs_holes-in-rpm-build.patch
+++ b/00160-disable-test_fs_holes-in-rpm-build.patch
@@ -1,11 +1,11 @@
-diff -up Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch
Python-3.3.0b1/Lib/test/test_posix.py
----
Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch 2012-07-23
13:53:11.636847977 -0400
-+++ Python-3.3.0b1/Lib/test/test_posix.py 2012-07-23 13:54:02.810208218 -0400
-@@ -1022,6 +1022,7 @@ class PosixTester(unittest.TestCase):
+diff -up cpython-59223da36dec/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build
cpython-59223da36dec/Lib/test/test_posix.py
+---
cpython-59223da36dec/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build 2012-08-07
17:15:59.000000000 -0400
++++ cpython-59223da36dec/Lib/test/test_posix.py 2012-08-07 17:16:53.528330330 -0400
+@@ -973,6 +973,7 @@ class PosixTester(unittest.TestCase):
posix.RTLD_GLOBAL
posix.RTLD_LOCAL
+ @unittest._skipInRpmBuild('running kernel may not match kernel in chroot')
@unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
"test needs an OS that reports file holes")
- @unittest.skipIf(sys.platform in ('freebsd7', 'freebsd8',
'freebsd9'),
+ def test_fs_holes(self):
diff --git a/00161-fix-test_tools-directory.patch b/00161-fix-test_tools-directory.patch
deleted file mode 100644
index 8811fb3..0000000
--- a/00161-fix-test_tools-directory.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory
Python-3.3.0b1/Lib/test/test_tools.py
---- Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory 2012-07-23
15:08:19.271494787 -0400
-+++ Python-3.3.0b1/Lib/test/test_tools.py 2012-07-23 15:08:32.183333368 -0400
-@@ -19,7 +19,7 @@ if not sysconfig.is_python_build():
- # and run the tests in that case too?
- raise unittest.SkipTest('test irrelevant for an installed Python')
-
--srcdir = sysconfig.get_config_var('projectbase')
-+srcdir = sysconfig.get_config_var('srcdir')
- basepath = os.path.join(os.getcwd(), srcdir, 'Tools')
- scriptsdir = os.path.join(basepath, 'scripts')
-
diff --git a/00162-distutils-sysconfig-fix-CC-options.patch
b/00162-distutils-sysconfig-fix-CC-options.patch
deleted file mode 100644
index ac8d3f2..0000000
--- a/00162-distutils-sysconfig-fix-CC-options.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff -up Python-3.3.0b1/Lib/distutils/sysconfig.py.fix-CC-options.patch
Python-3.3.0b1/Lib/distutils/sysconfig.py
---- Python-3.3.0b1/Lib/distutils/sysconfig.py.fix-CC-options.patch 2012-07-24
11:57:43.804353959 -0400
-+++ Python-3.3.0b1/Lib/distutils/sysconfig.py 2012-07-24 11:59:38.341354843 -0400
-@@ -580,7 +580,9 @@ def get_config_vars(*args):
- # skip checks if the compiler was overriden with a CC env variable
- if 'CC' not in os.environ:
- cc = oldcc = _config_vars['CC']
-- if not find_executable(cc):
-+ # CC might contain additional arguments e.g. "gcc -pthread",
so
-+ # look for the first word:
-+ if not find_executable(cc.split()[0]):
- # Compiler is not found on the shell search PATH.
- # Now search for clang, first on PATH (if the Command LIne
- # Tools have been installed in / or if the user has provided
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
index 6cddbf7..bd9aeca 100644
--- a/05000-autotool-intermediates.patch
+++ b/05000-autotool-intermediates.patch
@@ -1,184 +1,7 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2012-07-20 14:09:54.811590526 -0400
-+++ ./configure 2012-07-20 14:10:00.525519093 -0400
-@@ -1,11 +1,13 @@
- #! /bin/sh
- # Guess values for system-dependent variables and create Makefiles.
--# Generated by GNU Autoconf 2.69 for python 3.3.
-+# Generated by GNU Autoconf 2.68 for python 3.3.
- #
- # Report bugs to <
http://bugs.python.org/>.
- #
- #
--# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
-+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-+# Foundation, Inc.
- #
- #
- # This configure script is free software; the Free Software Foundation
-@@ -134,31 +136,6 @@ export LANGUAGE
- # CDPATH.
- (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
--# Use a proper internal environment variable to ensure we don't fall
-- # into an infinite loop, continuously re-executing ourselves.
-- if test x"${_as_can_reexec}" != xno && test
"x$CONFIG_SHELL" != x; then
-- _as_can_reexec=no; export _as_can_reexec;
-- # We cannot yet assume a decent shell, so we have to provide a
--# neutralization value for shells without unset; and this also
--# works around shells that cannot unset nonexistent variables.
--# Preserve -v and -x to the replacement shell.
--BASH_ENV=/dev/null
--ENV=/dev/null
--(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
--case $- in # ((((
-- *v*x* | *x*v* ) as_opts=-vx ;;
-- *v* ) as_opts=-v ;;
-- *x* ) as_opts=-x ;;
-- * ) as_opts= ;;
--esac
--exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
--# Admittedly, this is quite paranoid, since all the known shells bail
--# out after a failed `exec'.
--$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
--as_fn_exit 255
-- fi
-- # We don't want this to propagate to other subprocesses.
-- { _as_can_reexec=; unset _as_can_reexec;}
- if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" &&
(emulate sh) >/dev/null 2>&1; then :
- emulate sh
-@@ -192,8 +169,7 @@ if ( set x; as_fn_ret_success y && test
- else
- exitcode=1; echo positional parameters were not saved.
- fi
--test x\$exitcode = x0 || exit 1
--test -x / || exit 1"
-+test x\$exitcode = x0 || exit 1"
- as_suggested="
as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested"
as_lineno_1a=\$LINENO
- as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested"
as_lineno_2a=\$LINENO
- eval 'test \"x\$as_lineno_1'\$as_run'\" !=
\"x\$as_lineno_2'\$as_run'\" &&
-@@ -238,25 +214,21 @@ IFS=$as_save_IFS
-
-
- if test "x$CONFIG_SHELL" != x; then :
-- export CONFIG_SHELL
-- # We cannot yet assume a decent shell, so we have to provide a
--# neutralization value for shells without unset; and this also
--# works around shells that cannot unset nonexistent variables.
--# Preserve -v and -x to the replacement shell.
--BASH_ENV=/dev/null
--ENV=/dev/null
--(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
--case $- in # ((((
-- *v*x* | *x*v* ) as_opts=-vx ;;
-- *v* ) as_opts=-v ;;
-- *x* ) as_opts=-x ;;
-- * ) as_opts= ;;
--esac
--exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
--# Admittedly, this is quite paranoid, since all the known shells bail
--# out after a failed `exec'.
--$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
--exit 255
-+ # We cannot yet assume a decent shell, so we have to provide a
-+ # neutralization value for shells without unset; and this also
-+ # works around shells that cannot unset nonexistent variables.
-+ # Preserve -v and -x to the replacement shell.
-+ BASH_ENV=/dev/null
-+ ENV=/dev/null
-+ (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-+ export CONFIG_SHELL
-+ case $- in # ((((
-+ *v*x* | *x*v* ) as_opts=-vx ;;
-+ *v* ) as_opts=-v ;;
-+ *x* ) as_opts=-x ;;
-+ * ) as_opts= ;;
-+ esac
-+ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
- fi
-
- if test x$as_have_required = xno; then :
-@@ -359,14 +331,6 @@ $as_echo X"$as_dir" |
-
-
- } # as_fn_mkdir_p
--
--# as_fn_executable_p FILE
--# -----------------------
--# Test if FILE is an executable regular file.
--as_fn_executable_p ()
--{
-- test -f "$1" && test -x "$1"
--} # as_fn_executable_p
- # as_fn_append VAR VALUE
- # ----------------------
- # Append the text in VALUE to the end of the definition contained in VAR. Take
-@@ -488,10 +452,6 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
- chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX
shell" >&2; as_fn_exit 1; }
-
-- # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
-- # already done that, so ensure we don't try to do so again and fall
-- # in an infinite loop. This has already happened in practice.
-- _as_can_reexec=no; export _as_can_reexec
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensitive to this).
-@@ -526,16 +486,16 @@ if (echo >conf$$.file) 2>/dev/null; then
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-- # In both cases, we have to default to `cp -pR'.
-+ # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-- as_ln_s='cp -pR'
-+ as_ln_s='cp -p'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
-- as_ln_s='cp -pR'
-+ as_ln_s='cp -p'
- fi
- else
-- as_ln_s='cp -pR'
-+ as_ln_s='cp -p'
- fi
- rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
- rmdir conf$$.dir 2>/dev/null
-@@ -547,8 +507,28 @@ else
- as_mkdir_p=false
- fi
-
--as_test_x='test -x'
--as_executable_p=as_fn_executable_p
-+if test -x / >/dev/null 2>&1; then
-+ as_test_x='test -x'
-+else
-+ if ls -dL / >/dev/null 2>&1; then
-+ as_ls_L_option=L
-+ else
-+ as_ls_L_option=
-+ fi
-+ as_test_x='
-+ eval sh -c '\''
-+ if test -d "$1"; then
-+ test -d "$1/.";
-+ else
-+ case $1 in #(
-+ -*)set "./$1";;
-+ esac;
-+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-+ ???[sx]*):;;*)false;;esac;fi
-+ '\'' sh
-+ '
-+fi
-+as_executable_p=$as_test_x
-
- # Sed expression to map a string onto a valid CPP name.
- as_tr_cpp="eval sed
'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-@@ -793,6 +773,8 @@ with_thread
+--- ./configure.autotool-intermediates 2012-08-07 17:21:25.249311751 -0400
++++ ./configure 2012-08-07 17:21:35.503311049 -0400
+@@ -779,6 +779,8 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -187,16 +10,7 @@ diff -up ./configure.autotool-intermediates ./configure
with_pymalloc
with_valgrind
with_systemtap
-@@ -1266,6 +1248,8 @@ target=$target_alias
- if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
-+ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use
--host.
-+ If a cross compiler is detected then cross compile mode will be used"
>&2
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-@@ -1469,6 +1453,8 @@ Optional Packages:
+@@ -1457,6 +1459,8 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -205,327 +19,7 @@ diff -up ./configure.autotool-intermediates ./configure
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
--with(out)-systemtap disable/enable SystemTap support
-@@ -1556,9 +1542,9 @@ test -n "$ac_init_help" && exit $ac_stat
- if $ac_init_version; then
- cat <<\_ACEOF
- python configure 3.3
--generated by GNU Autoconf 2.69
-+generated by GNU Autoconf 2.68
-
--Copyright (C) 2012 Free Software Foundation, Inc.
-+Copyright (C) 2010 Free Software Foundation, Inc.
- This configure script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it.
- _ACEOF
-@@ -1634,7 +1620,7 @@ $as_echo "$ac_try_echo"; } >&5
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
-- test -x conftest$ac_exeext
-+ $as_test_x conftest$ac_exeext
- }; then :
- ac_retval=0
- else
-@@ -1932,8 +1918,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2
- 1) == 3)];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -1987,8 +1972,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) <<
N) - 1) * 2 + 1))];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -2004,8 +1988,7 @@ main ()
- {
- static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) -
1) * 2 + 1)
- < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -2055,8 +2038,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !(($2) >= 0)];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -2072,8 +2054,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !(($2) <= $ac_mid)];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -2099,8 +2080,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !(($2) < 0)];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -2116,8 +2096,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !(($2) >= $ac_mid)];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -2151,8 +2130,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !(($2) <= $ac_mid)];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -2395,7 +2373,7 @@ This file contains any messages produced
- running configure, to aid debugging if configure makes a mistake.
-
- It was created by python $as_me 3.3, which was
--generated by GNU Autoconf 2.69. Invocation command line was
-+generated by GNU Autoconf 2.68. Invocation command line was
-
- $ $0 $@
-
-@@ -2765,7 +2743,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_HAS_HG="found"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -3508,7 +3486,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -3548,7 +3526,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -3601,7 +3579,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -3642,7 +3620,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
-@@ -3700,7 +3678,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -3744,7 +3722,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -4190,7 +4168,8 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_
- /* end confdefs.h. */
- #include <stdarg.h>
- #include <stdio.h>
--struct stat;
-+#include <sys/types.h>
-+#include <sys/stat.h>
- /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
- struct buf { int x; };
- FILE * (*rcsopen) (struct buf *, struct stat *, int);
-@@ -4329,7 +4308,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -4370,7 +4349,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -4411,7 +4390,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -4460,7 +4439,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CXX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -4691,7 +4670,7 @@ do
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-- as_fn_executable_p "$ac_path_GREP" || continue
-+ { test -f "$ac_path_GREP" && $as_test_x
"$ac_path_GREP"; } || continue
- # Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
- case `"$ac_path_GREP" --version 2>&1` in
-@@ -4757,7 +4736,7 @@ do
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-- as_fn_executable_p "$ac_path_EGREP" || continue
-+ { test -f "$ac_path_EGREP" && $as_test_x
"$ac_path_EGREP"; } || continue
- # Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
- case `"$ac_path_EGREP" --version 2>&1` in
-@@ -4964,8 +4943,8 @@ else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h. */
-
--# define __EXTENSIONS__ 1
-- $ac_includes_default
-+# define __EXTENSIONS__ 1
-+ $ac_includes_default
- int
- main ()
- {
-@@ -5359,7 +5338,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -5399,7 +5378,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -5453,7 +5432,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_AR="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -5504,7 +5483,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_HAS_PYTHON="found"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -5577,7 +5556,7 @@ case $as_dir/ in #((
- # by default.
- for ac_prog in ginstall scoinst install; do
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x
"$as_dir/$ac_prog$ac_exec_ext"; }; then
- if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1;
then
- # AIX install. It has an incompatible calling convention.
-@@ -5646,7 +5625,7 @@ do
- test -z "$as_dir" && as_dir=.
- for ac_prog in mkdir gmkdir; do
- for ac_exec_ext in '' $ac_executable_extensions; do
-- as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
-+ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x
"$as_dir/$ac_prog$ac_exec_ext"; } || continue
- case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
- 'mkdir (GNU coreutils) '* | \
- 'mkdir (coreutils) '* | \
-@@ -8538,7 +8517,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -8581,7 +8560,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -9591,6 +9570,50 @@ $as_echo "no" >&6; }
+@@ -10017,6 +10021,50 @@ $as_echo "no" >&6; }
fi
@@ -576,155 +70,4 @@ diff -up ./configure.autotool-intermediates ./configure
# Check for Python-specific malloc support
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
$as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -10208,7 +10231,7 @@ do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
-- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_TRUE="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
- break 2
-@@ -11645,8 +11668,7 @@ int
- main ()
- {
- static int test_array [1 - 2 * !(((char) -1) < 0)];
--test_array [0] = 0;
--return test_array [0];
-+test_array [0] = 0
-
- ;
- return 0;
-@@ -11677,11 +11699,11 @@ else
- int
- main ()
- {
--
-+/* FIXME: Include the comments suggested by Paul. */
- #ifndef __cplusplus
-- /* Ultrix mips cc rejects this sort of thing. */
-+ /* Ultrix mips cc rejects this. */
- typedef int charset[2];
-- const charset cs = { 0, 0 };
-+ const charset cs;
- /* SunOS 4.1.1 cc rejects this. */
- char const *const *pcpcc;
- char **ppc;
-@@ -11698,9 +11720,8 @@ main ()
- ++pcpcc;
- ppc = (char**) pcpcc;
- pcpcc = (char const *const *) ppc;
-- { /* SCO 3.2v4 cc rejects this sort of thing. */
-- char tx;
-- char *t = &tx;
-+ { /* SCO 3.2v4 cc rejects this. */
-+ char *t;
- char const *s = 0 ? (char *) 0 : (char const *) 0;
-
- *t++ = 0;
-@@ -11716,10 +11737,10 @@ main ()
- iptr p = 0;
- ++p;
- }
-- { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
-+ { /* AIX XL C 1.02.0.0 rejects this saying
- "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-- struct s { int j; const int *ap[3]; } bx;
-- struct s *b = &bx; b->j = 5;
-+ struct s { int j; const int *ap[3]; };
-+ struct s *b; b->j = 5;
- }
- { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
- const int foo = 10;
-@@ -15008,16 +15029,16 @@ if (echo >conf$$.file) 2>/dev/null; then
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-- # In both cases, we have to default to `cp -pR'.
-+ # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-- as_ln_s='cp -pR'
-+ as_ln_s='cp -p'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
-- as_ln_s='cp -pR'
-+ as_ln_s='cp -p'
- fi
- else
-- as_ln_s='cp -pR'
-+ as_ln_s='cp -p'
- fi
- rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
- rmdir conf$$.dir 2>/dev/null
-@@ -15077,16 +15098,28 @@ else
- as_mkdir_p=false
- fi
-
--
--# as_fn_executable_p FILE
--# -----------------------
--# Test if FILE is an executable regular file.
--as_fn_executable_p ()
--{
-- test -f "$1" && test -x "$1"
--} # as_fn_executable_p
--as_test_x='test -x'
--as_executable_p=as_fn_executable_p
-+if test -x / >/dev/null 2>&1; then
-+ as_test_x='test -x'
-+else
-+ if ls -dL / >/dev/null 2>&1; then
-+ as_ls_L_option=L
-+ else
-+ as_ls_L_option=
-+ fi
-+ as_test_x='
-+ eval sh -c '\''
-+ if test -d "$1"; then
-+ test -d "$1/.";
-+ else
-+ case $1 in #(
-+ -*)set "./$1";;
-+ esac;
-+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-+ ???[sx]*):;;*)false;;esac;fi
-+ '\'' sh
-+ '
-+fi
-+as_executable_p=$as_test_x
-
- # Sed expression to map a string onto a valid CPP name.
- as_tr_cpp="eval sed
'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-@@ -15108,7 +15141,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
- # values after options handling.
- ac_log="
- This file was extended by python $as_me 3.3, which was
--generated by GNU Autoconf 2.69. Invocation command line was
-+generated by GNU Autoconf 2.68. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
-@@ -15170,10 +15203,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
- ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
- ac_cs_version="\\
- python config.status 3.3
--configured by $0, generated by GNU Autoconf 2.69,
-+configured by $0, generated by GNU Autoconf 2.68,
- with options \\"\$ac_cs_config\\"
-
--Copyright (C) 2012 Free Software Foundation, Inc.
-+Copyright (C) 2010 Free Software Foundation, Inc.
- This config.status script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it."
-
-@@ -15263,7 +15296,7 @@ fi
- _ACEOF
- cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- if \$ac_cs_recheck; then
-- set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create
--no-recursion
-+ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args
--no-create --no-recursion
- shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
- CONFIG_SHELL='$SHELL'
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
diff --git a/python-3.3.0b1-lib64.patch b/python-3.3.0b1-lib64.patch
index 110ed0d..5ae03aa 100644
--- a/python-3.3.0b1-lib64.patch
+++ b/python-3.3.0b1-lib64.patch
@@ -1,6 +1,6 @@
-diff -up Python-3.3.0b1/Lib/distutils/command/install.py.lib64
Python-3.3.0b1/Lib/distutils/command/install.py
---- Python-3.3.0b1/Lib/distutils/command/install.py.lib64 2012-06-26 16:19:41.000000000
-0400
-+++ Python-3.3.0b1/Lib/distutils/command/install.py 2012-07-20 13:09:38.760797382 -0400
+diff -up cpython-59223da36dec/Lib/distutils/command/install.py.lib64
cpython-59223da36dec/Lib/distutils/command/install.py
+--- cpython-59223da36dec/Lib/distutils/command/install.py.lib64 2012-08-07
06:10:57.000000000 -0400
++++ cpython-59223da36dec/Lib/distutils/command/install.py 2012-08-07 16:41:00.573477549
-0400
@@ -45,14 +45,14 @@ else:
INSTALL_SCHEMES = {
'unix_prefix': {
@@ -18,10 +18,10 @@ diff -up Python-3.3.0b1/Lib/distutils/command/install.py.lib64
Python-3.3.0b1/Li
'headers': '$base/include/python/$dist_name',
'scripts': '$base/bin',
'data' : '$base',
-diff -up Python-3.3.0b1/Lib/distutils/sysconfig.py.lib64
Python-3.3.0b1/Lib/distutils/sysconfig.py
---- Python-3.3.0b1/Lib/distutils/sysconfig.py.lib64 2012-06-26 16:19:41.000000000 -0400
-+++ Python-3.3.0b1/Lib/distutils/sysconfig.py 2012-07-20 13:12:48.017431348 -0400
-@@ -138,8 +138,12 @@ def get_python_lib(plat_specific=0, stan
+diff -up cpython-59223da36dec/Lib/distutils/sysconfig.py.lib64
cpython-59223da36dec/Lib/distutils/sysconfig.py
+--- cpython-59223da36dec/Lib/distutils/sysconfig.py.lib64 2012-08-07 06:10:57.000000000
-0400
++++ cpython-59223da36dec/Lib/distutils/sysconfig.py 2012-08-07 16:41:00.573477549 -0400
+@@ -139,8 +139,12 @@ def get_python_lib(plat_specific=0, stan
prefix = plat_specific and EXEC_PREFIX or PREFIX
if os.name == "posix":
@@ -35,9 +35,9 @@ diff -up Python-3.3.0b1/Lib/distutils/sysconfig.py.lib64
Python-3.3.0b1/Lib/dist
if standard_lib:
return libpython
else:
-diff -up Python-3.3.0b1/Lib/site.py.lib64 Python-3.3.0b1/Lib/site.py
---- Python-3.3.0b1/Lib/site.py.lib64 2012-06-26 16:19:45.000000000 -0400
-+++ Python-3.3.0b1/Lib/site.py 2012-07-20 13:09:38.762797357 -0400
+diff -up cpython-59223da36dec/Lib/site.py.lib64 cpython-59223da36dec/Lib/site.py
+--- cpython-59223da36dec/Lib/site.py.lib64 2012-08-07 06:10:57.000000000 -0400
++++ cpython-59223da36dec/Lib/site.py 2012-08-07 16:41:00.573477549 -0400
@@ -303,12 +303,16 @@ def getsitepackages(prefixes=None):
if sys.platform in ('os2emx', 'riscos'):
sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
@@ -55,9 +55,9 @@ diff -up Python-3.3.0b1/Lib/site.py.lib64 Python-3.3.0b1/Lib/site.py
sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
if sys.platform == "darwin":
# for framework builds *only* we add the standard Apple
-diff -up Python-3.3.0b1/Lib/sysconfig.py.lib64 Python-3.3.0b1/Lib/sysconfig.py
---- Python-3.3.0b1/Lib/sysconfig.py.lib64 2012-06-26 16:19:45.000000000 -0400
-+++ Python-3.3.0b1/Lib/sysconfig.py 2012-07-20 13:14:59.721784816 -0400
+diff -up cpython-59223da36dec/Lib/sysconfig.py.lib64
cpython-59223da36dec/Lib/sysconfig.py
+--- cpython-59223da36dec/Lib/sysconfig.py.lib64 2012-08-07 06:10:57.000000000 -0400
++++ cpython-59223da36dec/Lib/sysconfig.py 2012-08-07 16:41:00.574477549 -0400
@@ -21,10 +21,10 @@ __all__ = [
_INSTALL_SCHEMES = {
@@ -86,9 +86,9 @@ diff -up Python-3.3.0b1/Lib/sysconfig.py.lib64
Python-3.3.0b1/Lib/sysconfig.py
'include': '{userbase}/include/python{py_version_short}',
'scripts': '{userbase}/bin',
'data': '{userbase}',
-diff -up Python-3.3.0b1/Lib/test/test_site.py.lib64 Python-3.3.0b1/Lib/test/test_site.py
---- Python-3.3.0b1/Lib/test/test_site.py.lib64 2012-06-26 16:19:48.000000000 -0400
-+++ Python-3.3.0b1/Lib/test/test_site.py 2012-07-20 13:09:38.764797333 -0400
+diff -up cpython-59223da36dec/Lib/test/test_site.py.lib64
cpython-59223da36dec/Lib/test/test_site.py
+--- cpython-59223da36dec/Lib/test/test_site.py.lib64 2012-08-07 06:10:57.000000000 -0400
++++ cpython-59223da36dec/Lib/test/test_site.py 2012-08-07 16:41:00.574477549 -0400
@@ -239,12 +239,15 @@ class HelperFunctionsTests(unittest.Test
self.assertEqual(dirs[2], wanted)
elif os.sep == '/':
@@ -108,10 +108,10 @@ diff -up Python-3.3.0b1/Lib/test/test_site.py.lib64
Python-3.3.0b1/Lib/test/test
else:
# other platforms
self.assertEqual(len(dirs), 2)
-diff -up Python-3.3.0b1/Makefile.pre.in.lib64 Python-3.3.0b1/Makefile.pre.in
---- Python-3.3.0b1/Makefile.pre.in.lib64 2012-07-20 13:09:38.742797608 -0400
-+++ Python-3.3.0b1/Makefile.pre.in 2012-07-20 13:09:38.765797321 -0400
-@@ -107,7 +107,7 @@ LIBDIR= @libdir@
+diff -up cpython-59223da36dec/Makefile.pre.in.lib64 cpython-59223da36dec/Makefile.pre.in
+--- cpython-59223da36dec/Makefile.pre.in.lib64 2012-08-07 16:41:00.557477550 -0400
++++ cpython-59223da36dec/Makefile.pre.in 2012-08-07 16:41:00.575477549 -0400
+@@ -108,7 +108,7 @@ LIBDIR= @libdir@
MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
@@ -120,9 +120,9 @@ diff -up Python-3.3.0b1/Makefile.pre.in.lib64
Python-3.3.0b1/Makefile.pre.in
ABIFLAGS= @ABIFLAGS@
# Detailed destination directories
-diff -up Python-3.3.0b1/Modules/getpath.c.lib64 Python-3.3.0b1/Modules/getpath.c
---- Python-3.3.0b1/Modules/getpath.c.lib64 2012-06-26 16:19:54.000000000 -0400
-+++ Python-3.3.0b1/Modules/getpath.c 2012-07-20 13:09:38.766797308 -0400
+diff -up cpython-59223da36dec/Modules/getpath.c.lib64
cpython-59223da36dec/Modules/getpath.c
+--- cpython-59223da36dec/Modules/getpath.c.lib64 2012-08-07 06:10:57.000000000 -0400
++++ cpython-59223da36dec/Modules/getpath.c 2012-08-07 16:41:00.575477549 -0400
@@ -122,8 +122,8 @@
#endif
@@ -143,7 +143,7 @@ diff -up Python-3.3.0b1/Modules/getpath.c.lib64
Python-3.3.0b1/Modules/getpath.c
static void
reduce(wchar_t *dir)
-@@ -669,7 +669,7 @@ calculate_path(void)
+@@ -677,7 +677,7 @@ calculate_path(void)
}
else
wcsncpy(zip_path, _prefix, MAXPATHLEN);
@@ -152,7 +152,7 @@ diff -up Python-3.3.0b1/Modules/getpath.c.lib64
Python-3.3.0b1/Modules/getpath.c
bufsz = wcslen(zip_path); /* Replace "00" with version */
zip_path[bufsz - 6] = VERSION[0];
zip_path[bufsz - 5] = VERSION[2];
-@@ -679,7 +679,7 @@ calculate_path(void)
+@@ -687,7 +687,7 @@ calculate_path(void)
fprintf(stderr,
"Could not find platform dependent libraries
<exec_prefix>\n");
wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
@@ -161,19 +161,19 @@ diff -up Python-3.3.0b1/Modules/getpath.c.lib64
Python-3.3.0b1/Modules/getpath.c
}
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
-diff -up Python-3.3.0b1/setup.py.lib64 Python-3.3.0b1/setup.py
---- Python-3.3.0b1/setup.py.lib64 2012-06-26 16:19:58.000000000 -0400
-+++ Python-3.3.0b1/setup.py 2012-07-20 13:09:38.767797295 -0400
-@@ -393,7 +393,7 @@ class PyBuildExt(build_ext):
- # Ensure that /usr/local is always used, but the local build
+diff -up cpython-59223da36dec/setup.py.lib64 cpython-59223da36dec/setup.py
+--- cpython-59223da36dec/setup.py.lib64 2012-08-07 06:10:57.000000000 -0400
++++ cpython-59223da36dec/setup.py 2012-08-07 16:41:32.153475390 -0400
+@@ -438,7 +438,7 @@ class PyBuildExt(build_ext):
# directories (i.e. '.' and 'Include') must be first. See
issue
# 10520.
-- 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')
- self.add_multiarch_paths()
-
-@@ -652,11 +652,11 @@ class PyBuildExt(build_ext):
+ 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:
+@@ -708,11 +708,11 @@ class PyBuildExt(build_ext):
elif curses_library:
readline_libs.append(curses_library)
elif self.compiler.find_library_file(lib_dirs +
@@ -187,7 +187,7 @@ diff -up Python-3.3.0b1/setup.py.lib64 Python-3.3.0b1/setup.py
extra_link_args=readline_extra_link_args,
libraries=readline_libs) )
else:
-@@ -693,8 +693,8 @@ class PyBuildExt(build_ext):
+@@ -749,8 +749,8 @@ class PyBuildExt(build_ext):
if krb5_h:
ssl_incs += krb5_h
ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
diff --git a/python3.spec b/python3.spec
index c38e0af..8466e7f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,7 @@
# ======================================================
%global pybasever 3.3
-%global alphatag b1
+%global alphatag b2
# pybasever without the dot:
%global pyshortver 33
@@ -127,7 +127,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.2.%{alphatag}%{?dist}
+Release: 0.3.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
@@ -229,6 +229,8 @@ Patch3: 00003-remove-mimeaudio-tests.patch
# 00055 #
# Systemtap support: add statically-defined probe points
# Patch sent upstream as
http://bugs.python.org/issue14776
+# with some subsequent reworking to cope with LANG=C in an rpmbuild
+# (where sys.getfilesystemencoding() == 'ascii')
Patch55: 00055-systemtap.patch
Patch102: python-3.3.0b1-lib64.patch
@@ -415,8 +417,9 @@ Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
# 00152 #
# Fix a regex in test_gdb so that it doesn't choke when gdb provides a full
# path to Python/bltinmodule.c:
-# Not yet sent upstream
-Patch152: 00152-fix-test-gdb-regex.patch
+# Committed upstream as 77824:abcd29c9a791 as part of fix for
+#
http://bugs.python.org/issue12605
+# Patch152: 00152-fix-test-gdb-regex.patch
# 00153 #
# Strip out lines of the form "warning: Unable to open ..." from gdb's
stderr
@@ -477,17 +480,10 @@ Patch157: 00157-uid-gid-overflows.patch
Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
# 00161 #
-#
http://bugs.python.org/issue13447 added tests for the Tools scripts, but
-# these appear to assume that srcdir == builddir, which isn't the case for our
-# builds.
-# Not yet sent upstream
-Patch161: 00161-fix-test_tools-directory.patch
+# (Was only needed for Python 3.3.0b1)
# 00162 #
-# Fix a bug in distutils.sysconfig.get_config_vars() in which find_executable()
-# would traceback when "CC" contains options (e.g. "gcc -pthread")
-# Not yet sent upstream
-Patch162: 00162-distutils-sysconfig-fix-CC-options.patch
+# (Was only needed for Python 3.3.0b1)
# 00163 #
# Some tests within test_socket fail intermittently when run inside Koji;
@@ -723,8 +719,8 @@ done
%patch150 -p1
%endif
# 00151: not for python3
-%patch152 -p0
-%patch153 -p0
+# 00152: upstream as of Python 3.3.0b2
+%patch153 -p1
# 00154: not for this branch
%patch155 -p1
%patch156 -p1
@@ -732,8 +728,8 @@ done
#00158: FIXME
#00159: FIXME
%patch160 -p1
-%patch161 -p1
-%patch162 -p1
+# 00161: was only needed for Python 3.3.0b1
+# 00162: was only needed for Python 3.3.0b1
%patch163 -p1
%ifarch ppc %{power64}
%patch164 -p1
@@ -1460,7 +1456,6 @@ rm -fr %{buildroot}
%defattr(-, root, root)
%{pylibdir}/ctypes/test
%{pylibdir}/distutils/tests
-%{pylibdir}/importlib/test
%{pylibdir}/sqlite3/test
%{pylibdir}/test
%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
@@ -1593,6 +1588,12 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Aug 13 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.3.b2
+- 3.3b1 -> 3.3b2; drop upstreamed patch 152; refresh patches 3, 102, 111,
+134, 153, 160; regenenerate autotools patch; rework systemtap patch to work
+correctly when LANG=C (patch 55); importlib.test was moved to
+test.test_importlib upstream
+
* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
- disable some failing checks on PPC* (rhbz#846849)
diff --git a/sources b/sources
index b2e8d32..470145a 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-710047668636097f7557ba45953fce1a Python-3.3.0b1.tar.xz
+9caeb68335bb19ef36a6bc83467b0ae4 Python-3.3.0b2.tar.xz
commit d474ecc631198e47362b46da00cfbcc7f52de1b8
Author: Karsten Hopp <karsten(a)redhat.com>
Date: Tue Aug 14 01:05:00 2012 +0200
disable some failing checks on PPC* (rhbz#846849)
diff --git a/00164-disable-interrupted_write-tests-on-ppc.patch
b/00164-disable-interrupted_write-tests-on-ppc.patch
new file mode 100644
index 0000000..0db8092
--- /dev/null
+++ b/00164-disable-interrupted_write-tests-on-ppc.patch
@@ -0,0 +1,52 @@
+diff -up Python-3.3.0b1/Lib/test/test_exceptions.py.846849
Python-3.3.0b1/Lib/test/test_exceptions.py
+--- Python-3.3.0b1/Lib/test/test_exceptions.py.846849 2012-06-26 22:19:47.000000000
+0200
++++ Python-3.3.0b1/Lib/test/test_exceptions.py 2012-08-13 17:41:28.845403486 +0200
+@@ -401,6 +401,7 @@ class ExceptionTests(unittest.TestCase):
+ self.assertIsNone(e.__context__)
+ self.assertIsNone(e.__cause__)
+
++ @unittest.skip('rhbz#846849')
+ def testChainingDescriptors(self):
+ try:
+ raise Exception()
+diff -up Python-3.3.0b1/Lib/test/test_io.py.846849 Python-3.3.0b1/Lib/test/test_io.py
+--- Python-3.3.0b1/Lib/test/test_io.py.846849 2012-06-26 22:19:48.000000000 +0200
++++ Python-3.3.0b1/Lib/test/test_io.py 2012-08-13 17:41:28.846403451 +0200
+@@ -2938,12 +2938,15 @@ class SignalsTest(unittest.TestCase):
+ if e.errno != errno.EBADF:
+ raise
+
++ @unittest.skip('rhbz#846849')
+ def test_interrupted_write_unbuffered(self):
+ self.check_interrupted_write(b"xy", b"xy",
mode="wb", buffering=0)
+
++ @unittest.skip('rhbz#846849')
+ def test_interrupted_write_buffered(self):
+ self.check_interrupted_write(b"xy", b"xy",
mode="wb")
+
++ @unittest.skip('rhbz#846849')
+ def test_interrupted_write_text(self):
+ self.check_interrupted_write("xy", b"xy",
mode="w", encoding="ascii")
+
+diff -up Python-3.3.0b1/Lib/test/test_raise.py.846849
Python-3.3.0b1/Lib/test/test_raise.py
+--- Python-3.3.0b1/Lib/test/test_raise.py.846849 2012-08-13 17:42:16.719714213 +0200
++++ Python-3.3.0b1/Lib/test/test_raise.py 2012-08-13 17:43:02.544097272 +0200
+@@ -151,6 +151,7 @@ class TestRaise(unittest.TestCase):
+
+ class TestCause(unittest.TestCase):
+
++ @unittest.skip('rhbz#846849')
+ def testCauseSyntax(self):
+ try:
+ try:
+diff -up Python-3.3.0b1/Lib/test/test_traceback.py.846849
Python-3.3.0b1/Lib/test/test_traceback.py
+--- Python-3.3.0b1/Lib/test/test_traceback.py.846849 2012-08-13 17:44:19.714374275 +0200
++++ Python-3.3.0b1/Lib/test/test_traceback.py 2012-08-13 17:44:43.515534435 +0200
+@@ -246,6 +246,7 @@ class BaseExceptionReportingTests:
+ self.check_zero_div(blocks[0])
+ self.assertIn('inner_raise() # Marker', blocks[2])
+
++ @unittest.skip('rhbz#846849')
+ def test_context_suppression(self):
+ try:
+ try:
diff --git a/python3.spec b/python3.spec
index 5c6d8b2..c38e0af 100644
--- a/python3.spec
+++ b/python3.spec
@@ -127,7 +127,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.0
-Release: 0.1.%{alphatag}%{?dist}
+Release: 0.2.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
@@ -495,6 +495,12 @@ Patch162: 00162-distutils-sysconfig-fix-CC-options.patch
# Not yet sent upstream
Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
+# 0164 #
+# some tests in test._io interrupted_write-* fail on PPC (rhbz#846849)
+# testChainingDescriptors test in test_exceptions fails on PPc, too (rhbz#846849)
+# disable those tests so that rebuilds on PPC can continue
+Patch164: 00164-disable-interrupted_write-tests-on-ppc.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -729,6 +735,9 @@ done
%patch161 -p1
%patch162 -p1
%patch163 -p1
+%ifarch ppc %{power64}
+%patch164 -p1
+%endif
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1584,6 +1593,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Aug 13 2012 Karsten Hopp <karsten(a)redhat.com> 3.3.0-0.2.b1
+- disable some failing checks on PPC* (rhbz#846849)
+
* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
commit 6a38560c1b0e6bfa3523ab73200af499e287dbdc
Merge: 9924024 48d2048
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Aug 3 18:00:41 2012 -0400
Merge branch 'python3.3'
Conflicts:
python3.spec
diff --cc python3.spec
index 256e036,13ac725..5c6d8b2
--- a/python3.spec
+++ b/python3.spec
@@@ -1510,9 -1584,21 +1584,26 @@@ rm -fr %{buildroot
# ======================================================
%changelog
-* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
++* Fri Aug 3 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+ - 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
+ - 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
+ patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
+ configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream
issue 12326);
+ "bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
+ for stdlib (upstream issues 10645 and 12218); email/test moved to
+ test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
+ _decimal and _lzma modules; make collections modules explicit in payload again
+ (upstream issue 11085); add _testbuffer module to tests subpackage (added in
+ upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
+ workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
+ distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
+ _lzma module); skip some tests within test_socket (patch 163)
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
++* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
++
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
- use macro for power64 (rhbz#834653)
commit 48d20485dbef969c32d388eec4e1fee3cdf7fa90
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Jul 24 15:59:17 2012 -0400
skip some tests within test_socket (patch 163)
diff --git a/00163-disable-parts-of-test_socket-in-rpm-build.patch
b/00163-disable-parts-of-test_socket-in-rpm-build.patch
new file mode 100644
index 0000000..0e28036
--- /dev/null
+++ b/00163-disable-parts-of-test_socket-in-rpm-build.patch
@@ -0,0 +1,11 @@
+diff -up Python-3.3.0b1/Lib/test/test_socket.py.disable-test_socket-in-rpm-builds
Python-3.3.0b1/Lib/test/test_socket.py
+--- Python-3.3.0b1/Lib/test/test_socket.py.disable-test_socket-in-rpm-builds 2012-07-24
15:02:30.823355067 -0400
++++ Python-3.3.0b1/Lib/test/test_socket.py 2012-07-24 15:08:13.021354999 -0400
+@@ -2188,6 +2188,7 @@ class RecvmsgGenericStreamTests(RecvmsgG
+ # Tests which require a stream socket and can use either recvmsg()
+ # or recvmsg_into().
+
++ @unittest._skipInRpmBuild('fails intermittently when run within Koji')
+ def testRecvmsgEOF(self):
+ # Receive end-of-stream indicator (b"", peer socket closed).
+ msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
diff --git a/python3.spec b/python3.spec
index e77335d..13ac725 100644
--- a/python3.spec
+++ b/python3.spec
@@ -489,6 +489,12 @@ Patch161: 00161-fix-test_tools-directory.patch
# Not yet sent upstream
Patch162: 00162-distutils-sysconfig-fix-CC-options.patch
+# 00163 #
+# Some tests within test_socket fail intermittently when run inside Koji;
+# disable them using unittest._skipInRpmBuild
+# Not yet sent upstream
+Patch163: 00163-disable-parts-of-test_socket-in-rpm-build.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -722,6 +728,7 @@ done
%patch160 -p1
%patch161 -p1
%patch162 -p1
+%patch163 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1590,7 +1597,7 @@ _decimal and _lzma modules; make collections modules explicit in
payload again
upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
-_lzma module)
+_lzma module); skip some tests within test_socket (patch 163)
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
- use macro for power64 (rhbz#834653)
commit f2b86e2170a1724575c44ac121840ae67ad06c07
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Jul 24 14:59:47 2012 -0400
add BuildRequires: xz-devel (for _lzma module)
diff --git a/python3.spec b/python3.spec
index 5ee688d..e77335d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -179,10 +179,10 @@ BuildRequires: tk-devel
BuildRequires: valgrind-devel
%endif
+BuildRequires: xz-devel
BuildRequires: zlib-devel
-
# =======================
# Source code and patches
# =======================
@@ -1589,7 +1589,8 @@ _decimal and _lzma modules; make collections modules explicit in
payload again
(upstream issue 11085); add _testbuffer module to tests subpackage (added in
upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
-distutils.sysconfig traceback (patch 162)
+distutils.sysconfig traceback (patch 162); add BuildRequires: xz-devel (for
+_lzma module)
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
- use macro for power64 (rhbz#834653)
commit 08ca53faca8807e231edc2a9ab4a75e4625f69e5
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Jul 24 12:06:07 2012 -0400
fix distutils.sysconfig traceback (patch 162)
diff --git a/00162-distutils-sysconfig-fix-CC-options.patch
b/00162-distutils-sysconfig-fix-CC-options.patch
new file mode 100644
index 0000000..ac8d3f2
--- /dev/null
+++ b/00162-distutils-sysconfig-fix-CC-options.patch
@@ -0,0 +1,14 @@
+diff -up Python-3.3.0b1/Lib/distutils/sysconfig.py.fix-CC-options.patch
Python-3.3.0b1/Lib/distutils/sysconfig.py
+--- Python-3.3.0b1/Lib/distutils/sysconfig.py.fix-CC-options.patch 2012-07-24
11:57:43.804353959 -0400
++++ Python-3.3.0b1/Lib/distutils/sysconfig.py 2012-07-24 11:59:38.341354843 -0400
+@@ -580,7 +580,9 @@ def get_config_vars(*args):
+ # skip checks if the compiler was overriden with a CC env variable
+ if 'CC' not in os.environ:
+ cc = oldcc = _config_vars['CC']
+- if not find_executable(cc):
++ # CC might contain additional arguments e.g. "gcc -pthread",
so
++ # look for the first word:
++ if not find_executable(cc.split()[0]):
+ # Compiler is not found on the shell search PATH.
+ # Now search for clang, first on PATH (if the Command LIne
+ # Tools have been installed in / or if the user has provided
diff --git a/python3.spec b/python3.spec
index b68ef15..5ee688d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -483,6 +483,12 @@ Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
# Not yet sent upstream
Patch161: 00161-fix-test_tools-directory.patch
+# 00162 #
+# Fix a bug in distutils.sysconfig.get_config_vars() in which find_executable()
+# would traceback when "CC" contains options (e.g. "gcc -pthread")
+# Not yet sent upstream
+Patch162: 00162-distutils-sysconfig-fix-CC-options.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -715,6 +721,7 @@ done
#00159: FIXME
%patch160 -p1
%patch161 -p1
+%patch162 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1581,7 +1588,8 @@ test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP
405); add
_decimal and _lzma modules; make collections modules explicit in payload again
(upstream issue 11085); add _testbuffer module to tests subpackage (added in
upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
-workaround erroneously shared _sysconfigdata.py upstream issue #14774
+workaround erroneously shared _sysconfigdata.py upstream issue #14774; fix
+distutils.sysconfig traceback (patch 162)
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
- use macro for power64 (rhbz#834653)
commit 823581e8512c6cfc509ec158e96f2c2ec6f6e4b7
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Jul 24 11:21:34 2012 -0400
renumber patches (158->160, 159->161) for consistency with python.spec
diff --git a/00158-disable-test_fs_holes-in-rpm-build.patch
b/00158-disable-test_fs_holes-in-rpm-build.patch
deleted file mode 100644
index c0b0777..0000000
--- a/00158-disable-test_fs_holes-in-rpm-build.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch
Python-3.3.0b1/Lib/test/test_posix.py
----
Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch 2012-07-23
13:53:11.636847977 -0400
-+++ Python-3.3.0b1/Lib/test/test_posix.py 2012-07-23 13:54:02.810208218 -0400
-@@ -1022,6 +1022,7 @@ class PosixTester(unittest.TestCase):
- posix.RTLD_GLOBAL
- posix.RTLD_LOCAL
-
-+ @unittest._skipInRpmBuild('running kernel may not match kernel in chroot')
- @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
- "test needs an OS that reports file holes")
- @unittest.skipIf(sys.platform in ('freebsd7', 'freebsd8',
'freebsd9'),
diff --git a/00159-fix-test_tools-directory.patch b/00159-fix-test_tools-directory.patch
deleted file mode 100644
index 8811fb3..0000000
--- a/00159-fix-test_tools-directory.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory
Python-3.3.0b1/Lib/test/test_tools.py
---- Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory 2012-07-23
15:08:19.271494787 -0400
-+++ Python-3.3.0b1/Lib/test/test_tools.py 2012-07-23 15:08:32.183333368 -0400
-@@ -19,7 +19,7 @@ if not sysconfig.is_python_build():
- # and run the tests in that case too?
- raise unittest.SkipTest('test irrelevant for an installed Python')
-
--srcdir = sysconfig.get_config_var('projectbase')
-+srcdir = sysconfig.get_config_var('srcdir')
- basepath = os.path.join(os.getcwd(), srcdir, 'Tools')
- scriptsdir = os.path.join(basepath, 'scripts')
-
diff --git a/00160-disable-test_fs_holes-in-rpm-build.patch
b/00160-disable-test_fs_holes-in-rpm-build.patch
new file mode 100644
index 0000000..c0b0777
--- /dev/null
+++ b/00160-disable-test_fs_holes-in-rpm-build.patch
@@ -0,0 +1,11 @@
+diff -up Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch
Python-3.3.0b1/Lib/test/test_posix.py
+---
Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch 2012-07-23
13:53:11.636847977 -0400
++++ Python-3.3.0b1/Lib/test/test_posix.py 2012-07-23 13:54:02.810208218 -0400
+@@ -1022,6 +1022,7 @@ class PosixTester(unittest.TestCase):
+ posix.RTLD_GLOBAL
+ posix.RTLD_LOCAL
+
++ @unittest._skipInRpmBuild('running kernel may not match kernel in chroot')
+ @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
+ "test needs an OS that reports file holes")
+ @unittest.skipIf(sys.platform in ('freebsd7', 'freebsd8',
'freebsd9'),
diff --git a/00161-fix-test_tools-directory.patch b/00161-fix-test_tools-directory.patch
new file mode 100644
index 0000000..8811fb3
--- /dev/null
+++ b/00161-fix-test_tools-directory.patch
@@ -0,0 +1,12 @@
+diff -up Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory
Python-3.3.0b1/Lib/test/test_tools.py
+--- Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory 2012-07-23
15:08:19.271494787 -0400
++++ Python-3.3.0b1/Lib/test/test_tools.py 2012-07-23 15:08:32.183333368 -0400
+@@ -19,7 +19,7 @@ if not sysconfig.is_python_build():
+ # and run the tests in that case too?
+ raise unittest.SkipTest('test irrelevant for an installed Python')
+
+-srcdir = sysconfig.get_config_var('projectbase')
++srcdir = sysconfig.get_config_var('srcdir')
+ basepath = os.path.join(os.getcwd(), srcdir, 'Tools')
+ scriptsdir = os.path.join(basepath, 'scripts')
+
diff --git a/python3.spec b/python3.spec
index 00333d1..b68ef15 100644
--- a/python3.spec
+++ b/python3.spec
@@ -459,19 +459,29 @@ Patch156: 00156-gdb-autoload-safepath.patch
Patch157: 00157-uid-gid-overflows.patch
# 00158 #
+# Patch158: 00158-fix-hashlib-leak.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00159 #
+# Patch159: 00159-correct-libdb-include-path.patch
+# in python.spec
+# TODO: python3 status?
+
+# 00160 #
# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
# header files in the build chroot, but may not be supported in the running
# kernel, hence we disable this test in an rpm build.
# Adding these was upstream issue
http://bugs.python.org/issue10142
# Not yet sent upstream
-Patch158: 00158-disable-test_fs_holes-in-rpm-build.patch
+Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
-# 00159 #
+# 00161 #
#
http://bugs.python.org/issue13447 added tests for the Tools scripts, but
# these appear to assume that srcdir == builddir, which isn't the case for our
# builds.
# Not yet sent upstream
-Patch159: 00159-fix-test_tools-directory.patch
+Patch161: 00161-fix-test_tools-directory.patch
# (New patches go here ^^^)
#
@@ -701,8 +711,10 @@ done
%patch155 -p1
%patch156 -p1
%patch157 -p1
-%patch158 -p1
-%patch159 -p1
+#00158: FIXME
+#00159: FIXME
+%patch160 -p1
+%patch161 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1568,7 +1580,7 @@ for stdlib (upstream issues 10645 and 12218); email/test moved to
test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
_decimal and _lzma modules; make collections modules explicit in payload again
(upstream issue 11085); add _testbuffer module to tests subpackage (added in
-upstream commit 3f9b3b6f7ff0); fix test failures (patches 158 and 159);
+upstream commit 3f9b3b6f7ff0); fix test failures (patches 160 and 161);
workaround erroneously shared _sysconfigdata.py upstream issue #14774
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
commit 8d03cf22c738d78fcc8fee7d4c3fd90923c2f1bc
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Jul 24 06:12:06 2012 -0400
workaround erroneously shared _sysconfigdata.py upstream issue #14774
diff --git a/python3.spec b/python3.spec
index b860076..00333d1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -849,6 +849,12 @@ InstallPython() {
pushd $ConfDir
+ # Workaround for
http://bugs.python.org/issue14774 : Lib/_sysconfigdata.py
+ # is in the srcdir but contains per-config data.
+ # Regenerate it each time:
+ rm -f ../../Lib/_sysconfigdata.py
+ make $topdir/Lib/_sysconfigdata.py
+
make install DESTDIR=%{buildroot} INSTALL="install -p"
popd
@@ -1130,6 +1136,13 @@ CheckPython() {
# Note that we're running the tests using the version of the code in the
# builddir, not in the buildroot.
+ # Workaround for
http://bugs.python.org/issue14774, as per the install
+ # stanza (albeit from a different directory):
+ rm -f Lib/_sysconfigdata.py
+ pushd $ConfDir
+ make $topdir/Lib/_sysconfigdata.py
+ popd
+
# Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
# our non-standard decorators take effect on the relevant tests:
# @unittest._skipInRpmBuild(reason)
@@ -1555,7 +1568,8 @@ for stdlib (upstream issues 10645 and 12218); email/test moved to
test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
_decimal and _lzma modules; make collections modules explicit in payload again
(upstream issue 11085); add _testbuffer module to tests subpackage (added in
-upstream commit 3f9b3b6f7ff0)
+upstream commit 3f9b3b6f7ff0); fix test failures (patches 158 and 159);
+workaround erroneously shared _sysconfigdata.py upstream issue #14774
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
- use macro for power64 (rhbz#834653)
commit c85d3fb5f184e950542160fef17776fbb8af4720
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Jul 23 15:09:13 2012 -0400
fix bad patch 159
diff --git a/00159-fix-test_tools-directory.patch b/00159-fix-test_tools-directory.patch
index def63ca..8811fb3 100644
--- a/00159-fix-test_tools-directory.patch
+++ b/00159-fix-test_tools-directory.patch
@@ -1,6 +1,6 @@
diff -up Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory
Python-3.3.0b1/Lib/test/test_tools.py
---- Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory 2012-07-23
14:29:51.317348183 -0400
-+++ Python-3.3.0b1/Lib/test/test_tools.py 2012-07-23 14:30:09.883116080 -0400
+--- Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory 2012-07-23
15:08:19.271494787 -0400
++++ Python-3.3.0b1/Lib/test/test_tools.py 2012-07-23 15:08:32.183333368 -0400
@@ -19,7 +19,7 @@ if not sysconfig.is_python_build():
# and run the tests in that case too?
raise unittest.SkipTest('test irrelevant for an installed Python')
@@ -9,4 +9,4 @@ diff -up Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory
Python-3
+srcdir = sysconfig.get_config_var('srcdir')
basepath = os.path.join(os.getcwd(), srcdir, 'Tools')
scriptsdir = os.path.join(basepath, 'scripts')
- print('srcdir: %r' % srcdir)
+
commit 66161795651949904dd556b2d1edc03d371c6751
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Jul 23 14:38:48 2012 -0400
fix test_tools (patch 159)
diff --git a/00159-fix-test_tools-directory.patch b/00159-fix-test_tools-directory.patch
new file mode 100644
index 0000000..def63ca
--- /dev/null
+++ b/00159-fix-test_tools-directory.patch
@@ -0,0 +1,12 @@
+diff -up Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory
Python-3.3.0b1/Lib/test/test_tools.py
+--- Python-3.3.0b1/Lib/test/test_tools.py.fix-test_tools-directory 2012-07-23
14:29:51.317348183 -0400
++++ Python-3.3.0b1/Lib/test/test_tools.py 2012-07-23 14:30:09.883116080 -0400
+@@ -19,7 +19,7 @@ if not sysconfig.is_python_build():
+ # and run the tests in that case too?
+ raise unittest.SkipTest('test irrelevant for an installed Python')
+
+-srcdir = sysconfig.get_config_var('projectbase')
++srcdir = sysconfig.get_config_var('srcdir')
+ basepath = os.path.join(os.getcwd(), srcdir, 'Tools')
+ scriptsdir = os.path.join(basepath, 'scripts')
+ print('srcdir: %r' % srcdir)
diff --git a/python3.spec b/python3.spec
index efba61f..b860076 100644
--- a/python3.spec
+++ b/python3.spec
@@ -466,6 +466,13 @@ Patch157: 00157-uid-gid-overflows.patch
# Not yet sent upstream
Patch158: 00158-disable-test_fs_holes-in-rpm-build.patch
+# 00159 #
+#
http://bugs.python.org/issue13447 added tests for the Tools scripts, but
+# these appear to assume that srcdir == builddir, which isn't the case for our
+# builds.
+# Not yet sent upstream
+Patch159: 00159-fix-test_tools-directory.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -695,6 +702,7 @@ done
%patch156 -p1
%patch157 -p1
%patch158 -p1
+%patch159 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit 3b4dd24c42a177bd8bda0ebf127f199ef32364ef
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Jul 23 14:05:53 2012 -0400
fix test_posix (patch 158)
diff --git a/00158-disable-test_fs_holes-in-rpm-build.patch
b/00158-disable-test_fs_holes-in-rpm-build.patch
new file mode 100644
index 0000000..c0b0777
--- /dev/null
+++ b/00158-disable-test_fs_holes-in-rpm-build.patch
@@ -0,0 +1,11 @@
+diff -up Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch
Python-3.3.0b1/Lib/test/test_posix.py
+---
Python-3.3.0b1/Lib/test/test_posix.py.disable-test_fs_holes-in-rpm-build.patch 2012-07-23
13:53:11.636847977 -0400
++++ Python-3.3.0b1/Lib/test/test_posix.py 2012-07-23 13:54:02.810208218 -0400
+@@ -1022,6 +1022,7 @@ class PosixTester(unittest.TestCase):
+ posix.RTLD_GLOBAL
+ posix.RTLD_LOCAL
+
++ @unittest._skipInRpmBuild('running kernel may not match kernel in chroot')
+ @unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
+ "test needs an OS that reports file holes")
+ @unittest.skipIf(sys.platform in ('freebsd7', 'freebsd8',
'freebsd9'),
diff --git a/python3.spec b/python3.spec
index 5867aae..efba61f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -458,6 +458,14 @@ Patch156: 00156-gdb-autoload-safepath.patch
# (rhbz#697470)
Patch157: 00157-uid-gid-overflows.patch
+# 00158 #
+# Python 3.3 added os.SEEK_DATA and os.SEEK_HOLE, which may be present in the
+# header files in the build chroot, but may not be supported in the running
+# kernel, hence we disable this test in an rpm build.
+# Adding these was upstream issue
http://bugs.python.org/issue10142
+# Not yet sent upstream
+Patch158: 00158-disable-test_fs_holes-in-rpm-build.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -686,6 +694,7 @@ done
%patch155 -p1
%patch156 -p1
%patch157 -p1
+%patch158 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit a4dad5ac963722f3671bb45b6cf51c60e7e40cbd
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Jul 23 11:27:17 2012 -0400
fix test_sys (patch 134)
diff --git a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
index 18549cb..379385f 100644
--- a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+++ b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
@@ -1,11 +1,19 @@
diff -up Python-3.3.0b1/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys
Python-3.3.0b1/Lib/test/test_sys.py
---- Python-3.3.0b1/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys 2012-06-26
16:19:48.000000000 -0400
-+++ Python-3.3.0b1/Lib/test/test_sys.py 2012-07-20 13:44:23.050740172 -0400
-@@ -869,6 +869,9 @@ class SizeofTest(unittest.TestCase):
+--- Python-3.3.0b1/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys 2012-07-23
11:18:52.524602807 -0400
++++ Python-3.3.0b1/Lib/test/test_sys.py 2012-07-23 11:25:54.641325620 -0400
+@@ -863,12 +863,17 @@ class SizeofTest(unittest.TestCase):
+ # type
+ # static type: PyTypeObject
+ s = size(vh + 'P2P15Pl4PP9PP11PI')
++ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
++ if hasattr(sys, 'getcounts'):
++ s += size('3P2P')
+ check(int, s)
+ # (PyTypeObject + PyNumberMethods + PyMappingMethods +
+ # PySequenceMethods + PyBufferProcs + 4P)
s = size(vh + 'P2P15Pl4PP9PP11PI') + size('34P 3P 10P 2P 4P')
# Separate block for PyDictKeysObject with 4 entries
s += size("PPPP") + 4*size("PPP")
-+ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
+ if hasattr(sys, 'getcounts'):
+ s += size('3P2P')
# class
commit 99240249b92c67b9f59df48b71de14fd054932e8
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Sat Jul 21 06:37:12 2012 -0500
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index fd1f504..256e036 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
Group: Development/Languages
@@ -1510,6 +1510,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2.3-11
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
- use macro for power64 (rhbz#834653)
commit 1c94c1ae4ebfa045a6ebaf83b6f88afc55573997
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Jul 20 16:34:09 2012 -0400
3.3.0-0.1.b1: 3.2 -> 3.3
* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream
issue 12326);
"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
for stdlib (upstream issues 10645 and 12218); email/test moved to
test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
_decimal and _lzma modules; make collections modules explicit in payload again
(upstream issue 11085); add _testbuffer module to tests subpackage (added in
upstream commit 3f9b3b6f7ff0)
diff --git a/00003-remove-mimeaudio-tests.patch b/00003-remove-mimeaudio-tests.patch
new file mode 100644
index 0000000..08ae10a
--- /dev/null
+++ b/00003-remove-mimeaudio-tests.patch
@@ -0,0 +1,51 @@
+diff -up Python-3.3.0b1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests
Python-3.3.0b1/Lib/test/test_email/test_email.py
+--- Python-3.3.0b1/Lib/test/test_email/test_email.py.remove-mimeaudio-tests 2012-06-26
16:19:47.000000000 -0400
++++ Python-3.3.0b1/Lib/test/test_email/test_email.py 2012-07-20 12:04:45.316472136 -0400
+@@ -1285,47 +1285,6 @@ Blah blah blah
+
+
+
+-# Test the basic MIMEAudio class
+-class TestMIMEAudio(unittest.TestCase):
+- def setUp(self):
+- with openfile('audiotest.au', 'rb') as fp:
+- self._audiodata = fp.read()
+- self._au = MIMEAudio(self._audiodata)
+-
+- def test_guess_minor_type(self):
+- self.assertEqual(self._au.get_content_type(), 'audio/basic')
+-
+- def test_encoding(self):
+- payload = self._au.get_payload()
+- self.assertEqual(base64.decodebytes(bytes(payload, 'ascii')),
+- self._audiodata)
+-
+- def test_checkSetMinor(self):
+- au = MIMEAudio(self._audiodata, 'fish')
+- self.assertEqual(au.get_content_type(), 'audio/fish')
+-
+- def test_add_header(self):
+- eq = self.assertEqual
+- unless = self.assertTrue
+- self._au.add_header('Content-Disposition', 'attachment',
+- filename='audiotest.au')
+- eq(self._au['content-disposition'],
+- 'attachment; filename="audiotest.au"')
+- eq(self._au.get_params(header='content-disposition'),
+- [('attachment', ''), ('filename',
'audiotest.au')])
+- eq(self._au.get_param('filename',
header='content-disposition'),
+- 'audiotest.au')
+- missing = []
+- eq(self._au.get_param('attachment',
header='content-disposition'), '')
+- unless(self._au.get_param('foo', failobj=missing,
+- header='content-disposition') is missing)
+- # Try some missing stuff
+- unless(self._au.get_param('foobar', missing) is missing)
+- unless(self._au.get_param('attachment', missing,
+- header='foobar') is missing)
+-
+-
+-
+ # Test the basic MIMEImage class
+ class TestMIMEImage(unittest.TestCase):
+ def setUp(self):
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
index f87fc60..33b82d4 100644
--- a/00055-systemtap.patch
+++ b/00055-systemtap.patch
@@ -1,214 +1,808 @@
-diff -up Python-3.2b2/configure.in.systemtap Python-3.2b2/configure.in
---- Python-3.2b2/configure.in.systemtap 2010-12-13 02:59:39.000000000 -0500
-+++ Python-3.2b2/configure.in 2010-12-28 17:01:58.044059433 -0500
-@@ -2470,6 +2470,38 @@ if test "$with_valgrind" != no; then
+diff -up Python-3.3.0b1/configure.ac.systemtap Python-3.3.0b1/configure.ac
+--- Python-3.3.0b1/configure.ac.systemtap 2012-06-26 16:19:58.000000000 -0400
++++ Python-3.3.0b1/configure.ac 2012-07-20 13:05:39.221792032 -0400
+@@ -2616,6 +2616,23 @@ if test "$with_valgrind" != no; then
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
-+# Check for dtrace support
-+AC_MSG_CHECKING(for --with-dtrace)
-+AC_ARG_WITH(dtrace,
-+ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
-+
-+if test ! -z "$with_dtrace"
-+then
-+ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Sun"
-+ DTRACEOBJS="Python/dtrace.o"
-+ DTRADEHDRS=""
-+ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Apple"
-+ DTRACEOBJS=""
-+ DTRADEHDRS="pydtrace.h"
-+ else
-+ with_dtrace="no"
-+ fi
-+else
-+ with_dtrace="no"
++# Check for systemtap support
++# On Linux, /usr/bin/dtrace is in fact a shim to SystemTap
++AC_MSG_CHECKING([for --with-systemtap])
++AC_ARG_WITH([systemtap],
++ AC_HELP_STRING([--with(out)-systemtap], [disable/enable SystemTap
support]),,
++ with_systemtap=no)
++AC_MSG_RESULT([$with_systemtap])
++if test "$with_systemtap" != no; then
++ AC_DEFINE(WITH_SYSTEMTAP, 1,
++ [Define if you want to compile in SystemTap support])
++ SYSTEMTAPOBJS="Python/pysystemtap.o"
++ SYSTEMTAPDEPS="\$(srcdir)/Python/pysystemtap.h"
+fi
+
-+AC_MSG_RESULT($with_dtrace)
-+AC_SUBST(DTRACEOBJS)
-+AC_SUBST(DTRACEHDRS)
++AC_SUBST(SYSTEMTAPOBJS)
++AC_SUBST(SYSTEMTAPDEPS)
+
# -I${DLINCLDIR} is added to the compile rule for importdl.o
AC_SUBST(DLINCLDIR)
DLINCLDIR=.
-diff -up Python-3.2b2/Include/pydtrace.d.systemtap Python-3.2b2/Include/pydtrace.d
---- Python-3.2b2/Include/pydtrace.d.systemtap 2010-12-28 16:58:41.762936379 -0500
-+++ Python-3.2b2/Include/pydtrace.d 2010-12-28 16:58:41.762936379 -0500
-@@ -0,0 +1,10 @@
-+provider python {
-+ probe function__entry(const char *, const char *, int);
-+ probe function__return(const char *, const char *, int);
-+};
+diff -up Python-3.3.0b1/configure.systemtap Python-3.3.0b1/configure
+--- Python-3.3.0b1/configure.systemtap 2012-06-26 16:19:58.000000000 -0400
++++ Python-3.3.0b1/configure 2012-07-20 13:05:39.220792044 -0400
+@@ -638,6 +638,8 @@ TRUE
+ MACHDEP_OBJS
+ DYNLOADFILE
+ DLINCLDIR
++SYSTEMTAPDEPS
++SYSTEMTAPOBJS
+ THREADOBJ
+ LDLAST
+ USE_THREAD_MODULE
+@@ -793,6 +795,7 @@ with_doc_strings
+ with_tsc
+ with_pymalloc
+ with_valgrind
++with_systemtap
+ with_fpectl
+ with_libm
+ with_libc
+@@ -1468,6 +1471,7 @@ Optional Packages:
+ --with(out)-tsc enable/disable timestamp counter profile
+ --with(out)-pymalloc disable/enable specialized mallocs
+ --with-valgrind Enable Valgrind support
++ --with(out)-systemtap disable/enable SystemTap support
+ --with-fpectl enable SIGFPE catching
+ --with-libm=STRING math library
+ --with-libc=STRING C library
+@@ -9639,6 +9643,31 @@ fi
+ OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
+ fi
+
++# Check for systemtap support
++# On Linux, /usr/bin/dtrace is in fact a shim to SystemTap
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-systemtap"
>&5
++$as_echo_n "checking for --with-systemtap... " >&6; }
++
++# Check whether --with-systemtap was given.
++if test "${with_systemtap+set}" = set; then :
++ withval=$with_systemtap;
++else
++ with_systemtap=no
++fi
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_systemtap" >&5
++$as_echo "$with_systemtap" >&6; }
++if test "$with_systemtap" != no; then
++
++$as_echo "#define WITH_SYSTEMTAP 1" >>confdefs.h
++
++ SYSTEMTAPOBJS="Python/pysystemtap.o"
++ SYSTEMTAPDEPS="\$(srcdir)/Python/pysystemtap.h"
++fi
++
++
++
++
+ # -I${DLINCLDIR} is added to the compile rule for importdl.o
+
+ DLINCLDIR=.
+diff -up Python-3.3.0b1/Doc/howto/index.rst.systemtap Python-3.3.0b1/Doc/howto/index.rst
+--- Python-3.3.0b1/Doc/howto/index.rst.systemtap 2012-06-26 16:19:37.000000000 -0400
++++ Python-3.3.0b1/Doc/howto/index.rst 2012-07-20 13:05:39.215792107 -0400
+@@ -29,4 +29,5 @@ Currently, the HOWTOs are:
+ webservers.rst
+ argparse.rst
+ ipaddress.rst
++ instrumentation.rst
+
+diff -up Python-3.3.0b1/Doc/howto/instrumentation.rst.systemtap
Python-3.3.0b1/Doc/howto/instrumentation.rst
+--- Python-3.3.0b1/Doc/howto/instrumentation.rst.systemtap 2012-07-20 13:05:39.215792107
-0400
++++ Python-3.3.0b1/Doc/howto/instrumentation.rst 2012-07-20 13:05:39.215792107 -0400
+@@ -0,0 +1,295 @@
++.. _instrumentation:
++
++====================================
++Instrumenting CPython with SystemTap
++====================================
++
++:author: David Malcolm <dmalcolm(a)redhat.com>
++
++DTrace and SystemTap are monitoring tools, each providing a way to inspect
++what the processes on a computer system are doing. They both use
++domain-specific languages allowing a user to write scripts which:
++
++ - filter which processes are to be observed
++ - gather data from the processes of interest
++ - generate reports on the data
++
++As of Python 3.3, CPython can be built with embedded "markers" that can be
++observed by a SystemTap script, making it easier to monitor what the CPython
++processes on a system are doing.
++
++.. Potentially this document could be expanded to also cover DTrace markers.
++ However, I'm not a DTrace expert.
++
++.. I'm using ".. code-block:: c" for SystemTap scripts, as "c"
is syntactically
++ the closest match that Sphinx supports
++
++
++Enabling the static markers
++---------------------------
++
++In order to build CPython with the embedded markers for SystemTap, the
++SystemTap development tools must be installed.
++
++On a Fedora or Red Hat Enterprise Linux machine, this can be done via::
++
++ yum install systemtap-sdt-devel
++
++CPython must then be configured `--with-systemtap`::
++
++ checking for --with-systemtap... yes
++
++You can verify if the SystemTap static markers are present in the built
++binary by seeing if it contains a ".note.stapsdt" section.
++
++.. code-block:: bash
++
++ $ eu-readelf -S ./python | grep .note.stapsdt
++ [29] .note.stapsdt NOTE 0000000000000000 00308d78 000000b8 0 0
0 4
++
++If you've built python as a shared library (with --enable-shared), you need
++to look instead within the shared library. For example:
++
++.. code-block:: bash
++
++ $ eu-readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt
++ [28] .note.stapsdt NOTE 0000000000000000 00365b68 000000b8 0 0
0 4
++
++Earlier versions of SystemTap stored the markers in a ".probes" section.
++
++For the curious, you can see the metadata for the static markers using this
++invocation.
++
++.. code-block:: bash
++
++ $ eu-readelf -x .note.stapsdt ./python
++
++ Hex dump of section [29] '.note.stapsdt', 184 bytes at offset 0x308d78:
++ 0x00000000 08000000 45000000 03000000 73746170 ....E.......stap
++ 0x00000010 73647400 d4664b00 00000000 4fc36600 sdt..fK.....O.f.
++ 0x00000020 00000000 488d9000 00000000 70797468 ....H.......pyth
++ 0x00000030 6f6e0066 756e6374 696f6e5f 5f656e74 on.function__ent
++ 0x00000040 72790038 40257261 78203840 25726478 ry.8@%rax 8@%rdx
++ 0x00000050 202d3440 25656378 00000000 08000000 -4@%ecx........
++ 0x00000060 46000000 03000000 73746170 73647400 F.......stapsdt.
++ 0x00000070 0d674b00 00000000 4fc36600 00000000 .gK.....O.f.....
++ 0x00000080 4a8d9000 00000000 70797468 6f6e0066 J.......python.f
++ 0x00000090 756e6374 696f6e5f 5f726574 75726e00 unction__return.
++ 0x000000a0 38402572 61782038 40257264 78202d34 8@%rax 8@%rdx -4
++ 0x000000b0 40256563 78000000 @%ecx...
++
++and a sufficiently modern eu-readelf can print the metadata:
++
++.. code-block:: bash
++
++ $ eu-readelf -n ./python
++
++ Note section [ 1] '.note.gnu.build-id' of 36 bytes at offset 0x190:
++ Owner Data size Type
++ GNU 20 GNU_BUILD_ID
++ Build ID: a28f8db1b224530b0d38ad7b82a249cf7c3f18d6
++
++ Note section [27] '.note.stapsdt' of 184 bytes at offset 0x1ae884:
++ Owner Data size Type
++ stapsdt 70 Version: 3
++ PC: 0xe0d3a, Base: 0x14b150, Semaphore: 0x3ae882
++ Provider: python, Name: function__return, Args: '8@%rbx 8@%r13 -4@%eax'
++ stapsdt 69 Version: 3
++ PC: 0xe0f37, Base: 0x14b150, Semaphore: 0x3ae880
++ Provider: python, Name: function__entry, Args: '8@%rbx 8@%r13 -4@%eax'
++
++The above metadata contains information for SystemTap describing how it can
++patch strategically-placed machine code instructions to enable the tracing
++hooks used by a SystemTap script.
++
++
++Static markers
++--------------
++
++The low-level way to use the SystemTap integration is to use the static
++markers directly. This requires you to explicitly state the binary file
++containing them.
++
++For example, this script can be used to show the call/return hierarchy of a
++Python script:
++
++.. code-block:: c
++
++ probe process('python').mark("function__entry") {
++ filename = user_string($arg1);
++ funcname = user_string($arg2);
++ lineno = $arg3;
++
++ printf("%s => %s in %s:%d\\n",
++ thread_indent(1), funcname, filename, lineno);
++ }
++
++ probe process('python').mark("function__return") {
++ filename = user_string($arg1);
++ funcname = user_string($arg2);
++ lineno = $arg3;
++
++ printf("%s <= %s in %s:%d\\n",
++ thread_indent(-1), funcname, filename, lineno);
++ }
++
++It can be invoked like this:
++
++.. code-block:: bash
++
++ $ stap \
++ show-call-hierarchy.stp \
++ -c ./python test.py
++
++The output looks like this::
++
++ 11408 python(8274): => __contains__ in Lib/_abcoll.py:362
++ 11414 python(8274): => __getitem__ in Lib/os.py:425
++ 11418 python(8274): => encode in Lib/os.py:490
++ 11424 python(8274): <= encode in Lib/os.py:493
++ 11428 python(8274): <= __getitem__ in Lib/os.py:426
++ 11433 python(8274): <= __contains__ in Lib/_abcoll.py:366
++
++where the columns are:
++
++ - time in microseconds since start of script
++
++ - name of executable
++
++ - PID of process
++
++and the remainder indicates the call/return hierarchy as the script executes.
++
++For a `--enable-shared` build of CPython, the markers are contained within the
++libpython shared library, and the probe's dotted path needs to reflect this. For
++example, this line from the above example::
++
++ probe process('python').mark("function__entry") {
++
++should instead read::
++
++ probe
process('python').library("libpython3.3dm.so.1.0").mark("function__entry")
{
++
++(assuming a debug build of CPython 3.3)
++
++.. I'm reusing the "c:function" type for markers
++
++.. c:function:: function__entry(str filename, str funcname, int lineno)
++
++ This marker indicates that execution of a Python function has begun. It is
++ only triggered for pure-python (bytecode) functions.
++
++ The filename, function name, and line number are provided back to the
++ tracing script as positional arguments, which must be accessed using
++ `$arg1`, `$arg2`:
++
++ * `$arg1` : `(const char *)` filename, accessible using `user_string($arg1)`
++
++ * `$arg2` : `(const char *)` function name, accessible using
++ `user_string($arg2)`
++
++ * `$arg3` : `int` line number
++
++ * `$arg4` : `(PyFrameObject *)`, the frame being executed
++
++.. c:function:: function__return(str filename, str funcname, int lineno)
++
++ This marker is the converse of `function__entry`, and indicates that
++ execution of a Python function has ended (either via ``return``, or via an
++ exception). It is only triggered for pure-python (bytecode) functions.
++
++ The arguments are the same as for `function__entry`
++
++
++Tapsets
++-------
++
++The higher-level way to use the SystemTap integration is to use a "tapset":
++SystemTap's equivalent of a library, which hides some of the lower-level
++details of the static markers.
++
++Here is a tapset file, based on a non-shared build of CPython:
++
++.. code-block:: c
++
++ /*
++ Provide a higher-level wrapping around the function__entry and
++ function__return markers:
++ */
++ probe python.function.entry =
process("python").mark("function__entry")
++ {
++ filename = user_string($arg1);
++ funcname = user_string($arg2);
++ lineno = $arg3;
++ frameptr = $arg4
++ }
++ probe python.function.return =
process("python").mark("function__return")
++ {
++ filename = user_string($arg1);
++ funcname = user_string($arg2);
++ lineno = $arg3;
++ frameptr = $arg4
++ }
++
++If this file is installed in SystemTap's tapset directory (e.g.
++`/usr/share/systemtap/tapset`), then these additional probepoints become
++available:
++
++.. c:function:: python.function.entry(str filename, str funcname, int lineno, frameptr)
++
++ This probe point indicates that execution of a Python function has begun.
++ It is only triggered for pure-python (bytecode) functions.
++
++.. c:function:: python.function.return(str filename, str funcname, int lineno,
frameptr)
++
++ This probe point is the converse of `python.function.return`, and indicates
++ that execution of a Python function has ended (either via ``return``, or
++ via an exception). It is only triggered for pure-python (bytecode) functions.
++
++
++Examples
++--------
++This SystemTap script uses the tapset above to more cleanly implement the
++example given above of tracing the Python function-call hierarchy, without
++needing to directly name the static markers:
++
++.. code-block:: c
++
++ probe python.function.entry
++ {
++ printf("%s => %s in %s:%d\n",
++ thread_indent(1), funcname, filename, lineno);
++ }
++
++ probe python.function.return
++ {
++ printf("%s <= %s in %s:%d\n",
++ thread_indent(-1), funcname, filename, lineno);
++ }
++
+
-+#pragma D attributes Evolving/Evolving/Common provider python provider
-+#pragma D attributes Private/Private/Common provider python module
-+#pragma D attributes Private/Private/Common provider python function
-+#pragma D attributes Evolving/Evolving/Common provider python name
-+#pragma D attributes Evolving/Evolving/Common provider python args
-diff -up Python-3.2b2/Makefile.pre.in.systemtap Python-3.2b2/Makefile.pre.in
---- Python-3.2b2/Makefile.pre.in.systemtap 2010-12-28 16:58:41.000000000 -0500
-+++ Python-3.2b2/Makefile.pre.in 2010-12-28 17:00:58.607310089 -0500
-@@ -328,6 +328,7 @@ PYTHON_OBJS= \
++The following script uses the tapset above to provide a top-like view of all
++running CPython code, showing the top 20 most frequently-entered bytecode
++frames, each second, across the whole system:
++
++.. code-block:: c
++
++ global fn_calls;
++
++ probe python.function.entry
++ {
++ fn_calls[pid(), filename, funcname, lineno] += 1;
++ }
++
++ probe timer.ms(1000) {
++ printf("\033[2J\033[1;1H") /* clear screen */
++ printf("%6s %80s %6s %30s %6s\n",
++ "PID", "FILENAME", "LINE",
"FUNCTION", "CALLS")
++ foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
++ printf("%6d %80s %6d %30s %6d\n",
++ pid, filename, lineno, funcname,
++ fn_calls[pid, filename, funcname, lineno]);
++ }
++ delete fn_calls;
++ }
++
+diff -up Python-3.3.0b1/Lib/test/test_systemtap.py.systemtap
Python-3.3.0b1/Lib/test/test_systemtap.py
+--- Python-3.3.0b1/Lib/test/test_systemtap.py.systemtap 2012-07-20 13:05:39.215792107
-0400
++++ Python-3.3.0b1/Lib/test/test_systemtap.py 2012-07-20 13:05:39.215792107 -0400
+@@ -0,0 +1,205 @@
++# Verify that systemtap static probes work
++#
++import subprocess
++import sys
++import sysconfig
++import os
++import unittest
++
++from test.support import run_unittest, TESTFN, unlink
++
++if '--with-systemtap' not in sysconfig.get_config_var('CONFIG_ARGS'):
++ raise unittest.SkipTest("Python was not configured --with-systemtap")
++
++try:
++ _, stap_version = subprocess.Popen(["stap", "-V"],
++ stdout=subprocess.PIPE,
++ stderr=subprocess.PIPE,
++ ).communicate()
++except OSError:
++ # This is what "no stap" looks like. There may, however, be other
++ # errors that manifest this way too.
++ raise unittest.SkipTest("Couldn't find stap on the path")
++
++def invoke_systemtap_script(script, cmd):
++ # Start a child process, probing with the given systemtap script
++ # (passed as stdin to the "stap" tool)
++ # The script should be a bytes instance
++ # Return (stdout, stderr) pair
++
++ p = subprocess.Popen(["stap", "-", '-vv', '-c',
cmd],
++ stdin=subprocess.PIPE,
++ stdout=subprocess.PIPE,
++ stderr=subprocess.PIPE)
++ out, err = p.communicate(input=script)
++ return out, err
++
++# Verify that stap can run a simple "hello world"-style script
++# This can fail for various reasons:
++# - missing kernel headers
++# - permissions (a non-root user needs to be in the "stapdev" group)
++TRIVIAL_STAP_SCRIPT = b'probe begin { println("hello world") exit ()
}'
++
++out, err = invoke_systemtap_script(TRIVIAL_STAP_SCRIPT, 'true')
++if out != b'hello world\n':
++ raise unittest.SkipTest("Test systemtap script did not run; stderr was:
%s" % err)
++
++# We don't expect stderr to be empty, since we're invoking stap with
"-vv": stap
++# will (we hope) generate debugging output on stderr.
++
++def invoke_python_under_systemtap(script, pythoncode=None, pythonfile=None):
++ # Start a child python process, probing with the given systemtap script
++ # (passed as stdin to the "stap" tool)
++ # The script should be a bytes instance
++ # Return (stdout, stderr) pair
++
++ if pythonfile:
++ pythoncmd = '%s %s' % (sys.executable, pythonfile)
++ else:
++ pythoncmd = '%s -c %r' % (sys.executable, pythoncode)
++
++ # The process tree of a stap invocation of a command goes through
++ # something like this:
++ # stap ->fork/exec(staprun; exec stapio ->f/e(-c cmd); exec staprun -r)
++ # and this trip through setuid leads to LD_LIBRARY_PATH being dropped,
++ # which would lead to an --enable-shared build of python failing to be
++ # find its libpython, with an error like:
++ # error while loading shared libraries: libpython3.3dm.so.1.0: cannot
++ # open shared object file: No such file or directory
++ # Hence we need to jump through some hoops to expose LD_LIBRARY_PATH to
++ # the invoked python process:
++ LD_LIBRARY_PATH = os.environ.get('LD_LIBRARY_PATH', '')
++ if LD_LIBRARY_PATH:
++ pythoncmd = 'env LD_LIBRARY_PATH=%s ' % LD_LIBRARY_PATH + pythoncmd
++
++ return invoke_systemtap_script(script, pythoncmd)
++
++# When using the static markers, we need to supply the prefix of a systemtap
++# dotted probe point that containing the marker.
++# See
http://sourceware.org/systemtap/langref/Probe_points.html
++#
++# We need to determine if this is a shared-library build
++#
++# Note that sysconfig can get this wrong; see:
++#
http://bugs.python.org/issue14774
++#
++if '--enable-shared' in sysconfig.get_config_var('CONFIG_ARGS'):
++ # For a shared-library build, the markers are in library(INSTSONAME):
++ INSTSONAME = sysconfig.get_config_var('INSTSONAME')
++ probe_prefix = 'process("%s").library("%s")' %
(sys.executable, INSTSONAME)
++else:
++ # For a non-shared-library build, we can simply use sys.executable:
++ probe_prefix = 'process("%s")' % sys.executable
++
++# The following script ought to generate lots of lines showing recursive
++# function entry and return, of the form:
++# 11408 python(8274): => __contains__ in Lib/_abcoll.py:362
++# 11414 python(8274): => __getitem__ in Lib/os.py:425
++# 11418 python(8274): => encode in Lib/os.py:490
++# 11424 python(8274): <= encode in Lib/os.py:493
++# 11428 python(8274): <= __getitem__ in Lib/os.py:426
++# 11433 python(8274): <= __contains__ in Lib/_abcoll.py:366
++# where the column are:
++# - time in microseconds since start of script
++# - name of executable
++# - PID of process
++# and the remainder indicates the call/return hierarchy
++
++hierarchy_script = ('''
++probe %s.mark("function__entry") {
++ filename = user_string($arg1);
++ funcname = user_string($arg2);
++ lineno = $arg3;
++
++ printf("%%s => %%s in %%s:%%d\\n", thread_indent(1), funcname,
filename, lineno);
++}
++
++probe %s.mark("function__return") {
++ filename = user_string($arg1);
++ funcname = user_string($arg2);
++ lineno = $arg3;
++
++ printf("%%s <= %%s in %%s:%%d\\n", thread_indent(-1), funcname,
filename, lineno);
++}
++''' % (probe_prefix, probe_prefix)).encode('utf-8')
++
++
++class ErrorDumper:
++ # A context manager that dumps extra information if an exception is raised,
++ # to help track down why the problem occurred
++ def __init__(self, out, err):
++ self.out = out
++ self.err = err
++
++ def __enter__(self):
++ pass
++
++ def __exit__(self, type_, value, traceback):
++ if type_:
++ # an exception is being raised:
++ print('stdout: %s' % out.decode())
++ print('stderr: %s' % err.decode())
++
++class SystemtapTests(unittest.TestCase):
++
++ def test_invoking_python(self):
++ # Ensure that we can invoke python under stap, with a trivial stap
++ # script:
++ out, err = invoke_python_under_systemtap(
++ b'probe begin { println("hello from stap") exit () }',
++ pythoncode="print('hello from python')")
++ with ErrorDumper(out, err):
++ self.assertIn(b'hello from stap', out)
++ self.assertIn(b'hello from python', out)
++
++ def test_function_entry(self):
++ # Ensure that the function_entry static marker works
++ out, err = invoke_python_under_systemtap(hierarchy_script)
++ # stdout ought to contain various lines showing recursive function
++ # entry and return (see above)
++
++ # Uncomment this for debugging purposes:
++ # print(out.decode('utf-8'))
++
++ # Executing the cmdline-supplied "pass":
++ # 0 python(8274): => <module> in <string>:1
++ # 5 python(8274): <= <module> in <string>:1
++ with ErrorDumper(out, err):
++ self.assertIn(b'=> <module> in <string>:1', out,
++ msg="stdout: %s\nstderr: %s\n" % (out, err))
++
++ def test_encoding(self):
++ # Ensure that scripts and function names containing non-Latin 1 code
++ # points are handled:
++ pythonfile = TESTFN + '_.py'
++ try:
++ unlink(pythonfile)
++ f = open(pythonfile, "wb")
++ f.write("""
++# Sample script with non-ASCII filename, for use by test_systemtap.py
++# Implicitly UTF-8
++
++def ():
++ '''Function with non-ASCII identifier; I believe this reads
"mojibake"'''
++ print("hello world!")
++
++()
++""".encode('utf-8'))
++ f.close()
++
++ out, err = invoke_python_under_systemtap(hierarchy_script,
++ pythonfile=pythonfile)
++ out_utf8 = out.decode('utf-8')
++ with ErrorDumper(out, err):
++ self.assertIn('=> <module> in %s:5' % pythonfile,
out_utf8)
++ self.assertIn(' => in %s:5' % pythonfile, out_utf8)
++ self.assertIn(' <= in %s:7' % pythonfile, out_utf8)
++ self.assertIn('<= <module> in %s:9' % pythonfile,
out_utf8)
++ finally:
++ unlink(pythonfile)
++
++def test_main():
++ run_unittest(SystemtapTests)
++
++if __name__ == "__main__":
++ test_main()
+diff -up Python-3.3.0b1/Makefile.pre.in.systemtap Python-3.3.0b1/Makefile.pre.in
+--- Python-3.3.0b1/Makefile.pre.in.systemtap 2012-06-26 16:19:51.000000000 -0400
++++ Python-3.3.0b1/Makefile.pre.in 2012-07-20 13:05:39.216792095 -0400
+@@ -358,6 +358,7 @@ PYTHON_OBJS= \
Python/formatter_unicode.o \
Python/fileutils.o \
Python/$(DYNLOADFILE) \
-+ @DTRACEOBJS@ \
++ @SYSTEMTAPOBJS@ \
$(LIBOBJS) \
$(MACHDEP_OBJS) \
$(THREADOBJ)
-@@ -632,6 +633,18 @@ Objects/typeobject.o: $(srcdir)/Objects/
+@@ -708,7 +709,8 @@ Objects/setobject.o: $(srcdir)/Objects/s
+ $(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
+ $(OPCODETARGETGEN) $(OPCODETARGETS_H)
+
+-Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h
++Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h \
++ $(srcdir)/Python/ceval_systemtap.h @SYSTEMTAPDEPS@
+
+ Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
+ $(BYTESTR_DEPS)
+@@ -719,6 +721,13 @@ Objects/typeobject.o: $(srcdir)/Objects/
$(srcdir)/Objects/typeslots.inc: $(srcdir)/Include/typeslots.h
$(srcdir)/Objects/typeslots.py
$(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
$(srcdir)/Objects/typeslots.inc
-+# Only needed with --with-dtrace
-+buildinclude:
-+ mkdir -p Include
-+
-+Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
-+ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
++# Only needed with --with-systemtap; not a public header:
++$(srcdir)/Python/pysystemtap.h: $(srcdir)/Python/pysystemtap.d
++ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Python/pysystemtap.d
+
-+Python/ceval.o: Include/pydtrace.h
-+
-+Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
-+ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
++Python/pysystemtap.o: $(srcdir)/Python/pysystemtap.d Python/ceval.o
++ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Python/pysystemtap.d Python/ceval.o
+
############################################################################
# Header files
-@@ -1282,7 +1295,7 @@ Python/thread.o: @THREADHEADERS@
- .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
- .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
- .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
--.PHONY: smelly funny patchcheck
-+.PHONY: smelly funny patchcheck buildinclude
- .PHONY: gdbhooks
-
- # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
-diff -up Python-3.2b2/pyconfig.h.in.systemtap Python-3.2b2/pyconfig.h.in
---- Python-3.2b2/pyconfig.h.in.systemtap 2010-11-20 05:29:12.000000000 -0500
-+++ Python-3.2b2/pyconfig.h.in 2010-12-28 16:58:41.765937360 -0500
-@@ -1092,6 +1092,9 @@
- /* Define if you want documentation strings in extension modules */
- #undef WITH_DOC_STRINGS
-
-+/* Define if you want to compile in Dtrace support */
-+#undef WITH_DTRACE
-+
- /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
- linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
- Dyld is necessary to support frameworks. */
-diff -up Python-3.2b2/Python/ceval.c.systemtap Python-3.2b2/Python/ceval.c
---- Python-3.2b2/Python/ceval.c.systemtap 2010-12-03 15:14:31.000000000 -0500
-+++ Python-3.2b2/Python/ceval.c 2010-12-28 16:58:41.768935588 -0500
-@@ -18,6 +18,10 @@
+@@ -1335,6 +1344,7 @@ clean: pycremoval
+ -rm -f Lib/lib2to3/*Grammar*.pickle
+ -rm -f $(SYSCONFIGDATA)
+ -rm -f Modules/_testembed Modules/_freeze_importlib
++ -rm -f $(srcdir)/Python/pysystemtap.h
+
+ profile-removal:
+ find . -name '*.gc??' -exec rm -f {} ';'
+diff -up Python-3.3.0b1/Misc/NEWS.systemtap Python-3.3.0b1/Misc/NEWS
+--- Python-3.3.0b1/Misc/NEWS.systemtap 2012-06-26 16:19:51.000000000 -0400
++++ Python-3.3.0b1/Misc/NEWS 2012-07-20 13:05:39.217792083 -0400
+@@ -55,6 +55,11 @@ Core and Builtins
+
+ - Issue #15038: Optimize python Locks on Windows.
+
++- Issue #14776: Added a new --with-systemtap configure-time option, which adds
++ static markers for SystemTap so that SystemTap scripts can observe bytecode
++ frames being entered and exited and so generate reports on what Python code
++ is being exectuted.
++
+ Library
+ -------
+
+diff -up Python-3.3.0b1/pyconfig.h.in.systemtap Python-3.3.0b1/pyconfig.h.in
+--- Python-3.3.0b1/pyconfig.h.in.systemtap 2012-06-26 16:19:58.000000000 -0400
++++ Python-3.3.0b1/pyconfig.h.in 2012-07-20 13:05:39.222792020 -0400
+@@ -1306,6 +1306,9 @@
+ /* Define if you want to compile in Python-specific mallocs */
+ #undef WITH_PYMALLOC
+
++/* Define if you want to compile in SystemTap support */
++#undef WITH_SYSTEMTAP
++
+ /* Define if you want to compile in rudimentary thread support */
+ #undef WITH_THREAD
+
+diff -up Python-3.3.0b1/Python/ceval.c.systemtap Python-3.3.0b1/Python/ceval.c
+--- Python-3.3.0b1/Python/ceval.c.systemtap 2012-06-26 16:19:56.000000000 -0400
++++ Python-3.3.0b1/Python/ceval.c 2012-07-20 13:05:39.218792070 -0400
+@@ -18,6 +18,8 @@
#include <ctype.h>
-+#ifdef WITH_DTRACE
-+#include "pydtrace.h"
-+#endif
++#include "ceval_systemtap.h"
+
#ifndef WITH_TSC
#define READ_TIMESTAMP(var)
-@@ -766,6 +770,70 @@ PyEval_EvalCode(PyObject *co, PyObject *
- }
+@@ -1160,6 +1162,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
+ }
+ }
++ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
++ systemtap_function_entry(f);
++ }
++
+ co = f->f_code;
+ names = co->co_names;
+ consts = co->co_consts;
+@@ -3077,6 +3083,11 @@ fast_yield:
-+#ifdef WITH_DTRACE
+ /* pop frame */
+ exit_eval_frame:
++
++ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
++ systemtap_function_return(f);
++ }
++
+ Py_LeaveRecursiveCall();
+ tstate->frame = f->f_back;
+
+diff -up Python-3.3.0b1/Python/ceval_systemtap.h.systemtap
Python-3.3.0b1/Python/ceval_systemtap.h
+--- Python-3.3.0b1/Python/ceval_systemtap.h.systemtap 2012-07-20 13:05:39.218792070
-0400
++++ Python-3.3.0b1/Python/ceval_systemtap.h 2012-07-20 13:05:39.218792070 -0400
+@@ -0,0 +1,86 @@
++/*
++ Support for SystemTap static markers
++*/
++
++#ifdef WITH_SYSTEMTAP
++
++#include "pysystemtap.h"
++
++/*
++ A struct to hold all of the information gathered when one of the traceable
++ markers is triggered
++*/
+struct frame_marker_info
+{
-+ char *filename;
-+ char *name;
-+ int lineno;
-+
-+ PyObject *utf8_filename;
-+ PyObject *utf8_name;
++ PyObject *filename_obj;
++ PyObject *funcname_obj;
++ const char *filename;
++ const char *funcname;
++ int lineno;
+};
+
+static void
+get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
+{
-+ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
-+ if (fmi->utf8_filename) {
-+ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
-+ } else {
-+ fmi->filename = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
-+ if (fmi->utf8_name) {
-+ fmi->name = PyBytes_AsString(fmi->utf8_name);
-+ } else {
-+ fmi->name = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
++ PyObject *ptype;
++ PyObject *pvalue;
++ PyObject *ptraceback;
++
++ PyErr_Fetch(&ptype, &pvalue, &ptraceback);
++
++ fmi->filename_obj = PyUnicode_EncodeFSDefault(f->f_code->co_filename);
++ if (fmi->filename_obj) {
++ fmi->filename = PyBytes_AsString(fmi->filename_obj);
++ } else {
++ fmi->filename = NULL;
++ }
++
++ fmi->funcname_obj = PyUnicode_AsUTF8String(f->f_code->co_name);
++ if (fmi->funcname_obj) {
++ fmi->funcname = PyBytes_AsString(fmi->funcname_obj);
++ } else {
++ fmi->funcname = NULL;
++ }
++
++ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
++
++ PyErr_Restore(ptype, pvalue, ptraceback);
++
+}
+
+static void
+release_frame_marker_info(struct frame_marker_info *fmi)
+{
-+ Py_XDECREF(fmi->utf8_filename);
-+ Py_XDECREF(fmi->utf8_name);
++ Py_XDECREF(fmi->filename_obj);
++ Py_XDECREF(fmi->funcname_obj);
+}
+
+static void
-+dtrace_entry(PyFrameObject *f)
++systemtap_function_entry(PyFrameObject *f)
+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.funcname, fmi.lineno, f);
++ release_frame_marker_info(&fmi);
+}
+
+static void
-+dtrace_return(PyFrameObject *f)
++systemtap_function_return(PyFrameObject *f)
+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.funcname, fmi.lineno, f);
++ release_frame_marker_info(&fmi);
+}
-+#else
-+#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
-+#define PYTHON_FUNCTION_RETURN_ENABLED() 0
-+#define dtrace_entry(f)
-+#define dtrace_return(f)
-+#endif
-+
- /* Interpreter main loop */
-
- PyObject *
-@@ -1183,6 +1251,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
- }
- }
-
-+ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
-+ dtrace_entry(f);
-+ }
+
- co = f->f_code;
- names = co->co_names;
- consts = co->co_consts;
-@@ -3048,6 +3120,9 @@ fast_yield:
-
- /* pop frame */
- exit_eval_frame:
-+ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
-+ dtrace_return(f);
-+ }
- Py_LeaveRecursiveCall();
- tstate->frame = f->f_back;
-
++#else /* #ifdef WITH_SYSTEMTAP */
++
++/*
++ When configured --without-systemtap, everything compiles away to nothing:
++*/
++#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
++#define PYTHON_FUNCTION_RETURN_ENABLED() 0
++#define systemtap_function_entry(f)
++#define systemtap_function_return(f)
++
++#endif
+diff -up Python-3.3.0b1/Python/pysystemtap.d.systemtap
Python-3.3.0b1/Python/pysystemtap.d
+--- Python-3.3.0b1/Python/pysystemtap.d.systemtap 2012-07-20 13:05:39.218792070 -0400
++++ Python-3.3.0b1/Python/pysystemtap.d 2012-07-20 13:05:39.218792070 -0400
+@@ -0,0 +1,4 @@
++provider python {
++ probe function__entry(const char *, const char *, int, PyFrameObject *);
++ probe function__return(const char *, const char *, int, PyFrameObject *);
++};
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
index 3a6ac8a..8ba0fd7 100644
--- a/00111-no-static-lib.patch
+++ b/00111-no-static-lib.patch
@@ -1,7 +1,7 @@
-diff -up Python-3.2.1/Makefile.pre.in.no-static-lib Python-3.2.1/Makefile.pre.in
---- Python-3.2.1/Makefile.pre.in.no-static-lib 2011-07-09 02:58:52.000000000 -0400
-+++ Python-3.2.1/Makefile.pre.in 2011-07-11 11:46:27.381425999 -0400
-@@ -425,7 +425,7 @@ coverage:
+diff -up Python-3.3.0b1/Makefile.pre.in.no-static-lib Python-3.3.0b1/Makefile.pre.in
+--- Python-3.3.0b1/Makefile.pre.in.no-static-lib 2012-07-20 13:20:34.056605058 -0400
++++ Python-3.3.0b1/Makefile.pre.in 2012-07-20 13:21:41.540761389 -0400
+@@ -458,7 +458,7 @@ coverage:
# Build the interpreter
@@ -9,8 +9,8 @@ diff -up Python-3.2.1/Makefile.pre.in.no-static-lib
Python-3.2.1/Makefile.pre.in
+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
- platform: $(BUILDPYTHON)
-@@ -439,18 +439,6 @@ sharedmods: $(BUILDPYTHON)
+ platform: $(BUILDPYTHON) $(SYSCONFIGDATA)
+@@ -475,18 +475,6 @@ sharedmods: $(BUILDPYTHON) $(SYSCONFIGDA
*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
esac
@@ -21,7 +21,7 @@ diff -up Python-3.2.1/Makefile.pre.in.no-static-lib
Python-3.2.1/Makefile.pre.in
- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
-- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS) Python/frozen.o
- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
- $(AR) $(ARFLAGS) $@ $(MODOBJS)
- $(RANLIB) $@
@@ -29,7 +29,7 @@ diff -up Python-3.2.1/Makefile.pre.in.no-static-lib
Python-3.2.1/Makefile.pre.in
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
if test $(INSTSONAME) != $(LDLIBRARY); then \
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -540,7 +528,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
+@@ -576,7 +564,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
echo "-----------------------------------------------"; \
fi
@@ -38,7 +38,7 @@ diff -up Python-3.2.1/Makefile.pre.in.no-static-lib
Python-3.2.1/Makefile.pre.in
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
############################################################################
-@@ -1058,18 +1046,6 @@ libainstall: all python-config
+@@ -1150,18 +1138,6 @@ libainstall: all python-config
else true; \
fi; \
done
diff --git a/00113-more-configuration-flags.patch b/00113-more-configuration-flags.patch
index 24df543..1067af1 100644
--- a/00113-more-configuration-flags.patch
+++ b/00113-more-configuration-flags.patch
@@ -1,7 +1,7 @@
-diff -up Python-3.1.2/configure.in.more-configuration-flags Python-3.1.2/configure.in
---- Python-3.1.2/configure.in.more-configuration-flags 2010-05-25 12:16:48.602875960
-0400
-+++ Python-3.1.2/configure.in 2010-05-25 12:16:48.609879553 -0400
-@@ -2443,6 +2443,30 @@ else AC_MSG_RESULT(no)
+diff -up Python-3.3.0b1/configure.ac.more-configuration-flags
Python-3.3.0b1/configure.ac
+--- Python-3.3.0b1/configure.ac.more-configuration-flags 2012-07-20 13:25:33.232864839
-0400
++++ Python-3.3.0b1/configure.ac 2012-07-20 13:25:33.314863815 -0400
+@@ -2585,6 +2585,30 @@ else AC_MSG_RESULT(no)
fi],
[AC_MSG_RESULT(no)])
@@ -32,12 +32,12 @@ diff -up Python-3.1.2/configure.in.more-configuration-flags
Python-3.1.2/configu
# Check for Python-specific malloc support
AC_MSG_CHECKING(for --with-pymalloc)
AC_ARG_WITH(pymalloc,
-diff -up Python-3.1.2/pyconfig.h.in.more-configuration-flags Python-3.1.2/pyconfig.h.in
---- Python-3.1.2/pyconfig.h.in.more-configuration-flags 2010-05-25 12:16:48.000000000
-0400
-+++ Python-3.1.2/pyconfig.h.in 2010-05-25 12:17:54.428126399 -0400
-@@ -18,6 +18,12 @@
- /* Define if you have the Mach cthreads package */
- #undef C_THREADS
+diff -up Python-3.3.0b1/pyconfig.h.in.more-configuration-flags
Python-3.3.0b1/pyconfig.h.in
+--- Python-3.3.0b1/pyconfig.h.in.more-configuration-flags 2012-07-20 13:25:33.000000000
-0400
++++ Python-3.3.0b1/pyconfig.h.in 2012-07-20 13:26:02.826494869 -0400
+@@ -12,6 +12,12 @@
+ support for AIX C++ shared extension modules. */
+ #undef AIX_GENUINE_CPLUSPLUS
+/* Define to keep records on function call invocation */
+#undef CALL_PROFILE
diff --git a/00114-statvfs-f_flag-constants.patch b/00114-statvfs-f_flag-constants.patch
index b666c1b..af0d780 100644
--- a/00114-statvfs-f_flag-constants.patch
+++ b/00114-statvfs-f_flag-constants.patch
@@ -1,18 +1,10 @@
-diff -up Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants
Python-3.2a1/Modules/posixmodule.c
---- Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants 2010-07-23
09:53:51.000000000 -0400
-+++ Python-3.2a1/Modules/posixmodule.c 2010-08-02 16:39:38.756000423 -0400
-@@ -8173,6 +8173,43 @@ all_ins(PyObject *d)
- #endif
- #endif
+diff -up Python-3.3.0b1/Modules/posixmodule.c.statvfs-f_flag-constants
Python-3.3.0b1/Modules/posixmodule.c
+--- Python-3.3.0b1/Modules/posixmodule.c.statvfs-f_flag-constants 2012-06-26
16:19:54.000000000 -0400
++++ Python-3.3.0b1/Modules/posixmodule.c 2012-07-20 13:39:18.595546387 -0400
+@@ -11665,6 +11665,35 @@ all_ins(PyObject *d)
+ if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
+ #endif /* ST_NOSUID */
-+ /* These came from statvfs.h */
-+#ifdef ST_RDONLY
-+ if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1;
-+#endif /* ST_RDONLY */
-+#ifdef ST_NOSUID
-+ if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
-+#endif /* ST_NOSUID */
-+
+ /* GNU extensions */
+#ifdef ST_NODEV
+ if (ins(d, "ST_NODEV", (long)ST_NODEV)) return -1;
@@ -42,6 +34,6 @@ diff -up Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants
Python-3.2a
+ if (ins(d, "ST_RELATIME", (long)ST_RELATIME)) return -1;
+#endif /* ST_RELATIME */
+
- #if defined(PYOS_OS2)
- if (insertvalues(d)) return -1;
- #endif
+ /* FreeBSD sendfile() constants */
+ #ifdef SF_NODISKIO
+ if (ins(d, "SF_NODISKIO", (long)SF_NODISKIO)) return -1;
diff --git a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
index c1871ac..18549cb 100644
--- a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+++ b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
@@ -1,13 +1,13 @@
-diff -up Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_sys.py
---- Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS 2010-12-28
20:52:43.236310184 -0500
-+++ Python-3.2b2/Lib/test/test_sys.py 2010-12-28 20:58:09.164184094 -0500
-@@ -817,6 +817,9 @@ class SizeofTest(unittest.TestCase):
- # (PyTypeObject + PyNumberMethods + PyMappingMethods +
- # PySequenceMethods + PyBufferProcs)
- s = size(vh + 'P2P15Pl4PP9PP11PI') + size('16Pi17P 3P 10P 2P
2P')
+diff -up Python-3.3.0b1/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys
Python-3.3.0b1/Lib/test/test_sys.py
+--- Python-3.3.0b1/Lib/test/test_sys.py.fix-COUNT_ALLOCS-failure-in-test_sys 2012-06-26
16:19:48.000000000 -0400
++++ Python-3.3.0b1/Lib/test/test_sys.py 2012-07-20 13:44:23.050740172 -0400
+@@ -869,6 +869,9 @@ class SizeofTest(unittest.TestCase):
+ s = size(vh + 'P2P15Pl4PP9PP11PI') + size('34P 3P 10P 2P 4P')
+ # Separate block for PyDictKeysObject with 4 entries
+ s += size("PPPP") + 4*size("PPP")
+ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
+ if hasattr(sys, 'getcounts'):
+ s += size('3P2P')
- check(int, s)
# class
class newstyleclass(object): pass
+ check(newstyleclass, s)
diff --git a/00147-add-debug-malloc-stats.patch b/00147-add-debug-malloc-stats.patch
deleted file mode 100644
index e2a8342..0000000
--- a/00147-add-debug-malloc-stats.patch
+++ /dev/null
@@ -1,590 +0,0 @@
-diff -up Python-3.2.2/Include/dictobject.h.add-debug-malloc-stats
Python-3.2.2/Include/dictobject.h
---- Python-3.2.2/Include/dictobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Include/dictobject.h 2011-09-16 18:57:24.969825060 -0400
-@@ -156,6 +156,8 @@ PyAPI_FUNC(PyObject *) PyDict_GetItemStr
- PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item);
- PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key);
-
-+PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out);
-+
- #ifdef __cplusplus
- }
- #endif
-diff -up Python-3.2.2/Include/floatobject.h.add-debug-malloc-stats
Python-3.2.2/Include/floatobject.h
---- Python-3.2.2/Include/floatobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Include/floatobject.h 2011-09-16 18:57:24.970825060 -0400
-@@ -110,6 +110,8 @@ PyAPI_FUNC(double) _PyFloat_Unpack8(cons
- /* free list api */
- PyAPI_FUNC(int) PyFloat_ClearFreeList(void);
-
-+PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out);
-+
- /* Format the object based on the format_spec, as defined in PEP 3101
- (Advanced String Formatting). */
- PyAPI_FUNC(PyObject *) _PyFloat_FormatAdvanced(PyObject *obj,
-diff -up Python-3.2.2/Include/frameobject.h.add-debug-malloc-stats
Python-3.2.2/Include/frameobject.h
---- Python-3.2.2/Include/frameobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Include/frameobject.h 2011-09-16 18:57:24.970825060 -0400
-@@ -79,6 +79,8 @@ PyAPI_FUNC(void) PyFrame_FastToLocals(Py
-
- PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
-
-+PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out);
-+
- /* Return the line of code the frame is currently executing. */
- PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *);
-
-diff -up Python-3.2.2/Include/listobject.h.add-debug-malloc-stats
Python-3.2.2/Include/listobject.h
---- Python-3.2.2/Include/listobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Include/listobject.h 2011-09-16 18:57:24.971825060 -0400
-@@ -71,6 +71,8 @@ PyAPI_FUNC(PyObject *) _PyList_Extend(Py
- #define PyList_GET_SIZE(op) Py_SIZE(op)
- #endif
-
-+PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out);
-+
- #ifdef __cplusplus
- }
- #endif
-diff -up Python-3.2.2/Include/methodobject.h.add-debug-malloc-stats
Python-3.2.2/Include/methodobject.h
---- Python-3.2.2/Include/methodobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Include/methodobject.h 2011-09-16 18:57:24.971825060 -0400
-@@ -81,6 +81,10 @@ typedef struct {
-
- PyAPI_FUNC(int) PyCFunction_ClearFreeList(void);
-
-+PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out);
-+PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out);
-+
-+
- #ifdef __cplusplus
- }
- #endif
-diff -up Python-3.2.2/Include/object.h.add-debug-malloc-stats
Python-3.2.2/Include/object.h
---- Python-3.2.2/Include/object.h.add-debug-malloc-stats 2011-09-03 12:16:40.000000000
-0400
-+++ Python-3.2.2/Include/object.h 2011-09-16 18:57:24.972825060 -0400
-@@ -919,6 +919,13 @@ PyAPI_DATA(PyObject *) _PyTrash_delete_l
- else \
- _PyTrash_deposit_object((PyObject*)op);
-
-+PyAPI_FUNC(void)
-+_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks,
-+ size_t sizeof_block);
-+
-+PyAPI_FUNC(void)
-+_PyObject_DebugTypeStats(FILE *out);
-+
- #ifdef __cplusplus
- }
- #endif
-diff -up Python-3.2.2/Include/objimpl.h.add-debug-malloc-stats
Python-3.2.2/Include/objimpl.h
---- Python-3.2.2/Include/objimpl.h.add-debug-malloc-stats 2011-09-03 12:16:40.000000000
-0400
-+++ Python-3.2.2/Include/objimpl.h 2011-09-16 18:57:24.972825060 -0400
-@@ -101,13 +101,13 @@ PyAPI_FUNC(void) PyObject_Free(void *);
-
- /* Macros */
- #ifdef WITH_PYMALLOC
-+PyAPI_FUNC(void) _PyObject_DebugMallocStats(FILE *out);
- #ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */
- PyAPI_FUNC(void *) _PyObject_DebugMalloc(size_t nbytes);
- PyAPI_FUNC(void *) _PyObject_DebugRealloc(void *p, size_t nbytes);
- PyAPI_FUNC(void) _PyObject_DebugFree(void *p);
- PyAPI_FUNC(void) _PyObject_DebugDumpAddress(const void *p);
- PyAPI_FUNC(void) _PyObject_DebugCheckAddress(const void *p);
--PyAPI_FUNC(void) _PyObject_DebugMallocStats(void);
- PyAPI_FUNC(void *) _PyObject_DebugMallocApi(char api, size_t nbytes);
- PyAPI_FUNC(void *) _PyObject_DebugReallocApi(char api, void *p, size_t nbytes);
- PyAPI_FUNC(void) _PyObject_DebugFreeApi(char api, void *p);
-diff -up Python-3.2.2/Include/setobject.h.add-debug-malloc-stats
Python-3.2.2/Include/setobject.h
---- Python-3.2.2/Include/setobject.h.add-debug-malloc-stats 2011-09-16 19:10:58.448817301
-0400
-+++ Python-3.2.2/Include/setobject.h 2011-09-16 19:12:16.343816559 -0400
-@@ -101,6 +101,8 @@ PyAPI_FUNC(PyObject *) PySet_Pop(PyObjec
- PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable);
- #endif
-
-+PyAPI_FUNC(void) _PySet_DebugMallocStats(FILE *out);
-+
- #ifdef __cplusplus
- }
- #endif
-diff -up Python-3.2.2/Include/tupleobject.h.add-debug-malloc-stats
Python-3.2.2/Include/tupleobject.h
---- Python-3.2.2/Include/tupleobject.h.add-debug-malloc-stats 2011-09-16
19:10:45.540817425 -0400
-+++ Python-3.2.2/Include/tupleobject.h 2011-09-16 19:12:41.446816320 -0400
-@@ -63,6 +63,7 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(P
- #endif
-
- PyAPI_FUNC(int) PyTuple_ClearFreeList(void);
-+PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out);
-
- #ifdef __cplusplus
- }
-diff -up Python-3.2.2/Include/unicodeobject.h.add-debug-malloc-stats
Python-3.2.2/Include/unicodeobject.h
---- Python-3.2.2/Include/unicodeobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Include/unicodeobject.h 2011-09-16 18:57:24.973825060 -0400
-@@ -1670,6 +1670,8 @@ PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnic
- );
- #endif /* Py_LIMITED_API */
-
-+PyAPI_FUNC(void) _PyUnicode_DebugMallocStats(FILE *out);
-+
- #ifdef __cplusplus
- }
- #endif
-diff -up Python-3.2.2/Lib/test/test_sys.py.add-debug-malloc-stats
Python-3.2.2/Lib/test/test_sys.py
---- Python-3.2.2/Lib/test/test_sys.py.add-debug-malloc-stats 2011-09-16
18:57:24.940825060 -0400
-+++ Python-3.2.2/Lib/test/test_sys.py 2011-09-16 19:23:50.415809940 -0400
-@@ -564,6 +564,18 @@ class SysModuleTest(unittest.TestCase):
- expected = None
- self.check_fsencoding(fs_encoding, expected)
-
-+ def test_debugmallocstats(self):
-+ # Test sys._debugmallocstats()
-+
-+ import subprocess
-+
-+ # Verify writing to stderr:
-+ p = subprocess.Popen([sys.executable,
-+ '-c', 'import sys;
sys._debugmallocstats()'],
-+ stderr=subprocess.PIPE)
-+ out, err = p.communicate()
-+ p.wait()
-+ self.assertIn(b"arenas allocated current", err)
-
- class SizeofTest(unittest.TestCase):
-
-diff -up Python-3.2.2/Objects/classobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/classobject.c
---- Python-3.2.2/Objects/classobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/classobject.c 2011-09-16 18:57:24.975825060 -0400
-@@ -399,6 +399,15 @@ PyMethod_Fini(void)
- (void)PyMethod_ClearFreeList();
- }
-
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PyMethod_DebugMallocStats(FILE *out)
-+{
-+ _PyDebugAllocatorStats(out,
-+ "free PyMethodObject",
-+ numfree, sizeof(PyMethodObject));
-+}
-+
- /* ------------------------------------------------------------------------
- * instance method
- */
-diff -up Python-3.2.2/Objects/dictobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/dictobject.c
---- Python-3.2.2/Objects/dictobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/dictobject.c 2011-09-16 18:57:24.976825060 -0400
-@@ -217,6 +217,15 @@ show_track(void)
- static PyDictObject *free_list[PyDict_MAXFREELIST];
- static int numfree = 0;
-
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PyDict_DebugMallocStats(FILE *out)
-+{
-+ _PyDebugAllocatorStats(out,
-+ "free PyDictObject", numfree,
sizeof(PyDictObject));
-+}
-+
-+
- void
- PyDict_Fini(void)
- {
-diff -up Python-3.2.2/Objects/floatobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/floatobject.c
---- Python-3.2.2/Objects/floatobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/floatobject.c 2011-09-16 18:57:24.981825060 -0400
-@@ -50,6 +50,22 @@ typedef struct _floatblock PyFloatBlock;
- static PyFloatBlock *block_list = NULL;
- static PyFloatObject *free_list = NULL;
-
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PyFloat_DebugMallocStats(FILE *out)
-+{
-+ int num_blocks = 0;
-+ PyFloatBlock *block;
-+
-+ /* Walk the block list, counting */
-+ for (block = block_list; block ; block = block->next) {
-+ num_blocks++;
-+ }
-+
-+ _PyDebugAllocatorStats(out,
-+ "PyFloatBlock", num_blocks, sizeof(PyFloatBlock));
-+}
-+
- static PyFloatObject *
- fill_free_list(void)
- {
-diff -up Python-3.2.2/Objects/frameobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/frameobject.c
---- Python-3.2.2/Objects/frameobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/frameobject.c 2011-09-16 18:57:24.982825060 -0400
-@@ -953,3 +953,13 @@ PyFrame_Fini(void)
- Py_XDECREF(builtin_object);
- builtin_object = NULL;
- }
-+
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PyFrame_DebugMallocStats(FILE *out)
-+{
-+ _PyDebugAllocatorStats(out,
-+ "free PyFrameObject",
-+ numfree, sizeof(PyFrameObject));
-+}
-+
-diff -up Python-3.2.2/Objects/listobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/listobject.c
---- Python-3.2.2/Objects/listobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/listobject.c 2011-09-16 18:57:24.983825060 -0400
-@@ -109,6 +109,15 @@ PyList_Fini(void)
- }
- }
-
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PyList_DebugMallocStats(FILE *out)
-+{
-+ _PyDebugAllocatorStats(out,
-+ "free PyListObject",
-+ numfree, sizeof(PyListObject));
-+}
-+
- PyObject *
- PyList_New(Py_ssize_t size)
- {
-diff -up Python-3.2.2/Objects/methodobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/methodobject.c
---- Python-3.2.2/Objects/methodobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/methodobject.c 2011-09-16 18:57:24.983825060 -0400
-@@ -303,6 +303,15 @@ PyCFunction_Fini(void)
- (void)PyCFunction_ClearFreeList();
- }
-
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PyCFunction_DebugMallocStats(FILE *out)
-+{
-+ _PyDebugAllocatorStats(out,
-+ "free PyCFunction",
-+ numfree, sizeof(PyCFunction));
-+}
-+
- /* PyCFunction_New() is now just a macro that calls PyCFunction_NewEx(),
- but it's part of the API so we need to keep a function around that
- existing C extensions can call.
-diff -up Python-3.2.2/Objects/object.c.add-debug-malloc-stats
Python-3.2.2/Objects/object.c
---- Python-3.2.2/Objects/object.c.add-debug-malloc-stats 2011-09-03 12:16:47.000000000
-0400
-+++ Python-3.2.2/Objects/object.c 2011-09-16 19:04:20.351821098 -0400
-@@ -1781,6 +1781,19 @@ PyMem_Free(void *p)
- PyMem_FREE(p);
- }
-
-+void
-+_PyObject_DebugTypeStats(FILE *out)
-+{
-+ _PyCFunction_DebugMallocStats(out);
-+ _PyDict_DebugMallocStats(out);
-+ _PyFloat_DebugMallocStats(out);
-+ _PyFrame_DebugMallocStats(out);
-+ _PyList_DebugMallocStats(out);
-+ _PyMethod_DebugMallocStats(out);
-+ _PySet_DebugMallocStats(out);
-+ _PyTuple_DebugMallocStats(out);
-+ _PyUnicode_DebugMallocStats(out);
-+}
-
- /* These methods are used to control infinite recursion in repr, str, print,
- etc. Container objects that may recursively contain themselves,
-diff -up Python-3.2.2/Objects/obmalloc.c.add-debug-malloc-stats
Python-3.2.2/Objects/obmalloc.c
---- Python-3.2.2/Objects/obmalloc.c.add-debug-malloc-stats 2011-09-03 12:16:47.000000000
-0400
-+++ Python-3.2.2/Objects/obmalloc.c 2011-09-16 18:57:24.985825060 -0400
-@@ -508,12 +508,10 @@ static struct arena_object* usable_arena
- /* Number of arenas allocated that haven't been free()'d. */
- static size_t narenas_currently_allocated = 0;
-
--#ifdef PYMALLOC_DEBUG
- /* Total number of times malloc() called to allocate an arena. */
- static size_t ntimes_arena_allocated = 0;
- /* High water mark (max value ever seen) for narenas_currently_allocated. */
- static size_t narenas_highwater = 0;
--#endif
-
- /* Allocate a new arena. If we run out of memory, return NULL. Else
- * allocate a new arena, and return the address of an arena_object
-@@ -528,7 +526,7 @@ new_arena(void)
-
- #ifdef PYMALLOC_DEBUG
- if (Py_GETENV("PYTHONMALLOCSTATS"))
-- _PyObject_DebugMallocStats();
-+ _PyObject_DebugMallocStats(stderr);
- #endif
- if (unused_arena_objects == NULL) {
- uint i;
-@@ -588,11 +586,9 @@ new_arena(void)
- }
-
- ++narenas_currently_allocated;
--#ifdef PYMALLOC_DEBUG
- ++ntimes_arena_allocated;
- if (narenas_currently_allocated > narenas_highwater)
- narenas_highwater = narenas_currently_allocated;
--#endif
- arenaobj->freepools = NULL;
- /* pool_address <- first pool-aligned address in the arena
- nfreepools <- number of whole pools that fit after alignment */
-@@ -1694,17 +1690,19 @@ _PyObject_DebugDumpAddress(const void *p
- }
- }
-
-+#endif /* PYMALLOC_DEBUG */
-+
- static size_t
--printone(const char* msg, size_t value)
-+printone(FILE *out, const char* msg, size_t value)
- {
- int i, k;
- char buf[100];
- size_t origvalue = value;
-
-- fputs(msg, stderr);
-+ fputs(msg, out);
- for (i = (int)strlen(msg); i < 35; ++i)
-- fputc(' ', stderr);
-- fputc('=', stderr);
-+ fputc(' ', out);
-+ fputc('=', out);
-
- /* Write the value with commas. */
- i = 22;
-@@ -1725,17 +1723,32 @@ printone(const char* msg, size_t value)
-
- while (i >= 0)
- buf[i--] = ' ';
-- fputs(buf, stderr);
-+ fputs(buf, out);
-
- return origvalue;
- }
-
--/* Print summary info to stderr about the state of pymalloc's structures.
-+void
-+_PyDebugAllocatorStats(FILE *out,
-+ const char *block_name, int num_blocks, size_t sizeof_block)
-+{
-+ char buf1[128];
-+ char buf2[128];
-+ PyOS_snprintf(buf1, sizeof(buf1),
-+ "%d %ss * %zd bytes each",
-+ num_blocks, block_name, sizeof_block);
-+ PyOS_snprintf(buf2, sizeof(buf2),
-+ "%48s ", buf1);
-+ (void)printone(out, buf2, num_blocks * sizeof_block);
-+}
-+
-+
-+/* Print summary info to "out" about the state of pymalloc's structures.
- * In Py_DEBUG mode, also perform some expensive internal consistency
- * checks.
- */
- void
--_PyObject_DebugMallocStats(void)
-+_PyObject_DebugMallocStats(FILE *out)
- {
- uint i;
- const uint numclasses = SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT;
-@@ -1764,7 +1777,7 @@ _PyObject_DebugMallocStats(void)
- size_t total;
- char buf[128];
-
-- fprintf(stderr, "Small block threshold = %d, in %u size classes.\n",
-+ fprintf(out, "Small block threshold = %d, in %u size classes.\n",
- SMALL_REQUEST_THRESHOLD, numclasses);
-
- for (i = 0; i < numclasses; ++i)
-@@ -1820,10 +1833,10 @@ _PyObject_DebugMallocStats(void)
- }
- assert(narenas == narenas_currently_allocated);
-
-- fputc('\n', stderr);
-+ fputc('\n', out);
- fputs("class size num pools blocks in use avail blocks\n"
- "----- ---- --------- ------------- ------------\n",
-- stderr);
-+ out);
-
- for (i = 0; i < numclasses; ++i) {
- size_t p = numpools[i];
-@@ -1834,7 +1847,7 @@ _PyObject_DebugMallocStats(void)
- assert(b == 0 && f == 0);
- continue;
- }
-- fprintf(stderr, "%5u %6u "
-+ fprintf(out, "%5u %6u "
- "%11" PY_FORMAT_SIZE_T "u "
- "%15" PY_FORMAT_SIZE_T "u "
- "%13" PY_FORMAT_SIZE_T "u\n",
-@@ -1844,36 +1857,35 @@ _PyObject_DebugMallocStats(void)
- pool_header_bytes += p * POOL_OVERHEAD;
- quantization += p * ((POOL_SIZE - POOL_OVERHEAD) % size);
- }
-- fputc('\n', stderr);
-- (void)printone("# times object malloc called", serialno);
--
-- (void)printone("# arenas allocated total", ntimes_arena_allocated);
-- (void)printone("# arenas reclaimed", ntimes_arena_allocated - narenas);
-- (void)printone("# arenas highwater mark", narenas_highwater);
-- (void)printone("# arenas allocated current", narenas);
-+ fputc('\n', out);
-+#ifdef PYMALLOC_DEBUG
-+ (void)printone(out, "# times object malloc called", serialno);
-+#endif
-+ (void)printone(out, "# arenas allocated total", ntimes_arena_allocated);
-+ (void)printone(out, "# arenas reclaimed", ntimes_arena_allocated -
narenas);
-+ (void)printone(out, "# arenas highwater mark", narenas_highwater);
-+ (void)printone(out, "# arenas allocated current", narenas);
-
- PyOS_snprintf(buf, sizeof(buf),
- "%" PY_FORMAT_SIZE_T "u arenas * %d bytes/arena",
- narenas, ARENA_SIZE);
-- (void)printone(buf, narenas * ARENA_SIZE);
-+ (void)printone(out, buf, narenas * ARENA_SIZE);
-
-- fputc('\n', stderr);
-+ fputc('\n', out);
-
-- total = printone("# bytes in allocated blocks", allocated_bytes);
-- total += printone("# bytes in available blocks", available_bytes);
-+ total = printone(out, "# bytes in allocated blocks", allocated_bytes);
-+ total += printone(out, "# bytes in available blocks", available_bytes);
-
- PyOS_snprintf(buf, sizeof(buf),
- "%u unused pools * %d bytes", numfreepools, POOL_SIZE);
-- total += printone(buf, (size_t)numfreepools * POOL_SIZE);
-+ total += printone(out, buf, (size_t)numfreepools * POOL_SIZE);
-
-- total += printone("# bytes lost to pool headers", pool_header_bytes);
-- total += printone("# bytes lost to quantization", quantization);
-- total += printone("# bytes lost to arena alignment", arena_alignment);
-- (void)printone("Total", total);
-+ total += printone(out, "# bytes lost to pool headers",
pool_header_bytes);
-+ total += printone(out, "# bytes lost to quantization", quantization);
-+ total += printone(out, "# bytes lost to arena alignment",
arena_alignment);
-+ (void)printone(out, "Total", total);
- }
-
--#endif /* PYMALLOC_DEBUG */
--
- #ifdef Py_USING_MEMORY_DEBUGGER
- /* Make this function last so gcc won't inline it since the definition is
- * after the reference.
-diff -up Python-3.2.2/Objects/setobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/setobject.c
---- Python-3.2.2/Objects/setobject.c.add-debug-malloc-stats 2011-09-03 12:16:47.000000000
-0400
-+++ Python-3.2.2/Objects/setobject.c 2011-09-16 18:57:24.986825060 -0400
-@@ -1090,6 +1090,16 @@ PySet_Fini(void)
- Py_CLEAR(emptyfrozenset);
- }
-
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PySet_DebugMallocStats(FILE *out)
-+{
-+ _PyDebugAllocatorStats(out,
-+ "free PySetObject",
-+ numfree, sizeof(PySetObject));
-+}
-+
-+
- static PyObject *
- set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
- {
-diff -up Python-3.2.2/Objects/tupleobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/tupleobject.c
---- Python-3.2.2/Objects/tupleobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/tupleobject.c 2011-09-16 18:57:24.987825060 -0400
-@@ -44,6 +44,22 @@ show_track(void)
- }
- #endif
-
-+/* Print summary info about the state of the optimized allocator */
-+void
-+_PyTuple_DebugMallocStats(FILE *out)
-+{
-+#if PyTuple_MAXSAVESIZE > 0
-+ int i;
-+ char buf[128];
-+ for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
-+ PyOS_snprintf(buf, sizeof(buf),
-+ "free %d-sized PyTupleObject", i);
-+ _PyDebugAllocatorStats(out,
-+ buf,
-+ numfree[i], _PyObject_VAR_SIZE(&PyTuple_Type, i));
-+ }
-+#endif
-+}
-
- PyObject *
- PyTuple_New(register Py_ssize_t size)
-diff -up Python-3.2.2/Objects/unicodeobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/unicodeobject.c
---- Python-3.2.2/Objects/unicodeobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
-+++ Python-3.2.2/Objects/unicodeobject.c 2011-09-16 18:57:24.990825060 -0400
-@@ -10063,6 +10063,12 @@ _PyUnicode_Fini(void)
- (void)PyUnicode_ClearFreeList();
- }
-
-+void _PyUnicode_DebugMallocStats(FILE *out)
-+{
-+ _PyDebugAllocatorStats(out, "free PyUnicodeObject", numfree,
-+ sizeof(PyUnicodeObject));
-+}
-+
- void
- PyUnicode_InternInPlace(PyObject **p)
- {
-diff -up Python-3.2.2/Python/pythonrun.c.add-debug-malloc-stats
Python-3.2.2/Python/pythonrun.c
---- Python-3.2.2/Python/pythonrun.c.add-debug-malloc-stats 2011-09-16 19:24:44.747809422
-0400
-+++ Python-3.2.2/Python/pythonrun.c 2011-09-16 19:25:00.024809277 -0400
-@@ -547,7 +547,7 @@ Py_Finalize(void)
- #endif /* Py_TRACE_REFS */
- #ifdef PYMALLOC_DEBUG
- if (Py_GETENV("PYTHONMALLOCSTATS"))
-- _PyObject_DebugMallocStats();
-+ _PyObject_DebugMallocStats(stderr);
- #endif
-
- call_ll_exitfuncs();
-diff -up Python-3.2.2/Python/sysmodule.c.add-debug-malloc-stats
Python-3.2.2/Python/sysmodule.c
---- Python-3.2.2/Python/sysmodule.c.add-debug-malloc-stats 2011-09-03 12:16:49.000000000
-0400
-+++ Python-3.2.2/Python/sysmodule.c 2011-09-16 19:18:45.806812845 -0400
-@@ -994,6 +994,25 @@ a 11-tuple where the entries in the tupl
- extern "C" {
- #endif
-
-+static PyObject *
-+sys_debugmallocstats(PyObject *self, PyObject *args)
-+{
-+ _PyObject_DebugMallocStats(stderr);
-+ fputc('\n', stderr);
-+ _PyObject_DebugTypeStats(stderr);
-+
-+ Py_RETURN_NONE;
-+}
-+PyDoc_STRVAR(debugmallocstats_doc,
-+"_debugmallocstats([file])\n\
-+\n\
-+Print summary info to stderr about the state of\n\
-+pymalloc's structures.\n\
-+\n\
-+In Py_DEBUG mode, also perform some expensive internal consistency\n\
-+checks.\n\
-+");
-+
- #ifdef Py_TRACE_REFS
- /* Defined in objects.c because it uses static globals if that file */
- extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
-@@ -1090,6 +1109,8 @@ static PyMethodDef sys_methods[] = {
- {"settrace", sys_settrace, METH_O, settrace_doc},
- {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc},
- {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
-+ {"_debugmallocstats", sys_debugmallocstats, METH_VARARGS,
-+ debugmallocstats_doc},
- {NULL, NULL} /* sentinel */
- };
-
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
index 6be557d..ab4cb0c 100644
--- a/00157-uid-gid-overflows.patch
+++ b/00157-uid-gid-overflows.patch
@@ -1,6 +1,6 @@
-diff -up Python-3.2.3/Include/modsupport.h.uid-gid-overflows
Python-3.2.3/Include/modsupport.h
---- Python-3.2.3/Include/modsupport.h.uid-gid-overflows 2012-04-11 02:54:01.000000000
-0400
-+++ Python-3.2.3/Include/modsupport.h 2012-06-18 17:20:38.193527374 -0400
+diff -up Python-3.3.0b1/Include/modsupport.h.uid-gid-overflows
Python-3.3.0b1/Include/modsupport.h
+--- Python-3.3.0b1/Include/modsupport.h.uid-gid-overflows 2012-06-26 16:19:40.000000000
-0400
++++ Python-3.3.0b1/Include/modsupport.h 2012-07-20 14:21:46.854688763 -0400
@@ -8,6 +8,7 @@ extern "C" {
/* Module support interface */
@@ -9,7 +9,7 @@ diff -up Python-3.2.3/Include/modsupport.h.uid-gid-overflows
Python-3.2.3/Includ
/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier
to mean Py_ssize_t */
-@@ -122,6 +123,17 @@ PyAPI_FUNC(PyObject *) PyModule_Create2(
+@@ -125,6 +126,17 @@ PyAPI_FUNC(PyObject *) PyModule_Create2(
PyAPI_DATA(char *) _Py_PackageContext;
#endif
@@ -27,10 +27,10 @@ diff -up Python-3.2.3/Include/modsupport.h.uid-gid-overflows
Python-3.2.3/Includ
#ifdef __cplusplus
}
#endif
-diff -up Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_os.py
---- Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows 2012-04-11 02:54:05.000000000
-0400
-+++ Python-3.2.3/Lib/test/test_os.py 2012-06-18 17:20:18.360775320 -0400
-@@ -885,30 +885,36 @@ if sys.platform != 'win32':
+diff -up Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_os.py
+--- Python-3.3.0b1/Lib/test/test_os.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
++++ Python-3.3.0b1/Lib/test/test_os.py 2012-07-20 14:21:46.856688739 -0400
+@@ -1174,30 +1174,36 @@ if sys.platform != 'win32':
def test_setuid(self):
if os.getuid() != 0:
self.assertRaises(os.error, os.setuid, 0)
@@ -67,7 +67,7 @@ diff -up Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows
Python-3.2.3/Lib/tes
self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
-@@ -923,6 +929,8 @@ if sys.platform != 'win32':
+@@ -1212,6 +1218,8 @@ if sys.platform != 'win32':
def test_setregid(self):
if os.getuid() != 0:
self.assertRaises(os.error, os.setregid, 0, 0)
@@ -76,20 +76,16 @@ diff -up Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows
Python-3.2.3/Lib/tes
self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
-diff -up Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_posix.py
---- Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows 2012-04-11 02:54:05.000000000
-0400
-+++ Python-3.2.3/Lib/test/test_posix.py 2012-06-18 17:20:18.360775320 -0400
-@@ -227,7 +227,7 @@ class PosixTester(unittest.TestCase):
+diff -up Python-3.3.0b1/Lib/test/test_posix.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_posix.py
+--- Python-3.3.0b1/Lib/test/test_posix.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
++++ Python-3.3.0b1/Lib/test/test_posix.py 2012-07-20 14:21:46.857688726 -0400
+@@ -387,10 +387,17 @@ class PosixTester(unittest.TestCase):
else:
self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
- def _test_all_chown_common(self, chown_func, first_param):
+ def _test_all_chown_common(self, chown_func, stat_func, first_param):
"""Common code for chown, fchown and lchown
tests."""
- if os.getuid() == 0:
- try:
-@@ -246,6 +246,13 @@ class PosixTester(unittest.TestCase):
- first_param, 0, 0)
# test a successful chown call
chown_func(first_param, os.getuid(), os.getgid())
+ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
@@ -100,18 +96,18 @@ diff -up Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows
Python-3.2.3/Lib/
+ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
+ self.assertEqual(stat_func(first_param).st_gid, os.getgid())
- @unittest.skipUnless(hasattr(posix, 'chown'), "test needs
os.chown()")
- def test_chown(self):
-@@ -255,7 +262,7 @@ class PosixTester(unittest.TestCase):
+ if os.getuid() == 0:
+ try:
+@@ -421,7 +428,7 @@ class PosixTester(unittest.TestCase):
# re-create the file
- open(support.TESTFN, 'w').close()
+ support.create_empty_file(support.TESTFN)
- self._test_all_chown_common(posix.chown, support.TESTFN)
+ self._test_all_chown_common(posix.chown, posix.stat, support.TESTFN)
@unittest.skipUnless(hasattr(posix, 'fchown'), "test needs
os.fchown()")
def test_fchown(self):
-@@ -265,7 +272,7 @@ class PosixTester(unittest.TestCase):
+@@ -431,7 +438,7 @@ class PosixTester(unittest.TestCase):
test_file = open(support.TESTFN, 'w')
try:
fd = test_file.fileno()
@@ -120,7 +116,7 @@ diff -up Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows
Python-3.2.3/Lib/
finally:
test_file.close()
-@@ -274,7 +281,7 @@ class PosixTester(unittest.TestCase):
+@@ -440,7 +447,7 @@ class PosixTester(unittest.TestCase):
os.unlink(support.TESTFN)
# create a symlink
os.symlink(_DUMMY_SYMLINK, support.TESTFN)
@@ -129,9 +125,9 @@ diff -up Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows
Python-3.2.3/Lib/
def test_chdir(self):
if hasattr(posix, 'chdir'):
-diff -up Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_pwd.py
---- Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows 2012-04-11 02:54:05.000000000
-0400
-+++ Python-3.2.3/Lib/test/test_pwd.py 2012-06-18 17:20:18.360775320 -0400
+diff -up Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.3.0b1/Lib/test/test_pwd.py
+--- Python-3.3.0b1/Lib/test/test_pwd.py.uid-gid-overflows 2012-06-26 16:19:48.000000000
-0400
++++ Python-3.3.0b1/Lib/test/test_pwd.py 2012-07-20 14:21:46.857688726 -0400
@@ -87,9 +87,9 @@ class PwdTest(unittest.TestCase):
# In some cases, byuids isn't a complete list of all users in the
# system, so if we try to pick a value not in byuids (via a perturbing
@@ -144,9 +140,9 @@ diff -up Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.2.3/Lib/te
self.assertNotIn(fakeuid, byuids)
self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
-diff -up Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows
Python-3.2.3/Modules/grpmodule.c
---- Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows 2012-04-11 02:54:07.000000000
-0400
-+++ Python-3.2.3/Modules/grpmodule.c 2012-06-18 17:20:18.361775307 -0400
+diff -up Python-3.3.0b1/Modules/grpmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/grpmodule.c
+--- Python-3.3.0b1/Modules/grpmodule.c.uid-gid-overflows 2012-06-26 16:19:54.000000000
-0400
++++ Python-3.3.0b1/Modules/grpmodule.c 2012-07-20 14:21:46.858688713 -0400
@@ -69,7 +69,7 @@ mkgrent(struct group *p)
Py_INCREF(Py_None);
}
@@ -181,10 +177,10 @@ diff -up Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows
Python-3.2.3/Modules
return NULL;
}
return mkgrent(p);
-diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modules/posixmodule.c
---- Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows 2012-06-18 17:20:18.258776596
-0400
-+++ Python-3.2.3/Modules/posixmodule.c 2012-06-18 17:20:18.362775294 -0400
-@@ -1642,8 +1642,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
+diff -up Python-3.3.0b1/Modules/posixmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/posixmodule.c
+--- Python-3.3.0b1/Modules/posixmodule.c.uid-gid-overflows 2012-07-20 14:21:46.788689588
-0400
++++ Python-3.3.0b1/Modules/posixmodule.c 2012-07-20 14:24:19.626778849 -0400
+@@ -2151,8 +2151,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
#endif
PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
@@ -195,29 +191,37 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
#ifdef HAVE_LARGEFILE_SUPPORT
PyStructSequence_SET_ITEM(v, 6,
PyLong_FromLongLong((PY_LONG_LONG)st->st_size));
-@@ -2172,15 +2172,17 @@ posix_chown(PyObject *self, PyObject *ar
+@@ -2957,7 +2957,6 @@ static PyObject *
+ posix_chown(PyObject *self, PyObject *args, PyObject *kwargs)
{
- PyObject *opath;
- char *path;
-- long uid, gid;
-+ uid_t uid;
-+ gid_t gid;
- int res;
-- if (!PyArg_ParseTuple(args, "O&ll:chown",
-+ if (!PyArg_ParseTuple(args, "O&O&O&:chown",
- PyUnicode_FSConverter, &opath,
-- &uid, &gid))
-+ _PyArg_ParseUid, &uid,
-+ _PyArg_ParseGid, &gid))
- return NULL;
- path = PyBytes_AsString(opath);
+ path_t path;
+- long uid_l, gid_l;
+ uid_t uid;
+ gid_t gid;
+ int dir_fd = DEFAULT_DIR_FD;
+@@ -2971,9 +2970,10 @@ posix_chown(PyObject *self, PyObject *ar
+ #ifdef HAVE_FCHOWN
+ path.allow_fd = 1;
+ #endif
+- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&ll|$O&p:chown",
keywords,
++ if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"O&O&O&|$O&p:chown", keywords,
+ path_converter, &path,
+- &uid_l, &gid_l,
++ _PyArg_ParseUid, &uid,
++ _PyArg_ParseGid, &gid,
+ #ifdef HAVE_FCHOWNAT
+ dir_fd_converter, &dir_fd,
+ #else
+@@ -3004,8 +3004,6 @@ posix_chown(PyObject *self, PyObject *ar
+ #endif
+
Py_BEGIN_ALLOW_THREADS
-- res = chown(path, (uid_t) uid, (gid_t) gid);
-+ res = chown(path, uid, gid);
- Py_END_ALLOW_THREADS
- if (res < 0)
- return posix_error_with_allocated_filename(opath);
-@@ -2200,12 +2202,15 @@ static PyObject *
+- uid = (uid_t)uid_l;
+- gid = (uid_t)gid_l;
+ #ifdef HAVE_FCHOWN
+ if (path.fd != -1)
+ result = fchown(path.fd, uid, gid);
+@@ -3049,12 +3047,15 @@ static PyObject *
posix_fchown(PyObject *self, PyObject *args)
{
int fd;
@@ -236,7 +240,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error();
-@@ -2224,15 +2229,17 @@ posix_lchown(PyObject *self, PyObject *a
+@@ -3074,15 +3075,17 @@ posix_lchown(PyObject *self, PyObject *a
{
PyObject *opath;
char *path;
@@ -258,7 +262,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
Py_END_ALLOW_THREADS
if (res < 0)
return posix_error_with_allocated_filename(opath);
-@@ -4287,7 +4294,7 @@ Return the current process's effective g
+@@ -6184,7 +6187,7 @@ Return the current process's effective g
static PyObject *
posix_getegid(PyObject *self, PyObject *noargs)
{
@@ -267,7 +271,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
}
#endif
-@@ -4300,7 +4307,7 @@ Return the current process's effective u
+@@ -6197,7 +6200,7 @@ Return the current process's effective u
static PyObject *
posix_geteuid(PyObject *self, PyObject *noargs)
{
@@ -276,7 +280,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
}
#endif
-@@ -4313,7 +4320,7 @@ Return the current process's group id.")
+@@ -6210,7 +6213,7 @@ Return the current process's group id.")
static PyObject *
posix_getgid(PyObject *self, PyObject *noargs)
{
@@ -285,7 +289,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
}
#endif
-@@ -4388,7 +4395,7 @@ posix_getgroups(PyObject *self, PyObject
+@@ -6349,7 +6352,7 @@ posix_getgroups(PyObject *self, PyObject
if (result != NULL) {
int i;
for (i = 0; i < n; ++i) {
@@ -294,7 +298,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
if (o == NULL) {
Py_DECREF(result);
result = NULL;
-@@ -4419,14 +4426,15 @@ posix_initgroups(PyObject *self, PyObjec
+@@ -6380,14 +6383,15 @@ posix_initgroups(PyObject *self, PyObjec
PyObject *oname;
char *username;
int res;
@@ -314,7 +318,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
Py_DECREF(oname);
if (res == -1)
return PyErr_SetFromErrno(PyExc_OSError);
-@@ -4601,7 +4609,7 @@ Return the current process's user id.");
+@@ -6562,7 +6566,7 @@ Return the current process's user id.");
static PyObject *
posix_getuid(PyObject *self, PyObject *noargs)
{
@@ -323,7 +327,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
}
#endif
-@@ -4741,15 +4749,9 @@ Set the current process's user id.");
+@@ -6702,15 +6706,9 @@ Set the current process's user id.");
static PyObject *
posix_setuid(PyObject *self, PyObject *args)
{
@@ -340,24 +344,24 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
if (setuid(uid) < 0)
return posix_error();
Py_INCREF(Py_None);
-@@ -4766,15 +4768,9 @@ Set the current process's effective user
+@@ -6727,15 +6725,9 @@ Set the current process's effective user
static PyObject *
posix_seteuid (PyObject *self, PyObject *args)
{
- long euid_arg;
uid_t euid;
- if (!PyArg_ParseTuple(args, "l", &euid_arg))
-- return NULL;
++ if (!PyArg_ParseTuple(args, "O&:seteuid", _PyArg_ParseUid,
&euid))
+ return NULL;
- euid = euid_arg;
- if (euid != euid_arg) {
- PyErr_SetString(PyExc_OverflowError, "user id too big");
-+ if (!PyArg_ParseTuple(args, "O&:seteuid", _PyArg_ParseUid,
&euid))
- return NULL;
+- return NULL;
- }
if (seteuid(euid) < 0) {
return posix_error();
} else {
-@@ -4792,15 +4788,9 @@ Set the current process's effective grou
+@@ -6753,15 +6745,9 @@ Set the current process's effective grou
static PyObject *
posix_setegid (PyObject *self, PyObject *args)
{
@@ -374,7 +378,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
if (setegid(egid) < 0) {
return posix_error();
} else {
-@@ -4818,23 +4808,11 @@ Set the current process's real and effec
+@@ -6779,23 +6765,11 @@ Set the current process's real and effec
static PyObject *
posix_setreuid (PyObject *self, PyObject *args)
{
@@ -401,7 +405,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
if (setreuid(ruid, euid) < 0) {
return posix_error();
} else {
-@@ -4852,23 +4830,11 @@ Set the current process's real and effec
+@@ -6813,23 +6787,11 @@ Set the current process's real and effec
static PyObject *
posix_setregid (PyObject *self, PyObject *args)
{
@@ -428,7 +432,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
if (setregid(rgid, egid) < 0) {
return posix_error();
} else {
-@@ -4886,15 +4852,9 @@ Set the current process's group id.");
+@@ -6847,15 +6809,9 @@ Set the current process's group id.");
static PyObject *
posix_setgid(PyObject *self, PyObject *args)
{
@@ -445,7 +449,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
if (setgid(gid) < 0)
return posix_error();
Py_INCREF(Py_None);
-@@ -4927,27 +4887,9 @@ posix_setgroups(PyObject *self, PyObject
+@@ -6888,27 +6844,9 @@ posix_setgroups(PyObject *self, PyObject
elem = PySequence_GetItem(groups, i);
if (!elem)
return NULL;
@@ -474,7 +478,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
}
Py_DECREF(elem);
}
-@@ -7689,9 +7631,11 @@ Set the current process's real, effectiv
+@@ -10388,9 +10326,11 @@ Set the current process's real, effectiv
static PyObject*
posix_setresuid (PyObject *self, PyObject *args)
{
@@ -489,7 +493,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
return NULL;
if (setresuid(ruid, euid, suid) < 0)
return posix_error();
-@@ -7707,9 +7651,11 @@ Set the current process's real, effectiv
+@@ -10406,9 +10346,11 @@ Set the current process's real, effectiv
static PyObject*
posix_setresgid (PyObject *self, PyObject *args)
{
@@ -504,7 +508,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
return NULL;
if (setresgid(rgid, egid, sgid) < 0)
return posix_error();
-@@ -7726,14 +7672,13 @@ static PyObject*
+@@ -10425,14 +10367,13 @@ static PyObject*
posix_getresuid (PyObject *self, PyObject *noargs)
{
uid_t ruid, euid, suid;
@@ -524,7 +528,7 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
}
#endif
-@@ -7746,14 +7691,13 @@ static PyObject*
+@@ -10445,14 +10386,13 @@ static PyObject*
posix_getresgid (PyObject *self, PyObject *noargs)
{
uid_t rgid, egid, sgid;
@@ -544,9 +548,9 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
}
#endif
-diff -up Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows
Python-3.2.3/Modules/pwdmodule.c
---- Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows 2012-04-11 02:54:07.000000000
-0400
-+++ Python-3.2.3/Modules/pwdmodule.c 2012-06-18 17:20:18.362775294 -0400
+diff -up Python-3.3.0b1/Modules/pwdmodule.c.uid-gid-overflows
Python-3.3.0b1/Modules/pwdmodule.c
+--- Python-3.3.0b1/Modules/pwdmodule.c.uid-gid-overflows 2012-06-26 16:19:54.000000000
-0400
++++ Python-3.3.0b1/Modules/pwdmodule.c 2012-07-20 14:21:46.861688675 -0400
@@ -74,8 +74,8 @@ mkpwent(struct passwd *p)
#else
SETS(setIndex++, p->pw_passwd);
@@ -576,9 +580,9 @@ diff -up Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows
Python-3.2.3/Modules
return NULL;
}
return mkpwent(p);
-diff -up Python-3.2.3/Python/getargs.c.uid-gid-overflows Python-3.2.3/Python/getargs.c
---- Python-3.2.3/Python/getargs.c.uid-gid-overflows 2012-04-11 02:54:08.000000000 -0400
-+++ Python-3.2.3/Python/getargs.c 2012-06-18 17:20:18.363775282 -0400
+diff -up Python-3.3.0b1/Python/getargs.c.uid-gid-overflows
Python-3.3.0b1/Python/getargs.c
+--- Python-3.3.0b1/Python/getargs.c.uid-gid-overflows 2012-06-26 16:19:57.000000000
-0400
++++ Python-3.3.0b1/Python/getargs.c 2012-07-20 14:21:46.861688675 -0400
@@ -4,6 +4,7 @@
#include "Python.h"
@@ -587,7 +591,7 @@ diff -up Python-3.2.3/Python/getargs.c.uid-gid-overflows
Python-3.2.3/Python/get
#ifdef __cplusplus
-@@ -1789,6 +1790,102 @@ _PyArg_NoKeywords(const char *funcname,
+@@ -1807,6 +1808,102 @@ _PyArg_NoKeywords(const char *funcname,
funcname);
return 0;
}
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
index 4a265a0..6cddbf7 100644
--- a/05000-autotool-intermediates.patch
+++ b/05000-autotool-intermediates.patch
@@ -1,16 +1,184 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2011-07-11 11:50:06.910425999 -0400
-+++ ./configure 2011-07-11 11:50:13.492426001 -0400
-@@ -619,6 +619,8 @@ TRUE
- MACHDEP_OBJS
- DYNLOADFILE
- DLINCLDIR
-+DTRACEHDRS
-+DTRACEOBJS
- THREADOBJ
- LDLAST
- USE_THREAD_MODULE
-@@ -764,8 +766,11 @@ with_thread
+--- ./configure.autotool-intermediates 2012-07-20 14:09:54.811590526 -0400
++++ ./configure 2012-07-20 14:10:00.525519093 -0400
+@@ -1,11 +1,13 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for python 3.3.
++# Generated by GNU Autoconf 2.68 for python 3.3.
+ #
+ # Report bugs to <
http://bugs.python.org/>.
+ #
+ #
+-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
++# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
++# Foundation, Inc.
+ #
+ #
+ # This configure script is free software; the Free Software Foundation
+@@ -134,31 +136,6 @@ export LANGUAGE
+ # CDPATH.
+ (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+-# Use a proper internal environment variable to ensure we don't fall
+- # into an infinite loop, continuously re-executing ourselves.
+- if test x"${_as_can_reexec}" != xno && test
"x$CONFIG_SHELL" != x; then
+- _as_can_reexec=no; export _as_can_reexec;
+- # We cannot yet assume a decent shell, so we have to provide a
+-# neutralization value for shells without unset; and this also
+-# works around shells that cannot unset nonexistent variables.
+-# Preserve -v and -x to the replacement shell.
+-BASH_ENV=/dev/null
+-ENV=/dev/null
+-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+-case $- in # ((((
+- *v*x* | *x*v* ) as_opts=-vx ;;
+- *v* ) as_opts=-v ;;
+- *x* ) as_opts=-x ;;
+- * ) as_opts= ;;
+-esac
+-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+-# Admittedly, this is quite paranoid, since all the known shells bail
+-# out after a failed `exec'.
+-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+-as_fn_exit 255
+- fi
+- # We don't want this to propagate to other subprocesses.
+- { _as_can_reexec=; unset _as_can_reexec;}
+ if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" &&
(emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+@@ -192,8 +169,7 @@ if ( set x; as_fn_ret_success y && test
+ else
+ exitcode=1; echo positional parameters were not saved.
+ fi
+-test x\$exitcode = x0 || exit 1
+-test -x / || exit 1"
++test x\$exitcode = x0 || exit 1"
+ as_suggested="
as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested"
as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested"
as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" !=
\"x\$as_lineno_2'\$as_run'\" &&
+@@ -238,25 +214,21 @@ IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+- export CONFIG_SHELL
+- # We cannot yet assume a decent shell, so we have to provide a
+-# neutralization value for shells without unset; and this also
+-# works around shells that cannot unset nonexistent variables.
+-# Preserve -v and -x to the replacement shell.
+-BASH_ENV=/dev/null
+-ENV=/dev/null
+-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+-case $- in # ((((
+- *v*x* | *x*v* ) as_opts=-vx ;;
+- *v* ) as_opts=-v ;;
+- *x* ) as_opts=-x ;;
+- * ) as_opts= ;;
+-esac
+-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+-# Admittedly, this is quite paranoid, since all the known shells bail
+-# out after a failed `exec'.
+-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+-exit 255
++ # We cannot yet assume a decent shell, so we have to provide a
++ # neutralization value for shells without unset; and this also
++ # works around shells that cannot unset nonexistent variables.
++ # Preserve -v and -x to the replacement shell.
++ BASH_ENV=/dev/null
++ ENV=/dev/null
++ (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
++ export CONFIG_SHELL
++ case $- in # ((((
++ *v*x* | *x*v* ) as_opts=-vx ;;
++ *v* ) as_opts=-v ;;
++ *x* ) as_opts=-x ;;
++ * ) as_opts= ;;
++ esac
++ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+ fi
+
+ if test x$as_have_required = xno; then :
+@@ -359,14 +331,6 @@ $as_echo X"$as_dir" |
+
+
+ } # as_fn_mkdir_p
+-
+-# as_fn_executable_p FILE
+-# -----------------------
+-# Test if FILE is an executable regular file.
+-as_fn_executable_p ()
+-{
+- test -f "$1" && test -x "$1"
+-} # as_fn_executable_p
+ # as_fn_append VAR VALUE
+ # ----------------------
+ # Append the text in VALUE to the end of the definition contained in VAR. Take
+@@ -488,10 +452,6 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX
shell" >&2; as_fn_exit 1; }
+
+- # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+- # already done that, so ensure we don't try to do so again and fall
+- # in an infinite loop. This has already happened in practice.
+- _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+@@ -526,16 +486,16 @@ if (echo >conf$$.file) 2>/dev/null; then
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+- # In both cases, we have to default to `cp -pR'.
++ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+- as_ln_s='cp -pR'
++ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+- as_ln_s='cp -pR'
++ as_ln_s='cp -p'
+ fi
+ else
+- as_ln_s='cp -pR'
++ as_ln_s='cp -p'
+ fi
+ rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+ rmdir conf$$.dir 2>/dev/null
+@@ -547,8 +507,28 @@ else
+ as_mkdir_p=false
+ fi
+
+-as_test_x='test -x'
+-as_executable_p=as_fn_executable_p
++if test -x / >/dev/null 2>&1; then
++ as_test_x='test -x'
++else
++ if ls -dL / >/dev/null 2>&1; then
++ as_ls_L_option=L
++ else
++ as_ls_L_option=
++ fi
++ as_test_x='
++ eval sh -c '\''
++ if test -d "$1"; then
++ test -d "$1/.";
++ else
++ case $1 in #(
++ -*)set "./$1";;
++ esac;
++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
++ ???[sx]*):;;*)false;;esac;fi
++ '\'' sh
++ '
++fi
++as_executable_p=$as_test_x
+
+ # Sed expression to map a string onto a valid CPP name.
+ as_tr_cpp="eval sed
'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+@@ -793,6 +773,8 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -18,21 +186,17 @@ diff -up ./configure.autotool-intermediates ./configure
+with_call_profile
with_pymalloc
with_valgrind
-+with_dtrace
- with_fpectl
- with_libm
- with_libc
-@@ -781,7 +786,8 @@ CFLAGS
- LDFLAGS
- LIBS
- CPPFLAGS
--CPP'
-+CPP
-+CPPFLAGS'
-
-
- # Initialize some variables set by options.
-@@ -1437,8 +1443,11 @@ Optional Packages:
+ with_systemtap
+@@ -1266,6 +1248,8 @@ target=$target_alias
+ if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
++ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use
--host.
++ If a cross compiler is detected then cross compile mode will be used"
>&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+@@ -1469,6 +1453,8 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -40,11 +204,328 @@ diff -up ./configure.autotool-intermediates ./configure
+ --with(out)-call-profile enable/disable statistics on function call invocation
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
-+ --with(out)-dtrace disable/enable dtrace support
- --with-fpectl enable SIGFPE catching
- --with-libm=STRING math library
- --with-libc=STRING C library
-@@ -9284,6 +9293,50 @@ $as_echo "no" >&6; }
+ --with(out)-systemtap disable/enable SystemTap support
+@@ -1556,9 +1542,9 @@ test -n "$ac_init_help" && exit $ac_stat
+ if $ac_init_version; then
+ cat <<\_ACEOF
+ python configure 3.3
+-generated by GNU Autoconf 2.69
++generated by GNU Autoconf 2.68
+
+-Copyright (C) 2012 Free Software Foundation, Inc.
++Copyright (C) 2010 Free Software Foundation, Inc.
+ This configure script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it.
+ _ACEOF
+@@ -1634,7 +1620,7 @@ $as_echo "$ac_try_echo"; } >&5
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+- test -x conftest$ac_exeext
++ $as_test_x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+ else
+@@ -1932,8 +1918,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2
- 1) == 3)];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -1987,8 +1972,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) <<
N) - 1) * 2 + 1))];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -2004,8 +1988,7 @@ main ()
+ {
+ static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) -
1) * 2 + 1)
+ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -2055,8 +2038,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !(($2) >= 0)];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -2072,8 +2054,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -2099,8 +2080,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !(($2) < 0)];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -2116,8 +2096,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -2151,8 +2130,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -2395,7 +2373,7 @@ This file contains any messages produced
+ running configure, to aid debugging if configure makes a mistake.
+
+ It was created by python $as_me 3.3, which was
+-generated by GNU Autoconf 2.69. Invocation command line was
++generated by GNU Autoconf 2.68. Invocation command line was
+
+ $ $0 $@
+
+@@ -2765,7 +2743,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAS_HG="found"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -3508,7 +3486,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -3548,7 +3526,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -3601,7 +3579,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -3642,7 +3620,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+@@ -3700,7 +3678,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -3744,7 +3722,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -4190,7 +4168,8 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_
+ /* end confdefs.h. */
+ #include <stdarg.h>
+ #include <stdio.h>
+-struct stat;
++#include <sys/types.h>
++#include <sys/stat.h>
+ /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+ struct buf { int x; };
+ FILE * (*rcsopen) (struct buf *, struct stat *, int);
+@@ -4329,7 +4308,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -4370,7 +4349,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -4411,7 +4390,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -4460,7 +4439,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_CXX="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -4691,7 +4670,7 @@ do
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+- as_fn_executable_p "$ac_path_GREP" || continue
++ { test -f "$ac_path_GREP" && $as_test_x
"$ac_path_GREP"; } || continue
+ # Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+ case `"$ac_path_GREP" --version 2>&1` in
+@@ -4757,7 +4736,7 @@ do
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+- as_fn_executable_p "$ac_path_EGREP" || continue
++ { test -f "$ac_path_EGREP" && $as_test_x
"$ac_path_EGREP"; } || continue
+ # Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+ case `"$ac_path_EGREP" --version 2>&1` in
+@@ -4964,8 +4943,8 @@ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+
+-# define __EXTENSIONS__ 1
+- $ac_includes_default
++# define __EXTENSIONS__ 1
++ $ac_includes_default
+ int
+ main ()
+ {
+@@ -5359,7 +5338,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -5399,7 +5378,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -5453,7 +5432,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_AR="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -5504,7 +5483,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAS_PYTHON="found"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -5577,7 +5556,7 @@ case $as_dir/ in #((
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x
"$as_dir/$ac_prog$ac_exec_ext"; }; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1;
then
+ # AIX install. It has an incompatible calling convention.
+@@ -5646,7 +5625,7 @@ do
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
++ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x
"$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+@@ -8538,7 +8517,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -8581,7 +8560,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -9591,6 +9570,50 @@ $as_echo "no" >&6; }
fi
@@ -95,72 +576,155 @@ diff -up ./configure.autotool-intermediates ./configure
# Check for Python-specific malloc support
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
$as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -9336,6 +9389,46 @@ fi
- OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
+@@ -10208,7 +10231,7 @@ do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x
"$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_TRUE="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+@@ -11645,8 +11668,7 @@ int
+ main ()
+ {
+ static int test_array [1 - 2 * !(((char) -1) < 0)];
+-test_array [0] = 0;
+-return test_array [0];
++test_array [0] = 0
+
+ ;
+ return 0;
+@@ -11677,11 +11699,11 @@ else
+ int
+ main ()
+ {
+-
++/* FIXME: Include the comments suggested by Paul. */
+ #ifndef __cplusplus
+- /* Ultrix mips cc rejects this sort of thing. */
++ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+- const charset cs = { 0, 0 };
++ const charset cs;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+@@ -11698,9 +11720,8 @@ main ()
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+- { /* SCO 3.2v4 cc rejects this sort of thing. */
+- char tx;
+- char *t = &tx;
++ { /* SCO 3.2v4 cc rejects this. */
++ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+@@ -11716,10 +11737,10 @@ main ()
+ iptr p = 0;
+ ++p;
+ }
+- { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
++ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+- struct s { int j; const int *ap[3]; } bx;
+- struct s *b = &bx; b->j = 5;
++ struct s { int j; const int *ap[3]; };
++ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+@@ -15008,16 +15029,16 @@ if (echo >conf$$.file) 2>/dev/null; then
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+- # In both cases, we have to default to `cp -pR'.
++ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+- as_ln_s='cp -pR'
++ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+- as_ln_s='cp -pR'
++ as_ln_s='cp -p'
+ fi
+ else
+- as_ln_s='cp -pR'
++ as_ln_s='cp -p'
+ fi
+ rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+ rmdir conf$$.dir 2>/dev/null
+@@ -15077,16 +15098,28 @@ else
+ as_mkdir_p=false
fi
-+# Check for dtrace support
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-dtrace"
>&5
-+$as_echo_n "checking for --with-dtrace... " >&6; }
-+
-+# Check whether --with-dtrace was given.
-+if test "${with_dtrace+set}" = set; then :
-+ withval=$with_dtrace;
-+fi
-+
-+
-+if test ! -z "$with_dtrace"
-+then
-+ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
-+ then
-+
-+$as_echo "#define WITH_DTRACE 1" >>confdefs.h
-+
-+ with_dtrace="Sun"
-+ DTRACEOBJS="Python/dtrace.o"
-+ DTRADEHDRS=""
-+ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
-+ then
-+
-+$as_echo "#define WITH_DTRACE 1" >>confdefs.h
-+
-+ with_dtrace="Apple"
-+ DTRACEOBJS=""
-+ DTRADEHDRS="pydtrace.h"
-+ else
-+ with_dtrace="no"
-+ fi
+-
+-# as_fn_executable_p FILE
+-# -----------------------
+-# Test if FILE is an executable regular file.
+-as_fn_executable_p ()
+-{
+- test -f "$1" && test -x "$1"
+-} # as_fn_executable_p
+-as_test_x='test -x'
+-as_executable_p=as_fn_executable_p
++if test -x / >/dev/null 2>&1; then
++ as_test_x='test -x'
+else
-+ with_dtrace="no"
++ if ls -dL / >/dev/null 2>&1; then
++ as_ls_L_option=L
++ else
++ as_ls_L_option=
++ fi
++ as_test_x='
++ eval sh -c '\''
++ if test -d "$1"; then
++ test -d "$1/.";
++ else
++ case $1 in #(
++ -*)set "./$1";;
++ esac;
++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
++ ???[sx]*):;;*)false;;esac;fi
++ '\'' sh
++ '
+fi
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dtrace" >&5
-+$as_echo "$with_dtrace" >&6; }
-+
-+
-+
- # -I${DLINCLDIR} is added to the compile rule for importdl.o
++as_executable_p=$as_test_x
- DLINCLDIR=.
-diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2011-07-11 11:50:06.896426002 -0400
-+++ ./pyconfig.h.in 2011-07-11 11:50:13.965426001 -0400
-@@ -12,15 +12,15 @@
- support for AIX C++ shared extension modules. */
- #undef AIX_GENUINE_CPLUSPLUS
-
--/* Define if you have the Mach cthreads package */
--#undef C_THREADS
--
- /* Define to keep records on function call invocation */
- #undef CALL_PROFILE
+ # Sed expression to map a string onto a valid CPP name.
+ as_tr_cpp="eval sed
'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+@@ -15108,7 +15141,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # values after options handling.
+ ac_log="
+ This file was extended by python $as_me 3.3, which was
+-generated by GNU Autoconf 2.69. Invocation command line was
++generated by GNU Autoconf 2.68. Invocation command line was
- /* Define to keep records of the number of instances of each type */
- #undef COUNT_ALLOCS
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+@@ -15170,10 +15203,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+ python config.status 3.3
+-configured by $0, generated by GNU Autoconf 2.69,
++configured by $0, generated by GNU Autoconf 2.68,
+ with options \\"\$ac_cs_config\\"
-+/* Define if you have the Mach cthreads package */
-+#undef C_THREADS
-+
- /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
- mixed-endian order (byte order 45670123) */
- #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
+-Copyright (C) 2012 Free Software Foundation, Inc.
++Copyright (C) 2010 Free Software Foundation, Inc.
+ This config.status script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it."
+
+@@ -15263,7 +15296,7 @@ fi
+ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ if \$ac_cs_recheck; then
+- set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create
--no-recursion
++ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args
--no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
diff --git a/python-3.2.3-lib64.patch b/python-3.2.3-lib64.patch
deleted file mode 100644
index 5c3cf13..0000000
--- a/python-3.2.3-lib64.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-diff -up Python-3.2.3/Lib/distutils/command/install.py.lib64
Python-3.2.3/Lib/distutils/command/install.py
---- Python-3.2.3/Lib/distutils/command/install.py.lib64 2012-04-11 02:54:02.000000000
-0400
-+++ Python-3.2.3/Lib/distutils/command/install.py 2012-04-11 19:01:19.727107020 -0400
-@@ -45,14 +45,14 @@ else:
- 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',
-diff -up Python-3.2.3/Lib/distutils/sysconfig.py.lib64
Python-3.2.3/Lib/distutils/sysconfig.py
---- Python-3.2.3/Lib/distutils/sysconfig.py.lib64 2012-04-11 02:54:02.000000000 -0400
-+++ Python-3.2.3/Lib/distutils/sysconfig.py 2012-04-11 19:01:19.727107020 -0400
-@@ -122,8 +122,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:
-diff -up Python-3.2.3/Lib/site.py.lib64 Python-3.2.3/Lib/site.py
---- Python-3.2.3/Lib/site.py.lib64 2012-04-11 02:54:03.000000000 -0400
-+++ Python-3.2.3/Lib/site.py 2012-04-11 19:01:19.728107008 -0400
-@@ -285,12 +285,16 @@ def getsitepackages():
- if sys.platform in ('os2emx', 'riscos'):
- sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
- elif os.sep == '/':
-+ sitepackages.append(os.path.join(prefix, "lib64",
-+ "python" + sys.version[:3],
-+ "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
- "python" + sys.version[:3],
- "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
- else:
- sitepackages.append(prefix)
-+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
- if sys.platform == "darwin":
- # for framework builds *only* we add the standard Apple
-diff -up Python-3.2.3/Lib/sysconfig.py.lib64 Python-3.2.3/Lib/sysconfig.py
---- Python-3.2.3/Lib/sysconfig.py.lib64 2012-04-11 02:54:03.000000000 -0400
-+++ Python-3.2.3/Lib/sysconfig.py 2012-04-11 19:01:19.728107008 -0400
-@@ -21,10 +21,10 @@ __all__ = [
-
- _INSTALL_SCHEMES = {
- 'posix_prefix': {
-- 'stdlib': '{base}/lib/python{py_version_short}',
-- 'platstdlib': '{platbase}/lib/python{py_version_short}',
-+ 'stdlib': '{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':
- '{base}/include/python{py_version_short}{abiflags}',
- 'platinclude':
-@@ -81,10 +81,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}',
-diff -up Python-3.2.3/Lib/test/test_site.py.lib64 Python-3.2.3/Lib/test/test_site.py
---- Python-3.2.3/Lib/test/test_site.py.lib64 2012-04-11 02:54:05.000000000 -0400
-+++ Python-3.2.3/Lib/test/test_site.py 2012-04-11 19:02:01.413585869 -0400
-@@ -236,12 +236,15 @@ class HelperFunctionsTests(unittest.Test
- self.assertEqual(dirs[2], wanted)
- elif os.sep == '/':
- # OS X non-framwework builds, Linux, FreeBSD, etc
-- self.assertEqual(len(dirs), 2)
-- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ self.assertEqual(len(dirs), 3)
-+ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
- 'site-packages')
- self.assertEqual(dirs[0], wanted)
-- wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ 'site-packages')
- self.assertEqual(dirs[1], wanted)
-+ wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ self.assertEqual(dirs[2], wanted)
- else:
- # other platforms
- self.assertEqual(len(dirs), 2)
-diff -up Python-3.2.3/Makefile.pre.in.lib64 Python-3.2.3/Makefile.pre.in
---- Python-3.2.3/Makefile.pre.in.lib64 2012-04-11 19:01:19.722107084 -0400
-+++ Python-3.2.3/Makefile.pre.in 2012-04-11 19:01:19.729106996 -0400
-@@ -106,7 +106,7 @@ LIBDIR= @libdir@
- MANDIR= @mandir@
- INCLUDEDIR= @includedir@
- CONFINCLUDEDIR= $(exec_prefix)/include
--SCRIPTDIR= $(prefix)/lib
-+SCRIPTDIR= $(prefix)/lib64
- ABIFLAGS= @ABIFLAGS@
-
- # Detailed destination directories
-diff -up Python-3.2.3/Modules/getpath.c.lib64 Python-3.2.3/Modules/getpath.c
---- Python-3.2.3/Modules/getpath.c.lib64 2012-04-11 02:54:07.000000000 -0400
-+++ Python-3.2.3/Modules/getpath.c 2012-04-11 19:01:19.729106996 -0400
-@@ -122,8 +122,8 @@
- #endif
-
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
-+#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
-+ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
- #endif
-
- #ifndef LANDMARK
-@@ -135,7 +135,7 @@ static wchar_t exec_prefix[MAXPATHLEN+1]
- static wchar_t progpath[MAXPATHLEN+1];
- static wchar_t *module_search_path = NULL;
- static int module_search_path_malloced = 0;
--static wchar_t *lib_python = L"lib/python" VERSION;
-+static wchar_t *lib_python = L"lib64/python" VERSION;
-
- static void
- reduce(wchar_t *dir)
-@@ -583,7 +583,7 @@ calculate_path(void)
- }
- else
- wcsncpy(zip_path, _prefix, MAXPATHLEN);
-- joinpath(zip_path, L"lib/python00.zip");
-+ joinpath(zip_path, L"lib64/python00.zip");
- bufsz = wcslen(zip_path); /* Replace "00" with version */
- zip_path[bufsz - 6] = VERSION[0];
- zip_path[bufsz - 5] = VERSION[2];
-@@ -593,7 +593,7 @@ calculate_path(void)
- fprintf(stderr,
- "Could not find platform dependent libraries
<exec_prefix>\n");
- wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
-- joinpath(exec_prefix, L"lib/lib-dynload");
-+ joinpath(exec_prefix, L"lib64/lib-dynload");
- }
- /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
-
-diff -up Python-3.2.3/setup.py.lib64 Python-3.2.3/setup.py
---- Python-3.2.3/setup.py.lib64 2012-04-11 02:54:08.000000000 -0400
-+++ Python-3.2.3/setup.py 2012-04-11 19:01:19.730106984 -0400
-@@ -396,7 +396,7 @@ class PyBuildExt(build_ext):
- # Ensure that /usr/local is always used, but the local build
- # directories (i.e. '.' and 'Include') must be first. See
issue
- # 10520.
-- 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')
- self.add_multiarch_paths()
-
-@@ -643,11 +643,11 @@ class PyBuildExt(build_ext):
- elif curses_library:
- readline_libs.append(curses_library)
- elif self.compiler.find_library_file(lib_dirs +
-- ['/usr/lib/termcap'],
-+ ['/usr/lib64/termcap'],
- 'termcap'):
- readline_libs.append('termcap')
- exts.append( 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:
-@@ -684,8 +684,8 @@ class PyBuildExt(build_ext):
- if krb5_h:
- ssl_incs += krb5_h
- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-- ['/usr/local/ssl/lib',
-- '/usr/contrib/ssl/lib/'
-+ ['/usr/local/ssl/lib64',
-+ '/usr/contrib/ssl/lib64/'
- ] )
-
- if (ssl_incs is not None and
diff --git a/python-3.2b2-remove-mimeaudio-tests.patch
b/python-3.2b2-remove-mimeaudio-tests.patch
deleted file mode 100644
index 118b7b2..0000000
--- a/python-3.2b2-remove-mimeaudio-tests.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-diff -up Python-3.2b2/Lib/email/test/test_email.py.remove-mimeaudio-tests
Python-3.2b2/Lib/email/test/test_email.py
---- Python-3.2b2/Lib/email/test/test_email.py.remove-mimeaudio-tests 2010-12-18
13:25:38.000000000 -0500
-+++ Python-3.2b2/Lib/email/test/test_email.py 2010-12-28 16:50:34.910309105 -0500
-@@ -977,53 +977,6 @@ Blah blah blah
-
-
-
--# Test the basic MIMEAudio class
--class TestMIMEAudio(unittest.TestCase):
-- def setUp(self):
-- # Make sure we pick up the audiotest.au that lives in email/test/data.
-- # In Python, there's an audiotest.au living in Lib/test but that isn't
-- # included in some binary distros that don't include the test
-- # package. The trailing empty string on the .join() is significant
-- # since findfile() will do a dirname().
-- datadir = os.path.join(os.path.dirname(landmark), 'data', '')
-- with open(findfile('audiotest.au', datadir), 'rb') as fp:
-- self._audiodata = fp.read()
-- self._au = MIMEAudio(self._audiodata)
--
-- def test_guess_minor_type(self):
-- self.assertEqual(self._au.get_content_type(), 'audio/basic')
--
-- def test_encoding(self):
-- payload = self._au.get_payload()
-- self.assertEqual(base64.decodebytes(bytes(payload, 'ascii')),
-- self._audiodata)
--
-- def test_checkSetMinor(self):
-- au = MIMEAudio(self._audiodata, 'fish')
-- self.assertEqual(au.get_content_type(), 'audio/fish')
--
-- def test_add_header(self):
-- eq = self.assertEqual
-- unless = self.assertTrue
-- self._au.add_header('Content-Disposition', 'attachment',
-- filename='audiotest.au')
-- eq(self._au['content-disposition'],
-- 'attachment; filename="audiotest.au"')
-- eq(self._au.get_params(header='content-disposition'),
-- [('attachment', ''), ('filename',
'audiotest.au')])
-- eq(self._au.get_param('filename',
header='content-disposition'),
-- 'audiotest.au')
-- missing = []
-- eq(self._au.get_param('attachment',
header='content-disposition'), '')
-- unless(self._au.get_param('foo', failobj=missing,
-- header='content-disposition') is missing)
-- # Try some missing stuff
-- unless(self._au.get_param('foobar', missing) is missing)
-- unless(self._au.get_param('attachment', missing,
-- header='foobar') is missing)
--
--
--
- # Test the basic MIMEImage class
- class TestMIMEImage(unittest.TestCase):
- def setUp(self):
diff --git a/python-3.3.0b1-lib64.patch b/python-3.3.0b1-lib64.patch
new file mode 100644
index 0000000..110ed0d
--- /dev/null
+++ b/python-3.3.0b1-lib64.patch
@@ -0,0 +1,200 @@
+diff -up Python-3.3.0b1/Lib/distutils/command/install.py.lib64
Python-3.3.0b1/Lib/distutils/command/install.py
+--- Python-3.3.0b1/Lib/distutils/command/install.py.lib64 2012-06-26 16:19:41.000000000
-0400
++++ Python-3.3.0b1/Lib/distutils/command/install.py 2012-07-20 13:09:38.760797382 -0400
+@@ -45,14 +45,14 @@ else:
+ 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',
+diff -up Python-3.3.0b1/Lib/distutils/sysconfig.py.lib64
Python-3.3.0b1/Lib/distutils/sysconfig.py
+--- Python-3.3.0b1/Lib/distutils/sysconfig.py.lib64 2012-06-26 16:19:41.000000000 -0400
++++ Python-3.3.0b1/Lib/distutils/sysconfig.py 2012-07-20 13:12:48.017431348 -0400
+@@ -138,8 +138,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:
+diff -up Python-3.3.0b1/Lib/site.py.lib64 Python-3.3.0b1/Lib/site.py
+--- Python-3.3.0b1/Lib/site.py.lib64 2012-06-26 16:19:45.000000000 -0400
++++ Python-3.3.0b1/Lib/site.py 2012-07-20 13:09:38.762797357 -0400
+@@ -303,12 +303,16 @@ def getsitepackages(prefixes=None):
+ if sys.platform in ('os2emx', 'riscos'):
+ sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
+ elif os.sep == '/':
++ sitepackages.append(os.path.join(prefix, "lib64",
++ "python" + sys.version[:3],
++ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
+ "python" + sys.version[:3],
+ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
+ else:
+ sitepackages.append(prefix)
++ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
+ if sys.platform == "darwin":
+ # for framework builds *only* we add the standard Apple
+diff -up Python-3.3.0b1/Lib/sysconfig.py.lib64 Python-3.3.0b1/Lib/sysconfig.py
+--- Python-3.3.0b1/Lib/sysconfig.py.lib64 2012-06-26 16:19:45.000000000 -0400
++++ Python-3.3.0b1/Lib/sysconfig.py 2012-07-20 13:14:59.721784816 -0400
+@@ -21,10 +21,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':
+@@ -81,10 +81,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}',
+diff -up Python-3.3.0b1/Lib/test/test_site.py.lib64 Python-3.3.0b1/Lib/test/test_site.py
+--- Python-3.3.0b1/Lib/test/test_site.py.lib64 2012-06-26 16:19:48.000000000 -0400
++++ Python-3.3.0b1/Lib/test/test_site.py 2012-07-20 13:09:38.764797333 -0400
+@@ -239,12 +239,15 @@ class HelperFunctionsTests(unittest.Test
+ self.assertEqual(dirs[2], wanted)
+ elif os.sep == '/':
+ # OS X non-framwework builds, Linux, FreeBSD, etc
+- self.assertEqual(len(dirs), 2)
+- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ self.assertEqual(len(dirs), 3)
++ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
+ 'site-packages')
+ self.assertEqual(dirs[0], wanted)
+- wanted = os.path.join('xoxo', 'lib', 'site-python')
++ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ 'site-packages')
+ self.assertEqual(dirs[1], wanted)
++ wanted = os.path.join('xoxo', 'lib', 'site-python')
++ self.assertEqual(dirs[2], wanted)
+ else:
+ # other platforms
+ self.assertEqual(len(dirs), 2)
+diff -up Python-3.3.0b1/Makefile.pre.in.lib64 Python-3.3.0b1/Makefile.pre.in
+--- Python-3.3.0b1/Makefile.pre.in.lib64 2012-07-20 13:09:38.742797608 -0400
++++ Python-3.3.0b1/Makefile.pre.in 2012-07-20 13:09:38.765797321 -0400
+@@ -107,7 +107,7 @@ LIBDIR= @libdir@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/lib64
+ ABIFLAGS= @ABIFLAGS@
+
+ # Detailed destination directories
+diff -up Python-3.3.0b1/Modules/getpath.c.lib64 Python-3.3.0b1/Modules/getpath.c
+--- Python-3.3.0b1/Modules/getpath.c.lib64 2012-06-26 16:19:54.000000000 -0400
++++ Python-3.3.0b1/Modules/getpath.c 2012-07-20 13:09:38.766797308 -0400
+@@ -122,8 +122,8 @@
+ #endif
+
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
++ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
+ #endif
+
+ #ifndef LANDMARK
+@@ -135,7 +135,7 @@ static wchar_t exec_prefix[MAXPATHLEN+1]
+ static wchar_t progpath[MAXPATHLEN+1];
+ static wchar_t *module_search_path = NULL;
+ static int module_search_path_malloced = 0;
+-static wchar_t *lib_python = L"lib/python" VERSION;
++static wchar_t *lib_python = L"lib64/python" VERSION;
+
+ static void
+ reduce(wchar_t *dir)
+@@ -669,7 +669,7 @@ calculate_path(void)
+ }
+ else
+ wcsncpy(zip_path, _prefix, MAXPATHLEN);
+- joinpath(zip_path, L"lib/python00.zip");
++ joinpath(zip_path, L"lib64/python00.zip");
+ bufsz = wcslen(zip_path); /* Replace "00" with version */
+ zip_path[bufsz - 6] = VERSION[0];
+ zip_path[bufsz - 5] = VERSION[2];
+@@ -679,7 +679,7 @@ calculate_path(void)
+ fprintf(stderr,
+ "Could not find platform dependent libraries
<exec_prefix>\n");
+ wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
+- joinpath(exec_prefix, L"lib/lib-dynload");
++ joinpath(exec_prefix, L"lib64/lib-dynload");
+ }
+ /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+
+diff -up Python-3.3.0b1/setup.py.lib64 Python-3.3.0b1/setup.py
+--- Python-3.3.0b1/setup.py.lib64 2012-06-26 16:19:58.000000000 -0400
++++ Python-3.3.0b1/setup.py 2012-07-20 13:09:38.767797295 -0400
+@@ -393,7 +393,7 @@ class PyBuildExt(build_ext):
+ # Ensure that /usr/local is always used, but the local build
+ # directories (i.e. '.' and 'Include') must be first. See
issue
+ # 10520.
+- 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')
+ self.add_multiarch_paths()
+
+@@ -652,11 +652,11 @@ class PyBuildExt(build_ext):
+ elif curses_library:
+ readline_libs.append(curses_library)
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/lib64/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( 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:
+@@ -693,8 +693,8 @@ class PyBuildExt(build_ext):
+ if krb5_h:
+ ssl_incs += krb5_h
+ ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
+- ['/usr/local/ssl/lib',
+- '/usr/contrib/ssl/lib/'
++ ['/usr/local/ssl/lib64',
++ '/usr/contrib/ssl/lib64/'
+ ] )
+
+ if (ssl_incs is not None and
diff --git a/python3.spec b/python3.spec
index fd1f504..5867aae 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,10 +2,11 @@
# Conditionals and other variables controlling the build
# ======================================================
-%global pybasever 3.2
+%global pybasever 3.3
+%global alphatag b1
# pybasever without the dot:
-%global pyshortver 32
+%global pyshortver 33
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -14,9 +15,13 @@
# for PEP 3149:
#
http://www.python.org/dev/peps/pep-3149/
+# ("configure.in" became "configure.ac" in Python 3.3 onwards, and
in
+# backports)
+
# ABIFLAGS, LDVERSION and SOABI are in the upstream Makefile
-%global ABIFLAGS_optimized mu
-%global ABIFLAGS_debug dmu
+# With Python 3.3, we lose the "u" suffix due to PEP 393
+%global ABIFLAGS_optimized m
+%global ABIFLAGS_debug dm
%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
@@ -31,9 +36,9 @@
# For example,
# foo/bar.py
# now has bytecode at:
-# foo/__pycache__/bar.cpython-32.pyc
-# foo/__pycache__/bar.cpython-32.pyo
-%global bytecode_suffixes .cpython-32.py?
+# foo/__pycache__/bar.cpython-33.pyc
+# foo/__pycache__/bar.cpython-33.pyo
+%global bytecode_suffixes .cpython-33.py?
# Python's configure script defines SOVERSION, and this is used in the Makefile
# to determine INSTSONAME, the name of the libpython DSO:
@@ -121,8 +126,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.3
-Release: 10%{?dist}
+Version: %{pybasever}.0
+Release: 0.1.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
@@ -182,7 +187,7 @@ BuildRequires: zlib-devel
# Source code and patches
# =======================
-Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
+Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}%{alphatag}....
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -219,17 +224,14 @@ Patch1: Python-3.1.1-rpath.patch
# The four TestMIMEAudio tests fail due to "audiotest.au" not being packaged.
# It's simplest to remove them:
-Patch3: python-3.2b2-remove-mimeaudio-tests.patch
+Patch3: 00003-remove-mimeaudio-tests.patch
# 00055 #
# Systemtap support: add statically-defined probe points
-# Patch based on upstream bug:
http://bugs.python.org/issue4111
-# fixed up by mjw and wcohen for 2.6.2, then fixed up by dmalcolm for 2.6.4
-# then rewritten by mjw (attachment 390110 of rhbz 545179); ported to 3.1.1 by
-# dmalcolm
+# Patch sent upstream as
http://bugs.python.org/issue14776
Patch55: 00055-systemtap.patch
-Patch102: python-3.2.3-lib64.patch
+Patch102: python-3.3.0b1-lib64.patch
# 00104 #
# Only used when "%{_lib}" == "lib64"
@@ -387,9 +389,9 @@ Patch146: 00146-hashlib-fips.patch
# 00147 #
# Add a sys._debugmallocstats() function
-# Based on patch 202 from RHEL 5's python.spec, with updates from rhbz#737198
# Sent upstream as
http://bugs.python.org/issue14785
-Patch147: 00147-add-debug-malloc-stats.patch
+# Upstream as of Python 3.3.0
+# Patch147: 00147-add-debug-malloc-stats.patch
# 00148 #
# Upstream as of Python 3.2.3:
@@ -594,7 +596,7 @@ can load its own extensions.
# ======================================================
%prep
-%setup -q -n Python-%{version}
+%setup -q -n Python-%{version}%{alphatag}
chmod +x %{SOURCE1}
%if 0%{?with_systemtap}
@@ -671,7 +673,7 @@ done
# 00144: not for python3
# 00145: not for python3
%patch146 -p1
-%patch147 -p1
+# 00147: upstream as of Python 3.3.0
# 00148: upstream as of Python 3.2.3
# 00149: upstream as of Python 3.2.3
%ifarch ppc %{power64}
@@ -765,10 +767,8 @@ BuildPython() {
--with-dbmliborder=gdbm:ndbm:bdb \
--with-system-expat \
--with-system-ffi \
- --with-wide-unicode \
%if 0%{?with_systemtap}
- --with-dtrace \
- --with-tapset-install-dir=%{tapsetdir} \
+ --with-systemtap \
%endif
%if 0%{?with_valgrind}
--with-valgrind \
@@ -919,8 +919,8 @@ install -d -m 0755
%{buildroot}/usr/lib/python%{pybasever}/site-packages/__pycac
%endif
# ABIFLAGS, LDVERSION and SOABI are in the upstream Makefile
-%global ABIFLAGS_optimized mu
-%global ABIFLAGS_debug dmu
+%global ABIFLAGS_optimized m
+%global ABIFLAGS_debug dm
%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
@@ -1160,7 +1160,9 @@ rm -fr %{buildroot}
%{_bindir}/pydoc*
%{_bindir}/python3
%{_bindir}/python%{pybasever}
-%{_bindir}/python%{pybasever}mu
+%{_bindir}/python%{pybasever}m
+%{_bindir}/pyvenv
+%{_bindir}/pyvenv-3.3
%{_mandir}/*/*
%files libs
@@ -1168,19 +1170,21 @@ rm -fr %{buildroot}
%doc LICENSE README
%dir %{pylibdir}
%dir %{dynload_dir}
-%{dynload_dir}/Python-%{version}-py%{pybasever}.egg-info
%{dynload_dir}/_bisect.%{SOABI_optimized}.so
+%{dynload_dir}/_bz2.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
+%{dynload_dir}/_crypt.%{SOABI_optimized}.so
%{dynload_dir}/_csv.%{SOABI_optimized}.so
%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
%{dynload_dir}/_curses.%{SOABI_optimized}.so
%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
%{dynload_dir}/_dbm.%{SOABI_optimized}.so
+%{dynload_dir}/_decimal.%{SOABI_optimized}.so
%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
@@ -1189,6 +1193,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_heapq.%{SOABI_optimized}.so
%{dynload_dir}/_json.%{SOABI_optimized}.so
%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
+%{dynload_dir}/_lzma.%{SOABI_optimized}.so
%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
%{dynload_dir}/_pickle.%{SOABI_optimized}.so
@@ -1202,9 +1207,7 @@ rm -fr %{buildroot}
%{dynload_dir}/atexit.%{SOABI_optimized}.so
%{dynload_dir}/audioop.%{SOABI_optimized}.so
%{dynload_dir}/binascii.%{SOABI_optimized}.so
-%{dynload_dir}/bz2.%{SOABI_optimized}.so
%{dynload_dir}/cmath.%{SOABI_optimized}.so
-%{dynload_dir}/crypt.%{SOABI_optimized}.so
%{dynload_dir}/_datetime.%{SOABI_optimized}.so
%{dynload_dir}/fcntl.%{SOABI_optimized}.so
%{dynload_dir}/grp.%{SOABI_optimized}.so
@@ -1231,7 +1234,11 @@ rm -fr %{buildroot}
%{pylibdir}/*.py
%dir %{pylibdir}/__pycache__/
%{pylibdir}/__pycache__/*%{bytecode_suffixes}
-%{pylibdir}/wsgiref.egg-info
+
+%dir %{pylibdir}/collections/
+%dir %{pylibdir}/collections/__pycache__/
+%{pylibdir}/collections/*.py
+%{pylibdir}/collections/__pycache__/*%{bytecode_suffixes}
%dir %{pylibdir}/concurrent/
%dir %{pylibdir}/concurrent/__pycache__/
@@ -1268,6 +1275,7 @@ rm -fr %{buildroot}
%{pylibdir}/email/*.py
%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/email/mime
+%doc %{pylibdir}/email/architecture.rst
%{pylibdir}/encodings
%{pylibdir}/html
@@ -1288,7 +1296,7 @@ rm -fr %{buildroot}
%exclude %{pylibdir}/lib2to3/tests
%{pylibdir}/logging
%{pylibdir}/multiprocessing
-%{pylibdir}/plat-linux2
+%{pylibdir}/plat-linux
%{pylibdir}/pydoc_data
%dir %{pylibdir}/sqlite3/
@@ -1312,6 +1320,13 @@ rm -fr %{buildroot}
%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/urllib
+
+%dir %{pylibdir}/venv/
+%dir %{pylibdir}/venv/__pycache__/
+%{pylibdir}/venv/*.py
+%{pylibdir}/venv/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/venv/scripts
+
%{pylibdir}/wsgiref
%{pylibdir}/xml
%{pylibdir}/xmlrpc
@@ -1380,11 +1395,11 @@ rm -fr %{buildroot}
%defattr(-, root, root)
%{pylibdir}/ctypes/test
%{pylibdir}/distutils/tests
-%{pylibdir}/email/test
%{pylibdir}/importlib/test
%{pylibdir}/sqlite3/test
%{pylibdir}/test
%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
+%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
%{pylibdir}/lib2to3/tests
%{pylibdir}/tkinter/test
@@ -1408,17 +1423,20 @@ rm -fr %{buildroot}
# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
%{dynload_dir}/_bisect.%{SOABI_debug}.so
+%{dynload_dir}/_bz2.%{SOABI_debug}.so
%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
+%{dynload_dir}/_crypt.%{SOABI_debug}.so
%{dynload_dir}/_csv.%{SOABI_debug}.so
%{dynload_dir}/_ctypes.%{SOABI_debug}.so
%{dynload_dir}/_curses.%{SOABI_debug}.so
%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
%{dynload_dir}/_dbm.%{SOABI_debug}.so
+%{dynload_dir}/_decimal.%{SOABI_debug}.so
%{dynload_dir}/_elementtree.%{SOABI_debug}.so
%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_debug}.so
@@ -1427,6 +1445,7 @@ rm -fr %{buildroot}
%{dynload_dir}/_heapq.%{SOABI_debug}.so
%{dynload_dir}/_json.%{SOABI_debug}.so
%{dynload_dir}/_lsprof.%{SOABI_debug}.so
+%{dynload_dir}/_lzma.%{SOABI_debug}.so
%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
%{dynload_dir}/_pickle.%{SOABI_debug}.so
@@ -1440,9 +1459,7 @@ rm -fr %{buildroot}
%{dynload_dir}/atexit.%{SOABI_debug}.so
%{dynload_dir}/audioop.%{SOABI_debug}.so
%{dynload_dir}/binascii.%{SOABI_debug}.so
-%{dynload_dir}/bz2.%{SOABI_debug}.so
%{dynload_dir}/cmath.%{SOABI_debug}.so
-%{dynload_dir}/crypt.%{SOABI_debug}.so
%{dynload_dir}/_datetime.%{SOABI_debug}.so
%{dynload_dir}/fcntl.%{SOABI_debug}.so
%{dynload_dir}/grp.%{SOABI_debug}.so
@@ -1487,6 +1504,7 @@ rm -fr %{buildroot}
# Analog of the -test subpackage's files:
%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
+%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
%{dynload_dir}/_testcapi.%{SOABI_debug}.so
%endif # with_debug_build
@@ -1510,6 +1528,18 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.3.0-0.1.b1
+- 3.2 -> 3.3:
https://fedoraproject.org/wiki/Features/Python_3.3
+- 3.3.0b1: refresh patches 3, 55, 102, 111, 113, 114, 134, 157; drop upstream
+patch 147; regenenerate autotools patch; drop "--with-wide-unicode" from
+configure (PEP 393); "plat-linux2" -> "plat-linux" (upstream issue
12326);
+"bz2" -> "_bz2" and "crypt" -> "_crypt";
egg-info files are no longer shipped
+for stdlib (upstream issues 10645 and 12218); email/test moved to
+test/test_email; add /usr/bin/pyvenv[-3.3] and venv module (PEP 405); add
+_decimal and _lzma modules; make collections modules explicit in payload again
+(upstream issue 11085); add _testbuffer module to tests subpackage (added in
+upstream commit 3f9b3b6f7ff0)
+
* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
- use macro for power64 (rhbz#834653)
diff --git a/sources b/sources
index 9d0aae5..b2e8d32 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-187564726f2c1473d301c586acc24847 Python-3.2.3.tar.xz
+710047668636097f7557ba45953fce1a Python-3.3.0b1.tar.xz
commit cc2383541f5417adcfb8d734f6cdefecfc4f22c0
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Jun 22 13:43:37 2012 -0400
3.2.3-10: use macro for power64 (rhbz#834653)
diff --git a/python3.spec b/python3.spec
index f7fe76f..fd1f504 100644
--- a/python3.spec
+++ b/python3.spec
@@ -53,7 +53,7 @@
%global with_systemtap 1
# some arches don't have valgrind so we need to disable its support on them
-%ifarch %{ix86} x86_64 ppc ppc64 s390x
+%ifarch %{ix86} x86_64 ppc %{power64} s390x
%global with_valgrind 1
%else
%global with_valgrind 0
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -650,7 +650,7 @@ done
%patch129 -p1
-%ifarch ppc ppc64
+%ifarch ppc %{power64}
%patch131 -p1
%endif
@@ -674,7 +674,7 @@ done
%patch147 -p1
# 00148: upstream as of Python 3.2.3
# 00149: upstream as of Python 3.2.3
-%ifarch ppc ppc64
+%ifarch ppc %{power64}
%patch150 -p1
%endif
# 00151: not for python3
@@ -797,7 +797,7 @@ BuildPython() {
BuildPython debug \
python-debug \
python%{pybasever}-debug \
-%ifarch %{ix86} x86_64 ppc ppc64
+%ifarch %{ix86} x86_64 ppc %{power64}
"--with-pydebug --with-tsc --with-count-allocs --with-call-profile" \
%else
"--with-pydebug --with-count-allocs --with-call-profile" \
@@ -912,7 +912,7 @@ install -d -m 0755
%{buildroot}/usr/lib/python%{pybasever}/site-packages/__pycac
%global _pyconfig32_h pyconfig-32.h
%global _pyconfig64_h pyconfig-64.h
-%ifarch ppc64 s390x x86_64 ia64 alpha sparc64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64
%global _pyconfig_h %{_pyconfig64_h}
%else
%global _pyconfig_h %{_pyconfig32_h}
@@ -1071,7 +1071,7 @@ ln -s \
# Install a tapset for this libpython into tapsetdir, fixing up the path to the
# library:
mkdir -p %{buildroot}%{tapsetdir}
-%ifarch ppc64 s390x x86_64 ia64 alpha sparc64
+%ifarch %{power64} s390x x86_64 ia64 alpha sparc64
%global libpython_stp_optimized libpython%{pybasever}-64.stp
%global libpython_stp_debug libpython%{pybasever}-debug-64.stp
%else
@@ -1510,6 +1510,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jun 22 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-10
+- use macro for power64 (rhbz#834653)
+
* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
commit a25ec0b524e1b8eb86aea0e83d89119d8a132168
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Jun 19 12:01:07 2012 -0400
3.2.3-9: fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
index 2f41ef6..6be557d 100644
--- a/00157-uid-gid-overflows.patch
+++ b/00157-uid-gid-overflows.patch
@@ -1,7 +1,15 @@
diff -up Python-3.2.3/Include/modsupport.h.uid-gid-overflows
Python-3.2.3/Include/modsupport.h
---- Python-3.2.3/Include/modsupport.h.uid-gid-overflows 2012-05-16 11:56:26.947069274
-0400
-+++ Python-3.2.3/Include/modsupport.h 2012-05-16 11:56:26.545066073 -0400
-@@ -122,6 +122,17 @@ PyAPI_FUNC(PyObject *) PyModule_Create2(
+--- Python-3.2.3/Include/modsupport.h.uid-gid-overflows 2012-04-11 02:54:01.000000000
-0400
++++ Python-3.2.3/Include/modsupport.h 2012-06-18 17:20:38.193527374 -0400
+@@ -8,6 +8,7 @@ extern "C" {
+ /* Module support interface */
+
+ #include <stdarg.h>
++#include <sys/types.h>
+
+ /* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier
+ to mean Py_ssize_t */
+@@ -122,6 +123,17 @@ PyAPI_FUNC(PyObject *) PyModule_Create2(
PyAPI_DATA(char *) _Py_PackageContext;
#endif
@@ -19,10 +27,9 @@ diff -up Python-3.2.3/Include/modsupport.h.uid-gid-overflows
Python-3.2.3/Includ
#ifdef __cplusplus
}
#endif
-diff -up Python-3.2.3/Lib/test/test_grp.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_grp.py
diff -up Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_os.py
---- Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows 2012-05-16 11:56:50.427256400
-0400
-+++ Python-3.2.3/Lib/test/test_os.py 2012-05-16 11:56:49.848251767 -0400
+--- Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows 2012-04-11 02:54:05.000000000
-0400
++++ Python-3.2.3/Lib/test/test_os.py 2012-06-18 17:20:18.360775320 -0400
@@ -885,30 +885,36 @@ if sys.platform != 'win32':
def test_setuid(self):
if os.getuid() != 0:
@@ -70,8 +77,8 @@ diff -up Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows
Python-3.2.3/Lib/tes
self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
diff -up Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_posix.py
---- Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows 2012-05-16 11:56:51.579265577
-0400
-+++ Python-3.2.3/Lib/test/test_posix.py 2012-05-16 11:56:47.142230218 -0400
+--- Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows 2012-04-11 02:54:05.000000000
-0400
++++ Python-3.2.3/Lib/test/test_posix.py 2012-06-18 17:20:18.360775320 -0400
@@ -227,7 +227,7 @@ class PosixTester(unittest.TestCase):
else:
self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
@@ -123,8 +130,8 @@ diff -up Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows
Python-3.2.3/Lib/
def test_chdir(self):
if hasattr(posix, 'chdir'):
diff -up Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_pwd.py
---- Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows 2012-05-16 11:56:47.171230447
-0400
-+++ Python-3.2.3/Lib/test/test_pwd.py 2012-05-17 14:52:07.425548111 -0400
+--- Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows 2012-04-11 02:54:05.000000000
-0400
++++ Python-3.2.3/Lib/test/test_pwd.py 2012-06-18 17:20:18.360775320 -0400
@@ -87,9 +87,9 @@ class PwdTest(unittest.TestCase):
# In some cases, byuids isn't a complete list of all users in the
# system, so if we try to pick a value not in byuids (via a perturbing
@@ -138,8 +145,8 @@ diff -up Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.2.3/Lib/te
self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
diff -up Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows
Python-3.2.3/Modules/grpmodule.c
---- Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows 2012-05-16 11:56:20.025014112
-0400
-+++ Python-3.2.3/Modules/grpmodule.c 2012-05-16 11:56:19.682011408 -0400
+--- Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows 2012-04-11 02:54:07.000000000
-0400
++++ Python-3.2.3/Modules/grpmodule.c 2012-06-18 17:20:18.361775307 -0400
@@ -69,7 +69,7 @@ mkgrent(struct group *p)
Py_INCREF(Py_None);
}
@@ -175,8 +182,8 @@ diff -up Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows
Python-3.2.3/Modules
}
return mkgrent(p);
diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modules/posixmodule.c
---- Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows 2012-05-16 11:56:23.722043536
-0400
-+++ Python-3.2.3/Modules/posixmodule.c 2012-05-16 11:56:23.836044488 -0400
+--- Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows 2012-06-18 17:20:18.258776596
-0400
++++ Python-3.2.3/Modules/posixmodule.c 2012-06-18 17:20:18.362775294 -0400
@@ -1642,8 +1642,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
#endif
@@ -538,8 +545,8 @@ diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modul
#endif
diff -up Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows
Python-3.2.3/Modules/pwdmodule.c
---- Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows 2012-05-16 11:56:21.353024696
-0400
-+++ Python-3.2.3/Modules/pwdmodule.c 2012-05-17 14:47:37.465332677 -0400
+--- Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows 2012-04-11 02:54:07.000000000
-0400
++++ Python-3.2.3/Modules/pwdmodule.c 2012-06-18 17:20:18.362775294 -0400
@@ -74,8 +74,8 @@ mkpwent(struct passwd *p)
#else
SETS(setIndex++, p->pw_passwd);
@@ -570,8 +577,8 @@ diff -up Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows
Python-3.2.3/Modules
}
return mkpwent(p);
diff -up Python-3.2.3/Python/getargs.c.uid-gid-overflows Python-3.2.3/Python/getargs.c
---- Python-3.2.3/Python/getargs.c.uid-gid-overflows 2012-05-16 11:56:34.572130014 -0400
-+++ Python-3.2.3/Python/getargs.c 2012-05-16 11:56:34.042125832 -0400
+--- Python-3.2.3/Python/getargs.c.uid-gid-overflows 2012-04-11 02:54:08.000000000 -0400
++++ Python-3.2.3/Python/getargs.c 2012-06-18 17:20:18.363775282 -0400
@@ -4,6 +4,7 @@
#include "Python.h"
@@ -580,7 +587,7 @@ diff -up Python-3.2.3/Python/getargs.c.uid-gid-overflows
Python-3.2.3/Python/get
#ifdef __cplusplus
-@@ -1789,6 +1790,102 @@ _PyArg_NoKeywords(const char *funcname,
+@@ -1789,6 +1790,102 @@ _PyArg_NoKeywords(const char *funcname,
funcname);
return 0;
}
diff --git a/python3.spec b/python3.spec
index fdacbdf..f7fe76f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -1510,6 +1510,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jun 18 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-9
+- fix missing include in uid/gid handling patch (patch 157; rhbz#830405)
+
* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
- fix tapset for debug build
commit f011cdc3fa826cdd9f209bf987f376333ca364ca
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu Jun 7 10:35:31 2012 +0200
fix tapset for debug build
diff --git a/python3.spec b/python3.spec
index 4d9ca8c..fdacbdf 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -1085,8 +1085,12 @@ sed \
%{buildroot}%{tapsetdir}/%{libpython_stp_optimized}
%if 0%{?with_debug_build}
+# In Python 3, python3 and python3-debug don't point to the same binary,
+# so we have to replace "python3" with "python3-debug" to get
systemtap
+# working with debug build
sed \
-e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_debug}|" \
+ -e 's|"python3"|"python3-debug"|' \
%{_sourcedir}/libpython.stp \
%{buildroot}%{tapsetdir}/%{libpython_stp_debug}
%endif #
with_debug_build
@@ -1506,6 +1510,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed May 30 2012 Bohuslav Kabrda <bkabrda(a)redhat.com> - 3.2.3-8
+- fix tapset for debug build
+
* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
- update uid/gid handling to avoid int overflows seen with uid/gid
values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
commit 7989368053a372e8fdb5d9247541763b3720c6fe
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri May 18 14:57:53 2012 -0400
3.2.3-7: update uid/gid handling (patch 157; rhbz#697470)
* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
- update uid/gid handling to avoid int overflows seen with uid/gid
values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
diff --git a/00157-uid-gid-overflows.patch b/00157-uid-gid-overflows.patch
new file mode 100644
index 0000000..2f41ef6
--- /dev/null
+++ b/00157-uid-gid-overflows.patch
@@ -0,0 +1,685 @@
+diff -up Python-3.2.3/Include/modsupport.h.uid-gid-overflows
Python-3.2.3/Include/modsupport.h
+--- Python-3.2.3/Include/modsupport.h.uid-gid-overflows 2012-05-16 11:56:26.947069274
-0400
++++ Python-3.2.3/Include/modsupport.h 2012-05-16 11:56:26.545066073 -0400
+@@ -122,6 +122,17 @@ PyAPI_FUNC(PyObject *) PyModule_Create2(
+ PyAPI_DATA(char *) _Py_PackageContext;
+ #endif
+
++/*
++ Non-standard extension: support for dealing with uid_t and gid_t without
++ integer overflow
++ */
++
++PyAPI_FUNC(PyObject *) _PyObject_FromUid(uid_t uid);
++PyAPI_FUNC(PyObject *) _PyObject_FromGid(gid_t gid);
++
++PyAPI_FUNC(int) _PyArg_ParseUid(PyObject *in_obj, uid_t *out_uid);
++PyAPI_FUNC(int) _PyArg_ParseGid(PyObject *in_obj, gid_t *out_gid);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -up Python-3.2.3/Lib/test/test_grp.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_grp.py
+diff -up Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_os.py
+--- Python-3.2.3/Lib/test/test_os.py.uid-gid-overflows 2012-05-16 11:56:50.427256400
-0400
++++ Python-3.2.3/Lib/test/test_os.py 2012-05-16 11:56:49.848251767 -0400
+@@ -885,30 +885,36 @@ if sys.platform != 'win32':
+ def test_setuid(self):
+ if os.getuid() != 0:
+ self.assertRaises(os.error, os.setuid, 0)
++ self.assertRaises(TypeError, os.setuid, 'not an int')
+ self.assertRaises(OverflowError, os.setuid, 1<<32)
+
+ if hasattr(os, 'setgid'):
+ def test_setgid(self):
+ if os.getuid() != 0:
+ self.assertRaises(os.error, os.setgid, 0)
++ self.assertRaises(TypeError, os.setgid, 'not an int')
+ self.assertRaises(OverflowError, os.setgid, 1<<32)
+
+ if hasattr(os, 'seteuid'):
+ def test_seteuid(self):
+ if os.getuid() != 0:
+ self.assertRaises(os.error, os.seteuid, 0)
++ self.assertRaises(TypeError, os.seteuid, 'not an int')
+ self.assertRaises(OverflowError, os.seteuid, 1<<32)
+
+ if hasattr(os, 'setegid'):
+ def test_setegid(self):
+ if os.getuid() != 0:
+ self.assertRaises(os.error, os.setegid, 0)
++ self.assertRaises(TypeError, os.setegid, 'not an int')
+ self.assertRaises(OverflowError, os.setegid, 1<<32)
+
+ if hasattr(os, 'setreuid'):
+ def test_setreuid(self):
+ if os.getuid() != 0:
+ self.assertRaises(os.error, os.setreuid, 0, 0)
++ self.assertRaises(TypeError, os.setreuid, 'not an int', 0)
++ self.assertRaises(TypeError, os.setreuid, 0, 'not an int')
+ self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
+ self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
+
+@@ -923,6 +929,8 @@ if sys.platform != 'win32':
+ def test_setregid(self):
+ if os.getuid() != 0:
+ self.assertRaises(os.error, os.setregid, 0, 0)
++ self.assertRaises(TypeError, os.setregid, 'not an int', 0)
++ self.assertRaises(TypeError, os.setregid, 0, 'not an int')
+ self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
+ self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
+
+diff -up Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_posix.py
+--- Python-3.2.3/Lib/test/test_posix.py.uid-gid-overflows 2012-05-16 11:56:51.579265577
-0400
++++ Python-3.2.3/Lib/test/test_posix.py 2012-05-16 11:56:47.142230218 -0400
+@@ -227,7 +227,7 @@ class PosixTester(unittest.TestCase):
+ else:
+ self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
+
+- def _test_all_chown_common(self, chown_func, first_param):
++ def _test_all_chown_common(self, chown_func, stat_func, first_param):
+ """Common code for chown, fchown and lchown
tests."""
+ if os.getuid() == 0:
+ try:
+@@ -246,6 +246,13 @@ class PosixTester(unittest.TestCase):
+ first_param, 0, 0)
+ # test a successful chown call
+ chown_func(first_param, os.getuid(), os.getgid())
++ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
++ self.assertEqual(stat_func(first_param).st_gid, os.getgid())
++
++ # verify that -1 works as a "do-nothing" option:
++ chown_func(first_param, -1, -1)
++ self.assertEqual(stat_func(first_param).st_uid, os.getuid())
++ self.assertEqual(stat_func(first_param).st_gid, os.getgid())
+
+ @unittest.skipUnless(hasattr(posix, 'chown'), "test needs
os.chown()")
+ def test_chown(self):
+@@ -255,7 +262,7 @@ class PosixTester(unittest.TestCase):
+
+ # re-create the file
+ open(support.TESTFN, 'w').close()
+- self._test_all_chown_common(posix.chown, support.TESTFN)
++ self._test_all_chown_common(posix.chown, posix.stat, support.TESTFN)
+
+ @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs
os.fchown()")
+ def test_fchown(self):
+@@ -265,7 +272,7 @@ class PosixTester(unittest.TestCase):
+ test_file = open(support.TESTFN, 'w')
+ try:
+ fd = test_file.fileno()
+- self._test_all_chown_common(posix.fchown, fd)
++ self._test_all_chown_common(posix.fchown, posix.fstat, fd)
+ finally:
+ test_file.close()
+
+@@ -274,7 +281,7 @@ class PosixTester(unittest.TestCase):
+ os.unlink(support.TESTFN)
+ # create a symlink
+ os.symlink(_DUMMY_SYMLINK, support.TESTFN)
+- self._test_all_chown_common(posix.lchown, support.TESTFN)
++ self._test_all_chown_common(posix.lchown, posix.lstat, support.TESTFN)
+
+ def test_chdir(self):
+ if hasattr(posix, 'chdir'):
+diff -up Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows
Python-3.2.3/Lib/test/test_pwd.py
+--- Python-3.2.3/Lib/test/test_pwd.py.uid-gid-overflows 2012-05-16 11:56:47.171230447
-0400
++++ Python-3.2.3/Lib/test/test_pwd.py 2012-05-17 14:52:07.425548111 -0400
+@@ -87,9 +87,9 @@ class PwdTest(unittest.TestCase):
+ # In some cases, byuids isn't a complete list of all users in the
+ # system, so if we try to pick a value not in byuids (via a perturbing
+ # loop, say), pwd.getpwuid() might still be able to find data for that
+- # uid. Using sys.maxint may provoke the same problems, but hopefully
++ # uid. Using 2**32 - 2 may provoke the same problems, but hopefully
+ # it will be a more repeatable failure.
+- fakeuid = sys.maxsize
++ fakeuid = 2**32 - 2
+ self.assertNotIn(fakeuid, byuids)
+ self.assertRaises(KeyError, pwd.getpwuid, fakeuid)
+
+diff -up Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows
Python-3.2.3/Modules/grpmodule.c
+--- Python-3.2.3/Modules/grpmodule.c.uid-gid-overflows 2012-05-16 11:56:20.025014112
-0400
++++ Python-3.2.3/Modules/grpmodule.c 2012-05-16 11:56:19.682011408 -0400
+@@ -69,7 +69,7 @@ mkgrent(struct group *p)
+ Py_INCREF(Py_None);
+ }
+ #endif
+- SET(setIndex++, PyLong_FromLong((long) p->gr_gid));
++ SET(setIndex++, _PyObject_FromGid(p->gr_gid));
+ SET(setIndex++, w);
+ #undef SET
+
+@@ -84,18 +84,16 @@ mkgrent(struct group *p)
+ static PyObject *
+ grp_getgrgid(PyObject *self, PyObject *pyo_id)
+ {
+- PyObject *py_int_id;
+- unsigned int gid;
++ gid_t gid;
+ struct group *p;
+
+- py_int_id = PyNumber_Long(pyo_id);
+- if (!py_int_id)
+- return NULL;
+- gid = PyLong_AS_LONG(py_int_id);
+- Py_DECREF(py_int_id);
++ if (!_PyArg_ParseGid(pyo_id, &gid)) {
++ return NULL;
++ }
+
+ if ((p = getgrgid(gid)) == NULL) {
+- PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);
++ PyErr_Format(PyExc_KeyError,
++ "getgrgid(): gid not found: %lu", (unsigned long)gid);
+ return NULL;
+ }
+ return mkgrent(p);
+diff -up Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows
Python-3.2.3/Modules/posixmodule.c
+--- Python-3.2.3/Modules/posixmodule.c.uid-gid-overflows 2012-05-16 11:56:23.722043536
-0400
++++ Python-3.2.3/Modules/posixmodule.c 2012-05-16 11:56:23.836044488 -0400
+@@ -1642,8 +1642,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
+ PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
+ #endif
+ PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
+- PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long)st->st_uid));
+- PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long)st->st_gid));
++ PyStructSequence_SET_ITEM(v, 4, _PyObject_FromUid(st->st_uid));
++ PyStructSequence_SET_ITEM(v, 5, _PyObject_FromGid(st->st_gid));
+ #ifdef HAVE_LARGEFILE_SUPPORT
+ PyStructSequence_SET_ITEM(v, 6,
+ PyLong_FromLongLong((PY_LONG_LONG)st->st_size));
+@@ -2172,15 +2172,17 @@ posix_chown(PyObject *self, PyObject *ar
+ {
+ PyObject *opath;
+ char *path;
+- long uid, gid;
++ uid_t uid;
++ gid_t gid;
+ int res;
+- if (!PyArg_ParseTuple(args, "O&ll:chown",
++ if (!PyArg_ParseTuple(args, "O&O&O&:chown",
+ PyUnicode_FSConverter, &opath,
+- &uid, &gid))
++ _PyArg_ParseUid, &uid,
++ _PyArg_ParseGid, &gid))
+ return NULL;
+ path = PyBytes_AsString(opath);
+ Py_BEGIN_ALLOW_THREADS
+- res = chown(path, (uid_t) uid, (gid_t) gid);
++ res = chown(path, uid, gid);
+ Py_END_ALLOW_THREADS
+ if (res < 0)
+ return posix_error_with_allocated_filename(opath);
+@@ -2200,12 +2202,15 @@ static PyObject *
+ posix_fchown(PyObject *self, PyObject *args)
+ {
+ int fd;
+- long uid, gid;
++ uid_t uid;
++ gid_t gid;
+ int res;
+- if (!PyArg_ParseTuple(args, "ill:fchown", &fd, &uid, &gid))
++ if (!PyArg_ParseTuple(args, "iO&O&:chown", &fd,
++ _PyArg_ParseUid, &uid,
++ _PyArg_ParseGid, &gid))
+ return NULL;
+ Py_BEGIN_ALLOW_THREADS
+- res = fchown(fd, (uid_t) uid, (gid_t) gid);
++ res = fchown(fd, uid, gid);
+ Py_END_ALLOW_THREADS
+ if (res < 0)
+ return posix_error();
+@@ -2224,15 +2229,17 @@ posix_lchown(PyObject *self, PyObject *a
+ {
+ PyObject *opath;
+ char *path;
+- long uid, gid;
++ uid_t uid;
++ gid_t gid;
+ int res;
+- if (!PyArg_ParseTuple(args, "O&ll:lchown",
++ if (!PyArg_ParseTuple(args, "O&O&O&:lchown",
+ PyUnicode_FSConverter, &opath,
+- &uid, &gid))
++ _PyArg_ParseUid, &uid,
++ _PyArg_ParseGid, &gid))
+ return NULL;
+ path = PyBytes_AsString(opath);
+ Py_BEGIN_ALLOW_THREADS
+- res = lchown(path, (uid_t) uid, (gid_t) gid);
++ res = lchown(path, uid, gid);
+ Py_END_ALLOW_THREADS
+ if (res < 0)
+ return posix_error_with_allocated_filename(opath);
+@@ -4287,7 +4294,7 @@ Return the current process's effective g
+ static PyObject *
+ posix_getegid(PyObject *self, PyObject *noargs)
+ {
+- return PyLong_FromLong((long)getegid());
++ return _PyObject_FromGid(getegid());
+ }
+ #endif
+
+@@ -4300,7 +4307,7 @@ Return the current process's effective u
+ static PyObject *
+ posix_geteuid(PyObject *self, PyObject *noargs)
+ {
+- return PyLong_FromLong((long)geteuid());
++ return _PyObject_FromUid(geteuid());
+ }
+ #endif
+
+@@ -4313,7 +4320,7 @@ Return the current process's group id.")
+ static PyObject *
+ posix_getgid(PyObject *self, PyObject *noargs)
+ {
+- return PyLong_FromLong((long)getgid());
++ return _PyObject_FromGid(getgid());
+ }
+ #endif
+
+@@ -4388,7 +4395,7 @@ posix_getgroups(PyObject *self, PyObject
+ if (result != NULL) {
+ int i;
+ for (i = 0; i < n; ++i) {
+- PyObject *o = PyLong_FromLong((long)alt_grouplist[i]);
++ PyObject *o = _PyObject_FromGid(alt_grouplist[i]);
+ if (o == NULL) {
+ Py_DECREF(result);
+ result = NULL;
+@@ -4419,14 +4426,15 @@ posix_initgroups(PyObject *self, PyObjec
+ PyObject *oname;
+ char *username;
+ int res;
+- long gid;
++ gid_t gid;
+
+- if (!PyArg_ParseTuple(args, "O&l:initgroups",
+- PyUnicode_FSConverter, &oname, &gid))
++ if (!PyArg_ParseTuple(args, "O&O&:initgroups",
++ PyUnicode_FSConverter, &oname,
++ _PyArg_ParseGid, &gid))
+ return NULL;
+ username = PyBytes_AS_STRING(oname);
+
+- res = initgroups(username, (gid_t) gid);
++ res = initgroups(username, gid);
+ Py_DECREF(oname);
+ if (res == -1)
+ return PyErr_SetFromErrno(PyExc_OSError);
+@@ -4601,7 +4609,7 @@ Return the current process's user id.");
+ static PyObject *
+ posix_getuid(PyObject *self, PyObject *noargs)
+ {
+- return PyLong_FromLong((long)getuid());
++ return _PyObject_FromUid(getuid());
+ }
+ #endif
+
+@@ -4741,15 +4749,9 @@ Set the current process's user id.");
+ static PyObject *
+ posix_setuid(PyObject *self, PyObject *args)
+ {
+- long uid_arg;
+ uid_t uid;
+- if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg))
+- return NULL;
+- uid = uid_arg;
+- if (uid != uid_arg) {
+- PyErr_SetString(PyExc_OverflowError, "user id too big");
++ if (!PyArg_ParseTuple(args, "O&:setuid", _PyArg_ParseUid, &uid))
+ return NULL;
+- }
+ if (setuid(uid) < 0)
+ return posix_error();
+ Py_INCREF(Py_None);
+@@ -4766,15 +4768,9 @@ Set the current process's effective user
+ static PyObject *
+ posix_seteuid (PyObject *self, PyObject *args)
+ {
+- long euid_arg;
+ uid_t euid;
+- if (!PyArg_ParseTuple(args, "l", &euid_arg))
+- return NULL;
+- euid = euid_arg;
+- if (euid != euid_arg) {
+- PyErr_SetString(PyExc_OverflowError, "user id too big");
++ if (!PyArg_ParseTuple(args, "O&:seteuid", _PyArg_ParseUid,
&euid))
+ return NULL;
+- }
+ if (seteuid(euid) < 0) {
+ return posix_error();
+ } else {
+@@ -4792,15 +4788,9 @@ Set the current process's effective grou
+ static PyObject *
+ posix_setegid (PyObject *self, PyObject *args)
+ {
+- long egid_arg;
+ gid_t egid;
+- if (!PyArg_ParseTuple(args, "l", &egid_arg))
+- return NULL;
+- egid = egid_arg;
+- if (egid != egid_arg) {
+- PyErr_SetString(PyExc_OverflowError, "group id too big");
++ if (!PyArg_ParseTuple(args, "O&:setegid", _PyArg_ParseGid,
&egid))
+ return NULL;
+- }
+ if (setegid(egid) < 0) {
+ return posix_error();
+ } else {
+@@ -4818,23 +4808,11 @@ Set the current process's real and effec
+ static PyObject *
+ posix_setreuid (PyObject *self, PyObject *args)
+ {
+- long ruid_arg, euid_arg;
+ uid_t ruid, euid;
+- if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
+- return NULL;
+- if (ruid_arg == -1)
+- ruid = (uid_t)-1; /* let the compiler choose how -1 fits */
+- else
+- ruid = ruid_arg; /* otherwise, assign from our long */
+- if (euid_arg == -1)
+- euid = (uid_t)-1;
+- else
+- euid = euid_arg;
+- if ((euid_arg != -1 && euid != euid_arg) ||
+- (ruid_arg != -1 && ruid != ruid_arg)) {
+- PyErr_SetString(PyExc_OverflowError, "user id too big");
++ if (!PyArg_ParseTuple(args, "O&O&",
++ _PyArg_ParseUid, &ruid,
++ _PyArg_ParseUid, &euid))
+ return NULL;
+- }
+ if (setreuid(ruid, euid) < 0) {
+ return posix_error();
+ } else {
+@@ -4852,23 +4830,11 @@ Set the current process's real and effec
+ static PyObject *
+ posix_setregid (PyObject *self, PyObject *args)
+ {
+- long rgid_arg, egid_arg;
+ gid_t rgid, egid;
+- if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
+- return NULL;
+- if (rgid_arg == -1)
+- rgid = (gid_t)-1; /* let the compiler choose how -1 fits */
+- else
+- rgid = rgid_arg; /* otherwise, assign from our long */
+- if (egid_arg == -1)
+- egid = (gid_t)-1;
+- else
+- egid = egid_arg;
+- if ((egid_arg != -1 && egid != egid_arg) ||
+- (rgid_arg != -1 && rgid != rgid_arg)) {
+- PyErr_SetString(PyExc_OverflowError, "group id too big");
++ if (!PyArg_ParseTuple(args, "O&O&",
++ _PyArg_ParseGid, &rgid,
++ _PyArg_ParseGid, &egid))
+ return NULL;
+- }
+ if (setregid(rgid, egid) < 0) {
+ return posix_error();
+ } else {
+@@ -4886,15 +4852,9 @@ Set the current process's group id.");
+ static PyObject *
+ posix_setgid(PyObject *self, PyObject *args)
+ {
+- long gid_arg;
+ gid_t gid;
+- if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg))
++ if (!PyArg_ParseTuple(args, "O&:setgid", _PyArg_ParseGid, &gid))
+ return NULL;
+- gid = gid_arg;
+- if (gid != gid_arg) {
+- PyErr_SetString(PyExc_OverflowError, "group id too big");
+- return NULL;
+- }
+ if (setgid(gid) < 0)
+ return posix_error();
+ Py_INCREF(Py_None);
+@@ -4927,27 +4887,9 @@ posix_setgroups(PyObject *self, PyObject
+ elem = PySequence_GetItem(groups, i);
+ if (!elem)
+ return NULL;
+- if (!PyLong_Check(elem)) {
+- PyErr_SetString(PyExc_TypeError,
+- "groups must be integers");
++ if (!_PyArg_ParseGid(elem, &grouplist[i])) {
+ Py_DECREF(elem);
+ return NULL;
+- } else {
+- unsigned long x = PyLong_AsUnsignedLong(elem);
+- if (PyErr_Occurred()) {
+- PyErr_SetString(PyExc_TypeError,
+- "group id too big");
+- Py_DECREF(elem);
+- return NULL;
+- }
+- grouplist[i] = x;
+- /* read back the value to see if it fitted in gid_t */
+- if (grouplist[i] != x) {
+- PyErr_SetString(PyExc_TypeError,
+- "group id too big");
+- Py_DECREF(elem);
+- return NULL;
+- }
+ }
+ Py_DECREF(elem);
+ }
+@@ -7689,9 +7631,11 @@ Set the current process's real, effectiv
+ static PyObject*
+ posix_setresuid (PyObject *self, PyObject *args)
+ {
+- /* We assume uid_t is no larger than a long. */
+- long ruid, euid, suid;
+- if (!PyArg_ParseTuple(args, "lll", &ruid, &euid, &suid))
++ uid_t ruid, euid, suid;
++ if (!PyArg_ParseTuple(args, "O&O&O&",
++ _PyArg_ParseUid, &ruid,
++ _PyArg_ParseUid, &euid,
++ _PyArg_ParseUid, &suid))
+ return NULL;
+ if (setresuid(ruid, euid, suid) < 0)
+ return posix_error();
+@@ -7707,9 +7651,11 @@ Set the current process's real, effectiv
+ static PyObject*
+ posix_setresgid (PyObject *self, PyObject *args)
+ {
+- /* We assume uid_t is no larger than a long. */
+- long rgid, egid, sgid;
+- if (!PyArg_ParseTuple(args, "lll", &rgid, &egid, &sgid))
++ gid_t rgid, egid, sgid;
++ if (!PyArg_ParseTuple(args, "O&O&O&",
++ _PyArg_ParseGid, &rgid,
++ _PyArg_ParseGid, &egid,
++ _PyArg_ParseGid, &sgid))
+ return NULL;
+ if (setresgid(rgid, egid, sgid) < 0)
+ return posix_error();
+@@ -7726,14 +7672,13 @@ static PyObject*
+ posix_getresuid (PyObject *self, PyObject *noargs)
+ {
+ uid_t ruid, euid, suid;
+- long l_ruid, l_euid, l_suid;
++ PyObject *obj_ruid, *obj_euid, *obj_suid;
+ if (getresuid(&ruid, &euid, &suid) < 0)
+ return posix_error();
+- /* Force the values into long's as we don't know the size of uid_t. */
+- l_ruid = ruid;
+- l_euid = euid;
+- l_suid = suid;
+- return Py_BuildValue("(lll)", l_ruid, l_euid, l_suid);
++ obj_ruid = _PyObject_FromUid(ruid);
++ obj_euid = _PyObject_FromUid(euid);
++ obj_suid = _PyObject_FromUid(suid);
++ return Py_BuildValue("(NNN)", obj_ruid, obj_euid, obj_suid);
+ }
+ #endif
+
+@@ -7746,14 +7691,13 @@ static PyObject*
+ posix_getresgid (PyObject *self, PyObject *noargs)
+ {
+ uid_t rgid, egid, sgid;
+- long l_rgid, l_egid, l_sgid;
++ PyObject *obj_rgid, *obj_egid, *obj_sgid;
+ if (getresgid(&rgid, &egid, &sgid) < 0)
+ return posix_error();
+- /* Force the values into long's as we don't know the size of uid_t. */
+- l_rgid = rgid;
+- l_egid = egid;
+- l_sgid = sgid;
+- return Py_BuildValue("(lll)", l_rgid, l_egid, l_sgid);
++ obj_rgid = _PyObject_FromGid(rgid);
++ obj_egid = _PyObject_FromGid(egid);
++ obj_sgid = _PyObject_FromGid(sgid);
++ return Py_BuildValue("(NNN)", obj_rgid, obj_egid, obj_sgid);
+ }
+ #endif
+
+diff -up Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows
Python-3.2.3/Modules/pwdmodule.c
+--- Python-3.2.3/Modules/pwdmodule.c.uid-gid-overflows 2012-05-16 11:56:21.353024696
-0400
++++ Python-3.2.3/Modules/pwdmodule.c 2012-05-17 14:47:37.465332677 -0400
+@@ -74,8 +74,8 @@ mkpwent(struct passwd *p)
+ #else
+ SETS(setIndex++, p->pw_passwd);
+ #endif
+- SETI(setIndex++, p->pw_uid);
+- SETI(setIndex++, p->pw_gid);
++ PyStructSequence_SET_ITEM(v, setIndex++, _PyObject_FromUid(p->pw_uid));
++ PyStructSequence_SET_ITEM(v, setIndex++, _PyObject_FromGid(p->pw_gid));
+ #ifdef __VMS
+ SETS(setIndex++, "");
+ #else
+@@ -104,13 +104,14 @@ See help(pwd) for more on password datab
+ static PyObject *
+ pwd_getpwuid(PyObject *self, PyObject *args)
+ {
+- unsigned int uid;
++ uid_t uid;
+ struct passwd *p;
+- if (!PyArg_ParseTuple(args, "I:getpwuid", &uid))
++ if (!PyArg_ParseTuple(args, "O&:getpwuid",
++ _PyArg_ParseUid, &uid))
+ return NULL;
+ if ((p = getpwuid(uid)) == NULL) {
+ PyErr_Format(PyExc_KeyError,
+- "getpwuid(): uid not found: %d", uid);
++ "getpwuid(): uid not found: %lu", (unsigned long)uid);
+ return NULL;
+ }
+ return mkpwent(p);
+diff -up Python-3.2.3/Python/getargs.c.uid-gid-overflows Python-3.2.3/Python/getargs.c
+--- Python-3.2.3/Python/getargs.c.uid-gid-overflows 2012-05-16 11:56:34.572130014 -0400
++++ Python-3.2.3/Python/getargs.c 2012-05-16 11:56:34.042125832 -0400
+@@ -4,6 +4,7 @@
+ #include "Python.h"
+
+ #include <ctype.h>
++#include <limits.h>
+
+
+ #ifdef __cplusplus
+@@ -1789,6 +1790,102 @@ _PyArg_NoKeywords(const char *funcname,
+ funcname);
+ return 0;
+ }
++
++PyObject *
++_PyObject_FromUid(uid_t uid)
++{
++ return PyLong_FromUnsignedLong((uid_t)uid);
++}
++
++PyObject *
++_PyObject_FromGid(gid_t gid)
++{
++ return PyLong_FromUnsignedLong((gid_t)gid);
++}
++
++int
++_PyArg_ParseUid(PyObject *in_obj, uid_t *out_uid)
++{
++ PyObject *index, *number = NULL;
++ long sl;
++ unsigned long ul;
++
++ assert(out_uid);
++
++ index = PyNumber_Index(in_obj);
++ if (index != NULL) {
++ number = PyNumber_Long(index);
++ Py_DECREF(index);
++ }
++ if (number == NULL) {
++ PyErr_SetString(PyExc_TypeError, "user id must be integer");
++ return 0;
++ }
++
++ /* Special case: support -1 (e.g. for use by chown) */
++ sl = PyLong_AsLong(number);
++ if (PyErr_Occurred()) {
++ PyErr_Clear();
++ } else if (sl == -1) {
++ Py_DECREF(number);
++ *out_uid = (uid_t)-1;
++ return 1;
++ }
++
++ /* Otherwise, it must be >= 0 */
++ ul = PyLong_AsUnsignedLong(number);
++ Py_DECREF(number);
++ *out_uid = ul;
++ /* read back the value to see if it fitted in uid_t */
++ if (PyErr_Occurred() || *out_uid != ul) {
++ PyErr_SetString(PyExc_OverflowError,
++ "user id is not in range(-1, 2^32-1)");
++ return 0;
++ }
++ return 1;
++}
++
++int
++_PyArg_ParseGid(PyObject *in_obj, gid_t *out_gid)
++{
++ PyObject *index, *number = NULL;
++ long sl;
++ unsigned long ul;
++
++ assert(out_gid);
++
++ index = PyNumber_Index(in_obj);
++ if (index != NULL) {
++ number = PyNumber_Long(index);
++ Py_DECREF(index);
++ }
++ if (number == NULL) {
++ PyErr_SetString(PyExc_TypeError, "group id must be integer");
++ return 0;
++ }
++
++ /* Special case: support -1 (e.g. for use by chown) */
++ sl = PyLong_AsLong(number);
++ if (PyErr_Occurred()) {
++ PyErr_Clear();
++ } else if (sl == -1) {
++ Py_DECREF(number);
++ *out_gid = (gid_t)-1;
++ return 1;
++ }
++
++ ul = PyLong_AsUnsignedLong(number);
++ Py_DECREF(number);
++ *out_gid = ul;
++ /* read back the value to see if it fitted in gid_t */
++ if (PyErr_Occurred() || *out_gid != ul) {
++ PyErr_SetString(PyExc_OverflowError,
++ "group id is not in range(-1, 2^32-1)");
++ return 0;
++ }
++ return 1;
++}
++
+ #ifdef __cplusplus
+ };
+ #endif
diff --git a/python3.spec b/python3.spec
index c63b46a..4d9ca8c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -440,6 +440,22 @@ Patch155: 00155-avoid-ctypes-thunks.patch
# Not yet sent upstream
Patch156: 00156-gdb-autoload-safepath.patch
+# 00157 #
+# Update uid/gid handling throughout the standard library: uid_t and gid_t are
+# unsigned 32-bit values, but existing code often passed them through C long
+# values, which are signed 32-bit values on 32-bit architectures, leading to
+# negative int objects for uid/gid values >= 2^31 on 32-bit architectures.
+#
+# Introduce _PyObject_FromUid/Gid to convert uid_t/gid_t values to python
+# objects, using int objects where the value will fit (long objects otherwise),
+# and _PyArg_ParseUid/Gid to convert int/long to uid_t/gid_t, with -1 allowed
+# as a special case (since this is given special meaning by the chown syscall)
+#
+# Update standard library to use this throughout for uid/gid values, so that
+# very large uid/gid values are round-trippable, and -1 remains usable.
+# (rhbz#697470)
+Patch157: 00157-uid-gid-overflows.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -667,6 +683,7 @@ done
# 00154: not for this branch
%patch155 -p1
%patch156 -p1
+%patch157 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1489,6 +1506,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue May 15 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-7
+- update uid/gid handling to avoid int overflows seen with uid/gid
+values >= 2^31 on 32-bit architectures (patch 157; rhbz#697470)
+
* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
- renumber autotools patch from 300 to 5000
- specfile cleanups
commit bbb50840b1029d8772ce6b0b60a1a4d42da70637
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri May 11 19:35:32 2012 -0400
add notes on upstream status of various patches
diff --git a/python3.spec b/python3.spec
index 4b43fa8..c63b46a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -239,6 +239,7 @@ Patch104: 00104-lib64-fix-for-test_install.patch
# 00111 #
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
# a libpythonMAJOR.MINOR.a (bug 550692):
+# Downstream only: not appropriate for upstream
Patch111: 00111-no-static-lib.patch
# 00112 #
@@ -250,11 +251,13 @@ Patch111: 00111-no-static-lib.patch
# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
# so that if they are enabled, they will be in that build's pyconfig.h, so that
# extension modules will reliably use them
+# Not yet sent upstream
Patch113: 00113-more-configuration-flags.patch
# 00114 #
# Add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
+# Not yet sent upstream
Patch114: 00114-statvfs-f_flag-constants.patch
# 00125 #
@@ -262,7 +265,7 @@ Patch114: 00114-statvfs-f_flag-constants.patch
# emitting debug info to stdout on exit is too verbose and makes it harder to
# use the debug build. Add a "PYTHONDUMPCOUNTS" environment variable which
# must be set to enable the output on exit
-# Not yet sent upstream:
+# Not yet sent upstream
Patch125: 00125-less-verbose-COUNT_ALLOCS.patch
# In my koji builds, /root/bin is in the PATH for some reason
@@ -341,6 +344,7 @@ Patch139: 00139-skip-test_float-known-failure-on-arm.patch
# 00141 #
# Fix test_gc's test_newinstance case when configured with COUNT_ALLOCS:
+# Not yet sent upstream
Patch141: 00141-fix-test_gc_with_COUNT_ALLOCS.patch
# 00142 #
@@ -409,12 +413,14 @@ Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
# 00152 #
# Fix a regex in test_gdb so that it doesn't choke when gdb provides a full
# path to Python/bltinmodule.c:
+# Not yet sent upstream
Patch152: 00152-fix-test-gdb-regex.patch
# 00153 #
# Strip out lines of the form "warning: Unable to open ..." from gdb's
stderr
# when running test_gdb.py; also cope with change to gdb in F17 onwards in
# which values are printed as "v@entry" rather than just "v":
+# Not yet sent upstream
Patch153: 00153-fix-test_gdb-noise.patch
# 00154 #
@@ -431,6 +437,7 @@ Patch155: 00155-avoid-ctypes-thunks.patch
# Recent builds of gdb will only auto-load scripts from certain safe
# locations. Turn off this protection when running test_gdb in the selftest
# suite to ensure that it can load our -gdb.py script (rhbz#817072):
+# Not yet sent upstream
Patch156: 00156-gdb-autoload-safepath.patch
# (New patches go here ^^^)
commit c04f314ee5c7131ec69025f32e87aa4256349944
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri May 11 18:42:30 2012 -0400
add link to upstream report for patch 147
diff --git a/python3.spec b/python3.spec
index bfa2de4..4b43fa8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -384,7 +384,7 @@ Patch146: 00146-hashlib-fips.patch
# 00147 #
# Add a sys._debugmallocstats() function
# Based on patch 202 from RHEL 5's python.spec, with updates from rhbz#737198
-# Not yet sent upstream
+# Sent upstream as
http://bugs.python.org/issue14785
Patch147: 00147-add-debug-malloc-stats.patch
# 00148 #
commit ecc5705ec844c614bb45a8fd44c3ba4330afb984
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri May 4 15:53:42 2012 -0400
reorder the %configure arguments (alphabetically) to help with python vs python3
diffs
diff --git a/python3.spec b/python3.spec
index 81de5ba..bfa2de4 100644
--- a/python3.spec
+++ b/python3.spec
@@ -736,20 +736,20 @@ BuildPython() {
%configure \
--enable-ipv6 \
- --with-wide-unicode \
--enable-shared \
+ --with-computed-gotos=%{with_computed_gotos} \
+ --with-dbmliborder=gdbm:ndbm:bdb \
+ --with-system-expat \
+ --with-system-ffi \
+ --with-wide-unicode \
%if 0%{?with_systemtap}
--with-dtrace \
--with-tapset-install-dir=%{tapsetdir} \
%endif
- --with-system-ffi \
%if 0%{?with_valgrind}
--with-valgrind \
%endif
- --with-system-expat \
- --with-dbmliborder=gdbm:ndbm:bdb \
$ExtraConfigArgs \
- --with-computed-gotos=%{with_computed_gotos} \
%{nil}
# Set EXTRA_CFLAGS to our CFLAGS (rather than overriding OPT, as we've done
commit 8cb91f09cee53cfe1fdca4e87479f9abf96e17a6
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri May 4 15:42:31 2012 -0400
3.2.3-6: renumber autotools patch from 300 to 5000
diff --git a/05000-autotool-intermediates.patch b/05000-autotool-intermediates.patch
new file mode 100644
index 0000000..4a265a0
--- /dev/null
+++ b/05000-autotool-intermediates.patch
@@ -0,0 +1,166 @@
+diff -up ./configure.autotool-intermediates ./configure
+--- ./configure.autotool-intermediates 2011-07-11 11:50:06.910425999 -0400
++++ ./configure 2011-07-11 11:50:13.492426001 -0400
+@@ -619,6 +619,8 @@ TRUE
+ MACHDEP_OBJS
+ DYNLOADFILE
+ DLINCLDIR
++DTRACEHDRS
++DTRACEOBJS
+ THREADOBJ
+ LDLAST
+ USE_THREAD_MODULE
+@@ -764,8 +766,11 @@ with_thread
+ enable_ipv6
+ with_doc_strings
+ with_tsc
++with_count_allocs
++with_call_profile
+ with_pymalloc
+ with_valgrind
++with_dtrace
+ with_fpectl
+ with_libm
+ with_libc
+@@ -781,7 +786,8 @@ CFLAGS
+ LDFLAGS
+ LIBS
+ CPPFLAGS
+-CPP'
++CPP
++CPPFLAGS'
+
+
+ # Initialize some variables set by options.
+@@ -1437,8 +1443,11 @@ Optional Packages:
+ deprecated; use --with(out)-threads
+ --with(out)-doc-strings disable/enable documentation strings
+ --with(out)-tsc enable/disable timestamp counter profile
++ --with(out)count-allocs enable/disable per-type instance accounting
++ --with(out)-call-profile enable/disable statistics on function call invocation
+ --with(out)-pymalloc disable/enable specialized mallocs
+ --with-valgrind Enable Valgrind support
++ --with(out)-dtrace disable/enable dtrace support
+ --with-fpectl enable SIGFPE catching
+ --with-libm=STRING math library
+ --with-libc=STRING C library
+@@ -9284,6 +9293,50 @@ $as_echo "no" >&6; }
+ fi
+
+
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-count-allocs"
>&5
++$as_echo_n "checking for --with-count-allocs... " >&6; }
++
++# Check whether --with-count-allocs was given.
++if test "${with_count_allocs+set}" = set; then :
++ withval=$with_count_allocs;
++if test "$withval" != no
++then
++
++$as_echo "#define COUNT_ALLOCS 1" >>confdefs.h
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-call-profile"
>&5
++$as_echo_n "checking for --with-call-profile... " >&6; }
++
++# Check whether --with-call-profile was given.
++if test "${with_call_profile+set}" = set; then :
++ withval=$with_call_profile;
++if test "$withval" != no
++then
++
++$as_echo "#define CALL_PROFILE 1" >>confdefs.h
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
+ # Check for Python-specific malloc support
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
+ $as_echo_n "checking for --with-pymalloc... " >&6; }
+@@ -9336,6 +9389,46 @@ fi
+ OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
+ fi
+
++# Check for dtrace support
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-dtrace"
>&5
++$as_echo_n "checking for --with-dtrace... " >&6; }
++
++# Check whether --with-dtrace was given.
++if test "${with_dtrace+set}" = set; then :
++ withval=$with_dtrace;
++fi
++
++
++if test ! -z "$with_dtrace"
++then
++ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
++ then
++
++$as_echo "#define WITH_DTRACE 1" >>confdefs.h
++
++ with_dtrace="Sun"
++ DTRACEOBJS="Python/dtrace.o"
++ DTRADEHDRS=""
++ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
++ then
++
++$as_echo "#define WITH_DTRACE 1" >>confdefs.h
++
++ with_dtrace="Apple"
++ DTRACEOBJS=""
++ DTRADEHDRS="pydtrace.h"
++ else
++ with_dtrace="no"
++ fi
++else
++ with_dtrace="no"
++fi
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dtrace" >&5
++$as_echo "$with_dtrace" >&6; }
++
++
++
+ # -I${DLINCLDIR} is added to the compile rule for importdl.o
+
+ DLINCLDIR=.
+diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
+--- ./pyconfig.h.in.autotool-intermediates 2011-07-11 11:50:06.896426002 -0400
++++ ./pyconfig.h.in 2011-07-11 11:50:13.965426001 -0400
+@@ -12,15 +12,15 @@
+ support for AIX C++ shared extension modules. */
+ #undef AIX_GENUINE_CPLUSPLUS
+
+-/* Define if you have the Mach cthreads package */
+-#undef C_THREADS
+-
+ /* Define to keep records on function call invocation */
+ #undef CALL_PROFILE
+
+ /* Define to keep records of the number of instances of each type */
+ #undef COUNT_ALLOCS
+
++/* Define if you have the Mach cthreads package */
++#undef C_THREADS
++
+ /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
+ mixed-endian order (byte order 45670123) */
+ #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
diff --git a/autotool-intermediates.patch b/autotool-intermediates.patch
deleted file mode 100644
index 4a265a0..0000000
--- a/autotool-intermediates.patch
+++ /dev/null
@@ -1,166 +0,0 @@
-diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2011-07-11 11:50:06.910425999 -0400
-+++ ./configure 2011-07-11 11:50:13.492426001 -0400
-@@ -619,6 +619,8 @@ TRUE
- MACHDEP_OBJS
- DYNLOADFILE
- DLINCLDIR
-+DTRACEHDRS
-+DTRACEOBJS
- THREADOBJ
- LDLAST
- USE_THREAD_MODULE
-@@ -764,8 +766,11 @@ with_thread
- enable_ipv6
- with_doc_strings
- with_tsc
-+with_count_allocs
-+with_call_profile
- with_pymalloc
- with_valgrind
-+with_dtrace
- with_fpectl
- with_libm
- with_libc
-@@ -781,7 +786,8 @@ CFLAGS
- LDFLAGS
- LIBS
- CPPFLAGS
--CPP'
-+CPP
-+CPPFLAGS'
-
-
- # Initialize some variables set by options.
-@@ -1437,8 +1443,11 @@ Optional Packages:
- deprecated; use --with(out)-threads
- --with(out)-doc-strings disable/enable documentation strings
- --with(out)-tsc enable/disable timestamp counter profile
-+ --with(out)count-allocs enable/disable per-type instance accounting
-+ --with(out)-call-profile enable/disable statistics on function call invocation
- --with(out)-pymalloc disable/enable specialized mallocs
- --with-valgrind Enable Valgrind support
-+ --with(out)-dtrace disable/enable dtrace support
- --with-fpectl enable SIGFPE catching
- --with-libm=STRING math library
- --with-libc=STRING C library
-@@ -9284,6 +9293,50 @@ $as_echo "no" >&6; }
- fi
-
-
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-count-allocs"
>&5
-+$as_echo_n "checking for --with-count-allocs... " >&6; }
-+
-+# Check whether --with-count-allocs was given.
-+if test "${with_count_allocs+set}" = set; then :
-+ withval=$with_count_allocs;
-+if test "$withval" != no
-+then
-+
-+$as_echo "#define COUNT_ALLOCS 1" >>confdefs.h
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-call-profile"
>&5
-+$as_echo_n "checking for --with-call-profile... " >&6; }
-+
-+# Check whether --with-call-profile was given.
-+if test "${with_call_profile+set}" = set; then :
-+ withval=$with_call_profile;
-+if test "$withval" != no
-+then
-+
-+$as_echo "#define CALL_PROFILE 1" >>confdefs.h
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+else
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+fi
-+
-+
- # Check for Python-specific malloc support
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
- $as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -9336,6 +9389,46 @@ fi
- OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
- fi
-
-+# Check for dtrace support
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-dtrace"
>&5
-+$as_echo_n "checking for --with-dtrace... " >&6; }
-+
-+# Check whether --with-dtrace was given.
-+if test "${with_dtrace+set}" = set; then :
-+ withval=$with_dtrace;
-+fi
-+
-+
-+if test ! -z "$with_dtrace"
-+then
-+ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
-+ then
-+
-+$as_echo "#define WITH_DTRACE 1" >>confdefs.h
-+
-+ with_dtrace="Sun"
-+ DTRACEOBJS="Python/dtrace.o"
-+ DTRADEHDRS=""
-+ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
-+ then
-+
-+$as_echo "#define WITH_DTRACE 1" >>confdefs.h
-+
-+ with_dtrace="Apple"
-+ DTRACEOBJS=""
-+ DTRADEHDRS="pydtrace.h"
-+ else
-+ with_dtrace="no"
-+ fi
-+else
-+ with_dtrace="no"
-+fi
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dtrace" >&5
-+$as_echo "$with_dtrace" >&6; }
-+
-+
-+
- # -I${DLINCLDIR} is added to the compile rule for importdl.o
-
- DLINCLDIR=.
-diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2011-07-11 11:50:06.896426002 -0400
-+++ ./pyconfig.h.in 2011-07-11 11:50:13.965426001 -0400
-@@ -12,15 +12,15 @@
- support for AIX C++ shared extension modules. */
- #undef AIX_GENUINE_CPLUSPLUS
-
--/* Define if you have the Mach cthreads package */
--#undef C_THREADS
--
- /* Define to keep records on function call invocation */
- #undef CALL_PROFILE
-
- /* Define to keep records of the number of instances of each type */
- #undef COUNT_ALLOCS
-
-+/* Define if you have the Mach cthreads package */
-+#undef C_THREADS
-+
- /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
- mixed-endian order (byte order 45670123) */
- #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
diff --git a/python3.spec b/python3.spec
index bfa9de8..81de5ba 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -456,7 +456,7 @@ Patch156: 00156-gdb-autoload-safepath.patch
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
-Patch300: autotool-intermediates.patch
+Patch5000: 05000-autotool-intermediates.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
@@ -674,7 +674,7 @@ sed --in-place \
%if ! 0%{regenerate_autotooling_patch}
# Normally we apply the patch to "configure"
# We don't apply the patch if we're working towards regenerating it
-%patch300 -p0 -b .autotool-intermediates
+%patch5000 -p0 -b .autotool-intermediates
%endif
@@ -708,7 +708,7 @@ done
PATH=~/autoconf-2.65/bin:$PATH autoreconf
# Regenerate the patch:
-gendiff . .autotool-intermediates > %{PATCH300}
+gendiff . .autotool-intermediates > %{PATCH5000}
# Exit the build
@@ -1482,6 +1482,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri May 4 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-6
+- renumber autotools patch from 300 to 5000
+- specfile cleanups
+
* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
- fix test_gdb.py (patch 156; rhbz#817072)
commit 6b34963600c2b8962f556ceeb3d254274770f6ba
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri May 4 15:24:50 2012 -0400
add markers to make it easier to diff python.spec and python3.spec
diff --git a/python3.spec b/python3.spec
index a31e752..bfa9de8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -221,6 +221,7 @@ Patch1: Python-3.1.1-rpath.patch
# It's simplest to remove them:
Patch3: python-3.2b2-remove-mimeaudio-tests.patch
+# 00055 #
# Systemtap support: add statically-defined probe points
# Patch based on upstream bug:
http://bugs.python.org/issue4111
# fixed up by mjw and wcohen for 2.6.2, then fixed up by dmalcolm for 2.6.4
@@ -230,27 +231,33 @@ Patch55: 00055-systemtap.patch
Patch102: python-3.2.3-lib64.patch
+# 00104 #
# Only used when "%{_lib}" == "lib64"
# Another lib64 fix, for distutils/tests/test_install.py; not upstream:
Patch104: 00104-lib64-fix-for-test_install.patch
+# 00111 #
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
# a libpythonMAJOR.MINOR.a (bug 550692):
Patch111: 00111-no-static-lib.patch
+# 00112 #
# Patch112: python-2.7rc1-debug-build.patch: this is not relevant to Python 3,
# for 3.2 onwards
+# 00113 #
# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
# so that if they are enabled, they will be in that build's pyconfig.h, so that
# extension modules will reliably use them
Patch113: 00113-more-configuration-flags.patch
+# 00114 #
# Add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
Patch114: 00114-statvfs-f_flag-constants.patch
+# 00125 #
# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
# emitting debug info to stdout on exit is too verbose and makes it harder to
# use the debug build. Add a "PYTHONDUMPCOUNTS" environment variable which
@@ -269,16 +276,19 @@ Patch125: 00125-less-verbose-COUNT_ALLOCS.patch
# Not yet sent upstream
Patch129: python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
+# 00130 #
# Python 2's:
# Patch130: python-2.7.2-add-extension-suffix-to-python-config.patch
# is not relevant to Python 3 (for 3.2 onwards)
+# 00131 #
# The four tests in test_io built on top of check_interrupted_write_retry
# fail when built in Koji, for ppc and ppc64; for some reason, the SIGALRM
# handlers are never called, and the call to write runs to completion
# (rhbz#732998)
Patch131: 00131-disable-tests-in-test_io.patch
+# 00132 #
# Add non-standard hooks to unittest for use in the "check" phase below, when
# running selftests within the build:
# @unittest._skipInRpmBuild(reason)
@@ -292,55 +302,69 @@ Patch131: 00131-disable-tests-in-test_io.patch
# these unittest hooks in their own "check" phases)
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
+# 00133 #
# 00133-skip-test_dl.patch is not relevant for python3: the "dl" module no
# longer exists
+# 00134 #
# Fix a failure in test_sys.py when configured with COUNT_ALLOCS enabled
# Not yet sent upstream
Patch134: 00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+# 00135 #
# test_weakref's test_callback_in_cycle_resurrection doesn't work with
# COUNT_ALLOCS, as the metrics keep "C" alive. Work around this for our
# debug build:
# Not yet sent upstream
Patch135: 00135-fix-test-within-test_weakref-in-debug-build.patch
+# 00136 #
# Patch136: 00136-skip-tests-of-seeking-stdin-in-rpmbuild.patch does not seem
# to be needed by python3
+# 00137 #
# Some tests within distutils fail when run in an rpmbuild:
Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
+# 00138 #
# Patch138: 00138-fix-distutils-tests-in-debug-build.patch is not relevant for
# python3
+# 00139 #
# ARM-specific: skip known failure in test_float:
#
http://bugs.python.org/issue8265 (rhbz#706253)
Patch139: 00139-skip-test_float-known-failure-on-arm.patch
+# 00140 #
# Patch140: 00140-skip-test_ctypes-known-failure-on-sparc.patch does not appear
# to be relevant for python3
+# 00141 #
# Fix test_gc's test_newinstance case when configured with COUNT_ALLOCS:
Patch141: 00141-fix-test_gc_with_COUNT_ALLOCS.patch
+# 00142 #
# Some pty tests fail when run in mock (rhbz#714627):
Patch142: 00142-skip-failing-pty-tests-in-rpmbuild.patch
+# 00143 #
# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
# aliasing violations (rhbz#698726)
# Sent upstream as
http://bugs.python.org/issue12872
Patch143: 00143-tsc-on-ppc.patch
+# 00144 #
# (Optionally) disable the gdbm module:
# python.spec's
# Patch144: 00144-no-gdbm.patch
# is not needed in python3.spec
+# 00145 #
# python.spec's
# Patch145: 00145-force-sys-platform-to-be-linux2.patch
# is upstream for Python 3 as of 3.2.2
+# 00146 #
# Support OpenSSL FIPS mode (e.g. when OPENSSL_FORCE_FIPS_MODE=1 is set)
# - handle failures from OpenSSL (e.g. on attempts to use MD5 in a
# FIPS-enforcing environment)
@@ -357,43 +381,53 @@ Patch143: 00143-tsc-on-ppc.patch
# (rhbz#563986)
Patch146: 00146-hashlib-fips.patch
+# 00147 #
# Add a sys._debugmallocstats() function
# Based on patch 202 from RHEL 5's python.spec, with updates from rhbz#737198
# Not yet sent upstream
Patch147: 00147-add-debug-malloc-stats.patch
+# 00148 #
# Upstream as of Python 3.2.3:
# Patch148: 00148-gdbm-1.9-magic-values.patch
+# 00149 #
# Upstream as of Python 3.2.3:
# Patch149: 00149-backport-issue11254-pycache-bytecompilation-fix.patch
+# 00150 #
# temporarily disable rAssertAlmostEqual in test_cmath on PPC (bz #750811)
# caused by a glibc bug. This patch can be removed when we have a glibc with
# the patch mentioned here:
#
http://sourceware.org/bugzilla/show_bug.cgi?id=13472
Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
+# 00151 #
# python.spec had:
# Patch151: 00151-fork-deadlock.patch
+# 00152 #
# Fix a regex in test_gdb so that it doesn't choke when gdb provides a full
# path to Python/bltinmodule.c:
Patch152: 00152-fix-test-gdb-regex.patch
+# 00153 #
# Strip out lines of the form "warning: Unable to open ..." from gdb's
stderr
# when running test_gdb.py; also cope with change to gdb in F17 onwards in
# which values are printed as "v@entry" rather than just "v":
Patch153: 00153-fix-test_gdb-noise.patch
+# 00154 #
# python3.spec on f15 has:
# Patch154: 00154-skip-urllib-test-requiring-working-DNS.patch
+# 00155 #
# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
# generating SELinux denials on "import ctypes" and "import uuid"
when
# embedding Python within httpd (rhbz#814391)
Patch155: 00155-avoid-ctypes-thunks.patch
+# 00156 #
# Recent builds of gdb will only auto-load scripts from certain safe
# locations. Turn off this protection when running test_gdb in the selftest
# suite to ensure that it can load our -gdb.py script (rhbz#817072):
commit 938d1d78cefcedb5ccde5e6297a9fbbd5acdf6b3
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue May 1 11:40:48 2012 -0400
3.2.3-5: fix test_gdb.py (patch 156; rhbz#817072)
* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
- fix test_gdb.py (patch 156; rhbz#817072)
diff --git a/00156-gdb-autoload-safepath.patch b/00156-gdb-autoload-safepath.patch
new file mode 100644
index 0000000..ac2aa40
--- /dev/null
+++ b/00156-gdb-autoload-safepath.patch
@@ -0,0 +1,52 @@
+diff -up Python-3.2.3/Lib/test/test_gdb.py.gdb-autoload-safepath
Python-3.2.3/Lib/test/test_gdb.py
+--- Python-3.2.3/Lib/test/test_gdb.py.gdb-autoload-safepath 2012-04-30 17:16:24.092706954
-0400
++++ Python-3.2.3/Lib/test/test_gdb.py 2012-04-30 17:17:13.275703592 -0400
+@@ -46,6 +46,19 @@ def gdb_has_frame_select():
+
+ HAS_PYUP_PYDOWN = gdb_has_frame_select()
+
++def gdb_has_autoload_safepath():
++ # Recent GDBs will only auto-load scripts from certain safe
++ # locations, so we will need to turn off this protection.
++ # However, if the GDB doesn't have it, then the following
++ # command will generate noise on stderr (rhbz#817072):
++ cmd = "--eval-command=set auto-load safe-path /"
++ p = subprocess.Popen(["gdb", "--batch", cmd],
++ stderr=subprocess.PIPE)
++ _, stderr = p.communicate()
++ return b'"on" or "off" expected.' not in stderr
++
++HAS_AUTOLOAD_SAFEPATH = gdb_has_autoload_safepath()
++
+ BREAKPOINT_FN='builtin_id'
+
+ class DebuggerTests(unittest.TestCase):
+@@ -106,15 +119,28 @@ class DebuggerTests(unittest.TestCase):
+ 'set print entry-values no',
+
+ 'run']
++
++ if HAS_AUTOLOAD_SAFEPATH:
++ # Recent GDBs will only auto-load scripts from certain safe
++ # locations.
++ # Where necessary, turn off this protection to ensure that
++ # our -gdb.py script can be loaded - but not on earlier gdb builds
++ # as this would generate noise on stderr (rhbz#817072):
++ init_commands = ['set auto-load safe-path /']
++ else:
++ init_commands = []
++
+ if cmds_after_breakpoint:
+ commands += cmds_after_breakpoint
+ else:
+ commands += ['backtrace']
+
++ # print init_commands
+ # print commands
+
+ # Use "commands" to generate the arguments with which to invoke
"gdb":
+ args = ["gdb", "--batch"]
++ args += ['--init-eval-command=%s' % cmd for cmd in init_commands]
+ args += ['--eval-command=%s' % cmd for cmd in commands]
+ args += ["--args",
+ sys.executable]
diff --git a/python3.spec b/python3.spec
index ff3b480..a31e752 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -394,6 +394,11 @@ Patch153: 00153-fix-test_gdb-noise.patch
# embedding Python within httpd (rhbz#814391)
Patch155: 00155-avoid-ctypes-thunks.patch
+# Recent builds of gdb will only auto-load scripts from certain safe
+# locations. Turn off this protection when running test_gdb in the selftest
+# suite to ensure that it can load our -gdb.py script (rhbz#817072):
+Patch156: 00156-gdb-autoload-safepath.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -620,6 +625,7 @@ done
%patch153 -p0
# 00154: not for this branch
%patch155 -p1
+%patch156 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1442,6 +1448,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Apr 30 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-5
+- fix test_gdb.py (patch 156; rhbz#817072)
+
* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
generating SELinux denials on "import ctypes" and "import uuid" when
embedding
commit 8a28107df1670a03a12cf6a7787160f103d8d8c8
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Apr 20 15:28:39 2012 -0400
3.2.3-4: avoid allocating thunks in ctypes unless absolutely necessary (patch 155;
rhbz#814391)
* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
generating SELinux denials on "import ctypes" and "import uuid"
when embedding
Python within httpd (patch 155; rhbz#814391)
diff --git a/00155-avoid-ctypes-thunks.patch b/00155-avoid-ctypes-thunks.patch
new file mode 100644
index 0000000..f03890e
--- /dev/null
+++ b/00155-avoid-ctypes-thunks.patch
@@ -0,0 +1,15 @@
+diff -up Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391
Python-3.2.3/Lib/ctypes/__init__.py
+--- Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 2012-04-20 15:12:49.017867692 -0400
++++ Python-3.2.3/Lib/ctypes/__init__.py 2012-04-20 15:15:09.501111408 -0400
+@@ -275,11 +275,6 @@ def _reset_cache():
+ # _SimpleCData.c_char_p_from_param
+ POINTER(c_char).from_param = c_char_p.from_param
+ _pointer_type_cache[None] = c_void_p
+- # XXX for whatever reasons, creating the first instance of a callback
+- # function is needed for the unittests on Win64 to succeed. This MAY
+- # be a compiler bug, since the problem occurs only when _ctypes is
+- # compiled with the MS SDK compiler. Or an uninitialized variable?
+- CFUNCTYPE(c_int)(lambda: None)
+
+ def create_unicode_buffer(init, size=None):
+ """create_unicode_buffer(aString) -> character array
diff --git a/python3.spec b/python3.spec
index 90694ee..ff3b480 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -386,6 +386,14 @@ Patch152: 00152-fix-test-gdb-regex.patch
# which values are printed as "v@entry" rather than just "v":
Patch153: 00153-fix-test_gdb-noise.patch
+# python3.spec on f15 has:
+# Patch154: 00154-skip-urllib-test-requiring-working-DNS.patch
+
+# Avoid allocating thunks in ctypes unless absolutely necessary, to avoid
+# generating SELinux denials on "import ctypes" and "import uuid"
when
+# embedding Python within httpd (rhbz#814391)
+Patch155: 00155-avoid-ctypes-thunks.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -610,6 +618,8 @@ done
# 00151: not for python3
%patch152 -p0
%patch153 -p0
+# 00154: not for this branch
+%patch155 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1432,6 +1442,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-4
+- avoid allocating thunks in ctypes unless absolutely necessary, to avoid
+generating SELinux denials on "import ctypes" and "import uuid" when
embedding
+Python within httpd (patch 155; rhbz#814391)
+
* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
- add explicit version requirements on expat to avoid linkage problems with
XML_SetHashSalt
commit 5974f19981fb6f53706629aee004e632f41f2af2
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Apr 20 15:24:24 2012 -0400
3.2.3-3: add explicit version requirements on expat to avoid linkage problems with
XML_SetHashSalt
* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
- add explicit version requirements on expat to avoid linkage problems with
XML_SetHashSalt
diff --git a/python3.spec b/python3.spec
index 526d148..90694ee 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -137,7 +137,11 @@ BuildRequires: autoconf
BuildRequires: bzip2
BuildRequires: bzip2-devel
BuildRequires: db4-devel >= 4.7
-BuildRequires: expat-devel
+
+# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
+# it (in pyexpat) in order to enable the fix in Python-3.2.3 for CVE-2012-0876:
+BuildRequires: expat-devel >= 2.1.0
+
BuildRequires: findutils
BuildRequires: gcc-c++
%if %{with_gdbm}
@@ -431,6 +435,12 @@ Summary: Python 3 runtime libraries
Group: Development/Libraries
#Requires: %{name} = %{version}-%{release}
+# expat 2.1.0 added the symbol XML_SetHashSalt without bumping SONAME. We use
+# this symbol (in pyexpat), so we must explicitly state this dependency to
+# prevent "import pyexpat" from failing with a linker error if someone
hasn't
+# yet upgraded expat:
+Requires: expat >= 2.1.0
+
%description libs
This package contains files used to embed Python 3 into applications.
@@ -1422,6 +1432,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Apr 20 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-3
+- add explicit version requirements on expat to avoid linkage problems with
+XML_SetHashSalt
+
* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
- fix test_gdb (patch 153)
commit 3170c0548519482a5ecda38c0234057481dce267
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Thu Apr 12 11:18:08 2012 -0400
3.2.3-2
* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
- fix test_gdb (patch 153)
diff --git a/00153-fix-test_gdb-noise.patch b/00153-fix-test_gdb-noise.patch
new file mode 100644
index 0000000..bc5ee63
--- /dev/null
+++ b/00153-fix-test_gdb-noise.patch
@@ -0,0 +1,35 @@
+--- Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
++++ Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
+@@ -96,6 +96,15 @@ class DebuggerTests(unittest.TestCase):
+ # Generate a list of commands in gdb's language:
+ commands = ['set breakpoint pending yes',
+ 'break %s' % breakpoint,
++
++ # GDB as of Fedora 17 onwards can distinguish between the
++ # value of a variable at entry vs current value:
++ #
http://sourceware.org/gdb/onlinedocs/gdb/Variables.html
++ # which leads to the selftests failing with errors like this:
++ # AssertionError: 'v@entry=()' != '()'
++ # Disable this:
++ 'set print entry-values no',
++
+ 'run']
+ if cmds_after_breakpoint:
+ commands += cmds_after_breakpoint
+@@ -135,8 +144,16 @@ class DebuggerTests(unittest.TestCase):
+ err = err.replace("warning: Cannot initialize thread debugging"
+ " library: Debugger service failed\n",
+ '')
++ err = '\n'.join([line
++ for line in err.splitlines()
++ if not line.startswith('warning: Unable to open')
++ if not line.startswith('Missing separate debuginfo
for')
++ if not line.startswith('Try: yum --disablerepo=')
++ # In case 'set print entry-values no' failed:
++ if not line.startswith('Undefined set print
command')])
+
+ # Ensure no unexpected error messages:
++ self.maxDiff = None
+ self.assertEqual(err, '')
+
+ return out
diff --git a/python3.spec b/python3.spec
index 695cd60..526d148 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.3
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -377,6 +377,10 @@ Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
# path to Python/bltinmodule.c:
Patch152: 00152-fix-test-gdb-regex.patch
+# Strip out lines of the form "warning: Unable to open ..." from gdb's
stderr
+# when running test_gdb.py; also cope with change to gdb in F17 onwards in
+# which values are printed as "v@entry" rather than just "v":
+Patch153: 00153-fix-test_gdb-noise.patch
# (New patches go here ^^^)
#
@@ -595,6 +599,7 @@ done
%endif
# 00151: not for python3
%patch152 -p0
+%patch153 -p0
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1417,6 +1422,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Apr 12 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-2
+- fix test_gdb (patch 153)
+
* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
commit 28856627bf7413e17d327d7b3a840a7a4122b795
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Apr 11 20:20:08 2012 -0400
3.2.3-1
* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
diff --git a/00148-gdbm-1.9-magic-values.patch b/00148-gdbm-1.9-magic-values.patch
deleted file mode 100644
index e8ce828..0000000
--- a/00148-gdbm-1.9-magic-values.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -up Python-3.2.2/Lib/dbm/__init__.py.gdbm-1.9-magic
Python-3.2.2/Lib/dbm/__init__.py
---- Python-3.2.2/Lib/dbm/__init__.py.gdbm-1.9-magic 2011-09-03 12:16:40.000000000 -0400
-+++ Python-3.2.2/Lib/dbm/__init__.py 2011-09-30 15:47:27.488863694 -0400
-@@ -166,7 +166,7 @@ def whichdb(filename):
- return ""
-
- # Check for GNU dbm
-- if magic == 0x13579ace:
-+ if magic in (0x13579ace, 0x13579acd, 0x13579acf):
- return "dbm.gnu"
-
- # Later versions of Berkeley db hash file have a 12-byte pad in
-diff -up Python-3.2.2/Misc/NEWS.gdbm-1.9-magic Python-3.2.2/Misc/NEWS
diff --git a/00149-backport-issue11254-pycache-bytecompilation-fix.patch
b/00149-backport-issue11254-pycache-bytecompilation-fix.patch
deleted file mode 100644
index d3651b0..0000000
--- a/00149-backport-issue11254-pycache-bytecompilation-fix.patch
+++ /dev/null
@@ -1,146 +0,0 @@
-diff -up Python-3.2.2/Doc/distutils/apiref.rst.issue11254
Python-3.2.2/Doc/distutils/apiref.rst
---- Python-3.2.2/Doc/distutils/apiref.rst.issue11254 2011-09-03 12:16:38.000000000 -0400
-+++ Python-3.2.2/Doc/distutils/apiref.rst 2011-10-10 17:01:23.167196855 -0400
-@@ -1204,9 +1204,9 @@ other utility module.
- .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None,
verbose=1, dry_run=0, direct=None])
-
- Byte-compile a collection of Python source files to either :file:`.pyc` or
-- :file:`.pyo` files in the same directory. *py_files* is a list of files to
-- compile; any files that don't end in :file:`.py` are silently skipped.
-- *optimize* must be one of the following:
-+ :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`).
-+ *py_files* is a list of files to compile; any files that don't end in
-+ :file:`.py` are silently skipped. *optimize* must be one of the following:
-
- * ``0`` - don't optimize (generate :file:`.pyc`)
- * ``1`` - normal optimization (like ``python -O``)
-@@ -1231,6 +1231,11 @@ other utility module.
- is used by the script generated in indirect mode; unless you know what you're
- doing, leave it set to ``None``.
-
-+ .. versionchanged:: 3.2.3
-+ Create ``.pyc`` or ``.pyo`` files with an :func:`import magic tag
-+ <imp.get_tag>` in their name, in a :file:`__pycache__` subdirectory
-+ instead of files without tag in the current directory.
-+
-
- .. function:: rfc822_escape(header)
-
-diff -up Python-3.2.2/Lib/distutils/tests/test_build_py.py.issue11254
Python-3.2.2/Lib/distutils/tests/test_build_py.py
---- Python-3.2.2/Lib/distutils/tests/test_build_py.py.issue11254 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Lib/distutils/tests/test_build_py.py 2011-10-10 17:01:23.167196855
-0400
-@@ -3,6 +3,7 @@
- import os
- import sys
- import io
-+import imp
- import unittest
-
- from distutils.command.build_py import build_py
-@@ -57,13 +58,15 @@ class BuildPyTestCase(support.TempdirMan
- self.assertEqual(len(cmd.get_outputs()), 3)
- pkgdest = os.path.join(destination, "pkg")
- files = os.listdir(pkgdest)
-+ pycache_dir = os.path.join(pkgdest, "__pycache__")
- self.assertIn("__init__.py", files)
- self.assertIn("README.txt", files)
-- # XXX even with -O, distutils writes pyc, not pyo; bug?
- if sys.dont_write_bytecode:
-- self.assertNotIn("__init__.pyc", files)
-+ self.assertFalse(os.path.exists(pycache_dir))
- else:
-- self.assertIn("__init__.pyc", files)
-+ # XXX even with -O, distutils writes pyc, not pyo; bug?
-+ pyc_files = os.listdir(pycache_dir)
-+ self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files)
-
- def test_empty_package_dir(self):
- # See SF 1668596/1720897.
-diff -up Python-3.2.2/Lib/distutils/tests/test_install_lib.py.issue11254
Python-3.2.2/Lib/distutils/tests/test_install_lib.py
---- Python-3.2.2/Lib/distutils/tests/test_install_lib.py.issue11254 2011-09-03
12:16:40.000000000 -0400
-+++ Python-3.2.2/Lib/distutils/tests/test_install_lib.py 2011-10-10 17:01:23.167196855
-0400
-@@ -1,6 +1,7 @@
- """Tests for distutils.command.install_data."""
- import sys
- import os
-+import imp
- import unittest
-
- from distutils.command.install_lib import install_lib
-@@ -32,18 +33,20 @@ class InstallLibTestCase(support.Tempdir
- cmd.finalize_options()
- self.assertEqual(cmd.optimize, 2)
-
-- @unittest.skipUnless(not sys.dont_write_bytecode,
-- 'byte-compile not supported')
-+ @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled')
- def test_byte_compile(self):
- pkg_dir, dist = self.create_dist()
-+ os.chdir(pkg_dir)
- cmd = install_lib(dist)
- cmd.compile = cmd.optimize = 1
-
- f = os.path.join(pkg_dir, 'foo.py')
- self.write_file(f, '# python file')
- cmd.byte_compile([f])
-- self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc')))
-- self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo')))
-+ pyc_file = imp.cache_from_source('foo.py')
-+ pyo_file = imp.cache_from_source('foo.py', debug_override=False)
-+ self.assertTrue(os.path.exists(pyc_file))
-+ self.assertTrue(os.path.exists(pyo_file))
-
- def test_get_outputs(self):
- pkg_dir, dist = self.create_dist()
-diff -up Python-3.2.2/Lib/distutils/util.py.issue11254
Python-3.2.2/Lib/distutils/util.py
---- Python-3.2.2/Lib/distutils/util.py.issue11254 2011-09-03 12:16:40.000000000 -0400
-+++ Python-3.2.2/Lib/distutils/util.py 2011-10-10 17:01:23.172196793 -0400
-@@ -4,7 +4,11 @@ Miscellaneous utility functions -- anyth
- one of the other *util.py modules.
- """
-
--import sys, os, string, re
-+import os
-+import re
-+import imp
-+import sys
-+import string
- from distutils.errors import DistutilsPlatformError
- from distutils.dep_util import newer
- from distutils.spawn import spawn
-@@ -415,9 +419,9 @@ def byte_compile (py_files,
- verbose=1, dry_run=0,
- direct=None):
- """Byte-compile a collection of Python source files to either .pyc
-- or .pyo files in the same directory. 'py_files' is a list of files
-- to compile; any files that don't end in ".py" are silently skipped.
-- 'optimize' must be one of the following:
-+ or .pyo files in a __pycache__ subdirectory. 'py_files' is a list
-+ of files to compile; any files that don't end in ".py" are silently
-+ skipped. 'optimize' must be one of the following:
- 0 - don't optimize (generate .pyc)
- 1 - normal optimization (like "python -O")
- 2 - extra optimization (like "python -OO")
-@@ -529,7 +533,10 @@ byte_compile(files, optimize=%r, force=%
- # Terminology from the py_compile module:
- # cfile - byte-compiled file
- # dfile - purported source filename (same as 'file' by default)
-- cfile = file + (__debug__ and "c" or "o")
-+ if optimize >= 0:
-+ cfile = imp.cache_from_source(file, debug_override=not optimize)
-+ else:
-+ cfile = imp.cache_from_source(file)
- dfile = file
- if prefix:
- if file[:len(prefix)] != prefix:
-diff -up Python-3.2.2/Misc/ACKS.issue11254 Python-3.2.2/Misc/ACKS
---- Python-3.2.2/Misc/ACKS.issue11254 2011-09-03 12:16:45.000000000 -0400
-+++ Python-3.2.2/Misc/ACKS 2011-10-10 17:01:23.168196842 -0400
-@@ -715,6 +715,7 @@ Pierre Quentel
- Brian Quinlan
- Anders Qvist
- Burton Radons
-+Jeff Ramnani
- Brodie Rao
- Antti Rasinen
- Sridhar Ratnakumar
diff --git a/00152-fix-test-gdb-regex.patch b/00152-fix-test-gdb-regex.patch
new file mode 100644
index 0000000..4e31c2e
--- /dev/null
+++ b/00152-fix-test-gdb-regex.patch
@@ -0,0 +1,11 @@
+--- Lib/test/test_gdb.py.old 2012-04-11 19:35:13.512681203 -0400
++++ Lib/test/test_gdb.py 2012-04-11 19:39:52.567192540 -0400
+@@ -159,7 +159,7 @@ class DebuggerTests(unittest.TestCase):
+ # gdb can insert additional '\n' and space characters in various places
+ # in its output, depending on the width of the terminal it's connected
+ # to (using its "wrap_here" function)
+- m =
re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+Python/bltinmodule.c.*',
++ m =
re.match('.*#0\s+builtin_id\s+\(self\=.*,\s+v=\s*(.*?)\)\s+at\s+\S*Python/bltinmodule.c.*',
+ gdb_output, re.DOTALL)
+ if not m:
+ self.fail('Unexpected gdb output: %r\n%s' % (gdb_output,
gdb_output))
diff --git a/python-3.2.1-lib64.patch b/python-3.2.1-lib64.patch
deleted file mode 100644
index 8b15e3e..0000000
--- a/python-3.2.1-lib64.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-diff -up Python-3.2.1/Lib/distutils/command/install.py.lib64
Python-3.2.1/Lib/distutils/command/install.py
---- Python-3.2.1/Lib/distutils/command/install.py.lib64 2011-07-09 02:58:46.000000000
-0400
-+++ Python-3.2.1/Lib/distutils/command/install.py 2011-07-11 11:20:45.980426001 -0400
-@@ -47,14 +47,14 @@ else:
- 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',
-diff -up Python-3.2.1/Lib/distutils/sysconfig.py.lib64
Python-3.2.1/Lib/distutils/sysconfig.py
---- Python-3.2.1/Lib/distutils/sysconfig.py.lib64 2011-07-09 02:58:47.000000000 -0400
-+++ Python-3.2.1/Lib/distutils/sysconfig.py 2011-07-11 11:20:45.981426001 -0400
-@@ -124,8 +124,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:
-diff -up Python-3.2.1/Lib/site.py.lib64 Python-3.2.1/Lib/site.py
---- Python-3.2.1/Lib/site.py.lib64 2011-07-09 02:58:49.000000000 -0400
-+++ Python-3.2.1/Lib/site.py 2011-07-11 11:20:45.982426001 -0400
-@@ -285,12 +285,16 @@ def getsitepackages():
- if sys.platform in ('os2emx', 'riscos'):
- sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
- elif os.sep == '/':
-+ sitepackages.append(os.path.join(prefix, "lib64",
-+ "python" + sys.version[:3],
-+ "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
- "python" + sys.version[:3],
- "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
- else:
- sitepackages.append(prefix)
-+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
- if sys.platform == "darwin":
- # for framework builds *only* we add the standard Apple
-diff -up Python-3.2.1/Lib/sysconfig.py.lib64 Python-3.2.1/Lib/sysconfig.py
---- Python-3.2.1/Lib/sysconfig.py.lib64 2011-07-09 02:58:49.000000000 -0400
-+++ Python-3.2.1/Lib/sysconfig.py 2011-07-11 11:20:45.982426001 -0400
-@@ -21,10 +21,10 @@ __all__ = [
-
- _INSTALL_SCHEMES = {
- 'posix_prefix': {
-- 'stdlib': '{base}/lib/python{py_version_short}',
-- 'platstdlib': '{platbase}/lib/python{py_version_short}',
-+ 'stdlib': '{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':
- '{base}/include/python{py_version_short}{abiflags}',
- 'platinclude':
-@@ -81,10 +81,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}',
-diff -up Python-3.2.1/Lib/test/test_site.py.lib64 Python-3.2.1/Lib/test/test_site.py
---- Python-3.2.1/Lib/test/test_site.py.lib64 2011-07-09 02:58:51.000000000 -0400
-+++ Python-3.2.1/Lib/test/test_site.py 2011-07-11 11:20:45.983426001 -0400
-@@ -222,12 +222,15 @@ class HelperFunctionsTests(unittest.Test
- wanted = os.path.join('xoxo', 'Lib',
'site-packages')
- self.assertEqual(dirs[0], wanted)
- elif os.sep == '/':
-- self.assertEqual(len(dirs), 2)
-- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ self.assertEqual(len(dirs), 3)
-+ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
- 'site-packages')
- self.assertEqual(dirs[0], wanted)
-- wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ 'site-packages')
- self.assertEqual(dirs[1], wanted)
-+ wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ self.assertEqual(dirs[2], wanted)
- else:
- self.assertEqual(len(dirs), 2)
- self.assertEqual(dirs[0], 'xoxo')
-diff -up Python-3.2.1/Makefile.pre.in.lib64 Python-3.2.1/Makefile.pre.in
---- Python-3.2.1/Makefile.pre.in.lib64 2011-07-11 11:20:45.974426000 -0400
-+++ Python-3.2.1/Makefile.pre.in 2011-07-11 11:20:45.984426001 -0400
-@@ -106,7 +106,7 @@ LIBDIR= @libdir@
- MANDIR= @mandir@
- INCLUDEDIR= @includedir@
- CONFINCLUDEDIR= $(exec_prefix)/include
--SCRIPTDIR= $(prefix)/lib
-+SCRIPTDIR= $(prefix)/lib64
- ABIFLAGS= @ABIFLAGS@
-
- # Detailed destination directories
-diff -up Python-3.2.1/Modules/getpath.c.lib64 Python-3.2.1/Modules/getpath.c
---- Python-3.2.1/Modules/getpath.c.lib64 2011-07-09 02:58:54.000000000 -0400
-+++ Python-3.2.1/Modules/getpath.c 2011-07-11 11:27:44.596425999 -0400
-@@ -122,8 +122,8 @@
- #endif
-
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
-+#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
-+ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
- #endif
-
- #ifndef LANDMARK
-@@ -135,7 +135,7 @@ static wchar_t exec_prefix[MAXPATHLEN+1]
- static wchar_t progpath[MAXPATHLEN+1];
- static wchar_t *module_search_path = NULL;
- static int module_search_path_malloced = 0;
--static wchar_t *lib_python = L"lib/python" VERSION;
-+static wchar_t *lib_python = L"lib64/python" VERSION;
-
- static void
- reduce(wchar_t *dir)
-@@ -583,7 +583,7 @@ calculate_path(void)
- }
- else
- wcsncpy(zip_path, _prefix, MAXPATHLEN);
-- joinpath(zip_path, L"lib/python00.zip");
-+ joinpath(zip_path, L"lib64/python00.zip");
- bufsz = wcslen(zip_path); /* Replace "00" with version */
- zip_path[bufsz - 6] = VERSION[0];
- zip_path[bufsz - 5] = VERSION[2];
-@@ -593,7 +593,7 @@ calculate_path(void)
- fprintf(stderr,
- "Could not find platform dependent libraries
<exec_prefix>\n");
- wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
-- joinpath(exec_prefix, L"lib/lib-dynload");
-+ joinpath(exec_prefix, L"lib64/lib-dynload");
- }
- /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
-
-diff -up Python-3.2.1/setup.py.lib64 Python-3.2.1/setup.py
---- Python-3.2.1/setup.py.lib64 2011-07-09 02:58:56.000000000 -0400
-+++ Python-3.2.1/setup.py 2011-07-11 11:28:00.193426004 -0400
-@@ -396,7 +396,7 @@ class PyBuildExt(build_ext):
- # Ensure that /usr/local is always used, but the local build
- # directories (i.e. '.' and 'Include') must be first. See
issue
- # 10520.
-- 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')
- self.add_multiarch_paths()
-
-@@ -643,11 +643,11 @@ class PyBuildExt(build_ext):
- elif curses_library:
- readline_libs.append(curses_library)
- elif self.compiler.find_library_file(lib_dirs +
-- ['/usr/lib/termcap'],
-+ ['/usr/lib64/termcap'],
- 'termcap'):
- readline_libs.append('termcap')
- exts.append( 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:
-@@ -684,8 +684,8 @@ class PyBuildExt(build_ext):
- if krb5_h:
- ssl_incs += krb5_h
- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-- ['/usr/local/ssl/lib',
-- '/usr/contrib/ssl/lib/'
-+ ['/usr/local/ssl/lib64',
-+ '/usr/contrib/ssl/lib64/'
- ] )
-
- if (ssl_incs is not None and
diff --git a/python-3.2.3-lib64.patch b/python-3.2.3-lib64.patch
new file mode 100644
index 0000000..5c3cf13
--- /dev/null
+++ b/python-3.2.3-lib64.patch
@@ -0,0 +1,200 @@
+diff -up Python-3.2.3/Lib/distutils/command/install.py.lib64
Python-3.2.3/Lib/distutils/command/install.py
+--- Python-3.2.3/Lib/distutils/command/install.py.lib64 2012-04-11 02:54:02.000000000
-0400
++++ Python-3.2.3/Lib/distutils/command/install.py 2012-04-11 19:01:19.727107020 -0400
+@@ -45,14 +45,14 @@ else:
+ 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',
+diff -up Python-3.2.3/Lib/distutils/sysconfig.py.lib64
Python-3.2.3/Lib/distutils/sysconfig.py
+--- Python-3.2.3/Lib/distutils/sysconfig.py.lib64 2012-04-11 02:54:02.000000000 -0400
++++ Python-3.2.3/Lib/distutils/sysconfig.py 2012-04-11 19:01:19.727107020 -0400
+@@ -122,8 +122,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:
+diff -up Python-3.2.3/Lib/site.py.lib64 Python-3.2.3/Lib/site.py
+--- Python-3.2.3/Lib/site.py.lib64 2012-04-11 02:54:03.000000000 -0400
++++ Python-3.2.3/Lib/site.py 2012-04-11 19:01:19.728107008 -0400
+@@ -285,12 +285,16 @@ def getsitepackages():
+ if sys.platform in ('os2emx', 'riscos'):
+ sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
+ elif os.sep == '/':
++ sitepackages.append(os.path.join(prefix, "lib64",
++ "python" + sys.version[:3],
++ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
+ "python" + sys.version[:3],
+ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
+ else:
+ sitepackages.append(prefix)
++ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
+ if sys.platform == "darwin":
+ # for framework builds *only* we add the standard Apple
+diff -up Python-3.2.3/Lib/sysconfig.py.lib64 Python-3.2.3/Lib/sysconfig.py
+--- Python-3.2.3/Lib/sysconfig.py.lib64 2012-04-11 02:54:03.000000000 -0400
++++ Python-3.2.3/Lib/sysconfig.py 2012-04-11 19:01:19.728107008 -0400
+@@ -21,10 +21,10 @@ __all__ = [
+
+ _INSTALL_SCHEMES = {
+ 'posix_prefix': {
+- 'stdlib': '{base}/lib/python{py_version_short}',
+- 'platstdlib': '{platbase}/lib/python{py_version_short}',
++ 'stdlib': '{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':
+ '{base}/include/python{py_version_short}{abiflags}',
+ 'platinclude':
+@@ -81,10 +81,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}',
+diff -up Python-3.2.3/Lib/test/test_site.py.lib64 Python-3.2.3/Lib/test/test_site.py
+--- Python-3.2.3/Lib/test/test_site.py.lib64 2012-04-11 02:54:05.000000000 -0400
++++ Python-3.2.3/Lib/test/test_site.py 2012-04-11 19:02:01.413585869 -0400
+@@ -236,12 +236,15 @@ class HelperFunctionsTests(unittest.Test
+ self.assertEqual(dirs[2], wanted)
+ elif os.sep == '/':
+ # OS X non-framwework builds, Linux, FreeBSD, etc
+- self.assertEqual(len(dirs), 2)
+- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ self.assertEqual(len(dirs), 3)
++ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
+ 'site-packages')
+ self.assertEqual(dirs[0], wanted)
+- wanted = os.path.join('xoxo', 'lib', 'site-python')
++ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ 'site-packages')
+ self.assertEqual(dirs[1], wanted)
++ wanted = os.path.join('xoxo', 'lib', 'site-python')
++ self.assertEqual(dirs[2], wanted)
+ else:
+ # other platforms
+ self.assertEqual(len(dirs), 2)
+diff -up Python-3.2.3/Makefile.pre.in.lib64 Python-3.2.3/Makefile.pre.in
+--- Python-3.2.3/Makefile.pre.in.lib64 2012-04-11 19:01:19.722107084 -0400
++++ Python-3.2.3/Makefile.pre.in 2012-04-11 19:01:19.729106996 -0400
+@@ -106,7 +106,7 @@ LIBDIR= @libdir@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/lib64
+ ABIFLAGS= @ABIFLAGS@
+
+ # Detailed destination directories
+diff -up Python-3.2.3/Modules/getpath.c.lib64 Python-3.2.3/Modules/getpath.c
+--- Python-3.2.3/Modules/getpath.c.lib64 2012-04-11 02:54:07.000000000 -0400
++++ Python-3.2.3/Modules/getpath.c 2012-04-11 19:01:19.729106996 -0400
+@@ -122,8 +122,8 @@
+ #endif
+
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
++ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
+ #endif
+
+ #ifndef LANDMARK
+@@ -135,7 +135,7 @@ static wchar_t exec_prefix[MAXPATHLEN+1]
+ static wchar_t progpath[MAXPATHLEN+1];
+ static wchar_t *module_search_path = NULL;
+ static int module_search_path_malloced = 0;
+-static wchar_t *lib_python = L"lib/python" VERSION;
++static wchar_t *lib_python = L"lib64/python" VERSION;
+
+ static void
+ reduce(wchar_t *dir)
+@@ -583,7 +583,7 @@ calculate_path(void)
+ }
+ else
+ wcsncpy(zip_path, _prefix, MAXPATHLEN);
+- joinpath(zip_path, L"lib/python00.zip");
++ joinpath(zip_path, L"lib64/python00.zip");
+ bufsz = wcslen(zip_path); /* Replace "00" with version */
+ zip_path[bufsz - 6] = VERSION[0];
+ zip_path[bufsz - 5] = VERSION[2];
+@@ -593,7 +593,7 @@ calculate_path(void)
+ fprintf(stderr,
+ "Could not find platform dependent libraries
<exec_prefix>\n");
+ wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
+- joinpath(exec_prefix, L"lib/lib-dynload");
++ joinpath(exec_prefix, L"lib64/lib-dynload");
+ }
+ /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+
+diff -up Python-3.2.3/setup.py.lib64 Python-3.2.3/setup.py
+--- Python-3.2.3/setup.py.lib64 2012-04-11 02:54:08.000000000 -0400
++++ Python-3.2.3/setup.py 2012-04-11 19:01:19.730106984 -0400
+@@ -396,7 +396,7 @@ class PyBuildExt(build_ext):
+ # Ensure that /usr/local is always used, but the local build
+ # directories (i.e. '.' and 'Include') must be first. See
issue
+ # 10520.
+- 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')
+ self.add_multiarch_paths()
+
+@@ -643,11 +643,11 @@ class PyBuildExt(build_ext):
+ elif curses_library:
+ readline_libs.append(curses_library)
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/lib64/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( 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:
+@@ -684,8 +684,8 @@ class PyBuildExt(build_ext):
+ if krb5_h:
+ ssl_incs += krb5_h
+ ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
+- ['/usr/local/ssl/lib',
+- '/usr/contrib/ssl/lib/'
++ ['/usr/local/ssl/lib64',
++ '/usr/contrib/ssl/lib64/'
+ ] )
+
+ if (ssl_incs is not None and
diff --git a/python3.spec b/python3.spec
index 46112d6..695cd60 100644
--- a/python3.spec
+++ b/python3.spec
@@ -121,8 +121,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.2
-Release: 13%{?dist}
+Version: %{pybasever}.3
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -224,7 +224,7 @@ Patch3: python-3.2b2-remove-mimeaudio-tests.patch
# dmalcolm
Patch55: 00055-systemtap.patch
-Patch102: python-3.2.1-lib64.patch
+Patch102: python-3.2.3-lib64.patch
# Only used when "%{_lib}" == "lib64"
# Another lib64 fix, for distutils/tests/test_install.py; not upstream:
@@ -358,14 +358,11 @@ Patch146: 00146-hashlib-fips.patch
# Not yet sent upstream
Patch147: 00147-add-debug-malloc-stats.patch
-# Cherrypick fix for dbm version detection to cope with gdbm-1.9's magic values
-# Taken from upstream
http://bugs.python.org/issue13007 (rhbz#742242)
-Patch148: 00148-gdbm-1.9-magic-values.patch
+# Upstream as of Python 3.2.3:
+# Patch148: 00148-gdbm-1.9-magic-values.patch
-# Cherrypick fix for distutils not using __pycache__ when byte-compiling files
-# Based on upstream
http://bugs.python.org/issue11254 (rhbz#722578)
-# (upstream commits 27a36b05caed and 651e84363001):
-Patch149: 00149-backport-issue11254-pycache-bytecompilation-fix.patch
+# Upstream as of Python 3.2.3:
+# Patch149: 00149-backport-issue11254-pycache-bytecompilation-fix.patch
# temporarily disable rAssertAlmostEqual in test_cmath on PPC (bz #750811)
# caused by a glibc bug. This patch can be removed when we have a glibc with
@@ -373,6 +370,14 @@ Patch149:
00149-backport-issue11254-pycache-bytecompilation-fix.patch
#
http://sourceware.org/bugzilla/show_bug.cgi?id=13472
Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
+# python.spec had:
+# Patch151: 00151-fork-deadlock.patch
+
+# Fix a regex in test_gdb so that it doesn't choke when gdb provides a full
+# path to Python/bltinmodule.c:
+Patch152: 00152-fix-test-gdb-regex.patch
+
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -583,11 +588,13 @@ done
# 00145: not for python3
%patch146 -p1
%patch147 -p1
-%patch148 -p1
-%patch149 -p1
+# 00148: upstream as of Python 3.2.3
+# 00149: upstream as of Python 3.2.3
%ifarch ppc ppc64
%patch150 -p1
%endif
+# 00151: not for python3
+%patch152 -p0
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1410,6 +1417,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Apr 11 2012 David Malcolm <dmalcolm(a)redhat.com> - 3.2.3-1
+- 3.2.3; refresh patch 102 (lib64); drop upstream patches 148 (gdbm magic
+values), 149 (__pycache__ fix); add patch 152 (test_gdb regex)
+
* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
- use newly installed python for byte compiling (now for real)
diff --git a/sources b/sources
index fd9f0fc..9d0aae5 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-3720ce9460597e49264bbb63b48b946d Python-3.2.2.tar.xz
+187564726f2c1473d301c586acc24847 Python-3.2.3.tar.xz
commit ae2fc1c0436586c7307266799ef50fec5e2edb8d
Author: Thomas Spura <thomas.spura(a)gmail.com>
Date: Mon Feb 6 11:28:14 2012 +0100
use newly installed python for byte compiling (#787498) the macros.pybytecompile way
Signed-off-by: Thomas Spura <thomas.spura(a)gmail.com>
diff --git a/python3.spec b/python3.spec
index 76fad62..46112d6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -917,10 +917,16 @@ iconv -f iso8859-1 -t utf-8 %{buildroot}/%{pylibdir}/Demo/rpc/README
> README.co
# Do bytecompilation with the newly installed interpreter.
# This is similar to the script in macros.pybytecompile
+# compile *.pyo
find %{buildroot} -type f -a -name "*.py" -print0 | \
- LD_LIBRARY_PATH="%{buildroot}/%{dynload_dir}/:%{buildroot}/%{_libdir}" \
- PYTHONPATH="%{buildroot}/%{_libdir}python%{pybasever}
%{buildroot}/%{_libdir}python%{pybasever}/site-packages" \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}python%{pybasever}
%{buildroot}/%{_libdir}python%{pybasever}/site-packages" \
xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2]) for f in
sys.argv[1:]]' || :
+# compile *.pyc
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}%{dynload_dir}/:%{buildroot}%{_libdir}" \
+ PYTHONPATH="%{buildroot}%{_libdir}python%{pybasever}
%{buildroot}/%{_libdir}python%{pybasever}/site-packages" \
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2], optimize=0) for f
in sys.argv[1:]]' || :
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
find %{buildroot} \
@@ -1404,8 +1410,8 @@ rm -fr %{buildroot}
# ======================================================
%changelog
-* Mon Feb 6 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
-- use newly installed python for byte compiling (#787498)
+* Thu Feb 9 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
+- use newly installed python for byte compiling (now for real)
* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
- use newly installed python for byte compiling (#787498)
commit e6314e68e153bc9eec3264e28d0fda585e7d45a1
Author: Thomas Spura <thomas.spura(a)gmail.com>
Date: Mon Feb 6 11:28:14 2012 +0100
use newly installed python for byte compiling (#787498) the macros.pybytecompile way
Signed-off-by: Thomas Spura <thomas.spura(a)gmail.com>
diff --git a/python3.spec b/python3.spec
index bd0a510..76fad62 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
Group: Development/Languages
@@ -916,9 +916,11 @@ iconv -f iso8859-1 -t utf-8 %{buildroot}/%{pylibdir}/Demo/rpc/README
> README.co
# character encodings within python source code
# Do bytecompilation with the newly installed interpreter.
-LD_LIBRARY_PATH=%{buildroot}/%{dynload_dir}/ \
+# This is similar to the script in macros.pybytecompile
+find %{buildroot} -type f -a -name "*.py" -print0 | \
+ LD_LIBRARY_PATH="%{buildroot}/%{dynload_dir}/:%{buildroot}/%{_libdir}" \
PYTHONPATH="%{buildroot}/%{_libdir}python%{pybasever}
%{buildroot}/%{_libdir}python%{pybasever}/site-packages" \
- /usr/lib/rpm/brp-python-bytecompile %{buildroot}%{_bindir}/python%{pybasever}
+ xargs -0 %{buildroot}%{_bindir}/python%{pybasever} -O -c 'import py_compile, sys;
[py_compile.compile(f, dfile=f.partition("%{buildroot}")[2]) for f in
sys.argv[1:]]' || :
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
find %{buildroot} \
@@ -1402,6 +1404,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Feb 6 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-13
+- use newly installed python for byte compiling (#787498)
+
* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
- use newly installed python for byte compiling (#787498)
commit 1c26b68ffef9648f68a2237f72fbf1438e79f652
Author: Thomas Spura <thomas.spura(a)gmail.com>
Date: Sun Feb 5 20:32:34 2012 +0100
use newly installed python for byte compiling (#787498)
Signed-off-by: Thomas Spura <thomas.spura(a)gmail.com>
diff --git a/python3.spec b/python3.spec
index 382d288..bd0a510 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
Group: Development/Languages
@@ -915,8 +915,10 @@ iconv -f iso8859-1 -t utf-8 %{buildroot}/%{pylibdir}/Demo/rpc/README
> README.co
# for the 2to3 tool, and one of the functions of the 2to3 tool is to fixup
# character encodings within python source code
-# Do bytecompilation with the new interpreter.
-LD_LIBRARY_PATH=. /usr/lib/rpm/brp-python-bytecompile ./python
+# Do bytecompilation with the newly installed interpreter.
+LD_LIBRARY_PATH=%{buildroot}/%{dynload_dir}/ \
+ PYTHONPATH="%{buildroot}/%{_libdir}python%{pybasever}
%{buildroot}/%{_libdir}python%{pybasever}/site-packages" \
+ /usr/lib/rpm/brp-python-bytecompile %{buildroot}%{_bindir}/python%{pybasever}
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
find %{buildroot} \
@@ -1400,6 +1402,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sun Feb 5 2012 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2.2-12
+- use newly installed python for byte compiling (#787498)
+
* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
- Build with $RPM_LD_FLAGS (#756863).
- Use xz-compressed source tarball.
commit 8a69a67643ea4eac77462fc307922efc9264d507
Author: Ville Skytt <ville.skytta(a)iki.fi>
Date: Wed Jan 4 22:15:40 2012 +0200
Build with $RPM_LD_FLAGS (#756863).
Use xz-compressed source tarball.
diff --git a/.gitignore b/.gitignore
index ec6198e..dafa321 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1 @@
-libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
-Python-3.1.2.tar.bz2
-Python-3.2a1.tar.bz2
-/Python-3.2b2.tar.bz2
-/Python-3.2rc1.tar.bz2
-/Python-3.2rc2.tar.bz2
-/Python-3.2rc3.tar.bz2
-/Python-3.2.tar.bz2
-/Python-3.2.1.tar.bz2
-/Python-3.2.2.tar.bz2
+/*.tar.*
diff --git a/python3.spec b/python3.spec
index 11bc653..382d288 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
Group: Development/Languages
@@ -178,7 +178,7 @@ BuildRequires: zlib-devel
# Source code and patches
# =======================
-Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
+Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -618,7 +618,7 @@ export CPPFLAGS="`pkg-config --cflags-only-I libffi`"
export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
export LINKCC="gcc"
export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
-export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`"
+export LDFLAGS="$RPM_LD_FLAGS `pkg-config --libs-only-L openssl`"
%if 0%{regenerate_autotooling_patch}
# If enabled, this code regenerates the patch to "configure", using a
@@ -1400,6 +1400,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Jan 4 2012 Ville Skytt <ville.skytta(a)iki.fi> - 3.2.2-11
+- Build with $RPM_LD_FLAGS (#756863).
+- Use xz-compressed source tarball.
+
* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
diff --git a/sources b/sources
index ba6917c..fd9f0fc 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-9d763097a13a59ff53428c9e4d098a05 Python-3.2.2.tar.bz2
+3720ce9460597e49264bbb63b48b946d Python-3.2.2.tar.xz
commit 1af13838fd0606e595b8dbc4cc35a717c5937037
Author: Karsten Hopp <karsten(a)redhat.com>
Date: Thu Dec 8 01:44:05 2011 +0100
disable rAssertAlmostEqual in test_cmath on PPC (#750811)
diff --git a/00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
b/00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
new file mode 100644
index 0000000..73b6356
--- /dev/null
+++ b/00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
@@ -0,0 +1,11 @@
+diff -up Python-3.2.2/Lib/test/test_cmath.py.ppc Python-3.2.2/Lib/test/test_cmath.py
+--- Python-3.2.2/Lib/test/test_cmath.py.ppc 2011-12-07 23:43:55.000000000 +0100
++++ Python-3.2.2/Lib/test/test_cmath.py 2011-12-07 23:49:44.000000000 +0100
+@@ -95,6 +95,7 @@ class CMathTests(unittest.TestCase):
+ self.assertFloatIdentical(x.real, y.real)
+ self.assertFloatIdentical(x.imag, y.imag)
+
++ @unittest.skip('Known failure on PPC: glibc bug
https://bugzilla.redhat.com/show_bug.cgi?id=750811')
+ def rAssertAlmostEqual(self, a, b, rel_err = 2e-15, abs_err = 5e-323,
+ msg=None):
+ """Fail if the two floating-point numbers are not almost equal.
diff --git a/python3.spec b/python3.spec
index 3c078b5..11bc653 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
@@ -367,6 +367,12 @@ Patch148: 00148-gdbm-1.9-magic-values.patch
# (upstream commits 27a36b05caed and 651e84363001):
Patch149: 00149-backport-issue11254-pycache-bytecompilation-fix.patch
+# temporarily disable rAssertAlmostEqual in test_cmath on PPC (bz #750811)
+# caused by a glibc bug. This patch can be removed when we have a glibc with
+# the patch mentioned here:
+#
http://sourceware.org/bugzilla/show_bug.cgi?id=13472
+Patch150: 00150-disable-rAssertAlmostEqual-cmath-on-ppc.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -579,6 +585,9 @@ done
%patch147 -p1
%patch148 -p1
%patch149 -p1
+%ifarch ppc ppc64
+%patch150 -p1
+%endif
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1391,6 +1400,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Dec 07 2011 Karsten Hopp <karsten(a)redhat.com> 3.2.2-10
+- disable rAssertAlmostEqual in test_cmath on PPC (#750811)
+
* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
- python3-devel missing autogenerated pkgconfig() provides (#746751)
commit 8c9e381740ccdddd44fb026abc216546c0c821a9
Author: Rex Dieter <rdieter(a)fedoraproject.org>
Date: Mon Oct 17 13:48:14 2011 -0500
python3-devel missing autogenerated pkgconfig() provides (#746751)
In short, use
/usr/lib/rpm/redhat/find-provides
intead of
/usr/lib/rpm/find-provides
diff --git a/find-provides-without-python-sonames.sh
b/find-provides-without-python-sonames.sh
index 8961b87..7a9e224 100755
--- a/find-provides-without-python-sonames.sh
+++ b/find-provides-without-python-sonames.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# The standard /usr/lib/rpm/find-provides script
+# The standard find-provides script
# adds provides lines for all SONAME directives in all shared libraries,
# even if those libraries are not in the LD_LIBRARY_PATH
@@ -10,6 +10,6 @@
# So we strip out all /usr/lib/python lines first, before running them through
# the standard script:
grep -v "/usr/lib/python" | grep -v "/usr/lib64/python" | \
- /usr/lib/rpm/find-provides
+ /usr/lib/rpm/redhat/find-provides
exit 0
diff --git a/python3.spec b/python3.spec
index 536c3ec..3c078b5 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
@@ -1391,6 +1391,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Oct 17 2011 Rex Dieter <rdieter(a)fedoraproject.org> - 3.2.2-9
+- python3-devel missing autogenerated pkgconfig() provides (#746751)
+
* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
- cherrypick fix for distutils not using __pycache__ when byte-compiling
files (rhbz#722578)
commit e2a3db4dedb92ecbe2df3545d19dc95e243d54c3
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Oct 10 17:14:54 2011 -0400
3.2.2-8: cherrypick fix for distutils not using __pycache__ when byte-compiling
(rhbz#722578)
* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
- cherrypick fix for distutils not using __pycache__ when byte-compiling
files (rhbz#722578)
diff --git a/00149-backport-issue11254-pycache-bytecompilation-fix.patch
b/00149-backport-issue11254-pycache-bytecompilation-fix.patch
new file mode 100644
index 0000000..d3651b0
--- /dev/null
+++ b/00149-backport-issue11254-pycache-bytecompilation-fix.patch
@@ -0,0 +1,146 @@
+diff -up Python-3.2.2/Doc/distutils/apiref.rst.issue11254
Python-3.2.2/Doc/distutils/apiref.rst
+--- Python-3.2.2/Doc/distutils/apiref.rst.issue11254 2011-09-03 12:16:38.000000000 -0400
++++ Python-3.2.2/Doc/distutils/apiref.rst 2011-10-10 17:01:23.167196855 -0400
+@@ -1204,9 +1204,9 @@ other utility module.
+ .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None,
verbose=1, dry_run=0, direct=None])
+
+ Byte-compile a collection of Python source files to either :file:`.pyc` or
+- :file:`.pyo` files in the same directory. *py_files* is a list of files to
+- compile; any files that don't end in :file:`.py` are silently skipped.
+- *optimize* must be one of the following:
++ :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`).
++ *py_files* is a list of files to compile; any files that don't end in
++ :file:`.py` are silently skipped. *optimize* must be one of the following:
+
+ * ``0`` - don't optimize (generate :file:`.pyc`)
+ * ``1`` - normal optimization (like ``python -O``)
+@@ -1231,6 +1231,11 @@ other utility module.
+ is used by the script generated in indirect mode; unless you know what you're
+ doing, leave it set to ``None``.
+
++ .. versionchanged:: 3.2.3
++ Create ``.pyc`` or ``.pyo`` files with an :func:`import magic tag
++ <imp.get_tag>` in their name, in a :file:`__pycache__` subdirectory
++ instead of files without tag in the current directory.
++
+
+ .. function:: rfc822_escape(header)
+
+diff -up Python-3.2.2/Lib/distutils/tests/test_build_py.py.issue11254
Python-3.2.2/Lib/distutils/tests/test_build_py.py
+--- Python-3.2.2/Lib/distutils/tests/test_build_py.py.issue11254 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Lib/distutils/tests/test_build_py.py 2011-10-10 17:01:23.167196855
-0400
+@@ -3,6 +3,7 @@
+ import os
+ import sys
+ import io
++import imp
+ import unittest
+
+ from distutils.command.build_py import build_py
+@@ -57,13 +58,15 @@ class BuildPyTestCase(support.TempdirMan
+ self.assertEqual(len(cmd.get_outputs()), 3)
+ pkgdest = os.path.join(destination, "pkg")
+ files = os.listdir(pkgdest)
++ pycache_dir = os.path.join(pkgdest, "__pycache__")
+ self.assertIn("__init__.py", files)
+ self.assertIn("README.txt", files)
+- # XXX even with -O, distutils writes pyc, not pyo; bug?
+ if sys.dont_write_bytecode:
+- self.assertNotIn("__init__.pyc", files)
++ self.assertFalse(os.path.exists(pycache_dir))
+ else:
+- self.assertIn("__init__.pyc", files)
++ # XXX even with -O, distutils writes pyc, not pyo; bug?
++ pyc_files = os.listdir(pycache_dir)
++ self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files)
+
+ def test_empty_package_dir(self):
+ # See SF 1668596/1720897.
+diff -up Python-3.2.2/Lib/distutils/tests/test_install_lib.py.issue11254
Python-3.2.2/Lib/distutils/tests/test_install_lib.py
+--- Python-3.2.2/Lib/distutils/tests/test_install_lib.py.issue11254 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Lib/distutils/tests/test_install_lib.py 2011-10-10 17:01:23.167196855
-0400
+@@ -1,6 +1,7 @@
+ """Tests for distutils.command.install_data."""
+ import sys
+ import os
++import imp
+ import unittest
+
+ from distutils.command.install_lib import install_lib
+@@ -32,18 +33,20 @@ class InstallLibTestCase(support.Tempdir
+ cmd.finalize_options()
+ self.assertEqual(cmd.optimize, 2)
+
+- @unittest.skipUnless(not sys.dont_write_bytecode,
+- 'byte-compile not supported')
++ @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled')
+ def test_byte_compile(self):
+ pkg_dir, dist = self.create_dist()
++ os.chdir(pkg_dir)
+ cmd = install_lib(dist)
+ cmd.compile = cmd.optimize = 1
+
+ f = os.path.join(pkg_dir, 'foo.py')
+ self.write_file(f, '# python file')
+ cmd.byte_compile([f])
+- self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc')))
+- self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo')))
++ pyc_file = imp.cache_from_source('foo.py')
++ pyo_file = imp.cache_from_source('foo.py', debug_override=False)
++ self.assertTrue(os.path.exists(pyc_file))
++ self.assertTrue(os.path.exists(pyo_file))
+
+ def test_get_outputs(self):
+ pkg_dir, dist = self.create_dist()
+diff -up Python-3.2.2/Lib/distutils/util.py.issue11254
Python-3.2.2/Lib/distutils/util.py
+--- Python-3.2.2/Lib/distutils/util.py.issue11254 2011-09-03 12:16:40.000000000 -0400
++++ Python-3.2.2/Lib/distutils/util.py 2011-10-10 17:01:23.172196793 -0400
+@@ -4,7 +4,11 @@ Miscellaneous utility functions -- anyth
+ one of the other *util.py modules.
+ """
+
+-import sys, os, string, re
++import os
++import re
++import imp
++import sys
++import string
+ from distutils.errors import DistutilsPlatformError
+ from distutils.dep_util import newer
+ from distutils.spawn import spawn
+@@ -415,9 +419,9 @@ def byte_compile (py_files,
+ verbose=1, dry_run=0,
+ direct=None):
+ """Byte-compile a collection of Python source files to either .pyc
+- or .pyo files in the same directory. 'py_files' is a list of files
+- to compile; any files that don't end in ".py" are silently skipped.
+- 'optimize' must be one of the following:
++ or .pyo files in a __pycache__ subdirectory. 'py_files' is a list
++ of files to compile; any files that don't end in ".py" are silently
++ skipped. 'optimize' must be one of the following:
+ 0 - don't optimize (generate .pyc)
+ 1 - normal optimization (like "python -O")
+ 2 - extra optimization (like "python -OO")
+@@ -529,7 +533,10 @@ byte_compile(files, optimize=%r, force=%
+ # Terminology from the py_compile module:
+ # cfile - byte-compiled file
+ # dfile - purported source filename (same as 'file' by default)
+- cfile = file + (__debug__ and "c" or "o")
++ if optimize >= 0:
++ cfile = imp.cache_from_source(file, debug_override=not optimize)
++ else:
++ cfile = imp.cache_from_source(file)
+ dfile = file
+ if prefix:
+ if file[:len(prefix)] != prefix:
+diff -up Python-3.2.2/Misc/ACKS.issue11254 Python-3.2.2/Misc/ACKS
+--- Python-3.2.2/Misc/ACKS.issue11254 2011-09-03 12:16:45.000000000 -0400
++++ Python-3.2.2/Misc/ACKS 2011-10-10 17:01:23.168196842 -0400
+@@ -715,6 +715,7 @@ Pierre Quentel
+ Brian Quinlan
+ Anders Qvist
+ Burton Radons
++Jeff Ramnani
+ Brodie Rao
+ Antti Rasinen
+ Sridhar Ratnakumar
diff --git a/python3.spec b/python3.spec
index a264334..536c3ec 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
@@ -362,6 +362,11 @@ Patch147: 00147-add-debug-malloc-stats.patch
# Taken from upstream
http://bugs.python.org/issue13007 (rhbz#742242)
Patch148: 00148-gdbm-1.9-magic-values.patch
+# Cherrypick fix for distutils not using __pycache__ when byte-compiling files
+# Based on upstream
http://bugs.python.org/issue11254 (rhbz#722578)
+# (upstream commits 27a36b05caed and 651e84363001):
+Patch149: 00149-backport-issue11254-pycache-bytecompilation-fix.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -573,6 +578,7 @@ done
%patch146 -p1
%patch147 -p1
%patch148 -p1
+%patch149 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1385,6 +1391,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Oct 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-8
+- cherrypick fix for distutils not using __pycache__ when byte-compiling
+files (rhbz#722578)
+
* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
- re-enable gdbm (patch 148; rhbz#742242)
commit 9b8d221300e8d8197926577f9d6282e4845bacba
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Sep 30 16:46:26 2011 -0400
re-enable gdbm (patch 148; rhbz#742242)
* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
- re-enable gdbm (patch 148; rhbz#742242)
diff --git a/00148-gdbm-1.9-magic-values.patch b/00148-gdbm-1.9-magic-values.patch
new file mode 100644
index 0000000..e8ce828
--- /dev/null
+++ b/00148-gdbm-1.9-magic-values.patch
@@ -0,0 +1,13 @@
+diff -up Python-3.2.2/Lib/dbm/__init__.py.gdbm-1.9-magic
Python-3.2.2/Lib/dbm/__init__.py
+--- Python-3.2.2/Lib/dbm/__init__.py.gdbm-1.9-magic 2011-09-03 12:16:40.000000000 -0400
++++ Python-3.2.2/Lib/dbm/__init__.py 2011-09-30 15:47:27.488863694 -0400
+@@ -166,7 +166,7 @@ def whichdb(filename):
+ return ""
+
+ # Check for GNU dbm
+- if magic == 0x13579ace:
++ if magic in (0x13579ace, 0x13579acd, 0x13579acf):
+ return "dbm.gnu"
+
+ # Later versions of Berkeley db hash file have a 12-byte pad in
+diff -up Python-3.2.2/Misc/NEWS.gdbm-1.9-magic Python-3.2.2/Misc/NEWS
diff --git a/python3.spec b/python3.spec
index cb64c64..a264334 100644
--- a/python3.spec
+++ b/python3.spec
@@ -59,7 +59,7 @@
%global with_valgrind 0
%endif
-%global with_gdbm 0
+%global with_gdbm 1
# Change from yes to no to turn this off
%global with_computed_gotos yes
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -358,6 +358,10 @@ Patch146: 00146-hashlib-fips.patch
# Not yet sent upstream
Patch147: 00147-add-debug-malloc-stats.patch
+# Cherrypick fix for dbm version detection to cope with gdbm-1.9's magic values
+# Taken from upstream
http://bugs.python.org/issue13007 (rhbz#742242)
+Patch148: 00148-gdbm-1.9-magic-values.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -366,7 +370,7 @@ Patch147: 00147-add-debug-malloc-stats.patch
# - use the same patch number across both specfiles for conceptually-equivalent
# fixes, ideally with the same name
#
-# - when a patch is relevan to both specfiles, use the same introductory
+# - when a patch is relevant to both specfiles, use the same introductory
# comment in both specfiles where possible (to improve "diff" output when
# comparing them)
#
@@ -568,6 +572,7 @@ done
# 00145: not for python3
%patch146 -p1
%patch147 -p1
+%patch148 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -655,6 +660,7 @@ BuildPython() {
--with-valgrind \
%endif
--with-system-expat \
+ --with-dbmliborder=gdbm:ndbm:bdb \
$ExtraConfigArgs \
--with-computed-gotos=%{with_computed_gotos} \
%{nil}
@@ -1379,6 +1385,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Sep 30 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-7
+- re-enable gdbm (patch 148; rhbz#742242)
+
* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
- add a sys._debugmallocstats() function (patch 147)
commit ab415c6cddafcf5b295bf4433c2142a84c0f8e64
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Sep 16 19:28:20 2011 -0400
add a sys._debugmallocstats() function (patch 147)
* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
- add a sys._debugmallocstats() function (patch 147)
diff --git a/00147-add-debug-malloc-stats.patch b/00147-add-debug-malloc-stats.patch
new file mode 100644
index 0000000..e2a8342
--- /dev/null
+++ b/00147-add-debug-malloc-stats.patch
@@ -0,0 +1,590 @@
+diff -up Python-3.2.2/Include/dictobject.h.add-debug-malloc-stats
Python-3.2.2/Include/dictobject.h
+--- Python-3.2.2/Include/dictobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Include/dictobject.h 2011-09-16 18:57:24.969825060 -0400
+@@ -156,6 +156,8 @@ PyAPI_FUNC(PyObject *) PyDict_GetItemStr
+ PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item);
+ PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key);
+
++PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -up Python-3.2.2/Include/floatobject.h.add-debug-malloc-stats
Python-3.2.2/Include/floatobject.h
+--- Python-3.2.2/Include/floatobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Include/floatobject.h 2011-09-16 18:57:24.970825060 -0400
+@@ -110,6 +110,8 @@ PyAPI_FUNC(double) _PyFloat_Unpack8(cons
+ /* free list api */
+ PyAPI_FUNC(int) PyFloat_ClearFreeList(void);
+
++PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out);
++
+ /* Format the object based on the format_spec, as defined in PEP 3101
+ (Advanced String Formatting). */
+ PyAPI_FUNC(PyObject *) _PyFloat_FormatAdvanced(PyObject *obj,
+diff -up Python-3.2.2/Include/frameobject.h.add-debug-malloc-stats
Python-3.2.2/Include/frameobject.h
+--- Python-3.2.2/Include/frameobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Include/frameobject.h 2011-09-16 18:57:24.970825060 -0400
+@@ -79,6 +79,8 @@ PyAPI_FUNC(void) PyFrame_FastToLocals(Py
+
+ PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
+
++PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out);
++
+ /* Return the line of code the frame is currently executing. */
+ PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *);
+
+diff -up Python-3.2.2/Include/listobject.h.add-debug-malloc-stats
Python-3.2.2/Include/listobject.h
+--- Python-3.2.2/Include/listobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Include/listobject.h 2011-09-16 18:57:24.971825060 -0400
+@@ -71,6 +71,8 @@ PyAPI_FUNC(PyObject *) _PyList_Extend(Py
+ #define PyList_GET_SIZE(op) Py_SIZE(op)
+ #endif
+
++PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -up Python-3.2.2/Include/methodobject.h.add-debug-malloc-stats
Python-3.2.2/Include/methodobject.h
+--- Python-3.2.2/Include/methodobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Include/methodobject.h 2011-09-16 18:57:24.971825060 -0400
+@@ -81,6 +81,10 @@ typedef struct {
+
+ PyAPI_FUNC(int) PyCFunction_ClearFreeList(void);
+
++PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out);
++PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out);
++
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -up Python-3.2.2/Include/object.h.add-debug-malloc-stats
Python-3.2.2/Include/object.h
+--- Python-3.2.2/Include/object.h.add-debug-malloc-stats 2011-09-03 12:16:40.000000000
-0400
++++ Python-3.2.2/Include/object.h 2011-09-16 18:57:24.972825060 -0400
+@@ -919,6 +919,13 @@ PyAPI_DATA(PyObject *) _PyTrash_delete_l
+ else \
+ _PyTrash_deposit_object((PyObject*)op);
+
++PyAPI_FUNC(void)
++_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks,
++ size_t sizeof_block);
++
++PyAPI_FUNC(void)
++_PyObject_DebugTypeStats(FILE *out);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -up Python-3.2.2/Include/objimpl.h.add-debug-malloc-stats
Python-3.2.2/Include/objimpl.h
+--- Python-3.2.2/Include/objimpl.h.add-debug-malloc-stats 2011-09-03 12:16:40.000000000
-0400
++++ Python-3.2.2/Include/objimpl.h 2011-09-16 18:57:24.972825060 -0400
+@@ -101,13 +101,13 @@ PyAPI_FUNC(void) PyObject_Free(void *);
+
+ /* Macros */
+ #ifdef WITH_PYMALLOC
++PyAPI_FUNC(void) _PyObject_DebugMallocStats(FILE *out);
+ #ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */
+ PyAPI_FUNC(void *) _PyObject_DebugMalloc(size_t nbytes);
+ PyAPI_FUNC(void *) _PyObject_DebugRealloc(void *p, size_t nbytes);
+ PyAPI_FUNC(void) _PyObject_DebugFree(void *p);
+ PyAPI_FUNC(void) _PyObject_DebugDumpAddress(const void *p);
+ PyAPI_FUNC(void) _PyObject_DebugCheckAddress(const void *p);
+-PyAPI_FUNC(void) _PyObject_DebugMallocStats(void);
+ PyAPI_FUNC(void *) _PyObject_DebugMallocApi(char api, size_t nbytes);
+ PyAPI_FUNC(void *) _PyObject_DebugReallocApi(char api, void *p, size_t nbytes);
+ PyAPI_FUNC(void) _PyObject_DebugFreeApi(char api, void *p);
+diff -up Python-3.2.2/Include/setobject.h.add-debug-malloc-stats
Python-3.2.2/Include/setobject.h
+--- Python-3.2.2/Include/setobject.h.add-debug-malloc-stats 2011-09-16 19:10:58.448817301
-0400
++++ Python-3.2.2/Include/setobject.h 2011-09-16 19:12:16.343816559 -0400
+@@ -101,6 +101,8 @@ PyAPI_FUNC(PyObject *) PySet_Pop(PyObjec
+ PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable);
+ #endif
+
++PyAPI_FUNC(void) _PySet_DebugMallocStats(FILE *out);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -up Python-3.2.2/Include/tupleobject.h.add-debug-malloc-stats
Python-3.2.2/Include/tupleobject.h
+--- Python-3.2.2/Include/tupleobject.h.add-debug-malloc-stats 2011-09-16
19:10:45.540817425 -0400
++++ Python-3.2.2/Include/tupleobject.h 2011-09-16 19:12:41.446816320 -0400
+@@ -63,6 +63,7 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(P
+ #endif
+
+ PyAPI_FUNC(int) PyTuple_ClearFreeList(void);
++PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out);
+
+ #ifdef __cplusplus
+ }
+diff -up Python-3.2.2/Include/unicodeobject.h.add-debug-malloc-stats
Python-3.2.2/Include/unicodeobject.h
+--- Python-3.2.2/Include/unicodeobject.h.add-debug-malloc-stats 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Include/unicodeobject.h 2011-09-16 18:57:24.973825060 -0400
+@@ -1670,6 +1670,8 @@ PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnic
+ );
+ #endif /* Py_LIMITED_API */
+
++PyAPI_FUNC(void) _PyUnicode_DebugMallocStats(FILE *out);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -up Python-3.2.2/Lib/test/test_sys.py.add-debug-malloc-stats
Python-3.2.2/Lib/test/test_sys.py
+--- Python-3.2.2/Lib/test/test_sys.py.add-debug-malloc-stats 2011-09-16
18:57:24.940825060 -0400
++++ Python-3.2.2/Lib/test/test_sys.py 2011-09-16 19:23:50.415809940 -0400
+@@ -564,6 +564,18 @@ class SysModuleTest(unittest.TestCase):
+ expected = None
+ self.check_fsencoding(fs_encoding, expected)
+
++ def test_debugmallocstats(self):
++ # Test sys._debugmallocstats()
++
++ import subprocess
++
++ # Verify writing to stderr:
++ p = subprocess.Popen([sys.executable,
++ '-c', 'import sys;
sys._debugmallocstats()'],
++ stderr=subprocess.PIPE)
++ out, err = p.communicate()
++ p.wait()
++ self.assertIn(b"arenas allocated current", err)
+
+ class SizeofTest(unittest.TestCase):
+
+diff -up Python-3.2.2/Objects/classobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/classobject.c
+--- Python-3.2.2/Objects/classobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/classobject.c 2011-09-16 18:57:24.975825060 -0400
+@@ -399,6 +399,15 @@ PyMethod_Fini(void)
+ (void)PyMethod_ClearFreeList();
+ }
+
++/* Print summary info about the state of the optimized allocator */
++void
++_PyMethod_DebugMallocStats(FILE *out)
++{
++ _PyDebugAllocatorStats(out,
++ "free PyMethodObject",
++ numfree, sizeof(PyMethodObject));
++}
++
+ /* ------------------------------------------------------------------------
+ * instance method
+ */
+diff -up Python-3.2.2/Objects/dictobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/dictobject.c
+--- Python-3.2.2/Objects/dictobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/dictobject.c 2011-09-16 18:57:24.976825060 -0400
+@@ -217,6 +217,15 @@ show_track(void)
+ static PyDictObject *free_list[PyDict_MAXFREELIST];
+ static int numfree = 0;
+
++/* Print summary info about the state of the optimized allocator */
++void
++_PyDict_DebugMallocStats(FILE *out)
++{
++ _PyDebugAllocatorStats(out,
++ "free PyDictObject", numfree,
sizeof(PyDictObject));
++}
++
++
+ void
+ PyDict_Fini(void)
+ {
+diff -up Python-3.2.2/Objects/floatobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/floatobject.c
+--- Python-3.2.2/Objects/floatobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/floatobject.c 2011-09-16 18:57:24.981825060 -0400
+@@ -50,6 +50,22 @@ typedef struct _floatblock PyFloatBlock;
+ static PyFloatBlock *block_list = NULL;
+ static PyFloatObject *free_list = NULL;
+
++/* Print summary info about the state of the optimized allocator */
++void
++_PyFloat_DebugMallocStats(FILE *out)
++{
++ int num_blocks = 0;
++ PyFloatBlock *block;
++
++ /* Walk the block list, counting */
++ for (block = block_list; block ; block = block->next) {
++ num_blocks++;
++ }
++
++ _PyDebugAllocatorStats(out,
++ "PyFloatBlock", num_blocks, sizeof(PyFloatBlock));
++}
++
+ static PyFloatObject *
+ fill_free_list(void)
+ {
+diff -up Python-3.2.2/Objects/frameobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/frameobject.c
+--- Python-3.2.2/Objects/frameobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/frameobject.c 2011-09-16 18:57:24.982825060 -0400
+@@ -953,3 +953,13 @@ PyFrame_Fini(void)
+ Py_XDECREF(builtin_object);
+ builtin_object = NULL;
+ }
++
++/* Print summary info about the state of the optimized allocator */
++void
++_PyFrame_DebugMallocStats(FILE *out)
++{
++ _PyDebugAllocatorStats(out,
++ "free PyFrameObject",
++ numfree, sizeof(PyFrameObject));
++}
++
+diff -up Python-3.2.2/Objects/listobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/listobject.c
+--- Python-3.2.2/Objects/listobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/listobject.c 2011-09-16 18:57:24.983825060 -0400
+@@ -109,6 +109,15 @@ PyList_Fini(void)
+ }
+ }
+
++/* Print summary info about the state of the optimized allocator */
++void
++_PyList_DebugMallocStats(FILE *out)
++{
++ _PyDebugAllocatorStats(out,
++ "free PyListObject",
++ numfree, sizeof(PyListObject));
++}
++
+ PyObject *
+ PyList_New(Py_ssize_t size)
+ {
+diff -up Python-3.2.2/Objects/methodobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/methodobject.c
+--- Python-3.2.2/Objects/methodobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/methodobject.c 2011-09-16 18:57:24.983825060 -0400
+@@ -303,6 +303,15 @@ PyCFunction_Fini(void)
+ (void)PyCFunction_ClearFreeList();
+ }
+
++/* Print summary info about the state of the optimized allocator */
++void
++_PyCFunction_DebugMallocStats(FILE *out)
++{
++ _PyDebugAllocatorStats(out,
++ "free PyCFunction",
++ numfree, sizeof(PyCFunction));
++}
++
+ /* PyCFunction_New() is now just a macro that calls PyCFunction_NewEx(),
+ but it's part of the API so we need to keep a function around that
+ existing C extensions can call.
+diff -up Python-3.2.2/Objects/object.c.add-debug-malloc-stats
Python-3.2.2/Objects/object.c
+--- Python-3.2.2/Objects/object.c.add-debug-malloc-stats 2011-09-03 12:16:47.000000000
-0400
++++ Python-3.2.2/Objects/object.c 2011-09-16 19:04:20.351821098 -0400
+@@ -1781,6 +1781,19 @@ PyMem_Free(void *p)
+ PyMem_FREE(p);
+ }
+
++void
++_PyObject_DebugTypeStats(FILE *out)
++{
++ _PyCFunction_DebugMallocStats(out);
++ _PyDict_DebugMallocStats(out);
++ _PyFloat_DebugMallocStats(out);
++ _PyFrame_DebugMallocStats(out);
++ _PyList_DebugMallocStats(out);
++ _PyMethod_DebugMallocStats(out);
++ _PySet_DebugMallocStats(out);
++ _PyTuple_DebugMallocStats(out);
++ _PyUnicode_DebugMallocStats(out);
++}
+
+ /* These methods are used to control infinite recursion in repr, str, print,
+ etc. Container objects that may recursively contain themselves,
+diff -up Python-3.2.2/Objects/obmalloc.c.add-debug-malloc-stats
Python-3.2.2/Objects/obmalloc.c
+--- Python-3.2.2/Objects/obmalloc.c.add-debug-malloc-stats 2011-09-03 12:16:47.000000000
-0400
++++ Python-3.2.2/Objects/obmalloc.c 2011-09-16 18:57:24.985825060 -0400
+@@ -508,12 +508,10 @@ static struct arena_object* usable_arena
+ /* Number of arenas allocated that haven't been free()'d. */
+ static size_t narenas_currently_allocated = 0;
+
+-#ifdef PYMALLOC_DEBUG
+ /* Total number of times malloc() called to allocate an arena. */
+ static size_t ntimes_arena_allocated = 0;
+ /* High water mark (max value ever seen) for narenas_currently_allocated. */
+ static size_t narenas_highwater = 0;
+-#endif
+
+ /* Allocate a new arena. If we run out of memory, return NULL. Else
+ * allocate a new arena, and return the address of an arena_object
+@@ -528,7 +526,7 @@ new_arena(void)
+
+ #ifdef PYMALLOC_DEBUG
+ if (Py_GETENV("PYTHONMALLOCSTATS"))
+- _PyObject_DebugMallocStats();
++ _PyObject_DebugMallocStats(stderr);
+ #endif
+ if (unused_arena_objects == NULL) {
+ uint i;
+@@ -588,11 +586,9 @@ new_arena(void)
+ }
+
+ ++narenas_currently_allocated;
+-#ifdef PYMALLOC_DEBUG
+ ++ntimes_arena_allocated;
+ if (narenas_currently_allocated > narenas_highwater)
+ narenas_highwater = narenas_currently_allocated;
+-#endif
+ arenaobj->freepools = NULL;
+ /* pool_address <- first pool-aligned address in the arena
+ nfreepools <- number of whole pools that fit after alignment */
+@@ -1694,17 +1690,19 @@ _PyObject_DebugDumpAddress(const void *p
+ }
+ }
+
++#endif /* PYMALLOC_DEBUG */
++
+ static size_t
+-printone(const char* msg, size_t value)
++printone(FILE *out, const char* msg, size_t value)
+ {
+ int i, k;
+ char buf[100];
+ size_t origvalue = value;
+
+- fputs(msg, stderr);
++ fputs(msg, out);
+ for (i = (int)strlen(msg); i < 35; ++i)
+- fputc(' ', stderr);
+- fputc('=', stderr);
++ fputc(' ', out);
++ fputc('=', out);
+
+ /* Write the value with commas. */
+ i = 22;
+@@ -1725,17 +1723,32 @@ printone(const char* msg, size_t value)
+
+ while (i >= 0)
+ buf[i--] = ' ';
+- fputs(buf, stderr);
++ fputs(buf, out);
+
+ return origvalue;
+ }
+
+-/* Print summary info to stderr about the state of pymalloc's structures.
++void
++_PyDebugAllocatorStats(FILE *out,
++ const char *block_name, int num_blocks, size_t sizeof_block)
++{
++ char buf1[128];
++ char buf2[128];
++ PyOS_snprintf(buf1, sizeof(buf1),
++ "%d %ss * %zd bytes each",
++ num_blocks, block_name, sizeof_block);
++ PyOS_snprintf(buf2, sizeof(buf2),
++ "%48s ", buf1);
++ (void)printone(out, buf2, num_blocks * sizeof_block);
++}
++
++
++/* Print summary info to "out" about the state of pymalloc's structures.
+ * In Py_DEBUG mode, also perform some expensive internal consistency
+ * checks.
+ */
+ void
+-_PyObject_DebugMallocStats(void)
++_PyObject_DebugMallocStats(FILE *out)
+ {
+ uint i;
+ const uint numclasses = SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT;
+@@ -1764,7 +1777,7 @@ _PyObject_DebugMallocStats(void)
+ size_t total;
+ char buf[128];
+
+- fprintf(stderr, "Small block threshold = %d, in %u size classes.\n",
++ fprintf(out, "Small block threshold = %d, in %u size classes.\n",
+ SMALL_REQUEST_THRESHOLD, numclasses);
+
+ for (i = 0; i < numclasses; ++i)
+@@ -1820,10 +1833,10 @@ _PyObject_DebugMallocStats(void)
+ }
+ assert(narenas == narenas_currently_allocated);
+
+- fputc('\n', stderr);
++ fputc('\n', out);
+ fputs("class size num pools blocks in use avail blocks\n"
+ "----- ---- --------- ------------- ------------\n",
+- stderr);
++ out);
+
+ for (i = 0; i < numclasses; ++i) {
+ size_t p = numpools[i];
+@@ -1834,7 +1847,7 @@ _PyObject_DebugMallocStats(void)
+ assert(b == 0 && f == 0);
+ continue;
+ }
+- fprintf(stderr, "%5u %6u "
++ fprintf(out, "%5u %6u "
+ "%11" PY_FORMAT_SIZE_T "u "
+ "%15" PY_FORMAT_SIZE_T "u "
+ "%13" PY_FORMAT_SIZE_T "u\n",
+@@ -1844,36 +1857,35 @@ _PyObject_DebugMallocStats(void)
+ pool_header_bytes += p * POOL_OVERHEAD;
+ quantization += p * ((POOL_SIZE - POOL_OVERHEAD) % size);
+ }
+- fputc('\n', stderr);
+- (void)printone("# times object malloc called", serialno);
+-
+- (void)printone("# arenas allocated total", ntimes_arena_allocated);
+- (void)printone("# arenas reclaimed", ntimes_arena_allocated - narenas);
+- (void)printone("# arenas highwater mark", narenas_highwater);
+- (void)printone("# arenas allocated current", narenas);
++ fputc('\n', out);
++#ifdef PYMALLOC_DEBUG
++ (void)printone(out, "# times object malloc called", serialno);
++#endif
++ (void)printone(out, "# arenas allocated total", ntimes_arena_allocated);
++ (void)printone(out, "# arenas reclaimed", ntimes_arena_allocated -
narenas);
++ (void)printone(out, "# arenas highwater mark", narenas_highwater);
++ (void)printone(out, "# arenas allocated current", narenas);
+
+ PyOS_snprintf(buf, sizeof(buf),
+ "%" PY_FORMAT_SIZE_T "u arenas * %d bytes/arena",
+ narenas, ARENA_SIZE);
+- (void)printone(buf, narenas * ARENA_SIZE);
++ (void)printone(out, buf, narenas * ARENA_SIZE);
+
+- fputc('\n', stderr);
++ fputc('\n', out);
+
+- total = printone("# bytes in allocated blocks", allocated_bytes);
+- total += printone("# bytes in available blocks", available_bytes);
++ total = printone(out, "# bytes in allocated blocks", allocated_bytes);
++ total += printone(out, "# bytes in available blocks", available_bytes);
+
+ PyOS_snprintf(buf, sizeof(buf),
+ "%u unused pools * %d bytes", numfreepools, POOL_SIZE);
+- total += printone(buf, (size_t)numfreepools * POOL_SIZE);
++ total += printone(out, buf, (size_t)numfreepools * POOL_SIZE);
+
+- total += printone("# bytes lost to pool headers", pool_header_bytes);
+- total += printone("# bytes lost to quantization", quantization);
+- total += printone("# bytes lost to arena alignment", arena_alignment);
+- (void)printone("Total", total);
++ total += printone(out, "# bytes lost to pool headers",
pool_header_bytes);
++ total += printone(out, "# bytes lost to quantization", quantization);
++ total += printone(out, "# bytes lost to arena alignment",
arena_alignment);
++ (void)printone(out, "Total", total);
+ }
+
+-#endif /* PYMALLOC_DEBUG */
+-
+ #ifdef Py_USING_MEMORY_DEBUGGER
+ /* Make this function last so gcc won't inline it since the definition is
+ * after the reference.
+diff -up Python-3.2.2/Objects/setobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/setobject.c
+--- Python-3.2.2/Objects/setobject.c.add-debug-malloc-stats 2011-09-03 12:16:47.000000000
-0400
++++ Python-3.2.2/Objects/setobject.c 2011-09-16 18:57:24.986825060 -0400
+@@ -1090,6 +1090,16 @@ PySet_Fini(void)
+ Py_CLEAR(emptyfrozenset);
+ }
+
++/* Print summary info about the state of the optimized allocator */
++void
++_PySet_DebugMallocStats(FILE *out)
++{
++ _PyDebugAllocatorStats(out,
++ "free PySetObject",
++ numfree, sizeof(PySetObject));
++}
++
++
+ static PyObject *
+ set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+ {
+diff -up Python-3.2.2/Objects/tupleobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/tupleobject.c
+--- Python-3.2.2/Objects/tupleobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/tupleobject.c 2011-09-16 18:57:24.987825060 -0400
+@@ -44,6 +44,22 @@ show_track(void)
+ }
+ #endif
+
++/* Print summary info about the state of the optimized allocator */
++void
++_PyTuple_DebugMallocStats(FILE *out)
++{
++#if PyTuple_MAXSAVESIZE > 0
++ int i;
++ char buf[128];
++ for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
++ PyOS_snprintf(buf, sizeof(buf),
++ "free %d-sized PyTupleObject", i);
++ _PyDebugAllocatorStats(out,
++ buf,
++ numfree[i], _PyObject_VAR_SIZE(&PyTuple_Type, i));
++ }
++#endif
++}
+
+ PyObject *
+ PyTuple_New(register Py_ssize_t size)
+diff -up Python-3.2.2/Objects/unicodeobject.c.add-debug-malloc-stats
Python-3.2.2/Objects/unicodeobject.c
+--- Python-3.2.2/Objects/unicodeobject.c.add-debug-malloc-stats 2011-09-03
12:16:47.000000000 -0400
++++ Python-3.2.2/Objects/unicodeobject.c 2011-09-16 18:57:24.990825060 -0400
+@@ -10063,6 +10063,12 @@ _PyUnicode_Fini(void)
+ (void)PyUnicode_ClearFreeList();
+ }
+
++void _PyUnicode_DebugMallocStats(FILE *out)
++{
++ _PyDebugAllocatorStats(out, "free PyUnicodeObject", numfree,
++ sizeof(PyUnicodeObject));
++}
++
+ void
+ PyUnicode_InternInPlace(PyObject **p)
+ {
+diff -up Python-3.2.2/Python/pythonrun.c.add-debug-malloc-stats
Python-3.2.2/Python/pythonrun.c
+--- Python-3.2.2/Python/pythonrun.c.add-debug-malloc-stats 2011-09-16 19:24:44.747809422
-0400
++++ Python-3.2.2/Python/pythonrun.c 2011-09-16 19:25:00.024809277 -0400
+@@ -547,7 +547,7 @@ Py_Finalize(void)
+ #endif /* Py_TRACE_REFS */
+ #ifdef PYMALLOC_DEBUG
+ if (Py_GETENV("PYTHONMALLOCSTATS"))
+- _PyObject_DebugMallocStats();
++ _PyObject_DebugMallocStats(stderr);
+ #endif
+
+ call_ll_exitfuncs();
+diff -up Python-3.2.2/Python/sysmodule.c.add-debug-malloc-stats
Python-3.2.2/Python/sysmodule.c
+--- Python-3.2.2/Python/sysmodule.c.add-debug-malloc-stats 2011-09-03 12:16:49.000000000
-0400
++++ Python-3.2.2/Python/sysmodule.c 2011-09-16 19:18:45.806812845 -0400
+@@ -994,6 +994,25 @@ a 11-tuple where the entries in the tupl
+ extern "C" {
+ #endif
+
++static PyObject *
++sys_debugmallocstats(PyObject *self, PyObject *args)
++{
++ _PyObject_DebugMallocStats(stderr);
++ fputc('\n', stderr);
++ _PyObject_DebugTypeStats(stderr);
++
++ Py_RETURN_NONE;
++}
++PyDoc_STRVAR(debugmallocstats_doc,
++"_debugmallocstats([file])\n\
++\n\
++Print summary info to stderr about the state of\n\
++pymalloc's structures.\n\
++\n\
++In Py_DEBUG mode, also perform some expensive internal consistency\n\
++checks.\n\
++");
++
+ #ifdef Py_TRACE_REFS
+ /* Defined in objects.c because it uses static globals if that file */
+ extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
+@@ -1090,6 +1109,8 @@ static PyMethodDef sys_methods[] = {
+ {"settrace", sys_settrace, METH_O, settrace_doc},
+ {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc},
+ {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
++ {"_debugmallocstats", sys_debugmallocstats, METH_VARARGS,
++ debugmallocstats_doc},
+ {NULL, NULL} /* sentinel */
+ };
+
diff --git a/python3.spec b/python3.spec
index f102431..cb64c64 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -353,6 +353,11 @@ Patch143: 00143-tsc-on-ppc.patch
# (rhbz#563986)
Patch146: 00146-hashlib-fips.patch
+# Add a sys._debugmallocstats() function
+# Based on patch 202 from RHEL 5's python.spec, with updates from rhbz#737198
+# Not yet sent upstream
+Patch147: 00147-add-debug-malloc-stats.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -562,6 +567,7 @@ done
# 00144: not for python3
# 00145: not for python3
%patch146 -p1
+%patch147 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1373,6 +1379,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Sep 16 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-6
+- add a sys._debugmallocstats() function (patch 147)
+
* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
commit b8f92b4cd5f02708ff77df833ffc7db506be4b9e
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Sep 14 02:17:28 2011 -0400
support OpenSSL FIPS mode in _hashlib and hashlib
* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
diff --git a/00146-hashlib-fips.patch b/00146-hashlib-fips.patch
new file mode 100644
index 0000000..da83205
--- /dev/null
+++ b/00146-hashlib-fips.patch
@@ -0,0 +1,613 @@
+diff -up Python-3.2.2/Lib/hashlib.py.hashlib-fips Python-3.2.2/Lib/hashlib.py
+--- Python-3.2.2/Lib/hashlib.py.hashlib-fips 2011-09-03 12:16:41.000000000 -0400
++++ Python-3.2.2/Lib/hashlib.py 2011-09-14 01:55:48.090252006 -0400
+@@ -23,6 +23,16 @@ the zlib module.
+ Choose your hash function wisely. Some have known collision weaknesses.
+ sha384 and sha512 will be slow on 32 bit platforms.
+
++If the underlying implementation supports "FIPS mode", and this is enabled,
it
++may restrict the available hashes to only those that are compliant with FIPS
++regulations. For example, it may deny the use of MD5, on the grounds that this
++is not secure for uses such as authentication, system integrity checking, or
++digital signatures. If you need to use such a hash for non-security purposes
++(such as indexing into a data structure for speed), you can override the keyword
++argument "usedforsecurity" from True to False to signify that your code is
not
++relying on the hash for security purposes, and this will allow the hash to be
++usable even in FIPS mode.
++
+ Hash objects have these methods:
+ - update(arg): Update the hash object with the bytes in arg. Repeated calls
+ are equivalent to a single call with the concatenation of all
+@@ -96,33 +106,36 @@ def __get_openssl_constructor(name):
+ f = getattr(_hashlib, 'openssl_' + name)
+ # Allow the C module to raise ValueError. The function will be
+ # defined but the hash not actually available thanks to OpenSSL.
+- f()
++ # We pass "usedforsecurity=False" to disable FIPS-based restrictions:
++ # at this stage we're merely seeing if the function is callable,
++ # rather than using it for actual work.
++ f(usedforsecurity=False)
+ # Use the C function directly (very fast)
+ return f
+ except (AttributeError, ValueError):
+- return __get_builtin_constructor(name)
++ raise
+
++def __py_new(name, data=b'', usedforsecurity=True):
++ """new(name, data=b'', usedforsecurity=True) - Return a new
hashing object using
++ the named algorithm; optionally initialized with data (which must be bytes).
+
+-def __py_new(name, data=b''):
+- """new(name, data=b'') - Return a new hashing object using
the named algorithm;
+- optionally initialized with data (which must be bytes).
++ The 'usedforsecurity' keyword argument does nothing, and is for
compatibilty
++ with the OpenSSL implementation
+ """
+ return __get_builtin_constructor(name)(data)
+
+
+-def __hash_new(name, data=b''):
+- """new(name, data=b'') - Return a new hashing object using
the named algorithm;
+- optionally initialized with data (which must be bytes).
++def __hash_new(name, data=b'', usedforsecurity=True):
++ """new(name, data=b'', usedforsecurity=True) - Return a new
hashing object using
++ the named algorithm; optionally initialized with data (which must be bytes).
++
++ Override 'usedforsecurity' to False when using for non-security purposes in
++ a FIPS environment
+ """
+ try:
+- return _hashlib.new(name, data)
++ return _hashlib.new(name, data, usedforsecurity)
+ except ValueError:
+- # If the _hashlib module (OpenSSL) doesn't support the named
+- # hash, try using our builtin implementations.
+- # This allows for SHA224/256 and SHA384/512 support even though
+- # the OpenSSL library prior to 0.9.8 doesn't provide them.
+- return __get_builtin_constructor(name)(data)
+-
++ raise
+
+ try:
+ import _hashlib
+diff -up Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips
Python-3.2.2/Lib/test/test_hashlib.py
+--- Python-3.2.2/Lib/test/test_hashlib.py.hashlib-fips 2011-09-03 12:16:43.000000000
-0400
++++ Python-3.2.2/Lib/test/test_hashlib.py 2011-09-14 01:45:48.462251974 -0400
+@@ -22,6 +22,19 @@ from test.support import _4G, precisionb
+ # Were we compiled --with-pydebug or with #define Py_DEBUG?
+ COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
+
++def openssl_enforces_fips():
++ # Use the "openssl" command (if present) to try to determine if the local
++ # OpenSSL is configured to enforce FIPS
++ from subprocess import Popen, PIPE
++ try:
++ p = Popen(['openssl', 'md5'],
++ stdin=PIPE, stdout=PIPE, stderr=PIPE)
++ except OSError:
++ # "openssl" command not found
++ return False
++ stdout, stderr = p.communicate(input=b'abc')
++ return b'unknown cipher' in stderr
++OPENSSL_ENFORCES_FIPS = openssl_enforces_fips()
+
+ def hexstr(s):
+ assert isinstance(s, bytes), repr(s)
+@@ -31,6 +44,16 @@ def hexstr(s):
+ r += h[(i >> 4) & 0xF] + h[i & 0xF]
+ return r
+
++# hashlib and _hashlib-based functions support a "usedforsecurity" keyword
++# argument, and FIPS mode requires that it be used overridden with a False
++# value for these selftests to work. Other cryptographic code within Python
++# doesn't support this keyword.
++# Modify a function to one in which "usedforsecurity=False" is added to the
++# keyword arguments:
++def suppress_fips(f):
++ def g(*args, **kwargs):
++ return f(*args, usedforsecurity=False, **kwargs)
++ return g
+
+ class HashLibTestCase(unittest.TestCase):
+ supported_hash_names = ( 'md5', 'MD5', 'sha1',
'SHA1',
+@@ -59,11 +82,11 @@ class HashLibTestCase(unittest.TestCase)
+ # For each algorithm, test the direct constructor and the use
+ # of hashlib.new given the algorithm name.
+ for algorithm, constructors in self.constructors_to_test.items():
+- constructors.add(getattr(hashlib, algorithm))
++ constructors.add(suppress_fips(getattr(hashlib, algorithm)))
+ def _test_algorithm_via_hashlib_new(data=None, _alg=algorithm):
+ if data is None:
+- return hashlib.new(_alg)
+- return hashlib.new(_alg, data)
++ return suppress_fips(hashlib.new)(_alg)
++ return suppress_fips(hashlib.new)(_alg, data)
+ constructors.add(_test_algorithm_via_hashlib_new)
+
+ _hashlib = self._conditional_import_module('_hashlib')
+@@ -75,22 +98,7 @@ class HashLibTestCase(unittest.TestCase)
+ for algorithm, constructors in self.constructors_to_test.items():
+ constructor = getattr(_hashlib, 'openssl_'+algorithm, None)
+ if constructor:
+- constructors.add(constructor)
+-
+- _md5 = self._conditional_import_module('_md5')
+- if _md5:
+- self.constructors_to_test['md5'].add(_md5.md5)
+- _sha1 = self._conditional_import_module('_sha1')
+- if _sha1:
+- self.constructors_to_test['sha1'].add(_sha1.sha1)
+- _sha256 = self._conditional_import_module('_sha256')
+- if _sha256:
+- self.constructors_to_test['sha224'].add(_sha256.sha224)
+- self.constructors_to_test['sha256'].add(_sha256.sha256)
+- _sha512 = self._conditional_import_module('_sha512')
+- if _sha512:
+- self.constructors_to_test['sha384'].add(_sha512.sha384)
+- self.constructors_to_test['sha512'].add(_sha512.sha512)
++ constructors.add(suppress_fips(constructor))
+
+ super(HashLibTestCase, self).__init__(*args, **kwargs)
+
+@@ -138,7 +146,7 @@ class HashLibTestCase(unittest.TestCase)
+
+ def test_hexdigest(self):
+ for name in self.supported_hash_names:
+- h = hashlib.new(name)
++ h = hashlib.new(name, usedforsecurity=False)
+ assert isinstance(h.digest(), bytes), name
+ self.assertEqual(hexstr(h.digest()), h.hexdigest())
+
+@@ -149,12 +157,12 @@ class HashLibTestCase(unittest.TestCase)
+ cees = b'c' * 126
+
+ for name in self.supported_hash_names:
+- m1 = hashlib.new(name)
++ m1 = hashlib.new(name, usedforsecurity=False)
+ m1.update(aas)
+ m1.update(bees)
+ m1.update(cees)
+
+- m2 = hashlib.new(name)
++ m2 = hashlib.new(name, usedforsecurity=False)
+ m2.update(aas + bees + cees)
+ self.assertEqual(m1.digest(), m2.digest())
+
+@@ -324,13 +332,13 @@ class HashLibTestCase(unittest.TestCase)
+ # for multithreaded operation (which is hardwired to 2048).
+ gil_minsize = 2048
+
+- m = hashlib.md5()
++ m = hashlib.md5(usedforsecurity=False)
+ m.update(b'1')
+ m.update(b'#' * gil_minsize)
+ m.update(b'1')
+ self.assertEqual(m.hexdigest(), 'cb1e1a2cbc80be75e19935d621fb9b21')
+
+- m = hashlib.md5(b'x' * gil_minsize)
++ m = hashlib.md5(b'x' * gil_minsize, usedforsecurity=False)
+ self.assertEqual(m.hexdigest(), 'cfb767f225d58469c5de3632a8803958')
+
+ @unittest.skipUnless(threading, 'Threading required for this test.')
+@@ -370,6 +378,67 @@ class HashLibTestCase(unittest.TestCase)
+
+ self.assertEqual(expected_hash, hasher.hexdigest())
+
++ def test_issue9146(self):
++ # Ensure that various ways to use "MD5" from "hashlib"
don't segfault:
++ m = hashlib.md5(usedforsecurity=False)
++ m.update(b'abc\n')
++ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
++
++ m = hashlib.new('md5', usedforsecurity=False)
++ m.update(b'abc\n')
++ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
++
++ m = hashlib.md5(b'abc\n', usedforsecurity=False)
++ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
++
++ m = hashlib.new('md5', b'abc\n', usedforsecurity=False)
++ self.assertEquals(m.hexdigest(), "0bee89b07a248e27c83fc3d5951213c1")
++
++ @unittest.skipUnless(OPENSSL_ENFORCES_FIPS,
++ 'FIPS enforcement required for this test.')
++ def test_hashlib_fips_mode(self):
++ # Ensure that we raise a ValueError on vanilla attempts to use MD5
++ # in hashlib in a FIPS-enforced setting:
++ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
++ m = hashlib.md5()
++
++ if not self._conditional_import_module('_md5'):
++ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
++ m = hashlib.new('md5')
++
++ @unittest.skipUnless(OPENSSL_ENFORCES_FIPS,
++ 'FIPS enforcement required for this test.')
++ def test_hashopenssl_fips_mode(self):
++ # Verify the _hashlib module's handling of md5:
++ _hashlib = self._conditional_import_module('_hashlib')
++ if _hashlib:
++ assert hasattr(_hashlib, 'openssl_md5')
++
++ # Ensure that _hashlib raises a ValueError on vanilla attempts to
++ # use MD5 in a FIPS-enforced setting:
++ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
++ m = _hashlib.openssl_md5()
++ with self.assertRaisesRegexp(ValueError, '.*unknown cipher'):
++ m = _hashlib.new('md5')
++
++ # Ensure that in such a setting we can whitelist a callsite with
++ # usedforsecurity=False and have it succeed:
++ m = _hashlib.openssl_md5(usedforsecurity=False)
++ m.update(b'abc\n')
++ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
++
++ m = _hashlib.new('md5', usedforsecurity=False)
++ m.update(b'abc\n')
++ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
++
++ m = _hashlib.openssl_md5(b'abc\n', usedforsecurity=False)
++ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
++
++ m = _hashlib.new('md5', b'abc\n', usedforsecurity=False)
++ self.assertEquals(m.hexdigest(),
"0bee89b07a248e27c83fc3d5951213c1")
++
++
++
+ def test_main():
+ support.run_unittest(HashLibTestCase)
+
+diff -up Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips
Python-3.2.2/Modules/_hashopenssl.c
+--- Python-3.2.2/Modules/_hashopenssl.c.hashlib-fips 2011-09-03 12:16:46.000000000 -0400
++++ Python-3.2.2/Modules/_hashopenssl.c 2011-09-14 00:52:41.225252001 -0400
+@@ -37,6 +37,8 @@
+ #endif
+
+ /* EVP is the preferred interface to hashing in OpenSSL */
++#include <openssl/ssl.h>
++#include <openssl/err.h>
+ #include <openssl/evp.h>
+ /* We use the object interface to discover what hashes OpenSSL supports. */
+ #include <openssl/objects.h>
+@@ -68,11 +70,19 @@ typedef struct {
+
+ static PyTypeObject EVPtype;
+
++/* Struct to hold all the cached information we need on a specific algorithm.
++ We have one of these per algorithm */
++typedef struct {
++ PyObject *name_obj;
++ EVP_MD_CTX ctxs[2];
++ /* ctx_ptrs will point to ctxs unless an error occurred, when it will
++ be NULL: */
++ EVP_MD_CTX *ctx_ptrs[2];
++ PyObject *error_msgs[2];
++} EVPCachedInfo;
+
+-#define DEFINE_CONSTS_FOR_NEW(Name) \
+- static PyObject *CONST_ ## Name ## _name_obj; \
+- static EVP_MD_CTX CONST_new_ ## Name ## _ctx; \
+- static EVP_MD_CTX *CONST_new_ ## Name ## _ctx_p = NULL;
++#define DEFINE_CONSTS_FOR_NEW(Name) \
++ static EVPCachedInfo cached_info_ ##Name;
+
+ DEFINE_CONSTS_FOR_NEW(md5)
+ DEFINE_CONSTS_FOR_NEW(sha1)
+@@ -117,6 +127,48 @@ EVP_hash(EVPobject *self, const void *vp
+ }
+ }
+
++static void
++mc_ctx_init(EVP_MD_CTX *ctx, int usedforsecurity)
++{
++ EVP_MD_CTX_init(ctx);
++
++ /*
++ If the user has declared that this digest is being used in a
++ non-security role (e.g. indexing into a data structure), set
++ the exception flag for openssl to allow it
++ */
++ if (!usedforsecurity) {
++#ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW
++ EVP_MD_CTX_set_flags(ctx,
++ EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
++#endif
++ }
++}
++
++/* Get an error msg for the last error as a PyObject */
++static PyObject *
++error_msg_for_last_error(void)
++{
++ char *errstr;
++
++ errstr = ERR_error_string(ERR_peek_last_error(), NULL);
++ ERR_clear_error();
++
++ return PyUnicode_FromString(errstr); /* Can be NULL */
++}
++
++static void
++set_evp_exception(void)
++{
++ char *errstr;
++
++ errstr = ERR_error_string(ERR_peek_last_error(), NULL);
++ ERR_clear_error();
++
++ PyErr_SetString(PyExc_ValueError, errstr);
++}
++
++
+ /* Internal methods for a hash object */
+
+ static void
+@@ -303,15 +355,16 @@ EVP_repr(EVPobject *self)
+ static int
+ EVP_tp_init(EVPobject *self, PyObject *args, PyObject *kwds)
+ {
+- static char *kwlist[] = {"name", "string", NULL};
++ static char *kwlist[] = {"name", "string",
"usedforsecurity", NULL};
+ PyObject *name_obj = NULL;
+ PyObject *data_obj = NULL;
++ int usedforsecurity = 1;
+ Py_buffer view;
+ char *nameStr;
+ const EVP_MD *digest;
+
+- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:HASH", kwlist,
+- &name_obj, &data_obj)) {
++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:HASH", kwlist,
++ &name_obj, &data_obj,
&usedforsecurity)) {
+ return -1;
+ }
+
+@@ -332,7 +385,12 @@ EVP_tp_init(EVPobject *self, PyObject *a
+ PyBuffer_Release(&view);
+ return -1;
+ }
+- EVP_DigestInit(&self->ctx, digest);
++ mc_ctx_init(&self->ctx, usedforsecurity);
++ if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
++ set_evp_exception();
++ PyBuffer_Release(&view);
++ return -1;
++ }
+
+ self->name = name_obj;
+ Py_INCREF(self->name);
+@@ -416,7 +474,8 @@ static PyTypeObject EVPtype = {
+ static PyObject *
+ EVPnew(PyObject *name_obj,
+ const EVP_MD *digest, const EVP_MD_CTX *initial_ctx,
+- const unsigned char *cp, Py_ssize_t len)
++ const unsigned char *cp, Py_ssize_t len,
++ int usedforsecurity)
+ {
+ EVPobject *self;
+
+@@ -431,7 +490,12 @@ EVPnew(PyObject *name_obj,
+ if (initial_ctx) {
+ EVP_MD_CTX_copy(&self->ctx, initial_ctx);
+ } else {
+- EVP_DigestInit(&self->ctx, digest);
++ mc_ctx_init(&self->ctx, usedforsecurity);
++ if (!EVP_DigestInit_ex(&self->ctx, digest, NULL)) {
++ set_evp_exception();
++ Py_DECREF(self);
++ return NULL;
++ }
+ }
+
+ if (cp && len) {
+@@ -455,21 +519,29 @@ PyDoc_STRVAR(EVP_new__doc__,
+ An optional string argument may be provided and will be\n\
+ automatically hashed.\n\
+ \n\
+-The MD5 and SHA1 algorithms are always supported.\n");
++The MD5 and SHA1 algorithms are always supported.\n\
++\n\
++An optional \"usedforsecurity=True\" keyword argument is provided for use
in\n\
++environments that enforce FIPS-based restrictions. Some implementations of\n\
++OpenSSL can be configured to prevent the usage of non-secure algorithms (such\n\
++as MD5). If you have a non-security use for these algorithms (e.g. a hash\n\
++table), you can override this argument by marking the callsite as\n\
++\"usedforsecurity=False\".");
+
+ static PyObject *
+ EVP_new(PyObject *self, PyObject *args, PyObject *kwdict)
+ {
+- static char *kwlist[] = {"name", "string", NULL};
++ static char *kwlist[] = {"name", "string",
"usedforsecurity", NULL};
+ PyObject *name_obj = NULL;
+ PyObject *data_obj = NULL;
++ int usedforsecurity = 1;
+ Py_buffer view = { 0 };
+ PyObject *ret_obj;
+ char *name;
+ const EVP_MD *digest;
+
+- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|O:new", kwlist,
+- &name_obj, &data_obj)) {
++ if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|Oi:new", kwlist,
++ &name_obj, &data_obj,
&usedforsecurity)) {
+ return NULL;
+ }
+
+@@ -483,7 +555,8 @@ EVP_new(PyObject *self, PyObject *args,
+
+ digest = EVP_get_digestbyname(name);
+
+- ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, view.len);
++ ret_obj = EVPnew(name_obj, digest, NULL, (unsigned char*)view.buf, view.len,
++ usedforsecurity);
+
+ if (data_obj)
+ PyBuffer_Release(&view);
+@@ -547,55 +620,115 @@ generate_hash_name_list(void)
+
+
+ /*
+- * This macro generates constructor function definitions for specific
+- * hash algorithms. These constructors are much faster than calling
+- * the generic one passing it a python string and are noticably
+- * faster than calling a python new() wrapper. Thats important for
++ * This macro and function generates a family of constructor function
++ * definitions for specific hash algorithms. These constructors are much
++ * faster than calling the generic one passing it a python string and are
++ * noticably faster than calling a python new() wrapper. That's important for
+ * code that wants to make hashes of a bunch of small strings.
+ */
+ #define GEN_CONSTRUCTOR(NAME) \
+ static PyObject * \
+- EVP_new_ ## NAME (PyObject *self, PyObject *args) \
++ EVP_new_ ## NAME (PyObject *self, PyObject *args, PyObject *kwdict) \
+ { \
+- PyObject *data_obj = NULL; \
+- Py_buffer view = { 0 }; \
+- PyObject *ret_obj; \
+- \
+- if (!PyArg_ParseTuple(args, "|O:" #NAME , &data_obj)) { \
+- return NULL; \
+- } \
+- \
+- if (data_obj) \
+- GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); \
+- \
+- ret_obj = EVPnew( \
+- CONST_ ## NAME ## _name_obj, \
+- NULL, \
+- CONST_new_ ## NAME ## _ctx_p, \
+- (unsigned char*)view.buf, \
+- view.len); \
+- \
+- if (data_obj) \
+- PyBuffer_Release(&view); \
+- return ret_obj; \
++ return implement_specific_EVP_new(self, args, kwdict, \
++ "|Oi:" #NAME, \
++ &cached_info_ ## NAME ); \
+ }
+
++static PyObject *
++implement_specific_EVP_new(PyObject *self, PyObject *args, PyObject *kwdict,
++ const char *format,
++ EVPCachedInfo *cached_info)
++{
++ static char *kwlist[] = {"string", "usedforsecurity", NULL};
++ PyObject *data_obj = NULL;
++ Py_buffer view = { 0 };
++ int usedforsecurity = 1;
++ int idx;
++ PyObject *ret_obj = NULL;
++
++ assert(cached_info);
++
++ if (!PyArg_ParseTupleAndKeywords(args, kwdict, format, kwlist,
++ &data_obj, &usedforsecurity)) {
++ return NULL;
++ }
++
++ if (data_obj)
++ GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view);
++
++ idx = usedforsecurity ? 1 : 0;
++
++ /*
++ * If an error occurred during creation of the global content, the ctx_ptr
++ * will be NULL, and the error_msg will hopefully be non-NULL:
++ */
++ if (cached_info->ctx_ptrs[idx]) {
++ /* We successfully initialized this context; copy it: */
++ ret_obj = EVPnew(cached_info->name_obj,
++ NULL,
++ cached_info->ctx_ptrs[idx],
++ (unsigned char*)view.buf, view.len,
++ usedforsecurity);
++ } else {
++ /* Some kind of error happened initializing the global context for
++ this (digest, usedforsecurity) pair.
++ Raise an exception with the saved error message: */
++ if (cached_info->error_msgs[idx]) {
++ PyErr_SetObject(PyExc_ValueError, cached_info->error_msgs[idx]);
++ } else {
++ PyErr_SetString(PyExc_ValueError, "Error initializing hash");
++ }
++ }
++
++ if (data_obj)
++ PyBuffer_Release(&view);
++
++ return ret_obj;
++}
++
+ /* a PyMethodDef structure for the constructor */
+ #define CONSTRUCTOR_METH_DEF(NAME) \
+- {"openssl_" #NAME, (PyCFunction)EVP_new_ ## NAME, METH_VARARGS, \
++ {"openssl_" #NAME, (PyCFunction)EVP_new_ ## NAME, \
++ METH_VARARGS|METH_KEYWORDS, \
+ PyDoc_STR("Returns a " #NAME \
+ " hash object; optionally initialized with a string") \
+ }
+
+-/* used in the init function to setup a constructor */
+-#define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \
+- CONST_ ## NAME ## _name_obj = PyUnicode_FromString(#NAME); \
+- if (EVP_get_digestbyname(#NAME)) { \
+- CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \
+- EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME)); \
+- } \
+-} while (0);
++/*
++ Macro/function pair to set up the constructors.
+
++ Try to initialize a context for each hash twice, once with
++ EVP_MD_CTX_FLAG_NON_FIPS_ALLOW and once without.
++
++ Any that have errors during initialization will end up with a NULL ctx_ptrs
++ entry, and err_msgs will be set (unless we're very low on memory)
++*/
++#define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \
++ init_constructor_constant(&cached_info_ ## NAME, #NAME); \
++} while (0);
++static void
++init_constructor_constant(EVPCachedInfo *cached_info, const char *name)
++{
++ assert(cached_info);
++ cached_info->name_obj = PyUnicode_FromString(name);
++ if (EVP_get_digestbyname(name)) {
++ int i;
++ for (i=0; i<2; i++) {
++ mc_ctx_init(&cached_info->ctxs[i], i);
++ if (EVP_DigestInit_ex(&cached_info->ctxs[i],
++ EVP_get_digestbyname(name), NULL)) {
++ /* Success: */
++ cached_info->ctx_ptrs[i] = &cached_info->ctxs[i];
++ } else {
++ /* Failure: */
++ cached_info->ctx_ptrs[i] = NULL;
++ cached_info->error_msgs[i] = error_msg_for_last_error();
++ }
++ }
++ }
++}
++
+ GEN_CONSTRUCTOR(md5)
+ GEN_CONSTRUCTOR(sha1)
+ #ifdef _OPENSSL_SUPPORTS_SHA2
+@@ -641,12 +774,10 @@ PyInit__hashlib(void)
+ {
+ PyObject *m, *openssl_md_meth_names;
+
+- OpenSSL_add_all_digests();
++ SSL_load_error_strings();
++ SSL_library_init();
+
+- /* TODO build EVP_functions openssl_* entries dynamically based
+- * on what hashes are supported rather than listing many
+- * but having some be unsupported. Only init appropriate
+- * constants. */
++ OpenSSL_add_all_digests();
+
+ Py_TYPE(&EVPtype) = &PyType_Type;
+ if (PyType_Ready(&EVPtype) < 0)
diff --git a/python3.spec b/python3.spec
index 84d0847..f102431 100644
--- a/python3.spec
+++ b/python3.spec
@@ -122,7 +122,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -337,6 +337,22 @@ Patch143: 00143-tsc-on-ppc.patch
# Patch145: 00145-force-sys-platform-to-be-linux2.patch
# is upstream for Python 3 as of 3.2.2
+# Support OpenSSL FIPS mode (e.g. when OPENSSL_FORCE_FIPS_MODE=1 is set)
+# - handle failures from OpenSSL (e.g. on attempts to use MD5 in a
+# FIPS-enforcing environment)
+# - add a new "usedforsecurity" keyword argument to the various digest
+# algorithms in hashlib so that you can whitelist a callsite with
+# "usedforsecurity=False"
+# (sent upstream for python 3 as
http://bugs.python.org/issue9216 ; see RHEL6
+# python patch 119)
+# - enforce usage of the _hashlib implementation: don't fall back to the _md5
+# and _sha* modules (leading to clearer error messages if fips selftests
+# fail)
+# - don't build the _md5 and _sha* modules; rely on the _hashlib implementation
+# of hashlib
+# (rhbz#563986)
+Patch146: 00146-hashlib-fips.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -491,6 +507,15 @@ done
# Remove embedded copy of zlib:
rm -r Modules/zlib || exit 1
+# Don't build upstream Python's implementation of these crypto algorithms;
+# instead rely on _hashlib and OpenSSL.
+#
+# For example, in our builds hashlib.md5 is implemented within _hashlib via
+# OpenSSL (and thus respects FIPS mode), and does not fall back to _md5
+for f in md5module.c sha1module.c sha256module.c sha512module.c; do
+ rm Modules/$f
+done
+
#
# Apply patches:
#
@@ -536,6 +561,7 @@ rm -r Modules/zlib || exit 1
%patch143 -p1 -b .tsc-on-ppc
# 00144: not for python3
# 00145: not for python3
+%patch146 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1264,15 +1290,11 @@ rm -fr %{buildroot}
%{dynload_dir}/_heapq.%{SOABI_debug}.so
%{dynload_dir}/_json.%{SOABI_debug}.so
%{dynload_dir}/_lsprof.%{SOABI_debug}.so
-%{dynload_dir}/_md5.%{SOABI_debug}.so
%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
%{dynload_dir}/_pickle.%{SOABI_debug}.so
%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
%{dynload_dir}/_random.%{SOABI_debug}.so
-%{dynload_dir}/_sha1.%{SOABI_debug}.so
-%{dynload_dir}/_sha256.%{SOABI_debug}.so
-%{dynload_dir}/_sha512.%{SOABI_debug}.so
%{dynload_dir}/_socket.%{SOABI_debug}.so
%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
%{dynload_dir}/_ssl.%{SOABI_debug}.so
@@ -1351,6 +1373,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Sep 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-5
+- support OpenSSL FIPS mode in _hashlib and hashlib; don't build the _md5 and
+_sha* modules, relying on _hashlib in hashlib (rhbz#563986; patch 146)
+
* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
- disable gdbm module to prepare for gdbm soname bump
commit 00fd884b35916be732975aa1d3cbeeb7d7968951
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Sep 14 00:10:35 2011 -0400
fix builds that set with_debug_build to 0
diff --git a/python3.spec b/python3.spec
index ac462b6..84d0847 100644
--- a/python3.spec
+++ b/python3.spec
@@ -899,9 +899,11 @@ done
# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
# avoid the user having to know the precise version and ABI flags. (see
# e.g. rhbz#676748):
+%if 0%{?with_debug_build}
ln -s \
%{_bindir}/python%{LDVERSION_debug} \
%{buildroot}%{_bindir}/python3-debug
+%endif
#
# Systemtap hooks:
commit 0d5c338c39da29884c8c1034ba2093486e813191
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Sep 14 00:10:15 2011 -0400
add note about python.spec's patch 145
diff --git a/python3.spec b/python3.spec
index fd40fd3..ac462b6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -333,6 +333,10 @@ Patch143: 00143-tsc-on-ppc.patch
# Patch144: 00144-no-gdbm.patch
# is not needed in python3.spec
+# python.spec's
+# Patch145: 00145-force-sys-platform-to-be-linux2.patch
+# is upstream for Python 3 as of 3.2.2
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -531,6 +535,7 @@ rm -r Modules/zlib || exit 1
%patch142 -p1
%patch143 -p1 -b .tsc-on-ppc
# 00144: not for python3
+# 00145: not for python3
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
commit a5cef79f49350a8162bc9342da712f415d41001d
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Sep 14 00:09:45 2011 -0400
add a way to easily turn off the %check section
diff --git a/python3.spec b/python3.spec
index c2d3e33..fd40fd3 100644
--- a/python3.spec
+++ b/python3.spec
@@ -64,6 +64,9 @@
# Change from yes to no to turn this off
%global with_computed_gotos yes
+# Turn this to 0 to turn off the "check" phase:
+%global run_selftest_suite 1
+
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
#
@@ -952,12 +955,16 @@ CheckPython() {
}
+%if 0%{run_selftest_suite}
+
# Check each of the configurations:
%if 0%{?with_debug_build}
CheckPython debug
%endif # with_debug_build
CheckPython optimized
+%endif # run_selftest_suite
+
# ======================================================
# Cleaning up
commit 5fe31d812ade592067a2e1063ae259f9a5b29562
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Sep 13 14:59:31 2011 -0400
disable gdbm module to prepare for gdbm soname bump
* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
- disable gdbm module to prepare for gdbm soname bump
diff --git a/python3.spec b/python3.spec
index c7a839d..c2d3e33 100644
--- a/python3.spec
+++ b/python3.spec
@@ -59,6 +59,8 @@
%global with_valgrind 0
%endif
+%global with_gdbm 0
+
# Change from yes to no to turn this off
%global with_computed_gotos yes
@@ -117,7 +119,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -135,7 +137,9 @@ BuildRequires: db4-devel >= 4.7
BuildRequires: expat-devel
BuildRequires: findutils
BuildRequires: gcc-c++
+%if %{with_gdbm}
BuildRequires: gdbm-devel
+%endif
BuildRequires: glibc-devel
BuildRequires: gmp-devel
BuildRequires: libffi-devel
@@ -321,6 +325,11 @@ Patch142: 00142-skip-failing-pty-tests-in-rpmbuild.patch
# Sent upstream as
http://bugs.python.org/issue12872
Patch143: 00143-tsc-on-ppc.patch
+# (Optionally) disable the gdbm module:
+# python.spec's
+# Patch144: 00144-no-gdbm.patch
+# is not needed in python3.spec
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -518,6 +527,7 @@ rm -r Modules/zlib || exit 1
%patch141 -p1
%patch142 -p1
%patch143 -p1 -b .tsc-on-ppc
+# 00144: not for python3
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -995,7 +1005,9 @@ rm -fr %{buildroot}
%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
%{dynload_dir}/_dbm.%{SOABI_optimized}.so
%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
+%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
+%endif
%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
%{dynload_dir}/_heapq.%{SOABI_optimized}.so
%{dynload_dir}/_json.%{SOABI_optimized}.so
@@ -1231,7 +1243,9 @@ rm -fr %{buildroot}
%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
%{dynload_dir}/_dbm.%{SOABI_debug}.so
%{dynload_dir}/_elementtree.%{SOABI_debug}.so
+%if %{with_gdbm}
%{dynload_dir}/_gdbm.%{SOABI_debug}.so
+%endif
%{dynload_dir}/_hashlib.%{SOABI_debug}.so
%{dynload_dir}/_heapq.%{SOABI_debug}.so
%{dynload_dir}/_json.%{SOABI_debug}.so
@@ -1323,6 +1337,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Sep 13 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-4
+- disable gdbm module to prepare for gdbm soname bump
+
* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
- renumber and rename patches for consistency with python.spec (8 to 55, 106
to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
commit c923b51771c24d357af82c12560dfa9c7d76fff3
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Sep 12 17:39:27 2011 -0400
renumber and rename patches for consistency with python.spec
* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
- renumber and rename patches for consistency with python.spec (8 to 55, 106
to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
diff --git a/00055-systemtap.patch b/00055-systemtap.patch
new file mode 100644
index 0000000..f87fc60
--- /dev/null
+++ b/00055-systemtap.patch
@@ -0,0 +1,214 @@
+diff -up Python-3.2b2/configure.in.systemtap Python-3.2b2/configure.in
+--- Python-3.2b2/configure.in.systemtap 2010-12-13 02:59:39.000000000 -0500
++++ Python-3.2b2/configure.in 2010-12-28 17:01:58.044059433 -0500
+@@ -2470,6 +2470,38 @@ if test "$with_valgrind" != no; then
+ OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
+ fi
+
++# Check for dtrace support
++AC_MSG_CHECKING(for --with-dtrace)
++AC_ARG_WITH(dtrace,
++ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
++
++if test ! -z "$with_dtrace"
++then
++ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Sun"
++ DTRACEOBJS="Python/dtrace.o"
++ DTRADEHDRS=""
++ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Apple"
++ DTRACEOBJS=""
++ DTRADEHDRS="pydtrace.h"
++ else
++ with_dtrace="no"
++ fi
++else
++ with_dtrace="no"
++fi
++
++AC_MSG_RESULT($with_dtrace)
++AC_SUBST(DTRACEOBJS)
++AC_SUBST(DTRACEHDRS)
++
+ # -I${DLINCLDIR} is added to the compile rule for importdl.o
+ AC_SUBST(DLINCLDIR)
+ DLINCLDIR=.
+diff -up Python-3.2b2/Include/pydtrace.d.systemtap Python-3.2b2/Include/pydtrace.d
+--- Python-3.2b2/Include/pydtrace.d.systemtap 2010-12-28 16:58:41.762936379 -0500
++++ Python-3.2b2/Include/pydtrace.d 2010-12-28 16:58:41.762936379 -0500
+@@ -0,0 +1,10 @@
++provider python {
++ probe function__entry(const char *, const char *, int);
++ probe function__return(const char *, const char *, int);
++};
++
++#pragma D attributes Evolving/Evolving/Common provider python provider
++#pragma D attributes Private/Private/Common provider python module
++#pragma D attributes Private/Private/Common provider python function
++#pragma D attributes Evolving/Evolving/Common provider python name
++#pragma D attributes Evolving/Evolving/Common provider python args
+diff -up Python-3.2b2/Makefile.pre.in.systemtap Python-3.2b2/Makefile.pre.in
+--- Python-3.2b2/Makefile.pre.in.systemtap 2010-12-28 16:58:41.000000000 -0500
++++ Python-3.2b2/Makefile.pre.in 2010-12-28 17:00:58.607310089 -0500
+@@ -328,6 +328,7 @@ PYTHON_OBJS= \
+ Python/formatter_unicode.o \
+ Python/fileutils.o \
+ Python/$(DYNLOADFILE) \
++ @DTRACEOBJS@ \
+ $(LIBOBJS) \
+ $(MACHDEP_OBJS) \
+ $(THREADOBJ)
+@@ -632,6 +633,18 @@ Objects/typeobject.o: $(srcdir)/Objects/
+ $(srcdir)/Objects/typeslots.inc: $(srcdir)/Include/typeslots.h
$(srcdir)/Objects/typeslots.py
+ $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
$(srcdir)/Objects/typeslots.inc
+
++# Only needed with --with-dtrace
++buildinclude:
++ mkdir -p Include
++
++Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
++ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
++
++Python/ceval.o: Include/pydtrace.h
++
++Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
++ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
++
+ ############################################################################
+ # Header files
+
+@@ -1282,7 +1295,7 @@ Python/thread.o: @THREADHEADERS@
+ .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
+ .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
+ .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
+-.PHONY: smelly funny patchcheck
++.PHONY: smelly funny patchcheck buildinclude
+ .PHONY: gdbhooks
+
+ # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
+diff -up Python-3.2b2/pyconfig.h.in.systemtap Python-3.2b2/pyconfig.h.in
+--- Python-3.2b2/pyconfig.h.in.systemtap 2010-11-20 05:29:12.000000000 -0500
++++ Python-3.2b2/pyconfig.h.in 2010-12-28 16:58:41.765937360 -0500
+@@ -1092,6 +1092,9 @@
+ /* Define if you want documentation strings in extension modules */
+ #undef WITH_DOC_STRINGS
+
++/* Define if you want to compile in Dtrace support */
++#undef WITH_DTRACE
++
+ /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
+ linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
+ Dyld is necessary to support frameworks. */
+diff -up Python-3.2b2/Python/ceval.c.systemtap Python-3.2b2/Python/ceval.c
+--- Python-3.2b2/Python/ceval.c.systemtap 2010-12-03 15:14:31.000000000 -0500
++++ Python-3.2b2/Python/ceval.c 2010-12-28 16:58:41.768935588 -0500
+@@ -18,6 +18,10 @@
+
+ #include <ctype.h>
+
++#ifdef WITH_DTRACE
++#include "pydtrace.h"
++#endif
++
+ #ifndef WITH_TSC
+
+ #define READ_TIMESTAMP(var)
+@@ -766,6 +770,70 @@ PyEval_EvalCode(PyObject *co, PyObject *
+ }
+
+
++#ifdef WITH_DTRACE
++struct frame_marker_info
++{
++ char *filename;
++ char *name;
++ int lineno;
++
++ PyObject *utf8_filename;
++ PyObject *utf8_name;
++};
++
++static void
++get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
++{
++ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
++ if (fmi->utf8_filename) {
++ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
++ } else {
++ fmi->filename = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
++ if (fmi->utf8_name) {
++ fmi->name = PyBytes_AsString(fmi->utf8_name);
++ } else {
++ fmi->name = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
++}
++
++static void
++release_frame_marker_info(struct frame_marker_info *fmi)
++{
++ Py_XDECREF(fmi->utf8_filename);
++ Py_XDECREF(fmi->utf8_name);
++}
++
++static void
++dtrace_entry(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++
++static void
++dtrace_return(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++#else
++#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
++#define PYTHON_FUNCTION_RETURN_ENABLED() 0
++#define dtrace_entry(f)
++#define dtrace_return(f)
++#endif
++
+ /* Interpreter main loop */
+
+ PyObject *
+@@ -1183,6 +1251,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
+ }
+ }
+
++ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
++ dtrace_entry(f);
++ }
++
+ co = f->f_code;
+ names = co->co_names;
+ consts = co->co_consts;
+@@ -3048,6 +3120,9 @@ fast_yield:
+
+ /* pop frame */
+ exit_eval_frame:
++ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
++ dtrace_return(f);
++ }
+ Py_LeaveRecursiveCall();
+ tstate->frame = f->f_back;
+
diff --git a/00104-lib64-fix-for-test_install.patch
b/00104-lib64-fix-for-test_install.patch
new file mode 100644
index 0000000..7852bf6
--- /dev/null
+++ b/00104-lib64-fix-for-test_install.patch
@@ -0,0 +1,13 @@
+--- Python-2.7.2/Lib/distutils/tests/test_install.py.lib64 2011-09-08 17:51:57.851405376
-0400
++++ Python-2.7.2/Lib/distutils/tests/test_install.py 2011-09-08 18:40:46.754205096 -0400
+@@ -41,8 +41,9 @@ class InstallTestCase(support.TempdirMan
+ self.assertEqual(got, expected)
+
+ libdir = os.path.join(destination, "lib", "python")
++ platlibdir = os.path.join(destination, "lib64", "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"))
diff --git a/00106-lib64-fix-for-test_install.patch
b/00106-lib64-fix-for-test_install.patch
deleted file mode 100644
index 7852bf6..0000000
--- a/00106-lib64-fix-for-test_install.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- Python-2.7.2/Lib/distutils/tests/test_install.py.lib64 2011-09-08 17:51:57.851405376
-0400
-+++ Python-2.7.2/Lib/distutils/tests/test_install.py 2011-09-08 18:40:46.754205096 -0400
-@@ -41,8 +41,9 @@ class InstallTestCase(support.TempdirMan
- self.assertEqual(got, expected)
-
- libdir = os.path.join(destination, "lib", "python")
-+ platlibdir = os.path.join(destination, "lib64", "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"))
diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch
new file mode 100644
index 0000000..3a6ac8a
--- /dev/null
+++ b/00111-no-static-lib.patch
@@ -0,0 +1,59 @@
+diff -up Python-3.2.1/Makefile.pre.in.no-static-lib Python-3.2.1/Makefile.pre.in
+--- Python-3.2.1/Makefile.pre.in.no-static-lib 2011-07-09 02:58:52.000000000 -0400
++++ Python-3.2.1/Makefile.pre.in 2011-07-11 11:46:27.381425999 -0400
+@@ -425,7 +425,7 @@ coverage:
+
+
+ # Build the interpreter
+-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+ platform: $(BUILDPYTHON)
+@@ -439,18 +439,6 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ esac
+
+-# Build static library
+-# avoid long command lines, same as LIBRARY_OBJS
+-$(LIBRARY): $(LIBRARY_OBJS)
+- -rm -f $@
+- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
+- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
+- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
+- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODOBJS)
+- $(RANLIB) $@
+-
+ libpython$(LDVERSION).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
+@@ -540,7 +528,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
+ echo "-----------------------------------------------"; \
+ fi
+
+-Modules/_testembed: Modules/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++Modules/_testembed: Modules/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+ ############################################################################
+@@ -1058,18 +1046,6 @@ libainstall: all python-config
+ else true; \
+ fi; \
+ done
+- @if test -d $(LIBRARY); then :; else \
+- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+- if test "$(SO)" = .dll; then \
+- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
+- else \
+- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- fi; \
+- else \
+- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
+- fi; \
+- fi
+ $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
+ $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/00113-more-configuration-flags.patch b/00113-more-configuration-flags.patch
new file mode 100644
index 0000000..24df543
--- /dev/null
+++ b/00113-more-configuration-flags.patch
@@ -0,0 +1,50 @@
+diff -up Python-3.1.2/configure.in.more-configuration-flags Python-3.1.2/configure.in
+--- Python-3.1.2/configure.in.more-configuration-flags 2010-05-25 12:16:48.602875960
-0400
++++ Python-3.1.2/configure.in 2010-05-25 12:16:48.609879553 -0400
+@@ -2443,6 +2443,30 @@ else AC_MSG_RESULT(no)
+ fi],
+ [AC_MSG_RESULT(no)])
+
++AC_MSG_CHECKING(for --with-count-allocs)
++AC_ARG_WITH(count-allocs,
++[ --with(out)count-allocs enable/disable per-type instance accounting], [
++if test "$withval" != no
++then
++ AC_DEFINE(COUNT_ALLOCS, 1,
++ [Define to keep records of the number of instances of each type])
++ AC_MSG_RESULT(yes)
++else AC_MSG_RESULT(no)
++fi],
++[AC_MSG_RESULT(no)])
++
++AC_MSG_CHECKING(for --with-call-profile)
++AC_ARG_WITH(call-profile,
++[ --with(out)-call-profile enable/disable statistics on function call invocation], [
++if test "$withval" != no
++then
++ AC_DEFINE(CALL_PROFILE, 1,
++ [Define to keep records on function call invocation])
++ AC_MSG_RESULT(yes)
++else AC_MSG_RESULT(no)
++fi],
++[AC_MSG_RESULT(no)])
++
+ # Check for Python-specific malloc support
+ AC_MSG_CHECKING(for --with-pymalloc)
+ AC_ARG_WITH(pymalloc,
+diff -up Python-3.1.2/pyconfig.h.in.more-configuration-flags Python-3.1.2/pyconfig.h.in
+--- Python-3.1.2/pyconfig.h.in.more-configuration-flags 2010-05-25 12:16:48.000000000
-0400
++++ Python-3.1.2/pyconfig.h.in 2010-05-25 12:17:54.428126399 -0400
+@@ -18,6 +18,12 @@
+ /* Define if you have the Mach cthreads package */
+ #undef C_THREADS
+
++/* Define to keep records on function call invocation */
++#undef CALL_PROFILE
++
++/* Define to keep records of the number of instances of each type */
++#undef COUNT_ALLOCS
++
+ /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
+ mixed-endian order (byte order 45670123) */
+ #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
diff --git a/00114-statvfs-f_flag-constants.patch b/00114-statvfs-f_flag-constants.patch
new file mode 100644
index 0000000..b666c1b
--- /dev/null
+++ b/00114-statvfs-f_flag-constants.patch
@@ -0,0 +1,47 @@
+diff -up Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants
Python-3.2a1/Modules/posixmodule.c
+--- Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants 2010-07-23
09:53:51.000000000 -0400
++++ Python-3.2a1/Modules/posixmodule.c 2010-08-02 16:39:38.756000423 -0400
+@@ -8173,6 +8173,43 @@ all_ins(PyObject *d)
+ #endif
+ #endif
+
++ /* These came from statvfs.h */
++#ifdef ST_RDONLY
++ if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1;
++#endif /* ST_RDONLY */
++#ifdef ST_NOSUID
++ if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
++#endif /* ST_NOSUID */
++
++ /* GNU extensions */
++#ifdef ST_NODEV
++ if (ins(d, "ST_NODEV", (long)ST_NODEV)) return -1;
++#endif /* ST_NODEV */
++#ifdef ST_NOEXEC
++ if (ins(d, "ST_NOEXEC", (long)ST_NOEXEC)) return -1;
++#endif /* ST_NOEXEC */
++#ifdef ST_SYNCHRONOUS
++ if (ins(d, "ST_SYNCHRONOUS", (long)ST_SYNCHRONOUS)) return -1;
++#endif /* ST_SYNCHRONOUS */
++#ifdef ST_MANDLOCK
++ if (ins(d, "ST_MANDLOCK", (long)ST_MANDLOCK)) return -1;
++#endif /* ST_MANDLOCK */
++#ifdef ST_WRITE
++ if (ins(d, "ST_WRITE", (long)ST_WRITE)) return -1;
++#endif /* ST_WRITE */
++#ifdef ST_APPEND
++ if (ins(d, "ST_APPEND", (long)ST_APPEND)) return -1;
++#endif /* ST_APPEND */
++#ifdef ST_NOATIME
++ if (ins(d, "ST_NOATIME", (long)ST_NOATIME)) return -1;
++#endif /* ST_NOATIME */
++#ifdef ST_NODIRATIME
++ if (ins(d, "ST_NODIRATIME", (long)ST_NODIRATIME)) return -1;
++#endif /* ST_NODIRATIME */
++#ifdef ST_RELATIME
++ if (ins(d, "ST_RELATIME", (long)ST_RELATIME)) return -1;
++#endif /* ST_RELATIME */
++
+ #if defined(PYOS_OS2)
+ if (insertvalues(d)) return -1;
+ #endif
diff --git a/00125-less-verbose-COUNT_ALLOCS.patch
b/00125-less-verbose-COUNT_ALLOCS.patch
new file mode 100644
index 0000000..8cef015
--- /dev/null
+++ b/00125-less-verbose-COUNT_ALLOCS.patch
@@ -0,0 +1,20 @@
+diff -up Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS
Python-2.7/Python/pythonrun.c
+--- Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS 2010-08-17 14:49:33.321913909
-0400
++++ Python-2.7/Python/pythonrun.c 2010-08-17 14:54:48.750910403 -0400
+@@ -470,7 +470,15 @@ Py_Finalize(void)
+
+ /* Debugging stuff */
+ #ifdef COUNT_ALLOCS
+- dump_counts(stdout);
++ /* This is a downstream Fedora modification.
++ The upstream default with COUNT_ALLOCS is to always dump the counts to
++ stdout on exit. For our debug builds its useful to have the info from
++ COUNT_ALLOCS available, but the stdout info here gets in the way, so
++ we make it optional, wrapping it in an environment variable (modelled
++ on the other PYTHONDUMP* env variables):
++ */
++ if (Py_GETENV("PYTHONDUMPCOUNTS"))
++ dump_counts(stdout);
+ #endif
+
+ PRINT_TOTAL_REFS();
diff --git a/00131-disable-tests-in-test_io.patch b/00131-disable-tests-in-test_io.patch
new file mode 100644
index 0000000..d81a2d0
--- /dev/null
+++ b/00131-disable-tests-in-test_io.patch
@@ -0,0 +1,11 @@
+diff -up Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io
Python-2.7.2/Lib/test/test_io.py
+--- Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io 2011-09-01
14:18:45.963304089 -0400
++++ Python-2.7.2/Lib/test/test_io.py 2011-09-01 15:08:53.796098413 -0400
+@@ -2669,6 +2669,7 @@ class SignalsTest(unittest.TestCase):
+ self.check_interrupted_read_retry(lambda x: x,
+ mode="r")
+
++ @unittest.skip('rhbz#732998')
+ @unittest.skipUnless(threading, 'Threading required for this test.')
+ def check_interrupted_write_retry(self, item, **fdopen_kwargs):
+ """Check that a buffered write, when it gets interrupted (either
diff --git a/00143-tsc-on-ppc.patch b/00143-tsc-on-ppc.patch
new file mode 100644
index 0000000..447c6e3
--- /dev/null
+++ b/00143-tsc-on-ppc.patch
@@ -0,0 +1,58 @@
+diff -up Python-2.7.2/Python/ceval.c.tsc-on-ppc Python-2.7.2/Python/ceval.c
+--- Python-2.7.2/Python/ceval.c.tsc-on-ppc 2011-08-23 14:59:48.051300849 -0400
++++ Python-2.7.2/Python/ceval.c 2011-08-23 15:33:25.412162902 -0400
+@@ -37,24 +37,42 @@ typedef unsigned long long uint64;
+ */
+ #if defined(__ppc__) || defined (__powerpc__)
+
+-#define READ_TIMESTAMP(var) ppc_getcounter(&var)
++#if defined( __powerpc64__) || defined(__LP64__)
++/* 64-bit PowerPC */
++#define READ_TIMESTAMP(var) ppc64_getcounter(&var)
++static void
++ppc64_getcounter(uint64 *v)
++{
++ /* On 64-bit PowerPC we can read the 64-bit timebase directly into a
++ 64-bit register */
++ uint64 timebase;
++#ifdef _ARCH_PWR4
++ asm volatile ("mfspr %0,268" : "=r" (timebase));
++#else
++ asm volatile ("mftb %0" : "=r" (timebase));
++#endif
++ *v = timebase;
++}
++
++#else
++/* 32-bit PowerPC */
++#define READ_TIMESTAMP(var) ppc32_getcounter(&var)
+
+ static void
+-ppc_getcounter(uint64 *v)
++ppc32_getcounter(uint64 *v)
+ {
+- register unsigned long tbu, tb, tbu2;
++ union { long long ll; long ii[2]; } u;
++ long tmp;
+
+ loop:
+- asm volatile ("mftbu %0" : "=r" (tbu) );
+- asm volatile ("mftb %0" : "=r" (tb) );
+- asm volatile ("mftbu %0" : "=r" (tbu2));
+- if (__builtin_expect(tbu != tbu2, 0)) goto loop;
+-
+- /* The slightly peculiar way of writing the next lines is
+- compiled better by GCC than any other way I tried. */
+- ((long*)(v))[0] = tbu;
+- ((long*)(v))[1] = tb;
++ asm volatile ("mftbu %0" : "=r" (u.ii[0]) );
++ asm volatile ("mftb %0" : "=r" (u.ii[1]) );
++ asm volatile ("mftbu %0" : "=r" (tmp));
++ if (__builtin_expect(u.ii[0] != tmp, 0)) goto loop;
++
++ *v = u.ll;
+ }
++#endif /* powerpc 32/64 bit */
+
+ #elif defined(__i386__)
+
diff --git a/less-verbose-COUNT_ALLOCS.patch b/less-verbose-COUNT_ALLOCS.patch
deleted file mode 100644
index 8cef015..0000000
--- a/less-verbose-COUNT_ALLOCS.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-diff -up Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS
Python-2.7/Python/pythonrun.c
---- Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS 2010-08-17 14:49:33.321913909
-0400
-+++ Python-2.7/Python/pythonrun.c 2010-08-17 14:54:48.750910403 -0400
-@@ -470,7 +470,15 @@ Py_Finalize(void)
-
- /* Debugging stuff */
- #ifdef COUNT_ALLOCS
-- dump_counts(stdout);
-+ /* This is a downstream Fedora modification.
-+ The upstream default with COUNT_ALLOCS is to always dump the counts to
-+ stdout on exit. For our debug builds its useful to have the info from
-+ COUNT_ALLOCS available, but the stdout info here gets in the way, so
-+ we make it optional, wrapping it in an environment variable (modelled
-+ on the other PYTHONDUMP* env variables):
-+ */
-+ if (Py_GETENV("PYTHONDUMPCOUNTS"))
-+ dump_counts(stdout);
- #endif
-
- PRINT_TOTAL_REFS();
diff --git a/python-2.7.2-disable-tests-in-test_io.patch
b/python-2.7.2-disable-tests-in-test_io.patch
deleted file mode 100644
index d81a2d0..0000000
--- a/python-2.7.2-disable-tests-in-test_io.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io
Python-2.7.2/Lib/test/test_io.py
---- Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io 2011-09-01
14:18:45.963304089 -0400
-+++ Python-2.7.2/Lib/test/test_io.py 2011-09-01 15:08:53.796098413 -0400
-@@ -2669,6 +2669,7 @@ class SignalsTest(unittest.TestCase):
- self.check_interrupted_read_retry(lambda x: x,
- mode="r")
-
-+ @unittest.skip('rhbz#732998')
- @unittest.skipUnless(threading, 'Threading required for this test.')
- def check_interrupted_write_retry(self, item, **fdopen_kwargs):
- """Check that a buffered write, when it gets interrupted (either
diff --git a/python-2.7.2-tsc-on-ppc.patch b/python-2.7.2-tsc-on-ppc.patch
deleted file mode 100644
index 447c6e3..0000000
--- a/python-2.7.2-tsc-on-ppc.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-diff -up Python-2.7.2/Python/ceval.c.tsc-on-ppc Python-2.7.2/Python/ceval.c
---- Python-2.7.2/Python/ceval.c.tsc-on-ppc 2011-08-23 14:59:48.051300849 -0400
-+++ Python-2.7.2/Python/ceval.c 2011-08-23 15:33:25.412162902 -0400
-@@ -37,24 +37,42 @@ typedef unsigned long long uint64;
- */
- #if defined(__ppc__) || defined (__powerpc__)
-
--#define READ_TIMESTAMP(var) ppc_getcounter(&var)
-+#if defined( __powerpc64__) || defined(__LP64__)
-+/* 64-bit PowerPC */
-+#define READ_TIMESTAMP(var) ppc64_getcounter(&var)
-+static void
-+ppc64_getcounter(uint64 *v)
-+{
-+ /* On 64-bit PowerPC we can read the 64-bit timebase directly into a
-+ 64-bit register */
-+ uint64 timebase;
-+#ifdef _ARCH_PWR4
-+ asm volatile ("mfspr %0,268" : "=r" (timebase));
-+#else
-+ asm volatile ("mftb %0" : "=r" (timebase));
-+#endif
-+ *v = timebase;
-+}
-+
-+#else
-+/* 32-bit PowerPC */
-+#define READ_TIMESTAMP(var) ppc32_getcounter(&var)
-
- static void
--ppc_getcounter(uint64 *v)
-+ppc32_getcounter(uint64 *v)
- {
-- register unsigned long tbu, tb, tbu2;
-+ union { long long ll; long ii[2]; } u;
-+ long tmp;
-
- loop:
-- asm volatile ("mftbu %0" : "=r" (tbu) );
-- asm volatile ("mftb %0" : "=r" (tb) );
-- asm volatile ("mftbu %0" : "=r" (tbu2));
-- if (__builtin_expect(tbu != tbu2, 0)) goto loop;
--
-- /* The slightly peculiar way of writing the next lines is
-- compiled better by GCC than any other way I tried. */
-- ((long*)(v))[0] = tbu;
-- ((long*)(v))[1] = tb;
-+ asm volatile ("mftbu %0" : "=r" (u.ii[0]) );
-+ asm volatile ("mftb %0" : "=r" (u.ii[1]) );
-+ asm volatile ("mftbu %0" : "=r" (tmp));
-+ if (__builtin_expect(u.ii[0] != tmp, 0)) goto loop;
-+
-+ *v = u.ll;
- }
-+#endif /* powerpc 32/64 bit */
-
- #elif defined(__i386__)
-
diff --git a/python-3.1.2-more-configuration-flags.patch
b/python-3.1.2-more-configuration-flags.patch
deleted file mode 100644
index 24df543..0000000
--- a/python-3.1.2-more-configuration-flags.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-diff -up Python-3.1.2/configure.in.more-configuration-flags Python-3.1.2/configure.in
---- Python-3.1.2/configure.in.more-configuration-flags 2010-05-25 12:16:48.602875960
-0400
-+++ Python-3.1.2/configure.in 2010-05-25 12:16:48.609879553 -0400
-@@ -2443,6 +2443,30 @@ else AC_MSG_RESULT(no)
- fi],
- [AC_MSG_RESULT(no)])
-
-+AC_MSG_CHECKING(for --with-count-allocs)
-+AC_ARG_WITH(count-allocs,
-+[ --with(out)count-allocs enable/disable per-type instance accounting], [
-+if test "$withval" != no
-+then
-+ AC_DEFINE(COUNT_ALLOCS, 1,
-+ [Define to keep records of the number of instances of each type])
-+ AC_MSG_RESULT(yes)
-+else AC_MSG_RESULT(no)
-+fi],
-+[AC_MSG_RESULT(no)])
-+
-+AC_MSG_CHECKING(for --with-call-profile)
-+AC_ARG_WITH(call-profile,
-+[ --with(out)-call-profile enable/disable statistics on function call invocation], [
-+if test "$withval" != no
-+then
-+ AC_DEFINE(CALL_PROFILE, 1,
-+ [Define to keep records on function call invocation])
-+ AC_MSG_RESULT(yes)
-+else AC_MSG_RESULT(no)
-+fi],
-+[AC_MSG_RESULT(no)])
-+
- # Check for Python-specific malloc support
- AC_MSG_CHECKING(for --with-pymalloc)
- AC_ARG_WITH(pymalloc,
-diff -up Python-3.1.2/pyconfig.h.in.more-configuration-flags Python-3.1.2/pyconfig.h.in
---- Python-3.1.2/pyconfig.h.in.more-configuration-flags 2010-05-25 12:16:48.000000000
-0400
-+++ Python-3.1.2/pyconfig.h.in 2010-05-25 12:17:54.428126399 -0400
-@@ -18,6 +18,12 @@
- /* Define if you have the Mach cthreads package */
- #undef C_THREADS
-
-+/* Define to keep records on function call invocation */
-+#undef CALL_PROFILE
-+
-+/* Define to keep records of the number of instances of each type */
-+#undef COUNT_ALLOCS
-+
- /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
- mixed-endian order (byte order 45670123) */
- #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
diff --git a/python-3.2.1-no-static-lib.patch b/python-3.2.1-no-static-lib.patch
deleted file mode 100644
index 3a6ac8a..0000000
--- a/python-3.2.1-no-static-lib.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-diff -up Python-3.2.1/Makefile.pre.in.no-static-lib Python-3.2.1/Makefile.pre.in
---- Python-3.2.1/Makefile.pre.in.no-static-lib 2011-07-09 02:58:52.000000000 -0400
-+++ Python-3.2.1/Makefile.pre.in 2011-07-11 11:46:27.381425999 -0400
-@@ -425,7 +425,7 @@ coverage:
-
-
- # Build the interpreter
--$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
-
- platform: $(BUILDPYTHON)
-@@ -439,18 +439,6 @@ sharedmods: $(BUILDPYTHON)
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
- esac
-
--# Build static library
--# avoid long command lines, same as LIBRARY_OBJS
--$(LIBRARY): $(LIBRARY_OBJS)
-- -rm -f $@
-- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
-- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
-- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
-- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODOBJS)
-- $(RANLIB) $@
--
- libpython$(LDVERSION).so: $(LIBRARY_OBJS)
- if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -540,7 +528,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
- echo "-----------------------------------------------"; \
- fi
-
--Modules/_testembed: Modules/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-+Modules/_testembed: Modules/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-
- ############################################################################
-@@ -1058,18 +1046,6 @@ libainstall: all python-config
- else true; \
- fi; \
- done
-- @if test -d $(LIBRARY); then :; else \
-- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-- if test "$(SO)" = .dll; then \
-- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
-- else \
-- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- fi; \
-- else \
-- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
-- fi; \
-- fi
- $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
- $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
- $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python-3.2a1-statvfs-f_flag-constants.patch
b/python-3.2a1-statvfs-f_flag-constants.patch
deleted file mode 100644
index b666c1b..0000000
--- a/python-3.2a1-statvfs-f_flag-constants.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-diff -up Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants
Python-3.2a1/Modules/posixmodule.c
---- Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants 2010-07-23
09:53:51.000000000 -0400
-+++ Python-3.2a1/Modules/posixmodule.c 2010-08-02 16:39:38.756000423 -0400
-@@ -8173,6 +8173,43 @@ all_ins(PyObject *d)
- #endif
- #endif
-
-+ /* These came from statvfs.h */
-+#ifdef ST_RDONLY
-+ if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1;
-+#endif /* ST_RDONLY */
-+#ifdef ST_NOSUID
-+ if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
-+#endif /* ST_NOSUID */
-+
-+ /* GNU extensions */
-+#ifdef ST_NODEV
-+ if (ins(d, "ST_NODEV", (long)ST_NODEV)) return -1;
-+#endif /* ST_NODEV */
-+#ifdef ST_NOEXEC
-+ if (ins(d, "ST_NOEXEC", (long)ST_NOEXEC)) return -1;
-+#endif /* ST_NOEXEC */
-+#ifdef ST_SYNCHRONOUS
-+ if (ins(d, "ST_SYNCHRONOUS", (long)ST_SYNCHRONOUS)) return -1;
-+#endif /* ST_SYNCHRONOUS */
-+#ifdef ST_MANDLOCK
-+ if (ins(d, "ST_MANDLOCK", (long)ST_MANDLOCK)) return -1;
-+#endif /* ST_MANDLOCK */
-+#ifdef ST_WRITE
-+ if (ins(d, "ST_WRITE", (long)ST_WRITE)) return -1;
-+#endif /* ST_WRITE */
-+#ifdef ST_APPEND
-+ if (ins(d, "ST_APPEND", (long)ST_APPEND)) return -1;
-+#endif /* ST_APPEND */
-+#ifdef ST_NOATIME
-+ if (ins(d, "ST_NOATIME", (long)ST_NOATIME)) return -1;
-+#endif /* ST_NOATIME */
-+#ifdef ST_NODIRATIME
-+ if (ins(d, "ST_NODIRATIME", (long)ST_NODIRATIME)) return -1;
-+#endif /* ST_NODIRATIME */
-+#ifdef ST_RELATIME
-+ if (ins(d, "ST_RELATIME", (long)ST_RELATIME)) return -1;
-+#endif /* ST_RELATIME */
-+
- #if defined(PYOS_OS2)
- if (insertvalues(d)) return -1;
- #endif
diff --git a/python-3.2b2-systemtap.patch b/python-3.2b2-systemtap.patch
deleted file mode 100644
index f87fc60..0000000
--- a/python-3.2b2-systemtap.patch
+++ /dev/null
@@ -1,214 +0,0 @@
-diff -up Python-3.2b2/configure.in.systemtap Python-3.2b2/configure.in
---- Python-3.2b2/configure.in.systemtap 2010-12-13 02:59:39.000000000 -0500
-+++ Python-3.2b2/configure.in 2010-12-28 17:01:58.044059433 -0500
-@@ -2470,6 +2470,38 @@ if test "$with_valgrind" != no; then
- OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
- fi
-
-+# Check for dtrace support
-+AC_MSG_CHECKING(for --with-dtrace)
-+AC_ARG_WITH(dtrace,
-+ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
-+
-+if test ! -z "$with_dtrace"
-+then
-+ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Sun"
-+ DTRACEOBJS="Python/dtrace.o"
-+ DTRADEHDRS=""
-+ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Apple"
-+ DTRACEOBJS=""
-+ DTRADEHDRS="pydtrace.h"
-+ else
-+ with_dtrace="no"
-+ fi
-+else
-+ with_dtrace="no"
-+fi
-+
-+AC_MSG_RESULT($with_dtrace)
-+AC_SUBST(DTRACEOBJS)
-+AC_SUBST(DTRACEHDRS)
-+
- # -I${DLINCLDIR} is added to the compile rule for importdl.o
- AC_SUBST(DLINCLDIR)
- DLINCLDIR=.
-diff -up Python-3.2b2/Include/pydtrace.d.systemtap Python-3.2b2/Include/pydtrace.d
---- Python-3.2b2/Include/pydtrace.d.systemtap 2010-12-28 16:58:41.762936379 -0500
-+++ Python-3.2b2/Include/pydtrace.d 2010-12-28 16:58:41.762936379 -0500
-@@ -0,0 +1,10 @@
-+provider python {
-+ probe function__entry(const char *, const char *, int);
-+ probe function__return(const char *, const char *, int);
-+};
-+
-+#pragma D attributes Evolving/Evolving/Common provider python provider
-+#pragma D attributes Private/Private/Common provider python module
-+#pragma D attributes Private/Private/Common provider python function
-+#pragma D attributes Evolving/Evolving/Common provider python name
-+#pragma D attributes Evolving/Evolving/Common provider python args
-diff -up Python-3.2b2/Makefile.pre.in.systemtap Python-3.2b2/Makefile.pre.in
---- Python-3.2b2/Makefile.pre.in.systemtap 2010-12-28 16:58:41.000000000 -0500
-+++ Python-3.2b2/Makefile.pre.in 2010-12-28 17:00:58.607310089 -0500
-@@ -328,6 +328,7 @@ PYTHON_OBJS= \
- Python/formatter_unicode.o \
- Python/fileutils.o \
- Python/$(DYNLOADFILE) \
-+ @DTRACEOBJS@ \
- $(LIBOBJS) \
- $(MACHDEP_OBJS) \
- $(THREADOBJ)
-@@ -632,6 +633,18 @@ Objects/typeobject.o: $(srcdir)/Objects/
- $(srcdir)/Objects/typeslots.inc: $(srcdir)/Include/typeslots.h
$(srcdir)/Objects/typeslots.py
- $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
$(srcdir)/Objects/typeslots.inc
-
-+# Only needed with --with-dtrace
-+buildinclude:
-+ mkdir -p Include
-+
-+Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
-+ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
-+
-+Python/ceval.o: Include/pydtrace.h
-+
-+Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
-+ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
-+
- ############################################################################
- # Header files
-
-@@ -1282,7 +1295,7 @@ Python/thread.o: @THREADHEADERS@
- .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
- .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
- .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
--.PHONY: smelly funny patchcheck
-+.PHONY: smelly funny patchcheck buildinclude
- .PHONY: gdbhooks
-
- # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
-diff -up Python-3.2b2/pyconfig.h.in.systemtap Python-3.2b2/pyconfig.h.in
---- Python-3.2b2/pyconfig.h.in.systemtap 2010-11-20 05:29:12.000000000 -0500
-+++ Python-3.2b2/pyconfig.h.in 2010-12-28 16:58:41.765937360 -0500
-@@ -1092,6 +1092,9 @@
- /* Define if you want documentation strings in extension modules */
- #undef WITH_DOC_STRINGS
-
-+/* Define if you want to compile in Dtrace support */
-+#undef WITH_DTRACE
-+
- /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
- linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
- Dyld is necessary to support frameworks. */
-diff -up Python-3.2b2/Python/ceval.c.systemtap Python-3.2b2/Python/ceval.c
---- Python-3.2b2/Python/ceval.c.systemtap 2010-12-03 15:14:31.000000000 -0500
-+++ Python-3.2b2/Python/ceval.c 2010-12-28 16:58:41.768935588 -0500
-@@ -18,6 +18,10 @@
-
- #include <ctype.h>
-
-+#ifdef WITH_DTRACE
-+#include "pydtrace.h"
-+#endif
-+
- #ifndef WITH_TSC
-
- #define READ_TIMESTAMP(var)
-@@ -766,6 +770,70 @@ PyEval_EvalCode(PyObject *co, PyObject *
- }
-
-
-+#ifdef WITH_DTRACE
-+struct frame_marker_info
-+{
-+ char *filename;
-+ char *name;
-+ int lineno;
-+
-+ PyObject *utf8_filename;
-+ PyObject *utf8_name;
-+};
-+
-+static void
-+get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
-+{
-+ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
-+ if (fmi->utf8_filename) {
-+ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
-+ } else {
-+ fmi->filename = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
-+ if (fmi->utf8_name) {
-+ fmi->name = PyBytes_AsString(fmi->utf8_name);
-+ } else {
-+ fmi->name = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
-+}
-+
-+static void
-+release_frame_marker_info(struct frame_marker_info *fmi)
-+{
-+ Py_XDECREF(fmi->utf8_filename);
-+ Py_XDECREF(fmi->utf8_name);
-+}
-+
-+static void
-+dtrace_entry(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
-+}
-+
-+static void
-+dtrace_return(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
-+}
-+#else
-+#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
-+#define PYTHON_FUNCTION_RETURN_ENABLED() 0
-+#define dtrace_entry(f)
-+#define dtrace_return(f)
-+#endif
-+
- /* Interpreter main loop */
-
- PyObject *
-@@ -1183,6 +1251,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
- }
- }
-
-+ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
-+ dtrace_entry(f);
-+ }
-+
- co = f->f_code;
- names = co->co_names;
- consts = co->co_consts;
-@@ -3048,6 +3120,9 @@ fast_yield:
-
- /* pop frame */
- exit_eval_frame:
-+ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
-+ dtrace_return(f);
-+ }
- Py_LeaveRecursiveCall();
- tstate->frame = f->f_back;
-
diff --git a/python3.spec b/python3.spec
index 5550990..c7a839d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -86,8 +86,7 @@
# We need to get a newer configure generated out of configure.in for the following
# patches:
# patch 55 (systemtap)
-# patch 103 (debug build)
-# patch 104 (more config flags)
+# patch 113 (more config flags)
#
# For patch 55 (systemtap), we need to get a new header for configure to use
#
@@ -118,7 +117,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -211,39 +210,42 @@ Patch1: Python-3.1.1-rpath.patch
# It's simplest to remove them:
Patch3: python-3.2b2-remove-mimeaudio-tests.patch
-# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
-# a libpythonMAJOR.MINOR.a (bug 550692):
-Patch6: python-3.2.1-no-static-lib.patch
-
# Systemtap support: add statically-defined probe points
# Patch based on upstream bug:
http://bugs.python.org/issue4111
# fixed up by mjw and wcohen for 2.6.2, then fixed up by dmalcolm for 2.6.4
# then rewritten by mjw (attachment 390110 of rhbz 545179); ported to 3.1.1 by
# dmalcolm
-Patch8: python-3.2b2-systemtap.patch
+Patch55: 00055-systemtap.patch
Patch102: python-3.2.1-lib64.patch
+# Only used when "%{_lib}" == "lib64"
+# Another lib64 fix, for distutils/tests/test_install.py; not upstream:
+Patch104: 00104-lib64-fix-for-test_install.patch
+
+# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
+# a libpythonMAJOR.MINOR.a (bug 550692):
+Patch111: 00111-no-static-lib.patch
+
+# Patch112: python-2.7rc1-debug-build.patch: this is not relevant to Python 3,
+# for 3.2 onwards
+
# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
# so that if they are enabled, they will be in that build's pyconfig.h, so that
# extension modules will reliably use them
-Patch104: python-3.1.2-more-configuration-flags.patch
+Patch113: 00113-more-configuration-flags.patch
# Add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
-Patch105: python-3.2a1-statvfs-f_flag-constants.patch
-
-# Only used when "%{_lib}" == "lib64"
-# Another lib64 fix, for distutils/tests/test_install.py; not upstream:
-Patch106: 00106-lib64-fix-for-test_install.patch
+Patch114: 00114-statvfs-f_flag-constants.patch
# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
# emitting debug info to stdout on exit is too verbose and makes it harder to
# use the debug build. Add a "PYTHONDUMPCOUNTS" environment variable which
# must be set to enable the output on exit
# Not yet sent upstream:
-Patch125: less-verbose-COUNT_ALLOCS.patch
+Patch125: 00125-less-verbose-COUNT_ALLOCS.patch
# In my koji builds, /root/bin is in the PATH for some reason
# This leads to test_subprocess.py failing, due to "test_leaking_fds_on_error"
@@ -256,16 +258,15 @@ Patch125: less-verbose-COUNT_ALLOCS.patch
# Not yet sent upstream
Patch129: python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
-# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
-# aliasing violations (rhbz#698726)
-# Sent upstream as
http://bugs.python.org/issue12872
-Patch130: python-2.7.2-tsc-on-ppc.patch
+# Python 2's:
+# Patch130: python-2.7.2-add-extension-suffix-to-python-config.patch
+# is not relevant to Python 3 (for 3.2 onwards)
# The four tests in test_io built on top of check_interrupted_write_retry
# fail when built in Koji, for ppc and ppc64; for some reason, the SIGALRM
# handlers are never called, and the call to write runs to completion
# (rhbz#732998)
-Patch131: python-2.7.2-disable-tests-in-test_io.patch
+Patch131: 00131-disable-tests-in-test_io.patch
# Add non-standard hooks to unittest for use in the "check" phase below, when
# running selftests within the build:
@@ -315,6 +316,11 @@ Patch141: 00141-fix-test_gc_with_COUNT_ALLOCS.patch
# Some pty tests fail when run in mock (rhbz#714627):
Patch142: 00142-skip-failing-pty-tests-in-rpmbuild.patch
+# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
+# aliasing violations (rhbz#698726)
+# Sent upstream as
http://bugs.python.org/issue12872
+Patch143: 00143-tsc-on-ppc.patch
+
# (New patches go here ^^^)
#
# When adding new patches to "python" and "python3" in Fedora 17
onwards,
@@ -474,25 +480,25 @@ rm -r Modules/zlib || exit 1
#
%patch1 -p1
%patch3 -p1 -b .remove-mimeaudio-tests
-%patch6 -p1 -b .no-static-lib
%if 0%{?with_systemtap}
-%patch8 -p1 -b .systemtap
+%patch55 -p1 -b .systemtap
%endif
%if "%{_lib}" == "lib64"
%patch102 -p1
-%patch106 -p1
+%patch104 -p1
%endif
-%patch104 -p1 -b .more-configuration-flags
-%patch105 -p1 -b .statvfs-f-flag-constants
+%patch111 -p1
+# 112: not for python3
+%patch113 -p1
+%patch114 -p1
%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
%patch129 -p1
-%patch130 -p1 -b .tsc-on-ppc
%ifarch ppc ppc64
%patch131 -p1
@@ -511,6 +517,7 @@ rm -r Modules/zlib || exit 1
# 00140: not for python3
%patch141 -p1
%patch142 -p1
+%patch143 -p1 -b .tsc-on-ppc
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1316,6 +1323,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Sep 12 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-3
+- renumber and rename patches for consistency with python.spec (8 to 55, 106
+to 104, 6 to 111, 104 to 113, 105 to 114, 125, 131, 130 to 143)
+
* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
- rewrite of "check", introducing downstream-only hooks for skipping specific
cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
commit 5a4896796b1b92a56db40d1bee419c3de8853138
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Sat Sep 10 08:23:40 2011 -0400
minor fixes to reduce python/python3 delta
diff --git a/python3.spec b/python3.spec
index 2827e6f..5550990 100644
--- a/python3.spec
+++ b/python3.spec
@@ -920,8 +920,8 @@ CheckPython() {
echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
- # Note that we're running the tests using the version of the code in the builddir,
- # not in the buildroot.
+ # Note that we're running the tests using the version of the code in the
+ # builddir, not in the buildroot.
# Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
# our non-standard decorators take effect on the relevant tests:
commit 0c8875f3f6a702aaa27f4844d4ac2a2e11768171
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Sat Sep 10 07:59:22 2011 -0400
rewrite of %check: fine-grained test exclusions
* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
- rewrite of "check", introducing downstream-only hooks for skipping
specific
cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
fine-grained manner than before; (patches 106, 133-142 sparsely, moving
patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
diff --git a/00106-lib64-fix-for-test_install.patch
b/00106-lib64-fix-for-test_install.patch
new file mode 100644
index 0000000..7852bf6
--- /dev/null
+++ b/00106-lib64-fix-for-test_install.patch
@@ -0,0 +1,13 @@
+--- Python-2.7.2/Lib/distutils/tests/test_install.py.lib64 2011-09-08 17:51:57.851405376
-0400
++++ Python-2.7.2/Lib/distutils/tests/test_install.py 2011-09-08 18:40:46.754205096 -0400
+@@ -41,8 +41,9 @@ class InstallTestCase(support.TempdirMan
+ self.assertEqual(got, expected)
+
+ libdir = os.path.join(destination, "lib", "python")
++ platlibdir = os.path.join(destination, "lib64", "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"))
diff --git a/00132-add-rpmbuild-hooks-to-unittest.patch
b/00132-add-rpmbuild-hooks-to-unittest.patch
new file mode 100644
index 0000000..fdfbab8
--- /dev/null
+++ b/00132-add-rpmbuild-hooks-to-unittest.patch
@@ -0,0 +1,68 @@
+diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest
Python-3.2.2/Lib/unittest/case.py
+--- Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest 2011-09-03
12:16:44.000000000 -0400
++++ Python-3.2.2/Lib/unittest/case.py 2011-09-09 06:35:16.365568382 -0400
+@@ -3,6 +3,7 @@
+ import sys
+ import functools
+ import difflib
++import os
+ import pprint
+ import re
+ import warnings
+@@ -101,6 +102,43 @@ def expectedFailure(func):
+ return wrapper
+
+
++# Non-standard/downstream-only hooks for handling issues with specific test
++# cases:
++
++def _skipInRpmBuild(reason):
++ """
++ Non-standard/downstream-only decorator for marking a specific unit test
++ to be skipped when run within the %check of an rpmbuild.
++
++ Specifically, this takes effect when WITHIN_PYTHON_RPM_BUILD is set within
++ the environment, and has no effect otherwise.
++ """
++ if 'WITHIN_PYTHON_RPM_BUILD' in os.environ:
++ return skip(reason)
++ else:
++ return _id
++
++def _expectedFailureInRpmBuild(func):
++ """
++ Non-standard/downstream-only decorator for marking a specific unit test
++ as expected to fail within the %check of an rpmbuild.
++
++ Specifically, this takes effect when WITHIN_PYTHON_RPM_BUILD is set within
++ the environment, and has no effect otherwise.
++ """
++ @functools.wraps(func)
++ def wrapper(*args, **kwargs):
++ if 'WITHIN_PYTHON_RPM_BUILD' in os.environ:
++ try:
++ func(*args, **kwargs)
++ except Exception:
++ raise _ExpectedFailure(sys.exc_info())
++ raise _UnexpectedSuccess
++ else:
++ # Call directly:
++ func(*args, **kwargs)
++ return wrapper
++
+ class _AssertRaisesBaseContext(object):
+
+ def __init__(self, expected, test_case, callable_obj=None,
+diff -up Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest
Python-3.2.2/Lib/unittest/__init__.py
+--- Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest 2011-09-03
12:16:44.000000000 -0400
++++ Python-3.2.2/Lib/unittest/__init__.py 2011-09-09 06:35:16.366568382 -0400
+@@ -57,7 +57,8 @@ __unittest = True
+
+ from .result import TestResult
+ from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
+- skipUnless, expectedFailure)
++ skipUnless, expectedFailure,
++ _skipInRpmBuild, _expectedFailureInRpmBuild)
+ from .suite import BaseTestSuite, TestSuite
+ from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
+ findTestCases)
diff --git a/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
new file mode 100644
index 0000000..c1871ac
--- /dev/null
+++ b/00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
@@ -0,0 +1,13 @@
+diff -up Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_sys.py
+--- Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS 2010-12-28
20:52:43.236310184 -0500
++++ Python-3.2b2/Lib/test/test_sys.py 2010-12-28 20:58:09.164184094 -0500
+@@ -817,6 +817,9 @@ class SizeofTest(unittest.TestCase):
+ # (PyTypeObject + PyNumberMethods + PyMappingMethods +
+ # PySequenceMethods + PyBufferProcs)
+ s = size(vh + 'P2P15Pl4PP9PP11PI') + size('16Pi17P 3P 10P 2P
2P')
++ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
++ if hasattr(sys, 'getcounts'):
++ s += size('3P2P')
+ check(int, s)
+ # class
+ class newstyleclass(object): pass
diff --git a/00135-fix-test-within-test_weakref-in-debug-build.patch
b/00135-fix-test-within-test_weakref-in-debug-build.patch
new file mode 100644
index 0000000..6ed7801
--- /dev/null
+++ b/00135-fix-test-within-test_weakref-in-debug-build.patch
@@ -0,0 +1,17 @@
+diff -up Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix
Python-3.2b2/Lib/test/test_weakref.py
+--- Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix 2010-12-28
20:33:46.963364990 -0500
++++ Python-3.2b2/Lib/test/test_weakref.py 2010-12-28 20:35:44.115935248 -0500
+@@ -583,9 +583,10 @@ class ReferencesTestCase(TestBase):
+ # been cleared without their callbacks executing. OTOH, the weakref
+ # to C is bound to a function local (wr), and wasn't trash, so that
+ # callback should have been invoked when C went away.
+- self.assertEqual(alist, ["C went away"])
+- # The remaining weakref should be dead now (its callback ran).
+- self.assertEqual(wr(), None)
++ if not hasattr(sys, 'getcounts'):
++ self.assertEqual(alist, ["C went away"])
++ # The remaining weakref should be dead now (its callback ran).
++ self.assertEqual(wr(), None)
+
+ del alist[:]
+ gc.collect()
diff --git a/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
b/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
new file mode 100644
index 0000000..8a6bc46
--- /dev/null
+++ b/00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
@@ -0,0 +1,12 @@
+diff -up
Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py.skip-distutils-tests-that-fail-in-rpmbuild
Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py
+---
Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py.skip-distutils-tests-that-fail-in-rpmbuild 2011-09-03
12:16:40.000000000 -0400
++++ Python-3.2.2/Lib/distutils/tests/test_bdist_rpm.py 2011-09-10 05:04:56.328852558
-0400
+@@ -23,6 +23,7 @@ setup(name='foo', version='0.1', py_modu
+
+ """
+
++(a)unittest._skipInRpmBuild("don't try to nest one rpm build inside another rpm
build")
+ class BuildRpmTestCase(support.TempdirManager,
+ support.LoggingSilencer,
+ unittest.TestCase):
+diff -up
Python-3.2.2/Lib/distutils/tests/test_build_ext.py.skip-distutils-tests-that-fail-in-rpmbuild
Python-3.2.2/Lib/distutils/tests/test_build_ext.py
diff --git a/00139-skip-test_float-known-failure-on-arm.patch
b/00139-skip-test_float-known-failure-on-arm.patch
new file mode 100644
index 0000000..9d0bfad
--- /dev/null
+++ b/00139-skip-test_float-known-failure-on-arm.patch
@@ -0,0 +1,11 @@
+diff -up Python-2.7.2/Lib/test/test_float.py.skip-test_float-known-failure-on-arm
Python-2.7.2/Lib/test/test_float.py
+--- Python-2.7.2/Lib/test/test_float.py.skip-test_float-known-failure-on-arm 2011-09-08
19:34:09.000986128 -0400
++++ Python-2.7.2/Lib/test/test_float.py 2011-09-08 19:34:57.969982779 -0400
+@@ -1072,6 +1072,7 @@ class HexFloatTestCase(unittest.TestCase
+ self.identical(got, expected)
+
+
++ @unittest.skip('Known failure on ARM:
http://bugs.python.org/issue8265')
+ def test_from_hex(self):
+ MIN = self.MIN;
+ MAX = self.MAX;
diff --git a/00141-fix-test_gc_with_COUNT_ALLOCS.patch
b/00141-fix-test_gc_with_COUNT_ALLOCS.patch
new file mode 100644
index 0000000..337e39e
--- /dev/null
+++ b/00141-fix-test_gc_with_COUNT_ALLOCS.patch
@@ -0,0 +1,22 @@
+diff -up Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_gc.py
+--- Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS 2010-12-28
20:39:40.779059772 -0500
++++ Python-3.2b2/Lib/test/test_gc.py 2010-12-28 20:41:15.890940017 -0500
+@@ -102,10 +102,16 @@ class GCTests(unittest.TestCase):
+ del a
+ self.assertNotEqual(gc.collect(), 0)
+ del B, C
+- self.assertNotEqual(gc.collect(), 0)
++ if hasattr(sys, 'getcounts'):
++ self.assertEqual(gc.collect(), 0)
++ else:
++ self.assertNotEqual(gc.collect(), 0)
+ A.a = A()
+ del A
+- self.assertNotEqual(gc.collect(), 0)
++ if hasattr(sys, 'getcounts'):
++ self.assertEqual(gc.collect(), 0)
++ else:
++ self.assertNotEqual(gc.collect(), 0)
+ self.assertEqual(gc.collect(), 0)
+
+ def test_method(self):
diff --git a/00142-skip-failing-pty-tests-in-rpmbuild.patch
b/00142-skip-failing-pty-tests-in-rpmbuild.patch
new file mode 100644
index 0000000..414ffcd
--- /dev/null
+++ b/00142-skip-failing-pty-tests-in-rpmbuild.patch
@@ -0,0 +1,22 @@
+diff -up Python-2.7.2/Lib/test/test_openpty.py.skip-failing-pty-tests-in-rpmbuild
Python-2.7.2/Lib/test/test_openpty.py
+--- Python-2.7.2/Lib/test/test_openpty.py.skip-failing-pty-tests-in-rpmbuild 2011-09-09
05:09:28.698920379 -0400
++++ Python-2.7.2/Lib/test/test_openpty.py 2011-09-09 05:10:54.805914490 -0400
+@@ -8,6 +8,7 @@ if not hasattr(os, "openpty"):
+
+
+ class OpenptyTest(unittest.TestCase):
++ @unittest._skipInRpmBuild('sometimes fails in Koji, possibly due to a mock issue
(rhbz#714627)')
+ def test(self):
+ master, slave = os.openpty()
+ if not os.isatty(slave):
+diff -up Python-2.7.2/Lib/test/test_pty.py.skip-failing-pty-tests-in-rpmbuild
Python-2.7.2/Lib/test/test_pty.py
+--- Python-2.7.2/Lib/test/test_pty.py.skip-failing-pty-tests-in-rpmbuild 2011-09-09
05:09:36.781919825 -0400
++++ Python-2.7.2/Lib/test/test_pty.py 2011-09-09 05:11:14.741913127 -0400
+@@ -109,6 +109,7 @@ class PtyTest(unittest.TestCase):
+ os.close(master_fd)
+
+
++ @unittest._skipInRpmBuild('sometimes fails in Koji, possibly due to a mock issue
(rhbz#714627)')
+ def test_fork(self):
+ debug("calling pty.fork()")
+ pid, master_fd = pty.fork()
diff --git a/python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
b/python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
deleted file mode 100644
index 337e39e..0000000
--- a/python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff -up Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_gc.py
---- Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS 2010-12-28
20:39:40.779059772 -0500
-+++ Python-3.2b2/Lib/test/test_gc.py 2010-12-28 20:41:15.890940017 -0500
-@@ -102,10 +102,16 @@ class GCTests(unittest.TestCase):
- del a
- self.assertNotEqual(gc.collect(), 0)
- del B, C
-- self.assertNotEqual(gc.collect(), 0)
-+ if hasattr(sys, 'getcounts'):
-+ self.assertEqual(gc.collect(), 0)
-+ else:
-+ self.assertNotEqual(gc.collect(), 0)
- A.a = A()
- del A
-- self.assertNotEqual(gc.collect(), 0)
-+ if hasattr(sys, 'getcounts'):
-+ self.assertEqual(gc.collect(), 0)
-+ else:
-+ self.assertNotEqual(gc.collect(), 0)
- self.assertEqual(gc.collect(), 0)
-
- def test_method(self):
diff --git a/python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
b/python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
deleted file mode 100644
index 6ed7801..0000000
--- a/python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -up Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix
Python-3.2b2/Lib/test/test_weakref.py
---- Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix 2010-12-28
20:33:46.963364990 -0500
-+++ Python-3.2b2/Lib/test/test_weakref.py 2010-12-28 20:35:44.115935248 -0500
-@@ -583,9 +583,10 @@ class ReferencesTestCase(TestBase):
- # been cleared without their callbacks executing. OTOH, the weakref
- # to C is bound to a function local (wr), and wasn't trash, so that
- # callback should have been invoked when C went away.
-- self.assertEqual(alist, ["C went away"])
-- # The remaining weakref should be dead now (its callback ran).
-- self.assertEqual(wr(), None)
-+ if not hasattr(sys, 'getcounts'):
-+ self.assertEqual(alist, ["C went away"])
-+ # The remaining weakref should be dead now (its callback ran).
-+ self.assertEqual(wr(), None)
-
- del alist[:]
- gc.collect()
diff --git a/python-3.2b2-test_sys-COUNT_ALLOCS.patch
b/python-3.2b2-test_sys-COUNT_ALLOCS.patch
deleted file mode 100644
index c1871ac..0000000
--- a/python-3.2b2-test_sys-COUNT_ALLOCS.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -up Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_sys.py
---- Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS 2010-12-28
20:52:43.236310184 -0500
-+++ Python-3.2b2/Lib/test/test_sys.py 2010-12-28 20:58:09.164184094 -0500
-@@ -817,6 +817,9 @@ class SizeofTest(unittest.TestCase):
- # (PyTypeObject + PyNumberMethods + PyMappingMethods +
- # PySequenceMethods + PyBufferProcs)
- s = size(vh + 'P2P15Pl4PP9PP11PI') + size('16Pi17P 3P 10P 2P
2P')
-+ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
-+ if hasattr(sys, 'getcounts'):
-+ s += size('3P2P')
- check(int, s)
- # class
- class newstyleclass(object): pass
diff --git a/python3.spec b/python3.spec
index aa537ef..2827e6f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -234,6 +234,10 @@ Patch104: python-3.1.2-more-configuration-flags.patch
# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
Patch105: python-3.2a1-statvfs-f_flag-constants.patch
+# Only used when "%{_lib}" == "lib64"
+# Another lib64 fix, for distutils/tests/test_install.py; not upstream:
+Patch106: 00106-lib64-fix-for-test_install.patch
+
# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
# emitting debug info to stdout on exit is too verbose and makes it harder to
# use the debug build. Add a "PYTHONDUMPCOUNTS" environment variable which
@@ -241,20 +245,6 @@ Patch105: python-3.2a1-statvfs-f_flag-constants.patch
# Not yet sent upstream:
Patch125: less-verbose-COUNT_ALLOCS.patch
-# test_weakref's test_callback_in_cycle_resurrection doesn't work with
-# COUNT_ALLOCS, as the metrics keep "C" alive. Work around this for our
-# debug build:
-# Not yet sent upstream
-Patch126: python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
-
-# Similar COUNT_ALLOCS fixes for test_gc
-# Not yet sent upstream
-Patch127: python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
-
-# Similar COUNT_ALLOCS fixes for test_sys
-# Not yet sent upstream
-Patch128: python-3.2b2-test_sys-COUNT_ALLOCS.patch
-
# In my koji builds, /root/bin is in the PATH for some reason
# This leads to test_subprocess.py failing, due to "test_leaking_fds_on_error"
# trying every dir in PATH for "nonexisting_i_hope", which leads to it raising
@@ -277,6 +267,74 @@ Patch130: python-2.7.2-tsc-on-ppc.patch
# (rhbz#732998)
Patch131: python-2.7.2-disable-tests-in-test_io.patch
+# Add non-standard hooks to unittest for use in the "check" phase below, when
+# running selftests within the build:
+# @unittest._skipInRpmBuild(reason)
+# for tests that hang or fail intermittently within the build environment, and:
+# @unittest._expectedFailureInRpmBuild
+# for tests that always fail within the build environment
+#
+# The hooks only take effect if WITHIN_PYTHON_RPM_BUILD is set in the
+# environment, which we set manually in the appropriate portion of the "check"
+# phase below (and which potentially other python-* rpms could set, to reuse
+# these unittest hooks in their own "check" phases)
+Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
+
+# 00133-skip-test_dl.patch is not relevant for python3: the "dl" module no
+# longer exists
+
+# Fix a failure in test_sys.py when configured with COUNT_ALLOCS enabled
+# Not yet sent upstream
+Patch134: 00134-fix-COUNT_ALLOCS-failure-in-test_sys.patch
+
+# test_weakref's test_callback_in_cycle_resurrection doesn't work with
+# COUNT_ALLOCS, as the metrics keep "C" alive. Work around this for our
+# debug build:
+# Not yet sent upstream
+Patch135: 00135-fix-test-within-test_weakref-in-debug-build.patch
+
+# Patch136: 00136-skip-tests-of-seeking-stdin-in-rpmbuild.patch does not seem
+# to be needed by python3
+
+# Some tests within distutils fail when run in an rpmbuild:
+Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
+
+# Patch138: 00138-fix-distutils-tests-in-debug-build.patch is not relevant for
+# python3
+
+# ARM-specific: skip known failure in test_float:
+#
http://bugs.python.org/issue8265 (rhbz#706253)
+Patch139: 00139-skip-test_float-known-failure-on-arm.patch
+
+# Patch140: 00140-skip-test_ctypes-known-failure-on-sparc.patch does not appear
+# to be relevant for python3
+
+# Fix test_gc's test_newinstance case when configured with COUNT_ALLOCS:
+Patch141: 00141-fix-test_gc_with_COUNT_ALLOCS.patch
+
+# Some pty tests fail when run in mock (rhbz#714627):
+Patch142: 00142-skip-failing-pty-tests-in-rpmbuild.patch
+
+# (New patches go here ^^^)
+#
+# When adding new patches to "python" and "python3" in Fedora 17
onwards,
+# please try to keep the patch numbers in-sync between the two specfiles:
+#
+# - use the same patch number across both specfiles for conceptually-equivalent
+# fixes, ideally with the same name
+#
+# - when a patch is relevan to both specfiles, use the same introductory
+# comment in both specfiles where possible (to improve "diff" output when
+# comparing them)
+#
+# - when a patch is only relevant for one of the two specfiles, leave a gap
+# in the patch numbering in the other specfile, adding a comment when
+# omitting a patch, both in the manifest section here, and in the "prep"
+# phase below
+#
+# Hopefully this will make it easier to ensure that all relevant fixes are
+# applied to both versions.
+
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
@@ -424,6 +482,7 @@ rm -r Modules/zlib || exit 1
%if "%{_lib}" == "lib64"
%patch102 -p1
+%patch106 -p1
%endif
%patch104 -p1 -b .more-configuration-flags
@@ -431,9 +490,7 @@ rm -r Modules/zlib || exit 1
%patch105 -p1 -b .statvfs-f-flag-constants
%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
-%patch126 -p1
-%patch127 -p1
-%patch128 -p1
+
%patch129 -p1
%patch130 -p1 -b .tsc-on-ppc
@@ -441,6 +498,20 @@ rm -r Modules/zlib || exit 1
%patch131 -p1
%endif
+%patch132 -p1
+# 00133: not for python3
+%patch134 -p1
+%patch135 -p1
+# 00136: not for python3
+%patch137 -p1
+# 00138: not for python3
+%ifarch %{arm}
+%patch139 -p1
+%endif
+# 00140: not for python3
+%patch141 -p1
+%patch142 -p1
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -849,79 +920,16 @@ CheckPython() {
echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
- # Notes about disabled tests:
- #
- # test_distutils.py
- # This one tries to build an RPM inside the rpmbuild; I'll simply
- # let this one fail for now (has trouble linking against -lpython3.1; perhaps
- # LD_LIBRARY_PATH is being discarded somewhere?)
- #
- # test_http*
- # I've seen occasional hangs in some http tests when running the test suite
- # inside Koji on Python 3. For that reason I exclude them
- #
- # test_openpty:
- # Fails in Koji, possibly due to a mock issue (rhbz#714627)
- # test test_openpty failed -- Traceback (most recent call last):
- # File "/builddir/build/BUILD/Python-3.2/Lib/test/test_openpty.py",
line 12, in test
- # master, slave = os.openpty()
- # OSError: [Errno 2] No such file or directory
- #
- # test_pty:
- # Fails in Koji, possibly due to a mock issue (rhbz#714627)
- # test test_pty failed -- Traceback (most recent call last):
- # File "/builddir/build/BUILD/Python-3.2/Lib/test/test_pty.py", line
114, in test_fork
- # pid, master_fd = pty.fork()
- # File "/builddir/build/BUILD/Python-3.2/Lib/pty.py", line 107, in
fork
- # master_fd, slave_fd = openpty()
- # File "/builddir/build/BUILD/Python-3.2/Lib/pty.py", line 29, in
openpty
- # master_fd, slave_name = _open_terminal()
- # File "/builddir/build/BUILD/Python-3.2/Lib/pty.py", line 70, in
_open_terminal
- # raise os.error('out of pty devices')
- # OSError: out of pty devices
- #
- # test_socket:
- # test_socket.py:testSockName can fail here if DNS isn't properly set up:
- # my_ip_addr = socket.gethostbyname(socket.gethostname())
- # socket.gaierror: [Errno -2] Name or service not known
- #
- # test_telnet:
- # can get a "socket.error: [Errno 104] Connection reset by peer"
- #
- # Some additional tests fail when running the test suite as non-root outside of
- # the build, due to permissions issues.
-
-%ifarch %{sparc}
- EXCLUDED_TESTS="\
- test_distutils \
- test_httplib \
- test_http_cookies \
- test_openpty \
- test_pty.py \
- test_socket \
- test_telnet \
- test_ctypes \
- test_openpty \
- test_pty \
- %{nil}"
-%else
- EXCLUDED_TESTS="\
- test_distutils \
- test_httplib \
- test_http_cookies \
- test_openpty \
- test_pty.py \
- test_socket \
- test_telnet \
- %{nil}"
-%endif
# Note that we're running the tests using the version of the code in the builddir,
# not in the buildroot.
- # Run the upstream test suite
+ # Run the upstream test suite, setting "WITHIN_PYTHON_RPM_BUILD" so that the
+ # our non-standard decorators take effect on the relevant tests:
+ # @unittest._skipInRpmBuild(reason)
+ # @unittest._expectedFailureInRpmBuild
+ WITHIN_PYTHON_RPM_BUILD= \
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- --verbose --findleaks \
- -x $EXCLUDED_TESTS
+ --verbose --findleaks
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1308,6 +1316,12 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Sat Sep 10 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-2
+- rewrite of "check", introducing downstream-only hooks for skipping specific
+cases in an rpmbuild (patch 132), and fixing/skipping failing tests in a more
+fine-grained manner than before; (patches 106, 133-142 sparsely, moving
+patches for consistency with python.spec: 128 to 134, 126 to 135, 127 to 141)
+
* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
- 3.2.2
commit 06b3c5b484f6d685b4535e1a652dc6611bef3e14
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Sep 6 12:44:03 2011 -0400
3.2.2
diff --git a/.gitignore b/.gitignore
index 7844dc9..ec6198e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ Python-3.2a1.tar.bz2
/Python-3.2rc3.tar.bz2
/Python-3.2.tar.bz2
/Python-3.2.1.tar.bz2
+/Python-3.2.2.tar.bz2
diff --git a/python3.spec b/python3.spec
index 5cbdd8c..aa537ef 100644
--- a/python3.spec
+++ b/python3.spec
@@ -117,8 +117,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.1
-Release: 7%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -1308,6 +1308,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Sep 6 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.2-1
+- 3.2.2
+
* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
- run selftests with "--verbose"
- disable parts of test_io on ppc (rhbz#732998)
diff --git a/sources b/sources
index b583b29..ba6917c 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-f0869ba3f3797aacb1f954ef24c256f3 Python-3.2.1.tar.bz2
+9d763097a13a59ff53428c9e4d098a05 Python-3.2.2.tar.bz2
commit 28391cb8f7ca7456115eb2a853f0b57775e7d1eb
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Thu Sep 1 18:43:09 2011 -0400
run selftests with "--verbose"; disable parts of test_io on ppc
(rhbz#732998)
diff --git a/python-2.7.2-disable-tests-in-test_io.patch
b/python-2.7.2-disable-tests-in-test_io.patch
new file mode 100644
index 0000000..d81a2d0
--- /dev/null
+++ b/python-2.7.2-disable-tests-in-test_io.patch
@@ -0,0 +1,11 @@
+diff -up Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io
Python-2.7.2/Lib/test/test_io.py
+--- Python-2.7.2/Lib/test/test_io.py.disable-tests-in-test_io 2011-09-01
14:18:45.963304089 -0400
++++ Python-2.7.2/Lib/test/test_io.py 2011-09-01 15:08:53.796098413 -0400
+@@ -2669,6 +2669,7 @@ class SignalsTest(unittest.TestCase):
+ self.check_interrupted_read_retry(lambda x: x,
+ mode="r")
+
++ @unittest.skip('rhbz#732998')
+ @unittest.skipUnless(threading, 'Threading required for this test.')
+ def check_interrupted_write_retry(self, item, **fdopen_kwargs):
+ """Check that a buffered write, when it gets interrupted (either
diff --git a/python3.spec b/python3.spec
index bdd45ce..5cbdd8c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
@@ -271,6 +271,12 @@ Patch129:
python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
# Sent upstream as
http://bugs.python.org/issue12872
Patch130: python-2.7.2-tsc-on-ppc.patch
+# The four tests in test_io built on top of check_interrupted_write_retry
+# fail when built in Koji, for ppc and ppc64; for some reason, the SIGALRM
+# handlers are never called, and the call to write runs to completion
+# (rhbz#732998)
+Patch131: python-2.7.2-disable-tests-in-test_io.patch
+
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
@@ -431,6 +437,10 @@ rm -r Modules/zlib || exit 1
%patch129 -p1
%patch130 -p1 -b .tsc-on-ppc
+%ifarch ppc ppc64
+%patch131 -p1
+%endif
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -910,7 +920,7 @@ CheckPython() {
# Run the upstream test suite
LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
- --verbose3 --findleaks \
+ --verbose --findleaks \
-x $EXCLUDED_TESTS
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1298,6 +1308,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Sep 1 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-7
+- run selftests with "--verbose"
+- disable parts of test_io on ppc (rhbz#732998)
+
* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
- use "--findleaks --verbose3" when running test suite
commit d0528e355d3dd5fc59584aff3f94c0ce64c8fbd5
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Aug 31 17:57:50 2011 -0400
patch 130 now reported upstream
diff --git a/python3.spec b/python3.spec
index 3a8fc62..bdd45ce 100644
--- a/python3.spec
+++ b/python3.spec
@@ -268,7 +268,7 @@ Patch129:
python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
# aliasing violations (rhbz#698726)
-# Not yet sent upstream
+# Sent upstream as
http://bugs.python.org/issue12872
Patch130: python-2.7.2-tsc-on-ppc.patch
# This is the generated patch to "configure"; see the description of
commit 9a778ac8c78dfff521c676058471ab94596bc344
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Aug 31 15:08:01 2011 -0400
use "--findleaks --verbose3" when running test suite
diff --git a/python3.spec b/python3.spec
index 7e8d2d1..3a8fc62 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
@@ -909,7 +909,9 @@ CheckPython() {
# not in the buildroot.
# Run the upstream test suite
- LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest -x $EXCLUDED_TESTS
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest \
+ --verbose3 --findleaks \
+ -x $EXCLUDED_TESTS
echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
@@ -1296,6 +1298,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Wed Aug 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-6
+- use "--findleaks --verbose3" when running test suite
+
* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
ppc to avoid aliasing violations (patch 130; rhbz#698726)
commit ceb359a69b285160f7997c0b77de1dfd3567e80e
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Aug 23 16:48:59 2011 -0400
ppc --with-tsc fixes
re-enable and fix the --with-tsc option on ppc64, and rework it on
32-bit ppc to avoid aliasing violations (patch 129; rhbz#698726)
diff --git a/python-2.7.2-tsc-on-ppc.patch b/python-2.7.2-tsc-on-ppc.patch
new file mode 100644
index 0000000..447c6e3
--- /dev/null
+++ b/python-2.7.2-tsc-on-ppc.patch
@@ -0,0 +1,58 @@
+diff -up Python-2.7.2/Python/ceval.c.tsc-on-ppc Python-2.7.2/Python/ceval.c
+--- Python-2.7.2/Python/ceval.c.tsc-on-ppc 2011-08-23 14:59:48.051300849 -0400
++++ Python-2.7.2/Python/ceval.c 2011-08-23 15:33:25.412162902 -0400
+@@ -37,24 +37,42 @@ typedef unsigned long long uint64;
+ */
+ #if defined(__ppc__) || defined (__powerpc__)
+
+-#define READ_TIMESTAMP(var) ppc_getcounter(&var)
++#if defined( __powerpc64__) || defined(__LP64__)
++/* 64-bit PowerPC */
++#define READ_TIMESTAMP(var) ppc64_getcounter(&var)
++static void
++ppc64_getcounter(uint64 *v)
++{
++ /* On 64-bit PowerPC we can read the 64-bit timebase directly into a
++ 64-bit register */
++ uint64 timebase;
++#ifdef _ARCH_PWR4
++ asm volatile ("mfspr %0,268" : "=r" (timebase));
++#else
++ asm volatile ("mftb %0" : "=r" (timebase));
++#endif
++ *v = timebase;
++}
++
++#else
++/* 32-bit PowerPC */
++#define READ_TIMESTAMP(var) ppc32_getcounter(&var)
+
+ static void
+-ppc_getcounter(uint64 *v)
++ppc32_getcounter(uint64 *v)
+ {
+- register unsigned long tbu, tb, tbu2;
++ union { long long ll; long ii[2]; } u;
++ long tmp;
+
+ loop:
+- asm volatile ("mftbu %0" : "=r" (tbu) );
+- asm volatile ("mftb %0" : "=r" (tb) );
+- asm volatile ("mftbu %0" : "=r" (tbu2));
+- if (__builtin_expect(tbu != tbu2, 0)) goto loop;
+-
+- /* The slightly peculiar way of writing the next lines is
+- compiled better by GCC than any other way I tried. */
+- ((long*)(v))[0] = tbu;
+- ((long*)(v))[1] = tb;
++ asm volatile ("mftbu %0" : "=r" (u.ii[0]) );
++ asm volatile ("mftb %0" : "=r" (u.ii[1]) );
++ asm volatile ("mftbu %0" : "=r" (tmp));
++ if (__builtin_expect(u.ii[0] != tmp, 0)) goto loop;
++
++ *v = u.ll;
+ }
++#endif /* powerpc 32/64 bit */
+
+ #elif defined(__i386__)
+
diff --git a/python3.spec b/python3.spec
index ac30460..7e8d2d1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -266,6 +266,11 @@ Patch128: python-3.2b2-test_sys-COUNT_ALLOCS.patch
# Not yet sent upstream
Patch129: python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
+# Fix the --with-tsc option on ppc64, and rework it on 32-bit ppc to avoid
+# aliasing violations (rhbz#698726)
+# Not yet sent upstream
+Patch130: python-2.7.2-tsc-on-ppc.patch
+
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
@@ -424,6 +429,7 @@ rm -r Modules/zlib || exit 1
%patch127 -p1
%patch128 -p1
%patch129 -p1
+%patch130 -p1 -b .tsc-on-ppc
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -536,7 +542,7 @@ BuildPython() {
BuildPython debug \
python-debug \
python%{pybasever}-debug \
-%ifarch %{ix86} x86_64 ppc
+%ifarch %{ix86} x86_64 ppc ppc64
"--with-pydebug --with-tsc --with-count-allocs --with-call-profile" \
%else
"--with-pydebug --with-count-allocs --with-call-profile" \
@@ -1290,6 +1296,10 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-5
+- re-enable and fix the --with-tsc option on ppc64, and rework it on 32-bit
+ppc to avoid aliasing violations (patch 130; rhbz#698726)
+
* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
commit 4763ff864f559286fdcf5090d30db55311119ecb
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Aug 23 14:24:14 2011 -0400
don't use --with-tsc on ppc64 debug builds (rhbz#698726)
diff --git a/python3.spec b/python3.spec
index b20430c..ac30460 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -536,7 +536,7 @@ BuildPython() {
BuildPython debug \
python-debug \
python%{pybasever}-debug \
-%ifarch %{ix86} x86_64 ppc ppc64
+%ifarch %{ix86} x86_64 ppc
"--with-pydebug --with-tsc --with-count-allocs --with-call-profile" \
%else
"--with-pydebug --with-count-allocs --with-call-profile" \
@@ -1290,6 +1290,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Tue Aug 23 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-4
+- don't use --with-tsc on ppc64 debug builds (rhbz#698726)
+
* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
- add %%python3_version to the rpm macros (rhbz#719082)
commit bd4f5e9a13e0c07f2c32bdcba465766e772f720e
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Aug 22 15:38:24 2011 -0400
Fix comments within specfile (rhbz#732475)
diff --git a/python3.spec b/python3.spec
index 7c9246c..b20430c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -757,6 +757,7 @@ LD_LIBRARY_PATH=. /usr/lib/rpm/brp-python-bytecompile ./python
find %{buildroot} \
-perm 555 -exec chmod 755 {} \;
+# Install macros for rpm:
mkdir -p %{buildroot}/%{_sysconfdir}/rpm
install -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/rpm
install -m 644 %{SOURCE3} %{buildroot}/%{_sysconfdir}/rpm
@@ -932,9 +933,6 @@ rm -fr %{buildroot}
%postun libs -p /sbin/ldconfig
-# ======================================================
-# Manifests of the various subpackages
-# ======================================================
%files
%defattr(-, root, root)
commit 65e90f617be391c7453dd0241e828b9f8f5cf5a1
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Thu Aug 18 14:17:41 2011 -0400
add %python3_version to the rpm macros (rhbz#719082)
diff --git a/macros.python3 b/macros.python3
index 2b41d24..d6d913c 100644
--- a/macros.python3
+++ b/macros.python3
@@ -1,4 +1,5 @@
%__python3 /usr/bin/python3
%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
+%python3_version %(%{__python3} -c "import sys;
sys.stdout.write(sys.version[:3])")
%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
diff --git a/python3.spec b/python3.spec
index 5ff3866..7c9246c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
@@ -1292,6 +1292,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Thu Aug 18 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-3
+- add %%python3_version to the rpm macros (rhbz#719082)
+
* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
- disable some tests on sparc arches
commit cdc1710678a6046df530e056b4f1eefa9396d11d
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Mon Jul 11 21:18:56 2011 -0500
disable failing tests on sparc
diff --git a/python3.spec b/python3.spec
index bf7802e..5ff3866 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
@@ -874,6 +874,7 @@ CheckPython() {
# Some additional tests fail when running the test suite as non-root outside of
# the build, due to permissions issues.
+%ifarch %{sparc}
EXCLUDED_TESTS="\
test_distutils \
test_httplib \
@@ -882,8 +883,21 @@ CheckPython() {
test_pty.py \
test_socket \
test_telnet \
+ test_ctypes \
+ test_openpty \
+ test_pty \
%{nil}"
-
+%else
+ EXCLUDED_TESTS="\
+ test_distutils \
+ test_httplib \
+ test_http_cookies \
+ test_openpty \
+ test_pty.py \
+ test_socket \
+ test_telnet \
+ %{nil}"
+%endif
# Note that we're running the tests using the version of the code in the builddir,
# not in the buildroot.
@@ -1278,6 +1292,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jul 11 2011 Dennis Gilmore <dennis(a)ausil.us> - 3.2.1-2
+- disable some tests on sparc arches
+
* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
of static library build (due to Modules/_testembed; patch 6), autotool
commit cce760d4acd37396d12d0db2fe1d3be461e8f160
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Jul 11 12:04:52 2011 -0400
3.2.1
3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
of static library build (due to Modules/_testembed; patch 6), autotool
intermediates (patch 300)
diff --git a/.gitignore b/.gitignore
index 8883189..7844dc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ Python-3.2a1.tar.bz2
/Python-3.2rc2.tar.bz2
/Python-3.2rc3.tar.bz2
/Python-3.2.tar.bz2
+/Python-3.2.1.tar.bz2
diff --git a/autotool-intermediates.patch b/autotool-intermediates.patch
index f1c15e0..4a265a0 100644
--- a/autotool-intermediates.patch
+++ b/autotool-intermediates.patch
@@ -1,100 +1,7 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2011-02-21 10:38:12.253957171 -0500
-+++ ./configure 2011-02-21 10:38:17.476956303 -0500
-@@ -1,14 +1,14 @@
- #! /bin/sh
--# From configure.in Revision: 88430 .
-+# From configure.in Revision: 88440 .
- # Guess values for system-dependent variables and create Makefiles.
--# Generated by GNU Autoconf 2.68 for python 3.2.
-+# Generated by GNU Autoconf 2.65 for python 3.2.
- #
- # Report bugs to <
http://bugs.python.org/>.
- #
- #
- # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
--# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
--# Foundation, Inc.
-+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-+# Inc.
- #
- #
- # This configure script is free software; the Free Software Foundation
-@@ -92,7 +92,6 @@ fi
- IFS=" "" $as_nl"
-
- # Find who we are. Look in the path if we contain no directory separator.
--as_myself=
- case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -218,18 +217,11 @@ IFS=$as_save_IFS
- # We cannot yet assume a decent shell, so we have to provide a
- # neutralization value for shells without unset; and this also
- # works around shells that cannot unset nonexistent variables.
-- # Preserve -v and -x to the replacement shell.
- BASH_ENV=/dev/null
- ENV=/dev/null
- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
- export CONFIG_SHELL
-- case $- in # ((((
-- *v*x* | *x*v* ) as_opts=-vx ;;
-- *v* ) as_opts=-v ;;
-- *x* ) as_opts=-x ;;
-- * ) as_opts= ;;
-- esac
-- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
-+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
- fi
-
- if test x$as_have_required = xno; then :
-@@ -328,7 +320,7 @@ $as_echo X"$as_dir" |
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
-- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
-+ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
-
-
- } # as_fn_mkdir_p
-@@ -368,19 +360,19 @@ else
- fi # as_fn_arith
-
-
--# as_fn_error STATUS ERROR [LINENO LOG_FD]
--# ----------------------------------------
-+# as_fn_error ERROR [LINENO LOG_FD]
-+# ---------------------------------
- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
- # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
--# script with STATUS, using 1 if that was 0.
-+# script with status $?, using 1 if that was 0.
- as_fn_error ()
- {
-- as_status=$1; test $as_status -eq 0 && as_status=1
-- if test "$4"; then
-- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-+ as_status=$?; test $as_status -eq 0 && as_status=1
-+ if test "$3"; then
-+ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
- fi
-- $as_echo "$as_me: error: $2" >&2
-+ $as_echo "$as_me: error: $1" >&2
- as_fn_exit $as_status
- } # as_fn_error
-
-@@ -542,7 +534,7 @@ test -n "$DJDIR" || exec 7<&0 </dev/null
- exec 6>&1
-
- # Name of the host.
--# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
- # so uname gets run too.
- ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-@@ -619,6 +611,8 @@ TRUE
+--- ./configure.autotool-intermediates 2011-07-11 11:50:06.910425999 -0400
++++ ./configure 2011-07-11 11:50:13.492426001 -0400
+@@ -619,6 +619,8 @@ TRUE
MACHDEP_OBJS
DYNLOADFILE
DLINCLDIR
@@ -103,7 +10,7 @@ diff -up ./configure.autotool-intermediates ./configure
THREADOBJ
LDLAST
USE_THREAD_MODULE
-@@ -757,8 +751,11 @@ with_thread
+@@ -764,8 +766,11 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -115,155 +22,17 @@ diff -up ./configure.autotool-intermediates ./configure
with_fpectl
with_libm
with_libc
-@@ -837,9 +834,8 @@ do
- fi
-
- case $ac_option in
-- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-- *=) ac_optarg= ;;
-- *) ac_optarg=yes ;;
-+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-+ *) ac_optarg=yes ;;
- esac
+@@ -781,7 +786,8 @@ CFLAGS
+ LDFLAGS
+ LIBS
+ CPPFLAGS
+-CPP'
++CPP
++CPPFLAGS'
- # Accept the important Cygnus configure options, so we can diagnose typos.
-@@ -884,7 +880,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid feature name: $ac_useropt"
-+ as_fn_error "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -910,7 +906,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid feature name: $ac_useropt"
-+ as_fn_error "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -1114,7 +1110,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid package name: $ac_useropt"
-+ as_fn_error "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -1130,7 +1126,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid package name: $ac_useropt"
-+ as_fn_error "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -1160,8 +1156,8 @@ do
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-- -*) as_fn_error $? "unrecognized option: \`$ac_option'
--Try \`$0 --help' for more information"
-+ -*) as_fn_error "unrecognized option: \`$ac_option'
-+Try \`$0 --help' for more information."
- ;;
-
- *=*)
-@@ -1169,7 +1165,7 @@ Try \`$0 --help' for more information"
- # Reject names that are not valid shell variable names.
- case $ac_envvar in #(
- '' | [0-9]* | *[!_$as_cr_alnum]* )
-- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
-+ as_fn_error "invalid variable name: \`$ac_envvar'" ;;
- esac
- eval $ac_envvar=\$ac_optarg
- export $ac_envvar ;;
-@@ -1179,7 +1175,7 @@ Try \`$0 --help' for more information"
- $as_echo "$as_me: WARNING: you should use --build, --host, --target"
>&2
- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null
&&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-- : "${build_alias=$ac_option} ${host_alias=$ac_option}
${target_alias=$ac_option}"
-+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
- ;;
-
- esac
-@@ -1187,13 +1183,13 @@ done
-
- if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-- as_fn_error $? "missing argument to $ac_option"
-+ as_fn_error "missing argument to $ac_option"
- fi
-
- if test -n "$ac_unrecognized_opts"; then
- case $enable_option_checking in
- no) ;;
-- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-+ fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options:
$ac_unrecognized_opts" >&2 ;;
- esac
- fi
-@@ -1216,7 +1212,7 @@ do
- [\\/$]* | ?:[\\/]* ) continue;;
- NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
- esac
-- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-+ as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
- done
-
- # There might be people who depend on the old broken behavior: `$host'
-@@ -1230,8 +1226,8 @@ target=$target_alias
- if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
-- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use
--host.
-- If a cross compiler is detected then cross compile mode will be used"
>&2
-+ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use
--host.
-+ If a cross compiler is detected then cross compile mode will be used."
>&2
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-@@ -1246,9 +1242,9 @@ test "$silent" = yes && exec 6>/dev/null
- ac_pwd=`pwd` && test -n "$ac_pwd" &&
- ac_ls_di=`ls -di .` &&
- ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-- as_fn_error $? "working directory cannot be determined"
-+ as_fn_error "working directory cannot be determined"
- test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-- as_fn_error $? "pwd does not report name of working directory"
-+ as_fn_error "pwd does not report name of working directory"
-
-
- # Find the source files, if location was not specified.
-@@ -1287,11 +1283,11 @@ else
- fi
- if test ! -r "$srcdir/$ac_unique_file"; then
- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or
.."
-- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-+ as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
- fi
- ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
- ac_abs_confdir=`(
-- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
$? "$ac_msg"
-+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
"$ac_msg"
- pwd)`
- # When building in place, set srcdir=.
- if test "$ac_abs_confdir" = "$ac_pwd"; then
-@@ -1331,7 +1327,7 @@ Configuration:
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
-- -q, --quiet, --silent do not print \`checking ...' messages
-+ -q, --quiet, --silent do not print \`checking...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
-@@ -1430,8 +1426,11 @@ Optional Packages:
+ # Initialize some variables set by options.
+@@ -1437,8 +1443,11 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -275,1747 +44,7 @@ diff -up ./configure.autotool-intermediates ./configure
--with-fpectl enable SIGFPE catching
--with-libm=STRING math library
--with-libc=STRING C library
-@@ -1517,9 +1516,9 @@ test -n "$ac_init_help" && exit $ac_stat
- if $ac_init_version; then
- cat <<\_ACEOF
- python configure 3.2
--generated by GNU Autoconf 2.68
-+generated by GNU Autoconf 2.65
-
--Copyright (C) 2010 Free Software Foundation, Inc.
-+Copyright (C) 2009 Free Software Foundation, Inc.
- This configure script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it.
- _ACEOF
-@@ -1563,7 +1562,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
- fi
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
- as_fn_set_status $ac_retval
-
- } # ac_fn_c_try_compile
-@@ -1589,7 +1588,7 @@ $as_echo "$ac_try_echo"; } >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-- test $ac_status = 0; } > conftest.i && {
-+ test $ac_status = 0; } >/dev/null && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
-@@ -1600,7 +1599,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
- fi
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
- as_fn_set_status $ac_retval
-
- } # ac_fn_c_try_cpp
-@@ -1613,10 +1612,10 @@ fi
- ac_fn_c_check_header_mongrel ()
- {
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- if eval \${$3+:} false; then :
-+ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval \${$3+:} false; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- fi
- eval ac_res=\$$3
-@@ -1652,7 +1651,7 @@ if ac_fn_c_try_cpp "$LINENO"; then :
- else
- ac_header_preproc=no
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc"
>&5
- $as_echo "$ac_header_preproc" >&6; }
-
-@@ -1675,15 +1674,17 @@ $as_echo "$as_me: WARNING: $2: see the A
- $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be
Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the
compiler's result" >&5
- $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result"
>&2;}
--( $as_echo "## -------------------------------------- ##
-+( cat <<\_ASBOX
-+## -------------------------------------- ##
- ## Report this to
http://bugs.python.org/ ##
--## -------------------------------------- ##"
-+## -------------------------------------- ##
-+_ASBOX
- ) | sed "s/^/$as_me: WARNING: /" >&2
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval \${$3+:} false; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=\$ac_header_compiler"
-@@ -1692,7 +1693,7 @@ eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
- fi
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_check_header_mongrel
-
-@@ -1733,7 +1734,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=$ac_status
- fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
- as_fn_set_status $ac_retval
-
- } # ac_fn_c_try_run
-@@ -1747,7 +1748,7 @@ ac_fn_c_check_header_compile ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval \${$3+:} false; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -1765,7 +1766,7 @@ fi
- eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_check_header_compile
-
-@@ -1810,7 +1811,7 @@ fi
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
- as_fn_set_status $ac_retval
-
- } # ac_fn_c_try_link
-@@ -1824,7 +1825,7 @@ ac_fn_c_check_type ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval \${$3+:} false; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=no"
-@@ -1865,7 +1866,7 @@ fi
- eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_check_type
-
-@@ -1878,7 +1879,7 @@ ac_fn_c_find_uintX_t ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
- $as_echo_n "checking for uint$2_t... " >&6; }
--if eval \${$3+:} false; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=no"
-@@ -1908,7 +1909,8 @@ if ac_fn_c_try_compile "$LINENO"; then :
- esac
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-- if eval test \"x\$"$3"\" = x"no"; then :
-+ eval as_val=\$$3
-+ if test "x$as_val" = x""no; then :
-
- else
- break
-@@ -1918,7 +1920,7 @@ fi
- eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_find_uintX_t
-
-@@ -1931,7 +1933,7 @@ ac_fn_c_find_intX_t ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
- $as_echo_n "checking for int$2_t... " >&6; }
--if eval \${$3+:} false; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=no"
-@@ -1942,11 +1944,11 @@ else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h. */
- $ac_includes_default
-- enum { N = $2 / 2 - 1 };
- int
- main ()
- {
--static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) <<
N) - 1) * 2 + 1))];
-+static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
-+ 0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
- test_array [0] = 0
-
- ;
-@@ -1957,11 +1959,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h. */
- $ac_includes_default
-- enum { N = $2 / 2 - 1 };
- int
- main ()
- {
--static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) -
1) * 2 + 1)
-+static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
-+ ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
- < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
- test_array [0] = 0
-
-@@ -1982,7 +1984,8 @@ fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-- if eval test \"x\$"$3"\" = x"no"; then :
-+ eval as_val=\$$3
-+ if test "x$as_val" = x""no; then :
-
- else
- break
-@@ -1992,7 +1995,7 @@ fi
- eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_find_intX_t
-
-@@ -2169,7 +2172,7 @@ rm -f core *.core core.conftest.* gmon.o
- rm -f conftest.val
-
- fi
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
- as_fn_set_status $ac_retval
-
- } # ac_fn_c_compute_int
-@@ -2182,7 +2185,7 @@ ac_fn_c_check_func ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval \${$3+:} false; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -2237,7 +2240,7 @@ fi
- eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_check_func
-
-@@ -2250,7 +2253,7 @@ ac_fn_c_check_member ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
- $as_echo_n "checking for $2.$3... " >&6; }
--if eval \${$4+:} false; then :
-+if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -2294,22 +2297,19 @@ fi
- eval ac_res=\$$4
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_check_member
-
--# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
--# ---------------------------------------------
--# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
--# accordingly.
-+# ac_fn_c_check_decl LINENO SYMBOL VAR
-+# ------------------------------------
-+# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
- ac_fn_c_check_decl ()
- {
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- as_decl_name=`echo $2|sed 's/ *(.*//'`
-- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/)
0& (/g'`
-- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is
declared" >&5
--$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
--if eval \${$3+:} false; then :
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared"
>&5
-+$as_echo_n "checking whether $2 is declared... " >&6; }
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -2318,12 +2318,8 @@ $4
- int
- main ()
- {
--#ifndef $as_decl_name
--#ifdef __cplusplus
-- (void) $as_decl_use;
--#else
-- (void) $as_decl_name;
--#endif
-+#ifndef $2
-+ (void) $2;
- #endif
-
- ;
-@@ -2340,7 +2336,7 @@ fi
- eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
-
- } # ac_fn_c_check_decl
- cat >config.log <<_ACEOF
-@@ -2348,7 +2344,7 @@ This file contains any messages produced
- running configure, to aid debugging if configure makes a mistake.
-
- It was created by python $as_me 3.2, which was
--generated by GNU Autoconf 2.68. Invocation command line was
-+generated by GNU Autoconf 2.65. Invocation command line was
-
- $ $0 $@
-
-@@ -2458,9 +2454,11 @@ trap 'exit_status=$?
- {
- echo
-
-- $as_echo "## ---------------- ##
-+ cat <<\_ASBOX
-+## ---------------- ##
- ## Cache variables. ##
--## ---------------- ##"
-+## ---------------- ##
-+_ASBOX
- echo
- # The following way of writing the cache mishandles newlines in values,
- (
-@@ -2494,9 +2492,11 @@ $as_echo "$as_me: WARNING: cache variabl
- )
- echo
-
-- $as_echo "## ----------------- ##
-+ cat <<\_ASBOX
-+## ----------------- ##
- ## Output variables. ##
--## ----------------- ##"
-+## ----------------- ##
-+_ASBOX
- echo
- for ac_var in $ac_subst_vars
- do
-@@ -2509,9 +2509,11 @@ $as_echo "$as_me: WARNING: cache variabl
- echo
-
- if test -n "$ac_subst_files"; then
-- $as_echo "## ------------------- ##
-+ cat <<\_ASBOX
-+## ------------------- ##
- ## File substitutions. ##
--## ------------------- ##"
-+## ------------------- ##
-+_ASBOX
- echo
- for ac_var in $ac_subst_files
- do
-@@ -2525,9 +2527,11 @@ $as_echo "$as_me: WARNING: cache variabl
- fi
-
- if test -s confdefs.h; then
-- $as_echo "## ----------- ##
-+ cat <<\_ASBOX
-+## ----------- ##
- ## confdefs.h. ##
--## ----------- ##"
-+## ----------- ##
-+_ASBOX
- echo
- cat confdefs.h
- echo
-@@ -2582,12 +2586,7 @@ _ACEOF
- ac_site_file1=NONE
- ac_site_file2=NONE
- if test -n "$CONFIG_SITE"; then
-- # We do not want a PATH search for config.site.
-- case $CONFIG_SITE in #((
-- -*) ac_site_file1=./$CONFIG_SITE;;
-- */*) ac_site_file1=$CONFIG_SITE;;
-- *) ac_site_file1=./$CONFIG_SITE;;
-- esac
-+ ac_site_file1=$CONFIG_SITE
- elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
-@@ -2602,11 +2601,7 @@ do
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script
$ac_site_file" >&5
- $as_echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
-- . "$ac_site_file" \
-- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
--$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "failed to load site script $ac_site_file
--See \`config.log' for more details" "$LINENO" 5; }
-+ . "$ac_site_file"
- fi
- done
-
-@@ -2682,7 +2677,7 @@ if $ac_cache_corrupted; then
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can
compromise the build" >&5
- $as_echo "$as_me: error: changes in the environment can compromise the build"
>&2;}
-- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
-+ as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
- fi
- ## -------------------- ##
- ## Main body of script. ##
-@@ -2783,7 +2778,7 @@ if test "${enable_universalsdk+set}" = s
- UNIVERSALSDK=$enableval
- if test ! -d "${UNIVERSALSDK}"
- then
-- as_fn_error $? "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
-+ as_fn_error "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
- fi
- ;;
- esac
-@@ -3175,7 +3170,7 @@ $as_echo "$without_gcc" >&6; }
- # If the user switches compilers, we can't believe the cache
- if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" !=
"$ac_cv_prog_CC"
- then
-- as_fn_error $? "cached CC is different -- throw away $cache_file
-+ as_fn_error "cached CC is different -- throw away $cache_file
- (it is also a good idea to do 'make clean' before compiling)"
"$LINENO" 5
- fi
-
-@@ -3195,7 +3190,7 @@ if test -n "$ac_tool_prefix"; then
- set dummy ${ac_tool_prefix}gcc; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_CC+:} false; then :
-+if test "${ac_cv_prog_CC+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$CC"; then
-@@ -3235,7 +3230,7 @@ if test -z "$ac_cv_prog_CC"; then
- set dummy gcc; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_ac_ct_CC+:} false; then :
-+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$ac_ct_CC"; then
-@@ -3288,7 +3283,7 @@ if test -z "$CC"; then
- set dummy ${ac_tool_prefix}cc; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_CC+:} false; then :
-+if test "${ac_cv_prog_CC+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$CC"; then
-@@ -3328,7 +3323,7 @@ if test -z "$CC"; then
- set dummy cc; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_CC+:} false; then :
-+if test "${ac_cv_prog_CC+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$CC"; then
-@@ -3387,7 +3382,7 @@ if test -z "$CC"; then
- set dummy $ac_tool_prefix$ac_prog; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_CC+:} false; then :
-+if test "${ac_cv_prog_CC+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$CC"; then
-@@ -3431,7 +3426,7 @@ do
- set dummy $ac_prog; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_ac_ct_CC+:} false; then :
-+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$ac_ct_CC"; then
-@@ -3485,8 +3480,8 @@ fi
-
- test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}:
error: in \`$ac_pwd':" >&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "no acceptable C compiler found in \$PATH
--See \`config.log' for more details" "$LINENO" 5; }
-+as_fn_error "no acceptable C compiler found in \$PATH
-+See \`config.log' for more details." "$LINENO" 5; }
-
- # Provide some information about the compiler.
- $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version"
>&5
-@@ -3600,8 +3595,9 @@ sed 's/^/| /' conftest.$ac_ext >&5
-
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "C compiler cannot create executables
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "C compiler cannot create executables
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
- $as_echo "yes" >&6; }
-@@ -3643,8 +3639,8 @@ done
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "cannot compute suffix of executables: cannot compile and link
--See \`config.log' for more details" "$LINENO" 5; }
-+as_fn_error "cannot compute suffix of executables: cannot compile and link
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
- rm -f conftest conftest$ac_cv_exeext
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-@@ -3701,9 +3697,9 @@ $as_echo "$ac_try_echo"; } >&5
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "cannot run C compiled programs.
-+as_fn_error "cannot run C compiled programs.
- If you meant to cross compile, use \`--host'.
--See \`config.log' for more details" "$LINENO" 5; }
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
- fi
- fi
-@@ -3714,7 +3710,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_ex
- ac_clean_files=$ac_clean_files_save
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files"
>&5
- $as_echo_n "checking for suffix of object files... " >&6; }
--if ${ac_cv_objext+:} false; then :
-+if test "${ac_cv_objext+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -3754,8 +3750,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
-
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "cannot compute suffix of object files: cannot compile
--See \`config.log' for more details" "$LINENO" 5; }
-+as_fn_error "cannot compute suffix of object files: cannot compile
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
- rm -f conftest.$ac_cv_objext conftest.$ac_ext
- fi
-@@ -3765,7 +3761,7 @@ OBJEXT=$ac_cv_objext
- ac_objext=$OBJEXT
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C
compiler" >&5
- $as_echo_n "checking whether we are using the GNU C compiler... " >&6;
}
--if ${ac_cv_c_compiler_gnu+:} false; then :
-+if test "${ac_cv_c_compiler_gnu+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -3802,7 +3798,7 @@ ac_test_CFLAGS=${CFLAGS+set}
- ac_save_CFLAGS=$CFLAGS
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g"
>&5
- $as_echo_n "checking whether $CC accepts -g... " >&6; }
--if ${ac_cv_prog_cc_g+:} false; then :
-+if test "${ac_cv_prog_cc_g+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_save_c_werror_flag=$ac_c_werror_flag
-@@ -3880,7 +3876,7 @@ else
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO
C89" >&5
- $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
--if ${ac_cv_prog_cc_c89+:} false; then :
-+if test "${ac_cv_prog_cc_c89+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_cv_prog_cc_c89=no
-@@ -4015,7 +4011,7 @@ then
- set dummy g++; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_path_CXX+:} false; then :
-+if test "${ac_cv_path_CXX+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- case $CXX in
-@@ -4056,7 +4052,7 @@ fi
- set dummy c++; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_path_CXX+:} false; then :
-+if test "${ac_cv_path_CXX+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- case $CXX in
-@@ -4107,7 +4103,7 @@ do
- set dummy $ac_prog; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_CXX+:} false; then :
-+if test "${ac_cv_prog_CXX+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$CXX"; then
-@@ -4178,7 +4174,7 @@ if test -n "$CPP" && test -d "$CPP";
the
- CPP=
- fi
- if test -z "$CPP"; then
-- if ${ac_cv_prog_CPP+:} false; then :
-+ if test "${ac_cv_prog_CPP+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- # Double quotes because CPP needs to be expanded
-@@ -4208,7 +4204,7 @@ else
- # Broken: fails on valid input.
- continue
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
-@@ -4224,11 +4220,11 @@ else
- ac_preproc_ok=:
- break
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- done
- # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
--rm -f conftest.i conftest.err conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if $ac_preproc_ok; then :
- break
- fi
-@@ -4267,7 +4263,7 @@ else
- # Broken: fails on valid input.
- continue
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
-@@ -4283,18 +4279,18 @@ else
- ac_preproc_ok=:
- break
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- done
- # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
--rm -f conftest.i conftest.err conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if $ac_preproc_ok; then :
-
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
--See \`config.log' for more details" "$LINENO" 5; }
-+as_fn_error "C preprocessor \"$CPP\" fails sanity check
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
-
- ac_ext=c
-@@ -4306,7 +4302,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines
and -e" >&5
- $as_echo_n "checking for grep that handles long lines and -e... " >&6;
}
--if ${ac_cv_path_GREP+:} false; then :
-+if test "${ac_cv_path_GREP+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -z "$GREP"; then
-@@ -4355,7 +4351,7 @@ esac
- done
- IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
-- as_fn_error $? "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-+ as_fn_error "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
- else
- ac_cv_path_GREP=$GREP
-@@ -4369,7 +4365,7 @@ $as_echo "$ac_cv_path_GREP" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
- $as_echo_n "checking for egrep... " >&6; }
--if ${ac_cv_path_EGREP+:} false; then :
-+if test "${ac_cv_path_EGREP+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-@@ -4421,7 +4417,7 @@ esac
- done
- IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
-- as_fn_error $? "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-+ as_fn_error "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
- else
- ac_cv_path_EGREP=$EGREP
-@@ -4436,7 +4432,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files"
>&5
- $as_echo_n "checking for ANSI C header files... " >&6; }
--if ${ac_cv_header_stdc+:} false; then :
-+if test "${ac_cv_header_stdc+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -4553,7 +4549,8 @@ do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- ac_fn_c_check_header_compile "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default
- "
--if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-+eval as_val=\$$as_ac_Header
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
-@@ -4565,7 +4562,7 @@ done
-
-
- ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h"
"ac_cv_header_minix_config_h" "$ac_includes_default"
--if test "x$ac_cv_header_minix_config_h" = xyes; then :
-+if test "x$ac_cv_header_minix_config_h" = x""yes; then :
- MINIX=yes
- else
- MINIX=
-@@ -4587,7 +4584,7 @@ $as_echo "#define _MINIX 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define
__EXTENSIONS__" >&5
- $as_echo_n "checking whether it is safe to define __EXTENSIONS__... "
>&6; }
--if ${ac_cv_safe_to_define___extensions__+:} false; then :
-+if test "${ac_cv_safe_to_define___extensions__+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -4780,7 +4777,7 @@ $as_echo "$GNULD" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
- $as_echo_n "checking for inline... " >&6; }
--if ${ac_cv_c_inline+:} false; then :
-+if test "${ac_cv_c_inline+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_cv_c_inline=no
-@@ -4981,7 +4978,7 @@ if test -n "$ac_tool_prefix"; then
- set dummy ${ac_tool_prefix}ranlib; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_RANLIB+:} false; then :
-+if test "${ac_cv_prog_RANLIB+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$RANLIB"; then
-@@ -5021,7 +5018,7 @@ if test -z "$ac_cv_prog_RANLIB"; then
- set dummy ranlib; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$ac_ct_RANLIB"; then
-@@ -5075,7 +5072,7 @@ do
- set dummy $ac_prog; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_AR+:} false; then :
-+if test "${ac_cv_prog_AR+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$AR"; then
-@@ -5125,7 +5122,7 @@ fi
- set dummy svnversion; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_SVNVERSION+:} false; then :
-+if test "${ac_cv_prog_SVNVERSION+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$SVNVERSION"; then
-@@ -5176,22 +5173,16 @@ bsdos*|hp*|HP*)
- esac
- ac_aux_dir=
- for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-- if test -f "$ac_dir/install-sh"; then
-- ac_aux_dir=$ac_dir
-- ac_install_sh="$ac_aux_dir/install-sh -c"
-- break
-- elif test -f "$ac_dir/install.sh"; then
-- ac_aux_dir=$ac_dir
-- ac_install_sh="$ac_aux_dir/install.sh -c"
-- break
-- elif test -f "$ac_dir/shtool"; then
-- ac_aux_dir=$ac_dir
-- ac_install_sh="$ac_aux_dir/shtool install -c"
-- break
-- fi
-+ for ac_t in install-sh install.sh shtool; do
-+ if test -f "$ac_dir/$ac_t"; then
-+ ac_aux_dir=$ac_dir
-+ ac_install_sh="$ac_aux_dir/$ac_t -c"
-+ break 2
-+ fi
-+ done
- done
- if test -z "$ac_aux_dir"; then
-- as_fn_error $? "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
-+ as_fn_error "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
- fi
-
- # These three variables are undocumented and unsupported,
-@@ -5220,7 +5211,7 @@ ac_configure="$SHELL $ac_aux_dir/configu
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible
install" >&5
- $as_echo_n "checking for a BSD-compatible install... " >&6; }
- if test -z "$INSTALL"; then
--if ${ac_cv_path_install+:} false; then :
-+if test "${ac_cv_path_install+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -5406,7 +5397,7 @@ $as_echo_n "checking whether $CC accepts
- ac_save_cc="$CC"
- CC="$CC -fno-strict-aliasing"
- save_CFLAGS="$CFLAGS"
-- if ${ac_cv_no_strict_aliasing+:} false; then :
-+ if test "${ac_cv_no_strict_aliasing+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -5529,7 +5520,7 @@ $as_echo "$CC" >&6; }
- ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
-
- else
-- as_fn_error $? "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
-+ as_fn_error "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
-
- fi
-
-@@ -5662,7 +5653,7 @@ fi
- # options before we can check whether -Kpthread improves anything.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads are available
without options" >&5
- $as_echo_n "checking whether pthreads are available without options... "
>&6; }
--if ${ac_cv_pthread_is_default+:} false; then :
-+if test "${ac_cv_pthread_is_default+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -5715,7 +5706,7 @@ else
- # function available.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts
-Kpthread" >&5
- $as_echo_n "checking whether $CC accepts -Kpthread... " >&6; }
--if ${ac_cv_kpthread+:} false; then :
-+if test "${ac_cv_kpthread+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_save_cc="$CC"
-@@ -5764,7 +5755,7 @@ then
- # function available.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts
-Kthread" >&5
- $as_echo_n "checking whether $CC accepts -Kthread... " >&6; }
--if ${ac_cv_kthread+:} false; then :
-+if test "${ac_cv_kthread+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_save_cc="$CC"
-@@ -5813,7 +5804,7 @@ then
- # function available.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts
-pthread" >&5
- $as_echo_n "checking whether $CC accepts -pthread... " >&6; }
--if ${ac_cv_thread+:} false; then :
-+if test "${ac_cv_thread+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_save_cc="$CC"
-@@ -5898,7 +5889,7 @@ CXX="$ac_save_cxx"
- # checks for header files
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files"
>&5
- $as_echo_n "checking for ANSI C header files... " >&6; }
--if ${ac_cv_header_stdc+:} false; then :
-+if test "${ac_cv_header_stdc+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -6023,7 +6014,8 @@ bluetooth/bluetooth.h linux/tipc.h spawn
- do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- ac_fn_c_check_header_mongrel "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default"
--if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-+eval as_val=\$$as_ac_Header
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
-@@ -6037,7 +6029,7 @@ for ac_hdr in dirent.h sys/ndir.h sys/di
- as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines
DIR" >&5
- $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
--if eval \${$as_ac_Header+:} false; then :
-+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; };
then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -6064,7 +6056,8 @@ fi
- eval ac_res=\$$as_ac_Header
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-+eval as_val=\$$as_ac_Header
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
- _ACEOF
-@@ -6077,7 +6070,7 @@ done
- if test $ac_header_dirent = dirent.h; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing
opendir" >&5
- $as_echo_n "checking for library containing opendir... " >&6; }
--if ${ac_cv_search_opendir+:} false; then :
-+if test "${ac_cv_search_opendir+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_func_search_save_LIBS=$LIBS
-@@ -6111,11 +6104,11 @@ for ac_lib in '' dir; do
- fi
- rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
-- if ${ac_cv_search_opendir+:} false; then :
-+ if test "${ac_cv_search_opendir+set}" = set; then :
- break
- fi
- done
--if ${ac_cv_search_opendir+:} false; then :
-+if test "${ac_cv_search_opendir+set}" = set; then :
-
- else
- ac_cv_search_opendir=no
-@@ -6134,7 +6127,7 @@ fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing
opendir" >&5
- $as_echo_n "checking for library containing opendir... " >&6; }
--if ${ac_cv_search_opendir+:} false; then :
-+if test "${ac_cv_search_opendir+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_func_search_save_LIBS=$LIBS
-@@ -6168,11 +6161,11 @@ for ac_lib in '' x; do
- fi
- rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
-- if ${ac_cv_search_opendir+:} false; then :
-+ if test "${ac_cv_search_opendir+set}" = set; then :
- break
- fi
- done
--if ${ac_cv_search_opendir+:} false; then :
-+if test "${ac_cv_search_opendir+set}" = set; then :
-
- else
- ac_cv_search_opendir=no
-@@ -6192,7 +6185,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines
makedev" >&5
- $as_echo_n "checking whether sys/types.h defines makedev... " >&6; }
--if ${ac_cv_header_sys_types_h_makedev+:} false; then :
-+if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -6220,7 +6213,7 @@ $as_echo "$ac_cv_header_sys_types_h_make
-
- if test $ac_cv_header_sys_types_h_makedev = no; then
- ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h"
"ac_cv_header_sys_mkdev_h" "$ac_includes_default"
--if test "x$ac_cv_header_sys_mkdev_h" = xyes; then :
-+if test "x$ac_cv_header_sys_mkdev_h" = x""yes; then :
-
- $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h
-
-@@ -6230,7 +6223,7 @@ fi
-
- if test $ac_cv_header_sys_mkdev_h = no; then
- ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h"
"ac_cv_header_sys_sysmacros_h" "$ac_includes_default"
--if test "x$ac_cv_header_sys_sysmacros_h" = xyes; then :
-+if test "x$ac_cv_header_sys_sysmacros_h" = x""yes; then :
-
- $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h
-
-@@ -6250,7 +6243,7 @@ do :
- #endif
-
- "
--if test "x$ac_cv_header_term_h" = xyes; then :
-+if test "x$ac_cv_header_term_h" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_TERM_H 1
- _ACEOF
-@@ -6272,7 +6265,7 @@ do :
- #endif
-
- "
--if test "x$ac_cv_header_linux_netlink_h" = xyes; then :
-+if test "x$ac_cv_header_linux_netlink_h" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_LINUX_NETLINK_H 1
- _ACEOF
-@@ -6438,7 +6431,7 @@ EOF
-
- # Type availability checks
- ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t"
"$ac_includes_default"
--if test "x$ac_cv_type_mode_t" = xyes; then :
-+if test "x$ac_cv_type_mode_t" = x""yes; then :
-
- else
-
-@@ -6449,7 +6442,7 @@ _ACEOF
- fi
-
- ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t"
"$ac_includes_default"
--if test "x$ac_cv_type_off_t" = xyes; then :
-+if test "x$ac_cv_type_off_t" = x""yes; then :
-
- else
-
-@@ -6460,7 +6453,7 @@ _ACEOF
- fi
-
- ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t"
"$ac_includes_default"
--if test "x$ac_cv_type_pid_t" = xyes; then :
-+if test "x$ac_cv_type_pid_t" = x""yes; then :
-
- else
-
-@@ -6476,7 +6469,7 @@ cat >>confdefs.h <<_ACEOF
- _ACEOF
-
- ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t"
"$ac_includes_default"
--if test "x$ac_cv_type_size_t" = xyes; then :
-+if test "x$ac_cv_type_size_t" = x""yes; then :
-
- else
-
-@@ -6488,7 +6481,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h"
>&5
- $as_echo_n "checking for uid_t in sys/types.h... " >&6; }
--if ${ac_cv_type_uid_t+:} false; then :
-+if test "${ac_cv_type_uid_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -6567,7 +6560,7 @@ _ACEOF
- esac
-
- ac_fn_c_check_type "$LINENO" "ssize_t"
"ac_cv_type_ssize_t" "$ac_includes_default"
--if test "x$ac_cv_type_ssize_t" = xyes; then :
-+if test "x$ac_cv_type_ssize_t" = x""yes; then :
-
- $as_echo "#define HAVE_SSIZE_T 1" >>confdefs.h
-
-@@ -6582,7 +6575,7 @@ fi
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
- $as_echo_n "checking size of int... " >&6; }
--if ${ac_cv_sizeof_int+:} false; then :
-+if test "${ac_cv_sizeof_int+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))"
"ac_cv_sizeof_int" "$ac_includes_default"; then :
-@@ -6591,8 +6584,9 @@ else
- if test "$ac_cv_type_int" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (int)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (int)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_int=0
- fi
-@@ -6615,7 +6609,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
- $as_echo_n "checking size of long... " >&6; }
--if ${ac_cv_sizeof_long+:} false; then :
-+if test "${ac_cv_sizeof_long+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))"
"ac_cv_sizeof_long" "$ac_includes_default"; then :
-@@ -6624,8 +6618,9 @@ else
- if test "$ac_cv_type_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (long)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (long)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_long=0
- fi
-@@ -6648,7 +6643,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
- $as_echo_n "checking size of void *... " >&6; }
--if ${ac_cv_sizeof_void_p+:} false; then :
-+if test "${ac_cv_sizeof_void_p+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))"
"ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-@@ -6657,8 +6652,9 @@ else
- if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (void *)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (void *)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_void_p=0
- fi
-@@ -6681,7 +6677,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
- $as_echo_n "checking size of short... " >&6; }
--if ${ac_cv_sizeof_short+:} false; then :
-+if test "${ac_cv_sizeof_short+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))"
"ac_cv_sizeof_short" "$ac_includes_default"; then :
-@@ -6690,8 +6686,9 @@ else
- if test "$ac_cv_type_short" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (short)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (short)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_short=0
- fi
-@@ -6714,7 +6711,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
- $as_echo_n "checking size of float... " >&6; }
--if ${ac_cv_sizeof_float+:} false; then :
-+if test "${ac_cv_sizeof_float+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))"
"ac_cv_sizeof_float" "$ac_includes_default"; then :
-@@ -6723,8 +6720,9 @@ else
- if test "$ac_cv_type_float" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (float)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (float)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_float=0
- fi
-@@ -6747,7 +6745,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
- $as_echo_n "checking size of double... " >&6; }
--if ${ac_cv_sizeof_double+:} false; then :
-+if test "${ac_cv_sizeof_double+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))"
"ac_cv_sizeof_double" "$ac_includes_default"; then :
-@@ -6756,8 +6754,9 @@ else
- if test "$ac_cv_type_double" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (double)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (double)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_double=0
- fi
-@@ -6780,7 +6779,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fpos_t" >&5
- $as_echo_n "checking size of fpos_t... " >&6; }
--if ${ac_cv_sizeof_fpos_t+:} false; then :
-+if test "${ac_cv_sizeof_fpos_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fpos_t))"
"ac_cv_sizeof_fpos_t" "$ac_includes_default"; then :
-@@ -6789,8 +6788,9 @@ else
- if test "$ac_cv_type_fpos_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (fpos_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (fpos_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_fpos_t=0
- fi
-@@ -6813,7 +6813,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
- $as_echo_n "checking size of size_t... " >&6; }
--if ${ac_cv_sizeof_size_t+:} false; then :
-+if test "${ac_cv_sizeof_size_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))"
"ac_cv_sizeof_size_t" "$ac_includes_default"; then :
-@@ -6822,8 +6822,9 @@ else
- if test "$ac_cv_type_size_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (size_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (size_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_size_t=0
- fi
-@@ -6846,7 +6847,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pid_t" >&5
- $as_echo_n "checking size of pid_t... " >&6; }
--if ${ac_cv_sizeof_pid_t+:} false; then :
-+if test "${ac_cv_sizeof_pid_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pid_t))"
"ac_cv_sizeof_pid_t" "$ac_includes_default"; then :
-@@ -6855,8 +6856,9 @@ else
- if test "$ac_cv_type_pid_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (pid_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (pid_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_pid_t=0
- fi
-@@ -6906,7 +6908,7 @@ if test "$have_long_long" = yes ; then
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long"
>&5
- $as_echo_n "checking size of long long... " >&6; }
--if ${ac_cv_sizeof_long_long+:} false; then :
-+if test "${ac_cv_sizeof_long_long+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))"
"ac_cv_sizeof_long_long" "$ac_includes_default"; then :
-@@ -6915,8 +6917,9 @@ else
- if test "$ac_cv_type_long_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (long long)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (long long)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_long_long=0
- fi
-@@ -6967,7 +6970,7 @@ if test "$have_long_double" = yes ; then
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double"
>&5
- $as_echo_n "checking size of long double... " >&6; }
--if ${ac_cv_sizeof_long_double+:} false; then :
-+if test "${ac_cv_sizeof_long_double+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long
double))" "ac_cv_sizeof_long_double"
"$ac_includes_default"; then :
-@@ -6976,8 +6979,9 @@ else
- if test "$ac_cv_type_long_double" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (long double)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (long double)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_long_double=0
- fi
-@@ -7029,7 +7033,7 @@ if test "$have_c99_bool" = yes ; then
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of _Bool" >&5
- $as_echo_n "checking size of _Bool... " >&6; }
--if ${ac_cv_sizeof__Bool+:} false; then :
-+if test "${ac_cv_sizeof__Bool+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (_Bool))"
"ac_cv_sizeof__Bool" "$ac_includes_default"; then :
-@@ -7038,8 +7042,9 @@ else
- if test "$ac_cv_type__Bool" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (_Bool)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (_Bool)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof__Bool=0
- fi
-@@ -7065,7 +7070,7 @@ ac_fn_c_check_type "$LINENO" "uintptr_t"
- #include <inttypes.h>
- #endif
- "
--if test "x$ac_cv_type_uintptr_t" = xyes; then :
-+if test "x$ac_cv_type_uintptr_t" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_UINTPTR_T 1
-@@ -7077,7 +7082,7 @@ _ACEOF
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of uintptr_t"
>&5
- $as_echo_n "checking size of uintptr_t... " >&6; }
--if ${ac_cv_sizeof_uintptr_t+:} false; then :
-+if test "${ac_cv_sizeof_uintptr_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (uintptr_t))"
"ac_cv_sizeof_uintptr_t" "$ac_includes_default"; then :
-@@ -7086,8 +7091,9 @@ else
- if test "$ac_cv_type_uintptr_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (uintptr_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (uintptr_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_uintptr_t=0
- fi
-@@ -7113,7 +7119,7 @@ fi
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
- $as_echo_n "checking size of off_t... " >&6; }
--if ${ac_cv_sizeof_off_t+:} false; then :
-+if test "${ac_cv_sizeof_off_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))"
"ac_cv_sizeof_off_t" "
-@@ -7127,8 +7133,9 @@ else
- if test "$ac_cv_type_off_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (off_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (off_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_off_t=0
- fi
-@@ -7172,7 +7179,7 @@ fi
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
- $as_echo_n "checking size of time_t... " >&6; }
--if ${ac_cv_sizeof_time_t+:} false; then :
-+if test "${ac_cv_sizeof_time_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))"
"ac_cv_sizeof_time_t" "
-@@ -7189,8 +7196,9 @@ else
- if test "$ac_cv_type_time_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (time_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (time_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_time_t=0
- fi
-@@ -7247,7 +7255,7 @@ if test "$have_pthread_t" = yes ; then
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t"
>&5
- $as_echo_n "checking size of pthread_t... " >&6; }
--if ${ac_cv_sizeof_pthread_t+:} false; then :
-+if test "${ac_cv_sizeof_pthread_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))"
"ac_cv_sizeof_pthread_t" "
-@@ -7261,8 +7269,9 @@ else
- if test "$ac_cv_type_pthread_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (pthread_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (pthread_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_pthread_t=0
- fi
-@@ -7349,7 +7358,7 @@ fi
- MACOSX_DEFAULT_ARCH="ppc"
- ;;
- *)
-- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
-+ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
- ;;
- esac
- else
-@@ -7361,7 +7370,7 @@ fi
- MACOSX_DEFAULT_ARCH="ppc64"
- ;;
- *)
-- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
-+ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
- ;;
- esac
-
-@@ -7387,7 +7396,7 @@ $as_echo "#define WITH_NEXT_FRAMEWORK 1"
- $as_echo "yes" >&6; }
- if test $enable_shared = "yes"
- then
-- as_fn_error $? "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
-+ as_fn_error "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-@@ -7694,7 +7703,7 @@ $as_echo "$SHLIBS" >&6; }
- # checks for libraries
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl"
>&5
- $as_echo_n "checking for dlopen in -ldl... " >&6; }
--if ${ac_cv_lib_dl_dlopen+:} false; then :
-+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -7728,7 +7737,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen"
>&5
- $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
--if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBDL 1
- _ACEOF
-@@ -7739,7 +7748,7 @@ fi
- # Dynamic linking for SunOS/Solaris and SYSV
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld"
>&5
- $as_echo_n "checking for shl_load in -ldld... " >&6; }
--if ${ac_cv_lib_dld_shl_load+:} false; then :
-+if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -7773,7 +7782,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load"
>&5
- $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
--if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-+if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBDLD 1
- _ACEOF
-@@ -7787,7 +7796,7 @@ fi
- if test "$with_threads" = "yes" -o -z "$with_threads";
then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing
sem_init" >&5
- $as_echo_n "checking for library containing sem_init... " >&6; }
--if ${ac_cv_search_sem_init+:} false; then :
-+if test "${ac_cv_search_sem_init+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_func_search_save_LIBS=$LIBS
-@@ -7821,11 +7830,11 @@ for ac_lib in '' pthread rt posix4; do
- fi
- rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
-- if ${ac_cv_search_sem_init+:} false; then :
-+ if test "${ac_cv_search_sem_init+set}" = set; then :
- break
- fi
- done
--if ${ac_cv_search_sem_init+:} false; then :
-+if test "${ac_cv_search_sem_init+set}" = set; then :
-
- else
- ac_cv_search_sem_init=no
-@@ -7848,7 +7857,7 @@ fi
- # check if we need libintl for locale functions
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for textdomain in -lintl"
>&5
- $as_echo_n "checking for textdomain in -lintl... " >&6; }
--if ${ac_cv_lib_intl_textdomain+:} false; then :
-+if test "${ac_cv_lib_intl_textdomain+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -7882,7 +7891,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_textdomain"
>&5
- $as_echo "$ac_cv_lib_intl_textdomain" >&6; }
--if test "x$ac_cv_lib_intl_textdomain" = xyes; then :
-+if test "x$ac_cv_lib_intl_textdomain" = x""yes; then :
-
- $as_echo "#define WITH_LIBINTL 1" >>confdefs.h
-
-@@ -7929,7 +7938,7 @@ esac
- # Most SVR4 platforms (e.g. Solaris) need -lsocket and -lnsl.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for t_open in -lnsl"
>&5
- $as_echo_n "checking for t_open in -lnsl... " >&6; }
--if ${ac_cv_lib_nsl_t_open+:} false; then :
-+if test "${ac_cv_lib_nsl_t_open+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -7963,13 +7972,13 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_t_open"
>&5
- $as_echo "$ac_cv_lib_nsl_t_open" >&6; }
--if test "x$ac_cv_lib_nsl_t_open" = xyes; then :
-+if test "x$ac_cv_lib_nsl_t_open" = x""yes; then :
- LIBS="-lnsl $LIBS"
- fi
- # SVR4
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket"
>&5
- $as_echo_n "checking for socket in -lsocket... " >&6; }
--if ${ac_cv_lib_socket_socket+:} false; then :
-+if test "${ac_cv_lib_socket_socket+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -8003,7 +8012,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket"
>&5
- $as_echo "$ac_cv_lib_socket_socket" >&6; }
--if test "x$ac_cv_lib_socket_socket" = xyes; then :
-+if test "x$ac_cv_lib_socket_socket" = x""yes; then :
- LIBS="-lsocket $LIBS"
- fi
- # SVR4 sockets
-@@ -8029,7 +8038,7 @@ if test -n "$ac_tool_prefix"; then
- set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_path_PKG_CONFIG+:} false; then :
-+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- case $PKG_CONFIG in
-@@ -8072,7 +8081,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; the
- set dummy pkg-config; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
-+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- case $ac_pt_PKG_CONFIG in
-@@ -8183,12 +8192,12 @@ if test "${with_dbmliborder+set}" = set;
- withval=$with_dbmliborder;
- if test x$with_dbmliborder = xyes
- then
--as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
-+as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
- else
- for db in `echo $with_dbmliborder | sed 's/:/ /g'`; do
- if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb
- then
-- as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
-+ as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
- fi
- done
- fi
-@@ -8354,7 +8363,7 @@ $as_echo "$unistd_defines_pthreads" >&6;
- $as_echo "#define _REENTRANT 1" >>confdefs.h
-
- ac_fn_c_check_header_mongrel "$LINENO" "cthreads.h"
"ac_cv_header_cthreads_h" "$ac_includes_default"
--if test "x$ac_cv_header_cthreads_h" = xyes; then :
-+if test "x$ac_cv_header_cthreads_h" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- $as_echo "#define C_THREADS 1" >>confdefs.h
-@@ -8367,7 +8376,7 @@ $as_echo "#define HURD_C_THREADS 1" >>co
- else
-
- ac_fn_c_check_header_mongrel "$LINENO" "mach/cthreads.h"
"ac_cv_header_mach_cthreads_h" "$ac_includes_default"
--if test "x$ac_cv_header_mach_cthreads_h" = xyes; then :
-+if test "x$ac_cv_header_mach_cthreads_h" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- $as_echo "#define C_THREADS 1" >>confdefs.h
-@@ -8411,7 +8420,7 @@ else
-
- LIBS=$_libs
- ac_fn_c_check_func "$LINENO" "pthread_detach"
"ac_cv_func_pthread_detach"
--if test "x$ac_cv_func_pthread_detach" = xyes; then :
-+if test "x$ac_cv_func_pthread_detach" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- posix_threads=yes
-@@ -8420,7 +8429,7 @@ else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lpthreads" >&5
- $as_echo_n "checking for pthread_create in -lpthreads... " >&6; }
--if ${ac_cv_lib_pthreads_pthread_create+:} false; then :
-+if test "${ac_cv_lib_pthreads_pthread_create+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -8454,7 +8463,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_pthreads_pthread_create" >&5
- $as_echo "$ac_cv_lib_pthreads_pthread_create" >&6; }
--if test "x$ac_cv_lib_pthreads_pthread_create" = xyes; then :
-+if test "x$ac_cv_lib_pthreads_pthread_create" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- posix_threads=yes
-@@ -8464,7 +8473,7 @@ else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lc_r" >&5
- $as_echo_n "checking for pthread_create in -lc_r... " >&6; }
--if ${ac_cv_lib_c_r_pthread_create+:} false; then :
-+if test "${ac_cv_lib_c_r_pthread_create+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -8498,7 +8507,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_c_r_pthread_create" >&5
- $as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
--if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then :
-+if test "x$ac_cv_lib_c_r_pthread_create" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- posix_threads=yes
-@@ -8508,7 +8517,7 @@ else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_create_system
in -lpthread" >&5
- $as_echo_n "checking for __pthread_create_system in -lpthread... " >&6;
}
--if ${ac_cv_lib_pthread___pthread_create_system+:} false; then :
-+if test "${ac_cv_lib_pthread___pthread_create_system+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -8542,7 +8551,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_pthread___pthread_create_system" >&5
- $as_echo "$ac_cv_lib_pthread___pthread_create_system" >&6; }
--if test "x$ac_cv_lib_pthread___pthread_create_system" = xyes; then :
-+if test "x$ac_cv_lib_pthread___pthread_create_system" = x""yes; then
:
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- posix_threads=yes
-@@ -8552,7 +8561,7 @@ else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lcma" >&5
- $as_echo_n "checking for pthread_create in -lcma... " >&6; }
--if ${ac_cv_lib_cma_pthread_create+:} false; then :
-+if test "${ac_cv_lib_cma_pthread_create+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -8586,7 +8595,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_cma_pthread_create" >&5
- $as_echo "$ac_cv_lib_cma_pthread_create" >&6; }
--if test "x$ac_cv_lib_cma_pthread_create" = xyes; then :
-+if test "x$ac_cv_lib_cma_pthread_create" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- posix_threads=yes
-@@ -8618,7 +8627,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usconfig in -lmpc"
>&5
- $as_echo_n "checking for usconfig in -lmpc... " >&6; }
--if ${ac_cv_lib_mpc_usconfig+:} false; then :
-+if test "${ac_cv_lib_mpc_usconfig+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -8652,7 +8661,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpc_usconfig"
>&5
- $as_echo "$ac_cv_lib_mpc_usconfig" >&6; }
--if test "x$ac_cv_lib_mpc_usconfig" = xyes; then :
-+if test "x$ac_cv_lib_mpc_usconfig" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- LIBS="$LIBS -lmpc"
-@@ -8664,7 +8673,7 @@ fi
- if test "$posix_threads" != "yes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thr_create in
-lthread" >&5
- $as_echo_n "checking for thr_create in -lthread... " >&6; }
--if ${ac_cv_lib_thread_thr_create+:} false; then :
-+if test "${ac_cv_lib_thread_thr_create+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -8698,7 +8707,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_thread_thr_create"
>&5
- $as_echo "$ac_cv_lib_thread_thr_create" >&6; }
--if test "x$ac_cv_lib_thread_thr_create" = xyes; then :
-+if test "x$ac_cv_lib_thread_thr_create" = x""yes; then :
- $as_echo "#define WITH_THREAD 1" >>confdefs.h
-
- LIBS="$LIBS -lthread"
-@@ -8747,7 +8756,7 @@ $as_echo "#define HAVE_BROKEN_POSIX_SEMA
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PTHREAD_SCOPE_SYSTEM is
supported" >&5
- $as_echo_n "checking if PTHREAD_SCOPE_SYSTEM is supported... " >&6; }
-- if ${ac_cv_pthread_system_supported+:} false; then :
-+ if test "${ac_cv_pthread_system_supported+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -8790,7 +8799,7 @@ $as_echo "#define PTHREAD_SYSTEM_SCHED_S
- for ac_func in pthread_sigmask
- do :
- ac_fn_c_check_func "$LINENO" "pthread_sigmask"
"ac_cv_func_pthread_sigmask"
--if test "x$ac_cv_func_pthread_sigmask" = xyes; then :
-+if test "x$ac_cv_func_pthread_sigmask" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_PTHREAD_SIGMASK 1
- _ACEOF
-@@ -9143,6 +9152,50 @@ $as_echo "no" >&6; }
+@@ -9284,6 +9293,50 @@ $as_echo "no" >&6; }
fi
@@ -2066,22 +95,7 @@ diff -up ./configure.autotool-intermediates ./configure
# Check for Python-specific malloc support
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
$as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -9182,12 +9235,12 @@ fi
- $as_echo "$with_valgrind" >&6; }
- if test "$with_valgrind" != no; then
- ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h"
"ac_cv_header_valgrind_valgrind_h" "$ac_includes_default"
--if test "x$ac_cv_header_valgrind_valgrind_h" = xyes; then :
-+if test "x$ac_cv_header_valgrind_valgrind_h" = x""yes; then :
-
- $as_echo "#define WITH_VALGRIND 1" >>confdefs.h
-
- else
-- as_fn_error $? "Valgrind support requested but headers not available"
"$LINENO" 5
-+ as_fn_error "Valgrind support requested but headers not available"
"$LINENO" 5
-
- fi
-
-@@ -9195,6 +9248,46 @@ fi
+@@ -9336,6 +9389,46 @@ fi
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -2128,1441 +142,9 @@ diff -up ./configure.autotool-intermediates ./configure
# -I${DLINCLDIR} is added to the compile rule for importdl.o
DLINCLDIR=.
-@@ -9204,7 +9297,7 @@ DLINCLDIR=.
- for ac_func in dlopen
- do :
- ac_fn_c_check_func "$LINENO" "dlopen"
"ac_cv_func_dlopen"
--if test "x$ac_cv_func_dlopen" = xyes; then :
-+if test "x$ac_cv_func_dlopen" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_DLOPEN 1
- _ACEOF
-@@ -9281,7 +9374,8 @@ for ac_func in alarm accept4 setitimer g
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
-@@ -9531,7 +9625,7 @@ rm -f core conftest.err conftest.$ac_obj
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock declaration"
>&5
- $as_echo_n "checking for flock declaration... " >&6; }
--if ${ac_cv_flock_decl+:} false; then :
-+if test "${ac_cv_flock_decl+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -9561,7 +9655,7 @@ if test "x${ac_cv_flock_decl}" = xyes; t
- for ac_func in flock
- do :
- ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock"
--if test "x$ac_cv_func_flock" = xyes; then :
-+if test "x$ac_cv_func_flock" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_FLOCK 1
- _ACEOF
-@@ -9569,7 +9663,7 @@ _ACEOF
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock in -lbsd"
>&5
- $as_echo_n "checking for flock in -lbsd... " >&6; }
--if ${ac_cv_lib_bsd_flock+:} false; then :
-+if test "${ac_cv_lib_bsd_flock+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -9603,7 +9697,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_flock"
>&5
- $as_echo "$ac_cv_lib_bsd_flock" >&6; }
--if test "x$ac_cv_lib_bsd_flock" = xyes; then :
-+if test "x$ac_cv_lib_bsd_flock" = x""yes; then :
- $as_echo "#define HAVE_FLOCK 1" >>confdefs.h
-
-
-@@ -9652,7 +9746,7 @@ do
- set dummy $ac_prog; ac_word=$2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
- $as_echo_n "checking for $ac_word... " >&6; }
--if ${ac_cv_prog_TRUE+:} false; then :
-+if test "${ac_cv_prog_TRUE+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test -n "$TRUE"; then
-@@ -9692,7 +9786,7 @@ test -n "$TRUE" || TRUE="/bin/true"
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lc"
>&5
- $as_echo_n "checking for inet_aton in -lc... " >&6; }
--if ${ac_cv_lib_c_inet_aton+:} false; then :
-+if test "${ac_cv_lib_c_inet_aton+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -9726,12 +9820,12 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_inet_aton"
>&5
- $as_echo "$ac_cv_lib_c_inet_aton" >&6; }
--if test "x$ac_cv_lib_c_inet_aton" = xyes; then :
-+if test "x$ac_cv_lib_c_inet_aton" = x""yes; then :
- $ac_cv_prog_TRUE
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv"
>&5
- $as_echo_n "checking for inet_aton in -lresolv... " >&6; }
--if ${ac_cv_lib_resolv_inet_aton+:} false; then :
-+if test "${ac_cv_lib_resolv_inet_aton+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -9765,7 +9859,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton"
>&5
- $as_echo "$ac_cv_lib_resolv_inet_aton" >&6; }
--if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then :
-+if test "x$ac_cv_lib_resolv_inet_aton" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBRESOLV 1
- _ACEOF
-@@ -9782,7 +9876,7 @@ fi
- # exit Python
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chflags" >&5
- $as_echo_n "checking for chflags... " >&6; }
--if ${ac_cv_have_chflags+:} false; then :
-+if test "${ac_cv_have_chflags+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -9816,7 +9910,7 @@ fi
- $as_echo "$ac_cv_have_chflags" >&6; }
- if test "$ac_cv_have_chflags" = cross ; then
- ac_fn_c_check_func "$LINENO" "chflags"
"ac_cv_func_chflags"
--if test "x$ac_cv_func_chflags" = xyes; then :
-+if test "x$ac_cv_func_chflags" = x""yes; then :
- ac_cv_have_chflags="yes"
- else
- ac_cv_have_chflags="no"
-@@ -9831,7 +9925,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lchflags" >&5
- $as_echo_n "checking for lchflags... " >&6; }
--if ${ac_cv_have_lchflags+:} false; then :
-+if test "${ac_cv_have_lchflags+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -9865,7 +9959,7 @@ fi
- $as_echo "$ac_cv_have_lchflags" >&6; }
- if test "$ac_cv_have_lchflags" = cross ; then
- ac_fn_c_check_func "$LINENO" "lchflags"
"ac_cv_func_lchflags"
--if test "x$ac_cv_func_lchflags" = xyes; then :
-+if test "x$ac_cv_func_lchflags" = x""yes; then :
- ac_cv_have_lchflags="yes"
- else
- ac_cv_have_lchflags="no"
-@@ -9889,7 +9983,7 @@ esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -lz"
>&5
- $as_echo_n "checking for inflateCopy in -lz... " >&6; }
--if ${ac_cv_lib_z_inflateCopy+:} false; then :
-+if test "${ac_cv_lib_z_inflateCopy+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -9923,7 +10017,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateCopy"
>&5
- $as_echo "$ac_cv_lib_z_inflateCopy" >&6; }
--if test "x$ac_cv_lib_z_inflateCopy" = xyes; then :
-+if test "x$ac_cv_lib_z_inflateCopy" = x""yes; then :
-
- $as_echo "#define HAVE_ZLIB_COPY 1" >>confdefs.h
-
-@@ -10066,7 +10160,7 @@ rm -f core conftest.err conftest.$ac_obj
- for ac_func in openpty
- do :
- ac_fn_c_check_func "$LINENO" "openpty"
"ac_cv_func_openpty"
--if test "x$ac_cv_func_openpty" = xyes; then :
-+if test "x$ac_cv_func_openpty" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_OPENPTY 1
- _ACEOF
-@@ -10074,7 +10168,7 @@ _ACEOF
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil"
>&5
- $as_echo_n "checking for openpty in -lutil... " >&6; }
--if ${ac_cv_lib_util_openpty+:} false; then :
-+if test "${ac_cv_lib_util_openpty+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -10108,13 +10202,13 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty"
>&5
- $as_echo "$ac_cv_lib_util_openpty" >&6; }
--if test "x$ac_cv_lib_util_openpty" = xyes; then :
-+if test "x$ac_cv_lib_util_openpty" = x""yes; then :
- $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h
- LIBS="$LIBS -lutil"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lbsd"
>&5
- $as_echo_n "checking for openpty in -lbsd... " >&6; }
--if ${ac_cv_lib_bsd_openpty+:} false; then :
-+if test "${ac_cv_lib_bsd_openpty+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -10148,7 +10242,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_openpty"
>&5
- $as_echo "$ac_cv_lib_bsd_openpty" >&6; }
--if test "x$ac_cv_lib_bsd_openpty" = xyes; then :
-+if test "x$ac_cv_lib_bsd_openpty" = x""yes; then :
- $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h
- LIBS="$LIBS -lbsd"
- fi
-@@ -10163,7 +10257,7 @@ done
- for ac_func in forkpty
- do :
- ac_fn_c_check_func "$LINENO" "forkpty"
"ac_cv_func_forkpty"
--if test "x$ac_cv_func_forkpty" = xyes; then :
-+if test "x$ac_cv_func_forkpty" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_FORKPTY 1
- _ACEOF
-@@ -10171,7 +10265,7 @@ _ACEOF
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil"
>&5
- $as_echo_n "checking for forkpty in -lutil... " >&6; }
--if ${ac_cv_lib_util_forkpty+:} false; then :
-+if test "${ac_cv_lib_util_forkpty+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -10205,13 +10299,13 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty"
>&5
- $as_echo "$ac_cv_lib_util_forkpty" >&6; }
--if test "x$ac_cv_lib_util_forkpty" = xyes; then :
-+if test "x$ac_cv_lib_util_forkpty" = x""yes; then :
- $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
- LIBS="$LIBS -lutil"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lbsd"
>&5
- $as_echo_n "checking for forkpty in -lbsd... " >&6; }
--if ${ac_cv_lib_bsd_forkpty+:} false; then :
-+if test "${ac_cv_lib_bsd_forkpty+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -10245,7 +10339,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_forkpty"
>&5
- $as_echo "$ac_cv_lib_bsd_forkpty" >&6; }
--if test "x$ac_cv_lib_bsd_forkpty" = xyes; then :
-+if test "x$ac_cv_lib_bsd_forkpty" = x""yes; then :
- $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
- LIBS="$LIBS -lbsd"
- fi
-@@ -10262,7 +10356,7 @@ done
- for ac_func in memmove
- do :
- ac_fn_c_check_func "$LINENO" "memmove"
"ac_cv_func_memmove"
--if test "x$ac_cv_func_memmove" = xyes; then :
-+if test "x$ac_cv_func_memmove" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_MEMMOVE 1
- _ACEOF
-@@ -10276,7 +10370,8 @@ for ac_func in fseek64 fseeko fstatvfs f
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
-@@ -10285,50 +10380,31 @@ fi
- done
-
-
--ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2"
--if test "x$ac_cv_func_dup2" = xyes; then :
-- $as_echo "#define HAVE_DUP2 1" >>confdefs.h
--
--else
-- case " $LIBOBJS " in
-- *" dup2.$ac_objext "* ) ;;
-- *) LIBOBJS="$LIBOBJS dup2.$ac_objext"
-- ;;
--esac
--
--fi
--
--ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
--if test "x$ac_cv_func_getcwd" = xyes; then :
-- $as_echo "#define HAVE_GETCWD 1" >>confdefs.h
--
--else
-- case " $LIBOBJS " in
-- *" getcwd.$ac_objext "* ) ;;
-- *) LIBOBJS="$LIBOBJS getcwd.$ac_objext"
-- ;;
--esac
--
--fi
--
--ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup"
--if test "x$ac_cv_func_strdup" = xyes; then :
-- $as_echo "#define HAVE_STRDUP 1" >>confdefs.h
-+for ac_func in dup2 getcwd strdup
-+do :
-+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
-+ cat >>confdefs.h <<_ACEOF
-+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-+_ACEOF
-
- else
- case " $LIBOBJS " in
-- *" strdup.$ac_objext "* ) ;;
-- *) LIBOBJS="$LIBOBJS strdup.$ac_objext"
-+ *" $ac_func.$ac_objext "* ) ;;
-+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
- ;;
- esac
-
- fi
-+done
-
-
- for ac_func in getpgrp
- do :
- ac_fn_c_check_func "$LINENO" "getpgrp"
"ac_cv_func_getpgrp"
--if test "x$ac_cv_func_getpgrp" = xyes; then :
-+if test "x$ac_cv_func_getpgrp" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_GETPGRP 1
- _ACEOF
-@@ -10356,7 +10432,7 @@ done
- for ac_func in setpgrp
- do :
- ac_fn_c_check_func "$LINENO" "setpgrp"
"ac_cv_func_setpgrp"
--if test "x$ac_cv_func_setpgrp" = xyes; then :
-+if test "x$ac_cv_func_setpgrp" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_SETPGRP 1
- _ACEOF
-@@ -10384,7 +10460,7 @@ done
- for ac_func in gettimeofday
- do :
- ac_fn_c_check_func "$LINENO" "gettimeofday"
"ac_cv_func_gettimeofday"
--if test "x$ac_cv_func_gettimeofday" = xyes; then :
-+if test "x$ac_cv_func_gettimeofday" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_GETTIMEOFDAY 1
- _ACEOF
-@@ -10486,7 +10562,7 @@ if test $have_getaddrinfo = yes
- then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking getaddrinfo bug"
>&5
- $as_echo_n "checking getaddrinfo bug... " >&6; }
-- if ${ac_cv_buggy_getaddrinfo+:} false; then :
-+ if test "${ac_cv_buggy_getaddrinfo+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -10615,7 +10691,7 @@ fi
- for ac_func in getnameinfo
- do :
- ac_fn_c_check_func "$LINENO" "getnameinfo"
"ac_cv_func_getnameinfo"
--if test "x$ac_cv_func_getnameinfo" = xyes; then :
-+if test "x$ac_cv_func_getnameinfo" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_GETNAMEINFO 1
- _ACEOF
-@@ -10627,7 +10703,7 @@ done
- # checks for structures
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may
both be included" >&5
- $as_echo_n "checking whether time.h and sys/time.h may both be included... "
>&6; }
--if ${ac_cv_header_time+:} false; then :
-+if test "${ac_cv_header_time+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10662,7 +10738,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in
sys/time.h or time.h" >&5
- $as_echo_n "checking whether struct tm is in sys/time.h or time.h... "
>&6; }
--if ${ac_cv_struct_tm+:} false; then :
-+if test "${ac_cv_struct_tm+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10699,7 +10775,7 @@ ac_fn_c_check_member "$LINENO" "struct t
- #include <$ac_cv_struct_tm>
-
- "
--if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then :
-+if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_TM_TM_ZONE 1
-@@ -10715,7 +10791,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
- else
- ac_fn_c_check_decl "$LINENO" "tzname"
"ac_cv_have_decl_tzname" "#include <time.h>
- "
--if test "x$ac_cv_have_decl_tzname" = xyes; then :
-+if test "x$ac_cv_have_decl_tzname" = x""yes; then :
- ac_have_decl=1
- else
- ac_have_decl=0
-@@ -10727,7 +10803,7 @@ _ACEOF
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
- $as_echo_n "checking for tzname... " >&6; }
--if ${ac_cv_var_tzname+:} false; then :
-+if test "${ac_cv_var_tzname+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10763,7 +10839,7 @@ $as_echo "#define HAVE_TZNAME 1" >>confd
- fi
-
- ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev"
"ac_cv_member_struct_stat_st_rdev" "$ac_includes_default"
--if test "x$ac_cv_member_struct_stat_st_rdev" = xyes; then :
-+if test "x$ac_cv_member_struct_stat_st_rdev" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_STAT_ST_RDEV 1
-@@ -10773,7 +10849,7 @@ _ACEOF
- fi
-
- ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize"
"ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
--if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then :
-+if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_STAT_ST_BLKSIZE 1
-@@ -10783,7 +10859,7 @@ _ACEOF
- fi
-
- ac_fn_c_check_member "$LINENO" "struct stat" "st_flags"
"ac_cv_member_struct_stat_st_flags" "$ac_includes_default"
--if test "x$ac_cv_member_struct_stat_st_flags" = xyes; then :
-+if test "x$ac_cv_member_struct_stat_st_flags" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_STAT_ST_FLAGS 1
-@@ -10793,7 +10869,7 @@ _ACEOF
- fi
-
- ac_fn_c_check_member "$LINENO" "struct stat" "st_gen"
"ac_cv_member_struct_stat_st_gen" "$ac_includes_default"
--if test "x$ac_cv_member_struct_stat_st_gen" = xyes; then :
-+if test "x$ac_cv_member_struct_stat_st_gen" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_STAT_ST_GEN 1
-@@ -10803,7 +10879,7 @@ _ACEOF
- fi
-
- ac_fn_c_check_member "$LINENO" "struct stat"
"st_birthtime" "ac_cv_member_struct_stat_st_birthtime"
"$ac_includes_default"
--if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then :
-+if test "x$ac_cv_member_struct_stat_st_birthtime" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_STAT_ST_BIRTHTIME 1
-@@ -10813,7 +10889,7 @@ _ACEOF
- fi
-
- ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks"
"ac_cv_member_struct_stat_st_blocks" "$ac_includes_default"
--if test "x$ac_cv_member_struct_stat_st_blocks" = xyes; then :
-+if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_STAT_ST_BLOCKS 1
-@@ -10835,7 +10911,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for time.h that defines
altzone" >&5
- $as_echo_n "checking for time.h that defines altzone... " >&6; }
--if ${ac_cv_header_time_altzone+:} false; then :
-+if test "${ac_cv_header_time_altzone+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -10899,7 +10975,7 @@ $as_echo "$was_it_defined" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addrinfo" >&5
- $as_echo_n "checking for addrinfo... " >&6; }
--if ${ac_cv_struct_addrinfo+:} false; then :
-+if test "${ac_cv_struct_addrinfo+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10931,7 +11007,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sockaddr_storage"
>&5
- $as_echo_n "checking for sockaddr_storage... " >&6; }
--if ${ac_cv_struct_sockaddr_storage+:} false; then :
-+if test "${ac_cv_struct_sockaddr_storage+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10967,7 +11043,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned"
>&5
- $as_echo_n "checking whether char is unsigned... " >&6; }
--if ${ac_cv_c_char_unsigned+:} false; then :
-+if test "${ac_cv_c_char_unsigned+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10999,7 +11075,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming
const" >&5
- $as_echo_n "checking for an ANSI C-conforming const... " >&6; }
--if ${ac_cv_c_const+:} false; then :
-+if test "${ac_cv_c_const+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -11287,7 +11363,7 @@ $as_echo "$va_list_is_array" >&6; }
-
-
- ac_fn_c_check_func "$LINENO" "gethostbyname_r"
"ac_cv_func_gethostbyname_r"
--if test "x$ac_cv_func_gethostbyname_r" = xyes; then :
-+if test "x$ac_cv_func_gethostbyname_r" = x""yes; then :
-
- $as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h
-
-@@ -11418,7 +11494,7 @@ else
- for ac_func in gethostbyname
- do :
- ac_fn_c_check_func "$LINENO" "gethostbyname"
"ac_cv_func_gethostbyname"
--if test "x$ac_cv_func_gethostbyname" = xyes; then :
-+if test "x$ac_cv_func_gethostbyname" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_GETHOSTBYNAME 1
- _ACEOF
-@@ -11440,12 +11516,12 @@ fi
-
- # Linux requires this for correct f.p. operations
- ac_fn_c_check_func "$LINENO" "__fpu_control"
"ac_cv_func___fpu_control"
--if test "x$ac_cv_func___fpu_control" = xyes; then :
-+if test "x$ac_cv_func___fpu_control" = x""yes; then :
-
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __fpu_control in
-lieee" >&5
- $as_echo_n "checking for __fpu_control in -lieee... " >&6; }
--if ${ac_cv_lib_ieee___fpu_control+:} false; then :
-+if test "${ac_cv_lib_ieee___fpu_control+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -11479,7 +11555,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_ieee___fpu_control" >&5
- $as_echo "$ac_cv_lib_ieee___fpu_control" >&6; }
--if test "x$ac_cv_lib_ieee___fpu_control" = xyes; then :
-+if test "x$ac_cv_lib_ieee___fpu_control" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define HAVE_LIBIEEE 1
- _ACEOF
-@@ -11535,7 +11611,7 @@ elif test "$withval" != yes
- then LIBM=$withval
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBM=\"$withval\"" >&5
- $as_echo "set LIBM=\"$withval\"" >&6; }
--else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO"
5
-+else as_fn_error "proper usage is --with-libm=STRING" "$LINENO" 5
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBM=\"$LIBM\"" >&5
-@@ -11559,7 +11635,7 @@ elif test "$withval" != yes
- then LIBC=$withval
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBC=\"$withval\"" >&5
- $as_echo "set LIBC=\"$withval\"" >&6; }
--else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO"
5
-+else as_fn_error "proper usage is --with-libc=STRING" "$LINENO" 5
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBC=\"$LIBC\"" >&5
-@@ -11573,7 +11649,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are
little-endian IEEE 754 binary64" >&5
- $as_echo_n "checking whether C doubles are little-endian IEEE 754 binary64...
" >&6; }
--if ${ac_cv_little_endian_double+:} false; then :
-+if test "${ac_cv_little_endian_double+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -11615,7 +11691,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are big-endian
IEEE 754 binary64" >&5
- $as_echo_n "checking whether C doubles are big-endian IEEE 754 binary64... "
>&6; }
--if ${ac_cv_big_endian_double+:} false; then :
-+if test "${ac_cv_big_endian_double+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -11661,7 +11737,7 @@ fi
- # conversions work.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are ARM
mixed-endian IEEE 754 binary64" >&5
- $as_echo_n "checking whether C doubles are ARM mixed-endian IEEE 754 binary64...
" >&6; }
--if ${ac_cv_mixed_endian_double+:} false; then :
-+if test "${ac_cv_mixed_endian_double+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -11809,7 +11885,8 @@ for ac_func in acosh asinh atanh copysig
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
-@@ -11821,7 +11898,8 @@ for ac_func in hypot lgamma log1p round
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
-@@ -11831,7 +11909,7 @@ done
-
- ac_fn_c_check_decl "$LINENO" "isinf"
"ac_cv_have_decl_isinf" "#include <math.h>
- "
--if test "x$ac_cv_have_decl_isinf" = xyes; then :
-+if test "x$ac_cv_have_decl_isinf" = x""yes; then :
- ac_have_decl=1
- else
- ac_have_decl=0
-@@ -11842,7 +11920,7 @@ cat >>confdefs.h <<_ACEOF
- _ACEOF
- ac_fn_c_check_decl "$LINENO" "isnan"
"ac_cv_have_decl_isnan" "#include <math.h>
- "
--if test "x$ac_cv_have_decl_isnan" = xyes; then :
-+if test "x$ac_cv_have_decl_isnan" = x""yes; then :
- ac_have_decl=1
- else
- ac_have_decl=0
-@@ -11853,7 +11931,7 @@ cat >>confdefs.h <<_ACEOF
- _ACEOF
- ac_fn_c_check_decl "$LINENO" "isfinite"
"ac_cv_have_decl_isfinite" "#include <math.h>
- "
--if test "x$ac_cv_have_decl_isfinite" = xyes; then :
-+if test "x$ac_cv_have_decl_isfinite" = x""yes; then :
- ac_have_decl=1
- else
- ac_have_decl=0
-@@ -11868,7 +11946,7 @@ _ACEOF
- # -0. on some architectures.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tanh preserves the sign
of zero" >&5
- $as_echo_n "checking whether tanh preserves the sign of zero... " >&6;
}
--if ${ac_cv_tanh_preserves_zero_sign+:} false; then :
-+if test "${ac_cv_tanh_preserves_zero_sign+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -11916,7 +11994,7 @@ then
- # -0. See issue #9920.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether log1p drops the sign
of negative zero" >&5
- $as_echo_n "checking whether log1p drops the sign of negative zero... "
>&6; }
-- if ${ac_cv_log1p_drops_zero_sign+:} false; then :
-+ if test "${ac_cv_log1p_drops_zero_sign+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -11968,7 +12046,7 @@ LIBS=$LIBS_SAVE
- # sem_open results in a 'Signal 12' error.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX semaphores are
enabled" >&5
- $as_echo_n "checking whether POSIX semaphores are enabled... " >&6; }
--if ${ac_cv_posix_semaphores_enabled+:} false; then :
-+if test "${ac_cv_posix_semaphores_enabled+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -12019,7 +12097,7 @@ fi
- # Multiprocessing check for broken sem_getvalue
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken sem_getvalue"
>&5
- $as_echo_n "checking for broken sem_getvalue... " >&6; }
--if ${ac_cv_broken_sem_getvalue+:} false; then :
-+if test "${ac_cv_broken_sem_getvalue+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -12084,7 +12162,7 @@ no)
- 15|30)
- ;;
- *)
-- as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value
should be 15 or 30" "$LINENO" 5 ;;
-+ as_fn_error "bad value $enable_big_digits for --enable-big-digits; value should
be 15 or 30" "$LINENO" 5 ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits"
>&5
- $as_echo "$enable_big_digits" >&6; }
-@@ -12102,7 +12180,7 @@ fi
-
- # check for wchar.h
- ac_fn_c_check_header_mongrel "$LINENO" "wchar.h"
"ac_cv_header_wchar_h" "$ac_includes_default"
--if test "x$ac_cv_header_wchar_h" = xyes; then :
-+if test "x$ac_cv_header_wchar_h" = x""yes; then :
-
-
- $as_echo "#define HAVE_WCHAR_H 1" >>confdefs.h
-@@ -12125,7 +12203,7 @@ then
- # This bug is HP SR number 8606223364.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5
- $as_echo_n "checking size of wchar_t... " >&6; }
--if ${ac_cv_sizeof_wchar_t+:} false; then :
-+if test "${ac_cv_sizeof_wchar_t+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))"
"ac_cv_sizeof_wchar_t" "#include <wchar.h>
-@@ -12135,8 +12213,9 @@ else
- if test "$ac_cv_type_wchar_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (wchar_t)
--See \`config.log' for more details" "$LINENO" 5; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (wchar_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_wchar_t=0
- fi
-@@ -12191,7 +12270,7 @@ then
- # check whether wchar_t is signed or not
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wchar_t is signed"
>&5
- $as_echo_n "checking whether wchar_t is signed... " >&6; }
-- if ${ac_cv_wchar_t_signed+:} false; then :
-+ if test "${ac_cv_wchar_t_signed+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -12287,7 +12366,7 @@ $as_echo "$PY_UNICODE_TYPE" >&6; }
- # check for endianness
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is
bigendian" >&5
- $as_echo_n "checking whether byte ordering is bigendian... " >&6; }
--if ${ac_cv_c_bigendian+:} false; then :
-+if test "${ac_cv_c_bigendian+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_cv_c_bigendian=unknown
-@@ -12505,7 +12584,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUI
-
- ;; #(
- *)
-- as_fn_error $? "unknown endianness
-+ as_fn_error "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
-@@ -12578,7 +12657,7 @@ $as_echo "$SO" >&6; }
- # or fills with zeros (like the Cray J90, according to Tim Peters).
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether right shift extends the
sign bit" >&5
- $as_echo_n "checking whether right shift extends the sign bit... " >&6;
}
--if ${ac_cv_rshift_extends_sign+:} false; then :
-+if test "${ac_cv_rshift_extends_sign+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -12617,7 +12696,7 @@ fi
- # check for getc_unlocked and related locking functions
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getc_unlocked() and
friends" >&5
- $as_echo_n "checking for getc_unlocked() and friends... " >&6; }
--if ${ac_cv_have_getc_unlocked+:} false; then :
-+if test "${ac_cv_have_getc_unlocked+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -12715,7 +12794,7 @@ fi
- # check for readline 2.1
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_callback_handler_install
in -lreadline" >&5
- $as_echo_n "checking for rl_callback_handler_install in -lreadline... "
>&6; }
--if ${ac_cv_lib_readline_rl_callback_handler_install+:} false; then :
-+if test "${ac_cv_lib_readline_rl_callback_handler_install+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -12749,7 +12828,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_callback_handler_install" >&5
- $as_echo "$ac_cv_lib_readline_rl_callback_handler_install" >&6; }
--if test "x$ac_cv_lib_readline_rl_callback_handler_install" = xyes; then :
-+if test "x$ac_cv_lib_readline_rl_callback_handler_install" = x""yes;
then :
-
- $as_echo "#define HAVE_RL_CALLBACK 1" >>confdefs.h
-
-@@ -12767,7 +12846,7 @@ else
- have_readline=no
-
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if test $have_readline = yes
- then
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -12801,7 +12880,7 @@ fi
- # check for readline 4.0
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in
-lreadline" >&5
- $as_echo_n "checking for rl_pre_input_hook in -lreadline... " >&6; }
--if ${ac_cv_lib_readline_rl_pre_input_hook+:} false; then :
-+if test "${ac_cv_lib_readline_rl_pre_input_hook+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -12835,7 +12914,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_pre_input_hook" >&5
- $as_echo "$ac_cv_lib_readline_rl_pre_input_hook" >&6; }
--if test "x$ac_cv_lib_readline_rl_pre_input_hook" = xyes; then :
-+if test "x$ac_cv_lib_readline_rl_pre_input_hook" = x""yes; then :
-
- $as_echo "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h
-
-@@ -12845,7 +12924,7 @@ fi
- # also in 4.0
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for
rl_completion_display_matches_hook in -lreadline" >&5
- $as_echo_n "checking for rl_completion_display_matches_hook in -lreadline... "
>&6; }
--if ${ac_cv_lib_readline_rl_completion_display_matches_hook+:} false; then :
-+if test "${ac_cv_lib_readline_rl_completion_display_matches_hook+set}" = set;
then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -12879,7 +12958,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_completion_display_matches_hook" >&5
- $as_echo "$ac_cv_lib_readline_rl_completion_display_matches_hook" >&6;
}
--if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = xyes; then
:
-+if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" =
x""yes; then :
-
- $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1"
>>confdefs.h
-
-@@ -12889,7 +12968,7 @@ fi
- # check for readline 4.2
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in
-lreadline" >&5
- $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6;
}
--if ${ac_cv_lib_readline_rl_completion_matches+:} false; then :
-+if test "${ac_cv_lib_readline_rl_completion_matches+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- ac_check_lib_save_LIBS=$LIBS
-@@ -12923,7 +13002,7 @@ LIBS=$ac_check_lib_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_completion_matches" >&5
- $as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; }
--if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes; then :
-+if test "x$ac_cv_lib_readline_rl_completion_matches" = x""yes; then
:
-
- $as_echo "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h
-
-@@ -12941,7 +13020,7 @@ else
- have_readline=no
-
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if test $have_readline = yes
- then
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -12964,7 +13043,7 @@ LIBS=$LIBS_no_readline
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken nice()"
>&5
- $as_echo_n "checking for broken nice()... " >&6; }
--if ${ac_cv_broken_nice+:} false; then :
-+if test "${ac_cv_broken_nice+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -13005,7 +13084,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll()"
>&5
- $as_echo_n "checking for broken poll()... " >&6; }
--if ${ac_cv_broken_poll+:} false; then :
-+if test "${ac_cv_broken_poll+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -13060,7 +13139,7 @@ ac_fn_c_check_member "$LINENO" "struct t
- #include <$ac_cv_struct_tm>
-
- "
--if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then :
-+if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then :
-
- cat >>confdefs.h <<_ACEOF
- #define HAVE_STRUCT_TM_TM_ZONE 1
-@@ -13076,7 +13155,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
- else
- ac_fn_c_check_decl "$LINENO" "tzname"
"ac_cv_have_decl_tzname" "#include <time.h>
- "
--if test "x$ac_cv_have_decl_tzname" = xyes; then :
-+if test "x$ac_cv_have_decl_tzname" = x""yes; then :
- ac_have_decl=1
- else
- ac_have_decl=0
-@@ -13088,7 +13167,7 @@ _ACEOF
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
- $as_echo_n "checking for tzname... " >&6; }
--if ${ac_cv_var_tzname+:} false; then :
-+if test "${ac_cv_var_tzname+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13127,7 +13206,7 @@ fi
- # check tzset(3) exists and works like we expect it to
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working tzset()"
>&5
- $as_echo_n "checking for working tzset()... " >&6; }
--if ${ac_cv_working_tzset+:} false; then :
-+if test "${ac_cv_working_tzset+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
-
-@@ -13224,7 +13303,7 @@ fi
- # Look for subsecond timestamps in struct stat
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec in struct stat"
>&5
- $as_echo_n "checking for tv_nsec in struct stat... " >&6; }
--if ${ac_cv_stat_tv_nsec+:} false; then :
-+if test "${ac_cv_stat_tv_nsec+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13261,7 +13340,7 @@ fi
- # Look for BSD style subsecond timestamps in struct stat
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec2 in struct stat"
>&5
- $as_echo_n "checking for tv_nsec2 in struct stat... " >&6; }
--if ${ac_cv_stat_tv_nsec2+:} false; then :
-+if test "${ac_cv_stat_tv_nsec2+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13298,7 +13377,7 @@ fi
- # On HP/UX 11.0, mvwdelch is a block with a return statement
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mvwdelch is an
expression" >&5
- $as_echo_n "checking whether mvwdelch is an expression... " >&6; }
--if ${ac_cv_mvwdelch_is_expression+:} false; then :
-+if test "${ac_cv_mvwdelch_is_expression+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13335,7 +13414,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether WINDOW has _flags"
>&5
- $as_echo_n "checking whether WINDOW has _flags... " >&6; }
--if ${ac_cv_window_has_flags+:} false; then :
-+if test "${ac_cv_window_has_flags+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13483,7 +13562,7 @@ if test "$have_long_long" = yes
- then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %lld and %llu printf()
format support" >&5
- $as_echo_n "checking for %lld and %llu printf() format support... "
>&6; }
-- if ${ac_cv_have_long_long_format+:} false; then :
-+ if test "${ac_cv_have_long_long_format+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -13553,7 +13632,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %zd printf() format
support" >&5
- $as_echo_n "checking for %zd printf() format support... " >&6; }
--if ${ac_cv_have_size_t_format+:} false; then :
-+if test "${ac_cv_have_size_t_format+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -13626,7 +13705,7 @@ ac_fn_c_check_type "$LINENO" "socklen_t"
- #endif
-
- "
--if test "x$ac_cv_type_socklen_t" = xyes; then :
-+if test "x$ac_cv_type_socklen_t" = x""yes; then :
-
- else
-
-@@ -13637,7 +13716,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken mbstowcs"
>&5
- $as_echo_n "checking for broken mbstowcs... " >&6; }
--if ${ac_cv_broken_mbstowcs+:} false; then :
-+if test "${ac_cv_broken_mbstowcs+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -13677,7 +13756,7 @@ fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports computed
gotos" >&5
- $as_echo_n "checking whether $CC supports computed gotos... " >&6; }
--if ${ac_cv_computed_gotos+:} false; then :
-+if test "${ac_cv_computed_gotos+set}" = set; then :
- $as_echo_n "(cached) " >&6
- else
- if test "$cross_compiling" = yes; then :
-@@ -13757,11 +13836,11 @@ esac
-
-
- case $ac_sys_system in
-- OSF*) as_fn_error $? "OSF* systems are deprecated unless somebody volunteers.
Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
-+ OSF*) as_fn_error "OSF* systems are deprecated unless somebody volunteers. Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
- esac
-
- ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
--if test "x$ac_cv_func_pipe2" = xyes; then :
-+if test "x$ac_cv_func_pipe2" = x""yes; then :
-
- $as_echo "#define HAVE_PIPE2 1" >>confdefs.h
-
-@@ -13856,21 +13935,10 @@ $as_echo "$as_me: WARNING: cache variabl
- :end' >>confcache
- if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
- if test -w "$cache_file"; then
-- if test "x$cache_file" != "x/dev/null"; then
-+ test "x$cache_file" != "x/dev/null" &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file"
>&5
- $as_echo "$as_me: updating cache $cache_file" >&6;}
-- if test ! -f "$cache_file" || test -h "$cache_file"; then
-- cat confcache >"$cache_file"
-- else
-- case $cache_file in #(
-- */* | ?:*)
-- mv -f confcache "$cache_file"$$ &&
-- mv -f "$cache_file"$$ "$cache_file" ;; #(
-- *)
-- mv -f confcache "$cache_file" ;;
-- esac
-- fi
-- fi
-+ cat confcache >$cache_file
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache
$cache_file" >&5
- $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-@@ -13886,7 +13954,6 @@ DEFS=-DHAVE_CONFIG_H
-
- ac_libobjs=
- ac_ltlibobjs=
--U=
- for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
- # 1. Remove the extension, and $U if already installed.
- ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-@@ -13903,7 +13970,7 @@ LTLIBOBJS=$ac_ltlibobjs
-
-
-
--: "${CONFIG_STATUS=./config.status}"
-+: ${CONFIG_STATUS=./config.status}
- ac_write_fail=0
- ac_clean_files_save=$ac_clean_files
- ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-@@ -14004,7 +14071,6 @@ fi
- IFS=" "" $as_nl"
-
- # Find who we are. Look in the path if we contain no directory separator.
--as_myself=
- case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -14050,19 +14116,19 @@ export LANGUAGE
- (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
--# as_fn_error STATUS ERROR [LINENO LOG_FD]
--# ----------------------------------------
-+# as_fn_error ERROR [LINENO LOG_FD]
-+# ---------------------------------
- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
- # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
--# script with STATUS, using 1 if that was 0.
-+# script with status $?, using 1 if that was 0.
- as_fn_error ()
- {
-- as_status=$1; test $as_status -eq 0 && as_status=1
-- if test "$4"; then
-- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-+ as_status=$?; test $as_status -eq 0 && as_status=1
-+ if test "$3"; then
-+ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
- fi
-- $as_echo "$as_me: error: $2" >&2
-+ $as_echo "$as_me: error: $1" >&2
- as_fn_exit $as_status
- } # as_fn_error
-
-@@ -14258,7 +14324,7 @@ $as_echo X"$as_dir" |
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
-- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
-+ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
-
-
- } # as_fn_mkdir_p
-@@ -14312,7 +14378,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
- # values after options handling.
- ac_log="
- This file was extended by python $as_me 3.2, which was
--generated by GNU Autoconf 2.68. Invocation command line was
-+generated by GNU Autoconf 2.65. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
-@@ -14374,10 +14440,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
- ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
- ac_cs_version="\\
- python config.status 3.2
--configured by $0, generated by GNU Autoconf 2.68,
-+configured by $0, generated by GNU Autoconf 2.65,
- with options \\"\$ac_cs_config\\"
-
--Copyright (C) 2010 Free Software Foundation, Inc.
-+Copyright (C) 2009 Free Software Foundation, Inc.
- This config.status script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it."
-
-@@ -14393,16 +14459,11 @@ ac_need_defaults=:
- while test $# != 0
- do
- case $1 in
-- --*=?*)
-+ --*=*)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
- ac_shift=:
- ;;
-- --*=)
-- ac_option=`expr "X$1" : 'X\([^=]*\)='`
-- ac_optarg=
-- ac_shift=:
-- ;;
- *)
- ac_option=$1
- ac_optarg=$2
-@@ -14424,7 +14485,6 @@ do
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed
"s/'/'\\\\\\\\''/g"` ;;
-- '') as_fn_error $? "missing file argument" ;;
- esac
- as_fn_append CONFIG_FILES " '$ac_optarg'"
- ac_need_defaults=false;;
-@@ -14437,7 +14497,7 @@ do
- ac_need_defaults=false;;
- --he | --h)
- # Conflict between --help and --header
-- as_fn_error $? "ambiguous option: \`$1'
-+ as_fn_error "ambiguous option: \`$1'
- Try \`$0 --help' for more information.";;
- --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
-@@ -14446,7 +14506,7 @@ Try \`$0 --help' for more information.";
- ac_cs_silent=: ;;
-
- # This is an error.
-- -*) as_fn_error $? "unrecognized option: \`$1'
-+ -*) as_fn_error "unrecognized option: \`$1'
- Try \`$0 --help' for more information." ;;
-
- *) as_fn_append ac_config_targets " $1"
-@@ -14505,7 +14565,7 @@ do
- "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc"
;;
- "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES
Modules/ld_so_aix" ;;
-
-- *) as_fn_error $? "invalid argument: \`$ac_config_target'"
"$LINENO" 5;;
-+ *) as_fn_error "invalid argument: \`$ac_config_target'"
"$LINENO" 5;;
- esac
- done
-
-@@ -14527,10 +14587,9 @@ fi
- # after its creation but before its name has been assigned to `$tmp'.
- $debug ||
- {
-- tmp= ac_tmp=
-+ tmp=
- trap 'exit_status=$?
-- : "${ac_tmp:=$tmp}"
-- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit
$exit_status
-+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; }
&& exit $exit_status
- ' 0
- trap 'as_fn_exit 1' 1 2 13 15
- }
-@@ -14538,13 +14597,12 @@ $debug ||
-
- {
- tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null`
&&
-- test -d "$tmp"
-+ test -n "$tmp" && test -d "$tmp"
- } ||
- {
- tmp=./conf$$-$RANDOM
- (umask 077 && mkdir "$tmp")
--} || as_fn_error $? "cannot create a temporary directory in ."
"$LINENO" 5
--ac_tmp=$tmp
-+} || as_fn_error "cannot create a temporary directory in ."
"$LINENO" 5
-
- # Set up the scripts for CONFIG_FILES section.
- # No need to generate them if there are no CONFIG_FILES.
-@@ -14561,12 +14619,12 @@ if test "x$ac_cr" = x; then
- fi
- ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null
2>/dev/null`
- if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-- ac_cs_awk_cr='\\r'
-+ ac_cs_awk_cr='\r'
- else
- ac_cs_awk_cr=$ac_cr
- fi
-
--echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
-+echo 'BEGIN {' >"$tmp/subs1.awk" &&
- _ACEOF
-
-
-@@ -14575,18 +14633,18 @@ _ACEOF
- echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/'
&&
- echo "_ACEOF"
- } >conf$$subs.sh ||
-- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
--ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-+ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
- ac_delim='%!_!# '
- for ac_last_try in false false false false false :; do
- . ./conf$$subs.sh ||
-- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-+ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-
- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
- if test $ac_delim_n = $ac_delim_num; then
- break
- elif $ac_last_try; then
-- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-+ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-@@ -14594,7 +14652,7 @@ done
- rm -f conf$$subs.sh
-
- cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
--cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
-+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
- _ACEOF
- sed -n '
- h
-@@ -14642,7 +14700,7 @@ t delim
- rm -f conf$$subs.awk
- cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- _ACAWK
--cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
-+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
- for (key in S) S_is_set[key] = 1
- FS = ""
-
-@@ -14674,29 +14732,21 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n
- sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
- else
- cat
--fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
-- || as_fn_error $? "could not setup config files machinery"
"$LINENO" 5
-+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-+ || as_fn_error "could not setup config files machinery" "$LINENO"
5
- _ACEOF
-
--# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
--# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading
and
-+# VPATH may cause trouble with some makes, so we remove $(srcdir),
-+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
- # trailing colons and then remove the whole line if VPATH becomes empty
- # (actually we leave an empty line to preserve line numbers).
- if test "x$srcdir" = x.; then
-- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
--h
--s///
--s/^/:/
--s/[ ]*$/:/
--s/:\$(srcdir):/:/g
--s/:\${srcdir}:/:/g
--s/:@srcdir@:/:/g
--s/^:*//
-+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
-+s/:*\$(srcdir):*/:/
-+s/:*\${srcdir}:*/:/
-+s/:*@srcdir@:*/:/
-+s/^\([^=]*=[ ]*\):*/\1/
- s/:*$//
--x
--s/\(=[ ]*\).*/\1/
--G
--s/\n//
- s/^[^=]*=[ ]*$//
- }'
- fi
-@@ -14708,7 +14758,7 @@ fi # test -n "$CONFIG_FILES"
- # No need to generate them if there are no CONFIG_HEADERS.
- # This happens for instance with `./config.status Makefile'.
- if test -n "$CONFIG_HEADERS"; then
--cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
-+cat >"$tmp/defines.awk" <<\_ACAWK ||
- BEGIN {
- _ACEOF
-
-@@ -14720,11 +14770,11 @@ _ACEOF
- # handling of long lines.
- ac_delim='%!_!# '
- for ac_last_try in false false :; do
-- ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
-- if test -z "$ac_tt"; then
-+ ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-+ if test -z "$ac_t"; then
- break
- elif $ac_last_try; then
-- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
-+ as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-@@ -14809,7 +14859,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
- _ACAWK
- _ACEOF
- cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-- as_fn_error $? "could not setup config headers machinery"
"$LINENO" 5
-+ as_fn_error "could not setup config headers machinery" "$LINENO"
5
- fi # test -n "$CONFIG_HEADERS"
-
-
-@@ -14822,7 +14872,7 @@ do
- esac
- case $ac_mode$ac_tag in
- :[FHL]*:*);;
-- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO"
5;;
-+ :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO"
5;;
- :[FH]-) ac_tag=-:-;;
- :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
- esac
-@@ -14841,7 +14891,7 @@ do
- for ac_f
- do
- case $ac_f in
-- -) ac_f="$ac_tmp/stdin";;
-+ -) ac_f="$tmp/stdin";;
- *) # Look for the file first in the build tree, then in the source tree
- # (if the path is not absolute). The absolute path cannot be DOS-style,
- # because $ac_f cannot contain `:'.
-@@ -14850,7 +14900,7 @@ do
- [\\/$]*) false;;
- *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
- esac ||
-- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO"
5;;
-+ as_fn_error "cannot find input file: \`$ac_f'" "$LINENO"
5;;
- esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed
"s/'/'\\\\\\\\''/g"`;; esac
- as_fn_append ac_file_inputs " '$ac_f'"
-@@ -14876,8 +14926,8 @@ $as_echo "$as_me: creating $ac_file" >&6
- esac
-
- case $ac_tag in
-- *:-:* | *:-) cat >"$ac_tmp/stdin" \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
-+ *:-:* | *:-) cat >"$tmp/stdin" \
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
- esac
- ;;
- esac
-@@ -15007,24 +15057,23 @@ s&@abs_top_builddir@&$ac_abs_top_builddi
- s&@INSTALL@&$ac_INSTALL&;t t
- $ac_datarootdir_hack
- "
--eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f
"$ac_tmp/subs.awk" \
-- >$ac_tmp/out || as_fn_error $? "could not create $ac_file"
"$LINENO" 5
-+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f
"$tmp/subs.awk" >$tmp/out \
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
-
- test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n
"$ac_out"; } &&
-- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
-- "$ac_tmp/out"`; test -z "$ac_out"; } &&
-+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n
"$ac_out"; } &&
-+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z
"$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference
to the variable \`datarootdir'
--which seems to be undefined. Please make sure it is defined" >&5
-+which seems to be undefined. Please make sure it is defined." >&5
- $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable
\`datarootdir'
--which seems to be undefined. Please make sure it is defined" >&2;}
-+which seems to be undefined. Please make sure it is defined." >&2;}
-
-- rm -f "$ac_tmp/stdin"
-+ rm -f "$tmp/stdin"
- case $ac_file in
-- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
-- *) rm -f "$ac_file" && mv "$ac_tmp/out"
"$ac_file";;
-+ -) cat "$tmp/out" && rm -f "$tmp/out";;
-+ *) rm -f "$ac_file" && mv "$tmp/out"
"$ac_file";;
- esac \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
- ;;
- :H)
- #
-@@ -15033,21 +15082,21 @@ which seems to be undefined. Please mak
- if test x"$ac_file" != x-; then
- {
- $as_echo "/* $configure_input */" \
-- && eval '$AWK -f "$ac_tmp/defines.awk"'
"$ac_file_inputs"
-- } >"$ac_tmp/config.h" \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1;
then
-+ && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs"
-+ } >"$tmp/config.h" \
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
-+ if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1;
then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged"
>&5
- $as_echo "$as_me: $ac_file is unchanged" >&6;}
- else
- rm -f "$ac_file"
-- mv "$ac_tmp/config.h" "$ac_file" \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-+ mv "$tmp/config.h" "$ac_file" \
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
- fi
- else
- $as_echo "/* $configure_input */" \
-- && eval '$AWK -f "$ac_tmp/defines.awk"'
"$ac_file_inputs" \
-- || as_fn_error $? "could not create -" "$LINENO" 5
-+ && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs" \
-+ || as_fn_error "could not create -" "$LINENO" 5
- fi
- ;;
-
-@@ -15067,7 +15116,7 @@ _ACEOF
- ac_clean_files=$ac_clean_files_save
-
- test $ac_write_fail = 0 ||
-- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO"
5
-+ as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
- # configure is writing to config.log, and then calls config.status.
-@@ -15088,7 +15137,7 @@ if test "$no_create" != yes; then
- exec 5>>config.log
- # Use ||, not &&, to avoid exiting from the if with $? = 1, which
- # would make configure fail if this is the last instruction.
-- $ac_cs_success || as_fn_exit 1
-+ $ac_cs_success || as_fn_exit $?
- fi
- if test -n "$ac_unrecognized_opts" && test
"$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options:
$ac_unrecognized_opts" >&5
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2011-02-21 10:38:12.252957078 -0500
-+++ ./pyconfig.h.in 2011-02-21 10:38:17.743831724 -0500
+--- ./pyconfig.h.in.autotool-intermediates 2011-07-11 11:50:06.896426002 -0400
++++ ./pyconfig.h.in 2011-07-11 11:50:13.965426001 -0400
@@ -12,15 +12,15 @@
support for AIX C++ shared extension modules. */
#undef AIX_GENUINE_CPLUSPLUS
@@ -3582,13 +164,3 @@ diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
/* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
mixed-endian order (byte order 45670123) */
#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
-@@ -1161,6 +1161,9 @@
- /* This must be defined on some systems to enable large file support. */
- #undef _LARGEFILE_SOURCE
-
-+/* This must be defined on AIX systems to enable large file support. */
-+#undef _LARGE_FILES
-+
- /* Define to 1 if on MINIX. */
- #undef _MINIX
-
diff --git a/python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
b/python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
new file mode 100644
index 0000000..6f43c72
--- /dev/null
+++ b/python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
@@ -0,0 +1,12 @@
+diff -up Python-3.2.1/Lib/test/test_subprocess.py.non-readable-path
Python-3.2.1/Lib/test/test_subprocess.py
+--- Python-3.2.1/Lib/test/test_subprocess.py.non-readable-path 2011-07-09
02:58:51.000000000 -0400
++++ Python-3.2.1/Lib/test/test_subprocess.py 2011-07-11 11:34:16.284426005 -0400
+@@ -618,7 +618,7 @@ class ProcessTestCase(BaseTestCase):
+ for i in range(1024):
+ # Windows raises IOError. Others raise OSError.
+ with self.assertRaises(EnvironmentError) as c:
+- subprocess.Popen(['nonexisting_i_hope'],
++ subprocess.Popen(['/usr/bin/nonexisting_i_hope'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ # ignore errors that indicate the command was not found
diff --git a/python-3.2.1-lib64.patch b/python-3.2.1-lib64.patch
new file mode 100644
index 0000000..8b15e3e
--- /dev/null
+++ b/python-3.2.1-lib64.patch
@@ -0,0 +1,200 @@
+diff -up Python-3.2.1/Lib/distutils/command/install.py.lib64
Python-3.2.1/Lib/distutils/command/install.py
+--- Python-3.2.1/Lib/distutils/command/install.py.lib64 2011-07-09 02:58:46.000000000
-0400
++++ Python-3.2.1/Lib/distutils/command/install.py 2011-07-11 11:20:45.980426001 -0400
+@@ -47,14 +47,14 @@ else:
+ 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',
+diff -up Python-3.2.1/Lib/distutils/sysconfig.py.lib64
Python-3.2.1/Lib/distutils/sysconfig.py
+--- Python-3.2.1/Lib/distutils/sysconfig.py.lib64 2011-07-09 02:58:47.000000000 -0400
++++ Python-3.2.1/Lib/distutils/sysconfig.py 2011-07-11 11:20:45.981426001 -0400
+@@ -124,8 +124,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:
+diff -up Python-3.2.1/Lib/site.py.lib64 Python-3.2.1/Lib/site.py
+--- Python-3.2.1/Lib/site.py.lib64 2011-07-09 02:58:49.000000000 -0400
++++ Python-3.2.1/Lib/site.py 2011-07-11 11:20:45.982426001 -0400
+@@ -285,12 +285,16 @@ def getsitepackages():
+ if sys.platform in ('os2emx', 'riscos'):
+ sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
+ elif os.sep == '/':
++ sitepackages.append(os.path.join(prefix, "lib64",
++ "python" + sys.version[:3],
++ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
+ "python" + sys.version[:3],
+ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
+ else:
+ sitepackages.append(prefix)
++ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
+ if sys.platform == "darwin":
+ # for framework builds *only* we add the standard Apple
+diff -up Python-3.2.1/Lib/sysconfig.py.lib64 Python-3.2.1/Lib/sysconfig.py
+--- Python-3.2.1/Lib/sysconfig.py.lib64 2011-07-09 02:58:49.000000000 -0400
++++ Python-3.2.1/Lib/sysconfig.py 2011-07-11 11:20:45.982426001 -0400
+@@ -21,10 +21,10 @@ __all__ = [
+
+ _INSTALL_SCHEMES = {
+ 'posix_prefix': {
+- 'stdlib': '{base}/lib/python{py_version_short}',
+- 'platstdlib': '{platbase}/lib/python{py_version_short}',
++ 'stdlib': '{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':
+ '{base}/include/python{py_version_short}{abiflags}',
+ 'platinclude':
+@@ -81,10 +81,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}',
+diff -up Python-3.2.1/Lib/test/test_site.py.lib64 Python-3.2.1/Lib/test/test_site.py
+--- Python-3.2.1/Lib/test/test_site.py.lib64 2011-07-09 02:58:51.000000000 -0400
++++ Python-3.2.1/Lib/test/test_site.py 2011-07-11 11:20:45.983426001 -0400
+@@ -222,12 +222,15 @@ class HelperFunctionsTests(unittest.Test
+ wanted = os.path.join('xoxo', 'Lib',
'site-packages')
+ self.assertEqual(dirs[0], wanted)
+ elif os.sep == '/':
+- self.assertEqual(len(dirs), 2)
+- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ self.assertEqual(len(dirs), 3)
++ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
+ 'site-packages')
+ self.assertEqual(dirs[0], wanted)
+- wanted = os.path.join('xoxo', 'lib', 'site-python')
++ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ 'site-packages')
+ self.assertEqual(dirs[1], wanted)
++ wanted = os.path.join('xoxo', 'lib', 'site-python')
++ self.assertEqual(dirs[2], wanted)
+ else:
+ self.assertEqual(len(dirs), 2)
+ self.assertEqual(dirs[0], 'xoxo')
+diff -up Python-3.2.1/Makefile.pre.in.lib64 Python-3.2.1/Makefile.pre.in
+--- Python-3.2.1/Makefile.pre.in.lib64 2011-07-11 11:20:45.974426000 -0400
++++ Python-3.2.1/Makefile.pre.in 2011-07-11 11:20:45.984426001 -0400
+@@ -106,7 +106,7 @@ LIBDIR= @libdir@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/lib64
+ ABIFLAGS= @ABIFLAGS@
+
+ # Detailed destination directories
+diff -up Python-3.2.1/Modules/getpath.c.lib64 Python-3.2.1/Modules/getpath.c
+--- Python-3.2.1/Modules/getpath.c.lib64 2011-07-09 02:58:54.000000000 -0400
++++ Python-3.2.1/Modules/getpath.c 2011-07-11 11:27:44.596425999 -0400
+@@ -122,8 +122,8 @@
+ #endif
+
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
++ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
+ #endif
+
+ #ifndef LANDMARK
+@@ -135,7 +135,7 @@ static wchar_t exec_prefix[MAXPATHLEN+1]
+ static wchar_t progpath[MAXPATHLEN+1];
+ static wchar_t *module_search_path = NULL;
+ static int module_search_path_malloced = 0;
+-static wchar_t *lib_python = L"lib/python" VERSION;
++static wchar_t *lib_python = L"lib64/python" VERSION;
+
+ static void
+ reduce(wchar_t *dir)
+@@ -583,7 +583,7 @@ calculate_path(void)
+ }
+ else
+ wcsncpy(zip_path, _prefix, MAXPATHLEN);
+- joinpath(zip_path, L"lib/python00.zip");
++ joinpath(zip_path, L"lib64/python00.zip");
+ bufsz = wcslen(zip_path); /* Replace "00" with version */
+ zip_path[bufsz - 6] = VERSION[0];
+ zip_path[bufsz - 5] = VERSION[2];
+@@ -593,7 +593,7 @@ calculate_path(void)
+ fprintf(stderr,
+ "Could not find platform dependent libraries
<exec_prefix>\n");
+ wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
+- joinpath(exec_prefix, L"lib/lib-dynload");
++ joinpath(exec_prefix, L"lib64/lib-dynload");
+ }
+ /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+
+diff -up Python-3.2.1/setup.py.lib64 Python-3.2.1/setup.py
+--- Python-3.2.1/setup.py.lib64 2011-07-09 02:58:56.000000000 -0400
++++ Python-3.2.1/setup.py 2011-07-11 11:28:00.193426004 -0400
+@@ -396,7 +396,7 @@ class PyBuildExt(build_ext):
+ # Ensure that /usr/local is always used, but the local build
+ # directories (i.e. '.' and 'Include') must be first. See
issue
+ # 10520.
+- 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')
+ self.add_multiarch_paths()
+
+@@ -643,11 +643,11 @@ class PyBuildExt(build_ext):
+ elif curses_library:
+ readline_libs.append(curses_library)
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/lib64/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( 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:
+@@ -684,8 +684,8 @@ class PyBuildExt(build_ext):
+ if krb5_h:
+ ssl_incs += krb5_h
+ ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
+- ['/usr/local/ssl/lib',
+- '/usr/contrib/ssl/lib/'
++ ['/usr/local/ssl/lib64',
++ '/usr/contrib/ssl/lib64/'
+ ] )
+
+ if (ssl_incs is not None and
diff --git a/python-3.2.1-no-static-lib.patch b/python-3.2.1-no-static-lib.patch
new file mode 100644
index 0000000..3a6ac8a
--- /dev/null
+++ b/python-3.2.1-no-static-lib.patch
@@ -0,0 +1,59 @@
+diff -up Python-3.2.1/Makefile.pre.in.no-static-lib Python-3.2.1/Makefile.pre.in
+--- Python-3.2.1/Makefile.pre.in.no-static-lib 2011-07-09 02:58:52.000000000 -0400
++++ Python-3.2.1/Makefile.pre.in 2011-07-11 11:46:27.381425999 -0400
+@@ -425,7 +425,7 @@ coverage:
+
+
+ # Build the interpreter
+-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+ platform: $(BUILDPYTHON)
+@@ -439,18 +439,6 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ esac
+
+-# Build static library
+-# avoid long command lines, same as LIBRARY_OBJS
+-$(LIBRARY): $(LIBRARY_OBJS)
+- -rm -f $@
+- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
+- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
+- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
+- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODOBJS)
+- $(RANLIB) $@
+-
+ libpython$(LDVERSION).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
+@@ -540,7 +528,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
+ echo "-----------------------------------------------"; \
+ fi
+
+-Modules/_testembed: Modules/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++Modules/_testembed: Modules/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY)
$(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+ ############################################################################
+@@ -1058,18 +1046,6 @@ libainstall: all python-config
+ else true; \
+ fi; \
+ done
+- @if test -d $(LIBRARY); then :; else \
+- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+- if test "$(SO)" = .dll; then \
+- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
+- else \
+- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- fi; \
+- else \
+- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
+- fi; \
+- fi
+ $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
+ $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
b/python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
deleted file mode 100644
index f73d57a..0000000
--- a/python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up Python-3.2b2/Lib/test/test_subprocess.py.non-readable-path
Python-3.2b2/Lib/test/test_subprocess.py
---- Python-3.2b2/Lib/test/test_subprocess.py.non-readable-path 2010-12-29
16:25:38.498184175 -0500
-+++ Python-3.2b2/Lib/test/test_subprocess.py 2010-12-29 16:25:51.094184539 -0500
-@@ -578,7 +578,7 @@ class ProcessTestCase(BaseTestCase):
- for i in range(1024):
- # Windows raises IOError. Others raise OSError.
- with self.assertRaises(EnvironmentError) as c:
-- subprocess.Popen(['nonexisting_i_hope'],
-+ subprocess.Popen(['/usr/bin/nonexisting_i_hope'],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- if c.exception.errno != errno.ENOENT: # ignore "no such file"
diff --git a/python-3.2b2-lib64.patch b/python-3.2b2-lib64.patch
deleted file mode 100644
index 8d4e91f..0000000
--- a/python-3.2b2-lib64.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-diff -up Python-3.2b2/Lib/distutils/command/install.py.lib64
Python-3.2b2/Lib/distutils/command/install.py
---- Python-3.2b2/Lib/distutils/command/install.py.lib64 2010-11-24 22:46:44.000000000
-0500
-+++ Python-3.2b2/Lib/distutils/command/install.py 2010-12-29 10:21:55.510184563 -0500
-@@ -47,14 +47,14 @@ else:
- 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',
-diff -up Python-3.2b2/Lib/distutils/sysconfig.py.lib64
Python-3.2b2/Lib/distutils/sysconfig.py
---- Python-3.2b2/Lib/distutils/sysconfig.py.lib64 2010-11-24 14:43:47.000000000 -0500
-+++ Python-3.2b2/Lib/distutils/sysconfig.py 2010-12-29 10:21:55.510184563 -0500
-@@ -124,8 +124,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:
-diff -up Python-3.2b2/Lib/site.py.lib64 Python-3.2b2/Lib/site.py
---- Python-3.2b2/Lib/site.py.lib64 2010-10-12 18:23:23.000000000 -0400
-+++ Python-3.2b2/Lib/site.py 2010-12-29 10:21:55.511184595 -0500
-@@ -275,12 +275,16 @@ def getsitepackages():
- if sys.platform in ('os2emx', 'riscos'):
- sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
- elif os.sep == '/':
-+ sitepackages.append(os.path.join(prefix, "lib64",
-+ "python" + sys.version[:3],
-+ "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
- "python" + sys.version[:3],
- "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
- else:
- sitepackages.append(prefix)
-+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
- if sys.platform == "darwin":
- # for framework builds *only* we add the standard Apple
-diff -up Python-3.2b2/Lib/sysconfig.py.lib64 Python-3.2b2/Lib/sysconfig.py
---- Python-3.2b2/Lib/sysconfig.py.lib64 2010-11-24 20:34:47.000000000 -0500
-+++ Python-3.2b2/Lib/sysconfig.py 2010-12-29 10:21:55.512184877 -0500
-@@ -21,10 +21,10 @@ __all__ = [
-
- _INSTALL_SCHEMES = {
- 'posix_prefix': {
-- 'stdlib': '{base}/lib/python{py_version_short}',
-- 'platstdlib': '{platbase}/lib/python{py_version_short}',
-+ 'stdlib': '{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':
- '{base}/include/python{py_version_short}{abiflags}',
- 'platinclude':
-@@ -81,10 +81,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}',
-diff -up Python-3.2b2/Lib/test/test_site.py.lib64 Python-3.2b2/Lib/test/test_site.py
---- Python-3.2b2/Lib/test/test_site.py.lib64 2010-12-29 10:35:12.417308989 -0500
-+++ Python-3.2b2/Lib/test/test_site.py 2010-12-29 10:36:27.124059073 -0500
-@@ -164,12 +164,15 @@ class HelperFunctionsTests(unittest.Test
- wanted = os.path.join('xoxo', 'Lib',
'site-packages')
- self.assertEqual(dirs[0], wanted)
- elif os.sep == '/':
-- self.assertEqual(len(dirs), 2)
-- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ self.assertEqual(len(dirs), 3)
-+ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
- 'site-packages')
- self.assertEqual(dirs[0], wanted)
-- wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
-+ 'site-packages')
- self.assertEqual(dirs[1], wanted)
-+ wanted = os.path.join('xoxo', 'lib', 'site-python')
-+ self.assertEqual(dirs[2], wanted)
- else:
- self.assertEqual(len(dirs), 2)
- self.assertEqual(dirs[0], 'xoxo')
-diff -up Python-3.2b2/Makefile.pre.in.lib64 Python-3.2b2/Makefile.pre.in
---- Python-3.2b2/Makefile.pre.in.lib64 2010-12-29 10:21:55.506183982 -0500
-+++ Python-3.2b2/Makefile.pre.in 2010-12-29 10:21:55.512184877 -0500
-@@ -102,7 +102,7 @@ LIBDIR= @libdir@
- MANDIR= @mandir@
- INCLUDEDIR= @includedir@
- CONFINCLUDEDIR= $(exec_prefix)/include
--SCRIPTDIR= $(prefix)/lib
-+SCRIPTDIR= $(prefix)/lib64
- ABIFLAGS= @ABIFLAGS@
-
- # Detailed destination directories
-diff -up Python-3.2b2/Modules/getpath.c.lib64 Python-3.2b2/Modules/getpath.c
---- Python-3.2b2/Modules/getpath.c.lib64 2010-12-03 15:14:31.000000000 -0500
-+++ Python-3.2b2/Modules/getpath.c 2010-12-29 10:21:55.513184358 -0500
-@@ -122,8 +122,8 @@
- #endif
-
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
-+#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
-+ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
- #endif
-
- #ifndef LANDMARK
-@@ -134,7 +134,7 @@ static wchar_t prefix[MAXPATHLEN+1];
- static wchar_t exec_prefix[MAXPATHLEN+1];
- static wchar_t progpath[MAXPATHLEN+1];
- static wchar_t *module_search_path = NULL;
--static wchar_t *lib_python = L"lib/python" VERSION;
-+static wchar_t *lib_python = L"lib64/python" VERSION;
-
- static void
- reduce(wchar_t *dir)
-@@ -582,7 +582,7 @@ calculate_path(void)
- }
- else
- wcsncpy(zip_path, _prefix, MAXPATHLEN);
-- joinpath(zip_path, L"lib/python00.zip");
-+ joinpath(zip_path, L"lib64/python00.zip");
- bufsz = wcslen(zip_path); /* Replace "00" with version */
- zip_path[bufsz - 6] = VERSION[0];
- zip_path[bufsz - 5] = VERSION[2];
-@@ -592,7 +592,7 @@ calculate_path(void)
- fprintf(stderr,
- "Could not find platform dependent libraries
<exec_prefix>\n");
- wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
-- joinpath(exec_prefix, L"lib/lib-dynload");
-+ joinpath(exec_prefix, L"lib64/lib-dynload");
- }
- /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
-
-diff -up Python-3.2b2/setup.py.lib64 Python-3.2b2/setup.py
---- Python-3.2b2/setup.py.lib64 2010-12-04 13:36:03.000000000 -0500
-+++ Python-3.2b2/setup.py 2010-12-29 10:21:55.514184248 -0500
-@@ -373,7 +373,7 @@ class PyBuildExt(build_ext):
- # Ensure that /usr/local is always used, but the local build
- # directories (i.e. '.' and 'Include') must be first. See
issue
- # 10520.
-- 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')
-
- # Add paths specified in the environment variables LDFLAGS and
-@@ -619,11 +619,11 @@ class PyBuildExt(build_ext):
- elif curses_library:
- readline_libs.append(curses_library)
- elif self.compiler.find_library_file(lib_dirs +
-- ['/usr/lib/termcap'],
-+ ['/usr/lib64/termcap'],
- 'termcap'):
- readline_libs.append('termcap')
- exts.append( 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:
-@@ -660,8 +660,8 @@ class PyBuildExt(build_ext):
- if krb5_h:
- ssl_incs += krb5_h
- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-- ['/usr/local/ssl/lib',
-- '/usr/contrib/ssl/lib/'
-+ ['/usr/local/ssl/lib64',
-+ '/usr/contrib/ssl/lib64/'
- ] )
-
- if (ssl_incs is not None and
diff --git a/python-3.2rc1-no-static-lib.patch b/python-3.2rc1-no-static-lib.patch
deleted file mode 100644
index 5b32bc7..0000000
--- a/python-3.2rc1-no-static-lib.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-diff -up Python-3.2rc1/Makefile.pre.in.no-static-lib Python-3.2rc1/Makefile.pre.in
---- Python-3.2rc1/Makefile.pre.in.no-static-lib 2010-12-30 17:12:40.000000000 -0500
-+++ Python-3.2rc1/Makefile.pre.in 2011-01-17 12:58:32.123947161 -0500
-@@ -421,7 +421,7 @@ coverage:
-
-
- # Build the interpreter
--$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
-
- platform: $(BUILDPYTHON)
-@@ -435,18 +435,6 @@ sharedmods: $(BUILDPYTHON)
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
- esac
-
--# Build static library
--# avoid long command lines, same as LIBRARY_OBJS
--$(LIBRARY): $(LIBRARY_OBJS)
-- -rm -f $@
-- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
-- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
-- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
-- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODOBJS)
-- $(RANLIB) $@
--
- libpython$(LDVERSION).so: $(LIBRARY_OBJS)
- if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -1048,18 +1036,6 @@ libainstall: all python-config
- else true; \
- fi; \
- done
-- @if test -d $(LIBRARY); then :; else \
-- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-- if test "$(SO)" = .dll; then \
-- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
-- else \
-- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- fi; \
-- else \
-- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
-- fi; \
-- fi
- $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
- $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
- $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python3.spec b/python3.spec
index 39acd2c..bf7802e 100644
--- a/python3.spec
+++ b/python3.spec
@@ -117,8 +117,8 @@
# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}
-Release: 5%{?dist}
+Version: %{pybasever}.1
+Release: 1%{?dist}
License: Python
Group: Development/Languages
@@ -213,7 +213,7 @@ Patch3: python-3.2b2-remove-mimeaudio-tests.patch
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
# a libpythonMAJOR.MINOR.a (bug 550692):
-Patch6: python-3.2rc1-no-static-lib.patch
+Patch6: python-3.2.1-no-static-lib.patch
# Systemtap support: add statically-defined probe points
# Patch based on upstream bug:
http://bugs.python.org/issue4111
@@ -222,7 +222,7 @@ Patch6: python-3.2rc1-no-static-lib.patch
# dmalcolm
Patch8: python-3.2b2-systemtap.patch
-Patch102: python-3.2b2-lib64.patch
+Patch102: python-3.2.1-lib64.patch
# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
@@ -264,7 +264,7 @@ Patch128: python-3.2b2-test_sys-COUNT_ALLOCS.patch
# Work around this by specifying an absolute path for the non-existant
# executable
# Not yet sent upstream
-Patch129: python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
+Patch129: python-3.2.1-fix-test-subprocess-with-nonreadable-path-dir.patch
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
@@ -1278,6 +1278,11 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Mon Jul 11 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2.1-1
+- 3.2.1; refresh lib64 patch (102), subprocess unit test patch (129), disabling
+of static library build (due to Modules/_testembed; patch 6), autotool
+intermediates (patch 300)
+
* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
- use the gdb hooks from the upstream tarball, rather than keeping our own copy
diff --git a/sources b/sources
index 48f3848..b583b29 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-92e94b5b6652b96349d6362b8337811d Python-3.2.tar.bz2
+f0869ba3f3797aacb1f954ef24c256f3 Python-3.2.1.tar.bz2
commit cfd3e15f77961b3e43b4d2308da870bc0f104a2e
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Jul 8 14:10:58 2011 -0400
use the gdb hooks from the upstream tarball, rather than keeping our own copy
diff --git a/python3.spec b/python3.spec
index 8093bd6..39acd2c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
@@ -189,27 +189,6 @@ Source2: macros.python3
# with different Python runtimes as necessary:
Source3: macros.pybytecompile
-# We install a collection of hooks for gdb that make it easier to debug
-# executables linked against libpython (such as /usr/lib/python itself)
-#
-# These hooks are implemented in Python itself (though they are for the version
-# of python that gdb is linked with, in this case Python 2.6)
-#
-# gdb-archer looks for them in the same path as the ELF file, with a -gdb.py suffix.
-# We put them in the debuginfo package by installing them to e.g.:
-# /usr/lib/debug/usr/lib/libpython3.1.so.1.0.debug-gdb.py
-#
-# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
-# information
-#
-# This is the version from
-#
http://bugs.python.org/issue8380
-#
-# This is Tools/gdb/libpython.py from:
-#
http://bugs.python.org/file16902/port-gdb7-hooks-to-py3k.patch
-# when applied to r80008 of the py3k branch
-Source4: python-gdb.py
-
# Systemtap tapset to make it easier to use the systemtap static probes
# (actually a template; LIBRARY_PATH will get fixed up during install)
# Written by dmalcolm; not yet sent upstream
@@ -594,27 +573,39 @@ InstallPython() {
make install DESTDIR=%{buildroot} INSTALL="install -p"
+ popd
-# Copy up the gdb hooks into place; the python file will be autoloaded by gdb
-# when visiting libpython.so, provided that the python file is installed to the
-# same path as the library (or its .debug file) plus a "-gdb.py" suffix, e.g:
-# /usr/lib/debug/usr/lib64/libpython3.1.so.1.0.debug-gdb.py
-# (note that the debug path is /usr/lib/debug for both 32/64 bit)
-#
-# Initially I tried:
-# /usr/lib/libpython3.1.so.1.0-gdb.py
-# but doing so generated noise when ldconfig was rerun (rhbz:562980)
-#
+ # We install a collection of hooks for gdb that make it easier to debug
+ # executables linked against libpython3* (such as /usr/bin/python3 itself)
+ #
+ # These hooks are implemented in Python itself (though they are for the version
+ # of python that gdb is linked with, in this case Python 2.7)
+ #
+ # gdb-archer looks for them in the same path as the ELF file, with a -gdb.py suffix.
+ # We put them in the debuginfo package by installing them to e.g.:
+ # /usr/lib/debug/usr/lib/libpython3.2.so.1.0.debug-gdb.py
+ #
+ # See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
+ # information
+ #
+ # Copy up the gdb hooks into place; the python file will be autoloaded by gdb
+ # when visiting libpython.so, provided that the python file is installed to the
+ # same path as the library (or its .debug file) plus a "-gdb.py" suffix,
e.g:
+ # /usr/lib/debug/usr/lib64/libpython3.2.so.1.0.debug-gdb.py
+ # (note that the debug path is /usr/lib/debug for both 32/64 bit)
+ #
+ # Initially I tried:
+ # /usr/lib/libpython3.1.so.1.0-gdb.py
+ # but doing so generated noise when ldconfig was rerun (rhbz:562980)
+ #
%if 0%{?with_gdb_hooks}
-DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
-PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName.debug-gdb.py
+ DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+ PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName.debug-gdb.py
-mkdir -p %{buildroot}$DirHoldingGdbPy
-cp %{SOURCE4} %{buildroot}$PathOfGdbPy
+ mkdir -p %{buildroot}$DirHoldingGdbPy
+ cp Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
%endif # with_gdb_hooks
- popd
-
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -1287,6 +1278,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-5
+- use the gdb hooks from the upstream tarball, rather than keeping our own copy
+
* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
- don't run test_openpty and test_pty in %%check
commit 5db81fb1d8c1d926be6f2fde197eda1f29c1158a
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Jul 8 13:47:40 2011 -0400
don't run test_openpty and test_pty in %%check
diff --git a/python3.spec b/python3.spec
index 50cf0f2..8093bd6 100644
--- a/python3.spec
+++ b/python3.spec
@@ -118,7 +118,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
@@ -841,31 +841,65 @@ CheckPython() {
echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-# Run the upstream test suite
-LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest -x test_distutils test_httplib
test_http_cookies test_socket test_telnet
+ # Notes about disabled tests:
+ #
+ # test_distutils.py
+ # This one tries to build an RPM inside the rpmbuild; I'll simply
+ # let this one fail for now (has trouble linking against -lpython3.1; perhaps
+ # LD_LIBRARY_PATH is being discarded somewhere?)
+ #
+ # test_http*
+ # I've seen occasional hangs in some http tests when running the test suite
+ # inside Koji on Python 3. For that reason I exclude them
+ #
+ # test_openpty:
+ # Fails in Koji, possibly due to a mock issue (rhbz#714627)
+ # test test_openpty failed -- Traceback (most recent call last):
+ # File "/builddir/build/BUILD/Python-3.2/Lib/test/test_openpty.py",
line 12, in test
+ # master, slave = os.openpty()
+ # OSError: [Errno 2] No such file or directory
+ #
+ # test_pty:
+ # Fails in Koji, possibly due to a mock issue (rhbz#714627)
+ # test test_pty failed -- Traceback (most recent call last):
+ # File "/builddir/build/BUILD/Python-3.2/Lib/test/test_pty.py", line
114, in test_fork
+ # pid, master_fd = pty.fork()
+ # File "/builddir/build/BUILD/Python-3.2/Lib/pty.py", line 107, in
fork
+ # master_fd, slave_fd = openpty()
+ # File "/builddir/build/BUILD/Python-3.2/Lib/pty.py", line 29, in
openpty
+ # master_fd, slave_name = _open_terminal()
+ # File "/builddir/build/BUILD/Python-3.2/Lib/pty.py", line 70, in
_open_terminal
+ # raise os.error('out of pty devices')
+ # OSError: out of pty devices
+ #
+ # test_socket:
+ # test_socket.py:testSockName can fail here if DNS isn't properly set up:
+ # my_ip_addr = socket.gethostbyname(socket.gethostname())
+ # socket.gaierror: [Errno -2] Name or service not known
+ #
+ # test_telnet:
+ # can get a "socket.error: [Errno 104] Connection reset by peer"
+ #
+ # Some additional tests fail when running the test suite as non-root outside of
+ # the build, due to permissions issues.
-# Note that we're running the tests using the version of the code in the builddir,
-# not in the buildroot.
+ EXCLUDED_TESTS="\
+ test_distutils \
+ test_httplib \
+ test_http_cookies \
+ test_openpty \
+ test_pty.py \
+ test_socket \
+ test_telnet \
+ %{nil}"
-# I'm seeing occasional hangs in some http tests when running the test suite
-# inside Koji. For that reason I exclude them
-#
-# Other known failures:
-#
-# (1) test_distutils.py: tries to build an RPM inside the rpmbuild; I'll simply
-# let this one fail for now (has trouble linking against -lpython3.1; perhaps
-# LD_LIBRARY_PATH is being discarded somewhere?)
-#
-# (2) test_socket.py:testSockName can fail here if DNS isn't properly set up:
-# my_ip_addr = socket.gethostbyname(socket.gethostname())
-# socket.gaierror: [Errno -2] Name or service not known
-#
-# (3) test_telnet: can get a "socket.error: [Errno 104] Connection reset by
peer"
-#
-# Some additional tests fail when running the test suite as non-root outside of
-# the build, due to permissions issues.
+ # Note that we're running the tests using the version of the code in the builddir,
+ # not in the buildroot.
+
+ # Run the upstream test suite
+ LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest -x $EXCLUDED_TESTS
- echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfDir
+ echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
}
@@ -1253,6 +1287,9 @@ rm -fr %{buildroot}
# ======================================================
%changelog
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-4
+- don't run test_openpty and test_pty in %%check
+
* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
- cleanup of BuildRequires; add comment headings to specfile sections
commit c769a6b55048db039f0e345d5415d45324de4e82
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Fri Jul 8 12:54:16 2011 -0400
cleanup of BuildRequires; add comment headings to specfile sections
diff --git a/python3.spec b/python3.spec
index 18eed4f..50cf0f2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1,3 +1,7 @@
+# ======================================================
+# Conditionals and other variables controlling the build
+# ======================================================
+
%global pybasever 3.2
# pybasever without the dot:
@@ -108,13 +112,67 @@
%global regenerate_autotooling_patch 0
+# ==================
+# Top-level metadata
+# ==================
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
-Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
+
+
+# =======================
+# Build-time requirements
+# =======================
+
+# (keep this list alphabetized)
+
+BuildRequires: autoconf
+BuildRequires: bzip2
+BuildRequires: bzip2-devel
+BuildRequires: db4-devel >= 4.7
+BuildRequires: expat-devel
+BuildRequires: findutils
+BuildRequires: gcc-c++
+BuildRequires: gdbm-devel
+BuildRequires: glibc-devel
+BuildRequires: gmp-devel
+BuildRequires: libffi-devel
+BuildRequires: libGL-devel
+BuildRequires: libX11-devel
+BuildRequires: ncurses-devel
+BuildRequires: openssl-devel
+BuildRequires: pkgconfig
+BuildRequires: readline-devel
+BuildRequires: sqlite-devel
+
+%if 0%{?with_systemtap}
+BuildRequires: systemtap-sdt-devel
+# (this introduces a dependency on "python", in that systemtap-sdt-devel's
+# /usr/bin/dtrace is a python 2 script)
+%global tapsetdir /usr/share/systemtap/tapset
+%endif # with_systemtap
+
+BuildRequires: tar
+BuildRequires: tcl-devel
+BuildRequires: tix-devel
+BuildRequires: tk-devel
+
+%if 0%{?with_valgrind}
+BuildRequires: valgrind-devel
+%endif
+
+BuildRequires: zlib-devel
+
+
+
+# =======================
+# Source code and patches
+# =======================
+
+Source:
http://www.python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -235,22 +293,10 @@ Patch129:
python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
Patch300: autotool-intermediates.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
-BuildRequires: readline-devel, openssl-devel, gmp-devel
-BuildRequires: ncurses-devel, gdbm-devel, zlib-devel, expat-devel
-BuildRequires: libGL-devel gcc-c++ libX11-devel glibc-devel
-BuildRequires: bzip2 tar /usr/bin/find pkgconfig tcl-devel tk-devel
-BuildRequires: tix-devel bzip2-devel sqlite-devel
-BuildRequires: autoconf
-BuildRequires: db4-devel >= 4.7
-BuildRequires: libffi-devel
-%if 0%{?with_valgrind}
-BuildRequires: valgrind-devel
-%endif
-%if 0%{?with_systemtap}
-BuildRequires: systemtap-sdt-devel
-%global tapsetdir /usr/share/systemtap/tapset
-%endif
+# ======================================================
+# Additional metadata, and subpackages
+# ======================================================
URL:
http://www.python.org/
@@ -295,7 +341,6 @@ This package contains several tools included with Python 3
%package tkinter
Summary: A GUI toolkit for Python 3
Group: Development/Languages
-BuildRequires: tcl, tk
Requires: %{name} = %{version}-%{release}
%description tkinter
@@ -349,6 +394,10 @@ suffix ("foo_d.so" rather than "foo.so") so that
each Python 3 implementation
can load its own extensions.
%endif # with_debug_build
+# ======================================================
+# The prep phase of the build:
+# ======================================================
+
%prep
%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
@@ -413,6 +462,11 @@ sed --in-place \
%patch300 -p0 -b .autotool-intermediates
%endif
+
+# ======================================================
+# Configuring and building the code:
+# ======================================================
+
%build
topdir=$(pwd)
export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
@@ -517,6 +571,9 @@ BuildPython optimized \
"" \
true
+# ======================================================
+# Installing the built code:
+# ======================================================
%install
topdir=$(pwd)
@@ -771,6 +828,11 @@ sed \
%endif # with_systemtap
+
+# ======================================================
+# Running the upstream test suite
+# ======================================================
+
%check
topdir=$(pwd)
CheckPython() {
@@ -814,13 +876,27 @@ CheckPython debug
CheckPython optimized
+# ======================================================
+# Cleaning up
+# ======================================================
+
%clean
rm -fr %{buildroot}
+
+# ======================================================
+# Scriptlets
+# ======================================================
+
%post libs -p /sbin/ldconfig
%postun libs -p /sbin/ldconfig
+
+# ======================================================
+# Manifests of the various subpackages
+# ======================================================
+
%files
%defattr(-, root, root)
%doc LICENSE README
@@ -1172,7 +1248,14 @@ rm -fr %{buildroot}
# payload file would be unpackaged)
+# ======================================================
+# Finally, the changelog:
+# ======================================================
+
%changelog
+* Fri Jul 8 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-3
+- cleanup of BuildRequires; add comment headings to specfile sections
+
* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
- fix the libpython.stp systemtap tapset (rhbz#697730)
commit b0ba5d44f6218fe2eb159e6830f762d13d78bee3
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Apr 19 12:12:57 2011 -0400
fix the libpython.stp systemtap tapset (rhbz#697730)
diff --git a/python3.spec b/python3.spec
index da0df0a..18eed4f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -111,7 +111,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -759,13 +759,13 @@ mkdir -p %{buildroot}%{tapsetdir}
sed \
-e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_optimized}|" \
- %{SOURCE6} \
+ %{_sourcedir}/libpython.stp \
%{buildroot}%{tapsetdir}/%{libpython_stp_optimized}
%if 0%{?with_debug_build}
sed \
-e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_debug}|" \
- %{SOURCE6} \
+ %{_sourcedir}/libpython.stp \
%{buildroot}%{tapsetdir}/%{libpython_stp_debug}
%endif #
with_debug_build
@@ -1173,6 +1173,9 @@ rm -fr %{buildroot}
%changelog
+* Tue Apr 19 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-2
+- fix the libpython.stp systemtap tapset (rhbz#697730)
+
* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
- 3.2
- drop alphatag
commit e516bd5cb9cf4f77aa518ecd3a07469bdc2ef983
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Feb 21 11:28:42 2011 -0500
3.2
diff --git a/.gitignore b/.gitignore
index 0cadc11..8883189 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ Python-3.2a1.tar.bz2
/Python-3.2rc1.tar.bz2
/Python-3.2rc2.tar.bz2
/Python-3.2rc3.tar.bz2
+/Python-3.2.tar.bz2
diff --git a/autotool-intermediates.patch b/autotool-intermediates.patch
index c0fb3e3..f1c15e0 100644
--- a/autotool-intermediates.patch
+++ b/autotool-intermediates.patch
@@ -1,10 +1,10 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2011-02-14 12:00:34.929870493 -0500
-+++ ./configure 2011-02-14 12:00:40.794102692 -0500
+--- ./configure.autotool-intermediates 2011-02-21 10:38:12.253957171 -0500
++++ ./configure 2011-02-21 10:38:17.476956303 -0500
@@ -1,14 +1,14 @@
#! /bin/sh
--# From configure.in Revision: 87698 .
-+# From configure.in Revision: 88350 .
+-# From configure.in Revision: 88430 .
++# From configure.in Revision: 88440 .
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for python 3.2.
+# Generated by GNU Autoconf 2.65 for python 3.2.
@@ -1292,7 +1292,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_LINUX_NETLINK_H 1
_ACEOF
-@@ -6431,7 +6424,7 @@ EOF
+@@ -6438,7 +6431,7 @@ EOF
# Type availability checks
ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t"
"$ac_includes_default"
@@ -1301,7 +1301,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
-@@ -6442,7 +6435,7 @@ _ACEOF
+@@ -6449,7 +6442,7 @@ _ACEOF
fi
ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t"
"$ac_includes_default"
@@ -1310,7 +1310,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
-@@ -6453,7 +6446,7 @@ _ACEOF
+@@ -6460,7 +6453,7 @@ _ACEOF
fi
ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t"
"$ac_includes_default"
@@ -1319,7 +1319,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
-@@ -6469,7 +6462,7 @@ cat >>confdefs.h <<_ACEOF
+@@ -6476,7 +6469,7 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t"
"$ac_includes_default"
@@ -1328,7 +1328,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
-@@ -6481,7 +6474,7 @@ fi
+@@ -6488,7 +6481,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h"
>&5
$as_echo_n "checking for uid_t in sys/types.h... " >&6; }
@@ -1337,7 +1337,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -6560,7 +6553,7 @@ _ACEOF
+@@ -6567,7 +6560,7 @@ _ACEOF
esac
ac_fn_c_check_type "$LINENO" "ssize_t"
"ac_cv_type_ssize_t" "$ac_includes_default"
@@ -1346,7 +1346,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_SSIZE_T 1" >>confdefs.h
-@@ -6575,7 +6568,7 @@ fi
+@@ -6582,7 +6575,7 @@ fi
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
$as_echo_n "checking size of int... " >&6; }
@@ -1355,7 +1355,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))"
"ac_cv_sizeof_int" "$ac_includes_default"; then :
-@@ -6584,8 +6577,9 @@ else
+@@ -6591,8 +6584,9 @@ else
if test "$ac_cv_type_int" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1367,7 +1367,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_int=0
fi
-@@ -6608,7 +6602,7 @@ _ACEOF
+@@ -6615,7 +6609,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
$as_echo_n "checking size of long... " >&6; }
@@ -1376,7 +1376,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))"
"ac_cv_sizeof_long" "$ac_includes_default"; then :
-@@ -6617,8 +6611,9 @@ else
+@@ -6624,8 +6618,9 @@ else
if test "$ac_cv_type_long" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1388,7 +1388,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_long=0
fi
-@@ -6641,7 +6636,7 @@ _ACEOF
+@@ -6648,7 +6643,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
$as_echo_n "checking size of void *... " >&6; }
@@ -1397,7 +1397,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))"
"ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-@@ -6650,8 +6645,9 @@ else
+@@ -6657,8 +6652,9 @@ else
if test "$ac_cv_type_void_p" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1409,7 +1409,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_void_p=0
fi
-@@ -6674,7 +6670,7 @@ _ACEOF
+@@ -6681,7 +6677,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
$as_echo_n "checking size of short... " >&6; }
@@ -1418,7 +1418,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))"
"ac_cv_sizeof_short" "$ac_includes_default"; then :
-@@ -6683,8 +6679,9 @@ else
+@@ -6690,8 +6686,9 @@ else
if test "$ac_cv_type_short" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1430,7 +1430,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_short=0
fi
-@@ -6707,7 +6704,7 @@ _ACEOF
+@@ -6714,7 +6711,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
$as_echo_n "checking size of float... " >&6; }
@@ -1439,7 +1439,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))"
"ac_cv_sizeof_float" "$ac_includes_default"; then :
-@@ -6716,8 +6713,9 @@ else
+@@ -6723,8 +6720,9 @@ else
if test "$ac_cv_type_float" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1451,7 +1451,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_float=0
fi
-@@ -6740,7 +6738,7 @@ _ACEOF
+@@ -6747,7 +6745,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
$as_echo_n "checking size of double... " >&6; }
@@ -1460,7 +1460,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))"
"ac_cv_sizeof_double" "$ac_includes_default"; then :
-@@ -6749,8 +6747,9 @@ else
+@@ -6756,8 +6754,9 @@ else
if test "$ac_cv_type_double" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1472,7 +1472,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_double=0
fi
-@@ -6773,7 +6772,7 @@ _ACEOF
+@@ -6780,7 +6779,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fpos_t" >&5
$as_echo_n "checking size of fpos_t... " >&6; }
@@ -1481,7 +1481,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fpos_t))"
"ac_cv_sizeof_fpos_t" "$ac_includes_default"; then :
-@@ -6782,8 +6781,9 @@ else
+@@ -6789,8 +6788,9 @@ else
if test "$ac_cv_type_fpos_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1493,7 +1493,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_fpos_t=0
fi
-@@ -6806,7 +6806,7 @@ _ACEOF
+@@ -6813,7 +6813,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
$as_echo_n "checking size of size_t... " >&6; }
@@ -1502,7 +1502,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))"
"ac_cv_sizeof_size_t" "$ac_includes_default"; then :
-@@ -6815,8 +6815,9 @@ else
+@@ -6822,8 +6822,9 @@ else
if test "$ac_cv_type_size_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1514,7 +1514,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_size_t=0
fi
-@@ -6839,7 +6840,7 @@ _ACEOF
+@@ -6846,7 +6847,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pid_t" >&5
$as_echo_n "checking size of pid_t... " >&6; }
@@ -1523,7 +1523,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pid_t))"
"ac_cv_sizeof_pid_t" "$ac_includes_default"; then :
-@@ -6848,8 +6849,9 @@ else
+@@ -6855,8 +6856,9 @@ else
if test "$ac_cv_type_pid_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1535,7 +1535,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_pid_t=0
fi
-@@ -6899,7 +6901,7 @@ if test "$have_long_long" = yes ; then
+@@ -6906,7 +6908,7 @@ if test "$have_long_long" = yes ; then
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long"
>&5
$as_echo_n "checking size of long long... " >&6; }
@@ -1544,7 +1544,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))"
"ac_cv_sizeof_long_long" "$ac_includes_default"; then :
-@@ -6908,8 +6910,9 @@ else
+@@ -6915,8 +6917,9 @@ else
if test "$ac_cv_type_long_long" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1556,7 +1556,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_long_long=0
fi
-@@ -6960,7 +6963,7 @@ if test "$have_long_double" = yes ; then
+@@ -6967,7 +6970,7 @@ if test "$have_long_double" = yes ; then
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double"
>&5
$as_echo_n "checking size of long double... " >&6; }
@@ -1565,7 +1565,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long
double))" "ac_cv_sizeof_long_double"
"$ac_includes_default"; then :
-@@ -6969,8 +6972,9 @@ else
+@@ -6976,8 +6979,9 @@ else
if test "$ac_cv_type_long_double" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1577,7 +1577,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_long_double=0
fi
-@@ -7022,7 +7026,7 @@ if test "$have_c99_bool" = yes ; then
+@@ -7029,7 +7033,7 @@ if test "$have_c99_bool" = yes ; then
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of _Bool" >&5
$as_echo_n "checking size of _Bool... " >&6; }
@@ -1586,7 +1586,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (_Bool))"
"ac_cv_sizeof__Bool" "$ac_includes_default"; then :
-@@ -7031,8 +7035,9 @@ else
+@@ -7038,8 +7042,9 @@ else
if test "$ac_cv_type__Bool" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1598,7 +1598,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof__Bool=0
fi
-@@ -7058,7 +7063,7 @@ ac_fn_c_check_type "$LINENO" "uintptr_t"
+@@ -7065,7 +7070,7 @@ ac_fn_c_check_type "$LINENO" "uintptr_t"
#include <inttypes.h>
#endif
"
@@ -1607,7 +1607,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_UINTPTR_T 1
-@@ -7070,7 +7075,7 @@ _ACEOF
+@@ -7077,7 +7082,7 @@ _ACEOF
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of uintptr_t"
>&5
$as_echo_n "checking size of uintptr_t... " >&6; }
@@ -1616,7 +1616,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (uintptr_t))"
"ac_cv_sizeof_uintptr_t" "$ac_includes_default"; then :
-@@ -7079,8 +7084,9 @@ else
+@@ -7086,8 +7091,9 @@ else
if test "$ac_cv_type_uintptr_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1628,7 +1628,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_uintptr_t=0
fi
-@@ -7106,7 +7112,7 @@ fi
+@@ -7113,7 +7119,7 @@ fi
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
$as_echo_n "checking size of off_t... " >&6; }
@@ -1637,7 +1637,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))"
"ac_cv_sizeof_off_t" "
-@@ -7120,8 +7126,9 @@ else
+@@ -7127,8 +7133,9 @@ else
if test "$ac_cv_type_off_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1649,7 +1649,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_off_t=0
fi
-@@ -7165,7 +7172,7 @@ fi
+@@ -7172,7 +7179,7 @@ fi
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
$as_echo_n "checking size of time_t... " >&6; }
@@ -1658,7 +1658,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))"
"ac_cv_sizeof_time_t" "
-@@ -7182,8 +7189,9 @@ else
+@@ -7189,8 +7196,9 @@ else
if test "$ac_cv_type_time_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1670,7 +1670,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_time_t=0
fi
-@@ -7240,7 +7248,7 @@ if test "$have_pthread_t" = yes ; then
+@@ -7247,7 +7255,7 @@ if test "$have_pthread_t" = yes ; then
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t"
>&5
$as_echo_n "checking size of pthread_t... " >&6; }
@@ -1679,7 +1679,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))"
"ac_cv_sizeof_pthread_t" "
-@@ -7254,8 +7262,9 @@ else
+@@ -7261,8 +7269,9 @@ else
if test "$ac_cv_type_pthread_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -1691,7 +1691,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_pthread_t=0
fi
-@@ -7342,7 +7351,7 @@ fi
+@@ -7349,7 +7358,7 @@ fi
MACOSX_DEFAULT_ARCH="ppc"
;;
*)
@@ -1700,7 +1700,7 @@ diff -up ./configure.autotool-intermediates ./configure
;;
esac
else
-@@ -7354,7 +7363,7 @@ fi
+@@ -7361,7 +7370,7 @@ fi
MACOSX_DEFAULT_ARCH="ppc64"
;;
*)
@@ -1709,7 +1709,7 @@ diff -up ./configure.autotool-intermediates ./configure
;;
esac
-@@ -7380,7 +7389,7 @@ $as_echo "#define WITH_NEXT_FRAMEWORK 1"
+@@ -7387,7 +7396,7 @@ $as_echo "#define WITH_NEXT_FRAMEWORK 1"
$as_echo "yes" >&6; }
if test $enable_shared = "yes"
then
@@ -1718,7 +1718,7 @@ diff -up ./configure.autotool-intermediates ./configure
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-@@ -7687,7 +7696,7 @@ $as_echo "$SHLIBS" >&6; }
+@@ -7694,7 +7703,7 @@ $as_echo "$SHLIBS" >&6; }
# checks for libraries
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl"
>&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
@@ -1727,7 +1727,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -7721,7 +7730,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -7728,7 +7737,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen"
>&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
@@ -1736,7 +1736,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBDL 1
_ACEOF
-@@ -7732,7 +7741,7 @@ fi
+@@ -7739,7 +7748,7 @@ fi
# Dynamic linking for SunOS/Solaris and SYSV
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld"
>&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
@@ -1745,7 +1745,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -7766,7 +7775,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -7773,7 +7782,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load"
>&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
@@ -1754,7 +1754,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBDLD 1
_ACEOF
-@@ -7780,7 +7789,7 @@ fi
+@@ -7787,7 +7796,7 @@ fi
if test "$with_threads" = "yes" -o -z "$with_threads";
then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing
sem_init" >&5
$as_echo_n "checking for library containing sem_init... " >&6; }
@@ -1763,7 +1763,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_func_search_save_LIBS=$LIBS
-@@ -7814,11 +7823,11 @@ for ac_lib in '' pthread rt posix4; do
+@@ -7821,11 +7830,11 @@ for ac_lib in '' pthread rt posix4; do
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext
@@ -1777,7 +1777,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_search_sem_init=no
-@@ -7841,7 +7850,7 @@ fi
+@@ -7848,7 +7857,7 @@ fi
# check if we need libintl for locale functions
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for textdomain in -lintl"
>&5
$as_echo_n "checking for textdomain in -lintl... " >&6; }
@@ -1786,7 +1786,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -7875,7 +7884,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -7882,7 +7891,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_textdomain"
>&5
$as_echo "$ac_cv_lib_intl_textdomain" >&6; }
@@ -1795,7 +1795,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_LIBINTL 1" >>confdefs.h
-@@ -7922,7 +7931,7 @@ esac
+@@ -7929,7 +7938,7 @@ esac
# Most SVR4 platforms (e.g. Solaris) need -lsocket and -lnsl.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for t_open in -lnsl"
>&5
$as_echo_n "checking for t_open in -lnsl... " >&6; }
@@ -1804,7 +1804,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -7956,13 +7965,13 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -7963,13 +7972,13 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_t_open"
>&5
$as_echo "$ac_cv_lib_nsl_t_open" >&6; }
@@ -1820,7 +1820,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -7996,7 +8005,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -8003,7 +8012,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket"
>&5
$as_echo "$ac_cv_lib_socket_socket" >&6; }
@@ -1829,7 +1829,7 @@ diff -up ./configure.autotool-intermediates ./configure
LIBS="-lsocket $LIBS"
fi
# SVR4 sockets
-@@ -8022,7 +8031,7 @@ if test -n "$ac_tool_prefix"; then
+@@ -8029,7 +8038,7 @@ if test -n "$ac_tool_prefix"; then
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
@@ -1838,7 +1838,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
case $PKG_CONFIG in
-@@ -8065,7 +8074,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; the
+@@ -8072,7 +8081,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; the
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
@@ -1847,7 +1847,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
case $ac_pt_PKG_CONFIG in
-@@ -8176,12 +8185,12 @@ if test "${with_dbmliborder+set}" = set;
+@@ -8183,12 +8192,12 @@ if test "${with_dbmliborder+set}" = set;
withval=$with_dbmliborder;
if test x$with_dbmliborder = xyes
then
@@ -1862,7 +1862,7 @@ diff -up ./configure.autotool-intermediates ./configure
fi
done
fi
-@@ -8347,7 +8356,7 @@ $as_echo "$unistd_defines_pthreads" >&6;
+@@ -8354,7 +8363,7 @@ $as_echo "$unistd_defines_pthreads" >&6;
$as_echo "#define _REENTRANT 1" >>confdefs.h
ac_fn_c_check_header_mongrel "$LINENO" "cthreads.h"
"ac_cv_header_cthreads_h" "$ac_includes_default"
@@ -1871,7 +1871,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
$as_echo "#define C_THREADS 1" >>confdefs.h
-@@ -8360,7 +8369,7 @@ $as_echo "#define HURD_C_THREADS 1" >>co
+@@ -8367,7 +8376,7 @@ $as_echo "#define HURD_C_THREADS 1" >>co
else
ac_fn_c_check_header_mongrel "$LINENO" "mach/cthreads.h"
"ac_cv_header_mach_cthreads_h" "$ac_includes_default"
@@ -1880,7 +1880,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
$as_echo "#define C_THREADS 1" >>confdefs.h
-@@ -8404,7 +8413,7 @@ else
+@@ -8411,7 +8420,7 @@ else
LIBS=$_libs
ac_fn_c_check_func "$LINENO" "pthread_detach"
"ac_cv_func_pthread_detach"
@@ -1889,7 +1889,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
posix_threads=yes
-@@ -8413,7 +8422,7 @@ else
+@@ -8420,7 +8429,7 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lpthreads" >&5
$as_echo_n "checking for pthread_create in -lpthreads... " >&6; }
@@ -1898,7 +1898,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -8447,7 +8456,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -8454,7 +8463,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_pthreads_pthread_create" >&5
$as_echo "$ac_cv_lib_pthreads_pthread_create" >&6; }
@@ -1907,7 +1907,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
posix_threads=yes
-@@ -8457,7 +8466,7 @@ else
+@@ -8464,7 +8473,7 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lc_r" >&5
$as_echo_n "checking for pthread_create in -lc_r... " >&6; }
@@ -1916,7 +1916,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -8491,7 +8500,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -8498,7 +8507,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_c_r_pthread_create" >&5
$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
@@ -1925,7 +1925,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
posix_threads=yes
-@@ -8501,7 +8510,7 @@ else
+@@ -8508,7 +8517,7 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_create_system
in -lpthread" >&5
$as_echo_n "checking for __pthread_create_system in -lpthread... " >&6;
}
@@ -1934,7 +1934,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -8535,7 +8544,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -8542,7 +8551,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_pthread___pthread_create_system" >&5
$as_echo "$ac_cv_lib_pthread___pthread_create_system" >&6; }
@@ -1943,7 +1943,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
posix_threads=yes
-@@ -8545,7 +8554,7 @@ else
+@@ -8552,7 +8561,7 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lcma" >&5
$as_echo_n "checking for pthread_create in -lcma... " >&6; }
@@ -1952,7 +1952,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -8579,7 +8588,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -8586,7 +8595,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_cma_pthread_create" >&5
$as_echo "$ac_cv_lib_cma_pthread_create" >&6; }
@@ -1961,7 +1961,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
posix_threads=yes
-@@ -8611,7 +8620,7 @@ fi
+@@ -8618,7 +8627,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for usconfig in -lmpc"
>&5
$as_echo_n "checking for usconfig in -lmpc... " >&6; }
@@ -1970,7 +1970,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -8645,7 +8654,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -8652,7 +8661,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpc_usconfig"
>&5
$as_echo "$ac_cv_lib_mpc_usconfig" >&6; }
@@ -1979,7 +1979,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
LIBS="$LIBS -lmpc"
-@@ -8657,7 +8666,7 @@ fi
+@@ -8664,7 +8673,7 @@ fi
if test "$posix_threads" != "yes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for thr_create in
-lthread" >&5
$as_echo_n "checking for thr_create in -lthread... " >&6; }
@@ -1988,7 +1988,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -8691,7 +8700,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -8698,7 +8707,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_thread_thr_create"
>&5
$as_echo "$ac_cv_lib_thread_thr_create" >&6; }
@@ -1997,7 +1997,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define WITH_THREAD 1" >>confdefs.h
LIBS="$LIBS -lthread"
-@@ -8740,7 +8749,7 @@ $as_echo "#define HAVE_BROKEN_POSIX_SEMA
+@@ -8747,7 +8756,7 @@ $as_echo "#define HAVE_BROKEN_POSIX_SEMA
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if PTHREAD_SCOPE_SYSTEM is
supported" >&5
$as_echo_n "checking if PTHREAD_SCOPE_SYSTEM is supported... " >&6; }
@@ -2006,7 +2006,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -8783,7 +8792,7 @@ $as_echo "#define PTHREAD_SYSTEM_SCHED_S
+@@ -8790,7 +8799,7 @@ $as_echo "#define PTHREAD_SYSTEM_SCHED_S
for ac_func in pthread_sigmask
do :
ac_fn_c_check_func "$LINENO" "pthread_sigmask"
"ac_cv_func_pthread_sigmask"
@@ -2015,7 +2015,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_PTHREAD_SIGMASK 1
_ACEOF
-@@ -9136,6 +9145,50 @@ $as_echo "no" >&6; }
+@@ -9143,6 +9152,50 @@ $as_echo "no" >&6; }
fi
@@ -2066,7 +2066,7 @@ diff -up ./configure.autotool-intermediates ./configure
# Check for Python-specific malloc support
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
$as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -9175,12 +9228,12 @@ fi
+@@ -9182,12 +9235,12 @@ fi
$as_echo "$with_valgrind" >&6; }
if test "$with_valgrind" != no; then
ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h"
"ac_cv_header_valgrind_valgrind_h" "$ac_includes_default"
@@ -2081,7 +2081,7 @@ diff -up ./configure.autotool-intermediates ./configure
fi
-@@ -9188,6 +9241,46 @@ fi
+@@ -9195,6 +9248,46 @@ fi
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -2128,7 +2128,7 @@ diff -up ./configure.autotool-intermediates ./configure
# -I${DLINCLDIR} is added to the compile rule for importdl.o
DLINCLDIR=.
-@@ -9197,7 +9290,7 @@ DLINCLDIR=.
+@@ -9204,7 +9297,7 @@ DLINCLDIR=.
for ac_func in dlopen
do :
ac_fn_c_check_func "$LINENO" "dlopen"
"ac_cv_func_dlopen"
@@ -2137,7 +2137,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_DLOPEN 1
_ACEOF
-@@ -9274,7 +9367,8 @@ for ac_func in alarm accept4 setitimer g
+@@ -9281,7 +9374,8 @@ for ac_func in alarm accept4 setitimer g
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -2147,7 +2147,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
-@@ -9524,7 +9618,7 @@ rm -f core conftest.err conftest.$ac_obj
+@@ -9531,7 +9625,7 @@ rm -f core conftest.err conftest.$ac_obj
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock declaration"
>&5
$as_echo_n "checking for flock declaration... " >&6; }
@@ -2156,7 +2156,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -9554,7 +9648,7 @@ if test "x${ac_cv_flock_decl}" = xyes; t
+@@ -9561,7 +9655,7 @@ if test "x${ac_cv_flock_decl}" = xyes; t
for ac_func in flock
do :
ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock"
@@ -2165,7 +2165,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_FLOCK 1
_ACEOF
-@@ -9562,7 +9656,7 @@ _ACEOF
+@@ -9569,7 +9663,7 @@ _ACEOF
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock in -lbsd"
>&5
$as_echo_n "checking for flock in -lbsd... " >&6; }
@@ -2174,7 +2174,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -9596,7 +9690,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -9603,7 +9697,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_flock"
>&5
$as_echo "$ac_cv_lib_bsd_flock" >&6; }
@@ -2183,7 +2183,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_FLOCK 1" >>confdefs.h
-@@ -9645,7 +9739,7 @@ do
+@@ -9652,7 +9746,7 @@ do
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
@@ -2192,7 +2192,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test -n "$TRUE"; then
-@@ -9685,7 +9779,7 @@ test -n "$TRUE" || TRUE="/bin/true"
+@@ -9692,7 +9786,7 @@ test -n "$TRUE" || TRUE="/bin/true"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lc"
>&5
$as_echo_n "checking for inet_aton in -lc... " >&6; }
@@ -2201,7 +2201,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -9719,12 +9813,12 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -9726,12 +9820,12 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_inet_aton"
>&5
$as_echo "$ac_cv_lib_c_inet_aton" >&6; }
@@ -2216,7 +2216,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -9758,7 +9852,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -9765,7 +9859,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton"
>&5
$as_echo "$ac_cv_lib_resolv_inet_aton" >&6; }
@@ -2225,7 +2225,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBRESOLV 1
_ACEOF
-@@ -9775,7 +9869,7 @@ fi
+@@ -9782,7 +9876,7 @@ fi
# exit Python
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for chflags" >&5
$as_echo_n "checking for chflags... " >&6; }
@@ -2234,7 +2234,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -9809,7 +9903,7 @@ fi
+@@ -9816,7 +9910,7 @@ fi
$as_echo "$ac_cv_have_chflags" >&6; }
if test "$ac_cv_have_chflags" = cross ; then
ac_fn_c_check_func "$LINENO" "chflags"
"ac_cv_func_chflags"
@@ -2243,7 +2243,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_cv_have_chflags="yes"
else
ac_cv_have_chflags="no"
-@@ -9824,7 +9918,7 @@ fi
+@@ -9831,7 +9925,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for lchflags" >&5
$as_echo_n "checking for lchflags... " >&6; }
@@ -2252,7 +2252,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -9858,7 +9952,7 @@ fi
+@@ -9865,7 +9959,7 @@ fi
$as_echo "$ac_cv_have_lchflags" >&6; }
if test "$ac_cv_have_lchflags" = cross ; then
ac_fn_c_check_func "$LINENO" "lchflags"
"ac_cv_func_lchflags"
@@ -2261,7 +2261,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_cv_have_lchflags="yes"
else
ac_cv_have_lchflags="no"
-@@ -9882,7 +9976,7 @@ esac
+@@ -9889,7 +9983,7 @@ esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -lz"
>&5
$as_echo_n "checking for inflateCopy in -lz... " >&6; }
@@ -2270,7 +2270,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -9916,7 +10010,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -9923,7 +10017,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateCopy"
>&5
$as_echo "$ac_cv_lib_z_inflateCopy" >&6; }
@@ -2279,7 +2279,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_ZLIB_COPY 1" >>confdefs.h
-@@ -10059,7 +10153,7 @@ rm -f core conftest.err conftest.$ac_obj
+@@ -10066,7 +10160,7 @@ rm -f core conftest.err conftest.$ac_obj
for ac_func in openpty
do :
ac_fn_c_check_func "$LINENO" "openpty"
"ac_cv_func_openpty"
@@ -2288,7 +2288,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_OPENPTY 1
_ACEOF
-@@ -10067,7 +10161,7 @@ _ACEOF
+@@ -10074,7 +10168,7 @@ _ACEOF
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil"
>&5
$as_echo_n "checking for openpty in -lutil... " >&6; }
@@ -2297,7 +2297,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -10101,13 +10195,13 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -10108,13 +10202,13 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty"
>&5
$as_echo "$ac_cv_lib_util_openpty" >&6; }
@@ -2313,7 +2313,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -10141,7 +10235,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -10148,7 +10242,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_openpty"
>&5
$as_echo "$ac_cv_lib_bsd_openpty" >&6; }
@@ -2322,7 +2322,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_OPENPTY 1" >>confdefs.h
LIBS="$LIBS -lbsd"
fi
-@@ -10156,7 +10250,7 @@ done
+@@ -10163,7 +10257,7 @@ done
for ac_func in forkpty
do :
ac_fn_c_check_func "$LINENO" "forkpty"
"ac_cv_func_forkpty"
@@ -2331,7 +2331,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_FORKPTY 1
_ACEOF
-@@ -10164,7 +10258,7 @@ _ACEOF
+@@ -10171,7 +10265,7 @@ _ACEOF
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil"
>&5
$as_echo_n "checking for forkpty in -lutil... " >&6; }
@@ -2340,7 +2340,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -10198,13 +10292,13 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -10205,13 +10299,13 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty"
>&5
$as_echo "$ac_cv_lib_util_forkpty" >&6; }
@@ -2356,7 +2356,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -10238,7 +10332,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -10245,7 +10339,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_forkpty"
>&5
$as_echo "$ac_cv_lib_bsd_forkpty" >&6; }
@@ -2365,7 +2365,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
LIBS="$LIBS -lbsd"
fi
-@@ -10255,7 +10349,7 @@ done
+@@ -10262,7 +10356,7 @@ done
for ac_func in memmove
do :
ac_fn_c_check_func "$LINENO" "memmove"
"ac_cv_func_memmove"
@@ -2374,7 +2374,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_MEMMOVE 1
_ACEOF
-@@ -10269,7 +10363,8 @@ for ac_func in fseek64 fseeko fstatvfs f
+@@ -10276,7 +10370,8 @@ for ac_func in fseek64 fseeko fstatvfs f
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -2384,7 +2384,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
-@@ -10278,50 +10373,31 @@ fi
+@@ -10285,50 +10380,31 @@ fi
done
@@ -2448,7 +2448,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_GETPGRP 1
_ACEOF
-@@ -10349,7 +10425,7 @@ done
+@@ -10356,7 +10432,7 @@ done
for ac_func in setpgrp
do :
ac_fn_c_check_func "$LINENO" "setpgrp"
"ac_cv_func_setpgrp"
@@ -2457,7 +2457,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_SETPGRP 1
_ACEOF
-@@ -10377,7 +10453,7 @@ done
+@@ -10384,7 +10460,7 @@ done
for ac_func in gettimeofday
do :
ac_fn_c_check_func "$LINENO" "gettimeofday"
"ac_cv_func_gettimeofday"
@@ -2466,7 +2466,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_GETTIMEOFDAY 1
_ACEOF
-@@ -10479,7 +10555,7 @@ if test $have_getaddrinfo = yes
+@@ -10486,7 +10562,7 @@ if test $have_getaddrinfo = yes
then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking getaddrinfo bug"
>&5
$as_echo_n "checking getaddrinfo bug... " >&6; }
@@ -2475,7 +2475,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -10608,7 +10684,7 @@ fi
+@@ -10615,7 +10691,7 @@ fi
for ac_func in getnameinfo
do :
ac_fn_c_check_func "$LINENO" "getnameinfo"
"ac_cv_func_getnameinfo"
@@ -2484,7 +2484,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_GETNAMEINFO 1
_ACEOF
-@@ -10620,7 +10696,7 @@ done
+@@ -10627,7 +10703,7 @@ done
# checks for structures
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may
both be included" >&5
$as_echo_n "checking whether time.h and sys/time.h may both be included... "
>&6; }
@@ -2493,7 +2493,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10655,7 +10731,7 @@ fi
+@@ -10662,7 +10738,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in
sys/time.h or time.h" >&5
$as_echo_n "checking whether struct tm is in sys/time.h or time.h... "
>&6; }
@@ -2502,7 +2502,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10692,7 +10768,7 @@ ac_fn_c_check_member "$LINENO" "struct t
+@@ -10699,7 +10775,7 @@ ac_fn_c_check_member "$LINENO" "struct t
#include <$ac_cv_struct_tm>
"
@@ -2511,7 +2511,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_TM_TM_ZONE 1
-@@ -10708,7 +10784,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
+@@ -10715,7 +10791,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
else
ac_fn_c_check_decl "$LINENO" "tzname"
"ac_cv_have_decl_tzname" "#include <time.h>
"
@@ -2520,7 +2520,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_have_decl=1
else
ac_have_decl=0
-@@ -10720,7 +10796,7 @@ _ACEOF
+@@ -10727,7 +10803,7 @@ _ACEOF
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
$as_echo_n "checking for tzname... " >&6; }
@@ -2529,7 +2529,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10756,7 +10832,7 @@ $as_echo "#define HAVE_TZNAME 1" >>confd
+@@ -10763,7 +10839,7 @@ $as_echo "#define HAVE_TZNAME 1" >>confd
fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev"
"ac_cv_member_struct_stat_st_rdev" "$ac_includes_default"
@@ -2538,7 +2538,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_RDEV 1
-@@ -10766,7 +10842,7 @@ _ACEOF
+@@ -10773,7 +10849,7 @@ _ACEOF
fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize"
"ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
@@ -2547,7 +2547,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
-@@ -10776,7 +10852,7 @@ _ACEOF
+@@ -10783,7 +10859,7 @@ _ACEOF
fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_flags"
"ac_cv_member_struct_stat_st_flags" "$ac_includes_default"
@@ -2556,7 +2556,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_FLAGS 1
-@@ -10786,7 +10862,7 @@ _ACEOF
+@@ -10793,7 +10869,7 @@ _ACEOF
fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_gen"
"ac_cv_member_struct_stat_st_gen" "$ac_includes_default"
@@ -2565,7 +2565,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_GEN 1
-@@ -10796,7 +10872,7 @@ _ACEOF
+@@ -10803,7 +10879,7 @@ _ACEOF
fi
ac_fn_c_check_member "$LINENO" "struct stat"
"st_birthtime" "ac_cv_member_struct_stat_st_birthtime"
"$ac_includes_default"
@@ -2574,7 +2574,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1
-@@ -10806,7 +10882,7 @@ _ACEOF
+@@ -10813,7 +10889,7 @@ _ACEOF
fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks"
"ac_cv_member_struct_stat_st_blocks" "$ac_includes_default"
@@ -2583,7 +2583,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BLOCKS 1
-@@ -10828,7 +10904,7 @@ fi
+@@ -10835,7 +10911,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for time.h that defines
altzone" >&5
$as_echo_n "checking for time.h that defines altzone... " >&6; }
@@ -2592,7 +2592,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -10892,7 +10968,7 @@ $as_echo "$was_it_defined" >&6; }
+@@ -10899,7 +10975,7 @@ $as_echo "$was_it_defined" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for addrinfo" >&5
$as_echo_n "checking for addrinfo... " >&6; }
@@ -2601,7 +2601,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10924,7 +11000,7 @@ fi
+@@ -10931,7 +11007,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sockaddr_storage"
>&5
$as_echo_n "checking for sockaddr_storage... " >&6; }
@@ -2610,7 +2610,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10960,7 +11036,7 @@ fi
+@@ -10967,7 +11043,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned"
>&5
$as_echo_n "checking whether char is unsigned... " >&6; }
@@ -2619,7 +2619,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -10992,7 +11068,7 @@ fi
+@@ -10999,7 +11075,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming
const" >&5
$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
@@ -2628,7 +2628,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -11280,7 +11356,7 @@ $as_echo "$va_list_is_array" >&6; }
+@@ -11287,7 +11363,7 @@ $as_echo "$va_list_is_array" >&6; }
ac_fn_c_check_func "$LINENO" "gethostbyname_r"
"ac_cv_func_gethostbyname_r"
@@ -2637,7 +2637,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h
-@@ -11411,7 +11487,7 @@ else
+@@ -11418,7 +11494,7 @@ else
for ac_func in gethostbyname
do :
ac_fn_c_check_func "$LINENO" "gethostbyname"
"ac_cv_func_gethostbyname"
@@ -2646,7 +2646,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_GETHOSTBYNAME 1
_ACEOF
-@@ -11433,12 +11509,12 @@ fi
+@@ -11440,12 +11516,12 @@ fi
# Linux requires this for correct f.p. operations
ac_fn_c_check_func "$LINENO" "__fpu_control"
"ac_cv_func___fpu_control"
@@ -2661,7 +2661,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -11472,7 +11548,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -11479,7 +11555,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_ieee___fpu_control" >&5
$as_echo "$ac_cv_lib_ieee___fpu_control" >&6; }
@@ -2670,7 +2670,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBIEEE 1
_ACEOF
-@@ -11528,7 +11604,7 @@ elif test "$withval" != yes
+@@ -11535,7 +11611,7 @@ elif test "$withval" != yes
then LIBM=$withval
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBM=\"$withval\"" >&5
$as_echo "set LIBM=\"$withval\"" >&6; }
@@ -2679,7 +2679,7 @@ diff -up ./configure.autotool-intermediates ./configure
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBM=\"$LIBM\"" >&5
-@@ -11552,7 +11628,7 @@ elif test "$withval" != yes
+@@ -11559,7 +11635,7 @@ elif test "$withval" != yes
then LIBC=$withval
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBC=\"$withval\"" >&5
$as_echo "set LIBC=\"$withval\"" >&6; }
@@ -2688,7 +2688,7 @@ diff -up ./configure.autotool-intermediates ./configure
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBC=\"$LIBC\"" >&5
-@@ -11566,7 +11642,7 @@ fi
+@@ -11573,7 +11649,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are
little-endian IEEE 754 binary64" >&5
$as_echo_n "checking whether C doubles are little-endian IEEE 754 binary64...
" >&6; }
@@ -2697,7 +2697,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -11608,7 +11684,7 @@ fi
+@@ -11615,7 +11691,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are big-endian
IEEE 754 binary64" >&5
$as_echo_n "checking whether C doubles are big-endian IEEE 754 binary64... "
>&6; }
@@ -2706,7 +2706,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -11654,7 +11730,7 @@ fi
+@@ -11661,7 +11737,7 @@ fi
# conversions work.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are ARM
mixed-endian IEEE 754 binary64" >&5
$as_echo_n "checking whether C doubles are ARM mixed-endian IEEE 754 binary64...
" >&6; }
@@ -2715,7 +2715,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -11802,7 +11878,8 @@ for ac_func in acosh asinh atanh copysig
+@@ -11809,7 +11885,8 @@ for ac_func in acosh asinh atanh copysig
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -2725,7 +2725,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
-@@ -11814,7 +11891,8 @@ for ac_func in hypot lgamma log1p round
+@@ -11821,7 +11898,8 @@ for ac_func in hypot lgamma log1p round
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -2735,7 +2735,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
-@@ -11824,7 +11902,7 @@ done
+@@ -11831,7 +11909,7 @@ done
ac_fn_c_check_decl "$LINENO" "isinf"
"ac_cv_have_decl_isinf" "#include <math.h>
"
@@ -2744,7 +2744,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_have_decl=1
else
ac_have_decl=0
-@@ -11835,7 +11913,7 @@ cat >>confdefs.h <<_ACEOF
+@@ -11842,7 +11920,7 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
ac_fn_c_check_decl "$LINENO" "isnan"
"ac_cv_have_decl_isnan" "#include <math.h>
"
@@ -2753,7 +2753,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_have_decl=1
else
ac_have_decl=0
-@@ -11846,7 +11924,7 @@ cat >>confdefs.h <<_ACEOF
+@@ -11853,7 +11931,7 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
ac_fn_c_check_decl "$LINENO" "isfinite"
"ac_cv_have_decl_isfinite" "#include <math.h>
"
@@ -2762,7 +2762,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_have_decl=1
else
ac_have_decl=0
-@@ -11861,7 +11939,7 @@ _ACEOF
+@@ -11868,7 +11946,7 @@ _ACEOF
# -0. on some architectures.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tanh preserves the sign
of zero" >&5
$as_echo_n "checking whether tanh preserves the sign of zero... " >&6;
}
@@ -2771,7 +2771,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -11909,7 +11987,7 @@ then
+@@ -11916,7 +11994,7 @@ then
# -0. See issue #9920.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether log1p drops the sign
of negative zero" >&5
$as_echo_n "checking whether log1p drops the sign of negative zero... "
>&6; }
@@ -2780,7 +2780,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -11961,7 +12039,7 @@ LIBS=$LIBS_SAVE
+@@ -11968,7 +12046,7 @@ LIBS=$LIBS_SAVE
# sem_open results in a 'Signal 12' error.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX semaphores are
enabled" >&5
$as_echo_n "checking whether POSIX semaphores are enabled... " >&6; }
@@ -2789,7 +2789,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -12012,7 +12090,7 @@ fi
+@@ -12019,7 +12097,7 @@ fi
# Multiprocessing check for broken sem_getvalue
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken sem_getvalue"
>&5
$as_echo_n "checking for broken sem_getvalue... " >&6; }
@@ -2798,7 +2798,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -12077,7 +12155,7 @@ no)
+@@ -12084,7 +12162,7 @@ no)
15|30)
;;
*)
@@ -2807,7 +2807,7 @@ diff -up ./configure.autotool-intermediates ./configure
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits"
>&5
$as_echo "$enable_big_digits" >&6; }
-@@ -12095,7 +12173,7 @@ fi
+@@ -12102,7 +12180,7 @@ fi
# check for wchar.h
ac_fn_c_check_header_mongrel "$LINENO" "wchar.h"
"ac_cv_header_wchar_h" "$ac_includes_default"
@@ -2816,7 +2816,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_WCHAR_H 1" >>confdefs.h
-@@ -12118,7 +12196,7 @@ then
+@@ -12125,7 +12203,7 @@ then
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5
$as_echo_n "checking size of wchar_t... " >&6; }
@@ -2825,7 +2825,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))"
"ac_cv_sizeof_wchar_t" "#include <wchar.h>
-@@ -12128,8 +12206,9 @@ else
+@@ -12135,8 +12213,9 @@ else
if test "$ac_cv_type_wchar_t" = yes; then
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -2837,7 +2837,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_cv_sizeof_wchar_t=0
fi
-@@ -12184,7 +12263,7 @@ then
+@@ -12191,7 +12270,7 @@ then
# check whether wchar_t is signed or not
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wchar_t is signed"
>&5
$as_echo_n "checking whether wchar_t is signed... " >&6; }
@@ -2846,7 +2846,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -12280,7 +12359,7 @@ $as_echo "$PY_UNICODE_TYPE" >&6; }
+@@ -12287,7 +12366,7 @@ $as_echo "$PY_UNICODE_TYPE" >&6; }
# check for endianness
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is
bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
@@ -2855,7 +2855,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_cv_c_bigendian=unknown
-@@ -12498,7 +12577,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUI
+@@ -12505,7 +12584,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUI
;; #(
*)
@@ -2864,7 +2864,7 @@ diff -up ./configure.autotool-intermediates ./configure
presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
esac
-@@ -12571,7 +12650,7 @@ $as_echo "$SO" >&6; }
+@@ -12578,7 +12657,7 @@ $as_echo "$SO" >&6; }
# or fills with zeros (like the Cray J90, according to Tim Peters).
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether right shift extends the
sign bit" >&5
$as_echo_n "checking whether right shift extends the sign bit... " >&6;
}
@@ -2873,7 +2873,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -12610,7 +12689,7 @@ fi
+@@ -12617,7 +12696,7 @@ fi
# check for getc_unlocked and related locking functions
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getc_unlocked() and
friends" >&5
$as_echo_n "checking for getc_unlocked() and friends... " >&6; }
@@ -2882,7 +2882,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -12708,7 +12787,7 @@ fi
+@@ -12715,7 +12794,7 @@ fi
# check for readline 2.1
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_callback_handler_install
in -lreadline" >&5
$as_echo_n "checking for rl_callback_handler_install in -lreadline... "
>&6; }
@@ -2891,7 +2891,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -12742,7 +12821,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -12749,7 +12828,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_callback_handler_install" >&5
$as_echo "$ac_cv_lib_readline_rl_callback_handler_install" >&6; }
@@ -2900,7 +2900,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_RL_CALLBACK 1" >>confdefs.h
-@@ -12760,7 +12839,7 @@ else
+@@ -12767,7 +12846,7 @@ else
have_readline=no
fi
@@ -2909,7 +2909,7 @@ diff -up ./configure.autotool-intermediates ./configure
if test $have_readline = yes
then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -12794,7 +12873,7 @@ fi
+@@ -12801,7 +12880,7 @@ fi
# check for readline 4.0
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in
-lreadline" >&5
$as_echo_n "checking for rl_pre_input_hook in -lreadline... " >&6; }
@@ -2918,7 +2918,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -12828,7 +12907,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -12835,7 +12914,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_pre_input_hook" >&5
$as_echo "$ac_cv_lib_readline_rl_pre_input_hook" >&6; }
@@ -2927,7 +2927,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h
-@@ -12838,7 +12917,7 @@ fi
+@@ -12845,7 +12924,7 @@ fi
# also in 4.0
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for
rl_completion_display_matches_hook in -lreadline" >&5
$as_echo_n "checking for rl_completion_display_matches_hook in -lreadline... "
>&6; }
@@ -2936,7 +2936,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -12872,7 +12951,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -12879,7 +12958,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_completion_display_matches_hook" >&5
$as_echo "$ac_cv_lib_readline_rl_completion_display_matches_hook" >&6;
}
@@ -2945,7 +2945,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1"
>>confdefs.h
-@@ -12882,7 +12961,7 @@ fi
+@@ -12889,7 +12968,7 @@ fi
# check for readline 4.2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in
-lreadline" >&5
$as_echo_n "checking for rl_completion_matches in -lreadline... " >&6;
}
@@ -2954,7 +2954,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
-@@ -12916,7 +12995,7 @@ LIBS=$ac_check_lib_save_LIBS
+@@ -12923,7 +13002,7 @@ LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_completion_matches" >&5
$as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; }
@@ -2963,7 +2963,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h
-@@ -12934,7 +13013,7 @@ else
+@@ -12941,7 +13020,7 @@ else
have_readline=no
fi
@@ -2972,7 +2972,7 @@ diff -up ./configure.autotool-intermediates ./configure
if test $have_readline = yes
then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -12957,7 +13036,7 @@ LIBS=$LIBS_no_readline
+@@ -12964,7 +13043,7 @@ LIBS=$LIBS_no_readline
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken nice()"
>&5
$as_echo_n "checking for broken nice()... " >&6; }
@@ -2981,7 +2981,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -12998,7 +13077,7 @@ fi
+@@ -13005,7 +13084,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll()"
>&5
$as_echo_n "checking for broken poll()... " >&6; }
@@ -2990,7 +2990,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -13053,7 +13132,7 @@ ac_fn_c_check_member "$LINENO" "struct t
+@@ -13060,7 +13139,7 @@ ac_fn_c_check_member "$LINENO" "struct t
#include <$ac_cv_struct_tm>
"
@@ -2999,7 +2999,7 @@ diff -up ./configure.autotool-intermediates ./configure
cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_TM_TM_ZONE 1
-@@ -13069,7 +13148,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
+@@ -13076,7 +13155,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
else
ac_fn_c_check_decl "$LINENO" "tzname"
"ac_cv_have_decl_tzname" "#include <time.h>
"
@@ -3008,7 +3008,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_have_decl=1
else
ac_have_decl=0
-@@ -13081,7 +13160,7 @@ _ACEOF
+@@ -13088,7 +13167,7 @@ _ACEOF
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
$as_echo_n "checking for tzname... " >&6; }
@@ -3017,7 +3017,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13120,7 +13199,7 @@ fi
+@@ -13127,7 +13206,7 @@ fi
# check tzset(3) exists and works like we expect it to
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working tzset()"
>&5
$as_echo_n "checking for working tzset()... " >&6; }
@@ -3026,7 +3026,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
-@@ -13217,7 +13296,7 @@ fi
+@@ -13224,7 +13303,7 @@ fi
# Look for subsecond timestamps in struct stat
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec in struct stat"
>&5
$as_echo_n "checking for tv_nsec in struct stat... " >&6; }
@@ -3035,7 +3035,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13254,7 +13333,7 @@ fi
+@@ -13261,7 +13340,7 @@ fi
# Look for BSD style subsecond timestamps in struct stat
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec2 in struct stat"
>&5
$as_echo_n "checking for tv_nsec2 in struct stat... " >&6; }
@@ -3044,7 +3044,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13291,7 +13370,7 @@ fi
+@@ -13298,7 +13377,7 @@ fi
# On HP/UX 11.0, mvwdelch is a block with a return statement
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mvwdelch is an
expression" >&5
$as_echo_n "checking whether mvwdelch is an expression... " >&6; }
@@ -3053,7 +3053,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13328,7 +13407,7 @@ fi
+@@ -13335,7 +13414,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether WINDOW has _flags"
>&5
$as_echo_n "checking whether WINDOW has _flags... " >&6; }
@@ -3062,7 +3062,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13476,7 +13555,7 @@ if test "$have_long_long" = yes
+@@ -13483,7 +13562,7 @@ if test "$have_long_long" = yes
then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for %lld and %llu printf()
format support" >&5
$as_echo_n "checking for %lld and %llu printf() format support... "
>&6; }
@@ -3071,7 +3071,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -13546,7 +13625,7 @@ fi
+@@ -13553,7 +13632,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for %zd printf() format
support" >&5
$as_echo_n "checking for %zd printf() format support... " >&6; }
@@ -3080,7 +3080,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -13619,7 +13698,7 @@ ac_fn_c_check_type "$LINENO" "socklen_t"
+@@ -13626,7 +13705,7 @@ ac_fn_c_check_type "$LINENO" "socklen_t"
#endif
"
@@ -3089,7 +3089,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
-@@ -13630,7 +13709,7 @@ fi
+@@ -13637,7 +13716,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken mbstowcs"
>&5
$as_echo_n "checking for broken mbstowcs... " >&6; }
@@ -3098,7 +3098,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -13670,7 +13749,7 @@ fi
+@@ -13677,7 +13756,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports computed
gotos" >&5
$as_echo_n "checking whether $CC supports computed gotos... " >&6; }
@@ -3107,7 +3107,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
-@@ -13750,11 +13829,11 @@ esac
+@@ -13757,11 +13836,11 @@ esac
case $ac_sys_system in
@@ -3121,7 +3121,7 @@ diff -up ./configure.autotool-intermediates ./configure
$as_echo "#define HAVE_PIPE2 1" >>confdefs.h
-@@ -13849,21 +13928,10 @@ $as_echo "$as_me: WARNING: cache variabl
+@@ -13856,21 +13935,10 @@ $as_echo "$as_me: WARNING: cache variabl
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
@@ -3145,7 +3145,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache
$cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-@@ -13879,7 +13947,6 @@ DEFS=-DHAVE_CONFIG_H
+@@ -13886,7 +13954,6 @@ DEFS=-DHAVE_CONFIG_H
ac_libobjs=
ac_ltlibobjs=
@@ -3153,7 +3153,7 @@ diff -up ./configure.autotool-intermediates ./configure
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-@@ -13896,7 +13963,7 @@ LTLIBOBJS=$ac_ltlibobjs
+@@ -13903,7 +13970,7 @@ LTLIBOBJS=$ac_ltlibobjs
@@ -3162,7 +3162,7 @@ diff -up ./configure.autotool-intermediates ./configure
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-@@ -13997,7 +14064,6 @@ fi
+@@ -14004,7 +14071,6 @@ fi
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
@@ -3170,7 +3170,7 @@ diff -up ./configure.autotool-intermediates ./configure
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -14043,19 +14109,19 @@ export LANGUAGE
+@@ -14050,19 +14116,19 @@ export LANGUAGE
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
@@ -3198,7 +3198,7 @@ diff -up ./configure.autotool-intermediates ./configure
as_fn_exit $as_status
} # as_fn_error
-@@ -14251,7 +14317,7 @@ $as_echo X"$as_dir" |
+@@ -14258,7 +14324,7 @@ $as_echo X"$as_dir" |
test -d "$as_dir" && break
done
test -z "$as_dirs" || eval "mkdir $as_dirs"
@@ -3207,7 +3207,7 @@ diff -up ./configure.autotool-intermediates ./configure
} # as_fn_mkdir_p
-@@ -14305,7 +14371,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+@@ -14312,7 +14378,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
# values after options handling.
ac_log="
This file was extended by python $as_me 3.2, which was
@@ -3216,7 +3216,7 @@ diff -up ./configure.autotool-intermediates ./configure
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
-@@ -14367,10 +14433,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+@@ -14374,10 +14440,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
python config.status 3.2
@@ -3229,7 +3229,7 @@ diff -up ./configure.autotool-intermediates ./configure
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
-@@ -14386,16 +14452,11 @@ ac_need_defaults=:
+@@ -14393,16 +14459,11 @@ ac_need_defaults=:
while test $# != 0
do
case $1 in
@@ -3247,7 +3247,7 @@ diff -up ./configure.autotool-intermediates ./configure
*)
ac_option=$1
ac_optarg=$2
-@@ -14417,7 +14478,6 @@ do
+@@ -14424,7 +14485,6 @@ do
$ac_shift
case $ac_optarg in
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed
"s/'/'\\\\\\\\''/g"` ;;
@@ -3255,7 +3255,7 @@ diff -up ./configure.autotool-intermediates ./configure
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
-@@ -14430,7 +14490,7 @@ do
+@@ -14437,7 +14497,7 @@ do
ac_need_defaults=false;;
--he | --h)
# Conflict between --help and --header
@@ -3264,7 +3264,7 @@ diff -up ./configure.autotool-intermediates ./configure
Try \`$0 --help' for more information.";;
--help | --hel | -h )
$as_echo "$ac_cs_usage"; exit ;;
-@@ -14439,7 +14499,7 @@ Try \`$0 --help' for more information.";
+@@ -14446,7 +14506,7 @@ Try \`$0 --help' for more information.";
ac_cs_silent=: ;;
# This is an error.
@@ -3273,7 +3273,7 @@ diff -up ./configure.autotool-intermediates ./configure
Try \`$0 --help' for more information." ;;
*) as_fn_append ac_config_targets " $1"
-@@ -14498,7 +14558,7 @@ do
+@@ -14505,7 +14565,7 @@ do
"Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc"
;;
"Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES
Modules/ld_so_aix" ;;
@@ -3282,7 +3282,7 @@ diff -up ./configure.autotool-intermediates ./configure
esac
done
-@@ -14520,10 +14580,9 @@ fi
+@@ -14527,10 +14587,9 @@ fi
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
@@ -3295,7 +3295,7 @@ diff -up ./configure.autotool-intermediates ./configure
' 0
trap 'as_fn_exit 1' 1 2 13 15
}
-@@ -14531,13 +14590,12 @@ $debug ||
+@@ -14538,13 +14597,12 @@ $debug ||
{
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null`
&&
@@ -3311,7 +3311,7 @@ diff -up ./configure.autotool-intermediates ./configure
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
-@@ -14554,12 +14612,12 @@ if test "x$ac_cr" = x; then
+@@ -14561,12 +14619,12 @@ if test "x$ac_cr" = x; then
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null
2>/dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
@@ -3326,7 +3326,7 @@ diff -up ./configure.autotool-intermediates ./configure
_ACEOF
-@@ -14568,18 +14626,18 @@ _ACEOF
+@@ -14575,18 +14633,18 @@ _ACEOF
echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/'
&&
echo "_ACEOF"
} >conf$$subs.sh ||
@@ -3349,7 +3349,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
-@@ -14587,7 +14645,7 @@ done
+@@ -14594,7 +14652,7 @@ done
rm -f conf$$subs.sh
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
@@ -3358,7 +3358,7 @@ diff -up ./configure.autotool-intermediates ./configure
_ACEOF
sed -n '
h
-@@ -14635,7 +14693,7 @@ t delim
+@@ -14642,7 +14700,7 @@ t delim
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
@@ -3367,7 +3367,7 @@ diff -up ./configure.autotool-intermediates ./configure
for (key in S) S_is_set[key] = 1
FS = ""
-@@ -14667,29 +14725,21 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n
+@@ -14674,29 +14732,21 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
cat
@@ -3406,7 +3406,7 @@ diff -up ./configure.autotool-intermediates ./configure
s/^[^=]*=[ ]*$//
}'
fi
-@@ -14701,7 +14751,7 @@ fi # test -n "$CONFIG_FILES"
+@@ -14708,7 +14758,7 @@ fi # test -n "$CONFIG_FILES"
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
@@ -3415,7 +3415,7 @@ diff -up ./configure.autotool-intermediates ./configure
BEGIN {
_ACEOF
-@@ -14713,11 +14763,11 @@ _ACEOF
+@@ -14720,11 +14770,11 @@ _ACEOF
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
@@ -3430,7 +3430,7 @@ diff -up ./configure.autotool-intermediates ./configure
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
-@@ -14802,7 +14852,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+@@ -14809,7 +14859,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
@@ -3439,7 +3439,7 @@ diff -up ./configure.autotool-intermediates ./configure
fi # test -n "$CONFIG_HEADERS"
-@@ -14815,7 +14865,7 @@ do
+@@ -14822,7 +14872,7 @@ do
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
@@ -3448,7 +3448,7 @@ diff -up ./configure.autotool-intermediates ./configure
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
-@@ -14834,7 +14884,7 @@ do
+@@ -14841,7 +14891,7 @@ do
for ac_f
do
case $ac_f in
@@ -3457,7 +3457,7 @@ diff -up ./configure.autotool-intermediates ./configure
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'.
-@@ -14843,7 +14893,7 @@ do
+@@ -14850,7 +14900,7 @@ do
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
@@ -3466,7 +3466,7 @@ diff -up ./configure.autotool-intermediates ./configure
esac
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed
"s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
-@@ -14869,8 +14919,8 @@ $as_echo "$as_me: creating $ac_file" >&6
+@@ -14876,8 +14926,8 @@ $as_echo "$as_me: creating $ac_file" >&6
esac
case $ac_tag in
@@ -3477,7 +3477,7 @@ diff -up ./configure.autotool-intermediates ./configure
esac
;;
esac
-@@ -15000,24 +15050,23 @@ s&@abs_top_builddir@&$ac_abs_top_builddi
+@@ -15007,24 +15057,23 @@ s&@abs_top_builddir@&$ac_abs_top_builddi
s&@INSTALL@&$ac_INSTALL&;t t
$ac_datarootdir_hack
"
@@ -3512,7 +3512,7 @@ diff -up ./configure.autotool-intermediates ./configure
;;
:H)
#
-@@ -15026,21 +15075,21 @@ which seems to be undefined. Please mak
+@@ -15033,21 +15082,21 @@ which seems to be undefined. Please mak
if test x"$ac_file" != x-; then
{
$as_echo "/* $configure_input */" \
@@ -3542,7 +3542,7 @@ diff -up ./configure.autotool-intermediates ./configure
fi
;;
-@@ -15060,7 +15109,7 @@ _ACEOF
+@@ -15067,7 +15116,7 @@ _ACEOF
ac_clean_files=$ac_clean_files_save
test $ac_write_fail = 0 ||
@@ -3551,7 +3551,7 @@ diff -up ./configure.autotool-intermediates ./configure
# configure is writing to config.log, and then calls config.status.
-@@ -15081,7 +15130,7 @@ if test "$no_create" != yes; then
+@@ -15088,7 +15137,7 @@ if test "$no_create" != yes; then
exec 5>>config.log
# Use ||, not &&, to avoid exiting from the if with $? = 1, which
# would make configure fail if this is the last instruction.
@@ -3561,8 +3561,8 @@ diff -up ./configure.autotool-intermediates ./configure
if test -n "$ac_unrecognized_opts" && test
"$enable_option_checking" != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options:
$ac_unrecognized_opts" >&5
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2011-02-14 12:00:34.924103677 -0500
-+++ ./pyconfig.h.in 2011-02-14 12:00:41.116907489 -0500
+--- ./pyconfig.h.in.autotool-intermediates 2011-02-21 10:38:12.252957078 -0500
++++ ./pyconfig.h.in 2011-02-21 10:38:17.743831724 -0500
@@ -12,15 +12,15 @@
support for AIX C++ shared extension modules. */
#undef AIX_GENUINE_CPLUSPLUS
@@ -3582,3 +3582,13 @@ diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
/* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
mixed-endian order (byte order 45670123) */
#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
+@@ -1161,6 +1161,9 @@
+ /* This must be defined on some systems to enable large file support. */
+ #undef _LARGEFILE_SOURCE
+
++/* This must be defined on AIX systems to enable large file support. */
++#undef _LARGE_FILES
++
+ /* Define to 1 if on MINIX. */
+ #undef _MINIX
+
diff --git a/python3.spec b/python3.spec
index 4428f43..da0df0a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,8 +3,6 @@
# pybasever without the dot:
%global pyshortver 32
-%global alphatag rc3
-
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -113,10 +111,10 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.13.%{alphatag}%{?dist}
+Release: 1%{?dist}
License: Python
Group: Development/Languages
-Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
+Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -352,7 +350,7 @@ can load its own extensions.
%endif # with_debug_build
%prep
-%setup -q -n Python-%{version}%{alphatag}
+%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
%if 0%{?with_systemtap}
@@ -837,7 +835,7 @@ rm -fr %{buildroot}
%doc LICENSE README
%dir %{pylibdir}
%dir %{dynload_dir}
-%{dynload_dir}/Python-%{version}%{alphatag}-py%{pybasever}.egg-info
+%{dynload_dir}/Python-%{version}-py%{pybasever}.egg-info
%{dynload_dir}/_bisect.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
@@ -1175,6 +1173,11 @@ rm -fr %{buildroot}
%changelog
+* Mon Feb 21 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-1
+- 3.2
+- drop alphatag
+- regenerate autotool patch
+
* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
- add a /usr/bin/python3-debug symlink within the debug subpackage
diff --git a/sources b/sources
index 3bc9e24..48f3848 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-25379af4bb6b0001e175d9d9b2ba4f63 Python-3.2rc3.tar.bz2
+92e94b5b6652b96349d6362b8337811d Python-3.2.tar.bz2
commit 9640a7e460c7242ae17327b4c39e892173c0c368
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Feb 14 19:13:27 2011 -0500
Add a /usr/bin/python3-debug symlink within the debug subpackage
diff --git a/python3.spec b/python3.spec
index 0d79ab1..4428f43 100644
--- a/python3.spec
+++ b/python3.spec
@@ -113,7 +113,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.12.%{alphatag}%{?dist}
+Release: 0.13.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -737,6 +737,13 @@ for Module in %{buildroot}/%{dynload_dir}/*.so ; do
esac
done
+# Create "/usr/bin/python3-debug", a symlink to the python3 debug binary, to
+# avoid the user having to know the precise version and ABI flags. (see
+# e.g. rhbz#676748):
+ln -s \
+ %{_bindir}/python%{LDVERSION_debug} \
+ %{buildroot}%{_bindir}/python3-debug
+
#
# Systemtap hooks:
#
@@ -1063,6 +1070,7 @@ rm -fr %{buildroot}
# Analog of the core subpackage's files:
%{_bindir}/python%{LDVERSION_debug}
+%{_bindir}/python3-debug
# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
@@ -1167,6 +1175,9 @@ rm -fr %{buildroot}
%changelog
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.13.rc3
+- add a /usr/bin/python3-debug symlink within the debug subpackage
+
* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
- 3.2rc3
- regenerate autotool patch
commit bb2fef9eec4b7509f5fa3557c380a3f7442022ef
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Feb 14 13:57:03 2011 -0500
Upload 3.2rc3 to lookaside
diff --git a/.gitignore b/.gitignore
index b48c536..0cadc11 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ Python-3.2a1.tar.bz2
/Python-3.2b2.tar.bz2
/Python-3.2rc1.tar.bz2
/Python-3.2rc2.tar.bz2
+/Python-3.2rc3.tar.bz2
diff --git a/sources b/sources
index 6a1dee9..3bc9e24 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-57ba48501a4261f3c227585b07629e27 Python-3.2rc2.tar.bz2
+25379af4bb6b0001e175d9d9b2ba4f63 Python-3.2rc3.tar.bz2
commit 3f75b3e8930d76d07e281739c07cdc362ce320de
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Feb 14 13:55:48 2011 -0500
3.2rc3
diff --git a/autotool-intermediates.patch b/autotool-intermediates.patch
index fa49d8b..c0fb3e3 100644
--- a/autotool-intermediates.patch
+++ b/autotool-intermediates.patch
@@ -1,14 +1,100 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2011-01-17 13:09:50.836697224 -0500
-+++ ./configure 2011-01-17 13:09:56.662690482 -0500
-@@ -1,5 +1,5 @@
+--- ./configure.autotool-intermediates 2011-02-14 12:00:34.929870493 -0500
++++ ./configure 2011-02-14 12:00:40.794102692 -0500
+@@ -1,14 +1,14 @@
#! /bin/sh
--# From configure.in Revision: 87646 .
-+# From configure.in Revision: 87698 .
+-# From configure.in Revision: 87698 .
++# From configure.in Revision: 88350 .
# Guess values for system-dependent variables and create Makefiles.
- # Generated by GNU Autoconf 2.65 for python 3.2.
+-# Generated by GNU Autoconf 2.68 for python 3.2.
++# Generated by GNU Autoconf 2.65 for python 3.2.
#
-@@ -611,6 +611,8 @@ TRUE
+ # Report bugs to <
http://bugs.python.org/>.
+ #
+ #
+ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+-# Foundation, Inc.
++# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
+ #
+ #
+ # This configure script is free software; the Free Software Foundation
+@@ -92,7 +92,6 @@ fi
+ IFS=" "" $as_nl"
+
+ # Find who we are. Look in the path if we contain no directory separator.
+-as_myself=
+ case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+@@ -218,18 +217,11 @@ IFS=$as_save_IFS
+ # We cannot yet assume a decent shell, so we have to provide a
+ # neutralization value for shells without unset; and this also
+ # works around shells that cannot unset nonexistent variables.
+- # Preserve -v and -x to the replacement shell.
+ BASH_ENV=/dev/null
+ ENV=/dev/null
+ (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+ export CONFIG_SHELL
+- case $- in # ((((
+- *v*x* | *x*v* ) as_opts=-vx ;;
+- *v* ) as_opts=-v ;;
+- *x* ) as_opts=-x ;;
+- * ) as_opts= ;;
+- esac
+- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
++ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+ fi
+
+ if test x$as_have_required = xno; then :
+@@ -328,7 +320,7 @@ $as_echo X"$as_dir" |
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
++ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
+
+
+ } # as_fn_mkdir_p
+@@ -368,19 +360,19 @@ else
+ fi # as_fn_arith
+
+
+-# as_fn_error STATUS ERROR [LINENO LOG_FD]
+-# ----------------------------------------
++# as_fn_error ERROR [LINENO LOG_FD]
++# ---------------------------------
+ # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+ # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+-# script with STATUS, using 1 if that was 0.
++# script with status $?, using 1 if that was 0.
+ as_fn_error ()
+ {
+- as_status=$1; test $as_status -eq 0 && as_status=1
+- if test "$4"; then
+- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
++ as_status=$?; test $as_status -eq 0 && as_status=1
++ if test "$3"; then
++ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+ fi
+- $as_echo "$as_me: error: $2" >&2
++ $as_echo "$as_me: error: $1" >&2
+ as_fn_exit $as_status
+ } # as_fn_error
+
+@@ -542,7 +534,7 @@ test -n "$DJDIR" || exec 7<&0 </dev/null
+ exec 6>&1
+
+ # Name of the host.
+-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+ # so uname gets run too.
+ ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+@@ -619,6 +611,8 @@ TRUE
MACHDEP_OBJS
DYNLOADFILE
DLINCLDIR
@@ -17,7 +103,7 @@ diff -up ./configure.autotool-intermediates ./configure
THREADOBJ
LDLAST
USE_THREAD_MODULE
-@@ -749,8 +751,11 @@ with_thread
+@@ -757,8 +751,11 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -29,7 +115,155 @@ diff -up ./configure.autotool-intermediates ./configure
with_fpectl
with_libm
with_libc
-@@ -1421,8 +1426,11 @@ Optional Packages:
+@@ -837,9 +834,8 @@ do
+ fi
+
+ case $ac_option in
+- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+- *=) ac_optarg= ;;
+- *) ac_optarg=yes ;;
++ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
++ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+@@ -884,7 +880,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid feature name: $ac_useropt"
++ as_fn_error "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -910,7 +906,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid feature name: $ac_useropt"
++ as_fn_error "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -1114,7 +1110,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid package name: $ac_useropt"
++ as_fn_error "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -1130,7 +1126,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid package name: $ac_useropt"
++ as_fn_error "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -1160,8 +1156,8 @@ do
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+- -*) as_fn_error $? "unrecognized option: \`$ac_option'
+-Try \`$0 --help' for more information"
++ -*) as_fn_error "unrecognized option: \`$ac_option'
++Try \`$0 --help' for more information."
+ ;;
+
+ *=*)
+@@ -1169,7 +1165,7 @@ Try \`$0 --help' for more information"
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
++ as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+@@ -1179,7 +1175,7 @@ Try \`$0 --help' for more information"
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target"
>&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null
&&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+- : "${build_alias=$ac_option} ${host_alias=$ac_option}
${target_alias=$ac_option}"
++ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+@@ -1187,13 +1183,13 @@ done
+
+ if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+- as_fn_error $? "missing argument to $ac_option"
++ as_fn_error "missing argument to $ac_option"
+ fi
+
+ if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
++ fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options:
$ac_unrecognized_opts" >&2 ;;
+ esac
+ fi
+@@ -1216,7 +1212,7 @@ do
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
++ as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+ done
+
+ # There might be people who depend on the old broken behavior: `$host'
+@@ -1230,8 +1226,8 @@ target=$target_alias
+ if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use
--host.
+- If a cross compiler is detected then cross compile mode will be used"
>&2
++ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use
--host.
++ If a cross compiler is detected then cross compile mode will be used."
>&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+@@ -1246,9 +1242,9 @@ test "$silent" = yes && exec 6>/dev/null
+ ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ ac_ls_di=`ls -di .` &&
+ ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+- as_fn_error $? "working directory cannot be determined"
++ as_fn_error "working directory cannot be determined"
+ test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+- as_fn_error $? "pwd does not report name of working directory"
++ as_fn_error "pwd does not report name of working directory"
+
+
+ # Find the source files, if location was not specified.
+@@ -1287,11 +1283,11 @@ else
+ fi
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or
.."
+- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
++ as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+ fi
+ ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ ac_abs_confdir=`(
+- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
$? "$ac_msg"
++ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
"$ac_msg"
+ pwd)`
+ # When building in place, set srcdir=.
+ if test "$ac_abs_confdir" = "$ac_pwd"; then
+@@ -1331,7 +1327,7 @@ Configuration:
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+- -q, --quiet, --silent do not print \`checking ...' messages
++ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+@@ -1430,8 +1426,11 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -41,7 +275,1747 @@ diff -up ./configure.autotool-intermediates ./configure
--with-fpectl enable SIGFPE catching
--with-libm=STRING math library
--with-libc=STRING C library
-@@ -9138,6 +9146,50 @@ $as_echo "no" >&6; }
+@@ -1517,9 +1516,9 @@ test -n "$ac_init_help" && exit $ac_stat
+ if $ac_init_version; then
+ cat <<\_ACEOF
+ python configure 3.2
+-generated by GNU Autoconf 2.68
++generated by GNU Autoconf 2.65
+
+-Copyright (C) 2010 Free Software Foundation, Inc.
++Copyright (C) 2009 Free Software Foundation, Inc.
+ This configure script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it.
+ _ACEOF
+@@ -1563,7 +1562,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+ fi
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+ as_fn_set_status $ac_retval
+
+ } # ac_fn_c_try_compile
+@@ -1589,7 +1588,7 @@ $as_echo "$ac_try_echo"; } >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+- test $ac_status = 0; } > conftest.i && {
++ test $ac_status = 0; } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+@@ -1600,7 +1599,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+ fi
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+ as_fn_set_status $ac_retval
+
+ } # ac_fn_c_try_cpp
+@@ -1613,10 +1612,10 @@ fi
+ ac_fn_c_check_header_mongrel ()
+ {
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- if eval \${$3+:} false; then :
++ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval \${$3+:} false; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ fi
+ eval ac_res=\$$3
+@@ -1652,7 +1651,7 @@ if ac_fn_c_try_cpp "$LINENO"; then :
+ else
+ ac_header_preproc=no
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc"
>&5
+ $as_echo "$ac_header_preproc" >&6; }
+
+@@ -1675,15 +1674,17 @@ $as_echo "$as_me: WARNING: $2: see the A
+ $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be
Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the
compiler's result" >&5
+ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result"
>&2;}
+-( $as_echo "## -------------------------------------- ##
++( cat <<\_ASBOX
++## -------------------------------------- ##
+ ## Report this to
http://bugs.python.org/ ##
+-## -------------------------------------- ##"
++## -------------------------------------- ##
++_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval \${$3+:} false; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=\$ac_header_compiler"
+@@ -1692,7 +1693,7 @@ eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+ fi
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_check_header_mongrel
+
+@@ -1733,7 +1734,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
+ ac_retval=$ac_status
+ fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+ as_fn_set_status $ac_retval
+
+ } # ac_fn_c_try_run
+@@ -1747,7 +1748,7 @@ ac_fn_c_check_header_compile ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval \${$3+:} false; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -1765,7 +1766,7 @@ fi
+ eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_check_header_compile
+
+@@ -1810,7 +1811,7 @@ fi
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+ as_fn_set_status $ac_retval
+
+ } # ac_fn_c_try_link
+@@ -1824,7 +1825,7 @@ ac_fn_c_check_type ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval \${$3+:} false; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=no"
+@@ -1865,7 +1866,7 @@ fi
+ eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_check_type
+
+@@ -1878,7 +1879,7 @@ ac_fn_c_find_uintX_t ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+ $as_echo_n "checking for uint$2_t... " >&6; }
+-if eval \${$3+:} false; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=no"
+@@ -1908,7 +1909,8 @@ if ac_fn_c_try_compile "$LINENO"; then :
+ esac
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+- if eval test \"x\$"$3"\" = x"no"; then :
++ eval as_val=\$$3
++ if test "x$as_val" = x""no; then :
+
+ else
+ break
+@@ -1918,7 +1920,7 @@ fi
+ eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_find_uintX_t
+
+@@ -1931,7 +1933,7 @@ ac_fn_c_find_intX_t ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
+ $as_echo_n "checking for int$2_t... " >&6; }
+-if eval \${$3+:} false; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=no"
+@@ -1942,11 +1944,11 @@ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+ $ac_includes_default
+- enum { N = $2 / 2 - 1 };
+ int
+ main ()
+ {
+-static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) <<
N) - 1) * 2 + 1))];
++static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
++ 0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
+ test_array [0] = 0
+
+ ;
+@@ -1957,11 +1959,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+ $ac_includes_default
+- enum { N = $2 / 2 - 1 };
+ int
+ main ()
+ {
+-static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) -
1) * 2 + 1)
++static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
++ ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
+ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
+ test_array [0] = 0
+
+@@ -1982,7 +1984,8 @@ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+- if eval test \"x\$"$3"\" = x"no"; then :
++ eval as_val=\$$3
++ if test "x$as_val" = x""no; then :
+
+ else
+ break
+@@ -1992,7 +1995,7 @@ fi
+ eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_find_intX_t
+
+@@ -2169,7 +2172,7 @@ rm -f core *.core core.conftest.* gmon.o
+ rm -f conftest.val
+
+ fi
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+ as_fn_set_status $ac_retval
+
+ } # ac_fn_c_compute_int
+@@ -2182,7 +2185,7 @@ ac_fn_c_check_func ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval \${$3+:} false; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -2237,7 +2240,7 @@ fi
+ eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_check_func
+
+@@ -2250,7 +2253,7 @@ ac_fn_c_check_member ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+ $as_echo_n "checking for $2.$3... " >&6; }
+-if eval \${$4+:} false; then :
++if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -2294,22 +2297,19 @@ fi
+ eval ac_res=\$$4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_check_member
+
+-# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+-# ---------------------------------------------
+-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+-# accordingly.
++# ac_fn_c_check_decl LINENO SYMBOL VAR
++# ------------------------------------
++# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
+ ac_fn_c_check_decl ()
+ {
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- as_decl_name=`echo $2|sed 's/ *(.*//'`
+- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/)
0& (/g'`
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is
declared" >&5
+-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+-if eval \${$3+:} false; then :
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared"
>&5
++$as_echo_n "checking whether $2 is declared... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -2318,12 +2318,8 @@ $4
+ int
+ main ()
+ {
+-#ifndef $as_decl_name
+-#ifdef __cplusplus
+- (void) $as_decl_use;
+-#else
+- (void) $as_decl_name;
+-#endif
++#ifndef $2
++ (void) $2;
+ #endif
+
+ ;
+@@ -2340,7 +2336,7 @@ fi
+ eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=;
unset as_lineno;}
+
+ } # ac_fn_c_check_decl
+ cat >config.log <<_ACEOF
+@@ -2348,7 +2344,7 @@ This file contains any messages produced
+ running configure, to aid debugging if configure makes a mistake.
+
+ It was created by python $as_me 3.2, which was
+-generated by GNU Autoconf 2.68. Invocation command line was
++generated by GNU Autoconf 2.65. Invocation command line was
+
+ $ $0 $@
+
+@@ -2458,9 +2454,11 @@ trap 'exit_status=$?
+ {
+ echo
+
+- $as_echo "## ---------------- ##
++ cat <<\_ASBOX
++## ---------------- ##
+ ## Cache variables. ##
+-## ---------------- ##"
++## ---------------- ##
++_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+ (
+@@ -2494,9 +2492,11 @@ $as_echo "$as_me: WARNING: cache variabl
+ )
+ echo
+
+- $as_echo "## ----------------- ##
++ cat <<\_ASBOX
++## ----------------- ##
+ ## Output variables. ##
+-## ----------------- ##"
++## ----------------- ##
++_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+@@ -2509,9 +2509,11 @@ $as_echo "$as_me: WARNING: cache variabl
+ echo
+
+ if test -n "$ac_subst_files"; then
+- $as_echo "## ------------------- ##
++ cat <<\_ASBOX
++## ------------------- ##
+ ## File substitutions. ##
+-## ------------------- ##"
++## ------------------- ##
++_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+@@ -2525,9 +2527,11 @@ $as_echo "$as_me: WARNING: cache variabl
+ fi
+
+ if test -s confdefs.h; then
+- $as_echo "## ----------- ##
++ cat <<\_ASBOX
++## ----------- ##
+ ## confdefs.h. ##
+-## ----------- ##"
++## ----------- ##
++_ASBOX
+ echo
+ cat confdefs.h
+ echo
+@@ -2582,12 +2586,7 @@ _ACEOF
+ ac_site_file1=NONE
+ ac_site_file2=NONE
+ if test -n "$CONFIG_SITE"; then
+- # We do not want a PATH search for config.site.
+- case $CONFIG_SITE in #((
+- -*) ac_site_file1=./$CONFIG_SITE;;
+- */*) ac_site_file1=$CONFIG_SITE;;
+- *) ac_site_file1=./$CONFIG_SITE;;
+- esac
++ ac_site_file1=$CONFIG_SITE
+ elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+@@ -2602,11 +2601,7 @@ do
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script
$ac_site_file" >&5
+ $as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+- . "$ac_site_file" \
+- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "failed to load site script $ac_site_file
+-See \`config.log' for more details" "$LINENO" 5; }
++ . "$ac_site_file"
+ fi
+ done
+
+@@ -2682,7 +2677,7 @@ if $ac_cache_corrupted; then
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can
compromise the build" >&5
+ $as_echo "$as_me: error: changes in the environment can compromise the build"
>&2;}
+- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
++ as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
+ fi
+ ## -------------------- ##
+ ## Main body of script. ##
+@@ -2783,7 +2778,7 @@ if test "${enable_universalsdk+set}" = s
+ UNIVERSALSDK=$enableval
+ if test ! -d "${UNIVERSALSDK}"
+ then
+- as_fn_error $? "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
++ as_fn_error "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
+ fi
+ ;;
+ esac
+@@ -3175,7 +3170,7 @@ $as_echo "$without_gcc" >&6; }
+ # If the user switches compilers, we can't believe the cache
+ if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" !=
"$ac_cv_prog_CC"
+ then
+- as_fn_error $? "cached CC is different -- throw away $cache_file
++ as_fn_error "cached CC is different -- throw away $cache_file
+ (it is also a good idea to do 'make clean' before compiling)"
"$LINENO" 5
+ fi
+
+@@ -3195,7 +3190,7 @@ if test -n "$ac_tool_prefix"; then
+ set dummy ${ac_tool_prefix}gcc; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_CC+:} false; then :
++if test "${ac_cv_prog_CC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$CC"; then
+@@ -3235,7 +3230,7 @@ if test -z "$ac_cv_prog_CC"; then
+ set dummy gcc; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_ac_ct_CC+:} false; then :
++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$ac_ct_CC"; then
+@@ -3288,7 +3283,7 @@ if test -z "$CC"; then
+ set dummy ${ac_tool_prefix}cc; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_CC+:} false; then :
++if test "${ac_cv_prog_CC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$CC"; then
+@@ -3328,7 +3323,7 @@ if test -z "$CC"; then
+ set dummy cc; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_CC+:} false; then :
++if test "${ac_cv_prog_CC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$CC"; then
+@@ -3387,7 +3382,7 @@ if test -z "$CC"; then
+ set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_CC+:} false; then :
++if test "${ac_cv_prog_CC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$CC"; then
+@@ -3431,7 +3426,7 @@ do
+ set dummy $ac_prog; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_ac_ct_CC+:} false; then :
++if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$ac_ct_CC"; then
+@@ -3485,8 +3480,8 @@ fi
+
+ test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}:
error: in \`$ac_pwd':" >&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "no acceptable C compiler found in \$PATH
+-See \`config.log' for more details" "$LINENO" 5; }
++as_fn_error "no acceptable C compiler found in \$PATH
++See \`config.log' for more details." "$LINENO" 5; }
+
+ # Provide some information about the compiler.
+ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version"
>&5
+@@ -3600,8 +3595,9 @@ sed 's/^/| /' conftest.$ac_ext >&5
+
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "C compiler cannot create executables
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "C compiler cannot create executables
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ $as_echo "yes" >&6; }
+@@ -3643,8 +3639,8 @@ done
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+-See \`config.log' for more details" "$LINENO" 5; }
++as_fn_error "cannot compute suffix of executables: cannot compile and link
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+ rm -f conftest conftest$ac_cv_exeext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+@@ -3701,9 +3697,9 @@ $as_echo "$ac_try_echo"; } >&5
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "cannot run C compiled programs.
++as_fn_error "cannot run C compiled programs.
+ If you meant to cross compile, use \`--host'.
+-See \`config.log' for more details" "$LINENO" 5; }
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+ fi
+ fi
+@@ -3714,7 +3710,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_ex
+ ac_clean_files=$ac_clean_files_save
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files"
>&5
+ $as_echo_n "checking for suffix of object files... " >&6; }
+-if ${ac_cv_objext+:} false; then :
++if test "${ac_cv_objext+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -3754,8 +3750,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
+
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "cannot compute suffix of object files: cannot compile
+-See \`config.log' for more details" "$LINENO" 5; }
++as_fn_error "cannot compute suffix of object files: cannot compile
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+ rm -f conftest.$ac_cv_objext conftest.$ac_ext
+ fi
+@@ -3765,7 +3761,7 @@ OBJEXT=$ac_cv_objext
+ ac_objext=$OBJEXT
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C
compiler" >&5
+ $as_echo_n "checking whether we are using the GNU C compiler... " >&6;
}
+-if ${ac_cv_c_compiler_gnu+:} false; then :
++if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -3802,7 +3798,7 @@ ac_test_CFLAGS=${CFLAGS+set}
+ ac_save_CFLAGS=$CFLAGS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g"
>&5
+ $as_echo_n "checking whether $CC accepts -g... " >&6; }
+-if ${ac_cv_prog_cc_g+:} false; then :
++if test "${ac_cv_prog_cc_g+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+@@ -3880,7 +3876,7 @@ else
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO
C89" >&5
+ $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+-if ${ac_cv_prog_cc_c89+:} false; then :
++if test "${ac_cv_prog_cc_c89+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_cv_prog_cc_c89=no
+@@ -4015,7 +4011,7 @@ then
+ set dummy g++; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_path_CXX+:} false; then :
++if test "${ac_cv_path_CXX+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ case $CXX in
+@@ -4056,7 +4052,7 @@ fi
+ set dummy c++; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_path_CXX+:} false; then :
++if test "${ac_cv_path_CXX+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ case $CXX in
+@@ -4107,7 +4103,7 @@ do
+ set dummy $ac_prog; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_CXX+:} false; then :
++if test "${ac_cv_prog_CXX+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$CXX"; then
+@@ -4178,7 +4174,7 @@ if test -n "$CPP" && test -d "$CPP";
the
+ CPP=
+ fi
+ if test -z "$CPP"; then
+- if ${ac_cv_prog_CPP+:} false; then :
++ if test "${ac_cv_prog_CPP+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ # Double quotes because CPP needs to be expanded
+@@ -4208,7 +4204,7 @@ else
+ # Broken: fails on valid input.
+ continue
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+@@ -4224,11 +4220,11 @@ else
+ ac_preproc_ok=:
+ break
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ done
+ # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+-rm -f conftest.i conftest.err conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if $ac_preproc_ok; then :
+ break
+ fi
+@@ -4267,7 +4263,7 @@ else
+ # Broken: fails on valid input.
+ continue
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+@@ -4283,18 +4279,18 @@ else
+ ac_preproc_ok=:
+ break
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ done
+ # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+-rm -f conftest.i conftest.err conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if $ac_preproc_ok; then :
+
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+-See \`config.log' for more details" "$LINENO" 5; }
++as_fn_error "C preprocessor \"$CPP\" fails sanity check
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+
+ ac_ext=c
+@@ -4306,7 +4302,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines
and -e" >&5
+ $as_echo_n "checking for grep that handles long lines and -e... " >&6;
}
+-if ${ac_cv_path_GREP+:} false; then :
++if test "${ac_cv_path_GREP+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -z "$GREP"; then
+@@ -4355,7 +4351,7 @@ esac
+ done
+ IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+- as_fn_error $? "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
++ as_fn_error "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+ else
+ ac_cv_path_GREP=$GREP
+@@ -4369,7 +4365,7 @@ $as_echo "$ac_cv_path_GREP" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+ $as_echo_n "checking for egrep... " >&6; }
+-if ${ac_cv_path_EGREP+:} false; then :
++if test "${ac_cv_path_EGREP+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+@@ -4421,7 +4417,7 @@ esac
+ done
+ IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+- as_fn_error $? "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
++ as_fn_error "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+ else
+ ac_cv_path_EGREP=$EGREP
+@@ -4436,7 +4432,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files"
>&5
+ $as_echo_n "checking for ANSI C header files... " >&6; }
+-if ${ac_cv_header_stdc+:} false; then :
++if test "${ac_cv_header_stdc+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -4553,7 +4549,8 @@ do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ ac_fn_c_check_header_compile "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default
+ "
+-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
+@@ -4565,7 +4562,7 @@ done
+
+
+ ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h"
"ac_cv_header_minix_config_h" "$ac_includes_default"
+-if test "x$ac_cv_header_minix_config_h" = xyes; then :
++if test "x$ac_cv_header_minix_config_h" = x""yes; then :
+ MINIX=yes
+ else
+ MINIX=
+@@ -4587,7 +4584,7 @@ $as_echo "#define _MINIX 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define
__EXTENSIONS__" >&5
+ $as_echo_n "checking whether it is safe to define __EXTENSIONS__... "
>&6; }
+-if ${ac_cv_safe_to_define___extensions__+:} false; then :
++if test "${ac_cv_safe_to_define___extensions__+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -4780,7 +4777,7 @@ $as_echo "$GNULD" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+ $as_echo_n "checking for inline... " >&6; }
+-if ${ac_cv_c_inline+:} false; then :
++if test "${ac_cv_c_inline+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_cv_c_inline=no
+@@ -4981,7 +4978,7 @@ if test -n "$ac_tool_prefix"; then
+ set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_RANLIB+:} false; then :
++if test "${ac_cv_prog_RANLIB+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$RANLIB"; then
+@@ -5021,7 +5018,7 @@ if test -z "$ac_cv_prog_RANLIB"; then
+ set dummy ranlib; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
++if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$ac_ct_RANLIB"; then
+@@ -5075,7 +5072,7 @@ do
+ set dummy $ac_prog; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_AR+:} false; then :
++if test "${ac_cv_prog_AR+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$AR"; then
+@@ -5125,7 +5122,7 @@ fi
+ set dummy svnversion; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_SVNVERSION+:} false; then :
++if test "${ac_cv_prog_SVNVERSION+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$SVNVERSION"; then
+@@ -5176,22 +5173,16 @@ bsdos*|hp*|HP*)
+ esac
+ ac_aux_dir=
+ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+- if test -f "$ac_dir/install-sh"; then
+- ac_aux_dir=$ac_dir
+- ac_install_sh="$ac_aux_dir/install-sh -c"
+- break
+- elif test -f "$ac_dir/install.sh"; then
+- ac_aux_dir=$ac_dir
+- ac_install_sh="$ac_aux_dir/install.sh -c"
+- break
+- elif test -f "$ac_dir/shtool"; then
+- ac_aux_dir=$ac_dir
+- ac_install_sh="$ac_aux_dir/shtool install -c"
+- break
+- fi
++ for ac_t in install-sh install.sh shtool; do
++ if test -f "$ac_dir/$ac_t"; then
++ ac_aux_dir=$ac_dir
++ ac_install_sh="$ac_aux_dir/$ac_t -c"
++ break 2
++ fi
++ done
+ done
+ if test -z "$ac_aux_dir"; then
+- as_fn_error $? "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
++ as_fn_error "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
+ fi
+
+ # These three variables are undocumented and unsupported,
+@@ -5220,7 +5211,7 @@ ac_configure="$SHELL $ac_aux_dir/configu
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible
install" >&5
+ $as_echo_n "checking for a BSD-compatible install... " >&6; }
+ if test -z "$INSTALL"; then
+-if ${ac_cv_path_install+:} false; then :
++if test "${ac_cv_path_install+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+@@ -5406,7 +5397,7 @@ $as_echo_n "checking whether $CC accepts
+ ac_save_cc="$CC"
+ CC="$CC -fno-strict-aliasing"
+ save_CFLAGS="$CFLAGS"
+- if ${ac_cv_no_strict_aliasing+:} false; then :
++ if test "${ac_cv_no_strict_aliasing+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -5529,7 +5520,7 @@ $as_echo "$CC" >&6; }
+ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
+
+ else
+- as_fn_error $? "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
++ as_fn_error "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
+
+ fi
+
+@@ -5662,7 +5653,7 @@ fi
+ # options before we can check whether -Kpthread improves anything.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads are available
without options" >&5
+ $as_echo_n "checking whether pthreads are available without options... "
>&6; }
+-if ${ac_cv_pthread_is_default+:} false; then :
++if test "${ac_cv_pthread_is_default+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -5715,7 +5706,7 @@ else
+ # function available.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts
-Kpthread" >&5
+ $as_echo_n "checking whether $CC accepts -Kpthread... " >&6; }
+-if ${ac_cv_kpthread+:} false; then :
++if test "${ac_cv_kpthread+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_save_cc="$CC"
+@@ -5764,7 +5755,7 @@ then
+ # function available.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts
-Kthread" >&5
+ $as_echo_n "checking whether $CC accepts -Kthread... " >&6; }
+-if ${ac_cv_kthread+:} false; then :
++if test "${ac_cv_kthread+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_save_cc="$CC"
+@@ -5813,7 +5804,7 @@ then
+ # function available.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts
-pthread" >&5
+ $as_echo_n "checking whether $CC accepts -pthread... " >&6; }
+-if ${ac_cv_thread+:} false; then :
++if test "${ac_cv_thread+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_save_cc="$CC"
+@@ -5898,7 +5889,7 @@ CXX="$ac_save_cxx"
+ # checks for header files
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files"
>&5
+ $as_echo_n "checking for ANSI C header files... " >&6; }
+-if ${ac_cv_header_stdc+:} false; then :
++if test "${ac_cv_header_stdc+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -6023,7 +6014,8 @@ bluetooth/bluetooth.h linux/tipc.h spawn
+ do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default"
+-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
+@@ -6037,7 +6029,7 @@ for ac_hdr in dirent.h sys/ndir.h sys/di
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines
DIR" >&5
+ $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+-if eval \${$as_ac_Header+:} false; then :
++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; };
then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -6064,7 +6056,8 @@ fi
+ eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+ _ACEOF
+@@ -6077,7 +6070,7 @@ done
+ if test $ac_header_dirent = dirent.h; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing
opendir" >&5
+ $as_echo_n "checking for library containing opendir... " >&6; }
+-if ${ac_cv_search_opendir+:} false; then :
++if test "${ac_cv_search_opendir+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_func_search_save_LIBS=$LIBS
+@@ -6111,11 +6104,11 @@ for ac_lib in '' dir; do
+ fi
+ rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+- if ${ac_cv_search_opendir+:} false; then :
++ if test "${ac_cv_search_opendir+set}" = set; then :
+ break
+ fi
+ done
+-if ${ac_cv_search_opendir+:} false; then :
++if test "${ac_cv_search_opendir+set}" = set; then :
+
+ else
+ ac_cv_search_opendir=no
+@@ -6134,7 +6127,7 @@ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing
opendir" >&5
+ $as_echo_n "checking for library containing opendir... " >&6; }
+-if ${ac_cv_search_opendir+:} false; then :
++if test "${ac_cv_search_opendir+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_func_search_save_LIBS=$LIBS
+@@ -6168,11 +6161,11 @@ for ac_lib in '' x; do
+ fi
+ rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+- if ${ac_cv_search_opendir+:} false; then :
++ if test "${ac_cv_search_opendir+set}" = set; then :
+ break
+ fi
+ done
+-if ${ac_cv_search_opendir+:} false; then :
++if test "${ac_cv_search_opendir+set}" = set; then :
+
+ else
+ ac_cv_search_opendir=no
+@@ -6192,7 +6185,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines
makedev" >&5
+ $as_echo_n "checking whether sys/types.h defines makedev... " >&6; }
+-if ${ac_cv_header_sys_types_h_makedev+:} false; then :
++if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -6220,7 +6213,7 @@ $as_echo "$ac_cv_header_sys_types_h_make
+
+ if test $ac_cv_header_sys_types_h_makedev = no; then
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h"
"ac_cv_header_sys_mkdev_h" "$ac_includes_default"
+-if test "x$ac_cv_header_sys_mkdev_h" = xyes; then :
++if test "x$ac_cv_header_sys_mkdev_h" = x""yes; then :
+
+ $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h
+
+@@ -6230,7 +6223,7 @@ fi
+
+ if test $ac_cv_header_sys_mkdev_h = no; then
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h"
"ac_cv_header_sys_sysmacros_h" "$ac_includes_default"
+-if test "x$ac_cv_header_sys_sysmacros_h" = xyes; then :
++if test "x$ac_cv_header_sys_sysmacros_h" = x""yes; then :
+
+ $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h
+
+@@ -6250,7 +6243,7 @@ do :
+ #endif
+
+ "
+-if test "x$ac_cv_header_term_h" = xyes; then :
++if test "x$ac_cv_header_term_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_TERM_H 1
+ _ACEOF
+@@ -6272,7 +6265,7 @@ do :
+ #endif
+
+ "
+-if test "x$ac_cv_header_linux_netlink_h" = xyes; then :
++if test "x$ac_cv_header_linux_netlink_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_LINUX_NETLINK_H 1
+ _ACEOF
+@@ -6431,7 +6424,7 @@ EOF
+
+ # Type availability checks
+ ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t"
"$ac_includes_default"
+-if test "x$ac_cv_type_mode_t" = xyes; then :
++if test "x$ac_cv_type_mode_t" = x""yes; then :
+
+ else
+
+@@ -6442,7 +6435,7 @@ _ACEOF
+ fi
+
+ ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t"
"$ac_includes_default"
+-if test "x$ac_cv_type_off_t" = xyes; then :
++if test "x$ac_cv_type_off_t" = x""yes; then :
+
+ else
+
+@@ -6453,7 +6446,7 @@ _ACEOF
+ fi
+
+ ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t"
"$ac_includes_default"
+-if test "x$ac_cv_type_pid_t" = xyes; then :
++if test "x$ac_cv_type_pid_t" = x""yes; then :
+
+ else
+
+@@ -6469,7 +6462,7 @@ cat >>confdefs.h <<_ACEOF
+ _ACEOF
+
+ ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t"
"$ac_includes_default"
+-if test "x$ac_cv_type_size_t" = xyes; then :
++if test "x$ac_cv_type_size_t" = x""yes; then :
+
+ else
+
+@@ -6481,7 +6474,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h"
>&5
+ $as_echo_n "checking for uid_t in sys/types.h... " >&6; }
+-if ${ac_cv_type_uid_t+:} false; then :
++if test "${ac_cv_type_uid_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -6560,7 +6553,7 @@ _ACEOF
+ esac
+
+ ac_fn_c_check_type "$LINENO" "ssize_t"
"ac_cv_type_ssize_t" "$ac_includes_default"
+-if test "x$ac_cv_type_ssize_t" = xyes; then :
++if test "x$ac_cv_type_ssize_t" = x""yes; then :
+
+ $as_echo "#define HAVE_SSIZE_T 1" >>confdefs.h
+
+@@ -6575,7 +6568,7 @@ fi
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+ $as_echo_n "checking size of int... " >&6; }
+-if ${ac_cv_sizeof_int+:} false; then :
++if test "${ac_cv_sizeof_int+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))"
"ac_cv_sizeof_int" "$ac_includes_default"; then :
+@@ -6584,8 +6577,9 @@ else
+ if test "$ac_cv_type_int" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (int)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (int)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_int=0
+ fi
+@@ -6608,7 +6602,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+ $as_echo_n "checking size of long... " >&6; }
+-if ${ac_cv_sizeof_long+:} false; then :
++if test "${ac_cv_sizeof_long+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))"
"ac_cv_sizeof_long" "$ac_includes_default"; then :
+@@ -6617,8 +6611,9 @@ else
+ if test "$ac_cv_type_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (long)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (long)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_long=0
+ fi
+@@ -6641,7 +6636,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+ $as_echo_n "checking size of void *... " >&6; }
+-if ${ac_cv_sizeof_void_p+:} false; then :
++if test "${ac_cv_sizeof_void_p+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))"
"ac_cv_sizeof_void_p" "$ac_includes_default"; then :
+@@ -6650,8 +6645,9 @@ else
+ if test "$ac_cv_type_void_p" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (void *)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (void *)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_void_p=0
+ fi
+@@ -6674,7 +6670,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+ $as_echo_n "checking size of short... " >&6; }
+-if ${ac_cv_sizeof_short+:} false; then :
++if test "${ac_cv_sizeof_short+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))"
"ac_cv_sizeof_short" "$ac_includes_default"; then :
+@@ -6683,8 +6679,9 @@ else
+ if test "$ac_cv_type_short" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (short)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (short)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_short=0
+ fi
+@@ -6707,7 +6704,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
+ $as_echo_n "checking size of float... " >&6; }
+-if ${ac_cv_sizeof_float+:} false; then :
++if test "${ac_cv_sizeof_float+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))"
"ac_cv_sizeof_float" "$ac_includes_default"; then :
+@@ -6716,8 +6713,9 @@ else
+ if test "$ac_cv_type_float" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (float)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (float)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_float=0
+ fi
+@@ -6740,7 +6738,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
+ $as_echo_n "checking size of double... " >&6; }
+-if ${ac_cv_sizeof_double+:} false; then :
++if test "${ac_cv_sizeof_double+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))"
"ac_cv_sizeof_double" "$ac_includes_default"; then :
+@@ -6749,8 +6747,9 @@ else
+ if test "$ac_cv_type_double" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (double)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (double)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_double=0
+ fi
+@@ -6773,7 +6772,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fpos_t" >&5
+ $as_echo_n "checking size of fpos_t... " >&6; }
+-if ${ac_cv_sizeof_fpos_t+:} false; then :
++if test "${ac_cv_sizeof_fpos_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fpos_t))"
"ac_cv_sizeof_fpos_t" "$ac_includes_default"; then :
+@@ -6782,8 +6781,9 @@ else
+ if test "$ac_cv_type_fpos_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (fpos_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (fpos_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_fpos_t=0
+ fi
+@@ -6806,7 +6806,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+ $as_echo_n "checking size of size_t... " >&6; }
+-if ${ac_cv_sizeof_size_t+:} false; then :
++if test "${ac_cv_sizeof_size_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))"
"ac_cv_sizeof_size_t" "$ac_includes_default"; then :
+@@ -6815,8 +6815,9 @@ else
+ if test "$ac_cv_type_size_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (size_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (size_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_size_t=0
+ fi
+@@ -6839,7 +6840,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pid_t" >&5
+ $as_echo_n "checking size of pid_t... " >&6; }
+-if ${ac_cv_sizeof_pid_t+:} false; then :
++if test "${ac_cv_sizeof_pid_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pid_t))"
"ac_cv_sizeof_pid_t" "$ac_includes_default"; then :
+@@ -6848,8 +6849,9 @@ else
+ if test "$ac_cv_type_pid_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (pid_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (pid_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_pid_t=0
+ fi
+@@ -6899,7 +6901,7 @@ if test "$have_long_long" = yes ; then
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long"
>&5
+ $as_echo_n "checking size of long long... " >&6; }
+-if ${ac_cv_sizeof_long_long+:} false; then :
++if test "${ac_cv_sizeof_long_long+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))"
"ac_cv_sizeof_long_long" "$ac_includes_default"; then :
+@@ -6908,8 +6910,9 @@ else
+ if test "$ac_cv_type_long_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (long long)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (long long)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_long_long=0
+ fi
+@@ -6960,7 +6963,7 @@ if test "$have_long_double" = yes ; then
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double"
>&5
+ $as_echo_n "checking size of long double... " >&6; }
+-if ${ac_cv_sizeof_long_double+:} false; then :
++if test "${ac_cv_sizeof_long_double+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long
double))" "ac_cv_sizeof_long_double"
"$ac_includes_default"; then :
+@@ -6969,8 +6972,9 @@ else
+ if test "$ac_cv_type_long_double" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (long double)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (long double)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_long_double=0
+ fi
+@@ -7022,7 +7026,7 @@ if test "$have_c99_bool" = yes ; then
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of _Bool" >&5
+ $as_echo_n "checking size of _Bool... " >&6; }
+-if ${ac_cv_sizeof__Bool+:} false; then :
++if test "${ac_cv_sizeof__Bool+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (_Bool))"
"ac_cv_sizeof__Bool" "$ac_includes_default"; then :
+@@ -7031,8 +7035,9 @@ else
+ if test "$ac_cv_type__Bool" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (_Bool)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (_Bool)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof__Bool=0
+ fi
+@@ -7058,7 +7063,7 @@ ac_fn_c_check_type "$LINENO" "uintptr_t"
+ #include <inttypes.h>
+ #endif
+ "
+-if test "x$ac_cv_type_uintptr_t" = xyes; then :
++if test "x$ac_cv_type_uintptr_t" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_UINTPTR_T 1
+@@ -7070,7 +7075,7 @@ _ACEOF
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of uintptr_t"
>&5
+ $as_echo_n "checking size of uintptr_t... " >&6; }
+-if ${ac_cv_sizeof_uintptr_t+:} false; then :
++if test "${ac_cv_sizeof_uintptr_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (uintptr_t))"
"ac_cv_sizeof_uintptr_t" "$ac_includes_default"; then :
+@@ -7079,8 +7084,9 @@ else
+ if test "$ac_cv_type_uintptr_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (uintptr_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (uintptr_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_uintptr_t=0
+ fi
+@@ -7106,7 +7112,7 @@ fi
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
+ $as_echo_n "checking size of off_t... " >&6; }
+-if ${ac_cv_sizeof_off_t+:} false; then :
++if test "${ac_cv_sizeof_off_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))"
"ac_cv_sizeof_off_t" "
+@@ -7120,8 +7126,9 @@ else
+ if test "$ac_cv_type_off_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (off_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (off_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_off_t=0
+ fi
+@@ -7165,7 +7172,7 @@ fi
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
+ $as_echo_n "checking size of time_t... " >&6; }
+-if ${ac_cv_sizeof_time_t+:} false; then :
++if test "${ac_cv_sizeof_time_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))"
"ac_cv_sizeof_time_t" "
+@@ -7182,8 +7189,9 @@ else
+ if test "$ac_cv_type_time_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (time_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (time_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_time_t=0
+ fi
+@@ -7240,7 +7248,7 @@ if test "$have_pthread_t" = yes ; then
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t"
>&5
+ $as_echo_n "checking size of pthread_t... " >&6; }
+-if ${ac_cv_sizeof_pthread_t+:} false; then :
++if test "${ac_cv_sizeof_pthread_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))"
"ac_cv_sizeof_pthread_t" "
+@@ -7254,8 +7262,9 @@ else
+ if test "$ac_cv_type_pthread_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (pthread_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (pthread_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_pthread_t=0
+ fi
+@@ -7342,7 +7351,7 @@ fi
+ MACOSX_DEFAULT_ARCH="ppc"
+ ;;
+ *)
+- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
++ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
+ ;;
+ esac
+ else
+@@ -7354,7 +7363,7 @@ fi
+ MACOSX_DEFAULT_ARCH="ppc64"
+ ;;
+ *)
+- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
++ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
+ ;;
+ esac
+
+@@ -7380,7 +7389,7 @@ $as_echo "#define WITH_NEXT_FRAMEWORK 1"
+ $as_echo "yes" >&6; }
+ if test $enable_shared = "yes"
+ then
+- as_fn_error $? "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
++ as_fn_error "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+@@ -7687,7 +7696,7 @@ $as_echo "$SHLIBS" >&6; }
+ # checks for libraries
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl"
>&5
+ $as_echo_n "checking for dlopen in -ldl... " >&6; }
+-if ${ac_cv_lib_dl_dlopen+:} false; then :
++if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -7721,7 +7730,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen"
>&5
+ $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
++if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBDL 1
+ _ACEOF
+@@ -7732,7 +7741,7 @@ fi
+ # Dynamic linking for SunOS/Solaris and SYSV
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld"
>&5
+ $as_echo_n "checking for shl_load in -ldld... " >&6; }
+-if ${ac_cv_lib_dld_shl_load+:} false; then :
++if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -7766,7 +7775,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load"
>&5
+ $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
++if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBDLD 1
+ _ACEOF
+@@ -7780,7 +7789,7 @@ fi
+ if test "$with_threads" = "yes" -o -z "$with_threads";
then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing
sem_init" >&5
+ $as_echo_n "checking for library containing sem_init... " >&6; }
+-if ${ac_cv_search_sem_init+:} false; then :
++if test "${ac_cv_search_sem_init+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_func_search_save_LIBS=$LIBS
+@@ -7814,11 +7823,11 @@ for ac_lib in '' pthread rt posix4; do
+ fi
+ rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+- if ${ac_cv_search_sem_init+:} false; then :
++ if test "${ac_cv_search_sem_init+set}" = set; then :
+ break
+ fi
+ done
+-if ${ac_cv_search_sem_init+:} false; then :
++if test "${ac_cv_search_sem_init+set}" = set; then :
+
+ else
+ ac_cv_search_sem_init=no
+@@ -7841,7 +7850,7 @@ fi
+ # check if we need libintl for locale functions
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for textdomain in -lintl"
>&5
+ $as_echo_n "checking for textdomain in -lintl... " >&6; }
+-if ${ac_cv_lib_intl_textdomain+:} false; then :
++if test "${ac_cv_lib_intl_textdomain+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -7875,7 +7884,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_textdomain"
>&5
+ $as_echo "$ac_cv_lib_intl_textdomain" >&6; }
+-if test "x$ac_cv_lib_intl_textdomain" = xyes; then :
++if test "x$ac_cv_lib_intl_textdomain" = x""yes; then :
+
+ $as_echo "#define WITH_LIBINTL 1" >>confdefs.h
+
+@@ -7922,7 +7931,7 @@ esac
+ # Most SVR4 platforms (e.g. Solaris) need -lsocket and -lnsl.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for t_open in -lnsl"
>&5
+ $as_echo_n "checking for t_open in -lnsl... " >&6; }
+-if ${ac_cv_lib_nsl_t_open+:} false; then :
++if test "${ac_cv_lib_nsl_t_open+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -7956,13 +7965,13 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_t_open"
>&5
+ $as_echo "$ac_cv_lib_nsl_t_open" >&6; }
+-if test "x$ac_cv_lib_nsl_t_open" = xyes; then :
++if test "x$ac_cv_lib_nsl_t_open" = x""yes; then :
+ LIBS="-lnsl $LIBS"
+ fi
+ # SVR4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket"
>&5
+ $as_echo_n "checking for socket in -lsocket... " >&6; }
+-if ${ac_cv_lib_socket_socket+:} false; then :
++if test "${ac_cv_lib_socket_socket+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -7996,7 +8005,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket"
>&5
+ $as_echo "$ac_cv_lib_socket_socket" >&6; }
+-if test "x$ac_cv_lib_socket_socket" = xyes; then :
++if test "x$ac_cv_lib_socket_socket" = x""yes; then :
+ LIBS="-lsocket $LIBS"
+ fi
+ # SVR4 sockets
+@@ -8022,7 +8031,7 @@ if test -n "$ac_tool_prefix"; then
+ set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_path_PKG_CONFIG+:} false; then :
++if test "${ac_cv_path_PKG_CONFIG+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ case $PKG_CONFIG in
+@@ -8065,7 +8074,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; the
+ set dummy pkg-config; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
++if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ case $ac_pt_PKG_CONFIG in
+@@ -8176,12 +8185,12 @@ if test "${with_dbmliborder+set}" = set;
+ withval=$with_dbmliborder;
+ if test x$with_dbmliborder = xyes
+ then
+-as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
++as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
+ else
+ for db in `echo $with_dbmliborder | sed 's/:/ /g'`; do
+ if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb
+ then
+- as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
++ as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
+ fi
+ done
+ fi
+@@ -8347,7 +8356,7 @@ $as_echo "$unistd_defines_pthreads" >&6;
+ $as_echo "#define _REENTRANT 1" >>confdefs.h
+
+ ac_fn_c_check_header_mongrel "$LINENO" "cthreads.h"
"ac_cv_header_cthreads_h" "$ac_includes_default"
+-if test "x$ac_cv_header_cthreads_h" = xyes; then :
++if test "x$ac_cv_header_cthreads_h" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ $as_echo "#define C_THREADS 1" >>confdefs.h
+@@ -8360,7 +8369,7 @@ $as_echo "#define HURD_C_THREADS 1" >>co
+ else
+
+ ac_fn_c_check_header_mongrel "$LINENO" "mach/cthreads.h"
"ac_cv_header_mach_cthreads_h" "$ac_includes_default"
+-if test "x$ac_cv_header_mach_cthreads_h" = xyes; then :
++if test "x$ac_cv_header_mach_cthreads_h" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ $as_echo "#define C_THREADS 1" >>confdefs.h
+@@ -8404,7 +8413,7 @@ else
+
+ LIBS=$_libs
+ ac_fn_c_check_func "$LINENO" "pthread_detach"
"ac_cv_func_pthread_detach"
+-if test "x$ac_cv_func_pthread_detach" = xyes; then :
++if test "x$ac_cv_func_pthread_detach" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ posix_threads=yes
+@@ -8413,7 +8422,7 @@ else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lpthreads" >&5
+ $as_echo_n "checking for pthread_create in -lpthreads... " >&6; }
+-if ${ac_cv_lib_pthreads_pthread_create+:} false; then :
++if test "${ac_cv_lib_pthreads_pthread_create+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -8447,7 +8456,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_pthreads_pthread_create" >&5
+ $as_echo "$ac_cv_lib_pthreads_pthread_create" >&6; }
+-if test "x$ac_cv_lib_pthreads_pthread_create" = xyes; then :
++if test "x$ac_cv_lib_pthreads_pthread_create" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ posix_threads=yes
+@@ -8457,7 +8466,7 @@ else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lc_r" >&5
+ $as_echo_n "checking for pthread_create in -lc_r... " >&6; }
+-if ${ac_cv_lib_c_r_pthread_create+:} false; then :
++if test "${ac_cv_lib_c_r_pthread_create+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -8491,7 +8500,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_c_r_pthread_create" >&5
+ $as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
+-if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then :
++if test "x$ac_cv_lib_c_r_pthread_create" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ posix_threads=yes
+@@ -8501,7 +8510,7 @@ else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_create_system
in -lpthread" >&5
+ $as_echo_n "checking for __pthread_create_system in -lpthread... " >&6;
}
+-if ${ac_cv_lib_pthread___pthread_create_system+:} false; then :
++if test "${ac_cv_lib_pthread___pthread_create_system+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -8535,7 +8544,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_pthread___pthread_create_system" >&5
+ $as_echo "$ac_cv_lib_pthread___pthread_create_system" >&6; }
+-if test "x$ac_cv_lib_pthread___pthread_create_system" = xyes; then :
++if test "x$ac_cv_lib_pthread___pthread_create_system" = x""yes; then
:
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ posix_threads=yes
+@@ -8545,7 +8554,7 @@ else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in
-lcma" >&5
+ $as_echo_n "checking for pthread_create in -lcma... " >&6; }
+-if ${ac_cv_lib_cma_pthread_create+:} false; then :
++if test "${ac_cv_lib_cma_pthread_create+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -8579,7 +8588,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_cma_pthread_create" >&5
+ $as_echo "$ac_cv_lib_cma_pthread_create" >&6; }
+-if test "x$ac_cv_lib_cma_pthread_create" = xyes; then :
++if test "x$ac_cv_lib_cma_pthread_create" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ posix_threads=yes
+@@ -8611,7 +8620,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usconfig in -lmpc"
>&5
+ $as_echo_n "checking for usconfig in -lmpc... " >&6; }
+-if ${ac_cv_lib_mpc_usconfig+:} false; then :
++if test "${ac_cv_lib_mpc_usconfig+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -8645,7 +8654,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpc_usconfig"
>&5
+ $as_echo "$ac_cv_lib_mpc_usconfig" >&6; }
+-if test "x$ac_cv_lib_mpc_usconfig" = xyes; then :
++if test "x$ac_cv_lib_mpc_usconfig" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ LIBS="$LIBS -lmpc"
+@@ -8657,7 +8666,7 @@ fi
+ if test "$posix_threads" != "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thr_create in
-lthread" >&5
+ $as_echo_n "checking for thr_create in -lthread... " >&6; }
+-if ${ac_cv_lib_thread_thr_create+:} false; then :
++if test "${ac_cv_lib_thread_thr_create+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -8691,7 +8700,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_thread_thr_create"
>&5
+ $as_echo "$ac_cv_lib_thread_thr_create" >&6; }
+-if test "x$ac_cv_lib_thread_thr_create" = xyes; then :
++if test "x$ac_cv_lib_thread_thr_create" = x""yes; then :
+ $as_echo "#define WITH_THREAD 1" >>confdefs.h
+
+ LIBS="$LIBS -lthread"
+@@ -8740,7 +8749,7 @@ $as_echo "#define HAVE_BROKEN_POSIX_SEMA
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PTHREAD_SCOPE_SYSTEM is
supported" >&5
+ $as_echo_n "checking if PTHREAD_SCOPE_SYSTEM is supported... " >&6; }
+- if ${ac_cv_pthread_system_supported+:} false; then :
++ if test "${ac_cv_pthread_system_supported+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -8783,7 +8792,7 @@ $as_echo "#define PTHREAD_SYSTEM_SCHED_S
+ for ac_func in pthread_sigmask
+ do :
+ ac_fn_c_check_func "$LINENO" "pthread_sigmask"
"ac_cv_func_pthread_sigmask"
+-if test "x$ac_cv_func_pthread_sigmask" = xyes; then :
++if test "x$ac_cv_func_pthread_sigmask" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_PTHREAD_SIGMASK 1
+ _ACEOF
+@@ -9136,6 +9145,50 @@ $as_echo "no" >&6; }
fi
@@ -92,7 +2066,22 @@ diff -up ./configure.autotool-intermediates ./configure
# Check for Python-specific malloc support
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
$as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -9190,6 +9242,46 @@ fi
+@@ -9175,12 +9228,12 @@ fi
+ $as_echo "$with_valgrind" >&6; }
+ if test "$with_valgrind" != no; then
+ ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h"
"ac_cv_header_valgrind_valgrind_h" "$ac_includes_default"
+-if test "x$ac_cv_header_valgrind_valgrind_h" = xyes; then :
++if test "x$ac_cv_header_valgrind_valgrind_h" = x""yes; then :
+
+ $as_echo "#define WITH_VALGRIND 1" >>confdefs.h
+
+ else
+- as_fn_error $? "Valgrind support requested but headers not available"
"$LINENO" 5
++ as_fn_error "Valgrind support requested but headers not available"
"$LINENO" 5
+
+ fi
+
+@@ -9188,6 +9241,46 @@ fi
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -139,20 +2128,1441 @@ diff -up ./configure.autotool-intermediates ./configure
# -I${DLINCLDIR} is added to the compile rule for importdl.o
DLINCLDIR=.
-@@ -14304,8 +14396,8 @@ esac
+@@ -9197,7 +9290,7 @@ DLINCLDIR=.
+ for ac_func in dlopen
+ do :
+ ac_fn_c_check_func "$LINENO" "dlopen"
"ac_cv_func_dlopen"
+-if test "x$ac_cv_func_dlopen" = xyes; then :
++if test "x$ac_cv_func_dlopen" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_DLOPEN 1
+ _ACEOF
+@@ -9274,7 +9367,8 @@ for ac_func in alarm accept4 setitimer g
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -9524,7 +9618,7 @@ rm -f core conftest.err conftest.$ac_obj
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock declaration"
>&5
+ $as_echo_n "checking for flock declaration... " >&6; }
+-if ${ac_cv_flock_decl+:} false; then :
++if test "${ac_cv_flock_decl+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -9554,7 +9648,7 @@ if test "x${ac_cv_flock_decl}" = xyes; t
+ for ac_func in flock
+ do :
+ ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock"
+-if test "x$ac_cv_func_flock" = xyes; then :
++if test "x$ac_cv_func_flock" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_FLOCK 1
+ _ACEOF
+@@ -9562,7 +9656,7 @@ _ACEOF
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock in -lbsd"
>&5
+ $as_echo_n "checking for flock in -lbsd... " >&6; }
+-if ${ac_cv_lib_bsd_flock+:} false; then :
++if test "${ac_cv_lib_bsd_flock+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -9596,7 +9690,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_flock"
>&5
+ $as_echo "$ac_cv_lib_bsd_flock" >&6; }
+-if test "x$ac_cv_lib_bsd_flock" = xyes; then :
++if test "x$ac_cv_lib_bsd_flock" = x""yes; then :
+ $as_echo "#define HAVE_FLOCK 1" >>confdefs.h
+
+
+@@ -9645,7 +9739,7 @@ do
+ set dummy $ac_prog; ac_word=$2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+ $as_echo_n "checking for $ac_word... " >&6; }
+-if ${ac_cv_prog_TRUE+:} false; then :
++if test "${ac_cv_prog_TRUE+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test -n "$TRUE"; then
+@@ -9685,7 +9779,7 @@ test -n "$TRUE" || TRUE="/bin/true"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lc"
>&5
+ $as_echo_n "checking for inet_aton in -lc... " >&6; }
+-if ${ac_cv_lib_c_inet_aton+:} false; then :
++if test "${ac_cv_lib_c_inet_aton+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -9719,12 +9813,12 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_inet_aton"
>&5
+ $as_echo "$ac_cv_lib_c_inet_aton" >&6; }
+-if test "x$ac_cv_lib_c_inet_aton" = xyes; then :
++if test "x$ac_cv_lib_c_inet_aton" = x""yes; then :
+ $ac_cv_prog_TRUE
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv"
>&5
+ $as_echo_n "checking for inet_aton in -lresolv... " >&6; }
+-if ${ac_cv_lib_resolv_inet_aton+:} false; then :
++if test "${ac_cv_lib_resolv_inet_aton+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -9758,7 +9852,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton"
>&5
+ $as_echo "$ac_cv_lib_resolv_inet_aton" >&6; }
+-if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then :
++if test "x$ac_cv_lib_resolv_inet_aton" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBRESOLV 1
+ _ACEOF
+@@ -9775,7 +9869,7 @@ fi
+ # exit Python
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chflags" >&5
+ $as_echo_n "checking for chflags... " >&6; }
+-if ${ac_cv_have_chflags+:} false; then :
++if test "${ac_cv_have_chflags+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -9809,7 +9903,7 @@ fi
+ $as_echo "$ac_cv_have_chflags" >&6; }
+ if test "$ac_cv_have_chflags" = cross ; then
+ ac_fn_c_check_func "$LINENO" "chflags"
"ac_cv_func_chflags"
+-if test "x$ac_cv_func_chflags" = xyes; then :
++if test "x$ac_cv_func_chflags" = x""yes; then :
+ ac_cv_have_chflags="yes"
+ else
+ ac_cv_have_chflags="no"
+@@ -9824,7 +9918,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lchflags" >&5
+ $as_echo_n "checking for lchflags... " >&6; }
+-if ${ac_cv_have_lchflags+:} false; then :
++if test "${ac_cv_have_lchflags+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -9858,7 +9952,7 @@ fi
+ $as_echo "$ac_cv_have_lchflags" >&6; }
+ if test "$ac_cv_have_lchflags" = cross ; then
+ ac_fn_c_check_func "$LINENO" "lchflags"
"ac_cv_func_lchflags"
+-if test "x$ac_cv_func_lchflags" = xyes; then :
++if test "x$ac_cv_func_lchflags" = x""yes; then :
+ ac_cv_have_lchflags="yes"
+ else
+ ac_cv_have_lchflags="no"
+@@ -9882,7 +9976,7 @@ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -lz"
>&5
+ $as_echo_n "checking for inflateCopy in -lz... " >&6; }
+-if ${ac_cv_lib_z_inflateCopy+:} false; then :
++if test "${ac_cv_lib_z_inflateCopy+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -9916,7 +10010,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateCopy"
>&5
+ $as_echo "$ac_cv_lib_z_inflateCopy" >&6; }
+-if test "x$ac_cv_lib_z_inflateCopy" = xyes; then :
++if test "x$ac_cv_lib_z_inflateCopy" = x""yes; then :
+
+ $as_echo "#define HAVE_ZLIB_COPY 1" >>confdefs.h
+
+@@ -10059,7 +10153,7 @@ rm -f core conftest.err conftest.$ac_obj
+ for ac_func in openpty
+ do :
+ ac_fn_c_check_func "$LINENO" "openpty"
"ac_cv_func_openpty"
+-if test "x$ac_cv_func_openpty" = xyes; then :
++if test "x$ac_cv_func_openpty" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_OPENPTY 1
+ _ACEOF
+@@ -10067,7 +10161,7 @@ _ACEOF
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil"
>&5
+ $as_echo_n "checking for openpty in -lutil... " >&6; }
+-if ${ac_cv_lib_util_openpty+:} false; then :
++if test "${ac_cv_lib_util_openpty+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -10101,13 +10195,13 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty"
>&5
+ $as_echo "$ac_cv_lib_util_openpty" >&6; }
+-if test "x$ac_cv_lib_util_openpty" = xyes; then :
++if test "x$ac_cv_lib_util_openpty" = x""yes; then :
+ $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h
+ LIBS="$LIBS -lutil"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lbsd"
>&5
+ $as_echo_n "checking for openpty in -lbsd... " >&6; }
+-if ${ac_cv_lib_bsd_openpty+:} false; then :
++if test "${ac_cv_lib_bsd_openpty+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -10141,7 +10235,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_openpty"
>&5
+ $as_echo "$ac_cv_lib_bsd_openpty" >&6; }
+-if test "x$ac_cv_lib_bsd_openpty" = xyes; then :
++if test "x$ac_cv_lib_bsd_openpty" = x""yes; then :
+ $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h
+ LIBS="$LIBS -lbsd"
+ fi
+@@ -10156,7 +10250,7 @@ done
+ for ac_func in forkpty
+ do :
+ ac_fn_c_check_func "$LINENO" "forkpty"
"ac_cv_func_forkpty"
+-if test "x$ac_cv_func_forkpty" = xyes; then :
++if test "x$ac_cv_func_forkpty" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_FORKPTY 1
+ _ACEOF
+@@ -10164,7 +10258,7 @@ _ACEOF
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil"
>&5
+ $as_echo_n "checking for forkpty in -lutil... " >&6; }
+-if ${ac_cv_lib_util_forkpty+:} false; then :
++if test "${ac_cv_lib_util_forkpty+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -10198,13 +10292,13 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty"
>&5
+ $as_echo "$ac_cv_lib_util_forkpty" >&6; }
+-if test "x$ac_cv_lib_util_forkpty" = xyes; then :
++if test "x$ac_cv_lib_util_forkpty" = x""yes; then :
+ $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
+ LIBS="$LIBS -lutil"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lbsd"
>&5
+ $as_echo_n "checking for forkpty in -lbsd... " >&6; }
+-if ${ac_cv_lib_bsd_forkpty+:} false; then :
++if test "${ac_cv_lib_bsd_forkpty+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -10238,7 +10332,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_forkpty"
>&5
+ $as_echo "$ac_cv_lib_bsd_forkpty" >&6; }
+-if test "x$ac_cv_lib_bsd_forkpty" = xyes; then :
++if test "x$ac_cv_lib_bsd_forkpty" = x""yes; then :
+ $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h
+ LIBS="$LIBS -lbsd"
+ fi
+@@ -10255,7 +10349,7 @@ done
+ for ac_func in memmove
+ do :
+ ac_fn_c_check_func "$LINENO" "memmove"
"ac_cv_func_memmove"
+-if test "x$ac_cv_func_memmove" = xyes; then :
++if test "x$ac_cv_func_memmove" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_MEMMOVE 1
+ _ACEOF
+@@ -10269,7 +10363,8 @@ for ac_func in fseek64 fseeko fstatvfs f
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -10278,50 +10373,31 @@ fi
+ done
+
+
+-ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2"
+-if test "x$ac_cv_func_dup2" = xyes; then :
+- $as_echo "#define HAVE_DUP2 1" >>confdefs.h
+-
+-else
+- case " $LIBOBJS " in
+- *" dup2.$ac_objext "* ) ;;
+- *) LIBOBJS="$LIBOBJS dup2.$ac_objext"
+- ;;
+-esac
+-
+-fi
+-
+-ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
+-if test "x$ac_cv_func_getcwd" = xyes; then :
+- $as_echo "#define HAVE_GETCWD 1" >>confdefs.h
+-
+-else
+- case " $LIBOBJS " in
+- *" getcwd.$ac_objext "* ) ;;
+- *) LIBOBJS="$LIBOBJS getcwd.$ac_objext"
+- ;;
+-esac
+-
+-fi
+-
+-ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup"
+-if test "x$ac_cv_func_strdup" = xyes; then :
+- $as_echo "#define HAVE_STRDUP 1" >>confdefs.h
++for ac_func in dup2 getcwd strdup
++do :
++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++_ACEOF
+
+ else
+ case " $LIBOBJS " in
+- *" strdup.$ac_objext "* ) ;;
+- *) LIBOBJS="$LIBOBJS strdup.$ac_objext"
++ *" $ac_func.$ac_objext "* ) ;;
++ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
+ ;;
+ esac
+
+ fi
++done
+
+
+ for ac_func in getpgrp
+ do :
+ ac_fn_c_check_func "$LINENO" "getpgrp"
"ac_cv_func_getpgrp"
+-if test "x$ac_cv_func_getpgrp" = xyes; then :
++if test "x$ac_cv_func_getpgrp" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_GETPGRP 1
+ _ACEOF
+@@ -10349,7 +10425,7 @@ done
+ for ac_func in setpgrp
+ do :
+ ac_fn_c_check_func "$LINENO" "setpgrp"
"ac_cv_func_setpgrp"
+-if test "x$ac_cv_func_setpgrp" = xyes; then :
++if test "x$ac_cv_func_setpgrp" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_SETPGRP 1
+ _ACEOF
+@@ -10377,7 +10453,7 @@ done
+ for ac_func in gettimeofday
+ do :
+ ac_fn_c_check_func "$LINENO" "gettimeofday"
"ac_cv_func_gettimeofday"
+-if test "x$ac_cv_func_gettimeofday" = xyes; then :
++if test "x$ac_cv_func_gettimeofday" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_GETTIMEOFDAY 1
+ _ACEOF
+@@ -10479,7 +10555,7 @@ if test $have_getaddrinfo = yes
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking getaddrinfo bug"
>&5
+ $as_echo_n "checking getaddrinfo bug... " >&6; }
+- if ${ac_cv_buggy_getaddrinfo+:} false; then :
++ if test "${ac_cv_buggy_getaddrinfo+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -10608,7 +10684,7 @@ fi
+ for ac_func in getnameinfo
+ do :
+ ac_fn_c_check_func "$LINENO" "getnameinfo"
"ac_cv_func_getnameinfo"
+-if test "x$ac_cv_func_getnameinfo" = xyes; then :
++if test "x$ac_cv_func_getnameinfo" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_GETNAMEINFO 1
+ _ACEOF
+@@ -10620,7 +10696,7 @@ done
+ # checks for structures
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may
both be included" >&5
+ $as_echo_n "checking whether time.h and sys/time.h may both be included... "
>&6; }
+-if ${ac_cv_header_time+:} false; then :
++if test "${ac_cv_header_time+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -10655,7 +10731,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in
sys/time.h or time.h" >&5
+ $as_echo_n "checking whether struct tm is in sys/time.h or time.h... "
>&6; }
+-if ${ac_cv_struct_tm+:} false; then :
++if test "${ac_cv_struct_tm+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -10692,7 +10768,7 @@ ac_fn_c_check_member "$LINENO" "struct t
+ #include <$ac_cv_struct_tm>
+
+ "
+-if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then :
++if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_TM_TM_ZONE 1
+@@ -10708,7 +10784,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
+ else
+ ac_fn_c_check_decl "$LINENO" "tzname"
"ac_cv_have_decl_tzname" "#include <time.h>
+ "
+-if test "x$ac_cv_have_decl_tzname" = xyes; then :
++if test "x$ac_cv_have_decl_tzname" = x""yes; then :
+ ac_have_decl=1
+ else
+ ac_have_decl=0
+@@ -10720,7 +10796,7 @@ _ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
+ $as_echo_n "checking for tzname... " >&6; }
+-if ${ac_cv_var_tzname+:} false; then :
++if test "${ac_cv_var_tzname+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -10756,7 +10832,7 @@ $as_echo "#define HAVE_TZNAME 1" >>confd
+ fi
+
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev"
"ac_cv_member_struct_stat_st_rdev" "$ac_includes_default"
+-if test "x$ac_cv_member_struct_stat_st_rdev" = xyes; then :
++if test "x$ac_cv_member_struct_stat_st_rdev" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_STAT_ST_RDEV 1
+@@ -10766,7 +10842,7 @@ _ACEOF
+ fi
+
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize"
"ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
+-if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then :
++if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+@@ -10776,7 +10852,7 @@ _ACEOF
+ fi
+
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_flags"
"ac_cv_member_struct_stat_st_flags" "$ac_includes_default"
+-if test "x$ac_cv_member_struct_stat_st_flags" = xyes; then :
++if test "x$ac_cv_member_struct_stat_st_flags" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_STAT_ST_FLAGS 1
+@@ -10786,7 +10862,7 @@ _ACEOF
+ fi
+
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_gen"
"ac_cv_member_struct_stat_st_gen" "$ac_includes_default"
+-if test "x$ac_cv_member_struct_stat_st_gen" = xyes; then :
++if test "x$ac_cv_member_struct_stat_st_gen" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_STAT_ST_GEN 1
+@@ -10796,7 +10872,7 @@ _ACEOF
+ fi
+
+ ac_fn_c_check_member "$LINENO" "struct stat"
"st_birthtime" "ac_cv_member_struct_stat_st_birthtime"
"$ac_includes_default"
+-if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then :
++if test "x$ac_cv_member_struct_stat_st_birthtime" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_STAT_ST_BIRTHTIME 1
+@@ -10806,7 +10882,7 @@ _ACEOF
+ fi
+
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks"
"ac_cv_member_struct_stat_st_blocks" "$ac_includes_default"
+-if test "x$ac_cv_member_struct_stat_st_blocks" = xyes; then :
++if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_STAT_ST_BLOCKS 1
+@@ -10828,7 +10904,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for time.h that defines
altzone" >&5
+ $as_echo_n "checking for time.h that defines altzone... " >&6; }
+-if ${ac_cv_header_time_altzone+:} false; then :
++if test "${ac_cv_header_time_altzone+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -10892,7 +10968,7 @@ $as_echo "$was_it_defined" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addrinfo" >&5
+ $as_echo_n "checking for addrinfo... " >&6; }
+-if ${ac_cv_struct_addrinfo+:} false; then :
++if test "${ac_cv_struct_addrinfo+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -10924,7 +11000,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sockaddr_storage"
>&5
+ $as_echo_n "checking for sockaddr_storage... " >&6; }
+-if ${ac_cv_struct_sockaddr_storage+:} false; then :
++if test "${ac_cv_struct_sockaddr_storage+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -10960,7 +11036,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned"
>&5
+ $as_echo_n "checking whether char is unsigned... " >&6; }
+-if ${ac_cv_c_char_unsigned+:} false; then :
++if test "${ac_cv_c_char_unsigned+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -10992,7 +11068,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming
const" >&5
+ $as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+-if ${ac_cv_c_const+:} false; then :
++if test "${ac_cv_c_const+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -11280,7 +11356,7 @@ $as_echo "$va_list_is_array" >&6; }
+
+
+ ac_fn_c_check_func "$LINENO" "gethostbyname_r"
"ac_cv_func_gethostbyname_r"
+-if test "x$ac_cv_func_gethostbyname_r" = xyes; then :
++if test "x$ac_cv_func_gethostbyname_r" = x""yes; then :
+
+ $as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h
+
+@@ -11411,7 +11487,7 @@ else
+ for ac_func in gethostbyname
+ do :
+ ac_fn_c_check_func "$LINENO" "gethostbyname"
"ac_cv_func_gethostbyname"
+-if test "x$ac_cv_func_gethostbyname" = xyes; then :
++if test "x$ac_cv_func_gethostbyname" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_GETHOSTBYNAME 1
+ _ACEOF
+@@ -11433,12 +11509,12 @@ fi
+
+ # Linux requires this for correct f.p. operations
+ ac_fn_c_check_func "$LINENO" "__fpu_control"
"ac_cv_func___fpu_control"
+-if test "x$ac_cv_func___fpu_control" = xyes; then :
++if test "x$ac_cv_func___fpu_control" = x""yes; then :
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __fpu_control in
-lieee" >&5
+ $as_echo_n "checking for __fpu_control in -lieee... " >&6; }
+-if ${ac_cv_lib_ieee___fpu_control+:} false; then :
++if test "${ac_cv_lib_ieee___fpu_control+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -11472,7 +11548,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_ieee___fpu_control" >&5
+ $as_echo "$ac_cv_lib_ieee___fpu_control" >&6; }
+-if test "x$ac_cv_lib_ieee___fpu_control" = xyes; then :
++if test "x$ac_cv_lib_ieee___fpu_control" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_LIBIEEE 1
+ _ACEOF
+@@ -11528,7 +11604,7 @@ elif test "$withval" != yes
+ then LIBM=$withval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBM=\"$withval\"" >&5
+ $as_echo "set LIBM=\"$withval\"" >&6; }
+-else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO"
5
++else as_fn_error "proper usage is --with-libm=STRING" "$LINENO" 5
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBM=\"$LIBM\"" >&5
+@@ -11552,7 +11628,7 @@ elif test "$withval" != yes
+ then LIBC=$withval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBC=\"$withval\"" >&5
+ $as_echo "set LIBC=\"$withval\"" >&6; }
+-else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO"
5
++else as_fn_error "proper usage is --with-libc=STRING" "$LINENO" 5
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBC=\"$LIBC\"" >&5
+@@ -11566,7 +11642,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are
little-endian IEEE 754 binary64" >&5
+ $as_echo_n "checking whether C doubles are little-endian IEEE 754 binary64...
" >&6; }
+-if ${ac_cv_little_endian_double+:} false; then :
++if test "${ac_cv_little_endian_double+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -11608,7 +11684,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are big-endian
IEEE 754 binary64" >&5
+ $as_echo_n "checking whether C doubles are big-endian IEEE 754 binary64... "
>&6; }
+-if ${ac_cv_big_endian_double+:} false; then :
++if test "${ac_cv_big_endian_double+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+@@ -11654,7 +11730,7 @@ fi
+ # conversions work.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are ARM
mixed-endian IEEE 754 binary64" >&5
+ $as_echo_n "checking whether C doubles are ARM mixed-endian IEEE 754 binary64...
" >&6; }
+-if ${ac_cv_mixed_endian_double+:} false; then :
++if test "${ac_cv_mixed_endian_double+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -11802,7 +11878,8 @@ for ac_func in acosh asinh atanh copysig
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -11814,7 +11891,8 @@ for ac_func in hypot lgamma log1p round
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -11824,7 +11902,7 @@ done
+
+ ac_fn_c_check_decl "$LINENO" "isinf"
"ac_cv_have_decl_isinf" "#include <math.h>
+ "
+-if test "x$ac_cv_have_decl_isinf" = xyes; then :
++if test "x$ac_cv_have_decl_isinf" = x""yes; then :
+ ac_have_decl=1
+ else
+ ac_have_decl=0
+@@ -11835,7 +11913,7 @@ cat >>confdefs.h <<_ACEOF
+ _ACEOF
+ ac_fn_c_check_decl "$LINENO" "isnan"
"ac_cv_have_decl_isnan" "#include <math.h>
+ "
+-if test "x$ac_cv_have_decl_isnan" = xyes; then :
++if test "x$ac_cv_have_decl_isnan" = x""yes; then :
+ ac_have_decl=1
+ else
+ ac_have_decl=0
+@@ -11846,7 +11924,7 @@ cat >>confdefs.h <<_ACEOF
+ _ACEOF
+ ac_fn_c_check_decl "$LINENO" "isfinite"
"ac_cv_have_decl_isfinite" "#include <math.h>
+ "
+-if test "x$ac_cv_have_decl_isfinite" = xyes; then :
++if test "x$ac_cv_have_decl_isfinite" = x""yes; then :
+ ac_have_decl=1
+ else
+ ac_have_decl=0
+@@ -11861,7 +11939,7 @@ _ACEOF
+ # -0. on some architectures.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tanh preserves the sign
of zero" >&5
+ $as_echo_n "checking whether tanh preserves the sign of zero... " >&6;
}
+-if ${ac_cv_tanh_preserves_zero_sign+:} false; then :
++if test "${ac_cv_tanh_preserves_zero_sign+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -11909,7 +11987,7 @@ then
+ # -0. See issue #9920.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether log1p drops the sign
of negative zero" >&5
+ $as_echo_n "checking whether log1p drops the sign of negative zero... "
>&6; }
+- if ${ac_cv_log1p_drops_zero_sign+:} false; then :
++ if test "${ac_cv_log1p_drops_zero_sign+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -11961,7 +12039,7 @@ LIBS=$LIBS_SAVE
+ # sem_open results in a 'Signal 12' error.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX semaphores are
enabled" >&5
+ $as_echo_n "checking whether POSIX semaphores are enabled... " >&6; }
+-if ${ac_cv_posix_semaphores_enabled+:} false; then :
++if test "${ac_cv_posix_semaphores_enabled+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -12012,7 +12090,7 @@ fi
+ # Multiprocessing check for broken sem_getvalue
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken sem_getvalue"
>&5
+ $as_echo_n "checking for broken sem_getvalue... " >&6; }
+-if ${ac_cv_broken_sem_getvalue+:} false; then :
++if test "${ac_cv_broken_sem_getvalue+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -12077,7 +12155,7 @@ no)
+ 15|30)
+ ;;
+ *)
+- as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value
should be 15 or 30" "$LINENO" 5 ;;
++ as_fn_error "bad value $enable_big_digits for --enable-big-digits; value should
be 15 or 30" "$LINENO" 5 ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits"
>&5
+ $as_echo "$enable_big_digits" >&6; }
+@@ -12095,7 +12173,7 @@ fi
+
+ # check for wchar.h
+ ac_fn_c_check_header_mongrel "$LINENO" "wchar.h"
"ac_cv_header_wchar_h" "$ac_includes_default"
+-if test "x$ac_cv_header_wchar_h" = xyes; then :
++if test "x$ac_cv_header_wchar_h" = x""yes; then :
+
+
+ $as_echo "#define HAVE_WCHAR_H 1" >>confdefs.h
+@@ -12118,7 +12196,7 @@ then
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5
+ $as_echo_n "checking size of wchar_t... " >&6; }
+-if ${ac_cv_sizeof_wchar_t+:} false; then :
++if test "${ac_cv_sizeof_wchar_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))"
"ac_cv_sizeof_wchar_t" "#include <wchar.h>
+@@ -12128,8 +12206,9 @@ else
+ if test "$ac_cv_type_wchar_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (wchar_t)
+-See \`config.log' for more details" "$LINENO" 5; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (wchar_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_wchar_t=0
+ fi
+@@ -12184,7 +12263,7 @@ then
+ # check whether wchar_t is signed or not
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wchar_t is signed"
>&5
+ $as_echo_n "checking whether wchar_t is signed... " >&6; }
+- if ${ac_cv_wchar_t_signed+:} false; then :
++ if test "${ac_cv_wchar_t_signed+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -12280,7 +12359,7 @@ $as_echo "$PY_UNICODE_TYPE" >&6; }
+ # check for endianness
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is
bigendian" >&5
+ $as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+-if ${ac_cv_c_bigendian+:} false; then :
++if test "${ac_cv_c_bigendian+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_cv_c_bigendian=unknown
+@@ -12498,7 +12577,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUI
+
+ ;; #(
+ *)
+- as_fn_error $? "unknown endianness
++ as_fn_error "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+@@ -12571,7 +12650,7 @@ $as_echo "$SO" >&6; }
+ # or fills with zeros (like the Cray J90, according to Tim Peters).
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether right shift extends the
sign bit" >&5
+ $as_echo_n "checking whether right shift extends the sign bit... " >&6;
}
+-if ${ac_cv_rshift_extends_sign+:} false; then :
++if test "${ac_cv_rshift_extends_sign+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -12610,7 +12689,7 @@ fi
+ # check for getc_unlocked and related locking functions
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getc_unlocked() and
friends" >&5
+ $as_echo_n "checking for getc_unlocked() and friends... " >&6; }
+-if ${ac_cv_have_getc_unlocked+:} false; then :
++if test "${ac_cv_have_getc_unlocked+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -12708,7 +12787,7 @@ fi
+ # check for readline 2.1
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_callback_handler_install
in -lreadline" >&5
+ $as_echo_n "checking for rl_callback_handler_install in -lreadline... "
>&6; }
+-if ${ac_cv_lib_readline_rl_callback_handler_install+:} false; then :
++if test "${ac_cv_lib_readline_rl_callback_handler_install+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -12742,7 +12821,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_callback_handler_install" >&5
+ $as_echo "$ac_cv_lib_readline_rl_callback_handler_install" >&6; }
+-if test "x$ac_cv_lib_readline_rl_callback_handler_install" = xyes; then :
++if test "x$ac_cv_lib_readline_rl_callback_handler_install" = x""yes;
then :
+
+ $as_echo "#define HAVE_RL_CALLBACK 1" >>confdefs.h
+
+@@ -12760,7 +12839,7 @@ else
+ have_readline=no
+
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if test $have_readline = yes
+ then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -12794,7 +12873,7 @@ fi
+ # check for readline 4.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in
-lreadline" >&5
+ $as_echo_n "checking for rl_pre_input_hook in -lreadline... " >&6; }
+-if ${ac_cv_lib_readline_rl_pre_input_hook+:} false; then :
++if test "${ac_cv_lib_readline_rl_pre_input_hook+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -12828,7 +12907,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_pre_input_hook" >&5
+ $as_echo "$ac_cv_lib_readline_rl_pre_input_hook" >&6; }
+-if test "x$ac_cv_lib_readline_rl_pre_input_hook" = xyes; then :
++if test "x$ac_cv_lib_readline_rl_pre_input_hook" = x""yes; then :
+
+ $as_echo "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h
+
+@@ -12838,7 +12917,7 @@ fi
+ # also in 4.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for
rl_completion_display_matches_hook in -lreadline" >&5
+ $as_echo_n "checking for rl_completion_display_matches_hook in -lreadline... "
>&6; }
+-if ${ac_cv_lib_readline_rl_completion_display_matches_hook+:} false; then :
++if test "${ac_cv_lib_readline_rl_completion_display_matches_hook+set}" = set;
then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -12872,7 +12951,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_completion_display_matches_hook" >&5
+ $as_echo "$ac_cv_lib_readline_rl_completion_display_matches_hook" >&6;
}
+-if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = xyes; then
:
++if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" =
x""yes; then :
+
+ $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1"
>>confdefs.h
+
+@@ -12882,7 +12961,7 @@ fi
+ # check for readline 4.2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in
-lreadline" >&5
+ $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6;
}
+-if ${ac_cv_lib_readline_rl_completion_matches+:} false; then :
++if test "${ac_cv_lib_readline_rl_completion_matches+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+@@ -12916,7 +12995,7 @@ LIBS=$ac_check_lib_save_LIBS
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result:
$ac_cv_lib_readline_rl_completion_matches" >&5
+ $as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; }
+-if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes; then :
++if test "x$ac_cv_lib_readline_rl_completion_matches" = x""yes; then
:
+
+ $as_echo "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h
+
+@@ -12934,7 +13013,7 @@ else
+ have_readline=no
+
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if test $have_readline = yes
+ then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -12957,7 +13036,7 @@ LIBS=$LIBS_no_readline
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken nice()"
>&5
+ $as_echo_n "checking for broken nice()... " >&6; }
+-if ${ac_cv_broken_nice+:} false; then :
++if test "${ac_cv_broken_nice+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -12998,7 +13077,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll()"
>&5
+ $as_echo_n "checking for broken poll()... " >&6; }
+-if ${ac_cv_broken_poll+:} false; then :
++if test "${ac_cv_broken_poll+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -13053,7 +13132,7 @@ ac_fn_c_check_member "$LINENO" "struct t
+ #include <$ac_cv_struct_tm>
+
+ "
+-if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then :
++if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then :
+
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE_STRUCT_TM_TM_ZONE 1
+@@ -13069,7 +13148,7 @@ $as_echo "#define HAVE_TM_ZONE 1" >>conf
+ else
+ ac_fn_c_check_decl "$LINENO" "tzname"
"ac_cv_have_decl_tzname" "#include <time.h>
+ "
+-if test "x$ac_cv_have_decl_tzname" = xyes; then :
++if test "x$ac_cv_have_decl_tzname" = x""yes; then :
+ ac_have_decl=1
+ else
+ ac_have_decl=0
+@@ -13081,7 +13160,7 @@ _ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
+ $as_echo_n "checking for tzname... " >&6; }
+-if ${ac_cv_var_tzname+:} false; then :
++if test "${ac_cv_var_tzname+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -13120,7 +13199,7 @@ fi
+ # check tzset(3) exists and works like we expect it to
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working tzset()"
>&5
+ $as_echo_n "checking for working tzset()... " >&6; }
+-if ${ac_cv_working_tzset+:} false; then :
++if test "${ac_cv_working_tzset+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+
+@@ -13217,7 +13296,7 @@ fi
+ # Look for subsecond timestamps in struct stat
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec in struct stat"
>&5
+ $as_echo_n "checking for tv_nsec in struct stat... " >&6; }
+-if ${ac_cv_stat_tv_nsec+:} false; then :
++if test "${ac_cv_stat_tv_nsec+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -13254,7 +13333,7 @@ fi
+ # Look for BSD style subsecond timestamps in struct stat
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec2 in struct stat"
>&5
+ $as_echo_n "checking for tv_nsec2 in struct stat... " >&6; }
+-if ${ac_cv_stat_tv_nsec2+:} false; then :
++if test "${ac_cv_stat_tv_nsec2+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -13291,7 +13370,7 @@ fi
+ # On HP/UX 11.0, mvwdelch is a block with a return statement
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mvwdelch is an
expression" >&5
+ $as_echo_n "checking whether mvwdelch is an expression... " >&6; }
+-if ${ac_cv_mvwdelch_is_expression+:} false; then :
++if test "${ac_cv_mvwdelch_is_expression+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -13328,7 +13407,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether WINDOW has _flags"
>&5
+ $as_echo_n "checking whether WINDOW has _flags... " >&6; }
+-if ${ac_cv_window_has_flags+:} false; then :
++if test "${ac_cv_window_has_flags+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -13476,7 +13555,7 @@ if test "$have_long_long" = yes
+ then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %lld and %llu printf()
format support" >&5
+ $as_echo_n "checking for %lld and %llu printf() format support... "
>&6; }
+- if ${ac_cv_have_long_long_format+:} false; then :
++ if test "${ac_cv_have_long_long_format+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -13546,7 +13625,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %zd printf() format
support" >&5
+ $as_echo_n "checking for %zd printf() format support... " >&6; }
+-if ${ac_cv_have_size_t_format+:} false; then :
++if test "${ac_cv_have_size_t_format+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -13619,7 +13698,7 @@ ac_fn_c_check_type "$LINENO" "socklen_t"
+ #endif
+
+ "
+-if test "x$ac_cv_type_socklen_t" = xyes; then :
++if test "x$ac_cv_type_socklen_t" = x""yes; then :
+
+ else
+
+@@ -13630,7 +13709,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken mbstowcs"
>&5
+ $as_echo_n "checking for broken mbstowcs... " >&6; }
+-if ${ac_cv_broken_mbstowcs+:} false; then :
++if test "${ac_cv_broken_mbstowcs+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -13670,7 +13749,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports computed
gotos" >&5
+ $as_echo_n "checking whether $CC supports computed gotos... " >&6; }
+-if ${ac_cv_computed_gotos+:} false; then :
++if test "${ac_cv_computed_gotos+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+ else
+ if test "$cross_compiling" = yes; then :
+@@ -13750,11 +13829,11 @@ esac
+
+
+ case $ac_sys_system in
+- OSF*) as_fn_error $? "OSF* systems are deprecated unless somebody volunteers.
Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
++ OSF*) as_fn_error "OSF* systems are deprecated unless somebody volunteers. Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
+ esac
+
+ ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
+-if test "x$ac_cv_func_pipe2" = xyes; then :
++if test "x$ac_cv_func_pipe2" = x""yes; then :
+
+ $as_echo "#define HAVE_PIPE2 1" >>confdefs.h
+
+@@ -13849,21 +13928,10 @@ $as_echo "$as_me: WARNING: cache variabl
+ :end' >>confcache
+ if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+- if test "x$cache_file" != "x/dev/null"; then
++ test "x$cache_file" != "x/dev/null" &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file"
>&5
+ $as_echo "$as_me: updating cache $cache_file" >&6;}
+- if test ! -f "$cache_file" || test -h "$cache_file"; then
+- cat confcache >"$cache_file"
+- else
+- case $cache_file in #(
+- */* | ?:*)
+- mv -f confcache "$cache_file"$$ &&
+- mv -f "$cache_file"$$ "$cache_file" ;; #(
+- *)
+- mv -f confcache "$cache_file" ;;
+- esac
+- fi
+- fi
++ cat confcache >$cache_file
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache
$cache_file" >&5
+ $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+@@ -13879,7 +13947,6 @@ DEFS=-DHAVE_CONFIG_H
+
+ ac_libobjs=
+ ac_ltlibobjs=
+-U=
+ for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+@@ -13896,7 +13963,7 @@ LTLIBOBJS=$ac_ltlibobjs
+
+
+
+-: "${CONFIG_STATUS=./config.status}"
++: ${CONFIG_STATUS=./config.status}
+ ac_write_fail=0
+ ac_clean_files_save=$ac_clean_files
+ ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+@@ -13997,7 +14064,6 @@ fi
+ IFS=" "" $as_nl"
+
+ # Find who we are. Look in the path if we contain no directory separator.
+-as_myself=
+ case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+@@ -14043,19 +14109,19 @@ export LANGUAGE
+ (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+-# as_fn_error STATUS ERROR [LINENO LOG_FD]
+-# ----------------------------------------
++# as_fn_error ERROR [LINENO LOG_FD]
++# ---------------------------------
+ # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+ # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+-# script with STATUS, using 1 if that was 0.
++# script with status $?, using 1 if that was 0.
+ as_fn_error ()
+ {
+- as_status=$1; test $as_status -eq 0 && as_status=1
+- if test "$4"; then
+- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
++ as_status=$?; test $as_status -eq 0 && as_status=1
++ if test "$3"; then
++ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+ fi
+- $as_echo "$as_me: error: $2" >&2
++ $as_echo "$as_me: error: $1" >&2
+ as_fn_exit $as_status
+ } # as_fn_error
+
+@@ -14251,7 +14317,7 @@ $as_echo X"$as_dir" |
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
++ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
+
+
+ } # as_fn_mkdir_p
+@@ -14305,7 +14371,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # values after options handling.
+ ac_log="
+ This file was extended by python $as_me 3.2, which was
+-generated by GNU Autoconf 2.68. Invocation command line was
++generated by GNU Autoconf 2.65. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+@@ -14367,10 +14433,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+ python config.status 3.2
+-configured by $0, generated by GNU Autoconf 2.68,
++configured by $0, generated by GNU Autoconf 2.65,
+ with options \\"\$ac_cs_config\\"
+
+-Copyright (C) 2010 Free Software Foundation, Inc.
++Copyright (C) 2009 Free Software Foundation, Inc.
+ This config.status script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it."
+
+@@ -14386,16 +14452,11 @@ ac_need_defaults=:
+ while test $# != 0
+ do
+ case $1 in
+- --*=?*)
++ --*=*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+- --*=)
+- ac_option=`expr "X$1" : 'X\([^=]*\)='`
+- ac_optarg=
+- ac_shift=:
+- ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+@@ -14417,7 +14478,6 @@ do
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed
"s/'/'\\\\\\\\''/g"` ;;
+- '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+@@ -14430,7 +14490,7 @@ do
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+- as_fn_error $? "ambiguous option: \`$1'
++ as_fn_error "ambiguous option: \`$1'
+ Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+@@ -14439,7 +14499,7 @@ Try \`$0 --help' for more information.";
+ ac_cs_silent=: ;;
+
+ # This is an error.
+- -*) as_fn_error $? "unrecognized option: \`$1'
++ -*) as_fn_error "unrecognized option: \`$1'
+ Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+@@ -14498,7 +14558,7 @@ do
+ "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc"
;;
+ "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES
Modules/ld_so_aix" ;;
+
+- *) as_fn_error $? "invalid argument: \`$ac_config_target'"
"$LINENO" 5;;
++ *) as_fn_error "invalid argument: \`$ac_config_target'"
"$LINENO" 5;;
+ esac
+ done
+
+@@ -14520,10 +14580,9 @@ fi
+ # after its creation but before its name has been assigned to `$tmp'.
+ $debug ||
+ {
+- tmp= ac_tmp=
++ tmp=
+ trap 'exit_status=$?
+- : "${ac_tmp:=$tmp}"
+- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit
$exit_status
++ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; }
&& exit $exit_status
+ ' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+ }
+@@ -14531,13 +14590,12 @@ $debug ||
+
+ {
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null`
&&
+- test -d "$tmp"
++ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+-} || as_fn_error $? "cannot create a temporary directory in ."
"$LINENO" 5
+-ac_tmp=$tmp
++} || as_fn_error "cannot create a temporary directory in ."
"$LINENO" 5
+
+ # Set up the scripts for CONFIG_FILES section.
+ # No need to generate them if there are no CONFIG_FILES.
+@@ -14554,12 +14612,12 @@ if test "x$ac_cr" = x; then
+ fi
+ ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null
2>/dev/null`
+ if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+- ac_cs_awk_cr='\\r'
++ ac_cs_awk_cr='\r'
+ else
+ ac_cs_awk_cr=$ac_cr
+ fi
+
+-echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
++echo 'BEGIN {' >"$tmp/subs1.awk" &&
+ _ACEOF
+
+
+@@ -14568,18 +14626,18 @@ _ACEOF
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/'
&&
+ echo "_ACEOF"
+ } >conf$$subs.sh ||
+- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
++ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ ac_delim='%!_!# '
+ for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+@@ -14587,7 +14645,7 @@ done
+ rm -f conf$$subs.sh
+
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
++cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+ _ACEOF
+ sed -n '
+ h
+@@ -14635,7 +14693,7 @@ t delim
+ rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- # Files that config.status was made for.
--config_files="`echo $ac_config_files`"
--config_headers="`echo $ac_config_headers`"
-+config_files="$ac_config_files"
-+config_headers="$ac_config_headers"
+ _ACAWK
+-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
++cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+@@ -14667,29 +14725,21 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+ else
+ cat
+-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+- || as_fn_error $? "could not setup config files machinery"
"$LINENO" 5
++fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
++ || as_fn_error "could not setup config files machinery" "$LINENO"
5
+ _ACEOF
+
+-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading
and
++# VPATH may cause trouble with some makes, so we remove $(srcdir),
++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+ # trailing colons and then remove the whole line if VPATH becomes empty
+ # (actually we leave an empty line to preserve line numbers).
+ if test "x$srcdir" = x.; then
+- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+-h
+-s///
+-s/^/:/
+-s/[ ]*$/:/
+-s/:\$(srcdir):/:/g
+-s/:\${srcdir}:/:/g
+-s/:@srcdir@:/:/g
+-s/^:*//
++ ac_vpsub='/^[ ]*VPATH[ ]*=/{
++s/:*\$(srcdir):*/:/
++s/:*\${srcdir}:*/:/
++s/:*@srcdir@:*/:/
++s/^\([^=]*=[ ]*\):*/\1/
+ s/:*$//
+-x
+-s/\(=[ ]*\).*/\1/
+-G
+-s/\n//
+ s/^[^=]*=[ ]*$//
+ }'
+ fi
+@@ -14701,7 +14751,7 @@ fi # test -n "$CONFIG_FILES"
+ # No need to generate them if there are no CONFIG_HEADERS.
+ # This happens for instance with `./config.status Makefile'.
+ if test -n "$CONFIG_HEADERS"; then
+-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
++cat >"$tmp/defines.awk" <<\_ACAWK ||
+ BEGIN {
_ACEOF
+@@ -14713,11 +14763,11 @@ _ACEOF
+ # handling of long lines.
+ ac_delim='%!_!# '
+ for ac_last_try in false false :; do
+- ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+- if test -z "$ac_tt"; then
++ ac_t=`sed -n "/$ac_delim/p" confdefs.h`
++ if test -z "$ac_t"; then
+ break
+ elif $ac_last_try; then
+- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
++ as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+@@ -14802,7 +14852,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+ _ACAWK
+ _ACEOF
+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+- as_fn_error $? "could not setup config headers machinery"
"$LINENO" 5
++ as_fn_error "could not setup config headers machinery" "$LINENO"
5
+ fi # test -n "$CONFIG_HEADERS"
+
+
+@@ -14815,7 +14865,7 @@ do
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO"
5;;
++ :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO"
5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+@@ -14834,7 +14884,7 @@ do
+ for ac_f
+ do
+ case $ac_f in
+- -) ac_f="$ac_tmp/stdin";;
++ -) ac_f="$tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+@@ -14843,7 +14893,7 @@ do
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO"
5;;
++ as_fn_error "cannot find input file: \`$ac_f'" "$LINENO"
5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed
"s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+@@ -14869,8 +14919,8 @@ $as_echo "$as_me: creating $ac_file" >&6
+ esac
+
+ case $ac_tag in
+- *:-:* | *:-) cat >"$ac_tmp/stdin" \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
++ *:-:* | *:-) cat >"$tmp/stdin" \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+@@ -15000,24 +15050,23 @@ s&@abs_top_builddir@&$ac_abs_top_builddi
+ s&@INSTALL@&$ac_INSTALL&;t t
+ $ac_datarootdir_hack
+ "
+-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f
"$ac_tmp/subs.awk" \
+- >$ac_tmp/out || as_fn_error $? "could not create $ac_file"
"$LINENO" 5
++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f
"$tmp/subs.awk" >$tmp/out \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
+
+ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n
"$ac_out"; } &&
+- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+- "$ac_tmp/out"`; test -z "$ac_out"; } &&
++ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n
"$ac_out"; } &&
++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z
"$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference
to the variable \`datarootdir'
+-which seems to be undefined. Please make sure it is defined" >&5
++which seems to be undefined. Please make sure it is defined." >&5
+ $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable
\`datarootdir'
+-which seems to be undefined. Please make sure it is defined" >&2;}
++which seems to be undefined. Please make sure it is defined." >&2;}
+
+- rm -f "$ac_tmp/stdin"
++ rm -f "$tmp/stdin"
+ case $ac_file in
+- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+- *) rm -f "$ac_file" && mv "$ac_tmp/out"
"$ac_file";;
++ -) cat "$tmp/out" && rm -f "$tmp/out";;
++ *) rm -f "$ac_file" && mv "$tmp/out"
"$ac_file";;
+ esac \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+@@ -15026,21 +15075,21 @@ which seems to be undefined. Please mak
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+- && eval '$AWK -f "$ac_tmp/defines.awk"'
"$ac_file_inputs"
+- } >"$ac_tmp/config.h" \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1;
then
++ && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs"
++ } >"$tmp/config.h" \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
++ if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1;
then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged"
>&5
+ $as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+- mv "$ac_tmp/config.h" "$ac_file" \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
++ mv "$tmp/config.h" "$ac_file" \
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+- && eval '$AWK -f "$ac_tmp/defines.awk"'
"$ac_file_inputs" \
+- || as_fn_error $? "could not create -" "$LINENO" 5
++ && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs" \
++ || as_fn_error "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+@@ -15060,7 +15109,7 @@ _ACEOF
+ ac_clean_files=$ac_clean_files_save
+
+ test $ac_write_fail = 0 ||
+- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO"
5
++ as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+ # configure is writing to config.log, and then calls config.status.
+@@ -15081,7 +15130,7 @@ if test "$no_create" != yes; then
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+- $ac_cs_success || as_fn_exit 1
++ $ac_cs_success || as_fn_exit $?
+ fi
+ if test -n "$ac_unrecognized_opts" && test
"$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options:
$ac_unrecognized_opts" >&5
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2011-01-17 13:09:50.827696887 -0500
-+++ ./pyconfig.h.in 2011-01-17 13:09:56.963611199 -0500
+--- ./pyconfig.h.in.autotool-intermediates 2011-02-14 12:00:34.924103677 -0500
++++ ./pyconfig.h.in 2011-02-14 12:00:41.116907489 -0500
@@ -12,15 +12,15 @@
support for AIX C++ shared extension modules. */
#undef AIX_GENUINE_CPLUSPLUS
diff --git a/python3.spec b/python3.spec
index 2922a5c..0d79ab1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,7 @@
# pybasever without the dot:
%global pyshortver 32
-%global alphatag rc2
+%global alphatag rc3
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -113,7 +113,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.11.%{alphatag}%{?dist}
+Release: 0.12.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -1167,6 +1167,10 @@ rm -fr %{buildroot}
%changelog
+* Mon Feb 14 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.12.rc3
+- 3.2rc3
+- regenerate autotool patch
+
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
commit fef240e443cd0a655b4fe51abc6cfc9cc1d128c0
Author: Dennis Gilmore <dennis(a)ausil.us>
Date: Wed Feb 9 01:42:58 2011 -0600
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
diff --git a/python3.spec b/python3.spec
index faf97b1..2922a5c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -113,7 +113,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.10.%{alphatag}%{?dist}
+Release: 0.11.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -1167,6 +1167,9 @@ rm -fr %{buildroot}
%changelog
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org> -
3.2-0.11.rc2
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
- 3.2rc2
commit fc9ba51d30bcac67d4f7d36985a2368f6866ebce
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Feb 8 19:35:54 2011 -0500
3.2rc2
diff --git a/.gitignore b/.gitignore
index 84f6983..b48c536 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ Python-3.1.2.tar.bz2
Python-3.2a1.tar.bz2
/Python-3.2b2.tar.bz2
/Python-3.2rc1.tar.bz2
+/Python-3.2rc2.tar.bz2
diff --git a/python3.spec b/python3.spec
index f4f23db..faf97b1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,7 @@
# pybasever without the dot:
%global pyshortver 32
-%global alphatag rc1
+%global alphatag rc2
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -113,7 +113,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.9.%{alphatag}%{?dist}
+Release: 0.10.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -1167,6 +1167,9 @@ rm -fr %{buildroot}
%changelog
+* Mon Jan 31 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.10.rc2
+- 3.2rc2
+
* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
- 3.2rc1
- rework patch 6 (static lib removal)
diff --git a/sources b/sources
index 470bbec..6a1dee9 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-057cb4b2ba64e166cb0a3342bec9125e Python-3.2rc1.tar.bz2
+57ba48501a4261f3c227585b07629e27 Python-3.2rc2.tar.bz2
commit 3dfb714641e7b09dd86726c2436d198062b92805
Author: Dan Hork <dan(a)danny.cz>
Date: Fri Feb 4 17:47:28 2011 +0100
add support for the timestamp counter on s390(x)
diff --git a/python-3.2rc1-s390-tsc.patch b/python-3.2rc1-s390-tsc.patch
new file mode 100644
index 0000000..fc4a6b9
--- /dev/null
+++ b/python-3.2rc1-s390-tsc.patch
@@ -0,0 +1,17 @@
+diff -up Python-3.2rc1/Python/ceval.c.s390-tsc Python-3.2rc1/Python/ceval.c
+--- Python-3.2rc1/Python/ceval.c.s390-tsc 2011-02-04 05:11:27.585224435 -0500
++++ Python-3.2rc1/Python/ceval.c 2011-02-04 05:12:38.065223933 -0500
+@@ -74,6 +74,13 @@ ppc_getcounter(uint64 *v)
+ "=a" (((int*)&(val))[0]), "=d"
(((int*)&(val))[1]));
+
+
++#elif defined(__s390__)
++
++/* covers both s390 and s390x */
++
++#define READ_TIMESTAMP(val) \
++ __asm__ __volatile__("stck %0" : "=Q" (val) : : "cc")
++
+ #else
+
+ #error "Don't know how to implement timestamp counter for this
architecture"
commit 34c15c7789f299317178b38fe0b3a1ed1b2dcf1d
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Mon Jan 17 16:25:14 2011 -0500
3.2rc1
* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
- 3.2rc1
- rework patch 6 (static lib removal)
- remove upstreamed patch 130 (ppc debug build)
- regenerate patch 300 (autotool intermediates)
- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
- added libpython3.so and 2to3-3.2
diff --git a/.gitignore b/.gitignore
index 474e8a7..84f6983 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
Python-3.1.2.tar.bz2
Python-3.2a1.tar.bz2
/Python-3.2b2.tar.bz2
+/Python-3.2rc1.tar.bz2
diff --git a/autotool-intermediates.patch b/autotool-intermediates.patch
index 8af26e3..fa49d8b 100644
--- a/autotool-intermediates.patch
+++ b/autotool-intermediates.patch
@@ -1,70 +1,13 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2010-12-28 18:47:15.206934478 -0500
-+++ ./configure 2010-12-28 18:47:21.053058461 -0500
-@@ -1,14 +1,14 @@
+--- ./configure.autotool-intermediates 2011-01-17 13:09:50.836697224 -0500
++++ ./configure 2011-01-17 13:09:56.662690482 -0500
+@@ -1,5 +1,5 @@
#! /bin/sh
- # From configure.in Revision: 87207 .
+-# From configure.in Revision: 87646 .
++# From configure.in Revision: 87698 .
# Guess values for system-dependent variables and create Makefiles.
--# Generated by GNU Autoconf 2.67 for python 3.2.
-+# Generated by GNU Autoconf 2.65 for python 3.2.
+ # Generated by GNU Autoconf 2.65 for python 3.2.
#
- # Report bugs to <
http://bugs.python.org/>.
- #
- #
- # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
--# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
--# Foundation, Inc.
-+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-+# Inc.
- #
- #
- # This configure script is free software; the Free Software Foundation
-@@ -320,7 +320,7 @@ $as_echo X"$as_dir" |
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
-- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
-+ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
-
-
- } # as_fn_mkdir_p
-@@ -360,19 +360,19 @@ else
- fi # as_fn_arith
-
-
--# as_fn_error STATUS ERROR [LINENO LOG_FD]
--# ----------------------------------------
-+# as_fn_error ERROR [LINENO LOG_FD]
-+# ---------------------------------
- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
- # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
--# script with STATUS, using 1 if that was 0.
-+# script with status $?, using 1 if that was 0.
- as_fn_error ()
- {
-- as_status=$1; test $as_status -eq 0 && as_status=1
-- if test "$4"; then
-- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-+ as_status=$?; test $as_status -eq 0 && as_status=1
-+ if test "$3"; then
-+ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
- fi
-- $as_echo "$as_me: error: $2" >&2
-+ $as_echo "$as_me: error: $1" >&2
- as_fn_exit $as_status
- } # as_fn_error
-
-@@ -534,7 +534,7 @@ test -n "$DJDIR" || exec 7<&0 </dev/null
- exec 6>&1
-
- # Name of the host.
--# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
- # so uname gets run too.
- ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
@@ -611,6 +611,8 @@ TRUE
MACHDEP_OBJS
DYNLOADFILE
@@ -74,7 +17,7 @@ diff -up ./configure.autotool-intermediates ./configure
THREADOBJ
LDLAST
USE_THREAD_MODULE
-@@ -748,8 +750,11 @@ with_thread
+@@ -749,8 +751,11 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -86,146 +29,7 @@ diff -up ./configure.autotool-intermediates ./configure
with_fpectl
with_libm
with_libc
-@@ -828,9 +833,8 @@ do
- fi
-
- case $ac_option in
-- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-- *=) ac_optarg= ;;
-- *) ac_optarg=yes ;;
-+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-+ *) ac_optarg=yes ;;
- esac
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-@@ -875,7 +879,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid feature name: $ac_useropt"
-+ as_fn_error "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -901,7 +905,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid feature name: $ac_useropt"
-+ as_fn_error "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -1105,7 +1109,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid package name: $ac_useropt"
-+ as_fn_error "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -1121,7 +1125,7 @@ do
- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
-- as_fn_error $? "invalid package name: $ac_useropt"
-+ as_fn_error "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
-@@ -1151,8 +1155,8 @@ do
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-
-- -*) as_fn_error $? "unrecognized option: \`$ac_option'
--Try \`$0 --help' for more information"
-+ -*) as_fn_error "unrecognized option: \`$ac_option'
-+Try \`$0 --help' for more information."
- ;;
-
- *=*)
-@@ -1160,7 +1164,7 @@ Try \`$0 --help' for more information"
- # Reject names that are not valid shell variable names.
- case $ac_envvar in #(
- '' | [0-9]* | *[!_$as_cr_alnum]* )
-- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
-+ as_fn_error "invalid variable name: \`$ac_envvar'" ;;
- esac
- eval $ac_envvar=\$ac_optarg
- export $ac_envvar ;;
-@@ -1178,13 +1182,13 @@ done
-
- if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-- as_fn_error $? "missing argument to $ac_option"
-+ as_fn_error "missing argument to $ac_option"
- fi
-
- if test -n "$ac_unrecognized_opts"; then
- case $enable_option_checking in
- no) ;;
-- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-+ fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options:
$ac_unrecognized_opts" >&2 ;;
- esac
- fi
-@@ -1207,7 +1211,7 @@ do
- [\\/$]* | ?:[\\/]* ) continue;;
- NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
- esac
-- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-+ as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
- done
-
- # There might be people who depend on the old broken behavior: `$host'
-@@ -1221,8 +1225,8 @@ target=$target_alias
- if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
-- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use
--host.
-- If a cross compiler is detected then cross compile mode will be used"
>&2
-+ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use
--host.
-+ If a cross compiler is detected then cross compile mode will be used."
>&2
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-@@ -1237,9 +1241,9 @@ test "$silent" = yes && exec 6>/dev/null
- ac_pwd=`pwd` && test -n "$ac_pwd" &&
- ac_ls_di=`ls -di .` &&
- ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-- as_fn_error $? "working directory cannot be determined"
-+ as_fn_error "working directory cannot be determined"
- test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-- as_fn_error $? "pwd does not report name of working directory"
-+ as_fn_error "pwd does not report name of working directory"
-
-
- # Find the source files, if location was not specified.
-@@ -1278,11 +1282,11 @@ else
- fi
- if test ! -r "$srcdir/$ac_unique_file"; then
- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or
.."
-- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-+ as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
- fi
- ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
- ac_abs_confdir=`(
-- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
$? "$ac_msg"
-+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
"$ac_msg"
- pwd)`
- # When building in place, set srcdir=.
- if test "$ac_abs_confdir" = "$ac_pwd"; then
-@@ -1322,7 +1326,7 @@ Configuration:
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
-- -q, --quiet, --silent do not print \`checking ...' messages
-+ -q, --quiet, --silent do not print \`checking...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
-@@ -1421,8 +1425,11 @@ Optional Packages:
+@@ -1421,8 +1426,11 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -237,775 +41,7 @@ diff -up ./configure.autotool-intermediates ./configure
--with-fpectl enable SIGFPE catching
--with-libm=STRING math library
--with-libc=STRING C library
-@@ -1508,9 +1515,9 @@ test -n "$ac_init_help" && exit $ac_stat
- if $ac_init_version; then
- cat <<\_ACEOF
- python configure 3.2
--generated by GNU Autoconf 2.67
-+generated by GNU Autoconf 2.65
-
--Copyright (C) 2010 Free Software Foundation, Inc.
-+Copyright (C) 2009 Free Software Foundation, Inc.
- This configure script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it.
- _ACEOF
-@@ -1580,7 +1587,7 @@ $as_echo "$ac_try_echo"; } >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-- test $ac_status = 0; } > conftest.i && {
-+ test $ac_status = 0; } >/dev/null && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
-@@ -1604,10 +1611,10 @@ fi
- ac_fn_c_check_header_mongrel ()
- {
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- if eval "test \"\${$3+set}\"" = set; then :
-+ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- fi
- eval ac_res=\$$3
-@@ -1643,7 +1650,7 @@ if ac_fn_c_try_cpp "$LINENO"; then :
- else
- ac_header_preproc=no
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc"
>&5
- $as_echo "$ac_header_preproc" >&6; }
-
-@@ -1666,15 +1673,17 @@ $as_echo "$as_me: WARNING: $2: see the A
- $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be
Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the
compiler's result" >&5
- $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result"
>&2;}
--( $as_echo "## -------------------------------------- ##
-+( cat <<\_ASBOX
-+## -------------------------------------- ##
- ## Report this to
http://bugs.python.org/ ##
--## -------------------------------------- ##"
-+## -------------------------------------- ##
-+_ASBOX
- ) | sed "s/^/$as_me: WARNING: /" >&2
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=\$ac_header_compiler"
-@@ -1738,7 +1747,7 @@ ac_fn_c_check_header_compile ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -1815,7 +1824,7 @@ ac_fn_c_check_type ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=no"
-@@ -1869,7 +1878,7 @@ ac_fn_c_find_uintX_t ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
- $as_echo_n "checking for uint$2_t... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=no"
-@@ -1899,7 +1908,8 @@ if ac_fn_c_try_compile "$LINENO"; then :
- esac
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-- if eval test \"x\$"$3"\" = x"no"; then :
-+ eval as_val=\$$3
-+ if test "x$as_val" = x""no; then :
-
- else
- break
-@@ -1922,7 +1932,7 @@ ac_fn_c_find_intX_t ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
- $as_echo_n "checking for int$2_t... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- eval "$3=no"
-@@ -1933,11 +1943,11 @@ else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h. */
- $ac_includes_default
-- enum { N = $2 / 2 - 1 };
- int
- main ()
- {
--static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) <<
N) - 1) * 2 + 1))];
-+static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
-+ 0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
- test_array [0] = 0
-
- ;
-@@ -1948,11 +1958,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h. */
- $ac_includes_default
-- enum { N = $2 / 2 - 1 };
- int
- main ()
- {
--static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) -
1) * 2 + 1)
-+static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
-+ ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
- < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
- test_array [0] = 0
-
-@@ -1973,7 +1983,8 @@ fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-- if eval test \"x\$"$3"\" = x"no"; then :
-+ eval as_val=\$$3
-+ if test "x$as_val" = x""no; then :
-
- else
- break
-@@ -2173,7 +2184,7 @@ ac_fn_c_check_func ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -2241,7 +2252,7 @@ ac_fn_c_check_member ()
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
- $as_echo_n "checking for $2.$3... " >&6; }
--if eval "test \"\${$4+set}\"" = set; then :
-+if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -2289,18 +2300,15 @@ $as_echo "$ac_res" >&6; }
-
- } # ac_fn_c_check_member
-
--# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
--# ---------------------------------------------
--# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
--# accordingly.
-+# ac_fn_c_check_decl LINENO SYMBOL VAR
-+# ------------------------------------
-+# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
- ac_fn_c_check_decl ()
- {
- as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- as_decl_name=`echo $2|sed 's/ *(.*//'`
-- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/)
0& (/g'`
-- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is
declared" >&5
--$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
--if eval "test \"\${$3+set}\"" = set; then :
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared"
>&5
-+$as_echo_n "checking whether $2 is declared... " >&6; }
-+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -2309,12 +2317,8 @@ $4
- int
- main ()
- {
--#ifndef $as_decl_name
--#ifdef __cplusplus
-- (void) $as_decl_use;
--#else
-- (void) $as_decl_name;
--#endif
-+#ifndef $2
-+ (void) $2;
- #endif
-
- ;
-@@ -2339,7 +2343,7 @@ This file contains any messages produced
- running configure, to aid debugging if configure makes a mistake.
-
- It was created by python $as_me 3.2, which was
--generated by GNU Autoconf 2.67. Invocation command line was
-+generated by GNU Autoconf 2.65. Invocation command line was
-
- $ $0 $@
-
-@@ -2449,9 +2453,11 @@ trap 'exit_status=$?
- {
- echo
-
-- $as_echo "## ---------------- ##
-+ cat <<\_ASBOX
-+## ---------------- ##
- ## Cache variables. ##
--## ---------------- ##"
-+## ---------------- ##
-+_ASBOX
- echo
- # The following way of writing the cache mishandles newlines in values,
- (
-@@ -2485,9 +2491,11 @@ $as_echo "$as_me: WARNING: cache variabl
- )
- echo
-
-- $as_echo "## ----------------- ##
-+ cat <<\_ASBOX
-+## ----------------- ##
- ## Output variables. ##
--## ----------------- ##"
-+## ----------------- ##
-+_ASBOX
- echo
- for ac_var in $ac_subst_vars
- do
-@@ -2500,9 +2508,11 @@ $as_echo "$as_me: WARNING: cache variabl
- echo
-
- if test -n "$ac_subst_files"; then
-- $as_echo "## ------------------- ##
-+ cat <<\_ASBOX
-+## ------------------- ##
- ## File substitutions. ##
--## ------------------- ##"
-+## ------------------- ##
-+_ASBOX
- echo
- for ac_var in $ac_subst_files
- do
-@@ -2516,9 +2526,11 @@ $as_echo "$as_me: WARNING: cache variabl
- fi
-
- if test -s confdefs.h; then
-- $as_echo "## ----------- ##
-+ cat <<\_ASBOX
-+## ----------- ##
- ## confdefs.h. ##
--## ----------- ##"
-+## ----------- ##
-+_ASBOX
- echo
- cat confdefs.h
- echo
-@@ -2573,12 +2585,7 @@ _ACEOF
- ac_site_file1=NONE
- ac_site_file2=NONE
- if test -n "$CONFIG_SITE"; then
-- # We do not want a PATH search for config.site.
-- case $CONFIG_SITE in #((
-- -*) ac_site_file1=./$CONFIG_SITE;;
-- */*) ac_site_file1=$CONFIG_SITE;;
-- *) ac_site_file1=./$CONFIG_SITE;;
-- esac
-+ ac_site_file1=$CONFIG_SITE
- elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
-@@ -2593,11 +2600,7 @@ do
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script
$ac_site_file" >&5
- $as_echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
-- . "$ac_site_file" \
-- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
--$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "failed to load site script $ac_site_file
--See \`config.log' for more details" "$LINENO" 5 ; }
-+ . "$ac_site_file"
- fi
- done
-
-@@ -2673,7 +2676,7 @@ if $ac_cache_corrupted; then
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can
compromise the build" >&5
- $as_echo "$as_me: error: changes in the environment can compromise the build"
>&2;}
-- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
-+ as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
- fi
- ## -------------------- ##
- ## Main body of script. ##
-@@ -2774,7 +2777,7 @@ if test "${enable_universalsdk+set}" = s
- UNIVERSALSDK=$enableval
- if test ! -d "${UNIVERSALSDK}"
- then
-- as_fn_error $? "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
-+ as_fn_error "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
- fi
- ;;
- esac
-@@ -3166,7 +3169,7 @@ $as_echo "$without_gcc" >&6; }
- # If the user switches compilers, we can't believe the cache
- if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" !=
"$ac_cv_prog_CC"
- then
-- as_fn_error $? "cached CC is different -- throw away $cache_file
-+ as_fn_error "cached CC is different -- throw away $cache_file
- (it is also a good idea to do 'make clean' before compiling)"
"$LINENO" 5
- fi
-
-@@ -3476,8 +3479,8 @@ fi
-
- test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}:
error: in \`$ac_pwd':" >&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "no acceptable C compiler found in \$PATH
--See \`config.log' for more details" "$LINENO" 5 ; }
-+as_fn_error "no acceptable C compiler found in \$PATH
-+See \`config.log' for more details." "$LINENO" 5; }
-
- # Provide some information about the compiler.
- $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version"
>&5
-@@ -3591,8 +3594,9 @@ sed 's/^/| /' conftest.$ac_ext >&5
-
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "C compiler cannot create executables
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "C compiler cannot create executables
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
- $as_echo "yes" >&6; }
-@@ -3634,8 +3638,8 @@ done
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "cannot compute suffix of executables: cannot compile and link
--See \`config.log' for more details" "$LINENO" 5 ; }
-+as_fn_error "cannot compute suffix of executables: cannot compile and link
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
- rm -f conftest conftest$ac_cv_exeext
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-@@ -3692,9 +3696,9 @@ $as_echo "$ac_try_echo"; } >&5
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "cannot run C compiled programs.
-+as_fn_error "cannot run C compiled programs.
- If you meant to cross compile, use \`--host'.
--See \`config.log' for more details" "$LINENO" 5 ; }
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
- fi
- fi
-@@ -3745,8 +3749,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
-
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "cannot compute suffix of object files: cannot compile
--See \`config.log' for more details" "$LINENO" 5 ; }
-+as_fn_error "cannot compute suffix of object files: cannot compile
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
- rm -f conftest.$ac_cv_objext conftest.$ac_ext
- fi
-@@ -4199,7 +4203,7 @@ else
- # Broken: fails on valid input.
- continue
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
-@@ -4215,11 +4219,11 @@ else
- ac_preproc_ok=:
- break
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- done
- # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
--rm -f conftest.i conftest.err conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if $ac_preproc_ok; then :
- break
- fi
-@@ -4258,7 +4262,7 @@ else
- # Broken: fails on valid input.
- continue
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
-@@ -4274,18 +4278,18 @@ else
- ac_preproc_ok=:
- break
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
-
- done
- # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
--rm -f conftest.i conftest.err conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if $ac_preproc_ok; then :
-
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
--See \`config.log' for more details" "$LINENO" 5 ; }
-+as_fn_error "C preprocessor \"$CPP\" fails sanity check
-+See \`config.log' for more details." "$LINENO" 5; }
- fi
-
- ac_ext=c
-@@ -4346,7 +4350,7 @@ esac
- done
- IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
-- as_fn_error $? "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-+ as_fn_error "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
- else
- ac_cv_path_GREP=$GREP
-@@ -4412,7 +4416,7 @@ esac
- done
- IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
-- as_fn_error $? "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-+ as_fn_error "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
- else
- ac_cv_path_EGREP=$EGREP
-@@ -4544,7 +4548,8 @@ do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- ac_fn_c_check_header_compile "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default
- "
--if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-+eval as_val=\$$as_ac_Header
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
-@@ -5158,22 +5163,16 @@ bsdos*|hp*|HP*)
- esac
- ac_aux_dir=
- for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-- if test -f "$ac_dir/install-sh"; then
-- ac_aux_dir=$ac_dir
-- ac_install_sh="$ac_aux_dir/install-sh -c"
-- break
-- elif test -f "$ac_dir/install.sh"; then
-- ac_aux_dir=$ac_dir
-- ac_install_sh="$ac_aux_dir/install.sh -c"
-- break
-- elif test -f "$ac_dir/shtool"; then
-- ac_aux_dir=$ac_dir
-- ac_install_sh="$ac_aux_dir/shtool install -c"
-- break
-- fi
-+ for ac_t in install-sh install.sh shtool; do
-+ if test -f "$ac_dir/$ac_t"; then
-+ ac_aux_dir=$ac_dir
-+ ac_install_sh="$ac_aux_dir/$ac_t -c"
-+ break 2
-+ fi
-+ done
- done
- if test -z "$ac_aux_dir"; then
-- as_fn_error $? "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
-+ as_fn_error "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
- fi
-
- # These three variables are undocumented and unsupported,
-@@ -5511,7 +5510,7 @@ $as_echo "$CC" >&6; }
- ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
-
- else
-- as_fn_error $? "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
-+ as_fn_error "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
-
- fi
-
-@@ -6005,7 +6004,8 @@ bluetooth/bluetooth.h linux/tipc.h spawn
- do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- ac_fn_c_check_header_mongrel "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default"
--if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-+eval as_val=\$$as_ac_Header
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
- _ACEOF
-@@ -6019,7 +6019,7 @@ for ac_hdr in dirent.h sys/ndir.h sys/di
- as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines
DIR" >&5
- $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
--if eval "test \"\${$as_ac_Header+set}\"" = set; then :
-+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; };
then :
- $as_echo_n "(cached) " >&6
- else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -6046,7 +6046,8 @@ fi
- eval ac_res=\$$as_ac_Header
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
--if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-+eval as_val=\$$as_ac_Header
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
- _ACEOF
-@@ -6566,8 +6567,9 @@ else
- if test "$ac_cv_type_int" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (int)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (int)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_int=0
- fi
-@@ -6599,8 +6601,9 @@ else
- if test "$ac_cv_type_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (long)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (long)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_long=0
- fi
-@@ -6632,8 +6635,9 @@ else
- if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (void *)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (void *)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_void_p=0
- fi
-@@ -6665,8 +6669,9 @@ else
- if test "$ac_cv_type_short" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (short)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (short)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_short=0
- fi
-@@ -6698,8 +6703,9 @@ else
- if test "$ac_cv_type_float" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (float)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (float)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_float=0
- fi
-@@ -6731,8 +6737,9 @@ else
- if test "$ac_cv_type_double" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (double)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (double)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_double=0
- fi
-@@ -6764,8 +6771,9 @@ else
- if test "$ac_cv_type_fpos_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (fpos_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (fpos_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_fpos_t=0
- fi
-@@ -6797,8 +6805,9 @@ else
- if test "$ac_cv_type_size_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (size_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (size_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_size_t=0
- fi
-@@ -6830,8 +6839,9 @@ else
- if test "$ac_cv_type_pid_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (pid_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (pid_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_pid_t=0
- fi
-@@ -6890,8 +6900,9 @@ else
- if test "$ac_cv_type_long_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (long long)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (long long)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_long_long=0
- fi
-@@ -6951,8 +6962,9 @@ else
- if test "$ac_cv_type_long_double" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (long double)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (long double)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_long_double=0
- fi
-@@ -7013,8 +7025,9 @@ else
- if test "$ac_cv_type__Bool" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (_Bool)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (_Bool)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof__Bool=0
- fi
-@@ -7061,8 +7074,9 @@ else
- if test "$ac_cv_type_uintptr_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (uintptr_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (uintptr_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_uintptr_t=0
- fi
-@@ -7102,8 +7116,9 @@ else
- if test "$ac_cv_type_off_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (off_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (off_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_off_t=0
- fi
-@@ -7164,8 +7179,9 @@ else
- if test "$ac_cv_type_time_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (time_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (time_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_time_t=0
- fi
-@@ -7236,8 +7252,9 @@ else
- if test "$ac_cv_type_pthread_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (pthread_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (pthread_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_pthread_t=0
- fi
-@@ -7324,7 +7341,7 @@ fi
- MACOSX_DEFAULT_ARCH="ppc"
- ;;
- *)
-- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
-+ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
- ;;
- esac
- else
-@@ -7336,7 +7353,7 @@ fi
- MACOSX_DEFAULT_ARCH="ppc64"
- ;;
- *)
-- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
-+ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
- ;;
- esac
-
-@@ -7362,7 +7379,7 @@ $as_echo "#define WITH_NEXT_FRAMEWORK 1"
- $as_echo "yes" >&6; }
- if test $enable_shared = "yes"
- then
-- as_fn_error $? "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
-+ as_fn_error "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-@@ -8158,12 +8175,12 @@ if test "${with_dbmliborder+set}" = set;
- withval=$with_dbmliborder;
- if test x$with_dbmliborder = xyes
- then
--as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
-+as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
- else
- for db in `echo $with_dbmliborder | sed 's/:/ /g'`; do
- if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb
- then
-- as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
-+ as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
- fi
- done
- fi
-@@ -9118,6 +9135,50 @@ $as_echo "no" >&6; }
+@@ -9138,6 +9146,50 @@ $as_echo "no" >&6; }
fi
@@ -1056,16 +92,7 @@ diff -up ./configure.autotool-intermediates ./configure
# Check for Python-specific malloc support
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
$as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -9162,7 +9223,7 @@ if test "x$ac_cv_header_valgrind_valgrin
- $as_echo "#define WITH_VALGRIND 1" >>confdefs.h
-
- else
-- as_fn_error $? "Valgrind support requested but headers not available"
"$LINENO" 5
-+ as_fn_error "Valgrind support requested but headers not available"
"$LINENO" 5
-
- fi
-
-@@ -9170,6 +9231,46 @@ fi
+@@ -9190,6 +9242,46 @@ fi
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -1112,494 +139,20 @@ diff -up ./configure.autotool-intermediates ./configure
# -I${DLINCLDIR} is added to the compile rule for importdl.o
DLINCLDIR=.
-@@ -9256,7 +9357,8 @@ for ac_func in alarm accept4 setitimer g
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
-@@ -10251,7 +10353,8 @@ for ac_func in fseek64 fseeko fstatvfs f
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
-@@ -10260,44 +10363,25 @@ fi
- done
-
-
--ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2"
--if test "x$ac_cv_func_dup2" = x""yes; then :
-- $as_echo "#define HAVE_DUP2 1" >>confdefs.h
--
--else
-- case " $LIBOBJS " in
-- *" dup2.$ac_objext "* ) ;;
-- *) LIBOBJS="$LIBOBJS dup2.$ac_objext"
-- ;;
--esac
--
--fi
--
--ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
--if test "x$ac_cv_func_getcwd" = x""yes; then :
-- $as_echo "#define HAVE_GETCWD 1" >>confdefs.h
--
--else
-- case " $LIBOBJS " in
-- *" getcwd.$ac_objext "* ) ;;
-- *) LIBOBJS="$LIBOBJS getcwd.$ac_objext"
-- ;;
--esac
--
--fi
--
--ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup"
--if test "x$ac_cv_func_strdup" = x""yes; then :
-- $as_echo "#define HAVE_STRDUP 1" >>confdefs.h
-+for ac_func in dup2 getcwd strdup
-+do :
-+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
-+ cat >>confdefs.h <<_ACEOF
-+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-+_ACEOF
+@@ -14304,8 +14396,8 @@ esac
- else
- case " $LIBOBJS " in
-- *" strdup.$ac_objext "* ) ;;
-- *) LIBOBJS="$LIBOBJS strdup.$ac_objext"
-+ *" $ac_func.$ac_objext "* ) ;;
-+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
- ;;
- esac
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ # Files that config.status was made for.
+-config_files="`echo $ac_config_files`"
+-config_headers="`echo $ac_config_headers`"
++config_files="$ac_config_files"
++config_headers="$ac_config_headers"
- fi
-+done
-
-
- for ac_func in getpgrp
-@@ -11510,7 +11594,7 @@ elif test "$withval" != yes
- then LIBM=$withval
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBM=\"$withval\"" >&5
- $as_echo "set LIBM=\"$withval\"" >&6; }
--else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO"
5
-+else as_fn_error "proper usage is --with-libm=STRING" "$LINENO" 5
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBM=\"$LIBM\"" >&5
-@@ -11534,7 +11618,7 @@ elif test "$withval" != yes
- then LIBC=$withval
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBC=\"$withval\"" >&5
- $as_echo "set LIBC=\"$withval\"" >&6; }
--else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO"
5
-+else as_fn_error "proper usage is --with-libc=STRING" "$LINENO" 5
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBC=\"$LIBC\"" >&5
-@@ -11784,7 +11868,8 @@ for ac_func in acosh asinh atanh copysig
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
-@@ -11796,7 +11881,8 @@ for ac_func in hypot lgamma log1p round
- do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-+eval as_val=\$$as_ac_var
-+ if test "x$as_val" = x""yes; then :
- cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
-@@ -12059,7 +12145,7 @@ no)
- 15|30)
- ;;
- *)
-- as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value
should be 15 or 30" "$LINENO" 5 ;;
-+ as_fn_error "bad value $enable_big_digits for --enable-big-digits; value should
be 15 or 30" "$LINENO" 5 ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits"
>&5
- $as_echo "$enable_big_digits" >&6; }
-@@ -12110,8 +12196,9 @@ else
- if test "$ac_cv_type_wchar_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
- $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
--as_fn_error 77 "cannot compute sizeof (wchar_t)
--See \`config.log' for more details" "$LINENO" 5 ; }
-+{ as_fn_set_status 77
-+as_fn_error "cannot compute sizeof (wchar_t)
-+See \`config.log' for more details." "$LINENO" 5; }; }
- else
- ac_cv_sizeof_wchar_t=0
- fi
-@@ -12480,8 +12567,8 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUI
-
- ;; #(
- *)
-- as_fn_error $? "unknown endianness
-- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
-+ as_fn_error "unknown endianness
-+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
-
-@@ -12742,7 +12829,7 @@ else
- have_readline=no
-
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if test $have_readline = yes
- then
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -12916,7 +13003,7 @@ else
- have_readline=no
-
- fi
--rm -f conftest.err conftest.i conftest.$ac_ext
-+rm -f conftest.err conftest.$ac_ext
- if test $have_readline = yes
- then
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -13732,7 +13819,7 @@ esac
-
- case $ac_sys_system in
-- OSF*) as_fn_error $? "OSF* systems are deprecated unless somebody volunteers.
Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
-+ OSF*) as_fn_error "OSF* systems are deprecated unless somebody volunteers. Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
- esac
-
- ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
-@@ -13850,7 +13937,6 @@ DEFS=-DHAVE_CONFIG_H
-
- ac_libobjs=
- ac_ltlibobjs=
--U=
- for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
- # 1. Remove the extension, and $U if already installed.
- ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-@@ -14013,19 +14099,19 @@ export LANGUAGE
- (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
--# as_fn_error STATUS ERROR [LINENO LOG_FD]
--# ----------------------------------------
-+# as_fn_error ERROR [LINENO LOG_FD]
-+# ---------------------------------
- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
- # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
--# script with STATUS, using 1 if that was 0.
-+# script with status $?, using 1 if that was 0.
- as_fn_error ()
- {
-- as_status=$1; test $as_status -eq 0 && as_status=1
-- if test "$4"; then
-- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-+ as_status=$?; test $as_status -eq 0 && as_status=1
-+ if test "$3"; then
-+ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
-+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
- fi
-- $as_echo "$as_me: error: $2" >&2
-+ $as_echo "$as_me: error: $1" >&2
- as_fn_exit $as_status
- } # as_fn_error
-
-@@ -14221,7 +14307,7 @@ $as_echo X"$as_dir" |
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
-- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
-+ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
-
-
- } # as_fn_mkdir_p
-@@ -14275,7 +14361,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
- # values after options handling.
- ac_log="
- This file was extended by python $as_me 3.2, which was
--generated by GNU Autoconf 2.67. Invocation command line was
-+generated by GNU Autoconf 2.65. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
-@@ -14337,10 +14423,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
- ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
- ac_cs_version="\\
- python config.status 3.2
--configured by $0, generated by GNU Autoconf 2.67,
-+configured by $0, generated by GNU Autoconf 2.65,
- with options \\"\$ac_cs_config\\"
-
--Copyright (C) 2010 Free Software Foundation, Inc.
-+Copyright (C) 2009 Free Software Foundation, Inc.
- This config.status script is free software; the Free Software Foundation
- gives unlimited permission to copy, distribute and modify it."
-
-@@ -14356,16 +14442,11 @@ ac_need_defaults=:
- while test $# != 0
- do
- case $1 in
-- --*=?*)
-+ --*=*)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
- ac_shift=:
- ;;
-- --*=)
-- ac_option=`expr "X$1" : 'X\([^=]*\)='`
-- ac_optarg=
-- ac_shift=:
-- ;;
- *)
- ac_option=$1
- ac_optarg=$2
-@@ -14387,7 +14468,6 @@ do
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed
"s/'/'\\\\\\\\''/g"` ;;
-- '') as_fn_error $? "missing file argument" ;;
- esac
- as_fn_append CONFIG_FILES " '$ac_optarg'"
- ac_need_defaults=false;;
-@@ -14400,7 +14480,7 @@ do
- ac_need_defaults=false;;
- --he | --h)
- # Conflict between --help and --header
-- as_fn_error $? "ambiguous option: \`$1'
-+ as_fn_error "ambiguous option: \`$1'
- Try \`$0 --help' for more information.";;
- --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
-@@ -14409,7 +14489,7 @@ Try \`$0 --help' for more information.";
- ac_cs_silent=: ;;
-
- # This is an error.
-- -*) as_fn_error $? "unrecognized option: \`$1'
-+ -*) as_fn_error "unrecognized option: \`$1'
- Try \`$0 --help' for more information." ;;
-
- *) as_fn_append ac_config_targets " $1"
-@@ -14468,7 +14548,7 @@ do
- "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc"
;;
- "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES
Modules/ld_so_aix" ;;
-
-- *) as_fn_error $? "invalid argument: \`$ac_config_target'"
"$LINENO" 5 ;;
-+ *) as_fn_error "invalid argument: \`$ac_config_target'"
"$LINENO" 5;;
- esac
- done
-
-@@ -14505,7 +14585,7 @@ $debug ||
- {
- tmp=./conf$$-$RANDOM
- (umask 077 && mkdir "$tmp")
--} || as_fn_error $? "cannot create a temporary directory in ."
"$LINENO" 5
-+} || as_fn_error "cannot create a temporary directory in ."
"$LINENO" 5
-
- # Set up the scripts for CONFIG_FILES section.
- # No need to generate them if there are no CONFIG_FILES.
-@@ -14522,7 +14602,7 @@ if test "x$ac_cr" = x; then
- fi
- ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null
2>/dev/null`
- if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-- ac_cs_awk_cr='\\r'
-+ ac_cs_awk_cr='\r'
- else
- ac_cs_awk_cr=$ac_cr
- fi
-@@ -14536,18 +14616,18 @@ _ACEOF
- echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/'
&&
- echo "_ACEOF"
- } >conf$$subs.sh ||
-- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
--ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-+ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
- ac_delim='%!_!# '
- for ac_last_try in false false false false false :; do
- . ./conf$$subs.sh ||
-- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-+ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-
- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
- if test $ac_delim_n = $ac_delim_num; then
- break
- elif $ac_last_try; then
-- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-+ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-@@ -14636,28 +14716,20 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n
- else
- cat
- fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-- || as_fn_error $? "could not setup config files machinery"
"$LINENO" 5
-+ || as_fn_error "could not setup config files machinery" "$LINENO"
5
- _ACEOF
-
--# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
--# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading
and
-+# VPATH may cause trouble with some makes, so we remove $(srcdir),
-+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
- # trailing colons and then remove the whole line if VPATH becomes empty
- # (actually we leave an empty line to preserve line numbers).
- if test "x$srcdir" = x.; then
-- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
--h
--s///
--s/^/:/
--s/[ ]*$/:/
--s/:\$(srcdir):/:/g
--s/:\${srcdir}:/:/g
--s/:@srcdir@:/:/g
--s/^:*//
-+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
-+s/:*\$(srcdir):*/:/
-+s/:*\${srcdir}:*/:/
-+s/:*@srcdir@:*/:/
-+s/^\([^=]*=[ ]*\):*/\1/
- s/:*$//
--x
--s/\(=[ ]*\).*/\1/
--G
--s/\n//
- s/^[^=]*=[ ]*$//
- }'
- fi
-@@ -14685,7 +14757,7 @@ for ac_last_try in false false :; do
- if test -z "$ac_t"; then
- break
- elif $ac_last_try; then
-- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
-+ as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-@@ -14770,7 +14842,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
- _ACAWK
- _ACEOF
- cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-- as_fn_error $? "could not setup config headers machinery"
"$LINENO" 5
-+ as_fn_error "could not setup config headers machinery" "$LINENO"
5
- fi # test -n "$CONFIG_HEADERS"
-
-
-@@ -14783,7 +14855,7 @@ do
- esac
- case $ac_mode$ac_tag in
- :[FHL]*:*);;
-- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO"
5 ;;
-+ :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO"
5;;
- :[FH]-) ac_tag=-:-;;
- :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
- esac
-@@ -14811,7 +14883,7 @@ do
- [\\/$]*) false;;
- *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
- esac ||
-- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5
;;
-+ as_fn_error "cannot find input file: \`$ac_f'" "$LINENO"
5;;
- esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed
"s/'/'\\\\\\\\''/g"`;; esac
- as_fn_append ac_file_inputs " '$ac_f'"
-@@ -14838,7 +14910,7 @@ $as_echo "$as_me: creating $ac_file" >&6
-
- case $ac_tag in
- *:-:* | *:-) cat >"$tmp/stdin" \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
- esac
- ;;
- esac
-@@ -14969,22 +15041,22 @@ s&@INSTALL@&$ac_INSTALL&;t t
- $ac_datarootdir_hack
- "
- eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f
"$tmp/subs.awk" >$tmp/out \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
-
- test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n
"$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z
"$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference
to the variable \`datarootdir'
--which seems to be undefined. Please make sure it is defined" >&5
-+which seems to be undefined. Please make sure it is defined." >&5
- $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable
\`datarootdir'
--which seems to be undefined. Please make sure it is defined" >&2;}
-+which seems to be undefined. Please make sure it is defined." >&2;}
-
- rm -f "$tmp/stdin"
- case $ac_file in
- -) cat "$tmp/out" && rm -f "$tmp/out";;
- *) rm -f "$ac_file" && mv "$tmp/out"
"$ac_file";;
- esac \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
- ;;
- :H)
- #
-@@ -14995,19 +15067,19 @@ which seems to be undefined. Please mak
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs"
- } >"$tmp/config.h" \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
- if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1;
then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged"
>&5
- $as_echo "$as_me: $ac_file is unchanged" >&6;}
- else
- rm -f "$ac_file"
- mv "$tmp/config.h" "$ac_file" \
-- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-+ || as_fn_error "could not create $ac_file" "$LINENO" 5
- fi
- else
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs" \
-- || as_fn_error $? "could not create -" "$LINENO" 5
-+ || as_fn_error "could not create -" "$LINENO" 5
- fi
- ;;
-
-@@ -15027,7 +15099,7 @@ _ACEOF
- ac_clean_files=$ac_clean_files_save
-
- test $ac_write_fail = 0 ||
-- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO"
5
-+ as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
- # configure is writing to config.log, and then calls config.status.
-@@ -15048,7 +15120,7 @@ if test "$no_create" != yes; then
- exec 5>>config.log
- # Use ||, not &&, to avoid exiting from the if with $? = 1, which
- # would make configure fail if this is the last instruction.
-- $ac_cs_success || as_fn_exit 1
-+ $ac_cs_success || as_fn_exit $?
- fi
- if test -n "$ac_unrecognized_opts" && test
"$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options:
$ac_unrecognized_opts" >&5
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2010-12-28 18:47:15.203935226 -0500
-+++ ./pyconfig.h.in 2010-12-28 18:47:21.330060783 -0500
+--- ./pyconfig.h.in.autotool-intermediates 2011-01-17 13:09:50.827696887 -0500
++++ ./pyconfig.h.in 2011-01-17 13:09:56.963611199 -0500
@@ -12,15 +12,15 @@
support for AIX C++ shared extension modules. */
#undef AIX_GENUINE_CPLUSPLUS
@@ -1619,13 +172,3 @@ diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
/* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
mixed-endian order (byte order 45670123) */
#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
-@@ -503,6 +503,9 @@
- /* Define to 1 if you have the `pause' function. */
- #undef HAVE_PAUSE
-
-+/* Define if the OS supports pipe2() */
-+#undef HAVE_PIPE2
-+
- /* Define to 1 if you have the `plock' function. */
- #undef HAVE_PLOCK
-
diff --git a/python-3.2b2-no-static-lib.patch b/python-3.2b2-no-static-lib.patch
deleted file mode 100644
index 3ef3bc2..0000000
--- a/python-3.2b2-no-static-lib.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-diff -up Python-3.2b2/Makefile.pre.in.no-static-lib Python-3.2b2/Makefile.pre.in
---- Python-3.2b2/Makefile.pre.in.no-static-lib 2010-12-13 13:04:23.000000000 -0500
-+++ Python-3.2b2/Makefile.pre.in 2010-12-28 16:57:11.484065804 -0500
-@@ -420,7 +420,7 @@ coverage:
-
-
- # Build the interpreter
--$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
-+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
-
- platform: $(BUILDPYTHON)
-@@ -434,18 +434,6 @@ sharedmods: $(BUILDPYTHON)
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
- esac
-
--# Build static library
--# avoid long command lines, same as LIBRARY_OBJS
--$(LIBRARY): $(LIBRARY_OBJS)
-- -rm -f $@
-- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
-- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
-- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
-- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODOBJS)
-- $(RANLIB) $@
--
- libpython$(LDVERSION).so: $(LIBRARY_OBJS)
- if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
-@@ -1035,18 +1023,6 @@ libainstall: all python-config
- else true; \
- fi; \
- done
-- @if test -d $(LIBRARY); then :; else \
-- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-- if test "$(SO)" = .dll; then \
-- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
-- else \
-- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- fi; \
-- else \
-- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
-- fi; \
-- fi
- $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
- $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
- $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python-3.2rc1-no-static-lib.patch b/python-3.2rc1-no-static-lib.patch
new file mode 100644
index 0000000..5b32bc7
--- /dev/null
+++ b/python-3.2rc1-no-static-lib.patch
@@ -0,0 +1,50 @@
+diff -up Python-3.2rc1/Makefile.pre.in.no-static-lib Python-3.2rc1/Makefile.pre.in
+--- Python-3.2rc1/Makefile.pre.in.no-static-lib 2010-12-30 17:12:40.000000000 -0500
++++ Python-3.2rc1/Makefile.pre.in 2011-01-17 12:58:32.123947161 -0500
+@@ -421,7 +421,7 @@ coverage:
+
+
+ # Build the interpreter
+-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++$(BUILDPYTHON): Modules/python.o $(LDLIBRARY) $(PY3LIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+ platform: $(BUILDPYTHON)
+@@ -435,18 +435,6 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ esac
+
+-# Build static library
+-# avoid long command lines, same as LIBRARY_OBJS
+-$(LIBRARY): $(LIBRARY_OBJS)
+- -rm -f $@
+- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
+- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
+- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
+- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODOBJS)
+- $(RANLIB) $@
+-
+ libpython$(LDVERSION).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
+@@ -1048,18 +1036,6 @@ libainstall: all python-config
+ else true; \
+ fi; \
+ done
+- @if test -d $(LIBRARY); then :; else \
+- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+- if test "$(SO)" = .dll; then \
+- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
+- else \
+- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- fi; \
+- else \
+- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
+- fi; \
+- fi
+ $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
+ $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python3.spec b/python3.spec
index 56208eb..f4f23db 100644
--- a/python3.spec
+++ b/python3.spec
@@ -3,7 +3,7 @@
# pybasever without the dot:
%global pyshortver 32
-%global alphatag b2
+%global alphatag rc1
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
@@ -113,7 +113,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.8.%{alphatag}%{?dist}
+Release: 0.9.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -178,7 +178,7 @@ Patch3: python-3.2b2-remove-mimeaudio-tests.patch
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
# a libpythonMAJOR.MINOR.a (bug 550692):
-Patch6: python-3.2b2-no-static-lib.patch
+Patch6: python-3.2rc1-no-static-lib.patch
# Systemtap support: add statically-defined probe points
# Patch based on upstream bug:
http://bugs.python.org/issue4111
@@ -231,10 +231,6 @@ Patch128: python-3.2b2-test_sys-COUNT_ALLOCS.patch
# Not yet sent upstream
Patch129: python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
-# Use the correct preprocessor definition to detect ppc:
-# See
http://bugs.python.org/issue10655 and rhbz#661510
-Patch130: python-3.2b2-fix-ppc-debug-build.patch
-
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
@@ -402,7 +398,6 @@ rm -r Modules/zlib || exit 1
%patch127 -p1
%patch128 -p1
%patch129 -p1
-%patch130 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -597,7 +592,7 @@ install -m755 -d %{buildroot}%{pylibdir}/Doc
cp -ar Doc/tools %{buildroot}%{pylibdir}/Doc/
# Demo scripts
-cp -ar Demo %{buildroot}%{pylibdir}/
+cp -ar Tools/demo %{buildroot}%{pylibdir}/Tools/
# Fix for bug #136654
rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdir}/test/audiotest.au
@@ -681,12 +676,8 @@ find %{buildroot} \
# Remove executable flag from files that shouldn't have it:
chmod a-x \
- %{buildroot}%{pylibdir}/Demo/comparisons/patterns \
%{buildroot}%{pylibdir}/distutils/tests/Setup.sample \
- %{buildroot}%{pylibdir}/Demo/rpc/test \
- %{buildroot}%{pylibdir}/Tools/README \
- %{buildroot}%{pylibdir}/Demo/scripts/newslist.doc \
- %{buildroot}%{pylibdir}/Demo/md5test/foo
+ %{buildroot}%{pylibdir}/Tools/README
# Get rid of DOS batch files:
find %{buildroot} -name \*.bat -exec rm {} \;
@@ -1000,6 +991,7 @@ rm -fr %{buildroot}
%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%{_libdir}/%{py_INSTSONAME_optimized}
+%{_libdir}/libpython3.so
%if 0%{?with_systemtap}
%{tapsetdir}/%{libpython_stp_optimized}
%doc systemtap-example.stp pyfuntop.stp
@@ -1025,11 +1017,9 @@ rm -fr %{buildroot}
%files tools
%defattr(-,root,root,755)
%{_bindir}/python3-2to3
+%{_bindir}/2to3-%{pybasever}
%{_bindir}/idle*
%{pylibdir}/Tools
-%doc %{pylibdir}/Demo
-%exclude %{pylibdir}/Demo/distutils
-%exclude %{pylibdir}/Demo/md5test
%doc %{pylibdir}/Doc
%files tkinter
@@ -1057,8 +1047,6 @@ rm -fr %{buildroot}
%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
%{pylibdir}/lib2to3/tests
-%doc %{pylibdir}/Demo/distutils
-%doc %{pylibdir}/Demo/md5test
%{pylibdir}/tkinter/test
%{pylibdir}/unittest/test
@@ -1179,6 +1167,14 @@ rm -fr %{buildroot}
%changelog
+* Mon Jan 17 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.9.rc1
+- 3.2rc1
+- rework patch 6 (static lib removal)
+- remove upstreamed patch 130 (ppc debug build)
+- regenerate patch 300 (autotool intermediates)
+- updated packaging to reflect upstream rewrite of "Demo" (issue 7962)
+- added libpython3.so and 2to3-3.2
+
* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
error with dynamic annotations (when configured using --with-valgrind)
diff --git a/sources b/sources
index 812bc20..470bbec 100644
--- a/sources
+++ b/sources
@@ -1,2 +1 @@
-b371e1f7a0e98e7a0d1792823fd0f58c Python-3.2a1.tar.bz2
-45ab5ff5edfb73ec277b1c763f3d5a42 Python-3.2b2.tar.bz2
+057cb4b2ba64e166cb0a3342bec9125e Python-3.2rc1.tar.bz2
commit 5659c63442be2e91eb42e60284d7a9a9ab0b80dd
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Jan 5 18:34:21 2011 -0500
* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
error with dynamic annotations (when configured using --with-valgrind)
- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
diff --git a/python-3.2b2-fix-ppc-debug-build.patch
b/python-3.2b2-fix-ppc-debug-build.patch
new file mode 100644
index 0000000..e9c7176
--- /dev/null
+++ b/python-3.2b2-fix-ppc-debug-build.patch
@@ -0,0 +1,19 @@
+diff -up Python-3.2b2/Python/ceval.c.fix-ppc-debug-build Python-3.2b2/Python/ceval.c
+--- Python-3.2b2/Python/ceval.c.fix-ppc-debug-build 2011-01-05 16:37:27.007598805 -0500
++++ Python-3.2b2/Python/ceval.c 2011-01-05 16:45:06.562652472 -0500
+@@ -30,10 +30,11 @@
+
+ typedef unsigned long long uint64;
+
+-#if defined(__ppc__) /* <- Don't know if this is the correct symbol; this
+- section should work for GCC on any PowerPC
+- platform, irrespective of OS.
+- POWER? Who knows :-) */
++/* PowerPC suppport.
++ "__ppc__" appears to be the preprocessor definition to detect on OS X,
whereas
++ "__powerpc__" appears to be the correct one for Linux with GCC
++*/
++#if defined(__ppc__) || defined (__powerpc__)
+
+ #define READ_TIMESTAMP(var) ppc_getcounter(&var)
+
diff --git a/python3.spec b/python3.spec
index 36bbe0d..56208eb 100644
--- a/python3.spec
+++ b/python3.spec
@@ -113,7 +113,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.7.%{alphatag}%{?dist}
+Release: 0.8.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -231,6 +231,10 @@ Patch128: python-3.2b2-test_sys-COUNT_ALLOCS.patch
# Not yet sent upstream
Patch129: python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
+# Use the correct preprocessor definition to detect ppc:
+# See
http://bugs.python.org/issue10655 and rhbz#661510
+Patch130: python-3.2b2-fix-ppc-debug-build.patch
+
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
@@ -398,6 +402,7 @@ rm -r Modules/zlib || exit 1
%patch127 -p1
%patch128 -p1
%patch129 -p1
+%patch130 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -484,8 +489,16 @@ BuildPython() {
--with-computed-gotos=%{with_computed_gotos} \
%{nil}
-
-make OPT="$CFLAGS" %{?_smp_mflags}
+ # Set EXTRA_CFLAGS to our CFLAGS (rather than overriding OPT, as we've done
+ # in the past).
+ # This should fix a problem with --with-valgrind where it adds
+ # -DDYNAMIC_ANNOTATIONS_ENABLED=1
+ # to OPT which must be passed to all compilation units in the build,
+ # otherwise leading to linker errors, e.g.
+ # missing symbol AnnotateRWLockDestroy
+ #
+ # Invoke the build:
+ make EXTRA_CFLAGS="$CFLAGS" %{?_smp_mflags}
popd
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfDir
@@ -1166,6 +1179,11 @@ rm -fr %{buildroot}
%changelog
+* Wed Jan 5 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.8.b2
+- set EXTRA_CFLAGS to our CFLAGS, rather than overriding OPT, fixing a linker
+error with dynamic annotations (when configured using --with-valgrind)
+- fix the ppc build of the debug configuration (patch 130; rhbz#661510)
+
* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
- add --with-valgrind to configuration (on architectures that support this)
commit 31a06df0c4d29b6f97f7793ff9caf470f78be932
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Tue Jan 4 10:53:01 2011 -0500
add --with-valgrind to configuration (on architectures that support this)
diff --git a/python3.spec b/python3.spec
index a67339c..36bbe0d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -50,6 +50,13 @@
%global with_systemtap 1
+# some arches don't have valgrind so we need to disable its support on them
+%ifarch %{ix86} x86_64 ppc ppc64 s390x
+%global with_valgrind 1
+%else
+%global with_valgrind 0
+%endif
+
# Change from yes to no to turn this off
%global with_computed_gotos yes
@@ -106,7 +113,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.6.%{alphatag}%{?dist}
+Release: 0.7.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -238,6 +245,9 @@ BuildRequires: tix-devel bzip2-devel sqlite-devel
BuildRequires: autoconf
BuildRequires: db4-devel >= 4.7
BuildRequires: libffi-devel
+%if 0%{?with_valgrind}
+BuildRequires: valgrind-devel
+%endif
%if 0%{?with_systemtap}
BuildRequires: systemtap-sdt-devel
@@ -466,6 +476,9 @@ BuildPython() {
--with-tapset-install-dir=%{tapsetdir} \
%endif
--with-system-ffi \
+%if 0%{?with_valgrind}
+ --with-valgrind \
+%endif
--with-system-expat \
$ExtraConfigArgs \
--with-computed-gotos=%{with_computed_gotos} \
@@ -1153,6 +1166,9 @@ rm -fr %{buildroot}
%changelog
+* Tue Jan 4 2011 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.7.b2
+- add --with-valgrind to configuration (on architectures that support this)
+
* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
- work around test_subprocess failure seen in koji (patch 129)
commit c23ee7db9fcc251cef82e57d4213b1e8d5ba833f
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Dec 29 16:33:14 2010 -0500
work around test_subprocess failure seen in koji (patch 129)
diff --git a/python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
b/python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
new file mode 100644
index 0000000..f73d57a
--- /dev/null
+++ b/python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
@@ -0,0 +1,12 @@
+diff -up Python-3.2b2/Lib/test/test_subprocess.py.non-readable-path
Python-3.2b2/Lib/test/test_subprocess.py
+--- Python-3.2b2/Lib/test/test_subprocess.py.non-readable-path 2010-12-29
16:25:38.498184175 -0500
++++ Python-3.2b2/Lib/test/test_subprocess.py 2010-12-29 16:25:51.094184539 -0500
+@@ -578,7 +578,7 @@ class ProcessTestCase(BaseTestCase):
+ for i in range(1024):
+ # Windows raises IOError. Others raise OSError.
+ with self.assertRaises(EnvironmentError) as c:
+- subprocess.Popen(['nonexisting_i_hope'],
++ subprocess.Popen(['/usr/bin/nonexisting_i_hope'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ if c.exception.errno != errno.ENOENT: # ignore "no such file"
diff --git a/python3.spec b/python3.spec
index 985bdb2..a67339c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -106,7 +106,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.5.%{alphatag}%{?dist}
+Release: 0.6.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -213,6 +213,17 @@ Patch127: python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
# Not yet sent upstream
Patch128: python-3.2b2-test_sys-COUNT_ALLOCS.patch
+# In my koji builds, /root/bin is in the PATH for some reason
+# This leads to test_subprocess.py failing, due to "test_leaking_fds_on_error"
+# trying every dir in PATH for "nonexisting_i_hope", which leads to it raising
+# OSError: [Errno 13] Permission denied
+# when it tries to read /root/bin, rather than raising "No such file"
+#
+# Work around this by specifying an absolute path for the non-existant
+# executable
+# Not yet sent upstream
+Patch129: python-3.2b2-fix-test-subprocess-with-nonreadable-path-dir.patch
+
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
@@ -376,6 +387,7 @@ rm -r Modules/zlib || exit 1
%patch126 -p1
%patch127 -p1
%patch128 -p1
+%patch129 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -1141,6 +1153,9 @@ rm -fr %{buildroot}
%changelog
+* Wed Dec 29 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.6.b2
+- work around test_subprocess failure seen in koji (patch 129)
+
* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
- 3.2b2
- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
commit 5080ffc5d367eee28d2c2268675e98bde0dfcf1b
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Dec 29 13:26:29 2010 -0500
* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
- 3.2b2
- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
patch 8 (systemtap), patch 102 (lib64)
- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
fixed upstream)
- regenerate patch 300 (autotool intermediates)
- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
patch 128)
- stop using runtest.sh in %%check (dropped by upstream), replacing with
regrtest; fixup list of failing tests
- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
- rework manifests of shared libraries to use "SOABI_" macros, reflecting
PEP 3149
- drop itertools, operator and _collections modules from the manifests as py3k
commit r84058 moved these inside libpython; json/tests moved to test/json_tests
- move turtle code into the tkinter subpackage
diff --git a/.gitignore b/.gitignore
index 43efa0f..474e8a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
Python-3.1.2.tar.bz2
Python-3.2a1.tar.bz2
+/Python-3.2b2.tar.bz2
diff --git a/autotool-intermediates.patch b/autotool-intermediates.patch
index efbf3bf..8af26e3 100644
--- a/autotool-intermediates.patch
+++ b/autotool-intermediates.patch
@@ -1,14 +1,71 @@
diff -up ./configure.autotool-intermediates ./configure
---- ./configure.autotool-intermediates 2010-08-02 17:58:12.238002650 -0400
-+++ ./configure 2010-08-02 17:58:20.151000507 -0400
-@@ -1,5 +1,5 @@
+--- ./configure.autotool-intermediates 2010-12-28 18:47:15.206934478 -0500
++++ ./configure 2010-12-28 18:47:21.053058461 -0500
+@@ -1,14 +1,14 @@
#! /bin/sh
--# From configure.in Revision: 82090 .
-+# From configure.in Revision: 82962 .
+ # From configure.in Revision: 87207 .
# Guess values for system-dependent variables and create Makefiles.
- # Generated by GNU Autoconf 2.65 for python 3.2.
+-# Generated by GNU Autoconf 2.67 for python 3.2.
++# Generated by GNU Autoconf 2.65 for python 3.2.
#
-@@ -610,6 +610,8 @@ TRUE
+ # Report bugs to <
http://bugs.python.org/>.
+ #
+ #
+ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+-# Foundation, Inc.
++# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
++# Inc.
+ #
+ #
+ # This configure script is free software; the Free Software Foundation
+@@ -320,7 +320,7 @@ $as_echo X"$as_dir" |
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
++ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
+
+
+ } # as_fn_mkdir_p
+@@ -360,19 +360,19 @@ else
+ fi # as_fn_arith
+
+
+-# as_fn_error STATUS ERROR [LINENO LOG_FD]
+-# ----------------------------------------
++# as_fn_error ERROR [LINENO LOG_FD]
++# ---------------------------------
+ # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+ # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+-# script with STATUS, using 1 if that was 0.
++# script with status $?, using 1 if that was 0.
+ as_fn_error ()
+ {
+- as_status=$1; test $as_status -eq 0 && as_status=1
+- if test "$4"; then
+- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
++ as_status=$?; test $as_status -eq 0 && as_status=1
++ if test "$3"; then
++ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+ fi
+- $as_echo "$as_me: error: $2" >&2
++ $as_echo "$as_me: error: $1" >&2
+ as_fn_exit $as_status
+ } # as_fn_error
+
+@@ -534,7 +534,7 @@ test -n "$DJDIR" || exec 7<&0 </dev/null
+ exec 6>&1
+
+ # Name of the host.
+-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
++# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+ # so uname gets run too.
+ ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+@@ -611,6 +611,8 @@ TRUE
MACHDEP_OBJS
DYNLOADFILE
DLINCLDIR
@@ -17,16 +74,7 @@ diff -up ./configure.autotool-intermediates ./configure
THREADOBJ
LDLAST
USE_THREAD_MODULE
-@@ -630,6 +632,8 @@ OTHER_LIBTOOL_OPT
- UNIVERSAL_ARCH_FLAGS
- BASECFLAGS
- OPT
-+DEBUG_SUFFIX
-+DEBUG_EXT
- LN
- INSTALL_DATA
- INSTALL_SCRIPT
-@@ -743,8 +747,11 @@ with_thread
+@@ -748,8 +750,11 @@ with_thread
enable_ipv6
with_doc_strings
with_tsc
@@ -35,10 +83,149 @@ diff -up ./configure.autotool-intermediates ./configure
with_pymalloc
with_valgrind
+with_dtrace
- with_wctype_functions
with_fpectl
with_libm
-@@ -1414,8 +1421,11 @@ Optional Packages:
+ with_libc
+@@ -828,9 +833,8 @@ do
+ fi
+
+ case $ac_option in
+- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+- *=) ac_optarg= ;;
+- *) ac_optarg=yes ;;
++ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
++ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+@@ -875,7 +879,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid feature name: $ac_useropt"
++ as_fn_error "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -901,7 +905,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid feature name: $ac_useropt"
++ as_fn_error "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -1105,7 +1109,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid package name: $ac_useropt"
++ as_fn_error "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -1121,7 +1125,7 @@ do
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null
&&
+- as_fn_error $? "invalid package name: $ac_useropt"
++ as_fn_error "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+@@ -1151,8 +1155,8 @@ do
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+- -*) as_fn_error $? "unrecognized option: \`$ac_option'
+-Try \`$0 --help' for more information"
++ -*) as_fn_error "unrecognized option: \`$ac_option'
++Try \`$0 --help' for more information."
+ ;;
+
+ *=*)
+@@ -1160,7 +1164,7 @@ Try \`$0 --help' for more information"
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
++ as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+@@ -1178,13 +1182,13 @@ done
+
+ if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+- as_fn_error $? "missing argument to $ac_option"
++ as_fn_error "missing argument to $ac_option"
+ fi
+
+ if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
++ fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options:
$ac_unrecognized_opts" >&2 ;;
+ esac
+ fi
+@@ -1207,7 +1211,7 @@ do
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
++ as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+ done
+
+ # There might be people who depend on the old broken behavior: `$host'
+@@ -1221,8 +1225,8 @@ target=$target_alias
+ if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use
--host.
+- If a cross compiler is detected then cross compile mode will be used"
>&2
++ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use
--host.
++ If a cross compiler is detected then cross compile mode will be used."
>&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+@@ -1237,9 +1241,9 @@ test "$silent" = yes && exec 6>/dev/null
+ ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ ac_ls_di=`ls -di .` &&
+ ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+- as_fn_error $? "working directory cannot be determined"
++ as_fn_error "working directory cannot be determined"
+ test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+- as_fn_error $? "pwd does not report name of working directory"
++ as_fn_error "pwd does not report name of working directory"
+
+
+ # Find the source files, if location was not specified.
+@@ -1278,11 +1282,11 @@ else
+ fi
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or
.."
+- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
++ as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+ fi
+ ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ ac_abs_confdir=`(
+- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
$? "$ac_msg"
++ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error
"$ac_msg"
+ pwd)`
+ # When building in place, set srcdir=.
+ if test "$ac_abs_confdir" = "$ac_pwd"; then
+@@ -1322,7 +1326,7 @@ Configuration:
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+- -q, --quiet, --silent do not print \`checking ...' messages
++ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+@@ -1421,8 +1425,11 @@ Optional Packages:
deprecated; use --with(out)-threads
--with(out)-doc-strings disable/enable documentation strings
--with(out)-tsc enable/disable timestamp counter profile
@@ -47,10 +234,120 @@ diff -up ./configure.autotool-intermediates ./configure
--with(out)-pymalloc disable/enable specialized mallocs
--with-valgrind Enable Valgrind support
+ --with(out)-dtrace disable/enable dtrace support
- --with-wctype-functions use wctype.h functions
--with-fpectl enable SIGFPE catching
--with-libm=STRING math library
-@@ -1929,11 +1939,11 @@ else
+ --with-libc=STRING C library
+@@ -1508,9 +1515,9 @@ test -n "$ac_init_help" && exit $ac_stat
+ if $ac_init_version; then
+ cat <<\_ACEOF
+ python configure 3.2
+-generated by GNU Autoconf 2.67
++generated by GNU Autoconf 2.65
+
+-Copyright (C) 2010 Free Software Foundation, Inc.
++Copyright (C) 2009 Free Software Foundation, Inc.
+ This configure script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it.
+ _ACEOF
+@@ -1580,7 +1587,7 @@ $as_echo "$ac_try_echo"; } >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+- test $ac_status = 0; } > conftest.i && {
++ test $ac_status = 0; } >/dev/null && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+@@ -1604,10 +1611,10 @@ fi
+ ac_fn_c_check_header_mongrel ()
+ {
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- if eval "test \"\${$3+set}\"" = set; then :
++ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ fi
+ eval ac_res=\$$3
+@@ -1643,7 +1650,7 @@ if ac_fn_c_try_cpp "$LINENO"; then :
+ else
+ ac_header_preproc=no
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc"
>&5
+ $as_echo "$ac_header_preproc" >&6; }
+
+@@ -1666,15 +1673,17 @@ $as_echo "$as_me: WARNING: $2: see the A
+ $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be
Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the
compiler's result" >&5
+ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result"
>&2;}
+-( $as_echo "## -------------------------------------- ##
++( cat <<\_ASBOX
++## -------------------------------------- ##
+ ## Report this to
http://bugs.python.org/ ##
+-## -------------------------------------- ##"
++## -------------------------------------- ##
++_ASBOX
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=\$ac_header_compiler"
+@@ -1738,7 +1747,7 @@ ac_fn_c_check_header_compile ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -1815,7 +1824,7 @@ ac_fn_c_check_type ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=no"
+@@ -1869,7 +1878,7 @@ ac_fn_c_find_uintX_t ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+ $as_echo_n "checking for uint$2_t... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=no"
+@@ -1899,7 +1908,8 @@ if ac_fn_c_try_compile "$LINENO"; then :
+ esac
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+- if eval test \"x\$"$3"\" = x"no"; then :
++ eval as_val=\$$3
++ if test "x$as_val" = x""no; then :
+
+ else
+ break
+@@ -1922,7 +1932,7 @@ ac_fn_c_find_intX_t ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
+ $as_echo_n "checking for int$2_t... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ eval "$3=no"
+@@ -1933,11 +1943,11 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
@@ -64,7 +361,7 @@ diff -up ./configure.autotool-intermediates ./configure
test_array [0] = 0
;
-@@ -1944,11 +1954,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
+@@ -1948,11 +1958,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
@@ -78,50 +375,637 @@ diff -up ./configure.autotool-intermediates ./configure
< ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
test_array [0] = 0
-@@ -4672,7 +4682,7 @@ esac
- $as_echo_n "checking LIBRARY... " >&6; }
- if test -z "$LIBRARY"
+@@ -1973,7 +1983,8 @@ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+- if eval test \"x\$"$3"\" = x"no"; then :
++ eval as_val=\$$3
++ if test "x$as_val" = x""no; then :
+
+ else
+ break
+@@ -2173,7 +2184,7 @@ ac_fn_c_check_func ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+ $as_echo_n "checking for $2... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -2241,7 +2252,7 @@ ac_fn_c_check_member ()
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+ $as_echo_n "checking for $2.$3... " >&6; }
+-if eval "test \"\${$4+set}\"" = set; then :
++if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -2289,18 +2300,15 @@ $as_echo "$ac_res" >&6; }
+
+ } # ac_fn_c_check_member
+
+-# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+-# ---------------------------------------------
+-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+-# accordingly.
++# ac_fn_c_check_decl LINENO SYMBOL VAR
++# ------------------------------------
++# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
+ ac_fn_c_check_decl ()
+ {
+ as_lineno=${as_lineno-"$1"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- as_decl_name=`echo $2|sed 's/ *(.*//'`
+- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/)
0& (/g'`
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is
declared" >&5
+-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+-if eval "test \"\${$3+set}\"" = set; then :
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared"
>&5
++$as_echo_n "checking whether $2 is declared... " >&6; }
++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -2309,12 +2317,8 @@ $4
+ int
+ main ()
+ {
+-#ifndef $as_decl_name
+-#ifdef __cplusplus
+- (void) $as_decl_use;
+-#else
+- (void) $as_decl_name;
+-#endif
++#ifndef $2
++ (void) $2;
+ #endif
+
+ ;
+@@ -2339,7 +2343,7 @@ This file contains any messages produced
+ running configure, to aid debugging if configure makes a mistake.
+
+ It was created by python $as_me 3.2, which was
+-generated by GNU Autoconf 2.67. Invocation command line was
++generated by GNU Autoconf 2.65. Invocation command line was
+
+ $ $0 $@
+
+@@ -2449,9 +2453,11 @@ trap 'exit_status=$?
+ {
+ echo
+
+- $as_echo "## ---------------- ##
++ cat <<\_ASBOX
++## ---------------- ##
+ ## Cache variables. ##
+-## ---------------- ##"
++## ---------------- ##
++_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+ (
+@@ -2485,9 +2491,11 @@ $as_echo "$as_me: WARNING: cache variabl
+ )
+ echo
+
+- $as_echo "## ----------------- ##
++ cat <<\_ASBOX
++## ----------------- ##
+ ## Output variables. ##
+-## ----------------- ##"
++## ----------------- ##
++_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+@@ -2500,9 +2508,11 @@ $as_echo "$as_me: WARNING: cache variabl
+ echo
+
+ if test -n "$ac_subst_files"; then
+- $as_echo "## ------------------- ##
++ cat <<\_ASBOX
++## ------------------- ##
+ ## File substitutions. ##
+-## ------------------- ##"
++## ------------------- ##
++_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+@@ -2516,9 +2526,11 @@ $as_echo "$as_me: WARNING: cache variabl
+ fi
+
+ if test -s confdefs.h; then
+- $as_echo "## ----------- ##
++ cat <<\_ASBOX
++## ----------- ##
+ ## confdefs.h. ##
+-## ----------- ##"
++## ----------- ##
++_ASBOX
+ echo
+ cat confdefs.h
+ echo
+@@ -2573,12 +2585,7 @@ _ACEOF
+ ac_site_file1=NONE
+ ac_site_file2=NONE
+ if test -n "$CONFIG_SITE"; then
+- # We do not want a PATH search for config.site.
+- case $CONFIG_SITE in #((
+- -*) ac_site_file1=./$CONFIG_SITE;;
+- */*) ac_site_file1=$CONFIG_SITE;;
+- *) ac_site_file1=./$CONFIG_SITE;;
+- esac
++ ac_site_file1=$CONFIG_SITE
+ elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+@@ -2593,11 +2600,7 @@ do
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script
$ac_site_file" >&5
+ $as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+- . "$ac_site_file" \
+- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "failed to load site script $ac_site_file
+-See \`config.log' for more details" "$LINENO" 5 ; }
++ . "$ac_site_file"
+ fi
+ done
+
+@@ -2673,7 +2676,7 @@ if $ac_cache_corrupted; then
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can
compromise the build" >&5
+ $as_echo "$as_me: error: changes in the environment can compromise the build"
>&2;}
+- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
++ as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start
over" "$LINENO" 5
+ fi
+ ## -------------------- ##
+ ## Main body of script. ##
+@@ -2774,7 +2777,7 @@ if test "${enable_universalsdk+set}" = s
+ UNIVERSALSDK=$enableval
+ if test ! -d "${UNIVERSALSDK}"
+ then
+- as_fn_error $? "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
++ as_fn_error "--enable-universalsdk specifies non-existing SDK:
${UNIVERSALSDK}" "$LINENO" 5
+ fi
+ ;;
+ esac
+@@ -3166,7 +3169,7 @@ $as_echo "$without_gcc" >&6; }
+ # If the user switches compilers, we can't believe the cache
+ if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" !=
"$ac_cv_prog_CC"
then
-- LIBRARY='libpython$(VERSION).a'
-+ LIBRARY='libpython$(VERSION)$(DEBUG_EXT).a'
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBRARY" >&5
- $as_echo "$LIBRARY" >&6; }
-@@ -4843,8 +4853,8 @@ $as_echo "#define Py_ENABLE_SHARED 1" >>
- INSTSONAME="$LDLIBRARY".$SOVERSION
- ;;
- Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*)
-- LDLIBRARY='libpython$(VERSION).so'
-- BLDLIBRARY='-L. -lpython$(VERSION)'
-+ LDLIBRARY='libpython$(VERSION)$(DEBUG_EXT).so'
-+ BLDLIBRARY='-L. -lpython$(VERSION)$(DEBUG_EXT)'
- RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
- case $ac_sys_system in
- FreeBSD*)
-@@ -5237,6 +5247,14 @@ $as_echo "no" >&6; }
- fi
-
-
-+if test "$Py_DEBUG" = 'true'
-+then
-+ DEBUG_EXT=_d
-+ DEBUG_SUFFIX=-debug
-+fi
-+
-+
-+
- # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
- # merged with this chunk of code?
+- as_fn_error $? "cached CC is different -- throw away $cache_file
++ as_fn_error "cached CC is different -- throw away $cache_file
+ (it is also a good idea to do 'make clean' before compiling)"
"$LINENO" 5
+ fi
-@@ -8160,6 +8178,7 @@ fi
- $as_echo "$with_system_expat" >&6; }
+@@ -3476,8 +3479,8 @@ fi
- # Check for use of the system libffi library
-+
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-system-ffi"
>&5
- $as_echo_n "checking for --with-system-ffi... " >&6; }
+ test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}:
error: in \`$ac_pwd':" >&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "no acceptable C compiler found in \$PATH
+-See \`config.log' for more details" "$LINENO" 5 ; }
++as_fn_error "no acceptable C compiler found in \$PATH
++See \`config.log' for more details." "$LINENO" 5; }
+
+ # Provide some information about the compiler.
+ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version"
>&5
+@@ -3591,8 +3594,9 @@ sed 's/^/| /' conftest.$ac_ext >&5
+
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "C compiler cannot create executables
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "C compiler cannot create executables
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ $as_echo "yes" >&6; }
+@@ -3634,8 +3638,8 @@ done
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+-See \`config.log' for more details" "$LINENO" 5 ; }
++as_fn_error "cannot compute suffix of executables: cannot compile and link
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+ rm -f conftest conftest$ac_cv_exeext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+@@ -3692,9 +3696,9 @@ $as_echo "$ac_try_echo"; } >&5
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "cannot run C compiled programs.
++as_fn_error "cannot run C compiled programs.
+ If you meant to cross compile, use \`--host'.
+-See \`config.log' for more details" "$LINENO" 5 ; }
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+ fi
+ fi
+@@ -3745,8 +3749,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
+
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "cannot compute suffix of object files: cannot compile
+-See \`config.log' for more details" "$LINENO" 5 ; }
++as_fn_error "cannot compute suffix of object files: cannot compile
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+ rm -f conftest.$ac_cv_objext conftest.$ac_ext
+ fi
+@@ -4199,7 +4203,7 @@ else
+ # Broken: fails on valid input.
+ continue
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+@@ -4215,11 +4219,11 @@ else
+ ac_preproc_ok=:
+ break
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ done
+ # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+-rm -f conftest.i conftest.err conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if $ac_preproc_ok; then :
+ break
+ fi
+@@ -4258,7 +4262,7 @@ else
+ # Broken: fails on valid input.
+ continue
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+@@ -4274,18 +4278,18 @@ else
+ ac_preproc_ok=:
+ break
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+
+ done
+ # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+-rm -f conftest.i conftest.err conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if $ac_preproc_ok; then :
+
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+-See \`config.log' for more details" "$LINENO" 5 ; }
++as_fn_error "C preprocessor \"$CPP\" fails sanity check
++See \`config.log' for more details." "$LINENO" 5; }
+ fi
+
+ ac_ext=c
+@@ -4346,7 +4350,7 @@ esac
+ done
+ IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+- as_fn_error $? "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
++ as_fn_error "no acceptable grep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+ else
+ ac_cv_path_GREP=$GREP
+@@ -4412,7 +4416,7 @@ esac
+ done
+ IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+- as_fn_error $? "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
++ as_fn_error "no acceptable egrep could be found in
$PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+ else
+ ac_cv_path_EGREP=$EGREP
+@@ -4544,7 +4548,8 @@ do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ ac_fn_c_check_header_compile "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default
+ "
+-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
+@@ -5158,22 +5163,16 @@ bsdos*|hp*|HP*)
+ esac
+ ac_aux_dir=
+ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+- if test -f "$ac_dir/install-sh"; then
+- ac_aux_dir=$ac_dir
+- ac_install_sh="$ac_aux_dir/install-sh -c"
+- break
+- elif test -f "$ac_dir/install.sh"; then
+- ac_aux_dir=$ac_dir
+- ac_install_sh="$ac_aux_dir/install.sh -c"
+- break
+- elif test -f "$ac_dir/shtool"; then
+- ac_aux_dir=$ac_dir
+- ac_install_sh="$ac_aux_dir/shtool install -c"
+- break
+- fi
++ for ac_t in install-sh install.sh shtool; do
++ if test -f "$ac_dir/$ac_t"; then
++ ac_aux_dir=$ac_dir
++ ac_install_sh="$ac_aux_dir/$ac_t -c"
++ break 2
++ fi
++ done
+ done
+ if test -z "$ac_aux_dir"; then
+- as_fn_error $? "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
++ as_fn_error "cannot find install-sh, install.sh, or shtool in
\"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\""
"$LINENO" 5
+ fi
+
+ # These three variables are undocumented and unsupported,
+@@ -5511,7 +5510,7 @@ $as_echo "$CC" >&6; }
+ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc"
-@@ -9144,6 +9163,50 @@ $as_echo "no" >&6; }
+ else
+- as_fn_error $? "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
++ as_fn_error "proper usage is
--with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5
+
+ fi
+
+@@ -6005,7 +6004,8 @@ bluetooth/bluetooth.h linux/tipc.h spawn
+ do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header"
"$as_ac_Header" "$ac_includes_default"
+-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+ _ACEOF
+@@ -6019,7 +6019,7 @@ for ac_hdr in dirent.h sys/ndir.h sys/di
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines
DIR" >&5
+ $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+-if eval "test \"\${$as_ac_Header+set}\"" = set; then :
++if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; };
then :
+ $as_echo_n "(cached) " >&6
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -6046,7 +6046,8 @@ fi
+ eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
++eval as_val=\$$as_ac_Header
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+ _ACEOF
+@@ -6566,8 +6567,9 @@ else
+ if test "$ac_cv_type_int" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (int)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (int)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_int=0
+ fi
+@@ -6599,8 +6601,9 @@ else
+ if test "$ac_cv_type_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (long)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (long)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_long=0
+ fi
+@@ -6632,8 +6635,9 @@ else
+ if test "$ac_cv_type_void_p" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (void *)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (void *)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_void_p=0
+ fi
+@@ -6665,8 +6669,9 @@ else
+ if test "$ac_cv_type_short" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (short)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (short)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_short=0
+ fi
+@@ -6698,8 +6703,9 @@ else
+ if test "$ac_cv_type_float" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (float)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (float)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_float=0
+ fi
+@@ -6731,8 +6737,9 @@ else
+ if test "$ac_cv_type_double" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (double)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (double)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_double=0
+ fi
+@@ -6764,8 +6771,9 @@ else
+ if test "$ac_cv_type_fpos_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (fpos_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (fpos_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_fpos_t=0
+ fi
+@@ -6797,8 +6805,9 @@ else
+ if test "$ac_cv_type_size_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (size_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (size_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_size_t=0
+ fi
+@@ -6830,8 +6839,9 @@ else
+ if test "$ac_cv_type_pid_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (pid_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (pid_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_pid_t=0
+ fi
+@@ -6890,8 +6900,9 @@ else
+ if test "$ac_cv_type_long_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (long long)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (long long)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_long_long=0
+ fi
+@@ -6951,8 +6962,9 @@ else
+ if test "$ac_cv_type_long_double" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (long double)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (long double)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_long_double=0
+ fi
+@@ -7013,8 +7025,9 @@ else
+ if test "$ac_cv_type__Bool" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (_Bool)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (_Bool)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof__Bool=0
+ fi
+@@ -7061,8 +7074,9 @@ else
+ if test "$ac_cv_type_uintptr_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (uintptr_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (uintptr_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_uintptr_t=0
+ fi
+@@ -7102,8 +7116,9 @@ else
+ if test "$ac_cv_type_off_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (off_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (off_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_off_t=0
+ fi
+@@ -7164,8 +7179,9 @@ else
+ if test "$ac_cv_type_time_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (time_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (time_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_time_t=0
+ fi
+@@ -7236,8 +7252,9 @@ else
+ if test "$ac_cv_type_pthread_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (pthread_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (pthread_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_pthread_t=0
+ fi
+@@ -7324,7 +7341,7 @@ fi
+ MACOSX_DEFAULT_ARCH="ppc"
+ ;;
+ *)
+- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
++ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
+ ;;
+ esac
+ else
+@@ -7336,7 +7353,7 @@ fi
+ MACOSX_DEFAULT_ARCH="ppc64"
+ ;;
+ *)
+- as_fn_error $? "Unexpected output of 'arch' on OSX"
"$LINENO" 5
++ as_fn_error "Unexpected output of 'arch' on OSX"
"$LINENO" 5
+ ;;
+ esac
+
+@@ -7362,7 +7379,7 @@ $as_echo "#define WITH_NEXT_FRAMEWORK 1"
+ $as_echo "yes" >&6; }
+ if test $enable_shared = "yes"
+ then
+- as_fn_error $? "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
++ as_fn_error "Specifying both --enable-shared and --enable-framework is not
supported, use only --enable-framework instead" "$LINENO" 5
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+@@ -8158,12 +8175,12 @@ if test "${with_dbmliborder+set}" = set;
+ withval=$with_dbmliborder;
+ if test x$with_dbmliborder = xyes
+ then
+-as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
++as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
+ else
+ for db in `echo $with_dbmliborder | sed 's/:/ /g'`; do
+ if test x$db != xndbm && test x$db != xgdbm && test x$db != xbdb
+ then
+- as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
++ as_fn_error "proper usage is --with-dbmliborder=db1:db2:..."
"$LINENO" 5
+ fi
+ done
+ fi
+@@ -9118,6 +9135,50 @@ $as_echo "no" >&6; }
fi
@@ -172,7 +1056,16 @@ diff -up ./configure.autotool-intermediates ./configure
# Check for Python-specific malloc support
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
$as_echo_n "checking for --with-pymalloc... " >&6; }
-@@ -9194,6 +9257,46 @@ fi
+@@ -9162,7 +9223,7 @@ if test "x$ac_cv_header_valgrind_valgrin
+ $as_echo "#define WITH_VALGRIND 1" >>confdefs.h
+
+ else
+- as_fn_error $? "Valgrind support requested but headers not available"
"$LINENO" 5
++ as_fn_error "Valgrind support requested but headers not available"
"$LINENO" 5
+
+ fi
+
+@@ -9170,6 +9231,46 @@ fi
OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
fi
@@ -216,12 +1109,497 @@ diff -up ./configure.autotool-intermediates ./configure
+
+
+
- # Check for --with-wctype-functions
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-wctype-functions"
>&5
- $as_echo_n "checking for --with-wctype-functions... " >&6; }
+ # -I${DLINCLDIR} is added to the compile rule for importdl.o
+
+ DLINCLDIR=.
+@@ -9256,7 +9357,8 @@ for ac_func in alarm accept4 setitimer g
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -10251,7 +10353,8 @@ for ac_func in fseek64 fseeko fstatvfs f
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -10260,44 +10363,25 @@ fi
+ done
+
+
+-ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2"
+-if test "x$ac_cv_func_dup2" = x""yes; then :
+- $as_echo "#define HAVE_DUP2 1" >>confdefs.h
+-
+-else
+- case " $LIBOBJS " in
+- *" dup2.$ac_objext "* ) ;;
+- *) LIBOBJS="$LIBOBJS dup2.$ac_objext"
+- ;;
+-esac
+-
+-fi
+-
+-ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd"
+-if test "x$ac_cv_func_getcwd" = x""yes; then :
+- $as_echo "#define HAVE_GETCWD 1" >>confdefs.h
+-
+-else
+- case " $LIBOBJS " in
+- *" getcwd.$ac_objext "* ) ;;
+- *) LIBOBJS="$LIBOBJS getcwd.$ac_objext"
+- ;;
+-esac
+-
+-fi
+-
+-ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup"
+-if test "x$ac_cv_func_strdup" = x""yes; then :
+- $as_echo "#define HAVE_STRDUP 1" >>confdefs.h
++for ac_func in dup2 getcwd strdup
++do :
++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
++ cat >>confdefs.h <<_ACEOF
++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++_ACEOF
+
+ else
+ case " $LIBOBJS " in
+- *" strdup.$ac_objext "* ) ;;
+- *) LIBOBJS="$LIBOBJS strdup.$ac_objext"
++ *" $ac_func.$ac_objext "* ) ;;
++ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
+ ;;
+ esac
+
+ fi
++done
+
+
+ for ac_func in getpgrp
+@@ -11510,7 +11594,7 @@ elif test "$withval" != yes
+ then LIBM=$withval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBM=\"$withval\"" >&5
+ $as_echo "set LIBM=\"$withval\"" >&6; }
+-else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO"
5
++else as_fn_error "proper usage is --with-libm=STRING" "$LINENO" 5
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBM=\"$LIBM\"" >&5
+@@ -11534,7 +11618,7 @@ elif test "$withval" != yes
+ then LIBC=$withval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: set
LIBC=\"$withval\"" >&5
+ $as_echo "set LIBC=\"$withval\"" >&6; }
+-else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO"
5
++else as_fn_error "proper usage is --with-libc=STRING" "$LINENO" 5
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: default
LIBC=\"$LIBC\"" >&5
+@@ -11784,7 +11868,8 @@ for ac_func in acosh asinh atanh copysig
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -11796,7 +11881,8 @@ for ac_func in hypot lgamma log1p round
+ do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
++eval as_val=\$$as_ac_var
++ if test "x$as_val" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+ #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+ _ACEOF
+@@ -12059,7 +12145,7 @@ no)
+ 15|30)
+ ;;
+ *)
+- as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value
should be 15 or 30" "$LINENO" 5 ;;
++ as_fn_error "bad value $enable_big_digits for --enable-big-digits; value should
be 15 or 30" "$LINENO" 5 ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits"
>&5
+ $as_echo "$enable_big_digits" >&6; }
+@@ -12110,8 +12196,9 @@ else
+ if test "$ac_cv_type_wchar_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':"
>&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+-as_fn_error 77 "cannot compute sizeof (wchar_t)
+-See \`config.log' for more details" "$LINENO" 5 ; }
++{ as_fn_set_status 77
++as_fn_error "cannot compute sizeof (wchar_t)
++See \`config.log' for more details." "$LINENO" 5; }; }
+ else
+ ac_cv_sizeof_wchar_t=0
+ fi
+@@ -12480,8 +12567,8 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUI
+
+ ;; #(
+ *)
+- as_fn_error $? "unknown endianness
+- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
++ as_fn_error "unknown endianness
++ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+@@ -12742,7 +12829,7 @@ else
+ have_readline=no
+
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if test $have_readline = yes
+ then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -12916,7 +13003,7 @@ else
+ have_readline=no
+
+ fi
+-rm -f conftest.err conftest.i conftest.$ac_ext
++rm -f conftest.err conftest.$ac_ext
+ if test $have_readline = yes
+ then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+@@ -13732,7 +13819,7 @@ esac
+
+
+ case $ac_sys_system in
+- OSF*) as_fn_error $? "OSF* systems are deprecated unless somebody volunteers.
Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
++ OSF*) as_fn_error "OSF* systems are deprecated unless somebody volunteers. Check
http://bugs.python.org/issue8606" "$LINENO" 5 ;;
+ esac
+
+ ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
+@@ -13850,7 +13937,6 @@ DEFS=-DHAVE_CONFIG_H
+
+ ac_libobjs=
+ ac_ltlibobjs=
+-U=
+ for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+@@ -14013,19 +14099,19 @@ export LANGUAGE
+ (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+-# as_fn_error STATUS ERROR [LINENO LOG_FD]
+-# ----------------------------------------
++# as_fn_error ERROR [LINENO LOG_FD]
++# ---------------------------------
+ # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+ # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+-# script with STATUS, using 1 if that was 0.
++# script with status $?, using 1 if that was 0.
+ as_fn_error ()
+ {
+- as_status=$1; test $as_status -eq 0 && as_status=1
+- if test "$4"; then
+- as_lineno=${as_lineno-"$3"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
+- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
++ as_status=$?; test $as_status -eq 0 && as_status=1
++ if test "$3"; then
++ as_lineno=${as_lineno-"$2"}
as_lineno_stack=as_lineno_stack=$as_lineno_stack
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+ fi
+- $as_echo "$as_me: error: $2" >&2
++ $as_echo "$as_me: error: $1" >&2
+ as_fn_exit $as_status
+ } # as_fn_error
+
+@@ -14221,7 +14307,7 @@ $as_echo X"$as_dir" |
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+- } || test -d "$as_dir" || as_fn_error $? "cannot create directory
$as_dir"
++ } || test -d "$as_dir" || as_fn_error "cannot create directory
$as_dir"
+
+
+ } # as_fn_mkdir_p
+@@ -14275,7 +14361,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # values after options handling.
+ ac_log="
+ This file was extended by python $as_me 3.2, which was
+-generated by GNU Autoconf 2.67. Invocation command line was
++generated by GNU Autoconf 2.65. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+@@ -14337,10 +14423,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //;
s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+ python config.status 3.2
+-configured by $0, generated by GNU Autoconf 2.67,
++configured by $0, generated by GNU Autoconf 2.65,
+ with options \\"\$ac_cs_config\\"
+
+-Copyright (C) 2010 Free Software Foundation, Inc.
++Copyright (C) 2009 Free Software Foundation, Inc.
+ This config.status script is free software; the Free Software Foundation
+ gives unlimited permission to copy, distribute and modify it."
+
+@@ -14356,16 +14442,11 @@ ac_need_defaults=:
+ while test $# != 0
+ do
+ case $1 in
+- --*=?*)
++ --*=*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+- --*=)
+- ac_option=`expr "X$1" : 'X\([^=]*\)='`
+- ac_optarg=
+- ac_shift=:
+- ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+@@ -14387,7 +14468,6 @@ do
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed
"s/'/'\\\\\\\\''/g"` ;;
+- '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+@@ -14400,7 +14480,7 @@ do
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+- as_fn_error $? "ambiguous option: \`$1'
++ as_fn_error "ambiguous option: \`$1'
+ Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+@@ -14409,7 +14489,7 @@ Try \`$0 --help' for more information.";
+ ac_cs_silent=: ;;
+
+ # This is an error.
+- -*) as_fn_error $? "unrecognized option: \`$1'
++ -*) as_fn_error "unrecognized option: \`$1'
+ Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+@@ -14468,7 +14548,7 @@ do
+ "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc"
;;
+ "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES
Modules/ld_so_aix" ;;
+
+- *) as_fn_error $? "invalid argument: \`$ac_config_target'"
"$LINENO" 5 ;;
++ *) as_fn_error "invalid argument: \`$ac_config_target'"
"$LINENO" 5;;
+ esac
+ done
+
+@@ -14505,7 +14585,7 @@ $debug ||
+ {
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+-} || as_fn_error $? "cannot create a temporary directory in ."
"$LINENO" 5
++} || as_fn_error "cannot create a temporary directory in ."
"$LINENO" 5
+
+ # Set up the scripts for CONFIG_FILES section.
+ # No need to generate them if there are no CONFIG_FILES.
+@@ -14522,7 +14602,7 @@ if test "x$ac_cr" = x; then
+ fi
+ ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null
2>/dev/null`
+ if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+- ac_cs_awk_cr='\\r'
++ ac_cs_awk_cr='\r'
+ else
+ ac_cs_awk_cr=$ac_cr
+ fi
+@@ -14536,18 +14616,18 @@ _ACEOF
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/'
&&
+ echo "_ACEOF"
+ } >conf$$subs.sh ||
+- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
++ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ ac_delim='%!_!# '
+ for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
++ as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+@@ -14636,28 +14716,20 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n
+ else
+ cat
+ fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+- || as_fn_error $? "could not setup config files machinery"
"$LINENO" 5
++ || as_fn_error "could not setup config files machinery" "$LINENO"
5
+ _ACEOF
+
+-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading
and
++# VPATH may cause trouble with some makes, so we remove $(srcdir),
++# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+ # trailing colons and then remove the whole line if VPATH becomes empty
+ # (actually we leave an empty line to preserve line numbers).
+ if test "x$srcdir" = x.; then
+- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+-h
+-s///
+-s/^/:/
+-s/[ ]*$/:/
+-s/:\$(srcdir):/:/g
+-s/:\${srcdir}:/:/g
+-s/:@srcdir@:/:/g
+-s/^:*//
++ ac_vpsub='/^[ ]*VPATH[ ]*=/{
++s/:*\$(srcdir):*/:/
++s/:*\${srcdir}:*/:/
++s/:*@srcdir@:*/:/
++s/^\([^=]*=[ ]*\):*/\1/
+ s/:*$//
+-x
+-s/\(=[ ]*\).*/\1/
+-G
+-s/\n//
+ s/^[^=]*=[ ]*$//
+ }'
+ fi
+@@ -14685,7 +14757,7 @@ for ac_last_try in false false :; do
+ if test -z "$ac_t"; then
+ break
+ elif $ac_last_try; then
+- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
++ as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+@@ -14770,7 +14842,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ
+ _ACAWK
+ _ACEOF
+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+- as_fn_error $? "could not setup config headers machinery"
"$LINENO" 5
++ as_fn_error "could not setup config headers machinery" "$LINENO"
5
+ fi # test -n "$CONFIG_HEADERS"
+
+
+@@ -14783,7 +14855,7 @@ do
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO"
5 ;;
++ :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO"
5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+@@ -14811,7 +14883,7 @@ do
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5
;;
++ as_fn_error "cannot find input file: \`$ac_f'" "$LINENO"
5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed
"s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+@@ -14838,7 +14910,7 @@ $as_echo "$as_me: creating $ac_file" >&6
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$tmp/stdin" \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
++ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+@@ -14969,22 +15041,22 @@ s&@INSTALL@&$ac_INSTALL&;t t
+ $ac_datarootdir_hack
+ "
+ eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f
"$tmp/subs.awk" >$tmp/out \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
+
+ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n
"$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z
"$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference
to the variable \`datarootdir'
+-which seems to be undefined. Please make sure it is defined" >&5
++which seems to be undefined. Please make sure it is defined." >&5
+ $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable
\`datarootdir'
+-which seems to be undefined. Please make sure it is defined" >&2;}
++which seems to be undefined. Please make sure it is defined." >&2;}
+
+ rm -f "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out" && rm -f "$tmp/out";;
+ *) rm -f "$ac_file" && mv "$tmp/out"
"$ac_file";;
+ esac \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+@@ -14995,19 +15067,19 @@ which seems to be undefined. Please mak
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs"
+ } >"$tmp/config.h" \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1;
then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged"
>&5
+ $as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$tmp/config.h" "$ac_file" \
+- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
++ || as_fn_error "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$tmp/defines.awk"'
"$ac_file_inputs" \
+- || as_fn_error $? "could not create -" "$LINENO" 5
++ || as_fn_error "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+@@ -15027,7 +15099,7 @@ _ACEOF
+ ac_clean_files=$ac_clean_files_save
+
+ test $ac_write_fail = 0 ||
+- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO"
5
++ as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+ # configure is writing to config.log, and then calls config.status.
+@@ -15048,7 +15120,7 @@ if test "$no_create" != yes; then
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+- $ac_cs_success || as_fn_exit 1
++ $ac_cs_success || as_fn_exit $?
+ fi
+ if test -n "$ac_unrecognized_opts" && test
"$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options:
$ac_unrecognized_opts" >&5
diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
---- ./pyconfig.h.in.autotool-intermediates 2010-08-02 17:58:12.236001348 -0400
-+++ ./pyconfig.h.in 2010-08-02 17:58:20.000000000 -0400
+--- ./pyconfig.h.in.autotool-intermediates 2010-12-28 18:47:15.203935226 -0500
++++ ./pyconfig.h.in 2010-12-28 18:47:21.330060783 -0500
@@ -12,15 +12,15 @@
support for AIX C++ shared extension modules. */
#undef AIX_GENUINE_CPLUSPLUS
@@ -241,3 +1619,13 @@ diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
/* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
mixed-endian order (byte order 45670123) */
#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
+@@ -503,6 +503,9 @@
+ /* Define to 1 if you have the `pause' function. */
+ #undef HAVE_PAUSE
+
++/* Define if the OS supports pipe2() */
++#undef HAVE_PIPE2
++
+ /* Define to 1 if you have the `plock' function. */
+ #undef HAVE_PLOCK
+
diff --git a/python-3.2a1-lib64.patch b/python-3.2a1-lib64.patch
deleted file mode 100644
index dd259c0..0000000
--- a/python-3.2a1-lib64.patch
+++ /dev/null
@@ -1,165 +0,0 @@
-diff -up Python-3.2a1/Lib/distutils/command/install.py.lib64
Python-3.2a1/Lib/distutils/command/install.py
---- Python-3.2a1/Lib/distutils/command/install.py.lib64 2010-07-22 08:50:05.000000000
-0400
-+++ Python-3.2a1/Lib/distutils/command/install.py 2010-08-02 18:33:15.667001759 -0400
-@@ -47,14 +47,14 @@ else:
- 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/$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',
-diff -up Python-3.2a1/Lib/distutils/sysconfig.py.lib64
Python-3.2a1/Lib/distutils/sysconfig.py
---- Python-3.2a1/Lib/distutils/sysconfig.py.lib64 2010-07-23 05:43:17.000000000 -0400
-+++ Python-3.2a1/Lib/distutils/sysconfig.py 2010-08-02 18:33:15.669000547 -0400
-@@ -117,8 +117,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:
-diff -up Python-3.2a1/Lib/site.py.lib64 Python-3.2a1/Lib/site.py
---- Python-3.2a1/Lib/site.py.lib64 2010-06-27 17:45:24.000000000 -0400
-+++ Python-3.2a1/Lib/site.py 2010-08-02 18:34:30.584001242 -0400
-@@ -283,12 +283,16 @@ def getsitepackages():
- if sys.platform in ('os2emx', 'riscos'):
- sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
- elif os.sep == '/':
-+ sitepackages.append(os.path.join(prefix, "lib64",
-+ "python" + sys.version[:3],
-+ "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
- "python" + sys.version[:3],
- "site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
- else:
- sitepackages.append(prefix)
-+ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
- sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
- if sys.platform == "darwin":
- # for framework builds *only* we add the standard Apple
-diff -up Python-3.2a1/Makefile.pre.in.lib64 Python-3.2a1/Makefile.pre.in
---- Python-3.2a1/Makefile.pre.in.lib64 2010-08-02 18:33:15.000000000 -0400
-+++ Python-3.2a1/Makefile.pre.in 2010-08-02 18:35:07.147000664 -0400
-@@ -100,7 +100,7 @@ LIBDIR= @libdir@
- MANDIR= @mandir@
- INCLUDEDIR= @includedir@
- CONFINCLUDEDIR= $(exec_prefix)/include
--SCRIPTDIR= $(prefix)/lib
-+SCRIPTDIR= $(prefix)/lib64
-
- # Detailed destination directories
- BINLIBDEST= $(LIBDIR)/python$(VERSION)
-diff -up Python-3.2a1/Modules/getpath.c.lib64 Python-3.2a1/Modules/getpath.c
---- Python-3.2a1/Modules/getpath.c.lib64 2010-07-23 12:05:35.000000000 -0400
-+++ Python-3.2a1/Modules/getpath.c 2010-08-02 18:35:50.857000717 -0400
-@@ -117,8 +117,8 @@
- #endif
-
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
-+#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
-+ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
- #endif
-
- #ifndef LANDMARK
-@@ -129,7 +129,7 @@ static wchar_t prefix[MAXPATHLEN+1];
- static wchar_t exec_prefix[MAXPATHLEN+1];
- static wchar_t progpath[MAXPATHLEN+1];
- static wchar_t *module_search_path = NULL;
--static wchar_t *lib_python = L"lib/python" VERSION;
-+static wchar_t *lib_python = L"lib64/python" VERSION;
-
- /* In principle, this should use HAVE__WSTAT, and _wstat
- should be detected by autoconf. However, no current
-@@ -603,7 +603,7 @@ calculate_path(void)
- }
- else
- wcsncpy(zip_path, L"" PREFIX, MAXPATHLEN);
-- joinpath(zip_path, L"lib/python00.zip");
-+ joinpath(zip_path, L"lib64/python00.zip");
- bufsz = wcslen(zip_path); /* Replace "00" with version */
- zip_path[bufsz - 6] = VERSION[0];
- zip_path[bufsz - 5] = VERSION[2];
-@@ -613,7 +613,7 @@ calculate_path(void)
- fprintf(stderr,
- "Could not find platform dependent libraries
<exec_prefix>\n");
- wcsncpy(exec_prefix, L"" EXEC_PREFIX, MAXPATHLEN);
-- joinpath(exec_prefix, L"lib/lib-dynload");
-+ joinpath(exec_prefix, L"lib64/lib-dynload");
- }
- /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
-
---- Python-3.2a1/setup.py.lib64 2010-07-23 15:25:47.000000000 -0400
-+++ Python-3.2a1/setup.py 2010-08-02 18:36:51.521000448 -0400
-@@ -343,7 +343,7 @@ class PyBuildExt(build_ext):
-
- def detect_modules(self):
- # Ensure that /usr/local is always used
-- 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')
-
- # Add paths specified in the environment variables LDFLAGS and
-@@ -587,11 +587,11 @@ class PyBuildExt(build_ext):
- elif curses_library:
- readline_libs.append(curses_library)
- elif self.compiler.find_library_file(lib_dirs +
-- ['/usr/lib/termcap'],
-+ ['/usr/lib64/termcap'],
- 'termcap'):
- readline_libs.append('termcap')
- exts.append( 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:
-@@ -628,8 +628,8 @@ class PyBuildExt(build_ext):
- if krb5_h:
- ssl_incs += krb5_h
- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-- ['/usr/local/ssl/lib',
-- '/usr/contrib/ssl/lib/'
-+ ['/usr/local/ssl/lib64',
-+ '/usr/contrib/ssl/lib64/'
- ] )
-
- if (ssl_incs is not None and
-Index: Lib/sysconfig.py
-===================================================================
---- Python-3.2a1/Lib/sysconfig.py
-+++ Python-3.2a1/Lib/sysconfig.py 2010-08-22 14:34:38.791426924 +0200
-@@ -11,10 +11,10 @@
-
- _INSTALL_SCHEMES = {
- 'posix_prefix': {
-- 'stdlib': '{base}/lib/python{py_version_short}',
-- 'platstdlib': '{platbase}/lib/python{py_version_short}',
-- 'purelib': '{base}/lib/python{py_version_short}/site-packages',
-- 'platlib':
'{platbase}/lib/python{py_version_short}/site-packages',
-+ 'stdlib': '{base}/lib64/python{py_version_short}',
-+ 'platstdlib': '{platbase}/lib64/python{py_version_short}',
-+ 'purelib':
'{base}/lib64/python{py_version_short}/site-packages',
-+ 'platlib':
'{platbase}/lib64/python{py_version_short}/site-packages',
- 'include': '{base}/include/python{py_version_short}',
- 'platinclude': '{platbase}/include/python{py_version_short}',
- 'scripts': '{base}/bin',
diff --git a/python-3.2a1-no-static-lib.patch b/python-3.2a1-no-static-lib.patch
deleted file mode 100644
index 6dd8147..0000000
--- a/python-3.2a1-no-static-lib.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-diff -up Python-3.2a1/Makefile.pre.in.no-static-lib Python-3.2a1/Makefile.pre.in
---- Python-3.2a1/Makefile.pre.in.no-static-lib 2010-07-17 16:39:23.000000000 -0400
-+++ Python-3.2a1/Makefile.pre.in 2010-08-02 16:02:28.378010008 -0400
-@@ -416,7 +416,7 @@ coverage:
-
-
- # Build the interpreter
--$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
-+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY)
- $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ \
- Modules/python.o \
- $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-@@ -432,18 +432,6 @@ sharedmods: $(BUILDPYTHON)
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)'
LDFLAGS='$(PY_LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E
$(srcdir)/setup.py build;; \
- esac
-
--# Build static library
--# avoid long command lines, same as LIBRARY_OBJS
--$(LIBRARY): $(LIBRARY_OBJS)
-- -rm -f $@
-- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
-- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
-- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
-- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODOBJS)
-- $(RANLIB) $@
--
- libpython$(VERSION).so: $(LIBRARY_OBJS)
- if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(LDSHARED) $(PY_LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS)
$(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
-@@ -1003,18 +991,6 @@ libainstall: all python-config
- else true; \
- fi; \
- done
-- @if test -d $(LIBRARY); then :; else \
-- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-- if test "$(SO)" = .dll; then \
-- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
-- else \
-- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- fi; \
-- else \
-- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
-- fi; \
-- fi
- $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
- $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
- $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python-3.2a1-remove-mimeaudio-tests.patch
b/python-3.2a1-remove-mimeaudio-tests.patch
deleted file mode 100644
index ff67690..0000000
--- a/python-3.2a1-remove-mimeaudio-tests.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-diff -up Python-3.2a1/Lib/email/test/test_email.py.remove-mimeaudio-tests
Python-3.2a1/Lib/email/test/test_email.py
---- Python-3.2a1/Lib/email/test/test_email.py.remove-mimeaudio-tests 2010-08-02
15:52:12.397002172 -0400
-+++ Python-3.2a1/Lib/email/test/test_email.py 2010-08-02 15:52:38.132999850 -0400
-@@ -952,53 +952,6 @@ Blah blah blah
-
-
-
--# Test the basic MIMEAudio class
--class TestMIMEAudio(unittest.TestCase):
-- def setUp(self):
-- # Make sure we pick up the audiotest.au that lives in email/test/data.
-- # In Python, there's an audiotest.au living in Lib/test but that isn't
-- # included in some binary distros that don't include the test
-- # package. The trailing empty string on the .join() is significant
-- # since findfile() will do a dirname().
-- datadir = os.path.join(os.path.dirname(landmark), 'data', '')
-- with open(findfile('audiotest.au', datadir), 'rb') as fp:
-- self._audiodata = fp.read()
-- self._au = MIMEAudio(self._audiodata)
--
-- def test_guess_minor_type(self):
-- self.assertEqual(self._au.get_content_type(), 'audio/basic')
--
-- def test_encoding(self):
-- payload = self._au.get_payload()
-- self.assertEqual(base64.decodebytes(bytes(payload, 'ascii')),
-- self._audiodata)
--
-- def test_checkSetMinor(self):
-- au = MIMEAudio(self._audiodata, 'fish')
-- self.assertEqual(au.get_content_type(), 'audio/fish')
--
-- def test_add_header(self):
-- eq = self.assertEqual
-- unless = self.assertTrue
-- self._au.add_header('Content-Disposition', 'attachment',
-- filename='audiotest.au')
-- eq(self._au['content-disposition'],
-- 'attachment; filename="audiotest.au"')
-- eq(self._au.get_params(header='content-disposition'),
-- [('attachment', ''), ('filename',
'audiotest.au')])
-- eq(self._au.get_param('filename',
header='content-disposition'),
-- 'audiotest.au')
-- missing = []
-- eq(self._au.get_param('attachment',
header='content-disposition'), '')
-- unless(self._au.get_param('foo', failobj=missing,
-- header='content-disposition') is missing)
-- # Try some missing stuff
-- unless(self._au.get_param('foobar', missing) is missing)
-- unless(self._au.get_param('attachment', missing,
-- header='foobar') is missing)
--
--
--
- # Test the basic MIMEImage class
- class TestMIMEImage(unittest.TestCase):
- def setUp(self):
diff --git a/python-3.2a1-systemtap.patch b/python-3.2a1-systemtap.patch
deleted file mode 100644
index 6770b58..0000000
--- a/python-3.2a1-systemtap.patch
+++ /dev/null
@@ -1,222 +0,0 @@
-diff -up Python-3.2a1/configure.in.systemtap Python-3.2a1/configure.in
---- Python-3.2a1/configure.in.systemtap 2010-07-19 03:31:40.000000000 -0400
-+++ Python-3.2a1/configure.in 2010-08-02 16:19:43.809000621 -0400
-@@ -1987,6 +1987,7 @@ AC_ARG_WITH(system_expat,
- AC_MSG_RESULT($with_system_expat)
-
- # Check for use of the system libffi library
-+
- AC_MSG_CHECKING(for --with-system-ffi)
- AC_ARG_WITH(system_ffi,
- AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed
ffi library]))
-@@ -2500,6 +2501,38 @@ if test "$with_valgrind" != no; then
- OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
- fi
-
-+# Check for dtrace support
-+AC_MSG_CHECKING(for --with-dtrace)
-+AC_ARG_WITH(dtrace,
-+ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
-+
-+if test ! -z "$with_dtrace"
-+then
-+ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Sun"
-+ DTRACEOBJS="Python/dtrace.o"
-+ DTRADEHDRS=""
-+ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Apple"
-+ DTRACEOBJS=""
-+ DTRADEHDRS="pydtrace.h"
-+ else
-+ with_dtrace="no"
-+ fi
-+else
-+ with_dtrace="no"
-+fi
-+
-+AC_MSG_RESULT($with_dtrace)
-+AC_SUBST(DTRACEOBJS)
-+AC_SUBST(DTRACEHDRS)
-+
- # Check for --with-wctype-functions
- AC_MSG_CHECKING(for --with-wctype-functions)
- AC_ARG_WITH(wctype-functions,
-diff -up Python-3.2a1/Include/pydtrace.d.systemtap Python-3.2a1/Include/pydtrace.d
---- Python-3.2a1/Include/pydtrace.d.systemtap 2010-08-02 16:17:04.249000540 -0400
-+++ Python-3.2a1/Include/pydtrace.d 2010-08-02 16:17:04.249000540 -0400
-@@ -0,0 +1,10 @@
-+provider python {
-+ probe function__entry(const char *, const char *, int);
-+ probe function__return(const char *, const char *, int);
-+};
-+
-+#pragma D attributes Evolving/Evolving/Common provider python provider
-+#pragma D attributes Private/Private/Common provider python module
-+#pragma D attributes Private/Private/Common provider python function
-+#pragma D attributes Evolving/Evolving/Common provider python name
-+#pragma D attributes Evolving/Evolving/Common provider python args
-diff -up Python-3.2a1/Makefile.pre.in.systemtap Python-3.2a1/Makefile.pre.in
---- Python-3.2a1/Makefile.pre.in.systemtap 2010-08-02 16:17:04.243000614 -0400
-+++ Python-3.2a1/Makefile.pre.in 2010-08-02 16:20:41.617000527 -0400
-@@ -324,6 +324,7 @@ PYTHON_OBJS= \
- Python/dtoa.o \
- Python/formatter_unicode.o \
- Python/$(DYNLOADFILE) \
-+ @DTRACEOBJS@ \
- $(LIBOBJS) \
- $(MACHDEP_OBJS) \
- $(THREADOBJ)
-@@ -615,6 +616,18 @@ Python/formatter_unicode.o: $(srcdir)/Py
- $(srcdir)/Objects/stringlib/formatter.h
-
-
-+# Only needed with --with-dtrace
-+buildinclude:
-+ mkdir -p Include
-+
-+Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
-+ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
-+
-+Python/ceval.o: Include/pydtrace.h
-+
-+Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
-+ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
-+
- ############################################################################
- # Header files
-
-@@ -1248,7 +1261,7 @@ Python/thread.o: @THREADHEADERS@
- .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
- .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
- .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
--.PHONY: smelly funny patchcheck
-+.PHONY: smelly funny patchcheck buildinclude
- .PHONY: gdbhooks
-
- # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
-diff -up Python-3.2a1/pyconfig.h.in.systemtap Python-3.2a1/pyconfig.h.in
---- Python-3.2a1/pyconfig.h.in.systemtap 2010-08-02 16:18:33.696001964 -0400
-+++ Python-3.2a1/pyconfig.h.in 2010-08-02 16:21:48.566001832 -0400
-@@ -1078,6 +1078,9 @@
- /* Define if you want documentation strings in extension modules */
- #undef WITH_DOC_STRINGS
-
-+/* Define if you want to compile in Dtrace support */
-+#undef WITH_DTRACE
-+
- /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
- linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
- Dyld is necessary to support frameworks. */
-diff -up Python-3.2a1/Python/ceval.c.systemtap Python-3.2a1/Python/ceval.c
---- Python-3.2a1/Python/ceval.c.systemtap 2010-07-20 18:39:34.000000000 -0400
-+++ Python-3.2a1/Python/ceval.c 2010-08-02 16:23:58.703001000 -0400
-@@ -19,6 +19,10 @@
-
- #include <ctype.h>
-
-+#ifdef WITH_DTRACE
-+#include "pydtrace.h"
-+#endif
-+
- #ifndef WITH_TSC
-
- #define READ_TIMESTAMP(var)
-@@ -752,6 +756,70 @@ PyEval_EvalCode(PyCodeObject *co, PyObje
- }
-
-
-+#ifdef WITH_DTRACE
-+struct frame_marker_info
-+{
-+ char *filename;
-+ char *name;
-+ int lineno;
-+
-+ PyObject *utf8_filename;
-+ PyObject *utf8_name;
-+};
-+
-+static void
-+get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
-+{
-+ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
-+ if (fmi->utf8_filename) {
-+ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
-+ } else {
-+ fmi->filename = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
-+ if (fmi->utf8_name) {
-+ fmi->name = PyBytes_AsString(fmi->utf8_name);
-+ } else {
-+ fmi->name = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
-+}
-+
-+static void
-+release_frame_marker_info(struct frame_marker_info *fmi)
-+{
-+ Py_XDECREF(fmi->utf8_filename);
-+ Py_XDECREF(fmi->utf8_name);
-+}
-+
-+static void
-+dtrace_entry(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
-+}
-+
-+static void
-+dtrace_return(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
-+}
-+#else
-+#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
-+#define PYTHON_FUNCTION_RETURN_ENABLED() 0
-+#define dtrace_entry(f)
-+#define dtrace_return(f)
-+#endif
-+
- /* Interpreter main loop */
-
- PyObject *
-@@ -1156,6 +1224,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
- }
- }
-
-+ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
-+ dtrace_entry(f);
-+ }
-+
- co = f->f_code;
- names = co->co_names;
- consts = co->co_consts;
-@@ -3046,6 +3118,9 @@ fast_yield:
-
- /* pop frame */
- exit_eval_frame:
-+ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
-+ dtrace_return(f);
-+ }
- Py_LeaveRecursiveCall();
- tstate->frame = f->f_back;
-
diff --git a/python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
b/python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
new file mode 100644
index 0000000..337e39e
--- /dev/null
+++ b/python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
@@ -0,0 +1,22 @@
+diff -up Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_gc.py
+--- Python-3.2b2/Lib/test/test_gc.py.fix-test-gc-COUNT_ALLOCS 2010-12-28
20:39:40.779059772 -0500
++++ Python-3.2b2/Lib/test/test_gc.py 2010-12-28 20:41:15.890940017 -0500
+@@ -102,10 +102,16 @@ class GCTests(unittest.TestCase):
+ del a
+ self.assertNotEqual(gc.collect(), 0)
+ del B, C
+- self.assertNotEqual(gc.collect(), 0)
++ if hasattr(sys, 'getcounts'):
++ self.assertEqual(gc.collect(), 0)
++ else:
++ self.assertNotEqual(gc.collect(), 0)
+ A.a = A()
+ del A
+- self.assertNotEqual(gc.collect(), 0)
++ if hasattr(sys, 'getcounts'):
++ self.assertEqual(gc.collect(), 0)
++ else:
++ self.assertNotEqual(gc.collect(), 0)
+ self.assertEqual(gc.collect(), 0)
+
+ def test_method(self):
diff --git a/python-3.2b2-lib64.patch b/python-3.2b2-lib64.patch
new file mode 100644
index 0000000..8d4e91f
--- /dev/null
+++ b/python-3.2b2-lib64.patch
@@ -0,0 +1,200 @@
+diff -up Python-3.2b2/Lib/distutils/command/install.py.lib64
Python-3.2b2/Lib/distutils/command/install.py
+--- Python-3.2b2/Lib/distutils/command/install.py.lib64 2010-11-24 22:46:44.000000000
-0500
++++ Python-3.2b2/Lib/distutils/command/install.py 2010-12-29 10:21:55.510184563 -0500
+@@ -47,14 +47,14 @@ else:
+ 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',
+diff -up Python-3.2b2/Lib/distutils/sysconfig.py.lib64
Python-3.2b2/Lib/distutils/sysconfig.py
+--- Python-3.2b2/Lib/distutils/sysconfig.py.lib64 2010-11-24 14:43:47.000000000 -0500
++++ Python-3.2b2/Lib/distutils/sysconfig.py 2010-12-29 10:21:55.510184563 -0500
+@@ -124,8 +124,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:
+diff -up Python-3.2b2/Lib/site.py.lib64 Python-3.2b2/Lib/site.py
+--- Python-3.2b2/Lib/site.py.lib64 2010-10-12 18:23:23.000000000 -0400
++++ Python-3.2b2/Lib/site.py 2010-12-29 10:21:55.511184595 -0500
+@@ -275,12 +275,16 @@ def getsitepackages():
+ if sys.platform in ('os2emx', 'riscos'):
+ sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
+ elif os.sep == '/':
++ sitepackages.append(os.path.join(prefix, "lib64",
++ "python" + sys.version[:3],
++ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
+ "python" + sys.version[:3],
+ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
+ else:
+ sitepackages.append(prefix)
++ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
+ if sys.platform == "darwin":
+ # for framework builds *only* we add the standard Apple
+diff -up Python-3.2b2/Lib/sysconfig.py.lib64 Python-3.2b2/Lib/sysconfig.py
+--- Python-3.2b2/Lib/sysconfig.py.lib64 2010-11-24 20:34:47.000000000 -0500
++++ Python-3.2b2/Lib/sysconfig.py 2010-12-29 10:21:55.512184877 -0500
+@@ -21,10 +21,10 @@ __all__ = [
+
+ _INSTALL_SCHEMES = {
+ 'posix_prefix': {
+- 'stdlib': '{base}/lib/python{py_version_short}',
+- 'platstdlib': '{platbase}/lib/python{py_version_short}',
++ 'stdlib': '{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':
+ '{base}/include/python{py_version_short}{abiflags}',
+ 'platinclude':
+@@ -81,10 +81,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}',
+diff -up Python-3.2b2/Lib/test/test_site.py.lib64 Python-3.2b2/Lib/test/test_site.py
+--- Python-3.2b2/Lib/test/test_site.py.lib64 2010-12-29 10:35:12.417308989 -0500
++++ Python-3.2b2/Lib/test/test_site.py 2010-12-29 10:36:27.124059073 -0500
+@@ -164,12 +164,15 @@ class HelperFunctionsTests(unittest.Test
+ wanted = os.path.join('xoxo', 'Lib',
'site-packages')
+ self.assertEqual(dirs[0], wanted)
+ elif os.sep == '/':
+- self.assertEqual(len(dirs), 2)
+- wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ self.assertEqual(len(dirs), 3)
++ wanted = os.path.join('xoxo', 'lib64', 'python' +
sys.version[:3],
+ 'site-packages')
+ self.assertEqual(dirs[0], wanted)
+- wanted = os.path.join('xoxo', 'lib', 'site-python')
++ wanted = os.path.join('xoxo', 'lib', 'python' +
sys.version[:3],
++ 'site-packages')
+ self.assertEqual(dirs[1], wanted)
++ wanted = os.path.join('xoxo', 'lib', 'site-python')
++ self.assertEqual(dirs[2], wanted)
+ else:
+ self.assertEqual(len(dirs), 2)
+ self.assertEqual(dirs[0], 'xoxo')
+diff -up Python-3.2b2/Makefile.pre.in.lib64 Python-3.2b2/Makefile.pre.in
+--- Python-3.2b2/Makefile.pre.in.lib64 2010-12-29 10:21:55.506183982 -0500
++++ Python-3.2b2/Makefile.pre.in 2010-12-29 10:21:55.512184877 -0500
+@@ -102,7 +102,7 @@ LIBDIR= @libdir@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/lib64
+ ABIFLAGS= @ABIFLAGS@
+
+ # Detailed destination directories
+diff -up Python-3.2b2/Modules/getpath.c.lib64 Python-3.2b2/Modules/getpath.c
+--- Python-3.2b2/Modules/getpath.c.lib64 2010-12-03 15:14:31.000000000 -0500
++++ Python-3.2b2/Modules/getpath.c 2010-12-29 10:21:55.513184358 -0500
+@@ -122,8 +122,8 @@
+ #endif
+
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
++ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
+ #endif
+
+ #ifndef LANDMARK
+@@ -134,7 +134,7 @@ static wchar_t prefix[MAXPATHLEN+1];
+ static wchar_t exec_prefix[MAXPATHLEN+1];
+ static wchar_t progpath[MAXPATHLEN+1];
+ static wchar_t *module_search_path = NULL;
+-static wchar_t *lib_python = L"lib/python" VERSION;
++static wchar_t *lib_python = L"lib64/python" VERSION;
+
+ static void
+ reduce(wchar_t *dir)
+@@ -582,7 +582,7 @@ calculate_path(void)
+ }
+ else
+ wcsncpy(zip_path, _prefix, MAXPATHLEN);
+- joinpath(zip_path, L"lib/python00.zip");
++ joinpath(zip_path, L"lib64/python00.zip");
+ bufsz = wcslen(zip_path); /* Replace "00" with version */
+ zip_path[bufsz - 6] = VERSION[0];
+ zip_path[bufsz - 5] = VERSION[2];
+@@ -592,7 +592,7 @@ calculate_path(void)
+ fprintf(stderr,
+ "Could not find platform dependent libraries
<exec_prefix>\n");
+ wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN);
+- joinpath(exec_prefix, L"lib/lib-dynload");
++ joinpath(exec_prefix, L"lib64/lib-dynload");
+ }
+ /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+
+diff -up Python-3.2b2/setup.py.lib64 Python-3.2b2/setup.py
+--- Python-3.2b2/setup.py.lib64 2010-12-04 13:36:03.000000000 -0500
++++ Python-3.2b2/setup.py 2010-12-29 10:21:55.514184248 -0500
+@@ -373,7 +373,7 @@ class PyBuildExt(build_ext):
+ # Ensure that /usr/local is always used, but the local build
+ # directories (i.e. '.' and 'Include') must be first. See
issue
+ # 10520.
+- 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')
+
+ # Add paths specified in the environment variables LDFLAGS and
+@@ -619,11 +619,11 @@ class PyBuildExt(build_ext):
+ elif curses_library:
+ readline_libs.append(curses_library)
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/lib64/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( 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:
+@@ -660,8 +660,8 @@ class PyBuildExt(build_ext):
+ if krb5_h:
+ ssl_incs += krb5_h
+ ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
+- ['/usr/local/ssl/lib',
+- '/usr/contrib/ssl/lib/'
++ ['/usr/local/ssl/lib64',
++ '/usr/contrib/ssl/lib64/'
+ ] )
+
+ if (ssl_incs is not None and
diff --git a/python-3.2b2-no-static-lib.patch b/python-3.2b2-no-static-lib.patch
new file mode 100644
index 0000000..3ef3bc2
--- /dev/null
+++ b/python-3.2b2-no-static-lib.patch
@@ -0,0 +1,50 @@
+diff -up Python-3.2b2/Makefile.pre.in.no-static-lib Python-3.2b2/Makefile.pre.in
+--- Python-3.2b2/Makefile.pre.in.no-static-lib 2010-12-13 13:04:23.000000000 -0500
++++ Python-3.2b2/Makefile.pre.in 2010-12-28 16:57:11.484065804 -0500
+@@ -420,7 +420,7 @@ coverage:
+
+
+ # Build the interpreter
+-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
++$(BUILDPYTHON): Modules/python.o $(LDLIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS)
$(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+ platform: $(BUILDPYTHON)
+@@ -434,18 +434,6 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ esac
+
+-# Build static library
+-# avoid long command lines, same as LIBRARY_OBJS
+-$(LIBRARY): $(LIBRARY_OBJS)
+- -rm -f $@
+- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
+- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
+- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
+- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODOBJS)
+- $(RANLIB) $@
+-
+ libpython$(LDVERSION).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS)
$(LIBC) $(LIBM) $(LDLAST); \
+@@ -1035,18 +1023,6 @@ libainstall: all python-config
+ else true; \
+ fi; \
+ done
+- @if test -d $(LIBRARY); then :; else \
+- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+- if test "$(SO)" = .dll; then \
+- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
+- else \
+- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- fi; \
+- else \
+- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
+- fi; \
+- fi
+ $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
+ $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python-3.2b2-remove-mimeaudio-tests.patch
b/python-3.2b2-remove-mimeaudio-tests.patch
new file mode 100644
index 0000000..118b7b2
--- /dev/null
+++ b/python-3.2b2-remove-mimeaudio-tests.patch
@@ -0,0 +1,57 @@
+diff -up Python-3.2b2/Lib/email/test/test_email.py.remove-mimeaudio-tests
Python-3.2b2/Lib/email/test/test_email.py
+--- Python-3.2b2/Lib/email/test/test_email.py.remove-mimeaudio-tests 2010-12-18
13:25:38.000000000 -0500
++++ Python-3.2b2/Lib/email/test/test_email.py 2010-12-28 16:50:34.910309105 -0500
+@@ -977,53 +977,6 @@ Blah blah blah
+
+
+
+-# Test the basic MIMEAudio class
+-class TestMIMEAudio(unittest.TestCase):
+- def setUp(self):
+- # Make sure we pick up the audiotest.au that lives in email/test/data.
+- # In Python, there's an audiotest.au living in Lib/test but that isn't
+- # included in some binary distros that don't include the test
+- # package. The trailing empty string on the .join() is significant
+- # since findfile() will do a dirname().
+- datadir = os.path.join(os.path.dirname(landmark), 'data', '')
+- with open(findfile('audiotest.au', datadir), 'rb') as fp:
+- self._audiodata = fp.read()
+- self._au = MIMEAudio(self._audiodata)
+-
+- def test_guess_minor_type(self):
+- self.assertEqual(self._au.get_content_type(), 'audio/basic')
+-
+- def test_encoding(self):
+- payload = self._au.get_payload()
+- self.assertEqual(base64.decodebytes(bytes(payload, 'ascii')),
+- self._audiodata)
+-
+- def test_checkSetMinor(self):
+- au = MIMEAudio(self._audiodata, 'fish')
+- self.assertEqual(au.get_content_type(), 'audio/fish')
+-
+- def test_add_header(self):
+- eq = self.assertEqual
+- unless = self.assertTrue
+- self._au.add_header('Content-Disposition', 'attachment',
+- filename='audiotest.au')
+- eq(self._au['content-disposition'],
+- 'attachment; filename="audiotest.au"')
+- eq(self._au.get_params(header='content-disposition'),
+- [('attachment', ''), ('filename',
'audiotest.au')])
+- eq(self._au.get_param('filename',
header='content-disposition'),
+- 'audiotest.au')
+- missing = []
+- eq(self._au.get_param('attachment',
header='content-disposition'), '')
+- unless(self._au.get_param('foo', failobj=missing,
+- header='content-disposition') is missing)
+- # Try some missing stuff
+- unless(self._au.get_param('foobar', missing) is missing)
+- unless(self._au.get_param('attachment', missing,
+- header='foobar') is missing)
+-
+-
+-
+ # Test the basic MIMEImage class
+ class TestMIMEImage(unittest.TestCase):
+ def setUp(self):
diff --git a/python-3.2b2-systemtap.patch b/python-3.2b2-systemtap.patch
new file mode 100644
index 0000000..f87fc60
--- /dev/null
+++ b/python-3.2b2-systemtap.patch
@@ -0,0 +1,214 @@
+diff -up Python-3.2b2/configure.in.systemtap Python-3.2b2/configure.in
+--- Python-3.2b2/configure.in.systemtap 2010-12-13 02:59:39.000000000 -0500
++++ Python-3.2b2/configure.in 2010-12-28 17:01:58.044059433 -0500
+@@ -2470,6 +2470,38 @@ if test "$with_valgrind" != no; then
+ OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
+ fi
+
++# Check for dtrace support
++AC_MSG_CHECKING(for --with-dtrace)
++AC_ARG_WITH(dtrace,
++ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
++
++if test ! -z "$with_dtrace"
++then
++ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Sun"
++ DTRACEOBJS="Python/dtrace.o"
++ DTRADEHDRS=""
++ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Apple"
++ DTRACEOBJS=""
++ DTRADEHDRS="pydtrace.h"
++ else
++ with_dtrace="no"
++ fi
++else
++ with_dtrace="no"
++fi
++
++AC_MSG_RESULT($with_dtrace)
++AC_SUBST(DTRACEOBJS)
++AC_SUBST(DTRACEHDRS)
++
+ # -I${DLINCLDIR} is added to the compile rule for importdl.o
+ AC_SUBST(DLINCLDIR)
+ DLINCLDIR=.
+diff -up Python-3.2b2/Include/pydtrace.d.systemtap Python-3.2b2/Include/pydtrace.d
+--- Python-3.2b2/Include/pydtrace.d.systemtap 2010-12-28 16:58:41.762936379 -0500
++++ Python-3.2b2/Include/pydtrace.d 2010-12-28 16:58:41.762936379 -0500
+@@ -0,0 +1,10 @@
++provider python {
++ probe function__entry(const char *, const char *, int);
++ probe function__return(const char *, const char *, int);
++};
++
++#pragma D attributes Evolving/Evolving/Common provider python provider
++#pragma D attributes Private/Private/Common provider python module
++#pragma D attributes Private/Private/Common provider python function
++#pragma D attributes Evolving/Evolving/Common provider python name
++#pragma D attributes Evolving/Evolving/Common provider python args
+diff -up Python-3.2b2/Makefile.pre.in.systemtap Python-3.2b2/Makefile.pre.in
+--- Python-3.2b2/Makefile.pre.in.systemtap 2010-12-28 16:58:41.000000000 -0500
++++ Python-3.2b2/Makefile.pre.in 2010-12-28 17:00:58.607310089 -0500
+@@ -328,6 +328,7 @@ PYTHON_OBJS= \
+ Python/formatter_unicode.o \
+ Python/fileutils.o \
+ Python/$(DYNLOADFILE) \
++ @DTRACEOBJS@ \
+ $(LIBOBJS) \
+ $(MACHDEP_OBJS) \
+ $(THREADOBJ)
+@@ -632,6 +633,18 @@ Objects/typeobject.o: $(srcdir)/Objects/
+ $(srcdir)/Objects/typeslots.inc: $(srcdir)/Include/typeslots.h
$(srcdir)/Objects/typeslots.py
+ $(PYTHON) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h >
$(srcdir)/Objects/typeslots.inc
+
++# Only needed with --with-dtrace
++buildinclude:
++ mkdir -p Include
++
++Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
++ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
++
++Python/ceval.o: Include/pydtrace.h
++
++Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
++ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
++
+ ############################################################################
+ # Header files
+
+@@ -1282,7 +1295,7 @@ Python/thread.o: @THREADHEADERS@
+ .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
+ .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
+ .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
+-.PHONY: smelly funny patchcheck
++.PHONY: smelly funny patchcheck buildinclude
+ .PHONY: gdbhooks
+
+ # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
+diff -up Python-3.2b2/pyconfig.h.in.systemtap Python-3.2b2/pyconfig.h.in
+--- Python-3.2b2/pyconfig.h.in.systemtap 2010-11-20 05:29:12.000000000 -0500
++++ Python-3.2b2/pyconfig.h.in 2010-12-28 16:58:41.765937360 -0500
+@@ -1092,6 +1092,9 @@
+ /* Define if you want documentation strings in extension modules */
+ #undef WITH_DOC_STRINGS
+
++/* Define if you want to compile in Dtrace support */
++#undef WITH_DTRACE
++
+ /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
+ linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
+ Dyld is necessary to support frameworks. */
+diff -up Python-3.2b2/Python/ceval.c.systemtap Python-3.2b2/Python/ceval.c
+--- Python-3.2b2/Python/ceval.c.systemtap 2010-12-03 15:14:31.000000000 -0500
++++ Python-3.2b2/Python/ceval.c 2010-12-28 16:58:41.768935588 -0500
+@@ -18,6 +18,10 @@
+
+ #include <ctype.h>
+
++#ifdef WITH_DTRACE
++#include "pydtrace.h"
++#endif
++
+ #ifndef WITH_TSC
+
+ #define READ_TIMESTAMP(var)
+@@ -766,6 +770,70 @@ PyEval_EvalCode(PyObject *co, PyObject *
+ }
+
+
++#ifdef WITH_DTRACE
++struct frame_marker_info
++{
++ char *filename;
++ char *name;
++ int lineno;
++
++ PyObject *utf8_filename;
++ PyObject *utf8_name;
++};
++
++static void
++get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
++{
++ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
++ if (fmi->utf8_filename) {
++ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
++ } else {
++ fmi->filename = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
++ if (fmi->utf8_name) {
++ fmi->name = PyBytes_AsString(fmi->utf8_name);
++ } else {
++ fmi->name = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
++}
++
++static void
++release_frame_marker_info(struct frame_marker_info *fmi)
++{
++ Py_XDECREF(fmi->utf8_filename);
++ Py_XDECREF(fmi->utf8_name);
++}
++
++static void
++dtrace_entry(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++
++static void
++dtrace_return(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++#else
++#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
++#define PYTHON_FUNCTION_RETURN_ENABLED() 0
++#define dtrace_entry(f)
++#define dtrace_return(f)
++#endif
++
+ /* Interpreter main loop */
+
+ PyObject *
+@@ -1183,6 +1251,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
+ }
+ }
+
++ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
++ dtrace_entry(f);
++ }
++
+ co = f->f_code;
+ names = co->co_names;
+ consts = co->co_consts;
+@@ -3048,6 +3120,9 @@ fast_yield:
+
+ /* pop frame */
+ exit_eval_frame:
++ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
++ dtrace_return(f);
++ }
+ Py_LeaveRecursiveCall();
+ tstate->frame = f->f_back;
+
diff --git a/python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
b/python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
new file mode 100644
index 0000000..6ed7801
--- /dev/null
+++ b/python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
@@ -0,0 +1,17 @@
+diff -up Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix
Python-3.2b2/Lib/test/test_weakref.py
+--- Python-3.2b2/Lib/test/test_weakref.py.test-weakref-COUNT_ALLOCS_fix 2010-12-28
20:33:46.963364990 -0500
++++ Python-3.2b2/Lib/test/test_weakref.py 2010-12-28 20:35:44.115935248 -0500
+@@ -583,9 +583,10 @@ class ReferencesTestCase(TestBase):
+ # been cleared without their callbacks executing. OTOH, the weakref
+ # to C is bound to a function local (wr), and wasn't trash, so that
+ # callback should have been invoked when C went away.
+- self.assertEqual(alist, ["C went away"])
+- # The remaining weakref should be dead now (its callback ran).
+- self.assertEqual(wr(), None)
++ if not hasattr(sys, 'getcounts'):
++ self.assertEqual(alist, ["C went away"])
++ # The remaining weakref should be dead now (its callback ran).
++ self.assertEqual(wr(), None)
+
+ del alist[:]
+ gc.collect()
diff --git a/python-3.2b2-test_sys-COUNT_ALLOCS.patch
b/python-3.2b2-test_sys-COUNT_ALLOCS.patch
new file mode 100644
index 0000000..c1871ac
--- /dev/null
+++ b/python-3.2b2-test_sys-COUNT_ALLOCS.patch
@@ -0,0 +1,13 @@
+diff -up Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS
Python-3.2b2/Lib/test/test_sys.py
+--- Python-3.2b2/Lib/test/test_sys.py.fix-test-sys-COUNT_ALLOCS 2010-12-28
20:52:43.236310184 -0500
++++ Python-3.2b2/Lib/test/test_sys.py 2010-12-28 20:58:09.164184094 -0500
+@@ -817,6 +817,9 @@ class SizeofTest(unittest.TestCase):
+ # (PyTypeObject + PyNumberMethods + PyMappingMethods +
+ # PySequenceMethods + PyBufferProcs)
+ s = size(vh + 'P2P15Pl4PP9PP11PI') + size('16Pi17P 3P 10P 2P
2P')
++ # COUNT_ALLOCS adds a further 3 Py_ssize_t and 2 pointers:
++ if hasattr(sys, 'getcounts'):
++ s += size('3P2P')
+ check(int, s)
+ # class
+ class newstyleclass(object): pass
diff --git a/python3.spec b/python3.spec
index ec10905..985bdb2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1,9 +1,27 @@
%global pybasever 3.2
-%global alphatag a1
+
+# pybasever without the dot:
+%global pyshortver 32
+
+%global alphatag b2
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
+# SOABI is defined in the upstream configure.in from Python-3.2a2 onwards,
+# for PEP 3149:
+#
http://www.python.org/dev/peps/pep-3149/
+
+# ABIFLAGS, LDVERSION and SOABI are in the upstream Makefile
+%global ABIFLAGS_optimized mu
+%global ABIFLAGS_debug dmu
+
+%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
+%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
+
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}
+
# All bytecode files are now in a __pycache__ subdirectory, with a name
# reflecting the version of the bytecode (to permit sharing of python libraries
# between different runtimes)
@@ -23,8 +41,8 @@
# (if these get out of sync, the payload of the libs subpackage will fail
# and halt the build)
%global py_SOVERSION 1.0
-%global py_INSTSONAME_optimized libpython%{pybasever}.so.%{py_SOVERSION}
-%global py_INSTSONAME_debug libpython%{pybasever}_d.so.%{py_SOVERSION}
+%global py_INSTSONAME_optimized libpython%{LDVERSION_optimized}.so.%{py_SOVERSION}
+%global py_INSTSONAME_debug libpython%{LDVERSION_debug}.so.%{py_SOVERSION}
%global with_debug_build 1
@@ -149,91 +167,20 @@ Patch1: Python-3.1.1-rpath.patch
# The four TestMIMEAudio tests fail due to "audiotest.au" not being packaged.
# It's simplest to remove them:
-Patch3: python-3.2a1-remove-mimeaudio-tests.patch
-
-# ImportTests.test_issue1267 in test_imp.py reads pydoc.py's shebang line and
-# checks that it read it correctly.
-#
-# Since we modify the shebang lines in our packaging, we also need to modify
-# the expected value in this test:
-Patch4: python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
+Patch3: python-3.2b2-remove-mimeaudio-tests.patch
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
# a libpythonMAJOR.MINOR.a (bug 550692):
-Patch6: python-3.2a1-no-static-lib.patch
+Patch6: python-3.2b2-no-static-lib.patch
# Systemtap support: add statically-defined probe points
# Patch based on upstream bug:
http://bugs.python.org/issue4111
# fixed up by mjw and wcohen for 2.6.2, then fixed up by dmalcolm for 2.6.4
# then rewritten by mjw (attachment 390110 of rhbz 545179); ported to 3.1.1 by
# dmalcolm
-Patch8: python-3.2a1-systemtap.patch
+Patch8: python-3.2b2-systemtap.patch
-Patch102: python-3.2a1-lib64.patch
-
-# Patch to support building both optimized vs debug stacks DSO ABIs, sharing
-# the same .py and .pyc files, using "_d.so" to signify a debug build of an
-# extension module.
-#
-# Based on Debian's patch for the same,
-#
http://patch-tracker.debian.org/patch/series/view/python2.6/2.6.5-2/debug...
-#
-# (which was itself based on the upstream Windows build), but with some
-# changes:
-#
-# * Debian's patch to dynload_shlib.c looks for module_d.so, then module.so,
-# but this can potentially find a module built against the wrong DSO ABI. We
-# instead search for just module_d.so in a debug build
-#
-# * We remove this change from configure.in's build of the Makefile:
-# SO=$DEBUG_EXT.so
-# so that sysconfig.py:customize_compiler stays with shared_lib_extension='.so'
-# on debug builds, so that UnixCCompiler.find_library_file can find system
-# libraries (otherwise "make sharedlibs" fails to find system libraries,
-# erroneously looking e.g. for "libffi_d.so" rather than
"libffi.so")
-#
-# * We change Lib/distutils/command/build_ext.py:build_ext.get_ext_filename
-# to add the _d there, when building an extension. This way, "make
sharedlibs"
-# can build ctypes, by finding the sysmtem libffi.so (rather than failing to
-# find "libffi_d.so"), and builds the module as _ctypes_d.so
-#
-# * Similarly, update build_ext:get_libraries handling of Py_ENABLE_SHARED by
-# appending "_d" to the python library's name for the debug configuration
-#
-# * We modify Modules/makesetup to add the "_d" to the generated Makefile
-# rules for the various Modules/*.so targets
-#
-# This may introduce issues when building an extension that links directly
-# against another extension (e.g. users of NumPy?), but seems more robust when
-# searching for external libraries
-#
-# * We don't change Lib/distutils/command/build.py: build.build_purelib to
-# embed plat_specifier, leaving it as is, as pure python builds should be
-# unaffected by these differences (we'll be sharing the .py and .pyc files)
-#
-# * We introduce DEBUG_SUFFIX as well as DEBUG_EXT:
-# - DEBUG_EXT is used by ELF files (names and SONAMEs); it will be "_d"
for
-# a debug build
-# - DEBUG_SUFFIX is used by filesystem paths; it will be "-debug" for a
-# debug build
-#
-# Both will be empty in an optimized build. "_d" contains characters that
-# are valid ELF metadata, but this leads to various ugly filesystem paths (such
-# as the include path), and DEBUG_SUFFIX allows these paths to have more natural
-# names. Changing this requires changes elsewhere in the distutils code.
-#
-# * We add DEBUG_SUFFIX to PYTHON in the Makefile, so that the two
-# configurations build parallel-installable binaries with different names
-# ("python-debug" vs "python").
-#
-# * Similarly, we add DEBUG_SUFFIX within python-config and
-# python$(VERSION)-config, so that the two configuration get different paths
-# for these.
-#
-# * Patch runtests.sh to support supplying a value for PYTHON, so that we can
-# run the tests against each of the builds
-
-Patch103: python-3.2a1-debug-build.patch
+Patch102: python-3.2b2-lib64.patch
# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
@@ -245,17 +192,6 @@ Patch104: python-3.1.2-more-configuration-flags.patch
# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
Patch105: python-3.2a1-statvfs-f_flag-constants.patch
-# Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
-# a segfault running test_pyexpat.py (rhbz:610312)
-# Sent upstream as
http://bugs.python.org/issue9054
-Patch110: python-3.1.2-fix-expat-issue9054.patch
-
-# Fix race condition in parallel make that could lead to graminit.c failing
-# to compile, or linker errors with "undefined reference to
-# `_PyParser_Grammar'":
-# Not yet sent upstream:
-Patch111: python-3.2a1-fix-parallel-make.patch
-
# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
# emitting debug info to stdout on exit is too verbose and makes it harder to
# use the debug build. Add a "PYTHONDUMPCOUNTS" environment variable which
@@ -263,6 +199,20 @@ Patch111: python-3.2a1-fix-parallel-make.patch
# Not yet sent upstream:
Patch125: less-verbose-COUNT_ALLOCS.patch
+# test_weakref's test_callback_in_cycle_resurrection doesn't work with
+# COUNT_ALLOCS, as the metrics keep "C" alive. Work around this for our
+# debug build:
+# Not yet sent upstream
+Patch126: python-3.2b2-test-weakref-COUNT_ALLOCS_fix.patch
+
+# Similar COUNT_ALLOCS fixes for test_gc
+# Not yet sent upstream
+Patch127: python-3.2b2-fix-test-gc-COUNT_ALLOCS.patch
+
+# Similar COUNT_ALLOCS fixes for test_sys
+# Not yet sent upstream
+Patch128: python-3.2b2-test_sys-COUNT_ALLOCS.patch
+
# This is the generated patch to "configure"; see the description of
# %{regenerate_autotooling_patch}
# above:
@@ -408,7 +358,6 @@ rm -r Modules/zlib || exit 1
#
%patch1 -p1
%patch3 -p1 -b .remove-mimeaudio-tests
-%patch4 -p1 -b .apply-our-changes-to-expected-shebang
%patch6 -p1 -b .no-static-lib
%if 0%{?with_systemtap}
@@ -419,17 +368,14 @@ rm -r Modules/zlib || exit 1
%patch102 -p1
%endif
-%patch103 -p1
-
%patch104 -p1 -b .more-configuration-flags
%patch105 -p1 -b .statvfs-f-flag-constants
-%patch110 -p0 -b .fix-expat-issue9054
-
-%patch111 -p1 -b .parallel-grammar
-
%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
+%patch126 -p1
+%patch127 -p1
+%patch128 -p1
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -632,10 +578,21 @@ install -d -m 0755
%{buildroot}/usr/lib/python%{pybasever}/site-packages/__pycac
%global _pyconfig_h %{_pyconfig32_h}
%endif
+# ABIFLAGS, LDVERSION and SOABI are in the upstream Makefile
+%global ABIFLAGS_optimized mu
+%global ABIFLAGS_debug dmu
+
+%global LDVERSION_optimized %{pybasever}%{ABIFLAGS_optimized}
+%global LDVERSION_debug %{pybasever}%{ABIFLAGS_debug}
+
+%global SOABI_optimized cpython-%{pyshortver}%{ABIFLAGS_optimized}
+%global SOABI_debug cpython-%{pyshortver}%{ABIFLAGS_debug}
+
%if 0%{?with_debug_build}
-%global PyIncludeDirs python%{pybasever} python%{pybasever}-debug
+%global PyIncludeDirs python%{LDVERSION_optimized} python%{LDVERSION_debug}
+
%else
-%global PyIncludeDirs python%{pybasever}
+%global PyIncludeDirs python%{LDVERSION_optimized}
%endif
for PyIncludeDir in %{PyIncludeDirs} ; do
@@ -739,14 +696,14 @@ ldd %{buildroot}/%{dynload_dir}/_curses*.so \
# likewise for the optimized modules and libpython:
for Module in %{buildroot}/%{dynload_dir}/*.so ; do
case $Module in
- *_d.so)
+ *.%{SOABI_debug})
ldd $Module | grep %{py_INSTSONAME_optimized} &&
- (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exi 1)
+ (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exit 1)
;;
- *)
+ *.%{SOABI_optimized})
ldd $Module | grep %{py_INSTSONAME_debug} &&
- (echo Optimized module $Module linked against debug
%{py_INSTSONAME_optimized} ; exi 1)
+ (echo Optimized module $Module linked against debug %{py_INSTSONAME_debug} ;
exit 1)
;;
esac
done
@@ -784,59 +741,30 @@ sed \
topdir=$(pwd)
CheckPython() {
ConfName=$1
- ConfDir=build/$ConfName
+ ConfDir=$(pwd)/build/$ConfName
echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
-# Run the upstream test suite, using the "runtests.sh" harness from the
upstream
-# tarball.
-# I'm seeing occasional hangs in some http tests when running the test suite
-# inside Koji. For that reason I exclude them
-
-LD_LIBRARY_PATH=$ConfDir PYTHON=$ConfDir/python $topdir/runtests.sh -x test_httplib
test_http_cookies
+# Run the upstream test suite
+LD_LIBRARY_PATH=$ConfDir $ConfDir/python -m test.regrtest -x test_distutils test_httplib
test_http_cookies test_socket test_telnet
# Note that we're running the tests using the version of the code in the builddir,
# not in the buildroot.
-# The harness only emits the names of the test scripts it ran, along with a
-# summary of the form:
-# 2 BAD
-# 313 GOOD
-# 22 SKIPPED
-# 337 total
-# As a byproduct it writes files "GOOD", "BAD", "SKIPPED",
listing names of
-# files (e.g. "test_imp") along with a subdirectory OUT containing files of
the
-# form $TEST.out
-# Each such logfile starts with a line indicating the name of the test
-
-# Output the logs from failing tests, so that they are captured in the rpmbuild
-# log:
-for TESTNAME in $(cat BAD); do
- cat OUT/$TESTNAME.out ;
-done
-
-# There are 5 expected BAD results here:
+# I'm seeing occasional hangs in some http tests when running the test suite
+# inside Koji. For that reason I exclude them
+#
+# Other known failures:
#
# (1) test_distutils.py: tries to build an RPM inside the rpmbuild; I'll simply
# let this one fail for now (has trouble linking against -lpython3.1; perhaps
# LD_LIBRARY_PATH is being discarded somewhere?)
#
-# (2) test_imp.py: ImportTests.test_issue1267 in test_imp.py reads pydoc.py's
-# shebang line and checks that it read it correctly.tests that the shebang line
-# is as expected. Unfortunately if we patch this up in the buildir (in the
-# build phase), then the "make install" will try to reference
-# /usr/bin/python%{pybasever} which won't exist on a clean build environment.
-# So we fix up the shebang lines after this in the install phase, and expect
-# this test to fail in the check phase. It ought to pass when run on the built
-# RPMs
-#
-# (3) test_socket.py:testSockName can fail here if DNS isn't properly set up:
+# (2) test_socket.py:testSockName can fail here if DNS isn't properly set up:
# my_ip_addr = socket.gethostbyname(socket.gethostname())
# socket.gaierror: [Errno -2] Name or service not known
#
-# (4) test_subprocess: merely get "errors occurred"
-#
-# (5) test_telnet: can get a "socket.error: [Errno 104] Connection reset by
peer"
+# (3) test_telnet: can get a "socket.error: [Errno 104] Connection reset by
peer"
#
# Some additional tests fail when running the test suite as non-root outside of
# the build, due to permissions issues.
@@ -865,6 +793,7 @@ rm -fr %{buildroot}
%{_bindir}/pydoc*
%{_bindir}/python3
%{_bindir}/python%{pybasever}
+%{_bindir}/python%{pybasever}mu
%{_mandir}/*/*
%files libs
@@ -873,61 +802,59 @@ rm -fr %{buildroot}
%dir %{pylibdir}
%dir %{dynload_dir}
%{dynload_dir}/Python-%{version}%{alphatag}-py%{pybasever}.egg-info
-%{dynload_dir}/_bisect.so
-%{dynload_dir}/_codecs_cn.so
-%{dynload_dir}/_codecs_hk.so
-%{dynload_dir}/_codecs_iso2022.so
-%{dynload_dir}/_codecs_jp.so
-%{dynload_dir}/_codecs_kr.so
-%{dynload_dir}/_codecs_tw.so
-%{dynload_dir}/_collections.so
-%{dynload_dir}/_csv.so
-%{dynload_dir}/_ctypes.so
-%{dynload_dir}/_curses.so
-%{dynload_dir}/_curses_panel.so
-%{dynload_dir}/_dbm.so
-%{dynload_dir}/_elementtree.so
-%{dynload_dir}/_gdbm.so
-%{dynload_dir}/_hashlib.so
-%{dynload_dir}/_heapq.so
-%{dynload_dir}/_json.so
-%{dynload_dir}/_lsprof.so
-%{dynload_dir}/_multibytecodec.so
-%{dynload_dir}/_multiprocessing.so
-%{dynload_dir}/_pickle.so
-%{dynload_dir}/_posixsubprocess.so
-%{dynload_dir}/_random.so
-%{dynload_dir}/_socket.so
-%{dynload_dir}/_sqlite3.so
-%{dynload_dir}/_ssl.so
-%{dynload_dir}/_struct.so
-%{dynload_dir}/array.so
-%{dynload_dir}/atexit.so
-%{dynload_dir}/audioop.so
-%{dynload_dir}/binascii.so
-%{dynload_dir}/bz2.so
-%{dynload_dir}/cmath.so
-%{dynload_dir}/crypt.so
-%{dynload_dir}/_datetime.so
-%{dynload_dir}/fcntl.so
-%{dynload_dir}/grp.so
-%{dynload_dir}/itertools.so
-%{dynload_dir}/math.so
-%{dynload_dir}/mmap.so
-%{dynload_dir}/nis.so
-%{dynload_dir}/operator.so
-%{dynload_dir}/ossaudiodev.so
-%{dynload_dir}/parser.so
-%{dynload_dir}/pyexpat.so
-%{dynload_dir}/readline.so
-%{dynload_dir}/resource.so
-%{dynload_dir}/select.so
-%{dynload_dir}/spwd.so
-%{dynload_dir}/syslog.so
-%{dynload_dir}/termios.so
-%{dynload_dir}/time.so
-%{dynload_dir}/unicodedata.so
-%{dynload_dir}/zlib.so
+%{dynload_dir}/_bisect.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_optimized}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_optimized}.so
+%{dynload_dir}/_csv.%{SOABI_optimized}.so
+%{dynload_dir}/_ctypes.%{SOABI_optimized}.so
+%{dynload_dir}/_curses.%{SOABI_optimized}.so
+%{dynload_dir}/_curses_panel.%{SOABI_optimized}.so
+%{dynload_dir}/_dbm.%{SOABI_optimized}.so
+%{dynload_dir}/_elementtree.%{SOABI_optimized}.so
+%{dynload_dir}/_gdbm.%{SOABI_optimized}.so
+%{dynload_dir}/_hashlib.%{SOABI_optimized}.so
+%{dynload_dir}/_heapq.%{SOABI_optimized}.so
+%{dynload_dir}/_json.%{SOABI_optimized}.so
+%{dynload_dir}/_lsprof.%{SOABI_optimized}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_optimized}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_optimized}.so
+%{dynload_dir}/_pickle.%{SOABI_optimized}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_optimized}.so
+%{dynload_dir}/_random.%{SOABI_optimized}.so
+%{dynload_dir}/_socket.%{SOABI_optimized}.so
+%{dynload_dir}/_sqlite3.%{SOABI_optimized}.so
+%{dynload_dir}/_ssl.%{SOABI_optimized}.so
+%{dynload_dir}/_struct.%{SOABI_optimized}.so
+%{dynload_dir}/array.%{SOABI_optimized}.so
+%{dynload_dir}/atexit.%{SOABI_optimized}.so
+%{dynload_dir}/audioop.%{SOABI_optimized}.so
+%{dynload_dir}/binascii.%{SOABI_optimized}.so
+%{dynload_dir}/bz2.%{SOABI_optimized}.so
+%{dynload_dir}/cmath.%{SOABI_optimized}.so
+%{dynload_dir}/crypt.%{SOABI_optimized}.so
+%{dynload_dir}/_datetime.%{SOABI_optimized}.so
+%{dynload_dir}/fcntl.%{SOABI_optimized}.so
+%{dynload_dir}/grp.%{SOABI_optimized}.so
+%{dynload_dir}/math.%{SOABI_optimized}.so
+%{dynload_dir}/mmap.%{SOABI_optimized}.so
+%{dynload_dir}/nis.%{SOABI_optimized}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
+%{dynload_dir}/parser.%{SOABI_optimized}.so
+%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
+%{dynload_dir}/readline.%{SOABI_optimized}.so
+%{dynload_dir}/resource.%{SOABI_optimized}.so
+%{dynload_dir}/select.%{SOABI_optimized}.so
+%{dynload_dir}/spwd.%{SOABI_optimized}.so
+%{dynload_dir}/syslog.%{SOABI_optimized}.so
+%{dynload_dir}/termios.%{SOABI_optimized}.so
+%{dynload_dir}/time.%{SOABI_optimized}.so
+%{dynload_dir}/unicodedata.%{SOABI_optimized}.so
+%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
+%{dynload_dir}/zlib.%{SOABI_optimized}.so
%dir %{pylibdir}/site-packages/
%dir %{pylibdir}/site-packages/__pycache__/
@@ -936,63 +863,90 @@ rm -fr %{buildroot}
%dir %{pylibdir}/__pycache__/
%{pylibdir}/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/wsgiref.egg-info
-%dir %{pylibdir}/ctypes
+
+%dir %{pylibdir}/concurrent/
+%dir %{pylibdir}/concurrent/__pycache__/
+%{pylibdir}/concurrent/*.py
+%{pylibdir}/concurrent/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/concurrent/futures/
+%dir %{pylibdir}/concurrent/futures/__pycache__/
+%{pylibdir}/concurrent/futures/*.py
+%{pylibdir}/concurrent/futures/__pycache__/*%{bytecode_suffixes}
+
+%dir %{pylibdir}/ctypes/
%dir %{pylibdir}/ctypes/__pycache__/
%{pylibdir}/ctypes/*.py
%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/ctypes/macholib
+
%{pylibdir}/curses
-%dir %{pylibdir}/dbm
+
+%dir %{pylibdir}/dbm/
%dir %{pylibdir}/dbm/__pycache__/
%{pylibdir}/dbm/*.py
%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/distutils
+
+%dir %{pylibdir}/distutils/
%dir %{pylibdir}/distutils/__pycache__/
%{pylibdir}/distutils/*.py
%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/distutils/README
%{pylibdir}/distutils/command
-%dir %{pylibdir}/email
+
+%dir %{pylibdir}/email/
%dir %{pylibdir}/email/__pycache__/
%{pylibdir}/email/*.py
%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/email/mime
+
%{pylibdir}/encodings
%{pylibdir}/html
%{pylibdir}/http
%{pylibdir}/idlelib
-%dir %{pylibdir}/importlib
+
+%dir %{pylibdir}/importlib/
%dir %{pylibdir}/importlib/__pycache__/
%{pylibdir}/importlib/*.py
%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/json
+
+%dir %{pylibdir}/json/
%dir %{pylibdir}/json/__pycache__/
%{pylibdir}/json/*.py
%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
+
%{pylibdir}/lib2to3
%exclude %{pylibdir}/lib2to3/tests
%{pylibdir}/logging
%{pylibdir}/multiprocessing
%{pylibdir}/plat-linux2
%{pylibdir}/pydoc_data
-%dir %{pylibdir}/sqlite3
+
+%dir %{pylibdir}/sqlite3/
%dir %{pylibdir}/sqlite3/__pycache__/
%{pylibdir}/sqlite3/*.py
%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
-%dir %{pylibdir}/test
+
+%dir %{pylibdir}/test/
%dir %{pylibdir}/test/__pycache__/
%{pylibdir}/test/__init__.py
%{pylibdir}/test/support.py
%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
%{pylibdir}/test/__pycache__/support%{bytecode_suffixes}
-%dir %{pylibdir}/unittest
+
+%exclude %{pylibdir}/turtle.py
+%exclude %{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+
+%dir %{pylibdir}/unittest/
%dir %{pylibdir}/unittest/__pycache__/
%{pylibdir}/unittest/*.py
%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
+
%{pylibdir}/urllib
%{pylibdir}/wsgiref
%{pylibdir}/xml
%{pylibdir}/xmlrpc
+
%if "%{_lib}" == "lib64"
%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
@@ -1002,10 +956,10 @@ rm -fr %{buildroot}
# "Makefile" and the config-32/64.h file are needed by
# distutils/sysconfig.py:_init_posix(), so we include them in the core
# package, along with their parent directories (bug 531901):
-%dir %{pylibdir}/config
-%{pylibdir}/config/Makefile
-%dir %{_includedir}/python%{pybasever}
-%{_includedir}/python%{pybasever}/%{_pyconfig_h}
+%dir %{pylibdir}/config-%{LDVERSION_optimized}/
+%{pylibdir}/config-%{LDVERSION_optimized}/Makefile
+%dir %{_includedir}/python%{LDVERSION_optimized}/
+%{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%{_libdir}/%{py_INSTSONAME_optimized}
%if 0%{?with_systemtap}
@@ -1015,14 +969,16 @@ rm -fr %{buildroot}
%files devel
%defattr(-,root,root)
-%{pylibdir}/config/*
-%exclude %{pylibdir}/config/Makefile
-/usr/include/python%{pybasever}/*.h
-%exclude /usr/include/python%{pybasever}/%{_pyconfig_h}
+%{pylibdir}/config-%{LDVERSION_optimized}/*
+%exclude %{pylibdir}/config-%{LDVERSION_optimized}/Makefile
+%{_includedir}/python%{LDVERSION_optimized}/*.h
+%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
%{_bindir}/python3-config
%{_bindir}/python%{pybasever}-config
-%{_libdir}/libpython%{pybasever}.so
+%{_bindir}/python%{LDVERSION_optimized}-config
+%{_libdir}/libpython%{LDVERSION_optimized}.so
+%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
%{_libdir}/pkgconfig/python-%{pybasever}.pc
%{_libdir}/pkgconfig/python3.pc
%config(noreplace) %{_sysconfdir}/rpm/macros.python3
@@ -1042,7 +998,15 @@ rm -fr %{buildroot}
%defattr(-,root,root,755)
%{pylibdir}/tkinter
%exclude %{pylibdir}/tkinter/test
-%{dynload_dir}/_tkinter.so
+%{dynload_dir}/_tkinter.%{SOABI_optimized}.so
+%{pylibdir}/turtle.py
+%{pylibdir}/__pycache__/turtle*%{bytecode_suffixes}
+%dir %{pylibdir}/turtledemo
+%{pylibdir}/turtledemo/*.py
+%{pylibdir}/turtledemo/*.txt
+%{pylibdir}/turtledemo/*.cfg
+%dir %{pylibdir}/turtledemo/__pycache__/
+%{pylibdir}/turtledemo/__pycache__/*%{bytecode_suffixes}
%files test
%defattr(-, root, root)
@@ -1050,11 +1014,10 @@ rm -fr %{buildroot}
%{pylibdir}/distutils/tests
%{pylibdir}/email/test
%{pylibdir}/importlib/test
-%{pylibdir}/json/tests
%{pylibdir}/sqlite3/test
%{pylibdir}/test
-%{dynload_dir}/_ctypes_test.so
-%{dynload_dir}/_testcapi.so
+%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
+%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
%{pylibdir}/lib2to3/tests
%doc %{pylibdir}/Demo/distutils
%doc %{pylibdir}/Demo/md5test
@@ -1073,70 +1036,66 @@ rm -fr %{buildroot}
%defattr(-,root,root,-)
# Analog of the core subpackage's files:
-%{_bindir}/python3-debug
-%{_bindir}/python%{pybasever}-debug
+%{_bindir}/python%{LDVERSION_debug}
# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
-%{dynload_dir}/_bisect_d.so
-%{dynload_dir}/_codecs_cn_d.so
-%{dynload_dir}/_codecs_hk_d.so
-%{dynload_dir}/_codecs_iso2022_d.so
-%{dynload_dir}/_codecs_jp_d.so
-%{dynload_dir}/_codecs_kr_d.so
-%{dynload_dir}/_codecs_tw_d.so
-%{dynload_dir}/_collections_d.so
-%{dynload_dir}/_csv_d.so
-%{dynload_dir}/_ctypes_d.so
-%{dynload_dir}/_curses_d.so
-%{dynload_dir}/_curses_panel_d.so
-%{dynload_dir}/_dbm_d.so
-%{dynload_dir}/_elementtree_d.so
-%{dynload_dir}/_gdbm_d.so
-%{dynload_dir}/_hashlib_d.so
-%{dynload_dir}/_heapq_d.so
-%{dynload_dir}/_json_d.so
-%{dynload_dir}/_lsprof_d.so
-%{dynload_dir}/_md5_d.so
-%{dynload_dir}/_multibytecodec_d.so
-%{dynload_dir}/_multiprocessing_d.so
-%{dynload_dir}/_pickle_d.so
-%{dynload_dir}/_posixsubprocess_d.so
-%{dynload_dir}/_random_d.so
-%{dynload_dir}/_sha1_d.so
-%{dynload_dir}/_sha256_d.so
-%{dynload_dir}/_sha512_d.so
-%{dynload_dir}/_socket_d.so
-%{dynload_dir}/_sqlite3_d.so
-%{dynload_dir}/_ssl_d.so
-%{dynload_dir}/_struct_d.so
-%{dynload_dir}/array_d.so
-%{dynload_dir}/atexit_d.so
-%{dynload_dir}/audioop_d.so
-%{dynload_dir}/binascii_d.so
-%{dynload_dir}/bz2_d.so
-%{dynload_dir}/cmath_d.so
-%{dynload_dir}/crypt_d.so
-%{dynload_dir}/_datetime_d.so
-%{dynload_dir}/fcntl_d.so
-%{dynload_dir}/grp_d.so
-%{dynload_dir}/itertools_d.so
-%{dynload_dir}/math_d.so
-%{dynload_dir}/mmap_d.so
-%{dynload_dir}/nis_d.so
-%{dynload_dir}/operator_d.so
-%{dynload_dir}/ossaudiodev_d.so
-%{dynload_dir}/parser_d.so
-%{dynload_dir}/pyexpat_d.so
-%{dynload_dir}/readline_d.so
-%{dynload_dir}/resource_d.so
-%{dynload_dir}/select_d.so
-%{dynload_dir}/spwd_d.so
-%{dynload_dir}/syslog_d.so
-%{dynload_dir}/termios_d.so
-%{dynload_dir}/time_d.so
-%{dynload_dir}/unicodedata_d.so
-%{dynload_dir}/zlib_d.so
+%{dynload_dir}/_bisect.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_cn.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_hk.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_iso2022.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_jp.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_kr.%{SOABI_debug}.so
+%{dynload_dir}/_codecs_tw.%{SOABI_debug}.so
+%{dynload_dir}/_csv.%{SOABI_debug}.so
+%{dynload_dir}/_ctypes.%{SOABI_debug}.so
+%{dynload_dir}/_curses.%{SOABI_debug}.so
+%{dynload_dir}/_curses_panel.%{SOABI_debug}.so
+%{dynload_dir}/_dbm.%{SOABI_debug}.so
+%{dynload_dir}/_elementtree.%{SOABI_debug}.so
+%{dynload_dir}/_gdbm.%{SOABI_debug}.so
+%{dynload_dir}/_hashlib.%{SOABI_debug}.so
+%{dynload_dir}/_heapq.%{SOABI_debug}.so
+%{dynload_dir}/_json.%{SOABI_debug}.so
+%{dynload_dir}/_lsprof.%{SOABI_debug}.so
+%{dynload_dir}/_md5.%{SOABI_debug}.so
+%{dynload_dir}/_multibytecodec.%{SOABI_debug}.so
+%{dynload_dir}/_multiprocessing.%{SOABI_debug}.so
+%{dynload_dir}/_pickle.%{SOABI_debug}.so
+%{dynload_dir}/_posixsubprocess.%{SOABI_debug}.so
+%{dynload_dir}/_random.%{SOABI_debug}.so
+%{dynload_dir}/_sha1.%{SOABI_debug}.so
+%{dynload_dir}/_sha256.%{SOABI_debug}.so
+%{dynload_dir}/_sha512.%{SOABI_debug}.so
+%{dynload_dir}/_socket.%{SOABI_debug}.so
+%{dynload_dir}/_sqlite3.%{SOABI_debug}.so
+%{dynload_dir}/_ssl.%{SOABI_debug}.so
+%{dynload_dir}/_struct.%{SOABI_debug}.so
+%{dynload_dir}/array.%{SOABI_debug}.so
+%{dynload_dir}/atexit.%{SOABI_debug}.so
+%{dynload_dir}/audioop.%{SOABI_debug}.so
+%{dynload_dir}/binascii.%{SOABI_debug}.so
+%{dynload_dir}/bz2.%{SOABI_debug}.so
+%{dynload_dir}/cmath.%{SOABI_debug}.so
+%{dynload_dir}/crypt.%{SOABI_debug}.so
+%{dynload_dir}/_datetime.%{SOABI_debug}.so
+%{dynload_dir}/fcntl.%{SOABI_debug}.so
+%{dynload_dir}/grp.%{SOABI_debug}.so
+%{dynload_dir}/math.%{SOABI_debug}.so
+%{dynload_dir}/mmap.%{SOABI_debug}.so
+%{dynload_dir}/nis.%{SOABI_debug}.so
+%{dynload_dir}/ossaudiodev.%{SOABI_debug}.so
+%{dynload_dir}/parser.%{SOABI_debug}.so
+%{dynload_dir}/pyexpat.%{SOABI_debug}.so
+%{dynload_dir}/readline.%{SOABI_debug}.so
+%{dynload_dir}/resource.%{SOABI_debug}.so
+%{dynload_dir}/select.%{SOABI_debug}.so
+%{dynload_dir}/spwd.%{SOABI_debug}.so
+%{dynload_dir}/syslog.%{SOABI_debug}.so
+%{dynload_dir}/termios.%{SOABI_debug}.so
+%{dynload_dir}/time.%{SOABI_debug}.so
+%{dynload_dir}/unicodedata.%{SOABI_debug}.so
+%{dynload_dir}/zlib.%{SOABI_debug}.so
# No need to split things out the "Makefile" and the config-32/64.h file as we
# do for the regular build above (bug 531901), since they're all in one package
@@ -1148,25 +1107,22 @@ rm -fr %{buildroot}
%endif
# Analog of the -devel subpackage's files:
-%dir %{pylibdir}/config-debug
-%{pylibdir}/config-debug/*
-%{_includedir}/python%{pybasever}-debug/*.h
-%{_bindir}/python3-debug-config
-%{_bindir}/python%{pybasever}-debug-config
-%{_libdir}/libpython%{pybasever}_d.so
-%{_libdir}/pkgconfig/python-%{pybasever}-debug.pc
-%{_libdir}/pkgconfig/python3-debug.pc
+%{pylibdir}/config-%{LDVERSION_debug}
+%{_includedir}/python%{LDVERSION_debug}
+%{_bindir}/python%{LDVERSION_debug}-config
+%{_libdir}/libpython%{LDVERSION_debug}.so
+%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
# Analog of the -tools subpackage's files:
# None for now; we could build precanned versions that have the appropriate
# shebang if needed
# Analog of the tkinter subpackage's files:
-%{dynload_dir}/_tkinter_d.so
+%{dynload_dir}/_tkinter.%{SOABI_debug}.so
# Analog of the -test subpackage's files:
-%{dynload_dir}/_ctypes_test_d.so
-%{dynload_dir}/_testcapi_d.so
+%{dynload_dir}/_ctypes_test.%{SOABI_debug}.so
+%{dynload_dir}/_testcapi.%{SOABI_debug}.so
%endif # with_debug_build
@@ -1185,6 +1141,25 @@ rm -fr %{buildroot}
%changelog
+* Tue Dec 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.b2
+- 3.2b2
+- rework patch 3 (removal of mimeaudio tests), patch 6 (no static libs),
+patch 8 (systemtap), patch 102 (lib64)
+- remove patch 4 (rendered redundant by upstream r85537), patch 103 (PEP 3149),
+patch 110 (upstreamed expat fix), patch 111 (parallel build fix for grammar
+fixed upstream)
+- regenerate patch 300 (autotool intermediates)
+- workaround COUNT_ALLOCS weakref issues in test suite (patch 126, patch 127,
+patch 128)
+- stop using runtest.sh in %%check (dropped by upstream), replacing with
+regrtest; fixup list of failing tests
+- introduce "pyshortver", "SOABI_optimized" and
"SOABI_debug" macros
+- rework manifests of shared libraries to use "SOABI_" macros, reflecting
+PEP 3149
+- drop itertools, operator and _collections modules from the manifests as py3k
+commit r84058 moved these inside libpython; json/tests moved to test/json_tests
+- move turtle code into the tkinter subpackage
+
* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
diff --git a/sources b/sources
index c49803c..812bc20 100644
--- a/sources
+++ b/sources
@@ -1 +1,2 @@
b371e1f7a0e98e7a0d1792823fd0f58c Python-3.2a1.tar.bz2
+45ab5ff5edfb73ec277b1c763f3d5a42 Python-3.2b2.tar.bz2
commit 824c34b61eb34b3b7f0e3e3bd20eb8cd06c14087
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Nov 17 15:03:29 2010 -0500
fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
diff --git a/python3.spec b/python3.spec
index 6ec9621..ec10905 100644
--- a/python3.spec
+++ b/python3.spec
@@ -88,7 +88,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.4.%{alphatag}%{?dist}
+Release: 0.5.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -655,7 +655,15 @@ EOF
done
# Fix for bug 201434: make sure distutils looks at the right pyconfig.h file
-sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/"
%{buildroot}%{pylibdir}/distutils/sysconfig.py
+# Similar for sysconfig: sysconfig.get_config_h_filename tries to locate
+# pyconfig.h so it can be parsed, and needs to do this at runtime in site.py
+# when python starts up (bug 653058)
+#
+# Split this out so it goes directly to the pyconfig-32.h/pyconfig-64.h
+# variants:
+sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/" \
+ %{buildroot}%{pylibdir}/distutils/sysconfig.py \
+ %{buildroot}%{pylibdir}/sysconfig.py
# Switch all shebangs to refer to the specific Python version.
LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
@@ -1177,6 +1185,9 @@ rm -fr %{buildroot}
%changelog
+* Wed Nov 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.5.a1
+- fix sysconfig to not rely on the -devel subpackage (rhbz#653058)
+
* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
- move most of the content of the core package to the libs subpackage, given
that the libs aren't meaningfully usable without the standard libraries
commit 26c1be588d2f33c0a44cec2d5c557fdefbc83257
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Thu Sep 9 14:52:31 2010 -0400
* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
- move most of the content of the core package to the libs subpackage, given
that the libs aren't meaningfully usable without the standard libraries
diff --git a/python3.spec b/python3.spec
index 59fc334..6ec9621 100644
--- a/python3.spec
+++ b/python3.spec
@@ -88,7 +88,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.3.%{alphatag}%{?dist}
+Release: 0.4.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -288,6 +288,8 @@ URL:
http://www.python.org/
# See notes in bug 532118:
Provides: python(abi) = %{pybasever}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
%description
Python 3 is a new version of the language that is incompatible with the 2.x
line of releases. The language is mostly the same, but many details, especially
@@ -856,6 +858,10 @@ rm -fr %{buildroot}
%{_bindir}/python3
%{_bindir}/python%{pybasever}
%{_mandir}/*/*
+
+%files libs
+%defattr(-,root,root,-)
+%doc LICENSE README
%dir %{pylibdir}
%dir %{dynload_dir}
%{dynload_dir}/Python-%{version}%{alphatag}-py%{pybasever}.egg-info
@@ -993,8 +999,6 @@ rm -fr %{buildroot}
%dir %{_includedir}/python%{pybasever}
%{_includedir}/python%{pybasever}/%{_pyconfig_h}
-%files libs
-%defattr(-,root,root,-)
%{_libdir}/%{py_INSTSONAME_optimized}
%if 0%{?with_systemtap}
%{tapsetdir}/%{libpython_stp_optimized}
@@ -1064,6 +1068,7 @@ rm -fr %{buildroot}
%{_bindir}/python3-debug
%{_bindir}/python%{pybasever}-debug
+# Analog of the -libs subpackage's files:
# ...with debug builds of the built-in "extension" modules:
%{dynload_dir}/_bisect_d.so
%{dynload_dir}/_codecs_cn_d.so
@@ -1129,7 +1134,6 @@ rm -fr %{buildroot}
# do for the regular build above (bug 531901), since they're all in one package
# now; they're listed below, under "-devel":
-# Analog of the -libs subpackage's files:
%{_libdir}/%{py_INSTSONAME_debug}
%if 0%{?with_systemtap}
%{tapsetdir}/%{libpython_stp_debug}
@@ -1173,6 +1177,10 @@ rm -fr %{buildroot}
%changelog
+* Thu Sep 9 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.4.a1
+- move most of the content of the core package to the libs subpackage, given
+that the libs aren't meaningfully usable without the standard libraries
+
* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
- Move test.support to core package (rhbz#596258)
- Add various missing __pycache__ directories to payload
commit e1c7be02b9c4543cb0b26d6b9c02ea4d95fc3d4b
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Wed Sep 8 19:01:56 2010 -0400
- Move test.support to core package (rhbz#596258)
- Add various missing __pycache__ directories to payload
diff --git a/python3.spec b/python3.spec
index 571fa46..59fc334 100644
--- a/python3.spec
+++ b/python3.spec
@@ -88,7 +88,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.2.%{alphatag}%{?dist}
+Release: 0.3.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -919,22 +919,27 @@ rm -fr %{buildroot}
%dir %{pylibdir}/site-packages/__pycache__/
%{pylibdir}/site-packages/README
%{pylibdir}/*.py
+%dir %{pylibdir}/__pycache__/
%{pylibdir}/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/wsgiref.egg-info
%dir %{pylibdir}/ctypes
+%dir %{pylibdir}/ctypes/__pycache__/
%{pylibdir}/ctypes/*.py
%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/ctypes/macholib
%{pylibdir}/curses
%dir %{pylibdir}/dbm
+%dir %{pylibdir}/dbm/__pycache__/
%{pylibdir}/dbm/*.py
%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
%dir %{pylibdir}/distutils
+%dir %{pylibdir}/distutils/__pycache__/
%{pylibdir}/distutils/*.py
%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/distutils/README
%{pylibdir}/distutils/command
%dir %{pylibdir}/email
+%dir %{pylibdir}/email/__pycache__/
%{pylibdir}/email/*.py
%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/email/mime
@@ -943,9 +948,11 @@ rm -fr %{buildroot}
%{pylibdir}/http
%{pylibdir}/idlelib
%dir %{pylibdir}/importlib
+%dir %{pylibdir}/importlib/__pycache__/
%{pylibdir}/importlib/*.py
%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
%dir %{pylibdir}/json
+%dir %{pylibdir}/json/__pycache__/
%{pylibdir}/json/*.py
%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/lib2to3
@@ -955,12 +962,17 @@ rm -fr %{buildroot}
%{pylibdir}/plat-linux2
%{pylibdir}/pydoc_data
%dir %{pylibdir}/sqlite3
+%dir %{pylibdir}/sqlite3/__pycache__/
%{pylibdir}/sqlite3/*.py
%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
%dir %{pylibdir}/test
+%dir %{pylibdir}/test/__pycache__/
%{pylibdir}/test/__init__.py
+%{pylibdir}/test/support.py
%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%{pylibdir}/test/__pycache__/support%{bytecode_suffixes}
%dir %{pylibdir}/unittest
+%dir %{pylibdir}/unittest/__pycache__/
%{pylibdir}/unittest/*.py
%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/urllib
@@ -1035,9 +1047,7 @@ rm -fr %{buildroot}
%doc %{pylibdir}/Demo/distutils
%doc %{pylibdir}/Demo/md5test
%{pylibdir}/tkinter/test
-%dir %{pylibdir}/unittest/test
-%{pylibdir}/unittest/test/*.py
-%{pylibdir}/unittest/test/__pycache__/*%{bytecode_suffixes}
+%{pylibdir}/unittest/test
# We don't bother splitting the debug build out into further subpackages:
@@ -1163,6 +1173,10 @@ rm -fr %{buildroot}
%changelog
+* Wed Sep 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.3.a1
+- Move test.support to core package (rhbz#596258)
+- Add various missing __pycache__ directories to payload
+
* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
- Add __pycache__ directory for site-packages
commit 13c4a4f869cc8276b0b63cac37895daceaf1d329
Author: Toshio Kuratomi <toshio(a)fedoraproject.org>
Date: Sun Aug 22 14:48:47 2010 -0400
- Add __pycache__ directory for site-packages
diff --git a/python3.spec b/python3.spec
index 8974f07..571fa46 100644
--- a/python3.spec
+++ b/python3.spec
@@ -88,7 +88,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.1.%{alphatag}%{?dist}
+Release: 0.2.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
@@ -594,7 +594,7 @@ InstallPython debug \
InstallPython optimized \
%{py_INSTSONAME_optimized}
-mkdir -p ${RPM_BUILD_ROOT}%{pylibdir}/site-packages
+install -d -m 0755 ${RPM_BUILD_ROOT}%{pylibdir}/site-packages/__pycache__
mv ${RPM_BUILD_ROOT}%{_bindir}/2to3 ${RPM_BUILD_ROOT}%{_bindir}/python3-2to3
@@ -617,7 +617,7 @@ cp -ar Demo %{buildroot}%{pylibdir}/
rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdir}/test/audiotest.au
%if "%{_lib}" == "lib64"
-install -d %{buildroot}/usr/lib/python%{pybasever}/site-packages
+install -d -m 0755 %{buildroot}/usr/lib/python%{pybasever}/site-packages/__pycache__
%endif
# Make python3-devel multilib-ready (bug #192747, #139911)
@@ -915,7 +915,8 @@ rm -fr %{buildroot}
%{dynload_dir}/unicodedata.so
%{dynload_dir}/zlib.so
-%dir %{pylibdir}/site-packages
+%dir %{pylibdir}/site-packages/
+%dir %{pylibdir}/site-packages/__pycache__/
%{pylibdir}/site-packages/README
%{pylibdir}/*.py
%{pylibdir}/__pycache__/*%{bytecode_suffixes}
@@ -969,6 +970,7 @@ rm -fr %{buildroot}
%if "%{_lib}" == "lib64"
%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages/__pycache__/
%endif
# "Makefile" and the config-32/64.h file are needed by
@@ -1161,6 +1163,9 @@ rm -fr %{buildroot}
%changelog
+* Sun Aug 22 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.2-0.2.a1
+- Add __pycache__ directory for site-packages
+
* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
- make find-provides-without-python-sonames.sh 64bit aware
commit 762f268f6b1777d2f00dd41c70636891d259b5d8
Author: Thomas Spura <tomspur(a)fedoraproject.org>
Date: Sun Aug 22 15:11:59 2010 +0200
forgot to bump the release
diff --git a/python3.spec b/python3.spec
index 381333a..8974f07 100644
--- a/python3.spec
+++ b/python3.spec
@@ -88,7 +88,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}
-Release: 0.0.%{alphatag}%{?dist}
+Release: 0.1.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
commit 1559439d3f1821f03e7c98c3fc00e1a95e8603e6
Author: Thomas Spura <tomspur(a)fedoraproject.org>
Date: Sun Aug 22 14:42:27 2010 +0200
correct latest patch edit...
diff --git a/python-3.2a1-lib64.patch b/python-3.2a1-lib64.patch
index df7eb68..dd259c0 100644
--- a/python-3.2a1-lib64.patch
+++ b/python-3.2a1-lib64.patch
@@ -146,8 +146,8 @@ diff -up Python-3.2a1/Modules/getpath.c.lib64
Python-3.2a1/Modules/getpath.c
if (ssl_incs is not None and
Index: Lib/sysconfig.py
===================================================================
---- Lib/sysconfig.py
-+++ Lib/sysconfig.py 2010-08-22 14:34:38.791426924 +0200
+--- Python-3.2a1/Lib/sysconfig.py
++++ Python-3.2a1/Lib/sysconfig.py 2010-08-22 14:34:38.791426924 +0200
@@ -11,10 +11,10 @@
_INSTALL_SCHEMES = {
commit 997d5a24f2ed0138ce205d7709f5a6acb52fd531
Author: Thomas Spura <tomspur(a)fedoraproject.org>
Date: Sun Aug 22 14:40:58 2010 +0200
- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
- make find-provides-without-python-sonames.sh 64bit aware
diff --git a/find-provides-without-python-sonames.sh
b/find-provides-without-python-sonames.sh
index 406a675..8961b87 100755
--- a/find-provides-without-python-sonames.sh
+++ b/find-provides-without-python-sonames.sh
@@ -9,6 +9,7 @@
# So we strip out all /usr/lib/python lines first, before running them through
# the standard script:
-grep -v "/usr/lib/python" | /usr/lib/rpm/find-provides
+grep -v "/usr/lib/python" | grep -v "/usr/lib64/python" | \
+ /usr/lib/rpm/find-provides
-exit 0
\ No newline at end of file
+exit 0
diff --git a/python-3.2a1-lib64.patch b/python-3.2a1-lib64.patch
index d778b5a..df7eb68 100644
--- a/python-3.2a1-lib64.patch
+++ b/python-3.2a1-lib64.patch
@@ -144,3 +144,22 @@ diff -up Python-3.2a1/Modules/getpath.c.lib64
Python-3.2a1/Modules/getpath.c
] )
if (ssl_incs is not None and
+Index: Lib/sysconfig.py
+===================================================================
+--- Lib/sysconfig.py
++++ Lib/sysconfig.py 2010-08-22 14:34:38.791426924 +0200
+@@ -11,10 +11,10 @@
+
+ _INSTALL_SCHEMES = {
+ 'posix_prefix': {
+- 'stdlib': '{base}/lib/python{py_version_short}',
+- 'platstdlib': '{platbase}/lib/python{py_version_short}',
+- 'purelib': '{base}/lib/python{py_version_short}/site-packages',
+- 'platlib':
'{platbase}/lib/python{py_version_short}/site-packages',
++ 'stdlib': '{base}/lib64/python{py_version_short}',
++ 'platstdlib': '{platbase}/lib64/python{py_version_short}',
++ 'purelib':
'{base}/lib64/python{py_version_short}/site-packages',
++ 'platlib':
'{platbase}/lib64/python{py_version_short}/site-packages',
+ 'include': '{base}/include/python{py_version_short}',
+ 'platinclude': '{platbase}/include/python{py_version_short}',
+ 'scripts': '{base}/bin',
diff --git a/python3.spec b/python3.spec
index 15a8549..381333a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1161,6 +1161,10 @@ rm -fr %{buildroot}
%changelog
+* Sun Aug 22 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.2-0.1.a1
+- on 64bit "stdlib" was still "/usr/lib/python*" (modify
*lib64.patch)
+- make find-provides-without-python-sonames.sh 64bit aware
+
* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
- 3.2a1; add alphatag
- rework %%files in the light of PEP 3147 (__pycache__)
commit 7eb10c8dbe3874eee9675c2cbc87a83342806cf7
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Sat Aug 21 18:08:26 2010 -0400
3.2a1
* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
- 3.2a1; add alphatag
- rework %%files in the light of PEP 3147 (__pycache__)
- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
better job of things, and the %%files explicitly lists our modules (r82746
appears to break the old way of doing things). This leads to various modules
changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
testing/devel purposes)
- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
- add machinery for rebuilding "configure" and friends, using the correct
version of autoconf (patch 300)
- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
- "modulator" was removed upstream
- drop "-b" from patch applications affecting .py files to avoid littering
the
installation tree
diff --git a/.gitignore b/.gitignore
index 95c8574..43efa0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
Python-3.1.2.tar.bz2
+Python-3.2a1.tar.bz2
diff --git a/autotool-intermediates.patch b/autotool-intermediates.patch
new file mode 100644
index 0000000..efbf3bf
--- /dev/null
+++ b/autotool-intermediates.patch
@@ -0,0 +1,243 @@
+diff -up ./configure.autotool-intermediates ./configure
+--- ./configure.autotool-intermediates 2010-08-02 17:58:12.238002650 -0400
++++ ./configure 2010-08-02 17:58:20.151000507 -0400
+@@ -1,5 +1,5 @@
+ #! /bin/sh
+-# From configure.in Revision: 82090 .
++# From configure.in Revision: 82962 .
+ # Guess values for system-dependent variables and create Makefiles.
+ # Generated by GNU Autoconf 2.65 for python 3.2.
+ #
+@@ -610,6 +610,8 @@ TRUE
+ MACHDEP_OBJS
+ DYNLOADFILE
+ DLINCLDIR
++DTRACEHDRS
++DTRACEOBJS
+ THREADOBJ
+ LDLAST
+ USE_THREAD_MODULE
+@@ -630,6 +632,8 @@ OTHER_LIBTOOL_OPT
+ UNIVERSAL_ARCH_FLAGS
+ BASECFLAGS
+ OPT
++DEBUG_SUFFIX
++DEBUG_EXT
+ LN
+ INSTALL_DATA
+ INSTALL_SCRIPT
+@@ -743,8 +747,11 @@ with_thread
+ enable_ipv6
+ with_doc_strings
+ with_tsc
++with_count_allocs
++with_call_profile
+ with_pymalloc
+ with_valgrind
++with_dtrace
+ with_wctype_functions
+ with_fpectl
+ with_libm
+@@ -1414,8 +1421,11 @@ Optional Packages:
+ deprecated; use --with(out)-threads
+ --with(out)-doc-strings disable/enable documentation strings
+ --with(out)-tsc enable/disable timestamp counter profile
++ --with(out)count-allocs enable/disable per-type instance accounting
++ --with(out)-call-profile enable/disable statistics on function call invocation
+ --with(out)-pymalloc disable/enable specialized mallocs
+ --with-valgrind Enable Valgrind support
++ --with(out)-dtrace disable/enable dtrace support
+ --with-wctype-functions use wctype.h functions
+ --with-fpectl enable SIGFPE catching
+ --with-libm=STRING math library
+@@ -1929,11 +1939,11 @@ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+ $ac_includes_default
+- enum { N = $2 / 2 - 1 };
+ int
+ main ()
+ {
+-static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) <<
N) - 1) * 2 + 1))];
++static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
++ 0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
+ test_array [0] = 0
+
+ ;
+@@ -1944,11 +1954,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+ $ac_includes_default
+- enum { N = $2 / 2 - 1 };
+ int
+ main ()
+ {
+-static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) -
1) * 2 + 1)
++static int test_array [1 - 2 * !(enum { N = $2 / 2 - 1 };
++ ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
+ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
+ test_array [0] = 0
+
+@@ -4672,7 +4682,7 @@ esac
+ $as_echo_n "checking LIBRARY... " >&6; }
+ if test -z "$LIBRARY"
+ then
+- LIBRARY='libpython$(VERSION).a'
++ LIBRARY='libpython$(VERSION)$(DEBUG_EXT).a'
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBRARY" >&5
+ $as_echo "$LIBRARY" >&6; }
+@@ -4843,8 +4853,8 @@ $as_echo "#define Py_ENABLE_SHARED 1" >>
+ INSTSONAME="$LDLIBRARY".$SOVERSION
+ ;;
+ Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*)
+- LDLIBRARY='libpython$(VERSION).so'
+- BLDLIBRARY='-L. -lpython$(VERSION)'
++ LDLIBRARY='libpython$(VERSION)$(DEBUG_EXT).so'
++ BLDLIBRARY='-L. -lpython$(VERSION)$(DEBUG_EXT)'
+ RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
+ case $ac_sys_system in
+ FreeBSD*)
+@@ -5237,6 +5247,14 @@ $as_echo "no" >&6; }
+ fi
+
+
++if test "$Py_DEBUG" = 'true'
++then
++ DEBUG_EXT=_d
++ DEBUG_SUFFIX=-debug
++fi
++
++
++
+ # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
+ # merged with this chunk of code?
+
+@@ -8160,6 +8178,7 @@ fi
+ $as_echo "$with_system_expat" >&6; }
+
+ # Check for use of the system libffi library
++
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-system-ffi"
>&5
+ $as_echo_n "checking for --with-system-ffi... " >&6; }
+
+@@ -9144,6 +9163,50 @@ $as_echo "no" >&6; }
+ fi
+
+
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-count-allocs"
>&5
++$as_echo_n "checking for --with-count-allocs... " >&6; }
++
++# Check whether --with-count-allocs was given.
++if test "${with_count_allocs+set}" = set; then :
++ withval=$with_count_allocs;
++if test "$withval" != no
++then
++
++$as_echo "#define COUNT_ALLOCS 1" >>confdefs.h
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-call-profile"
>&5
++$as_echo_n "checking for --with-call-profile... " >&6; }
++
++# Check whether --with-call-profile was given.
++if test "${with_call_profile+set}" = set; then :
++ withval=$with_call_profile;
++if test "$withval" != no
++then
++
++$as_echo "#define CALL_PROFILE 1" >>confdefs.h
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
++
++
+ # Check for Python-specific malloc support
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pymalloc"
>&5
+ $as_echo_n "checking for --with-pymalloc... " >&6; }
+@@ -9194,6 +9257,46 @@ fi
+ OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
+ fi
+
++# Check for dtrace support
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-dtrace"
>&5
++$as_echo_n "checking for --with-dtrace... " >&6; }
++
++# Check whether --with-dtrace was given.
++if test "${with_dtrace+set}" = set; then :
++ withval=$with_dtrace;
++fi
++
++
++if test ! -z "$with_dtrace"
++then
++ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
++ then
++
++$as_echo "#define WITH_DTRACE 1" >>confdefs.h
++
++ with_dtrace="Sun"
++ DTRACEOBJS="Python/dtrace.o"
++ DTRADEHDRS=""
++ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
++ then
++
++$as_echo "#define WITH_DTRACE 1" >>confdefs.h
++
++ with_dtrace="Apple"
++ DTRACEOBJS=""
++ DTRADEHDRS="pydtrace.h"
++ else
++ with_dtrace="no"
++ fi
++else
++ with_dtrace="no"
++fi
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dtrace" >&5
++$as_echo "$with_dtrace" >&6; }
++
++
++
+ # Check for --with-wctype-functions
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-wctype-functions"
>&5
+ $as_echo_n "checking for --with-wctype-functions... " >&6; }
+diff -up ./pyconfig.h.in.autotool-intermediates ./pyconfig.h.in
+--- ./pyconfig.h.in.autotool-intermediates 2010-08-02 17:58:12.236001348 -0400
++++ ./pyconfig.h.in 2010-08-02 17:58:20.000000000 -0400
+@@ -12,15 +12,15 @@
+ support for AIX C++ shared extension modules. */
+ #undef AIX_GENUINE_CPLUSPLUS
+
+-/* Define if you have the Mach cthreads package */
+-#undef C_THREADS
+-
+ /* Define to keep records on function call invocation */
+ #undef CALL_PROFILE
+
+ /* Define to keep records of the number of instances of each type */
+ #undef COUNT_ALLOCS
+
++/* Define if you have the Mach cthreads package */
++#undef C_THREADS
++
+ /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
+ mixed-endian order (byte order 45670123) */
+ #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
diff --git a/less-verbose-COUNT_ALLOCS.patch b/less-verbose-COUNT_ALLOCS.patch
new file mode 100644
index 0000000..8cef015
--- /dev/null
+++ b/less-verbose-COUNT_ALLOCS.patch
@@ -0,0 +1,20 @@
+diff -up Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS
Python-2.7/Python/pythonrun.c
+--- Python-2.7/Python/pythonrun.c.less-verbose-COUNT_ALLOCS 2010-08-17 14:49:33.321913909
-0400
++++ Python-2.7/Python/pythonrun.c 2010-08-17 14:54:48.750910403 -0400
+@@ -470,7 +470,15 @@ Py_Finalize(void)
+
+ /* Debugging stuff */
+ #ifdef COUNT_ALLOCS
+- dump_counts(stdout);
++ /* This is a downstream Fedora modification.
++ The upstream default with COUNT_ALLOCS is to always dump the counts to
++ stdout on exit. For our debug builds its useful to have the info from
++ COUNT_ALLOCS available, but the stdout info here gets in the way, so
++ we make it optional, wrapping it in an environment variable (modelled
++ on the other PYTHONDUMP* env variables):
++ */
++ if (Py_GETENV("PYTHONDUMPCOUNTS"))
++ dump_counts(stdout);
+ #endif
+
+ PRINT_TOTAL_REFS();
diff --git a/python-2.6.5-statvfs-f_flag-constants.patch
b/python-2.6.5-statvfs-f_flag-constants.patch
deleted file mode 100644
index 4b3390d..0000000
--- a/python-2.6.5-statvfs-f_flag-constants.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 21fda4c78000d78cb1824fdf0373031d07f5325a Mon Sep 17 00:00:00 2001
-From: Peter Jones <pjones(a)redhat.com>
-Date: Wed, 6 Jan 2010 15:22:38 -0500
-Subject: [PATCH] Add flags for statvfs.f_flag to constant list.
-
-You really need these to figure out what statvfs is trying to say to
-you, so add them here.
----
- Modules/posixmodule.c | 37 +++++++++++++++++++++++++++++++++++++
- 1 files changed, 37 insertions(+), 0 deletions(-)
-
-diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
-index ebdbc8d..d79013b 100644
---- a/Modules/posixmodule.c
-+++ b/Modules/posixmodule.c
-@@ -8990,6 +8990,43 @@ all_ins(PyObject *d)
- #endif
- #endif
-
-+ /* These came from statvfs.h */
-+#ifdef ST_RDONLY
-+ if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1;
-+#endif /* ST_RDONLY */
-+#ifdef ST_NOSUID
-+ if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
-+#endif /* ST_NOSUID */
-+
-+ /* GNU extensions */
-+#ifdef ST_NODEV
-+ if (ins(d, "ST_NODEV", (long)ST_NODEV)) return -1;
-+#endif /* ST_NODEV */
-+#ifdef ST_NOEXEC
-+ if (ins(d, "ST_NOEXEC", (long)ST_NOEXEC)) return -1;
-+#endif /* ST_NOEXEC */
-+#ifdef ST_SYNCHRONOUS
-+ if (ins(d, "ST_SYNCHRONOUS", (long)ST_SYNCHRONOUS)) return -1;
-+#endif /* ST_SYNCHRONOUS */
-+#ifdef ST_MANDLOCK
-+ if (ins(d, "ST_MANDLOCK", (long)ST_MANDLOCK)) return -1;
-+#endif /* ST_MANDLOCK */
-+#ifdef ST_WRITE
-+ if (ins(d, "ST_WRITE", (long)ST_WRITE)) return -1;
-+#endif /* ST_WRITE */
-+#ifdef ST_APPEND
-+ if (ins(d, "ST_APPEND", (long)ST_APPEND)) return -1;
-+#endif /* ST_APPEND */
-+#ifdef ST_NOATIME
-+ if (ins(d, "ST_NOATIME", (long)ST_NOATIME)) return -1;
-+#endif /* ST_NOATIME */
-+#ifdef ST_NODIRATIME
-+ if (ins(d, "ST_NODIRATIME", (long)ST_NODIRATIME)) return -1;
-+#endif /* ST_NODIRATIME */
-+#ifdef ST_RELATIME
-+ if (ins(d, "ST_RELATIME", (long)ST_RELATIME)) return -1;
-+#endif /* ST_RELATIME */
-+
- #if defined(PYOS_OS2)
- if (insertvalues(d)) return -1;
- #endif
---
-1.6.6
-
diff --git a/python-3.1-fix-parallel-make.patch b/python-3.1-fix-parallel-make.patch
deleted file mode 100644
index 3c75b10..0000000
--- a/python-3.1-fix-parallel-make.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-Index: Python-3.1.2/Makefile.pre.in
-===================================================================
---- Python-3.1.2.orig/Makefile.pre.in
-+++ Python-3.1.2/Makefile.pre.in
-@@ -215,6 +215,7 @@ IO_OBJS= \
-
- ##########################################################################
- # Grammar
-+GRAMMAR_STAMP= $(srcdir)/grammar-stamp
- GRAMMAR_H= $(srcdir)/Include/graminit.h
- GRAMMAR_C= $(srcdir)/Python/graminit.c
- GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar
-@@ -535,9 +536,24 @@ Modules/python.o: $(srcdir)/Modules/pyth
-
- $(IO_OBJS): $(IO_H)
-
--$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-+# GNU "make" interprets rules with two dependents as two copies of the rule.
-+#
-+# In a parallel build this can lead to pgen being run twice, once for each of
-+# GRAMMAR_H and GRAMMAR_C, leading to race conditions in which the compiler
-+# reads a partially-overwritten copy of one of these files, leading to syntax
-+# errors (or linker errors if the fragment happens to be syntactically valid C)
-+#
-+# See
http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
-+# for more information
-+#
-+# Introduce ".grammar-stamp" as a contrived single output from PGEN to avoid
-+# this:
-+$(GRAMMAR_H) $(GRAMMAR_C): $(GRAMMAR_STAMP)
-+
-+$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
- -@$(INSTALL) -d Include
- -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
-+ touch $(GRAMMAR_STAMP)
-
- $(PGEN): $(PGENOBJS)
- $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
diff --git a/python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
b/python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
deleted file mode 100644
index 92c3e1f..0000000
--- a/python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- Python-3.1.1/Lib/test/test_imp.py.apply-our-changes-to-expected-shebang 2009-10-27
18:05:53.539540149 -0400
-+++ Python-3.1.1/Lib/test/test_imp.py 2009-10-27 18:06:12.138538965 -0400
-@@ -52,7 +52,7 @@ class ImportTests(unittest.TestCase):
- self.assertNotEqual(fp, None)
- self.assertEqual(fp.encoding, "iso-8859-1")
- self.assertEqual(fp.tell(), 0)
-- self.assertEqual(fp.readline(), '#!/usr/bin/env python\n')
-+ self.assertEqual(fp.readline(), '#!/usr/bin/python3.1\n')
- fp.close()
-
- fp, filename, info = imp.find_module("tokenize")
diff --git a/python-3.1.1-config.patch b/python-3.1.1-config.patch
deleted file mode 100644
index b9eec5b..0000000
--- a/python-3.1.1-config.patch
+++ /dev/null
@@ -1,226 +0,0 @@
-diff -up Python-3.1.1/Modules/Setup.dist.config Python-3.1.1/Modules/Setup.dist
---- Python-3.1.1/Modules/Setup.dist.config 2009-06-04 05:30:30.000000000 -0400
-+++ Python-3.1.1/Modules/Setup.dist 2010-01-25 23:08:55.179858352 -0500
-@@ -141,7 +141,7 @@ _symtable symtablemodule.c
- # modules are to be built as shared libraries (see above for more
- # detail; also note that *static* reverses this effect):
-
--#*shared*
-+*shared*
-
- # GNU readline. Unlike previous Python incarnations, GNU readline is
- # now incorporated in an optional module, configured in the Setup file
-@@ -151,71 +151,71 @@ _symtable symtablemodule.c
- # it, depending on your system -- see the GNU readline instructions.
- # It's okay for this to be a shared library, too.
-
--#readline readline.c -lreadline -ltermcap
-+readline readline.c -lreadline -ltermcap
-
-
- # Modules that should always be present (non UNIX dependent):
-
--#array arraymodule.c # array objects
--#cmath cmathmodule.c # -lm # complex math library functions
--#math mathmodule.c # -lm # math library functions, e.g. sin()
--#_struct _struct.c # binary structure packing/unpacking
--#time timemodule.c # -lm # time operations and variables
--#operator operator.c # operator.add() and similar goodies
--#_weakref _weakref.c # basic weak reference support
--#_testcapi _testcapimodule.c # Python C API test module
--#_random _randommodule.c # Random number generator
--#_collections _collectionsmodule.c # Container types
--#itertools itertoolsmodule.c # Functions creating iterators for efficient looping
--#atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
-+array arraymodule.c # array objects
-+cmath cmathmodule.c # -lm # complex math library functions
-+math mathmodule.c # -lm # math library functions, e.g. sin()
-+_struct _struct.c # binary structure packing/unpacking
-+time timemodule.c # -lm # time operations and variables
-+operator operator.c # operator.add() and similar goodies
-+_weakref _weakref.c # basic weak reference support
-+_testcapi _testcapimodule.c # Python C API test module
-+_random _randommodule.c # Random number generator
-+_collections _collectionsmodule.c # Container types
-+itertools itertoolsmodule.c # Functions creating iterators for efficient looping
-+atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
- #_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
_elementtree.c # elementtree accelerator
--#_pickle _pickle.c # pickle accelerator
-+_pickle _pickle.c # pickle accelerator
- #datetime datetimemodule.c # date/time type
--#_bisect _bisectmodule.c # Bisection algorithms
--#_heapq _heapqmodule.c # Heap queue algorithm
-+_bisect _bisectmodule.c # Bisection algorithms
-+_heapq _heapqmodule.c # Heap queue algorithm
-
--#unicodedata unicodedata.c # static Unicode character database
-+unicodedata unicodedata.c # static Unicode character database
-
-
- # Modules with some UNIX dependencies -- on by default:
- # (If you have a really backward UNIX, select and socket may not be
- # supported...)
-
--#fcntl fcntlmodule.c # fcntl(2) and ioctl(2)
--#spwd spwdmodule.c # spwd(3)
--#grp grpmodule.c # grp(3)
--#select selectmodule.c # select(2); not on ancient System V
-+fcntl fcntlmodule.c # fcntl(2) and ioctl(2)
-+spwd spwdmodule.c # spwd(3)
-+grp grpmodule.c # grp(3)
-+select selectmodule.c # select(2); not on ancient System V
-
- # Memory-mapped files (also works on Win32).
--#mmap mmapmodule.c
-+mmap mmapmodule.c
-
- # CSV file helper
--#_csv _csv.c
-+_csv _csv.c
-
- # Socket module helper for socket(2)
--#_socket socketmodule.c
-+_socket socketmodule.c
-
- # Socket module helper for SSL support; you must comment out the other
- # socket line above, and possibly edit the SSL variable:
- #SSL=/usr/local/ssl
--#_ssl _ssl.c \
--# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
--# -L$(SSL)/lib -lssl -lcrypto
-+_ssl _ssl.c \
-+ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-+ -L$(SSL)/lib -lssl -lcrypto
-
- # The crypt module is now disabled by default because it breaks builds
- # on many systems (where -lcrypt is needed), e.g. Linux (I believe).
- #
- # First, look at Setup.config; configure may have set this for you.
-
--#crypt cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems
-+crypt cryptmodule.c -lcrypt # crypt(3); needs -lcrypt on some systems
-
-
- # Some more UNIX dependent modules -- off by default, since these
- # are not supported by all UNIX systems:
-
--#nis nismodule.c -lnsl # Sun yellow pages -- not everywhere
--#termios termios.c # Steen Lumholt's termios module
--#resource resource.c # Jeremy Hylton's rlimit interface
-+nis nismodule.c -lnsl # Sun yellow pages -- not everywhere
-+termios termios.c # Steen Lumholt's termios module
-+resource resource.c # Jeremy Hylton's rlimit interface
-
-
- # Multimedia modules -- off by default.
-@@ -223,7 +223,7 @@ _symtable symtablemodule.c
- # #993173 says audioop works on 64-bit platforms, though.
- # These represent audio samples or images as strings:
-
--#audioop audioop.c # Operations on audio samples
-+audioop audioop.c # Operations on audio samples
-
-
- # Note that the _md5 and _sha modules are normally only built if the
-@@ -238,9 +238,9 @@ _symtable symtablemodule.c
-
- # The _sha module implements the SHA checksum algorithms.
- # (NIST's Secure Hash Algorithms.)
--#_sha shamodule.c
--#_sha256 sha256module.c
--#_sha512 sha512module.c
-+_sha1 sha1module.c
-+_sha256 sha256module.c
-+_sha512 sha512module.c
-
-
- # The _tkinter module.
-@@ -255,7 +255,7 @@ _symtable symtablemodule.c
- # every system.
-
- # *** Always uncomment this (leave the leading underscore in!):
--# _tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
-+_tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
- # *** Uncomment and edit to reflect where your Tcl/Tk libraries are:
- # -L/usr/local/lib \
- # *** Uncomment and edit to reflect where your Tcl/Tk headers are:
-@@ -265,7 +265,7 @@ _symtable symtablemodule.c
- # *** Or uncomment this for Solaris:
- # -I/usr/openwin/include \
- # *** Uncomment and edit for Tix extension only:
--# -DWITH_TIX -ltix8.1.8.2 \
-+ -DWITH_TIX -ltix \
- # *** Uncomment and edit for BLT extension only:
- # -DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \
- # *** Uncomment and edit for PIL (TkImaging) extension only:
-@@ -274,7 +274,7 @@ _symtable symtablemodule.c
- # *** Uncomment and edit for TOGL extension only:
- # -DWITH_TOGL togl.c \
- # *** Uncomment and edit to reflect your Tcl/Tk versions:
--# -ltk8.2 -ltcl8.2 \
-+ -ltk -ltcl \
- # *** Uncomment and edit to reflect where your X11 libraries are:
- # -L/usr/X11R6/lib \
- # *** Or uncomment this for Solaris:
-@@ -284,10 +284,10 @@ _symtable symtablemodule.c
- # *** Uncomment for AIX:
- # -lld \
- # *** Always uncomment this; X11 libraries to link with:
--# -lX11
-+ -lX11
-
- # Lance Ellinghaus's syslog module
--#syslog syslogmodule.c # syslog daemon interface
-+syslog syslogmodule.c # syslog daemon interface
-
-
- # Curses support, requring the System V version of curses, often
-@@ -321,14 +321,14 @@ _symtable symtablemodule.c
- #
- # First, look at Setup.config; configure may have set this for you.
-
--#_gdbm _gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
-+_gdbm _gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
-
-
- # Helper module for various ascii-encoders
--#binascii binascii.c
-+binascii binascii.c
-
- # Fred Drake's interface to the Python parser
--#parser parsermodule.c
-+parser parsermodule.c
-
-
- # Lee Busby's SIGFPE modules.
-@@ -351,7 +351,7 @@ _symtable symtablemodule.c
- # Andrew Kuchling's zlib module.
- # This require zlib 1.1.3 (or later).
- # See
http://www.gzip.org/zlib/
--#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
-+zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
-
- # Interface to the Expat XML parser
- #
-@@ -369,14 +369,14 @@ _symtable symtablemodule.c
- # Hye-Shik Chang's CJKCodecs
-
- # multibytecodec is required for all the other CJK codec modules
--#_multibytecodec cjkcodecs/multibytecodec.c
-+_multibytecodec cjkcodecs/multibytecodec.c
-
--#_codecs_cn cjkcodecs/_codecs_cn.c
--#_codecs_hk cjkcodecs/_codecs_hk.c
--#_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
--#_codecs_jp cjkcodecs/_codecs_jp.c
--#_codecs_kr cjkcodecs/_codecs_kr.c
--#_codecs_tw cjkcodecs/_codecs_tw.c
-+_codecs_cn cjkcodecs/_codecs_cn.c
-+_codecs_hk cjkcodecs/_codecs_hk.c
-+_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
-+_codecs_jp cjkcodecs/_codecs_jp.c
-+_codecs_kr cjkcodecs/_codecs_kr.c
-+_codecs_tw cjkcodecs/_codecs_tw.c
-
- # Example -- included for reference only:
- # xx xxmodule.c
diff --git a/python-3.1.1-lib64.patch b/python-3.1.1-lib64.patch
deleted file mode 100644
index 3053a92..0000000
--- a/python-3.1.1-lib64.patch
+++ /dev/null
@@ -1,164 +0,0 @@
-diff -ur Python-3.1.1.orig/Lib/distutils/command/install.py
Python-3.1.1/Lib/distutils/command/install.py
---- Python-3.1.1.orig/Lib/distutils/command/install.py 2009-09-24 15:28:57.000000000
-0600
-+++ Python-3.1.1/Lib/distutils/command/install.py 2009-09-24 15:34:18.000000000 -0600
-@@ -47,14 +47,14 @@
- 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/$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',
-diff -ur Python-3.1.1.orig/Lib/distutils/sysconfig.py
Python-3.1.1/Lib/distutils/sysconfig.py
---- Python-3.1.1.orig/Lib/distutils/sysconfig.py 2009-09-24 15:29:00.000000000 -0600
-+++ Python-3.1.1/Lib/distutils/sysconfig.py 2009-09-24 15:34:18.000000000 -0600
-@@ -117,8 +117,12 @@
- 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:
-diff -ur Python-3.1.1.orig/Lib/site.py Python-3.1.1/Lib/site.py
---- Python-3.1.1.orig/Lib/site.py 2009-09-24 15:28:56.000000000 -0600
-+++ Python-3.1.1/Lib/site.py 2009-09-24 15:34:18.000000000 -0600
-@@ -258,12 +258,16 @@
- if sys.platform in ('os2emx', 'riscos'):
- sitedirs.append(os.path.join(prefix, "Lib",
"site-packages"))
- elif os.sep == '/':
-+ sitedirs.append(os.path.join(prefix, "lib64",
-+ "python" + sys.version[:3],
-+ "site-packages"))
- sitedirs.append(os.path.join(prefix, "lib",
- "python" + sys.version[:3],
- "site-packages"))
- sitedirs.append(os.path.join(prefix, "lib",
"site-python"))
- else:
- sitedirs.append(prefix)
-+ sitedirs.append(os.path.join(prefix, "lib64",
"site-packages"))
- sitedirs.append(os.path.join(prefix, "lib",
"site-packages"))
-
- if sys.platform == "darwin":
-diff -ur Python-3.1.1.orig/Makefile.pre.in Python-3.1.1/Makefile.pre.in
---- Python-3.1.1.orig/Makefile.pre.in 2009-09-24 15:26:58.000000000 -0600
-+++ Python-3.1.1/Makefile.pre.in 2009-09-24 15:34:18.000000000 -0600
-@@ -90,11 +90,11 @@
-
- # Expanded directories
- BINDIR= $(exec_prefix)/bin
--LIBDIR= $(exec_prefix)/lib
-+LIBDIR= $(exec_prefix)/lib64
- MANDIR= @mandir@
- INCLUDEDIR= @includedir@
- CONFINCLUDEDIR= $(exec_prefix)/include
--SCRIPTDIR= $(prefix)/lib
-+SCRIPTDIR= $(prefix)/lib64
-
- # Detailed destination directories
- BINLIBDEST= $(LIBDIR)/python$(VERSION)
-diff -ur Python-3.1.1.orig/Modules/getpath.c Python-3.1.1/Modules/getpath.c
---- Python-3.1.1.orig/Modules/getpath.c 2009-09-24 15:27:15.000000000 -0600
-+++ Python-3.1.1/Modules/getpath.c 2009-09-24 15:36:58.000000000 -0600
-@@ -117,8 +117,8 @@
- #endif
-
- #ifndef PYTHONPATH
--#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
-- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
-+#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
-+ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
- #endif
-
- #ifndef LANDMARK
-@@ -129,7 +129,7 @@
- static wchar_t exec_prefix[MAXPATHLEN+1];
- static wchar_t progpath[MAXPATHLEN+1];
- static wchar_t *module_search_path = NULL;
--static wchar_t lib_python[] = L"lib/python" VERSION;
-+static wchar_t lib_python[] = L"lib64/python" VERSION;
-
- /* In principle, this should use HAVE__WSTAT, and _wstat
- should be detected by autoconf. However, no current
-@@ -603,7 +603,7 @@
- }
- else
- wcsncpy(zip_path, L"" PREFIX, MAXPATHLEN);
-- joinpath(zip_path, L"lib/python00.zip");
-+ joinpath(zip_path, L"lib64/python00.zip");
- bufsz = wcslen(zip_path); /* Replace "00" with version */
- zip_path[bufsz - 6] = VERSION[0];
- zip_path[bufsz - 5] = VERSION[2];
-@@ -613,7 +613,7 @@
- fprintf(stderr,
- "Could not find platform dependent libraries
<exec_prefix>\n");
- wcsncpy(exec_prefix, L"" EXEC_PREFIX, MAXPATHLEN);
-- joinpath(exec_prefix, L"lib/lib-dynload");
-+ joinpath(exec_prefix, L"lib64/lib-dynload");
- }
- /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
-
-diff -ur Python-3.1.1.orig/Modules/Setup.dist Python-3.1.1/Modules/Setup.dist
---- Python-3.1.1.orig/Modules/Setup.dist 2009-09-24 15:27:30.000000000 -0600
-+++ Python-3.1.1/Modules/Setup.dist 2009-09-24 15:45:49.000000000 -0600
-@@ -351,7 +351,7 @@
- # Andrew Kuchling's zlib module.
- # This require zlib 1.1.3 (or later).
- # See
http://www.gzip.org/zlib/
--zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
-+zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib64 -lz
-
- # Interface to the Expat XML parser
- #
-diff -ur Python-3.1.1.orig/setup.py Python-3.1.1/setup.py
---- Python-3.1.1.orig/setup.py 2009-09-24 15:26:58.000000000 -0600
-+++ Python-3.1.1/setup.py 2009-09-24 15:34:18.000000000 -0600
-@@ -295,7 +295,7 @@
-
- def detect_modules(self):
- # Ensure that /usr/local is always used
-- 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')
-
- # Add paths specified in the environment variables LDFLAGS and
-@@ -522,11 +522,11 @@
- elif self.compiler.find_library_file(lib_dirs, 'curses'):
- readline_libs.append('curses')
- elif self.compiler.find_library_file(lib_dirs +
-- ['/usr/lib/termcap'],
-+ ['/usr/lib64/termcap'],
- 'termcap'):
- readline_libs.append('termcap')
- exts.append( 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:
-@@ -563,8 +563,8 @@
- if krb5_h:
- ssl_incs += krb5_h
- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-- ['/usr/local/ssl/lib',
-- '/usr/contrib/ssl/lib/'
-+ ['/usr/local/ssl/lib64',
-+ '/usr/contrib/ssl/lib64/'
- ] )
-
- if (ssl_incs is not None and
diff --git a/python-3.1.1-no-static-lib.patch b/python-3.1.1-no-static-lib.patch
deleted file mode 100644
index 325636e..0000000
--- a/python-3.1.1-no-static-lib.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-diff -up Python-3.1.1/Makefile.pre.in.no-static-lib Python-3.1.1/Makefile.pre.in
---- Python-3.1.1/Makefile.pre.in.no-static-lib 2010-01-17 15:42:11.945858717 -0500
-+++ Python-3.1.1/Makefile.pre.in 2010-01-17 16:44:32.788859363 -0500
-@@ -405,7 +405,7 @@ coverage:
-
-
- # Build the interpreter
--$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
-+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY)
- $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) -o $@ \
- Modules/python.o \
- $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-@@ -421,18 +421,6 @@ sharedmods: $(BUILDPYTHON)
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
- esac
-
--# Build static library
--# avoid long command lines, same as LIBRARY_OBJS
--$(LIBRARY): $(LIBRARY_OBJS)
-- -rm -f $@
-- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
-- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
-- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
-- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
-- $(AR) $(ARFLAGS) $@ $(MODOBJS)
-- $(RANLIB) $@
--
- libpython$(VERSION).so: $(LIBRARY_OBJS)
- if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(LDSHARED) $(LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS)
$(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
-@@ -973,18 +961,6 @@ libainstall: all
- else true; \
- fi; \
- done
-- @if test -d $(LIBRARY); then :; else \
-- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
-- if test "$(SO)" = .dll; then \
-- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
-- else \
-- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
-- fi; \
-- else \
-- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
-- fi; \
-- fi
- $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
- $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
- $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python-3.1.1-remove-mimeaudio-tests.patch
b/python-3.1.1-remove-mimeaudio-tests.patch
deleted file mode 100644
index 487ad3e..0000000
--- a/python-3.1.1-remove-mimeaudio-tests.patch
+++ /dev/null
@@ -1,55 +0,0 @@
---- Python-3.1.1/Lib/email/test/test_email.py.remove_mimeaudio_tests 2009-10-27
14:31:09.483539561 -0400
-+++ Python-3.1.1/Lib/email/test/test_email.py 2009-10-27 14:31:27.663548053 -0400
-@@ -926,52 +926,6 @@ Blah blah blah
-
-
-
--# Test the basic MIMEAudio class
--class TestMIMEAudio(unittest.TestCase):
-- def setUp(self):
-- # Make sure we pick up the audiotest.au that lives in email/test/data.
-- # In Python, there's an audiotest.au living in Lib/test but that isn't
-- # included in some binary distros that don't include the test
-- # package. The trailing empty string on the .join() is significant
-- # since findfile() will do a dirname().
-- datadir = os.path.join(os.path.dirname(landmark), 'data', '')
-- with open(findfile('audiotest.au', datadir), 'rb') as fp:
-- self._audiodata = fp.read()
-- self._au = MIMEAudio(self._audiodata)
--
-- def test_guess_minor_type(self):
-- self.assertEqual(self._au.get_content_type(), 'audio/basic')
--
-- def test_encoding(self):
-- payload = self._au.get_payload()
-- self.assertEqual(base64.decodebytes(payload), self._audiodata)
--
-- def test_checkSetMinor(self):
-- au = MIMEAudio(self._audiodata, 'fish')
-- self.assertEqual(au.get_content_type(), 'audio/fish')
--
-- def test_add_header(self):
-- eq = self.assertEqual
-- unless = self.assertTrue
-- self._au.add_header('Content-Disposition', 'attachment',
-- filename='audiotest.au')
-- eq(self._au['content-disposition'],
-- 'attachment; filename="audiotest.au"')
-- eq(self._au.get_params(header='content-disposition'),
-- [('attachment', ''), ('filename',
'audiotest.au')])
-- eq(self._au.get_param('filename',
header='content-disposition'),
-- 'audiotest.au')
-- missing = []
-- eq(self._au.get_param('attachment',
header='content-disposition'), '')
-- unless(self._au.get_param('foo', failobj=missing,
-- header='content-disposition') is missing)
-- # Try some missing stuff
-- unless(self._au.get_param('foobar', missing) is missing)
-- unless(self._au.get_param('attachment', missing,
-- header='foobar') is missing)
--
--
--
- # Test the basic MIMEImage class
- class TestMIMEImage(unittest.TestCase):
- def setUp(self):
diff --git a/python-3.1.1-systemtap.patch b/python-3.1.1-systemtap.patch
deleted file mode 100644
index 49c06f8..0000000
--- a/python-3.1.1-systemtap.patch
+++ /dev/null
@@ -1,322 +0,0 @@
-diff -up Python-3.1.1/configure.in.systemtap Python-3.1.1/configure.in
---- Python-3.1.1/configure.in.systemtap 2010-02-12 15:24:34.959845279 -0500
-+++ Python-3.1.1/configure.in 2010-02-12 15:24:34.965845345 -0500
-@@ -2359,6 +2359,38 @@ then
- fi
- AC_MSG_RESULT($with_pymalloc)
-
-+# Check for dtrace support
-+AC_MSG_CHECKING(for --with-dtrace)
-+AC_ARG_WITH(dtrace,
-+ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
-+
-+if test ! -z "$with_dtrace"
-+then
-+ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Sun"
-+ DTRACEOBJS="Python/dtrace.o"
-+ DTRADEHDRS=""
-+ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
-+ then
-+ AC_DEFINE(WITH_DTRACE, 1,
-+ [Define if you want to compile in Dtrace support])
-+ with_dtrace="Apple"
-+ DTRACEOBJS=""
-+ DTRADEHDRS="pydtrace.h"
-+ else
-+ with_dtrace="no"
-+ fi
-+else
-+ with_dtrace="no"
-+fi
-+
-+AC_MSG_RESULT($with_dtrace)
-+AC_SUBST(DTRACEOBJS)
-+AC_SUBST(DTRACEHDRS)
-+
- # Check for --with-wctype-functions
- AC_MSG_CHECKING(for --with-wctype-functions)
- AC_ARG_WITH(wctype-functions,
-diff -up Python-3.1.1/Include/pydtrace.d.systemtap Python-3.1.1/Include/pydtrace.d
---- Python-3.1.1/Include/pydtrace.d.systemtap 2010-02-12 15:24:34.966844913 -0500
-+++ Python-3.1.1/Include/pydtrace.d 2010-02-12 15:24:34.966844913 -0500
-@@ -0,0 +1,10 @@
-+provider python {
-+ probe function__entry(const char *, const char *, int);
-+ probe function__return(const char *, const char *, int);
-+};
-+
-+#pragma D attributes Evolving/Evolving/Common provider python provider
-+#pragma D attributes Private/Private/Common provider python module
-+#pragma D attributes Private/Private/Common provider python function
-+#pragma D attributes Evolving/Evolving/Common provider python name
-+#pragma D attributes Evolving/Evolving/Common provider python args
-diff -up Python-3.1.1/Makefile.pre.in.systemtap Python-3.1.1/Makefile.pre.in
---- Python-3.1.1/Makefile.pre.in.systemtap 2010-02-12 15:24:34.953845073 -0500
-+++ Python-3.1.1/Makefile.pre.in 2010-02-12 15:24:34.990844336 -0500
-@@ -312,6 +312,7 @@ PYTHON_OBJS= \
- Python/dtoa.o \
- Python/formatter_unicode.o \
- Python/$(DYNLOADFILE) \
-+ @DTRACEOBJS@ \
- $(LIBOBJS) \
- $(MACHDEP_OBJS) \
- $(THREADOBJ)
-@@ -592,6 +593,18 @@ Python/formatter_unicode.o: $(srcdir)/Py
- $(srcdir)/Objects/stringlib/formatter.h
-
-
-+# Only needed with --with-dtrace
-+buildinclude:
-+ mkdir -p Include
-+
-+Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
-+ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
-+
-+Python/ceval.o: Include/pydtrace.h
-+
-+Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
-+ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
-+
- ############################################################################
- # Header files
-
-@@ -1224,6 +1237,6 @@ Python/thread.o: @THREADHEADERS@
- .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
- .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
- .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
--.PHONY: smelly funny patchcheck
-+.PHONY: smelly funny patchcheck buildinclude
-
- # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
-diff -up Python-3.1.1/pyconfig.h.in.systemtap Python-3.1.1/pyconfig.h.in
---- Python-3.1.1/pyconfig.h.in.systemtap 2009-05-29 13:25:39.000000000 -0400
-+++ Python-3.1.1/pyconfig.h.in 2010-02-12 15:24:34.991845511 -0500
-@@ -5,6 +5,9 @@
- #define Py_PYCONFIG_H
-
-
-+/* Define if building universal (internal helper macro) */
-+#undef AC_APPLE_UNIVERSAL_BUILD
-+
- /* Define for AIX if your compiler is a genuine IBM xlC/xlC_r and you want
- support for AIX C++ shared extension modules. */
- #undef AIX_GENUINE_CPLUSPLUS
-@@ -995,6 +998,28 @@
- /* Define if you want to use computed gotos in ceval.c. */
- #undef USE_COMPUTED_GOTOS
-
-+/* Enable extensions on AIX 3, Interix. */
-+#ifndef _ALL_SOURCE
-+# undef _ALL_SOURCE
-+#endif
-+/* Enable GNU extensions on systems that have them. */
-+#ifndef _GNU_SOURCE
-+# undef _GNU_SOURCE
-+#endif
-+/* Enable threading extensions on Solaris. */
-+#ifndef _POSIX_PTHREAD_SEMANTICS
-+# undef _POSIX_PTHREAD_SEMANTICS
-+#endif
-+/* Enable extensions on HP NonStop. */
-+#ifndef _TANDEM_SOURCE
-+# undef _TANDEM_SOURCE
-+#endif
-+/* Enable general extensions on Solaris. */
-+#ifndef __EXTENSIONS__
-+# undef __EXTENSIONS__
-+#endif
-+
-+
- /* Define if a va_list is an array of some kind */
- #undef VA_LIST_IS_ARRAY
-
-@@ -1011,6 +1036,9 @@
- /* Define if you want documentation strings in extension modules */
- #undef WITH_DOC_STRINGS
-
-+/* Define if you want to compile in Dtrace support */
-+#undef WITH_DTRACE
-+
- /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
- linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
- Dyld is necessary to support frameworks. */
-@@ -1032,20 +1060,21 @@
- /* Define to profile with the Pentium timestamp counter */
- #undef WITH_TSC
-
--/* Define to 1 if your processor stores words with the most significant byte
-- first (like Motorola and SPARC, unlike Intel and VAX). */
--#undef WORDS_BIGENDIAN
-+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-+ significant byte first (like Motorola and SPARC, unlike Intel). */
-+#if defined AC_APPLE_UNIVERSAL_BUILD
-+# if defined __BIG_ENDIAN__
-+# define WORDS_BIGENDIAN 1
-+# endif
-+#else
-+# ifndef WORDS_BIGENDIAN
-+# undef WORDS_BIGENDIAN
-+# endif
-+#endif
-
- /* Define if arithmetic is subject to x87-style double rounding issue */
- #undef X87_DOUBLE_ROUNDING
-
--/* Define to 1 if on AIX 3.
-- System headers sometimes define this.
-- We just want to avoid a redefinition error message. */
--#ifndef _ALL_SOURCE
--# undef _ALL_SOURCE
--#endif
--
- /* Define on OpenBSD to activate all library features */
- #undef _BSD_SOURCE
-
-@@ -1064,15 +1093,25 @@
- /* This must be defined on some systems to enable large file support. */
- #undef _LARGEFILE_SOURCE
-
-+/* Define to 1 if on MINIX. */
-+#undef _MINIX
-+
- /* Define on NetBSD to activate all library features */
- #undef _NETBSD_SOURCE
-
- /* Define _OSF_SOURCE to get the makedev macro. */
- #undef _OSF_SOURCE
-
-+/* Define to 2 if the system does not provide POSIX.1 features except with
-+ this defined. */
-+#undef _POSIX_1_SOURCE
-+
- /* Define to activate features from IEEE Stds 1003.1-2001 */
- #undef _POSIX_C_SOURCE
-
-+/* Define to 1 if you need to in order for `stat' and other things to work. */
-+#undef _POSIX_SOURCE
-+
- /* Define if you have POSIX threads, and your system does not define that. */
- #undef _POSIX_THREADS
-
-@@ -1080,12 +1119,12 @@
- #undef _REENTRANT
-
- /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
-- <pthread.h>, or <semaphore.h> is not used. If the typedef was allowed,
the
-+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed,
the
- #define below would cause a syntax error. */
- #undef _UINT32_T
-
- /* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
-- <pthread.h>, or <semaphore.h> is not used. If the typedef was allowed,
the
-+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed,
the
- #define below would cause a syntax error. */
- #undef _UINT64_T
-
-diff -up Python-3.1.1/Python/ceval.c.systemtap Python-3.1.1/Python/ceval.c
---- Python-3.1.1/Python/ceval.c.systemtap 2009-05-30 17:41:10.000000000 -0400
-+++ Python-3.1.1/Python/ceval.c 2010-02-12 15:24:54.075844169 -0500
-@@ -19,6 +19,10 @@
-
- #include <ctype.h>
-
-+#ifdef WITH_DTRACE
-+#include "pydtrace.h"
-+#endif
-+
- #ifndef WITH_TSC
-
- #define READ_TIMESTAMP(var)
-@@ -655,6 +659,69 @@ PyEval_EvalCode(PyCodeObject *co, PyObje
- NULL, NULL);
- }
-
-+#ifdef WITH_DTRACE
-+struct frame_marker_info
-+{
-+ char *filename;
-+ char *name;
-+ int lineno;
-+
-+ PyObject *utf8_filename;
-+ PyObject *utf8_name;
-+};
-+
-+static void
-+get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
-+{
-+ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
-+ if (fmi->utf8_filename) {
-+ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
-+ } else {
-+ fmi->filename = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
-+ if (fmi->utf8_name) {
-+ fmi->name = PyBytes_AsString(fmi->utf8_name);
-+ } else {
-+ fmi->name = NULL;
-+ /* FIXME: clear the exception? */
-+ }
-+
-+ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
-+}
-+
-+static void
-+release_frame_marker_info(struct frame_marker_info *fmi)
-+{
-+ Py_XDECREF(fmi->utf8_filename);
-+ Py_XDECREF(fmi->utf8_name);
-+}
-+
-+static void
-+dtrace_entry(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
-+}
-+
-+static void
-+dtrace_return(PyFrameObject *f)
-+{
-+ struct frame_marker_info fmi;
-+ get_frame_marker_info(f, &fmi);
-+ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
-+ release_frame_marker_info(&fmi);
-+}
-+#else
-+#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
-+#define PYTHON_FUNCTION_RETURN_ENABLED() 0
-+#define dtrace_entry(f)
-+#define dtrace_return(f)
-+#endif
-
- /* Interpreter main loop */
-
-@@ -1061,6 +1128,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
- }
- }
-
-+ if (PYTHON_FUNCTION_ENTRY_ENABLED())
-+ dtrace_entry(f);
-+
- co = f->f_code;
- names = co->co_names;
- consts = co->co_consts;
-@@ -2907,6 +2977,8 @@ fast_yield:
-
- /* pop frame */
- exit_eval_frame:
-+ if (PYTHON_FUNCTION_RETURN_ENABLED())
-+ dtrace_return(f);
- Py_LeaveRecursiveCall();
- tstate->frame = f->f_back;
-
diff --git a/python-3.1.1-with-system-expat.patch b/python-3.1.1-with-system-expat.patch
deleted file mode 100644
index 1c99bf9..0000000
--- a/python-3.1.1-with-system-expat.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-diff -up Python-3.1.1/configure.in.expat Python-3.1.1/configure.in
---- Python-3.1.1/configure.in.expat 2010-01-25 23:02:05.488859572 -0500
-+++ Python-3.1.1/configure.in 2010-01-25 23:02:21.425857866 -0500
-@@ -1853,6 +1853,13 @@ LIBS="$withval $LIBS"
- ],
- [AC_MSG_RESULT(no)])
-
-+# Check for use of the system expat library
-+AC_MSG_CHECKING(for --with-system-expat)
-+AC_ARG_WITH(system_expat,
-+ AC_HELP_STRING(--with-system-expat, build pyexpat module using an installed
expat library))
-+
-+AC_MSG_RESULT($with_system_expat)
-+
- # Check for use of the system libffi library
- AC_MSG_CHECKING(for --with-system-ffi)
- AC_ARG_WITH(system_ffi,
-diff -up Python-3.1.1/setup.py.expat Python-3.1.1/setup.py
---- Python-3.1.1/setup.py.expat 2010-01-25 23:02:11.254859198 -0500
-+++ Python-3.1.1/setup.py 2010-01-25 23:02:21.426857993 -0500
-@@ -1110,19 +1110,26 @@ class PyBuildExt(build_ext):
- #
- # More information on Expat can be found at
www.libexpat.org.
- #
-- expatinc = os.path.join(os.getcwd(), srcdir, 'Modules',
'expat')
-- define_macros = [
-- ('HAVE_EXPAT_CONFIG_H', '1'),
-- ]
-+ if '--with-system-expat' in
sysconfig.get_config_var("CONFIG_ARGS"):
-+ expat_inc = []
-+ define_macros = []
-+ expat_lib = ['expat']
-+ expat_sources = []
-+ else:
-+ expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules',
'expat')]
-+ define_macros = [
-+ ('HAVE_EXPAT_CONFIG_H', '1'),
-+ ]
-+ expat_lib = []
-+ expat_sources = ['expat/xmlparse.c',
-+ 'expat/xmlrole.c',
-+ 'expat/xmltok.c']
-
- exts.append(Extension('pyexpat',
- define_macros = define_macros,
-- include_dirs = [expatinc],
-- sources = ['pyexpat.c',
-- 'expat/xmlparse.c',
-- 'expat/xmlrole.c',
-- 'expat/xmltok.c',
-- ],
-+ include_dirs = expat_inc,
-+ libraries = expat_lib,
-+ sources = ['pyexpat.c'] + expat_sources
- ))
-
- # Fredrik Lundh's cElementTree module. Note that this also
-@@ -1132,7 +1139,8 @@ class PyBuildExt(build_ext):
- define_macros.append(('USE_PYEXPAT_CAPI', None))
- exts.append(Extension('_elementtree',
- define_macros = define_macros,
-- include_dirs = [expatinc],
-+ include_dirs = expat_inc,
-+ libraries = expat_lib,
- sources = ['_elementtree.c'],
- ))
- else:
diff --git a/python-3.1.2-CVE-2008-5983.patch b/python-3.1.2-CVE-2008-5983.patch
deleted file mode 100644
index f33cebb..0000000
--- a/python-3.1.2-CVE-2008-5983.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-diff -up Python-3.1.2/Doc/c-api/init.rst.CVE-2008-5983 Python-3.1.2/Doc/c-api/init.rst
---- Python-3.1.2/Doc/c-api/init.rst.CVE-2008-5983 2010-01-09 13:48:46.000000000 -0500
-+++ Python-3.1.2/Doc/c-api/init.rst 2010-06-04 15:19:26.724089244 -0400
-@@ -22,6 +22,7 @@ Initialization, Finalization, and Thread
- module: sys
- triple: module; search; path
- single: PySys_SetArgv()
-+ single: PySys_SetArgvEx()
- single: Py_Finalize()
-
- Initialize the Python interpreter. In an application embedding Python, this
-@@ -31,7 +32,7 @@ Initialization, Finalization, and Thread
- the table of loaded modules (``sys.modules``), and creates the fundamental
- modules :mod:`builtins`, :mod:`__main__` and :mod:`sys`. It also initializes
- the module search path (``sys.path``). It does not set ``sys.argv``; use
-- :cfunc:`PySys_SetArgv` for that. This is a no-op when called for a second time
-+ :cfunc:`PySys_SetArgvEx` for that. This is a no-op when called for a second time
- (without calling :cfunc:`Py_Finalize` first). There is no return value; it is a
- fatal error if the initialization fails.
-
-@@ -344,7 +345,7 @@ Initialization, Finalization, and Thread
- ``sys.version``.
-
-
--.. cfunction:: void PySys_SetArgv(int argc, wchar_t **argv)
-+.. cfunction:: void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
-
- .. index::
- single: main()
-@@ -359,14 +360,41 @@ Initialization, Finalization, and Thread
- string. If this function fails to initialize :data:`sys.argv`, a fatal
- condition is signalled using :cfunc:`Py_FatalError`.
-
-- This function also prepends the executed script's path to :data:`sys.path`.
-- If no script is executed (in the case of calling ``python -c`` or just the
-- interactive interpreter), the empty string is used instead.
-+ If *updatepath* is zero, this is all the function does. If *updatepath*
-+ is non-zero, the function also modifies :data:`sys.path` according to the
-+ following algorithm:
-+
-+ - If the name of an existing script is passed in ``argv[0]``, the absolute
-+ path of the directory where the script is located is prepended to
-+ :data:`sys.path`.
-+ - Otherwise (that is, if *argc* is 0 or ``argv[0]`` doesn't point
-+ to an existing file name), an empty string is prepended to
-+ :data:`sys.path`, which is the same as prepending the current working
-+ directory (``"."``).
-+
-+ .. note::
-+ It is recommended that applications embedding the Python interpreter
-+ for purposes other than executing a single script pass 0 as *updatepath*,
-+ and update :data:`sys.path` themselves if desired.
-+ See `CVE-2008-5983
<
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_.
-+
-+ On versions before 3.1.3, you can achieve the same effect by manually
-+ popping the first :data:`sys.path` element after having called
-+ :cfunc:`PySys_SetArgv`, for example using::
-+
-+ PyRun_SimpleString("import sys; sys.path.pop(0)\n");
-+
-+ .. versionadded:: 3.1.3
-
- .. XXX impl. doesn't seem consistent in allowing 0/NULL for the params;
- check w/ Guido.
-
-
-+.. cfunction:: void PySys_SetArgv(int argc, wchar_t **argv)
-+
-+ This function works like :cfunc:`PySys_SetArgv` with *updatepath* set to 1.
-+
-+
- .. cfunction:: void Py_SetPythonHome(wchar_t *home)
-
- Set the default "home" directory, that is, the location of the standard
-diff -up Python-3.1.2/Include/sysmodule.h.CVE-2008-5983 Python-3.1.2/Include/sysmodule.h
---- Python-3.1.2/Include/sysmodule.h.CVE-2008-5983 2008-04-13 09:53:33.000000000 -0400
-+++ Python-3.1.2/Include/sysmodule.h 2010-06-04 15:19:26.721088968 -0400
-@@ -10,6 +10,7 @@ extern "C" {
- PyAPI_FUNC(PyObject *) PySys_GetObject(const char *);
- PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *);
- PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **);
-+PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int);
- PyAPI_FUNC(void) PySys_SetPath(const wchar_t *);
-
- PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...)
-diff -up Python-3.1.2/Misc/NEWS.CVE-2008-5983 Python-3.1.2/Misc/NEWS
-diff -up Python-3.1.2/Python/sysmodule.c.CVE-2008-5983 Python-3.1.2/Python/sysmodule.c
---- Python-3.1.2/Python/sysmodule.c.CVE-2008-5983 2010-06-04 15:19:26.000000000 -0400
-+++ Python-3.1.2/Python/sysmodule.c 2010-06-04 15:20:59.932964188 -0400
-@@ -1561,7 +1561,7 @@ _wrealpath(const wchar_t *path, wchar_t
- #endif
-
- void
--PySys_SetArgv(int argc, wchar_t **argv)
-+PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
- {
- #if defined(HAVE_REALPATH)
- wchar_t fullpath[MAXPATHLEN];
-@@ -1574,7 +1574,7 @@ PySys_SetArgv(int argc, wchar_t **argv)
- Py_FatalError("no mem for sys.argv");
- if (PySys_SetObject("argv", av) != 0)
- Py_FatalError("can't assign sys.argv");
-- if (path != NULL) {
-+ if (updatepath && path != NULL) {
- wchar_t *argv0 = argv[0];
- wchar_t *p = NULL;
- Py_ssize_t n = 0;
-@@ -1661,6 +1661,12 @@ PySys_SetArgv(int argc, wchar_t **argv)
- Py_DECREF(av);
- }
-
-+void
-+PySys_SetArgv(int argc, wchar_t **argv)
-+{
-+ PySys_SetArgvEx(argc, argv, 1);
-+}
-+
-
- /* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
- Adapted from code submitted by Just van Rossum.
diff --git a/python-3.1.2-CVE-2010-1634.patch b/python-3.1.2-CVE-2010-1634.patch
deleted file mode 100644
index f3de6ea..0000000
--- a/python-3.1.2-CVE-2010-1634.patch
+++ /dev/null
@@ -1,209 +0,0 @@
---- python/branches/py3k/Modules/audioop.c 2010/05/09 15:52:27 81032
-+++ python/branches/py3k/Modules/audioop.c 2010/05/11 13:09:58 81081
-@@ -834,7 +834,7 @@
- audioop_tostereo(PyObject *self, PyObject *args)
- {
- signed char *cp, *ncp;
-- int len, new_len, size, val1, val2, val = 0;
-+ int len, size, val1, val2, val = 0;
- double fac1, fac2, fval, maxval;
- PyObject *rv;
- int i;
-@@ -851,14 +851,13 @@
- return 0;
- }
-
-- new_len = len*2;
-- if (new_len < 0) {
-+ if (len > INT_MAX/2) {
- PyErr_SetString(PyExc_MemoryError,
- "not enough memory for output buffer");
- return 0;
- }
-
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ rv = PyBytes_FromStringAndSize(NULL, len*2);
- if ( rv == 0 )
- return 0;
- ncp = (signed char *)PyBytes_AsString(rv);
-@@ -1021,7 +1020,7 @@
- {
- signed char *cp;
- unsigned char *ncp;
-- int len, new_len, size, size2, val = 0;
-+ int len, size, size2, val = 0;
- PyObject *rv;
- int i, j;
-
-@@ -1035,13 +1034,12 @@
- return 0;
- }
-
-- new_len = (len/size)*size2;
-- if (new_len < 0) {
-+ if (len/size > INT_MAX/size2) {
- PyErr_SetString(PyExc_MemoryError,
- "not enough memory for output buffer");
- return 0;
- }
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ rv = PyBytes_FromStringAndSize(NULL, (len/size)*size2);
- if ( rv == 0 )
- return 0;
- ncp = (unsigned char *)PyBytes_AsString(rv);
-@@ -1077,7 +1075,6 @@
- int chan, d, *prev_i, *cur_i, cur_o;
- PyObject *state, *samps, *str, *rv = NULL;
- int bytes_per_frame;
-- size_t alloc_size;
-
- weightA = 1;
- weightB = 0;
-@@ -1120,14 +1117,13 @@
- inrate /= d;
- outrate /= d;
-
-- alloc_size = sizeof(int) * (unsigned)nchannels;
-- if (alloc_size < (unsigned)nchannels) {
-+ if ((size_t)nchannels > PY_SIZE_MAX/sizeof(int)) {
- PyErr_SetString(PyExc_MemoryError,
- "not enough memory for output buffer");
- return 0;
- }
-- prev_i = (int *) malloc(alloc_size);
-- cur_i = (int *) malloc(alloc_size);
-+ prev_i = (int *) malloc(nchannels * sizeof(int));
-+ cur_i = (int *) malloc(nchannels * sizeof(int));
- if (prev_i == NULL || cur_i == NULL) {
- (void) PyErr_NoMemory();
- goto exit;
-@@ -1164,25 +1160,16 @@
- ceiling(len*outrate/inrate) output frames, and each frame
- requires bytes_per_frame bytes. Computing this
- without spurious overflow is the challenge; we can
-- settle for a reasonable upper bound, though. */
-- int ceiling; /* the number of output frames */
-- int nbytes; /* the number of output bytes needed */
-- int q = len / inrate;
-- /* Now len = q * inrate + r exactly (with r = len % inrate),
-- and this is less than q * inrate + inrate = (q+1)*inrate.
-- So a reasonable upper bound on len*outrate/inrate is
-- ((q+1)*inrate)*outrate/inrate =
-- (q+1)*outrate.
-- */
-- ceiling = (q+1) * outrate;
-- nbytes = ceiling * bytes_per_frame;
-- /* See whether anything overflowed; if not, get the space. */
-- if (q+1 < 0 ||
-- ceiling / outrate != q+1 ||
-- nbytes / bytes_per_frame != ceiling)
-+ settle for a reasonable upper bound, though, in this
-+ case ceiling(len/inrate) * outrate. */
-+
-+ /* compute ceiling(len/inrate) without overflow */
-+ int q = len > 0 ? 1 + (len - 1) / inrate : 0;
-+ if (outrate > INT_MAX / q / bytes_per_frame)
- str = NULL;
- else
-- str = PyBytes_FromStringAndSize(NULL, nbytes);
-+ str = PyBytes_FromStringAndSize(NULL,
-+ q * outrate * bytes_per_frame);
-
- if (str == NULL) {
- PyErr_SetString(PyExc_MemoryError,
-@@ -1300,7 +1287,7 @@
- unsigned char *cp;
- unsigned char cval;
- signed char *ncp;
-- int len, new_len, size, val;
-+ int len, size, val;
- PyObject *rv;
- int i;
-
-@@ -1313,18 +1300,17 @@
- return 0;
- }
-
-- new_len = len*size;
-- if (new_len < 0) {
-+ if (len > INT_MAX/size) {
- PyErr_SetString(PyExc_MemoryError,
- "not enough memory for output buffer");
- return 0;
- }
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ rv = PyBytes_FromStringAndSize(NULL, len*size);
- if ( rv == 0 )
- return 0;
- ncp = (signed char *)PyBytes_AsString(rv);
-
-- for ( i=0; i < new_len; i += size ) {
-+ for ( i=0; i < len*size; i += size ) {
- cval = *cp++;
- val = st_ulaw2linear16(cval);
-
-@@ -1374,7 +1360,7 @@
- unsigned char *cp;
- unsigned char cval;
- signed char *ncp;
-- int len, new_len, size, val;
-+ int len, size, val;
- PyObject *rv;
- int i;
-
-@@ -1387,18 +1373,17 @@
- return 0;
- }
-
-- new_len = len*size;
-- if (new_len < 0) {
-+ if (len > INT_MAX/size) {
- PyErr_SetString(PyExc_MemoryError,
- "not enough memory for output buffer");
- return 0;
- }
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ rv = PyBytes_FromStringAndSize(NULL, len*size);
- if ( rv == 0 )
- return 0;
- ncp = (signed char *)PyBytes_AsString(rv);
-
-- for ( i=0; i < new_len; i += size ) {
-+ for ( i=0; i < len*size; i += size ) {
- cval = *cp++;
- val = st_alaw2linear16(cval);
-
-@@ -1523,7 +1508,7 @@
- {
- signed char *cp;
- signed char *ncp;
-- int len, new_len, size, valpred, step, delta, index, sign, vpdiff;
-+ int len, size, valpred, step, delta, index, sign, vpdiff;
- PyObject *rv, *str, *state;
- int i, inputbuffer = 0, bufferstep;
-
-@@ -1545,13 +1530,12 @@
- } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
- return 0;
-
-- new_len = len*size*2;
-- if (new_len < 0) {
-+ if (len > (INT_MAX/2)/size) {
- PyErr_SetString(PyExc_MemoryError,
- "not enough memory for output buffer");
- return 0;
- }
-- str = PyBytes_FromStringAndSize(NULL, new_len);
-+ str = PyBytes_FromStringAndSize(NULL, len*size*2);
- if ( str == 0 )
- return 0;
- ncp = (signed char *)PyBytes_AsString(str);
-@@ -1559,7 +1543,7 @@
- step = stepsizeTable[index];
- bufferstep = 0;
-
-- for ( i=0; i < new_len; i += size ) {
-+ for ( i=0; i < len*size*2; i += size ) {
- /* Step 1 - get the delta value and compute next index */
- if ( bufferstep ) {
- delta = inputbuffer & 0xf;
diff --git a/python-3.1.2-CVE-2010-2089.patch b/python-3.1.2-CVE-2010-2089.patch
deleted file mode 100644
index f0098c4..0000000
--- a/python-3.1.2-CVE-2010-2089.patch
+++ /dev/null
@@ -1,313 +0,0 @@
-diff -up Python-3.1.2/Modules/audioop.c.CVE-2010-2089 Python-3.1.2/Modules/audioop.c
---- Python-3.1.2/Modules/audioop.c.CVE-2010-2089 2010-06-04 14:55:04.281964205 -0400
-+++ Python-3.1.2/Modules/audioop.c 2010-06-04 15:04:32.896088959 -0400
-@@ -295,6 +295,29 @@ static int stepsizeTable[89] = {
-
- static PyObject *AudioopError;
-
-+static int
-+audioop_check_size(int size)
-+{
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ } else {
-+ return 1;
-+ }
-+}
-+
-+static int
-+audioop_check_parameters(int len, int size)
-+{
-+ if (!audioop_check_size(size))
-+ return 0;
-+ if ( len % size != 0 ) {
-+ PyErr_SetString(AudioopError, "not a whole number of
frames");
-+ return 0;
-+ }
-+ return 1;
-+}
-+
- static PyObject *
- audioop_getsample(PyObject *self, PyObject *args)
- {
-@@ -304,10 +327,8 @@ audioop_getsample(PyObject *self, PyObje
-
- if ( !PyArg_ParseTuple(args, "s#ii:getsample", &cp, &len,
&size, &i) )
- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
- if ( i < 0 || i >= len/size ) {
- PyErr_SetString(AudioopError, "Index out of range");
- return 0;
-@@ -328,10 +349,8 @@ audioop_max(PyObject *self, PyObject *ar
-
- if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) )
- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
- for ( i=0; i<len; i+= size) {
- if ( size == 1 ) val = (int)*CHARP(cp, i);
- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-@@ -352,10 +371,8 @@ audioop_minmax(PyObject *self, PyObject
-
- if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
- return NULL;
-- if (size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ if (!audioop_check_parameters(len, size))
- return NULL;
-- }
- for (i = 0; i < len; i += size) {
- if (size == 1) val = (int) *CHARP(cp, i);
- else if (size == 2) val = (int) *SHORTP(cp, i);
-@@ -376,10 +393,8 @@ audioop_avg(PyObject *self, PyObject *ar
-
- if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) )
- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
- for ( i=0; i<len; i+= size) {
- if ( size == 1 ) val = (int)*CHARP(cp, i);
- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-@@ -403,10 +418,8 @@ audioop_rms(PyObject *self, PyObject *ar
-
- if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size) )
- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
- for ( i=0; i<len; i+= size) {
- if ( size == 1 ) val = (int)*CHARP(cp, i);
- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-@@ -614,10 +627,8 @@ audioop_avgpp(PyObject *self, PyObject *
-
- if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len, &size) )
- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
- /* Compute first delta value ahead. Also automatically makes us
- ** skip the first extreme value
- */
-@@ -671,10 +682,8 @@ audioop_maxpp(PyObject *self, PyObject *
-
- if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len, &size) )
- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
- /* Compute first delta value ahead. Also automatically makes us
- ** skip the first extreme value
- */
-@@ -722,10 +731,8 @@ audioop_cross(PyObject *self, PyObject *
-
- if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len, &size) )
- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
- ncross = -1;
- prevval = 17; /* Anything <> 0,1 */
- for ( i=0; i<len; i+= size) {
-@@ -751,6 +758,9 @@ audioop_mul(PyObject *self, PyObject *ar
- if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size,
&factor ) )
- return 0;
-
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-+
- if ( size == 1 ) maxval = (double) 0x7f;
- else if ( size == 2 ) maxval = (double) 0x7fff;
- else if ( size == 4 ) maxval = (double) 0x7fffffff;
-@@ -793,6 +803,14 @@ audioop_tomono(PyObject *self, PyObject
- if ( !PyArg_ParseTuple(args, "s*idd:tomono",
- &pcp, &size, &fac1, &fac2 ) )
- return 0;
-+
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-+ if ( ((len / size) & 1) != 0 ) {
-+ PyErr_SetString(AudioopError, "not a whole number of frames");
-+ return NULL;
-+ }
-+
- cp = pcp.buf;
- len = pcp.len;
-
-@@ -843,6 +861,9 @@ audioop_tostereo(PyObject *self, PyObjec
- &cp, &len, &size, &fac1, &fac2 ) )
- return 0;
-
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-+
- if ( size == 1 ) maxval = (double) 0x7f;
- else if ( size == 2 ) maxval = (double) 0x7fff;
- else if ( size == 4 ) maxval = (double) 0x7fffffff;
-@@ -901,6 +922,9 @@ audioop_add(PyObject *self, PyObject *ar
- &cp1, &len1, &cp2, &len2, &size ) )
- return 0;
-
-+ if (!audioop_check_parameters(len1, size))
-+ return NULL;
-+
- if ( len1 != len2 ) {
- PyErr_SetString(AudioopError, "Lengths should be the same");
- return 0;
-@@ -955,10 +979,8 @@ audioop_bias(PyObject *self, PyObject *a
- &cp, &len, &size , &bias) )
- return 0;
-
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-
- rv = PyBytes_FromStringAndSize(NULL, len);
- if ( rv == 0 )
-@@ -991,10 +1013,8 @@ audioop_reverse(PyObject *self, PyObject
- &cp, &len, &size) )
- return 0;
-
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-
- rv = PyBytes_FromStringAndSize(NULL, len);
- if ( rv == 0 )
-@@ -1028,11 +1048,10 @@ audioop_lin2lin(PyObject *self, PyObject
- &cp, &len, &size, &size2) )
- return 0;
-
-- if ( (size != 1 && size != 2 && size != 4) ||
-- (size2 != 1 && size2 != 2 && size2 != 4)) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-+ if (!audioop_check_size(size2))
-+ return NULL;
-
- if (len/size > INT_MAX/size2) {
- PyErr_SetString(PyExc_MemoryError,
-@@ -1082,10 +1101,8 @@ audioop_ratecv(PyObject *self, PyObject
- &nchannels, &inrate, &outrate, &state,
- &weightA, &weightB))
- return NULL;
-- if (size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ if (!audioop_check_size(size))
- return NULL;
-- }
- if (nchannels < 1) {
- PyErr_SetString(AudioopError, "# of channels should be >= 1");
- return NULL;
-@@ -1261,10 +1278,8 @@ audioop_lin2ulaw(PyObject *self, PyObjec
- &cp, &len, &size) )
- return 0 ;
-
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-
- rv = PyBytes_FromStringAndSize(NULL, len/size);
- if ( rv == 0 )
-@@ -1295,10 +1310,8 @@ audioop_ulaw2lin(PyObject *self, PyObjec
- &cp, &len, &size) )
- return 0;
-
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_size(size))
-+ return NULL;
-
- if (len > INT_MAX/size) {
- PyErr_SetString(PyExc_MemoryError,
-@@ -1334,10 +1347,8 @@ audioop_lin2alaw(PyObject *self, PyObjec
- &cp, &len, &size) )
- return 0;
-
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-
- rv = PyBytes_FromStringAndSize(NULL, len/size);
- if ( rv == 0 )
-@@ -1368,10 +1379,8 @@ audioop_alaw2lin(PyObject *self, PyObjec
- &cp, &len, &size) )
- return 0;
-
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_size(size))
-+ return NULL;
-
- if (len > INT_MAX/size) {
- PyErr_SetString(PyExc_MemoryError,
-@@ -1409,10 +1418,8 @@ audioop_lin2adpcm(PyObject *self, PyObje
- return 0;
-
-
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_parameters(len, size))
-+ return NULL;
-
- str = PyBytes_FromStringAndSize(NULL, len/(size*2));
- if ( str == 0 )
-@@ -1516,10 +1523,8 @@ audioop_adpcm2lin(PyObject *self, PyObje
- &cp, &len, &size, &state) )
- return 0;
-
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-+ if (!audioop_check_size(size))
-+ return NULL;
-
- /* Decode state, should have (value, step) */
- if ( state == Py_None ) {
diff --git a/python-3.1.2-debug-build.patch b/python-3.1.2-debug-build.patch
deleted file mode 100644
index 2a71afe..0000000
--- a/python-3.1.2-debug-build.patch
+++ /dev/null
@@ -1,275 +0,0 @@
-diff -up Python-3.1.2/configure.in.debug-build Python-3.1.2/configure.in
---- Python-3.1.2/configure.in.debug-build 2010-05-20 22:48:14.573026391 -0400
-+++ Python-3.1.2/configure.in 2010-05-20 22:48:14.580902316 -0400
-@@ -569,7 +569,7 @@ AC_SUBST(LIBRARY)
- AC_MSG_CHECKING(LIBRARY)
- if test -z "$LIBRARY"
- then
-- LIBRARY='libpython$(VERSION).a'
-+ LIBRARY='libpython$(VERSION)$(DEBUG_EXT).a'
- fi
- AC_MSG_RESULT($LIBRARY)
-
-@@ -711,8 +711,8 @@ if test $enable_shared = "yes"; then
- INSTSONAME="$LDLIBRARY".$SOVERSION
- ;;
- Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*)
-- LDLIBRARY='libpython$(VERSION).so'
-- BLDLIBRARY='-L. -lpython$(VERSION)'
-+ LDLIBRARY='libpython$(VERSION)$(DEBUG_EXT).so'
-+ BLDLIBRARY='-L. -lpython$(VERSION)$(DEBUG_EXT)'
- RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
- case $ac_sys_system in
- FreeBSD*)
-@@ -816,6 +816,14 @@ else AC_MSG_RESULT(no); Py_DEBUG='false'
- fi],
- [AC_MSG_RESULT(no)])
-
-+if test "$Py_DEBUG" = 'true'
-+then
-+ DEBUG_EXT=_d
-+ DEBUG_SUFFIX=-debug
-+fi
-+AC_SUBST(DEBUG_EXT)
-+AC_SUBST(DEBUG_SUFFIX)
-+
- # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
- # merged with this chunk of code?
-
-diff -up Python-3.1.2/Lib/distutils/command/build_ext.py.debug-build
Python-3.1.2/Lib/distutils/command/build_ext.py
---- Python-3.1.2/Lib/distutils/command/build_ext.py.debug-build 2010-03-19
17:56:34.000000000 -0400
-+++ Python-3.1.2/Lib/distutils/command/build_ext.py 2010-05-20 22:48:14.581902928 -0400
-@@ -673,7 +673,10 @@ class build_ext(Command):
- so_ext = get_config_var('SO')
- if os.name == 'nt' and self.debug:
- return os.path.join(*ext_path) + '_d' + so_ext
-- return os.path.join(*ext_path) + so_ext
-+
-+ # Similarly, extensions in debug mode are named 'module_d.so', to
-+ # avoid adding the _d to the SO config variable:
-+ return os.path.join(*ext_path) + (sys.pydebug and "_d" or
"") + so_ext
-
- def get_export_symbols(self, ext):
- """Return the list of symbols that a shared extension has to
-@@ -754,6 +757,8 @@ class build_ext(Command):
- template = "python%d.%d"
- pythonlib = (template %
- (sys.hexversion >> 24, (sys.hexversion >> 16)
& 0xff))
-+ if sys.pydebug:
-+ pythonlib += '_d'
- return ext.libraries + [pythonlib]
- else:
- return ext.libraries
-diff -up Python-3.1.2/Lib/distutils/sysconfig.py.debug-build
Python-3.1.2/Lib/distutils/sysconfig.py
---- Python-3.1.2/Lib/distutils/sysconfig.py.debug-build 2010-05-20 22:48:14.577026372
-0400
-+++ Python-3.1.2/Lib/distutils/sysconfig.py 2010-05-20 22:48:14.581902928 -0400
-@@ -83,7 +83,8 @@ def get_python_inc(plat_specific=0, pref
- else:
- incdir = os.path.join(get_config_var('srcdir'),
'Include')
- return os.path.normpath(incdir)
-- return os.path.join(prefix, "include", "python" +
get_python_version())
-+ return os.path.join(prefix, "include",
-+ "python" + get_python_version() + (sys.pydebug and
'-debug' or ''))
- elif os.name == "nt":
- return os.path.join(prefix, "include")
- elif os.name == "mac":
-@@ -229,7 +230,7 @@ def get_makefile_filename():
- if python_build:
- return os.path.join(os.path.dirname(sys.executable), "Makefile")
- lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
-- return os.path.join(lib_dir, "config", "Makefile")
-+ return os.path.join(lib_dir, "config" + (sys.pydebug and
"-debug" or ""), "Makefile")
-
-
- def parse_config_h(fp, g=None):
-diff -up Python-3.1.2/Makefile.pre.in.debug-build Python-3.1.2/Makefile.pre.in
---- Python-3.1.2/Makefile.pre.in.debug-build 2010-05-20 22:48:14.577901061 -0400
-+++ Python-3.1.2/Makefile.pre.in 2010-05-20 22:48:14.581902928 -0400
-@@ -99,8 +99,8 @@ SCRIPTDIR= $(prefix)/lib64
- # Detailed destination directories
- BINLIBDEST= $(LIBDIR)/python$(VERSION)
- LIBDEST= $(SCRIPTDIR)/python$(VERSION)
--INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)
--CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)
-+INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
-+CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
- LIBP= $(LIBDIR)/python$(VERSION)
-
- # Symbols used for using shared libraries
-@@ -113,6 +113,12 @@ DESTSHARED= $(BINLIBDEST)/lib-dynload
- EXE= @EXEEXT@
- BUILDEXE= @BUILDEXEEXT@
-
-+# DEBUG_EXT is used by ELF files (names and SONAMEs); it will be "_d" for a
debug build
-+# DEBUG_SUFFIX is used by filesystem paths; it will be "-debug" for a debug
build
-+# Both will be empty in an optimized build
-+DEBUG_EXT= @DEBUG_EXT@
-+DEBUG_SUFFIX= @DEBUG_SUFFIX@
-+
- # Short name and location for Mac OS X Python framework
- UNIVERSALSDK=@UNIVERSALSDK@
- PYTHONFRAMEWORK= @PYTHONFRAMEWORK@
-@@ -176,7 +182,7 @@ LIBOBJDIR= Python/
- LIBOBJS= @LIBOBJS@
-
- PYTHON= python$(EXE)
--BUILDPYTHON= python$(BUILDEXE)
-+BUILDPYTHON= python$(BUILD_SUFFIX)$(BUILDEXE)
-
- # The task to run while instrument when building the profile-opt target
- PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
-@@ -422,7 +428,7 @@ sharedmods: $(BUILDPYTHON)
- *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
- esac
-
--libpython$(VERSION).so: $(LIBRARY_OBJS)
-+libpython$(VERSION)$(DEBUG_EXT).so: $(LIBRARY_OBJS)
- if test $(INSTSONAME) != $(LDLIBRARY); then \
- $(LDSHARED) $(LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS)
$(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
- $(LN) -f $(INSTSONAME) $@; \
-@@ -793,7 +799,7 @@ altbininstall: $(BUILDPYTHON)
- else true; \
- fi; \
- done
-- $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE)
-+ $(INSTALL_PROGRAM) $(BUILDPYTHON)
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
- if test -f $(LDLIBRARY); then \
- if test -n "$(DLLLIBRARY)" ; then \
- $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \
-@@ -807,15 +813,15 @@ altbininstall: $(BUILDPYTHON)
- fi
-
- bininstall: altbininstall
-- -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
-- then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
-+ -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
-+ then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
- else true; \
- fi
-- (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(EXE) $(PYTHON)3$(EXE))
-- -rm -f $(DESTDIR)$(BINDIR)/python3-config
-- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config)
-- -rm -f $(DESTDIR)$(LIBPC)/python3.pc
-- (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python3.pc)
-+ (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
$(PYTHON)3$(DEBUG_SUFFIX)$(EXE))
-+ -rm -f $(DESTDIR)$(BINDIR)/python3$(DEBUG_SUFFIX)-config
-+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(DEBUG_SUFFIX)-config
python3$(DEBUG_SUFFIX)-config)
-+ -rm -f $(DESTDIR)$(LIBPC)/python3$(DEBUG_SUFFIX).pc
-+ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)$(DEBUG_SUFFIX).pc
python3$(DEBUG_SUFFIX).pc)
-
- # Install the manual page
- maninstall:
-@@ -960,7 +966,7 @@ inclinstall:
-
- # Install the library and miscellaneous stuff needed for extending/embedding
- # This goes into $(exec_prefix)
--LIBPL= $(LIBP)/config
-+LIBPL= $(LIBP)/config$(DEBUG_SUFFIX)
-
- # pkgconfig directory
- LIBPC= $(LIBDIR)/pkgconfig
-@@ -981,14 +987,14 @@ libainstall: all
- $(INSTALL_DATA) Modules/Setup $(DESTDIR)$(LIBPL)/Setup
- $(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local
- $(INSTALL_DATA) Modules/Setup.config $(DESTDIR)$(LIBPL)/Setup.config
-- $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION).pc
-+ $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION)$(DEBUG_SUFFIX).pc
- $(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup
- $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh
- # Substitution happens here, as the completely-expanded BINDIR
- # is not available in configure
-- sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(EXE)," <
$(srcdir)/Misc/python-config.in >python-config
-- $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(VERSION)-config
-- rm python-config
-+ sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)," <
$(srcdir)/Misc/python-config.in >python$(DEBUG_SUFFIX)-config
-+ $(INSTALL_SCRIPT) python$(DEBUG_SUFFIX)-config
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)-config
-+ rm python$(DEBUG_SUFFIX)-config
- @if [ -s Modules/python.exp -a \
- "`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ];
then \
- echo; echo "Installing support files for building shared extension modules on
AIX:"; \
-diff -up Python-3.1.2/Misc/python-config.in.debug-build
Python-3.1.2/Misc/python-config.in
---- Python-3.1.2/Misc/python-config.in.debug-build 2007-09-01 03:27:37.000000000 -0400
-+++ Python-3.1.2/Misc/python-config.in 2010-05-20 22:48:14.582902254 -0400
-@@ -44,7 +44,7 @@ elif opt in ('--includes', '--cflags'):
-
- elif opt in ('--libs', '--ldflags'):
- libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
-- libs.append('-lpython'+pyver)
-+ libs.append('-lpython' + pyver + (sys.pydebug and "_d" or
""))
- # add the prefix/lib/pythonX.Y/config dir, but only if there is no
- # shared library in prefix/lib/.
- if opt == '--ldflags' and not getvar('Py_ENABLE_SHARED'):
-diff -up Python-3.1.2/Modules/makesetup.debug-build Python-3.1.2/Modules/makesetup
---- Python-3.1.2/Modules/makesetup.debug-build 2008-06-11 01:26:20.000000000 -0400
-+++ Python-3.1.2/Modules/makesetup 2010-05-20 22:48:14.582902254 -0400
-@@ -233,7 +233,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
- *$mod.o*) base=$mod;;
- *) base=${mod}module;;
- esac
-- file="$srcdir/$base\$(SO)"
-+ file="$srcdir/$base\$(DEBUG_EXT)\$(SO)"
- case $doconfig in
- no) SHAREDMODS="$SHAREDMODS $file";;
- esac
-diff -up Python-3.1.2/Python/dynload_shlib.c.debug-build
Python-3.1.2/Python/dynload_shlib.c
---- Python-3.1.2/Python/dynload_shlib.c.debug-build 2008-06-11 01:26:20.000000000 -0400
-+++ Python-3.1.2/Python/dynload_shlib.c 2010-05-20 22:48:14.582902254 -0400
-@@ -46,11 +46,16 @@ const struct filedescr _PyImport_DynLoad
- {"module.exe", "rb", C_EXTENSION},
- {"MODULE.EXE", "rb", C_EXTENSION},
- #else
-+#ifdef Py_DEBUG
-+ {"_d.so", "rb", C_EXTENSION},
-+ {"module_d.so", "rb", C_EXTENSION},
-+#else
- {".so", "rb", C_EXTENSION},
- {"module.so", "rb", C_EXTENSION},
--#endif
--#endif
--#endif
-+#endif /* Py_DEBUG */
-+#endif /* __VMS */
-+#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
-+#endif /* __CYGWIN__ */
- {0, 0}
- };
-
-diff -up Python-3.1.2/Python/sysmodule.c.debug-build Python-3.1.2/Python/sysmodule.c
---- Python-3.1.2/Python/sysmodule.c.debug-build 2010-03-03 06:55:53.000000000 -0500
-+++ Python-3.1.2/Python/sysmodule.c 2010-05-20 22:48:14.582902254 -0400
-@@ -1429,6 +1429,12 @@ _PySys_Init(void)
- FlagsType.tp_init = NULL;
- FlagsType.tp_new = NULL;
-
-+#ifdef Py_DEBUG
-+ PyDict_SetItemString(sysdict, "pydebug", Py_True);
-+#else
-+ PyDict_SetItemString(sysdict, "pydebug", Py_False);
-+#endif
-+
- /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
- #ifndef PY_NO_SHORT_FLOAT_REPR
- SET_SYS_FROM_STRING("float_repr_style",
-diff -up Python-3.1.2/runtests.sh.debug-build Python-3.1.2/runtests.sh
---- Python-3.1.2/runtests.sh.debug-build 2010-05-22 00:42:41.950889054 -0400
-+++ Python-3.1.2/runtests.sh 2010-05-22 00:54:47.503851503 -0400
-@@ -16,11 +16,14 @@ Flags (arguments starting with '-') are
- regrtest.py, except for -x, which is processed here."
-
- # Choose the Python binary.
--case `uname` in
--Darwin) PYTHON=./python.exe;;
--CYGWIN*) PYTHON=./python.exe;;
--*) PYTHON=./python;;
--esac
-+if [ -z $PYTHON ]
-+then
-+ case `uname` in
-+ Darwin) PYTHON=./python.exe;;
-+ CYGWIN*) PYTHON=./python.exe;;
-+ *) PYTHON=./python;;
-+ esac
-+fi
-
- PYTHON="$PYTHON -bb"
-
diff --git a/python-3.1.2-reformat-audioop.c.patch
b/python-3.1.2-reformat-audioop.c.patch
deleted file mode 100644
index 8592650..0000000
--- a/python-3.1.2-reformat-audioop.c.patch
+++ /dev/null
@@ -1,2727 +0,0 @@
---- python/branches/py3k/Modules/audioop.c 2009/05/16 01:46:11 72674
-+++ python/branches/py3k/Modules/audioop.c 2010/05/09 15:52:27 81032
-@@ -53,13 +53,13 @@
- static PyInt16
- search(PyInt16 val, PyInt16 *table, int size)
- {
-- int i;
-+ int i;
-
-- for (i = 0; i < size; i++) {
-- if (val <= *table++)
-- return (i);
-- }
-- return (size);
-+ for (i = 0; i < size; i++) {
-+ if (val <= *table++)
-+ return (i);
-+ }
-+ return (size);
- }
- #define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc])
- #define st_alaw2linear16(uc) (_st_alaw2linear16[uc])
-@@ -83,7 +83,7 @@
- -228, -212, -196, -180, -164, -148, -132,
- -120, -112, -104, -96, -88, -80, -72,
- -64, -56, -48, -40, -32, -24, -16,
-- -8, 0, 32124, 31100, 30076, 29052, 28028,
-+ -8, 0, 32124, 31100, 30076, 29052, 28028,
- 27004, 25980, 24956, 23932, 22908, 21884, 20860,
- 19836, 18812, 17788, 16764, 15996, 15484, 14972,
- 14460, 13948, 13436, 12924, 12412, 11900, 11388,
-@@ -100,8 +100,8 @@
- 372, 356, 340, 324, 308, 292, 276,
- 260, 244, 228, 212, 196, 180, 164,
- 148, 132, 120, 112, 104, 96, 88,
-- 80, 72, 64, 56, 48, 40, 32,
-- 24, 16, 8, 0
-+ 80, 72, 64, 56, 48, 40, 32,
-+ 24, 16, 8, 0
- };
-
- /*
-@@ -137,39 +137,39 @@
- * John Wiley & Sons, pps 98-111 and 472-476.
- */
- static unsigned char
--st_14linear2ulaw(PyInt16 pcm_val) /* 2's complement (14-bit range) */
-+st_14linear2ulaw(PyInt16 pcm_val) /* 2's complement (14-bit range) */
- {
-- PyInt16 mask;
-- PyInt16 seg;
-- unsigned char uval;
--
-- /* The original sox code does this in the calling function, not here */
-- pcm_val = pcm_val >> 2;
--
-- /* u-law inverts all bits */
-- /* Get the sign and the magnitude of the value. */
-- if (pcm_val < 0) {
-- pcm_val = -pcm_val;
-- mask = 0x7F;
-- } else {
-- mask = 0xFF;
-- }
-- if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */
-- pcm_val += (BIAS >> 2);
--
-- /* Convert the scaled magnitude to segment number. */
-- seg = search(pcm_val, seg_uend, 8);
--
-- /*
-- * Combine the sign, segment, quantization bits;
-- * and complement the code word.
-- */
-- if (seg >= 8) /* out of range, return maximum value. */
-- return (unsigned char) (0x7F ^ mask);
-- else {
-- uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1))
& 0xF);
-- return (uval ^ mask);
-- }
-+ PyInt16 mask;
-+ PyInt16 seg;
-+ unsigned char uval;
-+
-+ /* The original sox code does this in the calling function, not here */
-+ pcm_val = pcm_val >> 2;
-+
-+ /* u-law inverts all bits */
-+ /* Get the sign and the magnitude of the value. */
-+ if (pcm_val < 0) {
-+ pcm_val = -pcm_val;
-+ mask = 0x7F;
-+ } else {
-+ mask = 0xFF;
-+ }
-+ if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */
-+ pcm_val += (BIAS >> 2);
-+
-+ /* Convert the scaled magnitude to segment number. */
-+ seg = search(pcm_val, seg_uend, 8);
-+
-+ /*
-+ * Combine the sign, segment, quantization bits;
-+ * and complement the code word.
-+ */
-+ if (seg >= 8) /* out of range, return maximum value. */
-+ return (unsigned char) (0x7F ^ mask);
-+ else {
-+ uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) &
0xF);
-+ return (uval ^ mask);
-+ }
-
- }
-
-@@ -234,59 +234,59 @@
- * John Wiley & Sons, pps 98-111 and 472-476.
- */
- static unsigned char
--st_linear2alaw(PyInt16 pcm_val) /* 2's complement (13-bit range) */
-+st_linear2alaw(PyInt16 pcm_val) /* 2's complement (13-bit range) */
- {
-- PyInt16 mask;
-- short seg;
-- unsigned char aval;
--
-- /* The original sox code does this in the calling function, not here */
-- pcm_val = pcm_val >> 3;
--
-- /* A-law using even bit inversion */
-- if (pcm_val >= 0) {
-- mask = 0xD5; /* sign (7th) bit = 1 */
-- } else {
-- mask = 0x55; /* sign bit = 0 */
-- pcm_val = -pcm_val - 1;
-- }
--
-- /* Convert the scaled magnitude to segment number. */
-- seg = search(pcm_val, seg_aend, 8);
--
-- /* Combine the sign, segment, and quantization bits. */
--
-- if (seg >= 8) /* out of range, return maximum value. */
-- return (unsigned char) (0x7F ^ mask);
-- else {
-- aval = (unsigned char) seg << SEG_SHIFT;
-- if (seg < 2)
-- aval |= (pcm_val >> 1) & QUANT_MASK;
-- else
-- aval |= (pcm_val >> seg) & QUANT_MASK;
-- return (aval ^ mask);
-- }
-+ PyInt16 mask;
-+ short seg;
-+ unsigned char aval;
-+
-+ /* The original sox code does this in the calling function, not here */
-+ pcm_val = pcm_val >> 3;
-+
-+ /* A-law using even bit inversion */
-+ if (pcm_val >= 0) {
-+ mask = 0xD5; /* sign (7th) bit = 1 */
-+ } else {
-+ mask = 0x55; /* sign bit = 0 */
-+ pcm_val = -pcm_val - 1;
-+ }
-+
-+ /* Convert the scaled magnitude to segment number. */
-+ seg = search(pcm_val, seg_aend, 8);
-+
-+ /* Combine the sign, segment, and quantization bits. */
-+
-+ if (seg >= 8) /* out of range, return maximum value. */
-+ return (unsigned char) (0x7F ^ mask);
-+ else {
-+ aval = (unsigned char) seg << SEG_SHIFT;
-+ if (seg < 2)
-+ aval |= (pcm_val >> 1) & QUANT_MASK;
-+ else
-+ aval |= (pcm_val >> seg) & QUANT_MASK;
-+ return (aval ^ mask);
-+ }
- }
- /* End of code taken from sox */
-
- /* Intel ADPCM step variation table */
- static int indexTable[16] = {
-- -1, -1, -1, -1, 2, 4, 6, 8,
-- -1, -1, -1, -1, 2, 4, 6, 8,
-+ -1, -1, -1, -1, 2, 4, 6, 8,
-+ -1, -1, -1, -1, 2, 4, 6, 8,
- };
-
- static int stepsizeTable[89] = {
-- 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
-- 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
-- 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
-- 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
-- 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
-- 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
-- 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
-- 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
-- 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
-+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
-+ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
-+ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
-+ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
-+ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
-+ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
-+ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
-+ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
-+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
- };
--
-+
- #define CHARP(cp, i) ((signed char *)(cp+i))
- #define SHORTP(cp, i) ((short *)(cp+i))
- #define LONGP(cp, i) ((Py_Int32 *)(cp+i))
-@@ -298,137 +298,137 @@
- static PyObject *
- audioop_getsample(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#ii:getsample", &cp, &len,
&size, &i) )
-- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-- if ( i < 0 || i >= len/size ) {
-- PyErr_SetString(AudioopError, "Index out of range");
-- return 0;
-- }
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i*2);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i*4);
-- return PyLong_FromLong(val);
-+ signed char *cp;
-+ int len, size, val = 0;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#ii:getsample", &cp, &len,
&size, &i) )
-+ return 0;
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+ if ( i < 0 || i >= len/size ) {
-+ PyErr_SetString(AudioopError, "Index out of range");
-+ return 0;
-+ }
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i*2);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i*4);
-+ return PyLong_FromLong(val);
- }
-
- static PyObject *
- audioop_max(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0;
-- int i;
-- int max = 0;
--
-- if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size)
)
-- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-- for ( i=0; i<len; i+= size) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
-- if ( val < 0 ) val = (-val);
-- if ( val > max ) max = val;
-- }
-- return PyLong_FromLong(max);
-+ signed char *cp;
-+ int len, size, val = 0;
-+ int i;
-+ int max = 0;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) )
-+ return 0;
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+ for ( i=0; i<len; i+= size) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+ if ( val < 0 ) val = (-val);
-+ if ( val > max ) max = val;
-+ }
-+ return PyLong_FromLong(max);
- }
-
- static PyObject *
- audioop_minmax(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0;
-- int i;
-- int min = 0x7fffffff, max = -0x7fffffff;
--
-- if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len,
&size))
-- return NULL;
-- if (size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return NULL;
-- }
-- for (i = 0; i < len; i += size) {
-- if (size == 1) val = (int) *CHARP(cp, i);
-- else if (size == 2) val = (int) *SHORTP(cp, i);
-- else if (size == 4) val = (int) *LONGP(cp, i);
-- if (val > max) max = val;
-- if (val < min) min = val;
-- }
-- return Py_BuildValue("(ii)", min, max);
-+ signed char *cp;
-+ int len, size, val = 0;
-+ int i;
-+ int min = 0x7fffffff, max = -0x7fffffff;
-+
-+ if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
-+ return NULL;
-+ if (size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return NULL;
-+ }
-+ for (i = 0; i < len; i += size) {
-+ if (size == 1) val = (int) *CHARP(cp, i);
-+ else if (size == 2) val = (int) *SHORTP(cp, i);
-+ else if (size == 4) val = (int) *LONGP(cp, i);
-+ if (val > max) max = val;
-+ if (val < min) min = val;
-+ }
-+ return Py_BuildValue("(ii)", min, max);
- }
-
- static PyObject *
- audioop_avg(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0;
-- int i;
-- double avg = 0.0;
--
-- if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size)
)
-- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-- for ( i=0; i<len; i+= size) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
-- avg += val;
-- }
-- if ( len == 0 )
-- val = 0;
-- else
-- val = (int)(avg / (double)(len/size));
-- return PyLong_FromLong(val);
-+ signed char *cp;
-+ int len, size, val = 0;
-+ int i;
-+ double avg = 0.0;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) )
-+ return 0;
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+ for ( i=0; i<len; i+= size) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+ avg += val;
-+ }
-+ if ( len == 0 )
-+ val = 0;
-+ else
-+ val = (int)(avg / (double)(len/size));
-+ return PyLong_FromLong(val);
- }
-
- static PyObject *
- audioop_rms(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0;
-- int i;
-- double sum_squares = 0.0;
--
-- if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size)
)
-- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-- for ( i=0; i<len; i+= size) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
-- sum_squares += (double)val*(double)val;
-- }
-- if ( len == 0 )
-- val = 0;
-- else
-- val = (int)sqrt(sum_squares / (double)(len/size));
-- return PyLong_FromLong(val);
-+ signed char *cp;
-+ int len, size, val = 0;
-+ int i;
-+ double sum_squares = 0.0;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size) )
-+ return 0;
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+ for ( i=0; i<len; i+= size) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+ sum_squares += (double)val*(double)val;
-+ }
-+ if ( len == 0 )
-+ val = 0;
-+ else
-+ val = (int)sqrt(sum_squares / (double)(len/size));
-+ return PyLong_FromLong(val);
- }
-
- static double _sum2(short *a, short *b, int len)
- {
-- int i;
-- double sum = 0.0;
-+ int i;
-+ double sum = 0.0;
-
-- for( i=0; i<len; i++) {
-- sum = sum + (double)a[i]*(double)b[i];
-- }
-- return sum;
-+ for( i=0; i<len; i++) {
-+ sum = sum + (double)a[i]*(double)b[i];
-+ }
-+ return sum;
- }
-
- /*
-@@ -466,60 +466,60 @@
- static PyObject *
- audioop_findfit(PyObject *self, PyObject *args)
- {
-- short *cp1, *cp2;
-- int len1, len2;
-- int j, best_j;
-- double aj_m1, aj_lm1;
-- double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor;
--
-- /* Passing a short** for an 's' argument is correct only
-- if the string contents is aligned for interpretation
-- as short[]. Due to the definition of PyBytesObject,
-- this is currently (Python 2.6) the case. */
-- if ( !PyArg_ParseTuple(args, "s#s#:findfit",
-- (char**)&cp1, &len1, (char**)&cp2, &len2) )
-- return 0;
-- if ( len1 & 1 || len2 & 1 ) {
-- PyErr_SetString(AudioopError, "Strings should be
even-sized");
-- return 0;
-- }
-- len1 >>= 1;
-- len2 >>= 1;
--
-- if ( len1 < len2 ) {
-- PyErr_SetString(AudioopError, "First sample should be
longer");
-- return 0;
-- }
-- sum_ri_2 = _sum2(cp2, cp2, len2);
-- sum_aij_2 = _sum2(cp1, cp1, len2);
-- sum_aij_ri = _sum2(cp1, cp2, len2);
--
-- result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2;
--
-- best_result = result;
-- best_j = 0;
-- j = 0;
--
-- for ( j=1; j<=len1-len2; j++) {
-- aj_m1 = (double)cp1[j-1];
-- aj_lm1 = (double)cp1[j+len2-1];
--
-- sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1;
-- sum_aij_ri = _sum2(cp1+j, cp2, len2);
--
-- result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri)
-- / sum_aij_2;
--
-- if ( result < best_result ) {
-- best_result = result;
-- best_j = j;
-- }
--
-+ short *cp1, *cp2;
-+ int len1, len2;
-+ int j, best_j;
-+ double aj_m1, aj_lm1;
-+ double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor;
-+
-+ /* Passing a short** for an 's' argument is correct only
-+ if the string contents is aligned for interpretation
-+ as short[]. Due to the definition of PyBytesObject,
-+ this is currently (Python 2.6) the case. */
-+ if ( !PyArg_ParseTuple(args, "s#s#:findfit",
-+ (char**)&cp1, &len1, (char**)&cp2, &len2) )
-+ return 0;
-+ if ( len1 & 1 || len2 & 1 ) {
-+ PyErr_SetString(AudioopError, "Strings should be even-sized");
-+ return 0;
-+ }
-+ len1 >>= 1;
-+ len2 >>= 1;
-+
-+ if ( len1 < len2 ) {
-+ PyErr_SetString(AudioopError, "First sample should be longer");
-+ return 0;
-+ }
-+ sum_ri_2 = _sum2(cp2, cp2, len2);
-+ sum_aij_2 = _sum2(cp1, cp1, len2);
-+ sum_aij_ri = _sum2(cp1, cp2, len2);
-+
-+ result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2;
-+
-+ best_result = result;
-+ best_j = 0;
-+ j = 0;
-+
-+ for ( j=1; j<=len1-len2; j++) {
-+ aj_m1 = (double)cp1[j-1];
-+ aj_lm1 = (double)cp1[j+len2-1];
-+
-+ sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1;
-+ sum_aij_ri = _sum2(cp1+j, cp2, len2);
-+
-+ result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri)
-+ / sum_aij_2;
-+
-+ if ( result < best_result ) {
-+ best_result = result;
-+ best_j = j;
- }
-
-- factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2;
--
-- return Py_BuildValue("(if)", best_j, factor);
-+ }
-+
-+ factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2;
-+
-+ return Py_BuildValue("(if)", best_j, factor);
- }
-
- /*
-@@ -529,28 +529,28 @@
- static PyObject *
- audioop_findfactor(PyObject *self, PyObject *args)
- {
-- short *cp1, *cp2;
-- int len1, len2;
-- double sum_ri_2, sum_aij_ri, result;
--
-- if ( !PyArg_ParseTuple(args, "s#s#:findfactor",
-- (char**)&cp1, &len1, (char**)&cp2, &len2) )
-- return 0;
-- if ( len1 & 1 || len2 & 1 ) {
-- PyErr_SetString(AudioopError, "Strings should be
even-sized");
-- return 0;
-- }
-- if ( len1 != len2 ) {
-- PyErr_SetString(AudioopError, "Samples should be same size");
-- return 0;
-- }
-- len2 >>= 1;
-- sum_ri_2 = _sum2(cp2, cp2, len2);
-- sum_aij_ri = _sum2(cp1, cp2, len2);
-+ short *cp1, *cp2;
-+ int len1, len2;
-+ double sum_ri_2, sum_aij_ri, result;
-+
-+ if ( !PyArg_ParseTuple(args, "s#s#:findfactor",
-+ (char**)&cp1, &len1, (char**)&cp2, &len2) )
-+ return 0;
-+ if ( len1 & 1 || len2 & 1 ) {
-+ PyErr_SetString(AudioopError, "Strings should be even-sized");
-+ return 0;
-+ }
-+ if ( len1 != len2 ) {
-+ PyErr_SetString(AudioopError, "Samples should be same size");
-+ return 0;
-+ }
-+ len2 >>= 1;
-+ sum_ri_2 = _sum2(cp2, cp2, len2);
-+ sum_aij_ri = _sum2(cp1, cp2, len2);
-
-- result = sum_aij_ri / sum_ri_2;
-+ result = sum_aij_ri / sum_ri_2;
-
-- return PyFloat_FromDouble(result);
-+ return PyFloat_FromDouble(result);
- }
-
- /*
-@@ -560,1114 +560,1114 @@
- static PyObject *
- audioop_findmax(PyObject *self, PyObject *args)
- {
-- short *cp1;
-- int len1, len2;
-- int j, best_j;
-- double aj_m1, aj_lm1;
-- double result, best_result;
--
-- if ( !PyArg_ParseTuple(args, "s#i:findmax",
-- (char**)&cp1, &len1, &len2) )
-- return 0;
-- if ( len1 & 1 ) {
-- PyErr_SetString(AudioopError, "Strings should be
even-sized");
-- return 0;
-+ short *cp1;
-+ int len1, len2;
-+ int j, best_j;
-+ double aj_m1, aj_lm1;
-+ double result, best_result;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:findmax",
-+ (char**)&cp1, &len1, &len2) )
-+ return 0;
-+ if ( len1 & 1 ) {
-+ PyErr_SetString(AudioopError, "Strings should be even-sized");
-+ return 0;
-+ }
-+ len1 >>= 1;
-+
-+ if ( len2 < 0 || len1 < len2 ) {
-+ PyErr_SetString(AudioopError, "Input sample should be longer");
-+ return 0;
-+ }
-+
-+ result = _sum2(cp1, cp1, len2);
-+
-+ best_result = result;
-+ best_j = 0;
-+ j = 0;
-+
-+ for ( j=1; j<=len1-len2; j++) {
-+ aj_m1 = (double)cp1[j-1];
-+ aj_lm1 = (double)cp1[j+len2-1];
-+
-+ result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1;
-+
-+ if ( result > best_result ) {
-+ best_result = result;
-+ best_j = j;
- }
-- len1 >>= 1;
--
-- if ( len2 < 0 || len1 < len2 ) {
-- PyErr_SetString(AudioopError, "Input sample should be
longer");
-- return 0;
-- }
--
-- result = _sum2(cp1, cp1, len2);
-
-- best_result = result;
-- best_j = 0;
-- j = 0;
--
-- for ( j=1; j<=len1-len2; j++) {
-- aj_m1 = (double)cp1[j-1];
-- aj_lm1 = (double)cp1[j+len2-1];
--
-- result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1;
--
-- if ( result > best_result ) {
-- best_result = result;
-- best_j = j;
-- }
--
-- }
-+ }
-
-- return PyLong_FromLong(best_j);
-+ return PyLong_FromLong(best_j);
- }
-
- static PyObject *
- audioop_avgpp(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0, prevval = 0, prevextremevalid = 0,
-- prevextreme = 0;
-- int i;
-- double avg = 0.0;
-- int diff, prevdiff, extremediff, nextreme = 0;
--
-- if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len,
&size) )
-- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-- /* Compute first delta value ahead. Also automatically makes us
-- ** skip the first extreme value
-- */
-- if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
-- else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
-- else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
-- if ( size == 1 ) val = (int)*CHARP(cp, size);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, size);
-- else if ( size == 4 ) val = (int)*LONGP(cp, size);
-- prevdiff = val - prevval;
--
-- for ( i=size; i<len; i+= size) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
-- diff = val - prevval;
-- if ( diff*prevdiff < 0 ) {
-- /* Derivative changed sign. Compute difference to last
-- ** extreme value and remember.
-- */
-- if ( prevextremevalid ) {
-- extremediff = prevval - prevextreme;
-- if ( extremediff < 0 )
-- extremediff = -extremediff;
-- avg += extremediff;
-- nextreme++;
-- }
-- prevextremevalid = 1;
-- prevextreme = prevval;
-- }
-- prevval = val;
-- if ( diff != 0 )
-- prevdiff = diff;
-- }
-- if ( nextreme == 0 )
-- val = 0;
-- else
-- val = (int)(avg / (double)nextreme);
-- return PyLong_FromLong(val);
-+ signed char *cp;
-+ int len, size, val = 0, prevval = 0, prevextremevalid = 0,
-+ prevextreme = 0;
-+ int i;
-+ double avg = 0.0;
-+ int diff, prevdiff, extremediff, nextreme = 0;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len, &size) )
-+ return 0;
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+ /* Compute first delta value ahead. Also automatically makes us
-+ ** skip the first extreme value
-+ */
-+ if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
-+ else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
-+ else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
-+ if ( size == 1 ) val = (int)*CHARP(cp, size);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, size);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, size);
-+ prevdiff = val - prevval;
-+
-+ for ( i=size; i<len; i+= size) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+ diff = val - prevval;
-+ if ( diff*prevdiff < 0 ) {
-+ /* Derivative changed sign. Compute difference to last
-+ ** extreme value and remember.
-+ */
-+ if ( prevextremevalid ) {
-+ extremediff = prevval - prevextreme;
-+ if ( extremediff < 0 )
-+ extremediff = -extremediff;
-+ avg += extremediff;
-+ nextreme++;
-+ }
-+ prevextremevalid = 1;
-+ prevextreme = prevval;
-+ }
-+ prevval = val;
-+ if ( diff != 0 )
-+ prevdiff = diff;
-+ }
-+ if ( nextreme == 0 )
-+ val = 0;
-+ else
-+ val = (int)(avg / (double)nextreme);
-+ return PyLong_FromLong(val);
- }
-
- static PyObject *
- audioop_maxpp(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0, prevval = 0, prevextremevalid = 0,
-- prevextreme = 0;
-- int i;
-- int max = 0;
-- int diff, prevdiff, extremediff;
--
-- if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len,
&size) )
-- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-- /* Compute first delta value ahead. Also automatically makes us
-- ** skip the first extreme value
-- */
-- if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
-- else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
-- else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
-- if ( size == 1 ) val = (int)*CHARP(cp, size);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, size);
-- else if ( size == 4 ) val = (int)*LONGP(cp, size);
-- prevdiff = val - prevval;
--
-- for ( i=size; i<len; i+= size) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
-- diff = val - prevval;
-- if ( diff*prevdiff < 0 ) {
-- /* Derivative changed sign. Compute difference to
-- ** last extreme value and remember.
-- */
-- if ( prevextremevalid ) {
-- extremediff = prevval - prevextreme;
-- if ( extremediff < 0 )
-- extremediff = -extremediff;
-- if ( extremediff > max )
-- max = extremediff;
-- }
-- prevextremevalid = 1;
-- prevextreme = prevval;
-- }
-- prevval = val;
-- if ( diff != 0 )
-- prevdiff = diff;
-- }
-- return PyLong_FromLong(max);
-+ signed char *cp;
-+ int len, size, val = 0, prevval = 0, prevextremevalid = 0,
-+ prevextreme = 0;
-+ int i;
-+ int max = 0;
-+ int diff, prevdiff, extremediff;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len, &size) )
-+ return 0;
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+ /* Compute first delta value ahead. Also automatically makes us
-+ ** skip the first extreme value
-+ */
-+ if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
-+ else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
-+ else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
-+ if ( size == 1 ) val = (int)*CHARP(cp, size);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, size);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, size);
-+ prevdiff = val - prevval;
-+
-+ for ( i=size; i<len; i+= size) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+ diff = val - prevval;
-+ if ( diff*prevdiff < 0 ) {
-+ /* Derivative changed sign. Compute difference to
-+ ** last extreme value and remember.
-+ */
-+ if ( prevextremevalid ) {
-+ extremediff = prevval - prevextreme;
-+ if ( extremediff < 0 )
-+ extremediff = -extremediff;
-+ if ( extremediff > max )
-+ max = extremediff;
-+ }
-+ prevextremevalid = 1;
-+ prevextreme = prevval;
-+ }
-+ prevval = val;
-+ if ( diff != 0 )
-+ prevdiff = diff;
-+ }
-+ return PyLong_FromLong(max);
- }
-
- static PyObject *
- audioop_cross(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- int len, size, val = 0;
-- int i;
-- int prevval, ncross;
--
-- if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len,
&size) )
-- return 0;
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
-- ncross = -1;
-- prevval = 17; /* Anything <> 0,1 */
-- for ( i=0; i<len; i+= size) {
-- if ( size == 1 ) val = ((int)*CHARP(cp, i)) >> 7;
-- else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15;
-- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31;
-- val = val & 1;
-- if ( val != prevval ) ncross++;
-- prevval = val;
-- }
-- return PyLong_FromLong(ncross);
-+ signed char *cp;
-+ int len, size, val = 0;
-+ int i;
-+ int prevval, ncross;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len, &size) )
-+ return 0;
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+ ncross = -1;
-+ prevval = 17; /* Anything <> 0,1 */
-+ for ( i=0; i<len; i+= size) {
-+ if ( size == 1 ) val = ((int)*CHARP(cp, i)) >> 7;
-+ else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15;
-+ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31;
-+ val = val & 1;
-+ if ( val != prevval ) ncross++;
-+ prevval = val;
-+ }
-+ return PyLong_FromLong(ncross);
- }
-
- static PyObject *
- audioop_mul(PyObject *self, PyObject *args)
- {
-- signed char *cp, *ncp;
-- int len, size, val = 0;
-- double factor, fval, maxval;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size,
&factor ) )
-- return 0;
--
-- if ( size == 1 ) maxval = (double) 0x7f;
-- else if ( size == 2 ) maxval = (double) 0x7fff;
-- else if ( size == 4 ) maxval = (double) 0x7fffffff;
-- else {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- rv = PyBytes_FromStringAndSize(NULL, len);
-- if ( rv == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(rv);
--
--
-- for ( i=0; i < len; i += size ) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
-- fval = (double)val*factor;
-- if ( fval > maxval ) fval = maxval;
-- else if ( fval < -maxval ) fval = -maxval;
-- val = (int)fval;
-- if ( size == 1 ) *CHARP(ncp, i) = (signed char)val;
-- else if ( size == 2 ) *SHORTP(ncp, i) = (short)val;
-- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val;
-- }
-- return rv;
-+ signed char *cp, *ncp;
-+ int len, size, val = 0;
-+ double factor, fval, maxval;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size,
&factor ) )
-+ return 0;
-+
-+ if ( size == 1 ) maxval = (double) 0x7f;
-+ else if ( size == 2 ) maxval = (double) 0x7fff;
-+ else if ( size == 4 ) maxval = (double) 0x7fffffff;
-+ else {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, len);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(rv);
-+
-+
-+ for ( i=0; i < len; i += size ) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+ fval = (double)val*factor;
-+ if ( fval > maxval ) fval = maxval;
-+ else if ( fval < -maxval ) fval = -maxval;
-+ val = (int)fval;
-+ if ( size == 1 ) *CHARP(ncp, i) = (signed char)val;
-+ else if ( size == 2 ) *SHORTP(ncp, i) = (short)val;
-+ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val;
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_tomono(PyObject *self, PyObject *args)
- {
-- Py_buffer pcp;
-- signed char *cp, *ncp;
-- int len, size, val1 = 0, val2 = 0;
-- double fac1, fac2, fval, maxval;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s*idd:tomono",
-- &pcp, &size, &fac1, &fac2 ) )
-- return 0;
-- cp = pcp.buf;
-- len = pcp.len;
--
-- if ( size == 1 ) maxval = (double) 0x7f;
-- else if ( size == 2 ) maxval = (double) 0x7fff;
-- else if ( size == 4 ) maxval = (double) 0x7fffffff;
-- else {
-- PyBuffer_Release(&pcp);
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- rv = PyBytes_FromStringAndSize(NULL, len/2);
-- if ( rv == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(rv);
--
--
-- for ( i=0; i < len; i += size*2 ) {
-- if ( size == 1 ) val1 = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val1 = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val1 = (int)*LONGP(cp, i);
-- if ( size == 1 ) val2 = (int)*CHARP(cp, i+1);
-- else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2);
-- else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4);
-- fval = (double)val1*fac1 + (double)val2*fac2;
-- if ( fval > maxval ) fval = maxval;
-- else if ( fval < -maxval ) fval = -maxval;
-- val1 = (int)fval;
-- if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1;
-- else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1;
-- else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1;
-- }
-- PyBuffer_Release(&pcp);
-- return rv;
-+ Py_buffer pcp;
-+ signed char *cp, *ncp;
-+ int len, size, val1 = 0, val2 = 0;
-+ double fac1, fac2, fval, maxval;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s*idd:tomono",
-+ &pcp, &size, &fac1, &fac2 ) )
-+ return 0;
-+ cp = pcp.buf;
-+ len = pcp.len;
-+
-+ if ( size == 1 ) maxval = (double) 0x7f;
-+ else if ( size == 2 ) maxval = (double) 0x7fff;
-+ else if ( size == 4 ) maxval = (double) 0x7fffffff;
-+ else {
-+ PyBuffer_Release(&pcp);
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, len/2);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(rv);
-+
-+
-+ for ( i=0; i < len; i += size*2 ) {
-+ if ( size == 1 ) val1 = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val1 = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val1 = (int)*LONGP(cp, i);
-+ if ( size == 1 ) val2 = (int)*CHARP(cp, i+1);
-+ else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2);
-+ else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4);
-+ fval = (double)val1*fac1 + (double)val2*fac2;
-+ if ( fval > maxval ) fval = maxval;
-+ else if ( fval < -maxval ) fval = -maxval;
-+ val1 = (int)fval;
-+ if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1;
-+ else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1;
-+ else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1;
-+ }
-+ PyBuffer_Release(&pcp);
-+ return rv;
- }
-
- static PyObject *
- audioop_tostereo(PyObject *self, PyObject *args)
- {
-- signed char *cp, *ncp;
-- int len, new_len, size, val1, val2, val = 0;
-- double fac1, fac2, fval, maxval;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#idd:tostereo",
-- &cp, &len, &size, &fac1, &fac2 ) )
-- return 0;
--
-- if ( size == 1 ) maxval = (double) 0x7f;
-- else if ( size == 2 ) maxval = (double) 0x7fff;
-- else if ( size == 4 ) maxval = (double) 0x7fffffff;
-- else {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- new_len = len*2;
-- if (new_len < 0) {
-- PyErr_SetString(PyExc_MemoryError,
-- "not enough memory for output buffer");
-- return 0;
-- }
-+ signed char *cp, *ncp;
-+ int len, new_len, size, val1, val2, val = 0;
-+ double fac1, fac2, fval, maxval;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#idd:tostereo",
-+ &cp, &len, &size, &fac1, &fac2 ) )
-+ return 0;
-+
-+ if ( size == 1 ) maxval = (double) 0x7f;
-+ else if ( size == 2 ) maxval = (double) 0x7fff;
-+ else if ( size == 4 ) maxval = (double) 0x7fffffff;
-+ else {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ new_len = len*2;
-+ if (new_len < 0) {
-+ PyErr_SetString(PyExc_MemoryError,
-+ "not enough memory for output buffer");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(rv);
-
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-- if ( rv == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(rv);
--
--
-- for ( i=0; i < len; i += size ) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
--
-- fval = (double)val*fac1;
-- if ( fval > maxval ) fval = maxval;
-- else if ( fval < -maxval ) fval = -maxval;
-- val1 = (int)fval;
--
-- fval = (double)val*fac2;
-- if ( fval > maxval ) fval = maxval;
-- else if ( fval < -maxval ) fval = -maxval;
-- val2 = (int)fval;
--
-- if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1;
-- else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
-- else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1;
--
-- if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2;
-- else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2;
-- else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2;
-- }
-- return rv;
-+
-+ for ( i=0; i < len; i += size ) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+
-+ fval = (double)val*fac1;
-+ if ( fval > maxval ) fval = maxval;
-+ else if ( fval < -maxval ) fval = -maxval;
-+ val1 = (int)fval;
-+
-+ fval = (double)val*fac2;
-+ if ( fval > maxval ) fval = maxval;
-+ else if ( fval < -maxval ) fval = -maxval;
-+ val2 = (int)fval;
-+
-+ if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1;
-+ else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
-+ else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1;
-+
-+ if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2;
-+ else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2;
-+ else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2;
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_add(PyObject *self, PyObject *args)
- {
-- signed char *cp1, *cp2, *ncp;
-- int len1, len2, size, val1 = 0, val2 = 0, maxval, newval;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#s#i:add",
-- &cp1, &len1, &cp2, &len2, &size ) )
-- return 0;
--
-- if ( len1 != len2 ) {
-- PyErr_SetString(AudioopError, "Lengths should be the same");
-- return 0;
-- }
--
-- if ( size == 1 ) maxval = 0x7f;
-- else if ( size == 2 ) maxval = 0x7fff;
-- else if ( size == 4 ) maxval = 0x7fffffff;
-- else {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- rv = PyBytes_FromStringAndSize(NULL, len1);
-- if ( rv == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(rv);
--
-- for ( i=0; i < len1; i += size ) {
-- if ( size == 1 ) val1 = (int)*CHARP(cp1, i);
-- else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i);
-- else if ( size == 4 ) val1 = (int)*LONGP(cp1, i);
--
-- if ( size == 1 ) val2 = (int)*CHARP(cp2, i);
-- else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i);
-- else if ( size == 4 ) val2 = (int)*LONGP(cp2, i);
--
-- newval = val1 + val2;
-- /* truncate in case of overflow */
-- if (newval > maxval) newval = maxval;
-- else if (newval < -maxval) newval = -maxval;
-- else if (size == 4 && (newval^val1) < 0 &&
(newval^val2) < 0)
-- newval = val1 > 0 ? maxval : - maxval;
--
-- if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval;
-- else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval;
-- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval;
-- }
-- return rv;
-+ signed char *cp1, *cp2, *ncp;
-+ int len1, len2, size, val1 = 0, val2 = 0, maxval, newval;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#s#i:add",
-+ &cp1, &len1, &cp2, &len2, &size ) )
-+ return 0;
-+
-+ if ( len1 != len2 ) {
-+ PyErr_SetString(AudioopError, "Lengths should be the same");
-+ return 0;
-+ }
-+
-+ if ( size == 1 ) maxval = 0x7f;
-+ else if ( size == 2 ) maxval = 0x7fff;
-+ else if ( size == 4 ) maxval = 0x7fffffff;
-+ else {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, len1);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(rv);
-+
-+ for ( i=0; i < len1; i += size ) {
-+ if ( size == 1 ) val1 = (int)*CHARP(cp1, i);
-+ else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i);
-+ else if ( size == 4 ) val1 = (int)*LONGP(cp1, i);
-+
-+ if ( size == 1 ) val2 = (int)*CHARP(cp2, i);
-+ else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i);
-+ else if ( size == 4 ) val2 = (int)*LONGP(cp2, i);
-+
-+ newval = val1 + val2;
-+ /* truncate in case of overflow */
-+ if (newval > maxval) newval = maxval;
-+ else if (newval < -maxval) newval = -maxval;
-+ else if (size == 4 && (newval^val1) < 0 && (newval^val2) <
0)
-+ newval = val1 > 0 ? maxval : - maxval;
-+
-+ if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval;
-+ else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval;
-+ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval;
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_bias(PyObject *self, PyObject *args)
- {
-- signed char *cp, *ncp;
-- int len, size, val = 0;
-- PyObject *rv;
-- int i;
-- int bias;
--
-- if ( !PyArg_ParseTuple(args, "s#ii:bias",
-- &cp, &len, &size , &bias) )
-- return 0;
--
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- rv = PyBytes_FromStringAndSize(NULL, len);
-- if ( rv == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(rv);
--
--
-- for ( i=0; i < len; i += size ) {
-- if ( size == 1 ) val = (int)*CHARP(cp, i);
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = (int)*LONGP(cp, i);
--
-- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val+bias);
-- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias);
-- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias);
-- }
-- return rv;
-+ signed char *cp, *ncp;
-+ int len, size, val = 0;
-+ PyObject *rv;
-+ int i;
-+ int bias;
-+
-+ if ( !PyArg_ParseTuple(args, "s#ii:bias",
-+ &cp, &len, &size , &bias) )
-+ return 0;
-+
-+ if ( size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, len);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(rv);
-+
-+
-+ for ( i=0; i < len; i += size ) {
-+ if ( size == 1 ) val = (int)*CHARP(cp, i);
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = (int)*LONGP(cp, i);
-+
-+ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val+bias);
-+ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias);
-+ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias);
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_reverse(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- unsigned char *ncp;
-- int len, size, val = 0;
-- PyObject *rv;
-- int i, j;
--
-- if ( !PyArg_ParseTuple(args, "s#i:reverse",
-- &cp, &len, &size) )
-- return 0;
--
-- if ( size != 1 && size != 2 && size != 4 ) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- rv = PyBytes_FromStringAndSize(NULL, len);
-- if ( rv == 0 )
-- return 0;
-- ncp = (unsigned char *)PyBytes_AsString(rv);
--
-- for ( i=0; i < len; i += size ) {
-- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
--
-- j = len - i - size;
--
-- if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
-- else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val);
-- else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
-- }
-- return rv;
-+ signed char *cp;
-+ unsigned char *ncp;
-+ int len, size, val = 0;
-+ PyObject *rv;
-+ int i, j;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:reverse",
-+ &cp, &len, &size) )
-+ return 0;
-+
-+ if ( size != 1 && size != 2 && size != 4 ) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, len);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (unsigned char *)PyBytes_AsString(rv);
-+
-+ for ( i=0; i < len; i += size ) {
-+ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
-+
-+ j = len - i - size;
-+
-+ if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
-+ else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val);
-+ else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_lin2lin(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- unsigned char *ncp;
-- int len, new_len, size, size2, val = 0;
-- PyObject *rv;
-- int i, j;
--
-- if ( !PyArg_ParseTuple(args, "s#ii:lin2lin",
-- &cp, &len, &size, &size2) )
-- return 0;
--
-- if ( (size != 1 && size != 2 && size != 4) ||
-- (size2 != 1 && size2 != 2 && size2 != 4)) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- new_len = (len/size)*size2;
-- if (new_len < 0) {
-- PyErr_SetString(PyExc_MemoryError,
-- "not enough memory for output buffer");
-- return 0;
-- }
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-- if ( rv == 0 )
-- return 0;
-- ncp = (unsigned char *)PyBytes_AsString(rv);
--
-- for ( i=0, j=0; i < len; i += size, j += size2 ) {
-- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
--
-- if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
-- else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val);
-- else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
-- }
-- return rv;
-+ signed char *cp;
-+ unsigned char *ncp;
-+ int len, new_len, size, size2, val = 0;
-+ PyObject *rv;
-+ int i, j;
-+
-+ if ( !PyArg_ParseTuple(args, "s#ii:lin2lin",
-+ &cp, &len, &size, &size2) )
-+ return 0;
-+
-+ if ( (size != 1 && size != 2 && size != 4) ||
-+ (size2 != 1 && size2 != 2 && size2 != 4)) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ new_len = (len/size)*size2;
-+ if (new_len < 0) {
-+ PyErr_SetString(PyExc_MemoryError,
-+ "not enough memory for output buffer");
-+ return 0;
-+ }
-+ rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (unsigned char *)PyBytes_AsString(rv);
-+
-+ for ( i=0, j=0; i < len; i += size, j += size2 ) {
-+ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
-+
-+ if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
-+ else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val);
-+ else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
-+ }
-+ return rv;
- }
-
- static int
- gcd(int a, int b)
- {
-- while (b > 0) {
-- int tmp = a % b;
-- a = b;
-- b = tmp;
-- }
-- return a;
-+ while (b > 0) {
-+ int tmp = a % b;
-+ a = b;
-+ b = tmp;
-+ }
-+ return a;
- }
-
- static PyObject *
- audioop_ratecv(PyObject *self, PyObject *args)
- {
-- char *cp, *ncp;
-- int len, size, nchannels, inrate, outrate, weightA, weightB;
-- int chan, d, *prev_i, *cur_i, cur_o;
-- PyObject *state, *samps, *str, *rv = NULL;
-- int bytes_per_frame;
-- size_t alloc_size;
--
-- weightA = 1;
-- weightB = 0;
-- if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len,
&size,
-- &nchannels, &inrate, &outrate, &state,
-- &weightA, &weightB))
-- return NULL;
-- if (size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return NULL;
-- }
-- if (nchannels < 1) {
-- PyErr_SetString(AudioopError, "# of channels should be >=
1");
-- return NULL;
-- }
-- bytes_per_frame = size * nchannels;
-- if (bytes_per_frame / nchannels != size) {
-- /* This overflow test is rigorously correct because
-- both multiplicands are >= 1. Use the argument names
-- from the docs for the error msg. */
-- PyErr_SetString(PyExc_OverflowError,
-- "width * nchannels too big for a C int");
-- return NULL;
-- }
-- if (weightA < 1 || weightB < 0) {
-- PyErr_SetString(AudioopError,
-- "weightA should be >= 1, weightB should be >=
0");
-- return NULL;
-- }
-- if (len % bytes_per_frame != 0) {
-- PyErr_SetString(AudioopError, "not a whole number of
frames");
-- return NULL;
-- }
-- if (inrate <= 0 || outrate <= 0) {
-- PyErr_SetString(AudioopError, "sampling rate not > 0");
-- return NULL;
-- }
-- /* divide inrate and outrate by their greatest common divisor */
-- d = gcd(inrate, outrate);
-- inrate /= d;
-- outrate /= d;
--
-- alloc_size = sizeof(int) * (unsigned)nchannels;
-- if (alloc_size < (unsigned)nchannels) {
-- PyErr_SetString(PyExc_MemoryError,
-- "not enough memory for output buffer");
-- return 0;
-- }
-- prev_i = (int *) malloc(alloc_size);
-- cur_i = (int *) malloc(alloc_size);
-- if (prev_i == NULL || cur_i == NULL) {
-- (void) PyErr_NoMemory();
-+ char *cp, *ncp;
-+ int len, size, nchannels, inrate, outrate, weightA, weightB;
-+ int chan, d, *prev_i, *cur_i, cur_o;
-+ PyObject *state, *samps, *str, *rv = NULL;
-+ int bytes_per_frame;
-+ size_t alloc_size;
-+
-+ weightA = 1;
-+ weightB = 0;
-+ if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len,
&size,
-+ &nchannels, &inrate, &outrate, &state,
-+ &weightA, &weightB))
-+ return NULL;
-+ if (size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return NULL;
-+ }
-+ if (nchannels < 1) {
-+ PyErr_SetString(AudioopError, "# of channels should be >= 1");
-+ return NULL;
-+ }
-+ bytes_per_frame = size * nchannels;
-+ if (bytes_per_frame / nchannels != size) {
-+ /* This overflow test is rigorously correct because
-+ both multiplicands are >= 1. Use the argument names
-+ from the docs for the error msg. */
-+ PyErr_SetString(PyExc_OverflowError,
-+ "width * nchannels too big for a C int");
-+ return NULL;
-+ }
-+ if (weightA < 1 || weightB < 0) {
-+ PyErr_SetString(AudioopError,
-+ "weightA should be >= 1, weightB should be >= 0");
-+ return NULL;
-+ }
-+ if (len % bytes_per_frame != 0) {
-+ PyErr_SetString(AudioopError, "not a whole number of frames");
-+ return NULL;
-+ }
-+ if (inrate <= 0 || outrate <= 0) {
-+ PyErr_SetString(AudioopError, "sampling rate not > 0");
-+ return NULL;
-+ }
-+ /* divide inrate and outrate by their greatest common divisor */
-+ d = gcd(inrate, outrate);
-+ inrate /= d;
-+ outrate /= d;
-+
-+ alloc_size = sizeof(int) * (unsigned)nchannels;
-+ if (alloc_size < (unsigned)nchannels) {
-+ PyErr_SetString(PyExc_MemoryError,
-+ "not enough memory for output buffer");
-+ return 0;
-+ }
-+ prev_i = (int *) malloc(alloc_size);
-+ cur_i = (int *) malloc(alloc_size);
-+ if (prev_i == NULL || cur_i == NULL) {
-+ (void) PyErr_NoMemory();
-+ goto exit;
-+ }
-+
-+ len /= bytes_per_frame; /* # of frames */
-+
-+ if (state == Py_None) {
-+ d = -outrate;
-+ for (chan = 0; chan < nchannels; chan++)
-+ prev_i[chan] = cur_i[chan] = 0;
-+ }
-+ else {
-+ if (!PyArg_ParseTuple(state,
-+ "iO!;audioop.ratecv: illegal state argument",
-+ &d, &PyTuple_Type, &samps))
-+ goto exit;
-+ if (PyTuple_Size(samps) != nchannels) {
-+ PyErr_SetString(AudioopError,
-+ "illegal state argument");
-+ goto exit;
-+ }
-+ for (chan = 0; chan < nchannels; chan++) {
-+ if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan),
-+ "ii:ratecv", &prev_i[chan],
-+ &cur_i[chan]))
- goto exit;
- }
-+ }
-
-- len /= bytes_per_frame; /* # of frames */
-+ /* str <- Space for the output buffer. */
-+ {
-+ /* There are len input frames, so we need (mathematically)
-+ ceiling(len*outrate/inrate) output frames, and each frame
-+ requires bytes_per_frame bytes. Computing this
-+ without spurious overflow is the challenge; we can
-+ settle for a reasonable upper bound, though. */
-+ int ceiling; /* the number of output frames */
-+ int nbytes; /* the number of output bytes needed */
-+ int q = len / inrate;
-+ /* Now len = q * inrate + r exactly (with r = len % inrate),
-+ and this is less than q * inrate + inrate = (q+1)*inrate.
-+ So a reasonable upper bound on len*outrate/inrate is
-+ ((q+1)*inrate)*outrate/inrate =
-+ (q+1)*outrate.
-+ */
-+ ceiling = (q+1) * outrate;
-+ nbytes = ceiling * bytes_per_frame;
-+ /* See whether anything overflowed; if not, get the space. */
-+ if (q+1 < 0 ||
-+ ceiling / outrate != q+1 ||
-+ nbytes / bytes_per_frame != ceiling)
-+ str = NULL;
-+ else
-+ str = PyBytes_FromStringAndSize(NULL, nbytes);
-
-- if (state == Py_None) {
-- d = -outrate;
-+ if (str == NULL) {
-+ PyErr_SetString(PyExc_MemoryError,
-+ "not enough memory for output buffer");
-+ goto exit;
-+ }
-+ }
-+ ncp = PyBytes_AsString(str);
-+
-+ for (;;) {
-+ while (d < 0) {
-+ if (len == 0) {
-+ samps = PyTuple_New(nchannels);
-+ if (samps == NULL)
-+ goto exit;
- for (chan = 0; chan < nchannels; chan++)
-- prev_i[chan] = cur_i[chan] = 0;
-- }
-- else {
-- if (!PyArg_ParseTuple(state,
-- "iO!;audioop.ratecv: illegal state argument",
-- &d, &PyTuple_Type, &samps))
-- goto exit;
-- if (PyTuple_Size(samps) != nchannels) {
-- PyErr_SetString(AudioopError,
-- "illegal state argument");
-- goto exit;
-- }
-- for (chan = 0; chan < nchannels; chan++) {
-- if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan),
-- "ii:ratecv", &prev_i[chan],
-- &cur_i[chan]))
-- goto exit;
-- }
-- }
--
-- /* str <- Space for the output buffer. */
-- {
-- /* There are len input frames, so we need (mathematically)
-- ceiling(len*outrate/inrate) output frames, and each frame
-- requires bytes_per_frame bytes. Computing this
-- without spurious overflow is the challenge; we can
-- settle for a reasonable upper bound, though. */
-- int ceiling; /* the number of output frames */
-- int nbytes; /* the number of output bytes needed */
-- int q = len / inrate;
-- /* Now len = q * inrate + r exactly (with r = len % inrate),
-- and this is less than q * inrate + inrate = (q+1)*inrate.
-- So a reasonable upper bound on len*outrate/inrate is
-- ((q+1)*inrate)*outrate/inrate =
-- (q+1)*outrate.
-- */
-- ceiling = (q+1) * outrate;
-- nbytes = ceiling * bytes_per_frame;
-- /* See whether anything overflowed; if not, get the space. */
-- if (q+1 < 0 ||
-- ceiling / outrate != q+1 ||
-- nbytes / bytes_per_frame != ceiling)
-- str = NULL;
-- else
-- str = PyBytes_FromStringAndSize(NULL, nbytes);
--
-- if (str == NULL) {
-- PyErr_SetString(PyExc_MemoryError,
-- "not enough memory for output buffer");
-- goto exit;
-- }
-- }
-- ncp = PyBytes_AsString(str);
--
-- for (;;) {
-- while (d < 0) {
-- if (len == 0) {
-- samps = PyTuple_New(nchannels);
-- if (samps == NULL)
-- goto exit;
-- for (chan = 0; chan < nchannels; chan++)
-- PyTuple_SetItem(samps, chan,
-- Py_BuildValue("(ii)",
-- prev_i[chan],
-- cur_i[chan]));
-- if (PyErr_Occurred())
-- goto exit;
-- /* We have checked before that the length
-- * of the string fits into int. */
-- len = (int)(ncp - PyBytes_AsString(str));
-- rv = PyBytes_FromStringAndSize
-- (PyBytes_AsString(str), len);
-- Py_DECREF(str);
-- str = rv;
-- if (str == NULL)
-- goto exit;
-- rv = Py_BuildValue("(O(iO))", str, d, samps);
-- Py_DECREF(samps);
-- Py_DECREF(str);
-- goto exit; /* return rv */
-- }
-- for (chan = 0; chan < nchannels; chan++) {
-- prev_i[chan] = cur_i[chan];
-- if (size == 1)
-- cur_i[chan] = ((int)*CHARP(cp, 0)) << 8;
-- else if (size == 2)
-- cur_i[chan] = (int)*SHORTP(cp, 0);
-- else if (size == 4)
-- cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16;
-- cp += size;
-- /* implements a simple digital filter */
-- cur_i[chan] =
-- (weightA * cur_i[chan] +
-- weightB * prev_i[chan]) /
-- (weightA + weightB);
-- }
-- len--;
-- d += outrate;
-- }
-- while (d >= 0) {
-- for (chan = 0; chan < nchannels; chan++) {
-- cur_o = (prev_i[chan] * d +
-- cur_i[chan] * (outrate - d)) /
-- outrate;
-- if (size == 1)
-- *CHARP(ncp, 0) = (signed char)(cur_o >> 8);
-- else if (size == 2)
-- *SHORTP(ncp, 0) = (short)(cur_o);
-- else if (size == 4)
-- *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16);
-- ncp += size;
-- }
-- d -= inrate;
-- }
-+ PyTuple_SetItem(samps, chan,
-+ Py_BuildValue("(ii)",
-+ prev_i[chan],
-+ cur_i[chan]));
-+ if (PyErr_Occurred())
-+ goto exit;
-+ /* We have checked before that the length
-+ * of the string fits into int. */
-+ len = (int)(ncp - PyBytes_AsString(str));
-+ rv = PyBytes_FromStringAndSize
-+ (PyBytes_AsString(str), len);
-+ Py_DECREF(str);
-+ str = rv;
-+ if (str == NULL)
-+ goto exit;
-+ rv = Py_BuildValue("(O(iO))", str, d, samps);
-+ Py_DECREF(samps);
-+ Py_DECREF(str);
-+ goto exit; /* return rv */
-+ }
-+ for (chan = 0; chan < nchannels; chan++) {
-+ prev_i[chan] = cur_i[chan];
-+ if (size == 1)
-+ cur_i[chan] = ((int)*CHARP(cp, 0)) << 8;
-+ else if (size == 2)
-+ cur_i[chan] = (int)*SHORTP(cp, 0);
-+ else if (size == 4)
-+ cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16;
-+ cp += size;
-+ /* implements a simple digital filter */
-+ cur_i[chan] =
-+ (weightA * cur_i[chan] +
-+ weightB * prev_i[chan]) /
-+ (weightA + weightB);
-+ }
-+ len--;
-+ d += outrate;
-+ }
-+ while (d >= 0) {
-+ for (chan = 0; chan < nchannels; chan++) {
-+ cur_o = (prev_i[chan] * d +
-+ cur_i[chan] * (outrate - d)) /
-+ outrate;
-+ if (size == 1)
-+ *CHARP(ncp, 0) = (signed char)(cur_o >> 8);
-+ else if (size == 2)
-+ *SHORTP(ncp, 0) = (short)(cur_o);
-+ else if (size == 4)
-+ *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16);
-+ ncp += size;
-+ }
-+ d -= inrate;
- }
-+ }
- exit:
-- if (prev_i != NULL)
-- free(prev_i);
-- if (cur_i != NULL)
-- free(cur_i);
-- return rv;
-+ if (prev_i != NULL)
-+ free(prev_i);
-+ if (cur_i != NULL)
-+ free(cur_i);
-+ return rv;
- }
-
- static PyObject *
- audioop_lin2ulaw(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- unsigned char *ncp;
-- int len, size, val = 0;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw",
-- &cp, &len, &size) )
-- return 0 ;
--
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- rv = PyBytes_FromStringAndSize(NULL, len/size);
-- if ( rv == 0 )
-- return 0;
-- ncp = (unsigned char *)PyBytes_AsString(rv);
--
-- for ( i=0; i < len; i += size ) {
-- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
--
-- *ncp++ = st_14linear2ulaw(val);
-- }
-- return rv;
-+ signed char *cp;
-+ unsigned char *ncp;
-+ int len, size, val = 0;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw",
-+ &cp, &len, &size) )
-+ return 0 ;
-+
-+ if ( size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, len/size);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (unsigned char *)PyBytes_AsString(rv);
-+
-+ for ( i=0; i < len; i += size ) {
-+ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
-+
-+ *ncp++ = st_14linear2ulaw(val);
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_ulaw2lin(PyObject *self, PyObject *args)
- {
-- unsigned char *cp;
-- unsigned char cval;
-- signed char *ncp;
-- int len, new_len, size, val;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin",
-- &cp, &len, &size) )
-- return 0;
--
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- new_len = len*size;
-- if (new_len < 0) {
-- PyErr_SetString(PyExc_MemoryError,
-- "not enough memory for output buffer");
-- return 0;
-- }
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-- if ( rv == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(rv);
--
-- for ( i=0; i < new_len; i += size ) {
-- cval = *cp++;
-- val = st_ulaw2linear16(cval);
--
-- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
-- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
-- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
-- }
-- return rv;
-+ unsigned char *cp;
-+ unsigned char cval;
-+ signed char *ncp;
-+ int len, new_len, size, val;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin",
-+ &cp, &len, &size) )
-+ return 0;
-+
-+ if ( size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ new_len = len*size;
-+ if (new_len < 0) {
-+ PyErr_SetString(PyExc_MemoryError,
-+ "not enough memory for output buffer");
-+ return 0;
-+ }
-+ rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(rv);
-+
-+ for ( i=0; i < new_len; i += size ) {
-+ cval = *cp++;
-+ val = st_ulaw2linear16(cval);
-+
-+ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
-+ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
-+ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_lin2alaw(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- unsigned char *ncp;
-- int len, size, val = 0;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#i:lin2alaw",
-- &cp, &len, &size) )
-- return 0;
--
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- rv = PyBytes_FromStringAndSize(NULL, len/size);
-- if ( rv == 0 )
-- return 0;
-- ncp = (unsigned char *)PyBytes_AsString(rv);
--
-- for ( i=0; i < len; i += size ) {
-- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
--
-- *ncp++ = st_linear2alaw(val);
-- }
-- return rv;
-+ signed char *cp;
-+ unsigned char *ncp;
-+ int len, size, val = 0;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:lin2alaw",
-+ &cp, &len, &size) )
-+ return 0;
-+
-+ if ( size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ rv = PyBytes_FromStringAndSize(NULL, len/size);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (unsigned char *)PyBytes_AsString(rv);
-+
-+ for ( i=0; i < len; i += size ) {
-+ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
-+
-+ *ncp++ = st_linear2alaw(val);
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_alaw2lin(PyObject *self, PyObject *args)
- {
-- unsigned char *cp;
-- unsigned char cval;
-- signed char *ncp;
-- int len, new_len, size, val;
-- PyObject *rv;
-- int i;
--
-- if ( !PyArg_ParseTuple(args, "s#i:alaw2lin",
-- &cp, &len, &size) )
-- return 0;
--
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- new_len = len*size;
-- if (new_len < 0) {
-- PyErr_SetString(PyExc_MemoryError,
-- "not enough memory for output buffer");
-- return 0;
-- }
-- rv = PyBytes_FromStringAndSize(NULL, new_len);
-- if ( rv == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(rv);
--
-- for ( i=0; i < new_len; i += size ) {
-- cval = *cp++;
-- val = st_alaw2linear16(cval);
--
-- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
-- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
-- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
-- }
-- return rv;
-+ unsigned char *cp;
-+ unsigned char cval;
-+ signed char *ncp;
-+ int len, new_len, size, val;
-+ PyObject *rv;
-+ int i;
-+
-+ if ( !PyArg_ParseTuple(args, "s#i:alaw2lin",
-+ &cp, &len, &size) )
-+ return 0;
-+
-+ if ( size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ new_len = len*size;
-+ if (new_len < 0) {
-+ PyErr_SetString(PyExc_MemoryError,
-+ "not enough memory for output buffer");
-+ return 0;
-+ }
-+ rv = PyBytes_FromStringAndSize(NULL, new_len);
-+ if ( rv == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(rv);
-+
-+ for ( i=0; i < new_len; i += size ) {
-+ cval = *cp++;
-+ val = st_alaw2linear16(cval);
-+
-+ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
-+ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
-+ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
-+ }
-+ return rv;
- }
-
- static PyObject *
- audioop_lin2adpcm(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- signed char *ncp;
-- int len, size, val = 0, step, valpred, delta,
-- index, sign, vpdiff, diff;
-- PyObject *rv, *state, *str;
-- int i, outputbuffer = 0, bufferstep;
--
-- if ( !PyArg_ParseTuple(args, "s#iO:lin2adpcm",
-- &cp, &len, &size, &state) )
-- return 0;
--
--
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- str = PyBytes_FromStringAndSize(NULL, len/(size*2));
-- if ( str == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(str);
--
-- /* Decode state, should have (value, step) */
-- if ( state == Py_None ) {
-- /* First time, it seems. Set defaults */
-- valpred = 0;
-- step = 7;
-- index = 0;
-- } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index)
)
-- return 0;
-+ signed char *cp;
-+ signed char *ncp;
-+ int len, size, val = 0, step, valpred, delta,
-+ index, sign, vpdiff, diff;
-+ PyObject *rv, *state, *str;
-+ int i, outputbuffer = 0, bufferstep;
-+
-+ if ( !PyArg_ParseTuple(args, "s#iO:lin2adpcm",
-+ &cp, &len, &size, &state) )
-+ return 0;
-+
-+
-+ if ( size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ str = PyBytes_FromStringAndSize(NULL, len/(size*2));
-+ if ( str == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(str);
-+
-+ /* Decode state, should have (value, step) */
-+ if ( state == Py_None ) {
-+ /* First time, it seems. Set defaults */
-+ valpred = 0;
-+ step = 7;
-+ index = 0;
-+ } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
-+ return 0;
-+
-+ step = stepsizeTable[index];
-+ bufferstep = 1;
-+
-+ for ( i=0; i < len; i += size ) {
-+ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-+ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
-+
-+ /* Step 1 - compute difference with previous value */
-+ diff = val - valpred;
-+ sign = (diff < 0) ? 8 : 0;
-+ if ( sign ) diff = (-diff);
-+
-+ /* Step 2 - Divide and clamp */
-+ /* Note:
-+ ** This code *approximately* computes:
-+ ** delta = diff*4/step;
-+ ** vpdiff = (delta+0.5)*step/4;
-+ ** but in shift step bits are dropped. The net result of this
-+ ** is that even if you have fast mul/div hardware you cannot
-+ ** put it to good use since the fixup would be too expensive.
-+ */
-+ delta = 0;
-+ vpdiff = (step >> 3);
-
-+ if ( diff >= step ) {
-+ delta = 4;
-+ diff -= step;
-+ vpdiff += step;
-+ }
-+ step >>= 1;
-+ if ( diff >= step ) {
-+ delta |= 2;
-+ diff -= step;
-+ vpdiff += step;
-+ }
-+ step >>= 1;
-+ if ( diff >= step ) {
-+ delta |= 1;
-+ vpdiff += step;
-+ }
-+
-+ /* Step 3 - Update previous value */
-+ if ( sign )
-+ valpred -= vpdiff;
-+ else
-+ valpred += vpdiff;
-+
-+ /* Step 4 - Clamp previous value to 16 bits */
-+ if ( valpred > 32767 )
-+ valpred = 32767;
-+ else if ( valpred < -32768 )
-+ valpred = -32768;
-+
-+ /* Step 5 - Assemble value, update index and step values */
-+ delta |= sign;
-+
-+ index += indexTable[delta];
-+ if ( index < 0 ) index = 0;
-+ if ( index > 88 ) index = 88;
- step = stepsizeTable[index];
-- bufferstep = 1;
-
-- for ( i=0; i < len; i += size ) {
-- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
-- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
--
-- /* Step 1 - compute difference with previous value */
-- diff = val - valpred;
-- sign = (diff < 0) ? 8 : 0;
-- if ( sign ) diff = (-diff);
--
-- /* Step 2 - Divide and clamp */
-- /* Note:
-- ** This code *approximately* computes:
-- ** delta = diff*4/step;
-- ** vpdiff = (delta+0.5)*step/4;
-- ** but in shift step bits are dropped. The net result of this
-- ** is that even if you have fast mul/div hardware you cannot
-- ** put it to good use since the fixup would be too expensive.
-- */
-- delta = 0;
-- vpdiff = (step >> 3);
--
-- if ( diff >= step ) {
-- delta = 4;
-- diff -= step;
-- vpdiff += step;
-- }
-- step >>= 1;
-- if ( diff >= step ) {
-- delta |= 2;
-- diff -= step;
-- vpdiff += step;
-- }
-- step >>= 1;
-- if ( diff >= step ) {
-- delta |= 1;
-- vpdiff += step;
-- }
--
-- /* Step 3 - Update previous value */
-- if ( sign )
-- valpred -= vpdiff;
-- else
-- valpred += vpdiff;
--
-- /* Step 4 - Clamp previous value to 16 bits */
-- if ( valpred > 32767 )
-- valpred = 32767;
-- else if ( valpred < -32768 )
-- valpred = -32768;
--
-- /* Step 5 - Assemble value, update index and step values */
-- delta |= sign;
--
-- index += indexTable[delta];
-- if ( index < 0 ) index = 0;
-- if ( index > 88 ) index = 88;
-- step = stepsizeTable[index];
--
-- /* Step 6 - Output value */
-- if ( bufferstep ) {
-- outputbuffer = (delta << 4) & 0xf0;
-- } else {
-- *ncp++ = (delta & 0x0f) | outputbuffer;
-- }
-- bufferstep = !bufferstep;
-+ /* Step 6 - Output value */
-+ if ( bufferstep ) {
-+ outputbuffer = (delta << 4) & 0xf0;
-+ } else {
-+ *ncp++ = (delta & 0x0f) | outputbuffer;
- }
-- rv = Py_BuildValue("(O(ii))", str, valpred, index);
-- Py_DECREF(str);
-- return rv;
-+ bufferstep = !bufferstep;
-+ }
-+ rv = Py_BuildValue("(O(ii))", str, valpred, index);
-+ Py_DECREF(str);
-+ return rv;
- }
-
- static PyObject *
- audioop_adpcm2lin(PyObject *self, PyObject *args)
- {
-- signed char *cp;
-- signed char *ncp;
-- int len, new_len, size, valpred, step, delta, index, sign, vpdiff;
-- PyObject *rv, *str, *state;
-- int i, inputbuffer = 0, bufferstep;
--
-- if ( !PyArg_ParseTuple(args, "s#iO:adpcm2lin",
-- &cp, &len, &size, &state) )
-- return 0;
--
-- if ( size != 1 && size != 2 && size != 4) {
-- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-- return 0;
-- }
--
-- /* Decode state, should have (value, step) */
-- if ( state == Py_None ) {
-- /* First time, it seems. Set defaults */
-- valpred = 0;
-- step = 7;
-- index = 0;
-- } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index)
)
-- return 0;
--
-- new_len = len*size*2;
-- if (new_len < 0) {
-- PyErr_SetString(PyExc_MemoryError,
-- "not enough memory for output buffer");
-- return 0;
-+ signed char *cp;
-+ signed char *ncp;
-+ int len, new_len, size, valpred, step, delta, index, sign, vpdiff;
-+ PyObject *rv, *str, *state;
-+ int i, inputbuffer = 0, bufferstep;
-+
-+ if ( !PyArg_ParseTuple(args, "s#iO:adpcm2lin",
-+ &cp, &len, &size, &state) )
-+ return 0;
-+
-+ if ( size != 1 && size != 2 && size != 4) {
-+ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
-+ return 0;
-+ }
-+
-+ /* Decode state, should have (value, step) */
-+ if ( state == Py_None ) {
-+ /* First time, it seems. Set defaults */
-+ valpred = 0;
-+ step = 7;
-+ index = 0;
-+ } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
-+ return 0;
-+
-+ new_len = len*size*2;
-+ if (new_len < 0) {
-+ PyErr_SetString(PyExc_MemoryError,
-+ "not enough memory for output buffer");
-+ return 0;
-+ }
-+ str = PyBytes_FromStringAndSize(NULL, new_len);
-+ if ( str == 0 )
-+ return 0;
-+ ncp = (signed char *)PyBytes_AsString(str);
-+
-+ step = stepsizeTable[index];
-+ bufferstep = 0;
-+
-+ for ( i=0; i < new_len; i += size ) {
-+ /* Step 1 - get the delta value and compute next index */
-+ if ( bufferstep ) {
-+ delta = inputbuffer & 0xf;
-+ } else {
-+ inputbuffer = *cp++;
-+ delta = (inputbuffer >> 4) & 0xf;
- }
-- str = PyBytes_FromStringAndSize(NULL, new_len);
-- if ( str == 0 )
-- return 0;
-- ncp = (signed char *)PyBytes_AsString(str);
-
-+ bufferstep = !bufferstep;
-+
-+ /* Step 2 - Find new index value (for later) */
-+ index += indexTable[delta];
-+ if ( index < 0 ) index = 0;
-+ if ( index > 88 ) index = 88;
-+
-+ /* Step 3 - Separate sign and magnitude */
-+ sign = delta & 8;
-+ delta = delta & 7;
-+
-+ /* Step 4 - Compute difference and new predicted value */
-+ /*
-+ ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
-+ ** in adpcm_coder.
-+ */
-+ vpdiff = step >> 3;
-+ if ( delta & 4 ) vpdiff += step;
-+ if ( delta & 2 ) vpdiff += step>>1;
-+ if ( delta & 1 ) vpdiff += step>>2;
-+
-+ if ( sign )
-+ valpred -= vpdiff;
-+ else
-+ valpred += vpdiff;
-+
-+ /* Step 5 - clamp output value */
-+ if ( valpred > 32767 )
-+ valpred = 32767;
-+ else if ( valpred < -32768 )
-+ valpred = -32768;
-+
-+ /* Step 6 - Update step value */
- step = stepsizeTable[index];
-- bufferstep = 0;
--
-- for ( i=0; i < new_len; i += size ) {
-- /* Step 1 - get the delta value and compute next index */
-- if ( bufferstep ) {
-- delta = inputbuffer & 0xf;
-- } else {
-- inputbuffer = *cp++;
-- delta = (inputbuffer >> 4) & 0xf;
-- }
--
-- bufferstep = !bufferstep;
--
-- /* Step 2 - Find new index value (for later) */
-- index += indexTable[delta];
-- if ( index < 0 ) index = 0;
-- if ( index > 88 ) index = 88;
--
-- /* Step 3 - Separate sign and magnitude */
-- sign = delta & 8;
-- delta = delta & 7;
--
-- /* Step 4 - Compute difference and new predicted value */
-- /*
-- ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
-- ** in adpcm_coder.
-- */
-- vpdiff = step >> 3;
-- if ( delta & 4 ) vpdiff += step;
-- if ( delta & 2 ) vpdiff += step>>1;
-- if ( delta & 1 ) vpdiff += step>>2;
--
-- if ( sign )
-- valpred -= vpdiff;
-- else
-- valpred += vpdiff;
--
-- /* Step 5 - clamp output value */
-- if ( valpred > 32767 )
-- valpred = 32767;
-- else if ( valpred < -32768 )
-- valpred = -32768;
--
-- /* Step 6 - Update step value */
-- step = stepsizeTable[index];
--
-- /* Step 6 - Output value */
-- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8);
-- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred);
-- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16);
-- }
-
-- rv = Py_BuildValue("(O(ii))", str, valpred, index);
-- Py_DECREF(str);
-- return rv;
-+ /* Step 6 - Output value */
-+ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8);
-+ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred);
-+ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16);
-+ }
-+
-+ rv = Py_BuildValue("(O(ii))", str, valpred, index);
-+ Py_DECREF(str);
-+ return rv;
- }
-
- static PyMethodDef audioop_methods[] = {
-- { "max", audioop_max, METH_VARARGS },
-- { "minmax", audioop_minmax, METH_VARARGS },
-- { "avg", audioop_avg, METH_VARARGS },
-- { "maxpp", audioop_maxpp, METH_VARARGS },
-- { "avgpp", audioop_avgpp, METH_VARARGS },
-- { "rms", audioop_rms, METH_VARARGS },
-- { "findfit", audioop_findfit, METH_VARARGS },
-- { "findmax", audioop_findmax, METH_VARARGS },
-- { "findfactor", audioop_findfactor, METH_VARARGS },
-- { "cross", audioop_cross, METH_VARARGS },
-- { "mul", audioop_mul, METH_VARARGS },
-- { "add", audioop_add, METH_VARARGS },
-- { "bias", audioop_bias, METH_VARARGS },
-- { "ulaw2lin", audioop_ulaw2lin, METH_VARARGS },
-- { "lin2ulaw", audioop_lin2ulaw, METH_VARARGS },
-- { "alaw2lin", audioop_alaw2lin, METH_VARARGS },
-- { "lin2alaw", audioop_lin2alaw, METH_VARARGS },
-- { "lin2lin", audioop_lin2lin, METH_VARARGS },
-- { "adpcm2lin", audioop_adpcm2lin, METH_VARARGS },
-- { "lin2adpcm", audioop_lin2adpcm, METH_VARARGS },
-- { "tomono", audioop_tomono, METH_VARARGS },
-- { "tostereo", audioop_tostereo, METH_VARARGS },
-- { "getsample", audioop_getsample, METH_VARARGS },
-- { "reverse", audioop_reverse, METH_VARARGS },
-- { "ratecv", audioop_ratecv, METH_VARARGS },
-- { 0, 0 }
-+ { "max", audioop_max, METH_VARARGS },
-+ { "minmax", audioop_minmax, METH_VARARGS },
-+ { "avg", audioop_avg, METH_VARARGS },
-+ { "maxpp", audioop_maxpp, METH_VARARGS },
-+ { "avgpp", audioop_avgpp, METH_VARARGS },
-+ { "rms", audioop_rms, METH_VARARGS },
-+ { "findfit", audioop_findfit, METH_VARARGS },
-+ { "findmax", audioop_findmax, METH_VARARGS },
-+ { "findfactor", audioop_findfactor, METH_VARARGS },
-+ { "cross", audioop_cross, METH_VARARGS },
-+ { "mul", audioop_mul, METH_VARARGS },
-+ { "add", audioop_add, METH_VARARGS },
-+ { "bias", audioop_bias, METH_VARARGS },
-+ { "ulaw2lin", audioop_ulaw2lin, METH_VARARGS },
-+ { "lin2ulaw", audioop_lin2ulaw, METH_VARARGS },
-+ { "alaw2lin", audioop_alaw2lin, METH_VARARGS },
-+ { "lin2alaw", audioop_lin2alaw, METH_VARARGS },
-+ { "lin2lin", audioop_lin2lin, METH_VARARGS },
-+ { "adpcm2lin", audioop_adpcm2lin, METH_VARARGS },
-+ { "lin2adpcm", audioop_lin2adpcm, METH_VARARGS },
-+ { "tomono", audioop_tomono, METH_VARARGS },
-+ { "tostereo", audioop_tostereo, METH_VARARGS },
-+ { "getsample", audioop_getsample, METH_VARARGS },
-+ { "reverse", audioop_reverse, METH_VARARGS },
-+ { "ratecv", audioop_ratecv, METH_VARARGS },
-+ { 0, 0 }
- };
-
-
- static struct PyModuleDef audioopmodule = {
-- PyModuleDef_HEAD_INIT,
-- "audioop",
-- NULL,
-- -1,
-- audioop_methods,
-- NULL,
-- NULL,
-- NULL,
-- NULL
-+ PyModuleDef_HEAD_INIT,
-+ "audioop",
-+ NULL,
-+ -1,
-+ audioop_methods,
-+ NULL,
-+ NULL,
-+ NULL,
-+ NULL
- };
-
- PyMODINIT_FUNC
- PyInit_audioop(void)
- {
-- PyObject *m, *d;
-- m = PyModule_Create(&audioopmodule);
-- if (m == NULL)
-- return NULL;
-- d = PyModule_GetDict(m);
-- if (d == NULL)
-- return NULL;
-- AudioopError = PyErr_NewException("audioop.error", NULL, NULL);
-- if (AudioopError != NULL)
-- PyDict_SetItemString(d,"error",AudioopError);
-- return m;
-+ PyObject *m, *d;
-+ m = PyModule_Create(&audioopmodule);
-+ if (m == NULL)
-+ return NULL;
-+ d = PyModule_GetDict(m);
-+ if (d == NULL)
-+ return NULL;
-+ AudioopError = PyErr_NewException("audioop.error", NULL, NULL);
-+ if (AudioopError != NULL)
-+ PyDict_SetItemString(d,"error",AudioopError);
-+ return m;
- }
diff --git a/python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
b/python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
new file mode 100644
index 0000000..68eb618
--- /dev/null
+++ b/python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
@@ -0,0 +1,12 @@
+diff -up Python-3.2a1/Lib/test/test_imp.py.apply-our-changes-to-expected-shebang
Python-3.2a1/Lib/test/test_imp.py
+--- Python-3.2a1/Lib/test/test_imp.py.apply-our-changes-to-expected-shebang 2010-08-02
15:57:49.151002176 -0400
++++ Python-3.2a1/Lib/test/test_imp.py 2010-08-02 15:58:40.428010729 -0400
+@@ -52,7 +52,7 @@ class ImportTests(unittest.TestCase):
+ self.assertNotEqual(fp, None)
+ self.assertEqual(fp.encoding, "iso-8859-1")
+ self.assertEqual(fp.tell(), 0)
+- self.assertEqual(fp.readline(), '#!/usr/bin/env python3\n')
++ self.assertEqual(fp.readline(), '#!/usr/bin/python3.2\n')
+ fp.close()
+
+ fp, filename, info = imp.find_module("tokenize")
diff --git a/python-3.2a1-debug-build.patch b/python-3.2a1-debug-build.patch
new file mode 100644
index 0000000..49fb182
--- /dev/null
+++ b/python-3.2a1-debug-build.patch
@@ -0,0 +1,290 @@
+diff -up Python-3.2a1/configure.in.debug-build Python-3.2a1/configure.in
+--- Python-3.2a1/configure.in.debug-build 2010-08-20 16:06:24.616082276 -0400
++++ Python-3.2a1/configure.in 2010-08-20 16:06:24.632127011 -0400
+@@ -584,7 +584,7 @@ AC_SUBST(LIBRARY)
+ AC_MSG_CHECKING(LIBRARY)
+ if test -z "$LIBRARY"
+ then
+- LIBRARY='libpython$(VERSION).a'
++ LIBRARY='libpython$(VERSION)$(DEBUG_EXT).a'
+ fi
+ AC_MSG_RESULT($LIBRARY)
+
+@@ -726,8 +726,8 @@ if test $enable_shared = "yes"; then
+ INSTSONAME="$LDLIBRARY".$SOVERSION
+ ;;
+ Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*)
+- LDLIBRARY='libpython$(VERSION).so'
+- BLDLIBRARY='-L. -lpython$(VERSION)'
++ LDLIBRARY='libpython$(VERSION)$(DEBUG_EXT).so'
++ BLDLIBRARY='-L. -lpython$(VERSION)$(DEBUG_EXT)'
+ RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
+ case $ac_sys_system in
+ FreeBSD*)
+@@ -825,6 +825,14 @@ else AC_MSG_RESULT(no); Py_DEBUG='false'
+ fi],
+ [AC_MSG_RESULT(no)])
+
++if test "$Py_DEBUG" = 'true'
++then
++ DEBUG_EXT=_d
++ DEBUG_SUFFIX=-debug
++fi
++AC_SUBST(DEBUG_EXT)
++AC_SUBST(DEBUG_SUFFIX)
++
+ # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
+ # merged with this chunk of code?
+
+diff -up Python-3.2a1/Lib/distutils/command/build_ext.py.debug-build
Python-3.2a1/Lib/distutils/command/build_ext.py
+--- Python-3.2a1/Lib/distutils/command/build_ext.py.debug-build 2010-07-22
08:50:05.000000000 -0400
++++ Python-3.2a1/Lib/distutils/command/build_ext.py 2010-08-20 16:06:24.633125472 -0400
+@@ -673,7 +673,10 @@ class build_ext(Command):
+ so_ext = get_config_var('SO')
+ if os.name == 'nt' and self.debug:
+ return os.path.join(*ext_path) + '_d' + so_ext
+- return os.path.join(*ext_path) + so_ext
++
++ # Similarly, extensions in debug mode are named 'module_d.so', to
++ # avoid adding the _d to the SO config variable:
++ return os.path.join(*ext_path) + (sys.pydebug and "_d" or
"") + so_ext
+
+ def get_export_symbols(self, ext):
+ """Return the list of symbols that a shared extension has to
+@@ -754,6 +757,8 @@ class build_ext(Command):
+ template = "python%d.%d"
+ pythonlib = (template %
+ (sys.hexversion >> 24, (sys.hexversion >> 16)
& 0xff))
++ if sys.pydebug:
++ pythonlib += '_d'
+ return ext.libraries + [pythonlib]
+ else:
+ return ext.libraries
+diff -up Python-3.2a1/Lib/distutils/sysconfig.py.debug-build
Python-3.2a1/Lib/distutils/sysconfig.py
+--- Python-3.2a1/Lib/distutils/sysconfig.py.debug-build 2010-08-20 16:06:24.623083865
-0400
++++ Python-3.2a1/Lib/distutils/sysconfig.py 2010-08-20 16:06:24.633125472 -0400
+@@ -83,7 +83,8 @@ def get_python_inc(plat_specific=0, pref
+ else:
+ incdir = os.path.join(get_config_var('srcdir'),
'Include')
+ return os.path.normpath(incdir)
+- return os.path.join(prefix, "include", "python" +
get_python_version())
++ return os.path.join(prefix, "include",
++ "python" + get_python_version() + (sys.pydebug and
'-debug' or ''))
+ elif os.name == "nt":
+ return os.path.join(prefix, "include")
+ elif os.name == "mac":
+@@ -229,7 +230,7 @@ def get_makefile_filename():
+ if python_build:
+ return os.path.join(os.path.dirname(sys.executable), "Makefile")
+ lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
+- return os.path.join(lib_dir, "config", "Makefile")
++ return os.path.join(lib_dir, "config" + (sys.pydebug and
"-debug" or ""), "Makefile")
+
+
+ def parse_config_h(fp, g=None):
+diff -up Python-3.2a1/Makefile.pre.in.debug-build Python-3.2a1/Makefile.pre.in
+--- Python-3.2a1/Makefile.pre.in.debug-build 2010-08-20 16:06:24.624081000 -0400
++++ Python-3.2a1/Makefile.pre.in 2010-08-20 16:06:57.287084214 -0400
+@@ -105,8 +105,8 @@ SCRIPTDIR= $(prefix)/lib64
+ # Detailed destination directories
+ BINLIBDEST= $(LIBDIR)/python$(VERSION)
+ LIBDEST= $(SCRIPTDIR)/python$(VERSION)
+-INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)
+-CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)
++INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
++CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
+ LIBP= $(LIBDIR)/python$(VERSION)
+
+ # Symbols used for using shared libraries
+@@ -120,6 +120,12 @@ DESTSHARED= $(BINLIBDEST)/lib-dynload
+ EXE= @EXEEXT@
+ BUILDEXE= @BUILDEXEEXT@
+
++# DEBUG_EXT is used by ELF files (names and SONAMEs); it will be "_d" for a
debug build
++# DEBUG_SUFFIX is used by filesystem paths; it will be "-debug" for a debug
build
++# Both will be empty in an optimized build
++DEBUG_EXT= @DEBUG_EXT@
++DEBUG_SUFFIX= @DEBUG_SUFFIX@
++
+ # Short name and location for Mac OS X Python framework
+ UNIVERSALSDK=@UNIVERSALSDK@
+ PYTHONFRAMEWORK= @PYTHONFRAMEWORK@
+@@ -183,7 +189,7 @@ LIBOBJDIR= Python/
+ LIBOBJS= @LIBOBJS@
+
+ PYTHON= python$(EXE)
+-BUILDPYTHON= python$(BUILDEXE)
++BUILDPYTHON= python$(BUILD_SUFFIX)$(BUILDEXE)
+
+ # The task to run while instrument when building the profile-opt target
+ PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
+@@ -433,7 +439,7 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)'
LDFLAGS='$(PY_LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E
$(srcdir)/setup.py build;; \
+ esac
+
+-libpython$(VERSION).so: $(LIBRARY_OBJS)
++libpython$(VERSION)$(DEBUG_EXT).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(LDSHARED) $(PY_LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS)
$(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
+ $(LN) -f $(INSTSONAME) $@; \
+@@ -817,7 +823,7 @@ altbininstall: $(BUILDPYTHON)
+ else true; \
+ fi; \
+ done
+- $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE)
++ $(INSTALL_PROGRAM) $(BUILDPYTHON)
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
+ if test -f $(LDLIBRARY); then \
+ if test -n "$(DLLLIBRARY)" ; then \
+ $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \
+@@ -831,15 +837,15 @@ altbininstall: $(BUILDPYTHON)
+ fi
+
+ bininstall: altbininstall
+- -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
+- then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
++ -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
++ then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
+ else true; \
+ fi
+- (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(EXE) $(PYTHON)3$(EXE))
+- -rm -f $(DESTDIR)$(BINDIR)/python3-config
+- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config)
+- -rm -f $(DESTDIR)$(LIBPC)/python3.pc
+- (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python3.pc)
++ (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
$(PYTHON)3$(DEBUG_SUFFIX)$(EXE))
++ -rm -f $(DESTDIR)$(BINDIR)/python3$(DEBUG_SUFFIX)-config
++ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(DEBUG_SUFFIX)-config
python3$(DEBUG_SUFFIX)-config)
++ -rm -f $(DESTDIR)$(LIBPC)/python3$(DEBUG_SUFFIX).pc
++ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)$(DEBUG_SUFFIX).pc
python3$(DEBUG_SUFFIX).pc)
+
+ # Install the manual page
+ maninstall:
+@@ -965,10 +971,10 @@ $(srcdir)/Lib/$(PLATDIR):
+ export EXE; EXE="$(BUILDEXE)"; \
+ cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen
+
+-python-config: $(srcdir)/Misc/python-config.in
++python$(DEBUG_SUFFIX)-config: $(srcdir)/Misc/python-config.in
+ # Substitution happens here, as the completely-expanded BINDIR
+ # is not available in configure
+- sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(EXE)," <
$(srcdir)/Misc/python-config.in >python-config
++ sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)," <
$(srcdir)/Misc/python-config.in >python$(DEBUG_SUFFIX)-config
+
+ # Install the include files
+ INCLDIRSTOMAKE=$(INCLUDEDIR) $(CONFINCLUDEDIR) $(INCLUDEPY) $(CONFINCLUDEPY)
+@@ -990,12 +996,12 @@ inclinstall:
+
+ # Install the library and miscellaneous stuff needed for extending/embedding
+ # This goes into $(exec_prefix)
+-LIBPL= $(LIBP)/config
++LIBPL= $(LIBP)/config$(DEBUG_SUFFIX)
+
+ # pkgconfig directory
+ LIBPC= $(LIBDIR)/pkgconfig
+
+-libainstall: all python-config
++libainstall: all python$(DEBUG_SUFFIX)-config
+ @for i in $(LIBDIR) $(LIBP) $(LIBPL) $(LIBPC); \
+ do \
+ if test ! -d $(DESTDIR)$$i; then \
+@@ -1011,11 +1017,11 @@ libainstall: all python-config
+ $(INSTALL_DATA) Modules/Setup $(DESTDIR)$(LIBPL)/Setup
+ $(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local
+ $(INSTALL_DATA) Modules/Setup.config $(DESTDIR)$(LIBPL)/Setup.config
+- $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION).pc
++ $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION)$(DEBUG_SUFFIX).pc
+ $(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup
+ $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh
+- $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(VERSION)-config
+- rm python-config
++ $(INSTALL_SCRIPT) python$(DEBUG_SUFFIX)-config
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)-config
++ rm python$(DEBUG_SUFFIX)-config
+ @if [ -s Modules/python.exp -a \
+ "`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ];
then \
+ echo; echo "Installing support files for building shared extension modules on
AIX:"; \
+diff -up Python-3.2a1/Misc/python-config.in.debug-build
Python-3.2a1/Misc/python-config.in
+--- Python-3.2a1/Misc/python-config.in.debug-build 2010-04-06 17:30:42.000000000 -0400
++++ Python-3.2a1/Misc/python-config.in 2010-08-20 16:06:24.635124366 -0400
+@@ -45,7 +45,7 @@ for opt in opt_flags:
+
+ elif opt in ('--libs', '--ldflags'):
+ libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
+- libs.append('-lpython'+pyver)
++ libs.append('-lpython' + pyver + (sys.pydebug and "_d" or
""))
+ # add the prefix/lib/pythonX.Y/config dir, but only if there is no
+ # shared library in prefix/lib/.
+ if opt == '--ldflags':
+diff -up Python-3.2a1/Modules/makesetup.debug-build Python-3.2a1/Modules/makesetup
+--- Python-3.2a1/Modules/makesetup.debug-build 2010-07-09 12:30:58.000000000 -0400
++++ Python-3.2a1/Modules/makesetup 2010-08-20 16:06:24.635124366 -0400
+@@ -233,7 +233,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
+ *$mod.o*) base=$mod;;
+ *) base=${mod}module;;
+ esac
+- file="$srcdir/$base\$(SO)"
++ file="$srcdir/$base\$(DEBUG_EXT)\$(SO)"
+ case $doconfig in
+ no) SHAREDMODS="$SHAREDMODS $file";;
+ esac
+diff -up Python-3.2a1/Python/dynload_shlib.c.debug-build
Python-3.2a1/Python/dynload_shlib.c
+--- Python-3.2a1/Python/dynload_shlib.c.debug-build 2010-05-09 11:52:27.000000000 -0400
++++ Python-3.2a1/Python/dynload_shlib.c 2010-08-20 16:06:24.635124366 -0400
+@@ -46,11 +46,16 @@ const struct filedescr _PyImport_DynLoad
+ {"module.exe", "rb", C_EXTENSION},
+ {"MODULE.EXE", "rb", C_EXTENSION},
+ #else
++#ifdef Py_DEBUG
++ {"_d.so", "rb", C_EXTENSION},
++ {"module_d.so", "rb", C_EXTENSION},
++#else
+ {".so", "rb", C_EXTENSION},
+ {"module.so", "rb", C_EXTENSION},
+-#endif
+-#endif
+-#endif
++#endif /* Py_DEBUG */
++#endif /* __VMS */
++#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
++#endif /* __CYGWIN__ */
+ {0, 0}
+ };
+
+diff -up Python-3.2a1/Python/sysmodule.c.debug-build Python-3.2a1/Python/sysmodule.c
+--- Python-3.2a1/Python/sysmodule.c.debug-build 2010-07-06 06:53:30.000000000 -0400
++++ Python-3.2a1/Python/sysmodule.c 2010-08-20 16:06:24.636251716 -0400
+@@ -1598,6 +1598,12 @@ _PySys_Init(void)
+ WindowsVersionType.tp_new = NULL;
+ #endif
+
++#ifdef Py_DEBUG
++ PyDict_SetItemString(sysdict, "pydebug", Py_True);
++#else
++ PyDict_SetItemString(sysdict, "pydebug", Py_False);
++#endif
++
+ /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
+ #ifndef PY_NO_SHORT_FLOAT_REPR
+ SET_SYS_FROM_STRING("float_repr_style",
+diff -up Python-3.2a1/runtests.sh.debug-build Python-3.2a1/runtests.sh
+--- Python-3.2a1/runtests.sh.debug-build 2008-10-17 08:05:40.000000000 -0400
++++ Python-3.2a1/runtests.sh 2010-08-20 16:06:24.637251276 -0400
+@@ -16,11 +16,14 @@ Flags (arguments starting with '-') are
+ regrtest.py, except for -x, which is processed here."
+
+ # Choose the Python binary.
+-case `uname` in
+-Darwin) PYTHON=./python.exe;;
+-CYGWIN*) PYTHON=./python.exe;;
+-*) PYTHON=./python;;
+-esac
++if [ -z $PYTHON ]
++then
++ case `uname` in
++ Darwin) PYTHON=./python.exe;;
++ CYGWIN*) PYTHON=./python.exe;;
++ *) PYTHON=./python;;
++ esac
++fi
+
+ PYTHON="$PYTHON -bb"
+
diff --git a/python-3.2a1-fix-parallel-make.patch b/python-3.2a1-fix-parallel-make.patch
new file mode 100644
index 0000000..b6189b5
--- /dev/null
+++ b/python-3.2a1-fix-parallel-make.patch
@@ -0,0 +1,37 @@
+diff -up Python-3.2a1/Makefile.pre.in.parallel-grammar Python-3.2a1/Makefile.pre.in
+--- Python-3.2a1/Makefile.pre.in.parallel-grammar 2010-08-20 15:09:13.613527156 -0400
++++ Python-3.2a1/Makefile.pre.in 2010-08-20 15:10:31.428135355 -0400
+@@ -222,6 +222,7 @@ IO_OBJS= \
+
+ ##########################################################################
+ # Grammar
++GRAMMAR_STAMP= $(srcdir)/grammar-stamp
+ GRAMMAR_H= $(srcdir)/Include/graminit.h
+ GRAMMAR_C= $(srcdir)/Python/graminit.c
+ GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar
+@@ -557,9 +558,24 @@ Modules/python.o: $(srcdir)/Modules/pyth
+
+ $(IO_OBJS): $(IO_H)
+
+-$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
++# GNU "make" interprets rules with two dependents as two copies of the rule.
++#
++# In a parallel build this can lead to pgen being run twice, once for each of
++# GRAMMAR_H and GRAMMAR_C, leading to race conditions in which the compiler
++# reads a partially-overwritten copy of one of these files, leading to syntax
++# errors (or linker errors if the fragment happens to be syntactically valid C)
++#
++# See
http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
++# for more information
++#
++# Introduce ".grammar-stamp" as a contrived single output from PGEN to avoid
++# this:
++$(GRAMMAR_H) $(GRAMMAR_C): $(GRAMMAR_STAMP)
++
++$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
+ -@$(INSTALL) -d Include
+ -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
++ touch $(GRAMMAR_STAMP)
+
+ $(PGEN): $(PGENOBJS)
+ $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
diff --git a/python-3.2a1-lib64.patch b/python-3.2a1-lib64.patch
new file mode 100644
index 0000000..d778b5a
--- /dev/null
+++ b/python-3.2a1-lib64.patch
@@ -0,0 +1,146 @@
+diff -up Python-3.2a1/Lib/distutils/command/install.py.lib64
Python-3.2a1/Lib/distutils/command/install.py
+--- Python-3.2a1/Lib/distutils/command/install.py.lib64 2010-07-22 08:50:05.000000000
-0400
++++ Python-3.2a1/Lib/distutils/command/install.py 2010-08-02 18:33:15.667001759 -0400
+@@ -47,14 +47,14 @@ else:
+ 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/$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',
+diff -up Python-3.2a1/Lib/distutils/sysconfig.py.lib64
Python-3.2a1/Lib/distutils/sysconfig.py
+--- Python-3.2a1/Lib/distutils/sysconfig.py.lib64 2010-07-23 05:43:17.000000000 -0400
++++ Python-3.2a1/Lib/distutils/sysconfig.py 2010-08-02 18:33:15.669000547 -0400
+@@ -117,8 +117,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:
+diff -up Python-3.2a1/Lib/site.py.lib64 Python-3.2a1/Lib/site.py
+--- Python-3.2a1/Lib/site.py.lib64 2010-06-27 17:45:24.000000000 -0400
++++ Python-3.2a1/Lib/site.py 2010-08-02 18:34:30.584001242 -0400
+@@ -283,12 +283,16 @@ def getsitepackages():
+ if sys.platform in ('os2emx', 'riscos'):
+ sitepackages.append(os.path.join(prefix, "Lib",
"site-packages"))
+ elif os.sep == '/':
++ sitepackages.append(os.path.join(prefix, "lib64",
++ "python" + sys.version[:3],
++ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
+ "python" + sys.version[:3],
+ "site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-python"))
+ else:
+ sitepackages.append(prefix)
++ sitepackages.append(os.path.join(prefix, "lib64",
"site-packages"))
+ sitepackages.append(os.path.join(prefix, "lib",
"site-packages"))
+ if sys.platform == "darwin":
+ # for framework builds *only* we add the standard Apple
+diff -up Python-3.2a1/Makefile.pre.in.lib64 Python-3.2a1/Makefile.pre.in
+--- Python-3.2a1/Makefile.pre.in.lib64 2010-08-02 18:33:15.000000000 -0400
++++ Python-3.2a1/Makefile.pre.in 2010-08-02 18:35:07.147000664 -0400
+@@ -100,7 +100,7 @@ LIBDIR= @libdir@
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/lib64
+
+ # Detailed destination directories
+ BINLIBDEST= $(LIBDIR)/python$(VERSION)
+diff -up Python-3.2a1/Modules/getpath.c.lib64 Python-3.2a1/Modules/getpath.c
+--- Python-3.2a1/Modules/getpath.c.lib64 2010-07-23 12:05:35.000000000 -0400
++++ Python-3.2a1/Modules/getpath.c 2010-08-02 18:35:50.857000717 -0400
+@@ -117,8 +117,8 @@
+ #endif
+
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
++ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
+ #endif
+
+ #ifndef LANDMARK
+@@ -129,7 +129,7 @@ static wchar_t prefix[MAXPATHLEN+1];
+ static wchar_t exec_prefix[MAXPATHLEN+1];
+ static wchar_t progpath[MAXPATHLEN+1];
+ static wchar_t *module_search_path = NULL;
+-static wchar_t *lib_python = L"lib/python" VERSION;
++static wchar_t *lib_python = L"lib64/python" VERSION;
+
+ /* In principle, this should use HAVE__WSTAT, and _wstat
+ should be detected by autoconf. However, no current
+@@ -603,7 +603,7 @@ calculate_path(void)
+ }
+ else
+ wcsncpy(zip_path, L"" PREFIX, MAXPATHLEN);
+- joinpath(zip_path, L"lib/python00.zip");
++ joinpath(zip_path, L"lib64/python00.zip");
+ bufsz = wcslen(zip_path); /* Replace "00" with version */
+ zip_path[bufsz - 6] = VERSION[0];
+ zip_path[bufsz - 5] = VERSION[2];
+@@ -613,7 +613,7 @@ calculate_path(void)
+ fprintf(stderr,
+ "Could not find platform dependent libraries
<exec_prefix>\n");
+ wcsncpy(exec_prefix, L"" EXEC_PREFIX, MAXPATHLEN);
+- joinpath(exec_prefix, L"lib/lib-dynload");
++ joinpath(exec_prefix, L"lib64/lib-dynload");
+ }
+ /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+
+--- Python-3.2a1/setup.py.lib64 2010-07-23 15:25:47.000000000 -0400
++++ Python-3.2a1/setup.py 2010-08-02 18:36:51.521000448 -0400
+@@ -343,7 +343,7 @@ class PyBuildExt(build_ext):
+
+ def detect_modules(self):
+ # Ensure that /usr/local is always used
+- 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')
+
+ # Add paths specified in the environment variables LDFLAGS and
+@@ -587,11 +587,11 @@ class PyBuildExt(build_ext):
+ elif curses_library:
+ readline_libs.append(curses_library)
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/lib64/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( 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:
+@@ -628,8 +628,8 @@ class PyBuildExt(build_ext):
+ if krb5_h:
+ ssl_incs += krb5_h
+ ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
+- ['/usr/local/ssl/lib',
+- '/usr/contrib/ssl/lib/'
++ ['/usr/local/ssl/lib64',
++ '/usr/contrib/ssl/lib64/'
+ ] )
+
+ if (ssl_incs is not None and
diff --git a/python-3.2a1-no-static-lib.patch b/python-3.2a1-no-static-lib.patch
new file mode 100644
index 0000000..6dd8147
--- /dev/null
+++ b/python-3.2a1-no-static-lib.patch
@@ -0,0 +1,50 @@
+diff -up Python-3.2a1/Makefile.pre.in.no-static-lib Python-3.2a1/Makefile.pre.in
+--- Python-3.2a1/Makefile.pre.in.no-static-lib 2010-07-17 16:39:23.000000000 -0400
++++ Python-3.2a1/Makefile.pre.in 2010-08-02 16:02:28.378010008 -0400
+@@ -416,7 +416,7 @@ coverage:
+
+
+ # Build the interpreter
+-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
++$(BUILDPYTHON): Modules/python.o $(LDLIBRARY)
+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ \
+ Modules/python.o \
+ $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+@@ -432,18 +432,6 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)'
LDFLAGS='$(PY_LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E
$(srcdir)/setup.py build;; \
+ esac
+
+-# Build static library
+-# avoid long command lines, same as LIBRARY_OBJS
+-$(LIBRARY): $(LIBRARY_OBJS)
+- -rm -f $@
+- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
+- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
+- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
+- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODOBJS)
+- $(RANLIB) $@
+-
+ libpython$(VERSION).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(LDSHARED) $(PY_LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS)
$(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
+@@ -1003,18 +991,6 @@ libainstall: all python-config
+ else true; \
+ fi; \
+ done
+- @if test -d $(LIBRARY); then :; else \
+- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+- if test "$(SO)" = .dll; then \
+- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
+- else \
+- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- fi; \
+- else \
+- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
+- fi; \
+- fi
+ $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
+ $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python-3.2a1-remove-mimeaudio-tests.patch
b/python-3.2a1-remove-mimeaudio-tests.patch
new file mode 100644
index 0000000..ff67690
--- /dev/null
+++ b/python-3.2a1-remove-mimeaudio-tests.patch
@@ -0,0 +1,57 @@
+diff -up Python-3.2a1/Lib/email/test/test_email.py.remove-mimeaudio-tests
Python-3.2a1/Lib/email/test/test_email.py
+--- Python-3.2a1/Lib/email/test/test_email.py.remove-mimeaudio-tests 2010-08-02
15:52:12.397002172 -0400
++++ Python-3.2a1/Lib/email/test/test_email.py 2010-08-02 15:52:38.132999850 -0400
+@@ -952,53 +952,6 @@ Blah blah blah
+
+
+
+-# Test the basic MIMEAudio class
+-class TestMIMEAudio(unittest.TestCase):
+- def setUp(self):
+- # Make sure we pick up the audiotest.au that lives in email/test/data.
+- # In Python, there's an audiotest.au living in Lib/test but that isn't
+- # included in some binary distros that don't include the test
+- # package. The trailing empty string on the .join() is significant
+- # since findfile() will do a dirname().
+- datadir = os.path.join(os.path.dirname(landmark), 'data', '')
+- with open(findfile('audiotest.au', datadir), 'rb') as fp:
+- self._audiodata = fp.read()
+- self._au = MIMEAudio(self._audiodata)
+-
+- def test_guess_minor_type(self):
+- self.assertEqual(self._au.get_content_type(), 'audio/basic')
+-
+- def test_encoding(self):
+- payload = self._au.get_payload()
+- self.assertEqual(base64.decodebytes(bytes(payload, 'ascii')),
+- self._audiodata)
+-
+- def test_checkSetMinor(self):
+- au = MIMEAudio(self._audiodata, 'fish')
+- self.assertEqual(au.get_content_type(), 'audio/fish')
+-
+- def test_add_header(self):
+- eq = self.assertEqual
+- unless = self.assertTrue
+- self._au.add_header('Content-Disposition', 'attachment',
+- filename='audiotest.au')
+- eq(self._au['content-disposition'],
+- 'attachment; filename="audiotest.au"')
+- eq(self._au.get_params(header='content-disposition'),
+- [('attachment', ''), ('filename',
'audiotest.au')])
+- eq(self._au.get_param('filename',
header='content-disposition'),
+- 'audiotest.au')
+- missing = []
+- eq(self._au.get_param('attachment',
header='content-disposition'), '')
+- unless(self._au.get_param('foo', failobj=missing,
+- header='content-disposition') is missing)
+- # Try some missing stuff
+- unless(self._au.get_param('foobar', missing) is missing)
+- unless(self._au.get_param('attachment', missing,
+- header='foobar') is missing)
+-
+-
+-
+ # Test the basic MIMEImage class
+ class TestMIMEImage(unittest.TestCase):
+ def setUp(self):
diff --git a/python-3.2a1-statvfs-f_flag-constants.patch
b/python-3.2a1-statvfs-f_flag-constants.patch
new file mode 100644
index 0000000..b666c1b
--- /dev/null
+++ b/python-3.2a1-statvfs-f_flag-constants.patch
@@ -0,0 +1,47 @@
+diff -up Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants
Python-3.2a1/Modules/posixmodule.c
+--- Python-3.2a1/Modules/posixmodule.c.statvfs-f-flag-constants 2010-07-23
09:53:51.000000000 -0400
++++ Python-3.2a1/Modules/posixmodule.c 2010-08-02 16:39:38.756000423 -0400
+@@ -8173,6 +8173,43 @@ all_ins(PyObject *d)
+ #endif
+ #endif
+
++ /* These came from statvfs.h */
++#ifdef ST_RDONLY
++ if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1;
++#endif /* ST_RDONLY */
++#ifdef ST_NOSUID
++ if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
++#endif /* ST_NOSUID */
++
++ /* GNU extensions */
++#ifdef ST_NODEV
++ if (ins(d, "ST_NODEV", (long)ST_NODEV)) return -1;
++#endif /* ST_NODEV */
++#ifdef ST_NOEXEC
++ if (ins(d, "ST_NOEXEC", (long)ST_NOEXEC)) return -1;
++#endif /* ST_NOEXEC */
++#ifdef ST_SYNCHRONOUS
++ if (ins(d, "ST_SYNCHRONOUS", (long)ST_SYNCHRONOUS)) return -1;
++#endif /* ST_SYNCHRONOUS */
++#ifdef ST_MANDLOCK
++ if (ins(d, "ST_MANDLOCK", (long)ST_MANDLOCK)) return -1;
++#endif /* ST_MANDLOCK */
++#ifdef ST_WRITE
++ if (ins(d, "ST_WRITE", (long)ST_WRITE)) return -1;
++#endif /* ST_WRITE */
++#ifdef ST_APPEND
++ if (ins(d, "ST_APPEND", (long)ST_APPEND)) return -1;
++#endif /* ST_APPEND */
++#ifdef ST_NOATIME
++ if (ins(d, "ST_NOATIME", (long)ST_NOATIME)) return -1;
++#endif /* ST_NOATIME */
++#ifdef ST_NODIRATIME
++ if (ins(d, "ST_NODIRATIME", (long)ST_NODIRATIME)) return -1;
++#endif /* ST_NODIRATIME */
++#ifdef ST_RELATIME
++ if (ins(d, "ST_RELATIME", (long)ST_RELATIME)) return -1;
++#endif /* ST_RELATIME */
++
+ #if defined(PYOS_OS2)
+ if (insertvalues(d)) return -1;
+ #endif
diff --git a/python-3.2a1-systemtap.patch b/python-3.2a1-systemtap.patch
new file mode 100644
index 0000000..6770b58
--- /dev/null
+++ b/python-3.2a1-systemtap.patch
@@ -0,0 +1,222 @@
+diff -up Python-3.2a1/configure.in.systemtap Python-3.2a1/configure.in
+--- Python-3.2a1/configure.in.systemtap 2010-07-19 03:31:40.000000000 -0400
++++ Python-3.2a1/configure.in 2010-08-02 16:19:43.809000621 -0400
+@@ -1987,6 +1987,7 @@ AC_ARG_WITH(system_expat,
+ AC_MSG_RESULT($with_system_expat)
+
+ # Check for use of the system libffi library
++
+ AC_MSG_CHECKING(for --with-system-ffi)
+ AC_ARG_WITH(system_ffi,
+ AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed
ffi library]))
+@@ -2500,6 +2501,38 @@ if test "$with_valgrind" != no; then
+ OPT="-DDYNAMIC_ANNOTATIONS_ENABLED=1 $OPT"
+ fi
+
++# Check for dtrace support
++AC_MSG_CHECKING(for --with-dtrace)
++AC_ARG_WITH(dtrace,
++ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
++
++if test ! -z "$with_dtrace"
++then
++ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Sun"
++ DTRACEOBJS="Python/dtrace.o"
++ DTRADEHDRS=""
++ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Apple"
++ DTRACEOBJS=""
++ DTRADEHDRS="pydtrace.h"
++ else
++ with_dtrace="no"
++ fi
++else
++ with_dtrace="no"
++fi
++
++AC_MSG_RESULT($with_dtrace)
++AC_SUBST(DTRACEOBJS)
++AC_SUBST(DTRACEHDRS)
++
+ # Check for --with-wctype-functions
+ AC_MSG_CHECKING(for --with-wctype-functions)
+ AC_ARG_WITH(wctype-functions,
+diff -up Python-3.2a1/Include/pydtrace.d.systemtap Python-3.2a1/Include/pydtrace.d
+--- Python-3.2a1/Include/pydtrace.d.systemtap 2010-08-02 16:17:04.249000540 -0400
++++ Python-3.2a1/Include/pydtrace.d 2010-08-02 16:17:04.249000540 -0400
+@@ -0,0 +1,10 @@
++provider python {
++ probe function__entry(const char *, const char *, int);
++ probe function__return(const char *, const char *, int);
++};
++
++#pragma D attributes Evolving/Evolving/Common provider python provider
++#pragma D attributes Private/Private/Common provider python module
++#pragma D attributes Private/Private/Common provider python function
++#pragma D attributes Evolving/Evolving/Common provider python name
++#pragma D attributes Evolving/Evolving/Common provider python args
+diff -up Python-3.2a1/Makefile.pre.in.systemtap Python-3.2a1/Makefile.pre.in
+--- Python-3.2a1/Makefile.pre.in.systemtap 2010-08-02 16:17:04.243000614 -0400
++++ Python-3.2a1/Makefile.pre.in 2010-08-02 16:20:41.617000527 -0400
+@@ -324,6 +324,7 @@ PYTHON_OBJS= \
+ Python/dtoa.o \
+ Python/formatter_unicode.o \
+ Python/$(DYNLOADFILE) \
++ @DTRACEOBJS@ \
+ $(LIBOBJS) \
+ $(MACHDEP_OBJS) \
+ $(THREADOBJ)
+@@ -615,6 +616,18 @@ Python/formatter_unicode.o: $(srcdir)/Py
+ $(srcdir)/Objects/stringlib/formatter.h
+
+
++# Only needed with --with-dtrace
++buildinclude:
++ mkdir -p Include
++
++Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
++ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
++
++Python/ceval.o: Include/pydtrace.h
++
++Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
++ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
++
+ ############################################################################
+ # Header files
+
+@@ -1248,7 +1261,7 @@ Python/thread.o: @THREADHEADERS@
+ .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
+ .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
+ .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
+-.PHONY: smelly funny patchcheck
++.PHONY: smelly funny patchcheck buildinclude
+ .PHONY: gdbhooks
+
+ # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
+diff -up Python-3.2a1/pyconfig.h.in.systemtap Python-3.2a1/pyconfig.h.in
+--- Python-3.2a1/pyconfig.h.in.systemtap 2010-08-02 16:18:33.696001964 -0400
++++ Python-3.2a1/pyconfig.h.in 2010-08-02 16:21:48.566001832 -0400
+@@ -1078,6 +1078,9 @@
+ /* Define if you want documentation strings in extension modules */
+ #undef WITH_DOC_STRINGS
+
++/* Define if you want to compile in Dtrace support */
++#undef WITH_DTRACE
++
+ /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
+ linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
+ Dyld is necessary to support frameworks. */
+diff -up Python-3.2a1/Python/ceval.c.systemtap Python-3.2a1/Python/ceval.c
+--- Python-3.2a1/Python/ceval.c.systemtap 2010-07-20 18:39:34.000000000 -0400
++++ Python-3.2a1/Python/ceval.c 2010-08-02 16:23:58.703001000 -0400
+@@ -19,6 +19,10 @@
+
+ #include <ctype.h>
+
++#ifdef WITH_DTRACE
++#include "pydtrace.h"
++#endif
++
+ #ifndef WITH_TSC
+
+ #define READ_TIMESTAMP(var)
+@@ -752,6 +756,70 @@ PyEval_EvalCode(PyCodeObject *co, PyObje
+ }
+
+
++#ifdef WITH_DTRACE
++struct frame_marker_info
++{
++ char *filename;
++ char *name;
++ int lineno;
++
++ PyObject *utf8_filename;
++ PyObject *utf8_name;
++};
++
++static void
++get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
++{
++ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
++ if (fmi->utf8_filename) {
++ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
++ } else {
++ fmi->filename = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
++ if (fmi->utf8_name) {
++ fmi->name = PyBytes_AsString(fmi->utf8_name);
++ } else {
++ fmi->name = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
++}
++
++static void
++release_frame_marker_info(struct frame_marker_info *fmi)
++{
++ Py_XDECREF(fmi->utf8_filename);
++ Py_XDECREF(fmi->utf8_name);
++}
++
++static void
++dtrace_entry(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++
++static void
++dtrace_return(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++#else
++#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
++#define PYTHON_FUNCTION_RETURN_ENABLED() 0
++#define dtrace_entry(f)
++#define dtrace_return(f)
++#endif
++
+ /* Interpreter main loop */
+
+ PyObject *
+@@ -1156,6 +1224,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
+ }
+ }
+
++ if (PYTHON_FUNCTION_ENTRY_ENABLED()) {
++ dtrace_entry(f);
++ }
++
+ co = f->f_code;
+ names = co->co_names;
+ consts = co->co_consts;
+@@ -3046,6 +3118,9 @@ fast_yield:
+
+ /* pop frame */
+ exit_eval_frame:
++ if (PYTHON_FUNCTION_RETURN_ENABLED()) {
++ dtrace_return(f);
++ }
+ Py_LeaveRecursiveCall();
+ tstate->frame = f->f_back;
+
diff --git a/python3.spec b/python3.spec
index 3c8f9ef..15a8549 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1,7 +1,20 @@
-%global pybasever 3.1
+%global pybasever 3.2
+%global alphatag a1
+
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
+# All bytecode files are now in a __pycache__ subdirectory, with a name
+# reflecting the version of the bytecode (to permit sharing of python libraries
+# between different runtimes)
+# See
http://www.python.org/dev/peps/pep-3147/
+# For example,
+# foo/bar.py
+# now has bytecode at:
+# foo/__pycache__/bar.cpython-32.pyc
+# foo/__pycache__/bar.cpython-32.pyo
+%global bytecode_suffixes .cpython-32.py?
+
# Python's configure script defines SOVERSION, and this is used in the Makefile
# to determine INSTSONAME, the name of the libpython DSO:
# LDLIBRARY='libpython$(VERSION).so'
@@ -42,13 +55,43 @@
# invocation of brp-python-hardlink (since this should still work for python3
# pyc/pyo files)
+
+# We need to get a newer configure generated out of configure.in for the following
+# patches:
+# patch 55 (systemtap)
+# patch 103 (debug build)
+# patch 104 (more config flags)
+#
+# For patch 55 (systemtap), we need to get a new header for configure to use
+#
+# configure.in requires autoconf-2.65, but the version in Fedora is currently
+# autoconf-2.66
+#
+# For now, we'll generate a patch to the generated configure script and
+# pyconfig.h.in on a machine that has a local copy of autoconf 2.65
+#
+# Instructions on obtaining such a copy can be seen at
+#
http://bugs.python.org/issue7997
+#
+# To make it easy to regenerate the patch, this specfile can be run in two
+# ways:
+# (i) regenerate_autotooling_patch 0 : the normal approach: prep the
+# source tree using a pre-generated patch to the "configure" script, and do a
+# full build
+# (ii) regenerate_autotooling_patch 1 : intended to be run on a developer's
+# workstation: prep the source tree without patching configure, then rerun a
+# local copy of autoconf-2.65, regenerate the patch, then exit, without doing
+# the rest of the build
+%global regenerate_autotooling_patch 0
+
+
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.2
-Release: 13%{?dist}
+Version: %{pybasever}
+Release: 0.0.%{alphatag}%{?dist}
License: Python
Group: Development/Languages
-Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
+Source:
http://python.org/ftp/python/%{version}/Python-%{version}%{alphatag}.tar.bz2
# Avoid having various bogus auto-generated Provides lines for the various
# python c modules' SONAMEs:
@@ -100,40 +143,33 @@ Source6: systemtap-example.stp
Source7: pyfuntop.stp
-Patch0: python-3.1.1-config.patch
-
-
# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
# The four TestMIMEAudio tests fail due to "audiotest.au" not being packaged.
# It's simplest to remove them:
-Patch3: python-3.1.1-remove-mimeaudio-tests.patch
+Patch3: python-3.2a1-remove-mimeaudio-tests.patch
# ImportTests.test_issue1267 in test_imp.py reads pydoc.py's shebang line and
# checks that it read it correctly.
#
# Since we modify the shebang lines in our packaging, we also need to modify
# the expected value in this test:
-Patch4: python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
+Patch4: python-3.2a1-apply-our-changes-to-expected-shebang-for-test_imp.patch
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
# a libpythonMAJOR.MINOR.a (bug 550692):
-Patch6: python-3.1.1-no-static-lib.patch
-
-# Fixup configure.in and setup.py to build against system expat library.
-# Adapted from
http://svn.python.org/view?view=rev&revision=77170
-Patch7: python-3.1.1-with-system-expat.patch
+Patch6: python-3.2a1-no-static-lib.patch
# Systemtap support: add statically-defined probe points
# Patch based on upstream bug:
http://bugs.python.org/issue4111
# fixed up by mjw and wcohen for 2.6.2, then fixed up by dmalcolm for 2.6.4
# then rewritten by mjw (attachment 390110 of rhbz 545179); ported to 3.1.1 by
# dmalcolm
-Patch8: python-3.1.1-systemtap.patch
+Patch8: python-3.2a1-systemtap.patch
-Patch102: python-3.1.1-lib64.patch
+Patch102: python-3.2a1-lib64.patch
# Patch to support building both optimized vs debug stacks DSO ABIs, sharing
# the same .py and .pyc files, using "_d.so" to signify a debug build of an
@@ -197,7 +233,7 @@ Patch102: python-3.1.1-lib64.patch
# * Patch runtests.sh to support supplying a value for PYTHON, so that we can
# run the tests against each of the builds
-Patch103: python-3.1.2-debug-build.patch
+Patch103: python-3.2a1-debug-build.patch
# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
@@ -207,22 +243,7 @@ Patch104: python-3.1.2-more-configuration-flags.patch
# Add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
-Patch105: python-2.6.5-statvfs-f_flag-constants.patch
-
-# This is the Modules/audioop.c part of the whitespace cleanup in r81032, to make it
-# easier to apply subsequent security fixes:
-Patch106: python-3.1.2-reformat-audioop.c.patch
-
-# CVE-2010-1634: fix various integer overflow checks in the audioop module
-# This is the difference from r81032 to r81081 (i.e r81047 and r81081)
-Patch107: python-3.1.2-CVE-2010-1634.patch
-
-# CVE-2010-2089: verify sizes/lengths within audioop module:
-Patch108: python-3.1.2-CVE-2010-2089.patch
-
-# CVE-2008-5983: the new PySys_SetArgvEx entry point from r81400 (backported to
-# the old layout before the whitespace cleanup of release31-maint in r81033):
-Patch109: python-3.1.2-CVE-2008-5983.patch
+Patch105: python-3.2a1-statvfs-f_flag-constants.patch
# Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
# a segfault running test_pyexpat.py (rhbz:610312)
@@ -233,7 +254,19 @@ Patch110: python-3.1.2-fix-expat-issue9054.patch
# to compile, or linker errors with "undefined reference to
# `_PyParser_Grammar'":
# Not yet sent upstream:
-Patch111: python-3.1-fix-parallel-make.patch
+Patch111: python-3.2a1-fix-parallel-make.patch
+
+# COUNT_ALLOCS is useful for debugging, but the upstream behaviour of always
+# emitting debug info to stdout on exit is too verbose and makes it harder to
+# use the debug build. Add a "PYTHONDUMPCOUNTS" environment variable which
+# must be set to enable the output on exit
+# Not yet sent upstream:
+Patch125: less-verbose-COUNT_ALLOCS.patch
+
+# This is the generated patch to "configure"; see the description of
+# %{regenerate_autotooling_patch}
+# above:
+Patch300: autotool-intermediates.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
@@ -343,9 +376,10 @@ It shares installation directories with the standard Python 3
runtime, so that
.py and .pyc files can be shared. All compiled extension modules gain a "_d"
suffix ("foo_d.so" rather than "foo.so") so that each Python 3
implementation
can load its own extensions.
+%endif # with_debug_build
%prep
-%setup -q -n Python-%{version}
+%setup -q -n Python-%{version}%{alphatag}
chmod +x %{SOURCE1}
%if 0%{?with_systemtap}
@@ -370,34 +404,31 @@ rm -r Modules/zlib || exit 1
#
# Apply patches:
#
-%patch0 -p1 -b .config
-%patch1 -p1 -b .rpath
+%patch1 -p1
%patch3 -p1 -b .remove-mimeaudio-tests
%patch4 -p1 -b .apply-our-changes-to-expected-shebang
%patch6 -p1 -b .no-static-lib
-%patch7 -p1 -b .expat
+
%if 0%{?with_systemtap}
%patch8 -p1 -b .systemtap
%endif
%if "%{_lib}" == "lib64"
-%patch102 -p1 -b .lib64
+%patch102 -p1
%endif
-%patch103 -p1 -b .debug-build
+%patch103 -p1
+
%patch104 -p1 -b .more-configuration-flags
%patch105 -p1 -b .statvfs-f-flag-constants
-%patch106 -p3 -b .reformat-audioop
-%patch107 -p3 -b .CVE-2010-1634
-%patch108 -p1 -b .CVE-2010-2089
-%patch109 -p1 -b .CVE-2008-5983
-
%patch110 -p0 -b .fix-expat-issue9054
%patch111 -p1 -b .parallel-grammar
+%patch125 -p1 -b .less-verbose-COUNT_ALLOCS
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -408,6 +439,12 @@ sed --in-place \
--expression="s|http://docs.python.org/library|http://docs.python.org/%{pybasever}/library|g"
\
Lib/pydoc.py || exit 1
+%if ! 0%{regenerate_autotooling_patch}
+# Normally we apply the patch to "configure"
+# We don't apply the patch if we're working towards regenerating it
+%patch300 -p0 -b .autotool-intermediates
+%endif
+
%build
topdir=$(pwd)
export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
@@ -418,10 +455,28 @@ export LINKCC="gcc"
export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`"
-autoconf
+%if 0%{regenerate_autotooling_patch}
+# If enabled, this code regenerates the patch to "configure", using a
+# local copy of autoconf-2.65, then exits the build
+#
+# The following assumes that the copy is installed to ~/autoconf-2.65/bin
+# as per these instructions:
+#
http://bugs.python.org/issue7997
+
+for f in pyconfig.h.in configure ; do
+ cp $f $f.autotool-intermediates ;
+done
+
+# Rerun the autotools:
+PATH=~/autoconf-2.65/bin:$PATH autoreconf
-# For patch 8 (systemtap), we need to get a new header for configure to use:
-autoheader
+# Regenerate the patch:
+gendiff . .autotool-intermediates > %{PATCH300}
+
+
+# Exit the build
+exit 1
+%endif
# Define a function, for how to perform a "build" of python for a given
# configuration:
@@ -548,7 +603,6 @@ install -m755 -d ${RPM_BUILD_ROOT}%{pylibdir}/Tools
install Tools/README ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
cp -ar Tools/freeze ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
cp -ar Tools/i18n ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
-cp -ar Tools/modulator ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
cp -ar Tools/pynche ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
cp -ar Tools/scripts ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
@@ -804,93 +858,95 @@ rm -fr %{buildroot}
%{_mandir}/*/*
%dir %{pylibdir}
%dir %{dynload_dir}
-%{dynload_dir}/Python-%{version}-py%{pybasever}.egg-info
-%{dynload_dir}/_bisectmodule.so
+%{dynload_dir}/Python-%{version}%{alphatag}-py%{pybasever}.egg-info
+%{dynload_dir}/_bisect.so
%{dynload_dir}/_codecs_cn.so
%{dynload_dir}/_codecs_hk.so
%{dynload_dir}/_codecs_iso2022.so
%{dynload_dir}/_codecs_jp.so
%{dynload_dir}/_codecs_kr.so
%{dynload_dir}/_codecs_tw.so
-%{dynload_dir}/_collectionsmodule.so
+%{dynload_dir}/_collections.so
%{dynload_dir}/_csv.so
%{dynload_dir}/_ctypes.so
%{dynload_dir}/_curses.so
%{dynload_dir}/_curses_panel.so
%{dynload_dir}/_dbm.so
%{dynload_dir}/_elementtree.so
-%{dynload_dir}/_gdbmmodule.so
+%{dynload_dir}/_gdbm.so
%{dynload_dir}/_hashlib.so
-%{dynload_dir}/_heapqmodule.so
+%{dynload_dir}/_heapq.so
%{dynload_dir}/_json.so
%{dynload_dir}/_lsprof.so
-%{dynload_dir}/_multibytecodecmodule.so
+%{dynload_dir}/_multibytecodec.so
%{dynload_dir}/_multiprocessing.so
%{dynload_dir}/_pickle.so
-%{dynload_dir}/_randommodule.so
-%{dynload_dir}/_sha1module.so
-%{dynload_dir}/_sha256module.so
-%{dynload_dir}/_sha512module.so
-%{dynload_dir}/_socketmodule.so
+%{dynload_dir}/_posixsubprocess.so
+%{dynload_dir}/_random.so
+%{dynload_dir}/_socket.so
%{dynload_dir}/_sqlite3.so
%{dynload_dir}/_ssl.so
%{dynload_dir}/_struct.so
-%{dynload_dir}/_weakref.so
-%{dynload_dir}/arraymodule.so
-%{dynload_dir}/atexitmodule.so
+%{dynload_dir}/array.so
+%{dynload_dir}/atexit.so
%{dynload_dir}/audioop.so
%{dynload_dir}/binascii.so
%{dynload_dir}/bz2.so
-%{dynload_dir}/cmathmodule.so
-%{dynload_dir}/cryptmodule.so
-%{dynload_dir}/datetime.so
-%{dynload_dir}/fcntlmodule.so
-%{dynload_dir}/grpmodule.so
-%{dynload_dir}/itertoolsmodule.so
-%{dynload_dir}/mathmodule.so
-%{dynload_dir}/mmapmodule.so
-%{dynload_dir}/nismodule.so
+%{dynload_dir}/cmath.so
+%{dynload_dir}/crypt.so
+%{dynload_dir}/_datetime.so
+%{dynload_dir}/fcntl.so
+%{dynload_dir}/grp.so
+%{dynload_dir}/itertools.so
+%{dynload_dir}/math.so
+%{dynload_dir}/mmap.so
+%{dynload_dir}/nis.so
%{dynload_dir}/operator.so
%{dynload_dir}/ossaudiodev.so
-%{dynload_dir}/parsermodule.so
+%{dynload_dir}/parser.so
%{dynload_dir}/pyexpat.so
%{dynload_dir}/readline.so
%{dynload_dir}/resource.so
-%{dynload_dir}/selectmodule.so
-%{dynload_dir}/spwdmodule.so
-%{dynload_dir}/syslogmodule.so
+%{dynload_dir}/select.so
+%{dynload_dir}/spwd.so
+%{dynload_dir}/syslog.so
%{dynload_dir}/termios.so
-%{dynload_dir}/timemodule.so
+%{dynload_dir}/time.so
%{dynload_dir}/unicodedata.so
-%{dynload_dir}/xxsubtype.so
-%{dynload_dir}/zlibmodule.so
+%{dynload_dir}/zlib.so
%dir %{pylibdir}/site-packages
%{pylibdir}/site-packages/README
-%{pylibdir}/*.py*
-%{pylibdir}/*.doc
+%{pylibdir}/*.py
+%{pylibdir}/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/wsgiref.egg-info
%dir %{pylibdir}/ctypes
-%{pylibdir}/ctypes/*.py*
+%{pylibdir}/ctypes/*.py
+%{pylibdir}/ctypes/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/ctypes/macholib
%{pylibdir}/curses
%dir %{pylibdir}/dbm
-%{pylibdir}/dbm/*.py*
+%{pylibdir}/dbm/*.py
+%{pylibdir}/dbm/__pycache__/*%{bytecode_suffixes}
%dir %{pylibdir}/distutils
-%{pylibdir}/distutils/*.py*
+%{pylibdir}/distutils/*.py
+%{pylibdir}/distutils/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/distutils/README
%{pylibdir}/distutils/command
%dir %{pylibdir}/email
-%{pylibdir}/email/*.py*
+%{pylibdir}/email/*.py
+%{pylibdir}/email/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/email/mime
%{pylibdir}/encodings
%{pylibdir}/html
%{pylibdir}/http
%{pylibdir}/idlelib
%dir %{pylibdir}/importlib
-%{pylibdir}/importlib/*.py*
+%{pylibdir}/importlib/*.py
+%{pylibdir}/importlib/__pycache__/*%{bytecode_suffixes}
%dir %{pylibdir}/json
-%{pylibdir}/json/*.py*
+%{pylibdir}/json/*.py
+%{pylibdir}/json/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/lib2to3
%exclude %{pylibdir}/lib2to3/tests
%{pylibdir}/logging
@@ -898,9 +954,14 @@ rm -fr %{buildroot}
%{pylibdir}/plat-linux2
%{pylibdir}/pydoc_data
%dir %{pylibdir}/sqlite3
-%{pylibdir}/sqlite3/*.py*
+%{pylibdir}/sqlite3/*.py
+%{pylibdir}/sqlite3/__pycache__/*%{bytecode_suffixes}
%dir %{pylibdir}/test
-%{pylibdir}/test/__init__.py*
+%{pylibdir}/test/__init__.py
+%{pylibdir}/test/__pycache__/__init__%{bytecode_suffixes}
+%dir %{pylibdir}/unittest
+%{pylibdir}/unittest/*.py
+%{pylibdir}/unittest/__pycache__/*%{bytecode_suffixes}
%{pylibdir}/urllib
%{pylibdir}/wsgiref
%{pylibdir}/xml
@@ -967,11 +1028,14 @@ rm -fr %{buildroot}
%{pylibdir}/sqlite3/test
%{pylibdir}/test
%{dynload_dir}/_ctypes_test.so
-%{dynload_dir}/_testcapimodule.so
+%{dynload_dir}/_testcapi.so
%{pylibdir}/lib2to3/tests
%doc %{pylibdir}/Demo/distutils
%doc %{pylibdir}/Demo/md5test
%{pylibdir}/tkinter/test
+%dir %{pylibdir}/unittest/test
+%{pylibdir}/unittest/test/*.py
+%{pylibdir}/unittest/test/__pycache__/*%{bytecode_suffixes}
# We don't bother splitting the debug build out into further subpackages:
@@ -989,65 +1053,65 @@ rm -fr %{buildroot}
%{_bindir}/python%{pybasever}-debug
# ...with debug builds of the built-in "extension" modules:
-%{dynload_dir}/_bisectmodule_d.so
+%{dynload_dir}/_bisect_d.so
%{dynload_dir}/_codecs_cn_d.so
%{dynload_dir}/_codecs_hk_d.so
%{dynload_dir}/_codecs_iso2022_d.so
%{dynload_dir}/_codecs_jp_d.so
%{dynload_dir}/_codecs_kr_d.so
%{dynload_dir}/_codecs_tw_d.so
-%{dynload_dir}/_collectionsmodule_d.so
+%{dynload_dir}/_collections_d.so
%{dynload_dir}/_csv_d.so
%{dynload_dir}/_ctypes_d.so
%{dynload_dir}/_curses_d.so
%{dynload_dir}/_curses_panel_d.so
%{dynload_dir}/_dbm_d.so
%{dynload_dir}/_elementtree_d.so
-%{dynload_dir}/_gdbmmodule_d.so
+%{dynload_dir}/_gdbm_d.so
%{dynload_dir}/_hashlib_d.so
-%{dynload_dir}/_heapqmodule_d.so
+%{dynload_dir}/_heapq_d.so
%{dynload_dir}/_json_d.so
%{dynload_dir}/_lsprof_d.so
-%{dynload_dir}/_multibytecodecmodule_d.so
+%{dynload_dir}/_md5_d.so
+%{dynload_dir}/_multibytecodec_d.so
%{dynload_dir}/_multiprocessing_d.so
%{dynload_dir}/_pickle_d.so
-%{dynload_dir}/_randommodule_d.so
-%{dynload_dir}/_sha1module_d.so
-%{dynload_dir}/_sha256module_d.so
-%{dynload_dir}/_sha512module_d.so
-%{dynload_dir}/_socketmodule_d.so
+%{dynload_dir}/_posixsubprocess_d.so
+%{dynload_dir}/_random_d.so
+%{dynload_dir}/_sha1_d.so
+%{dynload_dir}/_sha256_d.so
+%{dynload_dir}/_sha512_d.so
+%{dynload_dir}/_socket_d.so
%{dynload_dir}/_sqlite3_d.so
%{dynload_dir}/_ssl_d.so
%{dynload_dir}/_struct_d.so
-%{dynload_dir}/_weakref_d.so
-%{dynload_dir}/arraymodule_d.so
-%{dynload_dir}/atexitmodule_d.so
+%{dynload_dir}/array_d.so
+%{dynload_dir}/atexit_d.so
%{dynload_dir}/audioop_d.so
%{dynload_dir}/binascii_d.so
%{dynload_dir}/bz2_d.so
-%{dynload_dir}/cmathmodule_d.so
-%{dynload_dir}/cryptmodule_d.so
-%{dynload_dir}/datetime_d.so
-%{dynload_dir}/fcntlmodule_d.so
-%{dynload_dir}/grpmodule_d.so
-%{dynload_dir}/itertoolsmodule_d.so
-%{dynload_dir}/mathmodule_d.so
-%{dynload_dir}/mmapmodule_d.so
-%{dynload_dir}/nismodule_d.so
+%{dynload_dir}/cmath_d.so
+%{dynload_dir}/crypt_d.so
+%{dynload_dir}/_datetime_d.so
+%{dynload_dir}/fcntl_d.so
+%{dynload_dir}/grp_d.so
+%{dynload_dir}/itertools_d.so
+%{dynload_dir}/math_d.so
+%{dynload_dir}/mmap_d.so
+%{dynload_dir}/nis_d.so
%{dynload_dir}/operator_d.so
%{dynload_dir}/ossaudiodev_d.so
-%{dynload_dir}/parsermodule_d.so
+%{dynload_dir}/parser_d.so
%{dynload_dir}/pyexpat_d.so
%{dynload_dir}/readline_d.so
%{dynload_dir}/resource_d.so
-%{dynload_dir}/selectmodule_d.so
-%{dynload_dir}/spwdmodule_d.so
-%{dynload_dir}/syslogmodule_d.so
+%{dynload_dir}/select_d.so
+%{dynload_dir}/spwd_d.so
+%{dynload_dir}/syslog_d.so
%{dynload_dir}/termios_d.so
-%{dynload_dir}/timemodule_d.so
+%{dynload_dir}/time_d.so
%{dynload_dir}/unicodedata_d.so
-%{dynload_dir}/xxsubtype_d.so
-%{dynload_dir}/zlibmodule_d.so
+%{dynload_dir}/zlib_d.so
# No need to split things out the "Makefile" and the config-32/64.h file as we
# do for the regular build above (bug 531901), since they're all in one package
@@ -1078,7 +1142,7 @@ rm -fr %{buildroot}
# Analog of the -test subpackage's files:
%{dynload_dir}/_ctypes_test_d.so
-%{dynload_dir}/_testcapimodule_d.so
+%{dynload_dir}/_testcapi_d.so
%endif # with_debug_build
@@ -1097,6 +1161,26 @@ rm -fr %{buildroot}
%changelog
+* Sat Aug 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.2-0.0.a1
+- 3.2a1; add alphatag
+- rework %%files in the light of PEP 3147 (__pycache__)
+- drop our configuration patch to Setup.dist (patch 0): setup.py should do a
+better job of things, and the %%files explicitly lists our modules (r82746
+appears to break the old way of doing things). This leads to various modules
+changing from "foomodule.so" to "foo.so". It also leads to the
optimized build
+dropping the _sha1, _sha256 and _sha512 modules, but these are provided by
+_hashlib; _weakref becomes a builtin module; xxsubtype goes away (it's only for
+testing/devel purposes)
+- fixup patches 3, 4, 6, 8, 102, 103, 105, 111 for the rebase
+- remove upstream patches: 7 (system expat), 106, 107, 108 (audioop reformat
+plus CVE-2010-1634 and CVE-2010-2089), 109 (CVE-2008-5983)
+- add machinery for rebuilding "configure" and friends, using the correct
+version of autoconf (patch 300)
+- patch the debug build's usage of COUNT_ALLOCS to be less verbose (patch 125)
+- "modulator" was removed upstream
+- drop "-b" from patch applications affecting .py files to avoid littering the
+installation tree
+
* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
- Turn on computed-gotos.
- Fix for parallel make and graminit.c
diff --git a/sources b/sources
index 30f03d2..c49803c 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-45350b51b58a46b029fb06c61257e350 Python-3.1.2.tar.bz2
+b371e1f7a0e98e7a0d1792823fd0f58c Python-3.2a1.tar.bz2
commit 815994f42ade451adf5fc26d5cde4c662a9ce1b7
Author: David Malcolm <dmalcolm(a)redhat.com>
Date: Sat Aug 21 16:26:53 2010 -0400
Add with_debug_build conditional
diff --git a/python3.spec b/python3.spec
index d12a166..3c8f9ef 100644
--- a/python3.spec
+++ b/python3.spec
@@ -13,6 +13,8 @@
%global py_INSTSONAME_optimized libpython%{pybasever}.so.%{py_SOVERSION}
%global py_INSTSONAME_debug libpython%{pybasever}_d.so.%{py_SOVERSION}
+%global with_debug_build 1
+
%global with_gdb_hooks 1
%global with_systemtap 1
@@ -310,6 +312,7 @@ in production.
You might want to install the python3-test package if you're developing
python 3 code that uses more than just unittest and/or test_support.py.
+%if 0%{?with_debug_build}
%package debug
Summary: Debug version of the Python 3 runtime
Group: Applications/System
@@ -462,6 +465,7 @@ make OPT="$CFLAGS" %{?_smp_mflags}
# Use "BuildPython" to support building with different configurations:
+%if 0%{?with_debug_build}
BuildPython debug \
python-debug \
python%{pybasever}-debug \
@@ -471,6 +475,7 @@ BuildPython debug \
"--with-pydebug --with-count-allocs --with-call-profile" \
%endif
false
+%endif # with_debug_build
BuildPython optimized \
python \
@@ -525,8 +530,10 @@ cp %{SOURCE4} %{buildroot}$PathOfGdbPy
# Use "InstallPython" to support building with different configurations:
# Install the "debug" build first, so that we can move some files aside
+%if 0%{?with_debug_build}
InstallPython debug \
%{py_INSTSONAME_debug}
+%endif # with_debug_build
# Now the optimized build:
InstallPython optimized \
@@ -568,7 +575,14 @@ install -d %{buildroot}/usr/lib/python%{pybasever}/site-packages
%else
%global _pyconfig_h %{_pyconfig32_h}
%endif
-for PyIncludeDir in python%{pybasever} python%{pybasever}-debug ; do
+
+%if 0%{?with_debug_build}
+%global PyIncludeDirs python%{pybasever} python%{pybasever}-debug
+%else
+%global PyIncludeDirs python%{pybasever}
+%endif
+
+for PyIncludeDir in %{PyIncludeDirs} ; do
mv %{buildroot}%{_includedir}/$PyIncludeDir/pyconfig.h \
%{buildroot}%{_includedir}/$PyIncludeDir/%{_pyconfig_h}
cat > %{buildroot}%{_includedir}/$PyIncludeDir/pyconfig.h << EOF
@@ -693,10 +707,12 @@ sed \
%{SOURCE6} \
%{buildroot}%{tapsetdir}/%{libpython_stp_optimized}
+%if 0%{?with_debug_build}
sed \
-e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_debug}|" \
%{SOURCE6} \
%{buildroot}%{tapsetdir}/%{libpython_stp_debug}
+%endif #
with_debug_build
%endif # with_systemtap
@@ -766,7 +782,9 @@ done
}
# Check each of the configurations:
+%if 0%{?with_debug_build}
CheckPython debug
+%endif # with_debug_build
CheckPython optimized
@@ -962,6 +980,7 @@ rm -fr %{buildroot}
# Hence the manifest is the combination of analogous files in the manifests of
# all of the other subpackages
+%if 0%{?with_debug_build}
%files debug
%defattr(-,root,root,-)
@@ -1061,6 +1080,8 @@ rm -fr %{buildroot}
%{dynload_dir}/_ctypes_test_d.so
%{dynload_dir}/_testcapimodule_d.so
+%endif # with_debug_build
+
# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from
# ldconfig (rhbz:562980).
#
commit ab3441ad0dc3ec5273666351a750c428c903d2cc
Author: Toshio Kuratomi <toshio(a)fedoraproject.org>
Date: Thu Aug 19 14:13:51 2010 -0400
* Fri Aug 6 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
- Turn on computed-gotos.
- Fix for parallel make and graminit.c
diff --git a/python3.spec b/python3.spec
index 6faac6b..d12a166 100644
--- a/python3.spec
+++ b/python3.spec
@@ -227,6 +227,12 @@ Patch109: python-3.1.2-CVE-2008-5983.patch
# Sent upstream as
http://bugs.python.org/issue9054
Patch110: python-3.1.2-fix-expat-issue9054.patch
+# Fix race condition in parallel make that could lead to graminit.c failing
+# to compile, or linker errors with "undefined reference to
+# `_PyParser_Grammar'":
+# Not yet sent upstream:
+Patch111: python-3.1-fix-parallel-make.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
BuildRequires: ncurses-devel, gdbm-devel, zlib-devel, expat-devel
@@ -387,6 +393,8 @@ rm -r Modules/zlib || exit 1
%patch110 -p0 -b .fix-expat-issue9054
+%patch111 -p1 -b .parallel-grammar
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -1068,8 +1076,9 @@ rm -fr %{buildroot}
%changelog
-* Fri Aug 6 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
+* Thu Aug 19 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
- Turn on computed-gotos.
+- Fix for parallel make and graminit.c
* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
- rebuild
commit 4c1f6daa7c985007218e9a7e7fd6601153a5dcd0
Author: Toshio Kuratomi <toshio(a)fedoraproject.org>
Date: Thu Aug 19 14:12:57 2010 -0400
* Fri Aug 6 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
- Turn on computed-gotos.
- Fix for parallel make and graminit.c
diff --git a/python-3.1-fix-parallel-make.patch b/python-3.1-fix-parallel-make.patch
new file mode 100644
index 0000000..3c75b10
--- /dev/null
+++ b/python-3.1-fix-parallel-make.patch
@@ -0,0 +1,38 @@
+Index: Python-3.1.2/Makefile.pre.in
+===================================================================
+--- Python-3.1.2.orig/Makefile.pre.in
++++ Python-3.1.2/Makefile.pre.in
+@@ -215,6 +215,7 @@ IO_OBJS= \
+
+ ##########################################################################
+ # Grammar
++GRAMMAR_STAMP= $(srcdir)/grammar-stamp
+ GRAMMAR_H= $(srcdir)/Include/graminit.h
+ GRAMMAR_C= $(srcdir)/Python/graminit.c
+ GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar
+@@ -535,9 +536,24 @@ Modules/python.o: $(srcdir)/Modules/pyth
+
+ $(IO_OBJS): $(IO_H)
+
+-$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
++# GNU "make" interprets rules with two dependents as two copies of the rule.
++#
++# In a parallel build this can lead to pgen being run twice, once for each of
++# GRAMMAR_H and GRAMMAR_C, leading to race conditions in which the compiler
++# reads a partially-overwritten copy of one of these files, leading to syntax
++# errors (or linker errors if the fragment happens to be syntactically valid C)
++#
++# See
http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
++# for more information
++#
++# Introduce ".grammar-stamp" as a contrived single output from PGEN to avoid
++# this:
++$(GRAMMAR_H) $(GRAMMAR_C): $(GRAMMAR_STAMP)
++
++$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
+ -@$(INSTALL) -d Include
+ -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
++ touch $(GRAMMAR_STAMP)
+
+ $(PGEN): $(PGENOBJS)
+ $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
commit 91b78044d5f01128558248f3ae6d2cb19bc963f0
Author: Toshio Kuratomi <toshio(a)fedoraproject.org>
Date: Fri Aug 6 17:16:23 2010 -0400
* Fri Aug 6 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
- Turn on computed-gotos.
diff --git a/python3.spec b/python3.spec
index 4adf0a2..6faac6b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -17,6 +17,9 @@
%global with_systemtap 1
+# Change from yes to no to turn this off
+%global with_computed_gotos yes
+
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
#
@@ -40,7 +43,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 12%{?dist}
+Release: 13%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -439,6 +442,7 @@ BuildPython() {
--with-system-ffi \
--with-system-expat \
$ExtraConfigArgs \
+ --with-computed-gotos=%{with_computed_gotos} \
%{nil}
@@ -1064,6 +1068,9 @@ rm -fr %{buildroot}
%changelog
+* Fri Aug 6 2010 Toshio Kuratomi <toshio(a)fedoraproject.org> - 3.1.2-13
+- Turn on computed-gotos.
+
* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
- rebuild
commit db6a64a5ec51905341ff17889bb6e4e19a6ab25d
Author: Fedora Release Engineering <rel-eng(a)lists.fedoraproject.org>
Date: Thu Jul 29 10:53:57 2010 +0000
dist-git conversion
diff --git a/.cvsignore b/.cvsignore
deleted file mode 100644
index 95c8574..0000000
--- a/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
-Python-3.1.2.tar.bz2
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..95c8574
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
+Python-3.1.2.tar.bz2
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 3d37c61..0000000
--- a/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# Makefile for source rpm: python3
-# $Id$
-NAME := python3
-SPECFILE = $(firstword $(wildcard *.spec))
-
-define find-makefile-common
-for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f
$$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo
"$$d/Makefile.common" ; break ; fi ; done
-endef
-
-MAKEFILE_COMMON := $(shell $(find-makefile-common))
-
-ifeq ($(MAKEFILE_COMMON),)
-# attept a checkout
-define checkout-makefile-common
-test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo
"common/Makefile.common" ; } || { echo "ERROR: I can't figure out how
to checkout the 'common' module." ; exit -1 ; } >&2
-endef
-
-MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
-endif
-
-include $(MAKEFILE_COMMON)
diff --git a/import.log b/import.log
deleted file mode 100644
index 1b187cb..0000000
--- a/import.log
+++ /dev/null
@@ -1 +0,0 @@
-python3-3_1_1-13_fc12:HEAD:python3-3.1.1-13.fc12.src.rpm:1263417721
commit 9b81ebe91e254e6bb9272beeb880ec130d896030
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Fri Jul 2 20:32:10 2010 +0000
rebuild
diff --git a/python3.spec b/python3.spec
index 4f331b0..4adf0a2 100644
--- a/python3.spec
+++ b/python3.spec
@@ -40,7 +40,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 11%{?dist}
+Release: 12%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -1064,6 +1064,9 @@ rm -fr %{buildroot}
%changelog
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-12
+- rebuild
+
* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
commit 03b7fb2d623ad6a4c1a4e4ec7c011a6222b9214d
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Fri Jul 2 15:49:25 2010 +0000
- Fix an incompatibility between pyexpat and the system expat-2.0.1 that
led to a segfault running test_pyexpat.py (patch 110; upstream issue
9054; rhbz#610312)
diff --git a/python-3.1.2-fix-expat-issue9054.patch
b/python-3.1.2-fix-expat-issue9054.patch
new file mode 100644
index 0000000..f1a4640
--- /dev/null
+++ b/python-3.1.2-fix-expat-issue9054.patch
@@ -0,0 +1,14 @@
+Index: Modules/pyexpat.c
+===================================================================
+--- Modules/pyexpat.c (revision 81539)
++++ Modules/pyexpat.c (working copy)
+@@ -415,6 +415,9 @@
+ PyObject *args;
+ PyObject *temp;
+
++ if (!have_handler(self, CharacterData))
++ return -1;
++
+ args = PyTuple_New(1);
+ if (args == NULL)
+ return -1;
diff --git a/python3.spec b/python3.spec
index 7cf210d..4f331b0 100644
--- a/python3.spec
+++ b/python3.spec
@@ -40,7 +40,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 10%{?dist}
+Release: 11%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -219,6 +219,11 @@ Patch108: python-3.1.2-CVE-2010-2089.patch
# the old layout before the whitespace cleanup of release31-maint in r81033):
Patch109: python-3.1.2-CVE-2008-5983.patch
+# Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
+# a segfault running test_pyexpat.py (rhbz:610312)
+# Sent upstream as
http://bugs.python.org/issue9054
+Patch110: python-3.1.2-fix-expat-issue9054.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
BuildRequires: ncurses-devel, gdbm-devel, zlib-devel, expat-devel
@@ -377,6 +382,8 @@ rm -r Modules/zlib || exit 1
%patch108 -p1 -b .CVE-2010-2089
%patch109 -p1 -b .CVE-2008-5983
+%patch110 -p0 -b .fix-expat-issue9054
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -1057,6 +1064,10 @@ rm -fr %{buildroot}
%changelog
+* Fri Jul 2 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-11
+- Fix an incompatibility between pyexpat and the system expat-2.0.1 that led to
+a segfault running test_pyexpat.py (patch 110; upstream issue 9054; rhbz#610312)
+
* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
- reformat whitespace in audioop.c (patch 106)
commit 5c9590b543d16549bdd0564c0fa282a7108428a8
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Fri Jun 4 19:56:30 2010 +0000
- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
- reformat whitespace in audioop.c (patch 106)
- CVE-2010-1634: fix various integer overflow checks in the audioop module
(patch 107)
- CVE-2010-2089: further checks within the audioop module (patch 108)
- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch
109)
diff --git a/python-3.1.2-CVE-2008-5983.patch b/python-3.1.2-CVE-2008-5983.patch
new file mode 100644
index 0000000..f33cebb
--- /dev/null
+++ b/python-3.1.2-CVE-2008-5983.patch
@@ -0,0 +1,120 @@
+diff -up Python-3.1.2/Doc/c-api/init.rst.CVE-2008-5983 Python-3.1.2/Doc/c-api/init.rst
+--- Python-3.1.2/Doc/c-api/init.rst.CVE-2008-5983 2010-01-09 13:48:46.000000000 -0500
++++ Python-3.1.2/Doc/c-api/init.rst 2010-06-04 15:19:26.724089244 -0400
+@@ -22,6 +22,7 @@ Initialization, Finalization, and Thread
+ module: sys
+ triple: module; search; path
+ single: PySys_SetArgv()
++ single: PySys_SetArgvEx()
+ single: Py_Finalize()
+
+ Initialize the Python interpreter. In an application embedding Python, this
+@@ -31,7 +32,7 @@ Initialization, Finalization, and Thread
+ the table of loaded modules (``sys.modules``), and creates the fundamental
+ modules :mod:`builtins`, :mod:`__main__` and :mod:`sys`. It also initializes
+ the module search path (``sys.path``). It does not set ``sys.argv``; use
+- :cfunc:`PySys_SetArgv` for that. This is a no-op when called for a second time
++ :cfunc:`PySys_SetArgvEx` for that. This is a no-op when called for a second time
+ (without calling :cfunc:`Py_Finalize` first). There is no return value; it is a
+ fatal error if the initialization fails.
+
+@@ -344,7 +345,7 @@ Initialization, Finalization, and Thread
+ ``sys.version``.
+
+
+-.. cfunction:: void PySys_SetArgv(int argc, wchar_t **argv)
++.. cfunction:: void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
+
+ .. index::
+ single: main()
+@@ -359,14 +360,41 @@ Initialization, Finalization, and Thread
+ string. If this function fails to initialize :data:`sys.argv`, a fatal
+ condition is signalled using :cfunc:`Py_FatalError`.
+
+- This function also prepends the executed script's path to :data:`sys.path`.
+- If no script is executed (in the case of calling ``python -c`` or just the
+- interactive interpreter), the empty string is used instead.
++ If *updatepath* is zero, this is all the function does. If *updatepath*
++ is non-zero, the function also modifies :data:`sys.path` according to the
++ following algorithm:
++
++ - If the name of an existing script is passed in ``argv[0]``, the absolute
++ path of the directory where the script is located is prepended to
++ :data:`sys.path`.
++ - Otherwise (that is, if *argc* is 0 or ``argv[0]`` doesn't point
++ to an existing file name), an empty string is prepended to
++ :data:`sys.path`, which is the same as prepending the current working
++ directory (``"."``).
++
++ .. note::
++ It is recommended that applications embedding the Python interpreter
++ for purposes other than executing a single script pass 0 as *updatepath*,
++ and update :data:`sys.path` themselves if desired.
++ See `CVE-2008-5983
<
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_.
++
++ On versions before 3.1.3, you can achieve the same effect by manually
++ popping the first :data:`sys.path` element after having called
++ :cfunc:`PySys_SetArgv`, for example using::
++
++ PyRun_SimpleString("import sys; sys.path.pop(0)\n");
++
++ .. versionadded:: 3.1.3
+
+ .. XXX impl. doesn't seem consistent in allowing 0/NULL for the params;
+ check w/ Guido.
+
+
++.. cfunction:: void PySys_SetArgv(int argc, wchar_t **argv)
++
++ This function works like :cfunc:`PySys_SetArgv` with *updatepath* set to 1.
++
++
+ .. cfunction:: void Py_SetPythonHome(wchar_t *home)
+
+ Set the default "home" directory, that is, the location of the standard
+diff -up Python-3.1.2/Include/sysmodule.h.CVE-2008-5983 Python-3.1.2/Include/sysmodule.h
+--- Python-3.1.2/Include/sysmodule.h.CVE-2008-5983 2008-04-13 09:53:33.000000000 -0400
++++ Python-3.1.2/Include/sysmodule.h 2010-06-04 15:19:26.721088968 -0400
+@@ -10,6 +10,7 @@ extern "C" {
+ PyAPI_FUNC(PyObject *) PySys_GetObject(const char *);
+ PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *);
+ PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **);
++PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int);
+ PyAPI_FUNC(void) PySys_SetPath(const wchar_t *);
+
+ PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...)
+diff -up Python-3.1.2/Misc/NEWS.CVE-2008-5983 Python-3.1.2/Misc/NEWS
+diff -up Python-3.1.2/Python/sysmodule.c.CVE-2008-5983 Python-3.1.2/Python/sysmodule.c
+--- Python-3.1.2/Python/sysmodule.c.CVE-2008-5983 2010-06-04 15:19:26.000000000 -0400
++++ Python-3.1.2/Python/sysmodule.c 2010-06-04 15:20:59.932964188 -0400
+@@ -1561,7 +1561,7 @@ _wrealpath(const wchar_t *path, wchar_t
+ #endif
+
+ void
+-PySys_SetArgv(int argc, wchar_t **argv)
++PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
+ {
+ #if defined(HAVE_REALPATH)
+ wchar_t fullpath[MAXPATHLEN];
+@@ -1574,7 +1574,7 @@ PySys_SetArgv(int argc, wchar_t **argv)
+ Py_FatalError("no mem for sys.argv");
+ if (PySys_SetObject("argv", av) != 0)
+ Py_FatalError("can't assign sys.argv");
+- if (path != NULL) {
++ if (updatepath && path != NULL) {
+ wchar_t *argv0 = argv[0];
+ wchar_t *p = NULL;
+ Py_ssize_t n = 0;
+@@ -1661,6 +1661,12 @@ PySys_SetArgv(int argc, wchar_t **argv)
+ Py_DECREF(av);
+ }
+
++void
++PySys_SetArgv(int argc, wchar_t **argv)
++{
++ PySys_SetArgvEx(argc, argv, 1);
++}
++
+
+ /* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
+ Adapted from code submitted by Just van Rossum.
diff --git a/python-3.1.2-CVE-2010-1634.patch b/python-3.1.2-CVE-2010-1634.patch
new file mode 100644
index 0000000..f3de6ea
--- /dev/null
+++ b/python-3.1.2-CVE-2010-1634.patch
@@ -0,0 +1,209 @@
+--- python/branches/py3k/Modules/audioop.c 2010/05/09 15:52:27 81032
++++ python/branches/py3k/Modules/audioop.c 2010/05/11 13:09:58 81081
+@@ -834,7 +834,7 @@
+ audioop_tostereo(PyObject *self, PyObject *args)
+ {
+ signed char *cp, *ncp;
+- int len, new_len, size, val1, val2, val = 0;
++ int len, size, val1, val2, val = 0;
+ double fac1, fac2, fval, maxval;
+ PyObject *rv;
+ int i;
+@@ -851,14 +851,13 @@
+ return 0;
+ }
+
+- new_len = len*2;
+- if (new_len < 0) {
++ if (len > INT_MAX/2) {
+ PyErr_SetString(PyExc_MemoryError,
+ "not enough memory for output buffer");
+ return 0;
+ }
+
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
++ rv = PyBytes_FromStringAndSize(NULL, len*2);
+ if ( rv == 0 )
+ return 0;
+ ncp = (signed char *)PyBytes_AsString(rv);
+@@ -1021,7 +1020,7 @@
+ {
+ signed char *cp;
+ unsigned char *ncp;
+- int len, new_len, size, size2, val = 0;
++ int len, size, size2, val = 0;
+ PyObject *rv;
+ int i, j;
+
+@@ -1035,13 +1034,12 @@
+ return 0;
+ }
+
+- new_len = (len/size)*size2;
+- if (new_len < 0) {
++ if (len/size > INT_MAX/size2) {
+ PyErr_SetString(PyExc_MemoryError,
+ "not enough memory for output buffer");
+ return 0;
+ }
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
++ rv = PyBytes_FromStringAndSize(NULL, (len/size)*size2);
+ if ( rv == 0 )
+ return 0;
+ ncp = (unsigned char *)PyBytes_AsString(rv);
+@@ -1077,7 +1075,6 @@
+ int chan, d, *prev_i, *cur_i, cur_o;
+ PyObject *state, *samps, *str, *rv = NULL;
+ int bytes_per_frame;
+- size_t alloc_size;
+
+ weightA = 1;
+ weightB = 0;
+@@ -1120,14 +1117,13 @@
+ inrate /= d;
+ outrate /= d;
+
+- alloc_size = sizeof(int) * (unsigned)nchannels;
+- if (alloc_size < (unsigned)nchannels) {
++ if ((size_t)nchannels > PY_SIZE_MAX/sizeof(int)) {
+ PyErr_SetString(PyExc_MemoryError,
+ "not enough memory for output buffer");
+ return 0;
+ }
+- prev_i = (int *) malloc(alloc_size);
+- cur_i = (int *) malloc(alloc_size);
++ prev_i = (int *) malloc(nchannels * sizeof(int));
++ cur_i = (int *) malloc(nchannels * sizeof(int));
+ if (prev_i == NULL || cur_i == NULL) {
+ (void) PyErr_NoMemory();
+ goto exit;
+@@ -1164,25 +1160,16 @@
+ ceiling(len*outrate/inrate) output frames, and each frame
+ requires bytes_per_frame bytes. Computing this
+ without spurious overflow is the challenge; we can
+- settle for a reasonable upper bound, though. */
+- int ceiling; /* the number of output frames */
+- int nbytes; /* the number of output bytes needed */
+- int q = len / inrate;
+- /* Now len = q * inrate + r exactly (with r = len % inrate),
+- and this is less than q * inrate + inrate = (q+1)*inrate.
+- So a reasonable upper bound on len*outrate/inrate is
+- ((q+1)*inrate)*outrate/inrate =
+- (q+1)*outrate.
+- */
+- ceiling = (q+1) * outrate;
+- nbytes = ceiling * bytes_per_frame;
+- /* See whether anything overflowed; if not, get the space. */
+- if (q+1 < 0 ||
+- ceiling / outrate != q+1 ||
+- nbytes / bytes_per_frame != ceiling)
++ settle for a reasonable upper bound, though, in this
++ case ceiling(len/inrate) * outrate. */
++
++ /* compute ceiling(len/inrate) without overflow */
++ int q = len > 0 ? 1 + (len - 1) / inrate : 0;
++ if (outrate > INT_MAX / q / bytes_per_frame)
+ str = NULL;
+ else
+- str = PyBytes_FromStringAndSize(NULL, nbytes);
++ str = PyBytes_FromStringAndSize(NULL,
++ q * outrate * bytes_per_frame);
+
+ if (str == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+@@ -1300,7 +1287,7 @@
+ unsigned char *cp;
+ unsigned char cval;
+ signed char *ncp;
+- int len, new_len, size, val;
++ int len, size, val;
+ PyObject *rv;
+ int i;
+
+@@ -1313,18 +1300,17 @@
+ return 0;
+ }
+
+- new_len = len*size;
+- if (new_len < 0) {
++ if (len > INT_MAX/size) {
+ PyErr_SetString(PyExc_MemoryError,
+ "not enough memory for output buffer");
+ return 0;
+ }
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
++ rv = PyBytes_FromStringAndSize(NULL, len*size);
+ if ( rv == 0 )
+ return 0;
+ ncp = (signed char *)PyBytes_AsString(rv);
+
+- for ( i=0; i < new_len; i += size ) {
++ for ( i=0; i < len*size; i += size ) {
+ cval = *cp++;
+ val = st_ulaw2linear16(cval);
+
+@@ -1374,7 +1360,7 @@
+ unsigned char *cp;
+ unsigned char cval;
+ signed char *ncp;
+- int len, new_len, size, val;
++ int len, size, val;
+ PyObject *rv;
+ int i;
+
+@@ -1387,18 +1373,17 @@
+ return 0;
+ }
+
+- new_len = len*size;
+- if (new_len < 0) {
++ if (len > INT_MAX/size) {
+ PyErr_SetString(PyExc_MemoryError,
+ "not enough memory for output buffer");
+ return 0;
+ }
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
++ rv = PyBytes_FromStringAndSize(NULL, len*size);
+ if ( rv == 0 )
+ return 0;
+ ncp = (signed char *)PyBytes_AsString(rv);
+
+- for ( i=0; i < new_len; i += size ) {
++ for ( i=0; i < len*size; i += size ) {
+ cval = *cp++;
+ val = st_alaw2linear16(cval);
+
+@@ -1523,7 +1508,7 @@
+ {
+ signed char *cp;
+ signed char *ncp;
+- int len, new_len, size, valpred, step, delta, index, sign, vpdiff;
++ int len, size, valpred, step, delta, index, sign, vpdiff;
+ PyObject *rv, *str, *state;
+ int i, inputbuffer = 0, bufferstep;
+
+@@ -1545,13 +1530,12 @@
+ } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
+ return 0;
+
+- new_len = len*size*2;
+- if (new_len < 0) {
++ if (len > (INT_MAX/2)/size) {
+ PyErr_SetString(PyExc_MemoryError,
+ "not enough memory for output buffer");
+ return 0;
+ }
+- str = PyBytes_FromStringAndSize(NULL, new_len);
++ str = PyBytes_FromStringAndSize(NULL, len*size*2);
+ if ( str == 0 )
+ return 0;
+ ncp = (signed char *)PyBytes_AsString(str);
+@@ -1559,7 +1543,7 @@
+ step = stepsizeTable[index];
+ bufferstep = 0;
+
+- for ( i=0; i < new_len; i += size ) {
++ for ( i=0; i < len*size*2; i += size ) {
+ /* Step 1 - get the delta value and compute next index */
+ if ( bufferstep ) {
+ delta = inputbuffer & 0xf;
diff --git a/python-3.1.2-CVE-2010-2089.patch b/python-3.1.2-CVE-2010-2089.patch
new file mode 100644
index 0000000..f0098c4
--- /dev/null
+++ b/python-3.1.2-CVE-2010-2089.patch
@@ -0,0 +1,313 @@
+diff -up Python-3.1.2/Modules/audioop.c.CVE-2010-2089 Python-3.1.2/Modules/audioop.c
+--- Python-3.1.2/Modules/audioop.c.CVE-2010-2089 2010-06-04 14:55:04.281964205 -0400
++++ Python-3.1.2/Modules/audioop.c 2010-06-04 15:04:32.896088959 -0400
+@@ -295,6 +295,29 @@ static int stepsizeTable[89] = {
+
+ static PyObject *AudioopError;
+
++static int
++audioop_check_size(int size)
++{
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ } else {
++ return 1;
++ }
++}
++
++static int
++audioop_check_parameters(int len, int size)
++{
++ if (!audioop_check_size(size))
++ return 0;
++ if ( len % size != 0 ) {
++ PyErr_SetString(AudioopError, "not a whole number of
frames");
++ return 0;
++ }
++ return 1;
++}
++
+ static PyObject *
+ audioop_getsample(PyObject *self, PyObject *args)
+ {
+@@ -304,10 +327,8 @@ audioop_getsample(PyObject *self, PyObje
+
+ if ( !PyArg_ParseTuple(args, "s#ii:getsample", &cp, &len,
&size, &i) )
+ return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+ if ( i < 0 || i >= len/size ) {
+ PyErr_SetString(AudioopError, "Index out of range");
+ return 0;
+@@ -328,10 +349,8 @@ audioop_max(PyObject *self, PyObject *ar
+
+ if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) )
+ return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+ for ( i=0; i<len; i+= size) {
+ if ( size == 1 ) val = (int)*CHARP(cp, i);
+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+@@ -352,10 +371,8 @@ audioop_minmax(PyObject *self, PyObject
+
+ if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
+ return NULL;
+- if (size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ if (!audioop_check_parameters(len, size))
+ return NULL;
+- }
+ for (i = 0; i < len; i += size) {
+ if (size == 1) val = (int) *CHARP(cp, i);
+ else if (size == 2) val = (int) *SHORTP(cp, i);
+@@ -376,10 +393,8 @@ audioop_avg(PyObject *self, PyObject *ar
+
+ if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) )
+ return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+ for ( i=0; i<len; i+= size) {
+ if ( size == 1 ) val = (int)*CHARP(cp, i);
+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+@@ -403,10 +418,8 @@ audioop_rms(PyObject *self, PyObject *ar
+
+ if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size) )
+ return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+ for ( i=0; i<len; i+= size) {
+ if ( size == 1 ) val = (int)*CHARP(cp, i);
+ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+@@ -614,10 +627,8 @@ audioop_avgpp(PyObject *self, PyObject *
+
+ if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len, &size) )
+ return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+ /* Compute first delta value ahead. Also automatically makes us
+ ** skip the first extreme value
+ */
+@@ -671,10 +682,8 @@ audioop_maxpp(PyObject *self, PyObject *
+
+ if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len, &size) )
+ return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+ /* Compute first delta value ahead. Also automatically makes us
+ ** skip the first extreme value
+ */
+@@ -722,10 +731,8 @@ audioop_cross(PyObject *self, PyObject *
+
+ if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len, &size) )
+ return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+ ncross = -1;
+ prevval = 17; /* Anything <> 0,1 */
+ for ( i=0; i<len; i+= size) {
+@@ -751,6 +758,9 @@ audioop_mul(PyObject *self, PyObject *ar
+ if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size,
&factor ) )
+ return 0;
+
++ if (!audioop_check_parameters(len, size))
++ return NULL;
++
+ if ( size == 1 ) maxval = (double) 0x7f;
+ else if ( size == 2 ) maxval = (double) 0x7fff;
+ else if ( size == 4 ) maxval = (double) 0x7fffffff;
+@@ -793,6 +803,14 @@ audioop_tomono(PyObject *self, PyObject
+ if ( !PyArg_ParseTuple(args, "s*idd:tomono",
+ &pcp, &size, &fac1, &fac2 ) )
+ return 0;
++
++ if (!audioop_check_parameters(len, size))
++ return NULL;
++ if ( ((len / size) & 1) != 0 ) {
++ PyErr_SetString(AudioopError, "not a whole number of frames");
++ return NULL;
++ }
++
+ cp = pcp.buf;
+ len = pcp.len;
+
+@@ -843,6 +861,9 @@ audioop_tostereo(PyObject *self, PyObjec
+ &cp, &len, &size, &fac1, &fac2 ) )
+ return 0;
+
++ if (!audioop_check_parameters(len, size))
++ return NULL;
++
+ if ( size == 1 ) maxval = (double) 0x7f;
+ else if ( size == 2 ) maxval = (double) 0x7fff;
+ else if ( size == 4 ) maxval = (double) 0x7fffffff;
+@@ -901,6 +922,9 @@ audioop_add(PyObject *self, PyObject *ar
+ &cp1, &len1, &cp2, &len2, &size ) )
+ return 0;
+
++ if (!audioop_check_parameters(len1, size))
++ return NULL;
++
+ if ( len1 != len2 ) {
+ PyErr_SetString(AudioopError, "Lengths should be the same");
+ return 0;
+@@ -955,10 +979,8 @@ audioop_bias(PyObject *self, PyObject *a
+ &cp, &len, &size , &bias) )
+ return 0;
+
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+
+ rv = PyBytes_FromStringAndSize(NULL, len);
+ if ( rv == 0 )
+@@ -991,10 +1013,8 @@ audioop_reverse(PyObject *self, PyObject
+ &cp, &len, &size) )
+ return 0;
+
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+
+ rv = PyBytes_FromStringAndSize(NULL, len);
+ if ( rv == 0 )
+@@ -1028,11 +1048,10 @@ audioop_lin2lin(PyObject *self, PyObject
+ &cp, &len, &size, &size2) )
+ return 0;
+
+- if ( (size != 1 && size != 2 && size != 4) ||
+- (size2 != 1 && size2 != 2 && size2 != 4)) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
++ if (!audioop_check_size(size2))
++ return NULL;
+
+ if (len/size > INT_MAX/size2) {
+ PyErr_SetString(PyExc_MemoryError,
+@@ -1082,10 +1101,8 @@ audioop_ratecv(PyObject *self, PyObject
+ &nchannels, &inrate, &outrate, &state,
+ &weightA, &weightB))
+ return NULL;
+- if (size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ if (!audioop_check_size(size))
+ return NULL;
+- }
+ if (nchannels < 1) {
+ PyErr_SetString(AudioopError, "# of channels should be >= 1");
+ return NULL;
+@@ -1261,10 +1278,8 @@ audioop_lin2ulaw(PyObject *self, PyObjec
+ &cp, &len, &size) )
+ return 0 ;
+
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+
+ rv = PyBytes_FromStringAndSize(NULL, len/size);
+ if ( rv == 0 )
+@@ -1295,10 +1310,8 @@ audioop_ulaw2lin(PyObject *self, PyObjec
+ &cp, &len, &size) )
+ return 0;
+
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_size(size))
++ return NULL;
+
+ if (len > INT_MAX/size) {
+ PyErr_SetString(PyExc_MemoryError,
+@@ -1334,10 +1347,8 @@ audioop_lin2alaw(PyObject *self, PyObjec
+ &cp, &len, &size) )
+ return 0;
+
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+
+ rv = PyBytes_FromStringAndSize(NULL, len/size);
+ if ( rv == 0 )
+@@ -1368,10 +1379,8 @@ audioop_alaw2lin(PyObject *self, PyObjec
+ &cp, &len, &size) )
+ return 0;
+
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_size(size))
++ return NULL;
+
+ if (len > INT_MAX/size) {
+ PyErr_SetString(PyExc_MemoryError,
+@@ -1409,10 +1418,8 @@ audioop_lin2adpcm(PyObject *self, PyObje
+ return 0;
+
+
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_parameters(len, size))
++ return NULL;
+
+ str = PyBytes_FromStringAndSize(NULL, len/(size*2));
+ if ( str == 0 )
+@@ -1516,10 +1523,8 @@ audioop_adpcm2lin(PyObject *self, PyObje
+ &cp, &len, &size, &state) )
+ return 0;
+
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
++ if (!audioop_check_size(size))
++ return NULL;
+
+ /* Decode state, should have (value, step) */
+ if ( state == Py_None ) {
diff --git a/python-3.1.2-reformat-audioop.c.patch
b/python-3.1.2-reformat-audioop.c.patch
new file mode 100644
index 0000000..8592650
--- /dev/null
+++ b/python-3.1.2-reformat-audioop.c.patch
@@ -0,0 +1,2727 @@
+--- python/branches/py3k/Modules/audioop.c 2009/05/16 01:46:11 72674
++++ python/branches/py3k/Modules/audioop.c 2010/05/09 15:52:27 81032
+@@ -53,13 +53,13 @@
+ static PyInt16
+ search(PyInt16 val, PyInt16 *table, int size)
+ {
+- int i;
++ int i;
+
+- for (i = 0; i < size; i++) {
+- if (val <= *table++)
+- return (i);
+- }
+- return (size);
++ for (i = 0; i < size; i++) {
++ if (val <= *table++)
++ return (i);
++ }
++ return (size);
+ }
+ #define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc])
+ #define st_alaw2linear16(uc) (_st_alaw2linear16[uc])
+@@ -83,7 +83,7 @@
+ -228, -212, -196, -180, -164, -148, -132,
+ -120, -112, -104, -96, -88, -80, -72,
+ -64, -56, -48, -40, -32, -24, -16,
+- -8, 0, 32124, 31100, 30076, 29052, 28028,
++ -8, 0, 32124, 31100, 30076, 29052, 28028,
+ 27004, 25980, 24956, 23932, 22908, 21884, 20860,
+ 19836, 18812, 17788, 16764, 15996, 15484, 14972,
+ 14460, 13948, 13436, 12924, 12412, 11900, 11388,
+@@ -100,8 +100,8 @@
+ 372, 356, 340, 324, 308, 292, 276,
+ 260, 244, 228, 212, 196, 180, 164,
+ 148, 132, 120, 112, 104, 96, 88,
+- 80, 72, 64, 56, 48, 40, 32,
+- 24, 16, 8, 0
++ 80, 72, 64, 56, 48, 40, 32,
++ 24, 16, 8, 0
+ };
+
+ /*
+@@ -137,39 +137,39 @@
+ * John Wiley & Sons, pps 98-111 and 472-476.
+ */
+ static unsigned char
+-st_14linear2ulaw(PyInt16 pcm_val) /* 2's complement (14-bit range) */
++st_14linear2ulaw(PyInt16 pcm_val) /* 2's complement (14-bit range) */
+ {
+- PyInt16 mask;
+- PyInt16 seg;
+- unsigned char uval;
+-
+- /* The original sox code does this in the calling function, not here */
+- pcm_val = pcm_val >> 2;
+-
+- /* u-law inverts all bits */
+- /* Get the sign and the magnitude of the value. */
+- if (pcm_val < 0) {
+- pcm_val = -pcm_val;
+- mask = 0x7F;
+- } else {
+- mask = 0xFF;
+- }
+- if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */
+- pcm_val += (BIAS >> 2);
+-
+- /* Convert the scaled magnitude to segment number. */
+- seg = search(pcm_val, seg_uend, 8);
+-
+- /*
+- * Combine the sign, segment, quantization bits;
+- * and complement the code word.
+- */
+- if (seg >= 8) /* out of range, return maximum value. */
+- return (unsigned char) (0x7F ^ mask);
+- else {
+- uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1))
& 0xF);
+- return (uval ^ mask);
+- }
++ PyInt16 mask;
++ PyInt16 seg;
++ unsigned char uval;
++
++ /* The original sox code does this in the calling function, not here */
++ pcm_val = pcm_val >> 2;
++
++ /* u-law inverts all bits */
++ /* Get the sign and the magnitude of the value. */
++ if (pcm_val < 0) {
++ pcm_val = -pcm_val;
++ mask = 0x7F;
++ } else {
++ mask = 0xFF;
++ }
++ if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */
++ pcm_val += (BIAS >> 2);
++
++ /* Convert the scaled magnitude to segment number. */
++ seg = search(pcm_val, seg_uend, 8);
++
++ /*
++ * Combine the sign, segment, quantization bits;
++ * and complement the code word.
++ */
++ if (seg >= 8) /* out of range, return maximum value. */
++ return (unsigned char) (0x7F ^ mask);
++ else {
++ uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) &
0xF);
++ return (uval ^ mask);
++ }
+
+ }
+
+@@ -234,59 +234,59 @@
+ * John Wiley & Sons, pps 98-111 and 472-476.
+ */
+ static unsigned char
+-st_linear2alaw(PyInt16 pcm_val) /* 2's complement (13-bit range) */
++st_linear2alaw(PyInt16 pcm_val) /* 2's complement (13-bit range) */
+ {
+- PyInt16 mask;
+- short seg;
+- unsigned char aval;
+-
+- /* The original sox code does this in the calling function, not here */
+- pcm_val = pcm_val >> 3;
+-
+- /* A-law using even bit inversion */
+- if (pcm_val >= 0) {
+- mask = 0xD5; /* sign (7th) bit = 1 */
+- } else {
+- mask = 0x55; /* sign bit = 0 */
+- pcm_val = -pcm_val - 1;
+- }
+-
+- /* Convert the scaled magnitude to segment number. */
+- seg = search(pcm_val, seg_aend, 8);
+-
+- /* Combine the sign, segment, and quantization bits. */
+-
+- if (seg >= 8) /* out of range, return maximum value. */
+- return (unsigned char) (0x7F ^ mask);
+- else {
+- aval = (unsigned char) seg << SEG_SHIFT;
+- if (seg < 2)
+- aval |= (pcm_val >> 1) & QUANT_MASK;
+- else
+- aval |= (pcm_val >> seg) & QUANT_MASK;
+- return (aval ^ mask);
+- }
++ PyInt16 mask;
++ short seg;
++ unsigned char aval;
++
++ /* The original sox code does this in the calling function, not here */
++ pcm_val = pcm_val >> 3;
++
++ /* A-law using even bit inversion */
++ if (pcm_val >= 0) {
++ mask = 0xD5; /* sign (7th) bit = 1 */
++ } else {
++ mask = 0x55; /* sign bit = 0 */
++ pcm_val = -pcm_val - 1;
++ }
++
++ /* Convert the scaled magnitude to segment number. */
++ seg = search(pcm_val, seg_aend, 8);
++
++ /* Combine the sign, segment, and quantization bits. */
++
++ if (seg >= 8) /* out of range, return maximum value. */
++ return (unsigned char) (0x7F ^ mask);
++ else {
++ aval = (unsigned char) seg << SEG_SHIFT;
++ if (seg < 2)
++ aval |= (pcm_val >> 1) & QUANT_MASK;
++ else
++ aval |= (pcm_val >> seg) & QUANT_MASK;
++ return (aval ^ mask);
++ }
+ }
+ /* End of code taken from sox */
+
+ /* Intel ADPCM step variation table */
+ static int indexTable[16] = {
+- -1, -1, -1, -1, 2, 4, 6, 8,
+- -1, -1, -1, -1, 2, 4, 6, 8,
++ -1, -1, -1, -1, 2, 4, 6, 8,
++ -1, -1, -1, -1, 2, 4, 6, 8,
+ };
+
+ static int stepsizeTable[89] = {
+- 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
+- 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
+- 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
+- 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
+- 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
+- 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
+- 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
+- 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
+- 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
++ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
++ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
++ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
++ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
++ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
++ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
++ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
++ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
++ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
+ };
+-
++
+ #define CHARP(cp, i) ((signed char *)(cp+i))
+ #define SHORTP(cp, i) ((short *)(cp+i))
+ #define LONGP(cp, i) ((Py_Int32 *)(cp+i))
+@@ -298,137 +298,137 @@
+ static PyObject *
+ audioop_getsample(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#ii:getsample", &cp, &len,
&size, &i) )
+- return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+- if ( i < 0 || i >= len/size ) {
+- PyErr_SetString(AudioopError, "Index out of range");
+- return 0;
+- }
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i*2);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i*4);
+- return PyLong_FromLong(val);
++ signed char *cp;
++ int len, size, val = 0;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#ii:getsample", &cp, &len,
&size, &i) )
++ return 0;
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++ if ( i < 0 || i >= len/size ) {
++ PyErr_SetString(AudioopError, "Index out of range");
++ return 0;
++ }
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i*2);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i*4);
++ return PyLong_FromLong(val);
+ }
+
+ static PyObject *
+ audioop_max(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0;
+- int i;
+- int max = 0;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size)
)
+- return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+- for ( i=0; i<len; i+= size) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+- if ( val < 0 ) val = (-val);
+- if ( val > max ) max = val;
+- }
+- return PyLong_FromLong(max);
++ signed char *cp;
++ int len, size, val = 0;
++ int i;
++ int max = 0;
++
++ if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) )
++ return 0;
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++ for ( i=0; i<len; i+= size) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++ if ( val < 0 ) val = (-val);
++ if ( val > max ) max = val;
++ }
++ return PyLong_FromLong(max);
+ }
+
+ static PyObject *
+ audioop_minmax(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0;
+- int i;
+- int min = 0x7fffffff, max = -0x7fffffff;
+-
+- if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len,
&size))
+- return NULL;
+- if (size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return NULL;
+- }
+- for (i = 0; i < len; i += size) {
+- if (size == 1) val = (int) *CHARP(cp, i);
+- else if (size == 2) val = (int) *SHORTP(cp, i);
+- else if (size == 4) val = (int) *LONGP(cp, i);
+- if (val > max) max = val;
+- if (val < min) min = val;
+- }
+- return Py_BuildValue("(ii)", min, max);
++ signed char *cp;
++ int len, size, val = 0;
++ int i;
++ int min = 0x7fffffff, max = -0x7fffffff;
++
++ if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
++ return NULL;
++ if (size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return NULL;
++ }
++ for (i = 0; i < len; i += size) {
++ if (size == 1) val = (int) *CHARP(cp, i);
++ else if (size == 2) val = (int) *SHORTP(cp, i);
++ else if (size == 4) val = (int) *LONGP(cp, i);
++ if (val > max) max = val;
++ if (val < min) min = val;
++ }
++ return Py_BuildValue("(ii)", min, max);
+ }
+
+ static PyObject *
+ audioop_avg(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0;
+- int i;
+- double avg = 0.0;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size)
)
+- return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+- for ( i=0; i<len; i+= size) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+- avg += val;
+- }
+- if ( len == 0 )
+- val = 0;
+- else
+- val = (int)(avg / (double)(len/size));
+- return PyLong_FromLong(val);
++ signed char *cp;
++ int len, size, val = 0;
++ int i;
++ double avg = 0.0;
++
++ if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) )
++ return 0;
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++ for ( i=0; i<len; i+= size) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++ avg += val;
++ }
++ if ( len == 0 )
++ val = 0;
++ else
++ val = (int)(avg / (double)(len/size));
++ return PyLong_FromLong(val);
+ }
+
+ static PyObject *
+ audioop_rms(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0;
+- int i;
+- double sum_squares = 0.0;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size)
)
+- return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+- for ( i=0; i<len; i+= size) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+- sum_squares += (double)val*(double)val;
+- }
+- if ( len == 0 )
+- val = 0;
+- else
+- val = (int)sqrt(sum_squares / (double)(len/size));
+- return PyLong_FromLong(val);
++ signed char *cp;
++ int len, size, val = 0;
++ int i;
++ double sum_squares = 0.0;
++
++ if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size) )
++ return 0;
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++ for ( i=0; i<len; i+= size) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++ sum_squares += (double)val*(double)val;
++ }
++ if ( len == 0 )
++ val = 0;
++ else
++ val = (int)sqrt(sum_squares / (double)(len/size));
++ return PyLong_FromLong(val);
+ }
+
+ static double _sum2(short *a, short *b, int len)
+ {
+- int i;
+- double sum = 0.0;
++ int i;
++ double sum = 0.0;
+
+- for( i=0; i<len; i++) {
+- sum = sum + (double)a[i]*(double)b[i];
+- }
+- return sum;
++ for( i=0; i<len; i++) {
++ sum = sum + (double)a[i]*(double)b[i];
++ }
++ return sum;
+ }
+
+ /*
+@@ -466,60 +466,60 @@
+ static PyObject *
+ audioop_findfit(PyObject *self, PyObject *args)
+ {
+- short *cp1, *cp2;
+- int len1, len2;
+- int j, best_j;
+- double aj_m1, aj_lm1;
+- double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor;
+-
+- /* Passing a short** for an 's' argument is correct only
+- if the string contents is aligned for interpretation
+- as short[]. Due to the definition of PyBytesObject,
+- this is currently (Python 2.6) the case. */
+- if ( !PyArg_ParseTuple(args, "s#s#:findfit",
+- (char**)&cp1, &len1, (char**)&cp2, &len2) )
+- return 0;
+- if ( len1 & 1 || len2 & 1 ) {
+- PyErr_SetString(AudioopError, "Strings should be
even-sized");
+- return 0;
+- }
+- len1 >>= 1;
+- len2 >>= 1;
+-
+- if ( len1 < len2 ) {
+- PyErr_SetString(AudioopError, "First sample should be
longer");
+- return 0;
+- }
+- sum_ri_2 = _sum2(cp2, cp2, len2);
+- sum_aij_2 = _sum2(cp1, cp1, len2);
+- sum_aij_ri = _sum2(cp1, cp2, len2);
+-
+- result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2;
+-
+- best_result = result;
+- best_j = 0;
+- j = 0;
+-
+- for ( j=1; j<=len1-len2; j++) {
+- aj_m1 = (double)cp1[j-1];
+- aj_lm1 = (double)cp1[j+len2-1];
+-
+- sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1;
+- sum_aij_ri = _sum2(cp1+j, cp2, len2);
+-
+- result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri)
+- / sum_aij_2;
+-
+- if ( result < best_result ) {
+- best_result = result;
+- best_j = j;
+- }
+-
++ short *cp1, *cp2;
++ int len1, len2;
++ int j, best_j;
++ double aj_m1, aj_lm1;
++ double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor;
++
++ /* Passing a short** for an 's' argument is correct only
++ if the string contents is aligned for interpretation
++ as short[]. Due to the definition of PyBytesObject,
++ this is currently (Python 2.6) the case. */
++ if ( !PyArg_ParseTuple(args, "s#s#:findfit",
++ (char**)&cp1, &len1, (char**)&cp2, &len2) )
++ return 0;
++ if ( len1 & 1 || len2 & 1 ) {
++ PyErr_SetString(AudioopError, "Strings should be even-sized");
++ return 0;
++ }
++ len1 >>= 1;
++ len2 >>= 1;
++
++ if ( len1 < len2 ) {
++ PyErr_SetString(AudioopError, "First sample should be longer");
++ return 0;
++ }
++ sum_ri_2 = _sum2(cp2, cp2, len2);
++ sum_aij_2 = _sum2(cp1, cp1, len2);
++ sum_aij_ri = _sum2(cp1, cp2, len2);
++
++ result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2;
++
++ best_result = result;
++ best_j = 0;
++ j = 0;
++
++ for ( j=1; j<=len1-len2; j++) {
++ aj_m1 = (double)cp1[j-1];
++ aj_lm1 = (double)cp1[j+len2-1];
++
++ sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1;
++ sum_aij_ri = _sum2(cp1+j, cp2, len2);
++
++ result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri)
++ / sum_aij_2;
++
++ if ( result < best_result ) {
++ best_result = result;
++ best_j = j;
+ }
+
+- factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2;
+-
+- return Py_BuildValue("(if)", best_j, factor);
++ }
++
++ factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2;
++
++ return Py_BuildValue("(if)", best_j, factor);
+ }
+
+ /*
+@@ -529,28 +529,28 @@
+ static PyObject *
+ audioop_findfactor(PyObject *self, PyObject *args)
+ {
+- short *cp1, *cp2;
+- int len1, len2;
+- double sum_ri_2, sum_aij_ri, result;
+-
+- if ( !PyArg_ParseTuple(args, "s#s#:findfactor",
+- (char**)&cp1, &len1, (char**)&cp2, &len2) )
+- return 0;
+- if ( len1 & 1 || len2 & 1 ) {
+- PyErr_SetString(AudioopError, "Strings should be
even-sized");
+- return 0;
+- }
+- if ( len1 != len2 ) {
+- PyErr_SetString(AudioopError, "Samples should be same size");
+- return 0;
+- }
+- len2 >>= 1;
+- sum_ri_2 = _sum2(cp2, cp2, len2);
+- sum_aij_ri = _sum2(cp1, cp2, len2);
++ short *cp1, *cp2;
++ int len1, len2;
++ double sum_ri_2, sum_aij_ri, result;
++
++ if ( !PyArg_ParseTuple(args, "s#s#:findfactor",
++ (char**)&cp1, &len1, (char**)&cp2, &len2) )
++ return 0;
++ if ( len1 & 1 || len2 & 1 ) {
++ PyErr_SetString(AudioopError, "Strings should be even-sized");
++ return 0;
++ }
++ if ( len1 != len2 ) {
++ PyErr_SetString(AudioopError, "Samples should be same size");
++ return 0;
++ }
++ len2 >>= 1;
++ sum_ri_2 = _sum2(cp2, cp2, len2);
++ sum_aij_ri = _sum2(cp1, cp2, len2);
+
+- result = sum_aij_ri / sum_ri_2;
++ result = sum_aij_ri / sum_ri_2;
+
+- return PyFloat_FromDouble(result);
++ return PyFloat_FromDouble(result);
+ }
+
+ /*
+@@ -560,1114 +560,1114 @@
+ static PyObject *
+ audioop_findmax(PyObject *self, PyObject *args)
+ {
+- short *cp1;
+- int len1, len2;
+- int j, best_j;
+- double aj_m1, aj_lm1;
+- double result, best_result;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:findmax",
+- (char**)&cp1, &len1, &len2) )
+- return 0;
+- if ( len1 & 1 ) {
+- PyErr_SetString(AudioopError, "Strings should be
even-sized");
+- return 0;
++ short *cp1;
++ int len1, len2;
++ int j, best_j;
++ double aj_m1, aj_lm1;
++ double result, best_result;
++
++ if ( !PyArg_ParseTuple(args, "s#i:findmax",
++ (char**)&cp1, &len1, &len2) )
++ return 0;
++ if ( len1 & 1 ) {
++ PyErr_SetString(AudioopError, "Strings should be even-sized");
++ return 0;
++ }
++ len1 >>= 1;
++
++ if ( len2 < 0 || len1 < len2 ) {
++ PyErr_SetString(AudioopError, "Input sample should be longer");
++ return 0;
++ }
++
++ result = _sum2(cp1, cp1, len2);
++
++ best_result = result;
++ best_j = 0;
++ j = 0;
++
++ for ( j=1; j<=len1-len2; j++) {
++ aj_m1 = (double)cp1[j-1];
++ aj_lm1 = (double)cp1[j+len2-1];
++
++ result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1;
++
++ if ( result > best_result ) {
++ best_result = result;
++ best_j = j;
+ }
+- len1 >>= 1;
+-
+- if ( len2 < 0 || len1 < len2 ) {
+- PyErr_SetString(AudioopError, "Input sample should be
longer");
+- return 0;
+- }
+-
+- result = _sum2(cp1, cp1, len2);
+
+- best_result = result;
+- best_j = 0;
+- j = 0;
+-
+- for ( j=1; j<=len1-len2; j++) {
+- aj_m1 = (double)cp1[j-1];
+- aj_lm1 = (double)cp1[j+len2-1];
+-
+- result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1;
+-
+- if ( result > best_result ) {
+- best_result = result;
+- best_j = j;
+- }
+-
+- }
++ }
+
+- return PyLong_FromLong(best_j);
++ return PyLong_FromLong(best_j);
+ }
+
+ static PyObject *
+ audioop_avgpp(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0, prevval = 0, prevextremevalid = 0,
+- prevextreme = 0;
+- int i;
+- double avg = 0.0;
+- int diff, prevdiff, extremediff, nextreme = 0;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len,
&size) )
+- return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+- /* Compute first delta value ahead. Also automatically makes us
+- ** skip the first extreme value
+- */
+- if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
+- else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
+- else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
+- if ( size == 1 ) val = (int)*CHARP(cp, size);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, size);
+- else if ( size == 4 ) val = (int)*LONGP(cp, size);
+- prevdiff = val - prevval;
+-
+- for ( i=size; i<len; i+= size) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+- diff = val - prevval;
+- if ( diff*prevdiff < 0 ) {
+- /* Derivative changed sign. Compute difference to last
+- ** extreme value and remember.
+- */
+- if ( prevextremevalid ) {
+- extremediff = prevval - prevextreme;
+- if ( extremediff < 0 )
+- extremediff = -extremediff;
+- avg += extremediff;
+- nextreme++;
+- }
+- prevextremevalid = 1;
+- prevextreme = prevval;
+- }
+- prevval = val;
+- if ( diff != 0 )
+- prevdiff = diff;
+- }
+- if ( nextreme == 0 )
+- val = 0;
+- else
+- val = (int)(avg / (double)nextreme);
+- return PyLong_FromLong(val);
++ signed char *cp;
++ int len, size, val = 0, prevval = 0, prevextremevalid = 0,
++ prevextreme = 0;
++ int i;
++ double avg = 0.0;
++ int diff, prevdiff, extremediff, nextreme = 0;
++
++ if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len, &size) )
++ return 0;
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++ /* Compute first delta value ahead. Also automatically makes us
++ ** skip the first extreme value
++ */
++ if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
++ else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
++ else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
++ if ( size == 1 ) val = (int)*CHARP(cp, size);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, size);
++ else if ( size == 4 ) val = (int)*LONGP(cp, size);
++ prevdiff = val - prevval;
++
++ for ( i=size; i<len; i+= size) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++ diff = val - prevval;
++ if ( diff*prevdiff < 0 ) {
++ /* Derivative changed sign. Compute difference to last
++ ** extreme value and remember.
++ */
++ if ( prevextremevalid ) {
++ extremediff = prevval - prevextreme;
++ if ( extremediff < 0 )
++ extremediff = -extremediff;
++ avg += extremediff;
++ nextreme++;
++ }
++ prevextremevalid = 1;
++ prevextreme = prevval;
++ }
++ prevval = val;
++ if ( diff != 0 )
++ prevdiff = diff;
++ }
++ if ( nextreme == 0 )
++ val = 0;
++ else
++ val = (int)(avg / (double)nextreme);
++ return PyLong_FromLong(val);
+ }
+
+ static PyObject *
+ audioop_maxpp(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0, prevval = 0, prevextremevalid = 0,
+- prevextreme = 0;
+- int i;
+- int max = 0;
+- int diff, prevdiff, extremediff;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len,
&size) )
+- return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+- /* Compute first delta value ahead. Also automatically makes us
+- ** skip the first extreme value
+- */
+- if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
+- else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
+- else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
+- if ( size == 1 ) val = (int)*CHARP(cp, size);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, size);
+- else if ( size == 4 ) val = (int)*LONGP(cp, size);
+- prevdiff = val - prevval;
+-
+- for ( i=size; i<len; i+= size) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+- diff = val - prevval;
+- if ( diff*prevdiff < 0 ) {
+- /* Derivative changed sign. Compute difference to
+- ** last extreme value and remember.
+- */
+- if ( prevextremevalid ) {
+- extremediff = prevval - prevextreme;
+- if ( extremediff < 0 )
+- extremediff = -extremediff;
+- if ( extremediff > max )
+- max = extremediff;
+- }
+- prevextremevalid = 1;
+- prevextreme = prevval;
+- }
+- prevval = val;
+- if ( diff != 0 )
+- prevdiff = diff;
+- }
+- return PyLong_FromLong(max);
++ signed char *cp;
++ int len, size, val = 0, prevval = 0, prevextremevalid = 0,
++ prevextreme = 0;
++ int i;
++ int max = 0;
++ int diff, prevdiff, extremediff;
++
++ if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len, &size) )
++ return 0;
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++ /* Compute first delta value ahead. Also automatically makes us
++ ** skip the first extreme value
++ */
++ if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
++ else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
++ else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
++ if ( size == 1 ) val = (int)*CHARP(cp, size);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, size);
++ else if ( size == 4 ) val = (int)*LONGP(cp, size);
++ prevdiff = val - prevval;
++
++ for ( i=size; i<len; i+= size) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++ diff = val - prevval;
++ if ( diff*prevdiff < 0 ) {
++ /* Derivative changed sign. Compute difference to
++ ** last extreme value and remember.
++ */
++ if ( prevextremevalid ) {
++ extremediff = prevval - prevextreme;
++ if ( extremediff < 0 )
++ extremediff = -extremediff;
++ if ( extremediff > max )
++ max = extremediff;
++ }
++ prevextremevalid = 1;
++ prevextreme = prevval;
++ }
++ prevval = val;
++ if ( diff != 0 )
++ prevdiff = diff;
++ }
++ return PyLong_FromLong(max);
+ }
+
+ static PyObject *
+ audioop_cross(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- int len, size, val = 0;
+- int i;
+- int prevval, ncross;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len,
&size) )
+- return 0;
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+- ncross = -1;
+- prevval = 17; /* Anything <> 0,1 */
+- for ( i=0; i<len; i+= size) {
+- if ( size == 1 ) val = ((int)*CHARP(cp, i)) >> 7;
+- else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15;
+- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31;
+- val = val & 1;
+- if ( val != prevval ) ncross++;
+- prevval = val;
+- }
+- return PyLong_FromLong(ncross);
++ signed char *cp;
++ int len, size, val = 0;
++ int i;
++ int prevval, ncross;
++
++ if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len, &size) )
++ return 0;
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++ ncross = -1;
++ prevval = 17; /* Anything <> 0,1 */
++ for ( i=0; i<len; i+= size) {
++ if ( size == 1 ) val = ((int)*CHARP(cp, i)) >> 7;
++ else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15;
++ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31;
++ val = val & 1;
++ if ( val != prevval ) ncross++;
++ prevval = val;
++ }
++ return PyLong_FromLong(ncross);
+ }
+
+ static PyObject *
+ audioop_mul(PyObject *self, PyObject *args)
+ {
+- signed char *cp, *ncp;
+- int len, size, val = 0;
+- double factor, fval, maxval;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size,
&factor ) )
+- return 0;
+-
+- if ( size == 1 ) maxval = (double) 0x7f;
+- else if ( size == 2 ) maxval = (double) 0x7fff;
+- else if ( size == 4 ) maxval = (double) 0x7fffffff;
+- else {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- rv = PyBytes_FromStringAndSize(NULL, len);
+- if ( rv == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(rv);
+-
+-
+- for ( i=0; i < len; i += size ) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+- fval = (double)val*factor;
+- if ( fval > maxval ) fval = maxval;
+- else if ( fval < -maxval ) fval = -maxval;
+- val = (int)fval;
+- if ( size == 1 ) *CHARP(ncp, i) = (signed char)val;
+- else if ( size == 2 ) *SHORTP(ncp, i) = (short)val;
+- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val;
+- }
+- return rv;
++ signed char *cp, *ncp;
++ int len, size, val = 0;
++ double factor, fval, maxval;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size,
&factor ) )
++ return 0;
++
++ if ( size == 1 ) maxval = (double) 0x7f;
++ else if ( size == 2 ) maxval = (double) 0x7fff;
++ else if ( size == 4 ) maxval = (double) 0x7fffffff;
++ else {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, len);
++ if ( rv == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(rv);
++
++
++ for ( i=0; i < len; i += size ) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++ fval = (double)val*factor;
++ if ( fval > maxval ) fval = maxval;
++ else if ( fval < -maxval ) fval = -maxval;
++ val = (int)fval;
++ if ( size == 1 ) *CHARP(ncp, i) = (signed char)val;
++ else if ( size == 2 ) *SHORTP(ncp, i) = (short)val;
++ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val;
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_tomono(PyObject *self, PyObject *args)
+ {
+- Py_buffer pcp;
+- signed char *cp, *ncp;
+- int len, size, val1 = 0, val2 = 0;
+- double fac1, fac2, fval, maxval;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s*idd:tomono",
+- &pcp, &size, &fac1, &fac2 ) )
+- return 0;
+- cp = pcp.buf;
+- len = pcp.len;
+-
+- if ( size == 1 ) maxval = (double) 0x7f;
+- else if ( size == 2 ) maxval = (double) 0x7fff;
+- else if ( size == 4 ) maxval = (double) 0x7fffffff;
+- else {
+- PyBuffer_Release(&pcp);
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- rv = PyBytes_FromStringAndSize(NULL, len/2);
+- if ( rv == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(rv);
+-
+-
+- for ( i=0; i < len; i += size*2 ) {
+- if ( size == 1 ) val1 = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val1 = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val1 = (int)*LONGP(cp, i);
+- if ( size == 1 ) val2 = (int)*CHARP(cp, i+1);
+- else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2);
+- else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4);
+- fval = (double)val1*fac1 + (double)val2*fac2;
+- if ( fval > maxval ) fval = maxval;
+- else if ( fval < -maxval ) fval = -maxval;
+- val1 = (int)fval;
+- if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1;
+- else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1;
+- else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1;
+- }
+- PyBuffer_Release(&pcp);
+- return rv;
++ Py_buffer pcp;
++ signed char *cp, *ncp;
++ int len, size, val1 = 0, val2 = 0;
++ double fac1, fac2, fval, maxval;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s*idd:tomono",
++ &pcp, &size, &fac1, &fac2 ) )
++ return 0;
++ cp = pcp.buf;
++ len = pcp.len;
++
++ if ( size == 1 ) maxval = (double) 0x7f;
++ else if ( size == 2 ) maxval = (double) 0x7fff;
++ else if ( size == 4 ) maxval = (double) 0x7fffffff;
++ else {
++ PyBuffer_Release(&pcp);
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, len/2);
++ if ( rv == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(rv);
++
++
++ for ( i=0; i < len; i += size*2 ) {
++ if ( size == 1 ) val1 = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val1 = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val1 = (int)*LONGP(cp, i);
++ if ( size == 1 ) val2 = (int)*CHARP(cp, i+1);
++ else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2);
++ else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4);
++ fval = (double)val1*fac1 + (double)val2*fac2;
++ if ( fval > maxval ) fval = maxval;
++ else if ( fval < -maxval ) fval = -maxval;
++ val1 = (int)fval;
++ if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1;
++ else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1;
++ else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1;
++ }
++ PyBuffer_Release(&pcp);
++ return rv;
+ }
+
+ static PyObject *
+ audioop_tostereo(PyObject *self, PyObject *args)
+ {
+- signed char *cp, *ncp;
+- int len, new_len, size, val1, val2, val = 0;
+- double fac1, fac2, fval, maxval;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#idd:tostereo",
+- &cp, &len, &size, &fac1, &fac2 ) )
+- return 0;
+-
+- if ( size == 1 ) maxval = (double) 0x7f;
+- else if ( size == 2 ) maxval = (double) 0x7fff;
+- else if ( size == 4 ) maxval = (double) 0x7fffffff;
+- else {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- new_len = len*2;
+- if (new_len < 0) {
+- PyErr_SetString(PyExc_MemoryError,
+- "not enough memory for output buffer");
+- return 0;
+- }
++ signed char *cp, *ncp;
++ int len, new_len, size, val1, val2, val = 0;
++ double fac1, fac2, fval, maxval;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#idd:tostereo",
++ &cp, &len, &size, &fac1, &fac2 ) )
++ return 0;
++
++ if ( size == 1 ) maxval = (double) 0x7f;
++ else if ( size == 2 ) maxval = (double) 0x7fff;
++ else if ( size == 4 ) maxval = (double) 0x7fffffff;
++ else {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ new_len = len*2;
++ if (new_len < 0) {
++ PyErr_SetString(PyExc_MemoryError,
++ "not enough memory for output buffer");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, new_len);
++ if ( rv == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(rv);
+
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
+- if ( rv == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(rv);
+-
+-
+- for ( i=0; i < len; i += size ) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+-
+- fval = (double)val*fac1;
+- if ( fval > maxval ) fval = maxval;
+- else if ( fval < -maxval ) fval = -maxval;
+- val1 = (int)fval;
+-
+- fval = (double)val*fac2;
+- if ( fval > maxval ) fval = maxval;
+- else if ( fval < -maxval ) fval = -maxval;
+- val2 = (int)fval;
+-
+- if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1;
+- else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
+- else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1;
+-
+- if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2;
+- else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2;
+- else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2;
+- }
+- return rv;
++
++ for ( i=0; i < len; i += size ) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++
++ fval = (double)val*fac1;
++ if ( fval > maxval ) fval = maxval;
++ else if ( fval < -maxval ) fval = -maxval;
++ val1 = (int)fval;
++
++ fval = (double)val*fac2;
++ if ( fval > maxval ) fval = maxval;
++ else if ( fval < -maxval ) fval = -maxval;
++ val2 = (int)fval;
++
++ if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1;
++ else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
++ else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1;
++
++ if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2;
++ else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2;
++ else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2;
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_add(PyObject *self, PyObject *args)
+ {
+- signed char *cp1, *cp2, *ncp;
+- int len1, len2, size, val1 = 0, val2 = 0, maxval, newval;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#s#i:add",
+- &cp1, &len1, &cp2, &len2, &size ) )
+- return 0;
+-
+- if ( len1 != len2 ) {
+- PyErr_SetString(AudioopError, "Lengths should be the same");
+- return 0;
+- }
+-
+- if ( size == 1 ) maxval = 0x7f;
+- else if ( size == 2 ) maxval = 0x7fff;
+- else if ( size == 4 ) maxval = 0x7fffffff;
+- else {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- rv = PyBytes_FromStringAndSize(NULL, len1);
+- if ( rv == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(rv);
+-
+- for ( i=0; i < len1; i += size ) {
+- if ( size == 1 ) val1 = (int)*CHARP(cp1, i);
+- else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i);
+- else if ( size == 4 ) val1 = (int)*LONGP(cp1, i);
+-
+- if ( size == 1 ) val2 = (int)*CHARP(cp2, i);
+- else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i);
+- else if ( size == 4 ) val2 = (int)*LONGP(cp2, i);
+-
+- newval = val1 + val2;
+- /* truncate in case of overflow */
+- if (newval > maxval) newval = maxval;
+- else if (newval < -maxval) newval = -maxval;
+- else if (size == 4 && (newval^val1) < 0 &&
(newval^val2) < 0)
+- newval = val1 > 0 ? maxval : - maxval;
+-
+- if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval;
+- else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval;
+- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval;
+- }
+- return rv;
++ signed char *cp1, *cp2, *ncp;
++ int len1, len2, size, val1 = 0, val2 = 0, maxval, newval;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#s#i:add",
++ &cp1, &len1, &cp2, &len2, &size ) )
++ return 0;
++
++ if ( len1 != len2 ) {
++ PyErr_SetString(AudioopError, "Lengths should be the same");
++ return 0;
++ }
++
++ if ( size == 1 ) maxval = 0x7f;
++ else if ( size == 2 ) maxval = 0x7fff;
++ else if ( size == 4 ) maxval = 0x7fffffff;
++ else {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, len1);
++ if ( rv == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(rv);
++
++ for ( i=0; i < len1; i += size ) {
++ if ( size == 1 ) val1 = (int)*CHARP(cp1, i);
++ else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i);
++ else if ( size == 4 ) val1 = (int)*LONGP(cp1, i);
++
++ if ( size == 1 ) val2 = (int)*CHARP(cp2, i);
++ else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i);
++ else if ( size == 4 ) val2 = (int)*LONGP(cp2, i);
++
++ newval = val1 + val2;
++ /* truncate in case of overflow */
++ if (newval > maxval) newval = maxval;
++ else if (newval < -maxval) newval = -maxval;
++ else if (size == 4 && (newval^val1) < 0 && (newval^val2) <
0)
++ newval = val1 > 0 ? maxval : - maxval;
++
++ if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval;
++ else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval;
++ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval;
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_bias(PyObject *self, PyObject *args)
+ {
+- signed char *cp, *ncp;
+- int len, size, val = 0;
+- PyObject *rv;
+- int i;
+- int bias;
+-
+- if ( !PyArg_ParseTuple(args, "s#ii:bias",
+- &cp, &len, &size , &bias) )
+- return 0;
+-
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- rv = PyBytes_FromStringAndSize(NULL, len);
+- if ( rv == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(rv);
+-
+-
+- for ( i=0; i < len; i += size ) {
+- if ( size == 1 ) val = (int)*CHARP(cp, i);
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = (int)*LONGP(cp, i);
+-
+- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val+bias);
+- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias);
+- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias);
+- }
+- return rv;
++ signed char *cp, *ncp;
++ int len, size, val = 0;
++ PyObject *rv;
++ int i;
++ int bias;
++
++ if ( !PyArg_ParseTuple(args, "s#ii:bias",
++ &cp, &len, &size , &bias) )
++ return 0;
++
++ if ( size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, len);
++ if ( rv == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(rv);
++
++
++ for ( i=0; i < len; i += size ) {
++ if ( size == 1 ) val = (int)*CHARP(cp, i);
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = (int)*LONGP(cp, i);
++
++ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val+bias);
++ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias);
++ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias);
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_reverse(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- unsigned char *ncp;
+- int len, size, val = 0;
+- PyObject *rv;
+- int i, j;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:reverse",
+- &cp, &len, &size) )
+- return 0;
+-
+- if ( size != 1 && size != 2 && size != 4 ) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- rv = PyBytes_FromStringAndSize(NULL, len);
+- if ( rv == 0 )
+- return 0;
+- ncp = (unsigned char *)PyBytes_AsString(rv);
+-
+- for ( i=0; i < len; i += size ) {
+- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
+-
+- j = len - i - size;
+-
+- if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
+- else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val);
+- else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
+- }
+- return rv;
++ signed char *cp;
++ unsigned char *ncp;
++ int len, size, val = 0;
++ PyObject *rv;
++ int i, j;
++
++ if ( !PyArg_ParseTuple(args, "s#i:reverse",
++ &cp, &len, &size) )
++ return 0;
++
++ if ( size != 1 && size != 2 && size != 4 ) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, len);
++ if ( rv == 0 )
++ return 0;
++ ncp = (unsigned char *)PyBytes_AsString(rv);
++
++ for ( i=0; i < len; i += size ) {
++ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
++
++ j = len - i - size;
++
++ if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
++ else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val);
++ else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_lin2lin(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- unsigned char *ncp;
+- int len, new_len, size, size2, val = 0;
+- PyObject *rv;
+- int i, j;
+-
+- if ( !PyArg_ParseTuple(args, "s#ii:lin2lin",
+- &cp, &len, &size, &size2) )
+- return 0;
+-
+- if ( (size != 1 && size != 2 && size != 4) ||
+- (size2 != 1 && size2 != 2 && size2 != 4)) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- new_len = (len/size)*size2;
+- if (new_len < 0) {
+- PyErr_SetString(PyExc_MemoryError,
+- "not enough memory for output buffer");
+- return 0;
+- }
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
+- if ( rv == 0 )
+- return 0;
+- ncp = (unsigned char *)PyBytes_AsString(rv);
+-
+- for ( i=0, j=0; i < len; i += size, j += size2 ) {
+- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
+-
+- if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
+- else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val);
+- else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
+- }
+- return rv;
++ signed char *cp;
++ unsigned char *ncp;
++ int len, new_len, size, size2, val = 0;
++ PyObject *rv;
++ int i, j;
++
++ if ( !PyArg_ParseTuple(args, "s#ii:lin2lin",
++ &cp, &len, &size, &size2) )
++ return 0;
++
++ if ( (size != 1 && size != 2 && size != 4) ||
++ (size2 != 1 && size2 != 2 && size2 != 4)) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ new_len = (len/size)*size2;
++ if (new_len < 0) {
++ PyErr_SetString(PyExc_MemoryError,
++ "not enough memory for output buffer");
++ return 0;
++ }
++ rv = PyBytes_FromStringAndSize(NULL, new_len);
++ if ( rv == 0 )
++ return 0;
++ ncp = (unsigned char *)PyBytes_AsString(rv);
++
++ for ( i=0, j=0; i < len; i += size, j += size2 ) {
++ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
++
++ if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
++ else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val);
++ else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
++ }
++ return rv;
+ }
+
+ static int
+ gcd(int a, int b)
+ {
+- while (b > 0) {
+- int tmp = a % b;
+- a = b;
+- b = tmp;
+- }
+- return a;
++ while (b > 0) {
++ int tmp = a % b;
++ a = b;
++ b = tmp;
++ }
++ return a;
+ }
+
+ static PyObject *
+ audioop_ratecv(PyObject *self, PyObject *args)
+ {
+- char *cp, *ncp;
+- int len, size, nchannels, inrate, outrate, weightA, weightB;
+- int chan, d, *prev_i, *cur_i, cur_o;
+- PyObject *state, *samps, *str, *rv = NULL;
+- int bytes_per_frame;
+- size_t alloc_size;
+-
+- weightA = 1;
+- weightB = 0;
+- if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len,
&size,
+- &nchannels, &inrate, &outrate, &state,
+- &weightA, &weightB))
+- return NULL;
+- if (size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return NULL;
+- }
+- if (nchannels < 1) {
+- PyErr_SetString(AudioopError, "# of channels should be >=
1");
+- return NULL;
+- }
+- bytes_per_frame = size * nchannels;
+- if (bytes_per_frame / nchannels != size) {
+- /* This overflow test is rigorously correct because
+- both multiplicands are >= 1. Use the argument names
+- from the docs for the error msg. */
+- PyErr_SetString(PyExc_OverflowError,
+- "width * nchannels too big for a C int");
+- return NULL;
+- }
+- if (weightA < 1 || weightB < 0) {
+- PyErr_SetString(AudioopError,
+- "weightA should be >= 1, weightB should be >=
0");
+- return NULL;
+- }
+- if (len % bytes_per_frame != 0) {
+- PyErr_SetString(AudioopError, "not a whole number of
frames");
+- return NULL;
+- }
+- if (inrate <= 0 || outrate <= 0) {
+- PyErr_SetString(AudioopError, "sampling rate not > 0");
+- return NULL;
+- }
+- /* divide inrate and outrate by their greatest common divisor */
+- d = gcd(inrate, outrate);
+- inrate /= d;
+- outrate /= d;
+-
+- alloc_size = sizeof(int) * (unsigned)nchannels;
+- if (alloc_size < (unsigned)nchannels) {
+- PyErr_SetString(PyExc_MemoryError,
+- "not enough memory for output buffer");
+- return 0;
+- }
+- prev_i = (int *) malloc(alloc_size);
+- cur_i = (int *) malloc(alloc_size);
+- if (prev_i == NULL || cur_i == NULL) {
+- (void) PyErr_NoMemory();
++ char *cp, *ncp;
++ int len, size, nchannels, inrate, outrate, weightA, weightB;
++ int chan, d, *prev_i, *cur_i, cur_o;
++ PyObject *state, *samps, *str, *rv = NULL;
++ int bytes_per_frame;
++ size_t alloc_size;
++
++ weightA = 1;
++ weightB = 0;
++ if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len,
&size,
++ &nchannels, &inrate, &outrate, &state,
++ &weightA, &weightB))
++ return NULL;
++ if (size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return NULL;
++ }
++ if (nchannels < 1) {
++ PyErr_SetString(AudioopError, "# of channels should be >= 1");
++ return NULL;
++ }
++ bytes_per_frame = size * nchannels;
++ if (bytes_per_frame / nchannels != size) {
++ /* This overflow test is rigorously correct because
++ both multiplicands are >= 1. Use the argument names
++ from the docs for the error msg. */
++ PyErr_SetString(PyExc_OverflowError,
++ "width * nchannels too big for a C int");
++ return NULL;
++ }
++ if (weightA < 1 || weightB < 0) {
++ PyErr_SetString(AudioopError,
++ "weightA should be >= 1, weightB should be >= 0");
++ return NULL;
++ }
++ if (len % bytes_per_frame != 0) {
++ PyErr_SetString(AudioopError, "not a whole number of frames");
++ return NULL;
++ }
++ if (inrate <= 0 || outrate <= 0) {
++ PyErr_SetString(AudioopError, "sampling rate not > 0");
++ return NULL;
++ }
++ /* divide inrate and outrate by their greatest common divisor */
++ d = gcd(inrate, outrate);
++ inrate /= d;
++ outrate /= d;
++
++ alloc_size = sizeof(int) * (unsigned)nchannels;
++ if (alloc_size < (unsigned)nchannels) {
++ PyErr_SetString(PyExc_MemoryError,
++ "not enough memory for output buffer");
++ return 0;
++ }
++ prev_i = (int *) malloc(alloc_size);
++ cur_i = (int *) malloc(alloc_size);
++ if (prev_i == NULL || cur_i == NULL) {
++ (void) PyErr_NoMemory();
++ goto exit;
++ }
++
++ len /= bytes_per_frame; /* # of frames */
++
++ if (state == Py_None) {
++ d = -outrate;
++ for (chan = 0; chan < nchannels; chan++)
++ prev_i[chan] = cur_i[chan] = 0;
++ }
++ else {
++ if (!PyArg_ParseTuple(state,
++ "iO!;audioop.ratecv: illegal state argument",
++ &d, &PyTuple_Type, &samps))
++ goto exit;
++ if (PyTuple_Size(samps) != nchannels) {
++ PyErr_SetString(AudioopError,
++ "illegal state argument");
++ goto exit;
++ }
++ for (chan = 0; chan < nchannels; chan++) {
++ if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan),
++ "ii:ratecv", &prev_i[chan],
++ &cur_i[chan]))
+ goto exit;
+ }
++ }
+
+- len /= bytes_per_frame; /* # of frames */
++ /* str <- Space for the output buffer. */
++ {
++ /* There are len input frames, so we need (mathematically)
++ ceiling(len*outrate/inrate) output frames, and each frame
++ requires bytes_per_frame bytes. Computing this
++ without spurious overflow is the challenge; we can
++ settle for a reasonable upper bound, though. */
++ int ceiling; /* the number of output frames */
++ int nbytes; /* the number of output bytes needed */
++ int q = len / inrate;
++ /* Now len = q * inrate + r exactly (with r = len % inrate),
++ and this is less than q * inrate + inrate = (q+1)*inrate.
++ So a reasonable upper bound on len*outrate/inrate is
++ ((q+1)*inrate)*outrate/inrate =
++ (q+1)*outrate.
++ */
++ ceiling = (q+1) * outrate;
++ nbytes = ceiling * bytes_per_frame;
++ /* See whether anything overflowed; if not, get the space. */
++ if (q+1 < 0 ||
++ ceiling / outrate != q+1 ||
++ nbytes / bytes_per_frame != ceiling)
++ str = NULL;
++ else
++ str = PyBytes_FromStringAndSize(NULL, nbytes);
+
+- if (state == Py_None) {
+- d = -outrate;
++ if (str == NULL) {
++ PyErr_SetString(PyExc_MemoryError,
++ "not enough memory for output buffer");
++ goto exit;
++ }
++ }
++ ncp = PyBytes_AsString(str);
++
++ for (;;) {
++ while (d < 0) {
++ if (len == 0) {
++ samps = PyTuple_New(nchannels);
++ if (samps == NULL)
++ goto exit;
+ for (chan = 0; chan < nchannels; chan++)
+- prev_i[chan] = cur_i[chan] = 0;
+- }
+- else {
+- if (!PyArg_ParseTuple(state,
+- "iO!;audioop.ratecv: illegal state argument",
+- &d, &PyTuple_Type, &samps))
+- goto exit;
+- if (PyTuple_Size(samps) != nchannels) {
+- PyErr_SetString(AudioopError,
+- "illegal state argument");
+- goto exit;
+- }
+- for (chan = 0; chan < nchannels; chan++) {
+- if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan),
+- "ii:ratecv", &prev_i[chan],
+- &cur_i[chan]))
+- goto exit;
+- }
+- }
+-
+- /* str <- Space for the output buffer. */
+- {
+- /* There are len input frames, so we need (mathematically)
+- ceiling(len*outrate/inrate) output frames, and each frame
+- requires bytes_per_frame bytes. Computing this
+- without spurious overflow is the challenge; we can
+- settle for a reasonable upper bound, though. */
+- int ceiling; /* the number of output frames */
+- int nbytes; /* the number of output bytes needed */
+- int q = len / inrate;
+- /* Now len = q * inrate + r exactly (with r = len % inrate),
+- and this is less than q * inrate + inrate = (q+1)*inrate.
+- So a reasonable upper bound on len*outrate/inrate is
+- ((q+1)*inrate)*outrate/inrate =
+- (q+1)*outrate.
+- */
+- ceiling = (q+1) * outrate;
+- nbytes = ceiling * bytes_per_frame;
+- /* See whether anything overflowed; if not, get the space. */
+- if (q+1 < 0 ||
+- ceiling / outrate != q+1 ||
+- nbytes / bytes_per_frame != ceiling)
+- str = NULL;
+- else
+- str = PyBytes_FromStringAndSize(NULL, nbytes);
+-
+- if (str == NULL) {
+- PyErr_SetString(PyExc_MemoryError,
+- "not enough memory for output buffer");
+- goto exit;
+- }
+- }
+- ncp = PyBytes_AsString(str);
+-
+- for (;;) {
+- while (d < 0) {
+- if (len == 0) {
+- samps = PyTuple_New(nchannels);
+- if (samps == NULL)
+- goto exit;
+- for (chan = 0; chan < nchannels; chan++)
+- PyTuple_SetItem(samps, chan,
+- Py_BuildValue("(ii)",
+- prev_i[chan],
+- cur_i[chan]));
+- if (PyErr_Occurred())
+- goto exit;
+- /* We have checked before that the length
+- * of the string fits into int. */
+- len = (int)(ncp - PyBytes_AsString(str));
+- rv = PyBytes_FromStringAndSize
+- (PyBytes_AsString(str), len);
+- Py_DECREF(str);
+- str = rv;
+- if (str == NULL)
+- goto exit;
+- rv = Py_BuildValue("(O(iO))", str, d, samps);
+- Py_DECREF(samps);
+- Py_DECREF(str);
+- goto exit; /* return rv */
+- }
+- for (chan = 0; chan < nchannels; chan++) {
+- prev_i[chan] = cur_i[chan];
+- if (size == 1)
+- cur_i[chan] = ((int)*CHARP(cp, 0)) << 8;
+- else if (size == 2)
+- cur_i[chan] = (int)*SHORTP(cp, 0);
+- else if (size == 4)
+- cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16;
+- cp += size;
+- /* implements a simple digital filter */
+- cur_i[chan] =
+- (weightA * cur_i[chan] +
+- weightB * prev_i[chan]) /
+- (weightA + weightB);
+- }
+- len--;
+- d += outrate;
+- }
+- while (d >= 0) {
+- for (chan = 0; chan < nchannels; chan++) {
+- cur_o = (prev_i[chan] * d +
+- cur_i[chan] * (outrate - d)) /
+- outrate;
+- if (size == 1)
+- *CHARP(ncp, 0) = (signed char)(cur_o >> 8);
+- else if (size == 2)
+- *SHORTP(ncp, 0) = (short)(cur_o);
+- else if (size == 4)
+- *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16);
+- ncp += size;
+- }
+- d -= inrate;
+- }
++ PyTuple_SetItem(samps, chan,
++ Py_BuildValue("(ii)",
++ prev_i[chan],
++ cur_i[chan]));
++ if (PyErr_Occurred())
++ goto exit;
++ /* We have checked before that the length
++ * of the string fits into int. */
++ len = (int)(ncp - PyBytes_AsString(str));
++ rv = PyBytes_FromStringAndSize
++ (PyBytes_AsString(str), len);
++ Py_DECREF(str);
++ str = rv;
++ if (str == NULL)
++ goto exit;
++ rv = Py_BuildValue("(O(iO))", str, d, samps);
++ Py_DECREF(samps);
++ Py_DECREF(str);
++ goto exit; /* return rv */
++ }
++ for (chan = 0; chan < nchannels; chan++) {
++ prev_i[chan] = cur_i[chan];
++ if (size == 1)
++ cur_i[chan] = ((int)*CHARP(cp, 0)) << 8;
++ else if (size == 2)
++ cur_i[chan] = (int)*SHORTP(cp, 0);
++ else if (size == 4)
++ cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16;
++ cp += size;
++ /* implements a simple digital filter */
++ cur_i[chan] =
++ (weightA * cur_i[chan] +
++ weightB * prev_i[chan]) /
++ (weightA + weightB);
++ }
++ len--;
++ d += outrate;
++ }
++ while (d >= 0) {
++ for (chan = 0; chan < nchannels; chan++) {
++ cur_o = (prev_i[chan] * d +
++ cur_i[chan] * (outrate - d)) /
++ outrate;
++ if (size == 1)
++ *CHARP(ncp, 0) = (signed char)(cur_o >> 8);
++ else if (size == 2)
++ *SHORTP(ncp, 0) = (short)(cur_o);
++ else if (size == 4)
++ *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16);
++ ncp += size;
++ }
++ d -= inrate;
+ }
++ }
+ exit:
+- if (prev_i != NULL)
+- free(prev_i);
+- if (cur_i != NULL)
+- free(cur_i);
+- return rv;
++ if (prev_i != NULL)
++ free(prev_i);
++ if (cur_i != NULL)
++ free(cur_i);
++ return rv;
+ }
+
+ static PyObject *
+ audioop_lin2ulaw(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- unsigned char *ncp;
+- int len, size, val = 0;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw",
+- &cp, &len, &size) )
+- return 0 ;
+-
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- rv = PyBytes_FromStringAndSize(NULL, len/size);
+- if ( rv == 0 )
+- return 0;
+- ncp = (unsigned char *)PyBytes_AsString(rv);
+-
+- for ( i=0; i < len; i += size ) {
+- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
+-
+- *ncp++ = st_14linear2ulaw(val);
+- }
+- return rv;
++ signed char *cp;
++ unsigned char *ncp;
++ int len, size, val = 0;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw",
++ &cp, &len, &size) )
++ return 0 ;
++
++ if ( size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, len/size);
++ if ( rv == 0 )
++ return 0;
++ ncp = (unsigned char *)PyBytes_AsString(rv);
++
++ for ( i=0; i < len; i += size ) {
++ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
++
++ *ncp++ = st_14linear2ulaw(val);
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_ulaw2lin(PyObject *self, PyObject *args)
+ {
+- unsigned char *cp;
+- unsigned char cval;
+- signed char *ncp;
+- int len, new_len, size, val;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin",
+- &cp, &len, &size) )
+- return 0;
+-
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- new_len = len*size;
+- if (new_len < 0) {
+- PyErr_SetString(PyExc_MemoryError,
+- "not enough memory for output buffer");
+- return 0;
+- }
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
+- if ( rv == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(rv);
+-
+- for ( i=0; i < new_len; i += size ) {
+- cval = *cp++;
+- val = st_ulaw2linear16(cval);
+-
+- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
+- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
+- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
+- }
+- return rv;
++ unsigned char *cp;
++ unsigned char cval;
++ signed char *ncp;
++ int len, new_len, size, val;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin",
++ &cp, &len, &size) )
++ return 0;
++
++ if ( size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ new_len = len*size;
++ if (new_len < 0) {
++ PyErr_SetString(PyExc_MemoryError,
++ "not enough memory for output buffer");
++ return 0;
++ }
++ rv = PyBytes_FromStringAndSize(NULL, new_len);
++ if ( rv == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(rv);
++
++ for ( i=0; i < new_len; i += size ) {
++ cval = *cp++;
++ val = st_ulaw2linear16(cval);
++
++ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
++ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
++ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_lin2alaw(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- unsigned char *ncp;
+- int len, size, val = 0;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:lin2alaw",
+- &cp, &len, &size) )
+- return 0;
+-
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- rv = PyBytes_FromStringAndSize(NULL, len/size);
+- if ( rv == 0 )
+- return 0;
+- ncp = (unsigned char *)PyBytes_AsString(rv);
+-
+- for ( i=0; i < len; i += size ) {
+- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
+-
+- *ncp++ = st_linear2alaw(val);
+- }
+- return rv;
++ signed char *cp;
++ unsigned char *ncp;
++ int len, size, val = 0;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#i:lin2alaw",
++ &cp, &len, &size) )
++ return 0;
++
++ if ( size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ rv = PyBytes_FromStringAndSize(NULL, len/size);
++ if ( rv == 0 )
++ return 0;
++ ncp = (unsigned char *)PyBytes_AsString(rv);
++
++ for ( i=0; i < len; i += size ) {
++ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
++
++ *ncp++ = st_linear2alaw(val);
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_alaw2lin(PyObject *self, PyObject *args)
+ {
+- unsigned char *cp;
+- unsigned char cval;
+- signed char *ncp;
+- int len, new_len, size, val;
+- PyObject *rv;
+- int i;
+-
+- if ( !PyArg_ParseTuple(args, "s#i:alaw2lin",
+- &cp, &len, &size) )
+- return 0;
+-
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- new_len = len*size;
+- if (new_len < 0) {
+- PyErr_SetString(PyExc_MemoryError,
+- "not enough memory for output buffer");
+- return 0;
+- }
+- rv = PyBytes_FromStringAndSize(NULL, new_len);
+- if ( rv == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(rv);
+-
+- for ( i=0; i < new_len; i += size ) {
+- cval = *cp++;
+- val = st_alaw2linear16(cval);
+-
+- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
+- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
+- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
+- }
+- return rv;
++ unsigned char *cp;
++ unsigned char cval;
++ signed char *ncp;
++ int len, new_len, size, val;
++ PyObject *rv;
++ int i;
++
++ if ( !PyArg_ParseTuple(args, "s#i:alaw2lin",
++ &cp, &len, &size) )
++ return 0;
++
++ if ( size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ new_len = len*size;
++ if (new_len < 0) {
++ PyErr_SetString(PyExc_MemoryError,
++ "not enough memory for output buffer");
++ return 0;
++ }
++ rv = PyBytes_FromStringAndSize(NULL, new_len);
++ if ( rv == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(rv);
++
++ for ( i=0; i < new_len; i += size ) {
++ cval = *cp++;
++ val = st_alaw2linear16(cval);
++
++ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
++ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
++ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
++ }
++ return rv;
+ }
+
+ static PyObject *
+ audioop_lin2adpcm(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- signed char *ncp;
+- int len, size, val = 0, step, valpred, delta,
+- index, sign, vpdiff, diff;
+- PyObject *rv, *state, *str;
+- int i, outputbuffer = 0, bufferstep;
+-
+- if ( !PyArg_ParseTuple(args, "s#iO:lin2adpcm",
+- &cp, &len, &size, &state) )
+- return 0;
+-
+-
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- str = PyBytes_FromStringAndSize(NULL, len/(size*2));
+- if ( str == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(str);
+-
+- /* Decode state, should have (value, step) */
+- if ( state == Py_None ) {
+- /* First time, it seems. Set defaults */
+- valpred = 0;
+- step = 7;
+- index = 0;
+- } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index)
)
+- return 0;
++ signed char *cp;
++ signed char *ncp;
++ int len, size, val = 0, step, valpred, delta,
++ index, sign, vpdiff, diff;
++ PyObject *rv, *state, *str;
++ int i, outputbuffer = 0, bufferstep;
++
++ if ( !PyArg_ParseTuple(args, "s#iO:lin2adpcm",
++ &cp, &len, &size, &state) )
++ return 0;
++
++
++ if ( size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ str = PyBytes_FromStringAndSize(NULL, len/(size*2));
++ if ( str == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(str);
++
++ /* Decode state, should have (value, step) */
++ if ( state == Py_None ) {
++ /* First time, it seems. Set defaults */
++ valpred = 0;
++ step = 7;
++ index = 0;
++ } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
++ return 0;
++
++ step = stepsizeTable[index];
++ bufferstep = 1;
++
++ for ( i=0; i < len; i += size ) {
++ if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
++ else if ( size == 2 ) val = (int)*SHORTP(cp, i);
++ else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
++
++ /* Step 1 - compute difference with previous value */
++ diff = val - valpred;
++ sign = (diff < 0) ? 8 : 0;
++ if ( sign ) diff = (-diff);
++
++ /* Step 2 - Divide and clamp */
++ /* Note:
++ ** This code *approximately* computes:
++ ** delta = diff*4/step;
++ ** vpdiff = (delta+0.5)*step/4;
++ ** but in shift step bits are dropped. The net result of this
++ ** is that even if you have fast mul/div hardware you cannot
++ ** put it to good use since the fixup would be too expensive.
++ */
++ delta = 0;
++ vpdiff = (step >> 3);
+
++ if ( diff >= step ) {
++ delta = 4;
++ diff -= step;
++ vpdiff += step;
++ }
++ step >>= 1;
++ if ( diff >= step ) {
++ delta |= 2;
++ diff -= step;
++ vpdiff += step;
++ }
++ step >>= 1;
++ if ( diff >= step ) {
++ delta |= 1;
++ vpdiff += step;
++ }
++
++ /* Step 3 - Update previous value */
++ if ( sign )
++ valpred -= vpdiff;
++ else
++ valpred += vpdiff;
++
++ /* Step 4 - Clamp previous value to 16 bits */
++ if ( valpred > 32767 )
++ valpred = 32767;
++ else if ( valpred < -32768 )
++ valpred = -32768;
++
++ /* Step 5 - Assemble value, update index and step values */
++ delta |= sign;
++
++ index += indexTable[delta];
++ if ( index < 0 ) index = 0;
++ if ( index > 88 ) index = 88;
+ step = stepsizeTable[index];
+- bufferstep = 1;
+
+- for ( i=0; i < len; i += size ) {
+- if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
+- else if ( size == 2 ) val = (int)*SHORTP(cp, i);
+- else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
+-
+- /* Step 1 - compute difference with previous value */
+- diff = val - valpred;
+- sign = (diff < 0) ? 8 : 0;
+- if ( sign ) diff = (-diff);
+-
+- /* Step 2 - Divide and clamp */
+- /* Note:
+- ** This code *approximately* computes:
+- ** delta = diff*4/step;
+- ** vpdiff = (delta+0.5)*step/4;
+- ** but in shift step bits are dropped. The net result of this
+- ** is that even if you have fast mul/div hardware you cannot
+- ** put it to good use since the fixup would be too expensive.
+- */
+- delta = 0;
+- vpdiff = (step >> 3);
+-
+- if ( diff >= step ) {
+- delta = 4;
+- diff -= step;
+- vpdiff += step;
+- }
+- step >>= 1;
+- if ( diff >= step ) {
+- delta |= 2;
+- diff -= step;
+- vpdiff += step;
+- }
+- step >>= 1;
+- if ( diff >= step ) {
+- delta |= 1;
+- vpdiff += step;
+- }
+-
+- /* Step 3 - Update previous value */
+- if ( sign )
+- valpred -= vpdiff;
+- else
+- valpred += vpdiff;
+-
+- /* Step 4 - Clamp previous value to 16 bits */
+- if ( valpred > 32767 )
+- valpred = 32767;
+- else if ( valpred < -32768 )
+- valpred = -32768;
+-
+- /* Step 5 - Assemble value, update index and step values */
+- delta |= sign;
+-
+- index += indexTable[delta];
+- if ( index < 0 ) index = 0;
+- if ( index > 88 ) index = 88;
+- step = stepsizeTable[index];
+-
+- /* Step 6 - Output value */
+- if ( bufferstep ) {
+- outputbuffer = (delta << 4) & 0xf0;
+- } else {
+- *ncp++ = (delta & 0x0f) | outputbuffer;
+- }
+- bufferstep = !bufferstep;
++ /* Step 6 - Output value */
++ if ( bufferstep ) {
++ outputbuffer = (delta << 4) & 0xf0;
++ } else {
++ *ncp++ = (delta & 0x0f) | outputbuffer;
+ }
+- rv = Py_BuildValue("(O(ii))", str, valpred, index);
+- Py_DECREF(str);
+- return rv;
++ bufferstep = !bufferstep;
++ }
++ rv = Py_BuildValue("(O(ii))", str, valpred, index);
++ Py_DECREF(str);
++ return rv;
+ }
+
+ static PyObject *
+ audioop_adpcm2lin(PyObject *self, PyObject *args)
+ {
+- signed char *cp;
+- signed char *ncp;
+- int len, new_len, size, valpred, step, delta, index, sign, vpdiff;
+- PyObject *rv, *str, *state;
+- int i, inputbuffer = 0, bufferstep;
+-
+- if ( !PyArg_ParseTuple(args, "s#iO:adpcm2lin",
+- &cp, &len, &size, &state) )
+- return 0;
+-
+- if ( size != 1 && size != 2 && size != 4) {
+- PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
+- return 0;
+- }
+-
+- /* Decode state, should have (value, step) */
+- if ( state == Py_None ) {
+- /* First time, it seems. Set defaults */
+- valpred = 0;
+- step = 7;
+- index = 0;
+- } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index)
)
+- return 0;
+-
+- new_len = len*size*2;
+- if (new_len < 0) {
+- PyErr_SetString(PyExc_MemoryError,
+- "not enough memory for output buffer");
+- return 0;
++ signed char *cp;
++ signed char *ncp;
++ int len, new_len, size, valpred, step, delta, index, sign, vpdiff;
++ PyObject *rv, *str, *state;
++ int i, inputbuffer = 0, bufferstep;
++
++ if ( !PyArg_ParseTuple(args, "s#iO:adpcm2lin",
++ &cp, &len, &size, &state) )
++ return 0;
++
++ if ( size != 1 && size != 2 && size != 4) {
++ PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
++ return 0;
++ }
++
++ /* Decode state, should have (value, step) */
++ if ( state == Py_None ) {
++ /* First time, it seems. Set defaults */
++ valpred = 0;
++ step = 7;
++ index = 0;
++ } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
++ return 0;
++
++ new_len = len*size*2;
++ if (new_len < 0) {
++ PyErr_SetString(PyExc_MemoryError,
++ "not enough memory for output buffer");
++ return 0;
++ }
++ str = PyBytes_FromStringAndSize(NULL, new_len);
++ if ( str == 0 )
++ return 0;
++ ncp = (signed char *)PyBytes_AsString(str);
++
++ step = stepsizeTable[index];
++ bufferstep = 0;
++
++ for ( i=0; i < new_len; i += size ) {
++ /* Step 1 - get the delta value and compute next index */
++ if ( bufferstep ) {
++ delta = inputbuffer & 0xf;
++ } else {
++ inputbuffer = *cp++;
++ delta = (inputbuffer >> 4) & 0xf;
+ }
+- str = PyBytes_FromStringAndSize(NULL, new_len);
+- if ( str == 0 )
+- return 0;
+- ncp = (signed char *)PyBytes_AsString(str);
+
++ bufferstep = !bufferstep;
++
++ /* Step 2 - Find new index value (for later) */
++ index += indexTable[delta];
++ if ( index < 0 ) index = 0;
++ if ( index > 88 ) index = 88;
++
++ /* Step 3 - Separate sign and magnitude */
++ sign = delta & 8;
++ delta = delta & 7;
++
++ /* Step 4 - Compute difference and new predicted value */
++ /*
++ ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
++ ** in adpcm_coder.
++ */
++ vpdiff = step >> 3;
++ if ( delta & 4 ) vpdiff += step;
++ if ( delta & 2 ) vpdiff += step>>1;
++ if ( delta & 1 ) vpdiff += step>>2;
++
++ if ( sign )
++ valpred -= vpdiff;
++ else
++ valpred += vpdiff;
++
++ /* Step 5 - clamp output value */
++ if ( valpred > 32767 )
++ valpred = 32767;
++ else if ( valpred < -32768 )
++ valpred = -32768;
++
++ /* Step 6 - Update step value */
+ step = stepsizeTable[index];
+- bufferstep = 0;
+-
+- for ( i=0; i < new_len; i += size ) {
+- /* Step 1 - get the delta value and compute next index */
+- if ( bufferstep ) {
+- delta = inputbuffer & 0xf;
+- } else {
+- inputbuffer = *cp++;
+- delta = (inputbuffer >> 4) & 0xf;
+- }
+-
+- bufferstep = !bufferstep;
+-
+- /* Step 2 - Find new index value (for later) */
+- index += indexTable[delta];
+- if ( index < 0 ) index = 0;
+- if ( index > 88 ) index = 88;
+-
+- /* Step 3 - Separate sign and magnitude */
+- sign = delta & 8;
+- delta = delta & 7;
+-
+- /* Step 4 - Compute difference and new predicted value */
+- /*
+- ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
+- ** in adpcm_coder.
+- */
+- vpdiff = step >> 3;
+- if ( delta & 4 ) vpdiff += step;
+- if ( delta & 2 ) vpdiff += step>>1;
+- if ( delta & 1 ) vpdiff += step>>2;
+-
+- if ( sign )
+- valpred -= vpdiff;
+- else
+- valpred += vpdiff;
+-
+- /* Step 5 - clamp output value */
+- if ( valpred > 32767 )
+- valpred = 32767;
+- else if ( valpred < -32768 )
+- valpred = -32768;
+-
+- /* Step 6 - Update step value */
+- step = stepsizeTable[index];
+-
+- /* Step 6 - Output value */
+- if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8);
+- else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred);
+- else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16);
+- }
+
+- rv = Py_BuildValue("(O(ii))", str, valpred, index);
+- Py_DECREF(str);
+- return rv;
++ /* Step 6 - Output value */
++ if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8);
++ else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred);
++ else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16);
++ }
++
++ rv = Py_BuildValue("(O(ii))", str, valpred, index);
++ Py_DECREF(str);
++ return rv;
+ }
+
+ static PyMethodDef audioop_methods[] = {
+- { "max", audioop_max, METH_VARARGS },
+- { "minmax", audioop_minmax, METH_VARARGS },
+- { "avg", audioop_avg, METH_VARARGS },
+- { "maxpp", audioop_maxpp, METH_VARARGS },
+- { "avgpp", audioop_avgpp, METH_VARARGS },
+- { "rms", audioop_rms, METH_VARARGS },
+- { "findfit", audioop_findfit, METH_VARARGS },
+- { "findmax", audioop_findmax, METH_VARARGS },
+- { "findfactor", audioop_findfactor, METH_VARARGS },
+- { "cross", audioop_cross, METH_VARARGS },
+- { "mul", audioop_mul, METH_VARARGS },
+- { "add", audioop_add, METH_VARARGS },
+- { "bias", audioop_bias, METH_VARARGS },
+- { "ulaw2lin", audioop_ulaw2lin, METH_VARARGS },
+- { "lin2ulaw", audioop_lin2ulaw, METH_VARARGS },
+- { "alaw2lin", audioop_alaw2lin, METH_VARARGS },
+- { "lin2alaw", audioop_lin2alaw, METH_VARARGS },
+- { "lin2lin", audioop_lin2lin, METH_VARARGS },
+- { "adpcm2lin", audioop_adpcm2lin, METH_VARARGS },
+- { "lin2adpcm", audioop_lin2adpcm, METH_VARARGS },
+- { "tomono", audioop_tomono, METH_VARARGS },
+- { "tostereo", audioop_tostereo, METH_VARARGS },
+- { "getsample", audioop_getsample, METH_VARARGS },
+- { "reverse", audioop_reverse, METH_VARARGS },
+- { "ratecv", audioop_ratecv, METH_VARARGS },
+- { 0, 0 }
++ { "max", audioop_max, METH_VARARGS },
++ { "minmax", audioop_minmax, METH_VARARGS },
++ { "avg", audioop_avg, METH_VARARGS },
++ { "maxpp", audioop_maxpp, METH_VARARGS },
++ { "avgpp", audioop_avgpp, METH_VARARGS },
++ { "rms", audioop_rms, METH_VARARGS },
++ { "findfit", audioop_findfit, METH_VARARGS },
++ { "findmax", audioop_findmax, METH_VARARGS },
++ { "findfactor", audioop_findfactor, METH_VARARGS },
++ { "cross", audioop_cross, METH_VARARGS },
++ { "mul", audioop_mul, METH_VARARGS },
++ { "add", audioop_add, METH_VARARGS },
++ { "bias", audioop_bias, METH_VARARGS },
++ { "ulaw2lin", audioop_ulaw2lin, METH_VARARGS },
++ { "lin2ulaw", audioop_lin2ulaw, METH_VARARGS },
++ { "alaw2lin", audioop_alaw2lin, METH_VARARGS },
++ { "lin2alaw", audioop_lin2alaw, METH_VARARGS },
++ { "lin2lin", audioop_lin2lin, METH_VARARGS },
++ { "adpcm2lin", audioop_adpcm2lin, METH_VARARGS },
++ { "lin2adpcm", audioop_lin2adpcm, METH_VARARGS },
++ { "tomono", audioop_tomono, METH_VARARGS },
++ { "tostereo", audioop_tostereo, METH_VARARGS },
++ { "getsample", audioop_getsample, METH_VARARGS },
++ { "reverse", audioop_reverse, METH_VARARGS },
++ { "ratecv", audioop_ratecv, METH_VARARGS },
++ { 0, 0 }
+ };
+
+
+ static struct PyModuleDef audioopmodule = {
+- PyModuleDef_HEAD_INIT,
+- "audioop",
+- NULL,
+- -1,
+- audioop_methods,
+- NULL,
+- NULL,
+- NULL,
+- NULL
++ PyModuleDef_HEAD_INIT,
++ "audioop",
++ NULL,
++ -1,
++ audioop_methods,
++ NULL,
++ NULL,
++ NULL,
++ NULL
+ };
+
+ PyMODINIT_FUNC
+ PyInit_audioop(void)
+ {
+- PyObject *m, *d;
+- m = PyModule_Create(&audioopmodule);
+- if (m == NULL)
+- return NULL;
+- d = PyModule_GetDict(m);
+- if (d == NULL)
+- return NULL;
+- AudioopError = PyErr_NewException("audioop.error", NULL, NULL);
+- if (AudioopError != NULL)
+- PyDict_SetItemString(d,"error",AudioopError);
+- return m;
++ PyObject *m, *d;
++ m = PyModule_Create(&audioopmodule);
++ if (m == NULL)
++ return NULL;
++ d = PyModule_GetDict(m);
++ if (d == NULL)
++ return NULL;
++ AudioopError = PyErr_NewException("audioop.error", NULL, NULL);
++ if (AudioopError != NULL)
++ PyDict_SetItemString(d,"error",AudioopError);
++ return m;
+ }
diff --git a/python3.spec b/python3.spec
index c3aaed8..7cf210d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -40,7 +40,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 9%{?dist}
+Release: 10%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -204,6 +204,21 @@ Patch104: python-3.1.2-more-configuration-flags.patch
# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
Patch105: python-2.6.5-statvfs-f_flag-constants.patch
+# This is the Modules/audioop.c part of the whitespace cleanup in r81032, to make it
+# easier to apply subsequent security fixes:
+Patch106: python-3.1.2-reformat-audioop.c.patch
+
+# CVE-2010-1634: fix various integer overflow checks in the audioop module
+# This is the difference from r81032 to r81081 (i.e r81047 and r81081)
+Patch107: python-3.1.2-CVE-2010-1634.patch
+
+# CVE-2010-2089: verify sizes/lengths within audioop module:
+Patch108: python-3.1.2-CVE-2010-2089.patch
+
+# CVE-2008-5983: the new PySys_SetArgvEx entry point from r81400 (backported to
+# the old layout before the whitespace cleanup of release31-maint in r81033):
+Patch109: python-3.1.2-CVE-2008-5983.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
BuildRequires: ncurses-devel, gdbm-devel, zlib-devel, expat-devel
@@ -357,6 +372,10 @@ rm -r Modules/zlib || exit 1
%patch105 -p1 -b .statvfs-f-flag-constants
+%patch106 -p3 -b .reformat-audioop
+%patch107 -p3 -b .CVE-2010-1634
+%patch108 -p1 -b .CVE-2010-2089
+%patch109 -p1 -b .CVE-2008-5983
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
@@ -370,10 +389,10 @@ sed --in-place \
%build
topdir=$(pwd)
-export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
-export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
+export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
+export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
export CPPFLAGS="`pkg-config --cflags-only-I libffi`"
-export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
+export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC -fwrapv"
export LINKCC="gcc"
export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`"
@@ -1038,6 +1057,14 @@ rm -fr %{buildroot}
%changelog
+* Fri Jun 4 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-10
+- ensure that the compiler is invoked with "-fwrapv" (rhbz#594819)
+- reformat whitespace in audioop.c (patch 106)
+- CVE-2010-1634: fix various integer overflow checks in the audioop
+module (patch 107)
+- CVE-2010-2089: further checks within the audioop module (patch 108)
+- CVE-2008-5983: the new PySys_SetArgvEx entry point from r81399 (patch 109)
+
* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
- reading the timestamp counter is available only on some arches (see Python/ceval.c)
commit 66cf571b6197859a0a2a8717426fa46a2a85becd
Author: Dan Hork <sharkcz(a)fedoraproject.org>
Date: Thu May 27 10:59:22 2010 +0000
- reading the timestamp counter is available only on some arches (see
Python/ceval.c)
diff --git a/python3.spec b/python3.spec
index c2595dc..c3aaed8 100644
--- a/python3.spec
+++ b/python3.spec
@@ -40,7 +40,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 8%{?dist}
+Release: 9%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -427,7 +427,11 @@ make OPT="$CFLAGS" %{?_smp_mflags}
BuildPython debug \
python-debug \
python%{pybasever}-debug \
+%ifarch %{ix86} x86_64 ppc ppc64
"--with-pydebug --with-tsc --with-count-allocs --with-call-profile" \
+%else
+ "--with-pydebug --with-count-allocs --with-call-profile" \
+%endif
false
BuildPython optimized \
@@ -1034,6 +1038,9 @@ rm -fr %{buildroot}
%changelog
+* Thu May 27 2010 Dan Hork <dan[at]danny.cz> - 3.1.2-9
+- reading the timestamp counter is available only on some arches (see Python/ceval.c)
+
* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
(patch 105)
commit d73e38d70d3bd7c82d4a9f3dbf62053fbb407653
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Wed May 26 10:34:27 2010 +0000
- add flags for statvfs.f_flag to the constant list in posixmodule (i.e.
"os") (patch 105)
diff --git a/python-2.6.5-statvfs-f_flag-constants.patch
b/python-2.6.5-statvfs-f_flag-constants.patch
new file mode 100644
index 0000000..4b3390d
--- /dev/null
+++ b/python-2.6.5-statvfs-f_flag-constants.patch
@@ -0,0 +1,62 @@
+From 21fda4c78000d78cb1824fdf0373031d07f5325a Mon Sep 17 00:00:00 2001
+From: Peter Jones <pjones(a)redhat.com>
+Date: Wed, 6 Jan 2010 15:22:38 -0500
+Subject: [PATCH] Add flags for statvfs.f_flag to constant list.
+
+You really need these to figure out what statvfs is trying to say to
+you, so add them here.
+---
+ Modules/posixmodule.c | 37 +++++++++++++++++++++++++++++++++++++
+ 1 files changed, 37 insertions(+), 0 deletions(-)
+
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+index ebdbc8d..d79013b 100644
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -8990,6 +8990,43 @@ all_ins(PyObject *d)
+ #endif
+ #endif
+
++ /* These came from statvfs.h */
++#ifdef ST_RDONLY
++ if (ins(d, "ST_RDONLY", (long)ST_RDONLY)) return -1;
++#endif /* ST_RDONLY */
++#ifdef ST_NOSUID
++ if (ins(d, "ST_NOSUID", (long)ST_NOSUID)) return -1;
++#endif /* ST_NOSUID */
++
++ /* GNU extensions */
++#ifdef ST_NODEV
++ if (ins(d, "ST_NODEV", (long)ST_NODEV)) return -1;
++#endif /* ST_NODEV */
++#ifdef ST_NOEXEC
++ if (ins(d, "ST_NOEXEC", (long)ST_NOEXEC)) return -1;
++#endif /* ST_NOEXEC */
++#ifdef ST_SYNCHRONOUS
++ if (ins(d, "ST_SYNCHRONOUS", (long)ST_SYNCHRONOUS)) return -1;
++#endif /* ST_SYNCHRONOUS */
++#ifdef ST_MANDLOCK
++ if (ins(d, "ST_MANDLOCK", (long)ST_MANDLOCK)) return -1;
++#endif /* ST_MANDLOCK */
++#ifdef ST_WRITE
++ if (ins(d, "ST_WRITE", (long)ST_WRITE)) return -1;
++#endif /* ST_WRITE */
++#ifdef ST_APPEND
++ if (ins(d, "ST_APPEND", (long)ST_APPEND)) return -1;
++#endif /* ST_APPEND */
++#ifdef ST_NOATIME
++ if (ins(d, "ST_NOATIME", (long)ST_NOATIME)) return -1;
++#endif /* ST_NOATIME */
++#ifdef ST_NODIRATIME
++ if (ins(d, "ST_NODIRATIME", (long)ST_NODIRATIME)) return -1;
++#endif /* ST_NODIRATIME */
++#ifdef ST_RELATIME
++ if (ins(d, "ST_RELATIME", (long)ST_RELATIME)) return -1;
++#endif /* ST_RELATIME */
++
+ #if defined(PYOS_OS2)
+ if (insertvalues(d)) return -1;
+ #endif
+--
+1.6.6
+
diff --git a/python3.spec b/python3.spec
index ed8b39c..c2595dc 100644
--- a/python3.spec
+++ b/python3.spec
@@ -40,7 +40,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 7%{?dist}
+Release: 8%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -200,6 +200,9 @@ Patch103: python-3.1.2-debug-build.patch
# extension modules will reliably use them
Patch104: python-3.1.2-more-configuration-flags.patch
+# Add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
+# (rhbz:553020); partially upstream as
http://bugs.python.org/issue7647
+Patch105: python-2.6.5-statvfs-f_flag-constants.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
@@ -352,6 +355,7 @@ rm -r Modules/zlib || exit 1
%patch103 -p1 -b .debug-build
%patch104 -p1 -b .more-configuration-flags
+%patch105 -p1 -b .statvfs-f-flag-constants
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
@@ -1030,6 +1034,10 @@ rm -fr %{buildroot}
%changelog
+* Wed May 26 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-8
+- add flags for statvfs.f_flag to the constant list in posixmodule (i.e. "os")
+(patch 105)
+
* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
(patch 104); enable them and the WITH_TSC option within the debug build
commit 021b2bcd4a257d2624d282d00ed246242678337b
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Tue May 25 17:16:11 2010 +0000
- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug
options (patch 104); enable them and the WITH_TSC option within the
debug build
diff --git a/python-3.1.2-more-configuration-flags.patch
b/python-3.1.2-more-configuration-flags.patch
new file mode 100644
index 0000000..24df543
--- /dev/null
+++ b/python-3.1.2-more-configuration-flags.patch
@@ -0,0 +1,50 @@
+diff -up Python-3.1.2/configure.in.more-configuration-flags Python-3.1.2/configure.in
+--- Python-3.1.2/configure.in.more-configuration-flags 2010-05-25 12:16:48.602875960
-0400
++++ Python-3.1.2/configure.in 2010-05-25 12:16:48.609879553 -0400
+@@ -2443,6 +2443,30 @@ else AC_MSG_RESULT(no)
+ fi],
+ [AC_MSG_RESULT(no)])
+
++AC_MSG_CHECKING(for --with-count-allocs)
++AC_ARG_WITH(count-allocs,
++[ --with(out)count-allocs enable/disable per-type instance accounting], [
++if test "$withval" != no
++then
++ AC_DEFINE(COUNT_ALLOCS, 1,
++ [Define to keep records of the number of instances of each type])
++ AC_MSG_RESULT(yes)
++else AC_MSG_RESULT(no)
++fi],
++[AC_MSG_RESULT(no)])
++
++AC_MSG_CHECKING(for --with-call-profile)
++AC_ARG_WITH(call-profile,
++[ --with(out)-call-profile enable/disable statistics on function call invocation], [
++if test "$withval" != no
++then
++ AC_DEFINE(CALL_PROFILE, 1,
++ [Define to keep records on function call invocation])
++ AC_MSG_RESULT(yes)
++else AC_MSG_RESULT(no)
++fi],
++[AC_MSG_RESULT(no)])
++
+ # Check for Python-specific malloc support
+ AC_MSG_CHECKING(for --with-pymalloc)
+ AC_ARG_WITH(pymalloc,
+diff -up Python-3.1.2/pyconfig.h.in.more-configuration-flags Python-3.1.2/pyconfig.h.in
+--- Python-3.1.2/pyconfig.h.in.more-configuration-flags 2010-05-25 12:16:48.000000000
-0400
++++ Python-3.1.2/pyconfig.h.in 2010-05-25 12:17:54.428126399 -0400
+@@ -18,6 +18,12 @@
+ /* Define if you have the Mach cthreads package */
+ #undef C_THREADS
+
++/* Define to keep records on function call invocation */
++#undef CALL_PROFILE
++
++/* Define to keep records of the number of instances of each type */
++#undef COUNT_ALLOCS
++
+ /* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
+ mixed-endian order (byte order 45670123) */
+ #undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
diff --git a/python3.spec b/python3.spec
index f5592ae..ed8b39c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -40,7 +40,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 6%{?dist}
+Release: 7%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -194,6 +194,13 @@ Patch102: python-3.1.1-lib64.patch
Patch103: python-3.1.2-debug-build.patch
+# Add configure-time support for the COUNT_ALLOCS and CALL_PROFILE options
+# described at
http://svn.python.org/projects/python/trunk/Misc/SpecialBuilds.txt
+# so that if they are enabled, they will be in that build's pyconfig.h, so that
+# extension modules will reliably use them
+Patch104: python-3.1.2-more-configuration-flags.patch
+
+
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
BuildRequires: ncurses-devel, gdbm-devel, zlib-devel, expat-devel
@@ -343,6 +350,7 @@ rm -r Modules/zlib || exit 1
%endif
%patch103 -p1 -b .debug-build
+%patch104 -p1 -b .more-configuration-flags
@@ -415,7 +423,7 @@ make OPT="$CFLAGS" %{?_smp_mflags}
BuildPython debug \
python-debug \
python%{pybasever}-debug \
- "--with-pydebug" \
+ "--with-pydebug --with-tsc --with-count-allocs --with-call-profile" \
false
BuildPython optimized \
@@ -1022,6 +1030,10 @@ rm -fr %{buildroot}
%changelog
+* Tue May 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-7
+- add configure-time support for COUNT_ALLOCS and CALL_PROFILE debug options
+(patch 104); enable them and the WITH_TSC option within the debug build
+
* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
- build and install two different configurations of Python 3: debug and
standard, packaging the debug build in a new "python3-debug" subpackage
commit 55cf58012d82f965f94163c9e36771b9afe1cda8
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Mon May 24 23:45:40 2010 +0000
- build and install two different configurations of Python 3: debug and
standard, packaging the debug build in a new "python3-debug" subpackage
(patch 103)
diff --git a/python-3.1.2-debug-build.patch b/python-3.1.2-debug-build.patch
new file mode 100644
index 0000000..2a71afe
--- /dev/null
+++ b/python-3.1.2-debug-build.patch
@@ -0,0 +1,275 @@
+diff -up Python-3.1.2/configure.in.debug-build Python-3.1.2/configure.in
+--- Python-3.1.2/configure.in.debug-build 2010-05-20 22:48:14.573026391 -0400
++++ Python-3.1.2/configure.in 2010-05-20 22:48:14.580902316 -0400
+@@ -569,7 +569,7 @@ AC_SUBST(LIBRARY)
+ AC_MSG_CHECKING(LIBRARY)
+ if test -z "$LIBRARY"
+ then
+- LIBRARY='libpython$(VERSION).a'
++ LIBRARY='libpython$(VERSION)$(DEBUG_EXT).a'
+ fi
+ AC_MSG_RESULT($LIBRARY)
+
+@@ -711,8 +711,8 @@ if test $enable_shared = "yes"; then
+ INSTSONAME="$LDLIBRARY".$SOVERSION
+ ;;
+ Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*)
+- LDLIBRARY='libpython$(VERSION).so'
+- BLDLIBRARY='-L. -lpython$(VERSION)'
++ LDLIBRARY='libpython$(VERSION)$(DEBUG_EXT).so'
++ BLDLIBRARY='-L. -lpython$(VERSION)$(DEBUG_EXT)'
+ RUNSHARED=LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}
+ case $ac_sys_system in
+ FreeBSD*)
+@@ -816,6 +816,14 @@ else AC_MSG_RESULT(no); Py_DEBUG='false'
+ fi],
+ [AC_MSG_RESULT(no)])
+
++if test "$Py_DEBUG" = 'true'
++then
++ DEBUG_EXT=_d
++ DEBUG_SUFFIX=-debug
++fi
++AC_SUBST(DEBUG_EXT)
++AC_SUBST(DEBUG_SUFFIX)
++
+ # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be
+ # merged with this chunk of code?
+
+diff -up Python-3.1.2/Lib/distutils/command/build_ext.py.debug-build
Python-3.1.2/Lib/distutils/command/build_ext.py
+--- Python-3.1.2/Lib/distutils/command/build_ext.py.debug-build 2010-03-19
17:56:34.000000000 -0400
++++ Python-3.1.2/Lib/distutils/command/build_ext.py 2010-05-20 22:48:14.581902928 -0400
+@@ -673,7 +673,10 @@ class build_ext(Command):
+ so_ext = get_config_var('SO')
+ if os.name == 'nt' and self.debug:
+ return os.path.join(*ext_path) + '_d' + so_ext
+- return os.path.join(*ext_path) + so_ext
++
++ # Similarly, extensions in debug mode are named 'module_d.so', to
++ # avoid adding the _d to the SO config variable:
++ return os.path.join(*ext_path) + (sys.pydebug and "_d" or
"") + so_ext
+
+ def get_export_symbols(self, ext):
+ """Return the list of symbols that a shared extension has to
+@@ -754,6 +757,8 @@ class build_ext(Command):
+ template = "python%d.%d"
+ pythonlib = (template %
+ (sys.hexversion >> 24, (sys.hexversion >> 16)
& 0xff))
++ if sys.pydebug:
++ pythonlib += '_d'
+ return ext.libraries + [pythonlib]
+ else:
+ return ext.libraries
+diff -up Python-3.1.2/Lib/distutils/sysconfig.py.debug-build
Python-3.1.2/Lib/distutils/sysconfig.py
+--- Python-3.1.2/Lib/distutils/sysconfig.py.debug-build 2010-05-20 22:48:14.577026372
-0400
++++ Python-3.1.2/Lib/distutils/sysconfig.py 2010-05-20 22:48:14.581902928 -0400
+@@ -83,7 +83,8 @@ def get_python_inc(plat_specific=0, pref
+ else:
+ incdir = os.path.join(get_config_var('srcdir'),
'Include')
+ return os.path.normpath(incdir)
+- return os.path.join(prefix, "include", "python" +
get_python_version())
++ return os.path.join(prefix, "include",
++ "python" + get_python_version() + (sys.pydebug and
'-debug' or ''))
+ elif os.name == "nt":
+ return os.path.join(prefix, "include")
+ elif os.name == "mac":
+@@ -229,7 +230,7 @@ def get_makefile_filename():
+ if python_build:
+ return os.path.join(os.path.dirname(sys.executable), "Makefile")
+ lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
+- return os.path.join(lib_dir, "config", "Makefile")
++ return os.path.join(lib_dir, "config" + (sys.pydebug and
"-debug" or ""), "Makefile")
+
+
+ def parse_config_h(fp, g=None):
+diff -up Python-3.1.2/Makefile.pre.in.debug-build Python-3.1.2/Makefile.pre.in
+--- Python-3.1.2/Makefile.pre.in.debug-build 2010-05-20 22:48:14.577901061 -0400
++++ Python-3.1.2/Makefile.pre.in 2010-05-20 22:48:14.581902928 -0400
+@@ -99,8 +99,8 @@ SCRIPTDIR= $(prefix)/lib64
+ # Detailed destination directories
+ BINLIBDEST= $(LIBDIR)/python$(VERSION)
+ LIBDEST= $(SCRIPTDIR)/python$(VERSION)
+-INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)
+-CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)
++INCLUDEPY= $(INCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
++CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(VERSION)$(DEBUG_SUFFIX)
+ LIBP= $(LIBDIR)/python$(VERSION)
+
+ # Symbols used for using shared libraries
+@@ -113,6 +113,12 @@ DESTSHARED= $(BINLIBDEST)/lib-dynload
+ EXE= @EXEEXT@
+ BUILDEXE= @BUILDEXEEXT@
+
++# DEBUG_EXT is used by ELF files (names and SONAMEs); it will be "_d" for a
debug build
++# DEBUG_SUFFIX is used by filesystem paths; it will be "-debug" for a debug
build
++# Both will be empty in an optimized build
++DEBUG_EXT= @DEBUG_EXT@
++DEBUG_SUFFIX= @DEBUG_SUFFIX@
++
+ # Short name and location for Mac OS X Python framework
+ UNIVERSALSDK=@UNIVERSALSDK@
+ PYTHONFRAMEWORK= @PYTHONFRAMEWORK@
+@@ -176,7 +182,7 @@ LIBOBJDIR= Python/
+ LIBOBJS= @LIBOBJS@
+
+ PYTHON= python$(EXE)
+-BUILDPYTHON= python$(BUILDEXE)
++BUILDPYTHON= python$(BUILD_SUFFIX)$(BUILDEXE)
+
+ # The task to run while instrument when building the profile-opt target
+ PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
+@@ -422,7 +428,7 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ esac
+
+-libpython$(VERSION).so: $(LIBRARY_OBJS)
++libpython$(VERSION)$(DEBUG_EXT).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(LDSHARED) $(LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS)
$(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
+ $(LN) -f $(INSTSONAME) $@; \
+@@ -793,7 +799,7 @@ altbininstall: $(BUILDPYTHON)
+ else true; \
+ fi; \
+ done
+- $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE)
++ $(INSTALL_PROGRAM) $(BUILDPYTHON)
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
+ if test -f $(LDLIBRARY); then \
+ if test -n "$(DLLLIBRARY)" ; then \
+ $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \
+@@ -807,15 +813,15 @@ altbininstall: $(BUILDPYTHON)
+ fi
+
+ bininstall: altbininstall
+- -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
+- then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(EXE); \
++ -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE) -o -h
$(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
++ then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON)3$(DEBUG_SUFFIX)$(EXE); \
+ else true; \
+ fi
+- (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(EXE) $(PYTHON)3$(EXE))
+- -rm -f $(DESTDIR)$(BINDIR)/python3-config
+- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config)
+- -rm -f $(DESTDIR)$(LIBPC)/python3.pc
+- (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python3.pc)
++ (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(DEBUG_SUFFIX)$(EXE)
$(PYTHON)3$(DEBUG_SUFFIX)$(EXE))
++ -rm -f $(DESTDIR)$(BINDIR)/python3$(DEBUG_SUFFIX)-config
++ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(DEBUG_SUFFIX)-config
python3$(DEBUG_SUFFIX)-config)
++ -rm -f $(DESTDIR)$(LIBPC)/python3$(DEBUG_SUFFIX).pc
++ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)$(DEBUG_SUFFIX).pc
python3$(DEBUG_SUFFIX).pc)
+
+ # Install the manual page
+ maninstall:
+@@ -960,7 +966,7 @@ inclinstall:
+
+ # Install the library and miscellaneous stuff needed for extending/embedding
+ # This goes into $(exec_prefix)
+-LIBPL= $(LIBP)/config
++LIBPL= $(LIBP)/config$(DEBUG_SUFFIX)
+
+ # pkgconfig directory
+ LIBPC= $(LIBDIR)/pkgconfig
+@@ -981,14 +987,14 @@ libainstall: all
+ $(INSTALL_DATA) Modules/Setup $(DESTDIR)$(LIBPL)/Setup
+ $(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local
+ $(INSTALL_DATA) Modules/Setup.config $(DESTDIR)$(LIBPL)/Setup.config
+- $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION).pc
++ $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION)$(DEBUG_SUFFIX).pc
+ $(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup
+ $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh
+ # Substitution happens here, as the completely-expanded BINDIR
+ # is not available in configure
+- sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(EXE)," <
$(srcdir)/Misc/python-config.in >python-config
+- $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(VERSION)-config
+- rm python-config
++ sed -e "s,@EXENAME@,$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)$(EXE)," <
$(srcdir)/Misc/python-config.in >python$(DEBUG_SUFFIX)-config
++ $(INSTALL_SCRIPT) python$(DEBUG_SUFFIX)-config
$(DESTDIR)$(BINDIR)/python$(VERSION)$(DEBUG_SUFFIX)-config
++ rm python$(DEBUG_SUFFIX)-config
+ @if [ -s Modules/python.exp -a \
+ "`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ];
then \
+ echo; echo "Installing support files for building shared extension modules on
AIX:"; \
+diff -up Python-3.1.2/Misc/python-config.in.debug-build
Python-3.1.2/Misc/python-config.in
+--- Python-3.1.2/Misc/python-config.in.debug-build 2007-09-01 03:27:37.000000000 -0400
++++ Python-3.1.2/Misc/python-config.in 2010-05-20 22:48:14.582902254 -0400
+@@ -44,7 +44,7 @@ elif opt in ('--includes', '--cflags'):
+
+ elif opt in ('--libs', '--ldflags'):
+ libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
+- libs.append('-lpython'+pyver)
++ libs.append('-lpython' + pyver + (sys.pydebug and "_d" or
""))
+ # add the prefix/lib/pythonX.Y/config dir, but only if there is no
+ # shared library in prefix/lib/.
+ if opt == '--ldflags' and not getvar('Py_ENABLE_SHARED'):
+diff -up Python-3.1.2/Modules/makesetup.debug-build Python-3.1.2/Modules/makesetup
+--- Python-3.1.2/Modules/makesetup.debug-build 2008-06-11 01:26:20.000000000 -0400
++++ Python-3.1.2/Modules/makesetup 2010-05-20 22:48:14.582902254 -0400
+@@ -233,7 +233,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
+ *$mod.o*) base=$mod;;
+ *) base=${mod}module;;
+ esac
+- file="$srcdir/$base\$(SO)"
++ file="$srcdir/$base\$(DEBUG_EXT)\$(SO)"
+ case $doconfig in
+ no) SHAREDMODS="$SHAREDMODS $file";;
+ esac
+diff -up Python-3.1.2/Python/dynload_shlib.c.debug-build
Python-3.1.2/Python/dynload_shlib.c
+--- Python-3.1.2/Python/dynload_shlib.c.debug-build 2008-06-11 01:26:20.000000000 -0400
++++ Python-3.1.2/Python/dynload_shlib.c 2010-05-20 22:48:14.582902254 -0400
+@@ -46,11 +46,16 @@ const struct filedescr _PyImport_DynLoad
+ {"module.exe", "rb", C_EXTENSION},
+ {"MODULE.EXE", "rb", C_EXTENSION},
+ #else
++#ifdef Py_DEBUG
++ {"_d.so", "rb", C_EXTENSION},
++ {"module_d.so", "rb", C_EXTENSION},
++#else
+ {".so", "rb", C_EXTENSION},
+ {"module.so", "rb", C_EXTENSION},
+-#endif
+-#endif
+-#endif
++#endif /* Py_DEBUG */
++#endif /* __VMS */
++#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
++#endif /* __CYGWIN__ */
+ {0, 0}
+ };
+
+diff -up Python-3.1.2/Python/sysmodule.c.debug-build Python-3.1.2/Python/sysmodule.c
+--- Python-3.1.2/Python/sysmodule.c.debug-build 2010-03-03 06:55:53.000000000 -0500
++++ Python-3.1.2/Python/sysmodule.c 2010-05-20 22:48:14.582902254 -0400
+@@ -1429,6 +1429,12 @@ _PySys_Init(void)
+ FlagsType.tp_init = NULL;
+ FlagsType.tp_new = NULL;
+
++#ifdef Py_DEBUG
++ PyDict_SetItemString(sysdict, "pydebug", Py_True);
++#else
++ PyDict_SetItemString(sysdict, "pydebug", Py_False);
++#endif
++
+ /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
+ #ifndef PY_NO_SHORT_FLOAT_REPR
+ SET_SYS_FROM_STRING("float_repr_style",
+diff -up Python-3.1.2/runtests.sh.debug-build Python-3.1.2/runtests.sh
+--- Python-3.1.2/runtests.sh.debug-build 2010-05-22 00:42:41.950889054 -0400
++++ Python-3.1.2/runtests.sh 2010-05-22 00:54:47.503851503 -0400
+@@ -16,11 +16,14 @@ Flags (arguments starting with '-') are
+ regrtest.py, except for -x, which is processed here."
+
+ # Choose the Python binary.
+-case `uname` in
+-Darwin) PYTHON=./python.exe;;
+-CYGWIN*) PYTHON=./python.exe;;
+-*) PYTHON=./python;;
+-esac
++if [ -z $PYTHON ]
++then
++ case `uname` in
++ Darwin) PYTHON=./python.exe;;
++ CYGWIN*) PYTHON=./python.exe;;
++ *) PYTHON=./python;;
++ esac
++fi
+
+ PYTHON="$PYTHON -bb"
+
diff --git a/python3.spec b/python3.spec
index 9e119ff..f5592ae 100644
--- a/python3.spec
+++ b/python3.spec
@@ -10,7 +10,8 @@
# (if these get out of sync, the payload of the libs subpackage will fail
# and halt the build)
%global py_SOVERSION 1.0
-%global py_INSTSONAME libpython%{pybasever}.so.%{py_SOVERSION}
+%global py_INSTSONAME_optimized libpython%{pybasever}.so.%{py_SOVERSION}
+%global py_INSTSONAME_debug libpython%{pybasever}_d.so.%{py_SOVERSION}
%global with_gdb_hooks 1
@@ -39,7 +40,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 5%{?dist}
+Release: 6%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -129,6 +130,69 @@ Patch8: python-3.1.1-systemtap.patch
Patch102: python-3.1.1-lib64.patch
+# Patch to support building both optimized vs debug stacks DSO ABIs, sharing
+# the same .py and .pyc files, using "_d.so" to signify a debug build of an
+# extension module.
+#
+# Based on Debian's patch for the same,
+#
http://patch-tracker.debian.org/patch/series/view/python2.6/2.6.5-2/debug...
+#
+# (which was itself based on the upstream Windows build), but with some
+# changes:
+#
+# * Debian's patch to dynload_shlib.c looks for module_d.so, then module.so,
+# but this can potentially find a module built against the wrong DSO ABI. We
+# instead search for just module_d.so in a debug build
+#
+# * We remove this change from configure.in's build of the Makefile:
+# SO=$DEBUG_EXT.so
+# so that sysconfig.py:customize_compiler stays with shared_lib_extension='.so'
+# on debug builds, so that UnixCCompiler.find_library_file can find system
+# libraries (otherwise "make sharedlibs" fails to find system libraries,
+# erroneously looking e.g. for "libffi_d.so" rather than
"libffi.so")
+#
+# * We change Lib/distutils/command/build_ext.py:build_ext.get_ext_filename
+# to add the _d there, when building an extension. This way, "make
sharedlibs"
+# can build ctypes, by finding the sysmtem libffi.so (rather than failing to
+# find "libffi_d.so"), and builds the module as _ctypes_d.so
+#
+# * Similarly, update build_ext:get_libraries handling of Py_ENABLE_SHARED by
+# appending "_d" to the python library's name for the debug configuration
+#
+# * We modify Modules/makesetup to add the "_d" to the generated Makefile
+# rules for the various Modules/*.so targets
+#
+# This may introduce issues when building an extension that links directly
+# against another extension (e.g. users of NumPy?), but seems more robust when
+# searching for external libraries
+#
+# * We don't change Lib/distutils/command/build.py: build.build_purelib to
+# embed plat_specifier, leaving it as is, as pure python builds should be
+# unaffected by these differences (we'll be sharing the .py and .pyc files)
+#
+# * We introduce DEBUG_SUFFIX as well as DEBUG_EXT:
+# - DEBUG_EXT is used by ELF files (names and SONAMEs); it will be "_d"
for
+# a debug build
+# - DEBUG_SUFFIX is used by filesystem paths; it will be "-debug" for a
+# debug build
+#
+# Both will be empty in an optimized build. "_d" contains characters that
+# are valid ELF metadata, but this leads to various ugly filesystem paths (such
+# as the include path), and DEBUG_SUFFIX allows these paths to have more natural
+# names. Changing this requires changes elsewhere in the distutils code.
+#
+# * We add DEBUG_SUFFIX to PYTHON in the Makefile, so that the two
+# configurations build parallel-installable binaries with different names
+# ("python-debug" vs "python").
+#
+# * Similarly, we add DEBUG_SUFFIX within python-config and
+# python$(VERSION)-config, so that the two configuration get different paths
+# for these.
+#
+# * Patch runtests.sh to support supplying a value for PYTHON, so that we can
+# run the tests against each of the builds
+
+Patch103: python-3.1.2-debug-build.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
@@ -207,6 +271,37 @@ in production.
You might want to install the python3-test package if you're developing
python 3 code that uses more than just unittest and/or test_support.py.
+%package debug
+Summary: Debug version of the Python 3 runtime
+Group: Applications/System
+
+# The debug build is an all-in-one package version of the regular build, and
+# shares the same .py/.pyc files and directories as the regular build. Hence
+# we depend on all of the subpackages of the regular build:
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+Requires: %{name}-test%{?_isa} = %{version}-%{release}
+Requires: %{name}-tkinter%{?_isa} = %{version}-%{release}
+Requires: %{name}-tools%{?_isa} = %{version}-%{release}
+
+%description debug
+python3-debug provides a version of the Python 3 runtime with numerous debugging
+features enabled, aimed at advanced Python users, such as developers of Python
+extension modules.
+
+This version uses more memory and will be slower than the regular Python 3 build,
+but is useful for tracking down reference-counting issues, and other bugs.
+
+The bytecodes are unchanged, so that .pyc files are compatible between the two
+versions of Python 3, but the debugging features mean that C/C++ extension
+modules are ABI-incompatible with those built for the standard runtime.
+
+It shares installation directories with the standard Python 3 runtime, so that
+.py and .pyc files can be shared. All compiled extension modules gain a "_d"
+suffix ("foo_d.so" rather than "foo.so") so that each Python 3
implementation
+can load its own extensions.
+
%prep
%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
@@ -247,6 +342,10 @@ rm -r Modules/zlib || exit 1
%patch102 -p1 -b .lib64
%endif
+%patch103 -p1 -b .debug-build
+
+
+
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -258,6 +357,7 @@ sed --in-place \
Lib/pydoc.py || exit 1
%build
+topdir=$(pwd)
export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
export CPPFLAGS="`pkg-config --cflags-only-I libffi`"
@@ -271,6 +371,25 @@ autoconf
# For patch 8 (systemtap), we need to get a new header for configure to use:
autoheader
+# Define a function, for how to perform a "build" of python for a given
+# configuration:
+BuildPython() {
+ ConfName=$1
+ BinaryName=$2
+ SymlinkName=$3
+ ExtraConfigArgs=$4
+ PathFixWithThisBinary=$5
+
+ ConfDir=build/$ConfName
+
+ echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName - %{_bindir}/$BinaryName
+ mkdir -p $ConfDir
+
+ pushd $ConfDir
+
+ # Use the freshly created "configure" script, but in the directory two
above:
+ %global _configure $topdir/configure
+
%configure \
--enable-ipv6 \
--with-wide-unicode \
@@ -280,18 +399,85 @@ autoheader
--with-tapset-install-dir=%{tapsetdir} \
%endif
--with-system-ffi \
- --with-system-expat
+ --with-system-expat \
+ $ExtraConfigArgs \
+ %{nil}
make OPT="$CFLAGS" %{?_smp_mflags}
+ popd
+ echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfDir
+}
+
+# Use "BuildPython" to support building with different configurations:
+
+BuildPython debug \
+ python-debug \
+ python%{pybasever}-debug \
+ "--with-pydebug" \
+ false
+
+BuildPython optimized \
+ python \
+ python%{pybasever} \
+ "" \
+ true
+
%install
+topdir=$(pwd)
rm -fr %{buildroot}
mkdir -p %{buildroot}%{_prefix} %{buildroot}%{_mandir}
+InstallPython() {
+
+ ConfName=$1
+ PyInstSoName=$2
+
+ ConfDir=build/$ConfName
+
+ echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+ mkdir -p $ConfDir
+
+ pushd $ConfDir
+
make install DESTDIR=%{buildroot} INSTALL="install -p"
+
+# Copy up the gdb hooks into place; the python file will be autoloaded by gdb
+# when visiting libpython.so, provided that the python file is installed to the
+# same path as the library (or its .debug file) plus a "-gdb.py" suffix, e.g:
+# /usr/lib/debug/usr/lib64/libpython3.1.so.1.0.debug-gdb.py
+# (note that the debug path is /usr/lib/debug for both 32/64 bit)
+#
+# Initially I tried:
+# /usr/lib/libpython3.1.so.1.0-gdb.py
+# but doing so generated noise when ldconfig was rerun (rhbz:562980)
+#
+%if 0%{?with_gdb_hooks}
+DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
+PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName.debug-gdb.py
+
+mkdir -p %{buildroot}$DirHoldingGdbPy
+cp %{SOURCE4} %{buildroot}$PathOfGdbPy
+%endif # with_gdb_hooks
+
+ popd
+
+ echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
+}
+
+# Use "InstallPython" to support building with different configurations:
+
+# Install the "debug" build first, so that we can move some files aside
+InstallPython debug \
+ %{py_INSTSONAME_debug}
+
+# Now the optimized build:
+InstallPython optimized \
+ %{py_INSTSONAME_optimized}
+
mkdir -p ${RPM_BUILD_ROOT}%{pylibdir}/site-packages
mv ${RPM_BUILD_ROOT}%{_bindir}/2to3 ${RPM_BUILD_ROOT}%{_bindir}/python3-2to3
@@ -328,9 +514,10 @@ install -d %{buildroot}/usr/lib/python%{pybasever}/site-packages
%else
%global _pyconfig_h %{_pyconfig32_h}
%endif
-mv %{buildroot}%{_includedir}/python%{pybasever}/pyconfig.h \
- %{buildroot}%{_includedir}/python%{pybasever}/%{_pyconfig_h}
-cat > %{buildroot}%{_includedir}/python%{pybasever}/pyconfig.h << EOF
+for PyIncludeDir in python%{pybasever} python%{pybasever}-debug ; do
+ mv %{buildroot}%{_includedir}/$PyIncludeDir/pyconfig.h \
+ %{buildroot}%{_includedir}/$PyIncludeDir/%{_pyconfig_h}
+ cat > %{buildroot}%{_includedir}/$PyIncludeDir/pyconfig.h << EOF
#include <bits/wordsize.h>
#if __WORDSIZE == 32
@@ -341,12 +528,16 @@ cat > %{buildroot}%{_includedir}/python%{pybasever}/pyconfig.h
<< EOF
#error "Unknown word size"
#endif
EOF
+done
# Fix for bug 201434: make sure distutils looks at the right pyconfig.h file
sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/"
%{buildroot}%{pylibdir}/distutils/sysconfig.py
# Switch all shebangs to refer to the specific Python version.
-LD_LIBRARY_PATH=. ./python Tools/scripts/pathfix.py -i
"%{_bindir}/python%{pybasever}" %{buildroot}
+LD_LIBRARY_PATH=./build/optimized ./build/optimized/python \
+ Tools/scripts/pathfix.py \
+ -i "%{_bindir}/python%{pybasever}" \
+ %{buildroot}
# Remove shebang lines from .py files that aren't executable, and
# remove executability from .py files that don't have a shebang line:
@@ -412,20 +603,21 @@ ldd %{buildroot}/%{dynload_dir}/_curses*.so \
| grep curses \
| grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
-# Copy up the gdb hooks into place; the python file will be autoloaded by gdb
-# when visiting libpython.so, provided that the python file is installed to the
-# same path as the library (or its .debug file) plus a "-gdb.py" suffix, e.g:
-# /usr/lib/debug/usr/lib64/libpython3.1.so.1.0.debug-gdb.py
-# (note that the debug path is /usr/lib/debug for both 32/64 bit)
-#
-# Initially I tried:
-# /usr/lib/libpython3.1.so.1.0-gdb.py
-# but doing so generated noise when ldconfig was rerun (rhbz:562980)
-#
-%if 0%{?with_gdb_hooks}
-mkdir -p %{buildroot}%{_prefix}/lib/debug/%{_libdir}
-cp %{SOURCE4} %{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug-gdb.py
-%endif # with_gdb_hooks
+# Ensure that the debug modules are linked against the debug libpython, and
+# likewise for the optimized modules and libpython:
+for Module in %{buildroot}/%{dynload_dir}/*.so ; do
+ case $Module in
+ *_d.so)
+ ldd $Module | grep %{py_INSTSONAME_optimized} &&
+ (echo Debug module $Module linked against optimized
%{py_INSTSONAME_optimized} ; exi 1)
+
+ ;;
+ *)
+ ldd $Module | grep %{py_INSTSONAME_debug} &&
+ (echo Optimized module $Module linked against debug
%{py_INSTSONAME_optimized} ; exi 1)
+ ;;
+ esac
+done
#
# Systemtap hooks:
@@ -435,23 +627,39 @@ cp %{SOURCE4}
%{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug
# library:
mkdir -p %{buildroot}%{tapsetdir}
%ifarch ppc64 s390x x86_64 ia64 alpha sparc64
-%global libpython_stp libpython%{pybasever}-64.stp
+%global libpython_stp_optimized libpython%{pybasever}-64.stp
+%global libpython_stp_debug libpython%{pybasever}-debug-64.stp
%else
-%global libpython_stp libpython%{pybasever}-32.stp
+%global libpython_stp_optimized libpython%{pybasever}-32.stp
+%global libpython_stp_debug libpython%{pybasever}-debug-32.stp
%endif
sed \
- -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME}|" \
- %{SOURCE5} \
- > %{buildroot}%{tapsetdir}/%{libpython_stp}
+ -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_optimized}|" \
+ %{SOURCE6} \
+ > %{buildroot}%{tapsetdir}/%{libpython_stp_optimized}
+
+sed \
+ -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_debug}|" \
+ %{SOURCE6} \
+ > %{buildroot}%{tapsetdir}/%{libpython_stp_debug}
+
%endif # with_systemtap
%check
+topdir=$(pwd)
+CheckPython() {
+ ConfName=$1
+ ConfDir=build/$ConfName
+
+ echo STARTING: CHECKING OF PYTHON FOR CONFIGURATION: $ConfName
+
# Run the upstream test suite, using the "runtests.sh" harness from the
upstream
# tarball.
# I'm seeing occasional hangs in some http tests when running the test suite
# inside Koji. For that reason I exclude them
-LD_LIBRARY_PATH=$(pwd) ./runtests.sh -x test_httplib test_http_cookies
+
+LD_LIBRARY_PATH=$ConfDir PYTHON=$ConfDir/python $topdir/runtests.sh -x test_httplib
test_http_cookies
# Note that we're running the tests using the version of the code in the builddir,
# not in the buildroot.
@@ -499,6 +707,15 @@ done
# Some additional tests fail when running the test suite as non-root outside of
# the build, due to permissions issues.
+ echo FINISHED: CHECKING OF PYTHON FOR CONFIGURATION: $ConfDir
+
+}
+
+# Check each of the configurations:
+CheckPython debug
+CheckPython optimized
+
+
%clean
rm -fr %{buildroot}
@@ -631,9 +848,9 @@ rm -fr %{buildroot}
%files libs
%defattr(-,root,root,-)
-%{_libdir}/%{py_INSTSONAME}
+%{_libdir}/%{py_INSTSONAME_optimized}
%if 0%{?with_systemtap}
-%{tapsetdir}/%{libpython_stp}
+%{tapsetdir}/%{libpython_stp_optimized}
%doc systemtap-example.stp pyfuntop.stp
%endif
@@ -647,7 +864,8 @@ rm -fr %{buildroot}
%{_bindir}/python3-config
%{_bindir}/python%{pybasever}-config
%{_libdir}/libpython%{pybasever}.so
-%{_libdir}/pkgconfig/python*.pc
+%{_libdir}/pkgconfig/python-%{pybasever}.pc
+%{_libdir}/pkgconfig/python3.pc
%config(noreplace) %{_sysconfdir}/rpm/macros.python3
%config(noreplace) %{_sysconfdir}/rpm/macros.pybytecompile
@@ -683,6 +901,112 @@ rm -fr %{buildroot}
%doc %{pylibdir}/Demo/md5test
%{pylibdir}/tkinter/test
+
+# We don't bother splitting the debug build out into further subpackages:
+# if you need it, you're probably a developer.
+
+# Hence the manifest is the combination of analogous files in the manifests of
+# all of the other subpackages
+
+%files debug
+%defattr(-,root,root,-)
+
+# Analog of the core subpackage's files:
+%{_bindir}/python3-debug
+%{_bindir}/python%{pybasever}-debug
+
+# ...with debug builds of the built-in "extension" modules:
+%{dynload_dir}/_bisectmodule_d.so
+%{dynload_dir}/_codecs_cn_d.so
+%{dynload_dir}/_codecs_hk_d.so
+%{dynload_dir}/_codecs_iso2022_d.so
+%{dynload_dir}/_codecs_jp_d.so
+%{dynload_dir}/_codecs_kr_d.so
+%{dynload_dir}/_codecs_tw_d.so
+%{dynload_dir}/_collectionsmodule_d.so
+%{dynload_dir}/_csv_d.so
+%{dynload_dir}/_ctypes_d.so
+%{dynload_dir}/_curses_d.so
+%{dynload_dir}/_curses_panel_d.so
+%{dynload_dir}/_dbm_d.so
+%{dynload_dir}/_elementtree_d.so
+%{dynload_dir}/_gdbmmodule_d.so
+%{dynload_dir}/_hashlib_d.so
+%{dynload_dir}/_heapqmodule_d.so
+%{dynload_dir}/_json_d.so
+%{dynload_dir}/_lsprof_d.so
+%{dynload_dir}/_multibytecodecmodule_d.so
+%{dynload_dir}/_multiprocessing_d.so
+%{dynload_dir}/_pickle_d.so
+%{dynload_dir}/_randommodule_d.so
+%{dynload_dir}/_sha1module_d.so
+%{dynload_dir}/_sha256module_d.so
+%{dynload_dir}/_sha512module_d.so
+%{dynload_dir}/_socketmodule_d.so
+%{dynload_dir}/_sqlite3_d.so
+%{dynload_dir}/_ssl_d.so
+%{dynload_dir}/_struct_d.so
+%{dynload_dir}/_weakref_d.so
+%{dynload_dir}/arraymodule_d.so
+%{dynload_dir}/atexitmodule_d.so
+%{dynload_dir}/audioop_d.so
+%{dynload_dir}/binascii_d.so
+%{dynload_dir}/bz2_d.so
+%{dynload_dir}/cmathmodule_d.so
+%{dynload_dir}/cryptmodule_d.so
+%{dynload_dir}/datetime_d.so
+%{dynload_dir}/fcntlmodule_d.so
+%{dynload_dir}/grpmodule_d.so
+%{dynload_dir}/itertoolsmodule_d.so
+%{dynload_dir}/mathmodule_d.so
+%{dynload_dir}/mmapmodule_d.so
+%{dynload_dir}/nismodule_d.so
+%{dynload_dir}/operator_d.so
+%{dynload_dir}/ossaudiodev_d.so
+%{dynload_dir}/parsermodule_d.so
+%{dynload_dir}/pyexpat_d.so
+%{dynload_dir}/readline_d.so
+%{dynload_dir}/resource_d.so
+%{dynload_dir}/selectmodule_d.so
+%{dynload_dir}/spwdmodule_d.so
+%{dynload_dir}/syslogmodule_d.so
+%{dynload_dir}/termios_d.so
+%{dynload_dir}/timemodule_d.so
+%{dynload_dir}/unicodedata_d.so
+%{dynload_dir}/xxsubtype_d.so
+%{dynload_dir}/zlibmodule_d.so
+
+# No need to split things out the "Makefile" and the config-32/64.h file as we
+# do for the regular build above (bug 531901), since they're all in one package
+# now; they're listed below, under "-devel":
+
+# Analog of the -libs subpackage's files:
+%{_libdir}/%{py_INSTSONAME_debug}
+%if 0%{?with_systemtap}
+%{tapsetdir}/%{libpython_stp_debug}
+%endif
+
+# Analog of the -devel subpackage's files:
+%dir %{pylibdir}/config-debug
+%{pylibdir}/config-debug/*
+%{_includedir}/python%{pybasever}-debug/*.h
+%{_bindir}/python3-debug-config
+%{_bindir}/python%{pybasever}-debug-config
+%{_libdir}/libpython%{pybasever}_d.so
+%{_libdir}/pkgconfig/python-%{pybasever}-debug.pc
+%{_libdir}/pkgconfig/python3-debug.pc
+
+# Analog of the -tools subpackage's files:
+# None for now; we could build precanned versions that have the appropriate
+# shebang if needed
+
+# Analog of the tkinter subpackage's files:
+%{dynload_dir}/_tkinter_d.so
+
+# Analog of the -test subpackage's files:
+%{dynload_dir}/_ctypes_test_d.so
+%{dynload_dir}/_testcapimodule_d.so
+
# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from
# ldconfig (rhbz:562980).
#
@@ -698,6 +1022,11 @@ rm -fr %{buildroot}
%changelog
+* Mon May 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-6
+- build and install two different configurations of Python 3: debug and
+standard, packaging the debug build in a new "python3-debug" subpackage
+(patch 103)
+
* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
- exclude test_http_cookies when running selftests, due to hang seen on
http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
commit bbd09cc947f95434d0e2484cac328a4a4355e8a2
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Tue Apr 13 17:36:08 2010 +0000
- exclude test_http_cookies when running selftests, due to hang seen on
http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled
after
11 hours)
- update python-gdb.py from v5 to py3k version submitted upstream
diff --git a/python-gdb.py b/python-gdb.py
index 640b7f6..dd6d462 100644
--- a/python-gdb.py
+++ b/python-gdb.py
@@ -19,9 +19,10 @@ giving file/line information and the state of local variables
In particular, given a gdb.Value corresponding to a PyObject* in the inferior
process, we can generate a "proxy value" within the gdb process. For example,
given a PyObject* in the inferior process that is in fact a PyListObject*
-holding three PyObject* that turn out to be PyStringObject* instances, we can
-generate a proxy value within the gdb process that is a list of strings:
- ["foo", "bar", "baz"]
+holding three PyObject* that turn out to be PyBytesObject* instances, we can
+generate a proxy value within the gdb process that is a list of bytes
+instances:
+ [b"foo", b"bar", b"baz"]
Doing so can be expensive for complicated graphs of objects, and could take
some time, so we also have a "write_repr" method that writes a representation
@@ -39,7 +40,7 @@ the type names are known to the debugger
The module also extends gdb with some python-specific commands.
'''
-
+from __future__ import with_statement
import gdb
# Look up the gdb.Type for some standard types:
@@ -57,7 +58,7 @@ Py_TPFLAGS_INT_SUBCLASS = (1L << 23)
Py_TPFLAGS_LONG_SUBCLASS = (1L << 24)
Py_TPFLAGS_LIST_SUBCLASS = (1L << 25)
Py_TPFLAGS_TUPLE_SUBCLASS = (1L << 26)
-Py_TPFLAGS_STRING_SUBCLASS = (1L << 27)
+Py_TPFLAGS_BYTES_SUBCLASS = (1L << 27)
Py_TPFLAGS_UNICODE_SUBCLASS = (1L << 28)
Py_TPFLAGS_DICT_SUBCLASS = (1L << 29)
Py_TPFLAGS_BASE_EXC_SUBCLASS = (1L << 30)
@@ -99,7 +100,7 @@ class TruncatedStringIO(object):
# Truncation:
self._val += data[0:self.maxlen - len(self._val)]
raise StringTruncated()
-
+
self._val += data
def getvalue(self):
@@ -108,7 +109,7 @@ class TruncatedStringIO(object):
class PyObjectPtr(object):
"""
Class wrapping a gdb.Value that's a either a (PyObject*) within the
- inferior process, or some subclass pointer e.g. (PyStringObject*)
+ inferior process, or some subclass pointer e.g. (PyBytesObject*)
There will be a subclass for every refined PyObject type that we care
about.
@@ -120,7 +121,7 @@ class PyObjectPtr(object):
def __init__(self, gdbval, cast_to=None):
if cast_to:
- self._gdbval = gdbval.cast(cast_to)
+ self._gdbval = gdbval.cast(cast_to)
else:
self._gdbval = gdbval
@@ -148,12 +149,8 @@ class PyObjectPtr(object):
return pyo_ptr.dereference()[name]
if name == 'ob_size':
- try:
- # Python 2:
- return self._gdbval.dereference()[name]
- except RuntimeError:
- # Python 3:
- return self._gdbval.dereference()['ob_base'][name]
+ pyo_ptr = self._gdbval.cast(PyVarObjectPtr.get_gdb_type())
+ return pyo_ptr.dereference()[name]
# General case: look it up inside the object:
return self._gdbval.dereference()[name]
@@ -318,8 +315,8 @@ class PyObjectPtr(object):
return PyListObjectPtr
if tp_flags & Py_TPFLAGS_TUPLE_SUBCLASS:
return PyTupleObjectPtr
- if tp_flags & Py_TPFLAGS_STRING_SUBCLASS:
- return PyStringObjectPtr
+ if tp_flags & Py_TPFLAGS_BYTES_SUBCLASS:
+ return PyBytesObjectPtr
if tp_flags & Py_TPFLAGS_UNICODE_SUBCLASS:
return PyUnicodeObjectPtr
if tp_flags & Py_TPFLAGS_DICT_SUBCLASS:
@@ -355,6 +352,8 @@ class PyObjectPtr(object):
def as_address(self):
return long(self._gdbval)
+class PyVarObjectPtr(PyObjectPtr):
+ _typename = 'PyVarObject'
class ProxyAlreadyVisited(object):
'''
@@ -365,7 +364,7 @@ class ProxyAlreadyVisited(object):
'''
def __init__(self, rep):
self._rep = rep
-
+
def __repr__(self):
return self._rep
@@ -407,7 +406,7 @@ class InstanceProxy(object):
else:
return '<%s at remote 0x%x>' % (self.cl_name,
self.address)
-
+
def _PyObject_VAR_SIZE(typeobj, nitems):
return ( ( typeobj.field('tp_basicsize') +
nitems * typeobj.field('tp_itemsize') +
@@ -446,7 +445,7 @@ class HeapTypeObjectPtr(PyObjectPtr):
pass
# Not found, or some kind of error:
- return None
+ return None
def proxyval(self, visited):
'''
@@ -515,20 +514,6 @@ class PyBaseExceptionObjectPtr(PyObjectPtr):
out.write(self.safe_tp_name())
self.write_field_repr('args', out, visited)
-class PyBoolObjectPtr(PyObjectPtr):
- """
- Class wrapping a gdb.Value that's a PyBoolObject* i.e. one of the two
- <bool> instances (Py_True/Py_False) within the process being debugged.
- """
- _typename = 'PyBoolObject'
-
- def proxyval(self, visited):
- if int_from_int(self.field('ob_ival')):
- return True
- else:
- return False
-
-
class PyClassObjectPtr(PyObjectPtr):
"""
Class wrapping a gdb.Value that's a PyClassObject* i.e. a <classobj>
@@ -548,7 +533,7 @@ class BuiltInMethodProxy(object):
def __init__(self, ml_name, pyop_m_self):
self.ml_name = ml_name
self.pyop_m_self = pyop_m_self
-
+
def __repr__(self):
return ('<built-in method %s of %s object at remote 0x%x>'
% (self.ml_name,
@@ -592,7 +577,7 @@ class PyCodeObjectPtr(PyObjectPtr):
# Initialize lineno to co_firstlineno as per PyCode_Addr2Line
# not 0, as lnotab_notes.txt has it:
- lineno = int_from_int(self.field('co_firstlineno'))
+ lineno = int_from_int(self.field('co_firstlineno'))
addr = 0
for addr_incr, line_incr in zip(co_lnotab[::2], co_lnotab[1::2]):
@@ -630,9 +615,9 @@ class PyDictObjectPtr(PyObjectPtr):
result = {}
for pyop_key, pyop_value in self.iteritems():
- proxy_key = pyop_key.proxyval(visited)
- proxy_value = pyop_value.proxyval(visited)
- result[proxy_key] = proxy_value
+ proxy_key = pyop_key.proxyval(visited)
+ proxy_value = pyop_value.proxyval(visited)
+ result[proxy_key] = proxy_value
return result
def write_repr(self, out, visited):
@@ -690,13 +675,6 @@ class PyInstanceObjectPtr(PyObjectPtr):
_write_instance_repr(out, visited,
cl_name, pyop_in_dict, self.as_address())
-
-class PyIntObjectPtr(PyObjectPtr):
- _typename = 'PyIntObject'
-
- def proxyval(self, visited):
- result = int_from_int(self.field('ob_ival'))
- return result
class PyListObjectPtr(PyObjectPtr):
_typename = 'PyListObject'
@@ -711,7 +689,7 @@ class PyListObjectPtr(PyObjectPtr):
if self.as_address() in visited:
return ProxyAlreadyVisited('[...]')
visited.add(self.as_address())
-
+
result = [PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
for i in safe_range(int_from_int(self.field('ob_size')))]
return result
@@ -770,6 +748,16 @@ class PyLongObjectPtr(PyObjectPtr):
result = -result
return result
+class PyBoolObjectPtr(PyLongObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyBoolObject* i.e. one of the two
+ <bool> instances (Py_True/Py_False) within the process being debugged.
+ """
+ def proxyval(self, visited):
+ if PyLongObjectPtr.proxyval(self, visited):
+ return True
+ else:
+ return False
class PyNoneStructPtr(PyObjectPtr):
"""
@@ -839,7 +827,7 @@ class PyFrameObjectPtr(PyObjectPtr):
'''
Look for the named local variable, returning a (PyObjectPtr, scope) pair
where scope is a string 'local', 'global', 'builtin'
-
+
If not found, return (None, None)
'''
for pyop_name, pyop_value in self.iter_locals():
@@ -861,9 +849,9 @@ class PyFrameObjectPtr(PyObjectPtr):
def current_line_num(self):
'''Get current line number as an integer (1-based)
-
+
Translated from PyFrame_GetLineNumber and PyCode_Addr2Line
-
+
See Objects/lnotab_notes.txt
'''
if self.is_optimized_out():
@@ -894,9 +882,9 @@ class PyFrameObjectPtr(PyObjectPtr):
return
out.write('Frame 0x%x, for file %s, line %i, in %s ('
% (self.as_address(),
- self.co_filename,
+ self.co_filename.proxyval(visited),
self.current_line_num(),
- self.co_name))
+ self.co_name.proxyval(visited)))
first = True
for pyop_name, pyop_value in self.iter_locals():
if not first:
@@ -906,7 +894,7 @@ class PyFrameObjectPtr(PyObjectPtr):
out.write(pyop_name.proxyval(visited))
out.write('=')
pyop_value.write_repr(out, visited)
-
+
out.write(')')
class PySetObjectPtr(PyObjectPtr):
@@ -958,8 +946,8 @@ class PySetObjectPtr(PyObjectPtr):
out.write('])')
-class PyStringObjectPtr(PyObjectPtr):
- _typename = 'PyStringObject'
+class PyBytesObjectPtr(PyObjectPtr):
+ _typename = 'PyBytesObject'
def __str__(self):
field_ob_size = self.field('ob_size')
@@ -1038,7 +1026,7 @@ def stringify(val):
# TODO: repr() puts everything on one line; pformat can be nicer, but
# can lead to v.long results; this function isolates the choice
if True:
- return repr(val)
+ return repr(val)
else:
from pprint import pformat
return pformat(val)
@@ -1065,7 +1053,7 @@ def pretty_printer_lookup(gdbval):
if type.code == gdb.TYPE_CODE_PTR:
type = type.target().unqualified()
t = str(type)
- if t in ("PyObject", "PyFrameObject"):
+ if t in ("PyObject", "PyFrameObject",
"PyUnicodeObject"):
return PyObjectPtrPrinter(gdbval)
"""
@@ -1099,7 +1087,7 @@ register (gdb.current_objfile ())
class Frame(object):
'''
- Wrapper for gdb.Frame, adding various methods
+ Wrapper for gdb.Frame, adding various methods
'''
def __init__(self, gdbframe):
self._gdbframe = gdbframe
@@ -1193,7 +1181,7 @@ class PyList(gdb.Command):
Use
py-list START
to list at a different line number within the python source.
-
+
Use
py-list START, END
to list a specific range of lines within the python source.
@@ -1252,8 +1240,8 @@ class PyList(gdb.Command):
if i + start == lineno:
linestr = '>' + linestr
sys.stdout.write('%4s %s' % (linestr, line))
-
-
+
+
# ...and register the command:
PyList()
diff --git a/python3.spec b/python3.spec
index 641f02d..9e119ff 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 4%{?dist}
+Release: 5%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -72,9 +72,12 @@ Source3: macros.pybytecompile
# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
# information
#
-# Downloaded from:
-#
http://bugs.python.org/issue8032
-# This is Tools/gdb/libpython.py from v5 of the patch
+# This is the version from
+#
http://bugs.python.org/issue8380
+#
+# This is Tools/gdb/libpython.py from:
+#
http://bugs.python.org/file16902/port-gdb7-hooks-to-py3k.patch
+# when applied to r80008 of the py3k branch
Source4: python-gdb.py
# Systemtap tapset to make it easier to use the systemtap static probes
@@ -446,9 +449,9 @@ sed \
%check
# Run the upstream test suite, using the "runtests.sh" harness from the
upstream
# tarball.
-# I'm seeing occasional hangs in "test_httplib" when running the test suite
inside
-# Koji. For that reason I exclude that one.
-LD_LIBRARY_PATH=$(pwd) ./runtests.sh -x test_httplib
+# I'm seeing occasional hangs in some http tests when running the test suite
+# inside Koji. For that reason I exclude them
+LD_LIBRARY_PATH=$(pwd) ./runtests.sh -x test_httplib test_http_cookies
# Note that we're running the tests using the version of the code in the builddir,
# not in the buildroot.
@@ -695,6 +698,12 @@ rm -fr %{buildroot}
%changelog
+* Tue Apr 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-5
+- exclude test_http_cookies when running selftests, due to hang seen on
+http://koji.fedoraproject.org/koji/taskinfo?taskID=2088463 (cancelled after
+11 hours)
+- update python-gdb.py from v5 to py3k version submitted upstream
+
* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
- update python-gdb.py from v4 to v5 (improving performance and stability,
adding commands)
commit 80325d9c24cee4e984a3a027edf402bc1f686a58
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Thu Apr 1 02:53:39 2010 +0000
update python-gdb.py from v4 to v5 (improving performance and stability,
adding commands)
diff --git a/python-gdb.py b/python-gdb.py
index 44099a9..640b7f6 100644
--- a/python-gdb.py
+++ b/python-gdb.py
@@ -23,6 +23,15 @@ holding three PyObject* that turn out to be PyStringObject* instances,
we can
generate a proxy value within the gdb process that is a list of strings:
["foo", "bar", "baz"]
+Doing so can be expensive for complicated graphs of objects, and could take
+some time, so we also have a "write_repr" method that writes a representation
+of the data to a file-like object. This allows us to stop the traversal by
+having the file-like object raise an exception if it gets too much data.
+
+With both "proxyval" and "write_repr" we keep track of the set of all
addresses
+visited so far in the traversal, to avoid infinite recursion due to cycles in
+the graph of object references.
+
We try to defer gdb.lookup_type() invocations for python types until as late as
possible: for a dynamically linked python binary, when the process starts in
the debugger, the libpython.so hasn't been dynamically loaded yet, so none of
@@ -55,6 +64,8 @@ Py_TPFLAGS_BASE_EXC_SUBCLASS = (1L << 30)
Py_TPFLAGS_TYPE_SUBCLASS = (1L << 31)
+MAX_OUTPUT_LEN=1024
+
class NullPyObjectPtr(RuntimeError):
pass
@@ -63,7 +74,7 @@ def safety_limit(val):
# Given a integer value from the process being debugged, limit it to some
# safety threshold so that arbitrary breakage within said process doesn't
# break the gdb process too much (e.g. sizes of iterations, sizes of lists)
- return min(val, 100)
+ return min(val, 1000)
def safe_range(val):
@@ -72,6 +83,28 @@ def safe_range(val):
return xrange(safety_limit(val))
+class StringTruncated(RuntimeError):
+ pass
+
+class TruncatedStringIO(object):
+ '''Similar to cStringIO, but can truncate the output by raising a
+ StringTruncated exception'''
+ def __init__(self, maxlen=None):
+ self._val = ''
+ self.maxlen = maxlen
+
+ def write(self, data):
+ if self.maxlen:
+ if len(data) + len(self._val) > self.maxlen:
+ # Truncation:
+ self._val += data[0:self.maxlen - len(self._val)]
+ raise StringTruncated()
+
+ self._val += data
+
+ def getvalue(self):
+ return self._val
+
class PyObjectPtr(object):
"""
Class wrapping a gdb.Value that's a either a (PyObject*) within the
@@ -125,12 +158,54 @@ class PyObjectPtr(object):
# General case: look it up inside the object:
return self._gdbval.dereference()[name]
+ def pyop_field(self, name):
+ '''
+ Get a PyObjectPtr for the given PyObject* field within this PyObject,
+ coping with some python 2 versus python 3 differences.
+ '''
+ return PyObjectPtr.from_pyobject_ptr(self.field(name))
+
+ def write_field_repr(self, name, out, visited):
+ '''
+ Extract the PyObject* field named "name", and write its representation
+ to file-like object "out"
+ '''
+ field_obj = self.pyop_field(name)
+ field_obj.write_repr(out, visited)
+
+ def get_truncated_repr(self, maxlen):
+ '''
+ Get a repr-like string for the data, but truncate it at "maxlen" bytes
+ (ending the object graph traversal as soon as you do)
+ '''
+ out = TruncatedStringIO(maxlen)
+ try:
+ self.write_repr(out, set())
+ except StringTruncated:
+ # Truncation occurred:
+ return out.getvalue() + '...(truncated)'
+
+ # No truncation occurred:
+ return out.getvalue()
+
def type(self):
return PyTypeObjectPtr(self.field('ob_type'))
def is_null(self):
return 0 == long(self._gdbval)
+ def is_optimized_out(self):
+ '''
+ Is the value of the underlying PyObject* visible to the debugger?
+
+ This can vary with the precise version of the compiler used to build
+ Python, and the precise version of gdb.
+
+ See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=556975 with
+ PyEval_EvalFrameEx's "f"
+ '''
+ return self._gdbval.is_optimized_out
+
def safe_tp_name(self):
try:
return self.type().field('tp_name').string()
@@ -180,6 +255,16 @@ class PyObjectPtr(object):
return FakeRepr(self.safe_tp_name(),
long(self._gdbval))
+ def write_repr(self, out, visited):
+ '''
+ Write a string representation of the value scraped from the inferior
+ process to "out", a file-like object.
+ '''
+ # Default implementation: generate a proxy value and write its repr
+ # However, this could involve a lot of work for complicated objects,
+ # so for derived classes we specialize this
+ return out.write(repr(self.proxyval(visited)))
+
@classmethod
def subclass_from_type(cls, t):
'''
@@ -217,6 +302,7 @@ class PyObjectPtr(object):
'frame': PyFrameObjectPtr,
'set' : PySetObjectPtr,
'frozenset' : PySetObjectPtr,
+ 'builtin_function_or_method' : PyCFunctionObjectPtr,
}
if tp_name in name_map:
return name_map[tp_name]
@@ -283,6 +369,28 @@ class ProxyAlreadyVisited(object):
def __repr__(self):
return self._rep
+
+def _write_instance_repr(out, visited, name, pyop_attrdict, address):
+ '''Shared code for use by old-style and new-style classes:
+ write a representation to file-like object "out"'''
+ out.write('<')
+ out.write(name)
+
+ # Write dictionary of instance attributes:
+ if isinstance(pyop_attrdict, PyDictObjectPtr):
+ out.write('(')
+ first = True
+ for pyop_arg, pyop_val in pyop_attrdict.iteritems():
+ if not first:
+ out.write(', ')
+ first = False
+ out.write(pyop_arg.proxyval(visited))
+ out.write('=')
+ pyop_val.write_repr(out, visited)
+ out.write(')')
+ out.write(' at remote 0x%x>' % address)
+
+
class InstanceProxy(object):
def __init__(self, cl_name, attrdict, address):
@@ -299,8 +407,7 @@ class InstanceProxy(object):
else:
return '<%s at remote 0x%x>' % (self.cl_name,
self.address)
-
-
+
def _PyObject_VAR_SIZE(typeobj, nitems):
return ( ( typeobj.field('tp_basicsize') +
nitems * typeobj.field('tp_itemsize') +
@@ -311,19 +418,11 @@ def _PyObject_VAR_SIZE(typeobj, nitems):
class HeapTypeObjectPtr(PyObjectPtr):
_typename = 'PyObject'
- def proxyval(self, visited):
+ def get_attr_dict(self):
'''
- Support for new-style classes.
-
- Currently we just locate the dictionary using a transliteration to
- python of _PyObject_GetDictPtr, ignoring descriptors
+ Get the PyDictObject ptr representing the attribute dictionary
+ (or None if there's a problem)
'''
- # Guard against infinite loops:
- if self.as_address() in visited:
- return ProxyAlreadyVisited('<...>')
- visited.add(self.as_address())
-
- attr_dict = {}
try:
typeobj = self.type()
dictoffset = int_from_int(typeobj.field('tp_dictoffset'))
@@ -341,16 +440,47 @@ class HeapTypeObjectPtr(PyObjectPtr):
dictptr = self._gdbval.cast(_type_char_ptr) + dictoffset
PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer()
dictptr = dictptr.cast(PyObjectPtrPtr)
- attr_dict =
PyObjectPtr.from_pyobject_ptr(dictptr.dereference()).proxyval(visited)
+ return PyObjectPtr.from_pyobject_ptr(dictptr.dereference())
except RuntimeError:
# Corrupt data somewhere; fail safe
pass
+ # Not found, or some kind of error:
+ return None
+
+ def proxyval(self, visited):
+ '''
+ Support for new-style classes.
+
+ Currently we just locate the dictionary using a transliteration to
+ python of _PyObject_GetDictPtr, ignoring descriptors
+ '''
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('<...>')
+ visited.add(self.as_address())
+
+ pyop_attr_dict = self.get_attr_dict()
+ if pyop_attr_dict:
+ attr_dict = pyop_attr_dict.proxyval(visited)
+ else:
+ attr_dict = {}
tp_name = self.safe_tp_name()
# New-style class:
return InstanceProxy(tp_name, attr_dict, long(self._gdbval))
+ def write_repr(self, out, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ out.write('<...>')
+ return
+ visited.add(self.as_address())
+
+ pyop_attrdict = self.get_attr_dict()
+ _write_instance_repr(out, visited,
+ self.safe_tp_name(), pyop_attrdict, self.as_address())
+
class ProxyException(Exception):
def __init__(self, tp_name, args):
self.tp_name = tp_name
@@ -371,10 +501,20 @@ class PyBaseExceptionObjectPtr(PyObjectPtr):
if self.as_address() in visited:
return ProxyAlreadyVisited('(...)')
visited.add(self.as_address())
- arg_proxy =
PyObjectPtr.from_pyobject_ptr(self.field('args')).proxyval(visited)
+ arg_proxy = self.pyop_field('args').proxyval(visited)
return ProxyException(self.safe_tp_name(),
arg_proxy)
+ def write_repr(self, out, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ out.write('(...)')
+ return
+ visited.add(self.as_address())
+
+ out.write(self.safe_tp_name())
+ self.write_field_repr('args', out, visited)
+
class PyBoolObjectPtr(PyObjectPtr):
"""
Class wrapping a gdb.Value that's a PyBoolObject* i.e. one of the two
@@ -397,6 +537,43 @@ class PyClassObjectPtr(PyObjectPtr):
_typename = 'PyClassObject'
+class BuiltInFunctionProxy(object):
+ def __init__(self, ml_name):
+ self.ml_name = ml_name
+
+ def __repr__(self):
+ return "<built-in function %s>" % self.ml_name
+
+class BuiltInMethodProxy(object):
+ def __init__(self, ml_name, pyop_m_self):
+ self.ml_name = ml_name
+ self.pyop_m_self = pyop_m_self
+
+ def __repr__(self):
+ return ('<built-in method %s of %s object at remote 0x%x>'
+ % (self.ml_name,
+ self.pyop_m_self.safe_tp_name(),
+ self.pyop_m_self.as_address())
+ )
+
+class PyCFunctionObjectPtr(PyObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyCFunctionObject*
+ (see Include/methodobject.h and Objects/methodobject.c)
+ """
+ _typename = 'PyCFunctionObject'
+
+ def proxyval(self, visited):
+ m_ml = self.field('m_ml') # m_ml is a (PyMethodDef*)
+ ml_name = m_ml['ml_name'].string()
+
+ pyop_m_self = self.pyop_field('m_self')
+ if pyop_m_self.is_null():
+ return BuiltInFunctionProxy(ml_name)
+ else:
+ return BuiltInMethodProxy(ml_name, pyop_m_self)
+
+
class PyCodeObjectPtr(PyObjectPtr):
"""
Class wrapping a gdb.Value that's a PyCodeObject* i.e. a <code> instance
@@ -411,7 +588,7 @@ class PyCodeObjectPtr(PyObjectPtr):
Analogous to PyCode_Addr2Line; translated from pseudocode in
Objects/lnotab_notes.txt
'''
- co_lnotab =
PyObjectPtr.from_pyobject_ptr(self.field('co_lnotab')).proxyval(set())
+ co_lnotab = self.pyop_field('co_lnotab').proxyval(set())
# Initialize lineno to co_firstlineno as per PyCode_Addr2Line
# not 0, as lnotab_notes.txt has it:
@@ -425,6 +602,7 @@ class PyCodeObjectPtr(PyObjectPtr):
lineno += ord(line_incr)
return lineno
+
class PyDictObjectPtr(PyObjectPtr):
"""
Class wrapping a gdb.Value that's a PyDictObject* i.e. a dict instance
@@ -432,6 +610,18 @@ class PyDictObjectPtr(PyObjectPtr):
"""
_typename = 'PyDictObject'
+ def iteritems(self):
+ '''
+ Yields a sequence of (PyObjectPtr key, PyObjectPtr value) pairs,
+ analagous to dict.iteritems()
+ '''
+ for i in safe_range(self.field('ma_mask') + 1):
+ ep = self.field('ma_table') + i
+ pyop_value = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
+ if not pyop_value.is_null():
+ pyop_key = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
+ yield (pyop_key, pyop_value)
+
def proxyval(self, visited):
# Guard against infinite loops:
if self.as_address() in visited:
@@ -439,14 +629,29 @@ class PyDictObjectPtr(PyObjectPtr):
visited.add(self.as_address())
result = {}
- for i in safe_range(self.field('ma_mask') + 1):
- ep = self.field('ma_table') + i
- pvalue = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
- if not pvalue.is_null():
- pkey = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
- result[pkey.proxyval(visited)] = pvalue.proxyval(visited)
+ for pyop_key, pyop_value in self.iteritems():
+ proxy_key = pyop_key.proxyval(visited)
+ proxy_value = pyop_value.proxyval(visited)
+ result[proxy_key] = proxy_value
return result
+ def write_repr(self, out, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ out.write('{...}')
+ return
+ visited.add(self.as_address())
+
+ out.write('{')
+ first = True
+ for pyop_key, pyop_value in self.iteritems():
+ if not first:
+ out.write(', ')
+ first = False
+ pyop_key.write_repr(out, visited)
+ out.write(': ')
+ pyop_value.write_repr(out, visited)
+ out.write('}')
class PyInstanceObjectPtr(PyObjectPtr):
_typename = 'PyInstanceObject'
@@ -458,16 +663,34 @@ class PyInstanceObjectPtr(PyObjectPtr):
visited.add(self.as_address())
# Get name of class:
- in_class = PyObjectPtr.from_pyobject_ptr(self.field('in_class'))
- cl_name =
PyObjectPtr.from_pyobject_ptr(in_class.field('cl_name')).proxyval(visited)
+ in_class = self.pyop_field('in_class')
+ cl_name = in_class.pyop_field('cl_name').proxyval(visited)
# Get dictionary of instance attributes:
- in_dict =
PyObjectPtr.from_pyobject_ptr(self.field('in_dict')).proxyval(visited)
+ in_dict = self.pyop_field('in_dict').proxyval(visited)
# Old-style class:
return InstanceProxy(cl_name, in_dict, long(self._gdbval))
+ def write_repr(self, out, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ out.write('<...>')
+ return
+ visited.add(self.as_address())
+
+ # Old-style class:
+
+ # Get name of class:
+ in_class = self.pyop_field('in_class')
+ cl_name = in_class.pyop_field('cl_name').proxyval(visited)
+
+ # Get dictionary of instance attributes:
+ pyop_in_dict = self.pyop_field('in_dict')
+ _write_instance_repr(out, visited,
+ cl_name, pyop_in_dict, self.as_address())
+
class PyIntObjectPtr(PyObjectPtr):
_typename = 'PyIntObject'
@@ -493,6 +716,20 @@ class PyListObjectPtr(PyObjectPtr):
for i in safe_range(int_from_int(self.field('ob_size')))]
return result
+ def write_repr(self, out, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ out.write('[...]')
+ return
+ visited.add(self.as_address())
+
+ out.write('[')
+ for i in safe_range(int_from_int(self.field('ob_size'))):
+ if i > 0:
+ out.write(', ')
+ element = PyObjectPtr.from_pyobject_ptr(self[i])
+ element.write_repr(out, visited)
+ out.write(']')
class PyLongObjectPtr(PyObjectPtr):
_typename = 'PyLongObject'
@@ -524,7 +761,6 @@ class PyLongObjectPtr(PyObjectPtr):
if gdb.lookup_type('digit').sizeof == 2:
SHIFT = 15L
else:
- # FIXME: I haven't yet tested this case
SHIFT = 30L
digits = [long(ob_digit[i]) * 2**(SHIFT*i)
@@ -549,10 +785,129 @@ class PyNoneStructPtr(PyObjectPtr):
class PyFrameObjectPtr(PyObjectPtr):
_typename = 'PyFrameObject'
- def __str__(self):
- fi = FrameInfo(self)
- return str(fi)
+ def __init__(self, gdbval, cast_to):
+ PyObjectPtr.__init__(self, gdbval, cast_to)
+
+ if not self.is_optimized_out():
+ self.co = PyCodeObjectPtr.from_pyobject_ptr(self.field('f_code'))
+ self.co_name = self.co.pyop_field('co_name')
+ self.co_filename = self.co.pyop_field('co_filename')
+
+ self.f_lineno = int_from_int(self.field('f_lineno'))
+ self.f_lasti = int_from_int(self.field('f_lasti'))
+ self.co_nlocals = int_from_int(self.co.field('co_nlocals'))
+ self.co_varnames =
PyTupleObjectPtr.from_pyobject_ptr(self.co.field('co_varnames'))
+
+ def iter_locals(self):
+ '''
+ Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
+ the local variables of this frame
+ '''
+ if self.is_optimized_out():
+ return
+
+ f_localsplus = self.field('f_localsplus')
+ for i in safe_range(self.co_nlocals):
+ pyop_value = PyObjectPtr.from_pyobject_ptr(f_localsplus[i])
+ if not pyop_value.is_null():
+ pyop_name = PyObjectPtr.from_pyobject_ptr(self.co_varnames[i])
+ yield (pyop_name, pyop_value)
+ def iter_globals(self):
+ '''
+ Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
+ the global variables of this frame
+ '''
+ if self.is_optimized_out():
+ return
+
+ pyop_globals = self.pyop_field('f_globals')
+ return pyop_globals.iteritems()
+
+ def iter_builtins(self):
+ '''
+ Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
+ the builtin variables
+ '''
+ if self.is_optimized_out():
+ return
+
+ pyop_builtins = self.pyop_field('f_builtins')
+ return pyop_builtins.iteritems()
+
+ def get_var_by_name(self, name):
+ '''
+ Look for the named local variable, returning a (PyObjectPtr, scope) pair
+ where scope is a string 'local', 'global', 'builtin'
+
+ If not found, return (None, None)
+ '''
+ for pyop_name, pyop_value in self.iter_locals():
+ if name == pyop_name.proxyval(set()):
+ return pyop_value, 'local'
+ for pyop_name, pyop_value in self.iter_globals():
+ if name == pyop_name.proxyval(set()):
+ return pyop_value, 'global'
+ for pyop_name, pyop_value in self.iter_builtins():
+ if name == pyop_name.proxyval(set()):
+ return pyop_value, 'builtin'
+ return None, None
+
+ def filename(self):
+ '''Get the path of the current Python source file, as a
string'''
+ if self.is_optimized_out():
+ return '(frame information optimized out)'
+ return self.co_filename.proxyval(set())
+
+ def current_line_num(self):
+ '''Get current line number as an integer (1-based)
+
+ Translated from PyFrame_GetLineNumber and PyCode_Addr2Line
+
+ See Objects/lnotab_notes.txt
+ '''
+ if self.is_optimized_out():
+ return None
+ f_trace = self.field('f_trace')
+ if long(f_trace) != 0:
+ # we have a non-NULL f_trace:
+ return self.f_lineno
+ else:
+ #try:
+ return self.co.addr2line(self.f_lasti)
+ #except ValueError:
+ # return self.f_lineno
+
+ def current_line(self):
+ '''Get the text of the current source line as a string, with a
trailing
+ newline character'''
+ if self.is_optimized_out():
+ return '(frame information optimized out)'
+ with open(self.filename(), 'r') as f:
+ all_lines = f.readlines()
+ # Convert from 1-based current_line_num to 0-based list offset:
+ return all_lines[self.current_line_num()-1]
+
+ def write_repr(self, out, visited):
+ if self.is_optimized_out():
+ out.write('(frame information optimized out)')
+ return
+ out.write('Frame 0x%x, for file %s, line %i, in %s ('
+ % (self.as_address(),
+ self.co_filename,
+ self.current_line_num(),
+ self.co_name))
+ first = True
+ for pyop_name, pyop_value in self.iter_locals():
+ if not first:
+ out.write(', ')
+ first = False
+
+ out.write(pyop_name.proxyval(visited))
+ out.write('=')
+ pyop_value.write_repr(out, visited)
+
+ out.write(')')
class PySetObjectPtr(PyObjectPtr):
_typename = 'PySetObject'
@@ -577,6 +932,32 @@ class PySetObjectPtr(PyObjectPtr):
else:
return set(members)
+ def write_repr(self, out, visited):
+ out.write(self.safe_tp_name())
+
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ out.write('(...)')
+ return
+ visited.add(self.as_address())
+
+ out.write('([')
+ first = True
+ table = self.field('table')
+ for i in safe_range(self.field('mask')+1):
+ setentry = table[i]
+ key = setentry['key']
+ if key != 0:
+ pyop_key = PyObjectPtr.from_pyobject_ptr(key)
+ key_proxy = pyop_key.proxyval(visited) # FIXME!
+ if key_proxy != '<dummy key>':
+ if not first:
+ out.write(', ')
+ first = False
+ pyop_key.write_repr(out, visited)
+ out.write('])')
+
+
class PyStringObjectPtr(PyObjectPtr):
_typename = 'PyStringObject'
@@ -589,7 +970,6 @@ class PyStringObjectPtr(PyObjectPtr):
def proxyval(self, visited):
return str(self)
-
class PyTupleObjectPtr(PyObjectPtr):
_typename = 'PyTupleObject'
@@ -608,6 +988,23 @@ class PyTupleObjectPtr(PyObjectPtr):
for i in
safe_range(int_from_int(self.field('ob_size')))])
return result
+ def write_repr(self, out, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ out.write('(...)')
+ return
+ visited.add(self.as_address())
+
+ out.write('(')
+ for i in safe_range(int_from_int(self.field('ob_size'))):
+ if i > 0:
+ out.write(', ')
+ element = PyObjectPtr.from_pyobject_ptr(self[i])
+ element.write_repr(out, visited)
+ if self.field('ob_size') == 1:
+ out.write(',)')
+ else:
+ out.write(')')
class PyTypeObjectPtr(PyObjectPtr):
_typename = 'PyTypeObject'
@@ -641,77 +1038,12 @@ def stringify(val):
# TODO: repr() puts everything on one line; pformat can be nicer, but
# can lead to v.long results; this function isolates the choice
if True:
- return repr(val)
+ return repr(val)
else:
from pprint import pformat
return pformat(val)
-class FrameInfo:
- '''
- Class representing all of the information we can scrape about a
- PyFrameObject*
- '''
- def __init__(self, fval):
- self.fval = fval
- self.co = PyCodeObjectPtr.from_pyobject_ptr(fval.field('f_code'))
- self.co_name = PyObjectPtr.from_pyobject_ptr(self.co.field('co_name'))
- self.co_filename =
PyObjectPtr.from_pyobject_ptr(self.co.field('co_filename'))
- self.f_lineno = int_from_int(fval.field('f_lineno'))
- self.f_lasti = int_from_int(fval.field('f_lasti'))
- self.co_nlocals = int_from_int(self.co.field('co_nlocals'))
- self.co_varnames =
PyTupleObjectPtr.from_pyobject_ptr(self.co.field('co_varnames'))
- self.locals = [] # list of kv pairs
- f_localsplus = self.fval.field('f_localsplus')
- for i in safe_range(self.co_nlocals):
- #print 'i=%i' % i
- value = PyObjectPtr.from_pyobject_ptr(f_localsplus[i])
- if not value.is_null():
- name = PyObjectPtr.from_pyobject_ptr(self.co_varnames[i])
- #print 'name=%s' % name
- value = value.proxyval(set())
- #print 'value=%s' % value
- self.locals.append((str(name), value))
-
- def filename(self):
- '''Get the path of the current Python source file, as a
string'''
- return self.co_filename.proxyval(set())
-
- def current_line_num(self):
- '''Get current line number as an integer (1-based)
-
- Translated from PyFrame_GetLineNumber and PyCode_Addr2Line
-
- See Objects/lnotab_notes.txt
- '''
- f_trace = self.fval.field('f_trace')
- if long(f_trace) != 0:
- # we have a non-NULL f_trace:
- return self.f_lineno
- else:
- #try:
- return self.co.addr2line(self.f_lasti)
- #except ValueError:
- # return self.f_lineno
-
- def current_line(self):
- '''Get the text of the current source line as a string, with a
trailing
- newline character'''
- with open(self.filename(), 'r') as f:
- all_lines = f.readlines()
- # Convert from 1-based current_line_num to 0-based list offset:
- return all_lines[self.current_line_num()-1]
-
- def __str__(self):
- return ('Frame 0x%x, for file %s, line %i, in %s (%s)'
- % (long(self.fval._gdbval),
- self.co_filename,
- self.current_line_num(),
- self.co_name,
- ', '.join(['%s=%s' % (k, stringify(v)) for k, v in
self.locals]))
- )
-
-
class PyObjectPtrPrinter:
"Prints a (PyObject*)"
@@ -719,29 +1051,22 @@ class PyObjectPtrPrinter:
self.gdbval = gdbval
def to_string (self):
- proxyval = PyObjectPtr.from_pyobject_ptr(self.gdbval).proxyval(set())
- return stringify(proxyval)
-
-
-class PyFrameObjectPtrPrinter(PyObjectPtrPrinter):
- "Prints a (PyFrameObject*)"
-
- def to_string (self):
pyop = PyObjectPtr.from_pyobject_ptr(self.gdbval)
- fi = FrameInfo(pyop)
- return str(fi)
-
+ if True:
+ return pyop.get_truncated_repr(MAX_OUTPUT_LEN)
+ else:
+ # Generate full proxy value then stringify it.
+ # Doing so could be expensive
+ proxyval = pyop.proxyval(set())
+ return stringify(proxyval)
def pretty_printer_lookup(gdbval):
type = gdbval.type.unqualified()
if type.code == gdb.TYPE_CODE_PTR:
type = type.target().unqualified()
t = str(type)
- if t == "PyObject":
+ if t in ("PyObject", "PyFrameObject"):
return PyObjectPtrPrinter(gdbval)
- elif t == "PyFrameObject":
- return PyFrameObjectPtrPrinter(gdbval)
-
"""
During development, I've been manually invoking the code in this way:
@@ -771,29 +1096,96 @@ def register (obj):
register (gdb.current_objfile ())
-def get_python_frame(gdb_frame):
- try:
- f = gdb_frame.read_var('f')
- return PyFrameObjectPtr.from_pyobject_ptr(f)
- except ValueError:
- return None
-def get_selected_python_frame():
- '''Try to obtain a (gdbframe, PyFrameObjectPtr) pair for the
- currently-running python code, or (None, None)'''
- gdb_frame = gdb.selected_frame()
- while gdb_frame:
- if (gdb_frame.function() is None or
- gdb_frame.function().name != 'PyEval_EvalFrameEx'):
- gdb_frame = gdb_frame.older()
- continue
+class Frame(object):
+ '''
+ Wrapper for gdb.Frame, adding various methods
+ '''
+ def __init__(self, gdbframe):
+ self._gdbframe = gdbframe
+
+ def older(self):
+ older = self._gdbframe.older()
+ if older:
+ return Frame(older)
+ else:
+ return None
+ def newer(self):
+ newer = self._gdbframe.newer()
+ if newer:
+ return Frame(newer)
+ else:
+ return None
+
+ def select(self):
+ self._gdbframe.select()
+
+ def get_index(self):
+ '''Calculate index of frame, starting at 0 for the newest frame
within
+ this thread'''
+ index = 0
+ # Go down until you reach the newest frame:
+ iter_frame = self
+ while iter_frame.newer():
+ index += 1
+ iter_frame = iter_frame.newer()
+ return index
+
+ def is_evalframeex(self):
+ if self._gdbframe.function():
+ if self._gdbframe.function().name == 'PyEval_EvalFrameEx':
+ '''
+ I believe we also need to filter on the inline
+ struct frame_id.inline_depth, only regarding frames with
+ an inline depth of 0 as actually being this function
+
+ So we reject those with type gdb.INLINE_FRAME
+ '''
+ if self._gdbframe.type() == gdb.NORMAL_FRAME:
+ # We have a PyEval_EvalFrameEx frame:
+ return True
+
+ return False
+
+ def get_pyop(self):
try:
- f = gdb_frame.read_var('f')
- return gdb_frame, PyFrameObjectPtr.from_pyobject_ptr(f)
+ f = self._gdbframe.read_var('f')
+ return PyFrameObjectPtr.from_pyobject_ptr(f)
except ValueError:
- gdb_frame = gdb_frame.older()
- return None, None
+ return None
+
+ @classmethod
+ def get_selected_frame(cls):
+ _gdbframe = gdb.selected_frame()
+ if _gdbframe:
+ return Frame(_gdbframe)
+ return None
+
+ @classmethod
+ def get_selected_python_frame(cls):
+ '''Try to obtain the Frame for the python code in the selected
frame,
+ or None'''
+ frame = cls.get_selected_frame()
+
+ while frame:
+ if frame.is_evalframeex():
+ return frame
+ frame = frame.older()
+
+ # Not found:
+ return None
+
+ def print_summary(self):
+ if self.is_evalframeex():
+ pyop = self.get_pyop()
+ if pyop:
+ sys.stdout.write('#%i %s\n' % (self.get_index(),
pyop.get_truncated_repr(MAX_OUTPUT_LEN)))
+ sys.stdout.write(pyop.current_line())
+ else:
+ sys.stdout.write('#%i (unable to read python frame
information)\n' % self.get_index())
+ else:
+ sys.stdout.write('#%i\n' % self.get_index())
class PyList(gdb.Command):
'''List the current Python source code, if any
@@ -829,14 +1221,18 @@ class PyList(gdb.Command):
if m:
start, end = map(int, m.groups())
- gdb_frame, py_frame = get_selected_python_frame()
- if not py_frame:
+ frame = Frame.get_selected_python_frame()
+ if not frame:
print 'Unable to locate python frame'
return
- fi = FrameInfo(py_frame)
- filename = fi.filename()
- lineno = fi.current_line_num()
+ pyop = frame.get_pyop()
+ if not pyop:
+ print 'Unable to read information on python frame'
+ return
+
+ filename = pyop.filename()
+ lineno = pyop.current_line_num()
if start is None:
start = lineno - 5
@@ -851,7 +1247,11 @@ class PyList(gdb.Command):
# so [start-1:end] as a python slice gives us [start, end] as a
# closed interval
for i, line in enumerate(all_lines[start-1:end]):
- sys.stdout.write('%4s %s' % (i+start, line))
+ linestr = str(i+start)
+ # Highlight current line:
+ if i + start == lineno:
+ linestr = '>' + linestr
+ sys.stdout.write('%4s %s' % (linestr, line))
# ...and register the command:
@@ -859,27 +1259,23 @@ PyList()
def move_in_stack(move_up):
'''Move up or down the stack (for the py-up/py-down
command)'''
- gdb_frame, py_frame = get_selected_python_frame()
- while gdb_frame:
+ frame = Frame.get_selected_python_frame()
+ while frame:
if move_up:
- iter_frame = gdb_frame.older()
+ iter_frame = frame.older()
else:
- iter_frame = gdb_frame.newer()
+ iter_frame = frame.newer()
if not iter_frame:
break
- if (iter_frame.function() and
- iter_frame.function().name == 'PyEval_EvalFrameEx'):
+ if iter_frame.is_evalframeex():
# Result:
iter_frame.select()
- py_frame = get_python_frame(iter_frame)
- fi = FrameInfo(py_frame)
- print fi
- sys.stdout.write(fi.current_line())
+ iter_frame.print_summary()
return
- gdb_frame = iter_frame
+ frame = iter_frame
if move_up:
print 'Unable to find an older python frame'
@@ -924,18 +1320,73 @@ class PyBacktrace(gdb.Command):
def invoke(self, args, from_tty):
- gdb_frame, py_frame = get_selected_python_frame()
- while gdb_frame:
- gdb_frame = gdb_frame.older()
+ frame = Frame.get_selected_python_frame()
+ while frame:
+ if frame.is_evalframeex():
+ frame.print_summary()
+ frame = frame.older()
- if not gdb_frame:
- break
+PyBacktrace()
- if (gdb_frame.function() and
- gdb_frame.function().name == 'PyEval_EvalFrameEx'):
- py_frame = get_python_frame(gdb_frame)
- fi = FrameInfo(py_frame)
- print ' ', fi
- sys.stdout.write(fi.current_line())
+class PyPrint(gdb.Command):
+ 'Look up the given python variable name, and print it'
+ def __init__(self):
+ gdb.Command.__init__ (self,
+ "py-print",
+ gdb.COMMAND_DATA,
+ gdb.COMPLETE_NONE)
-PyBacktrace()
+
+ def invoke(self, args, from_tty):
+ name = str(args)
+
+ frame = Frame.get_selected_python_frame()
+ if not frame:
+ print 'Unable to locate python frame'
+ return
+
+ pyop_frame = frame.get_pyop()
+ if not pyop_frame:
+ print 'Unable to read information on python frame'
+ return
+
+ pyop_var, scope = pyop_frame.get_var_by_name(name)
+
+ if pyop_var:
+ print ('%s %r = %s'
+ % (scope,
+ name,
+ pyop_var.get_truncated_repr(MAX_OUTPUT_LEN)))
+ else:
+ print '%r not found' % name
+
+PyPrint()
+
+class PyLocals(gdb.Command):
+ 'Look up the given python variable name, and print it'
+ def __init__(self):
+ gdb.Command.__init__ (self,
+ "py-locals",
+ gdb.COMMAND_DATA,
+ gdb.COMPLETE_NONE)
+
+
+ def invoke(self, args, from_tty):
+ name = str(args)
+
+ frame = Frame.get_selected_python_frame()
+ if not frame:
+ print 'Unable to locate python frame'
+ return
+
+ pyop_frame = frame.get_pyop()
+ if not pyop_frame:
+ print 'Unable to read information on python frame'
+ return
+
+ for pyop_name, pyop_value in pyop_frame.iter_locals():
+ print ('%s = %s'
+ % (pyop_name.proxyval(set()),
+ pyop_value.get_truncated_repr(MAX_OUTPUT_LEN)))
+
+PyLocals()
diff --git a/python3.spec b/python3.spec
index c106b67..641f02d 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 3%{?dist}
+Release: 4%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -74,7 +74,7 @@ Source3: macros.pybytecompile
#
# Downloaded from:
#
http://bugs.python.org/issue8032
-# This is Tools/gdb/libpython.py from v4 of the patch
+# This is Tools/gdb/libpython.py from v5 of the patch
Source4: python-gdb.py
# Systemtap tapset to make it easier to use the systemtap static probes
@@ -695,6 +695,10 @@ rm -fr %{buildroot}
%changelog
+* Wed Mar 31 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-4
+- update python-gdb.py from v4 to v5 (improving performance and stability,
+adding commands)
+
* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
commit da0826ad3b0eb43fced4ade908a2dffee15e426b
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Thu Mar 25 20:38:13 2010 +0000
- update python-gdb.py from v3 to v4 (fixing infinite recursion on
reference cycles and tracebacks on bytes 0x80-0xff in strings, adding
handlers for sets and exceptions)
diff --git a/python-gdb.py b/python-gdb.py
index 204dde3..44099a9 100644
--- a/python-gdb.py
+++ b/python-gdb.py
@@ -35,6 +35,7 @@ import gdb
# Look up the gdb.Type for some standard types:
_type_char_ptr = gdb.lookup_type('char').pointer() # char*
+_type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned
char*
_type_void_ptr = gdb.lookup_type('void').pointer() # void*
_type_size_t = gdb.lookup_type('size_t')
@@ -140,7 +141,7 @@ class PyObjectPtr(object):
# Can't even read the object at all?
return 'unknown'
- def proxyval(self):
+ def proxyval(self, visited):
'''
Scrape a value from the inferior process, and try to represent it
within the gdb process, whilst (hopefully) avoiding crashes when
@@ -150,6 +151,11 @@ class PyObjectPtr(object):
For example, a PyIntObject* with ob_ival 42 in the inferior process
should result in an int(42) in this process.
+
+ visited: a set of all gdb.Value pyobject pointers already visited
+ whilst generating this value (to guard against infinite recursion when
+ visiting object graphs with loops). Analogous to Py_ReprEnter and
+ Py_ReprLeave
'''
class FakeRepr(object):
@@ -209,6 +215,8 @@ class PyObjectPtr(object):
'instance': PyInstanceObjectPtr,
'NoneType': PyNoneStructPtr,
'frame': PyFrameObjectPtr,
+ 'set' : PySetObjectPtr,
+ 'frozenset' : PySetObjectPtr,
}
if tp_name in name_map:
return name_map[tp_name]
@@ -230,8 +238,8 @@ class PyObjectPtr(object):
return PyUnicodeObjectPtr
if tp_flags & Py_TPFLAGS_DICT_SUBCLASS:
return PyDictObjectPtr
- #if tp_flags & Py_TPFLAGS_BASE_EXC_SUBCLASS:
- # return something
+ if tp_flags & Py_TPFLAGS_BASE_EXC_SUBCLASS:
+ return PyBaseExceptionObjectPtr
#if tp_flags & Py_TPFLAGS_TYPE_SUBCLASS:
# return PyTypeObjectPtr
@@ -258,6 +266,22 @@ class PyObjectPtr(object):
def get_gdb_type(cls):
return gdb.lookup_type(cls._typename).pointer()
+ def as_address(self):
+ return long(self._gdbval)
+
+
+class ProxyAlreadyVisited(object):
+ '''
+ Placeholder proxy to use when protecting against infinite recursion due to
+ loops in the object graph.
+
+ Analogous to the values emitted by the users of Py_ReprEnter and Py_ReprLeave
+ '''
+ def __init__(self, rep):
+ self._rep = rep
+
+ def __repr__(self):
+ return self._rep
class InstanceProxy(object):
@@ -287,15 +311,19 @@ def _PyObject_VAR_SIZE(typeobj, nitems):
class HeapTypeObjectPtr(PyObjectPtr):
_typename = 'PyObject'
- def proxyval(self):
+ def proxyval(self, visited):
'''
Support for new-style classes.
Currently we just locate the dictionary using a transliteration to
python of _PyObject_GetDictPtr, ignoring descriptors
'''
- attr_dict = {}
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('<...>')
+ visited.add(self.as_address())
+ attr_dict = {}
try:
typeobj = self.type()
dictoffset = int_from_int(typeobj.field('tp_dictoffset'))
@@ -313,16 +341,39 @@ class HeapTypeObjectPtr(PyObjectPtr):
dictptr = self._gdbval.cast(_type_char_ptr) + dictoffset
PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer()
dictptr = dictptr.cast(PyObjectPtrPtr)
- attr_dict =
PyObjectPtr.from_pyobject_ptr(dictptr.dereference()).proxyval()
+ attr_dict =
PyObjectPtr.from_pyobject_ptr(dictptr.dereference()).proxyval(visited)
except RuntimeError:
# Corrupt data somewhere; fail safe
- pass
+ pass
tp_name = self.safe_tp_name()
# New-style class:
return InstanceProxy(tp_name, attr_dict, long(self._gdbval))
+class ProxyException(Exception):
+ def __init__(self, tp_name, args):
+ self.tp_name = tp_name
+ self.args = args
+
+ def __repr__(self):
+ return '%s%r' % (self.tp_name, self.args)
+
+class PyBaseExceptionObjectPtr(PyObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyBaseExceptionObject* i.e. an exception
+ within the process being debugged.
+ """
+ _typename = 'PyBaseExceptionObject'
+
+ def proxyval(self, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('(...)')
+ visited.add(self.as_address())
+ arg_proxy =
PyObjectPtr.from_pyobject_ptr(self.field('args')).proxyval(visited)
+ return ProxyException(self.safe_tp_name(),
+ arg_proxy)
class PyBoolObjectPtr(PyObjectPtr):
"""
@@ -331,7 +382,7 @@ class PyBoolObjectPtr(PyObjectPtr):
"""
_typename = 'PyBoolObject'
- def proxyval(self):
+ def proxyval(self, visited):
if int_from_int(self.field('ob_ival')):
return True
else:
@@ -360,7 +411,7 @@ class PyCodeObjectPtr(PyObjectPtr):
Analogous to PyCode_Addr2Line; translated from pseudocode in
Objects/lnotab_notes.txt
'''
- co_lnotab =
PyObjectPtr.from_pyobject_ptr(self.field('co_lnotab')).proxyval()
+ co_lnotab =
PyObjectPtr.from_pyobject_ptr(self.field('co_lnotab')).proxyval(set())
# Initialize lineno to co_firstlineno as per PyCode_Addr2Line
# not 0, as lnotab_notes.txt has it:
@@ -381,27 +432,37 @@ class PyDictObjectPtr(PyObjectPtr):
"""
_typename = 'PyDictObject'
- def proxyval(self):
+ def proxyval(self, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('{...}')
+ visited.add(self.as_address())
+
result = {}
for i in safe_range(self.field('ma_mask') + 1):
ep = self.field('ma_table') + i
pvalue = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
if not pvalue.is_null():
pkey = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
- result[pkey.proxyval()] = pvalue.proxyval()
+ result[pkey.proxyval(visited)] = pvalue.proxyval(visited)
return result
class PyInstanceObjectPtr(PyObjectPtr):
_typename = 'PyInstanceObject'
- def proxyval(self):
+ def proxyval(self, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('<...>')
+ visited.add(self.as_address())
+
# Get name of class:
in_class = PyObjectPtr.from_pyobject_ptr(self.field('in_class'))
- cl_name =
PyObjectPtr.from_pyobject_ptr(in_class.field('cl_name')).proxyval()
+ cl_name =
PyObjectPtr.from_pyobject_ptr(in_class.field('cl_name')).proxyval(visited)
# Get dictionary of instance attributes:
- in_dict =
PyObjectPtr.from_pyobject_ptr(self.field('in_dict')).proxyval()
+ in_dict =
PyObjectPtr.from_pyobject_ptr(self.field('in_dict')).proxyval(visited)
# Old-style class:
return InstanceProxy(cl_name, in_dict, long(self._gdbval))
@@ -410,11 +471,10 @@ class PyInstanceObjectPtr(PyObjectPtr):
class PyIntObjectPtr(PyObjectPtr):
_typename = 'PyIntObject'
- def proxyval(self):
+ def proxyval(self, visited):
result = int_from_int(self.field('ob_ival'))
return result
-
class PyListObjectPtr(PyObjectPtr):
_typename = 'PyListObject'
@@ -423,8 +483,13 @@ class PyListObjectPtr(PyObjectPtr):
field_ob_item = self.field('ob_item')
return field_ob_item[i]
- def proxyval(self):
- result = [PyObjectPtr.from_pyobject_ptr(self[i]).proxyval()
+ def proxyval(self, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('[...]')
+ visited.add(self.as_address())
+
+ result = [PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
for i in safe_range(int_from_int(self.field('ob_size')))]
return result
@@ -432,7 +497,7 @@ class PyListObjectPtr(PyObjectPtr):
class PyLongObjectPtr(PyObjectPtr):
_typename = 'PyLongObject'
- def proxyval(self):
+ def proxyval(self, visited):
'''
Python's Include/longobjrep.h has this declaration:
struct _longobject {
@@ -477,7 +542,7 @@ class PyNoneStructPtr(PyObjectPtr):
"""
_typename = 'PyObject'
- def proxyval(self):
+ def proxyval(self, visited):
return None
@@ -489,16 +554,39 @@ class PyFrameObjectPtr(PyObjectPtr):
return str(fi)
+class PySetObjectPtr(PyObjectPtr):
+ _typename = 'PySetObject'
+
+ def proxyval(self, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('%s(...)' % self.safe_tp_name())
+ visited.add(self.as_address())
+
+ members = []
+ table = self.field('table')
+ for i in safe_range(self.field('mask')+1):
+ setentry = table[i]
+ key = setentry['key']
+ if key != 0:
+ key_proxy = PyObjectPtr.from_pyobject_ptr(key).proxyval(visited)
+ if key_proxy != '<dummy key>':
+ members.append(key_proxy)
+ if self.safe_tp_name() == 'frozenset':
+ return frozenset(members)
+ else:
+ return set(members)
+
class PyStringObjectPtr(PyObjectPtr):
_typename = 'PyStringObject'
def __str__(self):
field_ob_size = self.field('ob_size')
field_ob_sval = self.field('ob_sval')
- char_ptr = field_ob_sval.address.cast(_type_char_ptr)
- return ''.join([chr(field_ob_sval[i]) for i in
safe_range(field_ob_size)])
+ char_ptr = field_ob_sval.address.cast(_type_unsigned_char_ptr)
+ return ''.join([chr(char_ptr[i]) for i in safe_range(field_ob_size)])
- def proxyval(self):
+ def proxyval(self, visited):
return str(self)
@@ -510,8 +598,13 @@ class PyTupleObjectPtr(PyObjectPtr):
field_ob_item = self.field('ob_item')
return field_ob_item[i]
- def proxyval(self):
- result = tuple([PyObjectPtr.from_pyobject_ptr(self[i]).proxyval()
+ def proxyval(self, visited):
+ # Guard against infinite loops:
+ if self.as_address() in visited:
+ return ProxyAlreadyVisited('(...)')
+ visited.add(self.as_address())
+
+ result = tuple([PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
for i in
safe_range(int_from_int(self.field('ob_size')))])
return result
@@ -523,7 +616,7 @@ class PyTypeObjectPtr(PyObjectPtr):
class PyUnicodeObjectPtr(PyObjectPtr):
_typename = 'PyUnicodeObject'
- def proxyval(self):
+ def proxyval(self, visited):
# From unicodeobject.h:
# Py_ssize_t length; /* Length of raw Unicode data in buffer */
# Py_UNICODE *str; /* Raw Unicode buffer */
@@ -576,13 +669,13 @@ class FrameInfo:
if not value.is_null():
name = PyObjectPtr.from_pyobject_ptr(self.co_varnames[i])
#print 'name=%s' % name
- value = value.proxyval()
+ value = value.proxyval(set())
#print 'value=%s' % value
self.locals.append((str(name), value))
def filename(self):
'''Get the path of the current Python source file, as a
string'''
- return self.co_filename.proxyval()
+ return self.co_filename.proxyval(set())
def current_line_num(self):
'''Get current line number as an integer (1-based)
@@ -626,7 +719,7 @@ class PyObjectPtrPrinter:
self.gdbval = gdbval
def to_string (self):
- proxyval = PyObjectPtr.from_pyobject_ptr(self.gdbval).proxyval()
+ proxyval = PyObjectPtr.from_pyobject_ptr(self.gdbval).proxyval(set())
return stringify(proxyval)
diff --git a/python3.spec b/python3.spec
index 5d8022c..c106b67 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 2%{?dist}
+Release: 3%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -74,7 +74,7 @@ Source3: macros.pybytecompile
#
# Downloaded from:
#
http://bugs.python.org/issue8032
-# This is Tools/gdb/libpython.py from v3 of the patch
+# This is Tools/gdb/libpython.py from v4 of the patch
Source4: python-gdb.py
# Systemtap tapset to make it easier to use the systemtap static probes
@@ -695,6 +695,11 @@ rm -fr %{buildroot}
%changelog
+* Thu Mar 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-3
+- update python-gdb.py from v3 to v4 (fixing infinite recursion on reference
+cycles and tracebacks on bytes 0x80-0xff in strings, adding handlers for sets
+and exceptions)
+
* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
- refresh gdb hooks to v3 (reworking how they are packaged)
commit 485fd76f7f375db1544ab050d7fd7788b93033b0
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Wed Mar 24 19:57:26 2010 +0000
refresh gdb hooks to v3 (reworking how they are packaged)
diff --git a/python-gdb.py b/python-gdb.py
new file mode 100644
index 0000000..204dde3
--- /dev/null
+++ b/python-gdb.py
@@ -0,0 +1,848 @@
+#!/usr/bin/python
+'''
+From gdb 7 onwards, gdb's build can be configured --with-python, allowing gdb
+to be extended with Python code e.g. for library-specific data visualizations,
+such as for the C++ STL types. Documentation on this API can be seen at:
+http://sourceware.org/gdb/current/onlinedocs/gdb/Python-API.html
+
+
+This python module deals with the case when the process being debugged (the
+"inferior process" in gdb parlance) is itself python, or more specifically,
+linked against libpython. In this situation, almost every item of data is a
+(PyObject*), and having the debugger merely print their addresses is not very
+enlightening.
+
+This module embeds knowledge about the implementation details of libpython so
+that we can emit useful visualizations e.g. a string, a list, a dict, a frame
+giving file/line information and the state of local variables
+
+In particular, given a gdb.Value corresponding to a PyObject* in the inferior
+process, we can generate a "proxy value" within the gdb process. For example,
+given a PyObject* in the inferior process that is in fact a PyListObject*
+holding three PyObject* that turn out to be PyStringObject* instances, we can
+generate a proxy value within the gdb process that is a list of strings:
+ ["foo", "bar", "baz"]
+
+We try to defer gdb.lookup_type() invocations for python types until as late as
+possible: for a dynamically linked python binary, when the process starts in
+the debugger, the libpython.so hasn't been dynamically loaded yet, so none of
+the type names are known to the debugger
+
+The module also extends gdb with some python-specific commands.
+'''
+
+import gdb
+
+# Look up the gdb.Type for some standard types:
+_type_char_ptr = gdb.lookup_type('char').pointer() # char*
+_type_void_ptr = gdb.lookup_type('void').pointer() # void*
+_type_size_t = gdb.lookup_type('size_t')
+
+SIZEOF_VOID_P = _type_void_ptr.sizeof
+
+
+Py_TPFLAGS_HEAPTYPE = (1L << 9)
+
+Py_TPFLAGS_INT_SUBCLASS = (1L << 23)
+Py_TPFLAGS_LONG_SUBCLASS = (1L << 24)
+Py_TPFLAGS_LIST_SUBCLASS = (1L << 25)
+Py_TPFLAGS_TUPLE_SUBCLASS = (1L << 26)
+Py_TPFLAGS_STRING_SUBCLASS = (1L << 27)
+Py_TPFLAGS_UNICODE_SUBCLASS = (1L << 28)
+Py_TPFLAGS_DICT_SUBCLASS = (1L << 29)
+Py_TPFLAGS_BASE_EXC_SUBCLASS = (1L << 30)
+Py_TPFLAGS_TYPE_SUBCLASS = (1L << 31)
+
+
+class NullPyObjectPtr(RuntimeError):
+ pass
+
+
+def safety_limit(val):
+ # Given a integer value from the process being debugged, limit it to some
+ # safety threshold so that arbitrary breakage within said process doesn't
+ # break the gdb process too much (e.g. sizes of iterations, sizes of lists)
+ return min(val, 100)
+
+
+def safe_range(val):
+ # As per range, but don't trust the value too much: cap it to a safety
+ # threshold in case the data was corrupted
+ return xrange(safety_limit(val))
+
+
+class PyObjectPtr(object):
+ """
+ Class wrapping a gdb.Value that's a either a (PyObject*) within the
+ inferior process, or some subclass pointer e.g. (PyStringObject*)
+
+ There will be a subclass for every refined PyObject type that we care
+ about.
+
+ Note that at every stage the underlying pointer could be NULL, point
+ to corrupt data, etc; this is the debugger, after all.
+ """
+ _typename = 'PyObject'
+
+ def __init__(self, gdbval, cast_to=None):
+ if cast_to:
+ self._gdbval = gdbval.cast(cast_to)
+ else:
+ self._gdbval = gdbval
+
+ def field(self, name):
+ '''
+ Get the gdb.Value for the given field within the PyObject, coping with
+ some python 2 versus python 3 differences.
+
+ Various libpython types are defined using the "PyObject_HEAD" and
+ "PyObject_VAR_HEAD" macros.
+
+ In Python 2, this these are defined so that "ob_type" and (for a var
+ object) "ob_size" are fields of the type in question.
+
+ In Python 3, this is defined as an embedded PyVarObject type thus:
+ PyVarObject ob_base;
+ so that the "ob_size" field is located insize the "ob_base"
field, and
+ the "ob_type" is most easily accessed by casting back to a
(PyObject*).
+ '''
+ if self.is_null():
+ raise NullPyObjectPtr(self)
+
+ if name == 'ob_type':
+ pyo_ptr = self._gdbval.cast(PyObjectPtr.get_gdb_type())
+ return pyo_ptr.dereference()[name]
+
+ if name == 'ob_size':
+ try:
+ # Python 2:
+ return self._gdbval.dereference()[name]
+ except RuntimeError:
+ # Python 3:
+ return self._gdbval.dereference()['ob_base'][name]
+
+ # General case: look it up inside the object:
+ return self._gdbval.dereference()[name]
+
+ def type(self):
+ return PyTypeObjectPtr(self.field('ob_type'))
+
+ def is_null(self):
+ return 0 == long(self._gdbval)
+
+ def safe_tp_name(self):
+ try:
+ return self.type().field('tp_name').string()
+ except NullPyObjectPtr:
+ # NULL tp_name?
+ return 'unknown'
+ except RuntimeError:
+ # Can't even read the object at all?
+ return 'unknown'
+
+ def proxyval(self):
+ '''
+ Scrape a value from the inferior process, and try to represent it
+ within the gdb process, whilst (hopefully) avoiding crashes when
+ the remote data is corrupt.
+
+ Derived classes will override this.
+
+ For example, a PyIntObject* with ob_ival 42 in the inferior process
+ should result in an int(42) in this process.
+ '''
+
+ class FakeRepr(object):
+ """
+ Class representing a non-descript PyObject* value in the inferior
+ process for when we don't have a custom scraper, intended to have
+ a sane repr().
+ """
+
+ def __init__(self, tp_name, address):
+ self.tp_name = tp_name
+ self.address = address
+
+ def __repr__(self):
+ # For the NULL pointer, we have no way of knowing a type, so
+ # special-case it as per
+ #
http://bugs.python.org/issue8032#msg100882
+ if self.address == 0:
+ return '0x0'
+ return '<%s at remote 0x%x>' % (self.tp_name,
self.address)
+
+ return FakeRepr(self.safe_tp_name(),
+ long(self._gdbval))
+
+ @classmethod
+ def subclass_from_type(cls, t):
+ '''
+ Given a PyTypeObjectPtr instance wrapping a gdb.Value that's a
+ (PyTypeObject*), determine the corresponding subclass of PyObjectPtr
+ to use
+
+ Ideally, we would look up the symbols for the global types, but that
+ isn't working yet:
+ (gdb) python print gdb.lookup_symbol('PyList_Type')[0].value
+ Traceback (most recent call last):
+ File "<string>", line 1, in <module>
+ NotImplementedError: Symbol type not yet supported in Python scripts.
+ Error while executing Python code.
+
+ For now, we use tp_flags, after doing some string comparisons on the
+ tp_name for some special-cases that don't seem to be visible through
+ flags
+ '''
+ try:
+ tp_name = t.field('tp_name').string()
+ tp_flags = int(t.field('tp_flags'))
+ except RuntimeError:
+ # Handle any kind of error e.g. NULL ptrs by simply using the base
+ # class
+ return cls
+
+ #print 'tp_flags = 0x%08x' % tp_flags
+ #print 'tp_name = %r' % tp_name
+
+ name_map = {'bool': PyBoolObjectPtr,
+ 'classobj': PyClassObjectPtr,
+ 'instance': PyInstanceObjectPtr,
+ 'NoneType': PyNoneStructPtr,
+ 'frame': PyFrameObjectPtr,
+ }
+ if tp_name in name_map:
+ return name_map[tp_name]
+
+ if tp_flags & Py_TPFLAGS_HEAPTYPE:
+ return HeapTypeObjectPtr
+
+ if tp_flags & Py_TPFLAGS_INT_SUBCLASS:
+ return PyIntObjectPtr
+ if tp_flags & Py_TPFLAGS_LONG_SUBCLASS:
+ return PyLongObjectPtr
+ if tp_flags & Py_TPFLAGS_LIST_SUBCLASS:
+ return PyListObjectPtr
+ if tp_flags & Py_TPFLAGS_TUPLE_SUBCLASS:
+ return PyTupleObjectPtr
+ if tp_flags & Py_TPFLAGS_STRING_SUBCLASS:
+ return PyStringObjectPtr
+ if tp_flags & Py_TPFLAGS_UNICODE_SUBCLASS:
+ return PyUnicodeObjectPtr
+ if tp_flags & Py_TPFLAGS_DICT_SUBCLASS:
+ return PyDictObjectPtr
+ #if tp_flags & Py_TPFLAGS_BASE_EXC_SUBCLASS:
+ # return something
+ #if tp_flags & Py_TPFLAGS_TYPE_SUBCLASS:
+ # return PyTypeObjectPtr
+
+ # Use the base class:
+ return cls
+
+ @classmethod
+ def from_pyobject_ptr(cls, gdbval):
+ '''
+ Try to locate the appropriate derived class dynamically, and cast
+ the pointer accordingly.
+ '''
+ try:
+ p = PyObjectPtr(gdbval)
+ cls = cls.subclass_from_type(p.type())
+ return cls(gdbval, cast_to=cls.get_gdb_type())
+ except RuntimeError:
+ # Handle any kind of error e.g. NULL ptrs by simply using the base
+ # class
+ pass
+ return cls(gdbval)
+
+ @classmethod
+ def get_gdb_type(cls):
+ return gdb.lookup_type(cls._typename).pointer()
+
+
+class InstanceProxy(object):
+
+ def __init__(self, cl_name, attrdict, address):
+ self.cl_name = cl_name
+ self.attrdict = attrdict
+ self.address = address
+
+ def __repr__(self):
+ if isinstance(self.attrdict, dict):
+ kwargs = ', '.join(["%s=%r" % (arg, val)
+ for arg, val in self.attrdict.iteritems()])
+ return '<%s(%s) at remote 0x%x>' % (self.cl_name,
+ kwargs, self.address)
+ else:
+ return '<%s at remote 0x%x>' % (self.cl_name,
+ self.address)
+
+
+def _PyObject_VAR_SIZE(typeobj, nitems):
+ return ( ( typeobj.field('tp_basicsize') +
+ nitems * typeobj.field('tp_itemsize') +
+ (SIZEOF_VOID_P - 1)
+ ) & ~(SIZEOF_VOID_P - 1)
+ ).cast(_type_size_t)
+
+class HeapTypeObjectPtr(PyObjectPtr):
+ _typename = 'PyObject'
+
+ def proxyval(self):
+ '''
+ Support for new-style classes.
+
+ Currently we just locate the dictionary using a transliteration to
+ python of _PyObject_GetDictPtr, ignoring descriptors
+ '''
+ attr_dict = {}
+
+ try:
+ typeobj = self.type()
+ dictoffset = int_from_int(typeobj.field('tp_dictoffset'))
+ if dictoffset != 0:
+ if dictoffset < 0:
+ type_PyVarObject_ptr =
gdb.lookup_type('PyVarObject').pointer()
+ tsize =
int_from_int(self._gdbval.cast(type_PyVarObject_ptr)['ob_size'])
+ if tsize < 0:
+ tsize = -tsize
+ size = _PyObject_VAR_SIZE(typeobj, tsize)
+ dictoffset += size
+ assert dictoffset > 0
+ assert dictoffset % SIZEOF_VOID_P == 0
+
+ dictptr = self._gdbval.cast(_type_char_ptr) + dictoffset
+ PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer()
+ dictptr = dictptr.cast(PyObjectPtrPtr)
+ attr_dict =
PyObjectPtr.from_pyobject_ptr(dictptr.dereference()).proxyval()
+ except RuntimeError:
+ # Corrupt data somewhere; fail safe
+ pass
+
+ tp_name = self.safe_tp_name()
+
+ # New-style class:
+ return InstanceProxy(tp_name, attr_dict, long(self._gdbval))
+
+
+class PyBoolObjectPtr(PyObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyBoolObject* i.e. one of the two
+ <bool> instances (Py_True/Py_False) within the process being debugged.
+ """
+ _typename = 'PyBoolObject'
+
+ def proxyval(self):
+ if int_from_int(self.field('ob_ival')):
+ return True
+ else:
+ return False
+
+
+class PyClassObjectPtr(PyObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyClassObject* i.e. a <classobj>
+ instance within the process being debugged.
+ """
+ _typename = 'PyClassObject'
+
+
+class PyCodeObjectPtr(PyObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyCodeObject* i.e. a <code> instance
+ within the process being debugged.
+ """
+ _typename = 'PyCodeObject'
+
+ def addr2line(self, addrq):
+ '''
+ Get the line number for a given bytecode offset
+
+ Analogous to PyCode_Addr2Line; translated from pseudocode in
+ Objects/lnotab_notes.txt
+ '''
+ co_lnotab =
PyObjectPtr.from_pyobject_ptr(self.field('co_lnotab')).proxyval()
+
+ # Initialize lineno to co_firstlineno as per PyCode_Addr2Line
+ # not 0, as lnotab_notes.txt has it:
+ lineno = int_from_int(self.field('co_firstlineno'))
+
+ addr = 0
+ for addr_incr, line_incr in zip(co_lnotab[::2], co_lnotab[1::2]):
+ addr += ord(addr_incr)
+ if addr > addrq:
+ return lineno
+ lineno += ord(line_incr)
+ return lineno
+
+class PyDictObjectPtr(PyObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyDictObject* i.e. a dict instance
+ within the process being debugged.
+ """
+ _typename = 'PyDictObject'
+
+ def proxyval(self):
+ result = {}
+ for i in safe_range(self.field('ma_mask') + 1):
+ ep = self.field('ma_table') + i
+ pvalue = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
+ if not pvalue.is_null():
+ pkey = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
+ result[pkey.proxyval()] = pvalue.proxyval()
+ return result
+
+
+class PyInstanceObjectPtr(PyObjectPtr):
+ _typename = 'PyInstanceObject'
+
+ def proxyval(self):
+ # Get name of class:
+ in_class = PyObjectPtr.from_pyobject_ptr(self.field('in_class'))
+ cl_name =
PyObjectPtr.from_pyobject_ptr(in_class.field('cl_name')).proxyval()
+
+ # Get dictionary of instance attributes:
+ in_dict =
PyObjectPtr.from_pyobject_ptr(self.field('in_dict')).proxyval()
+
+ # Old-style class:
+ return InstanceProxy(cl_name, in_dict, long(self._gdbval))
+
+
+class PyIntObjectPtr(PyObjectPtr):
+ _typename = 'PyIntObject'
+
+ def proxyval(self):
+ result = int_from_int(self.field('ob_ival'))
+ return result
+
+
+class PyListObjectPtr(PyObjectPtr):
+ _typename = 'PyListObject'
+
+ def __getitem__(self, i):
+ # Get the gdb.Value for the (PyObject*) with the given index:
+ field_ob_item = self.field('ob_item')
+ return field_ob_item[i]
+
+ def proxyval(self):
+ result = [PyObjectPtr.from_pyobject_ptr(self[i]).proxyval()
+ for i in safe_range(int_from_int(self.field('ob_size')))]
+ return result
+
+
+class PyLongObjectPtr(PyObjectPtr):
+ _typename = 'PyLongObject'
+
+ def proxyval(self):
+ '''
+ Python's Include/longobjrep.h has this declaration:
+ struct _longobject {
+ PyObject_VAR_HEAD
+ digit ob_digit[1];
+ };
+
+ with this description:
+ The absolute value of a number is equal to
+ SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
+ Negative numbers are represented with ob_size < 0;
+ zero is represented by ob_size == 0.
+
+ where SHIFT can be either:
+ #define PyLong_SHIFT 30
+ #define PyLong_SHIFT 15
+ '''
+ ob_size = long(self.field('ob_size'))
+ if ob_size == 0:
+ return 0L
+
+ ob_digit = self.field('ob_digit')
+
+ if gdb.lookup_type('digit').sizeof == 2:
+ SHIFT = 15L
+ else:
+ # FIXME: I haven't yet tested this case
+ SHIFT = 30L
+
+ digits = [long(ob_digit[i]) * 2**(SHIFT*i)
+ for i in safe_range(abs(ob_size))]
+ result = sum(digits)
+ if ob_size < 0:
+ result = -result
+ return result
+
+
+class PyNoneStructPtr(PyObjectPtr):
+ """
+ Class wrapping a gdb.Value that's a PyObject* pointing to the
+ singleton (we hope) _Py_NoneStruct with ob_type PyNone_Type
+ """
+ _typename = 'PyObject'
+
+ def proxyval(self):
+ return None
+
+
+class PyFrameObjectPtr(PyObjectPtr):
+ _typename = 'PyFrameObject'
+
+ def __str__(self):
+ fi = FrameInfo(self)
+ return str(fi)
+
+
+class PyStringObjectPtr(PyObjectPtr):
+ _typename = 'PyStringObject'
+
+ def __str__(self):
+ field_ob_size = self.field('ob_size')
+ field_ob_sval = self.field('ob_sval')
+ char_ptr = field_ob_sval.address.cast(_type_char_ptr)
+ return ''.join([chr(field_ob_sval[i]) for i in
safe_range(field_ob_size)])
+
+ def proxyval(self):
+ return str(self)
+
+
+class PyTupleObjectPtr(PyObjectPtr):
+ _typename = 'PyTupleObject'
+
+ def __getitem__(self, i):
+ # Get the gdb.Value for the (PyObject*) with the given index:
+ field_ob_item = self.field('ob_item')
+ return field_ob_item[i]
+
+ def proxyval(self):
+ result = tuple([PyObjectPtr.from_pyobject_ptr(self[i]).proxyval()
+ for i in
safe_range(int_from_int(self.field('ob_size')))])
+ return result
+
+
+class PyTypeObjectPtr(PyObjectPtr):
+ _typename = 'PyTypeObject'
+
+
+class PyUnicodeObjectPtr(PyObjectPtr):
+ _typename = 'PyUnicodeObject'
+
+ def proxyval(self):
+ # From unicodeobject.h:
+ # Py_ssize_t length; /* Length of raw Unicode data in buffer */
+ # Py_UNICODE *str; /* Raw Unicode buffer */
+ field_length = long(self.field('length'))
+ field_str = self.field('str')
+
+ # Gather a list of ints from the Py_UNICODE array; these are either
+ # UCS-2 or UCS-4 code points:
+ Py_UNICODEs = [int(field_str[i]) for i in safe_range(field_length)]
+
+ # Convert the int code points to unicode characters, and generate a
+ # local unicode instance:
+ result = u''.join([unichr(ucs) for ucs in Py_UNICODEs])
+ return result
+
+
+def int_from_int(gdbval):
+ return int(str(gdbval))
+
+
+def stringify(val):
+ # TODO: repr() puts everything on one line; pformat can be nicer, but
+ # can lead to v.long results; this function isolates the choice
+ if True:
+ return repr(val)
+ else:
+ from pprint import pformat
+ return pformat(val)
+
+
+class FrameInfo:
+ '''
+ Class representing all of the information we can scrape about a
+ PyFrameObject*
+ '''
+ def __init__(self, fval):
+ self.fval = fval
+ self.co = PyCodeObjectPtr.from_pyobject_ptr(fval.field('f_code'))
+ self.co_name = PyObjectPtr.from_pyobject_ptr(self.co.field('co_name'))
+ self.co_filename =
PyObjectPtr.from_pyobject_ptr(self.co.field('co_filename'))
+ self.f_lineno = int_from_int(fval.field('f_lineno'))
+ self.f_lasti = int_from_int(fval.field('f_lasti'))
+ self.co_nlocals = int_from_int(self.co.field('co_nlocals'))
+ self.co_varnames =
PyTupleObjectPtr.from_pyobject_ptr(self.co.field('co_varnames'))
+ self.locals = [] # list of kv pairs
+ f_localsplus = self.fval.field('f_localsplus')
+ for i in safe_range(self.co_nlocals):
+ #print 'i=%i' % i
+ value = PyObjectPtr.from_pyobject_ptr(f_localsplus[i])
+ if not value.is_null():
+ name = PyObjectPtr.from_pyobject_ptr(self.co_varnames[i])
+ #print 'name=%s' % name
+ value = value.proxyval()
+ #print 'value=%s' % value
+ self.locals.append((str(name), value))
+
+ def filename(self):
+ '''Get the path of the current Python source file, as a
string'''
+ return self.co_filename.proxyval()
+
+ def current_line_num(self):
+ '''Get current line number as an integer (1-based)
+
+ Translated from PyFrame_GetLineNumber and PyCode_Addr2Line
+
+ See Objects/lnotab_notes.txt
+ '''
+ f_trace = self.fval.field('f_trace')
+ if long(f_trace) != 0:
+ # we have a non-NULL f_trace:
+ return self.f_lineno
+ else:
+ #try:
+ return self.co.addr2line(self.f_lasti)
+ #except ValueError:
+ # return self.f_lineno
+
+ def current_line(self):
+ '''Get the text of the current source line as a string, with a
trailing
+ newline character'''
+ with open(self.filename(), 'r') as f:
+ all_lines = f.readlines()
+ # Convert from 1-based current_line_num to 0-based list offset:
+ return all_lines[self.current_line_num()-1]
+
+ def __str__(self):
+ return ('Frame 0x%x, for file %s, line %i, in %s (%s)'
+ % (long(self.fval._gdbval),
+ self.co_filename,
+ self.current_line_num(),
+ self.co_name,
+ ', '.join(['%s=%s' % (k, stringify(v)) for k, v in
self.locals]))
+ )
+
+
+class PyObjectPtrPrinter:
+ "Prints a (PyObject*)"
+
+ def __init__ (self, gdbval):
+ self.gdbval = gdbval
+
+ def to_string (self):
+ proxyval = PyObjectPtr.from_pyobject_ptr(self.gdbval).proxyval()
+ return stringify(proxyval)
+
+
+class PyFrameObjectPtrPrinter(PyObjectPtrPrinter):
+ "Prints a (PyFrameObject*)"
+
+ def to_string (self):
+ pyop = PyObjectPtr.from_pyobject_ptr(self.gdbval)
+ fi = FrameInfo(pyop)
+ return str(fi)
+
+
+def pretty_printer_lookup(gdbval):
+ type = gdbval.type.unqualified()
+ if type.code == gdb.TYPE_CODE_PTR:
+ type = type.target().unqualified()
+ t = str(type)
+ if t == "PyObject":
+ return PyObjectPtrPrinter(gdbval)
+ elif t == "PyFrameObject":
+ return PyFrameObjectPtrPrinter(gdbval)
+
+
+"""
+During development, I've been manually invoking the code in this way:
+(gdb) python
+
+import sys
+sys.path.append('/home/david/coding/python-gdb')
+import libpython
+end
+
+then reloading it after each edit like this:
+(gdb) python reload(libpython)
+
+The following code should ensure that the prettyprinter is registered
+if the code is autoloaded by gdb when visiting libpython.so, provided
+that this python file is installed to the same path as the library (or its
+.debug file) plus a "-gdb.py" suffix, e.g:
+ /usr/lib/libpython2.6.so.1.0-gdb.py
+ /usr/lib/debug/usr/lib/libpython2.6.so.1.0.debug-gdb.py
+"""
+def register (obj):
+ if obj == None:
+ obj = gdb
+
+ # Wire up the pretty-printer
+ obj.pretty_printers.append(pretty_printer_lookup)
+
+register (gdb.current_objfile ())
+
+def get_python_frame(gdb_frame):
+ try:
+ f = gdb_frame.read_var('f')
+ return PyFrameObjectPtr.from_pyobject_ptr(f)
+ except ValueError:
+ return None
+
+def get_selected_python_frame():
+ '''Try to obtain a (gdbframe, PyFrameObjectPtr) pair for the
+ currently-running python code, or (None, None)'''
+ gdb_frame = gdb.selected_frame()
+ while gdb_frame:
+ if (gdb_frame.function() is None or
+ gdb_frame.function().name != 'PyEval_EvalFrameEx'):
+ gdb_frame = gdb_frame.older()
+ continue
+
+ try:
+ f = gdb_frame.read_var('f')
+ return gdb_frame, PyFrameObjectPtr.from_pyobject_ptr(f)
+ except ValueError:
+ gdb_frame = gdb_frame.older()
+ return None, None
+
+class PyList(gdb.Command):
+ '''List the current Python source code, if any
+
+ Use
+ py-list START
+ to list at a different line number within the python source.
+
+ Use
+ py-list START, END
+ to list a specific range of lines within the python source.
+ '''
+
+ def __init__(self):
+ gdb.Command.__init__ (self,
+ "py-list",
+ gdb.COMMAND_FILES,
+ gdb.COMPLETE_NONE)
+
+
+ def invoke(self, args, from_tty):
+ import re
+
+ start = None
+ end = None
+
+ m = re.match(r'\s*(\d+)\s*', args)
+ if m:
+ start = int(m.group(0))
+ end = start + 10
+
+ m = re.match(r'\s*(\d+)\s*,\s*(\d+)\s*', args)
+ if m:
+ start, end = map(int, m.groups())
+
+ gdb_frame, py_frame = get_selected_python_frame()
+ if not py_frame:
+ print 'Unable to locate python frame'
+ return
+
+ fi = FrameInfo(py_frame)
+ filename = fi.filename()
+ lineno = fi.current_line_num()
+
+ if start is None:
+ start = lineno - 5
+ end = lineno + 5
+
+ if start<1:
+ start = 1
+
+ with open(filename, 'r') as f:
+ all_lines = f.readlines()
+ # start and end are 1-based, all_lines is 0-based;
+ # so [start-1:end] as a python slice gives us [start, end] as a
+ # closed interval
+ for i, line in enumerate(all_lines[start-1:end]):
+ sys.stdout.write('%4s %s' % (i+start, line))
+
+
+# ...and register the command:
+PyList()
+
+def move_in_stack(move_up):
+ '''Move up or down the stack (for the py-up/py-down
command)'''
+ gdb_frame, py_frame = get_selected_python_frame()
+ while gdb_frame:
+ if move_up:
+ iter_frame = gdb_frame.older()
+ else:
+ iter_frame = gdb_frame.newer()
+
+ if not iter_frame:
+ break
+
+ if (iter_frame.function() and
+ iter_frame.function().name == 'PyEval_EvalFrameEx'):
+ # Result:
+ iter_frame.select()
+ py_frame = get_python_frame(iter_frame)
+ fi = FrameInfo(py_frame)
+ print fi
+ sys.stdout.write(fi.current_line())
+ return
+
+ gdb_frame = iter_frame
+
+ if move_up:
+ print 'Unable to find an older python frame'
+ else:
+ print 'Unable to find a newer python frame'
+
+class PyUp(gdb.Command):
+ 'Select and print the python stack frame that called this one (if any)'
+ def __init__(self):
+ gdb.Command.__init__ (self,
+ "py-up",
+ gdb.COMMAND_STACK,
+ gdb.COMPLETE_NONE)
+
+
+ def invoke(self, args, from_tty):
+ move_in_stack(move_up=True)
+
+PyUp()
+
+class PyDown(gdb.Command):
+ 'Select and print the python stack frame called by this one (if any)'
+ def __init__(self):
+ gdb.Command.__init__ (self,
+ "py-down",
+ gdb.COMMAND_STACK,
+ gdb.COMPLETE_NONE)
+
+
+ def invoke(self, args, from_tty):
+ move_in_stack(move_up=False)
+
+PyDown()
+
+class PyBacktrace(gdb.Command):
+ 'Display the current python frame and all the frames within its call stack (if
any)'
+ def __init__(self):
+ gdb.Command.__init__ (self,
+ "py-bt",
+ gdb.COMMAND_STACK,
+ gdb.COMPLETE_NONE)
+
+
+ def invoke(self, args, from_tty):
+ gdb_frame, py_frame = get_selected_python_frame()
+ while gdb_frame:
+ gdb_frame = gdb_frame.older()
+
+ if not gdb_frame:
+ break
+
+ if (gdb_frame.function() and
+ gdb_frame.function().name == 'PyEval_EvalFrameEx'):
+ py_frame = get_python_frame(gdb_frame)
+ fi = FrameInfo(py_frame)
+ print ' ', fi
+ sys.stdout.write(fi.current_line())
+
+PyBacktrace()
diff --git a/python3.spec b/python3.spec
index b63e9f1..5d8022c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.2
-Release: 1%{?dist}
+Release: 2%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -73,8 +73,9 @@ Source3: macros.pybytecompile
# information
#
# Downloaded from:
-#
http://fedorapeople.org/gitweb?p=dmalcolm/public_git/libpython.git;a=snap...
-Source4: libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
+#
http://bugs.python.org/issue8032
+# This is Tools/gdb/libpython.py from v3 of the patch
+Source4: python-gdb.py
# Systemtap tapset to make it easier to use the systemtap static probes
# (actually a template; LIBRARY_PATH will get fixed up during install)
@@ -207,12 +208,6 @@ python 3 code that uses more than just unittest and/or
test_support.py.
%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
-# Unpack source archive 4 into this same dir without deleting (-D; -T suppress
-# trying to unpack source 0 again):
-%if 0%{?with_gdb_hooks}
-%setup -q -n Python-%{version} -T -D -a 4
-%endif # with_gdb_hooks
-
%if 0%{?with_systemtap}
# Provide an example of usage of the tapset:
cp -a %{SOURCE6} .
@@ -426,7 +421,7 @@ ldd %{buildroot}/%{dynload_dir}/_curses*.so \
#
%if 0%{?with_gdb_hooks}
mkdir -p %{buildroot}%{_prefix}/lib/debug/%{_libdir}
-cp libpython/libpython.py
%{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug-gdb.py
+cp %{SOURCE4} %{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug-gdb.py
%endif # with_gdb_hooks
#
@@ -700,6 +695,9 @@ rm -fr %{buildroot}
%changelog
+* Wed Mar 24 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-2
+- refresh gdb hooks to v3 (reworking how they are packaged)
+
* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
- drop upstreamed patch 2 (.pyc permissions handling)
diff --git a/sources b/sources
index 342571f..30f03d2 100644
--- a/sources
+++ b/sources
@@ -1,2 +1 @@
-e9b2198d72a406698c8de07467654204
libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
45350b51b58a46b029fb06c61257e350 Python-3.1.2.tar.bz2
commit eeb0b9ba0c31777e786736c6afb59865eafebfb5
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Sun Mar 21 21:07:31 2010 +0000
- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
- drop upstreamed patch 2 (.pyc permissions handling)
- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
- drop upstreamed patch 200 (path-fixing script)
diff --git a/.cvsignore b/.cvsignore
index 9feab04..95c8574 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1,2 +1,2 @@
-Python-3.1.1.tar.bz2
libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
+Python-3.1.2.tar.bz2
diff --git a/python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
b/python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
deleted file mode 100644
index 1fb201b..0000000
--- a/python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- Lib/importlib/_bootstrap.py.fix-handling-of-readonly-pyc-files 2009-10-22
15:24:57.575015046 -0400
-+++ Lib/importlib/_bootstrap.py 2009-10-22 15:25:24.024016069 -0400
-@@ -522,8 +522,8 @@ class _PyPycFileLoader(PyPycLoader, _PyF
- bytecode_path = self.bytecode_path(name)
- if not bytecode_path:
- bytecode_path = self._base_path + _suffix_list(imp.PY_COMPILED)[0]
-- file = _io.FileIO(bytecode_path, 'w') # Assuming bytes.
- try:
-+ file = _io.FileIO(bytecode_path, 'w') # Assuming bytes.
- with _closing(file) as bytecode_file:
- bytecode_file.write(data)
- return True
diff --git a/python-3.1.1-install-tkinter-tests.patch
b/python-3.1.1-install-tkinter-tests.patch
deleted file mode 100644
index 3939678..0000000
--- a/python-3.1.1-install-tkinter-tests.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- Python-3.1.1/Makefile.pre.in.install-tkinter-tests 2009-10-27 20:00:09.814539776
-0400
-+++ Python-3.1.1/Makefile.pre.in 2009-10-27 20:01:43.460549947 -0400
-@@ -835,6 +835,7 @@ EXTRAPLATDIR= @EXTRAPLATDIR@
- MACHDEPS= $(PLATDIR) $(EXTRAPLATDIR)
- XMLLIBSUBDIRS= xml xml/dom xml/etree xml/parsers xml/sax
- LIBSUBDIRS= tkinter site-packages test test/output test/data \
-+ tkinter/test tkinter/test/test_ttk tkinter/test/test_tkinter \
- test/decimaltestdata \
- encodings \
- email email/mime email/test email/test/data \
diff --git a/python-3.1.1-pathfix.patch b/python-3.1.1-pathfix.patch
deleted file mode 100644
index f45409a..0000000
--- a/python-3.1.1-pathfix.patch
+++ /dev/null
@@ -1,61 +0,0 @@
---- Python-3.1.1.orig/Tools/scripts/pathfix.py 2009-09-24 15:27:04.000000000 -0600
-+++ Python-3.1.1/Tools/scripts/pathfix.py 2009-09-25 14:05:04.000000000 -0600
-@@ -1,4 +1,4 @@
--#! /usr/bin/env python
-+#!/usr/bin/env python3.1
-
- # Change the #! line occurring in Python scripts. The new interpreter
- # pathname must be given with a -i option.
-@@ -43,8 +43,8 @@
- sys.exit(2)
- for o, a in opts:
- if o == '-i':
-- new_interpreter = a
-- if not new_interpreter or new_interpreter[0] != '/' or not args:
-+ new_interpreter = a.encode()
-+ if not new_interpreter or new_interpreter[0] != b'/'[0] or not args:
- err('-i option or file-or-directory missing\n')
- err(usage)
- sys.exit(2)
-@@ -61,7 +61,7 @@
-
- ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$')
- def ispython(name):
-- return ispythonprog.match(name) >= 0
-+ return bool(ispythonprog.match(name))
-
- def recursedown(dirname):
- dbg('recursedown(%r)\n' % (dirname,))
-@@ -88,7 +88,7 @@
- def fix(filename):
- ## dbg('fix(%r)\n' % (filename,))
- try:
-- f = open(filename, 'r')
-+ f = open(filename, 'rb')
- except IOError as msg:
- err('%s: cannot open: %r\n' % (filename, msg))
- return 1
-@@ -101,7 +101,7 @@
- head, tail = os.path.split(filename)
- tempname = os.path.join(head, '@' + tail)
- try:
-- g = open(tempname, 'w')
-+ g = open(tempname, 'wb')
- except IOError as msg:
- f.close()
- err('%s: cannot create: %r\n' % (tempname, msg))
-@@ -139,11 +139,11 @@
- return 0
-
- def fixline(line):
-- if not line.startswith('#!'):
-+ if not line.startswith(b'#!'):
- return line
-- if "python" not in line:
-+ if b"python" not in line:
- return line
-- return '#! %s\n' % new_interpreter
-+ return b'#!' + new_interpreter + b'\n'
-
- if __name__ == '__main__':
- main()
diff --git a/python3.spec b/python3.spec
index 6471035..b63e9f1 100644
--- a/python3.spec
+++ b/python3.spec
@@ -38,8 +38,8 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
-Version: %{pybasever}.1
-Release: 28%{?dist}
+Version: %{pybasever}.2
+Release: 1%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -97,11 +97,6 @@ Patch0: python-3.1.1-config.patch
# Was Patch0 in ivazquez' python3000 specfile:
Patch1: Python-3.1.1-rpath.patch
-# Fixup importlib/_bootstrap.py so that it correctly handles being unable to
-# open .pyc files for writing
-# Sent upstream as
http://bugs.python.org/issue7187
-Patch2: python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
-
# The four TestMIMEAudio tests fail due to "audiotest.au" not being packaged.
# It's simplest to remove them:
Patch3: python-3.1.1-remove-mimeaudio-tests.patch
@@ -113,13 +108,6 @@ Patch3: python-3.1.1-remove-mimeaudio-tests.patch
# the expected value in this test:
Patch4: python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
-# test_tk test_ttk_guionly and test_ttk_textonly all rely on tkinter/test, but
-# upstream's Makefile.pre.in doesn't install that subdirectory; patch it so that
-# it does:
-Patch5: python-3.1.1-install-tkinter-tests.patch
-# (The resulting test support code is in the tkinter subpackage, but
-# this is not a major problem)
-
# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
# a libpythonMAJOR.MINOR.a (bug 550692):
Patch6: python-3.1.1-no-static-lib.patch
@@ -137,9 +125,6 @@ Patch8: python-3.1.1-systemtap.patch
Patch102: python-3.1.1-lib64.patch
-#
http://bugs.python.org/issue6999 -- fixed in r75062
-Patch200: python-3.1.1-pathfix.patch
-
BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: readline-devel, openssl-devel, gmp-devel
@@ -252,10 +237,8 @@ rm -r Modules/zlib || exit 1
#
%patch0 -p1 -b .config
%patch1 -p1 -b .rpath
-%patch2 -p0 -b .fix-handling-of-readonly-pyc-files
%patch3 -p1 -b .remove-mimeaudio-tests
%patch4 -p1 -b .apply-our-changes-to-expected-shebang
-%patch5 -p1 -b .install-tkinter-tests
%patch6 -p1 -b .no-static-lib
%patch7 -p1 -b .expat
%if 0%{?with_systemtap}
@@ -266,8 +249,6 @@ rm -r Modules/zlib || exit 1
%patch102 -p1 -b .lib64
%endif
-%patch200 -p1 -b .pathfix
-
# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
# are many differences between 2.6 and the Python 3 library.
#
@@ -719,6 +700,12 @@ rm -fr %{buildroot}
%changelog
+* Sun Mar 21 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.2-1
+- update to 3.1.2:
http://www.python.org/download/releases/3.1.2/
+- drop upstreamed patch 2 (.pyc permissions handling)
+- drop upstream patch 5 (fix for the test_tk and test_ttk_* selftests)
+- drop upstreamed patch 200 (path-fixing script)
+
* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
- fix typo in libpython.stp (rhbz:575336)
diff --git a/sources b/sources
index e5f0cae..342571f 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-d1ddd9f16e3c6a51c7208f33518cd674 Python-3.1.1.tar.bz2
e9b2198d72a406698c8de07467654204
libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
+45350b51b58a46b029fb06c61257e350 Python-3.1.2.tar.bz2
commit 536a207750d4b0cd2dba4a59ac3c6e211d09a6b1
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Sat Mar 20 15:18:41 2010 +0000
fix typo in libpython.stp (rhbz:575336)
diff --git a/libpython.stp b/libpython.stp
index 862061f..f41da80 100644
--- a/libpython.stp
+++ b/libpython.stp
@@ -9,7 +9,7 @@ probe python.function.entry =
process("python3").library("LIBRARY_PATH").mark("f
funcname = user_string($arg2);
lineno = $arg3;
}
-probe python.function.return =
process("python3").("LIBRARY_PATH").mark("function__return")
+probe python.function.return =
process("python3").library("LIBRARY_PATH").mark("function__return")
{
filename = user_string($arg1);
funcname = user_string($arg2);
diff --git a/python3.spec b/python3.spec
index c0f1d8a..6471035 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 27%{?dist}
+Release: 28%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -719,6 +719,9 @@ rm -fr %{buildroot}
%changelog
+* Sat Mar 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-28
+- fix typo in libpython.stp (rhbz:575336)
+
* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
- add pyfuntop.stp example (source 7)
- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
commit 71040c91d3b51e90d32b90abe9fa9703a02f7529
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Fri Mar 12 22:40:23 2010 +0000
- add pyfuntop.stp example (source 7)
- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
consistency with python.spec
diff --git a/pyfuntop.stp b/pyfuntop.stp
new file mode 100644
index 0000000..f235a23
--- /dev/null
+++ b/pyfuntop.stp
@@ -0,0 +1,21 @@
+#!/usr/bin/stap
+
+global fn_calls;
+
+probe python.function.entry
+{
+ fn_calls[pid(), filename, funcname, lineno] += 1;
+}
+
+probe timer.ms(1000) {
+ printf("\033[2J\033[1;1H") /* clear screen */
+ printf("%6s %80s %6s %30s %6s\n",
+ "PID", "FILENAME", "LINE", "FUNCTION",
"CALLS")
+ foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
+ printf("%6d %80s %6d %30s %6d\n",
+ pid, filename, lineno, funcname,
+ fn_calls[pid, filename, funcname, lineno]);
+ }
+
+ delete fn_calls;
+}
diff --git a/python3.spec b/python3.spec
index a976965..c0f1d8a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 26%{?dist}
+Release: 27%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -85,6 +85,11 @@ Source5: libpython.stp
# Written by wcohen, mjw, dmalcolm; not yet sent upstream
Source6: systemtap-example.stp
+# Another example systemtap script that uses the tapset
+# Written by dmalcolm; not yet sent upstream
+Source7: pyfuntop.stp
+
+
Patch0: python-3.1.1-config.patch
@@ -226,6 +231,7 @@ chmod +x %{SOURCE1}
%if 0%{?with_systemtap}
# Provide an example of usage of the tapset:
cp -a %{SOURCE6} .
+cp -a %{SOURCE7} .
%endif # with_systemtap
# Ensure that we're using the system copy of various libraries, rather than
@@ -302,10 +308,10 @@ make OPT="$CFLAGS" %{?_smp_mflags}
%install
-rm -fr $RPM_BUILD_ROOT
-mkdir -p $RPM_BUILD_ROOT%{_prefix} $RPM_BUILD_ROOT%{_mandir}
+rm -fr %{buildroot}
+mkdir -p %{buildroot}%{_prefix} %{buildroot}%{_mandir}
-make install DESTDIR=$RPM_BUILD_ROOT INSTALL="install -p"
+make install DESTDIR=%{buildroot} INSTALL="install -p"
mkdir -p ${RPM_BUILD_ROOT}%{pylibdir}/site-packages
@@ -321,17 +327,17 @@ cp -ar Tools/pynche ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
cp -ar Tools/scripts ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
# Documentation tools
-install -m755 -d $RPM_BUILD_ROOT%{pylibdir}/Doc
-cp -ar Doc/tools $RPM_BUILD_ROOT%{pylibdir}/Doc/
+install -m755 -d %{buildroot}%{pylibdir}/Doc
+cp -ar Doc/tools %{buildroot}%{pylibdir}/Doc/
# Demo scripts
-cp -ar Demo $RPM_BUILD_ROOT%{pylibdir}/
+cp -ar Demo %{buildroot}%{pylibdir}/
# Fix for bug #136654
-rm -f $RPM_BUILD_ROOT%{pylibdir}/email/test/data/audiotest.au
$RPM_BUILD_ROOT%{pylibdir}/test/audiotest.au
+rm -f %{buildroot}%{pylibdir}/email/test/data/audiotest.au
%{buildroot}%{pylibdir}/test/audiotest.au
%if "%{_lib}" == "lib64"
-install -d $RPM_BUILD_ROOT/usr/lib/python%{pybasever}/site-packages
+install -d %{buildroot}/usr/lib/python%{pybasever}/site-packages
%endif
# Make python3-devel multilib-ready (bug #192747, #139911)
@@ -343,9 +349,9 @@ install -d $RPM_BUILD_ROOT/usr/lib/python%{pybasever}/site-packages
%else
%global _pyconfig_h %{_pyconfig32_h}
%endif
-mv $RPM_BUILD_ROOT%{_includedir}/python%{pybasever}/pyconfig.h \
- $RPM_BUILD_ROOT%{_includedir}/python%{pybasever}/%{_pyconfig_h}
-cat > $RPM_BUILD_ROOT%{_includedir}/python%{pybasever}/pyconfig.h << EOF
+mv %{buildroot}%{_includedir}/python%{pybasever}/pyconfig.h \
+ %{buildroot}%{_includedir}/python%{pybasever}/%{_pyconfig_h}
+cat > %{buildroot}%{_includedir}/python%{pybasever}/pyconfig.h << EOF
#include <bits/wordsize.h>
#if __WORDSIZE == 32
@@ -358,51 +364,51 @@ cat > $RPM_BUILD_ROOT%{_includedir}/python%{pybasever}/pyconfig.h
<< EOF
EOF
# Fix for bug 201434: make sure distutils looks at the right pyconfig.h file
-sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/"
$RPM_BUILD_ROOT%{pylibdir}/distutils/sysconfig.py
+sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/"
%{buildroot}%{pylibdir}/distutils/sysconfig.py
# Switch all shebangs to refer to the specific Python version.
-LD_LIBRARY_PATH=. ./python Tools/scripts/pathfix.py -i
"%{_bindir}/python%{pybasever}" $RPM_BUILD_ROOT
+LD_LIBRARY_PATH=. ./python Tools/scripts/pathfix.py -i
"%{_bindir}/python%{pybasever}" %{buildroot}
# Remove shebang lines from .py files that aren't executable, and
# remove executability from .py files that don't have a shebang line:
-find $RPM_BUILD_ROOT -name \*.py \
+find %{buildroot} -name \*.py \
\( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
-print -exec sed -i '1d' {} \; \) -o \( \
-perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
-exec chmod a-x {} \; \) \)
# .xpm and .xbm files should not be executable:
-find $RPM_BUILD_ROOT \
+find %{buildroot} \
\( -name \*.xbm -o -name \*.xpm -o -name \*.xpm.1 \) \
-exec chmod a-x {} \;
# Remove executable flag from files that shouldn't have it:
chmod a-x \
- $RPM_BUILD_ROOT%{pylibdir}/Demo/comparisons/patterns \
- $RPM_BUILD_ROOT%{pylibdir}/distutils/tests/Setup.sample \
- $RPM_BUILD_ROOT%{pylibdir}/Demo/rpc/test \
- $RPM_BUILD_ROOT%{pylibdir}/Tools/README \
- $RPM_BUILD_ROOT%{pylibdir}/Demo/scripts/newslist.doc \
- $RPM_BUILD_ROOT%{pylibdir}/Demo/md5test/foo
+ %{buildroot}%{pylibdir}/Demo/comparisons/patterns \
+ %{buildroot}%{pylibdir}/distutils/tests/Setup.sample \
+ %{buildroot}%{pylibdir}/Demo/rpc/test \
+ %{buildroot}%{pylibdir}/Tools/README \
+ %{buildroot}%{pylibdir}/Demo/scripts/newslist.doc \
+ %{buildroot}%{pylibdir}/Demo/md5test/foo
# Get rid of DOS batch files:
-find $RPM_BUILD_ROOT -name \*.bat -exec rm {} \;
+find %{buildroot} -name \*.bat -exec rm {} \;
# Get rid of backup files:
-find $RPM_BUILD_ROOT/ -name "*~" -exec rm -f {} \;
+find %{buildroot}/ -name "*~" -exec rm -f {} \;
find . -name "*~" -exec rm -f {} \;
-rm -f $RPM_BUILD_ROOT%{pylibdir}/LICENSE.txt
+rm -f %{buildroot}%{pylibdir}/LICENSE.txt
# Junk, no point in putting in -test sub-pkg
rm -f ${RPM_BUILD_ROOT}/%{pylibdir}/idlelib/testcode.py*
# Get rid of stray patch file from buildroot:
-rm -f $RPM_BUILD_ROOT%{pylibdir}/test/test_imp.py.apply-our-changes-to-expected-shebang #
from patch 4
+rm -f %{buildroot}%{pylibdir}/test/test_imp.py.apply-our-changes-to-expected-shebang #
from patch 4
# Fix end-of-line encodings:
-find $RPM_BUILD_ROOT/ -name \*.py -exec sed -i 's/\r//' {} \;
+find %{buildroot}/ -name \*.py -exec sed -i 's/\r//' {} \;
# Fix an encoding:
-iconv -f iso8859-1 -t utf-8 $RPM_BUILD_ROOT/%{pylibdir}/Demo/rpc/README > README.conv
&& mv -f README.conv $RPM_BUILD_ROOT/%{pylibdir}/Demo/rpc/README
+iconv -f iso8859-1 -t utf-8 %{buildroot}/%{pylibdir}/Demo/rpc/README > README.conv
&& mv -f README.conv %{buildroot}/%{pylibdir}/Demo/rpc/README
# Note that
# %{pylibdir}/Demo/distutils/test2to3/setup.py
@@ -414,16 +420,16 @@ iconv -f iso8859-1 -t utf-8
$RPM_BUILD_ROOT/%{pylibdir}/Demo/rpc/README > README
LD_LIBRARY_PATH=. /usr/lib/rpm/brp-python-bytecompile ./python
# Fixup permissions for shared libraries from non-standard 555 to standard 755:
-find $RPM_BUILD_ROOT \
+find %{buildroot} \
-perm 555 -exec chmod 755 {} \;
-mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
-install -m 644 %{SOURCE2} $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
-install -m 644 %{SOURCE3} $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
+mkdir -p %{buildroot}/%{_sysconfdir}/rpm
+install -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/rpm
+install -m 644 %{SOURCE3} %{buildroot}/%{_sysconfdir}/rpm
# Ensure that the curses module was linked against libncursesw.so, rather than
# libncurses.so (bug 539917)
-ldd $RPM_BUILD_ROOT/%{dynload_dir}/_curses*.so \
+ldd %{buildroot}/%{dynload_dir}/_curses*.so \
| grep curses \
| grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
@@ -515,7 +521,7 @@ done
# the build, due to permissions issues.
%clean
-rm -fr $RPM_BUILD_ROOT
+rm -fr %{buildroot}
%post libs -p /sbin/ldconfig
@@ -649,7 +655,7 @@ rm -fr $RPM_BUILD_ROOT
%{_libdir}/%{py_INSTSONAME}
%if 0%{?with_systemtap}
%{tapsetdir}/%{libpython_stp}
-%doc systemtap-example.stp
+%doc systemtap-example.stp pyfuntop.stp
%endif
%files devel
@@ -713,6 +719,11 @@ rm -fr $RPM_BUILD_ROOT
%changelog
+* Fri Mar 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-27
+- add pyfuntop.stp example (source 7)
+- convert usage of $$RPM_BUILD_ROOT to %%{buildroot} throughout, for
+consistency with python.spec
+
* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
- rebuild for new package of redhat-rpm-config (rhbz:564527)
- use 'install -p' when running 'make install'
commit 3d86c8fa809f4c705116c0119864d1362e69a78f
Author: tomspur <tomspur(a)fedoraproject.org>
Date: Mon Feb 15 13:59:41 2010 +0000
rebuild for new version of redhat-rpm-config
diff --git a/python3.spec b/python3.spec
index 92f94fa..a976965 100644
--- a/python3.spec
+++ b/python3.spec
@@ -39,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 25%{?dist}
+Release: 26%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -305,7 +305,7 @@ make OPT="$CFLAGS" %{?_smp_mflags}
rm -fr $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT%{_prefix} $RPM_BUILD_ROOT%{_mandir}
-make install DESTDIR=$RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT INSTALL="install -p"
mkdir -p ${RPM_BUILD_ROOT}%{pylibdir}/site-packages
@@ -713,6 +713,10 @@ rm -fr $RPM_BUILD_ROOT
%changelog
+* Mon Feb 15 2010 Thomas Spura <tomspur(a)fedoraproject.org> - 3.1.1-26
+- rebuild for new package of redhat-rpm-config (rhbz:564527)
+- use 'install -p' when running 'make install'
+
* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
- split configure options into multiple lines for easy of editing
- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
commit c969609dfe5e910fd675a14fbb6c0720597d1da3
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Fri Feb 12 21:38:52 2010 +0000
- split configure options into multiple lines for easy of editing
- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a
systemtap tapset defining "python.function.entry" and
"python.function.return" to make the markers easy to use (dmalcolm;
source 5), and an example of using the tapset to the docs (dmalcolm;
source 6) (rhbz:545179)
diff --git a/libpython.stp b/libpython.stp
new file mode 100644
index 0000000..862061f
--- /dev/null
+++ b/libpython.stp
@@ -0,0 +1,17 @@
+/* Systemtap tapset to make it easier to trace Python */
+
+/*
+ Define python.function.entry/return:
+*/
+probe python.function.entry =
process("python3").library("LIBRARY_PATH").mark("function__entry")
+{
+ filename = user_string($arg1);
+ funcname = user_string($arg2);
+ lineno = $arg3;
+}
+probe python.function.return =
process("python3").("LIBRARY_PATH").mark("function__return")
+{
+ filename = user_string($arg1);
+ funcname = user_string($arg2);
+ lineno = $arg3;
+}
diff --git a/python-3.1.1-systemtap.patch b/python-3.1.1-systemtap.patch
new file mode 100644
index 0000000..49c06f8
--- /dev/null
+++ b/python-3.1.1-systemtap.patch
@@ -0,0 +1,322 @@
+diff -up Python-3.1.1/configure.in.systemtap Python-3.1.1/configure.in
+--- Python-3.1.1/configure.in.systemtap 2010-02-12 15:24:34.959845279 -0500
++++ Python-3.1.1/configure.in 2010-02-12 15:24:34.965845345 -0500
+@@ -2359,6 +2359,38 @@ then
+ fi
+ AC_MSG_RESULT($with_pymalloc)
+
++# Check for dtrace support
++AC_MSG_CHECKING(for --with-dtrace)
++AC_ARG_WITH(dtrace,
++ AC_HELP_STRING(--with(out)-dtrace, disable/enable dtrace support))
++
++if test ! -z "$with_dtrace"
++then
++ if dtrace -G -o /dev/null -s $srcdir/Include/pydtrace.d 2>/dev/null
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Sun"
++ DTRACEOBJS="Python/dtrace.o"
++ DTRADEHDRS=""
++ elif dtrace -h -o /dev/null -s $srcdir/Include/pydtrace.d
++ then
++ AC_DEFINE(WITH_DTRACE, 1,
++ [Define if you want to compile in Dtrace support])
++ with_dtrace="Apple"
++ DTRACEOBJS=""
++ DTRADEHDRS="pydtrace.h"
++ else
++ with_dtrace="no"
++ fi
++else
++ with_dtrace="no"
++fi
++
++AC_MSG_RESULT($with_dtrace)
++AC_SUBST(DTRACEOBJS)
++AC_SUBST(DTRACEHDRS)
++
+ # Check for --with-wctype-functions
+ AC_MSG_CHECKING(for --with-wctype-functions)
+ AC_ARG_WITH(wctype-functions,
+diff -up Python-3.1.1/Include/pydtrace.d.systemtap Python-3.1.1/Include/pydtrace.d
+--- Python-3.1.1/Include/pydtrace.d.systemtap 2010-02-12 15:24:34.966844913 -0500
++++ Python-3.1.1/Include/pydtrace.d 2010-02-12 15:24:34.966844913 -0500
+@@ -0,0 +1,10 @@
++provider python {
++ probe function__entry(const char *, const char *, int);
++ probe function__return(const char *, const char *, int);
++};
++
++#pragma D attributes Evolving/Evolving/Common provider python provider
++#pragma D attributes Private/Private/Common provider python module
++#pragma D attributes Private/Private/Common provider python function
++#pragma D attributes Evolving/Evolving/Common provider python name
++#pragma D attributes Evolving/Evolving/Common provider python args
+diff -up Python-3.1.1/Makefile.pre.in.systemtap Python-3.1.1/Makefile.pre.in
+--- Python-3.1.1/Makefile.pre.in.systemtap 2010-02-12 15:24:34.953845073 -0500
++++ Python-3.1.1/Makefile.pre.in 2010-02-12 15:24:34.990844336 -0500
+@@ -312,6 +312,7 @@ PYTHON_OBJS= \
+ Python/dtoa.o \
+ Python/formatter_unicode.o \
+ Python/$(DYNLOADFILE) \
++ @DTRACEOBJS@ \
+ $(LIBOBJS) \
+ $(MACHDEP_OBJS) \
+ $(THREADOBJ)
+@@ -592,6 +593,18 @@ Python/formatter_unicode.o: $(srcdir)/Py
+ $(srcdir)/Objects/stringlib/formatter.h
+
+
++# Only needed with --with-dtrace
++buildinclude:
++ mkdir -p Include
++
++Include/pydtrace.h: buildinclude $(srcdir)/Include/pydtrace.d
++ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Include/pydtrace.d
++
++Python/ceval.o: Include/pydtrace.h
++
++Python/dtrace.o: buildinclude $(srcdir)/Include/pydtrace.d Python/ceval.o
++ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Include/pydtrace.d Python/ceval.o
++
+ ############################################################################
+ # Header files
+
+@@ -1224,6 +1237,6 @@ Python/thread.o: @THREADHEADERS@
+ .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
+ .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
+ .PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean
+-.PHONY: smelly funny patchcheck
++.PHONY: smelly funny patchcheck buildinclude
+
+ # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
+diff -up Python-3.1.1/pyconfig.h.in.systemtap Python-3.1.1/pyconfig.h.in
+--- Python-3.1.1/pyconfig.h.in.systemtap 2009-05-29 13:25:39.000000000 -0400
++++ Python-3.1.1/pyconfig.h.in 2010-02-12 15:24:34.991845511 -0500
+@@ -5,6 +5,9 @@
+ #define Py_PYCONFIG_H
+
+
++/* Define if building universal (internal helper macro) */
++#undef AC_APPLE_UNIVERSAL_BUILD
++
+ /* Define for AIX if your compiler is a genuine IBM xlC/xlC_r and you want
+ support for AIX C++ shared extension modules. */
+ #undef AIX_GENUINE_CPLUSPLUS
+@@ -995,6 +998,28 @@
+ /* Define if you want to use computed gotos in ceval.c. */
+ #undef USE_COMPUTED_GOTOS
+
++/* Enable extensions on AIX 3, Interix. */
++#ifndef _ALL_SOURCE
++# undef _ALL_SOURCE
++#endif
++/* Enable GNU extensions on systems that have them. */
++#ifndef _GNU_SOURCE
++# undef _GNU_SOURCE
++#endif
++/* Enable threading extensions on Solaris. */
++#ifndef _POSIX_PTHREAD_SEMANTICS
++# undef _POSIX_PTHREAD_SEMANTICS
++#endif
++/* Enable extensions on HP NonStop. */
++#ifndef _TANDEM_SOURCE
++# undef _TANDEM_SOURCE
++#endif
++/* Enable general extensions on Solaris. */
++#ifndef __EXTENSIONS__
++# undef __EXTENSIONS__
++#endif
++
++
+ /* Define if a va_list is an array of some kind */
+ #undef VA_LIST_IS_ARRAY
+
+@@ -1011,6 +1036,9 @@
+ /* Define if you want documentation strings in extension modules */
+ #undef WITH_DOC_STRINGS
+
++/* Define if you want to compile in Dtrace support */
++#undef WITH_DTRACE
++
+ /* Define if you want to use the new-style (Openstep, Rhapsody, MacOS) dynamic
+ linker (dyld) instead of the old-style (NextStep) dynamic linker (rld).
+ Dyld is necessary to support frameworks. */
+@@ -1032,20 +1060,21 @@
+ /* Define to profile with the Pentium timestamp counter */
+ #undef WITH_TSC
+
+-/* Define to 1 if your processor stores words with the most significant byte
+- first (like Motorola and SPARC, unlike Intel and VAX). */
+-#undef WORDS_BIGENDIAN
++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
++ significant byte first (like Motorola and SPARC, unlike Intel). */
++#if defined AC_APPLE_UNIVERSAL_BUILD
++# if defined __BIG_ENDIAN__
++# define WORDS_BIGENDIAN 1
++# endif
++#else
++# ifndef WORDS_BIGENDIAN
++# undef WORDS_BIGENDIAN
++# endif
++#endif
+
+ /* Define if arithmetic is subject to x87-style double rounding issue */
+ #undef X87_DOUBLE_ROUNDING
+
+-/* Define to 1 if on AIX 3.
+- System headers sometimes define this.
+- We just want to avoid a redefinition error message. */
+-#ifndef _ALL_SOURCE
+-# undef _ALL_SOURCE
+-#endif
+-
+ /* Define on OpenBSD to activate all library features */
+ #undef _BSD_SOURCE
+
+@@ -1064,15 +1093,25 @@
+ /* This must be defined on some systems to enable large file support. */
+ #undef _LARGEFILE_SOURCE
+
++/* Define to 1 if on MINIX. */
++#undef _MINIX
++
+ /* Define on NetBSD to activate all library features */
+ #undef _NETBSD_SOURCE
+
+ /* Define _OSF_SOURCE to get the makedev macro. */
+ #undef _OSF_SOURCE
+
++/* Define to 2 if the system does not provide POSIX.1 features except with
++ this defined. */
++#undef _POSIX_1_SOURCE
++
+ /* Define to activate features from IEEE Stds 1003.1-2001 */
+ #undef _POSIX_C_SOURCE
+
++/* Define to 1 if you need to in order for `stat' and other things to work. */
++#undef _POSIX_SOURCE
++
+ /* Define if you have POSIX threads, and your system does not define that. */
+ #undef _POSIX_THREADS
+
+@@ -1080,12 +1119,12 @@
+ #undef _REENTRANT
+
+ /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
+- <pthread.h>, or <semaphore.h> is not used. If the typedef was allowed,
the
++ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed,
the
+ #define below would cause a syntax error. */
+ #undef _UINT32_T
+
+ /* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
+- <pthread.h>, or <semaphore.h> is not used. If the typedef was allowed,
the
++ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed,
the
+ #define below would cause a syntax error. */
+ #undef _UINT64_T
+
+diff -up Python-3.1.1/Python/ceval.c.systemtap Python-3.1.1/Python/ceval.c
+--- Python-3.1.1/Python/ceval.c.systemtap 2009-05-30 17:41:10.000000000 -0400
++++ Python-3.1.1/Python/ceval.c 2010-02-12 15:24:54.075844169 -0500
+@@ -19,6 +19,10 @@
+
+ #include <ctype.h>
+
++#ifdef WITH_DTRACE
++#include "pydtrace.h"
++#endif
++
+ #ifndef WITH_TSC
+
+ #define READ_TIMESTAMP(var)
+@@ -655,6 +659,69 @@ PyEval_EvalCode(PyCodeObject *co, PyObje
+ NULL, NULL);
+ }
+
++#ifdef WITH_DTRACE
++struct frame_marker_info
++{
++ char *filename;
++ char *name;
++ int lineno;
++
++ PyObject *utf8_filename;
++ PyObject *utf8_name;
++};
++
++static void
++get_frame_marker_info(PyFrameObject *f, struct frame_marker_info *fmi)
++{
++ fmi->utf8_filename = PyUnicode_AsUTF8String(f->f_code->co_filename);
++ if (fmi->utf8_filename) {
++ fmi->filename = PyBytes_AsString(fmi->utf8_filename);
++ } else {
++ fmi->filename = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->utf8_name = PyUnicode_AsUTF8String(f->f_code->co_name);
++ if (fmi->utf8_name) {
++ fmi->name = PyBytes_AsString(fmi->utf8_name);
++ } else {
++ fmi->name = NULL;
++ /* FIXME: clear the exception? */
++ }
++
++ fmi->lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
++}
++
++static void
++release_frame_marker_info(struct frame_marker_info *fmi)
++{
++ Py_XDECREF(fmi->utf8_filename);
++ Py_XDECREF(fmi->utf8_name);
++}
++
++static void
++dtrace_entry(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_ENTRY(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++
++static void
++dtrace_return(PyFrameObject *f)
++{
++ struct frame_marker_info fmi;
++ get_frame_marker_info(f, &fmi);
++ PYTHON_FUNCTION_RETURN(fmi.filename, fmi.name, fmi.lineno);
++ release_frame_marker_info(&fmi);
++}
++#else
++#define PYTHON_FUNCTION_ENTRY_ENABLED() 0
++#define PYTHON_FUNCTION_RETURN_ENABLED() 0
++#define dtrace_entry(f)
++#define dtrace_return(f)
++#endif
+
+ /* Interpreter main loop */
+
+@@ -1061,6 +1128,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
+ }
+ }
+
++ if (PYTHON_FUNCTION_ENTRY_ENABLED())
++ dtrace_entry(f);
++
+ co = f->f_code;
+ names = co->co_names;
+ consts = co->co_consts;
+@@ -2907,6 +2977,8 @@ fast_yield:
+
+ /* pop frame */
+ exit_eval_frame:
++ if (PYTHON_FUNCTION_RETURN_ENABLED())
++ dtrace_return(f);
+ Py_LeaveRecursiveCall();
+ tstate->frame = f->f_back;
+
diff --git a/python3.spec b/python3.spec
index 2c8e826..92f94fa 100644
--- a/python3.spec
+++ b/python3.spec
@@ -14,6 +14,8 @@
%global with_gdb_hooks 1
+%global with_systemtap 1
+
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
#
@@ -37,7 +39,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 24%{?dist}
+Release: 25%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -74,6 +76,15 @@ Source3: macros.pybytecompile
#
http://fedorapeople.org/gitweb?p=dmalcolm/public_git/libpython.git;a=snap...
Source4: libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
+# Systemtap tapset to make it easier to use the systemtap static probes
+# (actually a template; LIBRARY_PATH will get fixed up during install)
+# Written by dmalcolm; not yet sent upstream
+Source5: libpython.stp
+
+# Example systemtap script using the tapset
+# Written by wcohen, mjw, dmalcolm; not yet sent upstream
+Source6: systemtap-example.stp
+
Patch0: python-3.1.1-config.patch
@@ -112,6 +123,13 @@ Patch6: python-3.1.1-no-static-lib.patch
# Adapted from
http://svn.python.org/view?view=rev&revision=77170
Patch7: python-3.1.1-with-system-expat.patch
+# Systemtap support: add statically-defined probe points
+# Patch based on upstream bug:
http://bugs.python.org/issue4111
+# fixed up by mjw and wcohen for 2.6.2, then fixed up by dmalcolm for 2.6.4
+# then rewritten by mjw (attachment 390110 of rhbz 545179); ported to 3.1.1 by
+# dmalcolm
+Patch8: python-3.1.1-systemtap.patch
+
Patch102: python-3.1.1-lib64.patch
#
http://bugs.python.org/issue6999 -- fixed in r75062
@@ -128,6 +146,11 @@ BuildRequires: autoconf
BuildRequires: db4-devel >= 4.7
BuildRequires: libffi-devel
+%if 0%{?with_systemtap}
+BuildRequires: systemtap-sdt-devel
+%global tapsetdir /usr/share/systemtap/tapset
+%endif
+
URL:
http://www.python.org/
# See notes in bug 532118:
@@ -200,6 +223,11 @@ chmod +x %{SOURCE1}
%setup -q -n Python-%{version} -T -D -a 4
%endif # with_gdb_hooks
+%if 0%{?with_systemtap}
+# Provide an example of usage of the tapset:
+cp -a %{SOURCE6} .
+%endif # with_systemtap
+
# Ensure that we're using the system copy of various libraries, rather than
# copies shipped by upstream in the tarball:
# Remove embedded copy of expat:
@@ -224,6 +252,9 @@ rm -r Modules/zlib || exit 1
%patch5 -p1 -b .install-tkinter-tests
%patch6 -p1 -b .no-static-lib
%patch7 -p1 -b .expat
+%if 0%{?with_systemtap}
+%patch8 -p1 -b .systemtap
+%endif
%if "%{_lib}" == "lib64"
%patch102 -p1 -b .lib64
@@ -251,7 +282,21 @@ export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`"
autoconf
-%configure --enable-ipv6 --with-wide-unicode --enable-shared --with-system-ffi
--with-system-expat
+
+# For patch 8 (systemtap), we need to get a new header for configure to use:
+autoheader
+
+%configure \
+ --enable-ipv6 \
+ --with-wide-unicode \
+ --enable-shared \
+%if 0%{?with_systemtap}
+ --with-dtrace \
+ --with-tapset-install-dir=%{tapsetdir} \
+%endif
+ --with-system-ffi \
+ --with-system-expat
+
make OPT="$CFLAGS" %{?_smp_mflags}
@@ -397,6 +442,25 @@ mkdir -p %{buildroot}%{_prefix}/lib/debug/%{_libdir}
cp libpython/libpython.py
%{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug-gdb.py
%endif # with_gdb_hooks
+#
+# Systemtap hooks:
+#
+%if 0%{?with_systemtap}
+# Install a tapset for this libpython into tapsetdir, fixing up the path to the
+# library:
+mkdir -p %{buildroot}%{tapsetdir}
+%ifarch ppc64 s390x x86_64 ia64 alpha sparc64
+%global libpython_stp libpython%{pybasever}-64.stp
+%else
+%global libpython_stp libpython%{pybasever}-32.stp
+%endif
+
+sed \
+ -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME}|" \
+ %{SOURCE5} \
+ > %{buildroot}%{tapsetdir}/%{libpython_stp}
+%endif # with_systemtap
+
%check
# Run the upstream test suite, using the "runtests.sh" harness from the
upstream
# tarball.
@@ -583,6 +647,10 @@ rm -fr $RPM_BUILD_ROOT
%files libs
%defattr(-,root,root,-)
%{_libdir}/%{py_INSTSONAME}
+%if 0%{?with_systemtap}
+%{tapsetdir}/%{libpython_stp}
+%doc systemtap-example.stp
+%endif
%files devel
%defattr(-,root,root)
@@ -645,6 +713,13 @@ rm -fr $RPM_BUILD_ROOT
%changelog
+* Fri Feb 12 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-25
+- split configure options into multiple lines for easy of editing
+- add systemtap static markers (wcohen, mjw, dmalcolm; patch 8), a systemtap
+tapset defining "python.function.entry" and "python.function.return"
to make
+the markers easy to use (dmalcolm; source 5), and an example of using the
+tapset to the docs (dmalcolm; source 6) (rhbz:545179)
+
* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
diff --git a/systemtap-example.stp b/systemtap-example.stp
new file mode 100644
index 0000000..164333a
--- /dev/null
+++ b/systemtap-example.stp
@@ -0,0 +1,19 @@
+/*
+ Example usage of the Python systemtap tapset to show a nested view of all
+ Python function calls (and returns) across the whole system.
+
+ Run this using
+ stap systemtap-example.stp
+ to instrument all Python processes on the system, or (for example) using
+ stap systemtap-example.stp -c COMMAND
+ to instrument a specific program (implemented in Python)
+*/
+probe python.function.entry
+{
+ printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename,
lineno);
+}
+
+probe python.function.return
+{
+ printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename,
lineno);
+}
commit d5a5bf3c65f387385a4839feffbc1926e2f155bf
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Tue Feb 9 03:51:42 2010 +0000
- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid
noise from ldconfig (bug 562980), and which should also ensure it
becomes part of the debuginfo subpackage, rather than the libs
subpackage
- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
configure script, and to avoid fragile scripts that try to figure this
out dynamically (e.g. for the -gdb.py change)
diff --git a/python3.spec b/python3.spec
index f61c9df..2c8e826 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,6 +2,16 @@
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
+# Python's configure script defines SOVERSION, and this is used in the Makefile
+# to determine INSTSONAME, the name of the libpython DSO:
+# LDLIBRARY='libpython$(VERSION).so'
+# INSTSONAME="$LDLIBRARY".$SOVERSION
+# We mirror this here in order to make it easier to add the -gdb.py hooks.
+# (if these get out of sync, the payload of the libs subpackage will fail
+# and halt the build)
+%global py_SOVERSION 1.0
+%global py_INSTSONAME libpython%{pybasever}.so.%{py_SOVERSION}
+
%global with_gdb_hooks 1
# We want to byte-compile the .py files within the packages using the new
@@ -27,7 +37,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 23%{?dist}
+Release: 24%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -50,15 +60,12 @@ Source3: macros.pybytecompile
# We install a collection of hooks for gdb that make it easier to debug
# executables linked against libpython (such as /usr/lib/python itself)
#
-# These hooks are implemented in Python itself
-#
-# We'll install them into the same path as the library, with a -gdb.py suffix
-# e.g.
-# /usr/lib/libpython3.1.so.1.0-gdb.py
+# These hooks are implemented in Python itself (though they are for the version
+# of python that gdb is linked with, in this case Python 2.6)
#
-# It would be better to put them in the -debuginfo subpackage e.g. here:
+# gdb-archer looks for them in the same path as the ELF file, with a -gdb.py suffix.
+# We put them in the debuginfo package by installing them to e.g.:
# /usr/lib/debug/usr/lib/libpython3.1.so.1.0.debug-gdb.py
-# but unfortunately it's hard to add custom content to a debuginfo subpackage
#
# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
# information
@@ -378,17 +385,16 @@ ldd $RPM_BUILD_ROOT/%{dynload_dir}/_curses*.so \
# Copy up the gdb hooks into place; the python file will be autoloaded by gdb
# when visiting libpython.so, provided that the python file is installed to the
# same path as the library (or its .debug file) plus a "-gdb.py" suffix, e.g:
+# /usr/lib/debug/usr/lib64/libpython3.1.so.1.0.debug-gdb.py
+# (note that the debug path is /usr/lib/debug for both 32/64 bit)
+#
+# Initially I tried:
# /usr/lib/libpython3.1.so.1.0-gdb.py
+# but doing so generated noise when ldconfig was rerun (rhbz:562980)
#
-# Long term, this should probably go in the debuginfo subpackage, e.g:
-# /usr/lib/debug/usr/lib/libpython3.1.so.1.0.debug-gdb.py
-#
-# We use a for loop here to avoid having the RHS of the cp command be quoted,
-# leading to a filename with a "*" character embedded in it
%if 0%{?with_gdb_hooks}
-for lib in %{buildroot}%{_libdir}/libpython%{pybasever}.so.* ; do
- cp libpython/libpython.py ${lib}-gdb.py
-done
+mkdir -p %{buildroot}%{_prefix}/lib/debug/%{_libdir}
+cp libpython/libpython.py
%{buildroot}%{_prefix}/lib/debug/%{_libdir}/%{py_INSTSONAME}.debug-gdb.py
%endif # with_gdb_hooks
%check
@@ -576,10 +582,7 @@ rm -fr $RPM_BUILD_ROOT
%files libs
%defattr(-,root,root,-)
-%{_libdir}/libpython%{pybasever}.so.*
-%if 0%{?with_gdb_hooks}
-%{_libdir}/libpython%{pybasever}.so.*-gdb.py*
-%endif # with_gdb_hooks
+%{_libdir}/%{py_INSTSONAME}
%files devel
%defattr(-,root,root)
@@ -627,7 +630,30 @@ rm -fr $RPM_BUILD_ROOT
%doc %{pylibdir}/Demo/md5test
%{pylibdir}/tkinter/test
+# We put the debug-gdb.py file inside /usr/lib/debug to avoid noise from
+# ldconfig (rhbz:562980).
+#
+# The /usr/lib/rpm/redhat/macros defines %__debug_package to use
+# debugfiles.list, and it appears that everything below /usr/lib/debug and
+# (/usr/src/debug) gets added to this file (via LISTFILES) in
+# /usr/lib/rpm/find-debuginfo.sh
+#
+# Hence by installing it below /usr/lib/debug we ensure it is added to the
+# -debuginfo subpackage
+# (if it doesn't, then the rpmbuild ought to fail since the debug-gdb.py
+# payload file would be unpackaged)
+
+
%changelog
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-24
+- move the -gdb.py file from %%{_libdir}/INSTSONAME-gdb.py to
+%%{_prefix}/lib/debug/%%{_libdir}/INSTSONAME.debug-gdb.py to avoid noise from
+ldconfig (bug 562980), and which should also ensure it becomes part of the
+debuginfo subpackage, rather than the libs subpackage
+- introduce %%{py_SOVERSION} and %%{py_INSTSONAME} to reflect the upstream
+configure script, and to avoid fragile scripts that try to figure this out
+dynamically (e.g. for the -gdb.py change)
+
* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
- add gdb hooks for easier debugging (Source 4)
commit b2154fa79e55bed6910922a5e6c3354e1a017478
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Mon Feb 8 20:41:07 2010 +0000
- add gdb hooks for easier debugging (Source 4)
diff --git a/.cvsignore b/.cvsignore
index 56857ac..9feab04 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1 +1,2 @@
Python-3.1.1.tar.bz2
+libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
diff --git a/python3.spec b/python3.spec
index 70e256c..f61c9df 100644
--- a/python3.spec
+++ b/python3.spec
@@ -2,6 +2,8 @@
%global pylibdir %{_libdir}/python%{pybasever}
%global dynload_dir %{pylibdir}/lib-dynload
+%global with_gdb_hooks 1
+
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
#
@@ -25,7 +27,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 22%{?dist}
+Release: 23%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -45,6 +47,26 @@ Source2: macros.python3
# with different Python runtimes as necessary:
Source3: macros.pybytecompile
+# We install a collection of hooks for gdb that make it easier to debug
+# executables linked against libpython (such as /usr/lib/python itself)
+#
+# These hooks are implemented in Python itself
+#
+# We'll install them into the same path as the library, with a -gdb.py suffix
+# e.g.
+# /usr/lib/libpython3.1.so.1.0-gdb.py
+#
+# It would be better to put them in the -debuginfo subpackage e.g. here:
+# /usr/lib/debug/usr/lib/libpython3.1.so.1.0.debug-gdb.py
+# but unfortunately it's hard to add custom content to a debuginfo subpackage
+#
+# See
https://fedoraproject.org/wiki/Features/EasierPythonDebugging for more
+# information
+#
+# Downloaded from:
+#
http://fedorapeople.org/gitweb?p=dmalcolm/public_git/libpython.git;a=snap...
+Source4: libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
+
Patch0: python-3.1.1-config.patch
@@ -165,6 +187,12 @@ python 3 code that uses more than just unittest and/or
test_support.py.
%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
+# Unpack source archive 4 into this same dir without deleting (-D; -T suppress
+# trying to unpack source 0 again):
+%if 0%{?with_gdb_hooks}
+%setup -q -n Python-%{version} -T -D -a 4
+%endif # with_gdb_hooks
+
# Ensure that we're using the system copy of various libraries, rather than
# copies shipped by upstream in the tarball:
# Remove embedded copy of expat:
@@ -347,6 +375,22 @@ ldd $RPM_BUILD_ROOT/%{dynload_dir}/_curses*.so \
| grep curses \
| grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
+# Copy up the gdb hooks into place; the python file will be autoloaded by gdb
+# when visiting libpython.so, provided that the python file is installed to the
+# same path as the library (or its .debug file) plus a "-gdb.py" suffix, e.g:
+# /usr/lib/libpython3.1.so.1.0-gdb.py
+#
+# Long term, this should probably go in the debuginfo subpackage, e.g:
+# /usr/lib/debug/usr/lib/libpython3.1.so.1.0.debug-gdb.py
+#
+# We use a for loop here to avoid having the RHS of the cp command be quoted,
+# leading to a filename with a "*" character embedded in it
+%if 0%{?with_gdb_hooks}
+for lib in %{buildroot}%{_libdir}/libpython%{pybasever}.so.* ; do
+ cp libpython/libpython.py ${lib}-gdb.py
+done
+%endif # with_gdb_hooks
+
%check
# Run the upstream test suite, using the "runtests.sh" harness from the
upstream
# tarball.
@@ -533,6 +577,9 @@ rm -fr $RPM_BUILD_ROOT
%files libs
%defattr(-,root,root,-)
%{_libdir}/libpython%{pybasever}.so.*
+%if 0%{?with_gdb_hooks}
+%{_libdir}/libpython%{pybasever}.so.*-gdb.py*
+%endif # with_gdb_hooks
%files devel
%defattr(-,root,root)
@@ -581,6 +628,9 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Mon Feb 8 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-23
+- add gdb hooks for easier debugging (Source 4)
+
* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
- update python-3.1.1-config.patch to remove downstream customization of build
of pyexpat and elementtree modules
diff --git a/sources b/sources
index 59b2b95..e5f0cae 100644
--- a/sources
+++ b/sources
@@ -1 +1,2 @@
d1ddd9f16e3c6a51c7208f33518cd674 Python-3.1.1.tar.bz2
+e9b2198d72a406698c8de07467654204
libpython-36a517ef7848cbd0b3dcc7371f32e47ac4c87eba.tar.gz
commit 1ae4dd3f5ee216f23c139f77439ef00a2e4944c0
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Thu Jan 28 19:56:39 2010 +0000
- update python-3.1.1-config.patch to remove downstream customization of
build of pyexpat and elementtree modules
- add patch adapted from upstream (patch 7) to add support for building
against system expat; add --with-system-expat to "configure" invocation
- remove embedded copies of expat and zlib from source tree during "prep"
diff --git a/python-3.1.1-config.patch b/python-3.1.1-config.patch
index 5ec9024..b9eec5b 100644
--- a/python-3.1.1-config.patch
+++ b/python-3.1.1-config.patch
@@ -1,6 +1,7 @@
---- Python-3.1.1/Modules/Setup.dist.config 2009-06-04 03:30:30.000000000 -0600
-+++ Python-3.1.1/Modules/Setup.dist 2009-09-25 12:14:38.000000000 -0600
-@@ -141,7 +141,7 @@
+diff -up Python-3.1.1/Modules/Setup.dist.config Python-3.1.1/Modules/Setup.dist
+--- Python-3.1.1/Modules/Setup.dist.config 2009-06-04 05:30:30.000000000 -0400
++++ Python-3.1.1/Modules/Setup.dist 2010-01-25 23:08:55.179858352 -0500
+@@ -141,7 +141,7 @@ _symtable symtablemodule.c
# modules are to be built as shared libraries (see above for more
# detail; also note that *static* reverses this effect):
@@ -9,7 +10,7 @@
# GNU readline. Unlike previous Python incarnations, GNU readline is
# now incorporated in an optional module, configured in the Setup file
-@@ -151,71 +151,71 @@
+@@ -151,71 +151,71 @@ _symtable symtablemodule.c
# it, depending on your system -- see the GNU readline instructions.
# It's okay for this to be a shared library, too.
@@ -31,11 +32,6 @@
-#_collections _collectionsmodule.c # Container types
-#itertools itertoolsmodule.c # Functions creating iterators for efficient looping
-#atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
--#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
_elementtree.c # elementtree accelerator
--#_pickle _pickle.c # pickle accelerator
--#datetime datetimemodule.c # date/time type
--#_bisect _bisectmodule.c # Bisection algorithms
--#_heapq _heapqmodule.c # Heap queue algorithm
+array arraymodule.c # array objects
+cmath cmathmodule.c # -lm # complex math library functions
+math mathmodule.c # -lm # math library functions, e.g. sin()
@@ -48,9 +44,12 @@
+_collections _collectionsmodule.c # Container types
+itertools itertoolsmodule.c # Functions creating iterators for efficient looping
+atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
-+_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
_elementtree.c # elementtree accelerator
+ #_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
_elementtree.c # elementtree accelerator
+-#_pickle _pickle.c # pickle accelerator
+_pickle _pickle.c # pickle accelerator
-+#datetime datetimemodule.c # date/time type
+ #datetime datetimemodule.c # date/time type
+-#_bisect _bisectmodule.c # Bisection algorithms
+-#_heapq _heapqmodule.c # Heap queue algorithm
+_bisect _bisectmodule.c # Bisection algorithms
+_heapq _heapqmodule.c # Heap queue algorithm
@@ -114,7 +113,7 @@
# Multimedia modules -- off by default.
-@@ -223,7 +223,7 @@
+@@ -223,7 +223,7 @@ _symtable symtablemodule.c
# #993173 says audioop works on 64-bit platforms, though.
# These represent audio samples or images as strings:
@@ -123,7 +122,7 @@
# Note that the _md5 and _sha modules are normally only built if the
-@@ -238,9 +238,9 @@
+@@ -238,9 +238,9 @@ _symtable symtablemodule.c
# The _sha module implements the SHA checksum algorithms.
# (NIST's Secure Hash Algorithms.)
@@ -136,7 +135,7 @@
# The _tkinter module.
-@@ -255,7 +255,7 @@
+@@ -255,7 +255,7 @@ _symtable symtablemodule.c
# every system.
# *** Always uncomment this (leave the leading underscore in!):
@@ -145,7 +144,7 @@
# *** Uncomment and edit to reflect where your Tcl/Tk libraries are:
# -L/usr/local/lib \
# *** Uncomment and edit to reflect where your Tcl/Tk headers are:
-@@ -265,7 +265,7 @@
+@@ -265,7 +265,7 @@ _symtable symtablemodule.c
# *** Or uncomment this for Solaris:
# -I/usr/openwin/include \
# *** Uncomment and edit for Tix extension only:
@@ -154,7 +153,7 @@
# *** Uncomment and edit for BLT extension only:
# -DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \
# *** Uncomment and edit for PIL (TkImaging) extension only:
-@@ -274,7 +274,7 @@
+@@ -274,7 +274,7 @@ _symtable symtablemodule.c
# *** Uncomment and edit for TOGL extension only:
# -DWITH_TOGL togl.c \
# *** Uncomment and edit to reflect your Tcl/Tk versions:
@@ -163,7 +162,7 @@
# *** Uncomment and edit to reflect where your X11 libraries are:
# -L/usr/X11R6/lib \
# *** Or uncomment this for Solaris:
-@@ -284,10 +284,10 @@
+@@ -284,10 +284,10 @@ _symtable symtablemodule.c
# *** Uncomment for AIX:
# -lld \
# *** Always uncomment this; X11 libraries to link with:
@@ -176,7 +175,7 @@
# Curses support, requring the System V version of curses, often
-@@ -321,14 +321,14 @@
+@@ -321,14 +321,14 @@ _symtable symtablemodule.c
#
# First, look at Setup.config; configure may have set this for you.
@@ -194,7 +193,7 @@
# Lee Busby's SIGFPE modules.
-@@ -351,7 +351,7 @@
+@@ -351,7 +351,7 @@ _symtable symtablemodule.c
# Andrew Kuchling's zlib module.
# This require zlib 1.1.3 (or later).
# See
http://www.gzip.org/zlib/
@@ -203,13 +202,7 @@
# Interface to the Expat XML parser
#
-@@ -364,19 +364,19 @@
- #
- # More information on Expat can be found at
www.libexpat.org.
- #
--#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c
-I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
-+pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c
-I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
-
+@@ -369,14 +369,14 @@ _symtable symtablemodule.c
# Hye-Shik Chang's CJKCodecs
# multibytecodec is required for all the other CJK codec modules
diff --git a/python-3.1.1-with-system-expat.patch b/python-3.1.1-with-system-expat.patch
new file mode 100644
index 0000000..1c99bf9
--- /dev/null
+++ b/python-3.1.1-with-system-expat.patch
@@ -0,0 +1,67 @@
+diff -up Python-3.1.1/configure.in.expat Python-3.1.1/configure.in
+--- Python-3.1.1/configure.in.expat 2010-01-25 23:02:05.488859572 -0500
++++ Python-3.1.1/configure.in 2010-01-25 23:02:21.425857866 -0500
+@@ -1853,6 +1853,13 @@ LIBS="$withval $LIBS"
+ ],
+ [AC_MSG_RESULT(no)])
+
++# Check for use of the system expat library
++AC_MSG_CHECKING(for --with-system-expat)
++AC_ARG_WITH(system_expat,
++ AC_HELP_STRING(--with-system-expat, build pyexpat module using an installed
expat library))
++
++AC_MSG_RESULT($with_system_expat)
++
+ # Check for use of the system libffi library
+ AC_MSG_CHECKING(for --with-system-ffi)
+ AC_ARG_WITH(system_ffi,
+diff -up Python-3.1.1/setup.py.expat Python-3.1.1/setup.py
+--- Python-3.1.1/setup.py.expat 2010-01-25 23:02:11.254859198 -0500
++++ Python-3.1.1/setup.py 2010-01-25 23:02:21.426857993 -0500
+@@ -1110,19 +1110,26 @@ class PyBuildExt(build_ext):
+ #
+ # More information on Expat can be found at
www.libexpat.org.
+ #
+- expatinc = os.path.join(os.getcwd(), srcdir, 'Modules',
'expat')
+- define_macros = [
+- ('HAVE_EXPAT_CONFIG_H', '1'),
+- ]
++ if '--with-system-expat' in
sysconfig.get_config_var("CONFIG_ARGS"):
++ expat_inc = []
++ define_macros = []
++ expat_lib = ['expat']
++ expat_sources = []
++ else:
++ expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules',
'expat')]
++ define_macros = [
++ ('HAVE_EXPAT_CONFIG_H', '1'),
++ ]
++ expat_lib = []
++ expat_sources = ['expat/xmlparse.c',
++ 'expat/xmlrole.c',
++ 'expat/xmltok.c']
+
+ exts.append(Extension('pyexpat',
+ define_macros = define_macros,
+- include_dirs = [expatinc],
+- sources = ['pyexpat.c',
+- 'expat/xmlparse.c',
+- 'expat/xmlrole.c',
+- 'expat/xmltok.c',
+- ],
++ include_dirs = expat_inc,
++ libraries = expat_lib,
++ sources = ['pyexpat.c'] + expat_sources
+ ))
+
+ # Fredrik Lundh's cElementTree module. Note that this also
+@@ -1132,7 +1139,8 @@ class PyBuildExt(build_ext):
+ define_macros.append(('USE_PYEXPAT_CAPI', None))
+ exts.append(Extension('_elementtree',
+ define_macros = define_macros,
+- include_dirs = [expatinc],
++ include_dirs = expat_inc,
++ libraries = expat_lib,
+ sources = ['_elementtree.c'],
+ ))
+ else:
diff --git a/python3.spec b/python3.spec
index 78a4fed..70e256c 100644
--- a/python3.spec
+++ b/python3.spec
@@ -25,7 +25,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 21%{?dist}
+Release: 22%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -79,6 +79,10 @@ Patch5: python-3.1.1-install-tkinter-tests.patch
# a libpythonMAJOR.MINOR.a (bug 550692):
Patch6: python-3.1.1-no-static-lib.patch
+# Fixup configure.in and setup.py to build against system expat library.
+# Adapted from
http://svn.python.org/view?view=rev&revision=77170
+Patch7: python-3.1.1-with-system-expat.patch
+
Patch102: python-3.1.1-lib64.patch
#
http://bugs.python.org/issue6999 -- fixed in r75062
@@ -161,12 +165,22 @@ python 3 code that uses more than just unittest and/or
test_support.py.
%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
-# Ensure that we're using the system copy of libffi, rather than the copy
-# shipped by upstream in the tarball:
+# Ensure that we're using the system copy of various libraries, rather than
+# copies shipped by upstream in the tarball:
+# Remove embedded copy of expat:
+rm -r Modules/expat || exit 1
+
+# Remove embedded copy of libffi:
for SUBDIR in darwin libffi libffi_arm_wince libffi_msvc libffi_osx ; do
rm -r Modules/_ctypes/$SUBDIR || exit 1 ;
done
+# Remove embedded copy of zlib:
+rm -r Modules/zlib || exit 1
+
+#
+# Apply patches:
+#
%patch0 -p1 -b .config
%patch1 -p1 -b .rpath
%patch2 -p0 -b .fix-handling-of-readonly-pyc-files
@@ -174,6 +188,7 @@ done
%patch4 -p1 -b .apply-our-changes-to-expected-shebang
%patch5 -p1 -b .install-tkinter-tests
%patch6 -p1 -b .no-static-lib
+%patch7 -p1 -b .expat
%if "%{_lib}" == "lib64"
%patch102 -p1 -b .lib64
@@ -201,7 +216,7 @@ export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`"
autoconf
-%configure --enable-ipv6 --with-wide-unicode --enable-shared --with-system-ffi
+%configure --enable-ipv6 --with-wide-unicode --enable-shared --with-system-ffi
--with-system-expat
make OPT="$CFLAGS" %{?_smp_mflags}
@@ -566,6 +581,13 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Thu Jan 28 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-22
+- update python-3.1.1-config.patch to remove downstream customization of build
+of pyexpat and elementtree modules
+- add patch adapted from upstream (patch 7) to add support for building against
+system expat; add --with-system-expat to "configure" invocation
+- remove embedded copies of expat and zlib from source tree during "prep"
+
* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
- introduce %%{dynload_dir} macro
- explicitly list all lib-dynload files, rather than dynamically gathering the
commit 4aab458c0417547929d0bf2035c55c448baef5fd
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Thu Jan 28 19:09:18 2010 +0000
- introduce %%{dynload_dir} macro
- explicitly list all lib-dynload files, rather than dynamically gathering
the payload into a temporary text file, so that we can be sure what we
are shipping
- introduce a macros.pybytecompile source file, to help with packaging
python3 modules (Source3; written by Toshio)
- rename "2to3-3" to "python3-2to3" to better reflect python 3
module
packaging plans
diff --git a/macros.pybytecompile b/macros.pybytecompile
new file mode 100644
index 0000000..a8b79b2
--- /dev/null
+++ b/macros.pybytecompile
@@ -0,0 +1,12 @@
+# Note that the path could itself be a python file, or a directory
+
+# Python's compile_all module only works on directories, and requires a max
+# recursion depth
+
+%py_byte_compile()\
+python_binary="%1"\
+bytecode_compilation_path="%2"\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+\
+find $bytecode_compilation_path -type f -a -name "*.py" -print0 | xargs -0
$python_binary -O -c 'import py_compile, sys; [py_compile.compile(f,
dfile=f.partition("$RPM_BUILD_ROOT")[2]) for f in sys.argv[1:]]' || :\
+%{nil}
diff --git a/python3.spec b/python3.spec
index 512a25b..78a4fed 100644
--- a/python3.spec
+++ b/python3.spec
@@ -1,5 +1,6 @@
%global pybasever 3.1
%global pylibdir %{_libdir}/python%{pybasever}
+%global dynload_dir %{pylibdir}/lib-dynload
# We want to byte-compile the .py files within the packages using the new
# python3 binary.
@@ -24,7 +25,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 20%{?dist}
+Release: 21%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -39,6 +40,11 @@ Source1: find-provides-without-python-sonames.sh
# __python3, python3_sitelib, python3_sitearch
Source2: macros.python3
+# Supply an RPM macro "py_byte_compile" for the python3-devel subpackage
+# to enable specfiles to selectively byte-compile individual files and paths
+# with different Python runtimes as necessary:
+Source3: macros.pybytecompile
+
Patch0: python-3.1.1-config.patch
@@ -208,7 +214,7 @@ make install DESTDIR=$RPM_BUILD_ROOT
mkdir -p ${RPM_BUILD_ROOT}%{pylibdir}/site-packages
-mv ${RPM_BUILD_ROOT}%{_bindir}/2to3 ${RPM_BUILD_ROOT}%{_bindir}/2to3-3
+mv ${RPM_BUILD_ROOT}%{_bindir}/2to3 ${RPM_BUILD_ROOT}%{_bindir}/python3-2to3
# Development tools
install -m755 -d ${RPM_BUILD_ROOT}%{pylibdir}/Tools
@@ -226,13 +232,6 @@ cp -ar Doc/tools $RPM_BUILD_ROOT%{pylibdir}/Doc/
# Demo scripts
cp -ar Demo $RPM_BUILD_ROOT%{pylibdir}/
-find $RPM_BUILD_ROOT%{pylibdir}/lib-dynload -type d | sed "s|$RPM_BUILD_ROOT|%dir
|" > dynfiles
-find $RPM_BUILD_ROOT%{pylibdir}/lib-dynload -type f | \
- grep -v "_tkinter.so$" | \
- grep -v "_ctypes_test.so$" | \
- grep -v "_testcapimodule.so$" | \
- sed "s|$RPM_BUILD_ROOT||" >> dynfiles
-
# Fix for bug #136654
rm -f $RPM_BUILD_ROOT%{pylibdir}/email/test/data/audiotest.au
$RPM_BUILD_ROOT%{pylibdir}/test/audiotest.au
@@ -325,10 +324,11 @@ find $RPM_BUILD_ROOT \
mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
install -m 644 %{SOURCE2} $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
+install -m 644 %{SOURCE3} $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
# Ensure that the curses module was linked against libncursesw.so, rather than
# libncurses.so (bug 539917)
-ldd $RPM_BUILD_ROOT/%{_libdir}/python%{pybasever}/lib-dynload/_curses*.so \
+ldd $RPM_BUILD_ROOT/%{dynload_dir}/_curses*.so \
| grep curses \
| grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
@@ -392,7 +392,7 @@ rm -fr $RPM_BUILD_ROOT
%postun libs -p /sbin/ldconfig
-%files -f dynfiles
+%files
%defattr(-, root, root)
%doc LICENSE README
%{_bindir}/pydoc*
@@ -400,6 +400,68 @@ rm -fr $RPM_BUILD_ROOT
%{_bindir}/python%{pybasever}
%{_mandir}/*/*
%dir %{pylibdir}
+%dir %{dynload_dir}
+%{dynload_dir}/Python-%{version}-py%{pybasever}.egg-info
+%{dynload_dir}/_bisectmodule.so
+%{dynload_dir}/_codecs_cn.so
+%{dynload_dir}/_codecs_hk.so
+%{dynload_dir}/_codecs_iso2022.so
+%{dynload_dir}/_codecs_jp.so
+%{dynload_dir}/_codecs_kr.so
+%{dynload_dir}/_codecs_tw.so
+%{dynload_dir}/_collectionsmodule.so
+%{dynload_dir}/_csv.so
+%{dynload_dir}/_ctypes.so
+%{dynload_dir}/_curses.so
+%{dynload_dir}/_curses_panel.so
+%{dynload_dir}/_dbm.so
+%{dynload_dir}/_elementtree.so
+%{dynload_dir}/_gdbmmodule.so
+%{dynload_dir}/_hashlib.so
+%{dynload_dir}/_heapqmodule.so
+%{dynload_dir}/_json.so
+%{dynload_dir}/_lsprof.so
+%{dynload_dir}/_multibytecodecmodule.so
+%{dynload_dir}/_multiprocessing.so
+%{dynload_dir}/_pickle.so
+%{dynload_dir}/_randommodule.so
+%{dynload_dir}/_sha1module.so
+%{dynload_dir}/_sha256module.so
+%{dynload_dir}/_sha512module.so
+%{dynload_dir}/_socketmodule.so
+%{dynload_dir}/_sqlite3.so
+%{dynload_dir}/_ssl.so
+%{dynload_dir}/_struct.so
+%{dynload_dir}/_weakref.so
+%{dynload_dir}/arraymodule.so
+%{dynload_dir}/atexitmodule.so
+%{dynload_dir}/audioop.so
+%{dynload_dir}/binascii.so
+%{dynload_dir}/bz2.so
+%{dynload_dir}/cmathmodule.so
+%{dynload_dir}/cryptmodule.so
+%{dynload_dir}/datetime.so
+%{dynload_dir}/fcntlmodule.so
+%{dynload_dir}/grpmodule.so
+%{dynload_dir}/itertoolsmodule.so
+%{dynload_dir}/mathmodule.so
+%{dynload_dir}/mmapmodule.so
+%{dynload_dir}/nismodule.so
+%{dynload_dir}/operator.so
+%{dynload_dir}/ossaudiodev.so
+%{dynload_dir}/parsermodule.so
+%{dynload_dir}/pyexpat.so
+%{dynload_dir}/readline.so
+%{dynload_dir}/resource.so
+%{dynload_dir}/selectmodule.so
+%{dynload_dir}/spwdmodule.so
+%{dynload_dir}/syslogmodule.so
+%{dynload_dir}/termios.so
+%{dynload_dir}/timemodule.so
+%{dynload_dir}/unicodedata.so
+%{dynload_dir}/xxsubtype.so
+%{dynload_dir}/zlibmodule.so
+
%dir %{pylibdir}/site-packages
%{pylibdir}/site-packages/README
%{pylibdir}/*.py*
@@ -469,10 +531,11 @@ rm -fr $RPM_BUILD_ROOT
%{_libdir}/libpython%{pybasever}.so
%{_libdir}/pkgconfig/python*.pc
%config(noreplace) %{_sysconfdir}/rpm/macros.python3
+%config(noreplace) %{_sysconfdir}/rpm/macros.pybytecompile
%files tools
%defattr(-,root,root,755)
-%{_bindir}/2to3*
+%{_bindir}/python3-2to3
%{_bindir}/idle*
%{pylibdir}/Tools
%doc %{pylibdir}/Demo
@@ -484,7 +547,7 @@ rm -fr $RPM_BUILD_ROOT
%defattr(-,root,root,755)
%{pylibdir}/tkinter
%exclude %{pylibdir}/tkinter/test
-%{pylibdir}/lib-dynload/_tkinter.so
+%{dynload_dir}/_tkinter.so
%files test
%defattr(-, root, root)
@@ -495,14 +558,24 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/json/tests
%{pylibdir}/sqlite3/test
%{pylibdir}/test
-%{pylibdir}/lib-dynload/_ctypes_test.so
-%{pylibdir}/lib-dynload/_testcapimodule.so
+%{dynload_dir}/_ctypes_test.so
+%{dynload_dir}/_testcapimodule.so
%{pylibdir}/lib2to3/tests
%doc %{pylibdir}/Demo/distutils
%doc %{pylibdir}/Demo/md5test
%{pylibdir}/tkinter/test
%changelog
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-21
+- introduce %%{dynload_dir} macro
+- explicitly list all lib-dynload files, rather than dynamically gathering the
+payload into a temporary text file, so that we can be sure what we are
+shipping
+- introduce a macros.pybytecompile source file, to help with packaging python3
+modules (Source3; written by Toshio)
+- rename "2to3-3" to "python3-2to3" to better reflect python 3 module
packaging
+plans
+
* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
- change python-3.1.1-config.patch to remove our downstream change to curses
configuration in Modules/Setup.dist, so that the curses modules are built using
commit 113725aa7046ecb9239e4c1eb99f413fba7d4ec9
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Mon Jan 25 18:44:42 2010 +0000
- change python-3.1.1-config.patch to remove our downstream change to
curses configuration in Modules/Setup.dist, so that the curses modules
are built using setup.py with the downstream default (linking against
libncursesw.so, rather than libncurses.so), rather than within the
Makefile; add a test to %%install to verify the dso files that the
curses module is linked against the correct DSO (bug 539917; changes
_cursesmodule.so -> _curses.so)
diff --git a/python-3.1.1-config.patch b/python-3.1.1-config.patch
index f65027f..5ec9024 100644
--- a/python-3.1.1-config.patch
+++ b/python-3.1.1-config.patch
@@ -176,18 +176,6 @@
# Curses support, requring the System V version of curses, often
-@@ -296,9 +296,9 @@
- #
- # First, look at Setup.config; configure may have set this for you.
-
--#_curses _cursesmodule.c -lcurses -ltermcap
-+_curses _cursesmodule.c -lcurses -ltermcap
- # Wrapper for the panel library that's part of ncurses and SYSV curses.
--#_curses_panel _curses_panel.c -lpanel -lncurses
-+_curses_panel _curses_panel.c -lpanel -lncurses
-
-
- # Modules that provide persistent dictionary-like semantics. You will
@@ -321,14 +321,14 @@
#
# First, look at Setup.config; configure may have set this for you.
diff --git a/python3.spec b/python3.spec
index 745f085..512a25b 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,7 +24,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 19%{?dist}
+Release: 20%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -326,6 +326,12 @@ find $RPM_BUILD_ROOT \
mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
install -m 644 %{SOURCE2} $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
+# Ensure that the curses module was linked against libncursesw.so, rather than
+# libncurses.so (bug 539917)
+ldd $RPM_BUILD_ROOT/%{_libdir}/python%{pybasever}/lib-dynload/_curses*.so \
+ | grep curses \
+ | grep libncurses.so && (echo "_curses.so linked against
libncurses.so" ; exit 1)
+
%check
# Run the upstream test suite, using the "runtests.sh" harness from the
upstream
# tarball.
@@ -497,6 +503,14 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Mon Jan 25 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-20
+- change python-3.1.1-config.patch to remove our downstream change to curses
+configuration in Modules/Setup.dist, so that the curses modules are built using
+setup.py with the downstream default (linking against libncursesw.so, rather
+than libncurses.so), rather than within the Makefile; add a test to %%install
+to verify the dso files that the curses module is linked against the correct
+DSO (bug 539917; changes _cursesmodule.so -> _curses.so)
+
* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
builds for setting up the python3 copy of the source tree)
commit d5d23070151b6531ec0025039d9f2d537e9791d0
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Fri Jan 22 22:00:30 2010 +0000
- add %%py3dir macro to macros.python3 (to be used during unified python
2/3 builds for setting up the python3 copy of the source tree)
diff --git a/macros.python3 b/macros.python3
index 11636da..2b41d24 100644
--- a/macros.python3
+++ b/macros.python3
@@ -1,3 +1,4 @@
%__python3 /usr/bin/python3
%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
+%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
diff --git a/python3.spec b/python3.spec
index 8923e1a..745f085 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,7 +24,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 18%{?dist}
+Release: 19%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -497,6 +497,10 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Fri Jan 22 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-19
+- add %%py3dir macro to macros.python3 (to be used during unified python 2/3
+builds for setting up the python3 copy of the source tree)
+
* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
- move lib2to3 from -tools subpackage to main package (bug 556667)
commit 6a82c1949acc9f8d24d0d47d443f529684639d33
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Wed Jan 20 16:01:25 2010 +0000
- move lib2to3 from -tools subpackage to main package (bug 556667)
diff --git a/python3.spec b/python3.spec
index ca03b0f..8923e1a 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,7 +24,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 17%{?dist}
+Release: 18%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -420,6 +420,8 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/importlib/*.py*
%dir %{pylibdir}/json
%{pylibdir}/json/*.py*
+%{pylibdir}/lib2to3
+%exclude %{pylibdir}/lib2to3/tests
%{pylibdir}/logging
%{pylibdir}/multiprocessing
%{pylibdir}/plat-linux2
@@ -464,8 +466,6 @@ rm -fr $RPM_BUILD_ROOT
%files tools
%defattr(-,root,root,755)
-%{pylibdir}/lib2to3
-%exclude %{pylibdir}/lib2to3/tests
%{_bindir}/2to3*
%{_bindir}/idle*
%{pylibdir}/Tools
@@ -497,6 +497,9 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Wed Jan 20 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-18
+- move lib2to3 from -tools subpackage to main package (bug 556667)
+
* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
commit aa4aef22cccc56ab0e7957b45209502ec487cdb1
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Mon Jan 18 17:59:07 2010 +0000
- patch Makefile.pre.in to avoid building static library (patch 6, bug
556092)
diff --git a/python-3.1.1-no-static-lib.patch b/python-3.1.1-no-static-lib.patch
new file mode 100644
index 0000000..325636e
--- /dev/null
+++ b/python-3.1.1-no-static-lib.patch
@@ -0,0 +1,50 @@
+diff -up Python-3.1.1/Makefile.pre.in.no-static-lib Python-3.1.1/Makefile.pre.in
+--- Python-3.1.1/Makefile.pre.in.no-static-lib 2010-01-17 15:42:11.945858717 -0500
++++ Python-3.1.1/Makefile.pre.in 2010-01-17 16:44:32.788859363 -0500
+@@ -405,7 +405,7 @@ coverage:
+
+
+ # Build the interpreter
+-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
++$(BUILDPYTHON): Modules/python.o $(LDLIBRARY)
+ $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) -o $@ \
+ Modules/python.o \
+ $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+@@ -421,18 +421,6 @@ sharedmods: $(BUILDPYTHON)
+ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)'
./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
+ esac
+
+-# Build static library
+-# avoid long command lines, same as LIBRARY_OBJS
+-$(LIBRARY): $(LIBRARY_OBJS)
+- -rm -f $@
+- $(AR) $(ARFLAGS) $@ Modules/getbuildinfo.o
+- $(AR) $(ARFLAGS) $@ $(PARSER_OBJS)
+- $(AR) $(ARFLAGS) $@ $(OBJECT_OBJS)
+- $(AR) $(ARFLAGS) $@ $(PYTHON_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
+- $(AR) $(ARFLAGS) $@ $(MODOBJS)
+- $(RANLIB) $@
+-
+ libpython$(VERSION).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+ $(LDSHARED) $(LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS)
$(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
+@@ -973,18 +961,6 @@ libainstall: all
+ else true; \
+ fi; \
+ done
+- @if test -d $(LIBRARY); then :; else \
+- if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
+- if test "$(SO)" = .dll; then \
+- $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
+- else \
+- $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- $(RANLIB) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
+- fi; \
+- else \
+- echo Skip install of $(LIBRARY) - use make frameworkinstall; \
+- fi; \
+- fi
+ $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
+ $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o
+ $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
diff --git a/python3.spec b/python3.spec
index 023c6c9..ca03b0f 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,7 +24,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 16%{?dist}
+Release: 17%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -69,6 +69,10 @@ Patch5: python-3.1.1-install-tkinter-tests.patch
# (The resulting test support code is in the tkinter subpackage, but
# this is not a major problem)
+# Patch the Makefile.pre.in so that the generated Makefile doesn't try to build
+# a libpythonMAJOR.MINOR.a (bug 550692):
+Patch6: python-3.1.1-no-static-lib.patch
+
Patch102: python-3.1.1-lib64.patch
#
http://bugs.python.org/issue6999 -- fixed in r75062
@@ -163,6 +167,7 @@ done
%patch3 -p1 -b .remove-mimeaudio-tests
%patch4 -p1 -b .apply-our-changes-to-expected-shebang
%patch5 -p1 -b .install-tkinter-tests
+%patch6 -p1 -b .no-static-lib
%if "%{_lib}" == "lib64"
%patch102 -p1 -b .lib64
@@ -492,6 +497,9 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Sun Jan 17 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-17
+- patch Makefile.pre.in to avoid building static library (patch 6, bug 556092)
+
* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
- use the %%{_isa} macro to ensure that the python-devel dependency on python
is for the correct multilib arch (#555943)
commit 6859f230880f7a1e1fa73097e4de9bdb01980ad2
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Sat Jan 16 01:20:39 2010 +0000
- use the %%{_isa} macro to ensure that the python-devel dependency on
python is for the correct multilib arch (#555943)
- delete bundled copy of libffi to make sure we use the system one
diff --git a/python3.spec b/python3.spec
index 40ab842..023c6c9 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,7 +24,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 15%{?dist}
+Release: 16%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -107,7 +107,7 @@ This package contains files used to embed Python 3 into applications.
%package devel
Summary: Libraries and header files needed for Python 3 development
Group: Development/Libraries
-Requires: %{name} = %{version}-%{release}
+Requires: %{name}%{?_isa} = %{version}-%{release}
Conflicts: %{name} < %{version}-%{release}
%description devel
@@ -150,6 +150,13 @@ python 3 code that uses more than just unittest and/or
test_support.py.
%prep
%setup -q -n Python-%{version}
chmod +x %{SOURCE1}
+
+# Ensure that we're using the system copy of libffi, rather than the copy
+# shipped by upstream in the tarball:
+for SUBDIR in darwin libffi libffi_arm_wince libffi_msvc libffi_osx ; do
+ rm -r Modules/_ctypes/$SUBDIR || exit 1 ;
+done
+
%patch0 -p1 -b .config
%patch1 -p1 -b .rpath
%patch2 -p0 -b .fix-handling-of-readonly-pyc-files
@@ -485,6 +492,11 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-16
+- use the %%{_isa} macro to ensure that the python-devel dependency on python
+is for the correct multilib arch (#555943)
+- delete bundled copy of libffi to make sure we use the system one
+
* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
docs, rather than the 2.6 build
commit a9e268f9c692587bfdf677f655bd018d32ab4de5
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Fri Jan 15 21:08:54 2010 +0000
- fix the URLs output by pydoc so they point at python.org's 3.1 build of
the docs, rather than the 2.6 build
diff --git a/python3.spec b/python3.spec
index 03ff214..40ab842 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,7 +24,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 14%{?dist}
+Release: 15%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -163,6 +163,15 @@ chmod +x %{SOURCE1}
%patch200 -p1 -b .pathfix
+# Currently (2010-01-15),
http://docs.python.org/library is for 2.6, and there
+# are many differences between 2.6 and the Python 3 library.
+#
+# Fix up the URLs within pydoc to point at the documentation for this
+# MAJOR.MINOR version:
+#
+sed --in-place \
+
--expression="s|http://docs.python.org/library|http://docs.python.org/%{pybasever}/library|g"
\
+ Lib/pydoc.py || exit 1
%build
export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
@@ -476,6 +485,10 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Fri Jan 15 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-15
+- fix the URLs output by pydoc so they point at python.org's 3.1 build of the
+docs, rather than the 2.6 build
+
* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
- replace references to /usr with %%{_prefix}; replace references to
/usr/include with %%{_includedir} (Toshio)
commit 37de6741fa99c78bfe1d68ac0b5dca2981595dce
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Wed Jan 13 22:33:42 2010 +0000
- replace references to /usr with %%{_prefix}; replace references to
/usr/include with %%{_includedir} (Toshio)
diff --git a/python3.spec b/python3.spec
index 3cfea50..03ff214 100644
--- a/python3.spec
+++ b/python3.spec
@@ -24,7 +24,7 @@
Summary: Version 3 of the Python programming language aka Python 3000
Name: python3
Version: %{pybasever}.1
-Release: 13%{?dist}
+Release: 14%{?dist}
License: Python
Group: Development/Languages
Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
@@ -412,8 +412,8 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/xml
%{pylibdir}/xmlrpc
%if "%{_lib}" == "lib64"
-%attr(0755,root,root) %dir /usr/lib/python%{pybasever}
-%attr(0755,root,root) %dir /usr/lib/python%{pybasever}/site-packages
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}
+%attr(0755,root,root) %dir %{_prefix}/lib/python%{pybasever}/site-packages
%endif
# "Makefile" and the config-32/64.h file are needed by
@@ -421,8 +421,8 @@ rm -fr $RPM_BUILD_ROOT
# package, along with their parent directories (bug 531901):
%dir %{pylibdir}/config
%{pylibdir}/config/Makefile
-%dir /usr/include/python%{pybasever}
-/usr/include/python%{pybasever}/%{_pyconfig_h}
+%dir %{_includedir}/python%{pybasever}
+%{_includedir}/python%{pybasever}/%{_pyconfig_h}
%files libs
%defattr(-,root,root,-)
@@ -476,6 +476,10 @@ rm -fr $RPM_BUILD_ROOT
%{pylibdir}/tkinter/test
%changelog
+* Wed Jan 13 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-14
+- replace references to /usr with %%{_prefix}; replace references to
+/usr/include with %%{_includedir} (Toshio)
+
* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
- fix permission on find-provides-without-python-sonames.sh from 775 to 755
commit a3483f912e4224e330a7ee8d884f8d78e8bba50d
Author: dmalcolm <dmalcolm(a)fedoraproject.org>
Date: Wed Jan 13 21:25:18 2010 +0000
Initial import (from python3-3.1.1-13)
diff --git a/.cvsignore b/.cvsignore
index e69de29..56857ac 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -0,0 +1 @@
+Python-3.1.1.tar.bz2
diff --git a/Python-3.1.1-rpath.patch b/Python-3.1.1-rpath.patch
new file mode 100644
index 0000000..1493af2
--- /dev/null
+++ b/Python-3.1.1-rpath.patch
@@ -0,0 +1,20 @@
+diff -up Python-3.1.1/Lib/distutils/unixccompiler.py.rpath
Python-3.1.1/Lib/distutils/unixccompiler.py
+--- Python-3.1.1/Lib/distutils/unixccompiler.py.rpath 2009-09-04 17:29:34.000000000
-0400
++++ Python-3.1.1/Lib/distutils/unixccompiler.py 2009-09-04 17:49:54.000000000 -0400
+@@ -141,6 +141,16 @@ class UnixCCompiler(CCompiler):
+ if sys.platform == "cygwin":
+ exe_extension = ".exe"
+
++ def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
++ """Remove standard library path from rpath"""
++ libraries, library_dirs, runtime_library_dirs = super(
++ self.__class__, self)._fix_lib_args(libraries, library_dirs,
++ runtime_library_dirs)
++ libdir = sysconfig.get_config_var('LIBDIR')
++ if runtime_library_dirs and (libdir in runtime_library_dirs):
++ runtime_library_dirs.remove(libdir)
++ return libraries, library_dirs, runtime_library_dirs
++
+ def preprocess(self, source, output_file=None, macros=None,
+ include_dirs=None, extra_preargs=None, extra_postargs=None):
+ fixed_args = self._fix_compile_args(None, macros, include_dirs)
diff --git a/find-provides-without-python-sonames.sh
b/find-provides-without-python-sonames.sh
new file mode 100755
index 0000000..406a675
--- /dev/null
+++ b/find-provides-without-python-sonames.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# The standard /usr/lib/rpm/find-provides script
+# adds provides lines for all SONAME directives in all shared libraries,
+# even if those libraries are not in the LD_LIBRARY_PATH
+
+# This leads to the rpm having a redundant Provides "foo.so" for all of the
+# various foo.so Python c modules
+
+# So we strip out all /usr/lib/python lines first, before running them through
+# the standard script:
+grep -v "/usr/lib/python" | /usr/lib/rpm/find-provides
+
+exit 0
\ No newline at end of file
diff --git a/import.log b/import.log
new file mode 100644
index 0000000..1b187cb
--- /dev/null
+++ b/import.log
@@ -0,0 +1 @@
+python3-3_1_1-13_fc12:HEAD:python3-3.1.1-13.fc12.src.rpm:1263417721
diff --git a/macros.python3 b/macros.python3
new file mode 100644
index 0000000..11636da
--- /dev/null
+++ b/macros.python3
@@ -0,0 +1,3 @@
+%__python3 /usr/bin/python3
+%python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())")
+%python3_sitearch %(%{__python3} -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib(1))")
diff --git a/python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
b/python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
new file mode 100644
index 0000000..92c3e1f
--- /dev/null
+++ b/python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
@@ -0,0 +1,11 @@
+--- Python-3.1.1/Lib/test/test_imp.py.apply-our-changes-to-expected-shebang 2009-10-27
18:05:53.539540149 -0400
++++ Python-3.1.1/Lib/test/test_imp.py 2009-10-27 18:06:12.138538965 -0400
+@@ -52,7 +52,7 @@ class ImportTests(unittest.TestCase):
+ self.assertNotEqual(fp, None)
+ self.assertEqual(fp.encoding, "iso-8859-1")
+ self.assertEqual(fp.tell(), 0)
+- self.assertEqual(fp.readline(), '#!/usr/bin/env python\n')
++ self.assertEqual(fp.readline(), '#!/usr/bin/python3.1\n')
+ fp.close()
+
+ fp, filename, info = imp.find_module("tokenize")
diff --git a/python-3.1.1-config.patch b/python-3.1.1-config.patch
new file mode 100644
index 0000000..f65027f
--- /dev/null
+++ b/python-3.1.1-config.patch
@@ -0,0 +1,245 @@
+--- Python-3.1.1/Modules/Setup.dist.config 2009-06-04 03:30:30.000000000 -0600
++++ Python-3.1.1/Modules/Setup.dist 2009-09-25 12:14:38.000000000 -0600
+@@ -141,7 +141,7 @@
+ # modules are to be built as shared libraries (see above for more
+ # detail; also note that *static* reverses this effect):
+
+-#*shared*
++*shared*
+
+ # GNU readline. Unlike previous Python incarnations, GNU readline is
+ # now incorporated in an optional module, configured in the Setup file
+@@ -151,71 +151,71 @@
+ # it, depending on your system -- see the GNU readline instructions.
+ # It's okay for this to be a shared library, too.
+
+-#readline readline.c -lreadline -ltermcap
++readline readline.c -lreadline -ltermcap
+
+
+ # Modules that should always be present (non UNIX dependent):
+
+-#array arraymodule.c # array objects
+-#cmath cmathmodule.c # -lm # complex math library functions
+-#math mathmodule.c # -lm # math library functions, e.g. sin()
+-#_struct _struct.c # binary structure packing/unpacking
+-#time timemodule.c # -lm # time operations and variables
+-#operator operator.c # operator.add() and similar goodies
+-#_weakref _weakref.c # basic weak reference support
+-#_testcapi _testcapimodule.c # Python C API test module
+-#_random _randommodule.c # Random number generator
+-#_collections _collectionsmodule.c # Container types
+-#itertools itertoolsmodule.c # Functions creating iterators for efficient looping
+-#atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
+-#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
_elementtree.c # elementtree accelerator
+-#_pickle _pickle.c # pickle accelerator
+-#datetime datetimemodule.c # date/time type
+-#_bisect _bisectmodule.c # Bisection algorithms
+-#_heapq _heapqmodule.c # Heap queue algorithm
++array arraymodule.c # array objects
++cmath cmathmodule.c # -lm # complex math library functions
++math mathmodule.c # -lm # math library functions, e.g. sin()
++_struct _struct.c # binary structure packing/unpacking
++time timemodule.c # -lm # time operations and variables
++operator operator.c # operator.add() and similar goodies
++_weakref _weakref.c # basic weak reference support
++_testcapi _testcapimodule.c # Python C API test module
++_random _randommodule.c # Random number generator
++_collections _collectionsmodule.c # Container types
++itertools itertoolsmodule.c # Functions creating iterators for efficient looping
++atexit atexitmodule.c # Register functions to be run at interpreter-shutdown
++_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
_elementtree.c # elementtree accelerator
++_pickle _pickle.c # pickle accelerator
++#datetime datetimemodule.c # date/time type
++_bisect _bisectmodule.c # Bisection algorithms
++_heapq _heapqmodule.c # Heap queue algorithm
+
+-#unicodedata unicodedata.c # static Unicode character database
++unicodedata unicodedata.c # static Unicode character database
+
+
+ # Modules with some UNIX dependencies -- on by default:
+ # (If you have a really backward UNIX, select and socket may not be
+ # supported...)
+
+-#fcntl fcntlmodule.c # fcntl(2) and ioctl(2)
+-#spwd spwdmodule.c # spwd(3)
+-#grp grpmodule.c # grp(3)
+-#select selectmodule.c # select(2); not on ancient System V
++fcntl fcntlmodule.c # fcntl(2) and ioctl(2)
++spwd spwdmodule.c # spwd(3)
++grp grpmodule.c # grp(3)
++select selectmodule.c # select(2); not on ancient System V
+
+ # Memory-mapped files (also works on Win32).
+-#mmap mmapmodule.c
++mmap mmapmodule.c
+
+ # CSV file helper
+-#_csv _csv.c
++_csv _csv.c
+
+ # Socket module helper for socket(2)
+-#_socket socketmodule.c
++_socket socketmodule.c
+
+ # Socket module helper for SSL support; you must comment out the other
+ # socket line above, and possibly edit the SSL variable:
+ #SSL=/usr/local/ssl
+-#_ssl _ssl.c \
+-# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
+-# -L$(SSL)/lib -lssl -lcrypto
++_ssl _ssl.c \
++ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
++ -L$(SSL)/lib -lssl -lcrypto
+
+ # The crypt module is now disabled by default because it breaks builds
+ # on many systems (where -lcrypt is needed), e.g. Linux (I believe).
+ #
+ # First, look at Setup.config; configure may have set this for you.
+
+-#crypt cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems
++crypt cryptmodule.c -lcrypt # crypt(3); needs -lcrypt on some systems
+
+
+ # Some more UNIX dependent modules -- off by default, since these
+ # are not supported by all UNIX systems:
+
+-#nis nismodule.c -lnsl # Sun yellow pages -- not everywhere
+-#termios termios.c # Steen Lumholt's termios module
+-#resource resource.c # Jeremy Hylton's rlimit interface
++nis nismodule.c -lnsl # Sun yellow pages -- not everywhere
++termios termios.c # Steen Lumholt's termios module
++resource resource.c # Jeremy Hylton's rlimit interface
+
+
+ # Multimedia modules -- off by default.
+@@ -223,7 +223,7 @@
+ # #993173 says audioop works on 64-bit platforms, though.
+ # These represent audio samples or images as strings:
+
+-#audioop audioop.c # Operations on audio samples
++audioop audioop.c # Operations on audio samples
+
+
+ # Note that the _md5 and _sha modules are normally only built if the
+@@ -238,9 +238,9 @@
+
+ # The _sha module implements the SHA checksum algorithms.
+ # (NIST's Secure Hash Algorithms.)
+-#_sha shamodule.c
+-#_sha256 sha256module.c
+-#_sha512 sha512module.c
++_sha1 sha1module.c
++_sha256 sha256module.c
++_sha512 sha512module.c
+
+
+ # The _tkinter module.
+@@ -255,7 +255,7 @@
+ # every system.
+
+ # *** Always uncomment this (leave the leading underscore in!):
+-# _tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
++_tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
+ # *** Uncomment and edit to reflect where your Tcl/Tk libraries are:
+ # -L/usr/local/lib \
+ # *** Uncomment and edit to reflect where your Tcl/Tk headers are:
+@@ -265,7 +265,7 @@
+ # *** Or uncomment this for Solaris:
+ # -I/usr/openwin/include \
+ # *** Uncomment and edit for Tix extension only:
+-# -DWITH_TIX -ltix8.1.8.2 \
++ -DWITH_TIX -ltix \
+ # *** Uncomment and edit for BLT extension only:
+ # -DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \
+ # *** Uncomment and edit for PIL (TkImaging) extension only:
+@@ -274,7 +274,7 @@
+ # *** Uncomment and edit for TOGL extension only:
+ # -DWITH_TOGL togl.c \
+ # *** Uncomment and edit to reflect your Tcl/Tk versions:
+-# -ltk8.2 -ltcl8.2 \
++ -ltk -ltcl \
+ # *** Uncomment and edit to reflect where your X11 libraries are:
+ # -L/usr/X11R6/lib \
+ # *** Or uncomment this for Solaris:
+@@ -284,10 +284,10 @@
+ # *** Uncomment for AIX:
+ # -lld \
+ # *** Always uncomment this; X11 libraries to link with:
+-# -lX11
++ -lX11
+
+ # Lance Ellinghaus's syslog module
+-#syslog syslogmodule.c # syslog daemon interface
++syslog syslogmodule.c # syslog daemon interface
+
+
+ # Curses support, requring the System V version of curses, often
+@@ -296,9 +296,9 @@
+ #
+ # First, look at Setup.config; configure may have set this for you.
+
+-#_curses _cursesmodule.c -lcurses -ltermcap
++_curses _cursesmodule.c -lcurses -ltermcap
+ # Wrapper for the panel library that's part of ncurses and SYSV curses.
+-#_curses_panel _curses_panel.c -lpanel -lncurses
++_curses_panel _curses_panel.c -lpanel -lncurses
+
+
+ # Modules that provide persistent dictionary-like semantics. You will
+@@ -321,14 +321,14 @@
+ #
+ # First, look at Setup.config; configure may have set this for you.
+
+-#_gdbm _gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
++_gdbm _gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
+
+
+ # Helper module for various ascii-encoders
+-#binascii binascii.c
++binascii binascii.c
+
+ # Fred Drake's interface to the Python parser
+-#parser parsermodule.c
++parser parsermodule.c
+
+
+ # Lee Busby's SIGFPE modules.
+@@ -351,7 +351,7 @@
+ # Andrew Kuchling's zlib module.
+ # This require zlib 1.1.3 (or later).
+ # See
http://www.gzip.org/zlib/
+-#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
++zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
+
+ # Interface to the Expat XML parser
+ #
+@@ -364,19 +364,19 @@
+ #
+ # More information on Expat can be found at
www.libexpat.org.
+ #
+-#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c
-I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
++pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c
-I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
+
+ # Hye-Shik Chang's CJKCodecs
+
+ # multibytecodec is required for all the other CJK codec modules
+-#_multibytecodec cjkcodecs/multibytecodec.c
++_multibytecodec cjkcodecs/multibytecodec.c
+
+-#_codecs_cn cjkcodecs/_codecs_cn.c
+-#_codecs_hk cjkcodecs/_codecs_hk.c
+-#_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
+-#_codecs_jp cjkcodecs/_codecs_jp.c
+-#_codecs_kr cjkcodecs/_codecs_kr.c
+-#_codecs_tw cjkcodecs/_codecs_tw.c
++_codecs_cn cjkcodecs/_codecs_cn.c
++_codecs_hk cjkcodecs/_codecs_hk.c
++_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
++_codecs_jp cjkcodecs/_codecs_jp.c
++_codecs_kr cjkcodecs/_codecs_kr.c
++_codecs_tw cjkcodecs/_codecs_tw.c
+
+ # Example -- included for reference only:
+ # xx xxmodule.c
diff --git a/python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
b/python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
new file mode 100644
index 0000000..1fb201b
--- /dev/null
+++ b/python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
@@ -0,0 +1,12 @@
+--- Lib/importlib/_bootstrap.py.fix-handling-of-readonly-pyc-files 2009-10-22
15:24:57.575015046 -0400
++++ Lib/importlib/_bootstrap.py 2009-10-22 15:25:24.024016069 -0400
+@@ -522,8 +522,8 @@ class _PyPycFileLoader(PyPycLoader, _PyF
+ bytecode_path = self.bytecode_path(name)
+ if not bytecode_path:
+ bytecode_path = self._base_path + _suffix_list(imp.PY_COMPILED)[0]
+- file = _io.FileIO(bytecode_path, 'w') # Assuming bytes.
+ try:
++ file = _io.FileIO(bytecode_path, 'w') # Assuming bytes.
+ with _closing(file) as bytecode_file:
+ bytecode_file.write(data)
+ return True
diff --git a/python-3.1.1-install-tkinter-tests.patch
b/python-3.1.1-install-tkinter-tests.patch
new file mode 100644
index 0000000..3939678
--- /dev/null
+++ b/python-3.1.1-install-tkinter-tests.patch
@@ -0,0 +1,10 @@
+--- Python-3.1.1/Makefile.pre.in.install-tkinter-tests 2009-10-27 20:00:09.814539776
-0400
++++ Python-3.1.1/Makefile.pre.in 2009-10-27 20:01:43.460549947 -0400
+@@ -835,6 +835,7 @@ EXTRAPLATDIR= @EXTRAPLATDIR@
+ MACHDEPS= $(PLATDIR) $(EXTRAPLATDIR)
+ XMLLIBSUBDIRS= xml xml/dom xml/etree xml/parsers xml/sax
+ LIBSUBDIRS= tkinter site-packages test test/output test/data \
++ tkinter/test tkinter/test/test_ttk tkinter/test/test_tkinter \
+ test/decimaltestdata \
+ encodings \
+ email email/mime email/test email/test/data \
diff --git a/python-3.1.1-lib64.patch b/python-3.1.1-lib64.patch
new file mode 100644
index 0000000..3053a92
--- /dev/null
+++ b/python-3.1.1-lib64.patch
@@ -0,0 +1,164 @@
+diff -ur Python-3.1.1.orig/Lib/distutils/command/install.py
Python-3.1.1/Lib/distutils/command/install.py
+--- Python-3.1.1.orig/Lib/distutils/command/install.py 2009-09-24 15:28:57.000000000
-0600
++++ Python-3.1.1/Lib/distutils/command/install.py 2009-09-24 15:34:18.000000000 -0600
+@@ -47,14 +47,14 @@
+ 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/$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',
+diff -ur Python-3.1.1.orig/Lib/distutils/sysconfig.py
Python-3.1.1/Lib/distutils/sysconfig.py
+--- Python-3.1.1.orig/Lib/distutils/sysconfig.py 2009-09-24 15:29:00.000000000 -0600
++++ Python-3.1.1/Lib/distutils/sysconfig.py 2009-09-24 15:34:18.000000000 -0600
+@@ -117,8 +117,12 @@
+ 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:
+diff -ur Python-3.1.1.orig/Lib/site.py Python-3.1.1/Lib/site.py
+--- Python-3.1.1.orig/Lib/site.py 2009-09-24 15:28:56.000000000 -0600
++++ Python-3.1.1/Lib/site.py 2009-09-24 15:34:18.000000000 -0600
+@@ -258,12 +258,16 @@
+ if sys.platform in ('os2emx', 'riscos'):
+ sitedirs.append(os.path.join(prefix, "Lib",
"site-packages"))
+ elif os.sep == '/':
++ sitedirs.append(os.path.join(prefix, "lib64",
++ "python" + sys.version[:3],
++ "site-packages"))
+ sitedirs.append(os.path.join(prefix, "lib",
+ "python" + sys.version[:3],
+ "site-packages"))
+ sitedirs.append(os.path.join(prefix, "lib",
"site-python"))
+ else:
+ sitedirs.append(prefix)
++ sitedirs.append(os.path.join(prefix, "lib64",
"site-packages"))
+ sitedirs.append(os.path.join(prefix, "lib",
"site-packages"))
+
+ if sys.platform == "darwin":
+diff -ur Python-3.1.1.orig/Makefile.pre.in Python-3.1.1/Makefile.pre.in
+--- Python-3.1.1.orig/Makefile.pre.in 2009-09-24 15:26:58.000000000 -0600
++++ Python-3.1.1/Makefile.pre.in 2009-09-24 15:34:18.000000000 -0600
+@@ -90,11 +90,11 @@
+
+ # Expanded directories
+ BINDIR= $(exec_prefix)/bin
+-LIBDIR= $(exec_prefix)/lib
++LIBDIR= $(exec_prefix)/lib64
+ MANDIR= @mandir@
+ INCLUDEDIR= @includedir@
+ CONFINCLUDEDIR= $(exec_prefix)/include
+-SCRIPTDIR= $(prefix)/lib
++SCRIPTDIR= $(prefix)/lib64
+
+ # Detailed destination directories
+ BINLIBDEST= $(LIBDIR)/python$(VERSION)
+diff -ur Python-3.1.1.orig/Modules/getpath.c Python-3.1.1/Modules/getpath.c
+--- Python-3.1.1.orig/Modules/getpath.c 2009-09-24 15:27:15.000000000 -0600
++++ Python-3.1.1/Modules/getpath.c 2009-09-24 15:36:58.000000000 -0600
+@@ -117,8 +117,8 @@
+ #endif
+
+ #ifndef PYTHONPATH
+-#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
+- EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
++#define PYTHONPATH PREFIX "/lib64/python" VERSION ":" \
++ EXEC_PREFIX "/lib64/python" VERSION "/lib-dynload"
+ #endif
+
+ #ifndef LANDMARK
+@@ -129,7 +129,7 @@
+ static wchar_t exec_prefix[MAXPATHLEN+1];
+ static wchar_t progpath[MAXPATHLEN+1];
+ static wchar_t *module_search_path = NULL;
+-static wchar_t lib_python[] = L"lib/python" VERSION;
++static wchar_t lib_python[] = L"lib64/python" VERSION;
+
+ /* In principle, this should use HAVE__WSTAT, and _wstat
+ should be detected by autoconf. However, no current
+@@ -603,7 +603,7 @@
+ }
+ else
+ wcsncpy(zip_path, L"" PREFIX, MAXPATHLEN);
+- joinpath(zip_path, L"lib/python00.zip");
++ joinpath(zip_path, L"lib64/python00.zip");
+ bufsz = wcslen(zip_path); /* Replace "00" with version */
+ zip_path[bufsz - 6] = VERSION[0];
+ zip_path[bufsz - 5] = VERSION[2];
+@@ -613,7 +613,7 @@
+ fprintf(stderr,
+ "Could not find platform dependent libraries
<exec_prefix>\n");
+ wcsncpy(exec_prefix, L"" EXEC_PREFIX, MAXPATHLEN);
+- joinpath(exec_prefix, L"lib/lib-dynload");
++ joinpath(exec_prefix, L"lib64/lib-dynload");
+ }
+ /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
+
+diff -ur Python-3.1.1.orig/Modules/Setup.dist Python-3.1.1/Modules/Setup.dist
+--- Python-3.1.1.orig/Modules/Setup.dist 2009-09-24 15:27:30.000000000 -0600
++++ Python-3.1.1/Modules/Setup.dist 2009-09-24 15:45:49.000000000 -0600
+@@ -351,7 +351,7 @@
+ # Andrew Kuchling's zlib module.
+ # This require zlib 1.1.3 (or later).
+ # See
http://www.gzip.org/zlib/
+-zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
++zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib64 -lz
+
+ # Interface to the Expat XML parser
+ #
+diff -ur Python-3.1.1.orig/setup.py Python-3.1.1/setup.py
+--- Python-3.1.1.orig/setup.py 2009-09-24 15:26:58.000000000 -0600
++++ Python-3.1.1/setup.py 2009-09-24 15:34:18.000000000 -0600
+@@ -295,7 +295,7 @@
+
+ def detect_modules(self):
+ # Ensure that /usr/local is always used
+- 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')
+
+ # Add paths specified in the environment variables LDFLAGS and
+@@ -522,11 +522,11 @@
+ elif self.compiler.find_library_file(lib_dirs, 'curses'):
+ readline_libs.append('curses')
+ elif self.compiler.find_library_file(lib_dirs +
+- ['/usr/lib/termcap'],
++ ['/usr/lib64/termcap'],
+ 'termcap'):
+ readline_libs.append('termcap')
+ exts.append( 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:
+@@ -563,8 +563,8 @@
+ if krb5_h:
+ ssl_incs += krb5_h
+ ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
+- ['/usr/local/ssl/lib',
+- '/usr/contrib/ssl/lib/'
++ ['/usr/local/ssl/lib64',
++ '/usr/contrib/ssl/lib64/'
+ ] )
+
+ if (ssl_incs is not None and
diff --git a/python-3.1.1-pathfix.patch b/python-3.1.1-pathfix.patch
new file mode 100644
index 0000000..f45409a
--- /dev/null
+++ b/python-3.1.1-pathfix.patch
@@ -0,0 +1,61 @@
+--- Python-3.1.1.orig/Tools/scripts/pathfix.py 2009-09-24 15:27:04.000000000 -0600
++++ Python-3.1.1/Tools/scripts/pathfix.py 2009-09-25 14:05:04.000000000 -0600
+@@ -1,4 +1,4 @@
+-#! /usr/bin/env python
++#!/usr/bin/env python3.1
+
+ # Change the #! line occurring in Python scripts. The new interpreter
+ # pathname must be given with a -i option.
+@@ -43,8 +43,8 @@
+ sys.exit(2)
+ for o, a in opts:
+ if o == '-i':
+- new_interpreter = a
+- if not new_interpreter or new_interpreter[0] != '/' or not args:
++ new_interpreter = a.encode()
++ if not new_interpreter or new_interpreter[0] != b'/'[0] or not args:
+ err('-i option or file-or-directory missing\n')
+ err(usage)
+ sys.exit(2)
+@@ -61,7 +61,7 @@
+
+ ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$')
+ def ispython(name):
+- return ispythonprog.match(name) >= 0
++ return bool(ispythonprog.match(name))
+
+ def recursedown(dirname):
+ dbg('recursedown(%r)\n' % (dirname,))
+@@ -88,7 +88,7 @@
+ def fix(filename):
+ ## dbg('fix(%r)\n' % (filename,))
+ try:
+- f = open(filename, 'r')
++ f = open(filename, 'rb')
+ except IOError as msg:
+ err('%s: cannot open: %r\n' % (filename, msg))
+ return 1
+@@ -101,7 +101,7 @@
+ head, tail = os.path.split(filename)
+ tempname = os.path.join(head, '@' + tail)
+ try:
+- g = open(tempname, 'w')
++ g = open(tempname, 'wb')
+ except IOError as msg:
+ f.close()
+ err('%s: cannot create: %r\n' % (tempname, msg))
+@@ -139,11 +139,11 @@
+ return 0
+
+ def fixline(line):
+- if not line.startswith('#!'):
++ if not line.startswith(b'#!'):
+ return line
+- if "python" not in line:
++ if b"python" not in line:
+ return line
+- return '#! %s\n' % new_interpreter
++ return b'#!' + new_interpreter + b'\n'
+
+ if __name__ == '__main__':
+ main()
diff --git a/python-3.1.1-remove-mimeaudio-tests.patch
b/python-3.1.1-remove-mimeaudio-tests.patch
new file mode 100644
index 0000000..487ad3e
--- /dev/null
+++ b/python-3.1.1-remove-mimeaudio-tests.patch
@@ -0,0 +1,55 @@
+--- Python-3.1.1/Lib/email/test/test_email.py.remove_mimeaudio_tests 2009-10-27
14:31:09.483539561 -0400
++++ Python-3.1.1/Lib/email/test/test_email.py 2009-10-27 14:31:27.663548053 -0400
+@@ -926,52 +926,6 @@ Blah blah blah
+
+
+
+-# Test the basic MIMEAudio class
+-class TestMIMEAudio(unittest.TestCase):
+- def setUp(self):
+- # Make sure we pick up the audiotest.au that lives in email/test/data.
+- # In Python, there's an audiotest.au living in Lib/test but that isn't
+- # included in some binary distros that don't include the test
+- # package. The trailing empty string on the .join() is significant
+- # since findfile() will do a dirname().
+- datadir = os.path.join(os.path.dirname(landmark), 'data', '')
+- with open(findfile('audiotest.au', datadir), 'rb') as fp:
+- self._audiodata = fp.read()
+- self._au = MIMEAudio(self._audiodata)
+-
+- def test_guess_minor_type(self):
+- self.assertEqual(self._au.get_content_type(), 'audio/basic')
+-
+- def test_encoding(self):
+- payload = self._au.get_payload()
+- self.assertEqual(base64.decodebytes(payload), self._audiodata)
+-
+- def test_checkSetMinor(self):
+- au = MIMEAudio(self._audiodata, 'fish')
+- self.assertEqual(au.get_content_type(), 'audio/fish')
+-
+- def test_add_header(self):
+- eq = self.assertEqual
+- unless = self.assertTrue
+- self._au.add_header('Content-Disposition', 'attachment',
+- filename='audiotest.au')
+- eq(self._au['content-disposition'],
+- 'attachment; filename="audiotest.au"')
+- eq(self._au.get_params(header='content-disposition'),
+- [('attachment', ''), ('filename',
'audiotest.au')])
+- eq(self._au.get_param('filename',
header='content-disposition'),
+- 'audiotest.au')
+- missing = []
+- eq(self._au.get_param('attachment',
header='content-disposition'), '')
+- unless(self._au.get_param('foo', failobj=missing,
+- header='content-disposition') is missing)
+- # Try some missing stuff
+- unless(self._au.get_param('foobar', missing) is missing)
+- unless(self._au.get_param('attachment', missing,
+- header='foobar') is missing)
+-
+-
+-
+ # Test the basic MIMEImage class
+ class TestMIMEImage(unittest.TestCase):
+ def setUp(self):
diff --git a/python3.spec b/python3.spec
new file mode 100644
index 0000000..3cfea50
--- /dev/null
+++ b/python3.spec
@@ -0,0 +1,568 @@
+%global pybasever 3.1
+%global pylibdir %{_libdir}/python%{pybasever}
+
+# We want to byte-compile the .py files within the packages using the new
+# python3 binary.
+#
+# Unfortunately, rpmbuild's infrastructure requires us to jump through some
+# hoops to avoid byte-compiling with the system python 2 version:
+# /usr/lib/rpm/redhat/macros sets up build policy that (amongst other things)
+# defines __os_install_post. In particular, "brp-python-bytecompile" is
+# invoked without an argument thus using the wrong version of python
+# (/usr/bin/python, rather than the freshly built python), thus leading to
+# numerous syntax errors, and incorrect magic numbers in the .pyc files. We
+# thus override __os_install_post to avoid invoking this script:
+%global __os_install_post /usr/lib/rpm/redhat/brp-compress \
+ %{!?__debug_package:/usr/lib/rpm/redhat/brp-strip %{__strip}} \
+ /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \
+ /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \
+ /usr/lib/rpm/redhat/brp-python-hardlink
+# to remove the invocation of brp-python-bytecompile, whilst keeping the
+# invocation of brp-python-hardlink (since this should still work for python3
+# pyc/pyo files)
+
+Summary: Version 3 of the Python programming language aka Python 3000
+Name: python3
+Version: %{pybasever}.1
+Release: 13%{?dist}
+License: Python
+Group: Development/Languages
+Source:
http://python.org/ftp/python/%{version}/Python-%{version}.tar.bz2
+
+# Avoid having various bogus auto-generated Provides lines for the various
+# python c modules' SONAMEs:
+Source1: find-provides-without-python-sonames.sh
+%global _use_internal_dependency_generator 0
+%global __find_provides %{SOURCE1}
+
+# Supply various useful macros for building python 3 modules:
+# __python3, python3_sitelib, python3_sitearch
+Source2: macros.python3
+
+Patch0: python-3.1.1-config.patch
+
+
+# Fixup distutils/unixccompiler.py to remove standard library path from rpath:
+# Was Patch0 in ivazquez' python3000 specfile:
+Patch1: Python-3.1.1-rpath.patch
+
+# Fixup importlib/_bootstrap.py so that it correctly handles being unable to
+# open .pyc files for writing
+# Sent upstream as
http://bugs.python.org/issue7187
+Patch2: python-3.1.1-importlib-fix-handling-of-readonly-pyc-files.patch
+
+# The four TestMIMEAudio tests fail due to "audiotest.au" not being packaged.
+# It's simplest to remove them:
+Patch3: python-3.1.1-remove-mimeaudio-tests.patch
+
+# ImportTests.test_issue1267 in test_imp.py reads pydoc.py's shebang line and
+# checks that it read it correctly.
+#
+# Since we modify the shebang lines in our packaging, we also need to modify
+# the expected value in this test:
+Patch4: python-3.1.1-apply-our-changes-to-expected-shebang-for-test_imp.patch
+
+# test_tk test_ttk_guionly and test_ttk_textonly all rely on tkinter/test, but
+# upstream's Makefile.pre.in doesn't install that subdirectory; patch it so that
+# it does:
+Patch5: python-3.1.1-install-tkinter-tests.patch
+# (The resulting test support code is in the tkinter subpackage, but
+# this is not a major problem)
+
+Patch102: python-3.1.1-lib64.patch
+
+#
http://bugs.python.org/issue6999 -- fixed in r75062
+Patch200: python-3.1.1-pathfix.patch
+
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+BuildRequires: readline-devel, openssl-devel, gmp-devel
+BuildRequires: ncurses-devel, gdbm-devel, zlib-devel, expat-devel
+BuildRequires: libGL-devel gcc-c++ libX11-devel glibc-devel
+BuildRequires: bzip2 tar /usr/bin/find pkgconfig tcl-devel tk-devel
+BuildRequires: tix-devel bzip2-devel sqlite-devel
+BuildRequires: autoconf
+BuildRequires: db4-devel >= 4.7
+BuildRequires: libffi-devel
+
+URL:
http://www.python.org/
+
+# See notes in bug 532118:
+Provides: python(abi) = %{pybasever}
+
+%description
+Python 3 is a new version of the language that is incompatible with the 2.x
+line of releases. The language is mostly the same, but many details, especially
+how built-in objects like dictionaries and strings work, have changed
+considerably, and a lot of deprecated features have finally been removed.
+
+%package libs
+Summary: Python 3 runtime libraries
+Group: Development/Libraries
+#Requires: %{name} = %{version}-%{release}
+
+%description libs
+This package contains files used to embed Python 3 into applications.
+
+%package devel
+Summary: Libraries and header files needed for Python 3 development
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+Conflicts: %{name} < %{version}-%{release}
+
+%description devel
+This package contains libraries and header files used to build applications
+with and native libraries for Python 3
+
+%package tools
+Summary: A collection of tools included with Python 3
+Group: Development/Tools
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-tkinter = %{version}-%{release}
+
+%description tools
+This package contains several tools included with Python 3
+
+%package tkinter
+Summary: A GUI toolkit for Python 3
+Group: Development/Languages
+BuildRequires: tcl, tk
+Requires: %{name} = %{version}-%{release}
+
+%description tkinter
+The Tkinter (Tk interface) program is an graphical user interface for
+the Python scripting language.
+
+%package test
+Summary: The test modules from the main python 3 package
+Group: Development/Languages
+Requires: %{name} = %{version}-%{release}
+Requires: %{name}-tools = %{version}-%{release}
+
+%description test
+The test modules from the main %{name} package.
+These are in a separate package to save space, as they are almost never used
+in production.
+
+You might want to install the python3-test package if you're developing
+python 3 code that uses more than just unittest and/or test_support.py.
+
+%prep
+%setup -q -n Python-%{version}
+chmod +x %{SOURCE1}
+%patch0 -p1 -b .config
+%patch1 -p1 -b .rpath
+%patch2 -p0 -b .fix-handling-of-readonly-pyc-files
+%patch3 -p1 -b .remove-mimeaudio-tests
+%patch4 -p1 -b .apply-our-changes-to-expected-shebang
+%patch5 -p1 -b .install-tkinter-tests
+
+%if "%{_lib}" == "lib64"
+%patch102 -p1 -b .lib64
+%endif
+
+%patch200 -p1 -b .pathfix
+
+
+%build
+export CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
+export CXXFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
+export CPPFLAGS="`pkg-config --cflags-only-I libffi`"
+export OPT="$RPM_OPT_FLAGS -D_GNU_SOURCE -fPIC"
+export LINKCC="gcc"
+export CFLAGS="$CFLAGS `pkg-config --cflags openssl`"
+export LDFLAGS="$LDFLAGS `pkg-config --libs-only-L openssl`"
+
+autoconf
+%configure --enable-ipv6 --with-wide-unicode --enable-shared --with-system-ffi
+
+make OPT="$CFLAGS" %{?_smp_mflags}
+
+
+%install
+rm -fr $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT%{_prefix} $RPM_BUILD_ROOT%{_mandir}
+
+make install DESTDIR=$RPM_BUILD_ROOT
+
+mkdir -p ${RPM_BUILD_ROOT}%{pylibdir}/site-packages
+
+mv ${RPM_BUILD_ROOT}%{_bindir}/2to3 ${RPM_BUILD_ROOT}%{_bindir}/2to3-3
+
+# Development tools
+install -m755 -d ${RPM_BUILD_ROOT}%{pylibdir}/Tools
+install Tools/README ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
+cp -ar Tools/freeze ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
+cp -ar Tools/i18n ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
+cp -ar Tools/modulator ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
+cp -ar Tools/pynche ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
+cp -ar Tools/scripts ${RPM_BUILD_ROOT}%{pylibdir}/Tools/
+
+# Documentation tools
+install -m755 -d $RPM_BUILD_ROOT%{pylibdir}/Doc
+cp -ar Doc/tools $RPM_BUILD_ROOT%{pylibdir}/Doc/
+
+# Demo scripts
+cp -ar Demo $RPM_BUILD_ROOT%{pylibdir}/
+
+find $RPM_BUILD_ROOT%{pylibdir}/lib-dynload -type d | sed "s|$RPM_BUILD_ROOT|%dir
|" > dynfiles
+find $RPM_BUILD_ROOT%{pylibdir}/lib-dynload -type f | \
+ grep -v "_tkinter.so$" | \
+ grep -v "_ctypes_test.so$" | \
+ grep -v "_testcapimodule.so$" | \
+ sed "s|$RPM_BUILD_ROOT||" >> dynfiles
+
+# Fix for bug #136654
+rm -f $RPM_BUILD_ROOT%{pylibdir}/email/test/data/audiotest.au
$RPM_BUILD_ROOT%{pylibdir}/test/audiotest.au
+
+%if "%{_lib}" == "lib64"
+install -d $RPM_BUILD_ROOT/usr/lib/python%{pybasever}/site-packages
+%endif
+
+# Make python3-devel multilib-ready (bug #192747, #139911)
+%global _pyconfig32_h pyconfig-32.h
+%global _pyconfig64_h pyconfig-64.h
+
+%ifarch ppc64 s390x x86_64 ia64 alpha sparc64
+%global _pyconfig_h %{_pyconfig64_h}
+%else
+%global _pyconfig_h %{_pyconfig32_h}
+%endif
+mv $RPM_BUILD_ROOT%{_includedir}/python%{pybasever}/pyconfig.h \
+ $RPM_BUILD_ROOT%{_includedir}/python%{pybasever}/%{_pyconfig_h}
+cat > $RPM_BUILD_ROOT%{_includedir}/python%{pybasever}/pyconfig.h << EOF
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+#include "%{_pyconfig32_h}"
+#elif __WORDSIZE == 64
+#include "%{_pyconfig64_h}"
+#else
+#error "Unknown word size"
+#endif
+EOF
+
+# Fix for bug 201434: make sure distutils looks at the right pyconfig.h file
+sed -i -e "s/'pyconfig.h'/'%{_pyconfig_h}'/"
$RPM_BUILD_ROOT%{pylibdir}/distutils/sysconfig.py
+
+# Switch all shebangs to refer to the specific Python version.
+LD_LIBRARY_PATH=. ./python Tools/scripts/pathfix.py -i
"%{_bindir}/python%{pybasever}" $RPM_BUILD_ROOT
+
+# Remove shebang lines from .py files that aren't executable, and
+# remove executability from .py files that don't have a shebang line:
+find $RPM_BUILD_ROOT -name \*.py \
+ \( \( \! -perm /u+x,g+x,o+x -exec sed -e '/^#!/Q 0' -e 'Q 1' {} \; \
+ -print -exec sed -i '1d' {} \; \) -o \( \
+ -perm /u+x,g+x,o+x ! -exec grep -m 1 -q '^#!' {} \; \
+ -exec chmod a-x {} \; \) \)
+
+# .xpm and .xbm files should not be executable:
+find $RPM_BUILD_ROOT \
+ \( -name \*.xbm -o -name \*.xpm -o -name \*.xpm.1 \) \
+ -exec chmod a-x {} \;
+
+# Remove executable flag from files that shouldn't have it:
+chmod a-x \
+ $RPM_BUILD_ROOT%{pylibdir}/Demo/comparisons/patterns \
+ $RPM_BUILD_ROOT%{pylibdir}/distutils/tests/Setup.sample \
+ $RPM_BUILD_ROOT%{pylibdir}/Demo/rpc/test \
+ $RPM_BUILD_ROOT%{pylibdir}/Tools/README \
+ $RPM_BUILD_ROOT%{pylibdir}/Demo/scripts/newslist.doc \
+ $RPM_BUILD_ROOT%{pylibdir}/Demo/md5test/foo
+
+# Get rid of DOS batch files:
+find $RPM_BUILD_ROOT -name \*.bat -exec rm {} \;
+
+# Get rid of backup files:
+find $RPM_BUILD_ROOT/ -name "*~" -exec rm -f {} \;
+find . -name "*~" -exec rm -f {} \;
+rm -f $RPM_BUILD_ROOT%{pylibdir}/LICENSE.txt
+# Junk, no point in putting in -test sub-pkg
+rm -f ${RPM_BUILD_ROOT}/%{pylibdir}/idlelib/testcode.py*
+
+# Get rid of stray patch file from buildroot:
+rm -f $RPM_BUILD_ROOT%{pylibdir}/test/test_imp.py.apply-our-changes-to-expected-shebang #
from patch 4
+
+# Fix end-of-line encodings:
+find $RPM_BUILD_ROOT/ -name \*.py -exec sed -i 's/\r//' {} \;
+
+# Fix an encoding:
+iconv -f iso8859-1 -t utf-8 $RPM_BUILD_ROOT/%{pylibdir}/Demo/rpc/README > README.conv
&& mv -f README.conv $RPM_BUILD_ROOT/%{pylibdir}/Demo/rpc/README
+
+# Note that
+# %{pylibdir}/Demo/distutils/test2to3/setup.py
+# is in iso-8859-1 encoding, and that this is deliberate; this is test data
+# for the 2to3 tool, and one of the functions of the 2to3 tool is to fixup
+# character encodings within python source code
+
+# Do bytecompilation with the new interpreter.
+LD_LIBRARY_PATH=. /usr/lib/rpm/brp-python-bytecompile ./python
+
+# Fixup permissions for shared libraries from non-standard 555 to standard 755:
+find $RPM_BUILD_ROOT \
+ -perm 555 -exec chmod 755 {} \;
+
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
+install -m 644 %{SOURCE2} $RPM_BUILD_ROOT/%{_sysconfdir}/rpm
+
+%check
+# Run the upstream test suite, using the "runtests.sh" harness from the
upstream
+# tarball.
+# I'm seeing occasional hangs in "test_httplib" when running the test suite
inside
+# Koji. For that reason I exclude that one.
+LD_LIBRARY_PATH=$(pwd) ./runtests.sh -x test_httplib
+
+# Note that we're running the tests using the version of the code in the builddir,
+# not in the buildroot.
+
+# The harness only emits the names of the test scripts it ran, along with a
+# summary of the form:
+# 2 BAD
+# 313 GOOD
+# 22 SKIPPED
+# 337 total
+# As a byproduct it writes files "GOOD", "BAD", "SKIPPED",
listing names of
+# files (e.g. "test_imp") along with a subdirectory OUT containing files of
the
+# form $TEST.out
+# Each such logfile starts with a line indicating the name of the test
+
+# Output the logs from failing tests, so that they are captured in the rpmbuild
+# log:
+for TESTNAME in $(cat BAD); do
+ cat OUT/$TESTNAME.out ;
+done
+
+# There are 5 expected BAD results here:
+#
+# (1) test_distutils.py: tries to build an RPM inside the rpmbuild; I'll simply
+# let this one fail for now (has trouble linking against -lpython3.1; perhaps
+# LD_LIBRARY_PATH is being discarded somewhere?)
+#
+# (2) test_imp.py: ImportTests.test_issue1267 in test_imp.py reads pydoc.py's
+# shebang line and checks that it read it correctly.tests that the shebang line
+# is as expected. Unfortunately if we patch this up in the buildir (in the
+# build phase), then the "make install" will try to reference
+# /usr/bin/python%{pybasever} which won't exist on a clean build environment.
+# So we fix up the shebang lines after this in the install phase, and expect
+# this test to fail in the check phase. It ought to pass when run on the built
+# RPMs
+#
+# (3) test_socket.py:testSockName can fail here if DNS isn't properly set up:
+# my_ip_addr = socket.gethostbyname(socket.gethostname())
+# socket.gaierror: [Errno -2] Name or service not known
+#
+# (4) test_subprocess: merely get "errors occurred"
+#
+# (5) test_telnet: can get a "socket.error: [Errno 104] Connection reset by
peer"
+#
+# Some additional tests fail when running the test suite as non-root outside of
+# the build, due to permissions issues.
+
+%clean
+rm -fr $RPM_BUILD_ROOT
+
+%post libs -p /sbin/ldconfig
+
+%postun libs -p /sbin/ldconfig
+
+%files -f dynfiles
+%defattr(-, root, root)
+%doc LICENSE README
+%{_bindir}/pydoc*
+%{_bindir}/python3
+%{_bindir}/python%{pybasever}
+%{_mandir}/*/*
+%dir %{pylibdir}
+%dir %{pylibdir}/site-packages
+%{pylibdir}/site-packages/README
+%{pylibdir}/*.py*
+%{pylibdir}/*.doc
+%{pylibdir}/wsgiref.egg-info
+%dir %{pylibdir}/ctypes
+%{pylibdir}/ctypes/*.py*
+%{pylibdir}/ctypes/macholib
+%{pylibdir}/curses
+%dir %{pylibdir}/dbm
+%{pylibdir}/dbm/*.py*
+%dir %{pylibdir}/distutils
+%{pylibdir}/distutils/*.py*
+%{pylibdir}/distutils/README
+%{pylibdir}/distutils/command
+%dir %{pylibdir}/email
+%{pylibdir}/email/*.py*
+%{pylibdir}/email/mime
+%{pylibdir}/encodings
+%{pylibdir}/html
+%{pylibdir}/http
+%{pylibdir}/idlelib
+%dir %{pylibdir}/importlib
+%{pylibdir}/importlib/*.py*
+%dir %{pylibdir}/json
+%{pylibdir}/json/*.py*
+%{pylibdir}/logging
+%{pylibdir}/multiprocessing
+%{pylibdir}/plat-linux2
+%{pylibdir}/pydoc_data
+%dir %{pylibdir}/sqlite3
+%{pylibdir}/sqlite3/*.py*
+%dir %{pylibdir}/test
+%{pylibdir}/test/__init__.py*
+%{pylibdir}/urllib
+%{pylibdir}/wsgiref
+%{pylibdir}/xml
+%{pylibdir}/xmlrpc
+%if "%{_lib}" == "lib64"
+%attr(0755,root,root) %dir /usr/lib/python%{pybasever}
+%attr(0755,root,root) %dir /usr/lib/python%{pybasever}/site-packages
+%endif
+
+# "Makefile" and the config-32/64.h file are needed by
+# distutils/sysconfig.py:_init_posix(), so we include them in the core
+# package, along with their parent directories (bug 531901):
+%dir %{pylibdir}/config
+%{pylibdir}/config/Makefile
+%dir /usr/include/python%{pybasever}
+/usr/include/python%{pybasever}/%{_pyconfig_h}
+
+%files libs
+%defattr(-,root,root,-)
+%{_libdir}/libpython%{pybasever}.so.*
+
+%files devel
+%defattr(-,root,root)
+%{pylibdir}/config/*
+%exclude %{pylibdir}/config/Makefile
+/usr/include/python%{pybasever}/*.h
+%exclude /usr/include/python%{pybasever}/%{_pyconfig_h}
+%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
+%{_bindir}/python3-config
+%{_bindir}/python%{pybasever}-config
+%{_libdir}/libpython%{pybasever}.so
+%{_libdir}/pkgconfig/python*.pc
+%config(noreplace) %{_sysconfdir}/rpm/macros.python3
+
+%files tools
+%defattr(-,root,root,755)
+%{pylibdir}/lib2to3
+%exclude %{pylibdir}/lib2to3/tests
+%{_bindir}/2to3*
+%{_bindir}/idle*
+%{pylibdir}/Tools
+%doc %{pylibdir}/Demo
+%exclude %{pylibdir}/Demo/distutils
+%exclude %{pylibdir}/Demo/md5test
+%doc %{pylibdir}/Doc
+
+%files tkinter
+%defattr(-,root,root,755)
+%{pylibdir}/tkinter
+%exclude %{pylibdir}/tkinter/test
+%{pylibdir}/lib-dynload/_tkinter.so
+
+%files test
+%defattr(-, root, root)
+%{pylibdir}/ctypes/test
+%{pylibdir}/distutils/tests
+%{pylibdir}/email/test
+%{pylibdir}/importlib/test
+%{pylibdir}/json/tests
+%{pylibdir}/sqlite3/test
+%{pylibdir}/test
+%{pylibdir}/lib-dynload/_ctypes_test.so
+%{pylibdir}/lib-dynload/_testcapimodule.so
+%{pylibdir}/lib2to3/tests
+%doc %{pylibdir}/Demo/distutils
+%doc %{pylibdir}/Demo/md5test
+%{pylibdir}/tkinter/test
+
+%changelog
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-13
+- fix permission on find-provides-without-python-sonames.sh from 775 to 755
+
+* Mon Jan 11 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-12
+- remove build-time requirements on tix and tk, since we already have
+build-time requirements on the -devel subpackages for each of these (Thomas
+Spura)
+- replace usage of %%define with %%global (Thomas Spura)
+- remove forcing of CC=gcc as this old workaround for bug 109268 appears to
+longer be necessary
+- move various test files from the "tools"/"tkinter" subpackages to
the "test"
+subpackage
+
+* Thu Jan 7 2010 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-11
+- add %%check section (thanks to Thomas Spura)
+- update patch 4 to use correct shebang line
+- get rid of stray patch file from buildroot
+
+* Tue Nov 17 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> - 3.1.1-10
+- switched a few instances of "find |xargs" to "find -exec" for
consistency.
+- made the description of __os_install_post more accurate.
+
+* Wed Nov 4 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-9
+- add macros.python3 to the -devel subpackage, containing common macros for use
+when packaging python3 modules
+
+* Tue Nov 3 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-8
+- add a provides of "python(abi)" (see bug 532118)
+- fix issues identified by a.badger in package review (bug 526126, comment 39):
+ - use "3" thoughout metadata, rather than "3.*"
+ - remove conditional around "pkg-config openssl"
+ - use standard cleanup of RPM_BUILD_ROOT
+ - replace hardcoded references to /usr with _prefix macro
+ - stop removing egg-info files
+ - use /usr/bin/python3.1 rather than /use/bin/env python3.1 when fixing
+up shebang lines
+ - stop attempting to remove no-longer-present .cvsignore files
+ - move the post/postun sections above the "files" sections
+
+* Thu Oct 29 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-7
+- remove commented-away patch 51 (python-2.6-distutils_rpm.patch): the -O1
+flag is used by default in the upstream code
+- "Makefile" and the config-32/64.h file are needed by distutils/sysconfig.py
+_init_posix(), so we include them in the core package, along with their parent
+directories (bug 531901)
+
+* Tue Oct 27 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-6
+- reword description, based on suggestion by amcnabb
+- fix the test_email and test_imp selftests (patch 3 and patch 4 respectively)
+- fix the test_tk and test_ttk_* selftests (patch 5)
+- fix up the specfile's handling of shebang/perms to avoid corrupting
+test_httpservers.py (sed command suggested by amcnabb)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-5
+- fixup importlib/_bootstrap.py so that it correctly handles being unable to
+open .pyc files for writing (patch 2, upstream issue 7187)
+- actually apply the rpath patch (patch 1)
+
+* Thu Oct 22 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-4
+- update patch0's setup of the crypt module to link it against libcrypt
+- update patch0 to comment "datetimemodule" back out, so that it is built
+using setup.py (see Setup, option 3), thus linking it statically against
+timemodule.c and thus avoiding a run-time "undefined symbol:
+_PyTime_DoubleToTimet" failure on "import datetime"
+
+* Wed Oct 21 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-3
+- remove executable flag from various files that shouldn't have it
+- fix end-of-line encodings
+- fix a character encoding
+
+* Tue Oct 20 2009 David Malcolm <dmalcolm(a)redhat.com> - 3.1.1-2
+- disable invocation of brp-python-bytecompile in postprocessing, since
+it would be with the wrong version of python (adapted from ivazquez'
+python3000 specfile)
+- use a custom implementation of __find_provides in order to filter out bogus
+provides lines for the various .so modules
+- fixup distutils/unixccompiler.py to remove standard library path from rpath
+(patch 1, was Patch0 in ivazquez' python3000 specfile)
+- split out libraries into a -libs subpackage
+- update summaries and descriptions, basing content on ivazquez' specfile
+- fixup executable permissions on .py, .xpm and .xbm files, based on work in
+ivazquez's specfile
+- get rid of DOS batch files
+- fixup permissions for shared libraries from non-standard 555 to standard 755
+- move /usr/bin/python*-config to the -devel subpackage
+- mark various directories as being documentation
+
+* Thu Sep 24 2009 Andrew McNabb <amcnabb(a)mcnabbs.org> 3.1.1-1
+- Initial package for Python 3.
+
diff --git a/sources b/sources
index e69de29..59b2b95 100644
--- a/sources
+++ b/sources
@@ -0,0 +1 @@
+d1ddd9f16e3c6a51c7208f33518cd674 Python-3.1.1.tar.bz2