dnl
dnl portaudio V19 configure.in script
dnl
dnl Dominic Mazzoni, Arve Knudsen, Stelios Bounanos
dnl

dnl Require autoconf >= 2.13
AC_PREREQ(2.13)

dnl Init autoconf and make sure configure is being called
dnl from the right directory
AC_INIT([include/portaudio.h])

dnl Define build, build_cpu, build_vendor, build_os
AC_CANONICAL_BUILD
dnl Define host, host_cpu, host_vendor, host_os
AC_CANONICAL_HOST
dnl Define target, target_cpu, target_vendor, target_os
AC_CANONICAL_TARGET

dnl Specify options

AC_ARG_WITH(alsa,
            AS_HELP_STRING([--with-alsa], [Enable support for ALSA @<:@autodetect@:>@]),
            [with_alsa=$withval])

AC_ARG_WITH(jack,
            AS_HELP_STRING([--with-jack], [Enable support for JACK @<:@autodetect@:>@]),
            [with_jack=$withval])

AC_ARG_WITH(oss,
            AS_HELP_STRING([--with-oss], [Enable support for OSS @<:@autodetect@:>@]),
            [with_oss=$withval])

AC_ARG_WITH(asihpi,
            AS_HELP_STRING([--with-asihpi], [Enable support for ASIHPI @<:@autodetect@:>@]),
            [with_asihpi=$withval])

AC_ARG_WITH(winapi,
            AS_HELP_STRING([--with-winapi],
                           [Select Windows API support (@<:@wmme|directx|asio|wasapi|wdmks@:>@@<:@,...@:>@) @<:@wmme@:>@]),
            [with_winapi=$withval], [with_winapi="wmme"])
case "$target_os" in *mingw* | *cygwin*)
     with_wmme=no
     with_directx=no
     with_asio=no
     with_wasapi=no
     with_wdmks=no
     for api in $(echo $with_winapi | sed 's/,/ /g'); do
         case "$api" in
             wmme|directx|asio|wasapi|wdmks)
                 eval with_$api=yes
                 ;;
             *)
                 AC_MSG_ERROR([unknown Windows API \"$api\" (do you need --help?)])
                 ;;
         esac
     done
     ;;
esac

AC_ARG_WITH(asiodir,
            AS_HELP_STRING([--with-asiodir], [ASIO directory @<:@/usr/local/asiosdk2@:>@]),
            with_asiodir=$withval, with_asiodir="/usr/local/asiosdk2")

AC_ARG_WITH(dxdir,
            AS_HELP_STRING([--with-dxdir], [DirectX directory @<:@/usr/local/dx7sdk@:>@]),
            with_dxdir=$withval, with_dxdir="/usr/local/dx7sdk")

debug_output=no
AC_ARG_ENABLE(debug-output,
              AS_HELP_STRING([--enable-debug-output], [Enable debug output @<:@no@:>@]),
              [if test "x$enableval" != "xno" ; then
                  AC_DEFINE(PA_ENABLE_DEBUG_OUTPUT,,[Enable debugging messages])
                  debug_output=yes
               fi
              ])

AC_ARG_ENABLE(cxx,
              AS_HELP_STRING([--enable-cxx], [Enable C++ bindings @<:@no@:>@]),
              enable_cxx=$enableval, enable_cxx="no")

AC_ARG_ENABLE(mac-debug,
              AS_HELP_STRING([--enable-mac-debug], [Enable Mac debug @<:@no@:>@]),
              enable_mac_debug=$enableval, enable_mac_debug="no")

AC_ARG_ENABLE(mac-universal,
              AS_HELP_STRING([--enable-mac-universal], [Build Mac universal binaries @<:@yes@:>@]),
              enable_mac_universal=$enableval, enable_mac_universal="yes")

dnl Continue to accept --host_os for compatibility but do not document
dnl it (the correct way to change host_os is with --host=...).  Moved
dnl here because the empty help string generates a blank line which we
dnl can use to separate PA options from libtool options.
AC_ARG_WITH(host_os, [], host_os=$withval)

dnl Checks for programs.

AC_PROG_CC
dnl ASIO and CXX bindings need a C++ compiler
if [[ "$with_asio" = "yes" ] || [ "$enable_cxx" = "yes" ]] ; then
       AC_PROG_CXX
fi
AC_LIBTOOL_WIN32_DLL
AC_PROG_LIBTOOL
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PATH_PROG(AR, ar, no)
if [[ $AR = "no" ]] ; then
    AC_MSG_ERROR("Could not find ar - needed to create a library")
fi

dnl This must be one of the first tests we do or it will fail...
AC_C_BIGENDIAN

dnl checks for various host APIs and arguments to configure that
dnl turn them on or off

have_alsa=no
if test "x$with_alsa" != "xno"; then
    AC_CHECK_LIB(asound, snd_pcm_open, have_alsa=yes, have_alsa=no)
fi
have_asihpi=no
if test "x$with_asihpi" != "xno"; then
    AC_CHECK_LIB(hpi, HPI_SubSysCreate, have_asihpi=yes, have_asihpi=no, -lm)
fi
have_libossaudio=no
have_oss=no
if test "x$with_oss" != "xno"; then
    AC_CHECK_HEADERS([sys/soundcard.h linux/soundcard.h machine/soundcard.h], [have_oss=yes])
    if test "x$have_oss" = "xyes"; then
        AC_CHECK_LIB(ossaudio, _oss_ioctl, have_libossaudio=yes, have_libossaudio=no)
    fi
fi
have_jack=no
if test "x$with_jack" != "xno"; then
    PKG_CHECK_MODULES(JACK, jack, have_jack=yes, have_jack=no)
fi


dnl sizeof checks: we will need a 16-bit and a 32-bit type

AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)

save_LIBS="${LIBS}"
AC_CHECK_LIB(rt, clock_gettime, [rt_libs=" -lrt"])
LIBS="${LIBS}${rt_libs}"
DLL_LIBS="${DLL_LIBS}${rt_libs}"
AC_CHECK_FUNCS([clock_gettime nanosleep])
LIBS="${save_LIBS}"

dnl LT_RELEASE=19
LT_CURRENT=2
LT_REVISION=0
LT_AGE=0

AC_SUBST(LT_CURRENT)
AC_SUBST(LT_REVISION)
AC_SUBST(LT_AGE)

dnl extra variables
AC_SUBST(OTHER_OBJS)
AC_SUBST(PADLL)
AC_SUBST(SHARED_FLAGS)
AC_SUBST(THREAD_CFLAGS)
AC_SUBST(DLL_LIBS)
AC_SUBST(CXXFLAGS)
AC_SUBST(NASM)
AC_SUBST(NASMOPT)
AC_SUBST(INCLUDES)

dnl -g is optional on darwin
if ( echo "${host_os}" | grep ^darwin >> /dev/null ) &&
      [[ "$enable_mac_universal" = "yes" ] &&
       [ "$enable_mac_debug" != "yes" ]] ; then
   CFLAGS="-O2 -Wall -pedantic -pipe -fPIC -DNDEBUG"
else
   CFLAGS=${CFLAGS:-"-g -O2 -Wall -pedantic -pipe -fPIC"}
fi

if [[ $ac_cv_c_bigendian = "yes" ]] ; then
   CFLAGS="$CFLAGS -DPA_BIG_ENDIAN"
else
   CFLAGS="$CFLAGS -DPA_LITTLE_ENDIAN"
fi

add_objects()
{
    for o in $@; do
        test "${OTHER_OBJS#*${o}*}" = "${OTHER_OBJS}" && OTHER_OBJS="$OTHER_OBJS $o"
    done
}

INCLUDES=portaudio.h

dnl Include directories needed by all implementations
CFLAGS="$CFLAGS -I\$(top_srcdir)/include -I\$(top_srcdir)/src/common"

case "${host_os}" in
  darwin* )
        dnl Mac OS X configuration

        AC_DEFINE(PA_USE_COREAUDIO,1)

        CFLAGS="$CFLAGS -I\$(top_srcdir)/src/os/unix -Werror"
        LIBS="-framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework Carbon"

        if test "x$enable_mac_universal" = "xyes" ; then
           case `xcodebuild -version | sed -n 's/Xcode \(.*\)/\1/p'` in

           [12]*|3.0|3.1)
              dnl In pre-3.2 versions of Xcode, xcodebuild doesn't
              dnl support -sdk, so we can't use that to look for
              dnl SDKs.  However, in those versions of Xcode, the
              dnl SDKs are under /Developer/SDKs, so we can just look
              dnl there.  Also, we assume they had no SDKs later
              dnl than 10.5, as 3.2 was the version that came with
              dnl 10.6, at least if the Wikipedia page for Xcode
              dnl is to be believed.
              if [[ -d /Developer/SDKs/MacOSX10.5.sdk ]] ; then
                 mac_version_min="-mmacosx-version-min=10.3"
                 mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.5.sdk"
              else
                 mac_version_min="-mmacosx-version-min=10.3"
                 mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
              fi
              ;;

           *)
              dnl In 3.2 and later, xcodebuild supports -sdk, and, in
              dnl 4.3 and later, the SDKs aren't under /Developer/SDKs
              dnl as there *is* no /Developer, so we use -sdk to check
              dnl what SDKs are available and to get the full path of
              dnl the SDKs.
              if xcodebuild -version -sdk macosx10.5 Path >/dev/null 2>&1 ; then
                 mac_version_min="-mmacosx-version-min=10.3"
                 mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.5 Path`"
              elif xcodebuild -version -sdk macosx10.6 Path >/dev/null 2>&1 ; then
                 mac_version_min="-mmacosx-version-min=10.4"
                 mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.6 Path`"
              elif xcodebuild -version -sdk macosx10.7 Path >/dev/null 2>&1 ; then
                 mac_version_min="-mmacosx-version-min=10.4"
                 mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.7 Path`"
              else
                 AC_MSG_ERROR([Couldn't find 10.5, 10.6, or 10.7 SDK])
              fi
           esac

           dnl Pick which architectures to build for based on what
           dnl the compiler supports.
           mac_arches=""
           for arch in i386 x86_64 ppc ppc64
           do
              save_CFLAGS="$CFLAGS"
              CFLAGS="$CFLAGS -arch $arch"
              AC_TRY_COMPILE([], [return 0;],
                 [
                    if [[ -z "$mac_arches" ]] ; then
                       mac_arches="-arch $arch"
                    else
                       mac_arches="$mac_arches -arch $arch"
                    fi
                 ])
              CFLAGS="$save_CFLAGS"
           done
        else
           mac_arches=""
           mac_sysroot=""
           mac_version=""
        fi
        SHARED_FLAGS="$LIBS -dynamiclib $mac_arches $mac_sysroot $mac_version_min"
        CFLAGS="-std=c99 $CFLAGS $mac_arches $mac_sysroot $mac_version_min"
        OTHER_OBJS="src/os/unix/pa_unix_hostapis.o src/os/unix/pa_unix_util.o src/hostapi/coreaudio/pa_mac_core.o src/hostapi/coreaudio/pa_mac_core_utilities.o src/hostapi/coreaudio/pa_mac_core_blocking.o src/common/pa_ringbuffer.o"
        PADLL="libportaudio.dylib"
        ;;

  mingw* )
        dnl MingW configuration

        PADLL="portaudio.dll"
        THREAD_CFLAGS="-mthreads"
        SHARED_FLAGS="-shared"
        CFLAGS="$CFLAGS -I\$(top_srcdir)/src/os/win -DPA_USE_WMME=0 -DPA_USE_ASIO=0 -DPA_USE_WDMKS=0 -DPA_USE_DS=0 -DPA_USE_WASAPI=0"

        if [[ "x$with_directx" = "xyes" ]]; then
            DXDIR="$with_dxdir"
            add_objects src/hostapi/dsound/pa_win_ds.o src/hostapi/dsound/pa_win_ds_dynlink.o src/os/win/pa_win_hostapis.o src/os/win/pa_win_util.o src/os/win/pa_win_coinitialize.o src/os/win/pa_win_waveformat.o
            LIBS="${LIBS} -lwinmm -lm -ldsound -lole32"
            DLL_LIBS="${DLL_LIBS} -lwinmm -lm -L$DXDIR/lib -ldsound -lole32"
            #VC98="\"/c/Program Files/Microsoft Visual Studio/VC98/Include\""
            #CFLAGS="$CFLAGS -I$VC98 -DPA_NO_WMME -DPA_NO_ASIO"
            CFLAGS="$CFLAGS -I$DXDIR/include -UPA_USE_DS -DPA_USE_DS=1"
        fi

        if [[ "x$with_asio" = "xyes" ]]; then
            ASIODIR="$with_asiodir"
            add_objects src/hostapi/asio/pa_asio.o src/common/pa_ringbuffer.o src/os/win/pa_win_hostapis.o src/os/win/pa_win_util.o src/os/win/pa_win_coinitialize.o src/hostapi/asio/iasiothiscallresolver.o $ASIODIR/common/asio.o $ASIODIR/host/asiodrivers.o $ASIODIR/host/pc/asiolist.o
            LIBS="${LIBS} -lwinmm -lm -lole32 -luuid"
            DLL_LIBS="${DLL_LIBS} -lwinmm -lm -lole32 -luuid"
            CFLAGS="$CFLAGS -ffast-math -fomit-frame-pointer -I\$(top_srcdir)/src/hostapi/asio -I$ASIODIR/host/pc -I$ASIODIR/common -I$ASIODIR/host -UPA_USE_ASIO -DPA_USE_ASIO=1 -DWINDOWS"

            dnl Setting the windows version flags below resolves a conflict between Interlocked* 
            dnl definitions in mingw winbase.h and Interlocked* hacks in ASIO SDK combase.h 
            dnl combase.h is included by asiodrvr.h
            dnl PortAudio does not actually require Win XP (winver 501) APIs 
            CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0501 -DWINVER=0x0501"
            
            CXXFLAGS="$CFLAGS"
        fi

        if [[ "x$with_wdmks" = "xyes" ]]; then
            DXDIR="$with_dxdir"
            add_objects src/hostapi/wdmks/pa_win_wdmks.o src/common/pa_ringbuffer.o src/os/win/pa_win_hostapis.o src/os/win/pa_win_util.o src/os/win/pa_win_wdmks_util.o src/os/win/pa_win_waveformat.o
            LIBS="${LIBS} -lwinmm -lm -luuid -lsetupapi -lole32"
            DLL_LIBS="${DLL_LIBS} -lwinmm -lm -L$DXDIR/lib -luuid -lsetupapi -lole32"
            #VC98="\"/c/Program Files/Microsoft Visual Studio/VC98/Include\""
            #CFLAGS="$CFLAGS -I$VC98 -DPA_NO_WMME -DPA_NO_ASIO"
            CFLAGS="$CFLAGS -I$DXDIR/include -UPA_USE_WDMKS -DPA_USE_WDMKS=1"
        fi

        if [[ "x$with_wmme" = "xyes" ]]; then
            add_objects src/hostapi/wmme/pa_win_wmme.o src/os/win/pa_win_hostapis.o src/os/win/pa_win_util.o src/os/win/pa_win_waveformat.o
            LIBS="${LIBS} -lwinmm -lm -lole32 -luuid"
            DLL_LIBS="${DLL_LIBS} -lwinmm"
            CFLAGS="$CFLAGS -UPA_USE_WMME -DPA_USE_WMME=1"
        fi

        if [[ "x$with_wasapi" = "xyes" ]]; then
            add_objects src/hostapi/wasapi/pa_win_wasapi.o src/common/pa_ringbuffer.o src/os/win/pa_win_hostapis.o src/os/win/pa_win_util.o src/os/win/pa_win_coinitialize.o src/os/win/pa_win_waveformat.o
            LIBS="${LIBS} -lwinmm -lm -lole32 -luuid"
            DLL_LIBS="${DLL_LIBS} -lwinmm -lole32"
            CFLAGS="$CFLAGS -I\$(top_srcdir)/src/hostapi/wasapi/mingw-include -UPA_USE_WASAPI -DPA_USE_WASAPI=1"
        fi
        ;;

  cygwin* )
        dnl Cygwin configuration

        OTHER_OBJS="src/hostapi/wmme/pa_win_wmme.o src/os/win/pa_win_hostapis.o src/os/win/pa_win_util.o src/os/win/pa_win_waveformat.o"
        CFLAGS="$CFLAGS -I\$(top_srcdir)/src/os/win -DPA_USE_DS=0 -DPA_USE_WDMKS=0 -DPA_USE_ASIO=0 -DPA_USE_WASAPI=0 -DPA_USE_WMME=1"
        LIBS="-lwinmm -lm"
        PADLL="portaudio.dll"
        THREAD_CFLAGS="-mthreads"
        SHARED_FLAGS="-shared"
        DLL_LIBS="${DLL_LIBS} -lwinmm"
        ;;

  irix* )
        dnl SGI IRIX audio library (AL) configuration (Pieter, oct 2-13, 2003).
        dnl The 'dmedia' library is needed to read the Unadjusted System Time (UST).
        dnl
        AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR([IRIX posix thread library not found!]))
        AC_CHECK_LIB(audio,   alOpenPort,     , AC_MSG_ERROR([IRIX audio library not found!]))
        AC_CHECK_LIB(dmedia,  dmGetUST,       , AC_MSG_ERROR([IRIX digital media library not found!]))

        dnl See the '#ifdef PA_USE_SGI' in file pa_unix/pa_unix_hostapis.c
        dnl which selects the appropriate PaXXX_Initialize() function.
        dnl
        AC_DEFINE(PA_USE_SGI,1)

        CFLAGS="$CFLAGS -I\$(top_srcdir)/src/os/unix"

        dnl The _REENTRANT option for pthread safety. Perhaps not necessary but it 'll do no harm.
        dnl
        THREAD_CFLAGS="-D_REENTRANT"
    
        OTHER_OBJS="pa_sgi/pa_sgi.o src/os/unix/pa_unix_hostapis.o src/os/unix/pa_unix_util.o"

        dnl SGI books say -lpthread should be the last of the libs mentioned.
        dnl
        LIBS="-lm -ldmedia -laudio -lpthread"
        PADLL="libportaudio.so"
        SHARED_FLAGS=""
        ;;

  *)
        dnl Unix configuration

        CFLAGS="$CFLAGS -I\$(top_srcdir)/src/os/unix"
        
        AC_CHECK_LIB(pthread, pthread_create,[have_pthread="yes"],
                AC_MSG_ERROR([libpthread not found!]))

        if [[ "$have_alsa" = "yes" ] && [ "$with_alsa" != "no" ]] ; then
           DLL_LIBS="$DLL_LIBS -lasound"
           LIBS="$LIBS -lasound"
           OTHER_OBJS="$OTHER_OBJS src/hostapi/alsa/pa_linux_alsa.o"
           INCLUDES="$INCLUDES pa_linux_alsa.h"
           AC_DEFINE(PA_USE_ALSA,1)
        fi

        if [[ "$have_jack" = "yes" ] && [ "$with_jack" != "no" ]] ; then
           DLL_LIBS="$DLL_LIBS $JACK_LIBS"
           CFLAGS="$CFLAGS $JACK_CFLAGS"
           OTHER_OBJS="$OTHER_OBJS src/hostapi/jack/pa_jack.o src/hostapi/jack/pa_jack_dynload.o src/common/pa_ringbuffer.o"
           INCLUDES="$INCLUDES pa_jack.h"
           AC_DEFINE(PA_USE_JACK,1)
        fi

        if [[ "$with_oss" != "no" ]] ; then
           OTHER_OBJS="$OTHER_OBJS src/hostapi/oss/pa_unix_oss.o"
           if [[ "$have_libossaudio" = "yes" ]] ; then
                   DLL_LIBS="$DLL_LIBS -lossaudio"
                   LIBS="$LIBS -lossaudio"
           fi
           AC_DEFINE(PA_USE_OSS,1)
        fi

        if [[ "$have_asihpi" = "yes" ] && [ "$with_asihpi" != "no" ]] ; then
           LIBS="$LIBS -lhpi"
           DLL_LIBS="$DLL_LIBS -lhpi"
           OTHER_OBJS="$OTHER_OBJS src/hostapi/asihpi/pa_linux_asihpi.o"
           AC_DEFINE(PA_USE_ASIHPI,1)
        fi

        DLL_LIBS="$DLL_LIBS -lm -lpthread"
        LIBS="$LIBS -lm -lpthread"
        PADLL="libportaudio.so"

        ## support sun cc compiler flags
        case "${host_os}" in
           solaris*)
              SHARED_FLAGS="-G"
              THREAD_CFLAGS="-mt"
              ;;
           *)
              SHARED_FLAGS="-fPIC"
              THREAD_CFLAGS="-pthread"
              ;;
        esac

        OTHER_OBJS="$OTHER_OBJS src/os/unix/pa_unix_hostapis.o src/os/unix/pa_unix_util.o"
esac
CFLAGS="$CFLAGS $THREAD_CFLAGS"

test "$enable_shared" != "yes" && SHARED_FLAGS=""

if test "$enable_cxx" = "yes"; then
   AC_CONFIG_SUBDIRS([bindings/cpp])
   ENABLE_CXX_TRUE=""
   ENABLE_CXX_FALSE="#"
else
   ENABLE_CXX_TRUE="#"
   ENABLE_CXX_FALSE=""
fi
AC_SUBST(ENABLE_CXX_TRUE)
AC_SUBST(ENABLE_CXX_FALSE)

if test "x$with_asio" = "xyes"; then
   WITH_ASIO_TRUE=""
   WITH_ASIO_FALSE="@ #"
else
   WITH_ASIO_TRUE="@ #"
   WITH_ASIO_FALSE=""
fi
AC_SUBST(WITH_ASIO_TRUE)
AC_SUBST(WITH_ASIO_FALSE)

AC_OUTPUT([Makefile portaudio-2.0.pc])

AC_MSG_RESULT([
Configuration summary:

  Target ...................... $target
  C++ bindings ................ $enable_cxx
  Debug output ................ $debug_output])

case "$target_os" in *linux*)
    AC_MSG_RESULT([
  ALSA ........................ $have_alsa
  ASIHPI ...................... $have_asihpi])
    ;;
esac
case "$target_os" in
    *mingw* | *cygwin*)
        test "x$with_directx" = "xyes" && with_directx="$with_directx (${with_dxdir})"
        test "x$with_wdmks" = "xyes" && with_wdmks="$with_wdmks (${with_dxdir})"
        test "x$with_asio" = "xyes" && with_asio="$with_asio (${with_asiodir})"
        test "x$with_wasapi" = "xyes"
        AC_MSG_RESULT([
  WMME ........................ $with_wmme
  DSound ...................... $with_directx
  ASIO ........................ $with_asio
  WASAPI ...................... $with_wasapi
  WDMKS ....................... $with_wdmks
])
        ;;
    *darwin*)
        AC_MSG_RESULT([
  Mac debug flags ............. $enable_mac_debug
])
        ;;
     *)
	AC_MSG_RESULT([
  OSS ......................... $have_oss
  JACK ........................ $have_jack
])
        ;;
esac
