dnl Process this file with autoconf to produce a configure script.
AC_INIT
AC_CONFIG_SRCDIR([loopwave.c])

dnl Detect the canonical build and host environments
AC_CONFIG_AUX_DIR([../build-scripts])
AC_CANONICAL_HOST

dnl Check for tools
AC_PROG_CC

dnl Check for compiler environment
AC_C_CONST

dnl We only care about this for building testnative at the moment, so these
dnl  values shouldn't be considered absolute truth.
dnl  (Haiku, for example, sets none of these.)
ISUNIX="false"
ISWINDOWS="false"
ISMACOSX="false"
ISOS2="false"

dnl Figure out which math library to use
case "$host" in
    *-*-cygwin* | *-*-mingw*)
        ISWINDOWS="true"
        EXE=".exe"
        MATHLIB=""
        SYS_GL_LIBS="-lopengl32"
        ;;
    *-*-haiku*)
        EXE=""
        MATHLIB=""
        SYS_GL_LIBS="-lGL"
        ;;
    *-*-darwin*)
        ISMACOSX="true"
        EXE=""
        MATHLIB=""
        SYS_GL_LIBS="-Wl,-framework,OpenGL"
        ;;
    *-*-aix*)
        ISUNIX="true"
        EXE=""
        if test x$ac_cv_c_compiler_gnu = xyes; then
            CFLAGS="-mthreads"
        fi
        SYS_GL_LIBS=""
        ;;
    *-*-mint*)
        EXE=""
        MATHLIB=""
        AC_PATH_PROG(OSMESA_CONFIG, osmesa-config, no)
        if test "x$OSMESA_CONFIG" = "xyes"; then
            OSMESA_CFLAGS=`$OSMESA_CONFIG --cflags`
            OSMESA_LIBS=`$OSMESA_CONFIG --libs`
            CFLAGS="$CFLAGS $OSMESA_CFLAGS"
            SYS_GL_LIBS="$OSMESA_LIBS"
        else
            SYS_GL_LIBS="-lOSMesa"
        fi
        ;;
    *-*-qnx*)
        EXE=""
        MATHLIB=""
        SYS_GL_LIBS="-lGLES_CM"
        ;;
    *-*-emscripten*)
        dnl This should really be .js, but we need to specify extra flags when compiling to js
        EXE=".bc"
        MATHLIB=""
        SYS_GL_LIBS=""
        ;;
    *-*-riscos*)
        EXE=",e1f"
        MATHLIB=""
        SYS_GL_LIBS=""
        ;;
    *-*-os2*)
        ISOS2="true"
        EXE=".exe"
        MATHLIB=""
        SYS_GL_LIBS=""
        ;;
    *)
        dnl Oh well, call it Unix...
        ISUNIX="true"
        EXE=""
        MATHLIB="-lm"
        dnl Use the new libOpenGL if present.
        AC_CHECK_LIB(OpenGL, glBegin,
            [SYS_GL_LIBS="-lOpenGL"],[SYS_GL_LIBS="-lGL"])
        ;;
esac
AC_SUBST(EXE)
AC_SUBST(MATHLIB)
AC_SUBST(ISMACOSX)
AC_SUBST(ISWINDOWS)
AC_SUBST(ISUNIX)
AC_SUBST(ISOS2)

dnl Check for SDL
SDL_VERSION=2.0.18
AM_PATH_SDL2($SDL_VERSION,
            :,
	    AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!])
)
CFLAGS="$CFLAGS $SDL_CFLAGS"
LIBS="$LIBS -lSDL2_test $SDL_LIBS"

dnl Check for X11 path, needed for OpenGL on some systems
AC_PATH_X
if test x$have_x = xyes; then
    if test x$ac_x_includes = xno || test "x$ac_x_includes" = xNone || test "x$ac_x_includes" = x; then
        :
    else
        CFLAGS="$CFLAGS -I$ac_x_includes"
    fi
    if test x$ac_x_libraries = xno || test "x$ac_x_libraries" = xNone; then
        :
    else
        if test "x$ac_x_libraries" = x; then
            XPATH=""
            XLIB="-lX11"
        else
            XPATH="-L$ac_x_libraries"
            XLIB="-L$ac_x_libraries -lX11"
        fi
    fi
fi

dnl Check for OpenGL
AC_MSG_CHECKING(for OpenGL support)
have_opengl=no
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #include "SDL_opengl.h"
 #ifndef SDL_VIDEO_OPENGL
 #error SDL_VIDEO_OPENGL
 #endif
]],[])], [have_opengl=yes],[])
AC_MSG_RESULT($have_opengl)

dnl Check for OpenGL ES
AC_MSG_CHECKING(for OpenGL ES support)
have_opengles=no
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #include "SDL_opengles.h"
 #ifndef SDL_VIDEO_OPENGL_ES
 #error SDL_VIDEO_OPENGL_ES
 #endif
]],[])] ,[have_opengles=yes],[])
AC_MSG_RESULT($have_opengles)

dnl Check for OpenGL ES2
AC_MSG_CHECKING(for OpenGL ES2 support)
have_opengles2=no
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #include "SDL_opengles2.h"
 #ifndef SDL_VIDEO_OPENGL_ES2
 #error SDL_VIDEO_OPENGL_ES2
 #endif
]],[])], [have_opengles2=yes],[])
AC_MSG_RESULT($have_opengles2)

GLLIB=""
GLESLIB=""
GLES2LIB=""
OPENGLES1_TARGETS="UNUSED"
OPENGLES2_TARGETS="UNUSED"
OPENGL_TARGETS="UNUSED"
if test x$have_opengles = xyes; then
    CFLAGS="$CFLAGS -DHAVE_OPENGLES"
    GLESLIB="$XPATH -lGLESv1_CM"
    OPENGLES1_TARGETS="TARGETS"
fi
if test x$have_opengles2 = xyes; then
    CFLAGS="$CFLAGS -DHAVE_OPENGLES2"
    #GLES2LIB="$XPATH -lGLESv2"
    OPENGLES2_TARGETS="TARGETS"
fi
if test x$have_opengl = xyes; then
    CFLAGS="$CFLAGS -DHAVE_OPENGL"
    GLLIB="$XPATH $SYS_GL_LIBS"
    OPENGL_TARGETS="TARGETS"
fi

AC_MSG_CHECKING(for GCC -Wformat)
have_wformat=no
save_CFLAGS="$CFLAGS"
CFLAGS="$save_CFLAGS -Wformat"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[int x = 0;]],[])],
    [have_wformat=yes], [])
AC_MSG_RESULT($have_wformat)
CFLAGS="$save_CFLAGS"
if test x$have_wformat = xyes; then
    CFLAGS="$CFLAGS -DHAVE_WFORMAT"
fi

AC_MSG_CHECKING(for GCC -Wformat-overflow)
have_wformat_overflow=no
save_CFLAGS="$CFLAGS"
CFLAGS="$save_CFLAGS -Wformat-overflow"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[int x = 0;]],[])],
    [have_wformat_overflow=yes], [])
AC_MSG_RESULT($have_wformat_overflow)
CFLAGS="$save_CFLAGS"
if test x$have_wformat_overflow = xyes; then
    CFLAGS="$CFLAGS -DHAVE_WFORMAT_OVERFLOW"
fi

AC_MSG_CHECKING(for GCC -Wformat-extra-args)
have_wformat_extra_args=no
save_CFLAGS="$CFLAGS"
CFLAGS="$save_CFLAGS -Wformat-extra-args"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[int x = 0;]],[])],
    [have_wformat_extra_args=yes], [])
AC_MSG_RESULT($have_wformat_extra_args)
CFLAGS="$save_CFLAGS"
if test x$have_wformat_extra_args = xyes; then
    CFLAGS="$CFLAGS -DHAVE_WFORMAT_EXTRA_ARGS"
fi

AC_ARG_ENABLE(werror,
[AS_HELP_STRING([--enable-werror], [treat warnings as errors [default=no]])],
              enable_werror=$enableval, enable_werror=no)
if test x$enable_werror = xyes; then
    AC_MSG_CHECKING(for GCC -Werror option)
    have_gcc_werror=no

    save_CFLAGS="$CFLAGS"
    CFLAGS="$save_CFLAGS -Werror"
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[int x = 0;]],[])],
        [have_gcc_werror=yes], [])
    AC_MSG_RESULT($have_gcc_werror)
    CFLAGS="$save_CFLAGS"

    if test x$have_gcc_werror = xyes; then
        CFLAGS="$CFLAGS -Werror"
    fi
fi

case "$host" in
    *-ios-*|*-*-darwin* )
        AC_MSG_CHECKING(for GCC -Wno-error=deprecated-declarations option)
        have_gcc_wno_error_deprecated_declarations=no

        save_CFLAGS="$CFLAGS"
        CFLAGS="$save_CFLAGS -Wno-error=deprecated-declarations"
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        int x = 0;
        ]],[])], [have_gcc_wno_error_deprecated_declarations=yes],[])
        AC_MSG_RESULT($have_gcc_werror)
        CFLAGS="$save_CFLAGS"

        if test x$have_gcc_wno_error_deprecated_declarations = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS -Wno-error=deprecated-declarations"
        fi
    	;;
esac

AC_SUBST(OPENGLES1_TARGETS)
AC_SUBST(OPENGLES2_TARGETS)
AC_SUBST(OPENGL_TARGETS)
AC_SUBST(GLLIB)
AC_SUBST(GLESLIB)
AC_SUBST(GLES2LIB)
AC_SUBST(XLIB)

dnl Check for SDL_ttf
AC_CHECK_LIB(SDL2_ttf, TTF_Init, have_SDL_ttf=yes)
if test x$have_SDL_ttf = xyes; then
    CFLAGS="$CFLAGS -DHAVE_SDL_TTF"
    SDL_TTF_LIB="-lSDL2_ttf"
fi
AC_SUBST(SDL_TTF_LIB)

dnl Really, SDL2_test should be linking against libunwind (if it found
dnl libunwind.h when configured), but SDL2_test is a static library, so
dnl there's no way for it to link against it. We could make SDL2 depend on
dnl it, but we don't want all SDL2 build to suddenly gain an extra dependency,
dnl so just assume that if it's here now, SDL2_test was probably built with it.
PKG_CHECK_MODULES(LIBUNWIND, libunwind, have_libunwind=yes, have_libunwind=no)
if test x$have_libunwind = xyes ; then
   LIBS="$LIBS $LIBUNWIND_LIBS"
fi

dnl Finally create all the generated files
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
