AC_INIT(pjproject,2.x)

host_orig="$host"

AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
AC_CONFIG_HEADER([pjlib/include/pj/compat/os_auto.h
		  pjlib/include/pj/compat/m_auto.h
		  pjmedia/include/pjmedia/config_auto.h
		  pjmedia/include/pjmedia-codec/config_auto.h
		  pjsip/include/pjsip/sip_autoconf.h
		 ])
AC_CONFIG_FILES([build.mak 
		 build/os-auto.mak 
		 build/cc-auto.mak
		 pjlib/build/os-auto.mak 
		 pjlib-util/build/os-auto.mak 
		 pjmedia/build/os-auto.mak
		 pjsip/build/os-auto.mak
		 third_party/build/os-auto.mak
		 third_party/build/portaudio/os-auto.mak 
		 ])


dnl
dnl Setup default CFLAGS
dnl
if test "$CFLAGS" = ""; then
  CFLAGS="-O2"
else
  CFLAGS="$CFLAGS"
fi

CXXFLAGS="$CFLAGS $CXXFLAGS"

dnl #
dnl # Configure tools
dnl #
AC_PROG_CC
AC_PROG_CXX
AC_LANG_C

dnl #
dnl # Setup CROSS_COMPILE variable
dnl #
if test -z "$CROSS_COMPILE"; then 
    CROSS_COMPILE=`echo ${CC} | sed 's/gcc//'`
fi

if test "$AR" = ""; then AR="${CROSS_COMPILE}ar rv"; fi
AC_SUBST(AR)
if test "$LD" = ""; then LD="$CC"; fi
AC_SUBST(LD)
if test "$LDOUT" = ""; then LDOUT="-o "; fi
AC_SUBST(LDOUT)
if test "$RANLIB" = ""; then RANLIB="${CROSS_COMPILE}ranlib"; fi
AC_SUBST(RANLIB)
if test "$OBJEXT" = ""; then OBJEXT='o'; fi
AC_SUBST(OBJEXT)
if test "$LIBEXT" = ""; then LIBEXT='a'; fi
AC_SUBST(LIBEXT)
if test "$LIBEXT2" = ""; then LIBEXT2=""; fi
AC_SUBST(LIBEXT2)
if test "$CC_OUT" = ""; then CC_OUT="-o "; fi
AC_SUBST(CC_OUT)
if test "$CC_INC" = ""; then CC_INC="-I"; fi
AC_SUBST(CC_INC)
if test "$CC_DEF" = ""; then CC_DEF="-D"; fi
AC_SUBST(CC_DEF)
if test "$CC_OPTIMIZE" = ""; then CC_OPTIMIZE="-O2"; fi
AC_SUBST(CC_OPTIMIZE)
if test "$CC_CFLAGS" = ""; then CC_CFLAGS="-Wall"; fi
AC_SUBST(CC_CFLAGS)



AC_SUBST(ac_pjdir)
AC_SUBST(ac_build_mak_vars)

case $host in 
    *mingw* | *cygw* | *win32* | *w32* )
	if pwd -W 2&> /dev/null; then
	   ac_pjdir=`pwd -W`
	else
	   # We're probably cross-compiling mingw on Linux
	   ac_pjdir=`pwd`
	fi
	;;
    *)
	ac_pjdir=`pwd`
	;;
esac

AC_SUBST(ac_shlib_suffix)
case $target in
    *mingw* | *cygw* | *win32* | *w32* )
	ac_shlib_suffix=dll
	;;
    *darwin*)
	ac_shlib_suffix=dylib
	;;
    *)
	ac_shlib_suffix=so
	;;
esac

AC_SUBST(ac_cross_compile)
if test "$build" = "$host"; then
    ac_cross_compile=
else
    ac_cross_compile=${host_orig}-
fi

AC_CHECK_LIB(pthread,pthread_create)
AC_CHECK_LIB(wsock32,puts)
AC_CHECK_LIB(ws2_32,puts)
AC_CHECK_LIB(ole32,puts)
AC_CHECK_LIB(winmm,puts)
AC_CHECK_LIB(socket,puts)
AC_CHECK_LIB(rt,puts)
AC_CHECK_LIB(nsl,puts)
AC_CHECK_LIB(uuid,uuid_generate)
AC_CHECK_LIB(uuid,uuid_generate,[ac_has_uuid_lib=1])

AC_MSG_RESULT([Setting PJ_M_NAME to $target_cpu])
AC_DEFINE_UNQUOTED(PJ_M_NAME,["$target_cpu"])

dnl
dnl Memory alignment detection
dnl
AC_MSG_CHECKING([memory alignment])
case $target in
    sparc64-* | ia64-* | x86_64-* )
	AC_DEFINE(PJ_POOL_ALIGNMENT, 8)
	AC_MSG_RESULT([8 bytes])
	;;
    * )
	AC_DEFINE(PJ_POOL_ALIGNMENT, 4)
	AC_MSG_RESULT([4 bytes (default)])
	;;
esac


dnl
dnl Endianness detection
dnl
AC_C_BIGENDIAN

if test "x$ac_cv_c_bigendian" = "xyes"; then
  CFLAGS="$CFLAGS -DPJ_IS_BIG_ENDIAN=1 -DPJ_IS_LITTLE_ENDIAN=0"
else
  CFLAGS="$CFLAGS -DPJ_IS_BIG_ENDIAN=0 -DPJ_IS_LITTLE_ENDIAN=1"
fi

dnl
dnl Legacy macros
dnl
case $target in
    *android*)
	AC_DEFINE(PJ_ANDROID,1)
	;;
    *mingw* | *cygw* | *win32* | *w32* )
	AC_DEFINE(PJ_WIN32,1)
	AC_DEFINE(PJ_WIN32_WINNT,0x0400)
	AC_DEFINE(WIN32_LEAN_AND_MEAN)
	;;
    *darwin*)
	AC_DEFINE(PJ_DARWINOS,1)
	;;
    *linux*)
	AC_DEFINE(PJ_LINUX,1)
	;;
    *rtems*)
	AC_DEFINE(PJ_RTEMS,1)
	;;
    *sunos* | *solaris* )
	AC_DEFINE(PJ_SUNOS,1)
	;;
    *)
	;;
esac




dnl # --disable-floating-point option
AC_ARG_ENABLE(floating-point,
	      AC_HELP_STRING([--disable-floating-point],
			     [Disable floating point where possible]),
	      [if test "$enable_floating_point" = "no"; then
		AC_DEFINE(PJ_HAS_FLOATING_POINT,0)
		AC_MSG_RESULT([Checking if floating point is disabled... yes])
	       fi],
	      [
		AC_DEFINE(PJ_HAS_FLOATING_POINT,1)
	        AC_MSG_RESULT([Checking if floating point is disabled... no]) 
		AC_CHECK_LIB(m,fmod)
	      ])


AC_CHECK_HEADER(arpa/inet.h,[AC_DEFINE(PJ_HAS_ARPA_INET_H,1)])
AC_CHECK_HEADER(assert.h,[AC_DEFINE(PJ_HAS_ASSERT_H,1)])
AC_CHECK_HEADER(ctype.h,[AC_DEFINE(PJ_HAS_CTYPE_H,1)])

case $target in
    *mingw* | *cygw* | *win32* | *w32* )
	AC_DEFINE(PJ_HAS_ERRNO_H,0)
	;;
    *)
	AC_CHECK_HEADER(errno.h,[AC_DEFINE(PJ_HAS_ERRNO_H,1)])
	;;
esac

AC_CHECK_HEADER(fcntl.h,[AC_DEFINE(PJ_HAS_FCNTL_H,1)])
AC_CHECK_HEADER(linux/socket.h,[AC_DEFINE(PJ_HAS_LINUX_SOCKET_H,1)])
AC_CHECK_HEADER(limits.h,[AC_DEFINE(PJ_HAS_LIMITS_H,1)])
AC_CHECK_HEADER(malloc.h,[AC_DEFINE(PJ_HAS_MALLOC_H,1)])
AC_CHECK_HEADER(netdb.h,[AC_DEFINE(PJ_HAS_NETDB_H,1)])
AC_CHECK_HEADER(netinet/in_systm.h,[AC_DEFINE(PJ_HAS_NETINET_IN_SYSTM_H,1)])
AC_CHECK_HEADER(netinet/in.h,[AC_DEFINE(PJ_HAS_NETINET_IN_H,1)])
AC_CHECK_HEADER(netinet/ip.h,[AC_DEFINE(PJ_HAS_NETINET_IP_H,1)],[],
		 [#if PJ_HAS_SYS_TYPES_H
          	  #	include <sys/types.h>
          	  #endif
		  #if PJ_HAS_NETINET_IN_SYSTM_H
          	  #	include <netinet/in_systm.h>
          	  #endif
		  #if PJ_HAS_NETINET_IN_H
          	  #	include <netinet/in.h>
          	  #endif
          	 ])
AC_CHECK_HEADER(netinet/tcp.h,[AC_DEFINE(PJ_HAS_NETINET_TCP_H,1)])
AC_CHECK_HEADER(ifaddrs.h,
		[AC_CHECK_FUNC(getifaddrs,[AC_DEFINE(PJ_HAS_IFADDRS_H,1)])])
AC_CHECK_HEADER(semaphore.h,[AC_DEFINE(PJ_HAS_SEMAPHORE_H,1)])
AC_CHECK_HEADER(setjmp.h,[AC_DEFINE(PJ_HAS_SETJMP_H,1)])
AC_CHECK_HEADER(stdarg.h,[AC_DEFINE(PJ_HAS_STDARG_H,1)])
AC_CHECK_HEADER(stddef.h,[AC_DEFINE(PJ_HAS_STDDEF_H,1)])
AC_CHECK_HEADER(stdio.h,[AC_DEFINE(PJ_HAS_STDIO_H,1)])
AC_CHECK_HEADER(stdint.h,[AC_DEFINE(PJ_HAS_STDINT_H,1)])
AC_CHECK_HEADER(stdlib.h,[AC_DEFINE(PJ_HAS_STDLIB_H,1)])
AC_CHECK_HEADER(string.h,[AC_DEFINE(PJ_HAS_STRING_H,1)])
AC_CHECK_HEADER(sys/ioctl.h,[AC_DEFINE(PJ_HAS_SYS_IOCTL_H,1)])
AC_CHECK_HEADER(sys/select.h,[AC_DEFINE(PJ_HAS_SYS_SELECT_H,1)])
AC_CHECK_HEADER(sys/socket.h,[AC_DEFINE(PJ_HAS_SYS_SOCKET_H,1)])
AC_CHECK_HEADER(sys/time.h,[AC_DEFINE(PJ_HAS_SYS_TIME_H,1)])
AC_CHECK_HEADER(sys/timeb.h,[AC_DEFINE(PJ_HAS_SYS_TIMEB_H,1)])
AC_CHECK_HEADER(sys/types.h,[AC_DEFINE(PJ_HAS_SYS_TYPES_H,1)])
AC_CHECK_HEADER(sys/filio.h,[AC_DEFINE(PJ_HAS_SYS_FILIO_H,1)])
AC_CHECK_HEADER(sys/sockio.h,[AC_DEFINE(PJ_HAS_SYS_SOCKIO_H,1)])
AC_CHECK_HEADER(sys/utsname.h,[AC_DEFINE(PJ_HAS_SYS_UTSNAME_H,1)])
AC_CHECK_HEADER(time.h,[AC_DEFINE(PJ_HAS_TIME_H,1)])
AC_CHECK_HEADER(unistd.h,[AC_DEFINE(PJ_HAS_UNISTD_H,1)])
AC_CHECK_HEADER(winsock.h,[AC_DEFINE(PJ_HAS_WINSOCK_H,1)])
AC_CHECK_HEADER(winsock2.h,[AC_DEFINE(PJ_HAS_WINSOCK2_H,1)])
AC_CHECK_HEADER(mswsock.h,[AC_DEFINE(PJ_HAS_MSWSOCK_H,1)],[],
		 [#if PJ_HAS_WINSOCK2_H
          	  #	include <winsock2.h>
		  #elif PJ_HAS_WINSOCK_H
          	  #	include <winsock.h>
          	  #endif
          	 ])
AC_CHECK_HEADER(ws2tcpip.h,[AC_DEFINE(PJ_HAS_WS2TCPIP_H,1)])
AC_CHECK_HEADER(uuid/uuid.h,[ac_has_uuid_h=1])
AC_CHECK_HEADER(net/if.h,[AC_DEFINE(PJ_HAS_NET_IF_H,1)],[],
		 [#if PJ_HAS_SYS_TYPES_H
          	  #	include <sys/types.h>
          	  #endif
		  #if PJ_HAS_SYS_SOCKET_H

          	  #	include <sys/socket.h>
          	  #endif
          	 ])
AC_MSG_RESULT([Setting PJ_OS_NAME to $target])
AC_DEFINE_UNQUOTED(PJ_OS_NAME,["$target"])

AC_MSG_RESULT([Setting PJ_HAS_ERRNO_VAR to 1])
AC_DEFINE(PJ_HAS_ERRNO_VAR,1)

AC_MSG_RESULT([Setting PJ_HAS_HIGH_RES_TIMER to 1])
AC_DEFINE(PJ_HAS_HIGH_RES_TIMER,1)

AC_MSG_RESULT([Setting PJ_HAS_MALLOC to 1])
AC_DEFINE(PJ_HAS_MALLOC,1)

AC_MSG_RESULT([Setting PJ_NATIVE_STRING_IS_UNICODE to 0])
AC_DEFINE(PJ_NATIVE_STRING_IS_UNICODE,0)

AC_MSG_RESULT([Setting PJ_ATOMIC_VALUE_TYPE to long])
AC_DEFINE(PJ_ATOMIC_VALUE_TYPE,long)

dnl # Determine if inet_aton() is available
AC_MSG_CHECKING([if inet_aton() is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
				     #include <sys/socket.h>
				     #include <arpa/inet.h>]],
		    		  [inet_aton(0, 0);])],
		  [AC_DEFINE(PJ_SOCK_HAS_INET_ATON,1)
		   AC_MSG_RESULT(yes)],
		  [AC_MSG_RESULT(no)])

dnl # Determine if inet_pton() is available
AC_MSG_CHECKING([if inet_pton() is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
				     #include <sys/socket.h>
				     #include <arpa/inet.h>]],
		    		  [inet_pton(0, 0, 0);])],
		  [AC_DEFINE(PJ_SOCK_HAS_INET_PTON,1)
		   AC_MSG_RESULT(yes)],
		  [AC_MSG_RESULT(no)])

dnl # Determine if inet_ntop() is available
AC_MSG_CHECKING([if inet_ntop() is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
				     #include <sys/socket.h>
				     #include <arpa/inet.h>]],
		    		  [inet_ntop(0, 0, 0, 0);])],
		  [AC_DEFINE(PJ_SOCK_HAS_INET_NTOP,1)
		   AC_MSG_RESULT(yes)],
		  [AC_MSG_RESULT(no)])

dnl # Determine if getaddrinfo() is available
AC_MSG_CHECKING([if getaddrinfo() is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
				     #include <sys/socket.h>
				     #include <netdb.h>]],
		    		  [getaddrinfo(0, 0, 0, 0);])],
		  [AC_DEFINE(PJ_SOCK_HAS_GETADDRINFO,1)
		   AC_MSG_RESULT(yes)],
		  [AC_MSG_RESULT(no)])

dnl # Determine if sockaddr_in has sin_len member
AC_MSG_CHECKING([if sockaddr_in has sin_len member])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
				     #include <sys/socket.h>
		    		     #include <netinet/in.h>
		    		     #include <arpa/inet.h>]],
		    		  [struct sockaddr_in a; a.sin_len=0;])],
		  [AC_DEFINE(PJ_SOCKADDR_HAS_LEN,1)
		   AC_MSG_RESULT(yes)],
		  AC_MSG_RESULT(no))

dnl # Determine if socklen_t is available
AC_MSG_CHECKING([if socklen_t is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
                                     #include <sys/socket.h>]],
		    		   [socklen_t xxx = 0;])],
		  [AC_DEFINE(PJ_HAS_SOCKLEN_T,1)
		   AC_MSG_RESULT(yes)],
		  AC_MSG_RESULT(no))

dnl # Determine if SO_ERROR is available
AC_MSG_CHECKING([if SO_ERROR is available])
case $target in
    *mingw* | *cygw* | *win32* | *w32* )
	AC_DEFINE(PJ_HAS_SO_ERROR,1)
	AC_MSG_RESULT(yes)
	;;
    *)
	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
					     #include <sys/socket.h>
					     #include <netinet/in.h>
					     #include <arpa/inet.h>]],
					  [int i=SO_ERROR;])],
			  [AC_DEFINE(PJ_HAS_SO_ERROR,1)
			   AC_MSG_RESULT(yes)],
			  AC_MSG_RESULT(no))
	;;
esac


dnl # Determine if RW-mutex is available
AC_MSG_CHECKING([if pthread_rwlock_t is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
		    		   [pthread_rwlock_t *x;])],
		  [AC_DEFINE(PJ_EMULATE_RWMUTEX,0)
		   ac_rwmutex="yes"
  		   AC_MSG_RESULT(yes)],
		  [AC_DEFINE(PJ_EMULATE_RWMUTEX,1)
		   ac_rwmutex="no"
		   AC_MSG_RESULT(no)])

dnl # If rwmutex is not detected, check again but this time
dnl # with _POSIX_READER_WRITER_LOCKS defined (newlib needs this)
if test "$ac_rwmutex" = "no"; then
    AC_MSG_CHECKING([if pthread_rwlock_t is available with _POSIX_READER_WRITER_LOCKS])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#define _POSIX_READER_WRITER_LOCKS
					 #include <pthread.h>]],
				       [pthread_rwlock_t *x;])],
		      [AC_DEFINE(PJ_EMULATE_RWMUTEX,0)
		       CFLAGS="$CFLAGS -D_POSIX_THREADS -D_POSIX_READER_WRITER_LOCKS"
		       AC_MSG_RESULT(yes)],
		      [AC_DEFINE(PJ_EMULATE_RWMUTEX,1)
		       AC_MSG_RESULT(no)])
fi

dnl # Do we have pthread_mutexattr_settype()?
AC_MSG_CHECKING([if pthread_mutexattr_settype() is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
		    		   [pthread_mutexattr_settype(0,PTHREAD_MUTEX_FAST_NP);])],
		  [AC_DEFINE(PJ_HAS_PTHREAD_MUTEXATTR_SETTYPE,1)
  		   AC_MSG_RESULT(yes)],
		  [AC_MSG_RESULT(no)])

dnl # Does pthread_mutexattr_t has "recursive" member?
AC_MSG_CHECKING([if pthread_mutexattr_t has recursive member])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
		    		   [[pthread_mutexattr_t attr;
				     attr.recursive=1;]])],
		  [AC_DEFINE(PJ_PTHREAD_MUTEXATTR_T_HAS_RECURSIVE,1)
  		   AC_MSG_RESULT(yes)],
		  [AC_MSG_RESULT(no)])

dnl ######################
dnl # ioqueue selection
dnl # 
AC_SUBST(ac_os_objs)
AC_MSG_CHECKING([ioqueue backend])
AC_ARG_ENABLE(epoll,
	      AC_HELP_STRING([--enable-epoll],
			     [Use /dev/epoll ioqueue on Linux (experimental)]),
	      [
		ac_os_objs=ioqueue_epoll.o
		AC_MSG_RESULT([/dev/epoll])
	      ],
	      [
		ac_os_objs=ioqueue_select.o
	        AC_MSG_RESULT([select()]) 
	      ])


dnl ######################
dnl # OS specific files
dnl #
case $target in
  *mingw* | *cygw* | *win32* | *w32* )
	ac_os_objs="$ac_os_objs file_access_win32.o file_io_win32.o os_core_win32.o os_error_win32.o os_time_win32.o os_timestamp_win32.o guid_win32.o"
	;;
  *)
	ac_os_objs="$ac_os_objs file_access_unistd.o file_io_ansi.o os_core_unix.o os_error_unix.o os_time_unix.o os_timestamp_posix.o"
	case $target in
	  arm-apple-darwin*)
		ac_os_objs="$ac_os_objs os_info_iphone.o"
		;;
	esac
	# UUID
	if test "$ac_has_uuid_lib" = "1" -a "$ac_has_uuid_h" = "1"; then
		ac_os_objs="$ac_os_objs guid_uuid.o"
	else
		ac_os_objs="$ac_os_objs guid_simple.o"
	fi
	;;
esac

case $target in
  *darwin*)
	ac_os_objs="$ac_os_objs os_core_darwin.o"
	;;
esac

dnl ##########################################
dnl #
dnl # PJMEDIA
dnl #

dnl # Use external Speex installation
AC_SUBST(ac_external_speex,0)
AC_ARG_WITH(external-speex,
    AC_HELP_STRING([--with-external-speex],
		   [Use external Speex development files, not the one in "third_party" directory. When this option is set, make sure that Speex is accessible to use (hint: use CFLAGS and LDFLAGS env var to set the include/lib paths)]),
    [
	if test "x$with_external_speex" != "xno"; then
		# Test Speex installation
		AC_MSG_CHECKING([if external Speex devkit is installed])
		AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <speex/speex.h>
						     #include <speex/speex_echo.h>
						     ]],
						  [speex_echo_state_init(0, 0); speex_encoder_init(0); ])],
				  [AC_MSG_RESULT(yes!!)
				   AC_DEFINE(PJMEDIA_EXTERNAL_SPEEX_CODEC, 1)
				   ac_external_speex="1"
				   ],
				  [AC_MSG_ERROR([Unable to use external Speex library. If Speex development files are not available in the default locations, use CFLAGS and LDFLAGS env var to set the include/lib paths])])
	fi
    ]
    )

dnl # Use external GSM codec library installation
AC_SUBST(ac_external_gsm,0)
AC_ARG_WITH(external-gsm,
    AC_HELP_STRING([--with-external-gsm],
		   [Use external GSM codec library, not the one in "third_party" directory. When this option is set, make sure that the GSM include/lib files are accessible to use (hint: use CFLAGS and LDFLAGS env var to set the include/lib paths)]),
    [
	if test "x$with_external_gsm" != "xno"; then
                # Test GSM library installation
                AC_MSG_CHECKING([if external GSM devkit is installed as gsm/gsm.h])
                AC_COMPILE_IFELSE(
                    [AC_LANG_PROGRAM([[#include <gsm/gsm.h> ]], [gsm_create(); ]) ],
                    [AC_MSG_RESULT(yes!!)
                     AC_DEFINE(PJMEDIA_EXTERNAL_GSM_CODEC, 1)
                     AC_DEFINE(PJMEDIA_EXTERNAL_GSM_GSM_H, 1)
                     ac_external_gsm="1"
                    ],
                    [
                     AC_MSG_RESULT(no)
                     AC_MSG_CHECKING([if external GSM devkit is installed as gsm.h])
                     AC_COMPILE_IFELSE(
                        [AC_LANG_PROGRAM([[#include <gsm.h> ]], [gsm_create(); ]) ],
                        [AC_MSG_RESULT(yes!!)
                         AC_DEFINE(PJMEDIA_EXTERNAL_GSM_CODEC, 1)
                         AC_DEFINE(PJMEDIA_EXTERNAL_GSM_H, 1)
                         ac_external_gsm="1"
                        ],
                        [AC_MSG_ERROR([Unable to use external GSM library. If GSM development files are not available in the default locations, use CFLAGS and LDFLAGS env var to set the include/lib paths])
                        ]
                     )
                    ]
                )
	fi
    ]
    )



dnl # Sound device backend selection
AC_SUBST(ac_pjmedia_snd)
AC_ARG_ENABLE(sound,
	      AC_HELP_STRING([--disable-sound],
			     [Exclude sound (i.e. use null sound)]),
	      [if test "$enable_sound" = "no"; then
		[ac_pjmedia_snd=null]
		AC_MSG_RESULT([Checking if sound is disabled... yes])
	       fi]
	      )

dnl # Use external PortAudio installation
AC_SUBST(ac_external_pa,0)
AC_ARG_WITH(external-pa,
    AC_HELP_STRING([--with-external-pa],
		   [Use external PortAudio development files, not the one in "third_party" directory. When this option is set, make sure that PortAudio is accessible to use (hint: use CFLAGS and LDFLAGS env var to set the include/lib paths)]),
    [
	if test "x$with_external_pa" != "xno"; then
		# Test PortAudio installation
		AC_MSG_CHECKING([if external PortAudio devkit is installed])
		AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <portaudio.h>
						     ]],
						  [Pa_Initialize();])],
				  [AC_MSG_RESULT(yes!!)
				   ac_external_pa="1"
				   ],
				  [AC_MSG_ERROR([Unable to use PortAudio. If PortAudio development files are not available in the default locations, use CFLAGS and LDFLAGS env var to set the include/lib paths])])
	fi
    ]
    )

AC_SUBST(ac_pa_cflags)
AC_CHECK_HEADER(sys/soundcard.h,
	 	[ac_pa_cflags="$ac_pa_cflags -DHAVE_SYS_SOUNDCARD_H"])
AC_CHECK_HEADER(linux/soundcard.h,
	 	[ac_pa_cflags="$ac_pa_cflags -DHAVE_LINUX_SOUNDCARD_H"])
AC_CHECK_HEADER(machine/soundcard.h,
	 	[ac_pa_cflags="$ac_pa_cflags -DHAVE_MACHINE_SOUNDCARD_H"])

if test "x$ac_cv_c_bigendian" = "xyes"; then
  ac_pa_cflags="$ac_pa_cflags -DPA_BIG_ENDIAN"
else
  ac_pa_cflags="$ac_pa_cflags -DPA_LITTLE_ENDIAN"
fi

if test "$enable_sound" = "no"; then
  true;
else
 case $target in
  *android*)
	LIBS="$LIBS -lOpenSLES"
	AC_MSG_RESULT([Checking sound device backend... OpenSL ES])
	;;
  arm-apple-darwin*)
	LIBS="$LIBS -framework CoreAudio -framework CoreFoundation -framework AudioToolbox -framework CFNetwork -framework UIKit"
	AC_MSG_RESULT([Checking sound device backend... AudioUnit])
	;;
  *darwin*)
	LIBS="$LIBS -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox"
	if test "`uname -r`" = "6.8"; then
		#ac_pa_cflags="$ac_pa_cflags -DPA_OLD_CORE_AUDIO -DMOSX_USE_NON_ATOMIC_FLAG_BITS"
		#AC_MSG_RESULT([Setting additional PortAudio CFLAGS.. -DPA_OLD_CORE_AUDIO -DMOSX_USE_NON_ATOMIC_FLAG_BITS])
		ac_pjmedia_snd=pa_old_darwinos
		AC_MSG_RESULT([Checking sound device backend... old coreaudio])
	else
		ac_pjmedia_snd=pa_darwinos
		AC_MSG_RESULT([Checking sound device backend... coreaudio])
	fi
	;;
  *cygwin* | *mingw*)
	ac_pjmedia_snd=pa_win32
	AC_MSG_RESULT([Checking sound device backend... win32 sound])
	;;
  *rtems*)
	ac_pjmedia_snd=null
	AC_MSG_RESULT([Checking sound device backend... null sound])
	;;
  *)
	dnl # Check if ALSA is available
	ac_pjmedia_snd=pa_unix
	AC_CHECK_HEADER(alsa/version.h,
			[AC_SUBST(ac_pa_use_alsa,1)
			 LIBS="$LIBS -lasound"
			],
		        [AC_SUBST(ac_pa_use_alsa,0)])
	AC_MSG_RESULT([Checking sound device backend... unix])

	dnl # Check if OSS is disabled
	AC_SUBST(ac_pa_use_oss,1)
	AC_ARG_ENABLE(oss,
		      AC_HELP_STRING([--disable-oss],
				     [Disable OSS audio (default: not disabled)]),
		      [
			if test "$enable_oss" = "no"; then
			 [ac_pa_use_oss=0]
			 AC_MSG_RESULT([Checking if OSS audio is disabled... yes])
			fi
		      ])
	;;
 esac
fi

AC_SUBST(ac_pjmedia_video)

dnl # --disable-video option
AC_ARG_ENABLE(video,
	      AC_HELP_STRING([--disable-video],
	      		     [Disable video feature]),
	      [if test "$enable_video" = "no"; then
	        #AC_DEFINE(PJMEDIA_HAS_VIDEO,0)
                AC_MSG_RESULT([Video is disabled]) 
                enable_sdl="no"
                enable_ffmpeg="no"
		enable_v4l2="no"
               fi],
	      [])

case $target in
 *android*)
	LIBS="$LIBS -llog -lgcc"
	;;
 arm-apple-darwin*)
 	LIBS="$LIBS -framework UIKit"
	;;
 *darwin*)
 	LIBS="$LIBS -framework Foundation -framework AppKit"
	;;
esac

if test "$enable_video" = "no"; then
  true;
else
 case $target in
  arm-apple-darwin*)
	ac_pjmedia_video=iphone_os
	AC_SUBST(ac_pjmedia_video_has_ios)
	AC_SUBST(ac_ios_cflags)
	SAVED_LIBS="$LIBS"
	LIBS="-framework AVFoundation -framework CoreGraphics -framework QuartzCore -framework CoreVideo -framework CoreMedia"
	AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [])],[ac_pjmedia_video_has_ios=yes],[ac_pjmedia_video_has_ios=no])
	LIBS="$SAVED_LIBS"
	if test "$ac_pjmedia_video_has_ios" = "yes"; then
	  ac_ios_cflags="-DPJMEDIA_VIDEO_DEV_HAS_IOS=1"
	  LIBS="$LIBS -framework AVFoundation -framework CoreGraphics -framework QuartzCore -framework CoreVideo -framework CoreMedia"
	  AC_MSG_RESULT([Checking if AVFoundation framework is available... yes])
	else
	  AC_MSG_RESULT([Checking if AVFoundation framework is available... no])
	fi
	;;
  *darwin*)
	ac_pjmedia_video=mac_os
	AC_SUBST(ac_pjmedia_video_has_qt)
	AC_SUBST(ac_qt_cflags)
	SAVED_LIBS="$LIBS"
	LIBS="-framework QTKit"
	AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [])],[ac_pjmedia_video_has_qt=yes],[ac_pjmedia_video_has_qt=no])
	LIBS="$SAVED_LIBS"
	if test "$ac_pjmedia_video_has_qt" = "yes"; then
	  ac_qt_cflags="-DPJMEDIA_VIDEO_DEV_HAS_QT=1"
	  LIBS="$LIBS -framework QTKit -framework QuartzCore -framework OpenGL"
	  AC_MSG_RESULT([Checking if QTKit framework is available... yes])
	else
	  AC_MSG_RESULT([Checking if QTKit framework is available... no])
	fi
	;;
 esac
fi

AC_ARG_ENABLE(ext_sound,
	      AC_HELP_STRING([--enable-ext-sound],
			     [PJMEDIA will not provide any sound device backend]),
	      [if test "$enable_ext_sound" = "yes"; then
		[ac_pjmedia_snd=external]
		AC_MSG_RESULT([Checking if external sound is set... yes])
	       fi]
	      )

dnl # Include resampling small filter
AC_SUBST(ac_no_small_filter)
AC_ARG_ENABLE(small-filter,
	      AC_HELP_STRING([--disable-small-filter],
			     [Exclude small filter in resampling]),
	      [if test "$enable_small_filter" = "no"; then
		[ac_no_small_filter='-DPJMEDIA_HAS_SMALL_FILTER=0']
		AC_MSG_RESULT([Checking if small filter is disabled... yes])
	       fi],
	      AC_MSG_RESULT([Checking if small filter is disabled... no]))

dnl # Include resampling large filter
AC_SUBST(ac_no_large_filter)
AC_ARG_ENABLE(large-filter,
	      AC_HELP_STRING([--disable-large-filter],
			     [Exclude large filter in resampling]),
	      [if test "$enable_large_filter" = "no"; then
		[ac_no_large_filter='-DPJMEDIA_HAS_LARGE_FILTER=0']
		AC_MSG_RESULT([Checking if large filter is disabled... yes])
	       fi],
	      AC_MSG_RESULT([Checking if large filter is disabled... no]))

dnl # Include Speex AEC
AC_SUBST(ac_no_speex_aec)
AC_ARG_ENABLE(speex-aec,
	      AC_HELP_STRING([--disable-speex-aec],
			     [Exclude Speex Acoustic Echo Canceller/AEC]),
	      [if test "$enable_speex_aec" = "no"; then
		[ac_no_speex_aec='-DPJMEDIA_HAS_SPEEX_AEC=0']
		AC_MSG_RESULT([Checking if Speex AEC is disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if Speex AEC is disabled...no]))

dnl # Include G711 codec
AC_SUBST(ac_no_g711_codec)
AC_ARG_ENABLE(g711-codec,
	      AC_HELP_STRING([--disable-g711-codec],
			     [Exclude G.711 codecs from the build]),
	      [if test "$enable_g711_codec" = "no"; then
		[ac_no_g711_codec=1]
		AC_DEFINE(PJMEDIA_HAS_G711_CODEC,0)
		AC_MSG_RESULT([Checking if G.711 codec is disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if G.711 codec is disabled...no]))


dnl # Include L16 codec
AC_SUBST(ac_no_l16_codec)
AC_ARG_ENABLE(l16-codec,
	      AC_HELP_STRING([--disable-l16-codec],
			     [Exclude Linear/L16 codec family from the build]),
	      [if test "$enable_l16_codec" = "no"; then
		[ac_no_l16_codec=1]
		AC_DEFINE(PJMEDIA_HAS_L16_CODEC,0)
		AC_MSG_RESULT([Checking if L16 codecs are disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if L16 codec is disabled...no]))


dnl # Include GSM codec
AC_SUBST(ac_no_gsm_codec)
AC_ARG_ENABLE(gsm-codec,
	      AC_HELP_STRING([--disable-gsm-codec],
			     [Exclude GSM codec in the build]),
	      [if test "$enable_gsm_codec" = "no"; then
		[ac_no_gsm_codec=1]
		AC_DEFINE(PJMEDIA_HAS_GSM_CODEC,0)
		AC_MSG_RESULT([Checking if GSM codec is disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if GSM codec is disabled...no]))

dnl # Include G.722 codec
AC_SUBST(ac_no_g722_codec)
AC_ARG_ENABLE(g722-codec,
	      AC_HELP_STRING([--disable-g722-codec],
			     [Exclude G.722 codec in the build]),
	      [if test "$enable_g722_codec" = "no"; then
		[ac_no_g722_codec=1]
		AC_DEFINE(PJMEDIA_HAS_G722_CODEC,0)
		AC_MSG_RESULT([Checking if G.722 codec is disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if G.722 codec is disabled...no]))

dnl # Include G722.1 codec
AC_SUBST(ac_no_g7221_codec)
AC_ARG_ENABLE(g7221-codec,
	      AC_HELP_STRING([--disable-g7221-codec],
			     [Exclude G.7221 codec in the build]),
	      [if test "$enable_g7221_codec" = "no"; then
		[ac_no_g7221_codec=1]
		AC_DEFINE(PJMEDIA_HAS_G7221_CODEC,0)
		AC_MSG_RESULT([Checking if G.722.1 codec is disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if G.722.1 codec is disabled...no]))

dnl # Include Speex codec
AC_SUBST(ac_no_speex_codec)
AC_ARG_ENABLE(speex-codec,
	      AC_HELP_STRING([--disable-speex-codec],
			     [Exclude Speex codecs in the build]),
	      [if test "$enable_speex_codec" = "no"; then
		[ac_no_speex_codec=1]
		AC_DEFINE(PJMEDIA_HAS_SPEEX_CODEC,0)
		AC_MSG_RESULT([Checking if Speex codec is disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if Speex codec is disabled...no]))

dnl # Include iLBC codec
AC_SUBST(ac_no_ilbc_codec)
AC_ARG_ENABLE(ilbc-codec,
	      AC_HELP_STRING([--disable-ilbc-codec],
			     [Exclude iLBC codec in the build]),
	      [if test "$enable_ilbc_codec" = "no"; then
		[ac_no_ilbc_codec=1]
		AC_DEFINE(PJMEDIA_HAS_ILBC_CODEC,0)
		AC_MSG_RESULT([Checking if iLBC codec is disabled...yes])
	       fi],
	      AC_MSG_RESULT([Checking if iLBC codec is disabled...no]))

dnl # Include libsamplerate
AC_ARG_ENABLE(libsamplerate,
	      AC_HELP_STRING([--enable-libsamplerate],
			     [Link with libsamplerate when available. Note that PJMEDIA_RESAMPLE_IMP must also be configured]),
	      [ AC_CHECK_LIB(samplerate,src_new) ],
	      AC_MSG_RESULT([Skipping libsamplerate detection])
	     )

dnl # Include libsamplerate
AC_SUBST(ac_resample_dll)
AC_ARG_ENABLE(resample_dll,
	      AC_HELP_STRING([--enable-resample-dll],
			     [Build libresample as shared library]),
	      [if test "$enable_resample_dll" = "yes"; then
		[ac_resample_dll=1]
		AC_MSG_RESULT([Building libresample as shared library... yes])
	       fi],
	      AC_MSG_RESULT([Building libresample as shared library... no])
	      )

dnl # SDL alt prefix
AC_ARG_WITH(sdl,
    AC_HELP_STRING([--with-sdl=DIR],
		   [Specify alternate libSDL prefix]),
    [],
    [with_sdl=no]
    )

dnl # Do not use default SDL installation if we are cross-compiling
if test "x$ac_cross_compile" != "x" -a "x$with_sdl" = "xno"; then
    enable_sdl=no
fi

dnl # SDL
AC_ARG_ENABLE(sdl,
	      AC_HELP_STRING([--disable-sdl],
			     [Disable SDL (default: not disabled)]),
	      [
		if test "$enable_sdl" = "no"; then
		  AC_MSG_RESULT([Checking if SDL is disabled... yes])
		fi
	      ],
	      [
		  if test "x$with_sdl" != "xno" -a "x$with_sdl" != "x"; then
			AC_MSG_RESULT([Using SDL prefix... $with_sdl])
			AC_PATH_PROGS(SDL_CONFIG,sdl2-config sdl-config,,$with_sdl/bin)
                  else
			AC_PATH_PROGS(SDL_CONFIG, sdl2-config sdl-config)
		  fi
		  
		  AC_MSG_CHECKING([SDL availability])
		  if test "x$SDL_CONFIG" = "x"; then
			AC_MSG_RESULT([not found])
		  elif (sh -c "$SDL_CONFIG --version" | grep -e '^1\.3' -e '^2\.') then
			AC_SUBST(ac_sdl_cflags)
			AC_SUBST(ac_sdl_ldflags)
			ac_sdl_cflags=`$SDL_CONFIG --cflags`
			ac_sdl_cflags="-DPJMEDIA_VIDEO_DEV_HAS_SDL=1 $ac_sdl_cflags"
			ac_sdl_ldflags=`$SDL_CONFIG --libs`
			LIBS="$LIBS $ac_sdl_ldflags"
		  else
			AC_MSG_RESULT([Unsupported SDL version])
		  fi
	      ])


AC_ARG_WITH(ffmpeg,
    AC_HELP_STRING([--with-ffmpeg=DIR],
		   [Specify alternate FFMPEG prefix]),
    [],
    [with_ffmpeg=no]
    )

dnl # Do not use default ffmpeg installation if we are cross-compiling
if test "x$ac_cross_compile" != "x" -a "x$with_ffmpeg" = "xno"; then
    enable_ffmpeg=no
fi

dnl # FFMPEG stuffs
AC_ARG_ENABLE(ffmpeg,
	      AC_HELP_STRING([--disable-ffmpeg],
			     [Disable ffmpeg (default: not disabled)]),
	      [
	        AC_SUBST(ac_has_ffmpeg,0)
		if test "$enable_ffmpeg" = "no"; then
			AC_MSG_RESULT([Checking if ffmpeg is disabled... yes])
		fi
	      ],
	      [
		AC_SUBST(ac_ffmpeg_cflags)
		AC_SUBST(ac_ffmpeg_ldflags)

		FFMPEG_PREFIX=""
		AC_SUBST(SAVED_PKG_CONFIG_PATH)
		SAVED_PKG_CONFIG_PATH=$PKG_CONFIG_PATH
    		if test "x$with_ffmpeg" != "xno" -a "x$with_ffmpeg" != "x"; then
			FFMPEG_PREFIX=$with_ffmpeg
			AC_MSG_RESULT([Using ffmpeg prefix... $FFMPEG_PREFIX])
			export PKG_CONFIG_PATH=$FFMPEG_PREFIX/lib/pkgconfig
		fi

		AC_CHECK_PROGS(PKG_CONFIG,pkg-config "python pkgconfig.py",none)

		if test "$PKG_CONFIG" != "none"; then
			AC_MSG_CHECKING([ffmpeg packages])
			av_pkg=""
			if $PKG_CONFIG --exists libdevice; then
				ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVDEVICE=1"
				av_pkg="$av_pkg libdevice"
			fi
			if $PKG_CONFIG --exists libavformat; then
				ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVFORMAT=1"
				av_pkg="$av_pkg libavformat"
			fi
			if $PKG_CONFIG --exists libavcodec; then
				ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVCODEC=1"
				av_pkg="$av_pkg libavcodec"
			fi
			if $PKG_CONFIG --exists libswscale; then
				ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBSWSCALE=1"
				av_pkg="$av_pkg libswscale"
			fi
			if $PKG_CONFIG --exists libavutil; then
				ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVUTIL=1"
				av_pkg="$av_pkg libavutil"
			fi
			if $PKG_CONFIG --exists libavcore; then
				ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVCORE=1"
				av_pkg="$av_pkg libavcore"
			fi
			
			if test "x$av_pkg" == "x"; then
			   AC_MSG_RESULT([none detected (check the prefix)! **])
			else
			   AC_MSG_RESULT([$av_pkg])
			fi
			
			ac_ffmpeg_cflags="$ac_ffmpeg_cflags `$PKG_CONFIG --cflags $av_pkg`"
			ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags `$PKG_CONFIG --libs $av_pkg`"

		else
			dnl #
			dnl # Use hardcoded values to configure ffmpeg
			dnl #
			
			AC_MSG_RESULT([*** Warning: neither pkg-config nor python is available, ffmpeg dependency cannot be calculated. If ffmpeg libraries are not detected, you need to specify the correct CFLAGS and LDFLAGS settings for ffmpeg prior to invoking configure ***])
			
			LIBS="-L$FFMPEG_PREFIX/lib $LIBS"
			LDFLAGS="-L$FFMPEG_PREFIX/lib $LDFLAGS"
			CFLAGS="-I$FFMPEG_PREFIX/include $CFLAGS"
			
			AC_CHECK_LIB(avdevice,
				     avdevice_version,
				     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVDEVICE=1"
				      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lavdevice"
				     ]
				     )
			AC_CHECK_LIB(avutil,
				     av_malloc,
				     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVUTIL=1"
				      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lavutil"
				     ]
				     )
			AC_CHECK_LIB(avcodec,
				     avcodec_init,
				     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVCODEC=1"
				      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lavcodec"
				     ],
				     [],
				     [-lavutil]
				     )
			AC_CHECK_LIB(avformat,
				     av_register_all,
				     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVFORMAT=1"
				      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lavformat"
				     ],
				     [],
				     [-lavcodec -lavutil]
				     )
			AC_CHECK_LIB(swscale,
				     sws_scale,
				     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBSWSCALE=1"
				      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lswscale"
				     ],
				     [],
				     [-lavutil]
				     )
			AC_CHECK_LIB(avcore,
				     avcore_version,
				     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVCORE=1"
				      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lavcore"
				     ]
				     )
			
		fi
		
		LIBS="$LIBS $ac_ffmpeg_ldflags"
		export PKG_CONFIG_PATH=$SAVED_PKG_CONFIG_PATH
	      ]
	      )

dnl # Video for Linux 2
AC_ARG_ENABLE(v4l2,
	      AC_HELP_STRING([--disable-v4l2],
			     [Disable Video4Linux2 (default: not disabled)]),
	      [
		if test "$enable_v4l2" = "no"; then
		  AC_MSG_RESULT([Checking if V4L2 is disabled... yes])
		fi
	      ],
	      [
	        AC_SUBST(ac_v4l2_cflags)
	        AC_SUBST(ac_v4l2_ldflags)
		AC_CHECK_LIB(v4l2,
			     v4l2_open,
			     [ac_v4l2_cflags="-DPJMEDIA_VIDEO_DEV_HAS_V4L2=1"
			      ac_v4l2_ldflags="-lv4l2"
			      LIBS="$LIBS -lv4l2"
			     ]
			     )
	      ])

dnl ########################################################
dnl # Intel IPP support
dnl #
AC_ARG_ENABLE(ipp,
    AC_HELP_STRING([--enable-ipp],
		   [Enable Intel IPP support. Specify the Intel IPP package and samples location using IPPROOT and IPPSAMPLES env var or with --with-ipp and --with-ipp-samples options]),
    [],
    [enable_ipp=no]
    )

AC_ARG_WITH(ipp,
    AC_HELP_STRING([--with-ipp=DIR],
		   [Specify the Intel IPP location]),
    [],
    [with_ipp=no]
    )

AC_ARG_WITH(ipp-samples,
    AC_HELP_STRING([--with-ipp-samples=DIR],
		   [Specify the Intel IPP samples location]),
    [],
    [with_ipp_samples=no]
    )

AC_ARG_WITH(ipp-arch,
    AC_HELP_STRING([--with-ipp-arch=ARCH],
		   [Specify the Intel IPP ARCH suffix, e.g. "64" or "em64t. Default is blank for IA32"]),
    [],
    [with_ipp_arch=no]
    )

if test "x$enable_ipp" != "xno"; then
    dnl # 
    dnl # Verifying Intel IPP path
    dnl #
    AC_MSG_CHECKING([Intel IPP location])

    if test "x$with_ipp" != "xno" -a "x$with_ipp" != "x"; then
	AC_MSG_RESULT([$with_ipp])
	IPPROOT=$with_ipp
    elif test "x$IPPROOT" = "x"; then
	if test -d /opt/intel/ipp; then
	    IPPROOT=`ls -d /opt/intel/ipp/*/* | head -1`
	    AC_MSG_RESULT([autodetected in $IPPROOT])
	fi
    else
	AC_MSG_RESULT([$IPPROOT])
    fi

    if test "x$with_ipp_arch" != "xno"; then
	IPP_SUFFIX=$with_ipp_arch
	AC_MSG_RESULT([IPP arch suffix is set to $IPP_SUFFIX])
    else
	IPP_SUFFIX=""
	AC_MSG_RESULT([IPP arch suffix is set to empty])
    fi

    if test x$IPPROOT = x; then
	AC_MSG_ERROR([the location is neither specified nor can be guessed. Please specify with IPPROOT env var or with --with-ipp option])
    elif test ! -d $IPPROOT; then
	AC_MSG_ERROR([not found])
    elif test ! -d $IPPROOT/include; then
	AC_MSG_ERROR([directory doesn't seem to be valid])
    else
	# IPP directory looks okay.
	# Remove trailing backslash
	IPPROOT=`echo $IPPROOT | sed 's/\/$//'`

	SAVED_CFLAGS="$CFLAGS"
	SAVED_LDFLAGS="$LDFLAGS"
	SAVED_LIBS="$LIBS"

	IPP_CFLAGS="-I$IPPROOT/include"
	IPP_LIBS="-lippsc${IPP_SUFFIX} -lipps${IPP_SUFFIX} -lippcore${IPP_SUFFIX}"

#
	# Some differences between Mac OS X and Linux
	case $target in 
	    *darwin* )
		IPP_LDFLAGS="-L$IPPROOT/Libraries -L$IPPROOT/lib"
		;;
	    *)
	    	# Find out where the libraries live.
		IPP7_ARCH=""
		if test -d $IPPROOT/lib/intel64; then
		   IPP7_ARCH="intel64"
		elif test -d $IPPROOT/lib/ia32; then
		   IPP7_ARCH="ia32"
		elif test -d $IPPROOT/lib/mic; then
		   IPP7_ARCH="mic"
		fi

		if test -z "$IPP7_ARCH"; then
		   # IPP6 (and possibly below)
		   IPP_LDFLAGS="-L$IPPROOT/sharedlib"
		   IPP_LIBS="$IPP_LIBS  -lippsr${IPP_SUFFIX} -lguide"
		else
		   # IPP7
		   if ! test -d $IPPROOT/../compiler; then
			AC_MSG_ERROR([Cannot find $IPPROOT/../compiler directory. Please set IPPROOT variable correctly])
		   fi
		   IPP_CFLAGS="$IPP_CFLAGS"
		   IPP_LDFLAGS="-L$IPPROOT/lib/intel64 -L$IPPROOT/../compiler/lib/$IPP7_ARCH"
		   IPP_LIBS="$IPP_LIBS -liomp5"
		fi
		;;
	esac

	#IPP_LDFLAGS="-L$IPPROOT/sharedlib"
	#Static:
	#IPP_LIBS="-lippscmerged -lippsrmerged -lippsmerged -lippcore"

	CFLAGS="$CFLAGS $IPP_CFLAGS"
	LDFLAGS="$LDFLAGS $IPP_LDFLAGS"
	LIBS="$IPP_LIBS $LIBS"


	AC_MSG_CHECKING([Intel IPP usability])
	AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <ippcore.h>
					   ]],
					   [ippStaticInit();])],
		  [AC_MSG_RESULT(ok)],
		  [AC_MSG_FAILURE([Error: unable to recognize your IPP installation. Make sure the paths and ARCH suffix are set correctly, run with --help for more info])])

	CFLAGS="$SAVED_CFLAGS"
	LDFLAGS="$SAVED_LDFLAGS"
	LIBS="$SAVED_LIBS"
    fi

    dnl # 
    dnl # Verifying Intel IPP samples path
    dnl #
    AC_MSG_CHECKING([Intel IPP samples location])

    if test "x$with_ipp_samples" != "xno" -a "x$with_ipp_samples" != "x"; then
	AC_MSG_RESULT([$with_ipp_samples])
	IPPSAMPLES=$with_ipp_samples
    elif test "x$IPPSAMPLES" = "x"; then
	if test -d /opt/intel/ipp-samples; then
	    IPPSAMPLES=/opt/intel/ipp-samples
	    AC_MSG_RESULT([autodetected in $IPPSAMPLES])
	fi
    else
	AC_MSG_RESULT([$IPPSAMPLES])
    fi

    if test x$IPPSAMPLES = x; then
	AC_MSG_ERROR([the location is neither specified nor can be guessed. Please specify with IPPSAMPLES env var or with --with-ipp-samples option])
    elif test ! -d $IPPSAMPLES; then
	AC_MSG_ERROR([not found])
    elif test ! -d $IPPSAMPLES/speech-codecs; then
	AC_MSG_ERROR([directory doesn't seem to be valid])
    else
	# Remove trailing backslash
	IPPSAMPLES=`echo $IPPSAMPLES | sed 's/\/$//'`
	
	# Guess the libusc.a/libspeech.a build location
	AC_MSG_CHECKING([Intel IPP USC build location])
	if test -d $IPPSAMPLES/speech-codecs/bin; then
	    IPPVER=5 
	    IPPSAMP_DIR=`ls -d $IPPSAMPLES/speech-codecs/bin/*gcc*/lib | head -1`
	elif test -d $IPPSAMPLES/speech-codecs/_bin; then
	    IPPVER=6
	    if test -d $IPPSAMPLES/speech-codecs/_bin/*gcc*; then
		# gcc compiler
	    	IPPSAMP_DIR=`ls -d $IPPSAMPLES/speech-codecs/_bin/*gcc*/lib | head -1`
	    elif test -d $IPPSAMPLES/speech-codecs/_bin/*icc*; then
		# icc compiler
	    	IPPSAMP_DIR=`ls -d $IPPSAMPLES/speech-codecs/_bin/*icc*/lib | head -1`
	    else
		AC_MSG_FAILURE([Unable to find to find built binaries under $IPPSAMPLES/speech-codecs/{bin,_bin}. Have you built the IPP samples?])
	    fi
	else
	    AC_MSG_FAILURE([unable to find $IPPSAMPLES/speech-codecs/bin/*gcc*/lib or $IPPSAMPLES/speech-codecs/_bin/*gcc*/lib directory. Have you built the samples?])
	fi

	# Test the directory
	if test ! -d $IPPSAMP_DIR; then
	    AC_MSG_FAILURE([There's something wrong with this script, directory $IPPSAMP_DIR does not exist])
	    exit 1;
	fi

    	if test "x$IPPVER" = "x5"; then
	    IPPSAMP_LIBS="libusc.a"
	    IPPSAMP_LDLIBS="-lusc"
	elif test "x$IPPVER" = "x6"; then
	    IPPSAMP_LIBS="libspeech.a"
	    IPPSAMP_LDLIBS="-lspeech"
	else
	    AC_MSG_FAILURE([bug in this script: unsupported IPP version])
	fi

	if test ! -f $IPPSAMP_DIR/$IPPSAMP_LIBS; then
	    AC_MSG_FAILURE([$IPPSAMP_LIBS doesn't exist in $IPPSAMP_DIR])
	fi

	AC_MSG_RESULT([$IPPSAMP_DIR])

	SAVED_CFLAGS="$CFLAGS"
	SAVED_LDFLAGS="$LDFLAGS"
	SAVED_LIBS="$LIBS"

	IPPSAMP_INC="-I$IPPSAMPLES/speech-codecs/core/usc/include"
	CFLAGS="$CFLAGS $IPPSAMP_INC"
	LDFLAGS="$LDFLAGS -L$IPPSAMP_DIR"
	LIBS="$IPPSAMP_LDLIBS $LIBS"

	AC_MSG_CHECKING([Intel IPP USC usability])
	AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <usc.h>
					   ]],
					   [extern USC_Fxns USC_G729AFP_Fxns;])],
		  [AC_MSG_RESULT(ok)],
		  [AC_MSG_FAILURE(failed)])

	CFLAGS="$SAVED_CFLAGS"
	LDFLAGS="$IPP_LDFLAGS $SAVED_LDFLAGS"
	LIBS="$IPP_LIBS $SAVED_LIBS"

	IPP_CFLAGS="$IPP_CFLAGS $IPPSAMP_INC"
	IPP_LDFLAGS="$IPP_LDFLAGS -L$IPPSAMP_DIR"
	IPP_LIBS="$IPPSAMP_LDLIBS $IPP_LIBS"
    fi

    CFLAGS="$CFLAGS $IPP_CFLAGS"
    LDFLAGS="$LDFLAGS $IPP_LDFLAGS"
    LIBS="$LIBS $IPP_LIBS"

    ac_build_mak_vars="$ac_build_mak_vars\n\
export IPP_CFLAGS=$IPP_CFLAGS\n\
export IPP_LDFLAGS=$IPP_LDFLAGS\n\
export IPP_LIBS=$IPP_LIBS"
else
    AC_MSG_RESULT([Skipping Intel IPP settings (not wanted)])
fi


dnl ##########################################
dnl #
dnl # PJSIP CONFIG
dnl #

dnl # SSL alt prefix
AC_ARG_WITH(ssl,
    AC_HELP_STRING([--with-ssl=DIR],
		   [Specify alternate libssl prefix]),
    [],
    [with_ssl=no]
    )

dnl # Do not use default SSL installation if we are cross-compiling
if test "x$ac_cross_compile" != "x" -a "x$with_ssl" = "xno"; then
    enable_ssl=no
fi

dnl # Include SSL support
AC_SUBST(ac_no_ssl)
AC_ARG_ENABLE(ssl,
	      AC_HELP_STRING([--disable-ssl],
			     [Exclude SSL support the build (default: autodetect)])
	      ,
	      [
		if test "$enable_ssl" = "no"; then
		 [ac_no_ssl=1]
		 AC_MSG_RESULT([Checking if SSL support is disabled... yes])
	        fi
	      ],
	      [
		AC_MSG_RESULT([checking for OpenSSL installations..])
                if test "x$with_ssl" != "xno" -a "x$with_ssl" != "x"; then
                    CFLAGS="$CFLAGS -I$with_ssl/include"
                    LDFLAGS="$LDFLAGS -L$with_ssl/lib"
                    AC_MSG_RESULT([Using SSL prefix... $with_ssl])
                fi
		AC_SUBST(openssl_h_present)
		AC_SUBST(libssl_present)
		AC_SUBST(libcrypto_present)
		AC_CHECK_HEADER(openssl/ssl.h,[openssl_h_present=1])
		AC_CHECK_LIB(crypto,ERR_load_BIO_strings,[libcrypto_present=1 && LIBS="$LIBS -lcrypto"])
		AC_CHECK_LIB(ssl,SSL_library_init,[libssl_present=1 && LIBS="$LIBS -lssl"])
		if test "x$openssl_h_present" = "x1" -a "x$libssl_present" = "x1" -a "x$libcrypto_present" = "x1"; then
	        	AC_MSG_RESULT([OpenSSL library found, SSL support enabled])
			# PJSIP_HAS_TLS_TRANSPORT setting follows PJ_HAS_SSL_SOCK
			#AC_DEFINE(PJSIP_HAS_TLS_TRANSPORT, 1)
			AC_DEFINE(PJ_HAS_SSL_SOCK, 1)
		else
			AC_MSG_RESULT([** OpenSSL libraries not found, disabling SSL support **])
		fi
	      ])

dnl # Obsolete option --with-opencore-amrnb
AC_ARG_WITH(opencore-amrnb,
    AC_HELP_STRING([--with-opencore-amrnb=DIR],
		   [This option is obsolete and replaced by --with-opencore-amr=DIR]),
    [AC_MSG_ERROR(This option is obsolete and replaced by --with-opencore-amr=DIR)],
    []
    )

dnl # opencore-amr alt prefix
AC_ARG_WITH(opencore-amr,
    AC_HELP_STRING([--with-opencore-amr=DIR],
		   [Specify alternate libopencore-amr prefix]),
    [],
    [with_opencore_amr=no]
    )

dnl # Do not use default opencore-amr installation if we are cross-compiling
if test "x$ac_cross_compile" != "x" -a "x$with_opencore_amr" = "xno"; then
    enable_opencore_amr=no
fi

dnl # vo-amrwbenc alt prefix
AC_ARG_WITH(opencore-amrwbenc,
    AC_HELP_STRING([--with-opencore-amrwbenc=DIR],
		   [Specify alternate libvo-amrwbenc prefix]),
    [],
    [with_opencore_amrwbenc=no]
    )

dnl # Do not use default vo-amrwbenc installation if we are cross-compiling
if test "x$ac_cross_compile" != "x" -a "x$with_opencore_amrwbenc" = "xno"; then
    enable_opencore_amrwbenc=no
fi


dnl # Include opencore-amr support
AC_SUBST(ac_no_opencore_amrnb)
AC_SUBST(ac_no_opencore_amrwb)
AC_ARG_ENABLE(opencore_amr,
	      AC_HELP_STRING([--disable-opencore-amr],
			     [Exclude OpenCORE AMR support from the build (default: autodetect)])
	      ,
	      [
		if test "$enable_opencore_amr" = "no"; then
		 [ac_no_opencore_amrnb=1]
		 [ac_no_opencore_amrwb=1]
		 AC_DEFINE(PJMEDIA_HAS_OPENCORE_AMRNB_CODEC,0)
		 AC_DEFINE(PJMEDIA_HAS_OPENCORE_AMRWB_CODEC,0)
		 AC_MSG_RESULT([Checking if OpenCORE AMR support is disabled... yes])
	        fi
	      ],
	      [
		AC_MSG_RESULT([checking for OpenCORE AMR installations..])
                if test "x$with_opencore_amr" != "xno" -a "x$with_opencore_amr" != "x"; then
                    CFLAGS="$CFLAGS -I$with_opencore_amr/include"
                    LDFLAGS="$LDFLAGS -L$with_opencore_amr/lib"
                    AC_MSG_RESULT([Using OpenCORE AMR prefix... $with_opencore_amr])
                fi
                if test "x$with_opencore_amrwbenc" != "xno" -a "x$with_opencore_amrwbenc" != "x"; then
                    CFLAGS="$CFLAGS -I$with_opencore_amrwbenc/include"
                    LDFLAGS="$LDFLAGS -L$with_opencore_amrwbenc/lib"
                    AC_MSG_RESULT([Using OpenCORE AMRWB-enc prefix... $with_opencore_amrwbenc])
                fi
		AC_SUBST(opencore_amrnb_h_present)
		AC_SUBST(opencore_amrnb_present)
		AC_CHECK_HEADER(opencore-amrnb/interf_enc.h,[opencore_amrnb_h_present=1])
		AC_CHECK_LIB(opencore-amrnb,Encoder_Interface_init,[opencore_amrnb_present=1 && LIBS="$LIBS -lopencore-amrnb"])
		if test "x$opencore_amrnb_h_present" = "x1" -a "x$opencore_amrnb_present" = "x1"; then
	        	AC_MSG_RESULT([OpenCORE AMR-NB library found, AMR-NB support enabled])
	        	AC_DEFINE(PJMEDIA_HAS_OPENCORE_AMRNB_CODEC,1)
		else
			[ac_no_opencore_amrnb=1]
			AC_DEFINE(PJMEDIA_HAS_OPENCORE_AMRNB_CODEC,0)
		fi
		AC_SUBST(opencore_amrwb_enc_h_present)
		AC_SUBST(opencore_amrwb_enc_present)
		AC_SUBST(opencore_amrwb_dec_h_present)
		AC_SUBST(opencore_amrwb_dec_present)
		AC_CHECK_HEADER(vo-amrwbenc/enc_if.h,[opencore_amrwb_enc_h_present=1])
		AC_CHECK_HEADER(opencore-amrwb/dec_if.h,[opencore_amrwb_dec_h_present=1])
		AC_CHECK_LIB(opencore-amrwb,D_IF_init,[opencore_amrwb_dec_present=1 && LIBS="$LIBS -lopencore-amrwb"])
		AC_CHECK_LIB(vo-amrwbenc,E_IF_init,[opencore_amrwb_enc_present=1 && LIBS="$LIBS -lvo-amrwbenc"])
		if test "x$opencore_amrwb_enc_h_present" = "x1" -a "x$opencore_amrwb_dec_h_present" = "x1" -a "x$opencore_amrwb_enc_present" = "x1" -a "x$opencore_amrwb_dec_present" = "x1"; then
	        	AC_MSG_RESULT([OpenCORE AMR-WB library found, AMR-WB support enabled])
	        	AC_DEFINE(PJMEDIA_HAS_OPENCORE_AMRWB_CODEC,1)
		else
			[ac_no_opencore_amrwb=1]
			AC_DEFINE(PJMEDIA_HAS_OPENCORE_AMRWB_CODEC,0)
		fi

	      ])

dnl # SILK prefix
AC_ARG_WITH(silk,
    AC_HELP_STRING([--with-silk=DIR],
		   [Specify alternate SILK prefix]),
    [],
    [with_silk=no]
    )

dnl # Do not use default SILK installation if we are cross-compiling
if test "x$ac_cross_compile" != "x" -a "x$with_silk" = "xno"; then
    enable_silk=no
fi

dnl # Include SILK support
AC_SUBST(ac_no_silk)
AC_ARG_ENABLE(silk,
	      AC_HELP_STRING([--disable-silk],
			     [Exclude SILK support from the build (default: autodetect)])
	      ,
	      [
		if test "$enable_silk" = "no"; then
		 [ac_no_silk=1]
		 AC_DEFINE(PJMEDIA_HAS_SILK_CODEC,0)
		 AC_MSG_RESULT([Checking if SILK support is disabled... yes])
	        fi
	      ],
	      [
		AC_MSG_RESULT([checking for SILK installations..])
                if test "x$with_silk" != "xno" -a "x$with_silk" != "x"; then
                    CFLAGS="$CFLAGS -I$with_silk/interface"
		    CPPFLAGS="$CPPFLAGS -I$with_silk/interface"
                    LDFLAGS="$LDFLAGS -L$with_silk"
                    AC_MSG_RESULT([Using SILK prefix... $with_silk])
                fi                
		AC_SUBST(silk_h_present)
		AC_SUBST(silk_present)
		AC_CHECK_HEADER(SKP_Silk_SDK_API.h,[silk_h_present=1])
		AC_CHECK_LIB(SKP_SILK_SDK,SKP_Silk_SDK_get_version,[silk_present=1 && LIBS="$LIBS -lSKP_SILK_SDK"])
		if test "x$silk_h_present" = "x1" -a "x$silk_present" = "x1"; then
	        	AC_MSG_RESULT([SILK library found, SILK support enabled])
	        	AC_DEFINE(PJMEDIA_HAS_SILK_CODEC,1)
		else
			[ac_no_silk=1]
			AC_DEFINE(PJMEDIA_HAS_SILK_CODEC,0)
		fi
	      ])


dnl ##########################################
dnl #
dnl # MANUAL CONFIG
dnl #


dnl # Determine if select() requires nfds to be filled up with
dnl # correct value (max_fd+1). If zero, nfds will be filled up with
dnl # PJ_FD_SETSIZE
AC_MSG_CHECKING([if select() needs correct nfds])
case $target in
  *rtems*) AC_DEFINE(PJ_SELECT_NEEDS_NFDS,1)
	   AC_MSG_RESULT(yes)
	;;
  *) AC_DEFINE(PJ_SELECT_NEEDS_NFDS,0)
     AC_MSG_RESULT([no (default)])
     AC_MSG_RESULT([** Decided that select() doesn't need correct nfds (please check)])
	;;
esac

dnl # Determine if pj_thread_create() should enforce thread stack size when
dnl # creating thread. Default is zero, to allow OS to allocate appropriate
dnl # thread's stack size.
AC_MSG_CHECKING([if pj_thread_create() should enforce stack size])
case $target in
  *rtems*) AC_DEFINE(PJ_THREAD_SET_STACK_SIZE,1)
	   AC_MSG_RESULT(yes)
	;;
  *) AC_DEFINE(PJ_THREAD_SET_STACK_SIZE,0)
     AC_MSG_RESULT([no (default)])
	;;
esac

dnl # Determine if pj_thread_create() should allocate thread's stack from
dnl # the pool. Default is zero, to let OS allocate thread's stack.
AC_MSG_CHECKING([if pj_thread_create() should allocate stack])
case $target in
  *rtems*) AC_DEFINE(PJ_THREAD_ALLOCATE_STACK,1)
	   AC_MSG_RESULT(yes)
	;;
  *) AC_DEFINE(PJ_THREAD_ALLOCATE_STACK,0)
     AC_MSG_RESULT([no (default)])
	;;
esac

dnl # This value specifies the value set in errno by the OS when a non-blocking
dnl # socket recv() can not return immediate data.
case $target in
  *mingw* | *cygw* | *win32* | *w32* )
	AC_DEFINE(PJ_BLOCKING_ERROR_VAL,WSAEWOULDBLOCK)
	;;
  *) AC_DEFINE(PJ_BLOCKING_ERROR_VAL,EAGAIN)
     AC_MSG_RESULT([** Setting non-blocking recv() retval to EAGAIN (please check)])
	;;
esac

dnl # This value specifies the value set in errno by the OS when a non-blocking
dnl # socket connect() can not get connected immediately.
case $target in
  *mingw* | *cygw* | *win32* | *w32* )
	AC_DEFINE(PJ_BLOCKING_CONNECT_ERROR_VAL,WSAEWOULDBLOCK)
	;;
  *) AC_DEFINE(PJ_BLOCKING_CONNECT_ERROR_VAL,EINPROGRESS)
     AC_MSG_RESULT([** Setting non-blocking connect() retval to EINPROGRESS (please check)])
	;;
esac


AC_SUBST(target)
AC_SUBST(ac_linux_poll,select)
AC_SUBST(ac_host,unix)
AC_SUBST(ac_main_obj)
case $target in
  *rtems*)
	ac_main_obj=main_rtems.o
	;;
  *)
	ac_main_obj=main.o
	;;
esac
AC_SUBST(CC)

ac_build_mak_vars=`echo $ac_build_mak_vars | sed 's/\\\\n/\n/g'`
AC_OUTPUT()


AC_MSG_RESULT([

Configurations for current target have been written to 'build.mak', and 'os-auto.mak' in various build directories, and pjlib/include/pj/compat/os_auto.h.

Further customizations can be put in:
  - 'user.mak'
  - 'pjlib/include/pj/config_site.h'

The next step now is to run 'make dep' and 'make'.
])

