Package init
This commit is contained in:
parent
f8d9d98954
commit
11db1f8d64
28
00001-pydocnogui.patch
Normal file
28
00001-pydocnogui.patch
Normal file
@ -0,0 +1,28 @@
|
||||
diff -up Python-2.7.3/Lib/pydoc.py.no_gui Python-2.7.3/Lib/pydoc.py
|
||||
--- Python-2.7.3/Lib/pydoc.py.no_gui 2012-04-09 19:07:31.000000000 -0400
|
||||
+++ Python-2.7.3/Lib/pydoc.py 2013-02-19 13:48:44.480054515 -0500
|
||||
@@ -19,9 +19,6 @@ of all available modules.
|
||||
local machine to generate documentation web pages. Port number 0 can be
|
||||
used to get an arbitrary unused port.
|
||||
|
||||
-For platforms without a command line, "pydoc -g" starts the HTTP server
|
||||
-and also pops up a little window for controlling it.
|
||||
-
|
||||
Run "pydoc -w <name>" to write out the HTML documentation for a module
|
||||
to a file named "<name>.html".
|
||||
|
||||
@@ -2346,13 +2340,10 @@ def cli():
|
||||
Start an HTTP server on the given port on the local machine. Port
|
||||
number 0 can be used to get an arbitrary unused port.
|
||||
|
||||
-%s -g
|
||||
- Pop up a graphical interface for finding and serving documentation.
|
||||
-
|
||||
%s -w <name> ...
|
||||
Write out the HTML documentation for a module to a file in the current
|
||||
directory. If <name> contains a '%s', it is treated as a filename; if
|
||||
it names a directory, documentation is written for all the contents.
|
||||
-""" % (cmd, os.sep, cmd, cmd, cmd, cmd, os.sep)
|
||||
+""" % (cmd, os.sep, cmd, cmd, cmd, os.sep)
|
||||
|
||||
if __name__ == '__main__': cli()
|
||||
21
00010-2.7.13-binutils-no-dep.patch
Normal file
21
00010-2.7.13-binutils-no-dep.patch
Normal file
@ -0,0 +1,21 @@
|
||||
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
|
||||
index ab10ec5..923d1b7 100644
|
||||
--- a/Lib/ctypes/util.py
|
||||
+++ b/Lib/ctypes/util.py
|
||||
@@ -140,11 +140,15 @@ elif os.name == "posix":
|
||||
# assuming GNU binutils / ELF
|
||||
if not f:
|
||||
return None
|
||||
- cmd = 'if ! type objdump >/dev/null 2>&1; then exit; fi;' \
|
||||
+ cmd = 'if ! type objdump >/dev/null 2>&1; then exit 10; fi;' \
|
||||
'objdump -p -j .dynamic 2>/dev/null "$1"'
|
||||
proc = subprocess.Popen((cmd, '_get_soname', f), shell=True,
|
||||
stdout=subprocess.PIPE)
|
||||
[dump, _] = proc.communicate()
|
||||
+ if proc.returncode == 10:
|
||||
+ return os.path.basename(f) # This is good for GLibc, I think,
|
||||
+ # and a dep on binutils is big (for
|
||||
+ # live CDs).
|
||||
res = re.search(br'\sSONAME\s+([^\s]+)', dump)
|
||||
if not res:
|
||||
return None
|
||||
198
00055-systemtap.patch
Normal file
198
00055-systemtap.patch
Normal file
@ -0,0 +1,198 @@
|
||||
diff -up Python-2.7rc1/configure.ac.systemtap Python-2.7rc1/configure.ac
|
||||
--- Python-2.7rc1/configure.ac.systemtap 2010-06-06 10:53:15.514975012 -0400
|
||||
+++ Python-2.7rc1/configure.ac 2010-06-06 10:53:15.520974361 -0400
|
||||
@@ -2616,6 +2616,38 @@ if test "$with_valgrind" != no; then
|
||||
)
|
||||
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-2.7rc1/Include/pydtrace.d.systemtap Python-2.7rc1/Include/pydtrace.d
|
||||
--- Python-2.7rc1/Include/pydtrace.d.systemtap 2010-06-06 10:53:15.520974361 -0400
|
||||
+++ Python-2.7rc1/Include/pydtrace.d 2010-06-06 10:53:15.520974361 -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-2.7rc1/Makefile.pre.in.systemtap Python-2.7rc1/Makefile.pre.in
|
||||
--- Python-2.7rc1/Makefile.pre.in.systemtap 2010-06-06 10:53:15.488978775 -0400
|
||||
+++ Python-2.7rc1/Makefile.pre.in 2010-06-06 11:05:30.411100568 -0400
|
||||
@@ -298,6 +298,7 @@ PYTHON_OBJS= \
|
||||
Python/formatter_unicode.o \
|
||||
Python/formatter_string.o \
|
||||
Python/$(DYNLOADFILE) \
|
||||
+ @DTRACEOBJS@ \
|
||||
$(LIBOBJS) \
|
||||
$(MACHDEP_OBJS) \
|
||||
$(THREADOBJ)
|
||||
@@ -599,6 +600,18 @@ Python/formatter_unicode.o: $(srcdir)/Py
|
||||
Python/formatter_string.o: $(srcdir)/Python/formatter_string.c \
|
||||
$(STRINGLIB_HEADERS)
|
||||
|
||||
+# 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
|
||||
|
||||
@@ -1251,7 +1264,7 @@ Python/thread.o: @THREADHEADERS@
|
||||
.PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure
|
||||
.PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools
|
||||
.PHONY: frameworkaltinstallunixtools recheck clean clobber distclean
|
||||
-.PHONY: smelly funny patchcheck altmaninstall commoninstall
|
||||
+.PHONY: smelly funny patchcheck altmaninstall commoninstall buildinclude
|
||||
.PHONY: gdbhooks
|
||||
|
||||
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
|
||||
diff -up Python-2.7rc1/pyconfig.h.in.systemtap Python-2.7rc1/pyconfig.h.in
|
||||
--- Python-2.7rc1/pyconfig.h.in.systemtap 2010-05-08 07:04:18.000000000 -0400
|
||||
+++ Python-2.7rc1/pyconfig.h.in 2010-06-06 10:53:15.521974070 -0400
|
||||
@@ -1074,6 +1074,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-2.7rc1/Python/ceval.c.systemtap Python-2.7rc1/Python/ceval.c
|
||||
--- Python-2.7rc1/Python/ceval.c.systemtap 2010-05-09 10:46:46.000000000 -0400
|
||||
+++ Python-2.7rc1/Python/ceval.c 2010-06-06 11:08:40.683100500 -0400
|
||||
@@ -19,6 +19,10 @@
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
+#ifdef WITH_DTRACE
|
||||
+#include "pydtrace.h"
|
||||
+#endif
|
||||
+
|
||||
#ifndef WITH_TSC
|
||||
|
||||
#define READ_TIMESTAMP(var)
|
||||
@@ -671,6 +675,55 @@ PyEval_EvalCode(PyCodeObject *co, PyObje
|
||||
NULL);
|
||||
}
|
||||
|
||||
+#ifdef WITH_DTRACE
|
||||
+static void
|
||||
+dtrace_entry(PyFrameObject *f)
|
||||
+{
|
||||
+ const char *filename;
|
||||
+ const char *fname;
|
||||
+ int lineno;
|
||||
+
|
||||
+ filename = PyString_AsString(f->f_code->co_filename);
|
||||
+ fname = PyString_AsString(f->f_code->co_name);
|
||||
+ lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
|
||||
+
|
||||
+ PYTHON_FUNCTION_ENTRY((char *)filename, (char *)fname, lineno);
|
||||
+
|
||||
+ /*
|
||||
+ * Currently a USDT tail-call will not receive the correct arguments.
|
||||
+ * Disable the tail call here.
|
||||
+ */
|
||||
+#if defined(__sparc)
|
||||
+ asm("nop");
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+dtrace_return(PyFrameObject *f)
|
||||
+{
|
||||
+ const char *filename;
|
||||
+ const char *fname;
|
||||
+ int lineno;
|
||||
+
|
||||
+ filename = PyString_AsString(f->f_code->co_filename);
|
||||
+ fname = PyString_AsString(f->f_code->co_name);
|
||||
+ lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
|
||||
+ PYTHON_FUNCTION_RETURN((char *)filename, (char *)fname, lineno);
|
||||
+
|
||||
+ /*
|
||||
+ * Currently a USDT tail-call will not receive the correct arguments.
|
||||
+ * Disable the tail call here.
|
||||
+ */
|
||||
+#if defined(__sparc)
|
||||
+ asm("nop");
|
||||
+#endif
|
||||
+}
|
||||
+#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 */
|
||||
|
||||
@@ -909,6 +962,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;
|
||||
@@ -3000,6 +3056,9 @@ fast_yield:
|
||||
|
||||
/* pop frame */
|
||||
exit_eval_frame:
|
||||
+ if (PYTHON_FUNCTION_RETURN_ENABLED())
|
||||
+ dtrace_return(f);
|
||||
+
|
||||
Py_LeaveRecursiveCall();
|
||||
tstate->frame = f->f_back;
|
||||
|
||||
50
00111-no-static-lib.patch
Normal file
50
00111-no-static-lib.patch
Normal file
@ -0,0 +1,50 @@
|
||||
diff -up Python-2.7.6/Makefile.pre.in.no-static-lib Python-2.7.6/Makefile.pre.in
|
||||
--- Python-2.7.6/Makefile.pre.in.no-static-lib 2014-01-29 13:58:32.933226720 +0100
|
||||
+++ Python-2.7.6/Makefile.pre.in 2014-01-29 14:10:25.002247272 +0100
|
||||
@@ -437,7 +437,7 @@ coverage:
|
||||
|
||||
|
||||
# Build the interpreter
|
||||
-$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
|
||||
+$(BUILDPYTHON): Modules/python.o $(LDLIBRARY)
|
||||
$(LINKCC) $(CFLAGS) $(LDFLAGS) $(LINKFORSHARED) -o $@ \
|
||||
Modules/python.o \
|
||||
$(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
|
||||
@@ -464,18 +464,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.tx
|
||||
_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)
|
||||
- $(AR) $(ARFLAGS) $@ $(MODULE_OBJS) $(SIGNAL_OBJS)
|
||||
- $(AR) $(ARFLAGS) $@ $(MODOBJS)
|
||||
- $(RANLIB) $@
|
||||
-
|
||||
libpython$(VERSION).so: $(LIBRARY_OBJS)
|
||||
if test $(INSTSONAME) != $(LDLIBRARY); then \
|
||||
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
|
||||
@@ -1097,18 +1085,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
|
||||
324
00112-2.7.13-debug-build.patch
Normal file
324
00112-2.7.13-debug-build.patch
Normal file
@ -0,0 +1,324 @@
|
||||
From 898f93aa206e577dfe854c59bc62d0cea09cd5ed Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Orsava <torsava@redhat.com>
|
||||
Date: Tue, 10 Jan 2017 16:19:50 +0100
|
||||
Subject: [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.
|
||||
---
|
||||
Lib/distutils/command/build_ext.py | 7 ++++-
|
||||
Lib/distutils/sysconfig.py | 5 ++--
|
||||
Lib/distutils/tests/test_install.py | 3 +-
|
||||
Makefile.pre.in | 56 ++++++++++++++++++++-----------------
|
||||
Misc/python-config.in | 2 +-
|
||||
Modules/makesetup | 2 +-
|
||||
Python/dynload_shlib.c | 11 ++++++--
|
||||
Python/sysmodule.c | 6 ++++
|
||||
configure.ac | 14 ++++++++--
|
||||
9 files changed, 69 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
|
||||
index 2c68be3..029d144 100644
|
||||
--- a/Lib/distutils/command/build_ext.py
|
||||
+++ b/Lib/distutils/command/build_ext.py
|
||||
@@ -677,7 +677,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
|
||||
@@ -762,6 +765,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 --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
|
||||
index 3e7f077..ec5d584 100644
|
||||
--- a/Lib/distutils/sysconfig.py
|
||||
+++ b/Lib/distutils/sysconfig.py
|
||||
@@ -90,7 +90,8 @@ def get_python_inc(plat_specific=0, prefix=None):
|
||||
# Include is located in the srcdir
|
||||
inc_dir = os.path.join(srcdir, "Include")
|
||||
return inc_dir
|
||||
- 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 == "os2":
|
||||
@@ -248,7 +249,7 @@ def get_makefile_filename():
|
||||
if python_build:
|
||||
return os.path.join(project_base, "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 --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py
|
||||
index 78fac46..d1d0931 100644
|
||||
--- a/Lib/distutils/tests/test_install.py
|
||||
+++ b/Lib/distutils/tests/test_install.py
|
||||
@@ -20,8 +20,9 @@ from distutils.tests import support
|
||||
|
||||
|
||||
def _make_ext_name(modname):
|
||||
- if os.name == 'nt' and sys.executable.endswith('_d.exe'):
|
||||
+ if sys.pydebug:
|
||||
modname += '_d'
|
||||
+
|
||||
return modname + sysconfig.get_config_var('SO')
|
||||
|
||||
|
||||
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||
index 997a2fc..467e782 100644
|
||||
--- a/Makefile.pre.in
|
||||
+++ b/Makefile.pre.in
|
||||
@@ -116,8 +116,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
|
||||
@@ -131,6 +131,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@
|
||||
@@ -197,8 +203,8 @@ LIBOBJDIR= Python/
|
||||
LIBOBJS= @LIBOBJS@
|
||||
UNICODE_OBJS= @UNICODE_OBJS@
|
||||
|
||||
-PYTHON= python$(EXE)
|
||||
-BUILDPYTHON= python$(BUILDEXE)
|
||||
+PYTHON= python$(DEBUG_SUFFIX)$(EXE)
|
||||
+BUILDPYTHON= python$(DEBUG_SUFFIX)$(BUILDEXE)
|
||||
|
||||
PYTHON_FOR_REGEN=@PYTHON_FOR_REGEN@
|
||||
PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
|
||||
@@ -547,7 +553,7 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
|
||||
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
|
||||
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
|
||||
|
||||
-libpython$(VERSION).so: $(LIBRARY_OBJS)
|
||||
+libpython$(VERSION)$(DEBUG_EXT).so: $(LIBRARY_OBJS)
|
||||
if test $(INSTSONAME) != $(LDLIBRARY); then \
|
||||
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
|
||||
$(LN) -f $(INSTSONAME) $@; \
|
||||
@@ -954,18 +960,18 @@ bininstall: altbininstall
|
||||
then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON); \
|
||||
else true; \
|
||||
fi
|
||||
- (cd $(DESTDIR)$(BINDIR); $(LN) -s python2$(EXE) $(PYTHON))
|
||||
- -rm -f $(DESTDIR)$(BINDIR)/python2$(EXE)
|
||||
- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python2$(EXE))
|
||||
- -rm -f $(DESTDIR)$(BINDIR)/python2-config
|
||||
- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python2-config)
|
||||
- -rm -f $(DESTDIR)$(BINDIR)/python-config
|
||||
- (cd $(DESTDIR)$(BINDIR); $(LN) -s python2-config python-config)
|
||||
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python2$(DEBUG_SUFFIX)$(EXE) $(PYTHON))
|
||||
+ -rm -f $(DESTDIR)$(BINDIR)/python2$(DEBUG_SUFFIX)$(EXE)
|
||||
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(DEBUG_SUFFIX)$(EXE) python2$(DEBUG_SUFFIX)$(EXE))
|
||||
+ -rm -f $(DESTDIR)$(BINDIR)/python2$(DEBUG_SUFFIX)-config
|
||||
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(DEBUG_SUFFIX)-config python2$(DEBUG_SUFFIX)-config)
|
||||
+ -rm -f $(DESTDIR)$(BINDIR)/python$(DEBUG_SUFFIX)-config
|
||||
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python2$(DEBUG_SUFFIX)-config python$(DEBUG_SUFFIX)-config)
|
||||
-test -d $(DESTDIR)$(LIBPC) || $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(LIBPC)
|
||||
- -rm -f $(DESTDIR)$(LIBPC)/python2.pc
|
||||
- (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python2.pc)
|
||||
- -rm -f $(DESTDIR)$(LIBPC)/python.pc
|
||||
- (cd $(DESTDIR)$(LIBPC); $(LN) -s python2.pc python.pc)
|
||||
+ -rm -f $(DESTDIR)$(LIBPC)/python2$(DEBUG_SUFFIX).pc
|
||||
+ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)$(DEBUG_SUFFIX).pc python2$(DEBUG_SUFFIX).pc)
|
||||
+ -rm -f $(DESTDIR)$(LIBPC)/python$(DEBUG_SUFFIX).pc
|
||||
+ (cd $(DESTDIR)$(LIBPC); $(LN) -s python2$(DEBUG_SUFFIX).pc python$(DEBUG_SUFFIX).pc)
|
||||
|
||||
# Install the interpreter with $(VERSION) affixed
|
||||
# This goes into $(exec_prefix)
|
||||
@@ -978,7 +984,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); \
|
||||
@@ -1148,10 +1154,11 @@ $(srcdir)/Lib/$(PLATDIR):
|
||||
fi; \
|
||||
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)
|
||||
@@ -1172,13 +1179,13 @@ inclinstall:
|
||||
$(INSTALL_DATA) pyconfig.h $(DESTDIR)$(CONFINCLUDEPY)/pyconfig.h
|
||||
|
||||
# Install the library and miscellaneous stuff needed for extending/embedding
|
||||
-# This goes into $(exec_prefix)
|
||||
-LIBPL= $(LIBP)/config
|
||||
+# This goes into $(exec_prefix)$(DEBUG_SUFFIX)
|
||||
+LIBPL= $(LIBP)/config$(DEBUG_SUFFIX)
|
||||
|
||||
# pkgconfig directory
|
||||
LIBPC= $(LIBDIR)/pkgconfig
|
||||
|
||||
-libainstall: @DEF_MAKE_RULE@ python-config
|
||||
+libainstall: @DEF_MAKE_RULE@ python$(DEBUG_SUFFIX)-config
|
||||
@for i in $(LIBDIR) $(LIBP) $(LIBPL) $(LIBPC); \
|
||||
do \
|
||||
if test ! -d $(DESTDIR)$$i; then \
|
||||
@@ -1194,11 +1201,10 @@ 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
|
||||
@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 --git a/Misc/python-config.in b/Misc/python-config.in
|
||||
index a09e07c..c1691ef 100644
|
||||
--- a/Misc/python-config.in
|
||||
+++ b/Misc/python-config.in
|
||||
@@ -44,7 +44,7 @@ for opt in opt_flags:
|
||||
print ' '.join(flags)
|
||||
|
||||
elif opt in ('--libs', '--ldflags'):
|
||||
- libs = ['-lpython' + pyver]
|
||||
+ libs = ['-lpython' + pyver + (sys.pydebug and "_d" or "")]
|
||||
libs += getvar('LIBS').split()
|
||||
libs += getvar('SYSLIBS').split()
|
||||
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
|
||||
diff --git a/Modules/makesetup b/Modules/makesetup
|
||||
index 1bffcbf..f0bc743 100755
|
||||
--- a/Modules/makesetup
|
||||
+++ b/Modules/makesetup
|
||||
@@ -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 --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c
|
||||
index 17ebab1..02a94aa 100644
|
||||
--- a/Python/dynload_shlib.c
|
||||
+++ b/Python/dynload_shlib.c
|
||||
@@ -46,11 +46,16 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {
|
||||
{"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 --git a/Python/sysmodule.c b/Python/sysmodule.c
|
||||
index aeff38a..183e3cc 100644
|
||||
--- a/Python/sysmodule.c
|
||||
+++ b/Python/sysmodule.c
|
||||
@@ -1524,6 +1524,12 @@ _PySys_Init(void)
|
||||
PyString_FromString("legacy"));
|
||||
#endif
|
||||
|
||||
+#ifdef Py_DEBUG
|
||||
+ PyDict_SetItemString(sysdict, "pydebug", Py_True);
|
||||
+#else
|
||||
+ PyDict_SetItemString(sysdict, "pydebug", Py_False);
|
||||
+#endif
|
||||
+
|
||||
#undef SET_SYS_FROM_STRING
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 0a902c7..5caedb7 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -764,7 +764,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)
|
||||
|
||||
@@ -910,8 +910,8 @@ if test $enable_shared = "yes"; then
|
||||
INSTSONAME="$LDLIBRARY".$SOVERSION
|
||||
;;
|
||||
Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*)
|
||||
- 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:+:${LD_LIBRARY_PATH}}
|
||||
case $ac_sys_system in
|
||||
FreeBSD*)
|
||||
@@ -1040,6 +1040,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?
|
||||
|
||||
--
|
||||
2.11.0
|
||||
|
||||
50
00113-more-configuration-flags.patch
Normal file
50
00113-more-configuration-flags.patch
Normal file
@ -0,0 +1,50 @@
|
||||
diff -up Python-2.6.5/configure.ac.more-configuration-flags Python-2.6.5/configure.ac
|
||||
--- Python-2.6.5/configure.ac.more-configuration-flags 2010-05-24 18:51:25.410111792 -0400
|
||||
+++ Python-2.6.5/configure.ac 2010-05-24 18:59:23.954986388 -0400
|
||||
@@ -2515,6 +2515,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-2.6.5/pyconfig.h.in.more-configuration-flags Python-2.6.5/pyconfig.h.in
|
||||
--- Python-2.6.5/pyconfig.h.in.more-configuration-flags 2010-05-24 18:51:45.677988086 -0400
|
||||
+++ Python-2.6.5/pyconfig.h.in 2010-05-24 19:00:44.163987730 -0400
|
||||
@@ -1019,6 +1019,12 @@
|
||||
/* Define to profile with the Pentium timestamp counter */
|
||||
#undef WITH_TSC
|
||||
|
||||
+/* Define to keep records of the number of instances of each type */
|
||||
+#undef COUNT_ALLOCS
|
||||
+
|
||||
+/* Define to keep records on function call invocation */
|
||||
+#undef CALL_PROFILE
|
||||
+
|
||||
/* Define if you want pymalloc to be disabled when running under valgrind */
|
||||
#undef WITH_VALGRIND
|
||||
|
||||
47
00114-statvfs-f_flag-constants.patch
Normal file
47
00114-statvfs-f_flag-constants.patch
Normal file
@ -0,0 +1,47 @@
|
||||
diff -up Python-2.7rc1/Modules/posixmodule.c.statvfs-f-flag-constants Python-2.7rc1/Modules/posixmodule.c
|
||||
--- Python-2.7rc1/Modules/posixmodule.c.statvfs-f-flag-constants 2010-05-15 17:45:30.000000000 -0400
|
||||
+++ Python-2.7rc1/Modules/posixmodule.c 2010-06-07 22:54:16.162068624 -0400
|
||||
@@ -9174,6 +9174,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
|
||||
11
00131-disable-tests-in-test_io.patch
Normal file
11
00131-disable-tests-in-test_io.patch
Normal file
@ -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
|
||||
68
00132-add-rpmbuild-hooks-to-unittest.patch
Normal file
68
00132-add-rpmbuild-hooks-to-unittest.patch
Normal file
@ -0,0 +1,68 @@
|
||||
diff -up Python-2.7.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python-2.7.2/Lib/unittest/case.py
|
||||
--- Python-2.7.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest 2011-09-08 14:45:47.677169191 -0400
|
||||
+++ Python-2.7.2/Lib/unittest/case.py 2011-09-08 16:01:36.287858159 -0400
|
||||
@@ -1,6 +1,7 @@
|
||||
"""Test case implementation"""
|
||||
|
||||
import collections
|
||||
+import os
|
||||
import sys
|
||||
import functools
|
||||
import difflib
|
||||
@@ -94,6 +95,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 _AssertRaisesContext(object):
|
||||
"""A context manager used to implement TestCase.assertRaises* methods."""
|
||||
|
||||
diff -up Python-2.7.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest Python-2.7.2/Lib/unittest/__init__.py
|
||||
--- Python-2.7.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest 2011-09-08 14:59:39.534112310 -0400
|
||||
+++ Python-2.7.2/Lib/unittest/__init__.py 2011-09-08 15:07:09.191081562 -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)
|
||||
13
00133-skip-test_dl.patch
Normal file
13
00133-skip-test_dl.patch
Normal file
@ -0,0 +1,13 @@
|
||||
diff -up Python-2.7.2/Lib/test/test_dl.py.skip-test_dl Python-2.7.2/Lib/test/test_dl.py
|
||||
--- Python-2.7.2/Lib/test/test_dl.py.skip-test_dl 2011-09-08 15:18:40.529034289 -0400
|
||||
+++ Python-2.7.2/Lib/test/test_dl.py 2011-09-08 16:29:45.184742670 -0400
|
||||
@@ -13,6 +13,9 @@ sharedlibs = [
|
||||
('/usr/lib/libc.dylib', 'getpid'),
|
||||
]
|
||||
|
||||
+# (also, "dl" is deprecated in favor of ctypes)
|
||||
+@unittest._skipInRpmBuild('fails on 64-bit builds: '
|
||||
+ 'module dl requires sizeof(int) == sizeof(long) == sizeof(char*)')
|
||||
def test_main():
|
||||
for s, func in sharedlibs:
|
||||
try:
|
||||
11
00136-skip-tests-of-seeking-stdin-in-rpmbuild.patch
Normal file
11
00136-skip-tests-of-seeking-stdin-in-rpmbuild.patch
Normal file
@ -0,0 +1,11 @@
|
||||
diff -up Python-2.7.6/Lib/test/test_file2k.py.stdin-test Python-2.7.6/Lib/test/test_file2k.py
|
||||
--- Python-2.7.6/Lib/test/test_file2k.py.stdin-test 2013-11-10 08:36:40.000000000 +0100
|
||||
+++ Python-2.7.6/Lib/test/test_file2k.py 2014-01-29 14:28:01.029488055 +0100
|
||||
@@ -223,6 +223,7 @@ class OtherFileTests(unittest.TestCase):
|
||||
else:
|
||||
f.close()
|
||||
|
||||
+ @unittest._skipInRpmBuild('seems not to raise the exception when run in Koji')
|
||||
def testStdinSeek(self):
|
||||
if sys.platform == 'osf1V5':
|
||||
# This causes the interpreter to exit on OSF1 v5.1.
|
||||
12
00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
Normal file
12
00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -up Python-2.7.3/Lib/distutils/tests/test_bdist_rpm.py.mark-tests-that-fail-in-rpmbuild Python-2.7.3/Lib/distutils/tests/test_bdist_rpm.py
|
||||
--- Python-2.7.3/Lib/distutils/tests/test_bdist_rpm.py.mark-tests-that-fail-in-rpmbuild 2012-04-09 19:07:29.000000000 -0400
|
||||
+++ Python-2.7.3/Lib/distutils/tests/test_bdist_rpm.py 2012-04-13 00:20:08.223819263 -0400
|
||||
@@ -24,6 +24,7 @@ setup(name='foo', version='0.1', py_modu
|
||||
|
||||
"""
|
||||
|
||||
+@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-2.7.3/Lib/distutils/tests/test_build_ext.py.mark-tests-that-fail-in-rpmbuild Python-2.7.3/Lib/distutils/tests/test_build_ext.py
|
||||
68
00138-fix-distutils-tests-in-debug-build.patch
Normal file
68
00138-fix-distutils-tests-in-debug-build.patch
Normal file
@ -0,0 +1,68 @@
|
||||
diff -up Python-2.7.2/Lib/distutils/tests/test_build_ext.py.mark-tests-that-fail-in-rpmbuild Python-2.7.2/Lib/distutils/tests/test_build_ext.py
|
||||
--- Python-2.7.2/Lib/distutils/tests/test_build_ext.py.mark-tests-that-fail-in-rpmbuild 2011-09-08 16:07:25.033834312 -0400
|
||||
+++ Python-2.7.2/Lib/distutils/tests/test_build_ext.py 2011-09-08 17:43:15.656441082 -0400
|
||||
@@ -330,6 +332,7 @@ class BuildExtTestCase(support.TempdirMa
|
||||
self.assertEqual(lastdir, 'bar')
|
||||
|
||||
def test_ext_fullpath(self):
|
||||
+ debug_ext = sysconfig.get_config_var("DEBUG_EXT")
|
||||
ext = sysconfig.get_config_vars()['SO']
|
||||
dist = Distribution()
|
||||
cmd = build_ext(dist)
|
||||
@@ -337,14 +340,14 @@ class BuildExtTestCase(support.TempdirMa
|
||||
cmd.distribution.package_dir = {'': 'src'}
|
||||
cmd.distribution.packages = ['lxml', 'lxml.html']
|
||||
curdir = os.getcwd()
|
||||
- wanted = os.path.join(curdir, 'src', 'lxml', 'etree' + ext)
|
||||
+ wanted = os.path.join(curdir, 'src', 'lxml', 'etree' + debug_ext + ext)
|
||||
path = cmd.get_ext_fullpath('lxml.etree')
|
||||
self.assertEqual(wanted, path)
|
||||
|
||||
# building lxml.etree not inplace
|
||||
cmd.inplace = 0
|
||||
cmd.build_lib = os.path.join(curdir, 'tmpdir')
|
||||
- wanted = os.path.join(curdir, 'tmpdir', 'lxml', 'etree' + ext)
|
||||
+ wanted = os.path.join(curdir, 'tmpdir', 'lxml', 'etree' + debug_ext + ext)
|
||||
path = cmd.get_ext_fullpath('lxml.etree')
|
||||
self.assertEqual(wanted, path)
|
||||
|
||||
@@ -354,13 +357,13 @@ class BuildExtTestCase(support.TempdirMa
|
||||
cmd.distribution.packages = ['twisted', 'twisted.runner.portmap']
|
||||
path = cmd.get_ext_fullpath('twisted.runner.portmap')
|
||||
wanted = os.path.join(curdir, 'tmpdir', 'twisted', 'runner',
|
||||
- 'portmap' + ext)
|
||||
+ 'portmap' + debug_ext + ext)
|
||||
self.assertEqual(wanted, path)
|
||||
|
||||
# building twisted.runner.portmap inplace
|
||||
cmd.inplace = 1
|
||||
path = cmd.get_ext_fullpath('twisted.runner.portmap')
|
||||
- wanted = os.path.join(curdir, 'twisted', 'runner', 'portmap' + ext)
|
||||
+ wanted = os.path.join(curdir, 'twisted', 'runner', 'portmap' + debug_ext + ext)
|
||||
self.assertEqual(wanted, path)
|
||||
|
||||
def test_build_ext_inplace(self):
|
||||
@@ -373,8 +376,9 @@ class BuildExtTestCase(support.TempdirMa
|
||||
cmd.distribution.package_dir = {'': 'src'}
|
||||
cmd.distribution.packages = ['lxml', 'lxml.html']
|
||||
curdir = os.getcwd()
|
||||
+ debug_ext = sysconfig.get_config_var("DEBUG_EXT")
|
||||
ext = sysconfig.get_config_var("SO")
|
||||
- wanted = os.path.join(curdir, 'src', 'lxml', 'etree' + ext)
|
||||
+ wanted = os.path.join(curdir, 'src', 'lxml', 'etree' + debug_ext + ext)
|
||||
path = cmd.get_ext_fullpath('lxml.etree')
|
||||
self.assertEqual(wanted, path)
|
||||
|
||||
@@ -412,10 +416,11 @@ class BuildExtTestCase(support.TempdirMa
|
||||
dist = Distribution({'name': 'UpdateManager'})
|
||||
cmd = build_ext(dist)
|
||||
cmd.ensure_finalized()
|
||||
+ debug_ext = sysconfig.get_config_var("DEBUG_EXT")
|
||||
ext = sysconfig.get_config_var("SO")
|
||||
ext_name = os.path.join('UpdateManager', 'fdsend')
|
||||
ext_path = cmd.get_ext_fullpath(ext_name)
|
||||
- wanted = os.path.join(cmd.build_lib, 'UpdateManager', 'fdsend' + ext)
|
||||
+ wanted = os.path.join(cmd.build_lib, 'UpdateManager', 'fdsend' + debug_ext + ext)
|
||||
self.assertEqual(ext_path, wanted)
|
||||
|
||||
@unittest.skipUnless(sys.platform == 'win32', 'these tests require Windows')
|
||||
11
00139-skip-test_float-known-failure-on-arm.patch
Normal file
11
00139-skip-test_float-known-failure-on-arm.patch
Normal file
@ -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;
|
||||
11
00140-skip-test_ctypes-known-failure-on-sparc.patch
Normal file
11
00140-skip-test_ctypes-known-failure-on-sparc.patch
Normal file
@ -0,0 +1,11 @@
|
||||
diff -up Python-2.7.2/Lib/ctypes/test/test_callbacks.py.skip-test_ctypes-known-failure-on-sparc Python-2.7.2/Lib/ctypes/test/test_callbacks.py
|
||||
--- Python-2.7.2/Lib/ctypes/test/test_callbacks.py.skip-test_ctypes-known-failure-on-sparc 2011-09-08 19:42:35.541951490 -0400
|
||||
+++ Python-2.7.2/Lib/ctypes/test/test_callbacks.py 2011-09-08 19:43:40.676947036 -0400
|
||||
@@ -67,6 +67,7 @@ class Callbacks(unittest.TestCase):
|
||||
self.check_type(c_longlong, 42)
|
||||
self.check_type(c_longlong, -42)
|
||||
|
||||
+ @unittest.skip('Known failure on Sparc: http://bugs.python.org/issue8314')
|
||||
def test_ulonglong(self):
|
||||
# test some 64-bit values, with and without msb set.
|
||||
self.check_type(c_ulonglong, 10955412242170339782)
|
||||
22
00142-skip-failing-pty-tests-in-rpmbuild.patch
Normal file
22
00142-skip-failing-pty-tests-in-rpmbuild.patch
Normal file
@ -0,0 +1,22 @@
|
||||
diff -up Python-2.7.6/Lib/test/test_openpty.py.tty-fail Python-2.7.6/Lib/test/test_openpty.py
|
||||
--- Python-2.7.6/Lib/test/test_openpty.py.tty-fail 2014-01-29 14:31:43.761343267 +0100
|
||||
+++ Python-2.7.6/Lib/test/test_openpty.py 2014-01-29 14:32:19.284090165 +0100
|
||||
@@ -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()
|
||||
self.addCleanup(os.close, master)
|
||||
diff -up Python-2.7.6/Lib/test/test_pty.py.tty-fail Python-2.7.6/Lib/test/test_pty.py
|
||||
--- Python-2.7.6/Lib/test/test_pty.py.tty-fail 2013-11-10 08:36:40.000000000 +0100
|
||||
+++ Python-2.7.6/Lib/test/test_pty.py 2014-01-29 14:31:43.761343267 +0100
|
||||
@@ -111,6 +111,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()
|
||||
58
00143-tsc-on-ppc.patch
Normal file
58
00143-tsc-on-ppc.patch
Normal file
@ -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__)
|
||||
|
||||
711
00147-add-debug-malloc-stats.patch
Normal file
711
00147-add-debug-malloc-stats.patch
Normal file
@ -0,0 +1,711 @@
|
||||
diff -up Python-2.7.2/Include/dictobject.h.add-debug-malloc-stats Python-2.7.2/Include/dictobject.h
|
||||
--- Python-2.7.2/Include/dictobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/dictobject.h 2011-09-16 19:03:25.105821625 -0400
|
||||
@@ -150,6 +150,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-2.7.2/Include/floatobject.h.add-debug-malloc-stats Python-2.7.2/Include/floatobject.h
|
||||
--- Python-2.7.2/Include/floatobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/floatobject.h 2011-09-16 19:03:25.106821625 -0400
|
||||
@@ -132,6 +132,7 @@ PyAPI_FUNC(PyObject *) _PyFloat_FormatAd
|
||||
failure. Used in builtin_round in bltinmodule.c. */
|
||||
PyAPI_FUNC(PyObject *) _Py_double_round(double x, int ndigits);
|
||||
|
||||
+PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
diff -up Python-2.7.2/Include/frameobject.h.add-debug-malloc-stats Python-2.7.2/Include/frameobject.h
|
||||
--- Python-2.7.2/Include/frameobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/frameobject.h 2011-09-16 19:03:25.107821625 -0400
|
||||
@@ -80,6 +80,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-2.7.2/Include/intobject.h.add-debug-malloc-stats Python-2.7.2/Include/intobject.h
|
||||
--- Python-2.7.2/Include/intobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/intobject.h 2011-09-16 19:03:25.107821625 -0400
|
||||
@@ -74,6 +74,8 @@ PyAPI_FUNC(PyObject *) _PyInt_FormatAdva
|
||||
char *format_spec,
|
||||
Py_ssize_t format_spec_len);
|
||||
|
||||
+PyAPI_FUNC(void) _PyInt_DebugMallocStats(FILE *out);
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
diff -up Python-2.7.2/Include/listobject.h.add-debug-malloc-stats Python-2.7.2/Include/listobject.h
|
||||
--- Python-2.7.2/Include/listobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/listobject.h 2011-09-16 19:03:25.107821625 -0400
|
||||
@@ -62,6 +62,8 @@ PyAPI_FUNC(PyObject *) _PyList_Extend(Py
|
||||
#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v))
|
||||
#define PyList_GET_SIZE(op) Py_SIZE(op)
|
||||
|
||||
+PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out);
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
diff -up Python-2.7.2/Include/methodobject.h.add-debug-malloc-stats Python-2.7.2/Include/methodobject.h
|
||||
--- Python-2.7.2/Include/methodobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/methodobject.h 2011-09-16 19:03:25.108821625 -0400
|
||||
@@ -87,6 +87,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-2.7.2/Include/object.h.add-debug-malloc-stats Python-2.7.2/Include/object.h
|
||||
--- Python-2.7.2/Include/object.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/object.h 2011-09-16 19:03:25.108821625 -0400
|
||||
@@ -980,6 +980,13 @@ PyAPI_DATA(PyObject *) _PyTrash_delete_l
|
||||
_PyTrash_thread_deposit_object((PyObject*)op); \
|
||||
} while (0);
|
||||
|
||||
+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-2.7.2/Include/objimpl.h.add-debug-malloc-stats Python-2.7.2/Include/objimpl.h
|
||||
--- Python-2.7.2/Include/objimpl.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/objimpl.h 2011-09-16 19:03:25.108821625 -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-2.7.2/Include/stringobject.h.add-debug-malloc-stats Python-2.7.2/Include/stringobject.h
|
||||
--- Python-2.7.2/Include/stringobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/stringobject.h 2011-09-16 19:03:25.109821625 -0400
|
||||
@@ -204,6 +204,8 @@ PyAPI_FUNC(PyObject *) _PyBytes_FormatAd
|
||||
char *format_spec,
|
||||
Py_ssize_t format_spec_len);
|
||||
|
||||
+PyAPI_FUNC(void) _PyString_DebugMallocStats(FILE *out);
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
diff -up Python-2.7.2/Include/unicodeobject.h.add-debug-malloc-stats Python-2.7.2/Include/unicodeobject.h
|
||||
--- Python-2.7.2/Include/unicodeobject.h.add-debug-malloc-stats 2011-06-11 11:46:23.000000000 -0400
|
||||
+++ Python-2.7.2/Include/unicodeobject.h 2011-09-16 19:03:25.109821625 -0400
|
||||
@@ -1406,6 +1406,8 @@ PyAPI_FUNC(int) _PyUnicode_IsAlpha(
|
||||
Py_UNICODE ch /* Unicode character */
|
||||
);
|
||||
|
||||
+PyAPI_FUNC(void) _PyUnicode_DebugMallocStats(FILE *out);
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
diff -up Python-2.7.2/Lib/test/test_sys.py.add-debug-malloc-stats Python-2.7.2/Lib/test/test_sys.py
|
||||
--- Python-2.7.2/Lib/test/test_sys.py.add-debug-malloc-stats 2011-09-16 19:03:25.048821626 -0400
|
||||
+++ Python-2.7.2/Lib/test/test_sys.py 2011-09-16 19:03:25.110821625 -0400
|
||||
@@ -473,6 +473,32 @@ class SysModuleTest(unittest.TestCase):
|
||||
p.wait()
|
||||
self.assertIn(executable, ["''", repr(sys.executable)])
|
||||
|
||||
+ def test_debugmallocstats(self):
|
||||
+ # Test sys._debugmallocstats()
|
||||
+
|
||||
+ import subprocess
|
||||
+
|
||||
+ # Verify the default of writing to stderr:
|
||||
+ p = subprocess.Popen([sys.executable,
|
||||
+ '-c', 'import sys; sys._debugmallocstats()'],
|
||||
+ stderr=subprocess.PIPE)
|
||||
+ out, err = p.communicate()
|
||||
+ p.wait()
|
||||
+ self.assertIn("arenas allocated current", err)
|
||||
+
|
||||
+ # Verify that we can redirect the output to a file (not a file-like
|
||||
+ # object, though):
|
||||
+ with open('mallocstats.txt', 'w') as out:
|
||||
+ sys._debugmallocstats(out)
|
||||
+ result = open('mallocstats.txt').read()
|
||||
+ self.assertIn("arenas allocated current", result)
|
||||
+ os.unlink('mallocstats.txt')
|
||||
+
|
||||
+ # Verify that the destination must be a file:
|
||||
+ with self.assertRaises(TypeError):
|
||||
+ sys._debugmallocstats(42)
|
||||
+
|
||||
+
|
||||
@test.test_support.cpython_only
|
||||
class SizeofTest(unittest.TestCase):
|
||||
|
||||
diff -up Python-2.7.2/Objects/classobject.c.add-debug-malloc-stats Python-2.7.2/Objects/classobject.c
|
||||
--- Python-2.7.2/Objects/classobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/classobject.c 2011-09-16 19:03:25.110821625 -0400
|
||||
@@ -2670,3 +2670,12 @@ 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));
|
||||
+}
|
||||
diff -up Python-2.7.2/Objects/dictobject.c.add-debug-malloc-stats Python-2.7.2/Objects/dictobject.c
|
||||
--- Python-2.7.2/Objects/dictobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/dictobject.c 2011-09-16 19:03:25.111821625 -0400
|
||||
@@ -225,6 +225,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-2.7.2/Objects/floatobject.c.add-debug-malloc-stats Python-2.7.2/Objects/floatobject.c
|
||||
--- Python-2.7.2/Objects/floatobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/floatobject.c 2011-09-16 19:03:25.111821625 -0400
|
||||
@@ -35,6 +35,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-2.7.2/Objects/frameobject.c.add-debug-malloc-stats Python-2.7.2/Objects/frameobject.c
|
||||
--- Python-2.7.2/Objects/frameobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/frameobject.c 2011-09-16 19:03:25.112821625 -0400
|
||||
@@ -980,3 +980,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-2.7.2/Objects/intobject.c.add-debug-malloc-stats Python-2.7.2/Objects/intobject.c
|
||||
--- Python-2.7.2/Objects/intobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/intobject.c 2011-09-16 19:03:25.112821625 -0400
|
||||
@@ -44,6 +44,23 @@ typedef struct _intblock PyIntBlock;
|
||||
static PyIntBlock *block_list = NULL;
|
||||
static PyIntObject *free_list = NULL;
|
||||
|
||||
+
|
||||
+/* Print summary info about the state of the optimized allocator */
|
||||
+void
|
||||
+_PyInt_DebugMallocStats(FILE *out)
|
||||
+{
|
||||
+ int num_blocks = 0;
|
||||
+ PyIntBlock *block;
|
||||
+
|
||||
+ /* Walk the block list, counting */
|
||||
+ for (block = block_list; block ; block = block->next) {
|
||||
+ num_blocks++;
|
||||
+ }
|
||||
+
|
||||
+ _PyDebugAllocatorStats(out,
|
||||
+ "PyIntBlock", num_blocks, sizeof(PyIntBlock));
|
||||
+}
|
||||
+
|
||||
static PyIntObject *
|
||||
fill_free_list(void)
|
||||
{
|
||||
diff -up Python-2.7.2/Objects/listobject.c.add-debug-malloc-stats Python-2.7.2/Objects/listobject.c
|
||||
--- Python-2.7.2/Objects/listobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/listobject.c 2011-09-16 19:03:25.113821625 -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-2.7.2/Objects/methodobject.c.add-debug-malloc-stats Python-2.7.2/Objects/methodobject.c
|
||||
--- Python-2.7.2/Objects/methodobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/methodobject.c 2011-09-16 19:03:25.113821625 -0400
|
||||
@@ -412,6 +412,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-2.7.2/Objects/object.c.add-debug-malloc-stats Python-2.7.2/Objects/object.c
|
||||
--- Python-2.7.2/Objects/object.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/object.c 2011-09-16 19:04:46.463820849 -0400
|
||||
@@ -2334,6 +2334,23 @@ PyMem_Free(void *p)
|
||||
PyMem_FREE(p);
|
||||
}
|
||||
|
||||
+void
|
||||
+_PyObject_DebugTypeStats(FILE *out)
|
||||
+{
|
||||
+ _PyString_DebugMallocStats(out);
|
||||
+ _PyCFunction_DebugMallocStats(out);
|
||||
+ _PyDict_DebugMallocStats(out);
|
||||
+ _PyFloat_DebugMallocStats(out);
|
||||
+ _PyFrame_DebugMallocStats(out);
|
||||
+ _PyInt_DebugMallocStats(out);
|
||||
+ _PyList_DebugMallocStats(out);
|
||||
+ _PyMethod_DebugMallocStats(out);
|
||||
+ _PySet_DebugMallocStats(out);
|
||||
+ _PyTuple_DebugMallocStats(out);
|
||||
+#if Py_USING_UNICODE
|
||||
+ _PyUnicode_DebugMallocStats(out);
|
||||
+#endif
|
||||
+}
|
||||
|
||||
/* These methods are used to control infinite recursion in repr, str, print,
|
||||
etc. Container objects that may recursively contain themselves,
|
||||
diff -up Python-2.7.2/Objects/obmalloc.c.add-debug-malloc-stats Python-2.7.2/Objects/obmalloc.c
|
||||
--- Python-2.7.2/Objects/obmalloc.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/obmalloc.c 2011-09-16 19:03:25.114821625 -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)
|
||||
arenaobj->address = (uptr)address;
|
||||
|
||||
++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)
|
||||
@@ -1818,10 +1831,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];
|
||||
@@ -1832,7 +1845,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",
|
||||
@@ -1842,36 +1855,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-2.7.2/Objects/setobject.c.add-debug-malloc-stats Python-2.7.2/Objects/setobject.c
|
||||
--- Python-2.7.2/Objects/setobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/setobject.c 2011-09-16 19:03:25.115821625 -0400
|
||||
@@ -1088,6 +1088,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-2.7.2/Objects/stringobject.c.add-debug-malloc-stats Python-2.7.2/Objects/stringobject.c
|
||||
--- Python-2.7.2/Objects/stringobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/stringobject.c 2011-09-16 19:03:25.116821625 -0400
|
||||
@@ -4822,3 +4822,43 @@ void _Py_ReleaseInternedStrings(void)
|
||||
PyDict_Clear(interned);
|
||||
Py_CLEAR(interned);
|
||||
}
|
||||
+
|
||||
+void _PyString_DebugMallocStats(FILE *out)
|
||||
+{
|
||||
+ ssize_t i;
|
||||
+ int num_immortal = 0, num_mortal = 0;
|
||||
+ ssize_t immortal_size = 0, mortal_size = 0;
|
||||
+
|
||||
+ if (interned == NULL || !PyDict_Check(interned))
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i <= ((PyDictObject*)interned)->ma_mask; i++) {
|
||||
+ PyDictEntry *ep = ((PyDictObject*)interned)->ma_table + i;
|
||||
+ PyObject *pvalue = ep->me_value;
|
||||
+ if (pvalue != NULL) {
|
||||
+ PyStringObject *s = (PyStringObject *)ep->me_key;
|
||||
+
|
||||
+ switch (s->ob_sstate) {
|
||||
+ case SSTATE_NOT_INTERNED:
|
||||
+ /* XXX Shouldn't happen */
|
||||
+ break;
|
||||
+ case SSTATE_INTERNED_IMMORTAL:
|
||||
+ num_immortal ++;
|
||||
+ immortal_size += s->ob_size;
|
||||
+ break;
|
||||
+ case SSTATE_INTERNED_MORTAL:
|
||||
+ num_mortal ++;
|
||||
+ mortal_size += s->ob_size;
|
||||
+ break;
|
||||
+ default:
|
||||
+ Py_FatalError("Inconsistent interned string state.");
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fprintf(out, "%d mortal interned strings\n", num_mortal);
|
||||
+ fprintf(out, "%d immortal interned strings\n", num_immortal);
|
||||
+ fprintf(out, "total size of all interned strings: "
|
||||
+ "%zi/%zi "
|
||||
+ "mortal/immortal\n", mortal_size, immortal_size);
|
||||
+}
|
||||
diff -up Python-2.7.2/Objects/tupleobject.c.add-debug-malloc-stats Python-2.7.2/Objects/tupleobject.c
|
||||
--- Python-2.7.2/Objects/tupleobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/tupleobject.c 2011-09-16 19:03:25.116821625 -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-2.7.2/Objects/unicodeobject.c.add-debug-malloc-stats Python-2.7.2/Objects/unicodeobject.c
|
||||
--- Python-2.7.2/Objects/unicodeobject.c.add-debug-malloc-stats 2011-06-11 11:46:27.000000000 -0400
|
||||
+++ Python-2.7.2/Objects/unicodeobject.c 2011-09-16 19:03:25.118821625 -0400
|
||||
@@ -8883,6 +8883,12 @@ _PyUnicode_Fini(void)
|
||||
(void)PyUnicode_ClearFreeList();
|
||||
}
|
||||
|
||||
+void _PyUnicode_DebugMallocStats(FILE *out)
|
||||
+{
|
||||
+ _PyDebugAllocatorStats(out, "free PyUnicodeObject", numfree,
|
||||
+ sizeof(PyUnicodeObject));
|
||||
+}
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
diff -up Python-2.7.2/Python/pythonrun.c.add-debug-malloc-stats Python-2.7.2/Python/pythonrun.c
|
||||
--- Python-2.7.2/Python/pythonrun.c.add-debug-malloc-stats 2011-09-16 19:03:25.025821626 -0400
|
||||
+++ Python-2.7.2/Python/pythonrun.c 2011-09-16 19:03:25.118821625 -0400
|
||||
@@ -549,7 +549,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-2.7.2/Python/sysmodule.c.add-debug-malloc-stats Python-2.7.2/Python/sysmodule.c
|
||||
--- Python-2.7.2/Python/sysmodule.c.add-debug-malloc-stats 2011-09-16 19:03:25.007821626 -0400
|
||||
+++ Python-2.7.2/Python/sysmodule.c 2011-09-16 19:03:25.119821625 -0400
|
||||
@@ -872,6 +872,57 @@ a 11-tuple where the entries in the tupl
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
+static PyObject *
|
||||
+sys_debugmallocstats(PyObject *self, PyObject *args)
|
||||
+{
|
||||
+ PyObject *file = NULL;
|
||||
+ FILE *fp;
|
||||
+
|
||||
+ if (!PyArg_ParseTuple(args, "|O!",
|
||||
+ &PyFile_Type, &file)) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ if (!file) {
|
||||
+ /* Default to sys.stderr: */
|
||||
+ file = PySys_GetObject("stderr");
|
||||
+ if (!file) {
|
||||
+ PyErr_SetString(PyExc_ValueError, "sys.stderr not set");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ if (!PyFile_Check(file)) {
|
||||
+ PyErr_SetString(PyExc_TypeError, "sys.stderr is not a file");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ Py_INCREF(file);
|
||||
+ /* OK, we now own a ref on non-NULL "file" */
|
||||
+
|
||||
+ fp = PyFile_AsFile(file);
|
||||
+ if (!fp) {
|
||||
+ PyErr_SetString(PyExc_ValueError, "file is closed");
|
||||
+ Py_DECREF(file);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ _PyObject_DebugMallocStats(fp);
|
||||
+ fputc('\n', fp);
|
||||
+ _PyObject_DebugTypeStats(fp);
|
||||
+
|
||||
+ Py_DECREF(file);
|
||||
+
|
||||
+ Py_RETURN_NONE;
|
||||
+}
|
||||
+PyDoc_STRVAR(debugmallocstats_doc,
|
||||
+"_debugmallocstats([file])\n\
|
||||
+\n\
|
||||
+Print summary info to the given file (or sys.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 *);
|
||||
@@ -970,6 +1021,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 */
|
||||
};
|
||||
|
||||
13
00153-fix-test_gdb-noise.patch
Normal file
13
00153-fix-test_gdb-noise.patch
Normal file
@ -0,0 +1,13 @@
|
||||
--- a/Lib/test/test_gdb.py.old 2012-04-11 21:04:01.367073855 -0400
|
||||
+++ b/Lib/test/test_gdb.py 2012-04-12 08:52:58.320288761 -0400
|
||||
@@ -211,6 +211,10 @@
|
||||
# ignore all warnings
|
||||
'warning: ',
|
||||
)
|
||||
+ ignore_patterns += ('warning: Unable to open',
|
||||
+ 'Missing separate debuginfo for',
|
||||
+ 'Try: yum --disablerepo=',
|
||||
+ 'Undefined set print command')
|
||||
for line in errlines:
|
||||
if not line:
|
||||
continue
|
||||
15
00155-avoid-ctypes-thunks.patch
Normal file
15
00155-avoid-ctypes-thunks.patch
Normal file
@ -0,0 +1,15 @@
|
||||
diff -up Python-2.7.3/Lib/ctypes/__init__.py.rhbz814391 Python-2.7.3/Lib/ctypes/__init__.py
|
||||
--- Python-2.7.3/Lib/ctypes/__init__.py.rhbz814391 2012-04-20 14:51:19.390990244 -0400
|
||||
+++ Python-2.7.3/Lib/ctypes/__init__.py 2012-04-20 14:51:45.141668316 -0400
|
||||
@@ -272,11 +272,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)
|
||||
|
||||
try:
|
||||
from _ctypes import set_conversion_mode
|
||||
57
00156-gdb-autoload-safepath.patch
Normal file
57
00156-gdb-autoload-safepath.patch
Normal file
@ -0,0 +1,57 @@
|
||||
diff -up Python-2.7.3/Lib/test/test_gdb.py.gdb-autoload-safepath Python-2.7.3/Lib/test/test_gdb.py
|
||||
--- Python-2.7.3/Lib/test/test_gdb.py.gdb-autoload-safepath 2012-04-30 15:53:57.254045220 -0400
|
||||
+++ Python-2.7.3/Lib/test/test_gdb.py 2012-04-30 16:19:19.569941124 -0400
|
||||
@@ -54,6 +54,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 '"on" or "off" expected.' not in stderr
|
||||
+
|
||||
+HAS_AUTOLOAD_SAFEPATH = gdb_has_autoload_safepath()
|
||||
+
|
||||
class DebuggerTests(unittest.TestCase):
|
||||
|
||||
"""Test that the debugger can debug Python."""
|
||||
diff -up Python-2.7.10/Lib/test/test_gdb.py.ms Python-2.7.10/Lib/test/test_gdb.py
|
||||
--- Python-2.7.10/Lib/test/test_gdb.py.ms 2015-05-25 17:00:25.028462615 +0200
|
||||
+++ Python-2.7.10/Lib/test/test_gdb.py 2015-05-25 17:01:53.166359822 +0200
|
||||
@@ -153,6 +153,17 @@ class DebuggerTests(unittest.TestCase):
|
||||
|
||||
'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 = []
|
||||
+
|
||||
+
|
||||
# GDB as of 7.4 onwards can distinguish between the
|
||||
# value of a variable at entry vs current value:
|
||||
# http://sourceware.org/gdb/onlinedocs/gdb/Variables.html
|
||||
@@ -167,10 +178,11 @@ class DebuggerTests(unittest.TestCase):
|
||||
else:
|
||||
commands += ['backtrace']
|
||||
|
||||
- # print commands
|
||||
+ # print init_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]
|
||||
49
00157-uid-gid-overflows.patch
Normal file
49
00157-uid-gid-overflows.patch
Normal file
@ -0,0 +1,49 @@
|
||||
diff -up Python-2.7.3/Lib/test/test_os.py.uid-gid-overflows Python-2.7.3/Lib/test/test_os.py
|
||||
--- Python-2.7.3/Lib/test/test_os.py.uid-gid-overflows 2012-04-09 19:07:32.000000000 -0400
|
||||
+++ Python-2.7.3/Lib/test/test_os.py 2012-06-26 14:51:36.000817929 -0400
|
||||
@@ -677,30 +677,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)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, 'setgid'), 'test needs 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)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, 'seteuid'), 'test needs 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)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, 'setegid'), 'test needs 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)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs 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)
|
||||
|
||||
@@ -715,6 +721,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)
|
||||
|
||||
@ -0,0 +1,47 @@
|
||||
diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
|
||||
index 3354b34..10ba0e5 100644
|
||||
--- a/Lib/test/test_gdb.py
|
||||
+++ b/Lib/test/test_gdb.py
|
||||
@@ -725,11 +725,10 @@ class PyListTests(DebuggerTests):
|
||||
' 2 \n'
|
||||
' 3 def foo(a, b, c):\n',
|
||||
bt)
|
||||
-
|
||||
+@unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
+@unittest.skipIf(python_is_optimized(),
|
||||
+ "Python was compiled with optimizations")
|
||||
class StackNavigationTests(DebuggerTests):
|
||||
- @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
- @unittest.skipIf(python_is_optimized(),
|
||||
- "Python was compiled with optimizations")
|
||||
def test_pyup_command(self):
|
||||
'Verify that the "py-up" command works'
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
@@ -740,7 +739,6 @@ class StackNavigationTests(DebuggerTests):
|
||||
baz\(a, b, c\)
|
||||
$''')
|
||||
|
||||
- @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
def test_down_at_bottom(self):
|
||||
'Verify handling of "py-down" at the bottom of the stack'
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
@@ -748,9 +746,6 @@ $''')
|
||||
self.assertEndsWith(bt,
|
||||
'Unable to find a newer python frame\n')
|
||||
|
||||
- @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
- @unittest.skipIf(python_is_optimized(),
|
||||
- "Python was compiled with optimizations")
|
||||
def test_up_at_top(self):
|
||||
'Verify handling of "py-up" at the top of the stack'
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
@@ -758,9 +753,6 @@ $''')
|
||||
self.assertEndsWith(bt,
|
||||
'Unable to find an older python frame\n')
|
||||
|
||||
- @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
- @unittest.skipIf(python_is_optimized(),
|
||||
- "Python was compiled with optimizations")
|
||||
def test_up_then_down(self):
|
||||
'Verify "py-up" followed by "py-down"'
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
12
00168-distutils-cflags.patch
Normal file
12
00168-distutils-cflags.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -up Python-2.6.6/Lib/distutils/sysconfig.py.distutils-cflags Python-2.6.6/Lib/distutils/sysconfig.py
|
||||
--- Python-2.6.6/Lib/distutils/sysconfig.py.distutils-cflags 2011-08-12 17:18:17.833091153 -0400
|
||||
+++ Python-2.6.6/Lib/distutils/sysconfig.py 2011-08-12 17:18:27.449106938 -0400
|
||||
@@ -187,7 +187,7 @@ def customize_compiler(compiler):
|
||||
if 'LDFLAGS' in os.environ:
|
||||
ldshared = ldshared + ' ' + os.environ['LDFLAGS']
|
||||
if 'CFLAGS' in os.environ:
|
||||
- cflags = opt + ' ' + os.environ['CFLAGS']
|
||||
+ cflags = cflags + ' ' + os.environ['CFLAGS']
|
||||
ldshared = ldshared + ' ' + os.environ['CFLAGS']
|
||||
if 'CPPFLAGS' in os.environ:
|
||||
cpp = cpp + ' ' + os.environ['CPPFLAGS']
|
||||
41
00169-avoid-implicit-usage-of-md5-in-multiprocessing.patch
Normal file
41
00169-avoid-implicit-usage-of-md5-in-multiprocessing.patch
Normal file
@ -0,0 +1,41 @@
|
||||
diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py
|
||||
--- a/Lib/multiprocessing/connection.py
|
||||
+++ b/Lib/multiprocessing/connection.py
|
||||
@@ -41,6 +41,10 @@
|
||||
# A very generous timeout when it comes to local connections...
|
||||
CONNECTION_TIMEOUT = 20.
|
||||
|
||||
+# The hmac module implicitly defaults to using MD5.
|
||||
+# Support using a stronger algorithm for the challenge/response code:
|
||||
+HMAC_DIGEST_NAME='sha256'
|
||||
+
|
||||
_mmap_counter = itertools.count()
|
||||
|
||||
default_family = 'AF_INET'
|
||||
@@ -700,12 +704,16 @@
|
||||
WELCOME = b'#WELCOME#'
|
||||
FAILURE = b'#FAILURE#'
|
||||
|
||||
+def get_digestmod_for_hmac():
|
||||
+ import hashlib
|
||||
+ return getattr(hashlib, HMAC_DIGEST_NAME)
|
||||
+
|
||||
def deliver_challenge(connection, authkey):
|
||||
import hmac
|
||||
assert isinstance(authkey, bytes)
|
||||
message = os.urandom(MESSAGE_LENGTH)
|
||||
connection.send_bytes(CHALLENGE + message)
|
||||
- digest = hmac.new(authkey, message).digest()
|
||||
+ digest = hmac.new(authkey, message, get_digestmod_for_hmac()).digest()
|
||||
response = connection.recv_bytes(256) # reject large message
|
||||
if response == digest:
|
||||
connection.send_bytes(WELCOME)
|
||||
@@ -719,7 +727,7 @@
|
||||
message = connection.recv_bytes(256) # reject large message
|
||||
assert message[:len(CHALLENGE)] == CHALLENGE, 'message = %r' % message
|
||||
message = message[len(CHALLENGE):]
|
||||
- digest = hmac.new(authkey, message).digest()
|
||||
+ digest = hmac.new(authkey, message, get_digestmod_for_hmac()).digest()
|
||||
connection.send_bytes(digest)
|
||||
response = connection.recv_bytes(256) # reject large message
|
||||
if response != WELCOME:
|
||||
279
00170-gc-assertions.patch
Normal file
279
00170-gc-assertions.patch
Normal file
@ -0,0 +1,279 @@
|
||||
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
|
||||
index 7e47b2d..12a210d 100644
|
||||
--- a/Lib/test/test_gc.py
|
||||
+++ b/Lib/test/test_gc.py
|
||||
@@ -1,7 +1,8 @@
|
||||
import unittest
|
||||
from test.support import (verbose, run_unittest, start_threads,
|
||||
- requires_type_collecting)
|
||||
+ requires_type_collecting, import_module)
|
||||
import sys
|
||||
+import sysconfig
|
||||
import time
|
||||
import gc
|
||||
import weakref
|
||||
@@ -39,6 +40,8 @@ class GC_Detector(object):
|
||||
self.wr = weakref.ref(C1055820(666), it_happened)
|
||||
|
||||
|
||||
+BUILT_WITH_NDEBUG = ('-DNDEBUG' in sysconfig.get_config_vars()['PY_CFLAGS'])
|
||||
+
|
||||
### Tests
|
||||
###############################################################################
|
||||
|
||||
@@ -537,6 +540,49 @@ class GCTests(unittest.TestCase):
|
||||
# would be damaged, with an empty __dict__.
|
||||
self.assertEqual(x, None)
|
||||
|
||||
+ @unittest.skipIf(BUILT_WITH_NDEBUG,
|
||||
+ 'built with -NDEBUG')
|
||||
+ def test_refcount_errors(self):
|
||||
+ # 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.assertRegexpMatches(stderr,
|
||||
+ b'Modules/gcmodule.c:[0-9]+: visit_decref: Assertion "gc->gc.gc_refs != 0" failed.')
|
||||
+ self.assertRegexpMatches(stderr,
|
||||
+ b'refcount was too small')
|
||||
+ self.assertRegexpMatches(stderr,
|
||||
+ b'object : \[\]')
|
||||
+ self.assertRegexpMatches(stderr,
|
||||
+ b'type : list')
|
||||
+ self.assertRegexpMatches(stderr,
|
||||
+ b'refcount: 1')
|
||||
+ self.assertRegexpMatches(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 916e481..0233ce2 100644
|
||||
--- a/Modules/gcmodule.c
|
||||
+++ b/Modules/gcmodule.c
|
||||
@@ -21,6 +21,73 @@
|
||||
#include "Python.h"
|
||||
#include "frameobject.h" /* for PyFrame_ClearFreeList */
|
||||
|
||||
+/*
|
||||
+ 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)
|
||||
+
|
||||
+static void _PyObject_AssertFailed(PyObject *, const char *,
|
||||
+ const char *, const char *, int,
|
||||
+ const char *);
|
||||
+
|
||||
+static 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();
|
||||
+}
|
||||
+
|
||||
/* Get an object's GC head */
|
||||
#define AS_GC(o) ((PyGC_Head *)(o)-1)
|
||||
|
||||
@@ -328,7 +395,8 @@ update_refs(PyGC_Head *containers)
|
||||
{
|
||||
PyGC_Head *gc = containers->gc.gc_next;
|
||||
for (; gc != containers; gc = gc->gc.gc_next) {
|
||||
- assert(gc->gc.gc_refs == GC_REACHABLE);
|
||||
+ PyObject_ASSERT(FROM_GC(gc),
|
||||
+ gc->gc.gc_refs == GC_REACHABLE);
|
||||
gc->gc.gc_refs = 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
|
||||
@@ -348,7 +416,8 @@ update_refs(PyGC_Head *containers)
|
||||
* so serious that maybe this should be a release-build
|
||||
* check instead of an assert?
|
||||
*/
|
||||
- assert(gc->gc.gc_refs != 0);
|
||||
+ PyObject_ASSERT(FROM_GC(gc),
|
||||
+ gc->gc.gc_refs != 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,7 +432,9 @@ visit_decref(PyObject *op, void *data)
|
||||
* generation being collected, which can be recognized
|
||||
* because only they have positive gc_refs.
|
||||
*/
|
||||
- assert(gc->gc.gc_refs != 0); /* else refcount was too small */
|
||||
+ PyObject_ASSERT_WITH_MSG(FROM_GC(gc),
|
||||
+ gc->gc.gc_refs != 0,
|
||||
+ "refcount was too small");
|
||||
if (gc->gc.gc_refs > 0)
|
||||
gc->gc.gc_refs--;
|
||||
}
|
||||
@@ -423,9 +494,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;
|
||||
@@ -467,7 +539,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
|
||||
*/
|
||||
PyObject *op = FROM_GC(gc);
|
||||
traverseproc traverse = Py_TYPE(op)->tp_traverse;
|
||||
- assert(gc->gc.gc_refs > 0);
|
||||
+ PyObject_ASSERT(op, gc->gc.gc_refs > 0);
|
||||
gc->gc.gc_refs = GC_REACHABLE;
|
||||
(void) traverse(op,
|
||||
(visitproc)visit_reachable,
|
||||
@@ -545,7 +617,8 @@ move_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_finalizer(op)) {
|
||||
@@ -621,7 +694,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)))
|
||||
@@ -642,9 +715,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 */
|
||||
|
||||
@@ -678,7 +751,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.
|
||||
@@ -687,7 +760,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);
|
||||
@@ -703,11 +777,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);
|
||||
@@ -810,7 +884,7 @@ delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
|
||||
PyGC_Head *gc = collectable->gc.gc_next;
|
||||
PyObject *op = FROM_GC(gc);
|
||||
|
||||
- assert(IS_TENTATIVELY_UNREACHABLE(op));
|
||||
+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
|
||||
if (debug & DEBUG_SAVEALL) {
|
||||
PyList_Append(garbage, op);
|
||||
}
|
||||
28
00174-fix-for-usr-move.patch
Normal file
28
00174-fix-for-usr-move.patch
Normal file
@ -0,0 +1,28 @@
|
||||
diff -up Python-2.7.3/Modules/getpath.c.fix-for-usr-move Python-2.7.3/Modules/getpath.c
|
||||
--- Python-2.7.3/Modules/getpath.c.fix-for-usr-move 2013-03-06 14:25:32.801828698 -0500
|
||||
+++ Python-2.7.3/Modules/getpath.c 2013-03-06 15:59:30.872443168 -0500
|
||||
@@ -510,6 +510,24 @@ calculate_path(void)
|
||||
MAXPATHLEN bytes long.
|
||||
*/
|
||||
|
||||
+ /*
|
||||
+ Workaround for rhbz#817554, where an empty argv0_path erroneously
|
||||
+ locates "prefix" as "/lib[64]/python2.7" due to it finding
|
||||
+ "/lib[64]/python2.7/os.py" via the /lib -> /usr/lib symlink for
|
||||
+ https://fedoraproject.org/wiki/Features/UsrMove
|
||||
+ */
|
||||
+ if (argv0_path[0] == '\0' && 0 == strcmp(prog, "cmpi_swig")) {
|
||||
+ /*
|
||||
+ We have an empty argv0_path, presumably because prog aka
|
||||
+ Py_GetProgramName() was not found on $PATH.
|
||||
+
|
||||
+ Set argv0_path to "/usr/" so that search_for_prefix() and
|
||||
+ search_for_exec_prefix() don't erroneously pick up
|
||||
+ on /lib/ via the UsrMove symlink:
|
||||
+ */
|
||||
+ strcpy(argv0_path, "/usr/");
|
||||
+ }
|
||||
+
|
||||
if (!(pfound = search_for_prefix(argv0_path, home))) {
|
||||
if (!Py_FrozenFlag)
|
||||
fprintf(stderr,
|
||||
13
00180-python-add-support-for-ppc64p7.patch
Normal file
13
00180-python-add-support-for-ppc64p7.patch
Normal file
@ -0,0 +1,13 @@
|
||||
diff --git a/config.sub b/config.sub
|
||||
index 3478c1f..e422173 100755
|
||||
--- a/config.sub
|
||||
+++ b/config.sub
|
||||
@@ -1040,7 +1040,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
|
||||
70
00181-allow-arbitrary-timeout-in-condition-wait.patch
Normal file
70
00181-allow-arbitrary-timeout-in-condition-wait.patch
Normal file
@ -0,0 +1,70 @@
|
||||
diff --git a/Lib/threading.py b/Lib/threading.py
|
||||
index cb49c4a..c9795a5 100644
|
||||
--- a/Lib/threading.py
|
||||
+++ b/Lib/threading.py
|
||||
@@ -305,7 +305,7 @@ class _Condition(_Verbose):
|
||||
else:
|
||||
return True
|
||||
|
||||
- def wait(self, timeout=None):
|
||||
+ def wait(self, timeout=None, balancing=True):
|
||||
"""Wait until notified or until a timeout occurs.
|
||||
|
||||
If the calling thread has not acquired the lock when this method is
|
||||
@@ -354,7 +354,10 @@ class _Condition(_Verbose):
|
||||
remaining = endtime - _time()
|
||||
if remaining <= 0:
|
||||
break
|
||||
- delay = min(delay * 2, remaining, .05)
|
||||
+ if balancing:
|
||||
+ delay = min(delay * 2, remaining, 0.05)
|
||||
+ else:
|
||||
+ delay = remaining
|
||||
_sleep(delay)
|
||||
if not gotit:
|
||||
if __debug__:
|
||||
@@ -599,7 +602,7 @@ class _Event(_Verbose):
|
||||
with self.__cond:
|
||||
self.__flag = False
|
||||
|
||||
- def wait(self, timeout=None):
|
||||
+ def wait(self, timeout=None, balancing=True):
|
||||
"""Block until the internal flag is true.
|
||||
|
||||
If the internal flag is true on entry, return immediately. Otherwise,
|
||||
@@ -617,7 +620,7 @@ class _Event(_Verbose):
|
||||
"""
|
||||
with self.__cond:
|
||||
if not self.__flag:
|
||||
- self.__cond.wait(timeout)
|
||||
+ self.__cond.wait(timeout, balancing)
|
||||
return self.__flag
|
||||
|
||||
# Helper to generate new thread names
|
||||
@@ -908,7 +911,7 @@ class Thread(_Verbose):
|
||||
if 'dummy_threading' not in _sys.modules:
|
||||
raise
|
||||
|
||||
- def join(self, timeout=None):
|
||||
+ def join(self, timeout=None, balancing=True):
|
||||
"""Wait until the thread terminates.
|
||||
|
||||
This blocks the calling thread until the thread whose join() method is
|
||||
@@ -957,7 +960,7 @@ class Thread(_Verbose):
|
||||
if __debug__:
|
||||
self._note("%s.join(): timed out", self)
|
||||
break
|
||||
- self.__block.wait(delay)
|
||||
+ self.__block.wait(delay, balancing)
|
||||
else:
|
||||
if __debug__:
|
||||
self._note("%s.join(): thread stopped", self)
|
||||
@@ -1143,7 +1146,7 @@ class _DummyThread(Thread):
|
||||
def _set_daemon(self):
|
||||
return True
|
||||
|
||||
- def join(self, timeout=None):
|
||||
+ def join(self, timeout=None, balancing=True):
|
||||
assert False, "cannot join a dummy thread"
|
||||
|
||||
|
||||
12
00185-urllib2-honors-noproxy-for-ftp.patch
Normal file
12
00185-urllib2-honors-noproxy-for-ftp.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -up Python-2.7.5/Lib/urllib2.py.orig Python-2.7.5/Lib/urllib2.py
|
||||
--- Python-2.7.5/Lib/urllib2.py.orig 2013-07-17 12:22:58.595525622 +0200
|
||||
+++ Python-2.7.5/Lib/urllib2.py 2013-07-17 12:19:59.875898030 +0200
|
||||
@@ -728,6 +728,8 @@ class ProxyHandler(BaseHandler):
|
||||
if proxy_type is None:
|
||||
proxy_type = orig_type
|
||||
|
||||
+ req.get_host()
|
||||
+
|
||||
if req.host and proxy_bypass(req.host):
|
||||
return None
|
||||
|
||||
12
00191-disable-NOOP.patch
Normal file
12
00191-disable-NOOP.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py
|
||||
index 1bb6690..28ed25d 100644
|
||||
--- a/Lib/test/test_smtplib.py
|
||||
+++ b/Lib/test/test_smtplib.py
|
||||
@@ -182,6 +182,7 @@ class DebuggingServerTests(unittest.TestCase):
|
||||
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15)
|
||||
smtp.quit()
|
||||
|
||||
+ @unittest._skipInRpmBuild("Does not work in network-free environment")
|
||||
def testNOOP(self):
|
||||
smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15)
|
||||
expected = (250, 'Ok')
|
||||
69
00289-disable-nis-detection.patch
Normal file
69
00289-disable-nis-detection.patch
Normal file
@ -0,0 +1,69 @@
|
||||
diff --git a/setup.py b/setup.py
|
||||
index 585e380..9993f11 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -1346,11 +1346,7 @@ class PyBuildExt(build_ext):
|
||||
else:
|
||||
missing.append('resource')
|
||||
|
||||
- nis = self._detect_nis(inc_dirs, lib_dirs)
|
||||
- if nis is not None:
|
||||
- exts.append(nis)
|
||||
- else:
|
||||
- missing.append('nis')
|
||||
+ # nis (Sun yellow pages) is handled in Setup.dist
|
||||
|
||||
# Curses support, requiring the System V version of curses, often
|
||||
# provided by the ncurses library.
|
||||
@@ -2162,51 +2158,6 @@ class PyBuildExt(build_ext):
|
||||
# for dlopen, see bpo-32647
|
||||
ext.libraries.append('dl')
|
||||
|
||||
- def _detect_nis(self, inc_dirs, lib_dirs):
|
||||
- if host_platform in {'win32', 'cygwin', 'qnx6'}:
|
||||
- return None
|
||||
-
|
||||
- libs = []
|
||||
- library_dirs = []
|
||||
- includes_dirs = []
|
||||
-
|
||||
- # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
|
||||
- # moved headers and libraries to libtirpc and libnsl. The headers
|
||||
- # are in tircp and nsl sub directories.
|
||||
- rpcsvc_inc = find_file(
|
||||
- 'rpcsvc/yp_prot.h', inc_dirs,
|
||||
- [os.path.join(inc_dir, 'nsl') for inc_dir in inc_dirs]
|
||||
- )
|
||||
- rpc_inc = find_file(
|
||||
- 'rpc/rpc.h', inc_dirs,
|
||||
- [os.path.join(inc_dir, 'tirpc') for inc_dir in inc_dirs]
|
||||
- )
|
||||
- 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
|
||||
21
04000-modularity-disable-tk.patch
Normal file
21
04000-modularity-disable-tk.patch
Normal file
@ -0,0 +1,21 @@
|
||||
diff -urN Python-2.7.13/Modules/Setup.dist Python-2.7.13_modul/Modules/Setup.dist
|
||||
--- Python-2.7.13/Modules/Setup.dist 2017-04-21 14:57:13.767444374 +0200
|
||||
+++ Python-2.7.13_modul/Modules/Setup.dist 2017-04-21 14:56:49.658953833 +0200
|
||||
@@ -326,7 +326,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:
|
||||
@@ -345,7 +345,7 @@
|
||||
# *** Uncomment and edit for TOGL extension only:
|
||||
# -DWITH_TOGL togl.c \
|
||||
# *** Uncomment and edit to reflect your Tcl/Tk versions:
|
||||
- -ltk -ltcl \
|
||||
+# -ltk -ltcl \
|
||||
# *** Uncomment and edit to reflect where your X11 libraries are:
|
||||
# -L/usr/X11R6/lib \
|
||||
# *** Or uncomment this for Solaris:
|
||||
207
05000-autotool-intermediates.patch
Normal file
207
05000-autotool-intermediates.patch
Normal file
@ -0,0 +1,207 @@
|
||||
diff -up ./configure.autotool-intermediates ./configure
|
||||
--- ./configure.autotool-intermediates 2013-04-09 11:24:01.024185796 +0200
|
||||
+++ ./configure 2013-04-09 11:24:01.780183954 +0200
|
||||
@@ -639,6 +639,8 @@ TRUE
|
||||
MACHDEP_OBJS
|
||||
DYNLOADFILE
|
||||
DLINCLDIR
|
||||
+DTRACEHDRS
|
||||
+DTRACEOBJS
|
||||
THREADOBJ
|
||||
LDLAST
|
||||
USE_THREAD_MODULE
|
||||
@@ -659,6 +661,8 @@ OTHER_LIBTOOL_OPT
|
||||
UNIVERSAL_ARCH_FLAGS
|
||||
BASECFLAGS
|
||||
OPT
|
||||
+DEBUG_SUFFIX
|
||||
+DEBUG_EXT
|
||||
LN
|
||||
MKDIR_P
|
||||
INSTALL_DATA
|
||||
@@ -795,8 +799,11 @@ with_pth
|
||||
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
|
||||
@@ -1472,8 +1479,11 @@ Optional Packages:
|
||||
--with-pth use GNU pth threading libraries
|
||||
--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
|
||||
@@ -5343,8 +5353,8 @@ $as_echo "#define Py_ENABLE_SHARED 1" >>
|
||||
INSTSONAME="$LDLIBRARY".$SOVERSION
|
||||
;;
|
||||
Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*)
|
||||
- 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:+:${LD_LIBRARY_PATH}}
|
||||
case $ac_sys_system in
|
||||
FreeBSD*)
|
||||
@@ -5367,7 +5377,7 @@ $as_echo "#define Py_ENABLE_SHARED 1" >>
|
||||
;;
|
||||
OSF*)
|
||||
LDLIBRARY='libpython$(VERSION).so'
|
||||
- BLDLIBRARY='-rpath $(LIBDIR) -L. -lpython$(VERSION)'
|
||||
+ BLDLIBRARY='-L. -lpython$(VERSION)'
|
||||
RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
|
||||
;;
|
||||
atheos*)
|
||||
@@ -5894,6 +5904,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?
|
||||
|
||||
@@ -9958,6 +9976,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; }
|
||||
@@ -10007,6 +10069,46 @@ fi
|
||||
|
||||
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 2013-04-09 11:24:01.020185806 +0200
|
||||
+++ ./pyconfig.h.in 2013-04-09 11:24:02.088183204 +0200
|
||||
@@ -18,6 +18,12 @@
|
||||
/* Define this if you have BeOS threads. */
|
||||
#undef BEOS_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
|
||||
|
||||
@@ -1119,12 +1125,6 @@
|
||||
/* Define to profile with the Pentium timestamp counter */
|
||||
#undef WITH_TSC
|
||||
|
||||
-/* Define to keep records of the number of instances of each type */
|
||||
-#undef COUNT_ALLOCS
|
||||
-
|
||||
-/* Define to keep records on function call invocation */
|
||||
-#undef CALL_PROFILE
|
||||
-
|
||||
/* Define if you want pymalloc to be disabled when running under valgrind */
|
||||
#undef WITH_VALGRIND
|
||||
|
||||
17
libpython.stp
Normal file
17
libpython.stp
Normal file
@ -0,0 +1,17 @@
|
||||
/* Systemtap tapset to make it easier to trace Python */
|
||||
|
||||
/*
|
||||
Define python.function.entry/return:
|
||||
*/
|
||||
probe python.function.entry = process("python").library("LIBRARY_PATH").mark("function__entry")
|
||||
{
|
||||
filename = user_string($arg1);
|
||||
funcname = user_string($arg2);
|
||||
lineno = $arg3;
|
||||
}
|
||||
probe python.function.return = process("python").library("LIBRARY_PATH").mark("function__return")
|
||||
{
|
||||
filename = user_string($arg1);
|
||||
funcname = user_string($arg2);
|
||||
lineno = $arg3;
|
||||
}
|
||||
11
python-2.5-cflags.patch
Normal file
11
python-2.5-cflags.patch
Normal file
@ -0,0 +1,11 @@
|
||||
--- Python-2.5c1/Makefile.pre.in.cflags 2006-08-18 11:05:40.000000000 -0400
|
||||
+++ Python-2.5c1/Makefile.pre.in 2006-08-18 11:09:26.000000000 -0400
|
||||
@@ -334,7 +334,7 @@
|
||||
|
||||
# Build the interpreter
|
||||
$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
|
||||
- $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) -o $@ \
|
||||
+ $(LINKCC) $(CFLAGS) $(LDFLAGS) $(LINKFORSHARED) -o $@ \
|
||||
Modules/python.o \
|
||||
$(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
|
||||
|
||||
12
python-2.5.1-plural-fix.patch
Normal file
12
python-2.5.1-plural-fix.patch
Normal file
@ -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 = item.strip()
|
||||
if not item:
|
||||
continue
|
||||
+ if item.startswith("#"):
|
||||
+ continue
|
||||
k = v = None
|
||||
if ':' in item:
|
||||
k, v = item.split(':', 1)
|
||||
24
python-2.5.1-sqlite-encoding.patch
Normal file
24
python-2.5.1-sqlite-encoding.patch
Normal file
@ -0,0 +1,24 @@
|
||||
diff -up Python-2.5.1/Lib/sqlite3/dbapi2.py.encoding Python-2.5.1/Lib/sqlite3/dbapi2.py
|
||||
--- Python-2.5.1/Lib/sqlite3/dbapi2.py.encoding 2007-09-14 10:41:50.000000000 -0400
|
||||
+++ Python-2.5.1/Lib/sqlite3/dbapi2.py 2007-09-14 10:42:00.000000000 -0400
|
||||
@@ -1,7 +1,6 @@
|
||||
-# -*- coding: iso-8859-1 -*-
|
||||
# pysqlite2/dbapi2.py: the DB-API 2.0 interface
|
||||
#
|
||||
-# Copyright (C) 2004-2005 Gerhard Häring <gh@ghaering.de>
|
||||
+# Copyright (C) 2004-2005 Gerhard Haering <gh@ghaering.de>
|
||||
#
|
||||
# This file is part of pysqlite.
|
||||
#
|
||||
diff -up Python-2.5.1/Lib/sqlite3/__init__.py.encoding Python-2.5.1/Lib/sqlite3/__init__.py
|
||||
--- Python-2.5.1/Lib/sqlite3/__init__.py.encoding 2007-09-14 10:41:47.000000000 -0400
|
||||
+++ Python-2.5.1/Lib/sqlite3/__init__.py 2007-09-14 10:42:06.000000000 -0400
|
||||
@@ -1,7 +1,6 @@
|
||||
-#-*- coding: ISO-8859-1 -*-
|
||||
# pysqlite2/__init__.py: the pysqlite2 package.
|
||||
#
|
||||
-# Copyright (C) 2005 Gerhard Häring <gh@ghaering.de>
|
||||
+# Copyright (C) 2005 Gerhard Haering <gh@ghaering.de>
|
||||
#
|
||||
# This file is part of pysqlite.
|
||||
#
|
||||
20
python-2.6.4-distutils-rpath.patch
Normal file
20
python-2.6.4-distutils-rpath.patch
Normal file
@ -0,0 +1,20 @@
|
||||
diff -up Python-2.6.4/Lib/distutils/unixccompiler.py.distutils-rpath Python-2.6.4/Lib/distutils/unixccompiler.py
|
||||
--- Python-2.6.4/Lib/distutils/unixccompiler.py.distutils-rpath 2009-09-09 04:34:06.000000000 -0400
|
||||
+++ Python-2.6.4/Lib/distutils/unixccompiler.py 2010-03-15 21:33:25.000000000 -0400
|
||||
@@ -142,6 +142,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 = \
|
||||
+ CCompiler._fix_lib_args(self, 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):
|
||||
27
python-2.7.1-fix_test_abc_with_COUNT_ALLOCS.patch
Normal file
27
python-2.7.1-fix_test_abc_with_COUNT_ALLOCS.patch
Normal file
@ -0,0 +1,27 @@
|
||||
diff -up Python-2.7.1/Lib/test/test_abc.py.cache_leak Python-2.7.1/Lib/test/test_abc.py
|
||||
--- Python-2.7.1/Lib/test/test_abc.py.cache_leak 2010-12-28 18:06:35.551938356 -0500
|
||||
+++ Python-2.7.1/Lib/test/test_abc.py 2010-12-28 18:09:09.021059202 -0500
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
"""Unit tests for abc.py."""
|
||||
|
||||
+import sys
|
||||
+
|
||||
import unittest, weakref
|
||||
from test import test_support
|
||||
|
||||
@@ -229,8 +231,12 @@ class TestABC(unittest.TestCase):
|
||||
# Trigger cache.
|
||||
C().f()
|
||||
del C
|
||||
- test_support.gc_collect()
|
||||
- self.assertEqual(r(), None)
|
||||
+ # This doesn't work in our debug build, presumably due to its use
|
||||
+ # of COUNT_ALLOCS, which makes heap-allocated types immortal (once
|
||||
+ # they've ever had an instance):
|
||||
+ if not hasattr(sys, 'getcounts'):
|
||||
+ test_support.gc_collect()
|
||||
+ self.assertEqual(r(), None)
|
||||
|
||||
def test_main():
|
||||
test_support.run_unittest(TestABC)
|
||||
18
python-2.7.2-add-extension-suffix-to-python-config.patch
Normal file
18
python-2.7.2-add-extension-suffix-to-python-config.patch
Normal file
@ -0,0 +1,18 @@
|
||||
diff -up Python-2.7.2/Misc/python-config.in.add-extension-suffix-to-python-config Python-2.7.2/Misc/python-config.in
|
||||
--- Python-2.7.2/Misc/python-config.in.add-extension-suffix-to-python-config 2011-08-23 18:15:41.832497124 -0400
|
||||
+++ Python-2.7.2/Misc/python-config.in 2011-08-23 18:17:25.854490011 -0400
|
||||
@@ -6,7 +6,7 @@ import getopt
|
||||
from distutils import sysconfig
|
||||
|
||||
valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
|
||||
- 'ldflags', 'help']
|
||||
+ 'ldflags', 'extension-suffix', 'help']
|
||||
|
||||
def exit_with_usage(code=1):
|
||||
print >>sys.stderr, "Usage: %s [%s]" % (sys.argv[0],
|
||||
@@ -54,3 +54,5 @@ for opt in opt_flags:
|
||||
libs.extend(getvar('LINKFORSHARED').split())
|
||||
print ' '.join(libs)
|
||||
|
||||
+ elif opt == '--extension-suffix':
|
||||
+ print (sys.pydebug and "_d" or "") + sysconfig.get_config_var('SO')
|
||||
64
python-2.7rc1-socketmodule-constants.patch
Normal file
64
python-2.7rc1-socketmodule-constants.patch
Normal file
@ -0,0 +1,64 @@
|
||||
--- Python-2.7rc1/Modules/socketmodule.c.socketmodule 2010-05-09 10:46:46.000000000 -0400
|
||||
+++ Python-2.7rc1/Modules/socketmodule.c 2010-06-07 23:04:19.374234780 -0400
|
||||
@@ -4783,6 +4783,61 @@ init_socket(void)
|
||||
PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);
|
||||
#endif
|
||||
|
||||
+#ifdef SO_SNDBUFFORCE
|
||||
+ PyModule_AddIntConstant(m, "SO_SNDBUFFORCE", SO_SNDBUFFORCE);
|
||||
+#endif
|
||||
+#ifdef SO_RCVBUFFORCE
|
||||
+ PyModule_AddIntConstant(m, "SO_RCVBUFFORCE", SO_RCVBUFFORCE);
|
||||
+#endif
|
||||
+#ifdef SO_NO_CHECK
|
||||
+ PyModule_AddIntConstant(m, "SO_NO_CHECK", SO_NO_CHECK);
|
||||
+#endif
|
||||
+#ifdef SO_PRIORITY
|
||||
+ PyModule_AddIntConstant(m, "SO_PRIORITY", SO_PRIORITY);
|
||||
+#endif
|
||||
+#ifdef SO_BSDCOMPAT
|
||||
+ PyModule_AddIntConstant(m, "SO_BSDCOMPAT", SO_BSDCOMPAT);
|
||||
+#endif
|
||||
+#ifdef SO_PASSCRED
|
||||
+ PyModule_AddIntConstant(m, "SO_PASSCRED", SO_PASSCRED);
|
||||
+#endif
|
||||
+#ifdef SO_PEERCRED
|
||||
+ PyModule_AddIntConstant(m, "SO_PEERCRED", SO_PEERCRED);
|
||||
+#endif
|
||||
+#ifdef SO_SECURITY_AUTHENTICATION
|
||||
+ PyModule_AddIntConstant(m, "SO_SECURITY_AUTHENTICATION", SO_SECURITY_AUTHENTICATION);
|
||||
+#endif
|
||||
+#ifdef SO_SECURITY_ENCRYPTION_TRANSPORT
|
||||
+ PyModule_AddIntConstant(m, "SO_SECURITY_ENCRYPTION_TRANSPORT", SO_SECURITY_ENCRYPTION_TRANSPORT);
|
||||
+#endif
|
||||
+#ifdef SO_SECURITY_ENCRYPTION_NETWORK
|
||||
+ PyModule_AddIntConstant(m, "SO_SECURITY_ENCRYPTION_NETWORK", SO_SECURITY_ENCRYPTION_NETWORK);
|
||||
+#endif
|
||||
+#ifdef SO_BINDTODEVICE
|
||||
+ PyModule_AddIntConstant(m, "SO_BINDTODEVICE", SO_BINDTODEVICE);
|
||||
+#endif
|
||||
+#ifdef SO_ATTACH_FILTER
|
||||
+ PyModule_AddIntConstant(m, "SO_ATTACH_FILTER", SO_ATTACH_FILTER);
|
||||
+#endif
|
||||
+#ifdef SO_DETACH_FILTER
|
||||
+ PyModule_AddIntConstant(m, "SO_DETACH_FILTER", SO_DETACH_FILTER);
|
||||
+#endif
|
||||
+#ifdef SO_PEERNAME
|
||||
+ PyModule_AddIntConstant(m, "SO_PEERNAME", SO_PEERNAME);
|
||||
+#endif
|
||||
+#ifdef SO_TIMESTAMP
|
||||
+ PyModule_AddIntConstant(m, "SO_TIMESTAMP", SO_TIMESTAMP);
|
||||
+#endif
|
||||
+#ifdef SO_PEERSEC
|
||||
+ PyModule_AddIntConstant(m, "SO_PEERSEC", SO_PEERSEC);
|
||||
+#endif
|
||||
+#ifdef SO_PASSSEC
|
||||
+ PyModule_AddIntConstant(m, "SO_PASSSEC", SO_PASSSEC);
|
||||
+#endif
|
||||
+#ifdef SO_TIMESTAMPNS
|
||||
+ PyModule_AddIntConstant(m, "SO_TIMESTAMPNS", SO_TIMESTAMPNS);
|
||||
+#endif
|
||||
+
|
||||
/* Maximum number of connections for "listen" */
|
||||
#ifdef SOMAXCONN
|
||||
PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
|
||||
19
python-2.7rc1-socketmodule-constants2.patch
Normal file
19
python-2.7rc1-socketmodule-constants2.patch
Normal file
@ -0,0 +1,19 @@
|
||||
diff -up Python-2.7rc1/Modules/socketmodule.c.socketmodule2 Python-2.7rc1/Modules/socketmodule.c
|
||||
--- Python-2.7rc1/Modules/socketmodule.c.socketmodule2 2010-06-07 23:06:59.133498087 -0400
|
||||
+++ Python-2.7rc1/Modules/socketmodule.c 2010-06-07 23:11:51.249520087 -0400
|
||||
@@ -5253,6 +5253,15 @@ init_socket(void)
|
||||
#ifdef TCP_QUICKACK
|
||||
PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
|
||||
#endif
|
||||
+#ifdef TCP_CONGESTION
|
||||
+ PyModule_AddIntConstant(m, "TCP_CONGESTION", TCP_CONGESTION);
|
||||
+#endif
|
||||
+#ifdef TCP_MD5SIG
|
||||
+ PyModule_AddIntConstant(m, "TCP_MD5SIG", TCP_MD5SIG);
|
||||
+#endif
|
||||
+#ifdef TCP_MD5SIG_MAXKEYLEN
|
||||
+ PyModule_AddIntConstant(m, "TCP_MD5SIG_MAXKEYLEN", TCP_MD5SIG_MAXKEYLEN);
|
||||
+#endif
|
||||
|
||||
|
||||
/* IPX options */
|
||||
348
python2.spec
348
python2.spec
@ -1,30 +1,80 @@
|
||||
%global pybasever 2.7
|
||||
%global py_SOVERSION 1.0
|
||||
%global pylibdir %{_libdir}/python%{pybasever}
|
||||
%global tools_dir %{pylibdir}/Tools
|
||||
%global demo_dir %{pylibdir}/Demo
|
||||
%global dynload_dir %{pylibdir}/lib-dynload
|
||||
%global site_packages %{pylibdir}/site-packages
|
||||
%global py_INSTSONAME_optimized libpython%{pybasever}.so.%{py_SOVERSION}
|
||||
%global py_INSTSONAME_debug libpython%{pybasever}_d.so.%{py_SOVERSION}
|
||||
#with systemtap
|
||||
%global tapsetdir /usr/share/systemtap/tapset
|
||||
|
||||
%undefine __brp_python_bytecompile
|
||||
%undefine py_auto_byte_compile
|
||||
%undefine _debuginfo_subpackages
|
||||
Name: python2
|
||||
Version: 2.7.16
|
||||
Release: 3
|
||||
Release: 6
|
||||
Summary: Python is an interpreted, interactive object-oriented programming language suitable
|
||||
License: Python
|
||||
URL: https://www.python.org/
|
||||
Source0: https://www.python.org/ftp/python/%{version}/Python-%{version}.tar.xz
|
||||
#with systemtap
|
||||
Source1: libpython.stp
|
||||
#custom modifications
|
||||
Patch0: python-2.7.1-config.patch
|
||||
Patch1: 00001-pydocnogui.patch
|
||||
Patch4: python-2.5-cflags.patch
|
||||
Patch6: python-2.5.1-plural-fix.patch
|
||||
Patch7: python-2.5.1-sqlite-encoding.patch
|
||||
Patch10: 00010-2.7.13-binutils-no-dep.patch
|
||||
Patch13: python-2.7rc1-socketmodule-constants.patch
|
||||
Patch14: python-2.7rc1-socketmodule-constants2.patch
|
||||
Patch16: python-2.6-rpath.patch
|
||||
Patch17: python-2.6.4-distutils-rpath.patch
|
||||
Patch55: 00055-systemtap.patch
|
||||
Patch102: 00102-2.7.13-lib64.patch
|
||||
Patch103: python-2.7-lib64-sysconfig.patch
|
||||
Patch104: 00104-lib64-fix-for-test_install.patch
|
||||
Patch111: 00111-no-static-lib.patch
|
||||
Patch112: 00112-2.7.13-debug-build.patch
|
||||
Patch113: 00113-more-configuration-flags.patch
|
||||
Patch114: 00114-statvfs-f_flag-constants.patch
|
||||
Patch121: 00121-add-Modules-to-build-path.patch
|
||||
Patch128: python-2.7.1-fix_test_abc_with_COUNT_ALLOCS.patch
|
||||
Patch130: python-2.7.2-add-extension-suffix-to-python-config.patch
|
||||
Patch131: 00131-disable-tests-in-test_io.patch
|
||||
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
|
||||
Patch133: 00133-skip-test_dl.patch
|
||||
Patch136: 00136-skip-tests-of-seeking-stdin-in-rpmbuild.patch
|
||||
Patch137: 00137-skip-distutils-tests-that-fail-in-rpmbuild.patch
|
||||
Patch138: 00138-fix-distutils-tests-in-debug-build.patch
|
||||
Patch139: 00139-skip-test_float-known-failure-on-arm.patch
|
||||
Patch140: 00140-skip-test_ctypes-known-failure-on-sparc.patch
|
||||
Patch142: 00142-skip-failing-pty-tests-in-rpmbuild.patch
|
||||
Patch143: 00143-tsc-on-ppc.patch
|
||||
Patch147: 00147-add-debug-malloc-stats.patch
|
||||
Patch153: 00153-fix-test_gdb-noise.patch
|
||||
Patch155: 00155-avoid-ctypes-thunks.patch
|
||||
Patch156: 00156-gdb-autoload-safepath.patch
|
||||
Patch157: 00157-uid-gid-overflows.patch
|
||||
Patch165: 00165-crypt-module-salt-backport.patch
|
||||
Patch167: 00167-disable-stack-navigation-tests-when-optimized-in-test_gdb.patch
|
||||
Patch168: 00168-distutils-cflags.patch
|
||||
Patch169: 00169-avoid-implicit-usage-of-md5-in-multiprocessing.patch
|
||||
Patch170: 00170-gc-assertions.patch
|
||||
Patch174: 00174-fix-for-usr-move.patch
|
||||
Patch180: 00180-python-add-support-for-ppc64p7.patch
|
||||
Patch181: 00181-allow-arbitrary-timeout-in-condition-wait.patch
|
||||
Patch185: 00185-urllib2-honors-noproxy-for-ftp.patch
|
||||
Patch187: 00187-add-RPATH-to-pyexpat.patch
|
||||
Patch189: 00189-use-rpm-wheels.patch
|
||||
Patch191: 00191-disable-NOOP.patch
|
||||
Patch193: 00193-enable-loading-sqlite-extensions.patch
|
||||
Patch289: 00289-disable-nis-detection.patch
|
||||
Patch04000: 04000-modularity-disable-tk.patch
|
||||
Patch5000: 05000-autotool-intermediates.patch
|
||||
#upstream patches
|
||||
Patch6035: 0342-bpo-36126-Fix-ref-count-leakage-in-structseq_repr.-G.patch
|
||||
Patch6036: 0349-2.7-bpo-13096-Fix-memory-leak-in-ctypes-POINTER-hand.patch
|
||||
@ -37,10 +87,11 @@ Patch6042: 0358-2.7-IDLE-Fix-typo-in-keybindingDialog.py-GH-2322-GH-.patch
|
||||
Patch6044: python2-CVE-2019-9948-1.patch
|
||||
Patch6045: python2-CVE-2019-9948-2.patch
|
||||
Patch6047: CVE-2019-9740.patch
|
||||
Patch9000: python2-add-generic-os-supportr.patch
|
||||
|
||||
BuildRequires: libdb-devel libffi-devel valgrind-devel ncurses-devel expat-devel readline-devel
|
||||
BuildRequires: openssl-devel libtirpc-devel tcl-devel tk-devel glibc-devel libnsl2-devel
|
||||
BuildRequires: zlib-devel tix-devel gdbm-devel sqlite-devel chrpath
|
||||
BuildRequires: zlib-devel tix-devel gdbm-devel sqlite-devel chrpath sed systemtap-sdt-devel
|
||||
|
||||
Requires: expat glibc gdbm python-setuptools-wheel python-pip-wheel
|
||||
|
||||
@ -137,12 +188,59 @@ BuildArch: noarch
|
||||
%description help
|
||||
%{summary}.
|
||||
|
||||
%package debug
|
||||
Summary: Debug package for the Python 2 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} = %{version}-%{release}
|
||||
Requires: %{name}-devel = %{version}-%{release}
|
||||
Requires: %{name}-help = %{version}-%{release}
|
||||
Requires: %{name}-tkinter = %{version}-%{release}
|
||||
Requires: %{name}-tools = %{version}-%{release}
|
||||
|
||||
Provides: python-debug = %{version}-%{release}
|
||||
|
||||
%description debug
|
||||
python2-debug provides a version of the Python 2 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 2 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
|
||||
version of Python 2, 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 2 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 2 implementation can
|
||||
load its own extensions.
|
||||
|
||||
%prep
|
||||
%autosetup -n Python-%{version} -p1
|
||||
sed -i "s/generic_os/%{_vendor}/g" Lib/platform.py
|
||||
|
||||
mv Modules/cryptmodule.c Modules/_cryptmodule.c
|
||||
|
||||
%build
|
||||
topdir=$(pwd)
|
||||
BuildPython() {
|
||||
ConfName=$1
|
||||
BinaryName=$2
|
||||
SymlinkName=$3
|
||||
PathFixWithThisBinary=$4
|
||||
ExtraConfigArgs=$5
|
||||
|
||||
ConfDir=build/$ConfName
|
||||
echo STARTING: BUILD OF PYTHON FOR CONFIGURATION: $ConfName
|
||||
mkdir -p $ConfDir
|
||||
pushd $ConfDir
|
||||
|
||||
%global _configure $topdir/configure
|
||||
|
||||
%configure \
|
||||
--enable-ipv6 \
|
||||
--enable-shared \
|
||||
@ -152,19 +250,95 @@ mv Modules/cryptmodule.c Modules/_cryptmodule.c
|
||||
--with-system-ffi \
|
||||
--with-dtrace \
|
||||
--with-tapset-install-dir=%{tapsetdir} \
|
||||
--with-valgrind
|
||||
--with-valgrind \
|
||||
$ExtraConfigArgs
|
||||
|
||||
%make_build
|
||||
|
||||
#Fix "WARNING: mangling shebang"
|
||||
pybuilddir=$(pwd)
|
||||
LD_LIBRARY_PATH=$pybuilddir \
|
||||
./python $pybuilddir/Tools/scripts/pathfix.py -i "%{_bindir}/python2" \
|
||||
$pybuilddir
|
||||
#Fix "WARNING: mangling shebang, only for python2 optimized"
|
||||
echo "PathFixWithThisBinary = " $PathFixWithThisBinary
|
||||
if $PathFixWithThisBinary
|
||||
then
|
||||
LD_LIBRARY_PATH="$topdir/$ConfDir" ./$BinaryName \
|
||||
$topdir/Tools/scripts/pathfix.py -i "%{_bindir}/python%{pybasever}" \
|
||||
$topdir
|
||||
fi
|
||||
|
||||
ln -s $BinaryName $SymlinkName
|
||||
LD_LIBRARY_PATH="$topdir/$ConfDir" PATH=$PATH:$topdir/$ConfDir make -s EXTRA_CFLAGS="$CFLAGS" %{?_smp_mflags}
|
||||
|
||||
popd
|
||||
echo FINISHED: BUILD OF PYTHON FOR CONFIGURATION: $ConfDir
|
||||
}
|
||||
|
||||
BuildPython debug \
|
||||
python-debug \
|
||||
python%{pybasever}-debug \
|
||||
false \
|
||||
%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"
|
||||
%endif
|
||||
|
||||
BuildPython optimized \
|
||||
python \
|
||||
python%{pybasever} \
|
||||
true \
|
||||
%ifarch %{ix86} x86_64
|
||||
"--enable-optimizations"
|
||||
%else
|
||||
""
|
||||
%endif
|
||||
|
||||
%install
|
||||
topdir=$(pwd)
|
||||
rm -rf %{buildroot}
|
||||
mkdir -p %{buildroot}%{_prefix} %{buildroot}%{_mandir}
|
||||
|
||||
%make_install
|
||||
for f in distutils/command/install distutils/sysconfig; do
|
||||
rm -f Lib/$f.py.lib64
|
||||
done
|
||||
|
||||
InstallPython() {
|
||||
ConfName=$1
|
||||
BinaryName=$2
|
||||
PyInstSoName=$3
|
||||
|
||||
ConfDir=build/$ConfName
|
||||
echo STARTING: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName - %{_bindir}/$BinaryName
|
||||
mkdir -p $ConfDir
|
||||
pushd $ConfDir
|
||||
|
||||
%make_install
|
||||
chrpath -d $(find %{buildroot} -name pyexpat.so)
|
||||
|
||||
DirHoldingGdbPy=%{_prefix}/lib/debug/%{_libdir}
|
||||
PathOfGdbPy=$DirHoldingGdbPy/$PyInstSoName-%{version}-%{release}.%{_arch}.debug-gdb.py
|
||||
|
||||
mkdir -p %{buildroot}$DirHoldingGdbPy
|
||||
cp $topdir/Tools/gdb/libpython.py %{buildroot}$PathOfGdbPy
|
||||
|
||||
# Manually byte-compile the file, in case find-debuginfo.sh is run before
|
||||
# brp-python-bytecompile, so that the .pyc/.pyo files are properly listed in
|
||||
# the debuginfo manifest:
|
||||
LD_LIBRARY_PATH="$topdir/$ConfDir" $topdir/$ConfDir/$BinaryName \
|
||||
-c "import compileall; import sys; compileall.compile_dir('%{buildroot}$DirHoldingGdbPy', ddir='$DirHoldingGdbPy')"
|
||||
|
||||
LD_LIBRARY_PATH="$topdir/$ConfDir" $topdir/$ConfDir/$BinaryName -O \
|
||||
-c "import compileall; import sys; compileall.compile_dir('%{buildroot}$DirHoldingGdbPy', ddir='$DirHoldingGdbPy')"
|
||||
|
||||
popd
|
||||
echo FINISHED: INSTALL OF PYTHON FOR CONFIGURATION: $ConfName
|
||||
}
|
||||
|
||||
InstallPython debug \
|
||||
python%{pybasever}-debug \
|
||||
%{py_INSTSONAME_debug}
|
||||
|
||||
InstallPython optimized \
|
||||
python%{pybasever} \
|
||||
%{py_INSTSONAME_optimized}
|
||||
|
||||
install -d -m755 %{buildroot}/%{_prefix}/lib/python%{pybasever}/site-packages
|
||||
|
||||
@ -183,11 +357,35 @@ mv %{buildroot}%{_bindir}/smtpd.py %{buildroot}%{_bindir}/smtpd%{pybasever}.py
|
||||
rm -f %{buildroot}%{pylibdir}/LICENSE.txt
|
||||
find %{buildroot} -name "*.bat" | xargs rm -f
|
||||
|
||||
%global _pyconfig32_h pyconfig-32.h
|
||||
%global _pyconfig64_h pyconfig-64.h
|
||||
|
||||
for Dir in python%{pybasever} python%{pybasever}-debug ; do
|
||||
mv %{buildroot}%{_includedir}/$Dir/pyconfig.h \
|
||||
%{buildroot}%{_includedir}/$Dir/pyconfig-64.h
|
||||
cat > %{buildroot}%{_includedir}/$Dir/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
|
||||
|
||||
#with systemtap
|
||||
mkdir -p %{buildroot}%{tapsetdir}
|
||||
sed -e "s|LIBRARY_PATH|%{_libdir}/%{py_INSTSONAME_debug}|" %{SOURCE1} \
|
||||
> %{buildroot}%{tapsetdir}/libpython%{pybasever}-debug-64.stp
|
||||
|
||||
# Ensure the libs readable
|
||||
%{__chmod} 755 %{buildroot}%{dynload_dir}/*.so
|
||||
%{__chmod} 755 %{buildroot}%{_libdir}/libpython%{pybasever}.so.1.0
|
||||
%{__chmod} 755 %{buildroot}%{_libdir}/libpython%{pybasever}_d.so.1.0
|
||||
|
||||
chrpath -d $(find %{buildroot} -name pyexpat.so)
|
||||
|
||||
%check
|
||||
#make test || :
|
||||
@ -296,7 +494,137 @@ chrpath -d $(find %{buildroot} -name pyexpat.so)
|
||||
%defattr(-,root,root)
|
||||
%{_mandir}/man1/python*.1.*
|
||||
|
||||
%files debug
|
||||
/usr/lib/debug/usr/lib64/libpython*.debug-gdb.py*
|
||||
|
||||
# Analog of the core subpackage's files:
|
||||
%{_bindir}/python-debug
|
||||
%{_bindir}/python2-debug
|
||||
%{_bindir}/python%{pybasever}-debug
|
||||
|
||||
# Analog of the -libs subpackage's files, with debug builds of the built-in
|
||||
# "extension" modules:
|
||||
|
||||
%{dynload_dir}/_md5module_d.so
|
||||
%{dynload_dir}/_sha256module_d.so
|
||||
%{dynload_dir}/_sha512module_d.so
|
||||
%{dynload_dir}/_shamodule_d.so
|
||||
|
||||
%{dynload_dir}/_bisectmodule_d.so
|
||||
%{dynload_dir}/_bsddb_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}/_elementtree_d.so
|
||||
%{dynload_dir}/_functoolsmodule_d.so
|
||||
%{dynload_dir}/_hashlib_d.so
|
||||
%{dynload_dir}/_heapq_d.so
|
||||
%{dynload_dir}/_hotshot_d.so
|
||||
%{dynload_dir}/_io_d.so
|
||||
%{dynload_dir}/_json_d.so
|
||||
%{dynload_dir}/_localemodule_d.so
|
||||
%{dynload_dir}/_lsprof_d.so
|
||||
%{dynload_dir}/_multibytecodecmodule_d.so
|
||||
%{dynload_dir}/_multiprocessing_d.so
|
||||
%{dynload_dir}/_randommodule_d.so
|
||||
%{dynload_dir}/_socketmodule_d.so
|
||||
%{dynload_dir}/_sqlite3_d.so
|
||||
%{dynload_dir}/_ssl_d.so
|
||||
%{dynload_dir}/_struct_d.so
|
||||
%{dynload_dir}/arraymodule_d.so
|
||||
%{dynload_dir}/audioop_d.so
|
||||
%{dynload_dir}/binascii_d.so
|
||||
%{dynload_dir}/bz2_d.so
|
||||
%{dynload_dir}/cPickle_d.so
|
||||
%{dynload_dir}/cStringIO_d.so
|
||||
%{dynload_dir}/cmathmodule_d.so
|
||||
%{dynload_dir}/_cryptmodule_d.so
|
||||
%{dynload_dir}/datetime_d.so
|
||||
%{dynload_dir}/dbm_d.so
|
||||
%{dynload_dir}/dlmodule_d.so
|
||||
%{dynload_dir}/fcntlmodule_d.so
|
||||
%{dynload_dir}/future_builtins_d.so
|
||||
#with_gdbm
|
||||
%{dynload_dir}/gdbmmodule_d.so
|
||||
#%endif
|
||||
%{dynload_dir}/grpmodule_d.so
|
||||
%{dynload_dir}/imageop_d.so
|
||||
%{dynload_dir}/itertoolsmodule_d.so
|
||||
%{dynload_dir}/linuxaudiodev_d.so
|
||||
%{dynload_dir}/math_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}/stropmodule_d.so
|
||||
%{dynload_dir}/syslog_d.so
|
||||
%{dynload_dir}/termios_d.so
|
||||
%{dynload_dir}/timemodule_d.so
|
||||
%{dynload_dir}/timingmodule_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":
|
||||
|
||||
%{_libdir}/%{py_INSTSONAME_debug}
|
||||
#with_systemtap
|
||||
%dir %(dirname %{tapsetdir})
|
||||
%dir %{tapsetdir}
|
||||
%{tapsetdir}/libpython%{pybasever}-debug-64.stp
|
||||
#%endif
|
||||
|
||||
# Analog of the -devel subpackage's files:
|
||||
%dir %{pylibdir}/config-debug
|
||||
%{_libdir}/pkgconfig/python-%{pybasever}-debug.pc
|
||||
%{_libdir}/pkgconfig/python-debug.pc
|
||||
%{_libdir}/pkgconfig/python2-debug.pc
|
||||
%{pylibdir}/config-debug/*
|
||||
%{_includedir}/python%{pybasever}-debug/*.h
|
||||
%{_bindir}/python-debug-config
|
||||
%{_bindir}/python2-debug-config
|
||||
%{_bindir}/python%{pybasever}-debug-config
|
||||
%{_libdir}/libpython%{pybasever}_d.so
|
||||
|
||||
# Analog of the -tools subpackage's files:
|
||||
# None for now; we could build precanned versions that have the appropriate
|
||||
# shebang if needed
|
||||
|
||||
#%_module_build
|
||||
# Analog of the tkinter subpackage's files:
|
||||
%{dynload_dir}/_tkinter_d.so
|
||||
#%endif
|
||||
|
||||
# Analog of the -test subpackage's files:
|
||||
%{dynload_dir}/_ctypes_test_d.so
|
||||
%{dynload_dir}/_testcapimodule_d.so
|
||||
|
||||
%changelog
|
||||
* Thu Nov 28 2019 openEuler Buildteam <buildteam@openeuler.org> - 2.7.16-6
|
||||
- add _pyconfig32_h _pyconfig64_h global var
|
||||
|
||||
* Thu Nov 28 2019 openEuler Buildteam <buildteam@openeuler.org> - 2.7.16-5
|
||||
- add python2-debug
|
||||
|
||||
* Fri Oct 18 2019 openEuler Buildteam <buildteam@openeuler.org> - 2.7.16-4
|
||||
- add generic os support
|
||||
|
||||
* Tue Oct 15 2019 openEuler Buildteam <buildteam@openeuler.org> - 2.7.16-3
|
||||
- Provides python2-test
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user