dnl ---------------------------------------------------------------------------

AC_DEFINE(PACKAGE_URL, "https://github.com/mauiaaron/apple2", [apple2ix project URL])

AC_PREREQ([2.69])
AC_INIT([apple2ix], [0.8])

AC_CANONICAL_TARGET

AM_INIT_AUTOMAKE([foreign subdir-objects])

dnl AM_CONFIG_HEADER(src/config.h) -- disable config.h because it makes it difficult/impossible to do modular builds for the test suite

AC_PROG_CC([clang gcc])
AM_PROG_CC_C_O      dnl apparently required for custom font.c target?
AM_PROG_AS
AC_PROG_INSTALL

dnl ---------------------------------------------------------------------------
dnl Arch checks

ASM_O="src/x86/glue.o src/x86/cpu.o"
TESTVM_ASM_O="src/x86/testvm-glue.o src/x86/testvm-cpu.o"
TESTDISK_ASM_O="src/x86/testdisk-glue.o src/x86/testdisk-cpu.o"
TESTTRACE_ASM_O="src/x86/testtrace-glue.o src/x86/testtrace-cpu.o"
arch=''
case $target in
    x86_64-*-*)
        arch='x64'
        ;;
    i?86-*-*)
        arch='x86'
        ;;
    x86*)
        dnl support shorthand ./configure --target=x86
        arch='x86'
        ;;
    *)
        ASM_O=""
        AC_MSG_ERROR([emulator does not presently support architecture $target])
        ;;
esac

AM_CFLAGS="-std=gnu11 -Wall"

dnl double-check compilation for x86 target
if test "$arch" = "x86" ; then
    my_save_cflags="$CFLAGS"
    AC_MSG_CHECKING([whether compiler supports x86 target])
    case $host in
        i?86-*-*)
            dnl building on an actual x86 machine presumably works
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [
                AC_MSG_RESULT([32bit w00t!])
            ], [
                AC_MSG_RESULT([oops])
                AC_MSG_ERROR([world is b0rken])
            ])
            ;;
        *)
            dnl check x86 compilation on x86_64 (or other) host
            CFLAGS="-m32 -Xassembler --32"
            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [
                AC_MSG_RESULT([w00t!])
                AC_MSG_WARN([compiling for x86 architecture appears to work, but emulator may fail to link if x86 versions of required libraries are not present...])
                dnl HACK FIXME TODO --------------------------------------------------------- ^^^^^^^^^^^^ should check for this (and check linking against all x86 versions of needed libraries
                AM_CFLAGS="$AM_CFLAGS $CFLAGS"
                dnl -------- ARCHOS_HACK_LDFLAGS="-L/usr/lib/i386-linux-gnu -L/lib/i386-linux-gnu"
            ], [
                AC_MSG_RESULT([oops])
                AC_MSG_ERROR([build system does not support building for $arch architecture])
            ])
            ;;
    esac
    CFLAGS="$my_save_cflags"
fi

AC_SUBST(ASM_O)
AC_SUBST(TESTVM_ASM_O)
AC_SUBST(TESTDISK_ASM_O)
AC_SUBST(TESTTRACE_ASM_O)
AC_SUBST([AM_CFLAGS])


dnl OS Check
AC_EGREP_CPP(unsupported_, [
#if defined(__ANDROID__)
unsupported_for_now
#elif __APPLE__
unsupported_for_now
    #include "TargetConditionals.h"
    #if TARGET_IPHONE_SIMULATOR
    #elif TARGET_OS_IPHONE
    #elif TARGET_OS_MAC
    #else
    #endif
#elif __linux
linux
#elif __unix
unix
#elif __posix
posix
#else
unknown
#endif
], [
    AC_MSG_CHECKING([Operating System ])
    AC_MSG_RESULT([unsupported])
    AC_MSG_ERROR([Apparently you have an unsupported OS, build aborted])
], [
    AC_MSG_CHECKING([Operating System ])
    AC_MSG_RESULT([supported])
])

dnl ASM underscore linking test
AC_TRY_LINK([asm("_glibc_foobar:");], [glibc_foobar()], [
    AC_MSG_NOTICE([Underscores in assembly linkage allowed...])
], [
    AC_MSG_NOTICE([Underscores in assembly linkage not allowed...])
    AC_DEFINE(NO_UNDERSCORES, 1, [Underscores allowed in assembly linkage])
])


dnl ---------------------------------------------------------------------------

AM_PROG_LEX

dnl AS_IF([test "x$LEX" = "xno"], [
dnl     AC_MSG_ERROR([Emulator needs lex/flex to build source...])
dnl ], [
dnl     AC_MSG_RESULT([Found lex $LEX])
dnl ])

dnl POSIX high-precision clock
AC_SEARCH_LIBS(clock_gettime, rt, [], [
    AC_MSG_ERROR([Emulator needs realtime clocks (-lrt) to build...])
], [])

AC_CHECK_HEADER(zlib.h, [], [
    AC_MSG_ERROR([Emulator requires zlib headers to build...])
])
AC_SEARCH_LIBS(gzopen, z, [], [
    AC_MSG_ERROR([Emulator requires zlib library to build...])
], [])

AC_CHECK_HEADER(pthread.h, [], [
    AC_MSG_ERROR([Emulator requires pthread headers to build...])
])
AC_SEARCH_LIBS(pthread_create, pthread, [], [
    AC_MSG_ERROR([Emulator requires pthread library to build...])
], [])

AC_SEARCH_LIBS(sqrtf, m, [], [
    AC_MSG_ERROR([Emulator requires math library to build...])
], [])


dnl ---------------------------------------------------------------------------
dnl Video ...

AC_PATH_XTRA

opengl_selected='yes'
AC_ARG_ENABLE([opengl], AS_HELP_STRING([--disable-opengl], [Disable OpenGL video driver (uses regular X11)]), [
    opengl_selected='no'
], [
    AC_CHECK_HEADER(GL/glew.h, [
        AC_CHECK_HEADER(GL/freeglut.h, [
            AC_SEARCH_LIBS(glCreateProgram, [GL], [
                AC_SEARCH_LIBS(glutMainLoop, [glut freeglut], [
                    AC_SEARCH_LIBS(glewInit, [GLEW glew], [
                        opengl_supported='yes'
                        AC_DEFINE(VIDEO_OPENGL, 1, [Use OpenGL])
                        AC_DEFINE(USE_GLUT, 1, [Use GLUT library])
                        VIDEO_O="src/video/glvideo.o src/video/glnode.o src/video/glalert.o src/video/glhudmodel.o src/video/glutinput.o src/video_util/matrixUtil.o src/video_util/modelUtil.o src/video_util/sourceUtil.o src/video_util/vectorUtil.o"
                        AC_MSG_RESULT([Building emulator with OpenGL support, w00t!])
                    ], [
                        AC_MSG_WARN([Did not find OpenGL GLEW library...])
                    ], [-lGL -lGLEW -lglut])
                ], [
                    AC_MSG_WARN([Did not find glut library...])
                ], [-lGL -lGLEW -lglut])
            ], [
                AC_MSG_WARN([Did not find OpenGL library...])
            ], [-lGL])
        ], [
            AC_MSG_WARN([Did not find GL/freeglut.h header ...])
        ])
    ], [
        AC_MSG_WARN([Did not find GL/glew.h header ...])
    ])
])

AS_IF([test "x$opengl_supported" = "xyes"], [
], [
    dnl OpenGL not supported
    AS_IF([test "x$opengl_selected" = "xyes"], [
        AC_MSG_WARN([Did not find OpenGL libraries, will attempt to build legacy X11 variant ...])
    ], [])

    AC_CHECK_HEADER(X11/XKBlib.h, [
        AC_SEARCH_LIBS(XPutImage, [X11], [
            AC_SEARCH_LIBS(XShmAttach, Xext, [
                AC_DEFINE(HAVE_X11_SHM, 1, [Enable X11 MIT SHM extension])
            ], [
                AC_MSG_WARN([Building emulator without support of X11 MITSHM extension...])
            ], [-lX11])
            VIDEO_O="src/video/xvideo.o"
        ], [
            AC_MSG_ERROR([Did not find OpenGL nor X11 libraries...])
        ], [-LX11])
    ], [
        AC_MSG_ERROR([Did not find OpenGL nor X11 headers...])
    ])
])

AC_SUBST(VIDEO_O)

dnl ---------------------------------------------------------------------------
dnl Sound ...

AC_ARG_ENABLE([audio], AS_HELP_STRING([--disable-audio], [Disable emulator audio output]), [], [
    AC_CHECK_HEADER(AL/al.h, [
        AC_CHECK_HEADER(AL/alc.h, [
            AC_CHECK_HEADER(AL/alext.h, [
                AC_SEARCH_LIBS(alcOpenDevice, openal, [
                    dnl found OpenAL ...
                    AC_DEFINE(AUDIO_ENABLED, 1, [Enable sound module])
                    AUDIO_GLUE_C="src/audio/speaker.c src/audio/mockingboard.c src/audio/playqueue.c"
                    AUDIO_O="src/audio/soundcore.o src/audio/soundcore-openal.o src/audio/speaker.o src/audio/playqueue.o src/audio/alhelpers.o src/audio/mockingboard.o src/audio/AY8910.o"
                ], [
                    AC_MSG_WARN([Could not find OpenAL libraries, sound will be disabled])
                ], [])
            ], [
                AC_MSG_WARN([Could not find OpenAL headers, sound will be disabled])
            ], [
#include <AL/al.h>
#include <AL/alc.h>
            ])
        ], [
            AC_MSG_WARN([Could not find OpenAL headers, sound will be disabled])
        ])
    ], [
        AC_MSG_WARN([Could not find OpenAL headers, sound will be disabled])
    ])
])
AC_SUBST(AUDIO_GLUE_C)
AC_SUBST(AUDIO_O)

dnl AS_IF([test "x$audio_disabled" = "xno"], [
dnl     ...
dnl ])


dnl ---------------------------------------------------------------------------
dnl Debugger & classic interface ...
AC_ARG_ENABLE([debugger], AS_HELP_STRING([--disable-debugger], [Disable 6502 debugging console]), [], [
    AC_DEFINE(DEBUGGER, 1, [Enable 6502 debugger module])
    META_O="src/meta/debug.o src/meta/debugger.o src/meta/opcodes.o src/test/sha1.o"
])
AC_SUBST(META_O)

AC_DEFINE(INTERFACE_CLASSIC, 1, [Use the classic menu interface])

dnl ---------------------------------------------------------------------------
dnl Misc ...

AC_DEFINE(APPLE2IX, 1, [Denotes a section of code as Apple//ix sourced, used with external sources])
AC_DEFINE(KEYPAD_JOYSTICK, 1, [Joystick emulated on keyboard ... should not be true on mobile devices])
AC_DEFINE(CONFORMANT_TRACKS, 1, [Conformant to Applewin, and apparently also to the original //e disk timing, but hella-slow on low-end mobile devices])

dnl ---------------------------------------------------------------------------

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

