#!/bin/bash
#
#  ivi.SlackBuild is free software; you can redistribute
#  it and/or modify it under the terms of the GNU General Public
#  License as published by the Free Software Foundation; either
#  version 2 of the License, or any later version.
#
#  ivi.SlackBuild is distributed in the hope that it
#  will be useful, but WITHOUT ANY WARRANTY; without even the
#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
#  PURPOSE.  See the GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public
#  License along with this program; if not, write to the Free
#  Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
#  MA 02111-1307, USA
#
# SlackBuild for IVI (Icarus Verilog Interactive) v0.4-pre-20031121
# http://sourceforge.net/projects/ivi
#
# Author: Luis ( luis at riseup d0t net )
#

# Look for slackbuildrc
if [ -f ~/.slackbuildrc ]; then
  source ~/.slackbuildrc
elif [ -f /etc/slackbuildrc ]; then
  source /etc/slackbuildrc
fi

# Set variables
CWD="$(pwd)"
SRC_NAME="ivi"
PKG_NAME="ivi"
ARCH="i486"
SRC_VERSION="0.4-pre-20031121"
PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')"
BUILD=${BUILD:=1ls}
SRC_DIR=${SRC_DIR:=$CWD}/$PKG_NAME
TMP=${TMP:=/tmp}
PKG=${PKG:=$TMP/package-$PKG_NAME}
REPOS=${REPOS:=$TMP}
PREFIX=${PREFIX:=/usr}
PKG_WORK="$TMP/$SRC_NAME"
CONF_OPTIONS=${CONF_OPTIONS:=--enable-release}
NUMJOBS=${NUMJOBS:=-j3}

# Set error codes (used by createpkg)
ERROR_WGET=31;      ERROR_MAKE=32;      ERROR_INSTALL=33
ERROR_MD5=34;       ERROR_CONF=35;      ERROR_HELP=36
ERROR_TAR=37;       ERROR_MKPKG=38;     ERROR_GPG=39
ERROR_PATCH=40;     ERROR_VCS=41;       ERROR_MKDIR=42

# Clean up any leftovers of previous builds
rm -rf "$PKG_WORK" 2> /dev/null
rm -rf "$PKG" 2> /dev/null

# Create directories if necessary
mkdir -p "$SRC_DIR" || exit $ERROR_MKDIR
mkdir -p "$PKG" || exit $ERROR_MKDIR
mkdir -p "$REPOS" || exit $ERROR_MKDIR
mkdir -p "$PKG_WORK" || exit $ERROR_MKDIR

# Dowload source if necessary
SRC="$SRC_NAME-0.4-pre-20031121.tar.gz"
URL="http://downloads.sourceforge.net/ivi/$SRC"

if [ ! -s "$SRC_DIR/$SRC" ] || ! gzip -t "$SRC_DIR/$SRC" 2> /dev/null; then
  wget "$URL" -O "$SRC_DIR/$SRC" || exit $ERROR_WGET
fi

# Untar
cd "$PKG_WORK"
tar --no-same-owner --no-same-permissions -xvf "$SRC_DIR/$SRC" || exit $ERROR_TAR
PKG_SRC=`ls -l | awk '/^d/ { print $8 }'`
cd "$PKG_SRC"

# Patch source
patches="ivi-0.4-pre-20031121-gcc3.4.patch
         $PKG_NAME.diff $PKG_NAME-$PKG_VERSION.diff
         $PKG_NAME-$PKG_VERSION-$ARCH.diff $PKG_NAME-$ARCH.diff"
for patch in $patches; do
  if [ -f "$CWD/$patch" ]; then
    patch -Np1 < "$CWD/$patch" || exit $ERROR_PATCH
  elif [ -f "$CWD/patches/$patch" ]; then
    patch -Np1 < "$CWD/patches/$patch" || exit $ERROR_PATCH
  fi
done

# Configure
./configure $CONF_OPTIONS || exit $ERROR_CONF

# Compile
make $NUMJOBS || exit $ERROR_MAKE

# Install
make install prefix="$PKG/$PREFIX/share/ivi" || exit $ERROR_INSTALL

# Don't overwrite files under $PKG/$PREFIX/share/ivi/etc
( cd "$PKG/$PREFIX/share/ivi/etc"
  mv -f system.conf system.conf.new
  mv -f site.conf site.conf.new
  mv -f ivi.conf.rct ivi.conf.rct.new
)

# Install /usr/bin wrapper (taken from Debian's package)
mkdir -p "$PKG/$PREFIX/bin" || exit $ERROR_MKDIR
cat << EOSCRIPT > "$PKG/$PREFIX/bin/ivi"
#!/bin/sh
exec /usr/share/ivi/bin/ivi "\$@"
EOSCRIPT

# Fix permissions
find "$PKG" -type f -exec chmod 644 {} \;
chmod 755 "$PKG/$PREFIX/share/ivi/bin/ivi" "$PKG/$PREFIX/bin/ivi"
find "$PKG/$PREFIX/share/ivi/modules" -name "*.vpi" -exec chmod 755 {} \;

# Strip binaries
( cd "$PKG"
  find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \
    xargs strip --strip-unneeded 2> /dev/null
  find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \
    xargs strip --strip-unneeded 2> /dev/null
)

# Install documentation
DOCS="LIMITATIONS README *.txt"
mkdir -p "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" || exit $ERROR_MKDIR
cp -a $DOCS "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" 2> /dev/null
mv "$PKG/$PREFIX/share/ivi/doc/"{getting_started,ivi_commands} \
  "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION"
rmdir "$PKG/$PREFIX/share/ivi/doc"

# Add package description (slack-desc)
mkdir -p "$PKG/install" || exit $ERROR_MKDIR
cat << EODESC > "$PKG/install/slack-desc"
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

   |-----handy-ruler-----------------------------------------------------------|
ivi: ivi (Icarus Verilog Interactive)
ivi:
ivi: IVI is a graphical, interactive user-interface to various Open-Source HDL
ivi: simulators. IVI allows the user to control simulation and view signal
ivi: waveforms as the data is produced by the simulation.
ivi:
ivi: For more information, http://sourceforge.net/projects/ivi
ivi:
ivi:
ivi:
ivi:
EODESC

# Add a post-installation script (doinst.sh)
cat << EOSCRIPT > "$PKG/install/doinst.sh"
config() {
  NEW="\$1"
  OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)"
  # If there's no config file by that name, mv it over:
  if [ ! -r \$OLD ]; then
    mv \$NEW \$OLD
  elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then
    # toss the redundant copy
    rm \$NEW
  fi
  # Otherwise, we leave the .new copy for the admin to consider...
}

config usr/share/ivi/etc/system.conf.new
config usr/share/ivi/etc/site.conf.new
config usr/share/ivi/etc/ivi.conf.rct.new
EOSCRIPT

# Build the package
cd "$PKG"
makepkg -l y -c n "$REPOS/$PKG_NAME-$PKG_VERSION-$ARCH-$BUILD.tgz" || exit $ERROR_MKPKG

# Delete source and build directories if requested
if [ "$CLEANUP" == "yes" ]; then
  rm -rf "$PKG_WORK" "$PKG"
fi