MANDIR= @mandir@
INCLUDEDIR= @includedir@
CONFINCLUDEDIR= $(exec_prefix)/include
-SCRIPTDIR= $(prefix)/lib
+SCRIPTDIR= @libdir@
ABIFLAGS= @ABIFLAGS@
# Detailed destination directories
LIBDEST= $(SCRIPTDIR)/python$(VERSION)
INCLUDEPY= $(INCLUDEDIR)/python$(LDVERSION)
CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION)
+BASE_LIB= lib
# Symbols used for using shared libraries
SHLIB_SUFFIX= @SHLIB_SUFFIX@
TCLTK_INCLUDES= @TCLTK_INCLUDES@
TCLTK_LIBS= @TCLTK_LIBS@
-# The task to run while instrumented when building the profile-opt target.
-# We exclude unittests with -x that take a rediculious amount of time to
-# run in the instrumented training build or do not provide much value.
-PROFILE_TASK=-m test.regrtest --pgo
+# The task to run while instrument when building the profile-opt target
+PROFILE_TASK=
+#PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
+#PROFILE_TASK= $(srcdir)/Lib/test/regrtest.py
# report files for gcov / lcov coverage report
COVERAGE_INFO= $(abs_builddir)/coverage.info
-DEXEC_PREFIX='"$(exec_prefix)"' \
-DVERSION='"$(VERSION)"' \
-DVPATH='"$(VPATH)"' \
+ -DBASE_LIB='"$(BASE_LIB)"' \
-o $@ $(srcdir)/Modules/getpath.c
Programs/python.o: $(srcdir)/Programs/python.c
# Install a number of symlinks to keep software that expects a normal unix
# install (which includes python-config) happy.
frameworkinstallmaclib:
- $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(LDVERSION).a"
- $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(LDVERSION).dylib"
- $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(VERSION).a"
- $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(VERSION).dylib"
- $(LN) -fs "../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(prefix)/lib/libpython$(LDVERSION).dylib"
- $(LN) -fs "../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(prefix)/lib/libpython$(VERSION).dylib"
+ $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/python$(VERSION)/config-$(LDVERSION)/libpython$(LDVERSION).a"
+ $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/python$(VERSION)/config-$(LDVERSION)/libpython$(LDVERSION).dylib"
+ $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/python$(VERSION)/config-$(LDVERSION)/libpython$(VERSION).a"
+ $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/python$(VERSION)/config-$(LDVERSION)/libpython$(VERSION).dylib"
+ $(LN) -fs "../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(LDVERSION).dylib"
+ $(LN) -fs "../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(VERSION).dylib"
# This installs the IDE, the Launcher and other apps into /Applications
frameworkinstallapps:
#define LANDMARK L"os.py"
#endif
+#ifndef BASE_LIB
+#define BASE_LIB "lib"
+#endif
+
static wchar_t prefix[MAXPATHLEN+1];
static wchar_t exec_prefix[MAXPATHLEN+1];
static wchar_t progpath[MAXPATHLEN+1];
wchar_t *_pythonpath, *_prefix, *_exec_prefix;
wchar_t *lib_python;
- _pythonpath = Py_DecodeLocale(PYTHONPATH, NULL);
- _prefix = Py_DecodeLocale(PREFIX, NULL);
- _exec_prefix = Py_DecodeLocale(EXEC_PREFIX, NULL);
- lib_python = Py_DecodeLocale("lib/python" VERSION, NULL);
+ _pythonpath = _Py_char2wchar(PYTHONPATH, NULL);
+ _prefix = _Py_char2wchar(PREFIX, NULL);
+ _exec_prefix = _Py_char2wchar(EXEC_PREFIX, NULL);
+ lib_python = _Py_char2wchar(BASE_LIB "/python" VERSION, NULL);
if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
Py_FatalError(
#if defined(__has_feature) /* Clang */
#if __has_feature(address_sanitizer) /* is ASAN enabled? */
#define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \
- __attribute__((no_address_safety_analysis))
+ __attribute__((no_address_safety_analysis)) \
+ __attribute__ ((noinline))
+ #define SANITIZED_BUILD
+ #define RUNNING_ON_VALGRIND 1
#else
#define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS
#endif
#else
#if defined(__SANITIZE_ADDRESS__) /* GCC 4.8.x, is ASAN enabled? */
#define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \
- __attribute__((no_address_safety_analysis))
+ __attribute__((no_address_safety_analysis)) \
+ __attribute__ ((noinline))
+ #define SANITIZED_BUILD
+ #define RUNNING_ON_VALGRIND 1
#else
#define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS
#endif
#ifdef WITH_PYMALLOC
+#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD)
#ifdef WITH_VALGRIND
#include <valgrind/valgrind.h>
+#endif
/* If we're using GCC, use __builtin_expect() to reduce overhead of
the valgrind checks */
_Py_AllocatedBlocks++;
- assert(elsize == 0 || nelem <= PY_SSIZE_T_MAX / elsize);
- nbytes = nelem * elsize;
-
-#ifdef WITH_VALGRIND
+#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD)
if (UNLIKELY(running_on_valgrind == -1))
running_on_valgrind = RUNNING_ON_VALGRIND;
if (UNLIKELY(running_on_valgrind))
_Py_AllocatedBlocks--;
-#ifdef WITH_VALGRIND
+#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD)
if (UNLIKELY(running_on_valgrind > 0))
goto redirect;
#endif
return;
}
-#ifdef WITH_VALGRIND
+#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD)
redirect:
#endif
/* We didn't allocate this address. */
if (p == NULL)
return _PyObject_Alloc(0, ctx, 1, nbytes);
-#ifdef WITH_VALGRIND
+#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD)
/* Treat running_on_valgrind == -1 the same as 0 */
if (UNLIKELY(running_on_valgrind > 0))
goto redirect;
}
return bp;
}
-#ifdef WITH_VALGRIND
+#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD)
redirect:
#endif
/* We're not managing this block. If nbytes <=
$as_echo "$LDVERSION" >&6; }
-if test x$PLATFORM_TRIPLET = x; then
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
-else
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
-fi
+#LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
+LIBPL='$(LIBDIR)'"/python${VERSION}/config-${LDVERSION}"
# Check whether right shifting a negative integer extends the sign bit
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
AC_SUBST(PY_ENABLE_SHARED)
-if test x$PLATFORM_TRIPLET = x; then
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
-else
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
-fi
+#LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
+LIBPL='$(LIBDIR)'"/python${VERSION}/config-${LDVERSION}"
AC_SUBST(LIBPL)
# Check whether right shifting a negative integer extends the sign bit
--- /dev/null
+Notes for packagers of Python3
+==============================
+
+I. python3 and python3-base naming confusion
+--------------------------------------------
+
+1. the important stuff first
+
+This is package "python3". However, master spec file for this package is "python3-base.spec".
+That means that all important changes should be put into "python3-base.spec" and then submitted
+against "python3" in OBS.
+
+Changelogs of python3-base and python3 will be merged at some point. Now they arent,
+but feel free to enter changes in either or both.
+
+2. why is that?
+
+Technical reasons. python3-base was originally supposed to be a minimal package with no external
+dependencies - so that it can build early in the distribution rebuild. There were also some
+build loops involved.
+Turns out, 90% of Python's standard library can be built without external dependencies. That's
+what we do - in python3-base. python3 then only contains the remaining bits - dependency-heavy
+subpackages, plus small bits depending on common packages (OpenSSL, expat, readline)
+Logically, python3-base must be the master spec because it builds the important parts.
+
+3. why not rename the whole package to python3-base?
+
+Because that would be stupid. The package is called python3.
+
+4. so why not make python3 the minimal package and put the rest in python3-the-rest?
+
+Because other distributions use python3-base as the minimal package as well. Also, packages
+that require python3 expect the whole deal, not a stripped-down version.
+
+5. alright, let's build python3-base from python3.spec and python3 from someother.spec
+
+Tried that, abandoned it. It is more trouble than it's worth.
+
+
+II. pre_checkin.sh
+------------------
+
+Our pre_checkin.sh takes care of copying relevant portions of python3-base.spec to python3.spec.
+The "relevant portions" are:
+* list of patches
+* list of macro definitions
+* patch apply sequence in %prep
+
+That means that when you're adding a patch, you need only add it to python3-base.spec and it will appear
+magically in python3.spec too.
+
+If you want to replicate another section from py3-base to py3, just mark the section with
+NEW-SECTION-BEGIN and NEW-SECTION-END (in both py3-base and py3) and add NEW-SECTION to list of $sections
+in pre_checkin.sh
+
+pre_checkin.sh also finds the newest python tarball in the source directory and updates versions
+in all specfiles to match it. Therefore, you usually don't need to update version numbers in specs
+when you update Python
--- /dev/null
+python3
+python3-base
+libpython3_5m1_0
--- /dev/null
+python3-tools: turtledemo
+python3-idle: idlelib
+python3-testsuite: test _ctypes_test _testbuffer _testcapi _testimportmultiple _testmultiphase xxlimited
+python3-tk: tkinter _tkinter
+python3-curses: curses _curses _curses_panel
+python3-dbm: dbm _dbm _gdbm
+python3: ensurepip sqlite3 xml xmlrpc _hashlib pyexpat readline _sqlite3 _ssl
--- /dev/null
+import sys, os
+from sysconfig import get_path
+
+failed_map_path = os.path.join(get_path('stdlib'), '_import_failed', 'import_failed.map')
+
+if __spec__:
+ failed_name = __spec__.name
+else:
+ failed_name = __name__
+
+for line in open(failed_map_path):
+ words = line.strip().split()
+ if not words or words[0][0] == '#':
+ continue
+ assert words[0][-1] == ':'
+ package = words[0][:-1]
+
+ if failed_name in words[1:]:
+ raise ImportError("""Module '{}' is not installed.
+Use:
+ sudo zypper install {}
+to install it.""".format(failed_name, package))
+
+raise ImportError("""Module '{}' is not installed.
+It is supposed to be part of python3 distribution, but missing from failed import map.
+Please file a bug on the SUSE Bugzilla.""".format(failed_name))
--- /dev/null
+#!/usr/bin/python3
+
+""" generate macros.python3 file from known values """
+
+import sys,os
+from sysconfig import get_path, get_config_var
+
+version = "{}.{}".format(*sys.version_info)
+abiflags = get_config_var("ABIFLAGS")
+
+macros = {
+ "py3_ver": version,
+ "python3_version": version,
+ "py3_prefix": sys.prefix,
+# hack-fix for bnc#787526 - get_path can't be used this way in python build dir
+# "py3_incdir": get_path("include"),
+ "py3_incdir": "/usr/include/python" + version + abiflags,
+ "py3_abiflags": abiflags,
+ "py3_soflags": get_config_var("SOABI"),
+ "python3_sitelib": get_path("purelib"),
+ "python3_sitearch": get_path("platlib"),
+ "py3_compile(O)": """
+find %1 -name '*.pyc' -exec rm -f {} ";"
+python3 -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1
+%{-O:
+find %1 -name '*.pyo' -exec rm -f {} ";"
+python3 -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1
+}""",
+}
+
+for (macro,definition) in macros.items():
+ definition = "\\\n".join(definition.split("\n"))
+ print( "%{} {}".format(macro, definition))
--- /dev/null
+#!/bin/bash
+# This script is called automatically during autobuild checkin.
+#
+#
+#
+# ...or is it?
+# it really doesn't seem so, you know. go run it manually.
+
+master=python3-base.spec
+
+# calculate version number from newest tar name
+VERSION=`ls *.tar.xz | grep '^Python-' | tail -n 1 | sed -r 's/^Python-([0-9]+\.[0-9]+.[0-9a-z]+)\.tar.*$/\1/'`
+if echo $VERSION | grep -q Python; then
+ echo "Version is $VERSION and that's not right, fix the script."
+ exit 1
+fi
+# VERSION = 3.3.0
+
+Version=${VERSION/[a-z]*/} # 3.3.0
+tar_suffix=${VERSION#$Version} # b1
+a_version=(${Version//\./ }) # 3 3 0
+
+python_version=${VERSION:0:3} # 3.3
+python_version_abitag=${python_version//./} # 33
+python_version_soname=${python_version//./_} # 3_3
+
+if [ -n "$tar_suffix" ]; then
+ Version=$Version~$tar_suffix # 3.3.0~b1
+ tarversion=$VERSION # 3.3.0b1
+else
+ tarversion="%{version}"
+fi
+
+# set Version for every spec
+sed -i -r 's/(^Version:[ \t]+).*/\1'"$Version"'/' python3*.spec
+# set tarversion for every spec
+sed -i -r 's/(^%define[ \t]+tarversion[ \t]+).*/\1'$tarversion'/' python3*.spec
+
+for varname in python_version{,_abitag,_soname}; do
+ eval varvalue=\$$varname
+ sed -i -r 's/(^%define[ \t]+'$varname'[ \t]+).*/\1'$varvalue'/' $master
+done
+
+
+# update baselibs
+sed -i -r 's/^libpython.*$/libpython'$python_version_soname'm1_0/' baselibs.conf
+
+
+# copy definition sections
+
+
+sections="COMMON-PATCH COMMON-DEF COMMON-PREP"
+
+for slave in python3.spec python3-doc.spec; do
+{
+ prev=1
+ for section in $sections; do
+ begin="/$section-BEGIN/"
+ end="/$section-END/"
+ sed -n -e "${prev},${begin}p" $slave
+ sed -n -e "${begin},${end}p" $master | head -n -1 | tail -n +2
+ prev=$end
+ done
+ sed -n -e "${prev},\$p" $slave
+} > $slave.tmp && mv $slave.tmp $slave
+done
+
+osc service localrun format_spec_file
+
+
+# create import_failed.map from package definitions
+
+MAPFILE=import_failed.map
+function new_map_line () {
+ if [ -z "$1" -o -z "$2" ]; then
+ return
+ fi
+ if [ "$1" == "python3-base" ]; then
+ return
+ fi
+ echo "$1:$2" >> $MAPFILE.tmp
+}
+
+for spec in *.spec; do
+ basename=${spec%.spec}
+ package=
+ modules=
+ while read line; do
+ case $line in
+ "%files -n "*)
+ new_map_line $package "$modules"
+ package=${line#"%files -n "}
+ modules=
+ ;;
+ "%files "*)
+ new_map_line $package "$modules"
+ package=$basename-${line#"%files "}
+ modules=
+ ;;
+ "%files")
+ new_map_line $package "$modules"
+ package=$basename
+ modules=
+ ;;
+ "%{sitedir}/"*)
+ word=${line#"%{sitedir}/"}
+ if ! echo $word | grep -q /; then
+ modules="$modules $word"
+ fi
+ ;;
+ "%{dynlib "*"}")
+ word=${line#"%{dynlib "}
+ word=${word%"}"}
+ modules="$modules $word"
+ ;;
+ esac
+ done < $spec
+ new_map_line $package "$modules"
+done
+
+mv $MAPFILE.tmp $MAPFILE
+
--- /dev/null
+#
+# spec file for package python3-base
+#
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
+#
+
+
+# !!!!
+# this is the master spec file, but changes should be submitted
+# against python3, not python3-base
+#
+# see PACKAGING-NOTES for details
+# !!!!
+
+Name: python3-base
+BuildRequires: automake
+BuildRequires: fdupes
+#BuildRequires: libbz2-devel
+BuildRequires: lzma-devel
+BuildRequires: pkg-config
+BuildRequires: timezone
+BuildRequires: xz
+BuildRequires: zlib-devel
+Url: http://www.python.org/
+Summary: Python 3 Interpreter
+License: Python-2.0
+Group: Development/Languages/Python
+Version: 3.4.4
+Release: 0
+%define tarversion %{version}
+%define tarname Python-%{tarversion}
+
+# python 3.1 didn't have a separate python-base, so it is wrongly
+# not a conflict to have python3-3.1 and python3-base > 3.1
+Obsoletes: python3 < 3.2
+# no Provides, because python3 is obviously provided by package python3
+# python3 3.4 provides asyncio
+Provides: python3-asyncio = %{version}
+Obsoletes: python3-asyncio < %{version}
+
+Source0: http://www.python.org/ftp/python/%{version}/%{tarname}.tar.xz
+#Source1: http://www.python.org/ftp/python/%{version}/%{tarname}.tar.xz.asc
+Source3: baselibs.conf
+Source5: python3start
+Source6: python3.sh
+Source7: python3.csh
+Source8: macros.python3.py
+Source9: import_failed.py
+Source10: import_failed.map
+
+# The following files are not used in the build.
+# They are listed here to work around missing functionality in rpmbuild,
+# which would otherwise exclude them from distributed src.rpm files.
+Source100: PACKAGING-NOTES
+Source101: python3-rpmlintrc
+Source102: pre_checkin.sh
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
+### COMMON-DEF-BEGIN ###
+
+# the versions are autogenerated from pre_checkin.sh
+# based on the current source tarball
+%define python_version 3.4
+
+%define python_version_abitag 34
+%define python_version_soname 3_4
+
+%define sitedir %{_libdir}/python%{python_version}
+
+# three possible ABI kinds: m - pymalloc, d - debug build
+# see PEP 3149
+%define abi_kind m
+# python ABI version - used in some file names
+%define python_abi %{python_version}%{abi_kind}
+# soname ABI tag defined in PEP 3149
+%define abi_tag %{python_version_abitag}%{abi_kind}
+
+%define so_version %{python_version_soname}%{abi_kind}1_0
+
+# rpm and python have different ideas about what is an arch-dependent name, so:
+%if %{__isa_name} == ppc
+%define archname %(echo %{_arch} | sed s/ppc/powerpc/)
+%else
+%define archname %{_arch}
+%endif
+# our arm has Hardware-Floatingpoint
+%if %{_arch} == arm
+%define armsuffix hf
+%endif
+
+# pyexpat.cpython-35m-x86_64-linux-gnu
+# pyexpat.cpython-35m-powerpc64le-linux-gnu
+# pyexpat.cpython-35m-armv7-linux-gnueabihf
+# %define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}.so
+%define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}.so
+### COMMON-DEF-END ###
+
+%description
+Python is an interpreted, object-oriented programming language, and is
+often compared to Tcl, Perl, Scheme, or Java. You can find an overview
+of Python in the documentation and tutorials included in the python-doc
+(HTML) or python-doc-pdf (PDF) packages.
+
+If you want to install third party modules using distutils, you need to
+install python-devel package.
+
+
+%package -n python3-tools
+Requires: %{name} = %{version}
+Summary: Python Utility and Demonstration Scripts
+Group: Development/Languages/Python
+Obsoletes: python3-demo < %{version}
+Provides: python3-demo = %{version}
+
+%description -n python3-tools
+A number of scripts that are useful for building, testing or extending Python,
+and a set of demonstration programs.
+
+
+%package -n python3-idle
+Requires: %{name} = %{version}
+Requires: python3-tk
+Summary: An Integrated Development Environment for Python
+Group: Development/Languages/Python
+
+%description -n python3-idle
+IDLE is a Tkinter based integrated development environment for Python.
+It features a multi-window text editor with multiple undo, Python
+colorizing, and many other things, as well as a Python shell window and
+a debugger.
+
+
+%package -n python3-devel
+Requires: %{name} = %{version}
+Provides: python3-2to3 = %{version}
+Obsoletes: python3-2to3 < %{version}
+Summary: Include Files and Libraries Mandatory for Building Python Modules
+Group: Development/Languages/Python
+
+%description -n python3-devel
+The Python programming language's interpreter can be extended with
+dynamically loaded extensions and can be embedded in other programs.
+
+This package contains header files, a static library, and development
+tools for building Python modules, extending the Python interpreter or
+embedding Python in applications.
+
+This also includes the Python distutils, which were in the Python
+package up to version 2.2.2.
+
+
+%package -n python3-testsuite
+Requires: python3 = %{version}
+Requires: python3-tk = %{version}
+Summary: Unit tests for Python and its standard library
+Group: Development/Languages/Python
+
+%description -n python3-testsuite
+Unit tests that are useful for verifying integrity and functionality
+of the installed Python interpreter and standard library.
+They are a documented part of stdlib, as a module 'test'.
+
+
+%package -n libpython%{so_version}
+Summary: Python Interpreter shared library
+Group: Development/Languages/Python
+
+%description -n libpython%{so_version}
+Python is an interpreted, object-oriented programming language, and is
+often compared to Tcl, Perl, Scheme, or Java. You can find an overview
+of Python in the documentation and tutorials included in the python-doc
+(HTML) or python-doc-pdf (PDF) packages.
+
+This package contains libpython3.2 shared library for embedding in
+other applications.
+
+%package -n python3-dummy
+Summary: dummy package
+Group: Development/Languages/Python
+
+%description -n python3-dummy
+dummy package
+
+
+%prep
+%setup -q -n %{tarname}
+
+### COMMON-PREP-BEGIN ###
+
+# drop Autoconf version requirement
+sed -i 's/^AC_PREREQ/dnl AC_PREREQ/' configure.ac
+
+# fix shebangs - convert /usr/local/bin/python and /usr/bin/env/python to /usr/bin/python3
+for dir in Lib Tools; do
+ # find *.py, filter to files that contain bad shebangs
+ find $dir -name '*.py' -type f -print0 \
+ | xargs -0 grep -lE '^#! *(/usr/.*bin/(env +)?)?python' \
+ | xargs sed -r -i -e '1s@^#![[:space:]]*(/usr/(local/)?bin/(env +)?)?python([0-9]+(\.[0-9]+)?)?@#!/usr/bin/python3@'
+done
+
+### COMMON-PREP-END ###
+
+%build
+# use rpm_opt_flags
+export OPT="%{optflags} -DOPENSSL_LOAD_CONF"
+
+touch -r %{S:0} Makefile.pre.in
+
+autoreconf -fi
+# prevent make from trying to rebuild asdl stuff, which requires existing python installation
+touch Parser/asdl* Python/Python-ast.c Include/Python-ast.h
+# prevent makeopcodetargets
+touch -r Python/opcode_targets.h Lib/opcode.py Python/makeopcodetargets.py
+
+%if 0%{?sles_version}
+sed -e 's/-fprofile-correction//' -i Makefile.pre.in
+%endif
+
+./configure \
+ --prefix=%{_prefix} \
+ --libdir=%{_libdir} \
+ --mandir=%{_mandir} \
+ --docdir=%{_docdir}/python \
+ --enable-ipv6 \
+ --with-fpectl \
+ --enable-shared \
+ --with-ensurepip=no \
+ --enable-loadable-sqlite-extensions
+
+%if 0%{?do_profiling}
+target=profile-opt
+%else
+target=all
+%endif
+LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH \
+ make %{?_smp_mflags} BASE_LIB=%{_lib} $target
+
+%check
+# SUSE's gdb breaks test_gdb by producing spurious output (zypper suggestions)
+# test_socket fails because of name resolution failure, that is expected
+EXCLUDE="test_gdb test_socket"
+%ifarch %arm
+# test_multiprocessing_forkserver is racy
+EXCLUDE="$EXCLUDE test_multiprocessing_forkserver"
+%endif
+%ifarch ppc ppc64 ppc64le
+# exclue test_faulthandler due to bnc#831629
+EXCLUDE="$EXCLUDE test_faulthandler"
+%endif
+# some tests break in QEMU
+%if 0%{?qemu_user_space_build} > 0
+EXCLUDE="$EXCLUDE test_multiprocessing_fork test_multiprocessing_forkserver test_multiprocessing_main_handling test_multiprocessing_spawn test_threading test_threadedtempfile test_io test_posix test_ioctl test_mmap test_openpty test_pty test_monotonic_settime test_clock_settime test_time test_subprocess test_asyncore test_asyncio test_send_at_certain_offset test_send_whole_file test_os test_faulthandler"
+# qemu bug (siginterrupt handling)
+EXCLUDE="$EXCLUDE test_signal"
+%endif
+
+# on x86_64, SLE_11_SP2 only, extreme gamma function values (close to negative
+# integers) fail. Is probably a bug/imperfection in -lm
+# disabling this for all SLE, unless someone knows how to test for SP level?
+%ifarch x86_64
+%if 0%{?sles_version} == 11
+EXCLUDE="$EXCLUDE test_math"
+%endif
+%endif
+
+# This test (part of test_uuid) requires real network interfaces
+# so that ifconfig output has "HWaddr <something>". Some kvm instances
+# done have any such interface breaking teh uuid module.
+EXCLUDE="$EXCLUDE test_uuid"
+
+# Exclude test_tools, test_venv and test_ensurepip which indirectly require ssl
+EXCLUDE="$EXCLUDE test_tools test_venv test_ensurepip"
+
+# Limit virtual memory to avoid spurious failures
+if test $(ulimit -v) = unlimited || test $(ulimit -v) -gt 10000000; then
+ ulimit -v 10000000 || :
+fi
+
+make test TESTOPTS="-u none -x $EXCLUDE"
+# use network, be verbose:
+#make test TESTOPTS="-l -u network -v"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make \
+ OPT="%{optflags} -fPIC" \
+ DESTDIR=$RPM_BUILD_ROOT \
+ install
+
+# remove .a
+find ${RPM_BUILD_ROOT} -name "*.a" -exec rm {} ";"
+
+# install "site-packages" and __pycache__ for third parties
+install -d -m 755 ${RPM_BUILD_ROOT}%{sitedir}/site-packages
+install -d -m 755 ${RPM_BUILD_ROOT}%{sitedir}/site-packages/__pycache__
+# and their 32bit counterparts explicitly
+mkdir -p ${RPM_BUILD_ROOT}/usr/lib/python%{python_version}/site-packages/__pycache__
+
+# cleanup parts that don't belong
+#for dir in curses dbm ensurepip sqlite3 tkinter xml xmlrpc; do
+# find $RPM_BUILD_ROOT%{sitedir}/$dir/* -maxdepth 0 -name "test" -o -exec rm -rf {} ";"
+#done
+rm $RPM_BUILD_ROOT%{dynlib pyexpat}
+
+# overwrite the copied binary with a link
+ln -sf python%{python_version} ${RPM_BUILD_ROOT}%{_bindir}/python3
+
+# replace duplicate .pyo/.pyc with hardlinks
+%fdupes $RPM_BUILD_ROOT/%{sitedir}
+
+# documentation
+export PDOCS=${RPM_BUILD_ROOT}%{_docdir}/%{name}
+install -d -m 755 $PDOCS
+#install -c -m 644 %{S:4} $PDOCS/
+install -c -m 644 LICENSE $PDOCS/
+install -c -m 644 README $PDOCS/
+
+# tools
+for x in `find Tools/ \( -not -name Makefile \) -print | sort` ; do
+ test -d $x && ( install -c -m 755 -d $PDOCS/$x ) \
+ || ( install -c -m 644 $x $PDOCS/$x )
+done
+# clean up the bat files
+find $PDOCS -name "*.bat" -exec rm {} ";"
+
+# install devel files to /config
+#cp Makefile Makefile.pre.in Makefile.pre $RPM_BUILD_ROOT%{sitedir}/config-%{python_abi}/
+
+# move idle config into /etc
+install -d -m 755 ${RPM_BUILD_ROOT}/etc/idle3
+(
+ cd ${RPM_BUILD_ROOT}/%{sitedir}/idlelib/
+ for file in *.def ; do
+ mv $file ${RPM_BUILD_ROOT}/etc/idle3/
+ ln -sf /etc/idle3/$file ${RPM_BUILD_ROOT}/%{sitedir}/idlelib/
+ done
+)
+
+# startup scripts
+mkdir -p $RPM_BUILD_ROOT/etc/profile.d
+install -m 644 %{S:5} $RPM_BUILD_ROOT/etc # python3start
+install -m 644 %{S:6} %{S:7} $RPM_BUILD_ROOT/etc/profile.d # python3.sh, python3.csh
+
+# RPM macros
+mkdir -p $RPM_BUILD_ROOT/etc/rpm
+LD_LIBRARY_PATH=. ./python %{S:8} > $RPM_BUILD_ROOT/etc/rpm/macros.python3 # macros.python3.py
+
+# import_failed hooks
+FAILDIR=$RPM_BUILD_ROOT/%{sitedir}/_import_failed
+mkdir $FAILDIR
+install -m 644 %{S:9} %{S:10} $FAILDIR # import_failed.*
+LD_LIBRARY_PATH=. ./python -c "from py_compile import compile; compile('$FAILDIR/import_failed.py', dfile='%{sitedir}/_import_failed/import_failed.py')"
+LD_LIBRARY_PATH=. ./python -O -c "from py_compile import compile; compile('$FAILDIR/import_failed.py', dfile='%{sitedir}/_import_failed/import_failed.py')"
+(
+ cd $FAILDIR
+ while read package modules; do
+ for module in $modules; do
+ ln import_failed.py $module.py
+ pushd __pycache__
+ for i in import_failed*; do
+ ln $i "$module${i#import_failed}"
+ done
+ popd
+ done
+ done < %{S:10}
+)
+echo %{sitedir}/_import_failed > $RPM_BUILD_ROOT/%{sitedir}/site-packages/zzzz-import-failed-hooks.pth
+
+%post -n libpython%{so_version} -p /sbin/ldconfig
+
+%postun -n libpython%{so_version} -p /sbin/ldconfig
+
+%files -n libpython%{so_version}
+%defattr(644, root,root)
+%{_libdir}/libpython%{python_abi}.so.*
+
+%files -n python3-tools
+%defattr(644, root, root, 755)
+%{sitedir}/turtledemo
+%doc %{_docdir}/%{name}/Tools
+
+%files -n python3-idle
+%defattr(644, root, root, 755)
+%{sitedir}/idlelib
+%dir /etc/idle3
+%config /etc/idle3/*
+%doc Lib/idlelib/NEWS.txt
+%doc Lib/idlelib/README.txt
+%doc Lib/idlelib/TODO.txt
+%doc Lib/idlelib/extend.txt
+%doc Lib/idlelib/ChangeLog
+%{_bindir}/idle3
+%attr(755, root, root) %{_bindir}/idle%{python_version}
+
+%files -n python3-devel
+%defattr(644, root, root, 755)
+%{_libdir}/libpython%{python_abi}.so
+%{_libdir}/libpython3.so
+%{_libdir}/pkgconfig/*
+%{_prefix}/include/python%{python_abi}
+%exclude %{_prefix}/include/python%{python_abi}/pyconfig.h
+%defattr(755, root, root)
+%{_bindir}/python%{python_abi}-config
+%{_bindir}/python%{python_version}-config
+%{_bindir}/python3-config
+%{_bindir}/2to3
+%{_bindir}/2to3-%{python_version}
+
+%files -n python3-testsuite
+%defattr(644, root, root, 755)
+%{sitedir}/test
+%{sitedir}/*/test
+%{dynlib _ctypes_test}
+%{dynlib _testbuffer}
+%{dynlib _testcapi}
+%{dynlib _testimportmultiple}
+#%{dynlib _testmultiphase}
+%{dynlib xxlimited}
+# workaround for missing packages
+%dir %{sitedir}/sqlite3
+%dir %{sitedir}/tkinter
+
+%files
+%defattr(644, root, root, 755)
+# profile files
+%config /etc/python3start
+%config /etc/profile.d/python3.*
+# docs
+%dir %{_docdir}/%{name}
+%doc %{_docdir}/%{name}/README
+%doc %{_docdir}/%{name}/LICENSE
+%doc %{_mandir}/man1/python3.1*
+%doc %{_mandir}/man1/python%{python_version}.1*
+# license text, not a doc because the code can use it at run-time
+%{sitedir}/LICENSE.txt
+# makefile etc
+%{sitedir}/config-%{python_abi}
+/etc/rpm/macros.python3
+%{_prefix}/include/python%{python_abi}/pyconfig.h
+# binary parts
+%dir %{sitedir}/lib-dynload
+#%{sitedir}/lib-dynload/Python-%{tarversion}-py%{python_version}.egg-info
+%{dynlib array}
+%{dynlib audioop}
+%{dynlib binascii}
+%{dynlib _bisect}
+#%{dynlib _bz2}
+%{dynlib cmath}
+%{dynlib _codecs_cn}
+%{dynlib _codecs_hk}
+%{dynlib _codecs_iso2022}
+%{dynlib _codecs_jp}
+%{dynlib _codecs_kr}
+%{dynlib _codecs_tw}
+%{dynlib _crypt}
+%{dynlib _csv}
+%{dynlib _ctypes}
+%{dynlib _datetime}
+%{dynlib _decimal}
+%{dynlib _elementtree}
+%{dynlib fcntl}
+%{dynlib grp}
+%{dynlib _heapq}
+%{dynlib _json}
+%{dynlib _lsprof}
+%{dynlib _lzma}
+%{dynlib math}
+%{dynlib mmap}
+%{dynlib _multibytecodec}
+%{dynlib _multiprocessing}
+%{dynlib nis}
+%{dynlib ossaudiodev}
+%{dynlib _opcode}
+%{dynlib parser}
+%{dynlib _pickle}
+%{dynlib _posixsubprocess}
+%{dynlib _random}
+%{dynlib resource}
+%{dynlib select}
+%{dynlib _socket}
+%{dynlib spwd}
+%{dynlib _struct}
+%{dynlib syslog}
+%{dynlib termios}
+%{dynlib unicodedata}
+%{dynlib zlib}
+# hashlib fallback modules
+%{dynlib _md5}
+%{dynlib _sha1}
+%{dynlib _sha256}
+%{dynlib _sha512}
+
+# python parts
+#%dir /usr/lib/python%{python_version}
+#%dir /usr/lib/python%{python_version}/site-packages
+#%dir /usr/lib/python%{python_version}/site-packages/__pycache__
+%dir %{sitedir}
+%dir %{sitedir}/site-packages
+%dir %{sitedir}/site-packages/__pycache__
+%exclude %{sitedir}/*/test
+%{sitedir}/*.py
+%{sitedir}/asyncio
+%{sitedir}/ctypes
+%{sitedir}/collections
+%{sitedir}/concurrent
+%{sitedir}/distutils
+%{sitedir}/email
+%{sitedir}/encodings
+%{sitedir}/html
+%{sitedir}/http
+%{sitedir}/importlib
+%{sitedir}/json
+%{sitedir}/lib2to3
+%{sitedir}/logging
+%{sitedir}/multiprocessing
+%{sitedir}/plat-*
+%{sitedir}/pydoc_data
+%{sitedir}/unittest
+%{sitedir}/urllib
+%{sitedir}/venv
+%{sitedir}/wsgiref
+%{sitedir}/site-packages/README
+%{sitedir}/__pycache__
+# import-failed hooks
+%{sitedir}/_import_failed
+%{sitedir}/site-packages/zzzz-import-failed-hooks.pth
+# symlinks
+%{_bindir}/pyvenv
+%{_bindir}/python3
+%{_bindir}/pydoc3
+
+# === add additional ===
+%exclude %{sitedir}/curses
+%exclude %{sitedir}/curses/__pycache__
+%exclude %{sitedir}/dbm
+%exclude %{sitedir}/dbm/__pycache__
+%exclude %{sitedir}/ensurepip
+%exclude %{sitedir}/ensurepip/__pycache__
+%exclude %{sitedir}/sqlite3
+%exclude %{sitedir}/sqlite3/__pycache__
+%exclude %{sitedir}/tkinter
+%exclude %{sitedir}/tkinter/__pycache__
+%exclude %{sitedir}/xml
+%exclude %{sitedir}/xml/__pycache__
+%exclude %{sitedir}/xml/dom
+%exclude %{sitedir}/xml/dom/__pycache__
+%exclude %{sitedir}/xml/etree
+%exclude %{sitedir}/xml/etree/__pycache__
+%exclude %{sitedir}/xml/parsers
+%exclude %{sitedir}/xml/parsers/__pycache__
+%exclude %{sitedir}/xml/sax
+%exclude %{sitedir}/xml/sax/__pycache__
+%exclude %{sitedir}/xmlrpc
+%exclude %{sitedir}/xmlrpc/__pycache__
+
+# executables
+%attr(755, root, root) %{_bindir}/pydoc%{python_version}
+%attr(755, root, root) %{_bindir}/python%{python_abi}
+%attr(755, root, root) %{_bindir}/python%{python_version}
+%attr(755, root, root) %{_bindir}/pyvenv-%{python_version}
+
+%files -n python3-dummy
+%defattr(644, root, root, 755)
+%{dynlib time}
+
+%changelog
+
--- /dev/null
+# RPM macros are not configuration:
+addFilter("non-conffile-in-etc /etc/rpm/macros.python3")
+# Obviously, these files are meant to be empty:
+addFilter("zero-length /usr/lib64/python3.3/test/nullcert.pem")
+addFilter("zero-length /usr/lib64/python3.3/test/namespace_pkgs/module_and_namespace_package/a_test/empty")
+
+addFilter("W: zero-length");
+addFilter("W: strange-permission");
+addFilter("W: python-bytecode-inconsistent-mtime");
+addFilter("W: package-with-huge-docs");
+addFilter("W: obsolete-not-provided");
+addFilter("W: macro-in-comment");
+addFilter("W: non-executable-script");
+addFilter("W: incoherent-version-dependency-on");
+addFilter("W: file-contains-date-and-time");
+
+addFilter("E: license-file-in-docs");
+addFilter("E: non-standard-group");
--- /dev/null
+# add python startup script for interactive sessions
+setenv PYTHONSTARTUP /etc/pythonstart
--- /dev/null
+# add python startup script for interactive sessions
+export PYTHONSTARTUP=/etc/pythonstart
--- /dev/null
+#
+# spec file for package python3
+#
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
+#
+
+
+Name: python3
+BuildRequires: automake
+#BuildRequires: db-devel
+BuildRequires: fdupes
+BuildRequires: gcc-c++
+BuildRequires: gdbm-devel
+BuildRequires: gettext-tools
+BuildRequires: intltool
+#BuildRequires: libbz2-devel
+BuildRequires: libexpat-devel
+BuildRequires: libffi-devel
+BuildRequires: libopenssl-devel
+BuildRequires: lzma-devel
+BuildRequires: ncurses-devel
+BuildRequires: readline-devel
+BuildRequires: sqlite-devel
+#BuildRequires: tk-devel
+BuildRequires: xz
+#BuildRequires: pkgconfig(x11)
+Url: http://www.python.org/
+Summary: Python 3 Interpreter
+License: Python-2.0
+Group: Development/Languages/Python
+Version: 3.4.4
+Release: 0
+%define tarversion %{version}
+%define tarname Python-%{tarversion}
+
+Requires: python3-base = %{version}
+Recommends: python3-pip
+Suggests: python3-curses
+Suggests: python3-idlelib
+
+#Suggests: python3-tk
+#Suggests: python3-dbm
+
+Source0: http://www.python.org/ftp/python/%{version}/%{tarname}.tar.xz
+#Source11: testfiles.tar.bz2
+# issues with copyrighted Unicode testing files
+
+# do not add patches here, please edit python3-base.spec instead
+# and run pre_checkin.sh
+#
+# see PACKAGING-NOTES for details
+
+### COMMON-PATCH-BEGIN ###
+### COMMON-PATCH-END ###
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
+# do not add defs here, please edit python3-base.spec instead
+# and run pre_checkin.sh
+#
+# see PACKAGING-NOTES for details
+
+### COMMON-DEF-BEGIN ###
+
+# the versions are autogenerated from pre_checkin.sh
+# based on the current source tarball
+%define python_version 3.4
+
+%define python_version_abitag 34
+%define python_version_soname 3_4
+
+%define sitedir %{_libdir}/python%{python_version}
+
+# three possible ABI kinds: m - pymalloc, d - debug build
+# see PEP 3149
+%define abi_kind m
+# python ABI version - used in some file names
+%define python_abi %{python_version}%{abi_kind}
+# soname ABI tag defined in PEP 3149
+%define abi_tag %{python_version_abitag}%{abi_kind}
+
+%define so_version %{python_version_soname}%{abi_kind}1_0
+
+# rpm and python have different ideas about what is an arch-dependent name, so:
+%if %{__isa_name} == ppc
+%define archname %(echo %{_arch} | sed s/ppc/powerpc/)
+%else
+%define archname %{_arch}
+%endif
+# our arm has Hardware-Floatingpoint
+%if %{_arch} == arm
+%define armsuffix hf
+%endif
+
+# pyexpat.cpython-35m-x86_64-linux-gnu
+# pyexpat.cpython-35m-powerpc64le-linux-gnu
+# pyexpat.cpython-35m-armv7-linux-gnueabihf
+#%define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}.so
+%define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}.so
+### COMMON-DEF-END ###
+
+# some compatibility Provides
+#Provides: python = %{python_version}
+Provides: python3 = %{python_version}
+
+Provides: python3-xml = %{version}
+Obsoletes: python3-xml < %{version}
+
+%description
+Python 3 is modern interpreted, object-oriented programming language,
+often compared to Tcl, Perl, Scheme, or Java. You can find an overview
+of Python in the documentation and tutorials included in the python-doc
+(HTML) or python-doc-pdf (PDF) packages.
+
+If you want to install third party modules using distutils, you need to
+install python-devel package.
+
+
+%package curses
+Requires: %{name} = %{version}
+Summary: Python Interface to the (N)Curses Library
+Group: Development/Libraries/Python
+
+%description curses
+An easy to use interface to the (n)curses CUI library. CUI stands for
+Console User Interface.
+
+
+%prep
+%setup -q -n %{tarname}
+### COMMON-PREP-BEGIN ###
+
+# drop Autoconf version requirement
+sed -i 's/^AC_PREREQ/dnl AC_PREREQ/' configure.ac
+
+# fix shebangs - convert /usr/local/bin/python and /usr/bin/env/python to /usr/bin/python3
+for dir in Lib Tools; do
+ # find *.py, filter to files that contain bad shebangs
+ find $dir -name '*.py' -type f -print0 \
+ | xargs -0 grep -lE '^#! *(/usr/.*bin/(env +)?)?python' \
+ | xargs sed -r -i -e '1s@^#![[:space:]]*(/usr/(local/)?bin/(env +)?)?python([0-9]+(\.[0-9]+)?)?@#!/usr/bin/python3@'
+done
+
+### COMMON-PREP-END ###
+
+%build
+export SUSE_ASNEEDED=0
+export OPT="%{optflags} -DOPENSSL_LOAD_CONF"
+
+autoreconf -f -i .
+# prevent make from trying to rebuild asdl stuff, which requires existing
+# python installation
+touch Parser/asdl* Python/Python-ast.c Include/Python-ast.h Objects/typeslots.inc
+
+./configure \
+ --prefix=%{_prefix} \
+ --libdir=%{_libdir} \
+ --mandir=%{_mandir} \
+ --docdir=%{_docdir}/python \
+ --enable-ipv6 \
+ --with-fpectl \
+ --enable-shared \
+ --with-system-ffi \
+ --with-system-expat \
+ --with-ensurepip=no \
+ --enable-loadable-sqlite-extensions
+
+make %{?_smp_mflags} BASE_LIB=%{_lib}
+
+%check
+# Limit virtual memory to avoid spurious failures
+if test $(ulimit -v) = unlimited || test $(ulimit -v) -gt 10000000; then
+ ulimit -v 10000000 || :
+fi
+
+# only test the parts skipped in python3-base
+TESTS="test_curses test_dbm_gnu test_dbm_ndbm test_idle \
+ test_readline test_sqlite test_ssl test_tcl \
+ test_ttk_textonly"
+# redo tests with SSL parts
+TESTS="$TESTS test_asyncio test_hashlib test_urllib test_httplib \
+ test_imaplib test_ftplib test_urllib2_localnet test_nntplib"
+
+# ensurepip-based tests
+TESTS="$TESTS test_venv test_ensurepip test_tools"
+
+make test TESTOPTS="-u curses $TESTS"
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make \
+ OPT="%{optflags} -fPIC" \
+ DESTDIR=$RPM_BUILD_ROOT \
+ install
+
+# clean out stuff that is in python-base and subpackages
+
+rm $RPM_BUILD_ROOT%{_bindir}/*
+rm $RPM_BUILD_ROOT%{_libdir}/lib*
+rm -r $RPM_BUILD_ROOT%{_libdir}/pkgconfig
+rm -r $RPM_BUILD_ROOT%{_mandir}/*
+rm -r $RPM_BUILD_ROOT%{_includedir}/*
+
+rm -rf $RPM_BUILD_ROOT%{sitedir}/config*
+find $RPM_BUILD_ROOT%{sitedir} -name "*.egg-info" -exec rm -f {} ";"
+rm -rf $RPM_BUILD_ROOT%{sitedir}/__pycache__
+rm -rf $RPM_BUILD_ROOT%{sitedir}/site-packages
+rm $RPM_BUILD_ROOT%{sitedir}/*.*
+
+for module in \
+ asyncio ctypes collections concurrent distutils email encodings \
+ html http \
+ importlib json logging multiprocessing plat-* pydoc_data unittest \
+ urllib venv wsgiref lib2to3 test idlelib turtledemo
+do
+ rm -rf $RPM_BUILD_ROOT%{sitedir}/$module
+done
+
+for library in \
+ array audioop binascii _bisect _bz2 cmath _codecs_* _crypt _csv \
+ _ctypes _datetime _decimal _elementtree fcntl grp _heapq _json _lsprof \
+ _lzma math mmap _multibytecodec _multiprocessing nis _opcode ossaudiodev \
+ parser _pickle _posixsubprocess _random resource select _socket spwd \
+ _struct syslog termios _testbuffer _testimportmultiple _testmultiphase \
+ unicodedata zlib _ctypes_test _testcapi xxlimited \
+ _md5 _sha1 _sha256 _sha512
+do
+ eval rm -f "$RPM_BUILD_ROOT%{sitedir}/lib-dynload/$library.*"
+done
+
+rm -rf $RPM_BUILD_ROOT%{sitedir}/tkinter
+rm -rf $RPM_BUILD_ROOT%{sitedir}/dbm
+rm -f $RPM_BUILD_ROOT%{sitedir}/lib-dynload/_gdbm.*
+
+%fdupes $RPM_BUILD_ROOT/%{_libdir}/python%{python_version}
+
+#%files tk
+#%defattr(644, root, root, 755)
+#%{sitedir}/tkinter
+#%exclude %{sitedir}/tkinter/test
+#%{dynlib _tkinter}
+
+%files curses
+%defattr(644, root, root, 755)
+%{sitedir}/curses
+%{dynlib _curses}
+%{dynlib _curses_panel}
+
+#%files dbm
+#%defattr(644, root, root, 755)
+#%{sitedir}/dbm
+#%{dynlib _dbm}
+#%{dynlib _gdbm}
+
+%files
+%defattr(644, root, root, 755)
+%dir %{sitedir}
+%dir %{sitedir}/lib-dynload
+%{sitedir}/ensurepip
+%{sitedir}/sqlite3
+%exclude %{sitedir}/sqlite3/test
+%{sitedir}/xml
+%{sitedir}/xmlrpc
+%{dynlib _hashlib}
+%{dynlib pyexpat}
+%{dynlib readline}
+%{dynlib _sqlite3}
+%{dynlib _ssl}
+%{dynlib time}
+
+%changelog
--- /dev/null
+# startup script for python to enable saving of interpreter history and
+# enabling name completion
+
+# import needed modules
+import atexit
+import os
+import readline
+import rlcompleter
+
+# where is history saved
+historyPath = os.path.expanduser("~/.py3history")
+
+# handler for saving history
+def save_history(historyPath=historyPath):
+ import readline
+ readline.write_history_file(historyPath)
+
+# read history, if it exists
+if os.path.exists(historyPath):
+ readline.set_history_length(10000)
+ readline.read_history_file(historyPath)
+
+# register saving handler
+atexit.register(save_history)
+
+# enable completion
+readline.parse_and_bind('tab: complete')
+
+# cleanup
+del os, atexit, readline, rlcompleter, save_history, historyPath
curses_defines = []
curses_includes = []
panel_library = 'panel'
- if curses_library == 'ncursesw':
+ if curses_library == 'ncurses':
+ curses_includes.append('/usr/include/ncurses')
+ elif curses_library == 'ncursesw':
curses_defines.append(('HAVE_NCURSESW', '1'))
if not cross_compiling:
curses_includes.append('/usr/include/ncursesw')