#!/bin/sh
#
#   rhnop
#
#   Copyright (C) 2011-2016 Christian Pointner <equinox@helsinki.at>
#
#   This file is part of rhnop.
#
#   rhnop 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 3 of the License, or
#   any later version.
#
#   rhnop 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 rhnop. If not, see <http://www.gnu.org/licenses/>.
#

TARGET=`uname -s`
EBUILD_COMPAT=0

USE_CLANG=0

LUA_DIR=''
LUA=''
LUA_VER=''

PREFIX='/usr/local'
BINDIR=''
ETCDIR=''
DATAROOTDIR=''

print_usage() {
  echo "configure --help                    print this"
  echo "          --target=<TARGET>         build target i.e. Linux (default: autodetect)"
  echo "          --prefix=<PREFIX>         the installation prefix (default: /usr/local)"
  echo "          --bindir=<DIR>            the path to the bin directory (default: $PREFIX/bin)"
  echo "          --sysconfdir=<DIR>        the path to the system configuration directory (default: $PREFIX/etc)"
  echo "          --datarootdir=<DIR>       the path to the native lua libs (default: $PREFIX/share)"
  echo "          --with-lua=<DIR>          use this lua tree instead of system default"
  echo "          --lua-version=nnn         set fixed Lua version for automatic detection (501 -> 5.1, 502 -> 5.2)"
  echo "          --use-clang               use clang/llvm as compiler/linker"
}

for arg
do
  case $arg in
  --target=*)
    TARGET=${arg#--target=}
  ;;
  --use-clang)
    USE_CLANG=1
  ;;
  --prefix=*)
    PREFIX=${arg#--prefix=}
  ;;
  --bindir=*)
    BINDIR=${arg#--bindir=}
  ;;
  --sysconfdir=*)
    ETCDIR=${arg#--sysconfdir=}
  ;;
  --datarootdir=*)
    DATAROOTDIR=${arg#--datarootdir=}
  ;;
  --with-lua=*)
    LUA_DIR=${arg#--with-lua=}
  ;;
  --lua-version=*)
    LUA_VER=${arg#--lua-version=}
  ;;
  --ebuild-compat)
    EBUILD_COMPAT=1
  ;;
  --help)
    print_usage
    exit 0
  ;;
  *)
    ERRORS="$ERRORS $arg"
  ;;
  esac
done

if [ -n "$ERRORS" ] && [ $EBUILD_COMPAT -ne 1 ]; then
  for error in $ERRORS; do
    echo "Unknown argument: $error"
  done

  print_usage
  exit 1
fi

if [ $USE_CLANG -eq 0 ]; then
  CFLAGS='-g -Wall -O2'
  LDFLAGS='-g -Wall -O2 -lpthread'
  COMPILER='gcc'
else
  CFLAGS='-g -O2'
  LDFLAGS='-g -O2 -lpthread'
  COMPILER='clang'
fi

rm -f config.h
rm -f include.mk
case $TARGET in
  Linux)
    LDFLAGS=$LDFLAGS' -ldl'
  ;;
  *)
    echo "platform not supported"
    exit 1;
  ;;
esac


test_lua_version()
{
  LUA_VERSION_MAJ=`cat $1 | grep "#define LUA_VERSION_MAJOR[ 	]" | cut -f2- | tr -d '"'`
  LUA_VERSION_MIN=`cat $1 | grep "#define LUA_VERSION_MINOR[ 	]" | cut -f2- | tr -d '"'`
  LUA_VERSION_REL=`cat $1 | grep "#define LUA_VERSION_RELEASE[ 	]" | cut -f2- | tr -d '"'`

  LUA_VERSION="$LUA_VERSION_MAJ.$LUA_VERSION_MIN"
  LUA_RELEASE="$LUA_VERSION_MAJ.$LUA_VERSION_MIN.$LUA_VERSION_REL"

  if [ -z "$LUA_VERSION_MAJ" ]; then
      LUA_VERSION=`cat $1 | grep "#define LUA_VERSION[ 	]" | cut -f2- | tr -d '"' | sed -e 's/Lua \([0-9][0-9.]*\)/\1/'`
      LUA_RELEASE=`cat $1 | grep "#define LUA_RELEASE[ 	]" | cut -f2- | tr -d '"' | sed -e 's/Lua //'`
  fi

  LUA_VERSION_NUM=`cat $1 | grep "#define LUA_VERSION_NUM" | awk '{ print $3 }'`

  if [ -n "$LUA_VER" ]; then
    if [ "$LUA_VER" -eq $LUA_VERSION_NUM ]; then
      return 1
    else
      return 0
    fi
  else
    if [ $LUA_VERSION_NUM -ge 501 ]; then
      return 1
    else
      return 0
    fi
  fi
}

if [ -z "$LUA_DIR" ]; then
  for prefix in /usr /usr/local; do
    if [ -e $prefix/include/lua.h ]; then
      test_lua_version $prefix/include/lua.h
      if [ $? -eq 1 ]; then
        echo "using Lua $LUA_VERSION ($LUA_RELEASE) found at $prefix/include"
        CFLAGS="$CFLAGS -I'$prefix/include'"
        LDFLAGS="$LDFLAGS -L'$prefix/lib' -llua"
        LUA=$prefix/lua
        LUAC=$prefix/luac
        break
      fi
    else
      for dir in `ls -r -d $prefix/include/lua* 2> /dev/null`; do
        if [ -e $dir/lua.h ]; then
          test_lua_version $dir/lua.h
          if [ $? -eq 1 ]; then
            echo "using Lua $LUA_VERSION ($LUA_RELEASE) found at $dir"
            CFLAGS="$CFLAGS -I$dir"
            if [ -x "$prefix/bin/lua$LUA_VERSION" ]; then
              LDFLAGS="$LDFLAGS -L'$prefix/lib' -llua$LUA_VERSION"
              LUA=$prefix/bin/lua$LUA_VERSION
              LUAC=$prefix/bin/luac$LUA_VERSION
            elif [ -x "$prefix/bin/lua-$LUA_VERSION" ]; then
              LDFLAGS="$LDFLAGS -L'$prefix/lib' -llua-$LUA_VERSION"
              LUA=$prefix/bin/lua-$LUA_VERSION
              LUAC=$prefix/bin/luac-$LUA_VERSION
            else
              echo "ERROR: found lua.h at $dir/lua.h but no matching lua and luac"
              return 1
            fi
            break
          fi
        fi
      done
      if [ -n "$LUAC" ]; then
        break
      fi
    fi
  done

  if [ -z "$LUAC" ]; then
    echo "ERROR: no suitable lua found .. please install lua 5.1 or higher or use --with-lua"
    return 1
  fi

else
  CFLAGS="$CFLAGS -I'$LUA_DIR/include'"
  LDFLAGS="$LDFLAGS '$LUA_DIR/lib/liblua.a'"
  LUA=$LUA_DIR/bin/lua
  LUAC=$LUA_DIR/bin/luac
fi

if [ -z "$BINDIR" ]; then
  BINDIR=$PREFIX/bin
fi

if [ -z "$ETCDIR" ]; then
  ETCDIR=$PREFIX/etc
fi

if [ -z "$DATAROOTDIR" ]; then
  DATAROOTDIR=$PREFIX/share
fi

cat > include.mk <<EOF
# this file was created automatically
# do not edit this file directly
# use ./configure instead

TARGET := '$TARGET'
CC := $COMPILER
CFLAGS := $CFLAGS
LDFLAGS := $LDFLAGS
LUA := '$LUA'
LUAC := '$LUAC'
STRIP := strip
INSTALL := install
SED := sed

prefix := '$PREFIX'
BINDIR := '$BINDIR'
ETCDIR := '$ETCDIR'
DATAROOTDIR := '$DATAROOTDIR'
EOF

cat > config.h <<EOF
/*
 * nopfetchd version info
 *
 * this file was created automatically
 * do not edit this file directly
 * use ./configure instead
 */

#ifndef NOPFETCHD_config_h_INCLUDED
#define NOPFETCHD_config_h_INCLUDED

#define TARGET "$TARGET"
#define PREFIX "$PREFIX"
#define BINDIR "$BINDIR"
#define ETCDIR "$ETCDIR"
#define DATAROOTDIR "$DATAROOTDIR"

#endif
EOF

exit 0