#################################################################
## Generic template for SlackBuilds
##
## Version 1.0.0 - Luis ( luis at riseup d0t net)
##                 Alves ( rudsonalves at yahoo d0t com d0t br )
#################################################################
#!/bin/bash
<head> off
#
#  [[PROGRAM NAME]].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.
#
#  [[PROGRAM NAME]].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 [[PROGRAM NAME]], by [[SLACKBUILD AUTHOR]]
# requires: [[REQUIRES]]
# tested: [[PROGRAM NAME]]-[[VERSION]]
#
</head>

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

<set_variables> off
# Set variables
CWD="$(pwd)"
SRC_NAME="[[SOURCE NAME]]"
PKG_NAME="[[PACKAGE NAME]]"
ARCH=${ARCH:=[[ARCH]]}
SRC_VERSION=${VERSION:=[[VERSION]]}
PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')"
BUILD=${BUILD:=[[BUILD NUMBER]][[SLACKBUILD AUTHOR INITIALS]]}
SRC_DIR=${SRC_DIR:=$CWD}/$PKG_NAME
TMP=${TMP:=/tmp}
PKG=${PKG:=$TMP/package-$PKG_NAME}
REPOS=${REPOS:=$TMP}
PREFIX=${PREFIX:=[[PREFIX]]}
PKG_WORK="$TMP/$SRC_NAME"
CONF_OPTIONS=${CONF_OPTIONS:="[[OTHER CONFIGURE ARGS]]"}
NUMJOBS=${NUMJOBS:="[[NUMBER OF JOBS]]"}
</set_variables>

<slkflags> off
# Set system libraries' path and optmization flags based on $ARCH
LIBDIR="$PREFIX/lib"

if [ "$ARCH" = "i386" ]; then
  SLKCFLAGS="-O2 -march=i386 -mcpu=i686"
elif [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mcpu=i686"
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686"
elif [ "$ARCH" = "s390" ]; then
  SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIR="$PREFIX/lib64"
  LDFLAGS="-L/lib64 -L/usr/lib64"
fi

QTDIR="$LIBDIR/qt"
KDEDIRS="$PREFIX"
PATH="$PATH:$LIBDIR/kde4/libexec"

if [ ! "$XDG_CONFIG_DIRS" == "" ]; then
  XDG_CONFIG_DIRS=$XDG_CONFIG_DIRS:/etc/kde/xdg
else
  XDG_CONFIG_DIRS=/etc/xdg:/etc/kde/xdg
fi

</slkflags>

<error_codes> off
# 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
</error_codes>

<start_structure> off
# 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

</start_structure>

<create_build_user_and_group> off
# Creating build user and group
if ! grep -qe "^$PKG_NAME:" /etc/group; then
  groupadd $PKG_NAME
fi
if ! grep -qe "^$PKG_NAME:" /etc/passwd; then
  useradd $PKG_NAME -g $PKG_NAME
fi
</create_build_user_and_group>

<download_source> off
# Dowload source if necessary
SRC="[[SOURCE NAME CONSTRUCTION STRING]]"
URL="[[DOWNLOAD FOLDER URL]]/$SRC"

if [ ! -s "$SRC_DIR/$SRC" ] || ! [[DECOMPRESSOR]] [[DECOMPRESSOR TEST FLAG]] "$SRC_DIR/$SRC" 2> /dev/null; then
  wget "$URL" -O "$SRC_DIR/$SRC" || exit $ERROR_WGET
fi
</download_source>

<svn_source> off
# Get svn source code
cd "$SRC_DIR"
SND_DIR="`basename [[DOWNLOAD FOLDER URL]]`"

if [ "`find "$SRC_DIR/" -name .svn`" != "" ] && [ -d "$SRC_DIR/$SND_DIR" ]; then
  cd $SND_DIR
  svn update || exit $ERROR_VCS
else
  svn checkout [[DOWNLOAD FOLDER URL]] $SND_DIR || exit $ERROR_VCS
  cd $SND_DIR
fi

PKG_VERSION="`svn info | awk '/Last Changed Rev:/ { print $4 }'`_svn"

# Copy svn source
cd "$PKG_WORK"
cp -a $SRC_DIR/* .
PKG_SRC="$PWD/$SND_DIR"
cd "$PKG_SRC"
</svn_source>

<md5sum_check> off
MD5SUM_URL="[[MD5SUM CODE]]"

if [ ${#MD5SUM_URL} -eq 32 ]; then
    MD5SUM_SRC="$(md5sum "$SRC_DIR/$SRC" | cut -c-32 )"
    [ "$MD5SUM_SRC" == "$MD5SUM_URL" ] || exit $ERROR_MD5

# Download source's MD5 checksum if necessary and check it
if [ ! -s "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" ]; then
   wget "$URL.[[MD5SUM EXTENSION]]" -O "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_WGET
fi

md5sum -c "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_MD5
</md5sum_check>

<gpg_signature_check> off
# Import minimized signing key from
if echo [[SIGNING KEY URL]] | grep -q -v "SIGNING KEY URL"; then
  lynx -dump [[SIGNING KEY URL]] | gpg --import || exit $ERROR_GPG
elif echo [[SIGNING KEY ID]] | grep -q -v "SIGNING KEY ID"; then
  gpg --recv-keys [[SIGNING KEY ID]] || exit $ERROR_GPG
else
  gpg --import << EOKEY || exit $ERROR_GPG
[[SIGNING KEY]]
EOKEY
fi

# Download source's signature if necessary and check it
if echo [[SIGNING URL]] | grep -q -v "SIGNING URL"; then
  SIGNATURE="`basename [[SIGNING URL]]`"
  if [ ! -s "$SRC_DIR/$SIGNATURE" ]; then
    wget "[[SIGNING URL]]" -O "$SRC_DIR/$SIGNATURE" || exit $ERROR_WGET
  fi
else
  if [ -s "$SRC_DIR/$SRC.sig" ]; then
    SIGNATURE="$SRC.sig"
  elif [ -s "$SRC_DIR/$SRC.asc" ]; then
    SIGNATURE="$SRC.asc"
  else
    echo Trying to get signature file from $URL.sig...
    if wget "$URL.sig" -O "$SRC_DIR/$SRC.sig"; then
      SIGNATURE="$SRC.sig"
    else
      rm $SRC_DIR/$SRC.sig
      echo Trying to get signature file from $URL.asc...
      if wget "$URL.asc" -O "$SRC_DIR/$SRC.asc"; then
        SIGNATURE="$SRC.asc"
      else
        rm $SRC_DIR/$SRC.asc
        echo "Error getting source's signature file"
        exit $ERROR_GPG
      fi
    fi
  fi
fi

echo Checking $SRC_DIR/$SRC with gpg using $SRC_DIR/$SIGNATURE...
gpg --verify "$SRC_DIR/$SIGNATURE" "$SRC_DIR/$SRC" || exit $ERROR_GPG
echo Success.
</gpg_signature_check>

<untar_source> off
# Untar
cd "$PKG_WORK"
[[UNPACKER]] [[UNPACKER FLAGS]] "$SRC_DIR/$SRC" || exit $ERROR_TAR
PKG_SRC="$PWD/`ls -l | awk '/^d/ { print $NF }'`"
cd "$PKG_SRC"
</untar_source>

<patch_source> off
# Patch source
patches="[[PATCH FILES]]
         $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 -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/$patch" || exit $ERROR_PATCH
  elif [ -f "$CWD/patches/$patch" ]; then
    patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/patches/$patch" || exit $ERROR_PATCH
  elif [ -f "$CWD/$patch.gz" ]; then
    gzip -dc "$CWD/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH
  elif [ -f "$CWD/patches/$patch.gz" ]; then
    gzip -dc "$CWD/patches/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH
  fi
done

if echo [[PATCH URLS]] | grep -q -v "PATCH URLS"; then
  for patch_url in [[PATCH URLS]]; do
    patch="`basename $patch_url`"
    if [ ! -s "$SRC_DIR/$patch" ]; then
      wget "$patch_url" -O "$SRC_DIR/$patch" || exit $ERROR_WGET
    fi
    if [ "`basename $patch .gz`" != "$patch" ]; then
      gzip -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH
    elif [ "`basename $patch .bz2`" != "$patch" ]; then
      bzip2 -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH
    else
      patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$SRC_DIR/$patch" || exit $ERROR_PATCH
    fi
  done
fi
</patch_source>

<files_permissions> off
# Set permissions
chown -R root:root .
find . \( -perm 777 -o -perm 775 -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 {} \;
</files_permissions>

<configure> off
# Configure
mkdir -p build
cd build
  cmake \
    -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
    -DCMAKE_INSTALL_PREFIX=$PREFIX \
    -DMAN_INSTALL_DIR=%PREFIX/man \
    -DLIB_INSTALL_DIR=$LIBDIR \
    -DSYSCONF_INSTALL_DIR=/etc/kde \
    -DKDE_DISTRIBUTION_TEXT="volkerdi@slackware.com" \
    ..
</configure>

<make_package> off
   # Compile
   make $NUMJOBS || exit $ERROR_MAKE
</make_package>

<install_package> off
   # Install
   make install DESTDIR=$PKG || exit $ERROR_INSTALL
cd -
</install_package>

<strip_binaries> off
# 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
)
</strip_binaries>

<compress_manpages> off
# Compress and link manpages
if [ -d "$PKG/$PREFIX/man" ]; then
  ( cd "$PKG/$PREFIX/man"
    for manpagedir in $(find . -type d -name "man*") ; do
      ( cd $manpagedir
        for eachpage in $( find . -type l -maxdepth 1) ; do
          ln -s $( readlink $eachpage ).gz $eachpage.gz
          rm $eachpage
        done
        gzip -9 *.?
      )
    done
  )
fi
</compress_manpages>

<compress_info_files> off
# Compress info files
if [ -d "$PKG/$PREFIX/info" ]; then
  ( cd "$PKG/$PREFIX/info"
    rm -f dir
    gzip -9 *
  )
fi
</compress_info_files>

<copy_init_scripts> off
# Copy init scripts
mkdir -p $PKG/etc/rc.d
cp $CWD/rc.* $PKG/etc/rc.d/
</copy_init_scripts>

<copy_config_files> off
# Copy config files
mkdir -p $PKG/etc
for conf in [[CONFIG FILES]]; do
  mkdir -p $PKG/etc/`dirname $conf`
  if [ -e "$CWD/conf/$conf" ]; then
    cp -a $CWD/conf/$conf $PKG/etc/$conf
  elif [ -e "$CWD/$conf" ]; then
    cp -a $CWD/$conf $PKG/etc/$conf
  elif [ -e "$conf" ]; then
    cp -a $conf $PKG/etc/$conf
  fi
done
</copy_config_files>

<install_documentation> off
# Install documentation
DOCS="[[DOCUMENTATION FILES]]"
mkdir -p "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" || exit $ERROR_MKDIR
for doc in $DOCS; do
  if [ -f "$doc" ]; then
    cp -a $doc "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION"
  fi
done
</install_documentation>

<slackdesc> off
# 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----------------------------------------------------|
[[SLACK-DESC]]
EODESC
</slackdesc>

<move_config_files> off
# Move config files to .new to avoid overwriting any system config
for config_file in [[CONFIG FILES]]; do
  mv $PKG/$config_file $PKG/$config_file.new
done
</move_config_files>

<postinstall_script> off
# Add a post-installation script (doinst.sh)
cat << EOSCRIPT > "$PKG/install/doinst.sh"
config() {
  NEW="\$1"
  OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)"
  OLD="\$(dirname \$NEW)/\$(basename \$OLD .sample)"
  OLD="\$(dirname \$NEW)/\$(basename \$OLD .dist)"

  # 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...
}

mkgroup() {
  GROUP="\$1"
  if ! grep -qe "^\$GROUP:" etc/group; then
    echo Creating group \$GROUP...
    chroot . /usr/sbin/groupadd \$GROUP
  fi
}

mkuser() {
  USER="\$1"
  if [ ! -z "\$2" ]; then
    GROUP="\$2"
  else
    GROUP="\$USER"
  fi
  if ! grep -qe "^\$USER:" etc/passwd; then
    echo Creating user \$USER...
    chroot . /usr/sbin/useradd \$USER -g \$GROUP
  fi
}

[[REST OF DOINST.SH]]
EOSCRIPT
</postinstall_script>

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

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