File ncurses.spec of Package ncurses.9557

#
# spec file for package ncurses
#
# Copyright (c) 2018 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/
#


%bcond_with     hasheddb
%if 0%{?suse_version} > 1320
%bcond_without  symversion
%else
%bcond_with     symversion
%endif
%bcond_with     memleakck
%bcond_without  onlytinfo

%if %{with onlytinfo}
%global soname_tinfo tinfo
%else
%global soname_tinfo tinfow
%endif

Name:           ncurses
#!BuildIgnore: terminfo
%if %{with hasheddb}
BuildRequires:  db-devel
%endif
BuildRequires:  expect
BuildRequires:  gcc-c++
BuildRequires:  pkg-config
BuildRequires:  screen
%if 0%{?suse_version} > 1130
BuildRequires:  gpm-devel
%else
BuildRequires:  gpm
%endif
%define terminfo() %{_datadir}/%{0}/%{1}
%define tabset()   %{_datadir}/%{0}/%{1}
# bug437293
%ifarch ppc64
Obsoletes:      ncurses-64bit
%endif
#
# Note that this spec files does not only build the ABI version 6
# but also build the ABI version 5 as this is part of the source
# tar ball including the latest upstream fixes for ABI 5.
#
Version:        6.1
Release:        0
Summary:        Terminal control library
#Git:           http://ncurses.scripts.mit.edu
License:        MIT
Group:          System/Base
Url:            http://www.invisible-island.net/ncurses/ncurses.html
Source0:        ftp://ftp.invisible-island.net/ncurses/ncurses-6.1.tar.gz
Source1:        ncurses-6.1-patches.tar.bz2
Source2:        handle.linux
Source3:        README.devel
Source4:        ncurses-rpmlintrc
# Latest tack can be found at ftp://ftp.invisible-island.net/pub/ncurses/current/
Source5:        ftp://ftp.invisible-island.net/pub/ncurses/current/tack-1.08-20170818.tgz
Source6:        edit.sed
Source7:        baselibs.conf
Patch0:         ncurses-6.1.dif
Patch1:         ncurses-5.9-ibm327x.dif
Patch4:         ncurses-5.7-tack.dif
# PATCH-FIX-UPSTREAM for bsc#1115929
Patch7:         ncurses-5.9-bsc1115929.patch
BuildRoot:      %{_tmppath}/%{name}-%{version}-build
%global         _miscdir    %{_datadir}/misc
%global         _incdir     %{_includedir}
%global         root        %{_tmppath}/%{name}-%{version}-store

%description
As soon as a text application needs to directly control its output to
the screen (if it wants to place the cursor at location (x,y) then
write text), ncurses is used. The panel and the forms libraries are
included in this package. The ncurses libraries support color, special
characters, forms, and panels.

%package -n ncurses-utils
Summary:        Tools using the new curses libraries
License:        MIT
Group:          System/Base
Provides:       ncurses:%{_bindir}/tput

%description -n ncurses-utils
The ncurses based utilities are as follows:

clear -- emits clear-screen for current terminal

tabs -- set tabs on a terminal

toe   -- table of entries utility

tput  -- shell-script access to terminal capabilities.

tset  -- terminal-initialization utility

reset -- terminal initialization utility

%package -n terminfo-base
Summary:        A terminal descriptions database
License:        MIT
Group:          System/Base
Requires:       ncurses >= %{version}
Recommends:     terminfo-screen = %{version}
Provides:       ncurses:%{_datadir}/tabset

%description -n terminfo-base
This is the terminfo basic database, maintained in the ncurses package.
This database is the official successor to the 4.4BSD termcap file and
contains information about any known terminal. The ncurses library
makes use of this database to use terminals correctly.

%package -n terminfo-screen
Summary:        A terminal descriptions database for screen
License:        MIT
Group:          System/Base
Requires:       terminfo-base
Provides:       terminfo:%{_datadir}/terminfo/s/screen.konsole

%description -n terminfo-screen
This package includes some useful entries for the screen utility in the
terminfo database, which might introduce trouble if used over network
connections like ssh or slogin onto systems without those terminfo database
entries.

%package -n terminfo-iterm
Summary:        A terminal descriptions database for iterm
License:        MIT
Group:          System/Base
Requires:       terminfo-base
Provides:       terminfo:%{_datadir}/terminfo/i/iTerm.app

%description -n terminfo-iterm
This package includes some useful entries for the iterm utility in the
terminfo database, which might introduce trouble if used over network
connections like ssh or slogin onto systems without those terminfo database
entries.

%package -n libncurses5
Summary:        Terminal control library
License:        MIT
Group:          System/Libraries
Requires:       terminfo-base
Provides:       ncurses = 5.9
Obsoletes:      ncurses < 5.9
# bug437293
%ifarch ppc64
Obsoletes:      ncurses-64bit
%endif
#

%description -n libncurses5
The ncurses library is used by many terminal applications for
controlling output to the screen and input from the user.

This package contains the library built with the version 5 ABI.

%package -n libncurses6
Summary:        Terminal control library
License:        MIT
Group:          System/Libraries
Requires:       terminfo-base
Provides:       ncurses = %{version}
Recommends:     ncurses-utils = %{version}

%description -n libncurses6 
The ncurses library is used by many terminal applications for
controlling output to the screen and input from the user.

This package contains the library built with the version 6 ABI.

%package -n terminfo
Summary:        A terminal descriptions database
License:        SUSE-Public-Domain
Group:          System/Base
Requires:       terminfo-base = %{version}

%description -n terminfo
This is the terminfo reference database, maintained in the ncurses
package. This database is the official successor to the 4.4BSD termcap
file and contains information about any known terminal. The ncurses
library makes use of this database to use terminals correctly. If you
just use the Linux console, xterm, and VT100, you probably will not
need this database -- a minimal /usr/share/terminfo tree for these
terminals is already included in the terminfo-base package.

%package -n ncurses-devel
Summary:        Development files for the ncurses6 terminal control library
License:        MIT
Group:          Development/Libraries/C and C++
Provides:       ncurses6-devel
Provides:       ncurses:%{_incdir}/ncurses.h
Requires:       %{_bindir}/tack
Requires:       libncurses6 = %{version}-%{release}
Requires:       ncurses = %{version}-%{release}
# bug437293
%ifarch ppc64
Obsoletes:      ncurses-devel-64bit
%endif
#

%description -n ncurses-devel
This package contains the headers needed to build against
the ncurses library in its ABI version 6 form.

%package -n ncurses5-devel
Summary:        Development files for the ncurses5 terminal control library
License:        MIT
Group:          Development/Libraries/C and C++
Provides:       ncurses:%{_incdir}/ncurses5/ncurses.h
Requires:       %{_bindir}/tack
Requires:       libncurses5 = %{version}-%{release}
Requires:       ncurses = %{version}-%{release}
Requires:       ncurses-devel = %{version}-%{release}

%description -n ncurses5-devel
This package contains the headers needed to build against
the ncurses library in its ABI version 5 form.

%package -n tack
Summary:        Terminfo action checker
License:        GPL-2.0-or-later
Group:          Development/Tools/Building
Provides:       ncurses-devel:%{_bindir}/tack
Requires:       ncurses = %{version}-%{release}

%description -n tack
This package contains the tack utility to help to build a new terminfo
entry describing an unknown terminal. It can also be used to test the
correctness of an existing entry, and to develop the correct pad
timings needed to ensure that screen updates do not fall behind the
incoming data stream.

%prep
%setup -q
tar -xjf %{S:1}
set +x
for patch in patches/ncurses*.patch
do
    test -e "$patch" || continue
    echo Apply patch: $patch
    patch -f -T -p1 -s < $patch
done
set -x
rm -rf patches/
find -name '*.orig' -delete
# replace tack from ncurses tarball with the latest version in
# separate tarball
rm -fr tack
tar -xzf %{S:5}
mv tack-* tack
%patch1 -p0 -b .327x
%patch4 -p0 -b .hs
%patch7 -p0 -b .bx
%patch0 -p0 -b .p0

%build
#
# Note that there is a test if the system call poll(2) really works
# on terminal or files.  To make sure that even in OBS the configure
# script has its own terminal we use screen here (could be also tmux).
# 
# Remark: A better solution would be that in OBS a real pty/tty pair
# would be used instead of redirecting stdout/stderr to a log file.
#
%global _configure	screen -D -m ./configure
    SCREENDIR=$(mktemp -d ${PWD}/screen.XXXXXX) || exit 1
    SCREENRC=${SCREENDIR}/ncurses
    export SCREENRC SCREENDIR
    exec 0< /dev/null
    SCREENLOG=${SCREENDIR}/log
    cat > $SCREENRC<<-EOF
	deflogin off
	deflog on
	logfile $SCREENLOG
	logfile flush 1
	logtstamp off
	log on
	setsid on
	scrollback 0
	silence on
	utf8 on
	EOF
    #
    # Used to test out various cflags of the gcc
    #
    cflags ()
    {
	local flag=$1; shift
	local var=$1; shift
	test -n "${flag}" -a -n "${var}" || return
	case "${!var}" in
	*${flag}*) return
	esac
	set -o noclobber
	case "$flag" in
	-Wl,*)
	    if echo 'int main () { return 0; }' | \
	       ${CC:-gcc} -Werror $flag -o /dev/null -xc - > /dev/null 2>&1 ; then
		eval $var=\${$var:+\$$var\ }$flag
	    fi
	    ;;
	*)
	    if ${CC:-gcc} -Werror $flag -S -o /dev/null -xc /dev/null > /dev/null 2>&1 ; then
		eval $var=\${$var:+\$$var\ }$flag
	    fi
	    if ${CXX:-g++} -Werror $flag -S -o /dev/null -xc++ /dev/null > /dev/null 2>&1 ; then
		eval $var=\${$var:+\$$var\ }$flag
	    fi
	esac
	set +o noclobber
    }

    test ! -f /.buildenv || . /.buildenv
       OPATH=$PATH
%ifarch s390x s390
      FALLBK="unknown,dumb,xterm,ibm327x,vt100,vt102,vt220"
%else
      FALLBK="unknown,dumb,xterm,linux,vt100,vt102,vt220"
%endif
	  CC=gcc
	 CXX=g++
    CFLAGS="${RPM_OPT_FLAGS} -pipe -D_REENTRANT"
    if [[ "$BUILD_BASENAME" = debug-* ]] ; then
	CFLAGS="${CFLAGS} -g -DTRACE"
    fi
    cflags -Wl,-O2                  LDFLAGS
    cflags -Wl,-Bsymbolic-functions LDFLAGS
    cflags -Wl,--hash-size=8599     LDFLAGS
    cflags -Wl,--as-needed          LDFLAGS
    CXXFLAGS=$CFLAGS
    test -n "$TERM" || TERM=linux
    mkdir gzip
    cat > gzip/gzip <<-'EOF'
	#!/bin/sh
	exec /usr/bin/gzip -9 ${1+"$@"}
	EOF
    chmod 0755 gzip/gzip
    PATH=$PWD/gzip:$PATH
    export CC CFLAGS CXX CXXFLAGS TERM LDFLAGS
    #
    # Detect 64bit architecures and be sure that we use an
    # unsigned long for chtype to be backward compatible with
    # already existing ncurses applications.  Otherwise we
    # might break existing applications on any update!
    #
    if test $(getconf LONG_BIT) -gt 32 ; then
	WITHCHTYPE="--with-chtype=long"
    else
	WITHCHTYPE=""
	CFLAGS="${CFLAGS} $(getconf LFS_CFLAGS)"
    fi
    #
    # Let's care about people which build ncurses on their own
    # system. That is take care that some configure tests might
    # be exploitable below /tmp ... compare with aclocal.m4
    #
    TMPDIR=$(mktemp -d /tmp/ncurses.XXXXXXXX) || exit 1
    trap 'rm -rf ${TMPDIR}' EXIT
    export TMPDIR
    #
    # getttynam(3) as well as /etc/ttys are not used under Linux
    #
    sed -ri '/^getttynam\s*\\$/d' configure
    #
    # No --enable-term-driver as this had crashed last time
    # in ncurses/tinfo/lib_setup.c due to the fact that
    # _nc_globals.term_driver was a NULL function pointer as
    # this is for the MinGW port!
    #
    # No --enable-tcap-names because we may have to recompile
    # programs or foreign programs won't work
    #
    # No --enable-safe-sprintf because this seems to
    # crash on some architectures
    #
    # No --enable-xmc-glitch because this seems to break yast2
    # on console/konsole (no magic cookie support on those?)
    #
    # No --enable-hard-tabs for users which have disabled
    # the use of tabs
    #
    touch --reference=README config.sub config.guess
    > $SCREENLOG
    tail -q -s 0.5 -f $SCREENLOG & pid=$!
    %configure \
	--without-ada		\
	--without-debug		\
	--without-profile	\
	--without-manpage-tbl	\
	--without-tests		\
	--with-shared		\
	--with-normal		\
	--with-manpage-format=gzip \
	--with-manpage-renames=${PWD}/man/man_db.renames \
	--with-manpage-aliases	\
	--with-ospeed=speed_t	\
%if 0%{?suse_version} > 1310
	--with-gpm=$(readlink %{_libdir}/libgpm.so) \
%else
	--with-gpm		\
%endif
	--with-dlsym		\
	--with-default-terminfo-dir=%{_datadir}/terminfo \
	--with-terminfo-dirs=%{_sysconfdir}/terminfo:%{_datadir}/terminfo \
	--with-xterm-kbs=del	\
	--disable-stripping	\
	--disable-root-environ	\
	--disable-termcap	\
	--disable-overwrite	\
	--disable-rpath		\
	--disable-rpath-hack	\
%if %{with memleakck}
	--disable-leaks		\
%endif
	--disable-xmc-glitch	\
	--enable-symlinks	\
	--enable-big-core	\
	--enable-const		\
	--enable-hashmap	\
	--enable-no-padding	\
	--enable-sigwinch	\
	--enable-colorfgbg	\
	--enable-sp-funcs	\
	--enable-interop	\
	--with-pthread		\
	--enable-reentrant	\
%if 0%{?suse_version} > 1500
	--enable-opaque-curses	\
	--enable-opaque-form	\
	--enable-opaque-menu	\
	--enable-opaque-panel	\
%endif
	--enable-ext-mouse	\
	--enable-widec		\
	--with-termlib=%{soname_tinfo}	\
	--with-ticlib=ticw	\
%if %{with symversion}
	--with-versioned-syms=${PWD}/package/ncursestw.map \
%endif
	--enable-ext-colors	\
	--enable-weak-symbols	\
	--enable-wgetch-events	\
	--enable-pthreads-eintr	\
	--enable-string-hacks	\
	--prefix=%{_prefix}	\
	--exec-prefix=%{_prefix}\
	--libdir=%{_libdir}	\
	--datadir=%{_datadir}	\
	--mandir=%{_mandir}	\
	--includedir=%{_incdir}	\
	"${WITHCHTYPE}" 	\
	--disable-tic-depends	\
	--with-cxx-shared	\
	--with-pc-suffix	\
	--enable-pc-files	\
%if 0%{?_crossbuild}
	--with-fallbacks="$FALLBK" \
%else
	--with-fallbacks=""	\
%endif
%if %{with hasheddb}
	--with-hashed-db	\
%endif
	--with-pkg-config-libdir=%{_libdir}/pkgconfig
    sleep 1
    kill $pid
    #
    #  The configure line used above.  Note that we override
    #  several options later with other configurations.
    #  It has been verified several times that this works.
    #
    c=$(grep '^ *$ *\./configure' config.log)
    make -C c++ etip.h
    make %{?_smp_mflags}
    #
    # Refresh second install path
    #
    rm -rf %{root}
    mkdir  %{root}
%if !0%{?_crossbuild}
    #
    # This is a hack to be able to boot strap libncurses with
    # our preferred fallback.c.  For this we need the appropiate
    # tools list infocmp(1) and tic(1).  The first step was with
    # an empty fallback.c, now we include the latest terminfo
    # of our preferred fallback terminfo list into the final
    # fallback.c.
    #
    mkdir lib/.build
    cp -p progs/tic progs/tic.build
    cp -p progs/infocmp progs/infocmp.build
    cp -p lib/*.so* lib/.build/
    PATH=$PWD/progs:$OPATH
    export PATH
    (cat > ${PWD}/.build_tic)<<-EOF
	export LD_LIBRARY_PATH=$PWD/lib/.build
	export BUILD_TIC=$PWD/progs/tic.build
	export BUILD_INFOCMP=$PWD/progs/infocmp.build
	EOF
    pushd ncurses/
	TERMINFO=$PWD/tmp
	export TERMINFO
	mkdir -p $TERMINFO
	. ${PWD}/../.build_tic
	$BUILD_TIC -I -r -e $FALLBK ../misc/terminfo.src > terminfo.src
	$BUILD_TIC -o $TERMINFO -s terminfo.src
	sh -e ./tinfo/MKfallback.sh $TERMINFO ../misc/terminfo.src $BUILD_TIC ${FALLBK//,/ } > fallback.c
	rm -rf $TERMINFO
	unset  TERMINFO
	cp -p fallback.c ../fallback.c.build
	unset LD_LIBRARY_PATH
    popd
    PATH=$OPATH
    #
    # Now rebuild libncurses and do the rest of this job
    #
    find -name fallback.o -print -delete
    cp fallback.c.build ncurses/fallback.c
    make -C c++ etip.h
    make %{?_smp_mflags}
%else
    (cat > ${PWD}/.build_tic)<<-EOF
	export BUILD_TIC=/usr/bin/tic
	export BUILD_INFOCMP=/usr/bin/infocmp
	EOF
%endif
    # must not use %jobs here (would lead to: ln: ncurses.h already exists)
    find man/ -name '*.[1-8]x.*' -print -delete
    make install DESTDIR=%{root} includedir=%{_incdir} includesubdir=/ncursesw libdir=%{_libdir}
%if %{with onlytinfo}
    # This ensures that we get the libtinfo *with* _nc_read_entry2 symbol as well
    gcc $CFLAGS $LDFLAGS -fPIC -shared -Wl,--auxiliary=libtinfo.so.6,-soname,libtinfow.so.6,-stats,-lc \
	 -Wl,--version-script,ncurses/resulting.map -o %{root}%{_libdir}/libtinfow.so.%{version}
    cp -p %{root}%{_libdir}/libtinfo.so.%{version}  libtinfo.so.%{version}.back
    cp -p %{root}%{_libdir}/libtinfow.so.%{version} libtinfow.so.%{version}.back
%endif
    ln -sf %{_incdir}/ncurses/{curses,ncurses,term,termcap}.h %{root}%{_incdir}
    sh %{S:6} --cflags "-D_GNU_SOURCE -I%{_incdir}/ncursesw" --libs "-lncursesw" \
	--libs "-l%{soname_tinfo}" %{root}%{_bindir}/ncursesw6-config
    mkdir pc
    mv -f %{root}%{_libdir}/pkgconfig/*.pc pc/
    #
    # Some tests
    #
%if 0%{?qemu_user_space_build:1}%{?_crossbuild}
	echo "Skipping tests due to running under QEMU / cross-building"
%else
    #
    # Check for tack program on base of above ncurses
    #
    LD_LIBRARY_PATH=$PWD/lib
    export LD_LIBRARY_PATH PATH
    pushd tack/
	ldd ./tack
    popd
    unset LD_LIBRARY_PATH
%if 0%{?suse_version} > 1500
    #
    # Make the test suite for ncursesw6
    #
    pushd test
	CFLAGS="$CFLAGS -I%{root}%{_incdir}" LDFLAGS="$LDFLAGS -Wl,-rpath-link=%{root}%{_libdir} -L%{root}%{_libdir}" \
	./configure --with-ncursesw --enable-widec --prefix=$PWD
	LD_LIBRARY_PATH=%{root}%{_libdir} \
	make %{?_smp_mflags} TEST_ARGS='-lformw -lmenuw -lpanelw -lncursesw -lticw -l%{soname_tinfo} -Wl,--as-needed'
	make install TEST_ARGS='-lformw -lmenuw -lpanelw -lncursesw -lticw -l%{soname_tinfo} -Wl,--as-needed'
	mv bin binw
	make distclean
    popd
%endif
%endif
    test ! -L tack || rm -f tack
    make clean
    #
    # Now use --without-pthread to disable pthread support (abi == 5).
    #
    > $SCREENLOG
    tail -q -s 0.5 -f $SCREENLOG & pid=$!

    eval screen -D -m ./${c#*./} --with-abi-version=5		\
				    --without-manpages		\
				    --without-progs		\
				    --without-tack		\
				    --without-pthread		\
				    --disable-reentrant		\
				    --disable-opaque-curses	\
				    --disable-opaque-form	\
				    --disable-opaque-menu	\
				    --disable-opaque-panel	\
				    --disable-ext-mouse		\
				    --disable-widec		\
				    --with-termlib=tinfo	\
				    --with-ticlib=tic		\
%if %{with symversion}
				    --with-versioned-syms=${PWD}/package/ncurses.map \
%endif
				    --disable-ext-colors	\
				    --disable-overwrite		\
				    --without-progs
    sleep 1
    kill $pid
%if !0%{?_crossbuild}
    find -name fallback.o -print -delete
    cp fallback.c.build ncurses/fallback.c
%endif
    make -C c++ etip.h
    make %{?_smp_mflags}
    sed -ri 's@^(LDFLAGS=)$@\1-L\\${libdir}@
	     s@^(libdir=).show_libdir@\1%{_libdir}/ncurses5@
	     s@^(includedir=).show_includedir@\1%{_incdir}/ncurses5@' misc/gen-pkgconfig
    # must not use %jobs here (would lead to: ln: ncurses.h already exists)
    make install.libs install.includes DESTDIR=%{root} includedir=%{_incdir}/ncurses5 includesubdir=/ncurses libdir=%{_libdir}/ncurses5
    ln -sf %{_incdir}/ncurses5/ncurses/{curses,ncurses,term}.h %{root}%{_incdir}/ncurses5/
    sh %{S:6} --cflags "-D_GNU_SOURCE -I%{_incdir}/ncurses5/ncurses -I%{_incdir}/ncurses5" --libs "-L%{_libdir}/ncurses5 -lncurses" \
	--libs "-ltinfo" %{root}%{_bindir}/ncurses5-config
    pushd man
	sh ../edit_man.sh normal installing %{root}%{_mandir} . ncurses5-config.1
    popd
    for pc in %{root}%{_libdir}/pkgconfig/*.pc
    do
	test -e "$pc" || break
	base=${pc%%.pc}
	base=${base##*/}
	case "$base" in
	tic) sed -ri 's@^(Requires.private: ).*@\1tinfo5@'   "$pc" ;;
	*)   sed -ri 's@^(Requires.private: ).*@\1ncurses5@' "$pc"
	esac
	mv -f $pc pc/${base}5.pc
    done

    #
    # Now use --disable-widec for narrow character support.
    # The libs with 16 bit wide characters are binary incompatible
    # to the normal 8bit wide character libs.
    #
    make clean
    > $SCREENLOG
    tail -q -s 0.5 -f $SCREENLOG & pid=$!
    eval screen -D -m ./${c#*./} --with-pthread			\
				    --without-manpages		\
				    --without-progs		\
				    --without-tack		\
				    --enable-reentrant		\
				    --enable-opaque-curses	\
				    --enable-opaque-form	\
				    --enable-opaque-menu	\
				    --enable-opaque-panel	\
				    --enable-ext-mouse		\
				    --disable-widec		\
				    --with-termlib=tinfo	\
				    --with-ticlib=tic		\
%if %{with symversion}
				    --with-versioned-syms=${PWD}/package/ncursest.map \
%endif
				    --enable-ext-colors		\
				    --disable-overwrite		\
				    --without-progs
    sleep 1
    kill $pid
%if !0%{?_crossbuild}
    find -name fallback.o -print -delete
    cp fallback.c.build ncurses/fallback.c
%endif
    make -C c++ etip.h
    make %{?_smp_mflags}
    # must not use %jobs here (would lead to: ln: ncurses.h already exists)
    make install.libs install.includes DESTDIR=%{root} includedir=%{_incdir} includesubdir=/ncurses libdir=%{_libdir}
%if %{with onlytinfo}
    # This ensures that we get the libtinfo *with* _nc_read_entry2 symbol as well
    cp -p libtinfo.so.%{version}.back  %{root}%{_libdir}/libtinfo.so.%{version}
    cp -p libtinfow.so.%{version}.back %{root}%{_libdir}/libtinfow.so.%{version}
%endif
    sh %{S:6} --cflags "-D_GNU_SOURCE -I%{_incdir}/ncurses" --libs "-lncurses" \
	--libs "-ltinfo" %{root}%{_bindir}/ncurses6-config
    pushd man
	sh ../edit_man.sh normal installing %{root}%{_mandir} . ncurses6-config.1
    popd
    mv -f %{root}%{_libdir}/pkgconfig/*.pc pc/
    #
    # Some tests
    #
%if 0%{?qemu_user_space_build:1}%{?_crossbuild} || 0%{?suse_version} <= 1500
	echo "Skipping tests due to running under QEMU / cross-building"
%else
    #
    # Make the test suite for ncurses6
    #
    pushd test
	CFLAGS="$CFLAGS -I%{root}%{_incdir}" LDFLAGS="$LDFLAGS -Wl,-rpath-link=%{root}%{_libdir} -L%{root}%{_libdir}" \
	./configure --with-ncurses --disable-widec --prefix=$PWD
	LD_LIBRARY_PATH=%{root}%{_libdir} \
	make %{?_smp_mflags} TEST_ARGS='-lform -lmenu -lpanel -lncurses -ltic -ltinfo -Wl,--as-needed'
	make install TEST_ARGS='-lform -lmenu -lpanel -lncurses -ltic -ltinfo -Wl,--as-needed'
	make distclean
    popd
%endif
    test ! -L tack || rm -f tack
    make clean
    #
    # ABI == 5
    #
    > $SCREENLOG
    tail -q -s 0.5 -f $SCREENLOG & pid=$!

    #
    # Now use --without-pthread to disable pthread support (abi == 5).
    #
    eval screen -D -m ./${c#*./} --with-abi-version=5		\
				    --without-manpages		\
				    --without-progs		\
				    --without-tack		\
				    --without-pthread		\
				    --disable-reentrant		\
				    --disable-opaque-curses	\
				    --disable-opaque-form	\
				    --disable-opaque-menu	\
				    --disable-opaque-panel	\
				    --disable-ext-mouse		\
				    --enable-widec		\
				    --with-termlib=%{soname_tinfo}	\
				    --with-ticlib=ticw		\
%if %{with symversion}
				    --with-versioned-syms=${PWD}/package/ncursesw.map \
%endif
				    --disable-ext-colors	\
				    --disable-overwrite		\
				    --without-progs
    sleep 1
    kill $pid
%if !0%{?_crossbuild}
    find -name fallback.o -print -delete
    cp fallback.c.build ncurses/fallback.c
%endif
    make -C c++ etip.h
    make %{?_smp_mflags}
    sed -ri 's@^(LDFLAGS=)$@\1-L\\${libdir}@
	     s@^(libdir=).show_libdir@\1%{_libdir}/ncurses5@
	     s@^(includedir=).show_includedir@\1%{_incdir}/ncurses5/ncursesw@' misc/gen-pkgconfig
    # must not use %jobs here (would lead to: ln: ncurses.h already exists)
    make install.libs install.includes DESTDIR=%{root} includedir=%{_incdir}/ncurses5 includesubdir=/ncursesw libdir=%{_libdir}/ncurses5
%if %{with onlytinfo}
    gcc $CFLAGS $LDFLAGS -fPIC -shared -Wl,--auxiliary=libtinfo.so.5,-soname,libtinfow.so.5,-stats,-lc \
	-Wl,--version-script,package/ncursesw.map -o %{root}%{_libdir}/libtinfow.so.5.9
%endif
    sh %{S:6} --cflags "-D_GNU_SOURCE -I%{_incdir}/ncurses5/ncursesw -I%{_incdir}/ncurses5" --libs "-L%{_libdir}/ncurses5 -lncursesw" \
	--libs "-l%{soname_tinfo}" %{root}%{_bindir}/ncursesw5-config
    pushd man
	sh ../edit_man.sh normal installing %{root}%{_mandir} . ncursesw5-config.1
    popd
    for pc in %{root}%{_libdir}/pkgconfig/*.pc
    do
	test -e "$pc" || break
	base=${pc%%.pc}
	base=${base##*/}
	case "$base" in
	tinfo) sed -ri 's@(includedir=/usr/include/ncurses5/ncurses)w.*@\1@' "$pc" ;;
	tic)   sed -ri 's@(includedir=/usr/include/ncurses5/ncurses)w.*@\1@' "$pc" ;;
	esac
	case "$base" in
	tic) sed -ri 's@^(Requires.private: ).*@\1tinfo5@'   "$pc" ;;
	*)   sed -ri 's@^(Requires.private: ).*@\1ncurses5@' "$pc"
	esac
	mv -f $pc pc/${base}5.pc
    done

%install
    PATH=$PWD/gzip:$PATH
    (cd %{root}/; tar -cpSf - *)|tar -xpsSf - -C %{buildroot}/
    rm -rf %{root}
    mkdir %{buildroot}/%{_lib}
    for model in libncurses libncursest libncursesw libncursestw libtinfo libtinfow libtic libticw
    do
	for lib in %{buildroot}%{_libdir}/${model}.so.* ; do
	    test   -e "${lib}" || continue
	    mv "${lib}" %{buildroot}/%{_lib}/ || continue
	done
	for lib in %{buildroot}/%{_lib}/${model}.so.6 ; do
	    test -e "${lib}" || continue
	    test -L "${lib}" || continue
	    lib=${lib#%{buildroot}}
	    lnk=%{buildroot}%{_libdir}/${model}.so
	    case "${lib##*/}" in
	    libncursesw*)
		rm -f ${lnk}
		echo '/* GNU ld script */'			>  ${lnk}
		echo "INPUT(${lib} AS_NEEDED(-l%{soname_tinfo} -ldl))"	>> ${lnk}
		;;
	    libncurses*)
		rm -f ${lnk}
		echo '/* GNU ld script */'			>  ${lnk}
		echo "INPUT(${lib} AS_NEEDED(-ltinfo -ldl))"	>> ${lnk}
		;;
	    *)	ln -sf ${lib} %{buildroot}%{_libdir}/${model}.so
	    esac
	done
    done
%if 0
    lnk=%{buildroot}%{_libdir}/libtermcap.so
    echo '/* GNU ld script */'		>  ${lnk}
    echo "INPUT(AS_NEEDED(-ltinfo))"	>> ${lnk}
%endif
    chmod 0755 %{buildroot}/%{_lib}/lib*.so.*
    chmod 0755 %{buildroot}/%{_libdir}/lib*.so.*
    chmod a-x  %{buildroot}/%{_libdir}/lib*.a
    if test -d %{buildroot}%{_libdir}/ncurses5 ; then
	mv %{buildroot}%{_libdir}/ncurses5/*.so.5*   %{buildroot}%{_libdir}/
	for lib in %{buildroot}%{_libdir}/ncurses5/*.so
	do
	    lnk=$lib
	    lib=/%{_lib}/${lib##*/}.5
	    case "${lib##*/}" in
	    libncursesw*)
		rm -f "${lnk}"
		echo '/* GNU ld script */'		>  ${lnk}
		echo "INPUT(${lib} AS_NEEDED(-l%{soname_tinfo}))">> ${lnk} 
		;;
	    libncurses*)
		rm -f "${lnk}"
		echo '/* GNU ld script */'		>  ${lnk}
		echo "INPUT(${lib} AS_NEEDED(-ltinfo))"	>> ${lnk} 
		;;
	    libtinfo*)
		test -L "${lnk}" || continue
		ln -sf ${lib} ${lnk}
		;;
	    *)
		test -L "${lnk}" || continue
		ln -sf ../${lib##*/} ${lnk}
	    esac
	done
	for model in libncurses libncursest libncursesw libncursestw libtinfo libtinfow libtic libticw
	do
	    for lib in %{buildroot}%{_libdir}/${model}.so.* ; do
		test   -e "${lib}" || continue
		mv "${lib}" %{buildroot}/%{_lib}/ || continue
	    done
	    for lib in %{buildroot}/%{_lib}/${model}.so.5 ; do
		test -e "${lib}" || continue
		test -L "${lib}" || continue
		lib=${lib#%{buildroot}}
		lnk=%{buildroot}%{_libdir}/ncurses5/${model}.so
		case "${lib##*/}" in
		libncursesw*)
		    rm -f ${lnk}
		    echo '/* GNU ld script */'		    >  ${lnk}
		    echo 'SEARCH_DIR(%{_libdir}/ncurses5)'  >> ${lnk}
		    echo "INPUT(${lib} AS_NEEDED(-l%{soname_tinfo}))">> ${lnk}
		    ;;
		libncurses*)
		    rm -f ${lnk}
		    echo '/* GNU ld script */'		    >  ${lnk}
		    echo 'SEARCH_DIR(%{_libdir}/ncurses5)'  >> ${lnk}
		    echo "INPUT(${lib} AS_NEEDED(-ltinfo))" >> ${lnk}
		    ;;
		*)  ln -sf ${lib} %{buildroot}%{_libdir}/ncurses5/${model}.so
	    esac
	    done
	done
	chmod 0755 %{buildroot}/%{_lib}/lib*.so.5*
	chmod 0755 %{buildroot}/%{_libdir}/lib*.so.5*
	chmod a-x  %{buildroot}/%{_libdir}/ncurses5/lib*.a
    fi
    test -n "%{buildroot}" || ldconfig -N
    mkdir -p %{buildroot}%{_defaultdocdir}/ncurses
    bzip2 -c misc/terminfo.src > misc/terminfo.src.bz2
    install -m 644 misc/terminfo.src.bz2	%{buildroot}%{_defaultdocdir}/ncurses/
    install -m 644 doc/html/*.html		%{buildroot}%{_defaultdocdir}/ncurses/
    bzip2 doc/ncurses-intro.doc -c > doc/ncurses-intro.txt.bz2
    install -m 644 doc/ncurses-intro.txt.bz2	%{buildroot}%{_defaultdocdir}/ncurses/
    bzip2 doc/hackguide.doc -c > doc/hackguide.txt.bz2
    install -m 644 doc/hackguide.txt.bz2	%{buildroot}%{_defaultdocdir}/ncurses/
    install -m 644 %{S:3}			%{buildroot}%{_defaultdocdir}/ncurses/
    install -m 644 README			%{buildroot}%{_defaultdocdir}/ncurses/
    install -m 644 NEWS				%{buildroot}%{_defaultdocdir}/ncurses/
    mkdir -p %{buildroot}%{_sysconfdir}/terminfo
    mkdir -p %{buildroot}%{_miscdir}
    pushd ncurses/
	. ${PWD}/../.build_tic
	{ echo "# See annotated version in %{_defaultdocdir}/ncurses/terminfo.src.bz2"
	$BUILD_TIC -C -r ../misc/terminfo.src | grep -E -v '^#'; } > termcap
	# Gererate new termcap entries for various linux consoles
	TERMCAP=termcap \
	TERMINFO=%{buildroot}%{_datadir}/terminfo \
	    bash %{SOURCE2}
	install -m 0644 termcap.new %{buildroot}%{_miscdir}/termcap
	unset LD_LIBRARY_PATH
    popd
    if test `%{_bindir}/id -u` = '0' ; then
	chown root:root %{buildroot}%{_miscdir}/termcap
	chmod 0644      %{buildroot}%{_miscdir}/termcap
    fi
    ln -sf %{_miscdir}/termcap %{buildroot}%{_sysconfdir}/termcap
    (cat > default.list) <<-EOF
	%{tabset std}
	%{tabset stdcrt}
	%{tabset vt100}
	%{tabset vt300}
	%{terminfo a/ansi}
	%{terminfo a/arpanet}
	%{terminfo d/dumb}
	%{terminfo d/dialup}
	%{terminfo g/gnome}
	%{terminfo g/gnome-rh72}
	%{terminfo g/gnome-rh80}
	%{terminfo g/gnome-rh90}
	%{terminfo g/gnome-fc5}
	%{terminfo i/ibm327x}
	%{terminfo k/klone+color}
	%{terminfo k/konsole}
	%{terminfo k/konsole-256color}
	%{terminfo k/kvt}
	%{terminfo k/kvt-rh}
	%{terminfo l/linux}
	%{terminfo l/linux-m}
	%{terminfo l/linux-nic}
	%{terminfo m/mlterm}
	%{terminfo n/net}
	%{terminfo n/network}
	%{terminfo n/nxterm}
	%{terminfo p/patch}
	%{terminfo r/rxvt}
	%{terminfo r/rxvt-basic}
	%{terminfo r/rxvt-color}
	%{terminfo r/rxvt-256color}
	%{terminfo r/rxvt-unicode}
	%{terminfo r/rxvt-unicode-256color}
	%{terminfo s/screen+fkeys}
	%{terminfo s/screen}
	%{terminfo s/screen-16color}
	%{terminfo s/screen-256color}
	%{terminfo s/screen-bce}
	%{terminfo s/screen-w}
	%{terminfo s/sun}
	%{terminfo s/switch}
	%{terminfo u/unknown}
	%{terminfo v/vt100}
	%{terminfo v/vt102}
	%{terminfo v/vt220}
	%{terminfo v/vt220-8}
	%{terminfo v/vt220-8bit}
	%{terminfo v/vt320}
	%{terminfo v/vt52}
	%{terminfo v/vte}
	%{terminfo x/xterm}
	%{terminfo x/xterm-color}
	%{terminfo x/xterm-256color}
	%{terminfo x/xterm-basic}
	%{terminfo x/xterm-nic}
	%{terminfo x/xterm-r6}
	EOF
# Better screen support and workaround about missing terminfo entries
# might be help on boo#812067 as well as on boo#935736 but may cause
# boo#940459  (which should be fixed by screen its self!)
    rm -vf  %{buildroot}%{terminfo s/screen.xterm}
    (cat > screen.list) <<-EOF
	%{terminfo s/screen.gnome}
	%{terminfo s/screen.konsole}
	%{terminfo s/screen.linux}
	EOF
    (cat > iterm.list) <<-EOF
	%{terminfo i/iTerm.app}
	%{terminfo i/iTerm2.app}
	%{terminfo i/iterm}
	%{terminfo i/iterm2}
	EOF
    find %{buildroot}%{tabset ""} %{buildroot}%{terminfo ""} \
	\( -type f -or -type l \) | \
	sed "s@^%{buildroot}@@g" | \
	grep -v -F -x -f default.list -f screen.list -f iterm.list \
	> extension.list
    rm -f %{buildroot}%{_prefix}/lib/terminfo
    mv pc/*.pc %{buildroot}%{_libdir}/pkgconfig/

%if 0%{?qemu_user_space_build:1}%{?_crossbuild}
# No test here
%else
%check
LD_LIBRARY_PATH=%{buildroot}/%{_lib}:%{buildroot}%{_libdir}
export LD_LIBRARY_PATH
%if %{with onlytinfo}
nm -D %{buildroot}/%{_lib}/libtinfo.so.%{version} | grep -q _nc_read_entry2
%endif
%if 0%{?suse_version} > 1500
pushd test
    expect -d <<-'EOF'
	set env(TERM) xterm
	set timeout 20
	spawn -noecho "binw/newdemo"
	send -- "x"
	sleep 5
	send -- "x"
	sleep 5
	send -- "x"
	sleep 5
	send -- "q"
	wait -nowait
	EOF
    expect -d <<-'EOF'
	set env(TERM) xterm
	set timeout 20
	spawn -noecho "bin/newdemo"
	send -- "x"
	sleep 5
	send -- "x"
	sleep 5
	send -- "x"
	sleep 5
	send -- "q"
	wait -nowait
	EOF
popd
%endif
%endif

%post   -n libncurses5 -p /sbin/ldconfig

%postun -n libncurses5 -p /sbin/ldconfig

%post   -n libncurses6 -p /sbin/ldconfig

%postun -n libncurses6 -p /sbin/ldconfig

%files -n terminfo-base -f default.list
%defattr(-,root,root)
%{_sysconfdir}/termcap
%config %{_miscdir}/termcap
%dir %{_sysconfdir}/terminfo
%dir %{_datadir}/tabset/
%dir %{_datadir}/terminfo/
%dir %{_datadir}/terminfo/*/

%files -n terminfo-screen -f screen.list
%defattr(-,root,root)
%dir %{_datadir}/terminfo/

%files -n terminfo-iterm -f iterm.list
%defattr(-,root,root)
%dir %{_datadir}/terminfo/

%files -n ncurses-utils
%defattr(-,root,root)
%{_bindir}/clear
%{_bindir}/infocmp
%{_bindir}/reset
%{_bindir}/tabs
%{_bindir}/toe
%{_bindir}/tput
%{_bindir}/tset
%doc %{_mandir}/man1/clear.1.gz
%doc %{_mandir}/man1/infocmp.1.gz
%doc %{_mandir}/man1/reset.1.gz
%doc %{_mandir}/man1/tabs.1.gz
%doc %{_mandir}/man1/toe.1.gz
%doc %{_mandir}/man1/tput.1.gz
%doc %{_mandir}/man1/tset.1.gz
%doc %{_mandir}/man5/*.gz
%doc AUTHORS

%files -n libncurses5
%defattr(-,root,root)
/%{_lib}/lib*.so.5*
%{_libdir}/lib*.so.5*

%files -n libncurses6
%defattr(-,root,root)
/%{_lib}/lib*.so.6*
%{_libdir}/lib*.so.6*

%files -n ncurses-devel
%defattr(-,root,root)
%dir %{_defaultdocdir}/ncurses/
%doc %{_defaultdocdir}/ncurses/*
%{_bindir}/ncurses*6-config
%{_bindir}/captoinfo
%{_bindir}/infotocap
%{_bindir}/tic
%dir %{_incdir}/ncurses/
%dir %{_incdir}/ncursesw/
%{_incdir}/*.h
%{_incdir}/ncurses/*.h
%{_incdir}/ncursesw/*.h
%{_libdir}/lib*.a
%{_libdir}/lib*.so
%{_libdir}/pkgconfig/*[clmosuw\+].pc
%doc %{_mandir}/man1/ncurses*6-config.1.gz
%doc %{_mandir}/man1/captoinfo.1.gz
%doc %{_mandir}/man1/infotocap.1.gz
%doc %{_mandir}/man1/tic.1.gz
%doc %{_mandir}/man3/*.gz
%doc %{_mandir}/man7/*.gz

%files -n ncurses5-devel
%defattr(-,root,root)
%{_bindir}/ncurses*5-config
%dir %{_incdir}/ncurses5/
%dir %{_incdir}/ncurses5/ncurses/
%dir %{_incdir}/ncurses5/ncursesw/
%{_incdir}/ncurses5/*.h
%{_incdir}/ncurses5/ncurses/*.h
%{_incdir}/ncurses5/ncursesw/*.h
%dir %{_libdir}/ncurses5/
%{_libdir}/ncurses5/lib*.a
%{_libdir}/ncurses5/lib*.so
%{_libdir}/pkgconfig/*5.pc
%doc %{_mandir}/man1/ncurses*5-config.1.gz

%files -n tack
%defattr(-,root,root)
%{_bindir}/tack
%doc %{_mandir}/man1/tack.1.gz

%files -f extension.list -n terminfo
%defattr(-,root,root)

%changelog