From 98bb1d58b947ae91a6e3c2a4c5da5a9c60f1f2f9 Mon Sep 17 00:00:00 2001 From: MyoungJune Park Date: Thu, 4 Feb 2016 10:31:57 +0900 Subject: [PATCH] Rebase for Python3 3.6.3 Change-Id: I4eddd7ac60ba61cc5007ecf8aa0e75f431da00f2 Signed-off-by: DongHun Kwak --- Makefile.pre.in | 24 +- Modules/getpath.c | 12 +- Objects/obmalloc.c | 25 +- configure | 7 +- configure.ac | 7 +- packaging/PACKAGING-NOTES | 58 ++++ packaging/baselibs.conf | 3 + packaging/import_failed.map | 7 + packaging/import_failed.py | 26 ++ packaging/macros.python3.py | 33 ++ packaging/pre_checkin.sh | 122 ++++++++ packaging/python3-base.spec | 580 ++++++++++++++++++++++++++++++++++++ packaging/python3-rpmlintrc | 18 ++ packaging/python3.csh | 2 + packaging/python3.sh | 2 + packaging/python3.spec | 282 ++++++++++++++++++ packaging/python3start | 30 ++ setup.py | 4 +- 18 files changed, 1206 insertions(+), 36 deletions(-) create mode 100644 packaging/PACKAGING-NOTES create mode 100644 packaging/baselibs.conf create mode 100644 packaging/import_failed.map create mode 100644 packaging/import_failed.py create mode 100644 packaging/macros.python3.py create mode 100755 packaging/pre_checkin.sh create mode 100644 packaging/python3-base.spec create mode 100644 packaging/python3-rpmlintrc create mode 100755 packaging/python3.csh create mode 100755 packaging/python3.sh create mode 100644 packaging/python3.spec create mode 100644 packaging/python3start diff --git a/Makefile.pre.in b/Makefile.pre.in index 6cb0c63e..eb07b110 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -133,7 +133,7 @@ LIBDIR= @libdir@ MANDIR= @mandir@ INCLUDEDIR= @includedir@ CONFINCLUDEDIR= $(exec_prefix)/include -SCRIPTDIR= $(prefix)/lib +SCRIPTDIR= @libdir@ ABIFLAGS= @ABIFLAGS@ # Detailed destination directories @@ -141,6 +141,7 @@ BINLIBDEST= $(LIBDIR)/python$(VERSION) 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@ @@ -239,10 +240,10 @@ HOST_GNU_TYPE= @host@ 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 @@ -730,6 +731,7 @@ Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile -DEXEC_PREFIX='"$(exec_prefix)"' \ -DVERSION='"$(VERSION)"' \ -DVPATH='"$(VPATH)"' \ + -DBASE_LIB='"$(BASE_LIB)"' \ -o $@ $(srcdir)/Modules/getpath.c Programs/python.o: $(srcdir)/Programs/python.c @@ -1499,12 +1501,12 @@ frameworkinstallstructure: $(LDLIBRARY) # 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: diff --git a/Modules/getpath.c b/Modules/getpath.c index 0f916436..607619fe 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -109,6 +109,10 @@ #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]; @@ -491,10 +495,10 @@ calculate_path(void) 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( diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 32e7ecbe..efc4911d 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -29,14 +29,20 @@ static void _PyMem_DebugCheckAddress(char api_id, const void *p); #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 @@ -506,8 +512,10 @@ PyObject_Free(void *ptr) #ifdef WITH_PYMALLOC +#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD) #ifdef WITH_VALGRIND #include +#endif /* If we're using GCC, use __builtin_expect() to reduce overhead of the valgrind checks */ @@ -1227,10 +1235,7 @@ _PyObject_Alloc(int use_calloc, void *ctx, size_t nelem, size_t elsize) _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)) @@ -1458,7 +1463,7 @@ _PyObject_Free(void *ctx, void *p) _Py_AllocatedBlocks--; -#ifdef WITH_VALGRIND +#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD) if (UNLIKELY(running_on_valgrind > 0)) goto redirect; #endif @@ -1658,7 +1663,7 @@ _PyObject_Free(void *ctx, void *p) return; } -#ifdef WITH_VALGRIND +#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD) redirect: #endif /* We didn't allocate this address. */ @@ -1680,7 +1685,7 @@ _PyObject_Realloc(void *ctx, void *p, size_t nbytes) 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; @@ -1713,7 +1718,7 @@ _PyObject_Realloc(void *ctx, void *p, size_t nbytes) } return bp; } -#ifdef WITH_VALGRIND +#if defined(WITH_VALGRIND) || defined(SANITIZED_BUILD) redirect: #endif /* We're not managing this block. If nbytes <= diff --git a/configure b/configure index ed305a89..46e34617 100755 --- a/configure +++ b/configure @@ -15005,11 +15005,8 @@ LDVERSION='$(VERSION)$(ABIFLAGS)' $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 diff --git a/configure.ac b/configure.ac index e400fa18..1bcf67ca 100644 --- a/configure.ac +++ b/configure.ac @@ -4656,11 +4656,8 @@ AC_MSG_RESULT($LDVERSION) 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 diff --git a/packaging/PACKAGING-NOTES b/packaging/PACKAGING-NOTES new file mode 100644 index 00000000..69e640fa --- /dev/null +++ b/packaging/PACKAGING-NOTES @@ -0,0 +1,58 @@ +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 diff --git a/packaging/baselibs.conf b/packaging/baselibs.conf new file mode 100644 index 00000000..4d57af12 --- /dev/null +++ b/packaging/baselibs.conf @@ -0,0 +1,3 @@ +python3 +python3-base +libpython3_5m1_0 diff --git a/packaging/import_failed.map b/packaging/import_failed.map new file mode 100644 index 00000000..9f6c9708 --- /dev/null +++ b/packaging/import_failed.map @@ -0,0 +1,7 @@ +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 diff --git a/packaging/import_failed.py b/packaging/import_failed.py new file mode 100644 index 00000000..801b175c --- /dev/null +++ b/packaging/import_failed.py @@ -0,0 +1,26 @@ +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)) diff --git a/packaging/macros.python3.py b/packaging/macros.python3.py new file mode 100644 index 00000000..f137456d --- /dev/null +++ b/packaging/macros.python3.py @@ -0,0 +1,33 @@ +#!/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)) diff --git a/packaging/pre_checkin.sh b/packaging/pre_checkin.sh new file mode 100755 index 00000000..189f8ee5 --- /dev/null +++ b/packaging/pre_checkin.sh @@ -0,0 +1,122 @@ +#!/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 + diff --git a/packaging/python3-base.spec b/packaging/python3-base.spec new file mode 100644 index 00000000..d77c891f --- /dev/null +++ b/packaging/python3-base.spec @@ -0,0 +1,580 @@ +# +# 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 ". 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 + diff --git a/packaging/python3-rpmlintrc b/packaging/python3-rpmlintrc new file mode 100644 index 00000000..3bcb9a2a --- /dev/null +++ b/packaging/python3-rpmlintrc @@ -0,0 +1,18 @@ +# 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"); diff --git a/packaging/python3.csh b/packaging/python3.csh new file mode 100755 index 00000000..b94d8229 --- /dev/null +++ b/packaging/python3.csh @@ -0,0 +1,2 @@ +# add python startup script for interactive sessions +setenv PYTHONSTARTUP /etc/pythonstart diff --git a/packaging/python3.sh b/packaging/python3.sh new file mode 100755 index 00000000..887a8866 --- /dev/null +++ b/packaging/python3.sh @@ -0,0 +1,2 @@ +# add python startup script for interactive sessions +export PYTHONSTARTUP=/etc/pythonstart diff --git a/packaging/python3.spec b/packaging/python3.spec new file mode 100644 index 00000000..4aa89a52 --- /dev/null +++ b/packaging/python3.spec @@ -0,0 +1,282 @@ +# +# 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 diff --git a/packaging/python3start b/packaging/python3start new file mode 100644 index 00000000..5ba053da --- /dev/null +++ b/packaging/python3start @@ -0,0 +1,30 @@ +# 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 diff --git a/setup.py b/setup.py index 1cd15039..f76e7d45 100644 --- a/setup.py +++ b/setup.py @@ -1351,7 +1351,9 @@ class PyBuildExt(build_ext): 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') -- 2.34.1