dnl Process this file with autoconf to produce a configure script.
AC_INIT([libsrtp], [1.5.1-pre], [https://github.com/cisco/libsrtp/issues])

dnl Must come before AC_PROG_CC
if test -z "$CFLAGS"; then
   dnl Default value for CFLAGS if not specified.
   CFLAGS="-fPIC -Wall -O4 -fexpensive-optimizations -funroll-loops"
fi

dnl Checks for programs.
AC_PROG_RANLIB
AC_PROG_CC
AC_PROG_INSTALL

dnl Check the byte order
AC_C_BIGENDIAN

AC_CANONICAL_HOST

dnl check host_cpu type, set defines appropriately
case $host_cpu in
     i*86 | x86_64 )
	AC_DEFINE(CPU_CISC, 1,
	   [Define if building for a CISC machine (e.g. Intel).])
        AC_DEFINE(HAVE_X86, 1,
	   [Define to use X86 inlined assembly code]);; 
	* )
	   AC_DEFINE(CPU_RISC, 1,
	    [Define if building for a RISC machine (assume slow byte access).])
	;;
esac	

dnl Check if we are on a Windows platform.
case $host_os in
    *cygwin*|*mingw* ) 
	EXE=.exe
	HOST_IS_WINDOWS=yes
	;;
    * )
	EXE=""
	;;
esac
AC_SUBST(EXE)   # define executable suffix; this is needed for `make clean'


AC_ARG_ENABLE(kernel-linux,
  [AS_HELP_STRING([--enable-kernel-linux],
		  [build library to run in Linux kernel context])],
  [], enable_kernel_linux=no)
AC_MSG_CHECKING(whether to build for Linux kernel context)
if test "$enable_kernel_linux" = "yes"; then
   AC_DEFINE(SRTP_KERNEL, 1,
	[Define to compile for kernel contexts.])
   AC_DEFINE(SRTP_KERNEL_LINUX, 1,
	[Define to compile for Linux kernel context.])
fi
AC_MSG_RESULT($enable_kernel_linux)

if test "$cross_compiling" != yes -a "$HOST_IS_WINDOWS" != yes; then
   dnl Check for /dev/urandom
   AC_CHECK_FILE(/dev/urandom, DEV_URANDOM=/dev/urandom,
      [AC_CHECK_FILE(/dev/random, DEV_URANDOM=/dev/random)])
fi



dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(stdlib.h)
AC_CHECK_HEADERS(unistd.h)
AC_CHECK_HEADERS(byteswap.h)
AC_CHECK_HEADERS(stdint.h)
AC_CHECK_HEADERS(sys/uio.h)
AC_CHECK_HEADERS(inttypes.h)
AC_CHECK_HEADERS(sys/types.h)
AC_CHECK_HEADERS(machine/types.h)
AC_CHECK_HEADERS(sys/int_types.h)

dnl socket() and friends
AC_CHECK_HEADERS(sys/socket.h netinet/in.h arpa/inet.h)
AC_CHECK_HEADERS(windows.h, [AC_CHECK_HEADERS(winsock2.h)])

AC_CHECK_HEADERS(syslog.h)

AC_CHECK_TYPES([int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,uint64_t])
AC_CHECK_SIZEOF(unsigned long)
AC_CHECK_SIZEOF(unsigned long long)

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T

dnl Checks for library functions.
AC_CHECK_FUNCS(socket inet_aton usleep sigaction)

dnl Find socket function if not found yet.
if test "x$ac_cv_func_socket" = "xno"; then
  AC_CHECK_LIB(socket, socket)
  AC_MSG_CHECKING([for socket in -lwsock32])
  SAVELIBS="$LIBS"
  LIBS="$LIBS -lwsock32"
  AC_TRY_LINK([
#include <winsock2.h>
],[
socket(0, 0, 0);
],
    ac_cv_func_socket=yes
    AC_MSG_RESULT(yes),
    LIBS="$SAVELIBS"
    AC_MSG_RESULT(no))
fi

AC_MSG_CHECKING(whether to compile in debugging)
AC_ARG_ENABLE(debug,
  [AS_HELP_STRING([--disable-debug],
		  [do not compile in dynamic debugging system])],
  [], enable_debug=yes)
if test "$enable_debug" = "yes"; then
   AC_DEFINE(ENABLE_DEBUGGING, 1,
      [Define to compile in dynamic debugging system.])
fi
AC_MSG_RESULT($enable_debug)

AC_MSG_CHECKING(whether to use ISMAcryp code)
AC_ARG_ENABLE(generic-aesicm,
  [AS_HELP_STRING([--enable-generic-aesicm],
		  [compile in changes for ISMAcryp])],
  [], enable_generic_aesicm=no)
if test "$enable_generic_aesicm" = "yes"; then
   AC_DEFINE(GENERIC_AESICM, 1, [Define this to use ISMAcryp code.])
fi
AC_MSG_RESULT($enable_generic_aesicm)

AC_MSG_CHECKING(whether to leverage OpenSSL crypto)
AC_ARG_ENABLE(openssl,
  [AS_HELP_STRING([--enable-openssl],
		  [compile in OpenSSL crypto engine])],
  [], enable_openssl=no)
AC_MSG_RESULT($enable_openssl)
if test "$enable_openssl" = "yes"; then
   LDFLAGS="$LDFLAGS $(pkg-config --libs openssl)";
   CFLAGS="$CFLAGS $(pkg-config --cflags openssl)";

   AC_CHECK_LIB([crypto], [EVP_EncryptInit], [],
             [AC_MSG_FAILURE([can't find openssl >1.0.1 crypto lib])])
   AC_CHECK_LIB([crypto], [EVP_aes_128_ctr], [],
             [AC_MSG_FAILURE([can't find openssl >1.0.1 crypto lib])])
   AC_CHECK_LIB([crypto], [EVP_aes_128_gcm], [],
             [AC_MSG_FAILURE([can't find openssl >1.0.1 crypto lib])])
   AC_DEFINE(OPENSSL, 1, [Define this to use OpenSSL crypto.])
   AES_ICM_OBJS="crypto/cipher/aes_icm_ossl.o crypto/cipher/aes_gcm_ossl.o"
   RNG_OBJS=rand_source_ossl.o
   HMAC_OBJS=crypto/hash/hmac_ossl.o
   USE_OPENSSL=1
   AC_SUBST(USE_OPENSSL)
else
   AES_ICM_OBJS="crypto/cipher/aes_icm.o crypto/cipher/aes.o crypto/cipher/aes_cbc.o"
   AC_MSG_CHECKING(which random device to use)
   if test "$enable_kernel_linux" = "yes"; then
      RNG_OBJS=rand_linux_kernel.o
      AC_MSG_RESULT([Linux kernel builtin])
   else
      RNG_OBJS=rand_source.o
      if test -n "$DEV_URANDOM"; then
         AC_DEFINE_UNQUOTED(DEV_URANDOM, "$DEV_URANDOM",[Path to random device])
         AC_MSG_RESULT([$DEV_URANDOM])
      else
         AC_MSG_RESULT([standard rand() function...])
      fi
   fi
   RNG_EXTRA_OBJS="crypto/rng/prng.o crypto/rng/ctr_prng.o"
   HMAC_OBJS="crypto/hash/hmac.o crypto/hash/sha1.o"
fi
AC_SUBST(AES_ICM_OBJS)                              
AC_SUBST(RNG_OBJS)
AC_SUBST(RNG_EXTRA_OBJS)
AC_SUBST(HMAC_OBJS)

dnl Checking for PCAP
AC_CHECK_LIB([pcap],[pcap_create],
    [PCAP=1
     LIBS="-lpcap $LIBS"
     HAVE_PCAP=1
     AC_DEFINE(HAVE_PCAP, 1, [Define to 1 if you have the `pcap' library (-lpcap)])
     AC_SUBST(HAVE_PCAP)
])

AC_MSG_CHECKING(whether to use syslog for error reporting)
AC_ARG_ENABLE(syslog,
  [AS_HELP_STRING([--enable-syslog], [use syslog for error reporting])],
  [], enable_syslog=no)
if test "$enable_syslog" = "yes"; then
   AC_DEFINE(USE_SYSLOG, 1, [Define to use syslog logging.])
fi
AC_MSG_RESULT($enable_syslog)

AC_MSG_CHECKING(whether to use stdout for error reporting)
AC_ARG_ENABLE(stdout,
  [AS_HELP_STRING([--disable-stdout], [don't use stdout for error reporting])],
  [], enable_stdout=yes)
if test "$enable_stdout" = "yes"; then
   AC_DEFINE(ERR_REPORTING_STDOUT, 1, [Define to use logging to stdout.])
fi
AC_MSG_RESULT($enable_stdout)

AC_MSG_CHECKING(whether to use /dev/console for error reporting)
AC_ARG_ENABLE(console,
  [AS_HELP_STRING([--enable-console], [use /dev/console for error reporting])],
  [], enable_console=no)
if test "$enable_console" = "yes"; then
   AC_DEFINE(USE_ERR_REPORTING_FILE, 1, [Write errors to this file])
   AC_DEFINE(ERR_REPORTING_FILE, "/dev/console", [Report errors to this file.])
fi
AC_MSG_RESULT($enable_console)

AC_MSG_CHECKING(whether to use GDOI key management)
AC_ARG_ENABLE(gdoi,
  [AS_HELP_STRING([--enable-gdoi], [enable GDOI key management])],
  [], enable_gdoi=no)
if test "$enable_gdoi" = "yes"; then
   AC_DEFINE(SRTP_GDOI, 1, [Define to use GDOI.])
   GDOI_OBJS=gdoi/srtp+gdoi.o
   AC_SUBST(GDOI_OBJS)                              
fi
AC_MSG_RESULT($enable_gdoi)

AC_CONFIG_HEADER(crypto/include/config.h:config_in.h)

AC_CHECK_PROG(PKG_CONFIG, pkg-config, yes)
if test "x$PKG_CONFIG" != "x"; then
    HAVE_PKG_CONFIG=1
    AC_CONFIG_FILES([libsrtp.pc])
else
    HAVE_PKG_CONFIG=0
fi
AC_SUBST(HAVE_PKG_CONFIG)
AC_CONFIG_FILES([Makefile crypto/Makefile doc/Makefile])
AC_OUTPUT

# This is needed when building outside the source dir.
AS_MKDIR_P(crypto/ae_xfm)
AS_MKDIR_P(crypto/cipher)
AS_MKDIR_P(crypto/hash)
AS_MKDIR_P(crypto/kernel)
AS_MKDIR_P(crypto/math)
AS_MKDIR_P(crypto/replay)
AS_MKDIR_P(crypto/rng)
AS_MKDIR_P(crypto/test)
AS_MKDIR_P(doc)
AS_MKDIR_P(srtp)
AS_MKDIR_P(tables)
AS_MKDIR_P(test)
