--- SheepShaver/src/Unix/configure.ac 2004/07/03 10:39:06 1.4 +++ SheepShaver/src/Unix/configure.ac 2005/03/05 19:07:35 1.18 @@ -25,9 +25,21 @@ AC_ARG_WITH(gtk, [ --with-gt AC_ARG_WITH(mon, [ --with-mon use mon as debugger [default=yes]], [WANT_MON=$withval], [WANT_MON=yes]) AC_ARG_WITH(dgcc, [ --with-dgcc=COMPILER use C++ COMPILER to compile synthetic opcodes], [DYNGEN_CC=$withval]) +dnl Addressing mode +AC_ARG_ENABLE(addressing, + [ --enable-addressing=AM set the addressing mode to use [default=real]], + [case "$enableval" in + real) WANT_ADDRESSING_MODE="real";; + direct) WANT_ADDRESSING_MODE="direct";; + direct,0x*) WANT_ADDRESSING_MODE="direct"; NATMEM_OFFSET=`echo "$enableval" | sed -n '/direct,\(0[[xX]][[0-9A-Fa-f]]*\([[UuLl]]\{1,2\}\)\?\)$/s//\1/p'`;; + esac], + [WANT_ADDRESSING_MODE="real"] +) + dnl SDL options. AC_ARG_ENABLE(sdl-static, [ --enable-sdl-static use SDL static libraries for linking [default=no]], [WANT_SDL_STATIC=$enableval], [WANT_SDL_STATIC=no]) AC_ARG_ENABLE(sdl-video, [ --enable-sdl-video use SDL for video graphics [default=no]], [WANT_SDL_VIDEO=$enableval], [WANT_SDL_VIDEO=no]) +AC_ARG_ENABLE(sdl-audio, [ --enable-sdl-audio use SDL for audio [default=no]], [WANT_SDL_AUDIO=$enableval], [WANT_SDL_AUDIO=no]) dnl Checks for programs. AC_PROG_CC @@ -36,6 +48,8 @@ AC_PROG_CXX AC_PROG_MAKE_SET AC_PROG_INSTALL AC_PROG_EGREP +AC_PATH_PROGS(FILE, [file false]) +AC_PATH_PROG(PERL, [perl]) dnl Check for PowerPC target CPU. HAVE_PPC=no @@ -92,39 +106,57 @@ if [[ "x$WANT_MON" = "xyes" ]]; then WANT_MON=no fi fi +AC_SUBST(MONSRCS) dnl Checks for libraries. AC_CHECK_LIB(posix4, sem_init) dnl Do we need SDL? WANT_SDL=no -SDL_SUPPORT="none" if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then WANT_SDL=yes WANT_XF86_DGA=no WANT_XF86_VIDMODE=no WANT_FBDEV_DGA=no - SDL_SUPPORT="video" + SDL_SUPPORT="$SDL_SUPPORT video" +fi +if [[ "x$WANT_SDL_AUDIO" = "xyes" ]]; then + WANT_SDL=yes + SDL_SUPPORT="$SDL_SUPPORT audio" fi if [[ "x$WANT_SDL" = "xyes" ]]; then AC_PATH_PROG(sdl_config, "sdl-config") if [[ -n "$sdl_config" ]]; then - sdl_cflags=`$sdl_config --cflags` - if [[ "x$WANT_SDL_STATIC" = "xyes" ]]; then - sdl_libs=`$sdl_config --static-libs` - else - sdl_libs=`$sdl_config --libs` - fi + case $target_os in + # Special treatment for Cygwin so that we can still use the POSIX layer + *cygwin*) + sdl_cflags="-I`$sdl_config --prefix`/include/SDL" + sdl_libs="-L`$sdl_config --exec-prefix`/lib -lSDL" + ;; + *) + sdl_cflags=`$sdl_config --cflags` + if [[ "x$WANT_SDL_STATIC" = "xyes" ]]; then + sdl_libs=`$sdl_config --static-libs` + else + sdl_libs=`$sdl_config --libs` + fi + ;; + esac CFLAGS="$CFLAGS $sdl_cflags" CXXFLAGS="$CXXFLAGS $sdl_cflags" LIBS="$LIBS $sdl_libs" else WANT_SDL=no + WANT_SDL_VIDEO=no + WANT_SDL_AUDIO=no fi + SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` +else + SDL_SUPPORT="none" fi dnl We need X11, if not using SDL. -if [[ "x$WANT_SDL" = "xno" ]]; then +if [[ "x$WANT_SDL_VIDEO" != "xyes" ]]; then AC_PATH_XTRA if [[ "x$no_x" = "xyes" ]]; then AC_MSG_ERROR([You need X11 to run SheepShaver.]) @@ -137,7 +169,7 @@ fi dnl We need pthreads on non-PowerPC systems. Try libpthread first, then libc_r (FreeBSD), then PTL. HAVE_PTHREADS=yes case $EMULATED_PPC:$target_os in -no:linux*) +no:linux*|no:netbsd*) dnl We do have our own pthread_cancel() implementation AC_DEFINE(HAVE_PTHREAD_CANCEL, 1, [Define if you have the pthread_cancel function.]) ;; @@ -222,6 +254,7 @@ AC_SYS_LARGEFILE dnl Checks for header files. AC_HEADER_STDC AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADERS(mach/vm_map.h mach/mach_init.h sys/mman.h) AC_CHECK_HEADERS(sys/time.h sys/times.h sys/socket.h) AC_CHECK_HEADERS(unistd.h fcntl.h byteswap.h dirent.h) @@ -231,6 +264,7 @@ AC_CHECK_HEADERS(linux/if.h, [], [], [ #endif ]) AC_CHECK_HEADERS(linux/if_tun.h net/if.h net/if_tun.h) +AC_CHECK_HEADERS(fenv.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_BIGENDIAN @@ -272,6 +306,7 @@ AC_CHECK_FUNCS(sigaction signal) AC_CHECK_FUNCS(mmap mprotect munmap) AC_CHECK_FUNCS(vm_allocate vm_deallocate vm_protect) AC_CHECK_FUNCS(posix_memalign memalign valloc) +AC_CHECK_FUNCS(exp2f log2f exp2 log2 trunc) dnl Darwin seems to define mach_task_self() instead of task_self(). AC_CHECK_FUNCS(mach_task_self task_self) @@ -283,10 +318,54 @@ no:linux*) ;; *:*) AC_SEARCH_LIBS(clock_gettime, [rt posix4]) - AC_CHECK_FUNCS(clock_gettime) + AC_CHECK_FUNCS(clock_gettime clock_nanosleep) ;; esac +dnl Check for headers and functions related to pty support (sshpty.c) +dnl From openssh-3.2.2p1 configure.ac +AC_CHECK_HEADERS(strings.h login.h sys/bsdtty.h sys/stat.h util.h pty.h) +AC_CHECK_FUNCS(_getpty vhangup strlcpy) + +case "$host" in +*-*-hpux10.26) + disable_ptmx_check=yes + ;; +*-*-linux*) + no_dev_ptmx=1 + ;; +mips-sony-bsd|mips-sony-newsos4) + AC_DEFINE(HAVE_NEWS4, 1, [Define if you are on NEWS-OS (additions from openssh-3.2.2p1, for sshpty.c).]) + ;; +*-*-sco3.2v4*) + no_dev_ptmx=1 + ;; +*-*-sco3.2v5*) + no_dev_ptmx=1 + ;; +*-*-cygwin*) + no_dev_ptmx=1 + ;; +esac + +if test -z "$no_dev_ptmx" ; then + if test "x$disable_ptmx_check" != "xyes" ; then + AC_CHECK_FILE([/dev/ptmx], + [ + AC_DEFINE_UNQUOTED(HAVE_DEV_PTMX, 1, [Define if you have /dev/ptmx.]) + have_dev_ptmx=1 + ] + ) + fi +fi +AC_CHECK_FILE([/dev/ptc], + [ + AC_DEFINE_UNQUOTED(HAVE_DEV_PTS_AND_PTC, 1, [Define if you have /dev/ptc.]) + have_dev_ptc=1 + ] +) +dnl (end of code from openssh-3.2.2p1 configure.ac) + dnl AC_CHECK_FRAMEWORK($1=NAME, $2=INCLUDES) AC_DEFUN(AC_CHECK_FRAMEWORK, [ AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1])dnl @@ -314,6 +393,7 @@ SERIALSRC=serial_unix.cpp ETHERSRC=../dummy/ether_dummy.cpp SCSISRC=../dummy/scsi_dummy.cpp AUDIOSRC=../dummy/audio_dummy.cpp +EXTFSSRC=extfs_unix.cpp EXTRASYSSRCS= case "$target_os" in linux*) @@ -321,16 +401,27 @@ linux*) AUDIOSRC=audio_oss_esd.cpp SCSISRC=Linux/scsi_linux.cpp if [[ "x$EMULATED_PPC" = "xno" ]]; then - EXTRASYSSRCS="Linux/paranoia.cpp Linux/sheepthreads.c Linux/asm_linux.S" + EXTRASYSSRCS="Linux/paranoia.cpp Linux/sheepthreads.c ppc_asm.S" + fi + ;; +netbsd*) + if [[ "x$EMULATED_PPC" = "xno" ]]; then + EXTRASYSSRCS="NetBSD/paranoia.cpp NetBSD/sheepthreads.c ppc_asm.S" fi ;; darwin*) if [[ "x$EMULATED_PPC" = "xno" ]]; then - EXTRASYSSRCS="Darwin/paranoia.cpp Linux/asm_linux.S" + EXTRASYSSRCS="Darwin/paranoia.cpp ppc_asm.S" fi if [[ "x$ac_cv_framework_IOKit" = "xyes" ]]; then EXTRASYSSRCS="$EXTRASYSSRCS ../MacOSX/sys_darwin.cpp" fi + if [[ "x$ac_cv_framework_Carbon" = "xyes" ]]; then + EXTFSSRC=../MacOSX/extfs_macosx.mm + fi + ;; +cygwin*) + SERIALSRC="../dummy/serial_dummy.cpp" ;; esac @@ -339,21 +430,32 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then AC_DEFINE(USE_SDL, 1, [Define to enble SDL support.]) fi if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then - VIDEOSRCS="../SDL/video_sdl.cpp" AC_DEFINE(USE_SDL_VIDEO, 1, [Define to enable SDL video graphics support.]) + VIDEOSRCS="../SDL/video_sdl.cpp" KEYCODES="../SDL/keycodes" if [[ "x$ac_cv_framework_Carbon" = "xyes" ]]; then EXTRASYSSRCS="$EXTRASYSSRCS ../MacOSX/clip_macosx.cpp" else - EXTRASYSSRCS="$EXTRASYSSRCS ../dummy/clip_dummy.cpp" + case "$target_os" in + cygwin*) + EXTRASYSSRCS="$EXTRASYSSRCS ../Windows/clip_windows.cpp" + ;; + *) + EXTRASYSSRCS="$EXTRASYSSRCS ../dummy/clip_dummy.cpp" + ;; + esac fi else VIDEOSRCS="video_x.cpp" KEYCODES="keycodes" EXTRASYSSRCS="$EXTRASYSSRCS clip_unix.cpp" fi +if [[ "x$WANT_SDL_AUDIO" = "xyes" ]]; then + AC_DEFINE(USE_SDL_AUDIO, 1, [Define to enable SDL audio support]) + AUDIOSRC="../SDL/audio_sdl.cpp" +fi -SYSSRCS="$VIDEOSRCS $SERIALSRC $ETHERSRC $SCSISRC $AUDIOSRC $SEMSRC $UISRCS $MONSRCS $EXTRASYSSRCS" +SYSSRCS="$VIDEOSRCS $EXTFSSRC $SERIALSRC $ETHERSRC $SCSISRC $AUDIOSRC $SEMSRC $UISRCS $EXTRASYSSRCS" dnl Define a macro that translates a yesno-variable into a C macro definition dnl to be put into the config.h file @@ -657,6 +759,30 @@ fi AC_TRANSLATE_DEFINE(HAVE_MACH_EXCEPTIONS, "$ac_cv_have_mach_exceptions", [Define if your system supports Mach exceptions.]) +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 "vm_alloc.cpp" + #include "sigsegv.cpp" + ], [ + sigsegv_recovery=win32 + ac_cv_have_win32_exceptions=yes + ], + ac_cv_have_win32_exceptions=no, + dnl When cross-compiling, do not assume anything. + ac_cv_have_win32_exceptions=no + ) + AC_LANG_RESTORE + ] +) +AC_TRANSLATE_DEFINE(HAVE_WIN32_EXCEPTIONS, "$ac_cv_have_win32_exceptions", + [Define if your system supports Windows exceptions.]) + dnl Otherwise, check if extended signals are supported. if [[ -z "$sigsegv_recovery" ]]; then AC_CACHE_CHECK([whether your system supports extended signal handlers], @@ -743,6 +869,95 @@ else WANT_VOSF=no fi +dnl Check addressing mode to use +AC_MSG_CHECKING([for addressing mode to use]) +case "$os_target" in +cygwin*) + WANT_ADDRESSING_MODE="direct,cygwin-hack" + NATMEM_OFFSET= + ;; +esac +if [[ "$EMULATED_PPC" != "yes" ]]; then + if [[ "$WANT_ADDRESSING_MODE" != "real" ]]; then + AC_MSG_WARN([Running in native PowerPC mode, force use of Real Addressing.]) + WANT_ADDRESSING_MODE="real" + fi +fi +if [[ "$WANT_ADDRESSING_MODE" = "direct" ]]; then + if [[ -n "$NATMEM_OFFSET" ]]; then + NATMEM_OFFSET_DEF="-DNATMEM_OFFSET=$NATMEM_OFFSET" + fi + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + cat confdefs.h > conftest.$ac_ext + cat >> conftest.$ac_ext << EOF +#include +#include +#include "vm_alloc.cpp" + +int main(void) +{ + if (vm_init() < 0) + return 1; + + static const struct { + unsigned long base; + unsigned int size; + } ranges[[]] = { + { 0x00000000, 0x0003000 }, + { 0x10000000, 0x2000000 }, + { 0x40800000, 0x0400000 }, + { 0x68070000, 0x0010000 }, + { 0x69000000, 0x0080000 }, + { 0x68ffe000, 0x0002000 }, + { 0x5fffe000, 0x0002000 }, + { 0x60000000, 0x0040000 }, + }; + const int n_ranges = sizeof(ranges)/ sizeof(ranges[[0]]); + +#ifdef NATMEM_OFFSET + unsigned long ofs = NATMEM_OFFSET; +#else + for (unsigned long ofs = 0x10000000; ofs <= 0x90000000; ofs += 0x10000000) +#endif + for (int i = 0; i < n_ranges; i++) { + char *m = (char *)(ranges[[i]].base + ofs); + if (vm_acquire_fixed(m, ranges[[i]].size) != 0) + break; + memset(m, 0, ranges[[i]].size); + vm_release(m, ranges[[i]].size); + if (i == n_ranges - 1) { + if (sizeof(void *) == 8 && ofs > 0xffffffff) + printf("0x%lxul\n", ofs); + else + printf("0x%08x\n", ofs); + return 0; + } + } + + vm_exit(); + return 1; +} +EOF + doit='$CXX conftest.$ac_ext -o conftest.$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS $LIBS $NATMEM_OFFSET_DEF >& AS_MESSAGE_LOG_FD' + if AC_TRY_EVAL(doit); then + NATMEM_OFFSET=`./conftest.$ac_exeext` + else + NATMEM_OFFSET= + fi + rm -f conftest* + AC_LANG_RESTORE + + if [[ -z "$NATMEM_OFFSET" ]]; then + AC_MSG_ERROR([could not determine a sensible NATMEM_OFFSET value]) + else + WANT_ADDRESSING_MODE="direct,$NATMEM_OFFSET" + AC_DEFINE_UNQUOTED(NATMEM_OFFSET, $NATMEM_OFFSET, + [Define constant offset for Mac address translation]) + fi +fi +AC_MSG_RESULT($WANT_ADDRESSING_MODE) + dnl Platform specific binary postprocessor AC_PATH_PROG(BLESS, "true") if [[ "x$ac_cv_pagezero_hack" = "xyes" ]]; then @@ -776,25 +991,28 @@ if $CXX -V -v 2>&1 | grep -q "Intel(R) C fi AC_MSG_RESULT($HAVE_ICC) -# Test if the compiler can generate ELF objects +dnl Determine the generated object format AC_CACHE_CHECK([whether the compiler can generate ELF objects], - ac_cv_elf_objects, [ + ac_cv_object_format, [ echo 'int i;' > conftest.$ac_ext - ac_cv_elf_objects=no + ac_cv_object_format=no if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *"ELF"*) - ac_cv_elf_objects=yes + ac_cv_object_format=elf + ;; + *) + ac_cv_object_format=unknown ;; esac fi rm -rf conftest* ]) -ELF_OBJECTS=$ac_cv_elf_objects dnl CPU emulator sources if [[ "x$EMULATED_PPC" = "xyes" ]]; then CPUSRCS="\ + ../kpx_cpu/src/mathlib/ieeefp.cpp \ ../kpx_cpu/src/cpu/ppc/ppc-cpu.cpp \ ../kpx_cpu/src/cpu/ppc/ppc-decode.cpp \ ../kpx_cpu/src/cpu/ppc/ppc-execute.cpp \ @@ -805,14 +1023,14 @@ if [[ "x$EMULATED_PPC" = "xyes" ]]; then if [[ "x$WANT_JIT" = "xyes" ]]; then AC_CACHE_CHECK([whether dyngen can be used], ac_cv_use_dyngen, [ - case $host_cpu:$ELF_OBJECTS in - powerpc:yes) + case $host_cpu:$ac_cv_object_format in + powerpc:elf) ac_cv_use_dyngen=yes ;; - x86_64:yes) + x86_64:elf) ac_cv_use_dyngen=yes ;; - i?86:yes) + i?86:elf) ac_cv_use_dyngen=yes ;; *:*) @@ -858,7 +1076,7 @@ if [[ "x$EMULATED_PPC" = "xyes" ]]; then AC_CHECK_HEADERS(mmintrin.h xmmintrin.h emmintrin.h) ;; esac - DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -finline-limit=10000" + DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -finline-limit=10000 -g0" if [[ "x$HAVE_GCC30" = "xyes" ]]; then DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -fno-reorder-blocks -fno-optimize-sibling-calls" fi @@ -900,6 +1118,8 @@ if [[ "x$ac_cv_use_dyngen" = "xyes" ]]; ac_cv_have_static_data_exec=no ) ]) +else + ac_cv_use_dyngen=no fi AC_TRANSLATE_DEFINE(HAVE_STATIC_DATA_EXEC, "$ac_cv_have_static_data_exec", [Define if your system marks static data pages as executable.]) @@ -909,6 +1129,8 @@ if [[ "x$WANT_JIT" = "xyes" ]]; then fi dnl Generate Makefile. +AC_SUBST(PERL) +AC_SUBST(USE_DYNGEN, [$ac_cv_use_dyngen]) AC_SUBST(DYNGENSRCS) AC_SUBST(DYNGEN_CC) AC_SUBST(DYNGEN_OP_FLAGS) @@ -916,7 +1138,10 @@ AC_SUBST(SYSSRCS) AC_SUBST(CPUSRCS) AC_SUBST(BLESS) AC_SUBST(KEYCODES) -AC_OUTPUT(Makefile) +AC_OUTPUT([ +Makefile +../MacOSX/Info.plist +]) dnl Print summary. echo @@ -931,6 +1156,7 @@ echo Enable video on SEGV signals ..... echo ESD sound support ................ : $WANT_ESD echo GTK user interface ............... : $WANT_GTK echo mon debugger support ............. : $WANT_MON +echo Addressing mode .................. : $WANT_ADDRESSING_MODE echo Bad memory access recovery type .. : $sigsegv_recovery echo echo "Configuration done. Now type \"make\"."