# Copyright (C) Tildeslash Ltd. All rights reserved.

AC_PREREQ([2.53])

AC_INIT([libmonit], [1.0], [monit-dev@tildeslash.com])
AC_CONFIG_AUX_DIR(config)
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src])

# ---------------------------------------------------------------------------
# Programs 
# ---------------------------------------------------------------------------

AC_PROG_CC

# ---------------------------------------------------------------------------
# Libtool 
# ---------------------------------------------------------------------------

AC_PROG_LIBTOOL

# ---------------------------------------------------------------------------
# Build options
# ---------------------------------------------------------------------------

AC_ARG_ENABLE(optimized,
	AS_HELP_STRING([--enable-optimized], 
        	[Build software optimized]),
    [
        CFLAGS=`echo $CFLAGS|sed 's/-O.//'`
        if test "x$enableval" = "xyes" ; then
   	    	CFLAGS=`echo $CFLAGS|sed 's/-g//'`
		CFLAGS="$CFLAGS -O3"
		OPTIMIZED=1
	else
		OPTIMIZED=0
        fi
    ],
    [
	OPTIMIZED=0
    ]
)

AC_ARG_ENABLE(profiling,
        AS_HELP_STRING([--enable-profiling],
                [Build with debug and profiling options]),
    [
        if test "x$enableval" = "xyes" ; then
                CFLAGS="$CFLAGS -g -pg"
                profile="true"
        fi
    ],
    [
        profile="false"
    ]
)

AC_ARG_ENABLE([openssl],
        AS_HELP_STRING([--enable-openssl(=<path>)], 
                [Link Monit with openssl. An optional path argument may
                be given to specify the top-level directory to search for
                openssl to link with]),
     [
        openssl="true"
        if test "x$enableval" = "xyes"; then
		AC_CHECK_LIB([ssl], [SSL_library_init], [], [AC_MSG_ERROR([libssl not found])])
		AC_CHECK_LIB([crypto], [SHA1_Init], [], [AC_MSG_ERROR([libcrypto not found])])
	else
                AC_MSG_CHECKING([for openssl in $enableval])
                LDFLAGS="-L$enableval/lib -lssl -lcrypto $LDFLAGS "
                CPPFLAGS="-I$enableval/include $CPPFLAGS"
                if test -r "$enableval/lib/libssl.a" -a -r "$enableval/lib/libcrypto.a"; then
                        AC_MSG_RESULT([ok])
                else
                       AC_MSG_ERROR([openssl not found in $enableval])
                fi
        fi
     ],[openssl="false"])

# ---------------------------------------------------------------------------
# Libraries 
# ---------------------------------------------------------------------------

AC_CHECK_LIB([pthread], [pthread_create], [], [AC_MSG_ERROR([POSIX thread library is required])])

# ---------------------------------------------------------------------------
# Header files 
# ---------------------------------------------------------------------------

AC_HEADER_STDC
AC_CHECK_HEADERS([ctype.h errno.h fcntl.h limits.h pthread.h setjmp.h \
                  signal.h stdarg.h stdio.h string.h string.h strings.h \
                  sys/socket.h sys/time.h sys/types.h unistd.h execinfo.h \
                  sys/sendfile.h sys/dirent.h poll.h sys/poll.h sys/event.h \
                  stropts.h sys/ioctl.h sys/filio.h])

# ------------------------------------------------------------------------
# Functions 
# ------------------------------------------------------------------------

# Require a working setjmp
AC_CACHE_CHECK([setjmp is available],
               [libmonit_cv_setjmp_available],
               [AC_RUN_IFELSE([AC_LANG_PROGRAM(
                       [[#include <setjmp.h>]],
                       [[jmp_buf env; setjmp(env);]])],
                       [AC_MSG_RESULT(yes)],
                       [AC_MSG_FAILURE([setjmp is required])],
                       [AC_MSG_ERROR(cross-compiling: please set 'libmonit_cv_setjmp_available=[yes|no]')])])

# Require that we have vsnprintf that conforms to c99. I.e. does bounds check
AC_CACHE_CHECK([vsnprintf is c99 conformant],
               [libmonit_cv_vsnprintf_c99_conformant],
               [AC_RUN_IFELSE([AC_LANG_PROGRAM(
                        [[#include <stdarg.h>
                          #include <stdio.h>]],
                        [[char t[1]; va_list ap; int n = vsnprintf(t, 1, "hello", ap); if(n == 5) return 0;return 1;]])],
                        [AC_MSG_RESULT(yes)],
                        [AC_MSG_FAILURE([vsnprintf does not conform to c99])],
                        [AC_MSG_ERROR(cross-compiling: please set 'libmonit_cv_vsnprintf_c99_conformant=[yes|no]')])])


# ------------------------------------------------------------------------
# Architecture/OS
# ------------------------------------------------------------------------

architecture=`uname`
if test "$architecture" = "Linux"  
then
   CFLAGS="$CFLAGS -D _REENTRANT"
   AC_DEFINE([LINUX], 1, [Define to 1 if the system is Linux])
elif test "$architecture" = "FreeBSD"
then
   CFLAGS="$CFLAGS -D _REENTRANT"
   AC_DEFINE([FREEBSD], 1, [Define to 1 if the system is FreeBSD])
elif test "$architecture" = "GNU/kFreeBSD"
then
   CFLAGS="$CFLAGS -D _REENTRANT"
   AC_DEFINE([FREEBSD], 1, [Define to 1 if the system is FreeBSD])
elif test "$architecture" = "OpenBSD"
then
   CFLAGS="$CFLAGS -D _REENTRANT"
   AC_DEFINE([OPENBSD], 1, [Define to 1 if the system is OpenBSD])
elif test "$architecture" = "Darwin"
then
   CFLAGS="$CFLAGS -DREENTRANT"
   AC_DEFINE([DARWIN], 1, [Define to 1 if the system is OSX])
elif test "$architecture" = "SunOS"
then
   LIBS="$LIBS -lsocket -lnsl"
   CFLAGS="$CFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D__EXTENSIONS__ -m64"
   LDFLAGS="$LDFLAGS -m64"
   if test `uname -m` != "i86pc"
   then
       CFLAGS="$CFLAGS -mtune=v9"
       LDFLAGS="$LDFLAGS -mtune=v9"
   fi
   AC_DEFINE([SOLARIS], 1, [Define to 1 if the system is SOLARIS])
elif test "$architecture" = "HP-UX"
then
   CFLAGS="$CFLAGS -D_REENTRANT"
   AC_DEFINE([HPUX], 1, [Define to 1 if the system is HPUX])
elif test "$architecture" = "NetBSD"
then
   CFLAGS="$CFLAGS -D_REENTRANT"
   AC_DEFINE([NETBSD], 1, [Define to 1 if the system is NETBSD])
elif test "$architecture" = "AIX"
then
   CFLAGS="$CFLAGS -D_THREAD_SAFE -D_REENTRANT"
   AC_DEFINE([AIX], 1, [Define to 1 if the system is AIX])
else
   AC_MSG_ERROR([Architecture not supported: ${architecture}])
fi

# ---------------------------------------------------------------------------
# Compiler 
# ---------------------------------------------------------------------------

# Compiler characteristics
AC_C_CONST
AC_C_BIGENDIAN

# If the compiler is gcc, tune warnings and make the char type unsigned 
# and enable C99 support
if test "x$GCC" = "xyes"; then
	CFLAGS="$CFLAGS -Wall -Wunused -Wno-unused-label -funsigned-char";
        # Add C99 support
        CFLAGS="$CFLAGS -D_GNU_SOURCE -std=c99"
        # does this compiler support -Wno-pointer-sign ?
        svd_CFLAGS="$CFLAGS"
        CFLAGS="-Wno-pointer-sign $CFLAGS"
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [], [CFLAGS="$svd_CFLAGS"])        
        # does this compiler support -Wno-address ?
        svd_CFLAGS="$CFLAGS"
        CFLAGS="-Wno-address $CFLAGS"
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [], [CFLAGS="$svd_CFLAGS"])
fi


# ------------------------------------------------------------------------
# Atomic support
# ------------------------------------------------------------------------
# AC_MSG_CHECKING(for Atomic support)
# if test `uname` = "Darwin" -o `uname` = "FreeBSD" 
# then
#         AC_MSG_RESULT(yes)
# elif test `uname` = "SunOS"
# then
#         AC_CHECK_HEADER([atomic.h], 
#         [AC_MSG_RESULT(yes)],
#         [AC_MSG_ERROR([atomic.h is required for atomic support])])
# else
#         AC_RUN_IFELSE([AC_LANG_PROGRAM([],[
#              #if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)))
#              return 0;
#              #else
#              return 1;
#              #endif
# 	])],
# 	[AC_MSG_RESULT(yes)],
# 	[AC_MSG_FAILURE([GCC version > 4.1 is required for atomic support])])
# fi


# ------------------------------------------------------------------------
# IPv6 Support
# ------------------------------------------------------------------------

AC_MSG_CHECKING(for IPv6 support)
AC_CACHE_VAL(ac_cv_ipv6,
	AC_TRY_RUN([
	#include <sys/types.h>
	#include <sys/socket.h>
	#include <netinet/in.h>
	/* Make sure the definitions for AF_INET6 and struct sockaddr_in6
	 * are defined, and that we can actually create an IPv6 TCP socket.*/
	main()
	{
		int fd;
		struct sockaddr_in6 foo;
		fd = socket(AF_INET6, SOCK_STREAM, 0);
		exit(fd >= 0 ? 0 : 1);
	}],
	ac_cv_ipv6=yes,
	ac_cv_ipv6=no,
	ac_cv_ipv6=no))
AC_MSG_RESULT($ac_cv_ipv6)
if test $ac_cv_ipv6 = yes ; then
	AC_DEFINE([IPV6], 1, [Define to 1 if the system supports IPv6])
fi

# ---------------------------------------------------------------------------
# Functions 
# ---------------------------------------------------------------------------


# ---------------------------------------------------------------------------
# Outputs
# ---------------------------------------------------------------------------

AM_CONFIG_HEADER(src/xconfig.h)
AC_CONFIG_FILES([Makefile test/Makefile])
AC_OUTPUT

cat <<EOT
+------------------------------------------------------------+
| License:                                                   |
| This is Open Source Software and use is subject to the GNU |
| AFFERO GENERAL PUBLIC LICENSE version 3, available in this |
| distribution in the file COPYING.                          |
|                                                            |
| By continuing this installation process, you are bound by  | 
| the terms of this license agreement. If you do not agree   |
| with the terms of this license, you must abort the         |
| installation process at this point.                        |
+------------------------------------------------------------+
| Libmonit is configured as follows:                         |
|                                                            |
EOT

if test "x1" = "x$OPTIMIZED"; then
echo "|   Optimized:                                    ENABLED    |"
else
echo "|   Optimized:                                    DISABLED   |"
fi
if test "xfalse" = "x$profile"; then
echo "|   Profiling:                                    DISABLED   |"
else
echo "|   Profiling:                                    ENABLED    |"
fi
if test "xtrue" = "x$openssl"; then
echo "|   Openssl:                                      ENABLED    |"
fi
echo "+------------------------------------------------------------+"


