--- BasiliskII/src/Windows/configure.ac 2005/03/24 23:13:09 1.2 +++ BasiliskII/src/Windows/configure.ac 2005/06/20 08:43:50 1.3 @@ -1,510 +1,522 @@ -dnl Process this file with autoconf to produce a configure script. -dnl Written in 2002 by Christian Bauer et al. - -AC_INIT([Basilisk II], 1.0, [Christian.Bauer@uni-mainz.de], BasiliskII) -AC_CONFIG_SRCDIR(main_windows.cpp) -AC_CONFIG_AUX_DIR(../Unix) -AC_PREREQ(2.52) -AC_CONFIG_HEADER(config.h) - -dnl Aliases for PACKAGE and VERSION macros. -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE_NAME", [Define this program name.]) -AC_DEFINE_UNQUOTED(VERSION, "$PACKAGE_VERSION", [Define this program version.]) - -dnl JIT compiler options. -AC_ARG_ENABLE(jit-compiler, [ --enable-jit-compiler enable JIT compiler [default=yes]], [WANT_JIT=$enableval], [WANT_JIT=yes]) -AC_ARG_ENABLE(jit-debug, [ --enable-jit-debug activate native code disassemblers [default=no]], [WANT_JIT_DEBUG=$enableval], [WANT_JIT_DEBUG=no]) - -dnl FPU emulation core. -AC_ARG_ENABLE(fpe, -[ --enable-fpe=FPE specify which fpu emulator to use [default=auto]], -[ case "$enableval" in - dnl default is always ieee, if architecture has this fp format - auto) FPE_CORE_TEST_ORDER="ieee uae";; - ieee) FPE_CORE_TEST_ORDER="ieee";; - uae) FPE_CORE_TEST_ORDER="uae";; - x86) FPE_CORE_TEST_ORDER="x86";; - *) AC_MSG_ERROR([--enable-fpe takes only one of the following values: auto, x86, ieee, uae]);; - esac -], -[ FPE_CORE_TEST_ORDER="ieee uae" -]) - -dnl Addressing modes. -AC_ARG_ENABLE(addressing, -[ --enable-addressing=AM specify the addressing mode to use [default=fastest]], -[ case "$enableval" in - direct) ADDRESSING_TEST_ORDER="direct";; - banks) ADDRESSING_TEST_ORDER="banks";; - fastest)ADDRESSING_TEST_ORDER="direct banks";; - *) AC_MSG_ERROR([--enable-addressing takes only one of the following values: fastest, direct, banks]);; - esac -], -[ ADDRESSING_TEST_ORDER="direct banks" -]) - -dnl Canonical system information. -AC_CANONICAL_HOST -AC_CANONICAL_TARGET - -dnl Target CPU type. -HAVE_I386=no -HAVE_POWERPC=no -HAVE_X86_64=no -case "$target_cpu" in - i386* | i486* | i586* | i686* | i786* ) HAVE_I386=yes;; - powerpc* ) HAVE_POWERPC=yes;; - x86_64* ) HAVE_X86_64=yes;; -esac - -dnl Checks for programs. -AC_PROG_CC -AC_PROG_CC_C_O -AC_PROG_CPP -AC_PROG_CXX -AC_PROG_MAKE_SET -AC_PROG_EGREP -AC_PROG_LN_S -AC_CHECK_TOOL(WINDRES, windres) - -dnl We use 64-bit file size support if possible. -AC_SYS_LARGEFILE - -dnl Checks for header files. -AC_HEADER_STDC - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_C_BIGENDIAN -AC_C_CONST -AC_C_INLINE -AC_CHECK_SIZEOF(short, 2) -AC_CHECK_SIZEOF(int, 4) -AC_CHECK_SIZEOF(long, 4) -AC_CHECK_SIZEOF(long long, 8) -AC_CHECK_SIZEOF(float, 4) -AC_CHECK_SIZEOF(double, 8) -AC_CHECK_SIZEOF(long double, 12) -AC_CHECK_SIZEOF(void *, 4) -AC_TYPE_OFF_T -AC_CHECK_TYPES(loff_t) -AC_CHECK_TYPES(caddr_t) -AC_TYPE_SIZE_T - -dnl Define a macro that translates a yesno-variable into a C macro definition -dnl to be put into the config.h file -dnl $1 -- the macro to define -dnl $2 -- the value to translate -dnl $3 -- template name -AC_DEFUN([AC_TRANSLATE_DEFINE], [ - if [[ "x$2" = "xyes" -o "x$2" = "xguessing yes" ]]; then - AC_DEFINE($1, 1, $3) - fi -]) - -dnl Check that VirtualAlloc(), VirtualProtect() work -AC_CACHE_CHECK([whether VirtualProtect works], - ac_cv_VirtualProtect_works, [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_cv_VirtualProtect_works=yes - dnl First the tests that should segfault - for test_def in NONE_READ NONE_WRITE READ_WRITE; do - AC_TRY_RUN([ - #define HAVE_WIN32_VM 1 - #define CONFIGURE_TEST_VM_MAP - #define TEST_VM_PROT_$test_def - #include "../Unix/vm_alloc.cpp" - ], ac_cv_VirtualProtect_works=no, rm -f core, - dnl When cross-compiling, assume it works - ac_cv_VirtualProtect_works="yes" - ) - done - AC_TRY_RUN([ - #define HAVE_WIN32_VM 1 - #define CONFIGURE_TEST_VM_MAP - #define TEST_VM_PROT_RDWR_WRITE - #include "../Unix/vm_alloc.cpp" - ], , ac_cv_VirtualProtect_works=no, - dnl When cross-compiling, assume it works - ac_cv_VirtualProtect_works="yes" - ) - AC_LANG_RESTORE - ] -) -if [[ "x$ac_cv_VirtualProtect_works" = "xyes" ]]; then - AC_DEFINE(HAVE_WIN32_VM, 1, [Define if your system has a working Win32-based memory allocator.]) -else - AC_MSG_ERROR([Sorry, Windows VM functions don't work as expected on your system.]) -fi - -dnl Check if Windows exceptions are supported. -AC_CACHE_CHECK([whether your system supports Windows exceptions], - ac_cv_have_win32_exceptions, [ - AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_RUN([ - #define HAVE_WIN32_EXCEPTIONS 1 - #define CONFIGURE_TEST_SIGSEGV_RECOVERY - #include "../Unix/vm_alloc.cpp" - #include "../Unix/sigsegv.cpp" - ], - ac_cv_have_win32_exceptions=yes, - ac_cv_have_win32_exceptions=no, - dnl When cross-compiling, assume it works - ac_cv_have_win32_exceptions="yes" - ) - AC_LANG_RESTORE - ] -) -if [[ "x$ac_cv_have_win32_exceptions" = "xyes" ]]; then - AC_DEFINE(HAVE_WIN32_EXCEPTIONS, 1, [Define if your system supports Windows exceptions.]) -else - AC_MSG_ERROR([Sorry, Windows exceptions don't work as expected on your system.]) -fi - -dnl We really want VOSF (Video on SEGV Signals) screen updates acceleration -AC_DEFINE(ENABLE_VOSF, 1, [Define if using video enabled on SEGV signals.]) - -dnl Determine the addressing mode to use -ADDRESSING_MODE="" -AC_MSG_CHECKING([for the addressing mode to use]) -for am in $ADDRESSING_TEST_ORDER; do - case $am in - direct) - dnl Direct addressing mode (constant offset) - ADDRESSING_MODE="direct" - DEFINES="$DEFINES -DDIRECT_ADDRESSING" - break - ;; - banks) - dnl Default addressing mode - ADDRESSING_MODE="memory banks" - break - ;; - *) - AC_MSG_ERROR([Internal configure.ac script error for $am addressing mode]) - esac -done -AC_MSG_RESULT($ADDRESSING_MODE) -if [[ "x$ADDRESSING_MODE" = "x" ]]; then - AC_MSG_WARN([Sorry, no suitable addressing mode in $ADDRESSING_TEST_ORDER]) - ADDRESSING_MODE="memory banks" -fi - -dnl Banked Memory Addressing mode is not supported by the JIT compiler -if [[ "x$WANT_JIT" = "xyes" -a "x$ADDRESSING_MODE" = "xmemory banks" ]]; then - AC_MSG_ERROR([Sorry, the JIT Compiler requires Direct Addressing, at least]) -fi - -dnl Check for GAS. -HAVE_GAS=no -AC_MSG_CHECKING(for GAS .p2align feature) -cat >conftest.S << EOF - .text - .p2align 5 -EOF -if $CC conftest.S -c -o conftest.o >/dev/null 2>&1 ; then HAVE_GAS=yes; fi -AC_MSG_RESULT($HAVE_GAS) - -dnl Check for GCC 2.7 or higher. -HAVE_GCC27=no -AC_MSG_CHECKING(for GCC 2.7 or higher) -AC_EGREP_CPP(xyes, -[#if __GNUC__ - 1 > 1 || __GNUC_MINOR__ - 1 > 5 - xyes -#endif -], [AC_MSG_RESULT(yes); HAVE_GCC27=yes], AC_MSG_RESULT(no)) - -dnl Check for GCC 3.0 or higher. -HAVE_GCC30=no -AC_MSG_CHECKING(for GCC 3.0 or higher) -AC_EGREP_CPP(xyes, -[#if __GNUC__ >= 3 - xyes -#endif -], [AC_MSG_RESULT(yes); HAVE_GCC30=yes], AC_MSG_RESULT(no)) - -dnl Select appropriate CPU source and REGPARAM define. -ASM_OPTIMIZATIONS=none -CPUSRCS="cpuemu1.cpp cpuemu2.cpp cpuemu3.cpp cpuemu4.cpp cpuemu5.cpp cpuemu6.cpp cpuemu7.cpp cpuemu8.cpp" - -dnl JITSRCS will be emptied later if the JIT is not available -dnl Other platforms should define their own set of noflags file variants -CAN_JIT=no -JITSRCS="compemu1.cpp compemu2.cpp compemu3.cpp compemu4.cpp compemu5.cpp compemu6.cpp compemu7.cpp compemu8.cpp" - -if [[ "x$HAVE_GCC27" = "xyes" -a "x$HAVE_I386" = "xyes" ]]; then - dnl i386 CPU - DEFINES="$DEFINES -DUNALIGNED_PROFITABLE -DREGPARAM=\"__attribute__((regparm(3)))\"" - if [[ "x$HAVE_GAS" = "xyes" ]]; then - ASM_OPTIMIZATIONS=i386 - DEFINES="$DEFINES -DX86_ASSEMBLY -DOPTIMIZED_FLAGS -DSAHF_SETO_PROFITABLE" - JITSRCS="cpuemu1_nf.cpp cpuemu2_nf.cpp cpuemu3_nf.cpp cpuemu4_nf.cpp cpuemu5_nf.cpp cpuemu6_nf.cpp cpuemu7_nf.cpp cpuemu8_nf.cpp $JITSRCS" - CAN_JIT=yes - fi -elif [[ "x$HAVE_GCC30" = "xyes" -a "x$HAVE_X86_64" = "xyes" ]]; then - dnl x86-64 CPU - DEFINES="$DEFINES -DUNALIGNED_PROFITABLE" - if [[ "x$HAVE_GAS" = "xyes" ]]; then - ASM_OPTIMIZATIONS="x86-64" - DEFINES="$DEFINES -DX86_64_ASSEMBLY -DOPTIMIZED_FLAGS" - JITSRCS="cpuemu1_nf.cpp cpuemu2_nf.cpp cpuemu3_nf.cpp cpuemu4_nf.cpp cpuemu5_nf.cpp cpuemu6_nf.cpp cpuemu7_nf.cpp cpuemu8_nf.cpp $JITSRCS" - CAN_JIT=yes - WANT_33BIT_ADDRESSING=yes - fi -fi - -dnl Enable JIT compiler, if possible. -if [[ "x$WANT_JIT" = "xyes" -a "x$CAN_JIT" ]]; then - JITSRCS="$JITSRCS ../uae_cpu/compiler/compemu_support.cpp ../uae_cpu/compiler/compemu_fpp.cpp compstbl.o cpustbl_nf.o" - DEFINES="$DEFINES -DUSE_JIT -DUSE_JIT_FPU" - - if [[ "x$WANT_JIT_DEBUG" = "xyes" ]]; then - if [[ "x$WANT_MON" = "xyes" ]]; then - DEFINES="$DEFINES -DJIT_DEBUG=1" - else - AC_MSG_WARN([cxmon not found, ignoring --enable-jit-debug]) - WANT_JIT_DEBUG=no - fi - fi - - dnl IEEE core is the only FPU emulator to use with the JIT compiler - case $FPE_CORE_TEST_ORDER in - ieee*) ;; - *) AC_MSG_WARN([Forcing use of the IEEE FPU core, as the JIT compiler supports only this one.]) ;; - esac - FPE_CORE_TEST_ORDER="ieee" -else - WANT_JIT=no - WANT_JIT_DEBUG=no - JITSRCS="" -fi - -dnl Utility macro used by next two tests. -dnl AC_EXAMINE_OBJECT(C source code, -dnl commands examining object file, -dnl [commands to run if compile failed]): -dnl -dnl Compile the source code to an object file; then convert it into a -dnl printable representation. All unprintable characters and -dnl asterisks (*) are replaced by dots (.). All white space is -dnl deleted. Newlines (ASCII 0x10) in the input are preserved in the -dnl output, but runs of newlines are compressed to a single newline. -dnl Finally, line breaks are forcibly inserted so that no line is -dnl longer than 80 columns and the file ends with a newline. The -dnl result of all this processing is in the file conftest.dmp, which -dnl may be examined by the commands in the second argument. -dnl -AC_DEFUN([gcc_AC_EXAMINE_OBJECT], -[AC_LANG_SAVE -AC_LANG_C -dnl Next bit cribbed from AC_TRY_COMPILE. -cat > conftest.$ac_ext < conftest.dmp - $2 -ifelse($3, , , else - $3 -)dnl -fi -rm -rf conftest* -AC_LANG_RESTORE]) - -dnl Floating point format probe. -dnl The basic concept is the same as the above: grep the object -dnl file for an interesting string. We have to watch out for -dnl rounding changing the values in the object, however; this is -dnl handled by ignoring the least significant byte of the float. -dnl -dnl Does not know about VAX G-float or C4x idiosyncratic format. -dnl It does know about PDP-10 idiosyncratic format, but this is -dnl not presently supported by GCC. S/390 "binary floating point" -dnl is in fact IEEE (but maybe we should have that in EBCDIC as well -dnl as ASCII?) -dnl -AC_DEFUN([gcc_AC_C_FLOAT_FORMAT], -[AC_CACHE_CHECK(floating point format, ac_cv_c_float_format, -[gcc_AC_EXAMINE_OBJECT( -[/* This will not work unless sizeof(double) == 8. */ -extern char sizeof_double_must_be_8 [sizeof(double) == 8 ? 1 : -1]; - -/* This structure must have no internal padding. */ -struct possibility { - char prefix[8]; - double candidate; - char postfix[8]; -}; - -#define C(cand) { "\nformat:", cand, ":tamrof\n" } -struct possibility table [] = -{ - C( 3.25724264705901305206e+01), /* @@IEEEFP - IEEE 754 */ - C( 3.53802595280598432000e+18), /* D__float - VAX */ - C( 5.32201830133125317057e-19), /* D.PDP-10 - PDP-10 - the dot is 0x13a */ - C( 1.77977764695171661377e+10), /* IBMHEXFP - s/390 format, ascii */ - C(-5.22995989424860458374e+10) /* IBMHEXFP - s/390 format, EBCDIC */ -};], - [if grep 'format:.@IEEEF.:tamrof' conftest.dmp >/dev/null 2>&1; then - ac_cv_c_float_format='IEEE (big-endian)' - elif grep 'format:.I@@PFE.:tamrof' conftest.dmp >/dev/null 2>&1; then - ac_cv_c_float_format='IEEE (big-endian)' - elif grep 'format:.FEEEI@.:tamrof' conftest.dmp >/dev/null 2>&1; then - ac_cv_c_float_format='IEEE (little-endian)' - elif grep 'format:.EFP@@I.:tamrof' conftest.dmp >/dev/null 2>&1; then - ac_cv_c_float_format='IEEE (little-endian)' - elif grep 'format:.__floa.:tamrof' conftest.dmp >/dev/null 2>&1; then - ac_cv_c_float_format='VAX D-float' - elif grep 'format:..PDP-1.:tamrof' conftest.dmp >/dev/null 2>&1; then - ac_cv_c_float_format='PDP-10' - elif grep 'format:.BMHEXF.:tamrof' conftest.dmp >/dev/null 2>&1; then - ac_cv_c_float_format='IBM 370 hex' - else - AC_MSG_ERROR(Unknown floating point format) - fi], - [AC_MSG_ERROR(compile failed)]) -]) -# IEEE is the default format. If the float endianness isn't the same -# as the integer endianness, we have to set FLOAT_WORDS_BIG_ENDIAN -# (which is a tristate: yes, no, default). This is only an issue with -# IEEE; the other formats are only supported by a few machines each, -# all with the same endianness. -format=IEEE_FLOAT_FORMAT -fbigend= -case $ac_cv_c_float_format in - 'IEEE (big-endian)' ) - if test $ac_cv_c_bigendian = no; then - fbigend=1 - fi - ;; - 'IEEE (little-endian)' ) - if test $ac_cv_c_bigendian = yes; then - fbigend=0 - fi - ;; - 'VAX D-float' ) - format=VAX_FLOAT_FORMAT - ;; - 'PDP-10' ) - format=PDP10_FLOAT_FORMAT - ;; - 'IBM 370 hex' ) - format=IBM_FLOAT_FORMAT - ;; -esac -AC_DEFINE_UNQUOTED(HOST_FLOAT_FORMAT, $format, - [Define to the floating point format of the host machine.]) -if test -n "$fbigend"; then - AC_DEFINE_UNQUOTED(HOST_FLOAT_WORDS_BIG_ENDIAN, $fbigend, - [Define to 1 if the host machine stores floating point numbers in - memory with the word containing the sign bit at the lowest address, - or to 0 if it does it the other way around. - - This macro should not be defined if the ordering is the same as for - multi-word integers.]) -fi -]) - -dnl Select appropriate FPU source. -gcc_AC_C_FLOAT_FORMAT -AC_CHECK_HEADERS(ieee754.h ieeefp.h floatingpoint.h nan.h) - -for fpe in $FPE_CORE_TEST_ORDER; do - case $fpe in - ieee) - case $ac_cv_c_float_format in - IEEE*) - FPE_CORE="IEEE fpu core" - DEFINES="$DEFINES -DFPU_IEEE" - FPUSRCS="../uae_cpu/fpu/fpu_ieee.cpp" - dnl Math functions not mandated by C99 standard - AC_CHECK_FUNCS(isnanl isinfl) - dnl Math functions required by C99 standard, but probably not - dnl implemented everywhere. In that case, we fall back to the - dnl regular variant for doubles. - AC_CHECK_FUNCS(logl log10l expl powl fabsl sqrtl) - AC_CHECK_FUNCS(sinl cosl tanl sinhl coshl tanhl) - AC_CHECK_FUNCS(asinl acosl atanl asinhl acoshl atanhl) - AC_CHECK_FUNCS(floorl ceill) - break - ;; - esac - ;; - x86) - if [[ ":$HAVE_GCC27:$HAVE_I386:$HAVE_GAS:" = ":yes:yes:yes:" ]]; then - FPE_CORE="i387 fpu core" - DEFINES="$DEFINES -DFPU_X86" - FPUSRCS="../uae_cpu/fpu/fpu_x86.cpp" - break - fi - ;; - uae) - FPE_CORE="uae fpu core" - DEFINES="$DEFINES -DFPU_UAE" - FPUSRCS="../uae_cpu/fpu/fpu_uae.cpp" - break - ;; - *) - AC_MSG_ERROR([Internal configure.in script error for $fpe fpu core]) - ;; - esac -done -if [[ "x$FPE_CORE" = "x" ]]; then - AC_MSG_ERROR([Sorry, no suitable FPU core found in $FPE_CORE_TEST_ORDER]) -fi - -dnl Check for certain math functions -AC_CHECK_FUNCS(atanh) -AC_CHECK_FUNCS(isnan isinf finite isnormal signbit) - -dnl UAE CPU sources for all non-m68k-native architectures. -CPUINCLUDES="-I../uae_cpu" -CPUSRCS="../uae_cpu/basilisk_glue.cpp ../uae_cpu/memory.cpp ../uae_cpu/newcpu.cpp ../uae_cpu/readcpu.cpp $FPUSRCS cpustbl.cpp cpudefs.cpp $CPUSRCS $JITSRCS" - -dnl We really want SDL for now -AC_CHECK_TOOL(sdl_config, sdl-config, [AC_MSG_ERROR([Sorry, you currently need SDL for this port])]) -sdl_cflags=`$sdl_config --cflags` -sdl_libs=`$sdl_config --libs` -CFLAGS="$CFLAGS $sdl_cflags" -CXXFLAGS="$CXXFLAGS $sdl_cflags" -LIBS="$LIBS $sdl_libs" -AC_DEFINE(USE_SDL, 1, [Define to enble SDL support]) -AC_DEFINE(USE_SDL_VIDEO, 1, [Define to enable SDL video graphics support]) -AC_DEFINE(USE_SDL_AUDIO, 1, [Define to enable SDL audio support]) - -dnl Remove the "-g" option if set for GCC. -if [[ "x$HAVE_GCC27" = "xyes" ]]; then - CFLAGS=`echo $CFLAGS | sed -e 's/-g\b//g'` - CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-g\b//g'` -fi - -dnl Generate Makefile. -AC_SUBST(DEFINES) -AC_SUBST(CPUINCLUDES) -AC_SUBST(CPUSRCS) -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT - -dnl Print summary. -echo -echo Basilisk II configuration summary: -echo -echo Use JIT compiler ....................... : $WANT_JIT -echo JIT debug mode ......................... : $WANT_JIT_DEBUG -echo Floating-Point emulation core .......... : $FPE_CORE -echo Assembly optimizations ................. : $ASM_OPTIMIZATIONS -echo Addressing mode ........................ : $ADDRESSING_MODE -echo -echo "Configuration done. Now type \"make\" (or \"gmake\")." +dnl Process this file with autoconf to produce a configure script. +dnl Written in 2002 by Christian Bauer et al. + +AC_INIT([Basilisk II], 1.0, [Christian.Bauer@uni-mainz.de], BasiliskII) +AC_CONFIG_SRCDIR(main_windows.cpp) +AC_CONFIG_AUX_DIR(../Unix) +AC_PREREQ(2.52) +AC_CONFIG_HEADER(config.h) + +dnl Aliases for PACKAGE and VERSION macros. +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE_NAME", [Define this program name.]) +AC_DEFINE_UNQUOTED(VERSION, "$PACKAGE_VERSION", [Define this program version.]) + +dnl JIT compiler options. +AC_ARG_ENABLE(jit-compiler, [ --enable-jit-compiler enable JIT compiler [default=yes]], [WANT_JIT=$enableval], [WANT_JIT=yes]) +AC_ARG_ENABLE(jit-debug, [ --enable-jit-debug activate native code disassemblers [default=no]], [WANT_JIT_DEBUG=$enableval], [WANT_JIT_DEBUG=no]) + +dnl FPU emulation core. +AC_ARG_ENABLE(fpe, +[ --enable-fpe=FPE specify which fpu emulator to use [default=auto]], +[ case "$enableval" in + dnl default is always ieee, if architecture has this fp format + auto) FPE_CORE_TEST_ORDER="ieee uae";; + ieee) FPE_CORE_TEST_ORDER="ieee";; + uae) FPE_CORE_TEST_ORDER="uae";; + x86) FPE_CORE_TEST_ORDER="x86";; + *) AC_MSG_ERROR([--enable-fpe takes only one of the following values: auto, x86, ieee, uae]);; + esac +], +[ FPE_CORE_TEST_ORDER="ieee uae" +]) + +dnl External packages. +AC_ARG_WITH(gtk, [ --with-gtk use GTK user interface [default=yes]], [WANT_GTK=$withval], [WANT_GTK=yes]) + +dnl Addressing modes. +AC_ARG_ENABLE(addressing, +[ --enable-addressing=AM specify the addressing mode to use [default=fastest]], +[ case "$enableval" in + direct) ADDRESSING_TEST_ORDER="direct";; + banks) ADDRESSING_TEST_ORDER="banks";; + fastest)ADDRESSING_TEST_ORDER="direct banks";; + *) AC_MSG_ERROR([--enable-addressing takes only one of the following values: fastest, direct, banks]);; + esac +], +[ ADDRESSING_TEST_ORDER="direct banks" +]) + +dnl Canonical system information. +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + +dnl Target CPU type. +HAVE_I386=no +HAVE_POWERPC=no +HAVE_X86_64=no +case "$target_cpu" in + i386* | i486* | i586* | i686* | i786* ) HAVE_I386=yes;; + powerpc* ) HAVE_POWERPC=yes;; + x86_64* ) HAVE_X86_64=yes;; +esac + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_CC_C_O +AC_PROG_CPP +AC_PROG_CXX +AC_PROG_MAKE_SET +AC_PROG_EGREP +AC_PROG_LN_S +AC_CHECK_TOOL(WINDRES, windres) + +dnl We use GTK+ if possible. +if [[ "x$WANT_GTK" = "xyes" ]]; then + AM_PATH_GTK_2_0(1.3.15, [], [ + AC_MSG_WARN([Could not find GTK+ 2.0, disabling user interface.]) + WANT_GTK=no + ]) +fi +AC_SUBST(WANT_GTK) + +dnl We use 64-bit file size support if possible. +AC_SYS_LARGEFILE + +dnl Checks for header files. +AC_HEADER_STDC + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_BIGENDIAN +AC_C_CONST +AC_C_INLINE +AC_CHECK_SIZEOF(short, 2) +AC_CHECK_SIZEOF(int, 4) +AC_CHECK_SIZEOF(long, 4) +AC_CHECK_SIZEOF(long long, 8) +AC_CHECK_SIZEOF(float, 4) +AC_CHECK_SIZEOF(double, 8) +AC_CHECK_SIZEOF(long double, 12) +AC_CHECK_SIZEOF(void *, 4) +AC_TYPE_OFF_T +AC_CHECK_TYPES(loff_t) +AC_CHECK_TYPES(caddr_t) +AC_TYPE_SIZE_T + +dnl Define a macro that translates a yesno-variable into a C macro definition +dnl to be put into the config.h file +dnl $1 -- the macro to define +dnl $2 -- the value to translate +dnl $3 -- template name +AC_DEFUN([AC_TRANSLATE_DEFINE], [ + if [[ "x$2" = "xyes" -o "x$2" = "xguessing yes" ]]; then + AC_DEFINE($1, 1, $3) + fi +]) + +dnl Check that VirtualAlloc(), VirtualProtect() work +AC_CACHE_CHECK([whether VirtualProtect works], + ac_cv_VirtualProtect_works, [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cv_VirtualProtect_works=yes + dnl First the tests that should segfault + for test_def in NONE_READ NONE_WRITE READ_WRITE; do + AC_TRY_RUN([ + #define HAVE_WIN32_VM 1 + #define CONFIGURE_TEST_VM_MAP + #define TEST_VM_PROT_$test_def + #include "../Unix/vm_alloc.cpp" + ], ac_cv_VirtualProtect_works=no, rm -f core, + dnl When cross-compiling, assume it works + ac_cv_VirtualProtect_works="yes" + ) + done + AC_TRY_RUN([ + #define HAVE_WIN32_VM 1 + #define CONFIGURE_TEST_VM_MAP + #define TEST_VM_PROT_RDWR_WRITE + #include "../Unix/vm_alloc.cpp" + ], , ac_cv_VirtualProtect_works=no, + dnl When cross-compiling, assume it works + ac_cv_VirtualProtect_works="yes" + ) + AC_LANG_RESTORE + ] +) +if [[ "x$ac_cv_VirtualProtect_works" = "xyes" ]]; then + AC_DEFINE(HAVE_WIN32_VM, 1, [Define if your system has a working Win32-based memory allocator.]) +else + AC_MSG_ERROR([Sorry, Windows VM functions don't work as expected on your system.]) +fi + +dnl Check if Windows exceptions are supported. +AC_CACHE_CHECK([whether your system supports Windows exceptions], + ac_cv_have_win32_exceptions, [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_RUN([ + #define HAVE_WIN32_EXCEPTIONS 1 + #define CONFIGURE_TEST_SIGSEGV_RECOVERY + #include "../Unix/vm_alloc.cpp" + #include "../Unix/sigsegv.cpp" + ], + ac_cv_have_win32_exceptions=yes, + ac_cv_have_win32_exceptions=no, + dnl When cross-compiling, assume it works + ac_cv_have_win32_exceptions="yes" + ) + AC_LANG_RESTORE + ] +) +if [[ "x$ac_cv_have_win32_exceptions" = "xyes" ]]; then + AC_DEFINE(HAVE_WIN32_EXCEPTIONS, 1, [Define if your system supports Windows exceptions.]) +else + AC_MSG_ERROR([Sorry, Windows exceptions don't work as expected on your system.]) +fi + +dnl We really want VOSF (Video on SEGV Signals) screen updates acceleration +AC_DEFINE(ENABLE_VOSF, 1, [Define if using video enabled on SEGV signals.]) + +dnl Determine the addressing mode to use +ADDRESSING_MODE="" +AC_MSG_CHECKING([for the addressing mode to use]) +for am in $ADDRESSING_TEST_ORDER; do + case $am in + direct) + dnl Direct addressing mode (constant offset) + ADDRESSING_MODE="direct" + DEFINES="$DEFINES -DDIRECT_ADDRESSING" + break + ;; + banks) + dnl Default addressing mode + ADDRESSING_MODE="memory banks" + break + ;; + *) + AC_MSG_ERROR([Internal configure.ac script error for $am addressing mode]) + esac +done +AC_MSG_RESULT($ADDRESSING_MODE) +if [[ "x$ADDRESSING_MODE" = "x" ]]; then + AC_MSG_WARN([Sorry, no suitable addressing mode in $ADDRESSING_TEST_ORDER]) + ADDRESSING_MODE="memory banks" +fi + +dnl Banked Memory Addressing mode is not supported by the JIT compiler +if [[ "x$WANT_JIT" = "xyes" -a "x$ADDRESSING_MODE" = "xmemory banks" ]]; then + AC_MSG_ERROR([Sorry, the JIT Compiler requires Direct Addressing, at least]) +fi + +dnl Check for GAS. +HAVE_GAS=no +AC_MSG_CHECKING(for GAS .p2align feature) +cat >conftest.S << EOF + .text + .p2align 5 +EOF +if $CC conftest.S -c -o conftest.o >/dev/null 2>&1 ; then HAVE_GAS=yes; fi +AC_MSG_RESULT($HAVE_GAS) + +dnl Check for GCC 2.7 or higher. +HAVE_GCC27=no +AC_MSG_CHECKING(for GCC 2.7 or higher) +AC_EGREP_CPP(xyes, +[#if __GNUC__ - 1 > 1 || __GNUC_MINOR__ - 1 > 5 + xyes +#endif +], [AC_MSG_RESULT(yes); HAVE_GCC27=yes], AC_MSG_RESULT(no)) + +dnl Check for GCC 3.0 or higher. +HAVE_GCC30=no +AC_MSG_CHECKING(for GCC 3.0 or higher) +AC_EGREP_CPP(xyes, +[#if __GNUC__ >= 3 + xyes +#endif +], [AC_MSG_RESULT(yes); HAVE_GCC30=yes], AC_MSG_RESULT(no)) + +dnl Select appropriate CPU source and REGPARAM define. +ASM_OPTIMIZATIONS=none +CPUSRCS="cpuemu1.cpp cpuemu2.cpp cpuemu3.cpp cpuemu4.cpp cpuemu5.cpp cpuemu6.cpp cpuemu7.cpp cpuemu8.cpp" + +dnl JITSRCS will be emptied later if the JIT is not available +dnl Other platforms should define their own set of noflags file variants +CAN_JIT=no +JITSRCS="compemu1.cpp compemu2.cpp compemu3.cpp compemu4.cpp compemu5.cpp compemu6.cpp compemu7.cpp compemu8.cpp" + +if [[ "x$HAVE_GCC27" = "xyes" -a "x$HAVE_I386" = "xyes" ]]; then + dnl i386 CPU + DEFINES="$DEFINES -DUNALIGNED_PROFITABLE -DREGPARAM=\"__attribute__((regparm(3)))\"" + if [[ "x$HAVE_GAS" = "xyes" ]]; then + ASM_OPTIMIZATIONS=i386 + DEFINES="$DEFINES -DX86_ASSEMBLY -DOPTIMIZED_FLAGS -DSAHF_SETO_PROFITABLE" + JITSRCS="cpuemu1_nf.cpp cpuemu2_nf.cpp cpuemu3_nf.cpp cpuemu4_nf.cpp cpuemu5_nf.cpp cpuemu6_nf.cpp cpuemu7_nf.cpp cpuemu8_nf.cpp $JITSRCS" + CAN_JIT=yes + fi +elif [[ "x$HAVE_GCC30" = "xyes" -a "x$HAVE_X86_64" = "xyes" ]]; then + dnl x86-64 CPU + DEFINES="$DEFINES -DUNALIGNED_PROFITABLE" + if [[ "x$HAVE_GAS" = "xyes" ]]; then + ASM_OPTIMIZATIONS="x86-64" + DEFINES="$DEFINES -DX86_64_ASSEMBLY -DOPTIMIZED_FLAGS" + JITSRCS="cpuemu1_nf.cpp cpuemu2_nf.cpp cpuemu3_nf.cpp cpuemu4_nf.cpp cpuemu5_nf.cpp cpuemu6_nf.cpp cpuemu7_nf.cpp cpuemu8_nf.cpp $JITSRCS" + CAN_JIT=yes + WANT_33BIT_ADDRESSING=yes + fi +fi + +dnl Enable JIT compiler, if possible. +if [[ "x$WANT_JIT" = "xyes" -a "x$CAN_JIT" ]]; then + JITSRCS="$JITSRCS ../uae_cpu/compiler/compemu_support.cpp ../uae_cpu/compiler/compemu_fpp.cpp compstbl.o cpustbl_nf.o" + DEFINES="$DEFINES -DUSE_JIT -DUSE_JIT_FPU" + + if [[ "x$WANT_JIT_DEBUG" = "xyes" ]]; then + if [[ "x$WANT_MON" = "xyes" ]]; then + DEFINES="$DEFINES -DJIT_DEBUG=1" + else + AC_MSG_WARN([cxmon not found, ignoring --enable-jit-debug]) + WANT_JIT_DEBUG=no + fi + fi + + dnl IEEE core is the only FPU emulator to use with the JIT compiler + case $FPE_CORE_TEST_ORDER in + ieee*) ;; + *) AC_MSG_WARN([Forcing use of the IEEE FPU core, as the JIT compiler supports only this one.]) ;; + esac + FPE_CORE_TEST_ORDER="ieee" +else + WANT_JIT=no + WANT_JIT_DEBUG=no + JITSRCS="" +fi + +dnl Utility macro used by next two tests. +dnl AC_EXAMINE_OBJECT(C source code, +dnl commands examining object file, +dnl [commands to run if compile failed]): +dnl +dnl Compile the source code to an object file; then convert it into a +dnl printable representation. All unprintable characters and +dnl asterisks (*) are replaced by dots (.). All white space is +dnl deleted. Newlines (ASCII 0x10) in the input are preserved in the +dnl output, but runs of newlines are compressed to a single newline. +dnl Finally, line breaks are forcibly inserted so that no line is +dnl longer than 80 columns and the file ends with a newline. The +dnl result of all this processing is in the file conftest.dmp, which +dnl may be examined by the commands in the second argument. +dnl +AC_DEFUN([gcc_AC_EXAMINE_OBJECT], +[AC_LANG_SAVE +AC_LANG_C +dnl Next bit cribbed from AC_TRY_COMPILE. +cat > conftest.$ac_ext < conftest.dmp + $2 +ifelse($3, , , else + $3 +)dnl +fi +rm -rf conftest* +AC_LANG_RESTORE]) + +dnl Floating point format probe. +dnl The basic concept is the same as the above: grep the object +dnl file for an interesting string. We have to watch out for +dnl rounding changing the values in the object, however; this is +dnl handled by ignoring the least significant byte of the float. +dnl +dnl Does not know about VAX G-float or C4x idiosyncratic format. +dnl It does know about PDP-10 idiosyncratic format, but this is +dnl not presently supported by GCC. S/390 "binary floating point" +dnl is in fact IEEE (but maybe we should have that in EBCDIC as well +dnl as ASCII?) +dnl +AC_DEFUN([gcc_AC_C_FLOAT_FORMAT], +[AC_CACHE_CHECK(floating point format, ac_cv_c_float_format, +[gcc_AC_EXAMINE_OBJECT( +[/* This will not work unless sizeof(double) == 8. */ +extern char sizeof_double_must_be_8 [sizeof(double) == 8 ? 1 : -1]; + +/* This structure must have no internal padding. */ +struct possibility { + char prefix[8]; + double candidate; + char postfix[8]; +}; + +#define C(cand) { "\nformat:", cand, ":tamrof\n" } +struct possibility table [] = +{ + C( 3.25724264705901305206e+01), /* @@IEEEFP - IEEE 754 */ + C( 3.53802595280598432000e+18), /* D__float - VAX */ + C( 5.32201830133125317057e-19), /* D.PDP-10 - PDP-10 - the dot is 0x13a */ + C( 1.77977764695171661377e+10), /* IBMHEXFP - s/390 format, ascii */ + C(-5.22995989424860458374e+10) /* IBMHEXFP - s/390 format, EBCDIC */ +};], + [if grep 'format:.@IEEEF.:tamrof' conftest.dmp >/dev/null 2>&1; then + ac_cv_c_float_format='IEEE (big-endian)' + elif grep 'format:.I@@PFE.:tamrof' conftest.dmp >/dev/null 2>&1; then + ac_cv_c_float_format='IEEE (big-endian)' + elif grep 'format:.FEEEI@.:tamrof' conftest.dmp >/dev/null 2>&1; then + ac_cv_c_float_format='IEEE (little-endian)' + elif grep 'format:.EFP@@I.:tamrof' conftest.dmp >/dev/null 2>&1; then + ac_cv_c_float_format='IEEE (little-endian)' + elif grep 'format:.__floa.:tamrof' conftest.dmp >/dev/null 2>&1; then + ac_cv_c_float_format='VAX D-float' + elif grep 'format:..PDP-1.:tamrof' conftest.dmp >/dev/null 2>&1; then + ac_cv_c_float_format='PDP-10' + elif grep 'format:.BMHEXF.:tamrof' conftest.dmp >/dev/null 2>&1; then + ac_cv_c_float_format='IBM 370 hex' + else + AC_MSG_ERROR(Unknown floating point format) + fi], + [AC_MSG_ERROR(compile failed)]) +]) +# IEEE is the default format. If the float endianness isn't the same +# as the integer endianness, we have to set FLOAT_WORDS_BIG_ENDIAN +# (which is a tristate: yes, no, default). This is only an issue with +# IEEE; the other formats are only supported by a few machines each, +# all with the same endianness. +format=IEEE_FLOAT_FORMAT +fbigend= +case $ac_cv_c_float_format in + 'IEEE (big-endian)' ) + if test $ac_cv_c_bigendian = no; then + fbigend=1 + fi + ;; + 'IEEE (little-endian)' ) + if test $ac_cv_c_bigendian = yes; then + fbigend=0 + fi + ;; + 'VAX D-float' ) + format=VAX_FLOAT_FORMAT + ;; + 'PDP-10' ) + format=PDP10_FLOAT_FORMAT + ;; + 'IBM 370 hex' ) + format=IBM_FLOAT_FORMAT + ;; +esac +AC_DEFINE_UNQUOTED(HOST_FLOAT_FORMAT, $format, + [Define to the floating point format of the host machine.]) +if test -n "$fbigend"; then + AC_DEFINE_UNQUOTED(HOST_FLOAT_WORDS_BIG_ENDIAN, $fbigend, + [Define to 1 if the host machine stores floating point numbers in + memory with the word containing the sign bit at the lowest address, + or to 0 if it does it the other way around. + + This macro should not be defined if the ordering is the same as for + multi-word integers.]) +fi +]) + +dnl Select appropriate FPU source. +gcc_AC_C_FLOAT_FORMAT +AC_CHECK_HEADERS(ieee754.h ieeefp.h floatingpoint.h nan.h) + +for fpe in $FPE_CORE_TEST_ORDER; do + case $fpe in + ieee) + case $ac_cv_c_float_format in + IEEE*) + FPE_CORE="IEEE fpu core" + DEFINES="$DEFINES -DFPU_IEEE" + FPUSRCS="../uae_cpu/fpu/fpu_ieee.cpp" + dnl Math functions not mandated by C99 standard + AC_CHECK_FUNCS(isnanl isinfl) + dnl Math functions required by C99 standard, but probably not + dnl implemented everywhere. In that case, we fall back to the + dnl regular variant for doubles. + AC_CHECK_FUNCS(logl log10l expl powl fabsl sqrtl) + AC_CHECK_FUNCS(sinl cosl tanl sinhl coshl tanhl) + AC_CHECK_FUNCS(asinl acosl atanl asinhl acoshl atanhl) + AC_CHECK_FUNCS(floorl ceill) + break + ;; + esac + ;; + x86) + if [[ ":$HAVE_GCC27:$HAVE_I386:$HAVE_GAS:" = ":yes:yes:yes:" ]]; then + FPE_CORE="i387 fpu core" + DEFINES="$DEFINES -DFPU_X86" + FPUSRCS="../uae_cpu/fpu/fpu_x86.cpp" + break + fi + ;; + uae) + FPE_CORE="uae fpu core" + DEFINES="$DEFINES -DFPU_UAE" + FPUSRCS="../uae_cpu/fpu/fpu_uae.cpp" + break + ;; + *) + AC_MSG_ERROR([Internal configure.in script error for $fpe fpu core]) + ;; + esac +done +if [[ "x$FPE_CORE" = "x" ]]; then + AC_MSG_ERROR([Sorry, no suitable FPU core found in $FPE_CORE_TEST_ORDER]) +fi + +dnl Check for certain math functions +AC_CHECK_FUNCS(atanh) +AC_CHECK_FUNCS(isnan isinf finite isnormal signbit) + +dnl UAE CPU sources for all non-m68k-native architectures. +CPUINCLUDES="-I../uae_cpu" +CPUSRCS="../uae_cpu/basilisk_glue.cpp ../uae_cpu/memory.cpp ../uae_cpu/newcpu.cpp ../uae_cpu/readcpu.cpp $FPUSRCS cpustbl.cpp cpudefs.cpp $CPUSRCS $JITSRCS" + +dnl We really want SDL for now +AC_CHECK_TOOL(sdl_config, sdl-config, [AC_MSG_ERROR([Sorry, you currently need SDL for this port])]) +SDL_CFLAGS=`$sdl_config --cflags` +AC_SUBST(SDL_CFLAGS) +SDL_LIBS=`$sdl_config --libs` +AC_SUBST(SDL_LIBS) +AC_DEFINE(USE_SDL, 1, [Define to enble SDL support]) +AC_DEFINE(USE_SDL_VIDEO, 1, [Define to enable SDL video graphics support]) +AC_DEFINE(USE_SDL_AUDIO, 1, [Define to enable SDL audio support]) + +dnl Remove the "-g" option if set for GCC. +if [[ "x$HAVE_GCC27" = "xyes" ]]; then + CFLAGS=`echo $CFLAGS | sed -e 's/-g\b//g'` + CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-g\b//g'` +fi + +dnl Generate Makefile. +AC_SUBST(DEFINES) +AC_SUBST(CPUINCLUDES) +AC_SUBST(CPUSRCS) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT + +dnl Print summary. +echo +echo Basilisk II configuration summary: +echo +echo Use JIT compiler ....................... : $WANT_JIT +echo JIT debug mode ......................... : $WANT_JIT_DEBUG +echo Floating-Point emulation core .......... : $FPE_CORE +echo Assembly optimizations ................. : $ASM_OPTIMIZATIONS +echo Addressing mode ........................ : $ADDRESSING_MODE +echo GTK user interface ..................... : $WANT_GTK +echo +echo "Configuration done. Now type \"make\" (or \"gmake\")."