#!/bin/bash
# src2pkg-bootstrap.src2pkg
## This script builds the src2pkg/src2pkg package,
## including the installwatch libraries. Once you
## have built the src2pkg package, install it using
## the 'installpkg' command. Then you can build other
## packages from source using the src2pkg/src2pkg tools.

CWD=$(pwd)
# use /tmp if you can't write to the current working directory
TEMP_DIR=$CWD

NAME="src2pkg"
VERSION="1.4"
BUILD="1"

# installwatch-0.7.0beta5 still has bugs
#INSTW_VERSION="0.7.0beta5"
INSTW_VERSION="0.6.3"
TAR_VERSION=1.13
BB_VERSION=1.2.1

NORMAL="[0;39m"
# RED: Failure or error message
RED="[1;31m"
# GREEN: Success message
GREEN="[1;32m"
# BLUE: Summary messages
BLUE="[1;34m"

# ARCH=
# If you don't have uname set the ARCH above
if ! [[ $ARCH ]] ; then
	if [[ "$(uname -m)" = "ppc" ]] ; then
	 ARCH="powerpc"
	elif [[ "$(uname -m)" = "s390" ]] ; then
	 ARCH="s390"
	elif [[ "$(uname -m)" = "x86_64" ]] ; then
	 ARCH="x86_64"
	elif [[ "$(uname -m |grep 86)" != "" ]] ; then
	 ARCH="i486"
	fi
fi

PKG_DIR=$TEMP_DIR/$NAME-$VERSION-$ARCH-$BUILD
PACKAGE=$TEMP_DIR/$NAME-$VERSION-$ARCH-$BUILD.tgz

[[ -d $PKG_DIR ]] && echo "Removing existing PKG_DIR" && rm -rf $PKG_DIR
[[ -e $PACKAGE ]] && echo "Removing existing package" && rm -rf $PACKAGE
# clean up stale files and start fresh
if [[ $BOOT_STRAP ]] ; then
 echo "Running 'make clean' in installwatch, tar and busybox sources"
 ( cd $TEMP_DIR/installwatch-$INSTW_VERSION && make clean &> /dev/null )
 ( cd $TEMP_DIR/tar-$TAR_VERSION && make clean &> /dev/null )
 ( cd $TEMP_DIR/busybox-$BB_VERSION && make clean &> /dev/null )
else
 echo "Removing old source directories"
 ( cd $TEMP_DIR && rm -rf installwatch-$INSTW_VERSION )
 ( cd $TEMP_DIR && rm -rf tar-$TAR_VERSION )
 ( cd $TEMP_DIR && rm -rf busybox-$BB_VERSION )
fi

echo "src2pkg uses statically-linked binaries for critical operations"
echo "to insure restoration of your system. Most are supplied by the"
echo "busybox program, but we also install a separate static copy of tar."
echo ""
cd $TEMP_DIR ;
echo "Unpacking busybox"
! [[ $BOOT_STRAP ]] && tar xjf $CWD/busybox-$BB_VERSION.tar.bz2
rm -f busybox-$BB_VERSION/.config
cp -a $CWD/busybox-static.config busybox-$BB_VERSION/.config
cd busybox-$BB_VERSION ;
echo "Configuring busybox"
make oldconfig 1> /dev/null
echo "Compiling busybox"
# make &> /dev/null
if [[ $ARCH = "x86_64" ]] ; then
 CFLAGS='-O2 -fPIC' make 1> /dev/null 2> /dev/null
elif [[ $ARCH = "i486" ]] ; then
 CFLAGS='-O2' make 1> /dev/null 2> /dev/null
else
  make 1> /dev/null 2> /dev/null
fi
echo "Installing busybox locally"
make install &> /dev/null

# build and use our own static copy of tar for consistent results and safety
#! [[ -d $TEMP_DIR/tar ]] && mkdir -p $TEMP_DIR/tar
cd $TEMP_DIR ;
if ! [[ $BOOT_STRAP ]] ; then
	echo "Unpacking tar..."
	tar xjf $CWD/tar-$TAR_VERSION.tar.bz2
	if [[ "$TAR_VERSION" = "1.13" ]] ; then
	 (
	 cd tar-$TAR_VERSION
	 echo "patching tar..."
	 patch -p1 < $CWD/tar-$TAR_VERSION-bzip2.diff
	 )
	fi
fi
cd tar-$TAR_VERSION ;
echo "configuring tar..."
CFLAGS="-O2 -static -s" ./configure --disable-nls --with-ncursesw --enable-widec &> /dev/null
echo "compiling tar..."
LDFLAGS="-static -s" make &> /dev/null
if [[ $ARCH = "x86_64" ]] ; then
 CFLAGS='-O2 -fPIC' LDFLAGS="-static -s" make 1> /dev/null 2> /dev/null
else
  LDFLAGS="-static -s" make 1> /dev/null 2> /dev/null
fi

if [[ $? -eq 0 ]] ; then
echo "tar compiled successfully."
else
echo "tar failed to compile... exiting."
exit
fi

# build the installwatch library
cd $TEMP_DIR ;
echo "Unpacking sources..."
! [[ $BOOT_STRAP ]] && tar xjf $CWD/installwatch-$INSTW_VERSION.tar.bz2
echo "Compiling installwatch..."
cd installwatch-$INSTW_VERSION ;
if [[ $ARCH = "x86_64" ]] ; then
 CFLAGS='-O2 -fPIC' make 1> /dev/null 2> /dev/null
elif [[ $ARCH = "i486" ]] ; then
 CFLAGS='-O2' make 1> /dev/null 2> /dev/null
else
  make 1> /dev/null 2> /dev/null
fi
if [[ -e $TEMP_DIR/installwatch-$INSTW_VERSION/installwatch.so ]] ; then
 echo "Installwatch Libraries successfully built."
else
 echo "Installwatch Libraries build Failed!" && exit 1
fi
# build the package
echo "Creating Package Tree..."
mkdir -p $PKG_DIR/usr/libexec/src2pkg
chmod 755 $PKG_DIR/usr/libexec/src2pkg
cp -a $CWD/Resources/libexec/* $PKG_DIR/usr/libexec/src2pkg
cp -a $TEMP_DIR/installwatch-$INSTW_VERSION/installwatch.so $PKG_DIR/usr/libexec/src2pkg
chown root.root $PKG_DIR/usr/libexec/src2pkg/*
chmod 755 $PKG_DIR/usr/libexec/src2pkg/installwatch*
chmod 644 $PKG_DIR/usr/libexec/src2pkg/FUNCTIONS
chmod 644 $PKG_DIR/usr/libexec/src2pkg/DEFINES

# Install static tar
mkdir -p $PKG_DIR/usr/libexec/src2pkg/static
cp -a $TEMP_DIR/tar-$TAR_VERSION/src/tar $PKG_DIR/usr/libexec/src2pkg/static
# busybox
cp -a $TEMP_DIR/busybox-$BB_VERSION/_install/bin/busybox $PKG_DIR/usr/libexec/src2pkg/static
# fix perms
chown root.root $PKG_DIR/usr/libexec/src2pkg/static/*
chmod 755 $PKG_DIR/usr/libexec/src2pkg/static/*


# src2pkg
mkdir -p $PKG_DIR/usr/sbin 
cp -a $CWD/Resources/sbin/src2pkg $PKG_DIR/usr/sbin
chown root.root $PKG_DIR/usr/sbin/src2pkg
chmod 755 $PKG_DIR/usr/sbin/src2pkg

# trackinstall
cp -a $CWD/Resources/sbin/trackinstall $PKG_DIR/usr/sbin
chown root.root $PKG_DIR/usr/sbin/trackinstall
chmod 755 $PKG_DIR/usr/sbin/trackinstall

# disrpm
mkdir -p $PKG_DIR/usr/bin
cp -a $CWD/Resources/bin/disrpm $PKG_DIR/usr/bin
chown root.root $PKG_DIR/usr/bin/disrpm
chmod 755 $PKG_DIR/usr/bin/disrpm

# tracklist can be run by non-root users so place it in /usr/bin
#mkdir -p $PKG_DIR/usr/bin
#cp -a $CWD/Resources/bin/tracklist $PKG_DIR/usr/bin
#chown root.root $PKG_DIR/usr/bin/tracklist
#chmod 755 $PKG_DIR/usr/bin/tracklist

# config files
mkdir -p $PKG_DIR/etc/src2pkg 
cp -a $CWD/Resources/etc/* $PKG_DIR/etc/src2pkg
chown root.root $PKG_DIR/etc/src2pkg/*
chmod 755 $PKG_DIR/etc/src2pkg
chmod 644 $PKG_DIR/etc/src2pkg/*

# docs
mkdir -p $PKG_DIR/usr/doc/$NAME-$VERSION
cp -a $CWD/Resources/doc/* $PKG_DIR/usr/doc/$NAME-$VERSION
cp -a $TEMP_DIR/installwatch-$INSTW_VERSION/README $PKG_DIR/usr/doc/$NAME-$VERSION/README.installwatch
if [[ -e  ../$CWD/ChangeLog ]] ; then
 rm -f $PKG_DIR/usr/doc/$NAME-$VERSION/ChangeLog
 cp -a ../$CWD/ChangeLog $PKG_DIR/usr/doc/$NAME-$VERSION/
fi
chown -R root.root $PKG_DIR/usr/doc/$NAME-$VERSION
cd $PKG_DIR/usr/doc/$NAME-$VERSION ;
find . -type f -exec chmod 644 {} \;

# manpage(s)
mkdir -p $PKG_DIR/usr/man/man1
cp -a $CWD/Resources/man/* $PKG_DIR/usr/man/man1
gzip $PKG_DIR/usr/man/man1/*

# slack-desc and doinst.sh
mkdir -p $PKG_DIR/install 
cp -a $CWD/slack-desc $PKG_DIR/install
cp $CWD/doinst.sh $PKG_DIR/install

echo "Creating Package..."
cd $PKG_DIR ;
# makepkg -l y -c n $PACKAGE 1> /dev/null 2> /dev/null

$TEMP_DIR/tar-1.13/src/tar cvf $NAME-$VERSION-$ARCH-$BUILD.tar .
gzip -9 $NAME-$VERSION-$ARCH-$BUILD.tar
mv $NAME-$VERSION-$ARCH-$BUILD.tar.gz ../$NAME-$VERSION-$ARCH-$BUILD.tgz

echo "Finished Package is located in:" 
echo "$PACKAGE"
echo ""
echo "Use 'installpkg $NAME-$VERSION-$ARCH-$BUILD.tgz' to install the package."
echo "Then you can use the 'src2pkg' program to build sources and/or generate"
echo "src2pkg scripts for build customization."

if [[ $1 = "--cleanup" ]] ; then
 cd $TEMP_DIR ;
 rm -rf $NAME-$VERSION-$ARCH-$BUILD
 rm -rf busybox-$BB_VERSION
 rm -rf installwatch-$INSTW_VERSION
 rm -rf tar-$TAR_VERSION
fi