ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/Unix/configure.ac
Revision: 1.35
Committed: 2005-07-04T06:09:59Z (18 years, 11 months ago) by gbeauche
Branch: MAIN
Changes since 1.34: +3 -3 lines
Log Message:
New paranoia checks that better match was SheepShaver is doing with threads
and sigaltstack(). At least, this time we force use of threads and also
alter r1 to see whether the current threading model relies on it or not.

File Contents

# Content
1 dnl Process this file with autoconf to produce a configure script.
2 dnl Written in 2002 by Christian Bauer
3
4 AC_INIT([SheepShaver], 2.2, [Christian.Bauer@uni-mainz.de], SheepShaver)
5 AC_CONFIG_SRCDIR(main_unix.cpp)
6 AC_PREREQ(2.52)
7 AC_CONFIG_HEADER(config.h)
8
9 dnl Canonical system information.
10 AC_CANONICAL_HOST
11 AC_CANONICAL_TARGET
12
13 dnl Some systems do not put corefiles in the currect directory, avoid saving
14 dnl cores for the configure tests since some are intended to dump core.
15 ulimit -c 0
16
17 dnl Invite Cygwin users to build within the Windows/ directory
18 case $target_os in
19 *cygwin* | *mingw32*)
20 AC_MSG_ERROR([You can only build the Windows version from its directory, Cygwin/X11 is not supported.])
21 ;;
22 esac
23
24 dnl Options.
25 AC_ARG_ENABLE(jit, [ --enable-jit enable JIT compiler [default=yes]], [WANT_JIT=$enableval], [WANT_JIT=yes])
26 AC_ARG_ENABLE(ppc-emulator, [ --enable-ppc-emulator use the selected PowerPC emulator [default=auto]], [WANT_EMULATED_PPC=$enableval], [WANT_EMULATED_PPC=auto])
27 AC_ARG_ENABLE(fbdev-dga, [ --enable-fbdev-dga use direct frame buffer access via /dev/fb0 [default=yes]], [WANT_FBDEV_DGA=$enableval], [WANT_FBDEV_DGA=yes])
28 AC_ARG_ENABLE(xf86-dga, [ --enable-xf86-dga use the XFree86 DGA extension [default=yes]], [WANT_XF86_DGA=$enableval], [WANT_XF86_DGA=yes])
29 AC_ARG_ENABLE(xf86-vidmode, [ --enable-xf86-vidmode use the XFree86 VidMode extension [default=yes]], [WANT_XF86_VIDMODE=$enableval], [WANT_XF86_VIDMODE=yes])
30 AC_ARG_ENABLE(vosf, [ --enable-vosf enable video on SEGV signals [default=yes]], [WANT_VOSF=$enableval], [WANT_VOSF=yes])
31 AC_ARG_WITH(esd, [ --with-esd support ESD for sound under Linux/FreeBSD [default=yes]], [WANT_ESD=$withval], [WANT_ESD=yes])
32 AC_ARG_WITH(gtk, [ --with-gtk use GTK user interface [default=yes]],
33 [case "$withval" in
34 gtk1) WANT_GTK="gtk";;
35 gtk|gtk2) WANT_GTK="$withval";;
36 yes) WANT_GTK="gtk2 gtk";;
37 *) WANT_GTK="no";;
38 esac],
39 [WANT_GTK="gtk2 gtk"])
40 AC_ARG_WITH(mon, [ --with-mon use mon as debugger [default=yes]], [WANT_MON=$withval], [WANT_MON=yes])
41 AC_ARG_WITH(dgcc, [ --with-dgcc=COMPILER use C++ COMPILER to compile synthetic opcodes], [DYNGEN_CC=$withval])
42
43 dnl Addressing mode
44 AC_ARG_ENABLE(addressing,
45 [ --enable-addressing=AM set the addressing mode to use [default=real]],
46 [case "$enableval" in
47 real) WANT_ADDRESSING_MODE="real";;
48 direct) WANT_ADDRESSING_MODE="direct";;
49 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'`;;
50 esac],
51 [WANT_ADDRESSING_MODE="real"]
52 )
53
54 dnl SDL options.
55 AC_ARG_ENABLE(sdl-static, [ --enable-sdl-static use SDL static libraries for linking [default=no]], [WANT_SDL_STATIC=$enableval], [WANT_SDL_STATIC=no])
56 AC_ARG_ENABLE(sdl-video, [ --enable-sdl-video use SDL for video graphics [default=no]], [WANT_SDL_VIDEO=$enableval], [WANT_SDL_VIDEO=no])
57 AC_ARG_ENABLE(sdl-audio, [ --enable-sdl-audio use SDL for audio [default=no]], [WANT_SDL_AUDIO=$enableval], [WANT_SDL_AUDIO=no])
58
59 dnl Checks for programs.
60 AC_PROG_CC
61 AC_PROG_CPP
62 AC_PROG_CXX
63 AC_PROG_MAKE_SET
64 AC_PROG_INSTALL
65 AC_PROG_EGREP
66 AC_PATH_PROGS(FILE, [file false])
67 AC_PATH_PROG(PERL, [perl])
68
69 dnl Check for PowerPC target CPU.
70 HAVE_PPC=no
71 AC_MSG_CHECKING(for PowerPC target CPU)
72 AC_EGREP_CPP(yes,
73 [
74 #ifdef __powerpc__
75 yes
76 #endif
77 #ifdef __ppc__
78 yes
79 #endif
80 ], [AC_MSG_RESULT(yes); HAVE_PPC=yes], AC_MSG_RESULT(no))
81
82 dnl We use native CPU if possible.
83 EMULATED_PPC=yes
84 case $WANT_EMULATED_PPC in
85 auto) [[ "x$HAVE_PPC" = "xyes" ]] && EMULATED_PPC=no;;
86 no) EMULATED_PPC=no;;
87 esac
88 if [[ "x$EMULATED_PPC" = "xyes" ]]; then
89 AC_DEFINE(EMULATED_PPC, 1, [Define if using a PowerPC CPU emulator.])
90 fi
91
92 dnl We use mon if possible.
93 MONSRCS=
94 case "x$WANT_MON" in
95 x/* | x.*)
96 mon_srcdir=$WANT_MON
97 WANT_MON=yes
98 ;;
99 xyes)
100 mon_srcdir=../../../mon/src
101 ;;
102 esac
103 if [[ "x$WANT_MON" = "xyes" ]]; then
104 AC_MSG_CHECKING(for mon)
105 if grep mon_init $mon_srcdir/mon.h >/dev/null 2>/dev/null; then
106 AC_MSG_RESULT(yes)
107 AC_DEFINE(ENABLE_MON, 1, [Define if using "mon".])
108 MONSRCS="$mon_srcdir/mon.cpp $mon_srcdir/mon_6502.cpp $mon_srcdir/mon_z80.cpp $mon_srcdir/mon_cmd.cpp $mon_srcdir/mon_lowmem.cpp $mon_srcdir/mon_disass.cpp $mon_srcdir/mon_ppc.cpp $mon_srcdir/disass/floatformat.c $mon_srcdir/disass/i386-dis.c $mon_srcdir/disass/m68k-dis.c $mon_srcdir/disass/m68k-opc.c"
109 CXXFLAGS="$CXXFLAGS -I$mon_srcdir -I$mon_srcdir/disass"
110 AC_CHECK_LIB(ncurses, tgetent, ,
111 AC_CHECK_LIB(termcap, tgetent, ,
112 AC_CHECK_LIB(termlib, tgetent, ,
113 AC_CHECK_LIB(terminfo, tgetent, ,
114 AC_CHECK_LIB(Hcurses, tgetent, ,
115 AC_CHECK_LIB(curses, tgetent))))))
116 AC_CHECK_LIB(readline, readline)
117 AC_CHECK_HEADERS(readline.h history.h readline/readline.h readline/history.h)
118 else
119 AC_MSG_RESULT(no)
120 AC_MSG_WARN([Could not find mon, ignoring --with-mon.])
121 WANT_MON=no
122 fi
123 fi
124 AC_SUBST(MONSRCS)
125
126 dnl Checks for libraries.
127 AC_CHECK_LIB(posix4, sem_init)
128
129 dnl Do we need SDL?
130 WANT_SDL=no
131 if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then
132 WANT_SDL=yes
133 WANT_XF86_DGA=no
134 WANT_XF86_VIDMODE=no
135 WANT_FBDEV_DGA=no
136 SDL_SUPPORT="$SDL_SUPPORT video"
137 fi
138 if [[ "x$WANT_SDL_AUDIO" = "xyes" ]]; then
139 WANT_SDL=yes
140 SDL_SUPPORT="$SDL_SUPPORT audio"
141 fi
142 if [[ "x$WANT_SDL" = "xyes" ]]; then
143 AC_PATH_PROG(sdl_config, "sdl-config")
144 if [[ -n "$sdl_config" ]]; then
145 sdl_cflags=`$sdl_config --cflags`
146 if [[ "x$WANT_SDL_STATIC" = "xyes" ]]; then
147 sdl_libs=`$sdl_config --static-libs`
148 else
149 sdl_libs=`$sdl_config --libs`
150 fi
151 CFLAGS="$CFLAGS $sdl_cflags"
152 CXXFLAGS="$CXXFLAGS $sdl_cflags"
153 LIBS="$LIBS $sdl_libs"
154 else
155 WANT_SDL=no
156 WANT_SDL_VIDEO=no
157 WANT_SDL_AUDIO=no
158 fi
159 SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"`
160 else
161 SDL_SUPPORT="none"
162 fi
163
164 dnl We need X11, if not using SDL.
165 if [[ "x$WANT_SDL_VIDEO" != "xyes" ]]; then
166 AC_PATH_XTRA
167 if [[ "x$no_x" = "xyes" ]]; then
168 AC_MSG_ERROR([You need X11 to run SheepShaver.])
169 fi
170 CFLAGS="$CFLAGS $X_CFLAGS"
171 CXXFLAGS="$CXXFLAGS $X_CFLAGS"
172 LIBS="$LIBS $X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS"
173 fi
174
175 dnl We need pthreads on non-PowerPC systems. Try libpthread first, then libc_r (FreeBSD), then PTL.
176 HAVE_PTHREADS=yes
177 case $EMULATED_PPC:$target_os in
178 no:linux*|no:netbsd*)
179 dnl We do have our own pthread_cancel() implementation
180 AC_DEFINE(HAVE_PTHREAD_CANCEL, 1, [Define if you have the pthread_cancel function.])
181 ;;
182 *:*)
183 AC_CHECK_LIB(pthread, pthread_create, , [
184 AC_CHECK_LIB(c_r, pthread_create, , [
185 AC_CHECK_LIB(PTL, pthread_create, , [
186 dnl XXX remove when no pthreads case is merged
187 AC_MSG_ERROR([You need pthreads to run SheepShaver.])
188 HAVE_PTHREADS=no
189 ])
190 ])
191 ])
192 AC_CHECK_FUNCS(pthread_cancel)
193 AC_CHECK_FUNCS(pthread_cond_init pthread_testcancel)
194 AC_CHECK_FUNCS(pthread_mutexattr_setprotocol)
195 AC_CHECK_FUNCS(pthread_mutexattr_settype)
196 AC_CHECK_FUNCS(pthread_mutexattr_setpshared)
197 dnl If POSIX.4 semaphores are not available, we emulate them with pthread mutexes.
198 SEMSRC=
199 AC_CHECK_FUNCS(sem_init, , [
200 if test "x$HAVE_PTHREADS" = "xyes"; then
201 SEMSRC=posix_sem.cpp
202 fi
203 ])
204 ;;
205 esac
206 if [[ "x$HAVE_PTHREADS" = "xyes" ]]; then
207 AC_DEFINE(HAVE_PTHREADS, 1, [Define if pthreads are available.])
208 fi
209
210 dnl We use FBDev DGA if possible.
211 if [[ "x$WANT_FBDEV_DGA" = "xyes" ]]; then
212 AC_CHECK_HEADER(linux/fb.h, [
213 AC_DEFINE(ENABLE_FBDEV_DGA, 1, [Define if using Linux fbdev extension.])
214 ], [
215 AC_MSG_WARN([Could not find Linux FBDev extension, ignoring --enable-fbdev-dga.])
216 WANT_FBDEV_DGA=no
217 ])
218 fi
219
220 dnl We use XFree86 DGA if possible.
221 if [[ "x$WANT_XF86_DGA" = "xyes" ]]; then
222 AC_CHECK_LIB(Xxf86dga, XF86DGAQueryExtension, [
223 AC_DEFINE(ENABLE_XF86_DGA, 1, [Define if using XFree86 DGA extension.])
224 LIBS="$LIBS -lXxf86dga"
225 ], [
226 AC_MSG_WARN([Could not find XFree86 DGA extension, ignoring --enable-xf86-dga.])
227 WANT_XF86_DGA=no
228 ])
229 fi
230
231 dnl We use XFree86 VidMode if possible.
232 if [[ "x$WANT_XF86_VIDMODE" = "xyes" ]]; then
233 AC_CHECK_LIB(Xxf86vm, XF86VidModeQueryExtension, [
234 AC_DEFINE(ENABLE_XF86_VIDMODE, 1, [Define if using XFree86 DGA extension.])
235 LIBS="$LIBS -lXxf86vm"
236 ], [
237 AC_MSG_WARN([Could not find XFree86 VidMode extension, ignoring --enable-xf86-vidmode.])
238 WANT_XF86_VIDMODE=no
239 ])
240 fi
241
242 dnl We use GTK+ if possible.
243 UISRCS=../dummy/prefs_editor_dummy.cpp
244 case "x$WANT_GTK" in
245 xgtk2*)
246 AM_PATH_GTK_2_0(1.3.15, [
247 AC_DEFINE(ENABLE_GTK, 1, [Define if using GTK.])
248 CFLAGS="$CFLAGS $GTK_CFLAGS"
249 CXXFLAGS="$CXXFLAGS $GTK_CFLAGS"
250 LIBS="$LIBS $GTK_LIBS"
251 UISRCS=prefs_editor_gtk.cpp
252 WANT_GTK=gtk2
253 ], [
254 case "x${WANT_GTK}x" in
255 *gtkx)
256 AC_MSG_WARN([Could not find GTK+ 2.0, trying with GTK+ 1.2.])
257 WANT_GTK=gtk
258 ;;
259 *)
260 AC_MSG_WARN([Could not find GTK+, disabling user interface.])
261 WANT_GTK=no
262 ;;
263 esac
264 ])
265 ;;
266 esac
267 if [[ "x$WANT_GTK" = "xgtk" ]]; then
268 AM_PATH_GTK(1.2.0, [
269 AC_DEFINE(ENABLE_GTK, 1, [Define if using GTK.])
270 CFLAGS="$CFLAGS $GTK_CFLAGS"
271 CXXFLAGS="$CXXFLAGS $GTK_CFLAGS"
272 LIBS="$LIBS $GTK_LIBS"
273 UISRCS=prefs_editor_gtk.cpp
274 ], [
275 AC_MSG_WARN([Could not find GTK+, disabling user interface.])
276 WANT_GTK=no
277 ])
278 fi
279
280 dnl We use ESD if possible.
281 if [[ "x$WANT_ESD" = "xyes" ]]; then
282 AM_PATH_ESD(0.2.8, [
283 AC_DEFINE(ENABLE_ESD, 1, [Define is using ESD.])
284 CFLAGS="$CFLAGS $ESD_CFLAGS"
285 CXXFLAGS="$CXXFLAGS $ESD_CFLAGS"
286 LIBS="$LIBS $ESD_LIBS"
287 ], [
288 AC_MSG_WARN([Could not find ESD, disabling ESD support.])
289 WANT_ESD=no
290 ])
291 fi
292
293 dnl We use 64-bit file size support if possible.
294 AC_SYS_LARGEFILE
295
296 dnl Checks for header files.
297 AC_HEADER_STDC
298 AC_HEADER_SYS_WAIT
299 AC_CHECK_HEADERS(malloc.h stdint.h)
300 AC_CHECK_HEADERS(mach/vm_map.h mach/mach_init.h sys/mman.h)
301 AC_CHECK_HEADERS(unistd.h fcntl.h byteswap.h dirent.h)
302 AC_CHECK_HEADERS(sys/socket.h sys/ioctl.h sys/filio.h sys/bitypes.h sys/wait.h)
303 AC_CHECK_HEADERS(sys/time.h sys/poll.h sys/select.h arpa/inet.h)
304 AC_CHECK_HEADERS(linux/if.h linux/if_tun.h net/if.h net/if_tun.h, [], [], [
305 #ifdef HAVE_SYS_TYPES_H
306 #include <sys/types.h>
307 #endif
308 #ifdef HAVE_SYS_SOCKET_H
309 #include <sys/socket.h>
310 #endif
311 ])
312 AC_CHECK_HEADERS(AvailabilityMacros.h)
313 AC_CHECK_HEADERS(IOKit/storage/IOBlockStorageDevice.h)
314 AC_CHECK_HEADERS(fenv.h)
315
316 dnl Checks for typedefs, structures, and compiler characteristics.
317 AC_C_BIGENDIAN
318 AC_C_CONST
319 AC_C_INLINE
320 AC_CHECK_SIZEOF(short, 2)
321 AC_CHECK_SIZEOF(int, 4)
322 AC_CHECK_SIZEOF(long, 4)
323 AC_CHECK_SIZEOF(long long, 8)
324 AC_CHECK_SIZEOF(float, 4)
325 AC_CHECK_SIZEOF(double, 8)
326 AC_CHECK_SIZEOF(void *, 4)
327 AC_TYPE_OFF_T
328 AC_CHECK_TYPE(loff_t, off_t)
329 AC_TYPE_SIZE_T
330 AC_TYPE_SIGNAL
331 AC_HEADER_TIME
332 AC_STRUCT_TM
333
334 dnl Check whether sys/socket.h defines type socklen_t.
335 dnl (extracted from ac-archive/Miscellaneous)
336 AC_CACHE_CHECK([for socklen_t],
337 ac_cv_type_socklen_t, [
338 AC_TRY_COMPILE([
339 #include <sys/types.h>
340 #include <sys/socket.h>
341 ], [socklen_t len = 42; return 0;],
342 ac_cv_type_socklen_t=yes, ac_cv_type_socklen_t=no,
343 dnl When cross-compiling, do not assume anything.
344 ac_cv_type_socklen_t="guessing no"
345 )
346 ])
347 if [[ "x$ac_cv_type_socklen_t" != "xyes" ]]; then
348 AC_DEFINE(socklen_t, int, [Define to 'int' if <sys/types.h> doesn't define.])
349 fi
350
351 dnl Check whether struct sigaction has sa_restorer member.
352 AC_CACHE_CHECK([whether struct sigaction has sa_restorer],
353 ac_cv_signal_sa_restorer, [
354 AC_TRY_COMPILE([
355 #include <signal.h>
356 ], [struct sigaction sa; sa.sa_restorer = 0;],
357 ac_cv_signal_sa_restorer=yes, ac_cv_signal_sa_restorer=no,
358 dnl When cross-compiling, do not assume anything.
359 ac_cv_signal_sa_restorer=no
360 )
361 ])
362 if [[ "x$ac_cv_signal_sa_restorer" = "xyes" ]]; then
363 AC_DEFINE(HAVE_SIGNAL_SA_RESTORER, 1, [Define if sa_restorer is available in struct sigaction.])
364 fi
365
366 dnl Checks for library functions.
367 AC_CHECK_FUNCS(strdup strerror strlcpy cfmakeraw)
368 AC_CHECK_FUNCS(nanosleep)
369 AC_CHECK_FUNCS(sigaction signal)
370 AC_CHECK_FUNCS(mmap mprotect munmap)
371 AC_CHECK_FUNCS(vm_allocate vm_deallocate vm_protect)
372 AC_CHECK_FUNCS(exp2f log2f exp2 log2)
373 AC_CHECK_FUNCS(floorf roundf ceilf truncf floor round ceil trunc)
374 AC_CHECK_FUNCS(poll inet_aton)
375
376 dnl Darwin seems to define mach_task_self() instead of task_self().
377 AC_CHECK_FUNCS(mach_task_self task_self)
378
379 dnl We need clock_gettime() for better performance but it may drag
380 dnl libpthread in, which we don't want for native ppc mode
381 case $EMULATED_PPC:$target_os in
382 no:linux*)
383 ;;
384 *:*)
385 AC_SEARCH_LIBS(clock_gettime, [rt posix4])
386 AC_CHECK_FUNCS(clock_gettime clock_nanosleep)
387 ;;
388 esac
389
390 dnl Check for headers and functions related to pty support (sshpty.c)
391 dnl From openssh-3.2.2p1 configure.ac
392 AC_CHECK_HEADERS(strings.h login.h sys/bsdtty.h sys/stat.h util.h pty.h)
393 AC_CHECK_FUNCS(_getpty vhangup strlcpy)
394
395 case "$host" in
396 *-*-hpux10.26)
397 disable_ptmx_check=yes
398 ;;
399 *-*-linux*)
400 no_dev_ptmx=1
401 ;;
402 mips-sony-bsd|mips-sony-newsos4)
403 AC_DEFINE(HAVE_NEWS4, 1, [Define if you are on NEWS-OS (additions from openssh-3.2.2p1, for sshpty.c).])
404 ;;
405 *-*-sco3.2v4*)
406 no_dev_ptmx=1
407 ;;
408 *-*-sco3.2v5*)
409 no_dev_ptmx=1
410 ;;
411 *-*-cygwin*)
412 no_dev_ptmx=1
413 ;;
414 esac
415
416 if test -z "$no_dev_ptmx" ; then
417 if test "x$disable_ptmx_check" != "xyes" ; then
418 AC_CHECK_FILE([/dev/ptmx],
419 [
420 AC_DEFINE_UNQUOTED(HAVE_DEV_PTMX, 1, [Define if you have /dev/ptmx.])
421 have_dev_ptmx=1
422 ]
423 )
424 fi
425 fi
426 AC_CHECK_FILE([/dev/ptc],
427 [
428 AC_DEFINE_UNQUOTED(HAVE_DEV_PTS_AND_PTC, 1, [Define if you have /dev/ptc.])
429 have_dev_ptc=1
430 ]
431 )
432 dnl (end of code from openssh-3.2.2p1 configure.ac)
433
434 dnl AC_CHECK_FRAMEWORK($1=NAME, $2=INCLUDES)
435 AC_DEFUN(AC_CHECK_FRAMEWORK, [
436 AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1])dnl
437 AC_CACHE_CHECK([whether compiler supports framework $1],
438 ac_Framework, [
439 saved_LIBS="$LIBS"
440 LIBS="$LIBS -framework $1"
441 AC_TRY_LINK(
442 [$2], [int main(void) { return 0; }],
443 [AS_VAR_SET(ac_Framework, yes)], [AS_VAR_SET(ac_Framework, no); LIBS="$saved_LIBS"]
444 )
445 ])
446 AS_IF([test AS_VAR_GET(ac_Framework) = yes],
447 [AC_DEFINE(AS_TR_CPP(HAVE_FRAMEWORK_$1), 1, [Define if framework $1 is available.])]
448 )
449 AS_VAR_POPDEF([ac_Framework])dnl
450 ])
451
452 dnl Check for some MacOS X frameworks
453 AC_CHECK_FRAMEWORK(Carbon, [#include <Carbon/Carbon.h>])
454 AC_CHECK_FRAMEWORK(IOKit, [#include <IOKit/IOKitLib.h>])
455
456 dnl Select system-dependant sources.
457 SERIALSRC=serial_unix.cpp
458 ETHERSRC=../dummy/ether_dummy.cpp
459 SCSISRC=../dummy/scsi_dummy.cpp
460 AUDIOSRC=../dummy/audio_dummy.cpp
461 EXTFSSRC=extfs_unix.cpp
462 EXTRASYSSRCS=
463 case "$target_os" in
464 linux*)
465 ETHERSRC=ether_unix.cpp
466 AUDIOSRC=audio_oss_esd.cpp
467 SCSISRC=Linux/scsi_linux.cpp
468 if [[ "x$EMULATED_PPC" = "xno" ]]; then
469 EXTRASYSSRCS="paranoia.cpp Linux/sheepthreads.c ppc_asm.S"
470 fi
471 ;;
472 freebsd*)
473 ETHERSRC=ether_unix.cpp
474 ;;
475 netbsd*)
476 ETHERSRC=ether_unix.cpp
477 if [[ "x$EMULATED_PPC" = "xno" ]]; then
478 EXTRASYSSRCS="paranoia.cpp NetBSD/sheepthreads.c ppc_asm.S"
479 fi
480 ;;
481 darwin*)
482 ETHERSRC=ether_unix.cpp
483 if [[ "x$EMULATED_PPC" = "xno" ]]; then
484 EXTRASYSSRCS="paranoia.cpp ppc_asm.S"
485 fi
486 if [[ "x$ac_cv_framework_IOKit" = "xyes" ]]; then
487 EXTRASYSSRCS="$EXTRASYSSRCS ../MacOSX/sys_darwin.cpp"
488 fi
489 if [[ "x$ac_cv_framework_Carbon" = "xyes" ]]; then
490 EXTFSSRC=../MacOSX/extfs_macosx.mm
491 fi
492 ;;
493 esac
494
495 dnl Is the slirp library supported?
496 if [[ "x$ETHERSRC" = "xether_unix.cpp" ]]; then
497 AC_DEFINE(HAVE_SLIRP, 1, [Define if slirp library is supported])
498 SLIRP_SRCS="\
499 ../slirp/bootp.c ../slirp/ip_output.c ../slirp/tcp_input.c \
500 ../slirp/cksum.c ../slirp/mbuf.c ../slirp/tcp_output.c \
501 ../slirp/debug.c ../slirp/misc.c ../slirp/tcp_subr.c \
502 ../slirp/if.c ../slirp/sbuf.c ../slirp/tcp_timer.c \
503 ../slirp/ip_icmp.c ../slirp/slirp.c ../slirp/tftp.c \
504 ../slirp/ip_input.c ../slirp/socket.c ../slirp/udp.c"
505 fi
506 AC_SUBST(SLIRP_SRCS)
507
508 dnl SDL overrides
509 if [[ "x$WANT_SDL" = "xyes" ]]; then
510 AC_DEFINE(USE_SDL, 1, [Define to enble SDL support.])
511 fi
512 if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then
513 AC_DEFINE(USE_SDL_VIDEO, 1, [Define to enable SDL video graphics support.])
514 VIDEOSRCS="../SDL/video_sdl.cpp"
515 KEYCODES="../SDL/keycodes"
516 if [[ "x$ac_cv_framework_Carbon" = "xyes" ]]; then
517 EXTRASYSSRCS="$EXTRASYSSRCS ../MacOSX/clip_macosx.cpp"
518 else
519 EXTRASYSSRCS="$EXTRASYSSRCS ../dummy/clip_dummy.cpp"
520 fi
521 else
522 VIDEOSRCS="video_x.cpp"
523 KEYCODES="keycodes"
524 EXTRASYSSRCS="$EXTRASYSSRCS clip_unix.cpp"
525 fi
526 if [[ "x$WANT_SDL_AUDIO" = "xyes" ]]; then
527 AC_DEFINE(USE_SDL_AUDIO, 1, [Define to enable SDL audio support])
528 AUDIOSRC="../SDL/audio_sdl.cpp"
529 fi
530
531 SYSSRCS="$VIDEOSRCS $EXTFSSRC $SERIALSRC $ETHERSRC $SCSISRC $AUDIOSRC $SEMSRC $UISRCS $EXTRASYSSRCS"
532
533 dnl Define a macro that translates a yesno-variable into a C macro definition
534 dnl to be put into the config.h file
535 dnl $1 -- the macro to define
536 dnl $2 -- the value to translate
537 dnl $3 -- template name
538 AC_DEFUN(AC_TRANSLATE_DEFINE, [
539 if [[ "x$2" = "xyes" -o "x$2" = "xguessing yes" ]]; then
540 AC_DEFINE($1, 1, $3)
541 fi
542 ])
543
544 dnl Check that the host supports TUN/TAP devices
545 AC_CACHE_CHECK([whether TUN/TAP is supported],
546 ac_cv_tun_tap_support, [
547 AC_TRY_COMPILE([
548 #if defined(HAVE_LINUX_IF_H) && defined(HAVE_LINUX_IF_TUN_H)
549 #include <linux/if.h>
550 #include <linux/if_tun.h>
551 #endif
552 #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_IF_TUN_H)
553 #include <net/if.h>
554 #include <net/if_tun.h>
555 #endif
556 ], [
557 struct ifreq ifr;
558 memset(&ifr, 0, sizeof(ifr));
559 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
560 ],
561 ac_cv_tun_tap_support=yes, ac_cv_tun_tap_support=no
562 )
563 ])
564 AC_TRANSLATE_DEFINE(ENABLE_TUNTAP, "$ac_cv_tun_tap_support",
565 [Define if your system supports TUN/TAP devices.])
566
567 dnl Various checks if the system supports vm_allocate() and the like functions.
568 have_mach_vm=no
569 if [[ "x$ac_cv_func_vm_allocate" = "xyes" -a "x$ac_cv_func_vm_deallocate" = "xyes" -a \
570 "x$ac_cv_func_vm_protect" = "xyes" ]]; then
571 have_mach_vm=yes
572 fi
573 AC_TRANSLATE_DEFINE(HAVE_MACH_VM, "$have_mach_vm",
574 [Define if your system has a working vm_allocate()-based memory allocator.])
575
576 dnl Check that vm_allocate(), vm_protect() work
577 if [[ "x$have_mach_vm" = "xyes" ]]; then
578
579 AC_CACHE_CHECK([whether vm_protect works],
580 ac_cv_vm_protect_works, [
581 AC_LANG_SAVE
582 AC_LANG_CPLUSPLUS
583 ac_cv_vm_protect_works=yes
584 dnl First the tests that should segfault
585 for test_def in NONE_READ NONE_WRITE READ_WRITE; do
586 AC_TRY_RUN([
587 #define CONFIGURE_TEST_VM_MAP
588 #define TEST_VM_PROT_$test_def
589 #include "vm_alloc.cpp"
590 ], ac_cv_vm_protect_works=no, rm -f core,
591 dnl When cross-compiling, do not assume anything
592 ac_cv_vm_protect_works="guessing no"
593 )
594 done
595 AC_TRY_RUN([
596 #define CONFIGURE_TEST_VM_MAP
597 #define TEST_VM_PROT_RDWR_WRITE
598 #include "vm_alloc.cpp"
599 ], , ac_cv_vm_protect_works=no,
600 dnl When cross-compiling, do not assume anything
601 ac_cv_vm_protect_works="guessing no"
602 )
603 AC_LANG_RESTORE
604 ]
605 )
606
607 dnl Remove support for vm_allocate() if vm_protect() does not work
608 if [[ "x$have_mach_vm" = "xyes" ]]; then
609 case $ac_cv_vm_protect_works in
610 *yes) have_mach_vm=yes;;
611 *no) have_mach_vm=no;;
612 esac
613 fi
614 AC_TRANSLATE_DEFINE(HAVE_MACH_VM, "$have_mach_vm",
615 [Define if your system has a working vm_allocate()-based memory allocator.])
616
617 fi dnl HAVE_MACH_VM
618
619 dnl Various checks if the system supports mmap() and the like functions.
620 dnl ... and Mach memory allocators are not supported
621 have_mmap_vm=no
622 if [[ "x$ac_cv_func_mmap" = "xyes" -a "x$ac_cv_func_munmap" = "xyes" -a \
623 "x$ac_cv_func_mprotect" = "xyes" ]]; then
624 if [[ "x$have_mach_vm" = "xno" ]]; then
625 have_mmap_vm=yes
626 fi
627 fi
628 AC_TRANSLATE_DEFINE(HAVE_MMAP_VM, "$have_mmap_vm",
629 [Define if your system has a working mmap()-based memory allocator.])
630
631 dnl Check that mmap() and associated functions work.
632 if [[ "x$have_mmap_vm" = "xyes" ]]; then
633
634 dnl Check if we have a working anonymous mmap()
635 AC_CACHE_CHECK([whether mmap supports MAP_ANON],
636 ac_cv_mmap_anon, [
637 AC_LANG_SAVE
638 AC_LANG_CPLUSPLUS
639 AC_TRY_RUN([
640 #define HAVE_MMAP_ANON
641 #define CONFIGURE_TEST_VM_MAP
642 #define TEST_VM_MMAP_ANON
643 #include "vm_alloc.cpp"
644 ], ac_cv_mmap_anon=yes, ac_cv_mmap_anon=no,
645 dnl When cross-compiling, do not assume anything.
646 ac_cv_mmap_anon="guessing no"
647 )
648 AC_LANG_RESTORE
649 ]
650 )
651 AC_TRANSLATE_DEFINE(HAVE_MMAP_ANON, "$ac_cv_mmap_anon",
652 [Define if <sys/mman.h> defines MAP_ANON and mmap()'ing with MAP_ANON works.])
653
654 AC_CACHE_CHECK([whether mmap supports MAP_ANONYMOUS],
655 ac_cv_mmap_anonymous, [
656 AC_LANG_SAVE
657 AC_LANG_CPLUSPLUS
658 AC_TRY_RUN([
659 #define HAVE_MMAP_ANONYMOUS
660 #define CONFIGURE_TEST_VM_MAP
661 #define TEST_VM_MMAP_ANON
662 #include "vm_alloc.cpp"
663 ], ac_cv_mmap_anonymous=yes, ac_cv_mmap_anonymous=no,
664 dnl When cross-compiling, do not assume anything.
665 ac_cv_mmap_anonymous="guessing no"
666 )
667 AC_LANG_RESTORE
668 ]
669 )
670 AC_TRANSLATE_DEFINE(HAVE_MMAP_ANONYMOUS, "$ac_cv_mmap_anonymous",
671 [Define if <sys/mman.h> defines MAP_ANONYMOUS and mmap()'ing with MAP_ANONYMOUS works.])
672
673 AC_CACHE_CHECK([whether mprotect works],
674 ac_cv_mprotect_works, [
675 AC_LANG_SAVE
676 AC_LANG_CPLUSPLUS
677 ac_cv_mprotect_works=yes
678 dnl First the tests that should segfault
679 for test_def in NONE_READ NONE_WRITE READ_WRITE; do
680 AC_TRY_RUN([
681 #define CONFIGURE_TEST_VM_MAP
682 #define TEST_VM_PROT_$test_def
683 #include "vm_alloc.cpp"
684 ], ac_cv_mprotect_works=no, rm -f core,
685 dnl When cross-compiling, do not assume anything
686 ac_cv_mprotect_works="guessing no"
687 )
688 done
689 AC_TRY_RUN([
690 #define CONFIGURE_TEST_VM_MAP
691 #define TEST_VM_PROT_RDWR_WRITE
692 #include "vm_alloc.cpp"
693 ], , ac_cv_mprotect_works=no,
694 dnl When cross-compiling, do not assume anything
695 ac_cv_mprotect_works="guessing no"
696 )
697 AC_LANG_RESTORE
698 ]
699 )
700
701 dnl Remove support for mmap() if mprotect() does not work
702 if [[ "x$have_mmap_vm" = "xyes" ]]; then
703 case $ac_cv_mprotect_works in
704 *yes) have_mmap_vm=yes;;
705 *no) have_mmap_vm=no;;
706 esac
707 fi
708 AC_TRANSLATE_DEFINE(HAVE_MMAP_VM, $have_mmap_vm,
709 [Define if your system has a working mmap()-based memory allocator.])
710
711 fi dnl HAVE_MMAP_VM
712
713 dnl Check if we can modify the __PAGEZERO segment for use as Low Memory
714 AC_CACHE_CHECK([whether __PAGEZERO can be Low Memory area 0x0000-0x3000],
715 ac_cv_pagezero_hack, [
716 ac_cv_pagezero_hack=no
717 if AC_TRY_COMMAND([Darwin/testlmem.sh 0x3000]); then
718 ac_cv_pagezero_hack=yes
719 dnl might as well skip the test for mmap-able low memory
720 ac_cv_can_map_lm=no
721 fi
722 ])
723 AC_TRANSLATE_DEFINE(PAGEZERO_HACK, "$ac_cv_pagezero_hack",
724 [Define if the __PAGEZERO Mach-O Low Memory Globals hack works on this system.])
725
726 dnl Check if we can mmap 0x3000 bytes from 0x0000
727 AC_CACHE_CHECK([whether we can map Low Memory area 0x0000-0x3000],
728 ac_cv_can_map_lm, [
729 AC_LANG_SAVE
730 AC_LANG_CPLUSPLUS
731 AC_TRY_RUN([
732 #include "vm_alloc.cpp"
733 int main(void) { /* returns 0 if we could map the lowmem globals */
734 volatile char * lm = 0;
735 if (vm_init() < 0) exit(1);
736 if (vm_acquire_fixed(0, 0x2000) < 0) exit(1);
737 lm[0] = 'z';
738 if (vm_release((char *)lm, 0x2000) < 0) exit(1);
739 vm_exit(); exit(0);
740 }
741 ], ac_cv_can_map_lm=yes, ac_cv_can_map_lm=no,
742 dnl When cross-compiling, do not assume anything.
743 ac_cv_can_map_lm="guessing no"
744 )
745 AC_LANG_RESTORE
746 ]
747 )
748
749 dnl Check signal handlers need to be reinstalled
750 AC_CACHE_CHECK([whether signal handlers need to be reinstalled],
751 ac_cv_signal_need_reinstall, [
752 AC_LANG_SAVE
753 AC_LANG_CPLUSPLUS
754 AC_TRY_RUN([
755 #include <stdlib.h>
756 #ifdef HAVE_UNISTD_H
757 #include <unistd.h>
758 #endif
759 #include <signal.h>
760 static int handled_signal = 0;
761 RETSIGTYPE sigusr1_handler(int) { handled_signal++; }
762 int main(void) { /* returns 0 if signals need not to be reinstalled */
763 signal(SIGUSR1, sigusr1_handler); raise(SIGUSR1); raise(SIGUSR1);
764 exit(handled_signal == 2);
765 }
766 ], ac_cv_signal_need_reinstall=yes, ac_cv_signal_need_reinstall=no,
767 dnl When cross-compiling, do not assume anything.
768 ac_cv_signal_need_reinstall="guessing yes"
769 )
770 AC_LANG_RESTORE
771 ]
772 )
773 AC_TRANSLATE_DEFINE(SIGNAL_NEED_REINSTALL, "$ac_cv_signal_need_reinstall",
774 [Define if your system requires signals to be reinstalled.])
775
776 dnl Check if sigaction handlers need to be reinstalled
777 AC_CACHE_CHECK([whether sigaction handlers need to be reinstalled],
778 ac_cv_sigaction_need_reinstall, [
779 AC_LANG_SAVE
780 AC_LANG_CPLUSPLUS
781 AC_TRY_RUN([
782 #include <stdlib.h>
783 #ifdef HAVE_UNISTD_H
784 #include <unistd.h>
785 #endif
786 #include <signal.h>
787 static int handled_signal = 0;
788 RETSIGTYPE sigusr1_handler(int) { handled_signal++; }
789 typedef RETSIGTYPE (*signal_handler)(int);
790 static signal_handler mysignal(int sig, signal_handler handler) {
791 struct sigaction old_sa;
792 struct sigaction new_sa;
793 new_sa.sa_handler = handler;
794 return ((sigaction(sig,&new_sa,&old_sa) < 0) ? SIG_IGN : old_sa.sa_handler);
795 }
796 int main(void) { /* returns 0 if signals need not to be reinstalled */
797 mysignal(SIGUSR1, sigusr1_handler); raise(SIGUSR1); raise(SIGUSR1);
798 exit(handled_signal == 2);
799 }
800 ], ac_cv_sigaction_need_reinstall=yes, ac_cv_sigaction_need_reinstall=no,
801 dnl When cross-compiling, do not assume anything.
802 ac_cv_sigaction_need_reinstall="guessing yes"
803 )
804 AC_LANG_RESTORE
805 ]
806 )
807 AC_TRANSLATE_DEFINE(SIGACTION_NEED_REINSTALL, "$ac_cv_sigaction_need_reinstall",
808 [Define if your system requires sigactions to be reinstalled.])
809
810 dnl Check if Mach exceptions supported.
811 AC_CACHE_CHECK([whether your system supports Mach exceptions],
812 ac_cv_have_mach_exceptions, [
813 AC_LANG_SAVE
814 AC_LANG_CPLUSPLUS
815 AC_TRY_RUN([
816 #define HAVE_MACH_EXCEPTIONS 1
817 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
818 #include "vm_alloc.cpp"
819 #include "sigsegv.cpp"
820 ],
821 ac_cv_have_mach_exceptions=yes,
822 ac_cv_have_mach_exceptions=no,
823 dnl When cross-compiling, do not assume anything.
824 ac_cv_have_mach_exceptions=no
825 )
826 AC_LANG_RESTORE
827 ]
828 )
829 if [[ "$ac_cv_have_mach_exceptions" = "yes" ]]; then
830 sigsegv_recovery=mach
831 fi
832 AC_TRANSLATE_DEFINE(HAVE_MACH_EXCEPTIONS, "$ac_cv_have_mach_exceptions",
833 [Define if your system supports Mach exceptions.])
834
835 dnl Check if Windows exceptions are supported.
836 AC_CACHE_CHECK([whether your system supports Windows exceptions],
837 ac_cv_have_win32_exceptions, [
838 AC_LANG_SAVE
839 AC_LANG_CPLUSPLUS
840 AC_TRY_RUN([
841 #define HAVE_WIN32_EXCEPTIONS 1
842 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
843 #include "vm_alloc.cpp"
844 #include "sigsegv.cpp"
845 ], [
846 sigsegv_recovery=win32
847 ac_cv_have_win32_exceptions=yes
848 ],
849 ac_cv_have_win32_exceptions=no,
850 dnl When cross-compiling, do not assume anything.
851 ac_cv_have_win32_exceptions=no
852 )
853 AC_LANG_RESTORE
854 ]
855 )
856 AC_TRANSLATE_DEFINE(HAVE_WIN32_EXCEPTIONS, "$ac_cv_have_win32_exceptions",
857 [Define if your system supports Windows exceptions.])
858
859 dnl Otherwise, check if extended signals are supported.
860 if [[ -z "$sigsegv_recovery" ]]; then
861 AC_CACHE_CHECK([whether your system supports extended signal handlers],
862 ac_cv_have_extended_signals, [
863 AC_LANG_SAVE
864 AC_LANG_CPLUSPLUS
865 AC_TRY_RUN([
866 #define HAVE_SIGINFO_T 1
867 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
868 #include "vm_alloc.cpp"
869 #include "sigsegv.cpp"
870 ],
871 ac_cv_have_extended_signals=yes,
872 ac_cv_have_extended_signals=no,
873 dnl When cross-compiling, do not assume anything.
874 ac_cv_have_extended_signals=no
875 )
876 AC_LANG_RESTORE
877 ]
878 )
879 if [[ "$ac_cv_have_extended_signals" = "yes" ]]; then
880 sigsegv_recovery=siginfo
881 fi
882 AC_TRANSLATE_DEFINE(HAVE_SIGINFO_T, "$ac_cv_have_extended_signals",
883 [Define if your system support extended signals.])
884 fi
885
886 dnl Otherwise, check for subterfuges.
887 if [[ -z "$sigsegv_recovery" ]]; then
888 AC_CACHE_CHECK([whether we then have a subterfuge for your system],
889 ac_cv_have_sigcontext_hack, [
890 AC_LANG_SAVE
891 AC_LANG_CPLUSPLUS
892 AC_TRY_RUN([
893 #define HAVE_SIGCONTEXT_SUBTERFUGE 1
894 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
895 #include "vm_alloc.cpp"
896 #include "sigsegv.cpp"
897 ],
898 ac_cv_have_sigcontext_hack=yes,
899 ac_cv_have_sigcontext_hack=no,
900 dnl When cross-compiling, do not assume anything.
901 ac_cv_have_sigcontext_hack=no
902 )
903 AC_LANG_RESTORE
904 ])
905 if [[ "$ac_cv_have_sigcontext_hack" = "yes" ]]; then
906 sigsegv_recovery=sigcontext
907 fi
908 AC_TRANSLATE_DEFINE(HAVE_SIGCONTEXT_SUBTERFUGE, "$ac_cv_have_sigcontext_hack",
909 [Define if we know a hack to replace siginfo_t->si_addr member.])
910 fi
911
912 dnl Check if we can ignore the fault (instruction skipping in SIGSEGV handler)
913 AC_CACHE_CHECK([whether we can skip instruction in SIGSEGV handler],
914 ac_cv_have_skip_instruction, [
915 AC_LANG_SAVE
916 AC_LANG_CPLUSPLUS
917 AC_TRY_RUN([
918 #define HAVE_SIGSEGV_SKIP_INSTRUCTION 1
919 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
920 #include "vm_alloc.cpp"
921 #include "sigsegv.cpp"
922 ], ac_cv_have_skip_instruction=yes, ac_cv_have_skip_instruction=no,
923 dnl When cross-compiling, do not assume anything.
924 ac_cv_have_skip_instruction=no
925 )
926 AC_LANG_RESTORE
927 ]
928 )
929 AC_TRANSLATE_DEFINE(HAVE_SIGSEGV_SKIP_INSTRUCTION, "$ac_cv_have_skip_instruction",
930 [Define if we can ignore the fault (instruction skipping in SIGSEGV handler).])
931
932 dnl Can we do Video on SEGV Signals ?
933 CAN_VOSF=no
934 if [[ -n "$sigsegv_recovery" ]]; then
935 CAN_VOSF=yes
936 fi
937
938 dnl Enable VOSF screen updates with this feature is requested and feasible
939 if [[ "x$WANT_VOSF" = "xyes" -a "x$CAN_VOSF" = "xyes" ]]; then
940 AC_DEFINE(ENABLE_VOSF, 1, [Define if using video enabled on SEGV signals.])
941 else
942 WANT_VOSF=no
943 fi
944
945 dnl Check addressing mode to use
946 AC_MSG_CHECKING([for addressing mode to use])
947 if [[ "$EMULATED_PPC" != "yes" ]]; then
948 if [[ "$WANT_ADDRESSING_MODE" != "real" ]]; then
949 AC_MSG_WARN([Running in native PowerPC mode, force use of Real Addressing.])
950 WANT_ADDRESSING_MODE="real"
951 fi
952 fi
953 if [[ "$WANT_ADDRESSING_MODE" = "direct" ]]; then
954 if [[ -n "$NATMEM_OFFSET" ]]; then
955 NATMEM_OFFSET_DEF="-DNATMEM_OFFSET=$NATMEM_OFFSET"
956 fi
957 AC_LANG_SAVE
958 AC_LANG_CPLUSPLUS
959 cat confdefs.h > conftest.$ac_ext
960 cat >> conftest.$ac_ext << EOF
961 #include <stdio.h>
962 #include <string.h>
963 #include "vm_alloc.cpp"
964
965 int main(void)
966 {
967 if (vm_init() < 0)
968 return 1;
969
970 static const struct {
971 unsigned long base;
972 unsigned int size;
973 } ranges[[]] = {
974 { 0x00000000, 0x0003000 },
975 { 0x10000000, 0x2000000 },
976 { 0x40800000, 0x0400000 },
977 { 0x68070000, 0x0010000 },
978 { 0x69000000, 0x0080000 },
979 { 0x68ffe000, 0x0002000 },
980 { 0x5fffe000, 0x0002000 },
981 { 0x60000000, 0x0040000 },
982 };
983 const int n_ranges = sizeof(ranges)/ sizeof(ranges[[0]]);
984
985 #ifdef NATMEM_OFFSET
986 unsigned long ofs = NATMEM_OFFSET;
987 #else
988 for (unsigned long ofs = 0x10000000; ofs <= 0x90000000; ofs += 0x10000000)
989 #endif
990 for (int i = 0; i < n_ranges; i++) {
991 char *m = (char *)(ranges[[i]].base + ofs);
992 if (vm_acquire_fixed(m, ranges[[i]].size) != 0)
993 break;
994 memset(m, 0, ranges[[i]].size);
995 vm_release(m, ranges[[i]].size);
996 if (i == n_ranges - 1) {
997 if (sizeof(void *) == 8 && ofs > 0xffffffff)
998 printf("0x%lxul\n", ofs);
999 else
1000 printf("0x%08x\n", ofs);
1001 return 0;
1002 }
1003 }
1004
1005 vm_exit();
1006 return 1;
1007 }
1008 EOF
1009 doit='$CXX conftest.$ac_ext -o conftest.$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS $LIBS $NATMEM_OFFSET_DEF >& AS_MESSAGE_LOG_FD'
1010 if AC_TRY_EVAL(doit); then
1011 NATMEM_OFFSET=`./conftest.$ac_exeext`
1012 else
1013 NATMEM_OFFSET=
1014 fi
1015 rm -f conftest*
1016 AC_LANG_RESTORE
1017
1018 if [[ -z "$NATMEM_OFFSET" ]]; then
1019 AC_MSG_ERROR([could not determine a sensible NATMEM_OFFSET value])
1020 else
1021 WANT_ADDRESSING_MODE="direct,$NATMEM_OFFSET"
1022 AC_DEFINE_UNQUOTED(NATMEM_OFFSET, $NATMEM_OFFSET,
1023 [Define constant offset for Mac address translation])
1024 fi
1025 fi
1026 AC_MSG_RESULT($WANT_ADDRESSING_MODE)
1027
1028 dnl Utility macro used by next two tests.
1029 dnl AC_EXAMINE_OBJECT(C source code,
1030 dnl commands examining object file,
1031 dnl [commands to run if compile failed]):
1032 dnl
1033 dnl Compile the source code to an object file; then convert it into a
1034 dnl printable representation. All unprintable characters and
1035 dnl asterisks (*) are replaced by dots (.). All white space is
1036 dnl deleted. Newlines (ASCII 0x10) in the input are preserved in the
1037 dnl output, but runs of newlines are compressed to a single newline.
1038 dnl Finally, line breaks are forcibly inserted so that no line is
1039 dnl longer than 80 columns and the file ends with a newline. The
1040 dnl result of all this processing is in the file conftest.dmp, which
1041 dnl may be examined by the commands in the second argument.
1042 dnl
1043 AC_DEFUN([gcc_AC_EXAMINE_OBJECT],
1044 [AC_LANG_SAVE
1045 AC_LANG_C
1046 dnl Next bit cribbed from AC_TRY_COMPILE.
1047 cat > conftest.$ac_ext <<EOF
1048 [#line __oline__ "configure"
1049 #include "confdefs.h"
1050 $1
1051 ]EOF
1052 if AC_TRY_EVAL(ac_compile); then
1053 od -c conftest.o |
1054 sed ['s/^[0-7]*[ ]*/ /
1055 s/\*/./g
1056 s/ \\n/*/g
1057 s/ [0-9][0-9][0-9]/./g
1058 s/ \\[^ ]/./g'] |
1059 tr -d '
1060 ' | tr -s '*' '
1061 ' | fold | sed '$a\
1062 ' > conftest.dmp
1063 $2
1064 ifelse($3, , , else
1065 $3
1066 )dnl
1067 fi
1068 rm -rf conftest*
1069 AC_LANG_RESTORE])
1070
1071 dnl Floating point format probe.
1072 dnl The basic concept is the same as the above: grep the object
1073 dnl file for an interesting string. We have to watch out for
1074 dnl rounding changing the values in the object, however; this is
1075 dnl handled by ignoring the least significant byte of the float.
1076 dnl
1077 dnl Does not know about VAX G-float or C4x idiosyncratic format.
1078 dnl It does know about PDP-10 idiosyncratic format, but this is
1079 dnl not presently supported by GCC. S/390 "binary floating point"
1080 dnl is in fact IEEE (but maybe we should have that in EBCDIC as well
1081 dnl as ASCII?)
1082 dnl
1083 AC_DEFUN([gcc_AC_C_FLOAT_FORMAT],
1084 [AC_CACHE_CHECK(floating point format, ac_cv_c_float_format,
1085 [gcc_AC_EXAMINE_OBJECT(
1086 [/* This will not work unless sizeof(double) == 8. */
1087 extern char sizeof_double_must_be_8 [sizeof(double) == 8 ? 1 : -1];
1088
1089 /* This structure must have no internal padding. */
1090 struct possibility {
1091 char prefix[8];
1092 double candidate;
1093 char postfix[8];
1094 };
1095
1096 #define C(cand) { "\nformat:", cand, ":tamrof\n" }
1097 struct possibility table [] =
1098 {
1099 C( 3.25724264705901305206e+01), /* @@IEEEFP - IEEE 754 */
1100 C( 3.53802595280598432000e+18), /* D__float - VAX */
1101 C( 5.32201830133125317057e-19), /* D.PDP-10 - PDP-10 - the dot is 0x13a */
1102 C( 1.77977764695171661377e+10), /* IBMHEXFP - s/390 format, ascii */
1103 C(-5.22995989424860458374e+10) /* IBMHEXFP - s/390 format, EBCDIC */
1104 };],
1105 [if grep 'format:.@IEEEF.:tamrof' conftest.dmp >/dev/null 2>&1; then
1106 ac_cv_c_float_format='IEEE (big-endian)'
1107 elif grep 'format:.I@@PFE.:tamrof' conftest.dmp >/dev/null 2>&1; then
1108 ac_cv_c_float_format='IEEE (big-endian)'
1109 elif grep 'format:.FEEEI@.:tamrof' conftest.dmp >/dev/null 2>&1; then
1110 ac_cv_c_float_format='IEEE (little-endian)'
1111 elif grep 'format:.EFP@@I.:tamrof' conftest.dmp >/dev/null 2>&1; then
1112 ac_cv_c_float_format='IEEE (little-endian)'
1113 elif grep 'format:.__floa.:tamrof' conftest.dmp >/dev/null 2>&1; then
1114 ac_cv_c_float_format='VAX D-float'
1115 elif grep 'format:..PDP-1.:tamrof' conftest.dmp >/dev/null 2>&1; then
1116 ac_cv_c_float_format='PDP-10'
1117 elif grep 'format:.BMHEXF.:tamrof' conftest.dmp >/dev/null 2>&1; then
1118 ac_cv_c_float_format='IBM 370 hex'
1119 else
1120 AC_MSG_ERROR(Unknown floating point format)
1121 fi],
1122 [AC_MSG_ERROR(compile failed)])
1123 ])
1124 # IEEE is the default format. If the float endianness isn't the same
1125 # as the integer endianness, we have to set FLOAT_WORDS_BIG_ENDIAN
1126 # (which is a tristate: yes, no, default). This is only an issue with
1127 # IEEE; the other formats are only supported by a few machines each,
1128 # all with the same endianness.
1129 format=IEEE_FLOAT_FORMAT
1130 fbigend=
1131 case $ac_cv_c_float_format in
1132 'IEEE (big-endian)' )
1133 if test $ac_cv_c_bigendian = no; then
1134 fbigend=1
1135 fi
1136 ;;
1137 'IEEE (little-endian)' )
1138 if test $ac_cv_c_bigendian = yes; then
1139 fbigend=0
1140 fi
1141 ;;
1142 'VAX D-float' )
1143 format=VAX_FLOAT_FORMAT
1144 ;;
1145 'PDP-10' )
1146 format=PDP10_FLOAT_FORMAT
1147 ;;
1148 'IBM 370 hex' )
1149 format=IBM_FLOAT_FORMAT
1150 ;;
1151 esac
1152 AC_DEFINE_UNQUOTED(HOST_FLOAT_FORMAT, $format,
1153 [Define to the floating point format of the host machine.])
1154 if test -n "$fbigend"; then
1155 AC_DEFINE_UNQUOTED(HOST_FLOAT_WORDS_BIG_ENDIAN, $fbigend,
1156 [Define to 1 if the host machine stores floating point numbers in
1157 memory with the word containing the sign bit at the lowest address,
1158 or to 0 if it does it the other way around.
1159
1160 This macro should not be defined if the ordering is the same as for
1161 multi-word integers.])
1162 fi
1163 ])
1164
1165 dnl Check for host float format
1166 gcc_AC_C_FLOAT_FORMAT
1167
1168 dnl Platform specific binary postprocessor
1169 AC_PATH_PROG(BLESS, "true")
1170 if [[ "x$ac_cv_pagezero_hack" = "xyes" ]]; then
1171 BLESS=Darwin/lowmem
1172 LDFLAGS="$LDFLAGS -pagezero_size 0x3000"
1173 fi
1174
1175 dnl Check for GCC 2.7 or higher.
1176 HAVE_GCC27=no
1177 AC_MSG_CHECKING(for GCC 2.7 or higher)
1178 AC_EGREP_CPP(xyes,
1179 [#if __GNUC__ - 1 > 1 || __GNUC_MINOR__ - 1 > 5
1180 xyes
1181 #endif
1182 ], [AC_MSG_RESULT(yes); HAVE_GCC27=yes], AC_MSG_RESULT(no))
1183
1184 dnl Check for GCC 3.0 or higher.
1185 HAVE_GCC30=no
1186 AC_MSG_CHECKING(for GCC 3.0 or higher)
1187 AC_EGREP_CPP(xyes,
1188 [#if __GNUC__ >= 3
1189 xyes
1190 #endif
1191 ], [AC_MSG_RESULT(yes); HAVE_GCC30=yes], AC_MSG_RESULT(no))
1192
1193 dnl Check for ICC.
1194 AC_MSG_CHECKING(for ICC)
1195 HAVE_ICC=no
1196 if $CXX -V -v 2>&1 | grep -q "Intel(R) C++ Compiler"; then
1197 HAVE_ICC=yes
1198 fi
1199 AC_MSG_RESULT($HAVE_ICC)
1200
1201 dnl Determine the generated object format
1202 AC_CACHE_CHECK([the format of compiler generated objects],
1203 ac_cv_object_format, [
1204 echo 'int i;' > conftest.$ac_ext
1205 ac_cv_object_format=no
1206 if AC_TRY_EVAL(ac_compile); then
1207 case `/usr/bin/file conftest.$ac_objext` in
1208 *"ELF"*)
1209 ac_cv_object_format=elf
1210 ;;
1211 *"Mach-O"*)
1212 ac_cv_object_format=mach
1213 ;;
1214 *)
1215 ac_cv_object_format=unknown
1216 ;;
1217 esac
1218 fi
1219 rm -rf conftest*
1220 ])
1221
1222 dnl Add -fno-strict-aliasing for slirp sources
1223 if [[ "x$HAVE_GCC30" = "xyes" ]]; then
1224 SAVED_CFLAGS="$CFLAGS"
1225 CFLAGS="$CFLAGS -fno-strict-aliasing"
1226 AC_CACHE_CHECK([whether the compiler supports -fno-strict-aliasing],
1227 ac_cv_gcc_no_strict_aliasing, [
1228 AC_TRY_COMPILE([],[],
1229 [ac_cv_gcc_no_strict_aliasing=yes; AC_SUBST(SLIRP_CFLAGS, "-fno-strict-aliasing")],
1230 [ac_cv_gcc_no_strict_aliasing=no])
1231 ])
1232 CFLAGS="$SAVED_CFLAGS"
1233 fi
1234
1235 dnl Add -mdynamic-no-pic for MacOS X
1236 if [[ "x$HAVE_GCC30" = "xyes" ]]; then
1237 SAVED_CFLAGS="$CFLAGS"
1238 CFLAGS="$CFLAGS -mdynamic-no-pic"
1239 AC_CACHE_CHECK([whether the compiler supports -mdynamic-no-pic],
1240 ac_cv_gcc_mdynamic_no_pic, [
1241 AC_TRY_COMPILE([],[],[ac_cv_gcc_mdynamic_no_pic=yes],[ac_cv_gcc_mdynamic_no_pic=no])
1242 ])
1243 if [[ "x$ac_cv_gcc_mdynamic_no_pic" = "xyes" ]]; then
1244 CXXFLAGS="$CXXFLAGS -mdynamic-no-pic"
1245 else
1246 CFLAGS="$SAVED_CFLAGS"
1247 fi
1248 fi
1249
1250 dnl CPU emulator sources
1251 if [[ "x$EMULATED_PPC" = "xyes" ]]; then
1252 CPUSRCS="\
1253 ../kpx_cpu/src/mathlib/ieeefp.cpp \
1254 ../kpx_cpu/src/mathlib/mathlib.cpp \
1255 ../kpx_cpu/src/cpu/ppc/ppc-cpu.cpp \
1256 ../kpx_cpu/src/cpu/ppc/ppc-decode.cpp \
1257 ../kpx_cpu/src/cpu/ppc/ppc-execute.cpp \
1258 ../kpx_cpu/src/cpu/ppc/ppc-translate.cpp"
1259 CPPFLAGS="$CPPFLAGS -I../kpx_cpu/include -I../kpx_cpu/src"
1260
1261 dnl Enable JIT compiler, if possible
1262 if [[ "x$WANT_JIT" = "xyes" ]]; then
1263 AC_CACHE_CHECK([whether dyngen can be used],
1264 ac_cv_use_dyngen, [
1265 case $host_cpu:$ac_cv_object_format in
1266 powerpc:elf)
1267 ac_cv_use_dyngen=yes
1268 ;;
1269 x86_64:elf)
1270 ac_cv_use_dyngen=yes
1271 ;;
1272 i?86:elf)
1273 ac_cv_use_dyngen=yes
1274 ;;
1275 powerpc:mach)
1276 ac_cv_use_dyngen=yes
1277 ;;
1278 *:*)
1279 ac_cv_use_dyngen=no
1280 ;;
1281 esac
1282 dnl Check for a suitable synthetic opcodes compiler (icc is faking itself as gcc 3.2.2)
1283 if [[ -z "$DYNGEN_CC" ]]; then
1284 if [[ "x$HAVE_GCC27" = "xyes" -a "x$HAVE_ICC" = "xno" ]]; then
1285 DYNGEN_CC=$CXX
1286 else
1287 for p in /usr/bin /usr/local/bin; do
1288 gxx="$p/g++"
1289 if [[ -x "$gxx" ]]; then
1290 DYNGEN_CC="$gxx"
1291 fi
1292 done
1293 fi
1294 fi
1295 if [[ -z "$DYNGEN_CC" ]]; then
1296 ac_cv_use_dyngen=no
1297 fi
1298 ])
1299 if [[ "x$ac_cv_use_dyngen" = "xyes" ]]; then
1300 case $host_cpu in
1301 i?86)
1302 DYNGEN_OP_FLAGS="-fomit-frame-pointer -mpreferred-stack-boundary=2"
1303 ;;
1304 powerpc)
1305 if [[ "x$ac_cv_object_format" = "xmach" ]]; then
1306 DYNGEN_OP_FLAGS="-mdynamic-no-pic"
1307 fi
1308 ;;
1309 esac
1310 if [[ "x$HAVE_GCC30" = "xyes" ]]; then
1311 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -falign-functions=0"
1312 else
1313 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -malign-functions=0"
1314 fi
1315 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -finline-limit=10000 -fno-exceptions -g0"
1316 if [[ "x$HAVE_GCC30" = "xyes" ]]; then
1317 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -fno-reorder-blocks -fno-optimize-sibling-calls"
1318 fi
1319 else
1320 WANT_JIT=no
1321 fi
1322 AC_TRANSLATE_DEFINE(ENABLE_DYNGEN, $ac_cv_use_dyngen, [Define to enable dyngen engine])
1323 if [[ "x$WANT_JIT" = "xyes" ]]; then
1324 DYNGENSRCS="\
1325 ../kpx_cpu/src/cpu/jit/dyngen.c \
1326 ../kpx_cpu/src/cpu/jit/cxxdemangle.cpp"
1327 CPUSRCS="\
1328 ../kpx_cpu/src/cpu/jit/jit-cache.cpp \
1329 ../kpx_cpu/src/cpu/jit/basic-dyngen.cpp \
1330 ../kpx_cpu/src/cpu/ppc/ppc-dyngen.cpp $CPUSRCS"
1331 fi
1332 fi
1333 CPUSRCS="$CPUSRCS ../kpx_cpu/sheepshaver_glue.cpp"
1334 else
1335 WANT_JIT=no
1336 fi
1337 if [[ "x$ac_cv_use_dyngen" = "xyes" ]]; then
1338 AC_CACHE_CHECK([whether static data regions are executable],
1339 ac_cv_have_static_data_exec, [
1340 AC_TRY_RUN([int main(void) {
1341 #if defined(__powerpc__) || defined(__ppc__)
1342 static unsigned int p[8] = {0x4e800020,};
1343 asm volatile("dcbst 0,%0" : : "r" (p) : "memory");
1344 asm volatile("sync" : : : "memory");
1345 asm volatile("icbi 0,%0" : : "r" (p) : "memory");
1346 asm volatile("sync" : : : "memory");
1347 asm volatile("isync" : : : "memory");
1348 ((void (*)(void))p)();
1349 return 0;
1350 #endif
1351 return 1;
1352 }], ac_cv_have_static_data_exec=yes, ac_cv_have_static_data_exec=no,
1353 dnl When cross-compiling, do not assume anything.
1354 ac_cv_have_static_data_exec=no
1355 )
1356 ])
1357 else
1358 ac_cv_use_dyngen=no
1359 fi
1360 AC_TRANSLATE_DEFINE(HAVE_STATIC_DATA_EXEC, "$ac_cv_have_static_data_exec",
1361 [Define if your system marks static data pages as executable.])
1362
1363 if [[ "x$WANT_JIT" = "xyes" ]]; then
1364 CPPFLAGS="$CPPFLAGS -DUSE_JIT"
1365 fi
1366
1367 dnl Generate Makefile.
1368 AC_SUBST(PERL)
1369 AC_SUBST(USE_DYNGEN, [$ac_cv_use_dyngen])
1370 AC_SUBST(DYNGENSRCS)
1371 AC_SUBST(DYNGEN_CC)
1372 AC_SUBST(DYNGEN_OP_FLAGS)
1373 AC_SUBST(SYSSRCS)
1374 AC_SUBST(CPUSRCS)
1375 AC_SUBST(BLESS)
1376 AC_SUBST(KEYCODES)
1377 AC_OUTPUT([
1378 Makefile
1379 ../MacOSX/Info.plist
1380 ])
1381
1382 dnl Print summary.
1383 echo
1384 echo SheepShaver configuration summary:
1385 echo
1386 echo SDL support ...................... : $SDL_SUPPORT
1387 echo FBDev DGA support ................ : $WANT_FBDEV_DGA
1388 echo XFree86 DGA support .............. : $WANT_XF86_DGA
1389 echo XFree86 VidMode support .......... : $WANT_XF86_VIDMODE
1390 echo Using PowerPC emulator ........... : $EMULATED_PPC
1391 echo Enable JIT compiler .............. : $WANT_JIT
1392 echo Enable video on SEGV signals ..... : $WANT_VOSF
1393 echo ESD sound support ................ : $WANT_ESD
1394 echo GTK user interface ............... : $WANT_GTK
1395 echo mon debugger support ............. : $WANT_MON
1396 echo Addressing mode .................. : $WANT_ADDRESSING_MODE
1397 echo Bad memory access recovery type .. : $sigsegv_recovery
1398 echo
1399 echo "Configuration done. Now type \"make\"."