dnl SqlBox - Open Source Kannel Extension for store messages
dnl
dnl Rene Kluwen <rene dot kluwen at chimit dot nl>
dnl 
dnl Stand alone module by Martin Conte <reflejo at gmail dot com>
dnl 
dnl Documentation and additional patches by Alejandro Guerrieri <aguerrieri at kannel dot org>
dnl 
dnl This program is free software, distributed under the terms of
dnl the GNU General Public License, with a few exceptions granted (see LICENSE)
dnl

AC_PREREQ(2.5)

dnl Initialization
AC_INIT([sqlbox],[cvs],[devel@kannel.org])
AC_CONFIG_SRCDIR([gw/sqlbox.c])
AC_CONFIG_AUX_DIR(autotools)

dnl Check version number.
AC_MSG_CHECKING([cvs checkout date])
AC_CVS_DATE(CVS_DATE)
AC_MSG_RESULT([$CVS_DATE])
VERSION="cvs-$CVS_DATE"
SB_NAME="SqlBox"

dnl Defines
AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
AC_SUBST(VERSION)

AM_INIT_AUTOMAKE([$SB_NAME], [$VERSION])
AC_CONFIG_HEADERS([sb-config.h])
AM_MAINTAINER_MODE
AC_CANONICAL_HOST

dnl Checks for programs.
dnl AC_PROG_CC
AC_PROG_LIBTOOL

dnl add mmlib to the include path
INCLUDES='-I$(top_srcdir)/gw -I$(top_builddir)/gw'
AC_SUBST([INCLUDES])

dnl Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_HEADER_SYS_WAIT

dnl ommiting what kannel is already checking
dnl AC_CHECK_HEADERS(sys/ioctl.h sys/time.h sys/types.h unistd.h sys/poll.h)
dnl AC_CHECK_HEADERS(pthread.h getopt.h syslog.h iconv.h zlib.h execinfo.h stdlib.h)
dnl AC_CHECK_HEADERS([sys/socket.h sys/sockio.h netinet/in.h])

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_STRUCT_TM
AC_C_VOLATILE

dnl Checks for library functions.
AC_FUNC_CLOSEDIR_VOID
AC_FUNC_ERROR_AT_LINE
AC_FUNC_MALLOC
AC_FUNC_MEMCMP
dnl AC_TYPE_SIGNAL
dnl AC_FUNC_STAT
dnl AC_CHECK_FUNCS(gettimeofday select socket strdup getopt_long localtime_r gmtime_r backtrace srandom)

dnl Flags for determined platform
EXE_EXT=""
case "$host" in
  *-sun-solaris*) 
    CFLAGS="$CFLAGS -DSunOS=1"
    ;;
  *-cygwin*)
    EXE_EXT=".exe"
    ;;
  *apple-darwin*) 
    CFLAGS="$CFLAGS -DDARWIN=1"
    LIBS="$LIBS -L/opt/local/lib" 
    ;;
  *-linux-*)
    CFLAGS="$CFLAGS -D_XOPEN_SOURCE=600 -D_BSD_SOURCE"
    LDFLAGS="$LDFLAGS -rdynamic"
    ;;
  *-*-openbsd* | *-*-freebsd*)
    CFLAGS="$CFLAGS -pthread"
        AC_CHECK_LIB(c_r, pthread_exit, [LIBS="$LIBS -lc_r -lkse"; pthread="yes"])
    ;;
esac

AC_ARG_WITH(cflags,
[  --with-cflags=FLAGS     use FLAGS for CFLAGS],
CFLAGS="$CFLAGS $withval")

AC_ARG_WITH(libs,
[  --with-libs=FLAGS       use FLAGS for extra libraries],
LIBS="$LIBS $withval")

dnl implement SSL stuff.
dnl Implement the --with-ssl option.

AC_ARG_WITH(ssl,
[  --with-ssl[=DIR]          where to look for OpenSSL libs and header files
                          DIR points to the installation [/usr/local/ssl]],
[ if test -d "$withval"; then
    ssllib="$withval/lib";
    sslinc="$withval/include"
  else
    AC_MSG_ERROR(Unable to find OpenSSL libs and/or directories at $withval)
  fi
])

dnl Implement --enable-ssl option.

AC_MSG_CHECKING([whether to compile with SSL support])
AC_ARG_ENABLE(ssl,
[  --enable-ssl            enable SSL client and server support [enabled]], [
  if test "$enableval" = no ; then
    AC_MSG_RESULT(disabled)
    ssl=no
  else
    ssl=yes
  fi
],[
  ssl=yes
])

if test "$ssl" = "yes" ; then
  dnl test only if --with-ssl has not been used
  if test "x$ssllib" = "x" && test "x$sslinc" = "x"; then
    for loc in /usr/lib /usr/local/ssl/lib /usr/local/openssl/lib; do
      if test -f "$loc/libssl.a"; then
        ssllib="$loc"
      fi
    done
    for loc in /usr/include/ssl /usr/include/openssl /usr/local/ssl/include \
               /usr/local/openssl/include; do
      if test -d "$loc"; then
        sslinc="$loc"
      fi
    done
  fi
  AC_MSG_RESULT(trying $ssllib $sslinc)
fi

dnl Implement the SSL library checking routine.
dnl This will define HAVE_LIBSSL in config.h

if test "x$ssllib" != "x" && test "x$sslinc" != "x"; then
  CFLAGS="$CFLAGS -I$sslinc"
  LIBS="$LIBS -L$ssllib"

  AC_PATH_PROG(OPENSSL, openssl, no)
  if test "$OPENSSL" = "yes"; then
    AC_MSG_CHECKING([openssl version])
    openssl_version=`$OPENSSL version | awk '{print $2}'`
    AC_MSG_RESULT([$openssl_version])
  fi
  AC_CHECK_LIB(crypto, CRYPTO_lock,
  [ LIBS="$LIBS -lcrypto"
    AC_CHECK_LIB(ssl, SSL_library_init,
    [ AC_CHECK_LIB(ssl, SSL_connect)
      AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
                       openssl/pem.h openssl/ssl.h openssl/err.h)
      AC_MSG_CHECKING(whether the OpenSSL library is multithread-enabled)
      AC_TRY_RUN([
        #define OPENSSL_THREAD_DEFINES
        #include <openssl/opensslconf.h>
        int main(void) {
        #if defined(THREADS)
          exit(0);
        #elif defined(OPENSSL_THREADS)
          exit(0);
        #else
          exit(1);
        #endif
        }
      ], [
        AC_MSG_RESULT(yes)
        AC_DEFINE(HAVE_LIBSSL)
        LIBS="$LIBS -lssl"
        AC_MSG_CHECKING([whether to compile with SSL support])
        AC_MSG_RESULT(yes)
      ], [
        AC_ARG_ENABLE(ssl-thread-test,
        [  --disable-ssl-thread-test  disable the multithread test for the OpenSSL library
                          this will force to continue even if the test fails],
        [ if test "$enableval" = no ; then
            AC_MSG_RESULT([no, continue forced])
          fi
        ], [
          AC_MSG_RESULT(no)
          AC_MSG_ERROR(Either get a multithread-enabled SSL or configure with --disable-ssl)
        ])
      ], echo "Cross-compiling; make sure your SSL library is multithread-enabled"
      )
    ])
  ])
fi


dnl DocBook stuff

AC_CONFIG_SECTION([Configuring DocBook support])
AC_CHECK_PROG(OLDJADE, jade, jade, no)
if test "$OLDJADE" = "no" ;
  then
    AC_CHECK_PROG(JADE, openjade, openjade, no)
  else
    JADE=$OLDJADE
fi
AC_CHECK_PROG(JADETEX, jadetex, jadetex, no)
AC_CHECK_PROG(PDFJADETEX, pdfjadetex, pdfjadetex, no)
AC_CHECK_PROG(DVIPS, dvips, dvips, no)
AC_CHECK_PROG(FIG2DEV, fig2dev, fig2dev, no)
AC_CHECK_PROG(CONVERT, convert, convert, no)
AC_SUBST(HTML_DSL)
found=""
for loc in /usr /usr/local /opt/local; do
  if test "x$found" = "x" ; then 
    for file in ${loc}/lib/sgml/stylesheet/dsssl/docbook/nwalsh/html/docbook.dsl \
  ${loc}/lib/sgml/stylesheets/nwalsh-modular/html/docbook.dsl \
  ${loc}/share/dsssl/docbook-dsssl/html/docbook.dsl \
  ${loc}/share/sgml/docbook/dsssl-stylesheets-1.*/html/docbook.dsl \
  ${loc}/share/sgml/docbook/dsssl-stylesheets/html/docbook.dsl \
  ${loc}/share/sgml/docbook/stylesheet/dsssl/modular/html/docbook.dsl \
        ${loc}/share/sgml/docbook/dsssl/modular/html/docbook.dsl ; do
      if test "x$found" = "x" ; then 
  AC_CHECK_FILE($file,HTML_DSL=$file; found=1)
      fi
    done
  fi
done
AC_SUBST(TEX_DSL)
found=""
for loc in /usr /usr/local /opt/local; do
  if test "x$found" = "x" ; then 
    for file in ${loc}/lib/sgml/stylesheet/dsssl/docbook/nwalsh/print/docbook.dsl \
  ${loc}/lib/sgml/stylesheets/nwalsh-modular/print/docbook.dsl \
  ${loc}/share/dsssl/docbook-dsssl/print/docbook.dsl \
  ${loc}/share/sgml/docbook/dsssl-stylesheets-1.*/print/docbook.dsl \
  ${loc}/share/sgml/docbook/dsssl-stylesheets/print/docbook.dsl \
  ${loc}/share/sgml/docbook/stylesheet/dsssl/modular/print/docbook.dsl \
        ${loc}/share/sgml/docbook/dsssl/modular/print/docbook.dsl ; do
      if test "x$found" = "x" ; then 
  AC_CHECK_FILE($file,TEX_DSL=$file; found=1)
      fi
    done
  fi    
done

dnl Implement --enable-docs option.

AC_SUBST(DOCSTARGET)

AC_ARG_ENABLE(docs,
[  --enable-docs           enable building of documentation @<:@enabled@:>@], [
  if test "$enableval" = "yes"
  then
      DOCSTARGET="docs"
  else
      DOCSTARGET="no-docs"
  fi
])

if test "x$HTML_DSL" = "x" -o "x$TEX_DSL"   = "x" \
    || test "$JADE"       = "no" \
    || test "$JADETEX"    = "no" \
    || test "$PDFJADETEX" = "no" \
    || test "$DVIPS"      = "no" \
    || test "$FIG2DEV"    = "no" \
    || test "$CONVERT"    = "no" \
    || test "$DOCSTARGET" = "no-docs"
then
  DOCSTARGET="no-docs"
else
  DOCSTARGET="docs"
fi

case "$DOCSTARGET" in
no-docs) AC_MSG_RESULT(Not building documentation.) ;;
docs) AC_MSG_RESULT(Documentation will be built as well.) ;;
esac

dnl Implement --enable-drafts option.

AC_SUBST(DOCDRAFTS)
DOCDRAFTS="IGNORE"

AC_ARG_ENABLE(drafts,
[  --enable-drafts         enable building of documentation drafts @<:@disabled@:>@], [
  if test "$enableval" = "yes"
  then
      DOCDRAFTS="INCLUDE"
  else
      DOCDRAFTS="IGNORE"
  fi
])
if test "x$DOCSTARGET" = "xdocs"
then
    case "$DOCDRAFTS" in
    INCLUDE) AC_MSG_RESULT(Documentation will include drafts.) ;;
    esac
fi

dnl Checking for Ct-lib support

AC_MSG_CHECKING(for Ct-Lib support)
AC_ARG_WITH(ctlib,
[  --with-ctlib[=DIR]      Include Ct-Lib support.  DIR is the Ct-Lib
                          install directory, defaults to /opt/sybase.],
[
    if test "$withval" = "yes"; then
        withval=/opt/sybase
    fi

    if test "$withval" != "no"; then
        if test -f $withval/include/ctpublic.h; then
            CTLIB_INCDIR=$withval/include
            CTLIB_LIBDIR=$withval/lib
        else
            AC_MSG_RESULT(no)
            AC_MSG_ERROR(Invalid Ct-Lib directory - unable to find ctpublic.h)
        fi
        CTLIB_LFLAGS="-L$CTLIB_LIBDIR -lct -lcs -lsybtcl -lcomn -lintl"
        CTLIB_INCLUDE="-I$CTLIB_INCDIR"
        AC_DEFINE(HAVE_CTLIB, 1, [Defined to 1])
        AC_MSG_RESULT(yes)
        have_db=yes
        dnl ctlib requires -ldl sometime
        AC_CHECK_FUNC(dlopen, , AC_CHECK_LIB(dl, dlopen, CTLIB_LFLAGS="$CTLIB_LFLAGS -ldl"))
    fi
    if test "x$DBTYPE" = "x" ; then
       DBTYPE="ctlib"
    else
       DBTYPE="$DBTYPE-ctlib"
    fi

],[
    AC_MSG_RESULT(no)
])
AC_SUBST(CTLIB_LFLAGS)
AC_SUBST(CTLIB_INCLUDE)

dnl Checking for FreeTDS ct-lib support
AC_MSG_CHECKING(for FreeTDS Ct-Lib support)
AC_ARG_WITH(mssql,
[  --with-mssql[=DIR]    Include FreeTDS Ct-Lib support.  DIR is the FreeTDS
                          install directory, defaults to /usr/local.],
[
    if test "$withval" = "yes"; then
        withval=/usr/local
    fi

    if test "$withval" != "no"; then
        if test -f $withval/include/ctpublic.h; then
            CTLIB_INCDIR=$withval/include
            CTLIB_LIBDIR=$withval/lib
        else
            AC_MSG_RESULT(no)
            AC_MSG_ERROR(Invalid FreeTDS directory - unable to find ctpublic.h)
        fi
        CTLIB_LFLAGS="-L$CTLIB_LIBDIR -lct"
        CTLIB_INCLUDE="-I$CTLIB_INCDIR"
        AC_DEFINE(HAVE_CTLIB, 1, [Defined to 1])
        AC_MSG_RESULT(yes)
        have_db=yes
        AC_CHECK_FUNC(dlopen, , AC_CHECK_LIB(dl, dlopen, CTLIB_LFLAGS="$CTLIB_LFLAGS -ldl"))
    fi
    if test "x$DBTYPE" = "x" ; then
       DBTYPE="freetds"
    else
       DBTYPE="$DBTYPE-freetds"
    fi

],[
    AC_MSG_RESULT(no)
])
AC_SUBST(CTLIB_LFLAGS)
AC_SUBST(CTLIB_INCLUDE)

dnl Need to check for kannel
dnl Implement the --with-kannel-dir option
AC_ARG_WITH(kannel-dir,
[  --with-kannel-dir=DIR    where to look for Kannel Gateway libs and header files
                                                DIR points to the installation [/usr/local] ]
,
[
gwloc=""
if test -d "$withval" ; then
        gwloc="$withval"
fi
])

AC_PATH_PROG(GW_CONFIG, gw-config, no, [$gwloc/bin:$gwloc:../gateway/gw/:$PATH])
dnl check for Kannel gw-config
if test "$GW_CONFIG" = "no"; then
found=""
        for loc in $pgsqlloc /usr /usr/local ; do
                if test "x$found" = "x" ; then
                        AC_MSG_CHECKING([for Kannel include files in])
                        AC_MSG_RESULT($loc)
                        AC_CHECK_FILE("$loc/include/kannel/gw-config.h",
                                [CFLAGS="$CFLAGS -I$loc/include/kannel -I$loc/include/kannel"; 
                LDFLAGS="$LDFLAGS -L$loc/lib/kannel -lwap -lgwlib";
                found=1
                                ])
                fi
        done;
        if test "x$found" != "x1" ; then
                AC_MSG_ERROR([Unable to find gw-config.h, please provide a --with-kannel-dir=<dir> location])
        fi
else
        dnl gw_config found
        AC_MSG_CHECKING([Kannel version])
        gw_version=`$GW_CONFIG --version`
        AC_MSG_RESULT([$gw_version])
        AC_MSG_CHECKING([Kannel libs])
        if ! $GW_CONFIG --libs &>/dev/null ; then
                LDFLAGS="$LDFLAGS `$GW_CONFIG --libs`"
                gw_libdir=`$GW_CONFIG --libs`
                AC_MSG_RESULT([$gw_libdir])
        fi
        AC_MSG_CHECKING([Kannel includes])
        if ! $GW_CONFIG --cflags &>/dev/null ; then
                CFLAGS="$CFLAGS `$GW_CONFIG --cflags`"
                gw_incdir=`$GW_CONFIG --cflags`
                AC_MSG_RESULT([$gw_incdir])
        fi
fi

AC_CHECK_LIB([gwlib], [cfg_create], [], AC_MSG_ERROR([Kannel gwlib is required!]))

AC_MSG_CHECKING(for Kannel's DB support)

AC_TRY_RUN([#include "gw-config.h"
int main(
#if defined(HAVE_SQLITE3)
  exit(0);
#endif
  exit(1);
}],[
AC_SUBST(rpm_suffix, "sqlite3", [RPM Suffix])
AC_SUBST(rpm_requires, "sqlite3-devel >= 1.8", [RPM Requires])
])

AC_TRY_RUN([#include "gw-config.h"
int main(void){
#if defined(HAVE_SQLITE)
  exit(0);
#endif
  exit(1);
}],[
AC_SUBST(rpm_suffix, "sqlite", [RPM Suffix])
AC_SUBST(rpm_requires, "sqlite2-devel >= 2.7", [RPM Requires])
])

AC_TRY_RUN([#include "gw-config.h"
int main(void){
#if defined(HAVE_PGSQL)
  exit(0);
#endif
  exit(1);
}],[
AC_SUBST(rpm_suffix, "pgsql", [RPM Suffix])
AC_SUBST(rpm_requires, "postgresql-devel >= 7.2", [RPM Requires])
])

AC_TRY_RUN([#include "gw-config.h"
int main(void){
#if defined(HAVE_ORACLE)
  exit(0);
#endif
  exit(1);
}],[
AC_SUBST(rpm_suffix, "oracle", [RPM Suffix])
AC_SUBST(rpm_requires, "oracle-instantclient-devel >= 8", [RPM Requires])
])

AC_TRY_RUN([#include "gw-config.h"
int main(void){
#if defined(HAVE_MYSQL)
  exit(0);
#endif
  exit(1);
}],[
AC_SUBST(rpm_suffix, "mysql", [RPM Suffix])
AC_SUBST(rpm_requires, "mysql-devel >= 3.23", [RPM Requires])
])

AC_TRY_RUN([#include "gw-config.h"
int main(void){
#if defined(HAVE_SDB)
  exit(0);
#endif
  exit(1);
}],[
AC_SUBST(rpm_suffix, "sdb", [RPM Suffix])
AC_SUBST(rpm_requires, "libsdb-devel >= 0.5", [RPM Requires])
])

AC_CONFIG_FILES([Makefile gw/Makefile rpm/sqlbox.spec])

AC_OUTPUT
