#!/bin/bash

# ksh93.SlackBuild
# Heavily based on the original Slackware build scripts,
# Modified by Stuart Winter <mozes@slackware.com>
#
# Copyright 2001 BSDi, Inc. Concord, CA, USA
# Copyright 2004 Slackware Linux, Inc.  Concord, CA, USA
# Copyright 2007 Patrick J. Volkerding, Sebeka, MN, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Record toolchain & other info for the build log:
slackbuildinfo

# Paths to skeleton port's source & real Slackware source tree:
export CWD=$SLACKSOURCE/$PKGSERIES/$PKGNAM
export PORTCWD=$PWD

# Temporary build locations:
export TMPBUILD=$TMP/build-$PKGNAM
export PKG=$TMP/package-$PKGNAM
mkpkgdirs # Delete & re-create temporary directories then cd into $TMPBUILD

# Extract source:
mkdir -p ast-base/lib/package/tgz
cp -favv $CWD/*.tgz ast-base/lib/package/tgz

# For Slackware ARM, wipe the old versions in Slackware x86 and replace
# with newer ones which work on newer systems:
# x86 now has a newer version, but let's keep this around in case we need it again
# (I recall it taking quite some time to figure out ksh93..)
#rm -fv ast-base/lib/package/tgz/INIT.*.tgz
#rm -fv ast-base/lib/package/tgz/ast-ksh.*tgz
#rm -fv ast-base/lib/package/tgz/ast-ksh-locale* ## Fedora does not ship this... perhaps in 2012v it's not needed?

# Copy in newer ones:
# again, don't do this anymore.
# We've recompressed the sources from using gzip to using LZMA, to save space:
#cp -favv $PORTCWD/sources/*.t*z* ast-base/lib/package/tgz/
# Repack the sources using gzip, since the ksh build system expects it:
#( cd ast-base/lib/package/tgz/
#  xz -d *xz
#  gzip -1 *.tar )

cd ast-base/
# ARM only - as we gzip the stuff for ksh's build system, and gzip suffixes with .gz not .tgz
tar xvvf lib/package/tgz/INIT.$VERSION.*z || exit 1
tar xvvf lib/package/tgz/ast-ksh.$VERSION.*z || exit 1

# Build:
./bin/package read || exit 1

zcat $CWD/patches/ksh-20070328-builtins.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20100826-fixregr.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20080202-manfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20100202-pathvar.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20100621-fdstatus.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-rmdirfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-cdfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-cdfix2.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-tabfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20130214-fixkill.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-kshmfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-memlik.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-forkbomb.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-macro.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20130628-longer.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-mlikfiks.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-covsfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20100621-manfix3.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-nomulti.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-fd2lost.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-memlik3.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-filecomsubst.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-crash.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-sufix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-argvfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20140301-fikspand.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-roundit.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-heresub.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20140415-hokaido.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-tpstl.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-mtty.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-manfix4.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-fununset.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-cdfix3.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-locking.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20130613-cdfix4.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-retfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-oldenvinit.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-noexeccdfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-cdfork.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-emptyarrayinit.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-xufix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-assoc-unset-leak.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-alarmifs.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20140929-safefd.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-trapcom.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-lexfix.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20140801-arraylen.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-diskfull.patch.gz | patch -p1 --verbose || exit 1
zcat $CWD/patches/ksh-20120801-nohupfork.patch.gz | patch -p1 --verbose || exit 1

#/dev/fd test does not work because of mock
sed -i 's|ls /dev/fd|ls /proc/self/fd|' src/cmd/ksh93/features/options

# sh/main.c was not using CCFLAGS
sed -i '/-c sh\/main.c/s|${mam_cc_FLAGS} |${mam_cc_FLAGS} ${CCFLAGS} |p' src/cmd/ksh93/Mamfile

# disable register for debugging
sed -i 1i"#define register" src/lib/libast/include/ast.h

XTRAFLAGS=""
for f in -Wno-unknown-pragmas -Wno-missing-braces -Wno-unused-result -Wno-return-type -Wno-int-to-pointer-cast -Wno-parentheses -Wno-unused -Wno-unused-but-set-variable -Wno-cpp -P ; do
  gcc $f -E - </dev/null >/dev/null 2>&1 && XTRAFLAGS="$XTRAFLAGS $f"
done
./bin/package
./bin/package make mamake ||:
./bin/package make mamake ||:
export CCFLAGS="$SLKCFLAGS -fno-strict-aliasing $XTRAFLAGS"
export CC=gcc
./bin/package make -S || exit 1

# I found that if part of the "package" unpacking breaks, then ksh doesn't get built
# but the above commands don't fail:
if [ ! -x arch/linux.arm/bin/ksh ]; then
   echo "ksh has not been built."
   exit 1
fi

# Install:
mkdir -vpm755 $PKG/bin
install -vpm755 arch/linux.arm/bin/ksh $PKG/bin/ksh.new

#cp arch/linux.$SARCH/lib/libshell.so.1.1 /usr/lib
#cp arch/linux.$SARCH/lib/libshell.a /usr/lib
#cp arch/linux.$SARCH/lib/libast.so.5.4 /usr/lib
#cp arch/linux.$SARCH/lib/libast.a /usr/lib
#cp arch/linux.$SARCH/src/cmd/ksh93/cc-g,-fpic/libshell.so.1.1 /usr/lib
#cp arch/linux.$SARCH/src/cmd/ksh93/cc-g,-fpic/libshell.a /usr/lib
#cp arch/linux.$SARCH/src/lib/libast/libast.so.5.4 /usr/lib
#cp arch/linux.$SARCH/src/cmd/ksh93/cc-g,-fpic/libast.a /usr/lib
#strip /usr/lib/libast.so.5.4 /usr/lib/libshell.so.1.1

mkdir -p $PKG/usr/man/man1
sed -e "s#\.nr Z 0#\.nr Z 1#g" src/cmd/ksh93/sh.1 > \
       $PKG/usr/man/man1/ksh.1

# Install locale files:
#mkdir -p $PKG/usr/share
#cp -a share/lib/locale $PKG/usr/share
#chown -R root:root $PKG/usr/share
#( cd $PKG/usr/share
#  find . -type d -exec chmod 755 {} \;
#  find . -type f -exec chmod 644 {} \;
#)

( cd $PKG/bin ; ln -vsf ksh rksh )
( cd $PKG/usr/man/man1 ; ln -vsf ksh.1.gz rksh.1.gz )

mkdir -p $PKG/usr/doc/ksh93-$VERSION
( cd src/cmd/ksh93
  cp -a COMPATIBILITY DESIGN OBSOLETE PROMO.mm README RELEASE* TYPES \
     $PKG/usr/doc/ksh93-$VERSION
)
( cd $TMPBUILD/build-ksh93/ast-base
  mkdir -p $PKG/usr/doc/ksh93-$VERSION/LICENSE
  cp -a README $PKG/usr/doc/ksh93-$VERSION/LICENSE
  cp -a $CWD/EPL-1.0 $PKG/usr/doc/ksh93-$VERSION
  chmod 644 $PKG/usr/doc/ksh93-$VERSION/EPL-1.0
  # ast-ksh-locale is still covered by the CPL:

  cp -a $CWD/CPL $PKG/usr/doc/ksh93-$VERSION
  chmod 644 $PKG/usr/doc/ksh93-$VERSION/CPL
  chown root:root $PKG/usr/doc/ksh93-$VERSION/CPL
#  cp -a lib/package/LICENSES/ast $PKG/usr/doc/ksh93-$VERSION/LICENSE/LICENSE.ast )
  cp -a lib/package/*.lic $PKG/usr/doc/ksh93-$VERSION/LICENSE/LICENSE.ast )


# If necessary, start the fakeroot server so we can set file/dir ownerships:
start_fakeroot

# Apply generic Slackware packaging policies:
cd $PKG
slackstripall   # strip all .a archives and all ELFs
slackgzpages -i # compress man & info pages and delete usr/info/dir
slackslack      # chown -R root:root, chmod -R og-w, slackchown, slack644docs
slackdesc       # install slack-desc and doinst.sh

# Create post-installation script:
cat <<EOF >> $PKG/install/doinst.sh
# Backup the old copy if we find one, move the new one in place
if [ -f bin/ksh ]; then
   mv bin/ksh bin/ksh.old
fi
mv bin/ksh.new bin/ksh
if [ -f bin/ksh.old ]; then
  rm -f bin/ksh.old
fi

# Add entries to /etc/shells if we need them
if [ ! -r etc/shells ] ; then
   touch etc/shells
   chmod 644 etc/shells
fi

if ! grep -q "/bin/ksh" etc/shells ; then
   echo "/bin/ksh" >> etc/shells
fi
EOF

# Replace version number with a _ so it doesn't get confused with
# the package name.
export VERSION="$( echo $VERSION | sed 's?-?_?g' )"
export SLACKPACKAGE=$PKGNAM-$VERSION-$PKGARCH-$BUILD.txz
slackmp         # run makepkg -l y -c n

# Perform any final checks on the package:
cd $PKG
slackhlinks     # search for any hard links
