#!/bin/sh
#
#    Copyright (C) 2010, 2011, 2012, 2013, 2016 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=6
PATCH=2

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/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
  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 " --datadir=DIR         data                                  [prefix/share]"
  echo " --mandir=DIR          manual pages                          [datadir/man]"
  echo " --docdir=DIR          documentation files                   [datadir/doc/$PKGNAME]"
  echo
  echo " --build=<platform>    build platform                         []"
  echo " --host=<platform>     host platform                          []"
  echo
  echo " --disable-base64-command"
  echo "                       no base64 command"
  echo " --disable-base32-command"
  echo "                       no base32 command"
  echo " --disable-unhex-command"
  echo "                       no unhex command"
  echo
  echo "Use full path names when providing arguments to the directory options."
  echo
  echo "Examples:"
  echo
  echo "Prepare software for installation and use the standard system"
  echo "configuration location /etc"
  echo
  echo "    ./configure --sysconfdir=/etc"
  echo
  echo "Prepare package for installation in a directory located in the"
  echo "current user's home directory and optimize the code"
  echo
  echo "    ./configure CFLAGS=\"-O3\" --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."
}

which()
{
  out=1
  case "$PATH" in
    :*) PATH=":$PATH" ;;
    *:) PATH="$PATH:" ;;
  esac
  ifs_orig="$IFS"
  IFS=:
  for wd in $PATH; do
    [ -z "$wd" ] && wd=.
    if [ -f "$wd/$1" ] && [ -x "$wd/$1" ]; then
      echo "$wd/$1"
      out=0
      break
    fi
  done
  IFS="$ifs_orig"
  return $out
}

testexec ()
{
  eval e=\"\${${1}}\"
  [ "$e" != "" ] && return
  var="$1"
  shift
  tested=
  for com in `for e in $@; do echo ${HOST:+$HOST-}$e; done` $@; do
    copt="`echo "$com" | tr ',' ' '`"
    com=${copt%% *}
    opt="${copt#$com}"
    whichcom="`which $com`"
    [ -x "$whichcom" ] &&
    {
      eval $var=\"$whichcom$opt\"
      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..."
}

t ()
{
  case ${2} in
    "-"|"--")
        return
        ;;
    ""|-*)
        echo "Option ${1} requires an additional argument."
        echo "Try --help"
        exit 1
        ;;
  esac
}

CONFIG=configure.options
C=$CONFIG.tmp

UNHEX=1
B32=1
B64=1

while [ $# -ge 1 ]
do
  P1=$1
  P2="\"`echo $P1 | sed -e 's,[^=]*=,,'`\""
  case $P1 in
    --verbose)                VERBOSE="1"; shift;;
    --debug)                  DEBUG="1"; shift;;
    --disable-unhex-command)  UNHEX=; shift;;
    --disable-base32-command) B32=; shift;;
    --disable-base64-command) B64=; shift;;
    --enable-*)               shift;;
    --disable-*)              shift;;
    --with-*)                 shift;;
    --without-*)              shift;;
    --program-*)              shift;;
    --help|-h)                help; exit 0;;
    --ver*|-V)                version; exit 0;;
    -p=*|--prefix=*)          eval      prefix=$P2          ; shift ;;
    -p|--prefix)    t $P1 $2; eval      prefix=$2           ; shift; shift;;
    --datarootdir=*)          eval      datarootdir=$P2     ; shift ;;
    --datarootdir)  t $P1 $2; eval      datarootdir=$2      ; shift; shift;;
    --datadir=*)              eval      datadir=$P2         ; shift ;;
    --datadir)      t $P1 $2; eval      datadir=$2          ; shift; shift;;
    --exec-prefix=*)          eval echo EXECPREFIX = $P2>>$C; shift ;;
    --exec-prefix)  t $P1 $2; eval echo EXECPREFIX = $2>> $C; shift; shift;;
    -e=*|--sysconfdir=*)      eval echo ETCDIR = $P2   >> $C; shift ;;
    -e|--sysconfdir)t $P1 $2; eval echo ETCDIR = $2    >> $C; shift; shift;;
    --libdir=*)               eval echo LIBDIR = $P2   >> $C; shift ;;
    --libdir)       t $P1 $2; eval echo LIBDIR = $2    >> $C; shift; shift;;
    --bindir=*)               eval echo BINDIR = $P2   >> $C; shift ;;
    --bindir)       t $P1 $2; eval echo BINDIR = $2    >> $C; shift; shift;;
    --sbindir=*)              eval echo SBINDIR = $P2  >> $C; shift ;;
    --sbindir)      t $P1 $2; eval echo SBINDIR = $2   >> $C; shift; shift;;
    --libexecdir=*)           eval echo LIBEXECDIR = $P2>>$C; shift ;;
    --libexecdir)   t $P1 $2; eval echo LIBEXECDIR = $2>> $C; shift; shift;;
    --mandir=*)               eval echo MANDIR = $P2   >> $C; shift ;;
    --mandir)       t $P1 $2; eval echo MANDIR = $2    >> $C; shift; shift;;
    --docdir=*)               eval echo DOCDIR = $P2   >> $C; shift ;;
    --docdir)       t $P1 $2; eval echo DOCDIR = $2    >> $C; shift; shift;;
    --infodir=*)              eval echo INFODIR = $P2  >> $C; shift ;;
    --infodir)      t $P1 $2; eval echo INFODIR = $2   >> $C; shift; shift;;
    --includedir=*)           eval echo INCLUDEDIR = $P2>>$C; shift ;;
    --includedir)   t $P1 $2; eval echo INCLUDEDIR = $2>> $C; shift; shift;;
    --localstatedir=*)        eval echo LOCALSTATEDIR = $P2>>$C; shift ;;
    --localstatedir)t $P1 $2; eval echo LOCALSTATEDIR = $2>>$C; shift; shift;;
    --sharedstatedir=*)       eval echo SHAREDSTATEDIR = $P2>>$C; shift ;;
    --sharedstatedir)t $P1 $2;eval echo SHAREDSTATEDIR = $2>>$C; shift; shift;;
    --build=*)                eval      BUILD=$P2           ; shift ;;
    --build)        t $P1 $2; eval      BUILD=$2            ; shift; shift;;
    --host=*)                 eval      HOST=$P2            ; shift ;;
    --host)         t $P1 $2; eval      HOST=$2             ; shift; shift;;
    --target=*)               eval      TARGET=$P2          ; shift ;;
    --target)       t $P1 $2; eval      TARGET=$2           ; shift; shift;;
    CC=*)                     eval      CC=$P2              ; shift ;;
    CFLAGS=*)                 eval      CFLAGS=$P2          ; shift ;;
    CPP=*)                    eval      CPP=$P2             ; shift ;;
    CPPFLAGS=*)               eval      CPPFLAGS=$P2        ; shift ;;
    AR=*)                     eval      AR=$P2              ; shift ;;
    INSTALL=*)                eval      INSTALL=$P2         ; shift ;;
    STRIP=*)                  eval      STRIP=$P2           ; shift ;;
    LD=*)                     eval      LD=$P2              ; shift ;;
    LDFLAGS=*)                eval      LDFLAGS=$P2         ; shift ;;
    LDLIBS=*)                 eval      LDLIBS=$P2          ; shift ;;
    LDADD=*)                  eval      LDADD=$P2           ; shift ;;
    LIBS=*)                   eval      LIBS=$P2            ; shift ;;
    RANLIB=*)                 eval      RANLIB=$P2          ; shift ;;
    DEPEND=*)                 eval      DEPEND=$P2          ; shift ;;
    HELP2MAN=*)               eval      HELP2MAN=$P2        ; shift ;;
    MAKE=*)                   eval      MAKE=$P2            ; shift ;;
    EXE=*)                    eval      EXE=$P2             ; shift ;;
    *) echo Unknown option: $P1; echo Try --help; exit 1;
  esac
done

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

cat << EOF > dummy.c
int main(){return 0;}
EOF
$CC $CFLAGS $CPPFLAGS -o dummy dummy.c || {
  echo $CC: not able to produce executables
  exit 1
}
WINDOWS=
EXE=
cat << EOF > dummy.c
#if defined(_WIN32)
int main(){return 0;}
#else
int main(){return bad}
#endif
EOF
$CC $CFLAGS $CPPFLAGS -o dummy dummy.c >/dev/null 2>&1 && {
  WINDOWS=1
  EXE=.exe
}
LFSF=
cat << EOF > dummy.c
#include <limits.h>
#if LONG_MAX > 2147483647 || defined(_WIN64) || defined(_FILE_OFFSET_BITS)
int main(){return 0;}
#else
int main(){return bad}
#endif
EOF
$CC $CFLAGS $CPPFLAGS -o dummy dummy.c >/dev/null 2>&1 || {
  LFSF="-D_FILE_OFFSET_BITS=64"
  echo requesting lfs
}
cat << EOF > dummy.c
#include <limits.h>
#if LONG_MAX > 2147483647 || defined(_WIN64) || defined(_LARGEFILE_SOURCE)
int main(){return 0;}
#else
int main(){return bad}
#endif
EOF
$CC $CFLAGS $CPPFLAGS -o dummy dummy.c >/dev/null 2>&1 || {
  LFSF="-D_LARGEFILE_SOURCE $LFSF"
  echo requesting fseeko, ftello
}
HAS_FSEEKO=1
cat << EOF > dummy.c
#include <stdio.h>
FILE *f;
int main(){ftello(f);return fseeko(f, 0, SEEK_SET);}
EOF
$CC $CFLAGS $CPPFLAGS $LFSF -o dummy dummy.c >/dev/null 2>&1 || {
  HAS_FSEEKO=
  echo fseeko and ftello are not available
}
MAC=
cat << EOF > dummy.c
#if defined(__APPLE__) && defined(__MACH__)
int main(){return 0;}
#else
int main(){return bad}
#endif
EOF
$CC $CFLAGS -o dummy dummy.c >/dev/null 2>&1 && {
  MAC=1
}
rm dummy*
DIST_ID=
DEB_DIST_ID=
[ -f "/etc/os-release" ] && {
  ID="`grep ^ID= /etc/os-release`"
  VERSION_ID="`grep ^VERSION_ID= /etc/os-release`"
  DIST_ID="`echo ${ID#ID=}${VERSION_ID#VERSION_ID=} | tr '_-' '++'`"
  DEB_DIST_ID="~$DIST_ID"
}

[ "$WINDOWS" != "1" ] && DEBDATE="`date -R`"

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 ${prefix:+"PREFIX = $prefix"} >> $C
     echo ${datadir:+"DATADIR = $datadir"} >> $C
     echo ${datarootdir:+"DATAROOTDIR = $datarootdir"} >> $C
     echo ${BUILD:+"BUILD = $BUILD"} >> $C
     echo ${HOST:+"HOST = $HOST"} >> $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 ${LDLIBS:+"LDLIBS = $LDLIBS"} >> $C
     echo ${LDADD:+"LDADD = $LDADD"} >> $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 ${MAC:+"MAC = $MAC"} >> $C
     echo ${WINDOWS:+"WINDOWS = $WINDOWS"} >> $C
     echo ${LFSF:+"LFSF = $LFSF"} >> $C
     echo HAS_FSEEKO = ${HAS_FSEEKO:-"0"} >> $C
     echo ${UNHEX:+"UNHEXCMD = unhex"} >> $C
     echo UNHEX = ${UNHEX:-"0"} >> $C
     echo ${B32:+"B32CMD = base32"} >> $C
     echo ${B64:+"B64CMD = base64"} >> $C
     echo B32 = ${B32:-"0"} >> $C
     echo B64 = ${B64:-"0"} >> $C
     echo TMCLAIM = $TMCLAIM >> $C
     echo HELP2MAN = $HELP2MAN >> $C
     echo EXE = $EXE >> $C
     echo ${DEBDATE:+"DEBDATE = $DEBDATE"} >> $C
     echo ${DEBFULLNAME:+"DEBFULLNAME = $DEBFULLNAME"} >> $C
     echo ${DEBEMAIL:+"DEBEMAIL = $DEBEMAIL"} >> $C
     echo ${DIST_ID:+"DIST_ID = $DIST_ID"} >> $C
     echo ${DEB_DIST_ID:+"DEB_DIST_ID = $DEB_DIST_ID"} >> $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
