#!/bin/sh

# A basic configure script for Kepler.
# Not doing any fancy shell stuff here to keep good compatibility.

# Defaults

PREFIX="/usr/local"
LUA_SUFFIX="5.1"
KEPLER_WEB="\$(PREFIX)/htdocs"
LAUNCHER="xavante"
OPTIONAL_PACKAGES="lualogging,md5"
LUASQL_DRIVER="mysql"
BUILD_LUA="detect"
INSTALL_LUA="no"
USE_READLINE="yes"
READLINE_DIR="/usr"
EXPAT_DIR="/usr"
ZZIP_DIR="/usr"
OCI8_DIR="/home/oracle/OraHome1"
POSTGRES_DIR="/usr/local/pgsql"
SQLITE_DIR="/usr"
ODBC_DIR="/usr"
FASTCGI_DIR="/usr"
LUABINARIES_DIR="/usr"
LUABINARIES_INCLUDEDIR="/usr/include"
LUABINARIES_LIBDIR="/usr/lib"

MYSQL_DIR="/usr"
APACHE_DIR="/usr"
APACHE_MODULES_DIR="/usr/lib/httpd/modules"
POSTGRES_DIR="/usr"

DETECT_APACHE=yes
DETECT_MYSQL=yes
DETECT_POSTGRES=yes

# Help

show_help() {
cat <<EOF
Configure Kepler.

--help                      This help.
--prefix=DIR                Prefix where Kepler should be installed.
                            Default is $PREFIX
--sysconfdir=DIR            Prefix where configuration files should be installed.
                            Default is PREFIX/etc
--includedir=DIR            Prefix where C header files should be installed.
                            Default is PREFIX/include
--lua-suffix=SUFFIX         Versioning suffix to use in Lua filenames.
                            Default is "$LUA_SUFFIX" (lua$LUA_SUFFIX, liblua$LUA_SUFFIX.a...)
--kepler-web=DIR            Prefix for Kepler's document root
                            Default is $KEPLER_WEB
--launcher=LAUNCHER         Which launcher to use.
                            Valid options are: cgi,fastcgi,mod2,xavante
                            Default is $LAUNCHER
--with-optional=PACKAGES    A comma-separated list of optional packages to build.
                            Valid options are: lualogging,luasql,luaexpat,luazip,md5
                            Default is $OPTIONAL_PACKAGES
--with-luasql-driver=DRIVER Which SQL driver to use with LuaSQL.
                            Valid options are: mysql,oci8,postgres,sqlite,odbc
                            Default is $LUASQL_DRIVER
--enable-lua                Build and install Lua along with Kepler.
--disable-lua               Do not build or install Lua along with Kepler.
--with-lua=PREFIX           Do not build Lua, use LuaBinaries from given prefix.
                            Default is $LUABINARIES_DIR
--with-lua-include=DIR      When using a pre-built Lua, you can also specify its includes dir.
                            Default is $LUABINARIES_INCLUDEDIR
--with-lua-lib=DIR          When using a pre-built Lua, you can also specify its libraries dir.
                            Default is $LUABINARIES_LIBDIR
--with-readline=DIR         Prefix where Readline is installed.
                            Used by Lua.
                            Default is $READLINE_DIR
--without-readline          Disable Readline support when building Lua.

External dependencies for optional packages:
--with-expat=DIR            Prefix where Expat is installed.
                            Used by LuaExpat.
                            Default is $EXPAT_DIR
--with-zzip=DIR             Prefix where ZZip is installed.
                            Used by LuaZip.
                            Default is $ZZIP_DIR
--with-oci8=DIR             Prefix where OCI8 is installed.
                            Used by the OCI8 driver for LuaSQL.
                            Default is $OCI8_DIR
--with-postgres=DIR         Prefix where Postgres is installed.
                            Used by the Postgres driver for LuaSQL.
                            Default is $POSTGRES_DIR
--with-sqlite=DIR           Prefix where Sqlite is installed.
                            Used by the Sqlite driver for LuaSQL.
                            Default is $SQLITE_DIR
--with-odbc=DIR             Prefix where UnixODBC is installed.
                            Used by the ODBC driver for LuaSQL.
                            Default is $ODBC_DIR
--with-mysql=DIR            Prefix where MySQL is installed.
                            Used by the MySQL driver for LuaSQL.
                            Default is $MYSQL_DIR
--with-fastcgi=DIR          Prefix where FCGI is installed.
                            Used by the FastCGI launcher.
                            Default is $SQLITE_DIR
--with-apache=DIR           Prefix where Apache is installed.
                            Used by the Mod2 launcher
                            Default is $APACHE_DIR
--with-apache-modules=DIR   Directory for Apache modules
                            Default is $APACHE_MODULES_DIR
EOF
}

# Parse options

while [ "$1" ]
do
   value="`echo $1 | sed 's/.*=\(.*\)/\1/'`"
   case "$1" in
   --help)
      show_help
      exit 0
      ;;
   --prefix=*)
      PREFIX="$value"
      ;;
   --sysconfdir=*)
      SYSCONFDIR="$value"
      SYSCONFDIR_SET=yes
      ;;
   --includedir=*)
      INCLUDEDIR="$value"
      INCLUDEDIR_SET=yes
      ;;
   --lua-suffix=*)
      LUA_SUFFIX="$value"
      ;;
   --kepler-web=*)
      KEPLER_WEB="$value"
      ;;
   --with-readline=*)
      READLINE_DIR="$value"
      ;;
   --without-readline)
      USE_READLINE=no
      ;;
   --with-expat=*)
      EXPAT_DIR="$value"
      ;;
   --with-zzip=*)
      ZZIP_DIR="$value"
      ;;
   --with-oci8=*)
      OCI8_DIR="$value"
      LUASQL_DRIVER=oci8
      ;;
   --with-postgres=*)
      POSTGRES_DIR=$value
      DETECT_POSTGRES=no
      LUASQL_DRIVER=postgres
      ;;
   --with-sqlite=*)
      SQLITE_DIR="$value"
      LUASQL_DRIVER=sqlite
      ;;
   --with-odbc=*)
      ODBC_DIR="$value"
      LUASQL_DRIVER=odbc
      ;;
   --with-fastcgi=*)
      FASTCGI_DIR="$value"
      LAUNCHER=fastcgi
      ;;
   --with-mysql=*)
      MYSQL_DIR="$value"
      DETECT_MYSQL=no
      LUASQL_DRIVER=mysql
      ;;
   --with-apache=*)
      APACHE_DIR="$value"
      DETECT_APACHE=no
      LAUNCHER=mod2
      ;;
   --with-apache-modules=*)
      APACHE_MODULES_DIR="$value"
      APACHE_MODULES_SET="yes"
      ;;
   --launcher=*)
      LAUNCHER="$value"
      ;;
   --with-luasql-driver=*)
      LUASQL_DRIVER="$value"
      ;;
   --with-optional=*)
      OPTIONAL_PACKAGES="$value"
      ;;
   --with-lua=*)
      LUABINARIES_DIR="$value"
      BUILD_LUA="no"
      INSTALL_LUA="no"
      ;;
   --with-lua-include=*)
      LUABINARIES_INCLUDEDIR="$value"
      LUABINARIES_INCLUDESET=yes
      ;;
   --with-lua-lib=*)
      LUABINARIES_LIBDIR="$value"
      LUABINARIES_LIBSET=yes
      ;;
   --disable-lua)
      BUILD_LUA="no"
      INSTALL_LUA="no"
      ;;
   --enable-lua)
      BUILD_LUA="yes"
      INSTALL_LUA="yes"
      ;;
   *)
      echo "Error: Unknown flag: $1"
      exit 1
      ;;
   esac
   shift
done

if ! [ "$INCLUDEDIR_SET" = "yes" ]
then
   INCLUDEDIR="$PREFIX/include"
fi

if ! [ "$SYSCONFDIR_SET" = "yes" ]
then
   SYSCONFDIR="$PREFIX/etc"
fi

# Check if should build Lua

find_program() {
   path="$PATH"
   item="`echo "$path" | sed 's/\([^:]*\):.*/\1/'`"
   path="`echo "$path" | sed -n 's/[^:]*::*\(.*\)/\1/p'`"
   found="no"
   while [ "$item" ]
   do
      if [ -e "$item/$1" ]
      then
         found="yes"
         break
      fi
      item="`echo "$path" | sed 's/\([^:]*\):.*/\1/'`"
      path="`echo "$path" | sed -n 's/[^:]*::*\(.*\)/\1/p'`"
   done
   if [ "$found" = "yes" ]
   then
      echo "$item"
   else
      echo ""
   fi
}

if [ "$BUILD_LUA" = "detect" ]
then
   echo -n "Looking for LuaBinaries... "
   find_lua=`find_program lua$LUA_SUFFIX`
   if [ "$find_lua" ]
   then
      echo "lua$LUA_SUFFIX found in \$PATH: $find_lua"
      LUABINARIES_DIR=`dirname $find_lua`
      BUILD_LUA=no
      INSTALL_LUA=no
   else
      echo "lua$LUA_SUFFIX not found in \$PATH."
      LUABINARIES_DIR="$PREFIX"
      BUILD_LUA=yes
      INSTALL_LUA=yes
   fi
fi

if ! [ "$LUABINARIES_INCLUDESET" = "yes" ]
then
   LUABINARIES_INCLUDEDIR="$LUABINARIES_DIR/include"
fi
if ! [ "$LUABINARIES_LIBSET" = "yes" ]
then
   LUABINARIES_LIBDIR="$LUABINARIES_DIR/lib"
fi

if [ "$BUILD_LUA" = "no" ]
then
   echo "Will not build Lua. Make sure a LuaBinaries-compliant build of Lua is"
   echo "available in $LUABINARIES_DIR"
else
   echo "Will build Lua along with Kepler."
fi

if [ "$INSTALL_LUA" = "yes" ]
then
   echo "Will install Lua along with Kepler."
else
   echo "Will not install Lua. To enable it explictly, use --enable-lua."
fi

# External dependencies

test_package() {
   package_keyword="$1"
   package_name="$2"
   with_flag="$3"
   shift 3
   if echo "$OPTIONAL_PACKAGES" | grep -q "$package_keyword"
   then
      echo -n "Checking $package_name... "
      tried=""
      while [ "$1" ]
      do
         test_file="$1"
         if [ -e "$test_file" ]
         then
            echo "found: $test_file"
            return 0
         fi
         tried="$tried $1"
         shift
      done
      echo "not found:$tried"
      echo
      echo "Error: Could not verify the presence of $package_name."
      echo "You may need to install development packages for $package_name."
      echo "If you are sure they are installed,"
      [ "$with_flag" ] && echo "you can supply its location with $with_flag."
      exit 1
   fi
}

if ! [ "`uname`" = "Linux" ]
then
   USE_READLINE=no
fi

if [ "$BUILD_LUA" = "no" ]
then
   test_package "" "LuaBinaries" --with-lua $LUABINARIES_INCLUDEDIR/lua.h
elif [ "$USE_READLINE" = "yes" ]
then
   test_package "" "Readline" --with-readline $READLINE_DIR/include/readline/readline.h
fi

test_package luaexpat "Expat" --with-expat $EXPAT_DIR/include/expat.h
test_package luazip "Zzip" --with-zzip $ZZIP_DIR/include/zzip.h

case "$LUASQL_DRIVER" in
oci8)
   test_package luasql "OCI8" --with-oci8 $OCI8_DIR/lib/libclntsh.so
   ;;
postgres)
   if echo "$OPTIONAL_PACKAGES" | grep -q "luasql"
   then
      if [ "$DETECT_POSTGRES" = "yes" ]
      then
         find_helper=`find_program pg_config`
         if [ "$find_helper" ]
         then
            POSTGRES_INCLUDEFLAGS="-I$(pg_config --includedir) -I$(pg_config --pkgincludedir)"
            POSTGRES_LIBFLAGS="-L$(pg_config --libdir) -L$(pg_config --pkglibdir) -lpq"
         else
            echo
            echo "Error: pg_config not found in your \$PATH."
            echo "You may need to install development packages for PostgreSQL."
            exit 1
         fi
      else
         test_package luasql "PostgreSQL" --with-postgres $POSTGRES_DIR/include/pg_config.h
         POSTGRES_INCLUDEFLAGS="-I$POSTGRES_DIR/include -I$POSTGRES_DIR/include/postgresql"
         POSTGRES_LIBFLAGS="-L$POSTGRES_DIR/lib -L$POSTGRES_DIR/lib/postgresql -lpq"
      fi
      echo "Postgres includes: $POSTGRES_INCLUDEFLAGS"
      echo "Postgres libs: $POSTGRES_LIBFLAGS"
   fi
   ;;
mysql)
   if echo "$OPTIONAL_PACKAGES" | grep -q "luasql"
   then
      if [ "$DETECT_MYSQL" = "yes" ]
      then
         find_helper=`find_program mysql_config`
         if [ "$find_helper" ]
         then
            mysql_version=$(mysql_config --version | cut -b 1)
            if [ "$mysql_version" -lt 4 ]
            then
               echo
               echo "Error: MySQL >= 4 is required."
               exit 1
            fi
            MYSQL_INCLUDEFLAGS=$(mysql_config --include)
            MYSQL_LIBFLAGS=$(mysql_config --libs)
         else
            echo
            echo "Error: mysql_config not found in your \$PATH."
            echo "You may need to install development packages for MySQL."
            exit 1
         fi
      else
         test_package luasql "MySQL" --with-mysql $MYSQL_DIR/include/mysql.h
         MYSQL_INCLUDEFLAGS="-I$MYSQL_DIR/include"
         MYSQL_LIBFLAGS="-L$MYSQL_DIR/lib -lmysqlclient -lz -lcrypt -lnsl -lm"
      fi
      echo "MySQL includes: $MYSQL_INCLUDEFLAGS"
      echo "MySQL libs: $MYSQL_LIBFLAGS"
   fi
   ;;
sqlite)
   test_package luasql "Sqlite 2.x" --with-sqlite $SQLITE_DIR/include/sqlite.h
   ;;
odbc)
   test_package luasql "UnixODBC" --with-odbc $ODBC_DIR/include/sql.h
   ;;
esac

case "$LAUNCHER" in
fastcgi)
   test_package "" "FastCGI" --with-fastcgi $FASTCGI_DIR/include/fastcgi.h
   ;;
mod2)
   if [ "$DETECT_APACHE" = "yes" ]
   then
      echo -n "Checking Apache version... "
      find_helper=`find_program apr-1-config`
      full_path="$find_helper/apr-1-config"
      if [ "$find_helper" ]
      then
         # Apache 2.2
         echo "2.2"
         ap_bin_dir=$($full_path --bindir)
         ap_root_define=$($(dirname "$ap_bin_dir")/sbin/httpd -V | grep HTTPD_ROOT)
         ap_root_dir=$(echo "$ap_root_define" | cut -d '"' -f 2)
         if ! [ "$APACHE_MODULES_SET" ]
         then
            APACHE_MODULES_DIR="$ap_root_dir/lib/httpd/modules"
         fi
      else
         # Apache 2.0
         find_helper=`find_program apr-config`
         full_path="$find_helper/apr-config"
         if [ "$find_helper" ]
         then
            echo "2.0"
            ap_bin_dir=$($full_path --bindir)
            ap_root_define=$("$ap_bin_dir"/httpd -V | grep HTTPD_ROOT)
            ap_root_dir=$(echo "$ap_root_define" | cut -d '"' -f 2)
            if ! [ "$APACHE_MODULES_SET" ]
            then
               APACHE_MODULES_DIR="$ap_root_dir/lib/apache2/modules"
            fi
         fi
      fi
      if [ "$find_helper" ]
      then
         APACHE_INCLUDEFLAGS=$($full_path --includes)
         APACHE_LIBFLAGS=$($full_path --ldflags --libs --link-ld)
      else
         echo
         echo "Error: apr-1-config or apr-config not found in your \$PATH."
         echo "You may need to install development packages for Apache."
         exit 1
      fi
   else
      test_package "" "Apache" --with-apache $APACHE_DIR/include/httpd.h $APACHE_DIR/include/apache2/httpd.h
      APACHE_INCLUDEFLAGS="-I$APACHE_DIR/include -I$APACHE_DIR/include/apache2 -I$APACHE_DIR/include/apr-0"
      APACHE_LIBFLAGS="-L$APACHE_DIR/lib -lrt -lm -lcrypt -lnsl -lpthread -ldl -lapr-0"
      if ! [ "$APACHE_MODULES_SET" ]
      then
         APACHE_MODULES_DIR="$APACHE_DIR/lib/apache2/modules"
      fi
   fi
   echo "Apache includes: $APACHE_INCLUDEFLAGS"
   echo "Apache libs: $APACHE_LIBFLAGS"
   echo "Apache modules dir: $APACHE_MODULES_DIR"
   if ! [ -d "$APACHE_MODULES_DIR" ]
   then
      echo
      echo "Error: Apache modules dir $APACHE_MODULES_DIR"
      echo "does not seem to exist."
      if ! [ "$APACHE_MODULES_SET" ]
      then
         echo "You may want to pass it explicitly using --with-apache-modules."
      fi
      exit 1
   fi
   ;;
esac

# Write config

echo "Writing configuration..."
echo

cat <<EOF > config.unix
# This file was automatically generated by the configure script.
# Run "./configure --help" for details.
LAUNCHER=$LAUNCHER
OPTIONAL_PACKAGES=$OPTIONAL_PACKAGES
LUASQL_DRIVER=$LUASQL_DRIVER
BUILD_LUA=$BUILD_LUA
INSTALL_LUA=$INSTALL_LUA
USE_READLINE=$USE_READLINE

PREFIX=$PREFIX
SYSCONFDIR=$SYSCONFDIR
INCLUDEDIR=$INCLUDEDIR
LUA_SUFFIX=$LUA_SUFFIX
KEPLER_WEB=$KEPLER_WEB

READLINE_DIR=$READLINE_DIR
EXPAT_DIR=$EXPAT_DIR
ZZIP_DIR=$ZZIP_DIR
OCI8_DIR=$OCI8_DIR
POSTGRES_DIR=$POSTGRES_DIR
SQLITE_DIR=$SQLITE_DIR
ODBC_DIR=$ODBC_DIR
FASTCGI_DIR=$FASTCGI_DIR
LUABINARIES_DIR=$LUABINARIES_DIR
LUABINARIES_INCLUDEDIR=$LUABINARIES_INCLUDEDIR
LUABINARIES_LIBDIR=$LUABINARIES_LIBDIR

APACHE_INCLUDEFLAGS=$APACHE_INCLUDEFLAGS
APACHE_LIBFLAGS=$APACHE_LIBFLAGS
APACHE_MODULES_DIR=$APACHE_MODULES_DIR
MYSQL_INCLUDEFLAGS=$MYSQL_INCLUDEFLAGS
MYSQL_LIBFLAGS=$MYSQL_LIBFLAGS
POSTGRES_INCLUDEFLAGS=$POSTGRES_INCLUDEFLAGS
POSTGRES_LIBFLAGS=$POSTGRES_LIBFLAGS
EOF

echo "Installation prefix: $PREFIX"
echo "Launcher: $LAUNCHER"
echo "Optional packages: $OPTIONAL_PACKAGES"

make clean > /dev/null 2> /dev/null

echo
echo "Done. You can now run 'make' to build."
echo
