dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.63])
AC_INIT
AC_CONFIG_SRCDIR([src/SDL.c])
AC_CONFIG_HEADERS([include/SDL_config.h])
AC_CONFIG_AUX_DIR([build-scripts])
AC_CONFIG_MACRO_DIR([acinclude])

dnl Save the CFLAGS to see whether they were passed in or generated
orig_CFLAGS="$CFLAGS"

dnl Set various version strings - taken gratefully from the GTk sources
#
# Making releases:
# Edit include/SDL_version.h and change the version, then:
#   SDL_MICRO_VERSION += 1;
#   SDL_INTERFACE_AGE += 1;
#   SDL_BINARY_AGE += 1;
# if any functions have been added, set SDL_INTERFACE_AGE to 0.
# if backwards compatibility has been broken,
# set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0.
#
SDL_MAJOR_VERSION=2
SDL_MINOR_VERSION=0
SDL_MICRO_VERSION=22
SDL_INTERFACE_AGE=0
SDL_BINARY_AGE=22
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION

AC_SUBST(SDL_MAJOR_VERSION)
AC_SUBST(SDL_MINOR_VERSION)
AC_SUBST(SDL_MICRO_VERSION)
AC_SUBST(SDL_INTERFACE_AGE)
AC_SUBST(SDL_BINARY_AGE)
AC_SUBST(SDL_VERSION)

# libtool versioning
LT_INIT([win32-dll])
LT_LANG([Windows Resource])

LT_RELEASE=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION
LT_CURRENT=`expr $SDL_MICRO_VERSION - $SDL_INTERFACE_AGE`
LT_REVISION=$SDL_INTERFACE_AGE
LT_AGE=`expr $SDL_BINARY_AGE - $SDL_INTERFACE_AGE`
m4_pattern_allow([^LT_])

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

dnl Detect the canonical build and host environments
dnl AC_CANONICAL_HOST

dnl Check for tools
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_MAKE_SET
PKG_PROG_PKG_CONFIG

dnl Make sure that srcdir is a full pathname
case "$host" in
    *-*-mingw*)
        # Except on msys, where make can't handle full pathnames (bug 1972)
        ;;
    *)
        srcdir=`cd $srcdir && pwd`
        ;;
esac

dnl Set up the compiler and linker flags
INCLUDE="-I$srcdir/include"

dnl Don't use our khronos headers on QNX.
case "$host" in
    *-*-nto-qnx*)
        ;;
    *)
        INCLUDE="$INCLUDE -idirafter $srcdir/src/video/khronos"
        ;;
esac

dnl use CXX for linker on Haiku
case "$host" in
    *-*-haiku*)
        LINKER='$(CXX)'
        LIBTOOLLINKERTAG='CXX'
        ;;
    *)
        LINKER='$(CC)'
        LIBTOOLLINKERTAG='CC'
        ;;
esac
AC_SUBST(LINKER)
AC_SUBST(LIBTOOLLINKERTAG)

if test x$srcdir != x.; then
    INCLUDE="-Iinclude $INCLUDE"
elif test -d .git; then
    AC_MSG_ERROR([
*** When building from a git clone you should configure and build in a
    separate directory so you don't clobber SDL_config.h, SDL_revision.h
])
fi
BASE_CFLAGS=""
BASE_LDFLAGS=""
case "$host" in
    *-*-cygwin*)
        # We build SDL on cygwin without the UNIX emulation layer
        save_CFLAGS="$CFLAGS"
        have_no_cygwin=no
        AC_MSG_CHECKING(for GCC -mno-cygwin option)
        CFLAGS="$save_CFLAGS -mno-cygwin"

        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])], [have_no_cygwin=yes],[])
        AC_MSG_RESULT($have_no_cygwin)
        CFLAGS="$save_CFLAGS"

        if test x$have_no_cygwin = xyes; then
            BASE_CFLAGS="-mno-cygwin"
            BASE_LDFLAGS="-mno-cygwin"
        fi
        BASE_CFLAGS="$BASE_CFLAGS -I/usr/include/mingw"
        ;;
esac
# Uncomment the following line if you want to force SDL and applications
# built with it to be compiled for a particular architecture.
#AX_GCC_ARCHFLAG([no], [BASE_CFLAGS="$BASE_CFLAGS $ax_cv_gcc_archflag]")
BUILD_CFLAGS="$CFLAGS $CPPFLAGS -DUSING_GENERATED_CONFIG_H"
# The default optimization for SDL is -O3 (Bug #31)
if test "x$orig_CFLAGS" = x; then
    BUILD_CFLAGS=`echo $BUILD_CFLAGS | sed 's/-O2/-O3/'`
fi
EXTRA_CFLAGS="$INCLUDE $BASE_CFLAGS"
BUILD_LDFLAGS="$LDFLAGS"
EXTRA_LDFLAGS="$BASE_LDFLAGS"
## These are common directories to find software packages
#for path in /usr/freeware /usr/pkg /usr/X11R6 /usr/local; do
#    if test -d $path/include; then
#        EXTRA_CFLAGS="$EXTRA_CFLAGS -I$path/include"
#    fi
#    if test -d $path/lib; then
#        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -L$path/lib"
#    fi
#done
SDL_CFLAGS="$BASE_CFLAGS"
SDL_LIBS="-lSDL2"
if test "x$BASE_LDFLAGS" != x; then
    SDL_LIBS="$SDL_LIBS $BASE_LDFLAGS"
fi
if test "x$EXTRA_CFLAGS" != x; then
    CPPFLAGS="$CPPFLAGS $EXTRA_CFLAGS"
    CFLAGS="$CFLAGS $EXTRA_CFLAGS"
fi
if test "x$EXTRA_LDFLAGS" != x; then
    LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
fi

dnl set this to use on systems that use lib64 instead of lib
base_libdir=`echo \${libdir} | sed 's/.*\/\(.*\)/\1/; q'`

dnl Function to find a library in the compiler search path
find_lib()
{
    gcc_bin_path=[`$CC -print-search-dirs 2>/dev/null | fgrep programs: | sed 's/[^=]*=\(.*\)/\1/' | sed 's/:/ /g'`]
    gcc_lib_path=[`$CC -print-search-dirs 2>/dev/null | fgrep libraries: | sed 's/[^=]*=\(.*\)/\1/' | sed 's/:/ /g'`]
    env_lib_path=[`echo $LIBS $LDFLAGS $* | sed 's/-L[ ]*//g'`]
    if test "$cross_compiling" = yes; then
        host_lib_path=""
    else
        host_lib_path="/usr/$base_libdir /usr/local/$base_libdir"
    fi
    for path in $env_lib_path $gcc_bin_path $gcc_lib_path $host_lib_path; do
        lib=[`ls -- $path/$1 2>/dev/null | sed -e '/\.so\..*\./d' -e 's,.*/,,' | sort | tail -1`]
        if test x$lib != x; then
            echo $lib
            return
        fi
    done
    # Try again, this time allowing more than one version digit after the .so
    for path in $env_lib_path $gcc_bin_path $gcc_lib_path $host_lib_path; do
        lib=[`ls -- $path/$1 2>/dev/null | sed -e 's,.*/,,' | sort | tail -1`]
        if test x$lib != x; then
            echo $lib
            return
        fi
    done
}

dnl Check for compiler characteristics
AC_C_CONST
AC_C_INLINE
AC_C_VOLATILE

dnl See whether we want assertions for debugging/sanity checking SDL itself.
AC_ARG_ENABLE(assertions,
[AS_HELP_STRING([--enable-assertions],
               [Enable internal sanity checks (auto/disabled/release/enabled/paranoid) [default=auto]])],
              , enable_assertions=auto)
case "$enable_assertions" in
    auto) # Use optimization settings to determine assertion level
        ;;
    disabled)
        AC_DEFINE(SDL_DEFAULT_ASSERT_LEVEL, 0, [ ])
        ;;
    release)
        AC_DEFINE(SDL_DEFAULT_ASSERT_LEVEL, 1, [ ])
        ;;
    enabled)
        AC_DEFINE(SDL_DEFAULT_ASSERT_LEVEL, 2, [ ])
        ;;
    paranoid)
        AC_DEFINE(SDL_DEFAULT_ASSERT_LEVEL, 3, [ ])
        ;;
    *)
        AC_MSG_ERROR([*** unknown assertion level. stop.])
        ;;
esac

dnl See whether we can use gcc style dependency tracking
AC_ARG_ENABLE(dependency-tracking,
[AS_HELP_STRING([--enable-dependency-tracking],
               [Use gcc -MMD -MT dependency tracking [default=yes]])],
              , enable_dependency_tracking=yes)
if test x$enable_dependency_tracking = xyes; then
    have_gcc_mmd_mt=no
    AC_MSG_CHECKING(for GCC -MMD -MT option)
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
    #if !defined(__GNUC__) || __GNUC__ < 3
    #error Dependency tracking requires GCC 3.0 or newer
    #endif
    ]],[])], [have_gcc_mmd_mt=yes],[])
    AC_MSG_RESULT($have_gcc_mmd_mt)

    if test x$have_gcc_mmd_mt = xyes; then
        DEPENDENCY_TRACKING_OPTIONS="-MMD -MT \$@"
    fi
fi

AC_MSG_CHECKING(for linker option --no-undefined)
have_no_undefined=no
case "$host" in
dnl Skip this on platforms where it is just simply busted.
    *-*-openbsd*)
        ;;
    *)
        save_LDFLAGS="$LDFLAGS"
        LDFLAGS="$LDFLAGS -Wl,--no-undefined"
        AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [
        have_no_undefined=yes
        BUILD_LDFLAGS="$BUILD_LDFLAGS -Wl,--no-undefined"
        ],[])
        LDFLAGS="$save_LDFLAGS"
        ;;
esac
AC_MSG_RESULT($have_no_undefined)

AC_MSG_CHECKING(for linker option --dynamicbase)
have_dynamicbase=no
case "$host" in
    *)
        save_LDFLAGS="$LDFLAGS"
        LDFLAGS="$LDFLAGS -Wl,--dynamicbase"
        AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [
        have_dynamicbase=yes
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,--dynamicbase"
        ],[])
        LDFLAGS="$save_LDFLAGS"
        ;;
esac
AC_MSG_RESULT($have_dynamicbase)

AC_MSG_CHECKING(for linker option --nxcompat)
have_nxcompat=no
case "$host" in
    *)
        save_LDFLAGS="$LDFLAGS"
        LDFLAGS="$LDFLAGS -Wl,--nxcompat"
        AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [
        have_nxcompat=yes
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,--nxcompat"
        ],[])
        LDFLAGS="$save_LDFLAGS"
        ;;
esac
AC_MSG_RESULT($have_nxcompat)

AC_MSG_CHECKING(for linker option --high-entropy-va)
have_high_entropy_va=no
case "$host" in
    *)
        save_LDFLAGS="$LDFLAGS"
        LDFLAGS="$LDFLAGS -Wl,--high-entropy-va"
        AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [
        have_high_entropy_va=yes
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,--high-entropy-va"
        ],[])
        LDFLAGS="$save_LDFLAGS"
        ;;
esac
AC_MSG_RESULT($have_high_entropy_va)

dnl See whether we are allowed to use the system C library
AC_ARG_ENABLE(libc,
[AS_HELP_STRING([--enable-libc], [Use the system C library [default=yes]])],
              , enable_libc=yes)
if test x$enable_libc = xyes; then
    AC_DEFINE(HAVE_LIBC, 1, [ ])

dnl Check for C library headers
    AC_HEADER_STDC
    AC_CHECK_HEADERS(sys/types.h stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h strings.h wchar.h inttypes.h stdint.h limits.h ctype.h math.h float.h iconv.h signal.h)

dnl Check for typedefs, structures, etc.
    AC_TYPE_SIZE_T

dnl Check for defines
    AC_CHECK_DEFINE(M_PI, math.h)

    AC_FUNC_ALLOCA

dnl Checks for library functions.
    AC_FUNC_MEMCMP
    if test x$ac_cv_func_memcmp_working = xyes; then
        AC_DEFINE(HAVE_MEMCMP, 1, [ ])
    fi
    AC_FUNC_STRTOD
    if test x$ac_cv_func_strtod = xyes; then
        AC_DEFINE(HAVE_STRTOD, 1, [ ])
    fi
    AC_CHECK_FUNC(mprotect,
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #include <sys/types.h>
          #include <sys/mman.h>
        ]],[])], [
        AC_DEFINE(HAVE_MPROTECT, 1, [ ])
        ],[]),
    )
    AC_CHECK_FUNCS(malloc calloc realloc free getenv setenv putenv unsetenv qsort abs bcopy memset memcpy memmove wcslen wcslcpy wcslcat _wcsdup wcsdup wcsstr wcscmp wcsncmp wcscasecmp _wcsicmp wcsncasecmp _wcsnicmp strlen strlcpy strlcat _strrev _strupr _strlwr index rindex strchr strrchr strstr strtok_r itoa _ltoa _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp nanosleep sysconf sysctlbyname getauxval elf_aux_info poll _Exit)

    AC_CHECK_LIB(m, pow, [LIBS="$LIBS -lm"; EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lm"])
    AC_CHECK_FUNCS(acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf copysign copysignf cos cosf exp expf fabs fabsf floor floorf trunc truncf fmod fmodf log logf log10 log10f lround lroundf pow powf round roundf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)

    AC_CHECK_LIB(iconv, iconv_open, [LIBS="$LIBS -liconv"; EXTRA_LDFLAGS="$EXTRA_LDFLAGS -liconv"])
    AC_CHECK_FUNCS(iconv)

    AC_CHECK_MEMBER(struct sigaction.sa_sigaction,[AC_DEFINE([HAVE_SA_SIGACTION], 1, [ ])], ,[#include <signal.h>])

dnl Check for additional non-standard headers
    AC_CHECK_HEADERS(libunwind.h)
fi

dnl AC_CHECK_SIZEOF(void*)

dnl See whether we can use gcc atomic operations on this architecture
AC_ARG_ENABLE(gcc-atomics,
[AS_HELP_STRING([--enable-gcc-atomics],
               [Use gcc builtin atomics [default=yes]])],
              , enable_gcc_atomics=yes)
if test x$enable_gcc_atomics = xyes; then
    have_gcc_atomics=no
    AC_MSG_CHECKING(for GCC builtin atomic operations)
    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[
    int a;
    void *x, *y, *z;
    __sync_lock_test_and_set(&a, 4);
    __sync_lock_test_and_set(&x, y);
    __sync_fetch_and_add(&a, 1);
    __sync_bool_compare_and_swap(&a, 5, 10);
    __sync_bool_compare_and_swap(&x, y, z);
    ]])],
     [have_gcc_atomics=yes],[])
    AC_MSG_RESULT($have_gcc_atomics)

    if test x$have_gcc_atomics = xyes; then
        AC_DEFINE(HAVE_GCC_ATOMICS, 1, [ ])
    else
        # See if we have the minimum operation needed for GCC atomics
        AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[
        int a;
        __sync_lock_test_and_set(&a, 1);
        __sync_lock_release(&a);
        ]])], [have_gcc_sync_lock_test_and_set=yes],[])
        if test x$have_gcc_sync_lock_test_and_set = xyes; then
            AC_DEFINE(HAVE_GCC_SYNC_LOCK_TEST_AND_SET, 1, [ ])
        fi
    fi
fi

# Standard C sources
SOURCES="$SOURCES $srcdir/src/*.c"
SOURCES="$SOURCES $srcdir/src/atomic/*.c"
SOURCES="$SOURCES $srcdir/src/audio/*.c"
SOURCES="$SOURCES $srcdir/src/cpuinfo/*.c"
SOURCES="$SOURCES $srcdir/src/dynapi/*.c"
SOURCES="$SOURCES $srcdir/src/events/*.c"
SOURCES="$SOURCES $srcdir/src/file/*.c"
SOURCES="$SOURCES $srcdir/src/haptic/*.c"
SOURCES="$SOURCES $srcdir/src/hidapi/*.c"
SOURCES="$SOURCES $srcdir/src/joystick/*.c"
SOURCES="$SOURCES $srcdir/src/libm/*.c"
SOURCES="$SOURCES $srcdir/src/misc/*.c"
SOURCES="$SOURCES $srcdir/src/power/*.c"
#SOURCES="$SOURCES $srcdir/src/filesystem/*.c"
SOURCES="$SOURCES $srcdir/src/render/*.c"
SOURCES="$SOURCES $srcdir/src/render/*/*.c"
SOURCES="$SOURCES $srcdir/src/sensor/*.c"
SOURCES="$SOURCES $srcdir/src/stdlib/*.c"
SOURCES="$SOURCES $srcdir/src/thread/*.c"
SOURCES="$SOURCES $srcdir/src/timer/*.c"
SOURCES="$SOURCES $srcdir/src/video/*.c"
SOURCES="$SOURCES $srcdir/src/video/yuv2rgb/*.c"
SOURCES="$SOURCES $srcdir/src/locale/*.c"

dnl Enable/disable various subsystems of the SDL library

case "$host" in
    *-*-emscripten*)
        default_atomic=no
        ;;
    *)
        default_atomic=yes
        ;;
esac

AC_ARG_ENABLE(atomic,
[AS_HELP_STRING([--enable-atomic], [Enable the atomic operations subsystem [default=yes]])],
              , enable_atomic=$default_atomic)
if test x$enable_atomic != xyes; then
    AC_DEFINE(SDL_ATOMIC_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} atomic"
fi
AC_ARG_ENABLE(audio,
[AS_HELP_STRING([--enable-audio], [Enable the audio subsystem [default=yes]])],
              , enable_audio=yes)
if test x$enable_audio != xyes; then
    AC_DEFINE(SDL_AUDIO_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} audio"
fi
AC_ARG_ENABLE(video,
[AS_HELP_STRING([--enable-video], [Enable the video subsystem [default=yes]])],
              , enable_video=yes)
if test x$enable_video != xyes; then
    AC_DEFINE(SDL_VIDEO_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} video"
fi
AC_ARG_ENABLE(render,
[AS_HELP_STRING([--enable-render], [Enable the render subsystem [default=yes]])],
              , enable_render=yes)
if test x$enable_render != xyes; then
    AC_DEFINE(SDL_RENDER_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} render"
fi
AC_ARG_ENABLE(events,
[AS_HELP_STRING([--enable-events], [Enable the events subsystem [default=yes]])],
              , enable_events=yes)
if test x$enable_events != xyes; then
    AC_DEFINE(SDL_EVENTS_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} events"
fi
AC_ARG_ENABLE(joystick,
[AS_HELP_STRING([--enable-joystick], [Enable the joystick subsystem [default=yes]])],
              , enable_joystick=yes)
if test x$enable_joystick != xyes; then
    AC_DEFINE(SDL_JOYSTICK_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} joystick"
fi
AC_ARG_ENABLE(haptic,
[AS_HELP_STRING([--enable-haptic], [Enable the haptic (force feedback) subsystem [default=yes]])],
              , enable_haptic=yes)
if test x$enable_haptic != xyes; then
    AC_DEFINE(SDL_HAPTIC_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} haptic"
fi
AC_ARG_ENABLE(hidapi,
[AS_HELP_STRING([--enable-hidapi], [Enable the HIDAPI subsystem [default=yes]])],
              , enable_hidapi=yes)
if test x$enable_hidapi != xyes; then
    AC_DEFINE(SDL_HIDAPI_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} hidapi"
fi
AC_ARG_ENABLE(sensor,
[AS_HELP_STRING([--enable-sensor], [Enable the sensor subsystem [default=yes]])],
              , enable_sensor=yes)
if test x$enable_sensor != xyes; then
    AC_DEFINE(SDL_SENSOR_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} sensor"
fi
AC_ARG_ENABLE(power,
[AS_HELP_STRING([--enable-power], [Enable the power subsystem [default=yes]])],
              , enable_power=yes)
if test x$enable_power != xyes; then
    AC_DEFINE(SDL_POWER_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} power"
fi
AC_ARG_ENABLE(filesystem,
[AS_HELP_STRING([--enable-filesystem], [Enable the filesystem subsystem [default=yes]])],
              , enable_filesystem=yes)
if test x$enable_filesystem != xyes; then
    AC_DEFINE(SDL_FILESYSTEM_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} filesystem"
fi
AC_ARG_ENABLE(threads,
[AS_HELP_STRING([--enable-threads], [Enable the threading subsystem [default=yes]])],
              , enable_threads=yes)
if test x$enable_threads != xyes; then
    AC_DEFINE(SDL_THREADS_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} threads"
fi
AC_ARG_ENABLE(timers,
[AS_HELP_STRING([--enable-timers], [Enable the timer subsystem [default=yes]])],
              , enable_timers=yes)
if test x$enable_timers != xyes; then
    AC_DEFINE(SDL_TIMERS_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} timers"
fi
AC_ARG_ENABLE(file,
[AS_HELP_STRING([--enable-file], [Enable the file subsystem [default=yes]])],
              , enable_file=yes)
if test x$enable_file != xyes; then
    AC_DEFINE(SDL_FILE_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} file"
fi
AC_ARG_ENABLE(misc,
[AS_HELP_STRING([--enable-misc], [Enable the misc subsystem [default=yes]])],
              , enable_misc=yes)
if test x$enable_misc != xyes; then
    AC_DEFINE(SDL_MISC_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} misc"
fi
AC_ARG_ENABLE(locale,
[AS_HELP_STRING([--enable-locale], [Enable the locale subsystem [default=yes]])],
              , enable_locale=yes)
if test x$enable_locale != xyes; then
    AC_DEFINE(SDL_LOCALE_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} locale"
fi
AC_ARG_ENABLE(loadso,
[AS_HELP_STRING([--enable-loadso], [Enable the shared object loading subsystem [default=yes]])],
              , enable_loadso=yes)
if test x$enable_loadso != xyes; then
    AC_DEFINE(SDL_LOADSO_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} loadso"
fi
AC_ARG_ENABLE(cpuinfo,
[AS_HELP_STRING([--enable-cpuinfo], [Enable the cpuinfo subsystem [default=yes]])],
              , enable_cpuinfo=yes)
if test x$enable_cpuinfo != xyes; then
    AC_DEFINE(SDL_CPUINFO_DISABLED, 1, [ ])
else
    SUMMARY_modules="${SUMMARY_modules} cpuinfo"
fi
AC_ARG_ENABLE(assembly,
[AS_HELP_STRING([--enable-assembly], [Enable assembly routines [default=yes]])],
              , enable_assembly=yes)
if test x$enable_assembly = xyes; then
    SUMMARY_modules="${SUMMARY_modules} assembly"

    AC_DEFINE(SDL_ASSEMBLY_ROUTINES, 1, [ ])

    # Make sure that we don't generate floating point code that would
    # cause illegal instruction exceptions on older processors
    case "$host" in
        *-*-darwin*)
            # Don't need to worry about Apple hardware, it's all SSE capable
            default_ssemath=yes
            ;;
        *64-*-*)
            # x86 64-bit architectures all have SSE instructions
            default_ssemath=yes
            ;;
        *)
            default_ssemath=no
            ;;
    esac
    AC_ARG_ENABLE(ssemath,
[AS_HELP_STRING([--enable-ssemath], [Allow GCC to use SSE floating point math [default=maybe]])],
                  , enable_ssemath=$default_ssemath)
    if test x$enable_ssemath = xno; then
        if test x$have_gcc_sse = xyes -o x$have_gcc_sse2 = xyes -o x$have_gcc_sse3 = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS -mfpmath=387"
        fi
    fi

dnl Check for various instruction support
    AC_ARG_ENABLE(mmx,
[AS_HELP_STRING([--enable-mmx], [use MMX assembly routines [default=yes]])],
                  , enable_mmx=yes)
    if test x$enable_mmx = xyes; then
        save_CFLAGS="$CFLAGS"
        have_gcc_mmx=no
        AC_MSG_CHECKING(for GCC -mmmx option)
        mmx_CFLAGS="-mmmx"
        CFLAGS="$save_CFLAGS $mmx_CFLAGS"

        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #ifdef __MINGW32__
        #include <_mingw.h>
        #ifdef __MINGW64_VERSION_MAJOR
        #include <intrin.h>
        #else
        #include <mmintrin.h>
        #endif
        #else
        #include <mmintrin.h>
        #endif
        #ifndef __MMX__
        #error Assembler CPP flag not enabled
        #endif
        ]],[])], [have_gcc_mmx=yes],[])
        AC_MSG_RESULT($have_gcc_mmx)
        CFLAGS="$save_CFLAGS"

        if test x$have_gcc_mmx = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS $mmx_CFLAGS"
            SUMMARY_math="${SUMMARY_math} mmx"
        fi
    fi

    AC_ARG_ENABLE(3dnow,
[AS_HELP_STRING([--enable-3dnow], [use 3DNow! assembly routines [default=yes]])],
                  , enable_3dnow=yes)
    if test x$enable_3dnow = xyes; then
        save_CFLAGS="$CFLAGS"
        have_gcc_3dnow=no
        AC_MSG_CHECKING(for GCC -m3dnow option)
        amd3dnow_CFLAGS="-m3dnow"
        CFLAGS="$save_CFLAGS $amd3dnow_CFLAGS"

        AC_LINK_IFELSE([AC_LANG_PROGRAM([[
        #include <mm3dnow.h>
        #ifndef __3dNOW__
        #error Assembler CPP flag not enabled
        #endif
        ]], [[
        void *p = 0;
        _m_prefetch(p);
        ]])],
         [have_gcc_3dnow=yes],[])
        AC_MSG_RESULT($have_gcc_3dnow)
        CFLAGS="$save_CFLAGS"

        if test x$have_gcc_3dnow = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS $amd3dnow_CFLAGS"
            SUMMARY_math="${SUMMARY_math} 3dnow"
        fi
    fi

    AC_ARG_ENABLE(sse,
[AS_HELP_STRING([--enable-sse], [use SSE assembly routines [default=yes]])],
                  , enable_sse=yes)
    if test x$enable_sse = xyes; then
        save_CFLAGS="$CFLAGS"
        have_gcc_sse=no
        AC_MSG_CHECKING(for GCC -msse option)
        sse_CFLAGS="-msse"
        CFLAGS="$save_CFLAGS $sse_CFLAGS"

        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #ifdef __MINGW32__
        #include <_mingw.h>
        #ifdef __MINGW64_VERSION_MAJOR
        #include <intrin.h>
        #else
        #include <xmmintrin.h>
        #endif
        #else
        #include <xmmintrin.h>
        #endif
        #ifndef __SSE__
        #error Assembler CPP flag not enabled
        #endif
        ]],[])], [have_gcc_sse=yes],[])
        AC_MSG_RESULT($have_gcc_sse)
        CFLAGS="$save_CFLAGS"

        if test x$have_gcc_sse = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS $sse_CFLAGS"
            SUMMARY_math="${SUMMARY_math} sse"
        fi
    fi

    AC_ARG_ENABLE(sse2,
[AS_HELP_STRING([--enable-sse2], [use SSE2 assembly routines [default=maybe]])],
                  , enable_sse2=$default_ssemath)
    if test x$enable_sse2 = xyes; then
        save_CFLAGS="$CFLAGS"
        have_gcc_sse2=no
        AC_MSG_CHECKING(for GCC -msse2 option)
        sse2_CFLAGS="-msse2"
        CFLAGS="$save_CFLAGS $sse2_CFLAGS"

        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #ifdef __MINGW32__
        #include <_mingw.h>
        #ifdef __MINGW64_VERSION_MAJOR
        #include <intrin.h>
        #else
        #include <emmintrin.h>
        #endif
        #else
        #include <emmintrin.h>
        #endif
        #ifndef __SSE2__
        #error Assembler CPP flag not enabled
        #endif
        ]],[])], [have_gcc_sse2=yes],[])
        AC_MSG_RESULT($have_gcc_sse2)
        CFLAGS="$save_CFLAGS"

        if test x$have_gcc_sse2 = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS $sse2_CFLAGS"
            SUMMARY_math="${SUMMARY_math} sse2"
        fi
    fi

    AC_ARG_ENABLE(sse3,
[AS_HELP_STRING([--enable-sse3], [use SSE3 assembly routines [default=maybe]])],
                  , enable_sse3=$default_ssemath)
    if test x$enable_sse3 = xyes; then
        save_CFLAGS="$CFLAGS"
        have_gcc_sse3=no
        AC_MSG_CHECKING(for GCC -msse3 option)
        sse3_CFLAGS="-msse3"
        CFLAGS="$save_CFLAGS $sse3_CFLAGS"

        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #ifdef __MINGW32__
        #include <_mingw.h>
        #ifdef __MINGW64_VERSION_MAJOR
        #include <intrin.h>
        #else
        #include <pmmintrin.h>
        #endif
        #else
        #include <pmmintrin.h>
        #endif
        #ifndef __SSE2__
        #error Assembler CPP flag not enabled
        #endif
        ]],[])], [have_gcc_sse3=yes],[])
        AC_MSG_RESULT($have_gcc_sse3)
        CFLAGS="$save_CFLAGS"

        if test x$have_gcc_sse3 = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS $sse3_CFLAGS"
            SUMMARY_math="${SUMMARY_math} sse3"
        fi
    fi

    AC_MSG_CHECKING(for immintrin.h)
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <immintrin.h>]])],
       [have_immintrin_h_hdr=yes],[have_immintrin_h_hdr=no])
    AC_MSG_RESULT($have_immintrin_h_hdr)
    if test x$have_immintrin_h_hdr = xyes; then
        AC_DEFINE(HAVE_IMMINTRIN_H, 1, [ ])
    fi

    AC_ARG_ENABLE(altivec,
[AS_HELP_STRING([--enable-altivec], [use Altivec assembly routines [default=yes]])],
                  , enable_altivec=yes)
    if test x$enable_altivec = xyes; then
        save_CFLAGS="$CFLAGS"
        have_gcc_altivec=no
        have_altivec_h_hdr=no
        altivec_CFLAGS="-maltivec"
        CFLAGS="$save_CFLAGS $altivec_CFLAGS"

        AC_MSG_CHECKING(for Altivec with GCC altivec.h and -maltivec option)
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #include <altivec.h>
        vector unsigned int vzero() {
            return vec_splat_u32(0);
        }
        ]],[])], [
        have_gcc_altivec=yes
        have_altivec_h_hdr=yes
        ],[])
        AC_MSG_RESULT($have_gcc_altivec)

        if test x$have_gcc_altivec = xno; then
            AC_MSG_CHECKING(for Altivec with GCC -maltivec option)
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
            vector unsigned int vzero() {
                return vec_splat_u32(0);
            }
            ]],[])], [have_gcc_altivec=yes],[])
            AC_MSG_RESULT($have_gcc_altivec)
        fi

        if test x$have_gcc_altivec = xno; then
            AC_MSG_CHECKING(for Altivec with GCC altivec.h and -faltivec option)
            altivec_CFLAGS="-faltivec"
            CFLAGS="$save_CFLAGS $altivec_CFLAGS"
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
            #include <altivec.h>
            vector unsigned int vzero() {
                return vec_splat_u32(0);
            }
            ]],[])], [
            have_gcc_altivec=yes
            have_altivec_h_hdr=yes
            ],[])
            AC_MSG_RESULT($have_gcc_altivec)
        fi

        if test x$have_gcc_altivec = xno; then
            AC_MSG_CHECKING(for Altivec with GCC -faltivec option)
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
            vector unsigned int vzero() {
                return vec_splat_u32(0);
            }
            ]],[])], [have_gcc_altivec=yes],[])
            AC_MSG_RESULT($have_gcc_altivec)
        fi
        CFLAGS="$save_CFLAGS"

        if test x$have_gcc_altivec = xyes; then
            AC_DEFINE(SDL_ALTIVEC_BLITTERS, 1, [ ])
            if test x$have_altivec_h_hdr = xyes; then
              AC_DEFINE(HAVE_ALTIVEC_H, 1, [ ])
            fi
            EXTRA_CFLAGS="$EXTRA_CFLAGS $altivec_CFLAGS"
            SUMMARY_math="${SUMMARY_math} altivec"
        fi
    fi
fi

dnl See if the OSS audio interface is supported
CheckOSS()
{
    AC_ARG_ENABLE(oss,
[AS_HELP_STRING([--enable-oss], [support the OSS audio API [default=maybe]])],
                  , enable_oss=maybe)

    # OpenBSD "has" OSS, but it's not really for app use. They want you to
    #  use sndio instead. So on there, we default to disabled. You can force
    #  it on if you really want, though.
    if test x$enable_oss = xmaybe; then
        enable_oss=yes
        case "$host" in
            *-*-openbsd*)
                enable_oss=no;;
        esac
    fi

    if test x$enable_audio = xyes -a x$enable_oss = xyes; then
        AC_MSG_CHECKING(for OSS audio support)
        have_oss=no
        if test x$have_oss != xyes; then
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
              #include <sys/soundcard.h>
            ]], [[
              int arg = SNDCTL_DSP_SETFRAGMENT;
            ]])], [have_oss=yes],[])
        fi
        if test x$have_oss != xyes; then
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
              #include <soundcard.h>
            ]], [[
              int arg = SNDCTL_DSP_SETFRAGMENT;
            ]])], [
            have_oss=yes
            AC_DEFINE(SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H, 1, [ ])
            ],[])
        fi
        AC_MSG_RESULT($have_oss)
        if test x$have_oss = xyes; then
            SUMMARY_audio="${SUMMARY_audio} oss"
            AC_DEFINE(SDL_AUDIO_DRIVER_OSS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/dsp/*.c"
            have_audio=yes

            # We may need to link with ossaudio emulation library
            case "$host" in
                *-*-openbsd*|*-*-netbsd*)
                    EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lossaudio";;
            esac
        fi
    fi
}

dnl See if the ALSA audio interface is supported
CheckALSA()
{
    AC_ARG_ENABLE(alsa,
[AS_HELP_STRING([--enable-alsa], [support the ALSA audio API [default=yes]])],
                  , enable_alsa=yes)
    if test x$enable_audio = xyes -a x$enable_alsa = xyes; then
        AM_PATH_ALSA(1.0.11, have_alsa=yes, have_alsa=no)
        # Restore all flags from before the ALSA detection runs
        CFLAGS="$alsa_save_CFLAGS"
        LDFLAGS="$alsa_save_LDFLAGS"
        LIBS="$alsa_save_LIBS"
        if test x$have_alsa = xyes; then
            AC_ARG_ENABLE(alsa-shared,
[AS_HELP_STRING([--enable-alsa-shared], [dynamically load ALSA audio support [default=yes]])],
                          , enable_alsa_shared=yes)
            alsa_lib=[`find_lib "libasound.so.*" "$ALSA_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

            AC_DEFINE(SDL_AUDIO_DRIVER_ALSA, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/alsa/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $ALSA_CFLAGS"
            if test x$have_loadso != xyes && \
               test x$enable_alsa_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic ALSA loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_alsa_shared = xyes && test x$alsa_lib != x; then
                echo "-- dynamic libasound -> $alsa_lib"
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_ALSA_DYNAMIC, "$alsa_lib", [ ])
                SUMMARY_audio="${SUMMARY_audio} alsa(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $ALSA_LIBS"
                SUMMARY_audio="${SUMMARY_audio} alsa"
            fi
            have_audio=yes
        fi
    fi
}

dnl Find JACK Audio
CheckJACK()
{
    AC_ARG_ENABLE(jack,
[AS_HELP_STRING([--enable-jack], [use JACK audio [default=yes]])],
                  , enable_jack=yes)
    if test x$enable_audio = xyes -a x$enable_jack = xyes; then
        PKG_CHECK_MODULES([JACK], [jack >= 0.125], audio_jack=yes, audio_jack=no)

        if test x$audio_jack = xyes; then
            AC_ARG_ENABLE(jack-shared,
[AS_HELP_STRING([--enable-jack-shared], [dynamically load JACK audio support [default=yes]])],
                          , enable_jack_shared=yes)
            jack_lib=[`find_lib "libjack.so.*" "$JACK_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

            AC_DEFINE(SDL_AUDIO_DRIVER_JACK, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/jack/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $JACK_CFLAGS"
            if test x$have_loadso != xyes && \
               test x$enable_jack_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic JACK audio loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_jack_shared = xyes && test x$jack_lib != x; then
                echo "-- dynamic libjack -> $jack_lib"
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_JACK_DYNAMIC, "$jack_lib", [ ])
                SUMMARY_audio="${SUMMARY_audio} jack(dynamic)"

                case "$host" in
                    # On Solaris, jack must be linked deferred explicitly
                    # to prevent undefined symbol failures.
                    *-*-solaris*)
                        JACK_LIBS=`echo $JACK_LIBS | sed 's/\-l/-Wl,-l/g'`
                        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-zdeferred $JACK_LIBS -Wl,-znodeferred"
                esac
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $JACK_LIBS"
                SUMMARY_audio="${SUMMARY_audio} jack"
            fi
            have_audio=yes
        fi
    fi
}

dnl Find the ESD includes and libraries
CheckESD()
{
    AC_ARG_ENABLE(esd,
[AS_HELP_STRING([--enable-esd], [support the Enlightened Sound Daemon [default=yes]])],
                  , enable_esd=yes)
    if test x$enable_audio = xyes -a x$enable_esd = xyes; then
        AM_PATH_ESD(0.2.8, have_esd=yes, have_esd=no)
        if test x$have_esd = xyes; then
            AC_ARG_ENABLE(esd-shared,
[AS_HELP_STRING([--enable-esd-shared], [dynamically load ESD audio support [default=yes]])],
                          , enable_esd_shared=yes)
            esd_lib=[`find_lib "libesd.so.*" "$ESD_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

            AC_DEFINE(SDL_AUDIO_DRIVER_ESD, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/esd/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $ESD_CFLAGS"
            if test x$have_loadso != xyes && \
               test x$enable_esd_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic ESD loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_esd_shared = xyes && test x$esd_lib != x; then
                echo "-- dynamic libesd -> $esd_lib"
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_ESD_DYNAMIC, "$esd_lib", [ ])
                SUMMARY_audio="${SUMMARY_audio} esd(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $ESD_LIBS"
                SUMMARY_audio="${SUMMARY_audio} esd"
            fi
            have_audio=yes
        fi
    fi
}

dnl Find Pipewire
CheckPipewire()
{
    AC_ARG_ENABLE(pipewire,
[AS_HELP_STRING([--enable-pipewire], [use Pipewire audio [default=yes]])],
                  , enable_pipewire=yes)
    if test x$enable_audio = xyes -a x$enable_pipewire = xyes; then
        PKG_CHECK_MODULES([PIPEWIRE], [libpipewire-0.3 >= 0.3.20], audio_pipewire=yes, audio_pipewire=no)

        if test x$audio_pipewire = xyes; then
            AC_ARG_ENABLE(pipewire-shared,
[AS_HELP_STRING([--enable-pipewire-shared], [dynamically load Pipewire support [default=yes]])],
                          , enable_pipewire_shared=yes)
            pipewire_lib=[`find_lib "libpipewire-0.3.so.*" "$PIPEWIRE_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

            AC_DEFINE(SDL_AUDIO_DRIVER_PIPEWIRE, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/pipewire/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $PIPEWIRE_CFLAGS"
            if test x$have_loadso != xyes && \
               test x$enable_pipewire_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic Pipewire loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_pipewire_shared = xyes && test x$pipewire_lib != x; then
                echo "-- dynamic libpipewire-0.3 -> $pipewire_lib"
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC, "$pipewire_lib", [ ])
                SUMMARY_audio="${SUMMARY_audio} pipewire(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $PIPEWIRE_LIBS"
                SUMMARY_audio="${SUMMARY_audio} pipewire"
            fi
            have_audio=yes
        fi
    fi
}

dnl Find PulseAudio
CheckPulseAudio()
{
    AC_ARG_ENABLE(pulseaudio,
[AS_HELP_STRING([--enable-pulseaudio], [use PulseAudio [default=yes]])],
                  , enable_pulseaudio=yes)
    if test x$enable_audio = xyes -a x$enable_pulseaudio = xyes; then
        PKG_CHECK_MODULES([PULSEAUDIO], [libpulse-simple >= 0.9], audio_pulseaudio=yes, audio_pulseaudio=no)

        if test x$audio_pulseaudio = xyes; then
            AC_ARG_ENABLE(pulseaudio-shared,
[AS_HELP_STRING([--enable-pulseaudio-shared], [dynamically load PulseAudio support [default=yes]])],
                          , enable_pulseaudio_shared=yes)
            pulseaudio_lib=[`find_lib "libpulse-simple.so.*" "$PULSEAUDIO_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

            AC_DEFINE(SDL_AUDIO_DRIVER_PULSEAUDIO, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/pulseaudio/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $PULSEAUDIO_CFLAGS"
            if test x$have_loadso != xyes && \
               test x$enable_pulseaudio_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic PulseAudio loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_pulseaudio_shared = xyes && test x$pulseaudio_lib != x; then
                echo "-- dynamic libpulse-simple -> $pulseaudio_lib"
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC, "$pulseaudio_lib", [ ])
                SUMMARY_audio="${SUMMARY_audio} pulse(dynamic)"

                case "$host" in
                    # On Solaris, pulseaudio must be linked deferred explicitly
                    # to prevent undefined symbol failures.
                    *-*-solaris*)
                        PULSEAUDIO_LIBS=`echo $PULSEAUDIO_LIBS | sed 's/\-l/-Wl,-l/g'`
                        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-zdeferred $PULSEAUDIO_LIBS -Wl,-znodeferred"
                esac
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $PULSEAUDIO_LIBS"
                SUMMARY_audio="${SUMMARY_audio} pulse"
            fi
            have_audio=yes
        fi
    fi
}

CheckARTSC()
{
    AC_ARG_ENABLE(arts,
[AS_HELP_STRING([--enable-arts], [support the Analog Real Time Synthesizer [default=yes]])],
                  , enable_arts=yes)
    if test x$enable_audio = xyes -a x$enable_arts = xyes; then
        AC_PATH_PROG(ARTSCONFIG, artsc-config)
        if test x$ARTSCONFIG = x -o x$ARTSCONFIG = x'"$ARTSCONFIG"'; then
            : # arts isn't installed
        else
            ARTS_CFLAGS=`$ARTSCONFIG --cflags`
            ARTS_LIBS=`$ARTSCONFIG --libs`
            AC_MSG_CHECKING(for aRts development environment)
            audio_arts=no
            save_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS $ARTS_CFLAGS"
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
             #include <artsc.h>
            ]], [[
             arts_stream_t stream;
            ]])], [audio_arts=yes],[])
            CFLAGS="$save_CFLAGS"
            AC_MSG_RESULT($audio_arts)
            if test x$audio_arts = xyes; then
                AC_ARG_ENABLE(arts-shared,
[AS_HELP_STRING([--enable-arts-shared], [dynamically load aRts audio support [default=yes]])],
                              , enable_arts_shared=yes)
                arts_lib=[`find_lib "libartsc.so.*" "$ARTS_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

                AC_DEFINE(SDL_AUDIO_DRIVER_ARTS, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/audio/arts/*.c"
                EXTRA_CFLAGS="$EXTRA_CFLAGS $ARTS_CFLAGS"
                if test x$have_loadso != xyes && \
                   test x$enable_arts_shared = xyes; then
                    AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic ARTS loading])
                fi
                if test x$have_loadso = xyes && \
                   test x$enable_arts_shared = xyes && test x$arts_lib != x; then
                    echo "-- dynamic libartsc -> $arts_lib"
                    AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_ARTS_DYNAMIC, "$arts_lib", [ ])
                    SUMMARY_audio="${SUMMARY_audio} arts(dynamic)"
                else
                    EXTRA_LDFLAGS="$EXTRA_LDFLAGS $ARTS_LIBS"
                    SUMMARY_audio="${SUMMARY_audio} arts"
                fi
                have_audio=yes
            fi
        fi
    fi
}

dnl See if the NAS audio interface is supported
CheckNAS()
{
    AC_ARG_ENABLE(nas,
[AS_HELP_STRING([--enable-nas], [support the NAS audio API [default=yes]])],
                  , enable_nas=yes)
    if test x$enable_audio = xyes -a x$enable_nas = xyes; then
        AC_CHECK_HEADER(audio/audiolib.h, have_nas_hdr=yes)
        AC_CHECK_LIB(audio, AuOpenServer, have_nas_lib=yes)

        AC_MSG_CHECKING(for NAS audio support)
        have_nas=no

        if test x$have_nas_hdr = xyes -a x$have_nas_lib = xyes; then
            have_nas=yes
            NAS_LIBS="-laudio"

        elif test -r /usr/X11R6/include/audio/audiolib.h; then
            have_nas=yes
            NAS_CFLAGS="-I/usr/X11R6/include/"
            NAS_LIBS="-L/usr/X11R6/lib -laudio -lXt"

        fi

        AC_MSG_RESULT($have_nas)

        if test x$have_nas = xyes; then
            AC_ARG_ENABLE(nas-shared,
[AS_HELP_STRING([--enable-nas-shared], [dynamically load NAS audio support [default=yes]])],
                          , enable_nas_shared=yes)
            nas_lib=[`find_lib "libaudio.so.*" "$NAS_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

            if test x$have_loadso != xyes && \
               test x$enable_nas_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic NAS loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_nas_shared = xyes && test x$nas_lib != x; then
                echo "-- dynamic libaudio -> $nas_lib"
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_NAS_DYNAMIC, "$nas_lib", [ ])
                SUMMARY_audio="${SUMMARY_audio} nas(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $NAS_LIBS"
                SUMMARY_audio="${SUMMARY_audio} nas"
            fi

            AC_DEFINE(SDL_AUDIO_DRIVER_NAS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/nas/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $NAS_CFLAGS"
            have_audio=yes
        fi
    fi
}

dnl See if the sndio audio interface is supported
CheckSNDIO()
{
    AC_ARG_ENABLE(sndio,
[AS_HELP_STRING([--enable-sndio], [support the sndio audio API [default=yes]])],
                  , enable_sndio=yes)
    if test x$enable_audio = xyes -a x$enable_sndio = xyes; then
        AC_CHECK_HEADER(sndio.h, have_sndio_hdr=yes)
        AC_CHECK_LIB(sndio, sio_open, have_sndio_lib=yes)

        AC_MSG_CHECKING(for sndio audio support)
        have_sndio=no

        if test x$have_sndio_hdr = xyes -a x$have_sndio_lib = xyes; then
            have_sndio=yes
            SNDIO_LIBS="-lsndio"
        fi

        AC_MSG_RESULT($have_sndio)

        if test x$have_sndio = xyes; then
            AC_ARG_ENABLE(sndio-shared,
[AS_HELP_STRING([--enable-sndio-shared], [dynamically load sndio audio support [default=yes]])],
                          , enable_sndio_shared=yes)
            sndio_lib=[`find_lib "libsndio.so.*" "$SNDIO_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

            if test x$have_loadso != xyes && \
               test x$enable_sndio_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic sndio loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_sndio_shared = xyes && test x$sndio_lib != x; then
                echo "-- dynamic libsndio -> $sndio_lib"
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC, "$sndio_lib", [ ])
                SUMMARY_audio="${SUMMARY_audio} sndio(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $SNDIO_LIBS"
                SUMMARY_audio="${SUMMARY_audio} sndio"
            fi

            AC_DEFINE(SDL_AUDIO_DRIVER_SNDIO, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/sndio/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $SNDIO_CFLAGS"
            have_audio=yes
        fi
    fi
}

dnl Find FusionSound
CheckFusionSound()
{
    AC_ARG_ENABLE(fusionsound,
[AS_HELP_STRING([--enable-fusionsound], [use FusionSound audio driver [default=no]])],
                  , enable_fusionsound=no)
    if test x$enable_audio = xyes -a x$enable_fusionsound = xyes; then
        PKG_CHECK_MODULES([FUSIONSOUND], [fusionsound >= 1.1.1], fusionsound=yes, fusionsound=no)

        if test x$fusionsound = xyes; then
            AC_DEFINE(SDL_AUDIO_DRIVER_FUSIONSOUND, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/fusionsound/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $FUSIONSOUND_CFLAGS"

            AC_ARG_ENABLE(fusionsound-shared,
[AS_HELP_STRING([--enable-fusionsound-shared], [dynamically load fusionsound audio support [default=yes]])],
                          , enable_fusionsound_shared=yes)
            fusionsound_shared=no
            AC_MSG_CHECKING(for FusionSound dynamic loading support)
            if test x$have_loadso != xyes && \
               test x$enable_fusionsound_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic fusionsound loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_fusionsound_shared = xyes; then
                AC_DEFINE_UNQUOTED(SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC, "libfusionsound.so", [ ])
                fusionsound_shared=yes
                SUMMARY_audio="${SUMMARY_audio} fusionsound(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $FUSIONSOUND_LIBS"
                SUMMARY_audio="${SUMMARY_audio} fusionsound"
            fi
            AC_MSG_RESULT($fusionsound_shared)

            have_audio=yes
        fi
    fi
}

dnl rcg07142001 See if the user wants the disk writer audio driver...
CheckDiskAudio()
{
    AC_ARG_ENABLE(diskaudio,
[AS_HELP_STRING([--enable-diskaudio], [support the disk writer audio driver [default=yes]])],
                  , enable_diskaudio=yes)
    if test x$enable_audio = xyes -a x$enable_diskaudio = xyes; then
        AC_DEFINE(SDL_AUDIO_DRIVER_DISK, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/audio/disk/*.c"
        SUMMARY_audio="${SUMMARY_audio} disk"
        have_audio=yes
    fi
}

dnl rcg03142006 See if the user wants the dummy audio driver...
CheckDummyAudio()
{
    AC_ARG_ENABLE(dummyaudio,
[AS_HELP_STRING([--enable-dummyaudio], [support the dummy audio driver [default=yes]])],
                  , enable_dummyaudio=yes)
    if test x$enable_audio = xyes -a x$enable_dummyaudio = xyes; then
        AC_DEFINE(SDL_AUDIO_DRIVER_DUMMY, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/audio/dummy/*.c"
        SUMMARY_audio="${SUMMARY_audio} dummy"
        have_audio=yes
    fi
}

dnl See if libsamplerate is available
CheckLibSampleRate()
{
    AC_ARG_ENABLE(libsamplerate,
[AS_HELP_STRING([--enable-libsamplerate], [use libsamplerate for audio rate conversion [default=yes]])],
                  , enable_libsamplerate=yes)
    if test x$enable_libsamplerate = xyes; then
        AC_CHECK_HEADER(samplerate.h,
                        have_samplerate_h_hdr=yes,
                        have_samplerate_h_hdr=no)
        if test x$have_samplerate_h_hdr = xyes; then
            AC_DEFINE(HAVE_LIBSAMPLERATE_H, 1, [ ])

            AC_ARG_ENABLE(libsamplerate-shared,
[AS_HELP_STRING([--enable-libsamplerate-shared], [dynamically load libsamplerate [default=yes]])],
                          , enable_libsamplerate_shared=yes)

            samplerate_lib=[`find_lib "libsamplerate.so.*" "" | sed 's/.*\/\(.*\)/\1/; q'`]

            if test x$have_loadso != xyes && \
               test x$enable_libsamplerate_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic libsamplerate loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_libsamplerate_shared = xyes && test x$samplerate_lib != x; then
                echo "-- dynamic libsamplerate -> $samplerate_lib"
                AC_DEFINE_UNQUOTED(SDL_LIBSAMPLERATE_DYNAMIC, "$samplerate_lib", [ ])
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lsamplerate"
            fi
        fi
    fi
}

dnl Check for ARM instruction support using gas syntax
CheckARM()
{
    AC_ARG_ENABLE(arm-simd,
[AS_HELP_STRING([--enable-arm-simd], [use SIMD assembly blitters on ARM [default=no]])],
                  enable_arm_simd=$enableval, enable_arm_simd=no)
    if test x$enable_video = xyes -a x$enable_assembly = xyes -a x$enable_arm_simd = xyes; then
        save_CFLAGS="$CFLAGS"
        have_arm_simd=no
        CFLAGS="-x assembler-with-cpp $CFLAGS"

        AC_MSG_CHECKING(for ARM SIMD)
        AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
        .text
        .arch armv6
        .object_arch armv4
        .arm
        .altmacro
        #ifndef __ARM_EABI__
        #error EABI is required (to be sure that calling conventions are compatible)
        #endif
        pld [r0]
        uqadd8 r0, r0, r0
        ]])], have_arm_simd=yes)
        AC_MSG_RESULT($have_arm_simd)

        CFLAGS="$save_CFLAGS"

        if test x$have_arm_simd = xyes; then
            AC_DEFINE(SDL_ARM_SIMD_BLITTERS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/arm/pixman-arm-simd*.S"
            WARN_ABOUT_ARM_SIMD_ASM_MIT="yes"
        fi
    fi
}

dnl Check for ARM NEON instruction support using gas syntax
CheckNEON()
{
    AC_ARG_ENABLE(arm-neon,
[AS_HELP_STRING([--enable-arm-neon], [use NEON assembly blitters on ARM [default=no]])],
                  enable_arm_neon=$enableval, enable_arm_neon=no)
    if test x$enable_video = xyes -a x$enable_assembly = xyes -a x$enable_arm_neon = xyes; then
        save_CFLAGS="$CFLAGS"
        have_arm_neon=no
        CFLAGS="-x assembler-with-cpp $CFLAGS"

        AC_MSG_CHECKING(for ARM NEON)
        AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
        .text
        .fpu neon
        .arch armv7a
        .object_arch armv4
        .eabi_attribute 10, 0
        .arm
        .altmacro
        #ifndef __ARM_EABI__
        #error EABI is required (to be sure that calling conventions are compatible)
        #endif
        pld [r0]
        vmovn.u16 d0, q0
        ]])], have_arm_neon=yes)
        AC_MSG_RESULT($have_arm_neon)
        CFLAGS="$save_CFLAGS"

        if test x$have_arm_neon = xyes; then
            AC_DEFINE(SDL_ARM_NEON_BLITTERS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/arm/pixman-arm-neon*.S"
            WARN_ABOUT_ARM_NEON_ASM_MIT="yes"
        fi
    fi
}

dnl See if GCC's -fvisibility=hidden is supported (gcc4 and later, usually).
dnl  Details of this flag are here: http://gcc.gnu.org/wiki/Visibility
CheckVisibilityHidden()
{
    AC_MSG_CHECKING(for GCC -fvisibility=hidden option)
    have_gcc_fvisibility=no

    visibility_CFLAGS="-fvisibility=hidden"
    save_CFLAGS="$CFLAGS"
    CFLAGS="$save_CFLAGS $visibility_CFLAGS -Werror"
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
    #if !defined(__GNUC__) || __GNUC__ < 4
    #error SDL only uses visibility attributes in GCC 4 or newer
    #endif
    ]],[])], [have_gcc_fvisibility=yes],[])
    AC_MSG_RESULT($have_gcc_fvisibility)
    CFLAGS="$save_CFLAGS"

    if test x$have_gcc_fvisibility = xyes; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS $visibility_CFLAGS"
    fi
}

dnl See if GCC's -fno-strict-aliasingis supported.
dnl  Reference: https://bugzilla.libsdl.org/show_bug.cgi?id=4254
CheckNoStrictAliasing()
{
    AC_MSG_CHECKING(for GCC -fno-strict-aliasing option)
    have_gcc_no_strict_aliasing=no

    save_CFLAGS="$CFLAGS"
    CFLAGS="$save_CFLAGS -fno-strict-aliasing"
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
    int x = 0;
    ]],[])], [have_gcc_no_strict_aliasing=yes],[])
    AC_MSG_RESULT($have_gcc_no_strict_aliasing)
    CFLAGS="$save_CFLAGS"

    if test x$have_gcc_no_strict_aliasing = xyes; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -fno-strict-aliasing"
    fi
}

dnl See if GCC's -mpreferred-stack-boundary is supported.
dnl  Reference: http://bugzilla.libsdl.org/show_bug.cgi?id=1296
CheckStackBoundary()
{
    AC_MSG_CHECKING(for GCC -mpreferred-stack-boundary option)
    have_gcc_preferred_stack_boundary=no

    save_CFLAGS="$CFLAGS"
    CFLAGS="$save_CFLAGS -mpreferred-stack-boundary=2"
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
    int x = 0;
    ]],[])], [have_gcc_preferred_stack_boundary=yes],[])
    AC_MSG_RESULT($have_gcc_preferred_stack_boundary)
    CFLAGS="$save_CFLAGS"

    if test x$have_gcc_preferred_stack_boundary = xyes; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -mpreferred-stack-boundary=2"
    fi
}

dnl See if GCC's -Wdeclaration-after-statement is supported.
dnl  This lets us catch things that would fail on a C89 compiler when using
dnl  a modern GCC.
CheckDeclarationAfterStatement()
{
    AC_MSG_CHECKING(for GCC -Wdeclaration-after-statement option)
    have_gcc_declaration_after_statement=no

    save_CFLAGS="$CFLAGS"
    CFLAGS="$save_CFLAGS -Wdeclaration-after-statement -Werror=declaration-after-statement"
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
    int x = 0;
    ]],[])], [have_gcc_declaration_after_statement=yes],[])
    AC_MSG_RESULT($have_gcc_declaration_after_statement)
    CFLAGS="$save_CFLAGS"

    if test x$have_gcc_declaration_after_statement = xyes; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -Wdeclaration-after-statement -Werror=declaration-after-statement"
    fi
}

dnl See if GCC's -Wall is supported.
CheckWarnAll()
{
    AC_MSG_CHECKING(for GCC -Wall option)
    have_gcc_Wall=no

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

    if test x$have_gcc_Wall = xyes; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"

dnl Haiku headers use multicharacter constants all over the place. Ignore these warnings when using -Wall.
        AC_MSG_CHECKING(for necessary GCC -Wno-multichar option)
        need_gcc_Wno_multichar=no
        case "$host" in
            *-*-haiku*)
                need_gcc_Wno_multichar=yes
                ;;
        esac
        AC_MSG_RESULT($need_gcc_Wno_multichar)
        if test x$need_gcc_Wno_multichar = xyes; then
            EXTRA_CFLAGS="$EXTRA_CFLAGS -Wno-multichar"
        fi
    fi
}

dnl Check for Wayland
CheckWayland()
{
    AC_ARG_ENABLE(video-wayland,
[AS_HELP_STRING([--enable-video-wayland], [use Wayland video driver [default=yes]])],
                  ,enable_video_wayland=yes)

    AC_ARG_ENABLE(video-wayland-qt-touch,
[AS_HELP_STRING([--enable-video-wayland-qt-touch], [QtWayland server support for Wayland video driver [default=yes]])],
                  ,enable_video_wayland_qt_touch=yes)

    if test x$enable_video = xyes -a x$enable_video_wayland = xyes; then
        AC_MSG_CHECKING(for Wayland support)
        video_wayland=no
        if  test x$video_opengl_egl = xyes && \
            test x$video_opengles_v2 = xyes; then
            if $PKG_CONFIG --exists 'wayland-client >= 1.18' wayland-scanner wayland-egl wayland-cursor egl 'xkbcommon >= 0.5.0'; then
                WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor xkbcommon`
                WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor xkbcommon`
                WAYLAND_SCANNER=`$PKG_CONFIG --variable=wayland_scanner wayland-scanner`
                AS_IF([$PKG_CONFIG --exists 'wayland-scanner >= 1.15'],
                      [WAYLAND_SCANNER_CODE_MODE=private-code],
                      [WAYLAND_SCANNER_CODE_MODE=code])
                video_wayland=yes
            fi
        fi
        AC_MSG_RESULT($video_wayland)

        if test x$video_wayland = xyes; then
            AC_DEFINE(SDL_VIDEO_DRIVER_WAYLAND, 1, [ ])
            if test x$enable_video_wayland_qt_touch = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH, 1, [ ])
            fi

            WAYLAND_SOURCES="$srcdir/src/video/wayland/*.c"
            SOURCES="$SOURCES $WAYLAND_SOURCES"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS -I\$(gen)"
            AC_ARG_ENABLE(wayland-shared,
[AS_HELP_STRING([--enable-wayland-shared], [dynamically load Wayland support [default=maybe]])],
                          , enable_wayland_shared=maybe)

dnl FIXME: Do BSD and OS X need special cases?
            case "$host" in
                *)
                    wayland_client_lib=[`find_lib "libwayland-client.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
                    wayland_egl_lib=[`find_lib "libwayland-egl.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
                    if test x$wayland_egl_lib = x; then
                        # This works in Ubuntu 13.10, maybe others
                        wayland_egl_lib=[`find_lib "mesa-egl/libwayland-egl.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
                    fi
                    wayland_cursor_lib=[`find_lib "libwayland-cursor.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xkbcommon_lib=[`find_lib "libxkbcommon.so.*" "$WAYLAND_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
                    ;;
            esac

            if test x$enable_wayland_shared = xmaybe; then
                enable_wayland_shared=yes
            fi
            if test x$have_loadso != xyes && \
               test x$enable_wayland_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic Wayland loading])
                enable_wayland_shared=no
            fi
            if test x$have_loadso = xyes && \
               test x$enable_wayland_shared = xyes && \
               test x$wayland_client_lib != x && \
               test x$wayland_egl_lib != x && \
               test x$wayland_cursor_lib != x && \
               test x$xkbcommon_lib != x; then
                echo "-- dynamic libwayland-client -> $wayland_client_lib"
                echo "-- dynamic libwayland-egl -> $wayland_egl_lib"
                echo "-- dynamic libwayland-cursor -> $wayland_cursor_lib"
                echo "-- dynamic libxkbcommon -> $xkbcommon_lib"
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC, "$wayland_client_lib", [ ])
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL, "$wayland_egl_lib", [ ])
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR, "$wayland_cursor_lib", [ ])
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON, "$xkbcommon_lib", [ ])
                SUMMARY_video="${SUMMARY_video} wayland(dynamic)"
            else
                enable_wayland_shared=no
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $WAYLAND_LIBS"
                SUMMARY_video="${SUMMARY_video} wayland"
            fi
            have_video=yes

dnl See if libdecor is available
            AC_ARG_ENABLE(libdecor,
[AS_HELP_STRING([--enable-libdecor], [use libdecor for Wayland client-side decorations [default=yes]])],, enable_libdecor=yes)
            if test x$enable_libdecor = xyes; then
                PKG_CHECK_MODULES([DECOR], [libdecor-0], video_libdecor=yes, video_libdecor=no)
                if test x$video_libdecor = xyes; then
                    EXTRA_CFLAGS="$EXTRA_CFLAGS $DECOR_CFLAGS"
                    AC_DEFINE(HAVE_LIBDECOR_H, 1, [ ])

                    AC_ARG_ENABLE(libdecor-shared,
[AS_HELP_STRING([--enable-libdecor-shared], [dynamically load libdecor [default=yes]])],, enable_libdecor_shared=yes)

                    decor_lib=[`find_lib "libdecor-0.so.*" "$DECOR_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]

                    if test x$enable_wayland_shared != xyes; then
                       enable_libdecor_shared=no
                    fi
                    if test x$have_loadso != xyes && \
                       test x$enable_libdecor_shared = xyes; then
                        AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic libdecor loading])
                    fi
                    if test x$have_loadso = xyes && \
                       test x$enable_libdecor_shared = xyes && test x$decor_lib != x; then
                        echo "-- dynamic libdecor -> $decor_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR, "$decor_lib", [ ])
                    else
                        EXTRA_LDFLAGS="$EXTRA_LDFLAGS $DECOR_LIBS"
                    fi
                fi
            fi
        fi
    fi
}

dnl Check for Native Client stuff
CheckNativeClient()
{
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #if !defined(__native_client__)
          #error "NO NACL"
          #endif
        ]],[])], [
        AC_DEFINE(SDL_VIDEO_DRIVER_NACL, 1, [ ])
        AC_DEFINE(SDL_AUDIO_DRIVER_NACL, 1, [ ])
        AC_DEFINE(HAVE_POW, 1, [ ])
        AC_DEFINE(HAVE_OPENGLES2, 1, [ ])
        AC_DEFINE(SDL_VIDEO_OPENGL_ES2, 1, [ ])
        AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES2, 1, [ ])

        SDL_LIBS="-lppapi_simple -lppapi_gles2 $SDL_LIBS"

        SDLMAIN_SOURCES="$srcdir/src/main/nacl/*.c"
        SOURCES="$SOURCES $srcdir/src/audio/nacl/*.c"
        SUMMARY_audio="${SUMMARY_audio} nacl"
        have_audio=yes
        SOURCES="$SOURCES $srcdir/src/video/nacl/*.c"
        SUMMARY_video="${SUMMARY_video} nacl opengles2"
        have_video=yes
        ],[])
}

CheckRPI()
{
    AC_ARG_ENABLE(video-rpi,
[AS_HELP_STRING([--enable-video-rpi], [use Raspberry Pi 2/3 video driver [default=yes]])],
                  , enable_video_rpi=yes)
    if test x$enable_video = xyes -a x$enable_video_rpi = xyes; then
        PKG_CHECK_MODULES([RPI], [bcm_host brcmegl], video_rpi=yes, video_rpi=no)

        if test x$video_rpi = xno; then
            if test x$ARCH = xnetbsd; then
                RPI_CFLAGS="-I/usr/pkg/include -I/usr/pkg/include/interface/vcos/pthreads -I/usr/pkg/include/interface/vmcs_host/linux"
                RPI_LIBS="-Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lbcm_host"
            else
                RPI_CFLAGS="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux"
                RPI_LIBS="-Wl,-rpath,/opt/vc/lib -L/opt/vc/lib -lbcm_host"
            fi
        fi

        # Save the original compiler flags and libraries
        ac_save_cflags="$CFLAGS"; ac_save_libs="$LIBS"

        # Add the Raspberry Pi compiler flags and libraries
        CFLAGS="$CFLAGS $RPI_CFLAGS"; LIBS="$LIBS $RPI_LIBS"

        AC_MSG_CHECKING(for Raspberry Pi 2/3)
        have_video_rpi=no
        AC_LINK_IFELSE([AC_LANG_PROGRAM([[
          #include <bcm_host.h>
          #include <EGL/eglplatform.h>
        ]], [[
          EGL_DISPMANX_WINDOW_T window;
          bcm_host_init();
        ]])], [have_video_rpi=yes],[])
        AC_MSG_RESULT($have_video_rpi)

        # Restore the compiler flags and libraries
        CFLAGS="$ac_save_cflags"; LIBS="$ac_save_libs"

        if test x$have_video_rpi = xyes; then
            CFLAGS="$CFLAGS $RPI_CFLAGS"
            SDL_CFLAGS="$SDL_CFLAGS $RPI_CFLAGS"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $RPI_CFLAGS"
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS $RPI_LIBS"
            SOURCES="$SOURCES $srcdir/src/video/raspberry/*.c"
            AC_DEFINE(SDL_VIDEO_DRIVER_RPI, 1, [ ])
            SUMMARY_video="${SUMMARY_video} rpi"
            have_video=yes
        fi
    fi
}

dnl Find the X11 include and library directories
CheckX11()
{
    AC_ARG_ENABLE(video-x11,
[AS_HELP_STRING([--enable-video-x11], [use X11 video driver [default=yes]])],
                  , enable_video_x11=yes)
    if test x$enable_video = xyes -a x$enable_video_x11 = xyes; then
        case "$host" in
            *-*-darwin*)
                # This isn't necessary for X11, but fixes GLX detection
                if test "x$x_includes" = xNONE && \
                   test "x$x_libraries" = xNONE && \
                   test -d /opt/X11/include && \
                   test -d /opt/X11/lib; then
                    x_includes="/opt/X11/include"
                    x_libraries="/opt/X11/lib"
                fi
                ;;
        esac
        AC_PATH_X
        AC_PATH_XTRA
        if test x$have_x = xyes; then
            AC_ARG_ENABLE(x11-shared,
[AS_HELP_STRING([--enable-x11-shared], [dynamically load X11 support [default=maybe]])],
                          , enable_x11_shared=maybe)

            case "$host" in
                *-*-darwin*)
                    # Apple now puts this in /opt/X11
                    x11_lib='/opt/X11/lib/libX11.6.dylib'
                    x11ext_lib='/opt/X11/lib/libXext.6.dylib'
                    xcursor_lib='/opt/X11/lib/libXcursor.1.dylib'
                    xinerama_lib='/opt/X11/lib/libXinerama.1.dylib'
                    xinput_lib='/opt/X11/lib/libXi.6.dylib'
                    xfixes_lib='/opt/X11/lib/libXfixes.3.dylib'
                    xrandr_lib='/opt/X11/lib/libXrandr.2.dylib'
                    xrender_lib='/opt/X11/lib/libXrender.1.dylib'
                    xss_lib='/opt/X11/lib/libXss.1.dylib'
                    xvidmode_lib='/opt/X11/lib/libXxf86vm.1.dylib'
                    ;;
                *-*-openbsd*)
                    x11_lib='libX11.so'
                    x11ext_lib='libXext.so'
                    xcursor_lib='libXcursor.so'
                    xinerama_lib='libXinerama.so'
                    xinput_lib='libXi.so'
                    xfixes_lib='libXfixes.so'
                    xrandr_lib='libXrandr.so'
                    xrender_lib='libXrender.so'
                    xss_lib='libXss.so'
                    xvidmode_lib='libXxf86vm.so'
                    ;;
                *)
                    x11_lib=[`find_lib "libX11.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    x11ext_lib=[`find_lib "libXext.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xcursor_lib=[`find_lib "libXcursor.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xinerama_lib=[`find_lib "libXinerama.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xinput_lib=[`find_lib "libXi.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xfixes_lib=[`find_lib "libXfixes.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xrandr_lib=[`find_lib "libXrandr.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xrender_lib=[`find_lib "libXrender.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xss_lib=[`find_lib "libXss.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    xvidmode_lib=[`find_lib "libXxf86vm.so.*" "$X_LIBS -L/usr/X11/$base_libdir -L/usr/X11R6/$base_libdir" | sed 's/.*\/\(.*\)/\1/; q'`]
                    ;;
            esac

            if test x$ac_cv_func_shmat != xyes; then
                X_CFLAGS="$X_CFLAGS -DNO_SHARED_MEMORY"
            fi
            CFLAGS="$CFLAGS $X_CFLAGS"
            LDFLAGS="$LDFLAGS $X_LIBS"

            AC_CHECK_HEADER(X11/extensions/Xext.h,
                            have_xext_h_hdr=yes,
                            have_xext_h_hdr=no,
                            [#include <X11/Xlib.h>
                             #include <X11/Xproto.h>
                            ])
            if test x$have_xext_h_hdr != xyes; then
               AC_MSG_ERROR([
*** Missing Xext.h, maybe you need to install the libxext-dev package?
               ])
            fi

            AC_DEFINE(SDL_VIDEO_DRIVER_X11, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/x11/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $X_CFLAGS"

            # Needed so SDL applications can include SDL_syswm.h
            SDL_CFLAGS="$SDL_CFLAGS $X_CFLAGS"

            if test x$enable_x11_shared = xmaybe; then
                enable_x11_shared=yes
            fi
            if test x$have_loadso != xyes && \
               test x$enable_x11_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic X11 loading])
                enable_x11_shared=no
            fi
            if test x$have_loadso = xyes && \
               test x$enable_x11_shared = xyes && test x$x11_lib != x && test x$x11ext_lib != x; then
                echo "-- dynamic libX11 -> $x11_lib"
                echo "-- dynamic libX11ext -> $x11ext_lib"
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC, "$x11_lib", [ ])
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT, "$x11ext_lib", [ ])
                SUMMARY_video="${SUMMARY_video} x11(dynamic)"
            else
                enable_x11_shared=no
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $X_LIBS -lX11 -lXext"
                SUMMARY_video="${SUMMARY_video} x11"
            fi
            have_video=yes

            AC_MSG_CHECKING([for XGenericEvent])
            have_XGenericEvent=no
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                #include <X11/Xlib.h>
            ]], [[
Display *display;
XEvent event;
XGenericEventCookie *cookie = &event.xcookie;
XNextEvent(display, &event);
XGetEventData(display, cookie);
XFreeEventData(display, cookie);
            ]])], [
                have_XGenericEvent=yes
                AC_DEFINE([SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS], 1, [ ])
            ],[])
            AC_MSG_RESULT($have_XGenericEvent)

            AC_CHECK_LIB(X11, XkbKeycodeToKeysym, AC_DEFINE(SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM, 1, [Have XkbKeycodeToKeysym]))

            AC_ARG_ENABLE(video-x11-xcursor,
[AS_HELP_STRING([--enable-video-x11-xcursor], [enable X11 Xcursor support [default=yes]])],
                            , enable_video_x11_xcursor=yes)
            if test x$enable_video_x11_xcursor = xyes; then
                definitely_enable_video_x11_xcursor=no
                AC_CHECK_HEADER(X11/Xcursor/Xcursor.h,
                                have_xcursor_h_hdr=yes,
                                have_xcursor_h_hdr=no,
                                [#include <X11/Xlib.h>
                                ])
                if test x$have_xcursor_h_hdr = xyes; then
                    if test x$enable_x11_shared = xyes && test x$xcursor_lib != x ; then
                        echo "-- dynamic libXcursor -> $xcursor_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR, "$xcursor_lib", [ ])
                        definitely_enable_video_x11_xcursor=yes
                    else
                        AC_CHECK_LIB(Xcursor, XcursorImageCreate, have_xcursor_lib=yes)
                        if test x$have_xcursor_lib = xyes ; then
                            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXcursor"
                            definitely_enable_video_x11_xcursor=yes
                        fi
                    fi
                fi
            fi
            if test x$definitely_enable_video_x11_xcursor = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_X11_XCURSOR, 1, [ ])
                SUMMARY_video_x11="${SUMMARY_video_x11} xcursor"
            fi
            AC_ARG_ENABLE(video-x11-xdbe,
[AS_HELP_STRING([--enable-video-x11-xdbe], [enable X11 Xdbe support [default=yes]])],
                            , enable_video_x11_xdbe=yes)
            if test x$enable_video_x11_xdbe = xyes; then
                AC_CHECK_HEADER(X11/extensions/Xdbe.h,
                                have_dbe_h_hdr=yes,
                                have_dbe_h_hdr=no,
                                [#include <X11/Xlib.h>
                                ])
                if test x$have_dbe_h_hdr = xyes; then
                    AC_DEFINE(SDL_VIDEO_DRIVER_X11_XDBE, 1, [ ])
                    SUMMARY_video_x11="${SUMMARY_video_x11} xdbe"
                fi
            fi
            AC_ARG_ENABLE(video-x11-xinerama,
[AS_HELP_STRING([--enable-video-x11-xinerama], [enable X11 Xinerama support [default=yes]])],
                            , enable_video_x11_xinerama=yes)
            if test x$enable_video_x11_xinerama = xyes; then
                definitely_enable_video_x11_xinerama=no
                AC_CHECK_HEADER(X11/extensions/Xinerama.h,
                                have_xinerama_h_hdr=yes,
                                have_xinerama_h_hdr=no,
                                [#include <X11/Xlib.h>
                                ])
                if test x$have_xinerama_h_hdr = xyes; then
                    if test x$enable_x11_shared = xyes && test x$xinerama_lib != x ; then
                        echo "-- dynamic libXinerama -> $xinerama_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA, "$xinerama_lib", [ ])
                        definitely_enable_video_x11_xinerama=yes
                    else
                        AC_CHECK_LIB(Xinerama, XineramaQueryExtension, have_xinerama_lib=yes)
                        if test x$have_xinerama_lib = xyes ; then
                            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXinerama"
                            definitely_enable_video_x11_xinerama=yes
                        fi
                    fi
                fi
            fi
            if test x$definitely_enable_video_x11_xinerama = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_X11_XINERAMA, 1, [ ])
                SUMMARY_video_x11="${SUMMARY_video_x11} xinerama"
            fi
            AC_ARG_ENABLE(video-x11-xinput,
[AS_HELP_STRING([--enable-video-x11-xinput], [enable X11 XInput extension for manymouse, tablets, etc [default=yes]])],
                            , enable_video_x11_xinput=yes)
            if test x$enable_video_x11_xinput = xyes; then
                definitely_enable_video_x11_xinput=no
                AC_CHECK_HEADER(X11/extensions/XInput2.h,
                                have_xinput_h_hdr=yes,
                                have_xinput_h_hdr=no,
                                [#include <X11/Xlib.h>
                                ])
                if test x$have_xinput_h_hdr = xyes; then
                    if test x$enable_x11_shared = xyes && test x$xinput_lib != x ; then
                        echo "-- dynamic libXi -> $xinput_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2, "$xinput_lib", [ ])
                        definitely_enable_video_x11_xinput=yes
                    else
                        AC_CHECK_LIB(Xi, XOpenDevice, have_xinput_lib=yes)
                        if test x$have_xinput_lib = xyes ; then
                            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXi"
                            definitely_enable_video_x11_xinput=yes
                        fi
                    fi
                fi
            fi
            if test x$definitely_enable_video_x11_xinput = xyes; then
                SUMMARY_video_x11="${SUMMARY_video_x11} xinput2"
                AC_DEFINE(SDL_VIDEO_DRIVER_X11_XINPUT2, 1, [ ])
                AC_MSG_CHECKING(for xinput2 multitouch)
                have_xinput2_multitouch=no
                AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                    #include <X11/Xlib.h>
                    #include <X11/Xproto.h>
                    #include <X11/extensions/XInput2.h>
                    ]], [[
int event_type = XI_TouchBegin;
XITouchClassInfo *t;
                    ]])], [
                    have_xinput2_multitouch=yes
                    AC_DEFINE([SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH], 1, [ ])
                    SUMMARY_video_x11="${SUMMARY_video_x11} xinput2_multitouch"
                    ],[])
                AC_MSG_RESULT($have_xinput2_multitouch)
            fi
            AC_ARG_ENABLE(video-x11-xfixes,
[AS_HELP_STRING([--enable-video-x11-xfixes], [enable X11 Xfixes support [default=yes]])],
                            , enable_video_x11_xfixes=yes)
            if test x$enable_video_x11_xfixes = xyes; then
                definitely_enable_video_x11_xfixes=no
                # check along with XInput2.h because we use Xfixes with XIBarrierReleasePointer
                AC_MSG_CHECKING(for X11/extensions/Xfixes.h)
                AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                    #include <X11/Xlib.h>
                    #include <X11/Xproto.h>
                    #include <X11/extensions/XInput2.h>
                    #include <X11/extensions/Xfixes.h>]],
                    [BarrierEventID b;])],
                    [have_xfixes_h_hdr=yes],
                    [have_xfixes_h_hdr=no])
                AC_MSG_RESULT($have_xfixes_h_hdr)
                if test x$have_xfixes_h_hdr = xyes; then
                    if test x$enable_x11_shared = xyes && test x$xfixes_lib != x ; then
                        echo "-- dynamic libXfixes -> $xfixes_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES, "$xfixes_lib", [ ])
                        definitely_enable_video_x11_xfixes=yes
                    else
                        AC_CHECK_LIB(Xfixes, XFixesCreatePointerBarrier, have_xfixes_lib=yes)
                        if test x$have_xfixes_lib = xyes ; then
                            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXfixes"
                            definitely_enable_video_x11_xfixes=yes
                        fi
                    fi
                fi
            fi
            if test x$definitely_enable_video_x11_xfixes = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_X11_XFIXES, 1, [ ])
                SUMMARY_video_x11="${SUMMARY_video_x11} xfixes"
            fi
            AC_ARG_ENABLE(video-x11-xrandr,
[AS_HELP_STRING([--enable-video-x11-xrandr], [enable X11 Xrandr extension for fullscreen [default=yes]])],
                            , enable_video_x11_xrandr=yes)
            if test x$enable_video_x11_xrandr = xyes; then
dnl             XRRScreenResources is only present in Xrandr >= 1.2, we use that as a test.
                definitely_enable_video_x11_xrandr=no
                have_xrandr_h_hdr=no
                AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                #include <X11/Xlib.h>
                #include <X11/extensions/Xrandr.h>
                ]], [[
                XRRScreenResources *res = NULL;
                ]])], [have_xrandr_h_hdr=yes],[])
                if test x$have_xrandr_h_hdr = xyes; then
                    if test x$enable_x11_shared = xyes && test x$xrandr_lib != x ; then
                        echo "-- dynamic libXrandr -> $xrandr_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR, "$xrandr_lib", [ ])
                        definitely_enable_video_x11_xrandr=yes
                    else
                        AC_CHECK_LIB(Xrandr, XRRQueryExtension, have_xrandr_lib=yes)
                        if test x$have_xrandr_lib = xyes ; then
                            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXrandr"
                            definitely_enable_video_x11_xrandr=yes
                        fi
                    fi
                fi
            fi
            if test x$definitely_enable_video_x11_xrandr = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_X11_XRANDR, 1, [ ])
                SUMMARY_video_x11="${SUMMARY_video_x11} xrandr"
            fi
            AC_ARG_ENABLE(video-x11-scrnsaver,
[AS_HELP_STRING([--enable-video-x11-scrnsaver], [enable X11 screensaver extension [default=yes]])],
                            , enable_video_x11_scrnsaver=yes)
            if test x$enable_video_x11_scrnsaver = xyes; then
                AC_CHECK_HEADER(X11/extensions/scrnsaver.h,
                                have_scrnsaver_h_hdr=yes,
                                have_scrnsaver_h_hdr=no,
                                [#include <X11/Xlib.h>
                                ])
                if test x$have_scrnsaver_h_hdr = xyes; then
                    if test x$enable_x11_shared = xyes && test x$xss_lib != x ; then
                        echo "-- dynamic libXss -> $xss_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS, "$xss_lib", [ ])
                        definitely_enable_video_x11_scrnsaver=yes
                    else
                        AC_CHECK_LIB(Xss, XScreenSaverSuspend, have_xss_lib=yes)
                        if test x$have_xss_lib = xyes ; then
                            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXss"
                            definitely_enable_video_x11_scrnsaver=yes
                        fi
                    fi
                fi
            fi
            if test x$definitely_enable_video_x11_scrnsaver = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_X11_XSCRNSAVER, 1, [ ])
                SUMMARY_video_x11="${SUMMARY_video_x11} xscrnsaver"
            fi
            AC_ARG_ENABLE(video-x11-xshape,
[AS_HELP_STRING([--enable-video-x11-xshape], [enable X11 XShape support [default=yes]])],
                            , enable_video_x11_xshape=yes)
            if test x$enable_video_x11_xshape = xyes; then
                AC_CHECK_HEADER(X11/extensions/shape.h,
                                have_shape_h_hdr=yes,
                                have_shape_h_hdr=no,
                                [#include <X11/Xlib.h>
                                ])
                if test x$have_shape_h_hdr = xyes; then
                    AC_DEFINE(SDL_VIDEO_DRIVER_X11_XSHAPE, 1, [ ])
                    SUMMARY_video_x11="${SUMMARY_video_x11} xshape"
                fi
            fi
            AC_ARG_ENABLE(video-x11-vm,
[AS_HELP_STRING([--enable-video-x11-vm], [use X11 VM extension for fullscreen [default=yes]])],
                            , enable_video_x11_vm=yes)
            if test x$enable_video_x11_vm = xyes; then
                definitely_enable_video_x11_vm=no
                AC_CHECK_HEADER(X11/extensions/xf86vmode.h,
                                have_vm_h_hdr=yes,
                                have_vm_h_hdr=no,
                                [#include <X11/Xlib.h>
                                ])
                if test x$have_vm_h_hdr = xyes; then
                    if test x$enable_x11_shared = xyes && test x$xvidmode_lib != x ; then
                        echo "-- dynamic libXxf86vm -> $xvidmode_lib"
                        AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE, "$xvidmode_lib", [ ])
                        definitely_enable_video_x11_vm=yes
                    else
                        AC_CHECK_LIB(Xxf86vm, XF86VidModeQueryVersion, have_vm_lib=yes)
                        if test x$have_vm_lib = xyes ; then
                            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXxf86vm"
                            definitely_enable_video_x11_vm=yes
                        fi
                    fi
                fi
            fi
            if test x$definitely_enable_video_x11_vm = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_X11_XVIDMODE, 1, [ ])
                SUMMARY_video_x11="${SUMMARY_video_x11} xvidmode"
            fi
        fi
    fi
    if test x$have_x != xyes; then
        # Prevent Mesa from including X11 headers
        EXTRA_CFLAGS="$EXTRA_CFLAGS -DMESA_EGL_NO_X11_HEADERS -DEGL_NO_X11"
    fi
}

dnl Set up the Vivante video driver if enabled
CheckVivanteVideo()
{
    AC_ARG_ENABLE(video-vivante,
[AS_HELP_STRING([--enable-video-vivante], [use Vivante EGL video driver [default=yes]])],
                  , enable_video_vivante=yes)
    if test x$enable_video = xyes -a x$enable_video_vivante = xyes; then
        AC_MSG_CHECKING(for Vivante VDK API)
        have_vivante_vdk=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #define LINUX
          #define EGL_API_FB
          #include <gc_vdk.h>
        ]],[])], [have_vivante_vdk=yes],[])
        AC_MSG_RESULT($have_vivante_vdk)

        AC_MSG_CHECKING(for Vivante FB API)
        have_vivante_egl=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #define LINUX
          #define EGL_API_FB
          #include <EGL/eglvivante.h>
        ]],[])], [have_vivante_egl=yes],[])
        AC_MSG_RESULT($have_vivante_egl)

        if test x$have_vivante_vdk = xyes -o x$have_vivante_egl = xyes; then
            AC_DEFINE(SDL_VIDEO_DRIVER_VIVANTE, 1, [ ])
            EXTRA_CFLAGS="$EXTRA_CFLAGS -DLINUX -DEGL_API_FB"
            if test x$have_vivante_vdk = xyes; then
                AC_DEFINE(SDL_VIDEO_DRIVER_VIVANTE_VDK, 1, [ ])
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lVDK"
            fi
            SOURCES="$SOURCES $srcdir/src/video/vivante/*.c"
            SUMMARY_video="${SUMMARY_video} vivante"
            have_video=yes
        fi
    fi
}

dnl Set up the Haiku video driver if enabled
CheckHaikuVideo()
{
    if test x$enable_video = xyes; then
        AC_DEFINE(SDL_VIDEO_DRIVER_HAIKU, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/video/haiku/*.cc"
        have_video=yes
        SUMMARY_video="${SUMMARY_video} haiku"
    fi
}

dnl Set up the Cocoa video driver for Mac OS X (but not Darwin)
CheckCOCOA()
{
    AC_ARG_ENABLE(video-cocoa,
[AS_HELP_STRING([--enable-video-cocoa], [use Cocoa video driver [default=yes]])],
                  , enable_video_cocoa=yes)
    if test x$enable_video = xyes -a x$enable_video_cocoa = xyes; then
        save_CFLAGS="$CFLAGS"
dnl     Work around that we don't have Objective-C support in autoconf
        CFLAGS="$CFLAGS -x objective-c"
        AC_MSG_CHECKING(for Cocoa framework)
        have_cocoa=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #import <Cocoa/Cocoa.h>
        ]],[])], [have_cocoa=yes],[])
        AC_MSG_RESULT($have_cocoa)
        CFLAGS="$save_CFLAGS"
        if test x$have_cocoa = xyes; then
            AC_DEFINE(SDL_VIDEO_DRIVER_COCOA, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/cocoa/*.m"
            SUMMARY_video="${SUMMARY_video} cocoa"
            have_video=yes
        fi
    fi
}

CheckMETAL()
{
    AC_ARG_ENABLE(video-metal,
[AS_HELP_STRING([--enable-video-metal], [include Metal support [default=yes]])],
              , enable_video_metal=yes)
    AC_ARG_ENABLE(render-metal,
[AS_HELP_STRING([--enable-render-metal], [enable the Metal render driver [default=yes]])],
                                , enable_render_metal=yes)
    if test x$enable_video = xyes -a x$enable_video_metal = xyes; then
        save_CFLAGS="$CFLAGS"
dnl     Work around that we don't have Objective-C support in autoconf
        CFLAGS="$CFLAGS -x objective-c"
        AC_MSG_CHECKING(for Metal framework)
        have_metal=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #import <Cocoa/Cocoa.h>
          #import <Metal/Metal.h>
          #import <QuartzCore/CAMetalLayer.h>

          #if TARGET_CPU_X86
          #error Metal doesn't work on this configuration
          #endif
        ]],[])], [have_metal=yes],[])
        CFLAGS="$save_CFLAGS"
        AC_MSG_RESULT($have_metal)
        if test x$have_metal = xyes; then
            AC_DEFINE(SDL_VIDEO_METAL, 1, [ ])
            if test x$enable_render = xyes -a x$enable_render_metal = xyes; then
                AC_DEFINE(SDL_VIDEO_RENDER_METAL, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/render/metal/*.m"
            fi
            SUMMARY_video="${SUMMARY_video} metal"
        else
            enable_video_metal=no
            enable_render_metal=no
        fi
    fi
}

dnl Find DirectFB
CheckDirectFB()
{
    AC_ARG_ENABLE(video-directfb,
[AS_HELP_STRING([--enable-video-directfb], [use DirectFB video driver [default=no]])],
                  , enable_video_directfb=no)
    if test x$enable_video = xyes -a x$enable_video_directfb = xyes; then
        PKG_CHECK_MODULES([DIRECTFB], [directfb >= 1.0.0], video_directfb=yes, video_directfb=no)

        if test x$video_directfb = xyes; then
            # SuSE 11.1 installs directfb-config without directfb-devel
            save_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS="$CPPFLAGS $DIRECTFB_CFLAGS"
            AC_CHECK_HEADER(directfb.h, have_directfb_hdr=yes, have_directfb_hdr=no)
            CPPFLAGS="$save_CPPFLAGS"
            video_directfb=$have_directfb_hdr
        fi

        if test x$video_directfb = xyes; then
            AC_ARG_ENABLE(directfb-shared,
[AS_HELP_STRING([--enable-directfb-shared], [dynamically load directfb support [default=yes]])],
                              , enable_directfb_shared=yes)

            AC_DEFINE(SDL_VIDEO_DRIVER_DIRECTFB, 1, [ ])
            AC_DEFINE(SDL_VIDEO_RENDER_DIRECTFB, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/directfb/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $DIRECTFB_CFLAGS"

            directfb_shared=no
            directfb_lib=[`find_lib "libdirectfb*.so.*" "$DIRECTFB_LIBS" | sed 's/.*\/\(.*\)/\1/; q'`]
            if test x$have_loadso != xyes && \
               test x$enable_directfb_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic directfb loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_directfb_shared = xyes && test x$directfb_lib != x; then
                directfb_shared=yes
                echo "-- dynamic libdirectfb -> $directfb_lib"
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC, "$directfb_lib", [ ])
                SUMMARY_video="${SUMMARY_video} directfb(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $DIRECTFB_LIBS"
                SUMMARY_video="${SUMMARY_video} directfb"
            fi
            SDL_CFLAGS="$SDL_CFLAGS $DIRECTFB_CFLAGS"
            have_video=yes
        fi
    fi
}

dnl Find KMSDRM
CheckKMSDRM()
{
    AC_ARG_ENABLE(video-kmsdrm,
[AS_HELP_STRING([--enable-video-kmsdrm], [use KMSDRM video driver [default=yes]])],
                  , enable_video_kmsdrm=yes)

    if  test x$enable_video = xyes && \
        test x$enable_video_kmsdrm = xyes && \
        test x$video_opengl_egl = xyes; then

        video_kmsdrm=no

        PKG_CHECK_MODULES([LIBDRM], [libdrm >= 1.4.82], libdrm_avail=yes, libdrm_avail=no)
        PKG_CHECK_MODULES([LIBGBM], [gbm >= 11.1.0], libgbm_avail=yes, libgbm_avail=no)

        if test x$libdrm_avail = xyes -a x$libgbm_avail = xyes; then
            video_kmsdrm=yes
        fi

        if test x$video_kmsdrm = xyes; then
            AC_ARG_ENABLE(kmsdrm-shared,
[AS_HELP_STRING([--enable-kmsdrm-shared], [dynamically load kmsdrm support [default=yes]])],
                , enable_kmsdrm_shared=yes)

            AC_DEFINE(SDL_VIDEO_DRIVER_KMSDRM, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/kmsdrm/*.c"
            EXTRA_CFLAGS="$EXTRA_CFLAGS $LIBDRM_CFLAGS $LIBGBM_CFLAGS"

            AC_MSG_CHECKING(for kmsdrm dynamic loading support)
            kmsdrm_shared=no
            drm_lib=[`find_lib "libdrm.so.*" "$LIBDRM_LIBS"`]
            gbm_lib=[`find_lib "libgbm.so.*" "$LIBGBM_LIBS"`]
            if test x$have_loadso != xyes && \
               test x$enable_kmsdrm_shared = xyes; then
                AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic kmsdrm loading])
            fi
            if test x$have_loadso = xyes && \
               test x$enable_kmsdrm_shared = xyes && test x$drm_lib != x && test x$gbm_lib != x; then
                kmsdrm_shared=yes
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC, "$drm_lib", [ ])
                AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM, "$gbm_lib", [ ])
                AC_DEFINE_UNQUOTED(HAVE_KMSDRM_SHARED, "TRUE", [ ])
                SUMMARY_video="${SUMMARY_video} kmsdrm(dynamic)"
            else
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS $LIBDRM_LIBS $LIBGBM_LIBS"
                SUMMARY_video="${SUMMARY_video} kmsdrm"
            fi
            AC_MSG_RESULT($kmsdrm_shared)
            if test x$kmsdrm_shared = xyes; then
                echo "-- dynamic libdrm -> $drm_lib"
                echo "-- dynamic libgbm -> $gbm_lib"
            fi
            have_video=yes
        fi
    fi
}

dnl rcg04172001 Set up the Null video driver.
CheckDummyVideo()
{
    AC_ARG_ENABLE(video-dummy,
[AS_HELP_STRING([--enable-video-dummy], [use dummy video driver [default=yes]])],
                  , enable_video_dummy=yes)
    if test x$enable_video_dummy = xyes; then
        AC_DEFINE(SDL_VIDEO_DRIVER_DUMMY, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/video/dummy/*.c"
        have_video=yes
        SUMMARY_video="${SUMMARY_video} dummy"
    fi
}

CheckOffscreenVideo()
{
    AC_ARG_ENABLE(video-offscreen,
[AS_HELP_STRING([--enable-video-offscreen], [use offscreen video driver [default=no]])],
                  , enable_video_offscreen=no)
    if test x$enable_video_offscreen = xyes; then
        AC_DEFINE(SDL_VIDEO_DRIVER_OFFSCREEN, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/video/offscreen/*.c"
        have_video=yes
        SUMMARY_video="${SUMMARY_video} offscreen"
    fi
}

dnl Set up the QNX video driver if enabled
CheckQNXVideo()
{
    if test x$enable_video = xyes; then
        AC_DEFINE(SDL_VIDEO_DRIVER_QNX, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/video/qnx/*.c"
        have_video=yes
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lscreen -lEGL -lGLESv2"
        SUMMARY_video="${SUMMARY_video} qnx"
    fi
}

dnl Set up the QNX audio driver if enabled
CheckQNXAudio()
{
    if test x$enable_audio = xyes; then
        AC_DEFINE(SDL_AUDIO_DRIVER_QSA, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/audio/qsa/*.c"
        have_audio=yes
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lasound"
        SUMMARY_audio="${SUMMARY_audio} qsa"
    fi
}

dnl Check to see if OpenGL support is desired
AC_ARG_ENABLE(video-opengl,
[AS_HELP_STRING([--enable-video-opengl], [include OpenGL support [default=yes]])],
              , enable_video_opengl=yes)

dnl Find GLX
CheckGLX()
{
    if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
        AC_MSG_CHECKING(for GLX support)
        video_opengl_glx=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
         #include <GL/glx.h>
        ]],[])], [video_opengl_glx=yes],[])
        AC_MSG_RESULT($video_opengl_glx)
        if test x$video_opengl_glx = xyes; then
            AC_DEFINE(SDL_VIDEO_OPENGL, 1, [ ])
            AC_DEFINE(SDL_VIDEO_OPENGL_GLX, 1, [ ])
        fi
    fi
}

dnl Check to see if OpenGL ES support is desired
AC_ARG_ENABLE(video-opengles,
[AS_HELP_STRING([--enable-video-opengles], [include OpenGL ES support [default=yes]])],
              , enable_video_opengles=yes)
AC_ARG_ENABLE(video-opengles1,
[AS_HELP_STRING([--enable-video-opengles1], [include OpenGL ES 1.1 support [default=yes]])],
              , enable_video_opengles1=yes)
AC_ARG_ENABLE(video-opengles2,
[AS_HELP_STRING([--enable-video-opengles2], [include OpenGL ES 2.0 support [default=yes]])],
              , enable_video_opengles2=yes)

dnl Find EGL
CheckEGL()
{
    if test x$enable_video = xyes -a x$enable_video_opengl = xyes || test x$enable_video = xyes -a x$enable_video_opengles = xyes; then
        AC_MSG_CHECKING(for EGL support)
        video_opengl_egl=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #define LINUX
          #define EGL_API_FB
          #define MESA_EGL_NO_X11_HEADERS
          #define EGL_NO_X11
          #include <EGL/egl.h>
          #include <EGL/eglext.h>
        ]],[])], [video_opengl_egl=yes],[])
        AC_MSG_RESULT($video_opengl_egl)
        if test x$video_opengl_egl = xyes; then
            AC_DEFINE(SDL_VIDEO_OPENGL_EGL, 1, [ ])
        fi
    fi
}

dnl Find OpenGL
CheckOpenGL()
{
    if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
        AC_MSG_CHECKING(for OpenGL headers)
        video_opengl=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
         #include <GL/gl.h>
         #include <GL/glext.h>
        ]],[])], [video_opengl=yes],[])
        AC_MSG_RESULT($video_opengl)
        if test x$video_opengl = xyes; then 
            AC_DEFINE(SDL_VIDEO_OPENGL, 1, [ ])
            AC_DEFINE(SDL_VIDEO_RENDER_OGL, 1, [ ])
            SUMMARY_video="${SUMMARY_video} opengl"
        fi
    fi
}

dnl Find OpenGL ES
CheckOpenGLES()
{
    if test x$enable_video = xyes -a x$enable_video_opengles = xyes; then
        if test x$enable_video_opengles1 = xyes; then
            AC_MSG_CHECKING(for OpenGL ES v1 headers)
            video_opengles_v1=no
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
             #include <GLES/gl.h>
             #include <GLES/glext.h>
            ]],[])], [video_opengles_v1=yes],[])
            AC_MSG_RESULT($video_opengles_v1)
            if test x$video_opengles_v1 = xyes; then
                AC_DEFINE(SDL_VIDEO_OPENGL_ES, 1, [ ])
                AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES, 1, [ ])
                SUMMARY_video="${SUMMARY_video} opengl_es1"
            fi
        fi

        if test x$enable_video_opengles2 = xyes; then
            AC_MSG_CHECKING(for OpenGL ES v2 headers)
            video_opengles_v2=no
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
             #include <GLES2/gl2.h>
             #include <GLES2/gl2ext.h>
            ]],[])], [video_opengles_v2=yes],[])
            AC_MSG_RESULT($video_opengles_v2)
            if test x$video_opengles_v2 = xyes; then
                AC_DEFINE(SDL_VIDEO_OPENGL_ES2, 1, [ ])
                AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES2, 1, [ ])
                SUMMARY_video="${SUMMARY_video} opengl_es2"
            fi
        fi
    fi
}

dnl Check for Windows OpenGL
CheckWINDOWSGL()
{
    if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
        AC_DEFINE(SDL_VIDEO_OPENGL, 1, [ ])
        AC_DEFINE(SDL_VIDEO_OPENGL_WGL, 1, [ ])
        AC_DEFINE(SDL_VIDEO_RENDER_OGL, 1, [ ])
        SUMMARY_video="${SUMMARY_video} opengl"
    fi
}

dnl Check for Windows OpenGL
CheckWINDOWSGLES()
{
    if test x$enable_video = xyes -a x$enable_video_opengles = xyes; then

        AC_MSG_CHECKING(for EGL support)
        video_opengl_egl=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
         #include <EGL/egl.h>
        ]],[])], [video_opengl_egl=yes],[])
        AC_MSG_RESULT($video_opengl_egl)
        if test x$video_opengl_egl = xyes; then
            AC_DEFINE(SDL_VIDEO_OPENGL, 1, [ ])
            AC_DEFINE(SDL_VIDEO_OPENGL_EGL, 1, [ ])
            SUMMARY_video="${SUMMARY_video} opengl_es1"
        fi

        AC_MSG_CHECKING(for OpenGL ES v2 headers)
        video_opengles_v2=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
         #include <GLES2/gl2.h>
         #include <GLES2/gl2ext.h>
        ]],[])], [video_opengles_v2=yes],[])
        AC_MSG_RESULT($video_opengles_v2)
        if test x$video_opengles_v2 = xyes; then
            AC_DEFINE(SDL_VIDEO_OPENGL, 1, [ ])
            AC_DEFINE(SDL_VIDEO_OPENGL_ES2, 1, [ ])
            AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES2, 1, [ ])
            SUMMARY_video="${SUMMARY_video} opengl_es2"
        fi
    fi
}

dnl Check for Haiku OpenGL
CheckHaikuGL()
{
    if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
        AC_DEFINE(SDL_VIDEO_OPENGL, 1, [ ])
        AC_DEFINE(SDL_VIDEO_OPENGL_HAIKU, 1, [ ])
        AC_DEFINE(SDL_VIDEO_RENDER_OGL, 1, [ ])
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lGL"
        SUMMARY_video="${SUMMARY_video} opengl"
    fi
}

dnl Check for MacOS OpenGL
CheckMacGL()
{
    if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
        AC_DEFINE(SDL_VIDEO_OPENGL, 1, [ ])
        AC_DEFINE(SDL_VIDEO_OPENGL_CGL, 1, [ ])
        AC_DEFINE(SDL_VIDEO_RENDER_OGL, 1, [ ])
        SUMMARY_video="${SUMMARY_video} opengl"
    fi
}

dnl Check for MacOS OpenGLES
CheckMacGLES()
{
    if test x$enable_video = xyes -a x$enable_video_opengles = xyes; then
        video_opengl_egl=yes
        AC_DEFINE(SDL_VIDEO_OPENGL_EGL, 1, [ ])
        video_opengles_v2=yes
        AC_DEFINE(SDL_VIDEO_OPENGL_ES2, 1, [ ])
        AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES2, 1, [ ])
        SUMMARY_video="${SUMMARY_video} opengl_es2"
    fi
}

CheckEmscriptenGLES()
{
    if test x$enable_video = xyes -a x$enable_video_opengles = xyes; then
        AC_MSG_CHECKING(for EGL support)
        video_opengl_egl=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
         #include <EGL/egl.h>
        ]],[])], [video_opengl_egl=yes],[])
        AC_MSG_RESULT($video_opengl_egl)
        if test x$video_opengl_egl = xyes; then
            AC_DEFINE(SDL_VIDEO_OPENGL_EGL, 1, [ ])
        fi

        AC_MSG_CHECKING(for OpenGL ES v2 headers)
        video_opengles_v2=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
         #include <GLES2/gl2.h>
         #include <GLES2/gl2ext.h>
        ]],[])], [video_opengles_v2=yes],[])
        AC_MSG_RESULT($video_opengles_v2)
        if test x$video_opengles_v2 = xyes; then
            AC_DEFINE(SDL_VIDEO_OPENGL_ES2, 1, [ ])
            AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES2, 1, [ ])
            SUMMARY_video="${SUMMARY_video} opengl_es2"
        fi
    fi
}

dnl Check to see if Vulkan support is desired
AC_ARG_ENABLE(video-vulkan,
[AS_HELP_STRING([--enable-video-vulkan], [include Vulkan support [default=yes]])],
              , enable_video_vulkan=yes)

dnl Find Vulkan Header
CheckVulkan()
{
    if test x$enable_video = xyes -a x$enable_video_vulkan = xyes; then
        case "$host" in
            *-*-android*)
                AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                  #if defined(__ARM_ARCH) && __ARM_ARCH < 7
                  #error Vulkan doesn't work on this configuration
                  #endif
                ]],[])], [],[enable_video_vulkan=no])
                ;;
            *-*-darwin*)
                save_CFLAGS="$CFLAGS"
dnl             Work around that we don't have Objective-C support in autoconf
                CFLAGS="$CFLAGS -x objective-c"
                AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                  #include <Cocoa/Cocoa.h>
                  #include <Metal/Metal.h>
                  #include <QuartzCore/CAMetalLayer.h>

                  #if TARGET_CPU_X86
                  #error Vulkan doesn't work on this configuration
                  #endif
                ]],[])], [],[enable_video_vulkan=no])
                CFLAGS="$save_CFLAGS"
                ;;
            *)
                ;;
        esac
        if test x$enable_video_vulkan = xno; then
            # For reasons I am totally unable to see, I get an undefined macro error if
            # I put this in the AC_TRY_COMPILE.
            AC_MSG_WARN([Vulkan does not work on this configuration.])
        fi
    fi
    if test x$have_loadso != xyes; then
        AC_MSG_WARN([Vulkan support is available, but disabled because there's no loadso.])
        enable_video_vulkan=no
    fi
    if test x$enable_video_vulkan = xyes; then
        AC_DEFINE(SDL_VIDEO_VULKAN, 1, [ ])
        SUMMARY_video="${SUMMARY_video} vulkan"
    fi
}

dnl See if we can use the new unified event interface in Linux 2.4
CheckInputEvents()
{
dnl Check for Linux 2.4 unified input event interface support
        AC_MSG_CHECKING(for Linux 2.4 unified input interface)
        use_input_events=no
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
          #include <linux/input.h>
        ]], [[
          #ifndef EVIOCGNAME
          #error EVIOCGNAME() ioctl not available
          #endif
        ]])], [use_input_events=yes],[])
        AC_MSG_RESULT($use_input_events)
        if test x$use_input_events = xyes; then
            AC_DEFINE(SDL_INPUT_LINUXEV, 1, [ ])
            SUMMARY_input="${SUMMARY_input} linuxev"
        fi
}

dnl See if we can use the kernel kd.h header
CheckInputKD()
{
    AC_MSG_CHECKING(for Linux kd.h)
    use_input_kd=no
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
      #include <linux/kd.h>
      #include <linux/keyboard.h>
    ]], [[
        struct kbentry kbe;
        kbe.kb_table = KG_CTRL;
        ioctl(0, KDGKBENT, &kbe);
    ]])], [use_input_kd=yes],[])
    AC_MSG_RESULT($use_input_kd)
    if test x$use_input_kd = xyes; then
        AC_DEFINE(SDL_INPUT_LINUXKD, 1, [ ])
        SUMMARY_input="${SUMMARY_input} linuxkd"
    fi
}

dnl See if we can use the FreeBSD kernel kbio.h header
CheckInputKBIO()
{
    AC_MSG_CHECKING(for FreeBSD kbio.h)
    use_input_kbio=no
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
      #include <sys/kbio.h>
      #include <sys/ioctl.h>
    ]], [[
        accentmap_t accTable;
        ioctl(0, KDENABIO, 1);
    ]])], [use_input_kbio=yes],[])
    AC_MSG_RESULT($use_input_kbio)
    if test x$use_input_kbio = xyes; then
        AC_DEFINE(SDL_INPUT_FBSDKBIO, 1, [ ])
        SUMMARY_input="${SUMMARY_input} fbsdkbio"
    fi
}

dnl See if we can use the wscons input driver
CheckInputWSCONS()
{
    AC_MSG_CHECKING(for OpenBSD wscons)
    use_input_wscons=no
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
     #include <sys/time.h>
     #include <dev/wscons/wsconsio.h>
     #include <dev/wscons/wsksymdef.h>
     #include <dev/wscons/wsksymvar.h>
     #include <sys/ioctl.h>
    ]], [[
     struct wskbd_map_data data;
     ioctl(0, WSKBDIO_GETMAP, &data);
    ]])], [use_input_wscons=yes],[])
    AC_MSG_RESULT($use_input_wscons)
    if test x$use_input_wscons = xyes; then
        AC_DEFINE(SDL_INPUT_WSCONS, 1, [ ])
        SUMMARY_input="${SUMMARY_input} wscons"
    fi
}

dnl See if the platform offers libudev for device enumeration and hotplugging.
CheckLibUDev()
{
    AC_ARG_ENABLE(libudev,
[AS_HELP_STRING([--enable-libudev], [enable libudev support [default=yes]])],
                        , enable_libudev=yes)
    if test x$enable_libudev = xyes; then
        AC_CHECK_HEADER(libudev.h,
                        have_libudev_h_hdr=yes,
                        have_libudev_h_hdr=no)
        if test x$have_libudev_h_hdr = xyes; then
            AC_DEFINE(HAVE_LIBUDEV_H, 1, [ ])

            udev_lib=[`find_lib "libudev.so.*" "" | sed 's/.*\/\(.*\)/\1/; q'`]
            if test x$udev_lib != x; then
                echo "-- dynamic udev -> $udev_lib"
                AC_DEFINE_UNQUOTED(SDL_UDEV_DYNAMIC, "$udev_lib", [ ])
            fi
        fi
    fi
}

dnl See if the platform offers libdbus for various IPC techniques.
CheckDBus()
{
    AC_ARG_ENABLE(dbus,
[AS_HELP_STRING([--enable-dbus], [enable D-Bus support [default=yes]])],
                        , enable_dbus=yes)
    if test x$enable_dbus = xyes; then
        PKG_CHECK_MODULES([DBUS], [dbus-1], have_dbus=yes, have_dbus=no)
        save_CPPFLAGS="$CPPFLAGS"
        CPPFLAGS="$save_CPPFLAGS $DBUS_CFLAGS"
        AC_CHECK_HEADER(dbus/dbus.h,
                        have_dbus_dbus_h_hdr=yes,
                        have_dbus_dbus_h_hdr=no)
        CPPFLAGS="$save_CPPFLAGS"
        if test x$have_dbus_dbus_h_hdr = xyes; then
            AC_DEFINE(HAVE_DBUS_DBUS_H, 1, [ ])
            EXTRA_CFLAGS="$EXTRA_CFLAGS $DBUS_CFLAGS"
            SOURCES="$SOURCES $srcdir/src/core/linux/SDL_dbus.c"
        fi
    fi
}

dnl See if the platform wanna IME support.
CheckIME()
{
    AC_ARG_ENABLE(ime,
[AS_HELP_STRING([--enable-ime], [enable IME support [default=yes]])],
                  , enable_ime=yes)
    if test x$enable_ime = xyes; then
        AC_DEFINE(SDL_USE_IME, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/core/linux/SDL_ime.c"
    fi
}

dnl Check inotify presense
CheckInotify()
{
    save_LIBS="$LIBS"
    case "$host" in
     *-*-freebsd*) LIBS="$LIBS -linotify"
      ;;
    esac
    AC_CHECK_HEADERS(sys/inotify.h, [have_inotify_inotify_h_hdr=yes])
    AC_CHECK_FUNCS(inotify_init, [have_inotify=yes])
    AC_CHECK_FUNCS(inotify_init1)
    if test x$have_inotify_inotify_h_hdr = xyes -a x$have_inotify = xyes; then
        AC_DEFINE(HAVE_INOTIFY, 1, [ ])
        case "$host" in
            *-*-freebsd*)
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS -linotify"
                ;;
        esac
    fi
    LIBS="$save_LIBS"
}

dnl See if the platform has libibus IME support.
CheckIBus()
{
    AC_ARG_ENABLE(ibus,
[AS_HELP_STRING([--enable-ibus], [enable IBus support [default=yes]])],
                  , enable_ibus=yes)
    if test x$enable_ibus = xyes; then
        PKG_CHECK_MODULES([IBUS], [ibus-1.0], have_ibus=yes, have_ibus=no)
        save_CPPFLAGS="$CPPFLAGS"
        CPPFLAGS="$save_CPPFLAGS $IBUS_CFLAGS"
        AC_CHECK_HEADER(ibus-1.0/ibus.h,
                        have_ibus_ibus_h_hdr=yes,
                        have_ibus_ibus_h_hdr=no)
        CPPFLAGS="$save_CPPFLAGS"
        if test x$have_ibus_ibus_h_hdr = xyes; then
            if test x$enable_ime != xyes; then
                AC_MSG_WARN([IME support is required for IBus.])
                have_ibus_ibus_h_hdr=no
            elif test x$enable_dbus != xyes; then
                AC_MSG_WARN([DBus support is required for IBus.])
                have_ibus_ibus_h_hdr=no
            elif test x$have_inotify_inotify_h_hdr != xyes; then
                AC_MSG_WARN([INotify support is required for IBus.])
                have_ibus_ibus_h_hdr=no
            else
                AC_DEFINE(HAVE_IBUS_IBUS_H, 1, [ ])
                EXTRA_CFLAGS="$EXTRA_CFLAGS $IBUS_CFLAGS"
                SOURCES="$SOURCES $srcdir/src/core/linux/SDL_ibus.c"
            fi
        fi
    fi
}

dnl See if the platform has fcitx IME support.
CheckFcitx()
{
    AC_ARG_ENABLE(fcitx,
[AS_HELP_STRING([--enable-fcitx], [enable fcitx support [default=yes]])],
                  , enable_fcitx=yes)
    if test x$enable_fcitx = xyes; then
        AC_MSG_CHECKING(for fcitx support)
        have_fcitx=no
        if test x$enable_ime != xyes; then
            AC_MSG_WARN([IME support is required for fcitx.])
        elif test x$have_dbus_dbus_h_hdr != xyes; then
            AC_MSG_WARN([DBus support is required for fcitx.])
        else
            have_fcitx=yes
            AC_DEFINE(HAVE_FCITX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/core/linux/SDL_fcitx.c"
        fi
        AC_MSG_RESULT($have_fcitx)
    fi
}

dnl Check to see if GameController framework support is desired
CheckJoystickMFI()
{
    AC_ARG_ENABLE(joystick-mfi,
[AS_HELP_STRING([--enable-joystick-mfi], [include macOS MFI joystick support [default=yes]])],
              , enable_joystick_mfi=yes)

    if test x$enable_joystick_mfi = xyes; then
        save_CFLAGS="$CFLAGS"
        save_LDFLAGS="$LDFLAGS"
dnl     Work around that we don't have Objective-C support in autoconf
        CFLAGS="$CFLAGS -x objective-c -fobjc-weak"
        LDFLAGS="$LDFLAGS -Wl,-weak_framework,CoreHaptics -Wl,-weak_framework,GameController"
        AC_MSG_CHECKING(for GameController framework)
        enable_joystick_mfi=no
        AC_LINK_IFELSE([AC_LANG_PROGRAM([[
          #include <AvailabilityMacros.h>
          #include <TargetConditionals.h>
          #import <GameController/GameController.h>
        ]], [[
          #if MAC_OS_X_VERSION_MIN_REQUIRED < 1080
          #error GameController framework doesn't work on this configuration
          #endif
          #if TARGET_CPU_X86
          #error GameController framework doesn't work on this configuration
          #endif
        ]])], [enable_joystick_mfi=yes],[])
        CFLAGS="$save_CFLAGS"
        LDFLAGS="$save_LDFLAGS"

        AC_MSG_RESULT($enable_joystick_mfi)
        if test x$enable_joystick_mfi = xyes; then
            AC_DEFINE(SDL_JOYSTICK_MFI, 1, [ ])
            EXTRA_CFLAGS="$EXTRA_CFLAGS -fobjc-weak -Wno-unused-command-line-argument"
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-weak_framework,CoreHaptics -Wl,-weak_framework,GameController"
        fi
    fi
}

dnl See what type of thread model to use on Linux and Solaris
CheckPTHREAD()
{
dnl Check for pthread support

dnl Emscripten pthreads work, but you need to have a non-pthread fallback build
dnl  for systems without support. It's not currently enough to not use
dnl  pthread functions in a pthread-build; it won't start up on unsupported
dnl  browsers. As such, you have to explicitly enable it on Emscripten builds
dnl  for the time being. This default with change to ON once this becomes
dnl  commonly supported in browsers or the Emscripten teams makes a single
dnl  binary work everywhere.

    case "$host" in
        *-*-emscripten*)
            enable_pthreads_default=no
            ;;
        *)
            enable_pthreads_default=yes
            ;;
    esac

    AC_ARG_ENABLE(pthreads,
[AS_HELP_STRING([--enable-pthreads], [use POSIX threads for multi-threading [default=maybe]])],
                  , enable_pthreads=maybe)
dnl This is used on Linux for glibc binary compatibility (Doh!)
    AC_ARG_ENABLE(pthread-sem,
[AS_HELP_STRING([--enable-pthread-sem], [use pthread semaphores [default=maybe]])],
                  , enable_pthread_sem=maybe)

    if test x$enable_pthreads = xmaybe; then
        enable_pthreads=$enable_pthreads_default
    fi
    if test x$enable_pthread_sem = xmaybe; then
        enable_pthread_sem=$enable_pthreads
    fi

    case "$host" in
         *-*-android*)
            pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
            pthread_lib=""
            ;;
        *-*-linux*|*-*-uclinux*)
            pthread_cflags="-D_REENTRANT"
            pthread_lib="-lpthread"
            ;;
        *-*-bsdi*)
            pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
            pthread_lib=""
            ;;
        *-*-darwin*)
            pthread_cflags="-D_THREAD_SAFE"
# causes Carbon.p complaints?
#            pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
            ;;
        *-*-freebsd*|*-*-dragonfly*)
            pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
            pthread_lib="-pthread"
            ;;
        *-*-netbsd*)
            pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
            pthread_lib="-lpthread"
            ;;
        *-*-openbsd*)
            pthread_cflags="-D_REENTRANT"
            pthread_lib="-pthread"
            ;;
        *-*-solaris2.9)
            # From Solaris 9+, posix4's preferred name is rt.
            pthread_cflags="-D_REENTRANT"
            pthread_lib="-lpthread -lrt"
            ;;
        *-*-solaris2.10)
            # Solaris 10+ merged pthread into libc.
            pthread_cflags="-D_REENTRANT"
            pthread_lib="-lrt"
            ;;
        *-*-solaris*)
            # Solaris 11+ merged rt into libc.
            pthread_cflags="-D_REENTRANT"
            pthread_lib=""
            ;;
        *-*-sysv5*)
            pthread_cflags="-D_REENTRANT -Kthread"
            pthread_lib=""
            ;;
        *-*-aix*)
            pthread_cflags="-D_REENTRANT -mthreads"
            pthread_lib="-lpthread"
            ;;
        *-*-hpux11*)
            pthread_cflags="-D_REENTRANT"
            pthread_lib="-L/usr/lib -lpthread"
            ;;
        *-*-haiku*)
            pthread_cflags="-D_REENTRANT"
            pthread_lib=""
            ;;
        *-*-nto*)
            pthread_cflags="-D_REENTRANT"
            pthread_lib=""
            ;;
        *-*-emscripten*)
            pthread_cflags="-D_REENTRANT -pthread"
            pthread_lib="-pthread"
            ;;
        *)
            pthread_cflags="-D_REENTRANT"
            pthread_lib="-lpthread"
            ;;
    esac
    if test x$enable_threads = xyes -a x$enable_pthreads = xyes; then
        # Save the original compiler flags and libraries
        ac_save_cflags="$CFLAGS"; ac_save_libs="$LIBS"
        # Add the pthread compiler flags and libraries
        CFLAGS="$CFLAGS $pthread_cflags"; LIBS="$LIBS $pthread_lib"
        # Check to see if we have pthread support on this system
        AC_MSG_CHECKING(for pthreads)
        use_pthreads=no
        AC_LINK_IFELSE([AC_LANG_PROGRAM([[
         #include <pthread.h>
        ]], [[
         pthread_attr_t type;
         pthread_attr_init(&type);
        ]])], [use_pthreads=yes],[])
        AC_MSG_RESULT($use_pthreads)
        # Restore the compiler flags and libraries
        CFLAGS="$ac_save_cflags"; LIBS="$ac_save_libs"

        # Do futher testing if we have pthread support...
        if test x$use_pthreads = xyes; then
            AC_DEFINE(SDL_THREAD_PTHREAD, 1, [ ])
            EXTRA_CFLAGS="$EXTRA_CFLAGS $pthread_cflags"
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS $pthread_lib"
            SDL_CFLAGS="$SDL_CFLAGS $pthread_cflags"

            # Save the original compiler flags and libraries
            ac_save_cflags="$CFLAGS"; ac_save_libs="$LIBS"
            # Add the pthread compiler flags and libraries
            CFLAGS="$CFLAGS $pthread_cflags"; LIBS="$LIBS $pthread_lib"

            # Check to see if recursive mutexes are available
            AC_MSG_CHECKING(for recursive mutexes)
            has_recursive_mutexes=no
            if test x$has_recursive_mutexes = xno; then
                AC_LINK_IFELSE([AC_LANG_PROGRAM([[
                  #define _GNU_SOURCE 1
                  #include <pthread.h>
                ]], [[
                  pthread_mutexattr_t attr;
                  pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
                ]])], [
                has_recursive_mutexes=yes
                AC_DEFINE(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX, 1, [ ])
                ],[])
            fi
            if test x$has_recursive_mutexes = xno; then
                AC_LINK_IFELSE([AC_LANG_PROGRAM([[
                  #define _GNU_SOURCE 1
                  #include <pthread.h>
                ]], [[
                  pthread_mutexattr_t attr;
                  pthread_mutexattr_setkind_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
                ]])],[
                has_recursive_mutexes=yes
                AC_DEFINE(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP, 1, [ ])
                ],[])
            fi
            AC_MSG_RESULT($has_recursive_mutexes)

            # Check to see if pthread semaphore support is missing
            if test x$enable_pthread_sem = xyes; then
                AC_MSG_CHECKING(for pthread semaphores)
                have_pthread_sem=no
                AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                  #include <pthread.h>
                  #include <semaphore.h>
                ]],[])], [have_pthread_sem=yes],[])
                AC_MSG_RESULT($have_pthread_sem)
            fi
            if test x$have_pthread_sem = xyes; then
                AC_MSG_CHECKING(for sem_timedwait)
                have_sem_timedwait=no
                AC_LINK_IFELSE([AC_LANG_PROGRAM([[
                  #include <pthread.h>
                  #include <semaphore.h>
                ]], [[
                  sem_timedwait(NULL, NULL);
                ]])], [
                have_sem_timedwait=yes
                AC_DEFINE([HAVE_SEM_TIMEDWAIT], 1, [ ])
                ],[])
                AC_MSG_RESULT($have_sem_timedwait)
            fi

            AC_CHECK_HEADER(pthread_np.h, have_pthread_np_h=yes, have_pthread_np_h=no, [ #include <pthread.h> ])
            if test x$have_pthread_np_h = xyes; then
                AC_DEFINE(HAVE_PTHREAD_NP_H, 1, [ ])
            fi

            # Check to see if pthread naming is available
            AC_MSG_CHECKING(for pthread_setname_np)
            AC_TRY_LINK_FUNC(pthread_setname_np, [
              has_pthread_setname_np=yes
              AC_DEFINE(HAVE_PTHREAD_SETNAME_NP, 1, [ ])
            ],[
              has_pthread_setname_np=no
            ])
            AC_MSG_RESULT($has_pthread_setname_np)

            AC_MSG_CHECKING(for pthread_set_name_np)
            AC_TRY_LINK_FUNC(pthread_set_name_np, [
              has_pthread_set_name_np=yes
              AC_DEFINE(HAVE_PTHREAD_SET_NAME_NP, 1, [ ])
            ],[
              has_pthread_set_name_np=no
            ])
            AC_MSG_RESULT($has_pthread_set_name_np)

            # Restore the compiler flags and libraries
            CFLAGS="$ac_save_cflags"; LIBS="$ac_save_libs"

            # Basic thread creation functions
            SOURCES="$SOURCES $srcdir/src/thread/pthread/SDL_systhread.c"

            # Semaphores
            # We can fake these with mutexes and condition variables if necessary
            if test x$have_pthread_sem = xyes; then
                SOURCES="$SOURCES $srcdir/src/thread/pthread/SDL_syssem.c"
            else
                SOURCES="$SOURCES $srcdir/src/thread/generic/SDL_syssem.c"
            fi

            # Mutexes
            # We can fake these with semaphores if necessary
            SOURCES="$SOURCES $srcdir/src/thread/pthread/SDL_sysmutex.c"

            # Condition variables
            # We can fake these with semaphores and mutexes if necessary
            SOURCES="$SOURCES $srcdir/src/thread/pthread/SDL_syscond.c"

            # Thread local storage
            SOURCES="$SOURCES $srcdir/src/thread/pthread/SDL_systls.c"

            have_threads=yes
        fi
    fi
}

dnl Determine whether the compiler can produce Windows executables
CheckWINDOWS()
{
    AC_MSG_CHECKING(Windows compiler)
    have_win32_gcc=no
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
     #include <windows.h>
    ]],[])], [have_win32_gcc=yes],[])
    AC_MSG_RESULT($have_win32_gcc)
    if test x$have_win32_gcc != xyes; then
       AC_MSG_ERROR([
*** Your compiler ($CC) does not produce Windows executables!
       ])
    fi

    AC_MSG_CHECKING(Windows CE)
    have_wince=no
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#if !defined(_WIN32_WCE) && !defined(__MINGW32CE__)
#error This is not Windows CE
#endif
    ]],[])], [
    have_wince=yes
       AC_MSG_ERROR([
*** Sorry, Windows CE is no longer supported.
       ])
    ],[])
    AC_MSG_RESULT($have_wince)

    # This fixes Windows stack alignment with newer GCC
    CheckStackBoundary

    # headers needed elsewhere
    AC_CHECK_HEADER(tpcshrd.h,have_tpcshrd_h=yes)
    if test x$have_tpcshrd_h = xyes; then
        AC_DEFINE(HAVE_TPCSHRD_H, 1, [ ])
    fi
    AC_CHECK_HEADER(roapi.h,have_roapi_h=yes)
    if test x$have_roapi_h = xyes; then
        AC_DEFINE(HAVE_ROAPI_H, 1, [ ])
    fi
}

dnl Determine whether the compiler can produce OS/2 executables
CheckOS2()
{
    AC_MSG_CHECKING(OS/2 compiler)
    have_os2_gcc=no
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <os2.h>]],
     [])],[have_os2_gcc=yes],[])
    AC_MSG_RESULT($have_os2_gcc)
    if test x$have_os2_gcc != xyes; then
       AC_MSG_ERROR([
*** Your compiler ($CC) does not produce OS/2 executables!
       ])
    fi
}

dnl Find the DirectX includes and libraries
CheckDIRECTX()
{
    AC_ARG_ENABLE(directx,
[AS_HELP_STRING([--enable-directx], [use DirectX for Windows audio/video [default=yes]])],
                                 , enable_directx=yes)
    if test x$enable_directx = xyes; then
        AC_CHECK_HEADER(d3d9.h, have_d3d=yes)
        AC_CHECK_HEADER(d3d11_1.h, have_d3d11=yes)
        AC_CHECK_HEADER(ddraw.h, have_ddraw=yes)
        AC_CHECK_HEADER(dsound.h, have_dsound=yes)
        AC_CHECK_HEADER(dinput.h, have_dinput=yes)
        AC_CHECK_HEADER(dxgi.h, have_dxgi=yes)

        if test x$have_ddraw = xyes; then
            AC_DEFINE(HAVE_DDRAW_H, 1, [ ])
        fi
        if test x$have_dinput = xyes; then
            AC_DEFINE(HAVE_DINPUT_H, 1, [ ])
        fi
        if test x$have_dsound = xyes; then
            AC_DEFINE(HAVE_DSOUND_H, 1, [ ])
        fi
        if test x$have_dxgi = xyes; then
            AC_DEFINE(HAVE_DXGI_H, 1, [ ])
        fi

        # FIXME: latest Cygwin finds dinput headers, but we die on other win32 headers.
        # FIXME:  ...so force it off for now.
        case "$host" in
            *-*-cygwin*)
            have_dinput=false
            ;;
        esac
    fi

    AC_ARG_ENABLE(xinput,
[AS_HELP_STRING([--enable-xinput], [use Xinput for Windows [default=yes]])],
                                , enable_xinput=yes)
    if test x$enable_xinput = xyes; then
        have_xinput_gamepadex=no
        have_xinput_stateex=no
        AC_CHECK_HEADER(xinput.h, have_xinput=yes)
        AC_MSG_CHECKING(for struct XINPUT_GAMEPAD_EX)
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <windows.h>
#include <xinput.h>
XINPUT_GAMEPAD_EX x1;
            ]],[])], [have_xinput_gamepadex=yes],[])
        AC_MSG_RESULT($have_xinput_gamepadex)
        AC_MSG_CHECKING(for struct XINPUT_STATE_EX)
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <windows.h>
#include <xinput.h>
XINPUT_STATE_EX s1;
            ]],[])], [have_xinput_stateex=yes],[])
        AC_MSG_RESULT($have_xinput_stateex)

        if test x$have_xinput = xyes; then
            AC_DEFINE(HAVE_XINPUT_H, 1, [ ])
        fi
        if test x$have_xinput_gamepadex = xyes; then
            AC_DEFINE(HAVE_XINPUT_GAMEPAD_EX, 1, [ ])
        fi
        if test x$have_xinput_stateex = xyes; then
            AC_DEFINE(HAVE_XINPUT_STATE_EX, 1, [ ])
        fi
    fi

    AC_MSG_CHECKING(for windows.gaming.input.h)
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define COBJMACROS
#include <windows.gaming.input.h>
__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 *s2;
        ]],[])], [have_wgi=yes],[have_wgi=no])
    AC_MSG_RESULT($have_wgi)

    if test x$have_wgi = xyes; then
        AC_DEFINE(HAVE_WINDOWS_GAMING_INPUT_H, 1, [ ])
    fi

    AC_CHECK_HEADER(mmdeviceapi.h, have_wasapi=yes)
    if test x$have_wasapi = xyes; then
        AC_DEFINE(HAVE_MMDEVICEAPI_H, 1, [ ])
    fi
    AC_CHECK_HEADER(audioclient.h,,have_wasapi=no)
    if test x$have_wasapi = xyes; then
        AC_DEFINE(HAVE_AUDIOCLIENT_H, 1, [ ])
    fi

    AC_ARG_ENABLE(wasapi,
[AS_HELP_STRING([--enable-wasapi], [use the Windows WASAPI audio driver [default=yes]])],
                                , enable_wasapi=yes)
}

dnl Check for the dlfcn.h interface for dynamically loading objects
dnl NOTE: CheckDLOPEN is called only for relevant platforms
CheckDLOPEN()
{
    AC_DEFINE(DYNAPI_NEEDS_DLOPEN, 1, [ ])

    AC_CHECK_HEADER(dlfcn.h,have_dlfcn_h=yes,have_dlfcn_h=no)

    have_dlopen=no
    AC_CHECK_LIB(c, dlopen, have_dlopen=yes,
       AC_CHECK_LIB(dl, dlopen, [have_dlopen=yes; EXTRA_LDFLAGS="$EXTRA_LDFLAGS -ldl"]))
    AC_MSG_CHECKING(for dlopen)
    AC_MSG_RESULT($have_dlopen)

    if test x$have_dlfcn_h = xyes -a x$have_dlopen = xyes; then
       AC_DEFINE(HAVE_DLOPEN, 1, [ ])
       if test x$enable_loadso = xyes; then
          AC_DEFINE(SDL_LOADSO_DLOPEN, 1, [ ])
          SOURCES="$SOURCES $srcdir/src/loadso/dlopen/*.c"
          have_loadso=yes
       fi
    fi
}

CheckO_CLOEXEC()
{
    AC_MSG_CHECKING(for O_CLOEXEC)
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <fcntl.h>
int flag = O_CLOEXEC;
        ]],[])], [have_o_cloexec=yes],[have_o_cloexec=no])
    AC_MSG_RESULT($have_o_cloexec)
    if test $have_o_cloexec = yes; then
       AC_DEFINE(HAVE_O_CLOEXEC, 1, [ ])
    fi
}

dnl Check for the usbhid(3) library on *BSD
CheckUSBHID()
{
    case "$host" in
        *-*-*bsd*|*-*-dragonfly*)
            if test x$enable_joystick = xyes; then
                AC_CHECK_LIB(usbhid, hid_init, have_libusbhid=yes)
                if test x$have_libusbhid = xyes; then
                    AC_CHECK_HEADER(usbhid.h, [USB_CFLAGS="-DHAVE_USBHID_H"])
                    AC_CHECK_HEADER(libusbhid.h, [USB_CFLAGS="-DHAVE_LIBUSBHID_H"])
                    USB_LIBS="$USB_LIBS -lusbhid"
                else
                    AC_CHECK_HEADER(usb.h, [USB_CFLAGS="-DHAVE_USB_H"])
                    AC_CHECK_HEADER(libusb.h, [USB_CFLAGS="-DHAVE_LIBUSB_H"])
                    AC_CHECK_LIB(usb, hid_init, [USB_LIBS="$USB_LIBS -lusb"])
                fi

                save_CFLAGS="$CFLAGS"
                CFLAGS="$CFLAGS $USB_CFLAGS"

                AC_MSG_CHECKING(for usbhid)
                have_usbhid=no
                AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                  #include <sys/types.h>
                  #if defined(HAVE_USB_H)
                  #include <usb.h>
                  #endif
                  #ifdef __DragonFly__
                  # include <bus/u4b/usb.h>
                  # include <bus/u4b/usbhid.h>
                  #else
                  # include <dev/usb/usb.h>
                  # include <dev/usb/usbhid.h>
                  #endif
                  #if defined(HAVE_USBHID_H)
                  #include <usbhid.h>
                  #elif defined(HAVE_LIBUSB_H)
                  #include <libusb.h>
                  #elif defined(HAVE_LIBUSBHID_H)
                  #include <libusbhid.h>
                  #endif
                ]], [[
                  struct report_desc *repdesc;
                  struct usb_ctl_report *repbuf;
                  hid_kind_t hidkind;
                ]])], [have_usbhid=yes],[])
                AC_MSG_RESULT($have_usbhid)

                if test x$have_usbhid = xyes; then
                    AC_MSG_CHECKING(for ucr_data member of usb_ctl_report)
                    have_usbhid_ucr_data=no
                    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                      #include <sys/types.h>
                      #if defined(HAVE_USB_H)
                      #include <usb.h>
                      #endif
                      #ifdef __DragonFly__
                      # include <bus/u4b/usb.h>
                      # include <bus/u4b/usbhid.h>
                      #else
                      # include <dev/usb/usb.h>
                      # include <dev/usb/usbhid.h>
                      #endif
                      #if defined(HAVE_USBHID_H)
                      #include <usbhid.h>
                      #elif defined(HAVE_LIBUSB_H)
                      #include <libusb.h>
                      #elif defined(HAVE_LIBUSBHID_H)
                      #include <libusbhid.h>
                      #endif
                    ]], [[
                      struct usb_ctl_report buf;
                      if (buf.ucr_data) { }
                    ]])], [have_usbhid_ucr_data=yes],[])
                    if test x$have_usbhid_ucr_data = xyes; then
                        USB_CFLAGS="$USB_CFLAGS -DUSBHID_UCR_DATA"
                    fi
                    AC_MSG_RESULT($have_usbhid_ucr_data)

                    AC_MSG_CHECKING(for new usbhid API)
                    have_usbhid_new=no
                    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                      #include <sys/types.h>
                      #if defined(HAVE_USB_H)
                      #include <usb.h>
                      #endif
                      #ifdef __DragonFly__
                      #include <bus/u4b/usb.h>
                      #include <bus/u4b/usbhid.h>
                      #else
                      #include <dev/usb/usb.h>
                      #include <dev/usb/usbhid.h>
                      #endif
                      #if defined(HAVE_USBHID_H)
                      #include <usbhid.h>
                      #elif defined(HAVE_LIBUSB_H)
                      #include <libusb.h>
                      #elif defined(HAVE_LIBUSBHID_H)
                      #include <libusbhid.h>
                      #endif
                    ]], [[
                      report_desc_t d;
                      hid_start_parse(d, 1, 1);
                    ]])], [have_usbhid_new=yes],[])
                    if test x$have_usbhid_new = xyes; then
                        USB_CFLAGS="$USB_CFLAGS -DUSBHID_NEW"
                    fi
                    AC_MSG_RESULT($have_usbhid_new)

                    AC_MSG_CHECKING(for struct joystick in machine/joystick.h)
                    have_machine_joystick=no
                    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
                      #include <machine/joystick.h>
                    ]], [[
                      struct joystick t;
                    ]])], [have_machine_joystick=yes],[])
                    if test x$have_machine_joystick = xyes; then
                        AC_DEFINE(SDL_HAVE_MACHINE_JOYSTICK_H, 1, [ ])
                    fi
                    AC_MSG_RESULT($have_machine_joystick)

                    AC_DEFINE(SDL_JOYSTICK_USBHID, 1, [ ])
                    SOURCES="$SOURCES $srcdir/src/joystick/bsd/*.c"
                    EXTRA_CFLAGS="$EXTRA_CFLAGS $USB_CFLAGS"
                    EXTRA_LDFLAGS="$EXTRA_LDFLAGS $USB_LIBS"
                    have_joystick=yes
                fi

                CFLAGS="$save_CFLAGS"
            fi
        ;;
    esac
}

dnl Check for HIDAPI joystick drivers
CheckHIDAPI()
{
    AC_ARG_ENABLE(hidapi-joystick,
[AS_HELP_STRING([--enable-hidapi-joystick], [use HIDAPI for low level joystick drivers [default=yes]])],
                  , enable_hidapi_joystick=yes)
    AC_ARG_ENABLE(hidapi-libusb,
[AS_HELP_STRING([--enable-hidapi-libusb], [use libusb for low level joystick drivers [default=maybe]])],
                  , enable_hidapi_libusb=maybe)

    if test x$enable_hidapi = xyes; then
        case "$host" in
            # libusb does not support iOS
            *-ios-* )
                enable_hidapi_libusb=no
                ;;
            # On the other hand, *BSD specifically uses libusb only
            *-*-*bsd* )
                enable_hidapi_libusb=yes
                require_hidapi_libusb=yes
                ;;
           *-*-os2* )
                enable_hidapi_libusb=yes
                ;;
        esac

        hidapi_support=yes
        if test x$enable_hidapi_libusb = xyes; then
            PKG_CHECK_MODULES([LIBUSB], [libusb-1.0], have_libusb=yes, have_libusb=no)
            save_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS="$save_CPPFLAGS $LIBUSB_CFLAGS"
            AC_CHECK_HEADER(libusb.h, have_libusb_h=yes, have_libusb_h=no)
            CPPFLAGS="$save_CPPFLAGS"
            if test x$have_libusb_h = xno && test x$require_hidapi_libusb = xyes; then
                hidapi_support=no
            fi
        fi

        if test x$hidapi_support = xyes; then
            if test x$have_libusb_h = xyes; then
                EXTRA_CFLAGS="$EXTRA_CFLAGS $LIBUSB_CFLAGS"
                if test x$require_hidapi_libusb = xyes; then
                    EXTRA_LDFLAGS="$EXTRA_LDFLAGS $LIBUSB_LIBS"
                else
                    if test x$have_loadso != xyes; then
                        AC_MSG_WARN([You must have SDL_LoadObject() support for dynamic libusb loading])
                    fi
                    # libusb is loaded dynamically, so don't add it to LDFLAGS
                    libusb_lib=""
                    case "$host" in
                        *-*-darwin* )
                            libusb_lib="libusb-1.0.0.dylib"
                            ;;
                        *-*-cygwin* | *-*-mingw* )
                            libusb_lib="libusb-1.0.dll"
                            ;;
                        *-*-os2* )
                            libusb_lib="usb100.dll"
                            ;;
                    esac
                    if test x$libusb_lib = x; then
                        libusb_lib=[`find_lib "libusb-1.0.so.*" "" | sed 's/.*\/\(.*\)/\1/; q'`]
                    fi
                    AC_DEFINE_UNQUOTED(SDL_LIBUSB_DYNAMIC, "$libusb_lib", [ ])
                fi
            fi
        fi

        AC_MSG_CHECKING(for hidapi joystick support)
        AC_MSG_RESULT($hidapi_support)
    fi

    if test x$enable_joystick = xyes -a x$hidapi_support = xyes -a x$enable_hidapi_joystick = xyes; then
        AC_DEFINE(SDL_JOYSTICK_HIDAPI, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/joystick/hidapi/*.c"
    fi
}

dnl Check for clock_gettime()
CheckClockGettime()
{
    AC_ARG_ENABLE(clock_gettime,
[AS_HELP_STRING([--enable-clock_gettime], [use clock_gettime() instead of gettimeofday() on UNIX [default=yes]])],
                  , enable_clock_gettime=yes)
    if test x$enable_clock_gettime = xyes; then
        AC_CHECK_LIB(rt, clock_gettime, have_clock_gettime=yes)
        if test x$have_clock_gettime = xyes; then
            AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [ ])
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lrt"
        else
            AC_CHECK_LIB(c, clock_gettime, have_clock_gettime=yes)
            if test x$have_clock_gettime = xyes; then
               AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [ ])
               EXTRA_LDFLAGS="$EXTRA_LDFLAGS"
            fi
        fi
    fi
}

dnl Check for a valid linux/version.h
CheckLinuxVersion()
{
    AC_CHECK_HEADER(linux/version.h, have_linux_version_h=yes)
    if test x$have_linux_version_h = xyes; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -DHAVE_LINUX_VERSION_H"
    fi
}

dnl Check if we want to use RPATH
CheckRPATH()
{
    AC_ARG_ENABLE(rpath,
[AS_HELP_STRING([--enable-rpath], [use an rpath when linking SDL [default=yes]])],
                  , enable_rpath=yes)
}

dnl Check if we want to use custom signals to fake iOS/Android's backgrounding
dnl  events. These could be useful if you're building a custom embedded
dnl  environment, etc, but most people don't need this.
CheckEventSignals()
{
    AC_ARG_ENABLE(backgrounding-signal,
[AS_HELP_STRING([--enable-backgrounding-signal], [number to use for magic backgrounding signal or 'no' [default=no]])],
                  , enable_backgrounding_signal=no)
    if test x$enable_backgrounding_signal != xno; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -DSDL_BACKGROUNDING_SIGNAL=$enable_backgrounding_signal"
    fi

    AC_ARG_ENABLE(foregrounding-signal,
[AS_HELP_STRING([--enable-foregrounding-signal], [number to use for magic foregrounding signal or 'no' [default=no]])],
                  , enable_foregrounding_signal=no)
    if test x$enable_foregrounding_signal != xno; then
        EXTRA_CFLAGS="$EXTRA_CFLAGS -DSDL_FOREGROUNDING_SIGNAL=$enable_foregrounding_signal"
    fi
}

dnl Set up the Virtual joystick driver.
CheckVirtualJoystick()
{
    AC_ARG_ENABLE(joystick-virtual,
[AS_HELP_STRING([--enable-joystick-virtual], [enable virtual joystick APIs [default=yes]])],
                  , enable_joystick_virtual=yes)
    if test x$enable_joystick = xyes -a x$enable_joystick_virtual = xyes; then
        AC_DEFINE(SDL_JOYSTICK_VIRTUAL, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/joystick/virtual/*.c"
        have_joystick_virtual=yes
    fi
}

dnl Do this on all platforms, before everything else (other things might want to override it).
CheckWarnAll
CheckNoStrictAliasing

dnl Do this for every platform, but for some it doesn't mean anything, but better to catch it here anyhow.
CheckEventSignals

have_locale=no

dnl Set up the configuration based on the host platform!
case "$host" in
    *-*-linux*|*-*-uclinux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-aix*|*-*-minix*|*-*-nto*)
        case "$host" in
            *-*-android*)
                # Android
                ARCH=android
                ANDROID_CFLAGS="-DGL_GLEXT_PROTOTYPES"
                CFLAGS="$CFLAGS $ANDROID_CFLAGS"
                SDL_CFLAGS="$SDL_CFLAGS $ANDROID_CFLAGS"
                EXTRA_CFLAGS="$EXTRA_CFLAGS $ANDROID_CFLAGS"
                EXTRA_LDFLAGS="$EXTRA_LDFLAGS -ldl -lGLESv1_CM -lGLESv2 -llog -landroid"
                SDLMAIN_SOURCES="$srcdir/src/main/android/*.c"
                if test x$enable_video = xyes; then
                    SOURCES="$SOURCES $srcdir/src/core/android/*.c $srcdir/src/video/android/*.c"
                    AC_DEFINE(SDL_VIDEO_DRIVER_ANDROID, 1, [ ])
                    SUMMARY_video="${SUMMARY_video} android"
                    have_video=yes
                fi
                ;;
            *-*-linux*)         ARCH=linux ;;
            *-*-uclinux*)       ARCH=linux ;;
            *-*-kfreebsd*-gnu)  ARCH=kfreebsd-gnu ;;
            *-*-knetbsd*-gnu)   ARCH=knetbsd-gnu ;;
            *-*-kopenbsd*-gnu)  ARCH=kopenbsd-gnu ;;
            *-*-gnu*)           ARCH=gnu ;; # must be last of the gnu variants
            *-*-bsdi*)          ARCH=bsdi ;;
            *-*-freebsd*)       ARCH=freebsd ;;
            *-*-dragonfly*)     ARCH=freebsd ;;
            *-*-netbsd*)        ARCH=netbsd ;;
            *-*-openbsd*)       ARCH=openbsd ;;
            *-*-sysv5*)         ARCH=sysv5 ;;
            *-*-solaris*)       ARCH=solaris ;;
            *-*-hpux*)          ARCH=hpux ;;
            *-*-aix*)           ARCH=aix ;;
            *-*-minix*)         ARCH=minix ;;
            *-*-nto*)           ARCH=nto
                CheckQNXVideo
                ;;
        esac
        CheckVisibilityHidden
        CheckDeclarationAfterStatement
        CheckDummyVideo
        CheckOffscreenVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckDLOPEN
        CheckARM
        CheckNEON
        CheckO_CLOEXEC
        CheckOSS
        CheckALSA
        CheckPipewire
        CheckPulseAudio
        CheckJACK
        CheckARTSC
        CheckESD
        CheckNAS
        CheckSNDIO
        CheckFusionSound
        CheckLibSampleRate
        # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
        CheckRPI
        CheckX11
        CheckDirectFB
        # Need to check for EGL first because KMSDRM and Wayland depends on it.
        CheckEGL
        CheckKMSDRM
        CheckGLX
        CheckOpenGL
        CheckOpenGLES
        CheckVulkan
        CheckWayland
        CheckInputEvents
        CheckLibUDev
        CheckDBus
        CheckIME
        CheckInotify
        CheckIBus
        CheckFcitx
        case $ARCH in
          linux)
              CheckInputKD
          ;;
          freebsd)
              CheckInputKBIO
          ;;
          openbsd|netbsd)
              CheckInputWSCONS
          ;;
        esac
        CheckUSBHID
        CheckHIDAPI
        CheckPTHREAD
        CheckClockGettime
        CheckLinuxVersion
        CheckRPATH
        CheckVivanteVideo

        # Set up files for the misc library
        if test x$enable_misc = xyes; then
            SOURCES="$SOURCES $srcdir/src/misc/unix/*.c"
            have_misc=yes
        fi
        # Set up files for the locale library
        if test x$enable_locale = xyes; then
            SOURCES="$SOURCES $srcdir/src/locale/unix/*.c"
            have_locale=yes
        fi
        # Set up files for the audio library
        if test x$enable_audio = xyes; then
          case $ARCH in
            sysv5|solaris|hpux)
                AC_DEFINE(SDL_AUDIO_DRIVER_SUNAUDIO, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/audio/sun/*.c"
                SUMMARY_audio="${SUMMARY_audio} sun"
                have_audio=yes
            ;;
            netbsd)  # Don't use this on OpenBSD, it's busted.
                AC_DEFINE(SDL_AUDIO_DRIVER_NETBSD, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/audio/netbsd/*.c"
                SUMMARY_audio="${SUMMARY_audio} netbsd"
                have_audio=yes
            ;;
            aix)
                AC_DEFINE(SDL_AUDIO_DRIVER_PAUDIO, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/audio/paudio/*.c"
                SUMMARY_audio="${SUMMARY_audio} paudio"
                have_audio=yes
            ;;
            android)
                AC_DEFINE(SDL_AUDIO_DRIVER_ANDROID, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/audio/android/*.c"
                SUMMARY_audio="${SUMMARY_audio} android"

                AC_DEFINE(SDL_AUDIO_DRIVER_OPENSLES, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/audio/openslES/*.c"
                SUMMARY_audio="${SUMMARY_audio} openslES"

                AC_DEFINE(SDL_AUDIO_DRIVER_AAUDIO, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/audio/aaudio/*.c"
                SUMMARY_audio="${SUMMARY_audio} aaudio"

                have_audio=yes
            ;;
            nto)
                CheckQNXAudio
            ;;
          esac
        fi
        # Set up files for the joystick library
        if test x$enable_joystick = xyes; then
          case $ARCH in
            linux)
                AC_DEFINE(SDL_JOYSTICK_LINUX, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/joystick/linux/*.c"
                SOURCES="$SOURCES $srcdir/src/joystick/steam/*.c"
                have_joystick=yes
            ;;
            freebsd)
                if test x$use_input_events = xyes; then
                    AC_DEFINE(SDL_JOYSTICK_LINUX, 1, [ ])
                    SOURCES="$SOURCES $srcdir/src/joystick/linux/*.c"
                    SOURCES="$SOURCES $srcdir/src/joystick/steam/*.c"
                    have_joystick=yes
                fi
            ;;
            android)
                AC_DEFINE(SDL_JOYSTICK_ANDROID, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/joystick/android/*.c"
                SOURCES="$SOURCES $srcdir/src/joystick/steam/*.c"
                have_joystick=yes
            ;;
          esac
        fi
        # Set up files for the haptic library
        if test x$enable_haptic = xyes; then
          case $ARCH in
            linux|freebsd)
                if test x$use_input_events = xyes; then
                    AC_DEFINE(SDL_HAPTIC_LINUX, 1, [ ])
                    SOURCES="$SOURCES $srcdir/src/haptic/linux/*.c"
                    have_haptic=yes
                fi
            ;;
            android)
                AC_DEFINE(SDL_HAPTIC_ANDROID, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/haptic/android/*.c"
                have_haptic=yes
            ;;
          esac
        fi
        # Set up files for the sensor library
        if test x$enable_sensor = xyes; then
          case $ARCH in
            android)
                AC_DEFINE(SDL_SENSOR_ANDROID, 1, [ ])
                SOURCES="$SOURCES $srcdir/src/sensor/android/*.c"
                have_sensor=yes
            ;;
          esac
        fi
        # Set up files for the power library
        if test x$enable_power = xyes; then
             case $ARCH in
               linux)
                   AC_DEFINE(SDL_POWER_LINUX, 1, [ ])
                   SOURCES="$SOURCES $srcdir/src/power/linux/*.c"
                   have_power=yes
               ;;
               android)
                   AC_DEFINE(SDL_POWER_ANDROID, 1, [ ])
                   SOURCES="$SOURCES $srcdir/src/power/android/*.c"
                   have_power=yes
               ;;
             esac
        fi
        # Set up files for the filesystem library
        if test x$enable_filesystem = xyes; then
             case $ARCH in
               android)
                   AC_DEFINE(SDL_FILESYSTEM_ANDROID, 1, [ ])
                   SOURCES="$SOURCES $srcdir/src/filesystem/android/*.c"
                   have_filesystem=yes
               ;;
               *)
                   AC_DEFINE(SDL_FILESYSTEM_UNIX, 1, [ ])
                   SOURCES="$SOURCES $srcdir/src/filesystem/unix/*.c"
                   have_filesystem=yes
               ;;
             esac
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_UNIX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
            have_timers=yes
        fi
        # Set up files for udev hotplugging support
        if test x$enable_libudev = xyes && test x$have_libudev_h_hdr = xyes; then
            SOURCES="$SOURCES $srcdir/src/core/linux/SDL_udev.c"
        fi
        # Set up files for evdev input
        if test x$use_input_events = xyes; then
            SOURCES="$SOURCES $srcdir/src/core/linux/SDL_evdev.c"
            SOURCES="$SOURCES $srcdir/src/core/linux/SDL_evdev_kbd.c"
            SOURCES="$SOURCES $srcdir/src/core/freebsd/SDL_evdev_kbd_freebsd.c"
        fi
        # Set up files for wscons input
        if test x$use_input_wscons = xyes; then
            SOURCES="$SOURCES $srcdir/src/core/openbsd/SDL_wscons_kbd.c"
            SOURCES="$SOURCES $srcdir/src/core/openbsd/SDL_wscons_mouse.c"
        fi
        # Set up other core UNIX files
        SOURCES="$SOURCES $srcdir/src/core/linux/SDL_evdev_capabilities.c"
        SOURCES="$SOURCES $srcdir/src/core/linux/SDL_threadprio.c"
        SOURCES="$SOURCES $srcdir/src/core/unix/*.c"
        ;;
    *-*-cygwin* | *-*-mingw*)
        ARCH=win32
        if test "$build" != "$host"; then # cross-compiling
            # Default cross-compile location
            ac_default_prefix=/usr/local/cross-tools/$host
        else
            # Look for the location of the tools and install there
            if test "$BUILD_PREFIX" != ""; then
                ac_default_prefix=$BUILD_PREFIX
            fi
        fi
        if test x$enable_loadso = xyes; then
            have_loadso=yes
        fi
        CheckDeclarationAfterStatement
        CheckDummyVideo
        CheckOffscreenVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckWINDOWS
        CheckWINDOWSGL
        CheckWINDOWSGLES
        CheckVulkan
        CheckDIRECTX
        CheckHIDAPI

        # Set up the core platform files
        SOURCES="$SOURCES $srcdir/src/core/windows/*.c"
        # Set up files for the misc library
        if test x$enable_misc = xyes; then
            SOURCES="$SOURCES $srcdir/src/misc/windows/*.c"
            have_misc=yes
        fi
        # Use the Windows locale APIs.
        if test x$enable_locale = xyes; then
            SOURCES="$SOURCES $srcdir/src/locale/windows/*.c"
            have_locale=yes
        fi
        # Set up files for the video library
        if test x$enable_video = xyes; then
            AC_DEFINE(SDL_VIDEO_DRIVER_WINDOWS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/windows/*.c"
            have_video=yes
            AC_ARG_ENABLE(render-d3d,
[AS_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [default=yes]])],
                                , enable_render_d3d=yes)
            if test x$enable_render_d3d = xyes -a x$have_d3d = xyes; then
                AC_DEFINE(SDL_VIDEO_RENDER_D3D, 1, [ ])
                SUMMARY_video="${SUMMARY_video} d3d9"
            fi
            if test x$enable_render_d3d = xyes -a x$have_d3d11 = xyes; then
                AC_DEFINE(SDL_VIDEO_RENDER_D3D11, 1, [ ])
                SUMMARY_video="${SUMMARY_video} d3d11"
            fi
        fi
        # Set up files for the audio library
        if test x$enable_audio = xyes; then
            AC_DEFINE(SDL_AUDIO_DRIVER_WINMM, 1, [ ])
            SUMMARY_audio="${SUMMARY_audio} winmm"
            SOURCES="$SOURCES $srcdir/src/audio/winmm/*.c"
            if test x$have_dsound = xyes; then
                AC_DEFINE(SDL_AUDIO_DRIVER_DSOUND, 1, [ ])
                SUMMARY_audio="${SUMMARY_audio} directsound"
                SOURCES="$SOURCES $srcdir/src/audio/directsound/*.c"
            fi
            if test x$have_wasapi = xyes -a x$enable_wasapi = xyes; then
                AC_DEFINE(SDL_AUDIO_DRIVER_WASAPI, 1, [ ])
                SUMMARY_audio="${SUMMARY_audio} wasapi"
                SOURCES="$SOURCES $srcdir/src/audio/wasapi/*.c"
            fi
            have_audio=yes
        fi
        # Set up files for the joystick library
        if test x$enable_joystick = xyes; then
            AC_DEFINE(SDL_JOYSTICK_RAWINPUT, 1, [ ])
            if test x$have_dinput = xyes -o x$have_xinput = xyes -o x$have_wgi = xyes; then
                if test x$have_xinput = xyes; then
                    AC_DEFINE(SDL_JOYSTICK_XINPUT, 1, [ ])
                fi
                if test x$have_wgi = xyes; then
                    AC_DEFINE(SDL_JOYSTICK_WGI, 1, [ ])
                fi
                if test x$have_dinput = xyes; then
                    AC_DEFINE(SDL_JOYSTICK_DINPUT, 1, [ ])
                    EXTRA_LDFLAGS="$EXTRA_LDFLAGS -ldinput8 -ldxguid -ldxerr8"
                fi
            fi
            SOURCES="$SOURCES $srcdir/src/joystick/windows/*.c"
            have_joystick=yes
        fi
        if test x$enable_haptic = xyes; then
            if test x$have_dinput = xyes -o x$have_xinput = xyes; then
                if test x$have_xinput = xyes; then
                    AC_DEFINE(SDL_HAPTIC_XINPUT, 1, [ ])
                fi
                if test x$have_dinput = xyes; then
                    AC_DEFINE(SDL_HAPTIC_DINPUT, 1, [ ])
                fi
                SOURCES="$SOURCES $srcdir/src/haptic/windows/*.c"
                have_haptic=yes
            fi
        fi
        # Set up files for the sensor library
        AC_CHECK_HEADER(sensorsapi.h,have_winsensors=yes,have_winsensors=no)
        if test x$have_winsensors = xyes; then
            AC_DEFINE(HAVE_SENSORSAPI_H, 1, [ ])
        fi
        if test x$enable_sensor = xyes -a x$have_winsensors = xyes; then
            AC_DEFINE(SDL_SENSOR_WINDOWS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/sensor/windows/*.c"
            have_sensor=yes
        fi
        # Set up files for the power library
        if test x$enable_power = xyes; then
            AC_DEFINE(SDL_POWER_WINDOWS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/power/windows/SDL_syspower.c"
            have_power=yes
        fi
        # Set up files for the filesystem library
        if test x$enable_filesystem = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_WINDOWS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/filesystem/windows/SDL_sysfilesystem.c"
            have_filesystem=yes
        fi
        # Set up files for the thread library
        if test x$enable_threads = xyes; then
            AC_DEFINE(SDL_THREAD_GENERIC_COND_SUFFIX, 1, [ ])
            AC_DEFINE(SDL_THREAD_WINDOWS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/thread/windows/*.c"
            SOURCES="$SOURCES $srcdir/src/thread/generic/SDL_syscond.c"
            have_threads=yes
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_WINDOWS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/windows/*.c"
            have_timers=yes
        fi
        # Set up files for the shared object loading library
        if test x$enable_loadso = xyes; then
            AC_DEFINE(SDL_LOADSO_WINDOWS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/loadso/windows/*.c"
        fi
        # Set up the system libraries we need
        if test -f /lib/w32api/libuuid.a; then
            LIBUUID=/lib/w32api/libuuid.a
        else
            LIBUUID=-luuid
        fi
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion $LIBUUID"
        BUILD_LDFLAGS="$BUILD_LDFLAGS -Wc,-static-libgcc"
        # The Windows platform requires special setup
        VERSION_SOURCES="$srcdir/src/main/windows/*.rc"
        SDLMAIN_SOURCES="$srcdir/src/main/windows/*.c"
        SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
        SDL_LIBS="-lSDL2main $SDL_LIBS -mwindows"

        # Check to see if this is a mingw or cygwin build
        have_mingw32=
        AC_CHECK_LIB(mingw32, main, [have_mingw32=yes])
        if test x$have_mingw32 = xyes; then
            SDL_LIBS="-lmingw32 $SDL_LIBS"
        else
            SDL_LIBS="-lcygwin $SDL_LIBS"
        fi
        ;;
dnl BeOS support removed after SDL 2.0.1. Haiku still works.  --ryan.
    *-*-beos*)
        AC_MSG_ERROR([
*** BeOS support has been removed as of SDL 2.0.2.
        ])
        ;;
    *-*-haiku*)
        ARCH=haiku
        ac_default_prefix=/boot/system
        CheckDummyVideo
        CheckOffscreenVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckDLOPEN
        CheckO_CLOEXEC
        CheckHaikuVideo
        CheckHaikuGL
        CheckPTHREAD

        # Set up files for the audio library
        if test x$enable_audio = xyes; then
            AC_DEFINE(SDL_AUDIO_DRIVER_HAIKU, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/haiku/*.cc"
            SUMMARY_audio="${SUMMARY_audio} haiku"
            have_audio=yes
        fi
        # Set up files for the joystick library
        if test x$enable_joystick = xyes; then
            AC_DEFINE(SDL_JOYSTICK_HAIKU, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/joystick/haiku/*.cc"
            have_joystick=yes
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_HAIKU, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/haiku/*.c"
            have_timers=yes
        fi
        # Set up files for the system power library
        if test x$enable_power = xyes; then
            AC_DEFINE(SDL_POWER_HAIKU, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/power/haiku/*.c"
            have_power=yes
        fi
        # Set up files for the system filesystem library
        if test x$enable_filesystem = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_HAIKU, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/filesystem/haiku/*.cc"
            have_filesystem=yes
        fi
        # Set up files for the misc library
        if test x$enable_misc = xyes; then
            SOURCES="$SOURCES $srcdir/src/misc/haiku/*.cc"
            have_misc=yes
        fi
        # Set up files for the locale library
        if test x$enable_locale = xyes; then
            SOURCES="$SOURCES $srcdir/src/locale/haiku/*.cc"
            have_locale=yes
        fi
        # The Haiku platform requires special setup.
        SOURCES="$srcdir/src/main/haiku/*.cc $SOURCES"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lroot -lbe -lmedia -lgame -ldevice -ltextencoding"
        ;;
    *-ios-*)
        ARCH=ios

        CheckVisibilityHidden
        CheckDeclarationAfterStatement
        CheckDummyVideo
        CheckOffscreenVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckDLOPEN
        CheckO_CLOEXEC
        CheckMETAL
        CheckVulkan
        CheckPTHREAD

        # Set up files for the misc library
        if test x$enable_misc = xyes; then
            SOURCES="$SOURCES $srcdir/src/misc/ios/*.m"
            have_misc=yes
        fi
        # Set up files for the locale library
        if test x$enable_locale = xyes; then
            SOURCES="$SOURCES $srcdir/src/locale/macosx/*.m"
            have_locale=yes
        fi
        # Set up files for the audio library
        if test x$enable_audio = xyes; then
            AC_DEFINE(SDL_AUDIO_DRIVER_COREAUDIO, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/coreaudio/*.m"
            SUMMARY_audio="${SUMMARY_audio} coreaudio"
            have_audio=yes
        fi
        # Set up files for the joystick library
        if test x$enable_joystick = xyes; then
            AC_DEFINE(SDL_JOYSTICK_MFI, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/joystick/iphoneos/*.m"
            SOURCES="$SOURCES $srcdir/src/joystick/steam/*.c"
            have_joystick=yes
        else
            # Need this code for accelerometer as joystick support
            SOURCES="$SOURCES $srcdir/src/joystick/iphoneos/*.m"
        fi
        # Set up files for the haptic library
        #if test x$enable_haptic = xyes; then
        #    SOURCES="$SOURCES $srcdir/src/haptic/darwin/*.c"
        #    have_haptic=yes
        #    EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,ForceFeedback"
        #fi
        # Set up files for the sensor library
        if test x$enable_sensor = xyes; then
            AC_DEFINE(SDL_SENSOR_COREMOTION, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/sensor/coremotion/*.m"
            have_sensor=yes
        fi
        # Set up files for the power library
        if test x$enable_power = xyes; then
            AC_DEFINE(SDL_POWER_UIKIT, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/power/uikit/*.m"
            have_power=yes
        fi
        # Set up files for the filesystem library
        if test x$enable_filesystem = xyes; then
            SOURCES="$SOURCES $srcdir/src/filesystem/cocoa/*.m"
            have_filesystem=yes
        fi
        # Set up additional files for the file library
        if test x$enable_file = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_COCOA, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/file/cocoa/*.m"
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_UNIX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
            have_timers=yes
        fi
        # Set up other core UNIX files
        SOURCES="$SOURCES $srcdir/src/core/unix/*.c"
        # The iOS platform requires special setup.
        AC_DEFINE(SDL_VIDEO_DRIVER_UIKIT, 1, [ ])
        AC_DEFINE(SDL_VIDEO_OPENGL_ES2, 1, [ ])
        AC_DEFINE(SDL_VIDEO_OPENGL_ES, 1, [ ])
        AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES, 1, [ ])
        AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES2, 1, [ ])
        SOURCES="$SOURCES $srcdir/src/video/uikit/*.m"
        SUMMARY_video="${SUMMARY_video} uikit"
        have_video=yes
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lm -liconv -lobjc"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,AVFoundation"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,AudioToolbox"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,CoreAudio"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,CoreGraphics"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,CoreMotion"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Foundation"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,GameController"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,OpenGLES"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,QuartzCore"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,UIKit"

        if test x$enable_video_metal = xyes -o x$enable_video_vulkan = xyes; then
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Metal"
        fi
        ;;
    *-*-darwin* )
        # This could be either full "Mac OS X", or plain "Darwin" which is
        # just the OS X kernel sans upper layers like Carbon and Cocoa.
        # Next line is broken, and a few files below require Mac OS X (full)
        ARCH=macosx

        # Mac OS X builds with both the Carbon and OSX APIs at the moment
        EXTRA_CFLAGS="$EXTRA_CFLAGS -DTARGET_API_MAC_CARBON"
        EXTRA_CFLAGS="$EXTRA_CFLAGS -DTARGET_API_MAC_OSX"

        CheckVisibilityHidden
        CheckDeclarationAfterStatement
        CheckDummyVideo
        CheckOffscreenVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckDLOPEN
        CheckO_CLOEXEC
        CheckCOCOA
        CheckMETAL
        CheckX11
        CheckMacGL
        CheckMacGLES
        CheckGLX
        CheckOpenGL
        CheckVulkan
        CheckPTHREAD
        CheckHIDAPI

        # Set up files for the misc library
        if test x$enable_misc = xyes; then
            SOURCES="$SOURCES $srcdir/src/misc/macosx/*.m"
            have_misc=yes
        fi
        # Set up files for the locale library
        if test x$enable_locale = xyes; then
            SOURCES="$SOURCES $srcdir/src/locale/macosx/*.m"
            have_locale=yes
        fi
        # Set up files for the audio library
        if test x$enable_audio = xyes; then
            AC_DEFINE(SDL_AUDIO_DRIVER_COREAUDIO, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/coreaudio/*.m"
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,CoreAudio -Wl,-framework,AudioToolbox"
            SUMMARY_audio="${SUMMARY_audio} coreaudio"
            have_audio=yes
        fi
        # Set up files for the joystick library
        if test x$enable_joystick = xyes; then
            AC_DEFINE(SDL_JOYSTICK_IOKIT, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/joystick/darwin/*.c"
            SOURCES="$SOURCES $srcdir/src/joystick/iphoneos/*.m"
            CheckJoystickMFI
            have_joystick=yes
        fi
        # Set up files for the haptic library
        if test x$enable_haptic = xyes; then
            AC_DEFINE(SDL_HAPTIC_IOKIT, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/haptic/darwin/*.c"
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,ForceFeedback"
            have_haptic=yes
        fi
        # Set up files for the power library
        if test x$enable_power = xyes; then
            AC_DEFINE(SDL_POWER_MACOSX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/power/macosx/*.c"
            have_power=yes
        fi
        # Set up files for the filesystem library
        if test x$enable_filesystem = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_COCOA, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/filesystem/cocoa/*.m"
            have_filesystem=yes
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_UNIX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
            have_timers=yes
        fi
        # Set up additional files for the file library
        if test x$enable_file = xyes; then
            SOURCES="$SOURCES $srcdir/src/file/cocoa/*.m"
        fi
        # Set up other core UNIX files
        SOURCES="$SOURCES $srcdir/src/core/unix/*.c"
        # The Mac OS X platform requires special setup.
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lobjc"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,CoreVideo"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Cocoa"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,Carbon"
        EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-framework,IOKit"

        if test x$enable_video_metal = xyes -o x$enable_video_vulkan = xyes; then
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -Wl,-weak_framework,QuartzCore -Wl,-weak_framework,Metal"
        fi
        ;;
    *-nacl|*-pnacl)
        ARCH=nacl
        CheckNativeClient
        CheckDummyAudio
        CheckDummyVideo
        CheckOffscreenVideo
        CheckInputEvents
        CheckPTHREAD
        CheckO_CLOEXEC

        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_UNIX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
            have_timers=yes
        fi

        if test x$enable_filesystem = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_NACL, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/filesystem/nacl/*.c"
            have_filesystem=yes
        fi
        ;;
    *-*-emscripten* )
        if test x$enable_video = xyes; then
            AC_DEFINE(SDL_VIDEO_DRIVER_EMSCRIPTEN, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/emscripten/*.c"
            have_video=yes
            SUMMARY_video="${SUMMARY_video} emscripten"
        fi

        if test x$enable_audio = xyes; then
            AC_DEFINE(SDL_AUDIO_DRIVER_EMSCRIPTEN, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/emscripten/*.c"
            have_audio=yes
            SUMMARY_audio="${SUMMARY_audio} emscripten"
        fi

        CheckVisibilityHidden
        CheckDeclarationAfterStatement
        CheckDummyVideo
        CheckOffscreenVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckPTHREAD
        CheckDLOPEN
        CheckClockGettime
        CheckEmscriptenGLES

        # Set up files for the misc library
        if test x$enable_misc = xyes; then
            SOURCES="$SOURCES $srcdir/src/misc/emscripten/*.c"
            have_misc=yes
        fi

         # Set up files for the power library
        if test x$enable_power = xyes; then
            AC_DEFINE(SDL_POWER_EMSCRIPTEN, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/power/emscripten/*.c"
            have_power=yes
        fi

        # Set up files for the joystick library
        if test x$enable_joystick = xyes; then
            AC_DEFINE(SDL_JOYSTICK_EMSCRIPTEN, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/joystick/emscripten/*.c"
            have_joystick=yes
        fi

        # Set up files for the filesystem library
        if test x$enable_filesystem = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_EMSCRIPTEN, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/filesystem/emscripten/*.c"
            have_filesystem=yes
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_UNIX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
            have_timers=yes
        fi
        # Set up files for the locale library
        if test x$enable_locale = xyes; then
            SOURCES="$SOURCES $srcdir/src/locale/emscripten/*.c"
            have_locale=yes
        fi
        ;;
    *-*-riscos*)
        ARCH=riscos
        CheckVisibilityHidden
        CheckDeclarationAfterStatement
        CheckDummyVideo
        CheckOffscreenVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckDLOPEN
        CheckO_CLOEXEC
        CheckOSS
        CheckPTHREAD
        CheckClockGettime

        # Set up files for the misc library
        if test x$enable_misc = xyes; then
            SOURCES="$SOURCES $srcdir/src/misc/riscos/*.c"
            have_misc=yes
        fi
        # Set up files for the video library
        if test x$enable_video = xyes; then
            AC_DEFINE(SDL_VIDEO_DRIVER_RISCOS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/riscos/*.c"
            have_video=yes
            SUMMARY_video="${SUMMARY_video} riscos"
        fi
        # Set up files for the filesystem library
        if test x$enable_filesystem = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_RISCOS, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/filesystem/riscos/*.c"
            have_filesystem=yes
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_UNIX, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
            have_timers=yes
        fi
        ;;
    *-*-os2*)
        ARCH=os2
        if test "$build" != "$host"; then # cross-compiling
            # Default cross-compile location
            ac_default_prefix=/@unixroot/usr/local/cross-tools/$host
        else
            # Look for the location of the tools and install there
            if test "$BUILD_PREFIX" != ""; then
                ac_default_prefix=$BUILD_PREFIX
            fi
        fi
        enable_static=no # disable static builds
        EXTRA_CFLAGS="$EXTRA_CFLAGS -DBUILD_SDL -DOS2EMX_PLAIN_CHAR"
        CheckOS2
        CheckDeclarationAfterStatement
        CheckDummyVideo
        CheckDiskAudio
        CheckDummyAudio
        CheckHIDAPI

        # Set up the core platform files
        SOURCES="$SOURCES $srcdir/src/core/os2/*.c"
        if test x$ac_cv_func_iconv != xyes -o x$ac_cv_header_iconv_h != xyes; then
            SOURCES="$SOURCES $srcdir/src/core/os2/geniconv/*.c"
        fi
        # Use the Unix locale APIs.
        if test x$enable_locale = xyes; then
            SOURCES="$SOURCES $srcdir/src/locale/unix/*.c"
            have_locale=yes
        fi
        # Set up files for the video library
        if test x$enable_video = xyes; then
            AC_DEFINE(SDL_VIDEO_DRIVER_OS2, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/video/os2/*.c"
            have_video=yes
            SUMMARY_video="${SUMMARY_video} os/2"
        fi
        # Set up files for the audio library
        if test x$enable_audio = xyes; then
            AC_DEFINE(SDL_AUDIO_DRIVER_OS2, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/audio/os2/*.c"
            have_audio=yes
            SUMMARY_audio="${SUMMARY_audio} os/2"
            EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lmmpm2"
        fi
        # Set up files for the thread library
        if test x$enable_threads = xyes; then
            AC_DEFINE(SDL_THREAD_OS2, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/thread/os2/*.c"
            SOURCES="$SOURCES $srcdir/src/thread/generic/SDL_syscond.c"
            have_threads=yes
        fi
        # Set up files for the timer library
        if test x$enable_timers = xyes; then
            AC_DEFINE(SDL_TIMER_OS2, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/timer/os2/*.c"
            have_timers=yes
        fi
        # Set up files for the shared object loading library
        if test x$enable_loadso = xyes; then
            AC_DEFINE(SDL_LOADSO_OS2, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/loadso/os2/*.c"
            have_loadso=yes
        fi
        # Set up files for the filesystem library
        if test x$enable_filesystem = xyes; then
            AC_DEFINE(SDL_FILESYSTEM_OS2, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/filesystem/os2/*.c"
            have_filesystem=yes
        fi
        # Set up files for the joystick library
        if test x$enable_joystick = xyes; then
            AC_DEFINE(SDL_JOYSTICK_OS2, 1, [ ])
            SOURCES="$SOURCES $srcdir/src/joystick/os2/*.c"
            have_joystick=yes
        fi
        ;;
    *)
        AC_MSG_ERROR([
*** Unsupported host:  Please add to configure.ac
        ])
        ;;
esac

dnl Permit use of virtual joystick APIs on any platform (subject to configure options)
CheckVirtualJoystick

# Check whether to install sdl2-config
AC_MSG_CHECKING(whether to install sdl2-config)
AC_ARG_ENABLE([sdl2-config],
    [AS_HELP_STRING([--enable-sdl2-config],[Install sdl2-config [default=yes]])],
    [case "${enableval}" in
        yes) enable_sdl2_config="TRUE" ;;
        no) enable_sdl2_config="FALSE" ;;
        *) AC_MSG_ERROR([bad value '${enableval}' for --enable-sdl2-config]) ;;
    esac], [enable_sdl2_config="TRUE"])
if test "$enable_sdl2_config" = "TRUE"; then
    AC_MSG_RESULT(yes)
else
    AC_MSG_RESULT(no)
fi
AC_SUBST([INSTALL_SDL2_CONFIG], [$enable_sdl2_config])

# Verify that we have all the platform specific files we need

if test x$have_audio != xyes; then
    if test x$enable_audio = xyes; then
        AC_DEFINE(SDL_AUDIO_DRIVER_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/audio/dummy/*.c"
fi
if test x$have_video != xyes; then
    if test x$enable_video = xyes; then
        AC_DEFINE(SDL_VIDEO_DRIVER_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/video/dummy/*.c"
fi
if test x$have_misc != xyes; then
    if test x$enable_misc = xyes; then
        AC_DEFINE(SDL_MISC_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/misc/dummy/*.c"
fi
if test x$have_locale != xyes; then
    if test x$enable_locale = xyes; then
        AC_DEFINE(SDL_LOCALE_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/locale/dummy/*.c"
fi
if test x$have_joystick != xyes; then
    if test x$enable_joystick = xyes; then
        AC_DEFINE(SDL_JOYSTICK_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/joystick/dummy/*.c"
fi
if test x$have_haptic != xyes; then
    if test x$enable_haptic = xyes; then
        AC_DEFINE(SDL_HAPTIC_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/haptic/dummy/*.c"
fi
if test x$have_sensor != xyes; then
    if test x$enable_sensor = xyes; then
        AC_DEFINE(SDL_SENSOR_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/sensor/dummy/*.c"
fi
if test x$have_threads != xyes; then
    if test x$enable_threads = xyes; then
        AC_DEFINE(SDL_THREADS_DISABLED, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/thread/generic/*.c"
fi
if test x$have_timers != xyes; then
    if test x$enable_timers = xyes; then
        AC_DEFINE(SDL_TIMER_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/timer/dummy/*.c"
fi
if test x$have_filesystem != xyes; then
    if test x$enable_filesystem = xyes; then
        AC_DEFINE(SDL_FILESYSTEM_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/filesystem/dummy/*.c"
fi
if test x$have_loadso != xyes; then
    if test x$enable_loadso = xyes; then
        AC_DEFINE(SDL_LOADSO_DUMMY, 1, [ ])
    fi
    SOURCES="$SOURCES $srcdir/src/loadso/dummy/*.c"
fi
if test x$SDLMAIN_SOURCES = x; then
    SDLMAIN_SOURCES="$srcdir/src/main/dummy/*.c"
fi
SDLTEST_SOURCES="$srcdir/src/test/*.c"

if test x$video_wayland = xyes; then
    WAYLAND_PROTOCOLS=`cd $srcdir/wayland-protocols ; for p in *.xml ; do printf '%s' "\$p" |sed 's,\\.xml\$, ,g' ; done`
    WAYLAND_PROTOCOLS_SOURCES=`for p in $WAYLAND_PROTOCOLS ; do printf '%s' "\\$(gen)/\$p-protocol.c " ; done`
    WAYLAND_PROTOCOLS_HEADERS=`for p in $WAYLAND_PROTOCOLS ; do printf '%s' "\\$(gen)/\$p-client-protocol.h " ; done`
    GEN_SOURCES="$GEN_SOURCES $WAYLAND_PROTOCOLS_SOURCES"
    GEN_HEADERS="$GEN_HEADERS $WAYLAND_PROTOCOLS_HEADERS"

    WAYLAND_PROTOCOLS_DEPENDS=`for p in $WAYLAND_PROTOCOLS ; do\
        echo ;\
        printf '%s\n' "\\$(gen)/\$p-client-protocol.h: \\$(srcdir)/wayland-protocols/\$p.xml" ;\
        printf '%s\n' "	@\\$(SHELL) \\$(auxdir)/mkinstalldirs \\$(gen)" ;\
        printf '%s\n' "	\\$(RUN_CMD_GEN)\\$(WAYLAND_SCANNER) client-header \\$< \\$@" ;\
        echo ;\
        printf '%s\n' "\\$(gen)/\$p-protocol.c: \\$(srcdir)/wayland-protocols/\$p.xml" ;\
        printf '%s\n' "	@\\$(SHELL) \\$(auxdir)/mkinstalldirs \\$(gen)" ;\
        printf '%s\n' "	\\$(RUN_CMD_GEN)\\$(WAYLAND_SCANNER) \\$(WAYLAND_SCANNER_CODE_MODE) \\$< \\$@" ;\
        echo ;\
        printf '%s\n' "\\$(objects)/\$p-protocol.lo: \\$(gen)/\$p-protocol.c \\$(gen)/\$p-client-protocol.h" ;\
        printf '%s\n' "	@\\$(SHELL) \\$(auxdir)/mkinstalldirs \\$(objects)" ;\
        printf '%s\n' "	\\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@" ;\
        done ;\
        echo ;\
        for s in $WAYLAND_SOURCES ; do printf '%s' "\$s:" ; printf ' \$(gen)/%s-client-protocol.h' $WAYLAND_PROTOCOLS ; echo ; done ; echo`
fi

OBJECTS=`echo $SOURCES`
DEPENDS=`echo $SOURCES | tr ' ' '\n'`
for EXT in asm cc m c S; do
    OBJECTS=`echo "$OBJECTS" | sed 's,[[^ ]]*/\([[^ ]]*\)\.'$EXT',$(objects)/\1.lo,g'`
    DEPENDS=`echo "$DEPENDS" | sed "s,^\\([[^ ]]*\\)/\\([[^ ]]*\\)\\.$EXT\\$,\\\\
\\$(objects)/\\2.lo: \\1/\\2.$EXT \\$(objects)/.created\\\\
	\\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@,g"`
done

GEN_OBJECTS=`echo "$GEN_SOURCES" | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.lo,g'`

VERSION_OBJECTS=`echo $VERSION_SOURCES`
VERSION_DEPENDS=`echo $VERSION_SOURCES`
VERSION_OBJECTS=`echo "$VERSION_OBJECTS" | sed 's,[[^ ]]*/\([[^ ]]*\)\.rc,$(objects)/\1.lo,g'`
VERSION_DEPENDS=`echo "$VERSION_DEPENDS" | sed "s,\\([[^ ]]*\\)/\\([[^ ]]*\\)\\.rc,\\\\
\\$(objects)/\\2.lo: \\1/\\2.rc \\$(objects)/.created\\\\
	\\$(RUN_CMD_RC)\\$(LIBTOOL) --mode=compile --tag=RC \\$(RC) -i \\$< -o \\$@,g"`

SDLMAIN_OBJECTS=`echo $SDLMAIN_SOURCES`
SDLMAIN_DEPENDS=`echo $SDLMAIN_SOURCES`
SDLMAIN_OBJECTS=`echo "$SDLMAIN_OBJECTS" | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.lo,g'`
SDLMAIN_DEPENDS=`echo "$SDLMAIN_DEPENDS" | sed "s,\\([[^ ]]*\\)/\\([[^ ]]*\\)\\.c,\\\\
\\$(objects)/\\2.lo: \\1/\\2.c \\$(objects)/.created\\\\
	\\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@,g"`

SDLTEST_OBJECTS=`echo $SDLTEST_SOURCES`
SDLTEST_DEPENDS=`echo $SDLTEST_SOURCES`
SDLTEST_OBJECTS=`echo "$SDLTEST_OBJECTS" | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.lo,g'`
SDLTEST_DEPENDS=`echo "$SDLTEST_DEPENDS" | sed "s,\\([[^ ]]*\\)/\\([[^ ]]*\\)\\.c,\\\\
\\$(objects)/\\2.lo: \\1/\\2.c \\$(objects)/.created\\\\
	\\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@,g"`

# Set runtime shared library paths as needed

if test "x$enable_rpath" = "xyes" -a "x$enable_shared" = "xyes"; then
  if test $ARCH = bsdi -o $ARCH = freebsd -o $ARCH = linux -o $ARCH = netbsd; then
    SDL_RLD_FLAGS="-Wl,-rpath,\${libdir}"

    AC_MSG_CHECKING(for linker option --enable-new-dtags)
    have_enable_new_dtags=no
    save_LDFLAGS="$LDFLAGS"
    LDFLAGS="$LDFLAGS -Wl,--enable-new-dtags"
    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [
    have_enable_new_dtags=yes
    SDL_RLD_FLAGS="$SDL_RLD_FLAGS -Wl,--enable-new-dtags"
    ],[])
    LDFLAGS="$save_LDFLAGS"
    AC_MSG_RESULT($have_enable_new_dtags)
  fi
  if test $ARCH = solaris; then
    SDL_RLD_FLAGS="-R\${libdir}"
  fi
else
  SDL_RLD_FLAGS=""
fi

SDL_STATIC_LIBS="$EXTRA_LDFLAGS"

dnl Expand the cflags and libraries needed by apps using SDL
AC_SUBST(SDL_CFLAGS)
AC_SUBST(SDL_LIBS)
AC_SUBST(SDL_STATIC_LIBS)
AC_SUBST(SDL_RLD_FLAGS)
if test x$enable_shared = xyes; then
    PKGCONFIG_LIBS_PRIV="
Libs.private:"
    ENABLE_SHARED_TRUE=
    ENABLE_SHARED_FALSE="#"
else
    PKGCONFIG_LIBS_PRIV=
    ENABLE_SHARED_TRUE="#"
    ENABLE_SHARED_FALSE=
fi
if test x$enable_static = xyes; then
    ENABLE_STATIC_TRUE=
    ENABLE_STATIC_FALSE="#"
else
    ENABLE_STATIC_TRUE="#"
    ENABLE_STATIC_FALSE=
fi
AC_SUBST(PKGCONFIG_LIBS_PRIV)
AC_SUBST(ENABLE_SHARED_TRUE)
AC_SUBST(ENABLE_SHARED_FALSE)
AC_SUBST(ENABLE_STATIC_TRUE)
AC_SUBST(ENABLE_STATIC_FALSE)

dnl Expand the sources and objects needed to build the library
AC_SUBST(ac_aux_dir)
AC_SUBST(INCLUDE)
AC_SUBST(OBJECTS)
AC_SUBST(GEN_HEADERS)
AC_SUBST(GEN_OBJECTS)
AC_SUBST(VERSION_OBJECTS)
AC_SUBST(SDLMAIN_OBJECTS)
AC_SUBST(SDLTEST_OBJECTS)
AC_SUBST(BUILD_CFLAGS)
AC_SUBST(EXTRA_CFLAGS)
AC_SUBST(BUILD_LDFLAGS)
AC_SUBST(EXTRA_LDFLAGS)
AC_SUBST(WAYLAND_SCANNER)
AC_SUBST(WAYLAND_SCANNER_CODE_MODE)

cat >Makefile.rules <<__EOF__

# Build rules for objects
-include \$(OBJECTS:.lo=.d)

# Special dependency for SDL.c, since it depends on SDL_revision.h
$srcdir/src/SDL.c: update-revision
$DEPENDS
$VERSION_DEPENDS
$SDLMAIN_DEPENDS
$SDLTEST_DEPENDS
$WAYLAND_PROTOCOLS_DEPENDS
__EOF__

AC_CONFIG_FILES([
    Makefile:Makefile.in:Makefile.rules sdl2-config sdl2-config.cmake sdl2-config-version.cmake SDL2.spec sdl2.pc
])
AC_CONFIG_COMMANDS([sdl2_config],[chmod a+x sdl2-config])

SUMMARY="SDL2 Configure Summary:\n"
if test x$enable_shared = xyes; then
    SUMMARY="${SUMMARY}Building Shared Libraries\n"
fi
if test x$enable_static = xyes; then
    SUMMARY="${SUMMARY}Building Static Libraries\n"
fi
SUMMARY="${SUMMARY}Enabled modules :${SUMMARY_modules}\n"
SUMMARY="${SUMMARY}Assembly Math   :${SUMMARY_math}\n" 
SUMMARY="${SUMMARY}Audio drivers   :${SUMMARY_audio}\n"
SUMMARY="${SUMMARY}Video drivers   :${SUMMARY_video}\n"
if test x$have_x = xyes; then
    SUMMARY="${SUMMARY}X11 libraries   :${SUMMARY_video_x11}\n"
fi
SUMMARY="${SUMMARY}Input drivers   :${SUMMARY_input}\n"
if test x$have_joystick_virtual = xyes; then
    SUMMARY="${SUMMARY}Enable virtual joystick APIs : YES\n"
else
    SUMMARY="${SUMMARY}Enable virtual joystick APIs : NO\n"
fi
if test x$have_samplerate_h_hdr = xyes; then
    SUMMARY="${SUMMARY}Using libsamplerate : YES\n"
else
    SUMMARY="${SUMMARY}Using libsamplerate : NO\n"
fi
if test x$have_libudev_h_hdr = xyes; then
    SUMMARY="${SUMMARY}Using libudev       : YES\n"
else
    SUMMARY="${SUMMARY}Using libudev       : NO\n"
fi
if test x$have_dbus_dbus_h_hdr = xyes; then
    SUMMARY="${SUMMARY}Using dbus          : YES\n"
else
    SUMMARY="${SUMMARY}Using dbus          : NO\n"
fi
if test x$enable_ime = xyes; then
    SUMMARY="${SUMMARY}Using ime           : YES\n"
else
    SUMMARY="${SUMMARY}Using ime           : NO\n"
fi
if test x$have_ibus_ibus_h_hdr = xyes; then
    SUMMARY="${SUMMARY}Using ibus          : YES\n"
else
    SUMMARY="${SUMMARY}Using ibus          : NO\n"
fi
if test x$have_fcitx = xyes; then
    SUMMARY="${SUMMARY}Using fcitx         : YES\n"
else
    SUMMARY="${SUMMARY}Using fcitx         : NO\n"
fi

if test x$WARN_ABOUT_ARM_SIMD_ASM_MIT = xyes; then
    SUMMARY="${SUMMARY}\nSDL is being built with ARM SIMD optimizations, which\n"
    SUMMARY="${SUMMARY}uses code licensed under the MIT license. If this is a\n"
    SUMMARY="${SUMMARY}problem, please disable that code by rerunning the\n"
    SUMMARY="${SUMMARY}configure script with:\n"
    SUMMARY="${SUMMARY}\n    --disable-arm-simd\n"
fi
if test x$WARN_ABOUT_ARM_NEON_ASM_MIT = xyes; then
    SUMMARY="${SUMMARY}\nSDL is being built with ARM NEON optimizations, which\n"
    SUMMARY="${SUMMARY}uses code licensed under the MIT license. If this is a\n"
    SUMMARY="${SUMMARY}problem, please disable that code by rerunning the\n"
    SUMMARY="${SUMMARY}configure script with:\n"
    SUMMARY="${SUMMARY}\n    --disable-arm-neon\n"
fi

AC_CONFIG_COMMANDS([summary], [printf "$SUMMARY"], [SUMMARY="$SUMMARY"])

AC_OUTPUT
