#!/bin/sh
#
#    Copyright (C) 2010-2013 Milan Kupcevic
#
#    You can redistribute and/or modify this software under the
#    terms of the GNU General Public License version 3, or any later 
#    version as published by the Free Software Foundation.
#
#    This program 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, see <http://www.gnu.org/licenses/>.
#
#    GPLv3+
#

APPNAME="BaseZ"
DOMAIN="quarkline.net"
MAJOR=1
MINOR=0
PATCH=1

SDIR="`dirname $0`"
PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s '[:blank:]' '[-*]'`
EMAIL="${EMAIL:-"$PKGNAME@$DOMAIN"}"
WEB=${WEB:-"www.$DOMAIN/$PKGNAME"}
VERSION=$MAJOR${MINOR:+".$MINOR"}${PATCH:+".$PATCH"}
FULLNAME="${ORG:+"$ORG "}$APPNAME $VERSION"
TMCLAIM=${TRADEMARKS:+"1"}
TMCLAIM=${TMCLAIM:-"0"}
HAS_ORG=${ORG:+"1"}
HAS_ORG=${HAS_ORG:-"0"}
COPYRIGHT_YEARS="2013, 2015, 2016"
COPYRIGHT_NAMES="Milan Kupcevic"
AUTHORS="Milan Kupcevic"

PATH="/usr/sfw/bin:/usr/ccs/bin:/usr/bin:/usr/openwin/bin:/usr/ucb:$PATH"
export PATH

help ()
{
  echo
  echo "Configure the ${ORG:+$ORG }$APPNAME compilation and installation environment."
  echo
  echo "Usage: ./configure [OPTION]..."
  echo
  echo "Options:"
  echo " -h, --help            help"
  echo " -V, --version         version info"
  echo " -p, --prefix=DIR      top-level installation directory       [/usr/local]"
  echo " -e, --sysconfdir=DIR  read-only configuration data           [prefix/etc]"
  echo " --exec-prefix=DIR     top-level directory for executables    [prefix]"
  echo " --bindir=DIR          user executables                       [exec-prefix/bin]"
  echo " --sbindir=DIR         admin executables                      [exec-prefix/sbin]"
  echo " --libdir=DIR          object code libraries                  [exec-prefix/lib]"
  echo " --mandir=DIR          manual pages                           [prefix/share/man]"
  echo " --docdir=DIR          documentation files              [prefix/share/doc/$PKGNAME]"
  echo
  echo "Use full path names when providing arguments to the directory options."
  echo
  echo "Examples:"
  echo
  echo "Prepare software for installation in the /usr directory, use the standard"
  echo "system configuration directory /etc, and optimize the code:"
  echo
  echo "    CFLAGS=\"-O3\" ./configure --prefix=/usr --sysconfdir=/etc"
  echo
  echo "Prepare package for installation in a directory located in the"
  echo "current user's home directory, issue warnings demanded by ISO C while compiling"
  echo "the code:"
  echo
  echo "    CFLAGS=\"-pedantic\" ./configure --prefix=\"\$HOME/local\""
  echo
  echo "Report bugs to <bug-$EMAIL> with a 'bug:' somewhere "
  echo "in the subject line. The latest version of this software is available "
  echo "at <http://$WEB>."
  echo 
}

version ()
{
  echo "configure (${ORG:+$ORG }$APPNAME) $VERSION"
  echo "Copyright (C) $COPYRIGHT_YEARS  $COPYRIGHT_NAMES."
  echo "This program comes with ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY"
  echo "or FITNESS FOR A PARTICULAR PURPOSE. This program is licensed under the"
  echo "terms of the GNU GPL version 3 or any later version (GPLv3+),"
  echo "see <http://www.gnu.org/licenses/> for more details."
  echo "Written by $AUTHORS."
}

testexec ()
{
  eval E=\"\${${1}}\" #"
  [ "$E" != "" ] && return
  TESTED=
  for COM in $@; do
    [ "$COM" != "$1" ] && 
    {
      COPT="`echo "$COM" | sed -e 's/,/ /g'`"
      COM="`echo "$COM" | sed -e 's/,.*//g'`"
      WHICHCOM="`which $COM`"
      [ -x "$WHICHCOM" ] && 
      {
        eval $1=\"`dirname $WHICHCOM`/$COPT\" #"
        return
      }
      TESTED="$TESTED $COPT"
    }
  done
  return 1
}

setexec () 
{
  testexec "$@" && 
  {
    eval echo "using \${${1}}"
    return
  }
  echo
  echo "$APPNAME requires one of these commands:$TESTED"
  echo "Please install one, make sure the command is in the PATH, and try again.
"
  echo
  exit 1
}

tryexec () 
{
  testexec "$@" && 
  {
    eval echo "using \${${1}}"
    return
  }
  eval $1="NO"
  echo "could not find:$TESTED; proceeding anyway..."
}


CONFIG=configure.options
C=$CONFIG.tmp

while [ $# -ge 1 ]
do
  P1=$1
  P2="`echo $P1 | sed -e 's,[^=]*=,,'`" 
  case $P1 in
    --verbose)                VERBOSE="1"; shift;;
    --debug)                  DEBUG="1"; shift;;
    --h*|-h*)                 help; exit 0;;
    --ver*|-V)                version; exit 0;;
    -p=*|--prefix=*)          eval echo PREFIX = $P2   >> $C; shift;;
    -p|--prefix)              eval echo PREFIX = $2    >> $C; shift; shift;;
    -e=*|--sysconfdir=*)      eval echo ETCDIR = $P2   >> $C; shift ;;
    -e|--sysconfdir)          eval echo ETCDIR = $2    >> $C; shift; shift;;
    --libdir=*)               eval echo LIBDIR = $P2   >> $C; shift ;;
    --libdir)                 eval echo LIBDIR = $2    >> $C; shift; shift;;
    --mandir=*)               eval echo MANDIR = $P2   >> $C; shift ;;
    --mandir)                 eval echo MANDIR = $2    >> $C; shift; shift;;
    --docdir=*)               eval echo DOCDIR = $P2   >> $C; shift ;;
    --docdir)                 eval echo DOCDIR = $2    >> $C; shift; shift;;
    *) echo Unknown option: $P1; echo Try --help; exit 1;
  esac
done

tryexec CC gcc clang cc
tryexec AR ar
tryexec INSTALL install
tryexec STRIP strip
tryexec LD ld
tryexec RANLIB ranlib
setexec DEPEND gcc,-M clang,-M cc,-M
tryexec HELP2MAN help2man
setexec MAKE make gmake pmake bmake

eval echo SDIR = $SDIR >> $C
     echo PKGNAME = $PKGNAME >> $C
     echo APPNAME = $APPNAME >> $C
     echo VER = $VERSION >> $C
     echo FULLNAME = $FULLNAME >> $C
     echo COPYRIGHT_YEARS = $COPYRIGHT_YEARS >> $C
     echo COPYRIGHT_NAMES = $COPYRIGHT_NAMES >> $C
     echo EMAIL = $EMAIL >> $C
     echo WEB = $WEB >> $C
     echo AUTHORS = $AUTHORS >> $C
     echo HAS_ORG = $HAS_ORG >> $C
     echo ORG = $ORG >> $C
     echo ${DEBUG:+"DEBUG = $DEBUG"} >> $C
     echo ${CC:+"CC = $CC"} >> $C
     echo ${CFLAGS:+"CFLAGS = $CFLAGS"} >> $C
     echo ${LD:+"LD = $LD"} >> $C
     echo ${LDFLAGS:+"LDFLAGS = $LDFLAGS"} >> $C
     echo ${LIBS:+"LIBS = $LIBS"} >> $C
     echo ${CPPFLAGS:+"CPPFLAGS = $CPPFLAGS"} >> $C
     echo ${CPP:+"CPP = $CPP"} >> $C
     echo ${AR:+"AR = $AR"} >> $C
     echo ${INSTALL:+"INSTALL = $INSTALL"} >> $C
     echo ${STRIP:+"STRIP = $STRIP"} >> $C
     echo ${RANLIB:+"RANLIB = $RANLIB"} >> $C
     echo ${DEPEND:+"DEPEND = $DEPEND"} >> $C
     echo ${MAKE:+"MAKE = $MAKE"} >> $C
     echo ${TRADEMARKS:+"TRADEMARKS = $TRADEMARKS"} >> $C
     echo TMCLAIM = $TMCLAIM >> $C
     echo HELP2MAN = $HELP2MAN >> $C

mv $C $CONFIG
[ "$VERBOSE" = "1" ] && cat $CONFIG

echo

echo ".include \"Makefile.tst.include\"" > Makefile.tst
echo "all: " > Makefile.tst.include
$MAKE -f Makefile.tst >/dev/null 2>&1 && 
{ # BSD make
  sed -e "s,@IF@,.if," \
      -e "s,@IFDEF@,.ifdef," \
      -e "s,@IFNDEF@,.ifndef," \
      -e "s,@ELSE@,.else," \
      -e "s,@ENDIF@,.endif," \
      -e "s,@INCLUDEOPTS@,.include \"$CONFIG\"," \
      -e "s,@INCLUDEDEPS@,.sinclude \".depend\"," \
      -e "s,@ERROR@,.error," \
      -e "s,@WARNING@,.warning," \
      -e "s,@SRCS@,\$(.ALLSRC)," \
      $SDIR/Makefile.src > Makefile
  echo "configured for BSD make"
} || 
{ # GNU make
    sed -e "s,@IF@,if," \
      -e "s,@IFDEF@,ifdef," \
      -e "s,@IFNDEF@,ifndef," \
      -e "s,@ELSE@,else," \
      -e "s,@ENDIF@,endif," \
      -e "s,@INCLUDEOPTS@,include $CONFIG," \
      -e "s,@INCLUDEDEPS@,-include .depend," \
      -e "s,@ERROR@,\$\(error," \
      -e "s,@WARNING@,\$\(warning," \
      -e "s,@SRCS@,\$^," \
      $SDIR/Makefile.src > Makefile
  echo "configured for GNU make"
}
rm Makefile.tst
rm Makefile.tst.include
echo

$MAKE config.h
$MAKE depend

echo
echo " ${ORG:+$ORG }$APPNAME"
echo " Version $VERSION"
echo
echo " Copyright (C) $COPYRIGHT_YEARS $COPYRIGHT_NAMES"
echo " ${TRADEMARKS:+$TRADEMARKS}"
echo
