#!/bin/bash
# Version: 1.7 GSB Package SlackBuild.
# Copyright (c) 2007,2008,2009 Darren 'Tadgy' Austin <darren (at) gnomeslackbuild.org>
# Copyright (c) 2007,2008,2009 Steve Kennedy <steve (at) gnomeslackbuild.org>
# All rights reserved.
#
# Licenced under the terms of the GNU General Public Licence version 3.
#
# 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.

# Package variables.
BUILD=3
VERSION=3.2.0.10
WITH_LANGUAGES=${WITH_LANGUAGES:-"YES"}
LANGUAGES="en-US en-GB de fr it"

# List any packages here that are required to build this package.
REQUIRED_PACKAGES="gtk+2 neon libsndfile gnome-vfs boost libgnomeui sane zlib \
                   librsvg libjpeg jre jdk apache-ant rsync git seamonkey"

# We will want to build with gtk/kde and native widgets.
KDE_REQUIRED_PACKAGES="kdebase-workspace kdelibs qt"

# Build variables.
TAG=${TAG:-gsb}
ARCH=${ARCH:-i486}
TUNE=${TUNE:-i486}
DISTRO=${DISTRO:-slackware}
TMP=${TMP:-/tmp}
PKGDEST=${PKGDEST:-$TMP}

# Script variables.
PKGNAME=$(basename $0 .SlackBuild)
PKG=$TMP/package-$PKGNAME
CWD=$(pwd)
NOCLEANUP=0
FORCEBUILD=0

# Usage.
function usage() {
  cat << EOF
Usage: ${0##*/} [options]

Options:  --force       The package will not be built if a package of the same
                        name is already installed, or any of the packages
                        required to build are missing.  This option over-rides
                        these checks and attempts a build anyway.
          --no-cleanup  By default any temporary source, build and package
                        directories will be deleted once the package is built.
                        This option prevents those files from being removed.
          --help        Show this help screen.
EOF
}

# Parse command line arguments.
while [ $# -gt 0 ]; do
  if [ "$1" = "-force" ] || [ "$1" = "--force" ]; then
    FORCEBUILD=1
    shift
  elif [ "$1" = "-no-cleanup" ] || [ "$1" = "--no-cleanup" ]; then
    NOCLEANUP=1
    shift
  elif [ "$1" = "-help" ] || [ "$1" = "--help" ]; then
    usage
    exit 0
  else
    echo "${0##*/}: Unknown option: $1"
    exit 1
  fi
done

# Package requirements and installation checks.
[ "$FORCEBUILD" = "0" ] && {
  function check_installed() {
    ls -1 /var/log/packages | grep "^${1}-[^-]*-[^-]*-[^-]*$" >/dev/null 2>&1
    return $?
  }

  check_installed "$PKGNAME" && {
    echo "${0##*/}: Remove installed '$PKGNAME' package before build."
    exit 1
  }

  for REQ in $REQUIRED_PACKAGES; do
    check_installed "$REQ" || {
      echo "${0##*/}: Required package '$REQ' not installed."
      exit 1
    }
  done
  for REQ in $KDE_REQUIRED_PACKAGES; do
    check_installed "$REQ" || {
      echo "${0##*/}: KDE package '$REQ' required for build to stay compatible with Slackware."
      slapt-get --install $REQ || exit 1
    }
  done
}

# Temporary space and package storage.
mkdir -p $TMP
rm -rf $PKG
mkdir -p $PKG
mkdir -p $PKG/install
mkdir -p $PKGDEST

# Decompress archive.
cd $TMP &&
tar xzf $CWD/ooo-build-$VERSION.tar.gz &&
cd ooo-build-$VERSION || exit 1

# Apply ARCH specific patches.
if [ "$ARCH" = "i486" -o "$ARCH" = "i586" -o "$ARCH" = "i686" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
elif [ "$ARCH" = "x86_64" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
elif [ "$ARCH" = "powerpc" ]; then
  echo "${0##*/}: Applying any patches for $ARCH"
  #cat $CWD/patches/foo.patch | patch -p0 --verbose
fi

# Configure, Tuning, GCC and Make options.
CONFIGURE_FLAGS=${GSB_CONFIGURE_FLAGS:-""}
if [ "$ARCH" = "i486" -o "$ARCH" = "i586" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -march=$ARCH -mtune=$TUNE"}
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  TUNE_CFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "s390" ]; then
  TUNE_CFLAGS="-O2"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
    TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -fPIC"}
    LIBDIRSUFFIX="64"
    CONFIGURE_FLAGS="$CONFIGURE_FLAGS --without-java"
elif [ "$ARCH" = "powerpc" ]; then
  TUNE_CFLAGS=${GSB_TUNE_CFLAGS:-"-O2 -march=$ARCH"}
fi
EXTRA_CFLAGS=${GSB_EXTRA_CFLAGS:-""}
MAKE_FLAGS=${GSB_MAKE_FLAGS:-""}

# Configure for GNOME SlackBuild
cp $CWD/GNOMESlackBuild*.conf.in ./distro-configs || exit 1
zcat $CWD/ooo-build.gsb.diff.gz | patch -p1 

# We need to temporarily spam a directory on the build machine
mkdir -p /usr/share/openclipart
[ -z "${ANT_HOME}" ] && . /etc/profile.d/ant.sh
. /etc/profile.d/qt4.sh
export QT4DIR="${QT4DIR}"
export QT4INC="$QT4DIR/include"

# Support multiple languages
if [ "${WITH_LANGUAGES}" = "YES" ]; then
  LANGUAGES="en-US ${LANGUAGES}"
else
  LANGUAGES="en-US"
fi;

CFLAGS="$TUNE_CFLAGS $EXTRA_CFLAGS" CXXFLAGS="$TUNE_CFLAGS $EXTRA_CFLAGS" \
  ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib \
  --mandir=/usr/man \
  $CONFIGURE_FLAGS \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --with-distro=GNOMESlackBuild${LIBDIRSUFFIX} \
  --with-ant-home=/usr/lib${LIBDIRSUFFIX}/apache-ant \
  --disable-odk \
  --disable-pam \
  --disable-pam-link \
  --disable-post-install-scripts \
  --with-lang="${LANGUAGES}" \
  --enable-access \
  --enable-cairo \
  --disable-kde \
  --disable-ldap \
  --disable-openldap \
  --enable-kde4 \
  --enable-gtk \
  --with-system-cairo \
  --with-system-neon \
  --with-system-icu \
  --with-system-expat \
  --with-system-boost \
  --with-system-mozilla=seamonkey \
  --disable-mono \
  --with-binsuffix=3.2 \
  --with-docdir=/usr/doc/openoffice.org \
  --with-gcc-speedup=ccache \
  --with-openclipart=/usr/share/openclipart \
  --with-drink=ale \
  || exit 1

# To download the source packages, uncomment the "./download" line
# below.  Or, if local copies of the source packages exist, uncomment
# the next line which copies them in to place.  Do one or the other.
#
./download
#cp -a $CWD/downloaded_resources/* ./src/

# Build and Install
make || exit 1

# Do a full install
cd bin ; OODESTDIR=$PKG ./package-ooo || exit 1

# Split out language packs
if [ "${WITH_LANGUAGES}" = "YES" ]; then
  cd $PKG ; 
  for lang in ${LANGUAGES//en-US/} ; do
    echo "Splitting langpack $lang."
    (
    mkdir -p $TMP/$PKGNAME-l10n-$lang ;
    tar cf - --remove-files $(find . -name "README*$lang*" \
                   -o -name "LICENSE*${lang}*" \
		   -o -type d -name "${lang}" \
		   -o -name "Lang_*${lang}.xba" \
                   -o -name "Langpack-${lang}.xcu" \
		   -o -name "*${lang}.oxt" ) | ( cd $TMP/$PKGNAME-l10n-$lang ; tar xf - )
    mkdir -p $TMP/$PKGNAME-l10n-$lang/install &&
    cat $CWD/l10n/slack-desc.openoffice3-l10n-${lang} > \
      $TMP/$PKGNAME-l10n-$lang/install/slack-desc ;
    # doinst dictionary installation
    cat $CWD/doinst-l10n.sh | sed "s,@LIBDIRSUFFIX@,${LIBDIRSUFFIX},g" \
      | sed "s,@LANG@,${lang//en-GB/en},g" > $TMP/$PKGNAME-l10n-$lang/install/doinst.sh ;
    ( cd $TMP/$PKGNAME-l10n-$lang ;
      makepkg -p -l y -c n $PKGDEST/$PKGNAME-l10n-${lang}-${VERSION//-/_}-noarch-${BUILD}${TAG}.txz)
    )
    rm -fr $TMP/$PKGNAME-l10n-$lang ;
  done;
fi;

# Add /usr/share/pixmaps directory and link icons to it
mkdir -p $PKG/usr/pixmaps
( cd $PKG/usr/pixmaps
  for APP in base calc draw impress math writer ; do
    ln -sf /usr/share/icons/hicolor/48x48/apps/ooo-${APP}3.2.png . ;
  done
)

# Make sure our GNOME icons specify that we're using 3.2 since both
# ooo 3.2 and ooo 2.4 can exist on the same system at once
for i in $PKG/usr/share/applications/*.desktop ;
do 
   sed -i '/^Name/s/$/ 3.2/g' $i; 
done;

# Copy menus 
mkdir -p $PKG/etc/gnome/xdg/menus &&
mkdir -p $PKG/usr/share/desktop-directories &&
zcat $CWD/OpenOffice3.directory.gz > $PKG/usr/share/desktop-directories/OpenOffice3.directory &&
zcat $CWD/gnome-menus-ooo3.menu.gz > $PKG/etc/gnome/xdg/menus/gnome-menus-ooo3.menu || exit 1

# Preserve files
mv $PKG/etc/bash_completion.d/ooffice3.2.sh $PKG/etc/bash_completion.d/ooffice3.2.sh.new

# Strip debugging symbols.
{ find $PKG | xargs file | egrep "executable|shared object" | grep "ELF" | \
  cut -d: -f1 | xargs strip --strip-unneeded ; } 2>/dev/null

# Link extra documentation into /usr/doc
mkdir -p $PKG/usr/doc/$PKGNAME-$VERSION
for i in README README.html LICENSE LICENSE.html THIRDPARTYLICENSEREADME.html ; do
  ln -s $PKG/usr/lib${LIBDIRSUFFIX}/ooo-3.2/$i $PKG/usr/doc/$PKGNAME-$VERSION ;
done
find $PKG/usr/doc/$PKGNAME-$VERSION/ -type f -exec chmod 644 {} \;
chown -R root:root $PKG/usr/doc/$PKGNAME-$VERSION

# Compress and fix manpage links.
[ -e $PKG/usr/man ] && {
  find $PKG/usr/man -type f -name \*.? -exec gzip -9f {} \;
  find $PKG/usr/man -type l -name \*.? -printf \
    "( cd '%h'; [ -e '%l.gz' ] &&
     { rm -f '%f'; ln -sf '%l.gz' '%f.gz'; } );\n" | bash
}

# Package meta files
for FILE in slack-desc slack-required slack-conflicts slack-suggests
do
  [ -e $CWD/$FILE ] && {
    cat $CWD/$FILE >>$PKG/install/$FILE
  }
done

# doinst dictionary installation
cat $CWD/doinst.sh | sed "s,@LIBDIRSUFFIX@,${LIBDIRSUFFIX},g" \
  | sed "s,@LANG@,en,g" > $PKG/install/doinst.sh ;

# pause
#echo "Wait to inspect doinst.sh"
#read; 

# Create the package
cd $PKG
makepkg -p -l y -c n $PKGDEST/$PKGNAME-${VERSION//-/_}-$ARCH-${BUILD}${TAG}.txz || exit 1

# Make sure to clean up build machine of any kde packages to prevent 
# unwanted dependencies. 
removepkg $KDE_REQUIRED_PACKAGES
# Cleanup
if [ "$NOCLEANUP" = "0" ]; then
  rm -rf $PKG $TMP/$PKGNAME-$VERSION
fi;
