#!/bin/sh

# Slackware build script for QtiPlot

# Copyright 2011-2012  Petar Petrov, ppetrov@paju.oulu.fi
# 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.

PRGNAM=QtiPlot
VERSION=${VERSION:-0.9.8.9}
BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}

SRCNAM=$(echo $PRGNAM | tr A-Z a-z)

QTEXENGINE=QTeXEngine-0.3-opensource
UNOFPLUGIN=importOPJ-20111106

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) export ARCH=i486 ;;
    arm*) export ARCH=arm ;;
       *) export ARCH=$( uname -m ) ;;
  esac
fi

CWD=$(pwd)
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
  QMAKESPEC="linux-g++"
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  QMAKESPEC="linux-g++"
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  QMAKESPEC="linux-g++-64"
else
  SLKCFLAGS="-O2"
  QMAKESPEC="linux-g++"
fi

# Define these here, as numbers change between Slackware releases. The
# folder names are used for some documentation path fixes, needed to
# generate the html manual later on.
DOCBOOK=dsssl-stylesheets-1.79
CHUNK=xsl-stylesheets-1.76.1
DOCBOOKX=xml-dtd-4.5

set -e

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
mkdir $PRGNAM-$VERSION
cd $PRGNAM-$VERSION
tar xvf $CWD/$SRCNAM-$VERSION.tar.bz2
unzip $CWD/$QTEXENGINE.zip
tar xvf $CWD/$UNOFPLUGIN.tar.gz
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \
 -exec chmod 755 {} \; -o \
 \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
 -exec chmod 644 {} \;

# Copy QTeXEngine and importOPJ to their locations to be built later
cp -a QTeXEngine $SRCNAM-$VERSION/3rdparty
cp -a $UNOFPLUGIN/qtiplot/src/plugins $SRCNAM-$VERSION/qtiplot/src
cp -a $UNOFPLUGIN/qtiplot/importOPJ.pro $SRCNAM-$VERSION/qtiplot
cd $SRCNAM-$VERSION

# Patches for recent libpng, sip, gsl, etc
# thanks to slack_jack, Raveriux, ponce, Arch and Gentoo
patch -p0 -d 3rdparty/qwtplot3d < $CWD/qwtplot3d-libpng15.patch
patch -p1 < $CWD/sip-4.15.patch
patch -p1 < $CWD/qtiplot-0.9.8.9-private.patch
patch -p1 < $CWD/pyqt-4.11.patch
patch -p1 < $CWD/qtiplot-0.9.8.9_gsl-2.patch

# Use the custom build.conf
cp $CWD/build.conf.slack build.conf

# Make qtiplot.pro aware of the unofficial importOPJ plugin. Thanks to
# the author of the plugin, Stephan Zevenhuizen. For more info visit
# this site: http://www.staff.science.uu.nl/~zeven101/qtiplot.html
patch -p1 -i $CWD/importOPJ.patch
sed -i "143 a Q_IMPORT_PLUGIN(FreeSoftwareQtiPlotImportOPJ);" qtiplot/src/core/main.cpp

# Fix qwtplot3d
sed -i "10 a #include <GL/glu.h>" 3rdparty/qwtplot3d/include/qwt3d_openglhelper.h

# Make a few path fixes to qtiplot.pro
sed -i "s:/usr/local:/usr/share:" qtiplot/qtiplot.pro
sed -i "s:/share/man:/man:" qtiplot/qtiplot.pro
sed -i "s:/share/doc/qtiplot:/doc/$PRGNAM-$VERSION:" qtiplot/qtiplot.pro

# Point to the right places of qt-assistant-compat, libreoffice (when
# installed), latex, java, the QtiPlot html manual and fitPlugins
sed -i "s:<QAssistantClient>:<QtAssistant/qassistantclient.h>:" qtiplot/src/core/ApplicationWindow.cpp
sed -i "s:/usr/bin/soffice:/usr/bin/libreoffice:" qtiplot/src/core/ApplicationWindow.cpp
sed -i "s:/usr/bin/latex:/usr/share/texmf/bin/latex:" qtiplot/src/core/ApplicationWindow.cpp
sed -i "s:/usr/bin/java:/usr/lib${LIBDIRSUFFIX}/java/bin/java:" qtiplot/src/core/ApplicationWindow.cpp
sed -i "s:/index.html:/html/index.html:" qtiplot/src/core/ApplicationWindow.cpp
sed -i "s:/local/qtiplot/fitPlugins:/lib${LIBDIRSUFFIX}/qtiplot/plugins:" qtiplot/src/core/ApplicationWindow.cpp

# Path fixes, needed to generate the html manual
sed -i "s:stylesheet/dsssl/modular:${DOCBOOK}:" manual/qtiplot.dsl
sed -i "s:stylesheet/nwalsh:${CHUNK}:" manual/qtiplot_html.xsl
sed -i "s:schema/dtd/4.4:${DOCBOOKX}:" manual/docbook-en/index.docbook

# Build QtiPlot's qwt
cd 3rdparty/qwt
qmake
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
make -j1

# Build QtiPlot's qwtplot3d
cd ../qwtplot3d
qmake
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
make -j1

# Build QTeXEngine
cd ../QTeXEngine
qmake
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
make -j1

# Build importOPJ
cd ../../qtiplot
qmake importOPJ.pro
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
make -j1

# Make the html manual. If you want to generate the handbook as a PDF,
# change "web" to "en" below and make sure you have installed dblatex.
cd ../manual
make -j1 web

# Build QtiPlot
cd ../qtiplot
qmake qtiplot.pro "QMAKESPEC=$QMAKESPEC"
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
make -j1 "QMAKESPEC=$QMAKESPEC"
make -j1 install INSTALL_ROOT=$PKG

# Generate translations and copy them to their proper place
lrelease qtiplot.pro
mkdir -p $PKG/usr/share/qtiplot/translations
cp translations/*.qm $PKG/usr/share/qtiplot/translations

# Copy some python examples
mkdir -p $PKG/usr/share/qtiplot/python-examples
cp examples/python/* $PKG/usr/share/qtiplot/python-examples

# Build fitPlugins
cd ../fitPlugins
qmake "QMAKESPEC=$QMAKESPEC"
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
make -j1 "QMAKESPEC=$QMAKESPEC"
make -j1 install INSTALL_ROOT=$PKG
cd ..

find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true

find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done

# Menu item, icon and mime types. The .xml is from Arch
mkdir -p $PKG/usr/share/{pixmaps,applications,mime/packages}
cp qtiplot_logo.png $PKG/usr/share/pixmaps/qtiplot.png
cp $CWD/qtiplot.desktop $PKG/usr/share/applications
cp $CWD/qtiplot.xml $PKG/usr/share/mime/packages

mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a \
  README.html gpl_licence.txt qtiplot.css qtiplot_logo.png \
  $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
cat $CWD/build.conf.slack > $PKG/usr/doc/$PRGNAM-$VERSION/build.conf.slack

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}