#!/bin/sh
#
# template.SlackBuild: template from which we can reasonably create
# SlackBuild scripts for adding third-party software to Slackware/Slamd64
# systems.
#
# Copyright (c) 2009-2025 Sylvain Robitaille
#
# Includes code borrowed from SlackBuild scripts by Eric Hameleers, Robby
# Workman, and others, plus modifications to make it easier to build consistent
# packages for different platforms.  Permission is hereby granted to use, copy,
# modify, and redistribute this script freely as seen fit, so long as due
# credit is given where appropriate.
#
# The package (.tgz) plus descriptive .txt file are created in /tmp
# by default.  Install using 'installpkg'. 
# -----------------------------------------------------------------------------

# --- INIT ---
# Set initial variables:
# adjust as necessary ...

umask 022

SCRIPTNAME=`basename $0`
PRGNAM=${PRGNAM:-"`echo $SCRIPTNAME |sed 's/\.SlackBuild.*$//'`"}
VERSION=${VERSION:-0.0}
ARCH=${ARCH:-`uname -m`}
BUILD=${BUILD:-1}
INSTPREFIX=${INSTPREFIX:-/local}

NPROCS=${NPROCS:-`grep -cw ^processor /proc/cpuinfo`}
if [ $NPROCS -gt 1 ]; then
   MAKEARGS="-s -j ${NPROCS}"
else
   MAKEARGS="-s"
fi

DOCS="AUTHORS* ChangeLog COPY* FAQ INSTALL* NEWS README* doc/*"

# Where do we look for sources?
CWD=`pwd`

# Input URL: ...
SOURCE="$CWD/${PRGNAM}-${VERSION}.tar.gz"
SRCURL="http://www.wherever.com/${PRGNAM}/`basename ${SOURCE}`"


# Place to build (TMP) package (PKG) and output (OUTPUT) the program:
TMP=${TMP:-/tmp/build}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

# Slackware 11 and up need other option (gcc > 3.3.x)
if [ `gcc -dumpversion | awk -F. '{print $1$2}'` -gt 33 ]; then
  MOPT=tune
else
  MOPT=cpu
fi

case "$ARCH" in
  alpha)     CPU=`grep -w model /proc/cpuinfo | uniq | awk '{print $NF}' |tr '[:upper:]' '[:lower:]'`
             SLKCFLAGS="-O2 -fPIC -m${MOPT}=${CPU}"
             LIBDIRSUFFIX="64"
             SLKLDFLAGS="-L/usr/lib${LIBDIRSUFFIX}";
             ;;
  arm*)      SLKCFLAGS="-O2 -march=${ARCH} -m${MOPT}=${ARCH}"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  i?86)      SLKCFLAGS="-O2 -march=${ARCH} -m${MOPT}=${ARCH}"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  s390)      SLKCFLAGS="-O2"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  powerpc)   SLKCFLAGS="-O2"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
  x86_64)    SLKCFLAGS="-O2 -fPIC"
             LIBDIRSUFFIX="64"
             SLKLDFLAGS="-L${INSTPREFIX}/lib${LIBDIRSUFFIX}";
             ;;
  athlon-xp) SLKCFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
             SLKLDFLAGS=""; LIBDIRSUFFIX=""
             ;;
esac

DISTRO=${DISTRO:-"`tail -1 /etc/sla*-version |awk '{print $1}' |tr '[A-Z]' '[a-z]'`"}

if [ "$DISTRO" = "slackware" ]; then
        PKGARCH=$ARCH
else
        PKGARCH=${ARCH}_${DISTRO}
fi

# Exit the script on errors:
set -e
trap 'echo "$0 FAILED at line $LINENO!" | tee $OUTPUT/error-${PRGNAM}.log' ERR
# Catch unitialized variables:
set -u
P1=${1:-1}


rm    -rf $TMP/tmp-$PRGNAM $PKG
mkdir -p  $TMP/tmp-$PRGNAM $PKG

if [ ! -d $OUTPUT ]; then
  mkdir -p $OUTPUT  # place for the package to be saved
fi


# --- SOURCE FILE AVAILABILITY ---

if ! [ -f ${SOURCE} ]; then
  if ! [ "x${SRCURL}" == "x" ]; then
    # Check if the $CWD is writable at all - if not, download to $OUTPUT
    [ -w "$CWD" ] || SOURCE="$OUTPUT/`basename $SOURCE`"
    echo "Source '`basename ${SOURCE}`' not available yet..."
    echo "Will download file to `dirname $SOURCE`"
    wget -nv -O "${SOURCE}" "${SRCURL}" || true
    if [ $? -ne 0 ]; then
      echo "Downloading '`basename ${SOURCE}`' failed... aborting the build."
      mv -f "${SOURCE}" "${SOURCE}".FAIL
      exit 1
    fi
  else
    echo "File '`basename ${SOURCE}`' not available... aborting the build."
    exit 1
  fi
fi

if [ "$P1" == "--download" ]; then
  echo "Download complete."
  exit 0
fi

# --- PACKAGE BUILDING ---

echo "++"
echo "|| $PRGNAM-$VERSION"
echo "++"

cd $PKG

# Explode the package framework:
if [ -f $CWD/_$PRGNAM.tar.gz ]; then
  explodepkg $CWD/_$PRGNAM.tar.gz
fi

cd $TMP/tmp-$PRGNAM


# --- TARBALL EXTRACTION,PATCH,MODIFY ---

echo "Extracting the source archive(s) for $PRGNAM..."
if `file ${SOURCE} | grep -q ": bzip2"`; then
  tar -xjvf ${SOURCE} || true
elif `file ${SOURCE} | grep -qi ": gzip"`; then
  tar -xzvf ${SOURCE} || true
elif `file ${SOURCE} | grep -qi ": zip"`; then
  unzip ${SOURCE} || true
elif `file ${SOURCE} | grep -qi ": 7-zip"`; then
  7za x -so ${SOURCE} |tar xsvf - || true
elif `file ${SOURCE} | grep -qi ": xz"`; then
  tar xvf ${SOURCE} || true
else
  tar -xvf ${SOURCE} || true
fi
if [ $? -ne 0 ]; then
  echo "Error in unpacking '${SOURCE}!' Aborting..."
  exit $?
fi

if [ -d ${PRGNAM}-${VERSION} ]; then
  cd ${PRGNAM}-${VERSION}
else
  cd  ${PRGNAM}*  # a little less specific
fi

chown -R `id -un`:`id -gn` .
chmod -R a+rX,og-w         .


# --- PATCHING ---

if [ -f $CWD/${PRGNAM}-${VERSION}.patch ]; then
   patch -p0 < $CWD/${PRGNAM}-${VERSION}.patch 2>&1 \
      | tee $OUTPUT/patch-${PRGNAM}.log
fi


# --- BUILD and INSTALL

echo Building ...

# --- EDIT HERE --- EDIT HERE --- EDIT HERE --- EDIT HERE --- EDIT HERE ---
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

LDFLAGS="$SLKLDFLAGS" \
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
PKG_CONFIG_PATH="${INSTPREFIX}/lib${LIBDIRSUFFIX}/pkgconfig" \
./configure \
            --prefix=${INSTPREFIX} \
            --docdir=${INSTPREFIX}/doc/$PRGNAM-$VERSION \
            --libdir=${INSTPREFIX}/lib${LIBDIRSUFFIX} \
            --localstatedir=${INSTPREFIX}/var \
            --mandir=${INSTPREFIX}/man \
            --sbindir=${INSTPREFIX}/bin \
            --sysconfdir=${INSTPREFIX}/etc \
            --build=$ARCH-$DISTRO-linux \
            2>&1 | tee $OUTPUT/configure-${PRGNAM}.log
make ${MAKEARGS} 2>&1 | tee $OUTPUT/make-${PRGNAM}.log

# Install all the needed stuff to the package dir
make ${MAKEARGS} DESTDIR=$PKG install 2>&1 |tee $OUTPUT/install-${PRGNAM}.log

# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# --- EDIT HERE --- EDIT HERE --- EDIT HERE --- EDIT HERE --- EDIT HERE ---

if [ -f $CWD/${PRGNAM}.desktop ]; then
   mkdir -p $PKG${INSTPREFIX}/share/applications
   sed -e s"%^/usr\(.*\)%${INSTPREFIX}\1%" $CWD/${PRGNAM}.desktop >\
      $PKG${INSTPREFIX}/share/applications/$PRGNAM.desktop
fi

# --- DOCUMENTATION ---

mkdir -p           $PKG${INSTPREFIX}/doc/$PRGNAM-$VERSION
cp    -a     $DOCS $PKG${INSTPREFIX}/doc/$PRGNAM-$VERSION || true
cp    -a     $OUTPUT/*-${PRGNAM}.log \
                   $PKG${INSTPREFIX}/doc/$PRGNAM-$VERSION || true

cat $CWD/$(basename $0) | sed \
  -e "/^VERSION=/s/:-.*}/:-$VERSION}/" \
  -e "/^ARCH=/s/:-.*}/:-$ARCH}/" \
  -e "/^BUILD=/s/:-.*}/:-$BUILD}/" \
  > $PKG${INSTPREFIX}/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

chmod -R a-w       $PKG${INSTPREFIX}/doc/$PRGNAM-$VERSION

# Move incorrectly installed man pages, if any
if [ -d $PKG${INSTPREFIX}/share/man ]; then
  mv $PKG${INSTPREFIX}/share/man $PKG${INSTPREFIX} && rmdir $PKG${INSTPREFIX}/share || true
fi
# Compress the man page(s)
if [ -d $PKG${INSTPREFIX}/man ]; then
  (
  cd  $PKG${INSTPREFIX}/man
  find . -type f -name "*.?" -exec gzip -9f {} \;
  for i in `find . -type l -name "*.?"` ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
  )
fi

# 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
) || true


# --- OWNERSHIP, RIGHTS ---

chmod -R a+rX,og-w $PKG


# --- PACKAGE DESCRIPTION ---

mkdir -p $PKG/install
if [ -f $CWD/slack-desc ]; then
  cat $CWD/slack-desc > $PKG/install/slack-desc
fi
if [ -f $CWD/doinst.sh ]; then
  INSTPREFIX=`echo ${INSTPREFIX} |sed 's%^/%%'`
  if [ -z "${INSTPREFIX}" ]; then
     INSTPREFIX='.'
  fi
  sed "s%@@INSTPREFIX@@%${INSTPREFIX}%g" $CWD/doinst.sh >> $PKG/install/doinst.sh
fi


# --- BUILDING ---

# Build the package:
cd $PKG
makepkg --linkadd y --chown n $OUTPUT/${PRGNAM}-${VERSION}-${PKGARCH}-${BUILD}.tgz \
  2>&1 | tee $OUTPUT/makepkg-${PRGNAM}.log
(cd $OUTPUT && md5sum ${PRGNAM}-${VERSION}-${PKGARCH}-${BUILD}.tgz > ${PRGNAM}-${VERSION}-${PKGARCH}-${BUILD}.tgz.md5)
grep "^${PRGNAM}" $PKG/install/slack-desc > $OUTPUT/${PRGNAM}-${VERSION}-${PKGARCH}-${BUILD}.txt


# --- CLEANUP ---

# Clean up the extra stuff:
if [ "$P1" = "--cleanup" ]; then
  rm -rf $TMP/tmp-$PRGNAM
  rm -rf $PKG
fi
