#!/bin/sh

# Defaults

PREFIX=/usr/local
SYSCONFDIR="$PREFIX/etc/prosody"
LIBDIR="$PREFIX/lib"
DATADIR="$PREFIX/var/lib/prosody"
LUA_SUFFIX=""
LUA_DIR="/usr"
LUA_BINDIR="/usr/bin"
LUA_INCDIR="/usr/include"
LUA_LIBDIR="/usr/lib"
IDN_LIB=idn
ICU_FLAGS="-licui18n -licudata -licuuc"
OPENSSL_LIB=crypto
CC=gcc
CXX=g++
LD=gcc
RUNWITH=lua
EXCERTS=yes

CFLAGS="-fPIC -Wall"
LDFLAGS="-shared"

IDN_LIBRARY=idn
# Help

show_help() {
cat <<EOF
Configure Prosody prior to building.

--help                      This help.
--ostype=OS                 Use one of the OS presets.
                            May be one of: debian, macosx, linux, freebsd, openbsd
--prefix=DIR                Prefix where Prosody should be installed.
                            Default is $PREFIX
--sysconfdir=DIR            Location where the config file should be installed.
                            Default is \$PREFIX/etc/prosody
--libdir=DIR                Location where the server files should be stored.
                            Default is \$PREFIX/lib
--datadir=DIR               Location where the server data should be stored.
                            Default is \$PREFIX/var/lib/prosody
--lua-suffix=SUFFIX         Versioning suffix to use in Lua filenames.
                            Default is "$LUA_SUFFIX" (lua$LUA_SUFFIX...)
--with-lua=PREFIX           Use Lua from given prefix.
                            Default is $LUA_DIR
--runwith=BINARY            What Lua binary to set as runtime environment.
                            Default is $RUNWITH
--with-lua-include=DIR      You can also specify Lua's includes dir.
                            Default is \$LUA_DIR/include
--with-lua-lib=DIR          You can also specify Lua's libraries dir.
                            Default is \$LUA_DIR/lib
--with-idn=LIB              The name of the IDN library to link with.
                            Default is $IDN_LIB
--idn-library=(idn|icu)     Select library to use for IDNA functionality.
                            idn: use GNU libidn (default)
                            icu: use ICU from IBM
--with-ssl=LIB              The name of the SSL to link with.
                            Default is $OPENSSL_LIB
--cflags=FLAGS              Flags to pass to the compiler
                            Default is $CFLAGS
--ldflags=FLAGS             Flags to pass to the linker
                            Default is $LDFLAGS
--c-compiler=CC             The C compiler to use when building modules.
                            Default is $CC
--linker=CC                 The linker to use when building modules.
                            Default is $LD
--require-config            Will cause Prosody to refuse to run when
                            it fails to find a configuration file
--no-example-certs          Disables generation of example certificates.
EOF
}


while [ "$1" ]
do
   value="`echo $1 | sed 's/[^=]*=\(.*\)/\1/'`"
   if echo "$value" | grep -q "~"
   then
      echo
      echo '*WARNING*: the "~" sign is not expanded in flags.'
      echo 'If you mean the home directory, use $HOME instead.'
      echo
   fi
   case "$1" in
   --help)
      show_help
      exit 0
      ;;
   --prefix=*)
      PREFIX="$value"
      PREFIX_SET=yes
      ;;
   --sysconfdir=*)
      SYSCONFDIR="$value"
      SYSCONFDIR_SET=yes
      ;;
   --ostype=*)
      OSTYPE="$value"
      OSTYPE_SET=yes
      if [ "$OSTYPE" = "debian" ]; then
        LUA_SUFFIX="5.1";
      	LUA_SUFFIX_SET=yes
      	RUNWITH="lua5.1"
      	LUA_INCDIR=/usr/include/lua5.1;
      	LUA_INCDIR_SET=yes
      	CFLAGS="$CFLAGS -D_GNU_SOURCE"
    	fi
    	if [ "$OSTYPE" = "macosx" ]; then
        LUA_INCDIR=/usr/local/include;
      	LUA_INCDIR_SET=yes
      	LUA_LIBDIR=/usr/local/lib
      	LUA_LIBDIR_SET=yes
      	CFLAGS="$CFLAGS -mmacosx-version-min=10.3"
      	LDFLAGS="-bundle -undefined dynamic_lookup"
    	fi
      if [ "$OSTYPE" = "linux" ]; then
        LUA_INCDIR=/usr/local/include;
        LUA_INCDIR_SET=yes
        LUA_LIBDIR=/usr/local/lib
        LUA_LIBDIR_SET=yes
        CFLAGS="-Wall -fPIC -D_GNU_SOURCE"
        LDFLAGS="-shared"
      fi
      if [ "$OSTYPE" = "freebsd" -o "$OSTYPE" = "openbsd" ]; then
        LUA_INCDIR="/usr/local/include/lua51"
        LUA_INCDIR_SET=yes
        CFLAGS="-Wall -fPIC -I/usr/local/include"
        LDFLAGS="-I/usr/local/include -L/usr/local/lib -shared"
        LUA_SUFFIX="-5.1"
        LUA_SUFFIX_SET=yes
        LUA_DIR=/usr/local
        LUA_DIR_SET=yes
        CC=cc
        LD=ld
      fi
      if [ "$OSTYPE" = "openbsd" ]; then
        LUA_INCDIR="/usr/local/include";
      fi
      ;;
   --libdir=*)
      LIBDIR="$value"
      LIBDIR_SET=yes
      ;;
   --datadir=*)
   	DATADIR="$value"
   	DATADIR_SET=yes
      ;;
   --require-config)
      REQUIRE_CONFIG=yes
      ;;
   --lua-suffix=*)
      LUA_SUFFIX="$value"
      LUA_SUFFIX_SET=yes
      ;;
   --with-lua=*)
      LUA_DIR="$value"
      LUA_DIR_SET=yes
      ;;
   --with-lua-include=*)
      LUA_INCDIR="$value"
      LUA_INCDIR_SET=yes
      ;;
   --with-lua-lib=*)
      LUA_LIBDIR="$value" LUA_LIBDIR_SET=yes
      ;;
   --with-idn=*)
      IDN_LIB="$value"
      ;;
	--idn-library=*)
		IDN_LIBRARY="$value"
		;;
   --with-ssl=*)
      OPENSSL_LIB="$value"
      ;;
   --cflags=*)
      CFLAGS="$value"
      ;;
   --ldflags=*)
      LDFLAGS="$value"
      ;;
   --c-compiler=*)
      CC="$value"
      ;;
   --linker=*)
      LD="$value"
      ;;
   --runwith=*)
      RUNWITH="$value"
      ;;
    --no-example-certs)
      EXCERTS=
      ;;
   *)
      echo "Error: Unknown flag: $1"
      exit 1
      ;;
   esac
   shift
done

if [ "$PREFIX_SET" = "yes" -a ! "$SYSCONFDIR_SET" = "yes" ]
then
   if [ "$PREFIX" = "/usr" ]
   then SYSCONFDIR=/etc/prosody
   else SYSCONFDIR=$PREFIX/etc/prosody
   fi
fi

if [ "$PREFIX_SET" = "yes" -a ! "$DATADIR_SET" = "yes" ]
then
   if [ "$PREFIX" = "/usr" ]
   then DATADIR=/var/lib/prosody
   else DATADIR=$PREFIX/var/lib/prosody
   fi
fi

if [ "$PREFIX_SET" = "yes" -a ! "$LIBDIR_SET" = "yes" ]
then
   LIBDIR=$PREFIX/lib
fi

find_program() {
   path="$PATH"
   item="`echo "$path" | sed 's/\([^:]*\):.*/\1/'`"
   path="`echo "$path" | sed -n 's/[^:]*::*\(.*\)/\1/p'`"
   found="no"
   while [ "$item" ]
   do
      if [ -f "$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 [ "$LUA_SUFFIX_SET" != "yes" ]
then
   for suffix in "5.1" "51" ""
   do
      LUA_SUFFIX="$suffix"
      if [ "$LUA_DIR_SET" = "yes" ]
      then
         if [ -f "$LUA_DIR/bin/lua$suffix" ]
         then
            find_lua="$LUA_DIR"
         fi
      else
         find_lua=`find_program lua$suffix`
      fi
      if [ "$find_lua" ]
      then
         echo "Lua interpreter found: $find_lua/lua$suffix..."
         break
      fi
   done
fi

if [ "$LUA_DIR_SET" != "yes" ]
then
   echo -n "Looking for Lua... "
   if [ ! "$find_lua" ]
   then
      find_lua=`find_program lua$LUA_SUFFIX`
      echo "lua$LUA_SUFFIX found in \$PATH: $find_lua"
   fi
   if [ "$find_lua" ]
   then
      LUA_DIR=`dirname $find_lua`
      LUA_BINDIR="$find_lua"
   else
      echo "lua$LUA_SUFFIX not found in \$PATH."
      echo "You may want to use the flags --with-lua and/or --lua-suffix. See --help."
      exit 1
   fi
fi

if [ "$LUA_INCDIR_SET" != "yes" ]
then
   LUA_INCDIR="$LUA_DIR/include"
fi

if [ "$LUA_LIBDIR_SET" != "yes" ]
then
   LUA_LIBDIR="$LUA_DIR/lib"
fi

if [ "$LUA_DIR_SET" = "yes" ]
then
   LUA_BINDIR="$LUA_DIR/bin"
fi

if [ "$IDN_LIBRARY" = "icu" ]
then
	IDNA_LIBS="$ICU_FLAGS"
	CFLAGS="$CFLAGS -DUSE_STRINGPREP_ICU"
fi
if [ "$IDN_LIBRARY" = "idn" ]
then
	IDNA_LIBS="-l$IDN_LIB"
fi

OPENSSL_LIBS="-l$OPENSSL_LIB"

echo -n "Checking Lua includes... "
lua_h="$LUA_INCDIR/lua.h"
if [ -f "$lua_h" ]
then
   echo "lua.h found in $lua_h"
else
   echo "lua.h not found (looked in $lua_h)"
   echo "You may want to use the flag --with-lua-include. See --help."
   exit 1
fi

find_helper() {
   explanation="$1"
   shift
   tried="$*"
   while [ "$1" ]
   do
      found=`find_program "$1"`
      if [ "$found" ]
      then
         echo "$1 found at $found"
         HELPER=$1
         return
      fi
      shift
   done
   echo "Could not find a $explanation. Tried: $tried."
   echo "Make sure one of them is installed and available in your PATH."
   exit 1
}

# Write config

echo "Writing configuration..."
echo

cat <<EOF > config.unix
# This file was automatically generated by the configure script.
# Run "./configure --help" for details.

PREFIX=$PREFIX
SYSCONFDIR=$SYSCONFDIR
LIBDIR=$LIBDIR
DATADIR=$DATADIR
LUA_SUFFIX=$LUA_SUFFIX
LUA_DIR=$LUA_DIR
LUA_INCDIR=$LUA_INCDIR
LUA_LIBDIR=$LUA_LIBDIR
LUA_BINDIR=$LUA_BINDIR
REQUIRE_CONFIG=$REQUIRE_CONFIG
IDN_LIB=$IDN_LIB
IDNA_LIBS=$IDNA_LIBS
OPENSSL_LIBS=$OPENSSL_LIBS
CFLAGS=$CFLAGS
LDFLAGS=$LDFLAGS
CC=$CC
CXX=$CXX
LD=$LD
RUNWITH=$RUNWITH
EXCERTS=$EXCERTS

EOF

echo "Installation prefix: $PREFIX"
echo "Prosody configuration directory: $SYSCONFDIR"
echo "Using Lua from: $LUA_DIR"

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

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