AC_INIT(pjproject,1.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_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
    *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
  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)
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 UIKit -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 UIKit -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 Foundation -framework AppKit -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 # SDL alt prefix
AC_ARG_WITH(sdl,
    AC_HELP_STRING([--with-sdl=DIR],
		   [Specify alternate libSDL prefix]),
    [],
    [with_sdl=no]
    )

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
	      ],
	      [
		  SDL_CONFIG="sdl-config"
		  if test "x$with_sdl" != "xno" -a "x$with_sdl" != "x"; then
			SDL_CONFIG=$with_sdl/bin/sdl-config
			AC_MSG_RESULT([Using SDL prefix... $with_sdl])
		  fi
	      
		  AC_MSG_CHECKING([SDL availability..])
		  if (sh -c "$SDL_CONFIG --version" | grep 1.3) 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
	      ])


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)

		dnl # libz, needed by newer ffmpeg
		AC_CHECK_LIB(z, deflate)
		AC_CHECK_LIB(x264, x264_free)

		dnl # libbz2, needed by matroskadec.o in ffmpeg 0.9 in mac os
		AC_CHECK_LIB(bz2, BZ2_bzDecompressInit)

		FFMPEG_PREFIX=""
    		if test "x$with_ffmpeg" != "xno" -a "x$with_ffmpeg" != "x"; then
			FFMPEG_PREFIX=$with_ffmpeg
			AC_MSG_RESULT([Using ffmpeg prefix... $FFMPEG_PREFIX])
			LIBS="-L$FFMPEG_PREFIX/lib $LIBS"
			LDFLAGS="-L$FFMPEG_PREFIX/lib $LDFLAGS"
			CFLAGS="-I$FFMPEG_PREFIX/include $CFLAGS"
		fi

		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(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(avcodec,
			     avcodec_init,
			     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVCODEC=1"
			      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -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(avutil,
			     av_malloc,
			     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVUTIL=1"
			      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lavutil"
			     ]
			     )
		AC_CHECK_LIB(avcore,
			     avcore_version,
			     [ac_ffmpeg_cflags="$ac_ffmpeg_cflags -DPJMEDIA_HAS_LIBAVCORE=1"
			      ac_ffmpeg_ldflags="$ac_ffmpeg_ldflags -lavcore"
			     ]
			     )
		LIBS="$LIBS $ac_ffmpeg_ldflags"
	      ]
	      )

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


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 # 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..])
		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 # Include opencore-amrnb support
AC_SUBST(ac_no_opencore_amrnb)
AC_ARG_ENABLE(opencore_amrnb,
	      AC_HELP_STRING([--disable-opencore-amrnb],
			     [Exclude OpenCORE AMR-NB support from the build (default: autodetect)])
	      ,
	      [
		if test "$enable_opencore_amrnb" = "no"; then
		 [ac_no_opencore_amrnb=1]
		 AC_DEFINE(PJMEDIA_HAS_OPENCORE_AMRNB_CODEC,0)
		 AC_MSG_RESULT([Checking if OpenCORE AMR-NB support is disabled... yes])
	        fi
	      ],
	      [
		AC_MSG_RESULT([checking for OpenCORE AMR-NB installations..])
		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
	      ])


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_cross_compile)
if test "$build" = "$host"; then
    ac_cross_compile=
else
    ac_cross_compile=${host_orig}-
fi
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'.
])

