ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/Unix/configure.in
Revision: 1.26
Committed: 2004-06-24T15:37:25Z (20 years, 5 months ago) by gbeauche
Branch: MAIN
Changes since 1.25: +48 -9 lines
Log Message:
SDL support in SheepShaver too, though it doesn't work in native mode
on Linux/ppc as libSDL is pulling in libpthread which conflicts with
our sheepthreads.

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(main_unix.cpp)
5 AC_PREREQ(2.12)
6 AC_CONFIG_HEADER(config.h)
7
8 dnl Canonical system information.
9 AC_CANONICAL_HOST
10 AC_CANONICAL_TARGET
11
12 dnl Options.
13 AC_ARG_ENABLE(jit, [ --enable-jit enable JIT compiler [default=yes]], [WANT_JIT=$enableval], [WANT_JIT=yes])
14 AC_ARG_ENABLE(ppc-emulator, [ --enable-ppc-emulator use the selected PowerPC emulator [default=auto]], [WANT_EMULATED_PPC=$enableval], [WANT_EMULATED_PPC=auto])
15 AC_ARG_ENABLE(xf86-dga, [ --enable-xf86-dga use the XFree86 DGA extension [default=yes]], [WANT_XF86_DGA=$enableval], [WANT_XF86_DGA=yes])
16 AC_ARG_ENABLE(xf86-vidmode, [ --enable-xf86-vidmode use the XFree86 VidMode extension [default=no]], [WANT_XF86_VIDMODE=$enableval], [WANT_XF86_VIDMODE=no])
17 AC_ARG_ENABLE(vosf, [ --enable-vosf enable video on SEGV signals [default=yes]], [WANT_VOSF=$enableval], [WANT_VOSF=yes])
18 AC_ARG_ENABLE(sdl-video, [ --enable-sdl-video use SDL for video graphics [default=no]], [WANT_SDL_VIDEO=$enableval], [WANT_SDL_VIDEO=no])
19 AC_ARG_WITH(esd, [ --with-esd support ESD for sound under Linux/FreeBSD [default=yes]], [WANT_ESD=$withval], [WANT_ESD=yes])
20 AC_ARG_WITH(gtk, [ --with-gtk use GTK user interface [default=yes]], [WANT_GTK=$withval], [WANT_GTK=yes])
21 AC_ARG_WITH(mon, [ --with-mon use mon as debugger [default=yes]], [WANT_MON=$withval], [WANT_MON=yes])
22 AC_ARG_WITH(dgcc, [ --with-dgcc=COMPILER use C++ COMPILER to compile synthetic opcodes], [DYNGEN_CC=$withval])
23
24 dnl Checks for programs.
25 AC_PROG_CC
26 AC_PROG_CPP
27 AC_PROG_CXX
28 AC_PROG_MAKE_SET
29 AC_PROG_INSTALL
30
31 dnl Check for PowerPC target CPU.
32 HAVE_PPC=no
33 AC_MSG_CHECKING(for PowerPC target CPU)
34 AC_EGREP_CPP(yes,
35 [
36 #ifdef __powerpc__
37 yes
38 #endif
39 #ifdef __ppc__
40 yes
41 #endif
42 ], [AC_MSG_RESULT(yes); HAVE_PPC=yes], AC_MSG_RESULT(no))
43
44 dnl We use native CPU if possible.
45 EMULATED_PPC=yes
46 case $WANT_EMULATED_PPC in
47 auto) [[ "x$HAVE_PPC" = "xyes" ]] && EMULATED_PPC=no;;
48 no) EMULATED_PPC=no;;
49 esac
50 if [[ "x$EMULATED_PPC" = "xyes" ]]; then
51 AC_DEFINE(EMULATED_PPC)
52 fi
53
54 dnl We use mon if possible.
55 MONSRCS=
56 case "x$WANT_MON" in
57 x/* | x.*)
58 mon_srcdir=$WANT_MON
59 WANT_MON=yes
60 ;;
61 xyes)
62 mon_srcdir=../../../mon/src
63 ;;
64 esac
65 if [[ "x$WANT_MON" = "xyes" ]]; then
66 AC_MSG_CHECKING(for mon)
67 if grep mon_init $mon_srcdir/mon.h >/dev/null 2>/dev/null; then
68 AC_MSG_RESULT(yes)
69 AC_DEFINE(ENABLE_MON)
70 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"
71 CXXFLAGS="$CXXFLAGS -I$mon_srcdir -I$mon_srcdir/disass"
72 AC_CHECK_LIB(ncurses, tgetent, ,
73 AC_CHECK_LIB(termcap, tgetent, ,
74 AC_CHECK_LIB(termlib, tgetent, ,
75 AC_CHECK_LIB(terminfo, tgetent, ,
76 AC_CHECK_LIB(Hcurses, tgetent, ,
77 AC_CHECK_LIB(curses, tgetent))))))
78 AC_CHECK_LIB(readline, readline)
79 AC_CHECK_HEADERS(readline.h history.h readline/readline.h readline/history.h)
80 else
81 AC_MSG_RESULT(no)
82 AC_MSG_WARN([Could not find mon, ignoring --with-mon.])
83 WANT_MON=no
84 fi
85 fi
86
87 dnl Checks for libraries.
88 AC_CHECK_LIB(posix4, sem_init)
89
90 dnl Do we need SDL?
91 WANT_SDL=no
92 SDL_SUPPORT="none"
93 if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then
94 WANT_SDL=yes
95 WANT_XF86_DGA=no
96 WANT_XF86_VIDMODE=no
97 WANT_FBDEV_DGA=no
98 SDL_SUPPORT="video"
99 fi
100 if [[ "x$WANT_SDL" = "xyes" ]]; then
101 AC_PATH_PROG(sdl_config, "sdl-config")
102 if [[ -n "$sdl_config" ]]; then
103 sdl_cflags=`$sdl_config --cflags`
104 sdl_libs=`$sdl_config --libs`
105 CFLAGS="$CFLAGS $sdl_cflags"
106 CXXFLAGS="$CXXFLAGS $sdl_cflags"
107 LIBS="$LIBS $sdl_libs"
108 else
109 WANT_SDL=no
110 fi
111 fi
112
113 dnl We need X11, if not using SDL.
114 if [[ "x$WANT_SDL" = "xno" ]]; then
115 AC_PATH_XTRA
116 if [[ "x$no_x" = "xyes" ]]; then
117 AC_MSG_ERROR([You need X11 to run SheepShaver.])
118 fi
119 CFLAGS="$CFLAGS $X_CFLAGS"
120 CXXFLAGS="$CXXFLAGS $X_CFLAGS"
121 LIBS="$LIBS $X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS"
122 fi
123
124 dnl We need pthreads on non-PowerPC systems. Try libpthread first, then libc_r (FreeBSD), then PTL.
125 HAVE_PTHREADS=yes
126 case $EMULATED_PPC:$target_os in
127 no:linux*)
128 dnl We do have our own pthread_cancel() implementation
129 AC_DEFINE(HAVE_PTHREAD_CANCEL, 1, [Define if you have the pthread_cancel function.])
130 ;;
131 *:*)
132 AC_CHECK_LIB(pthread, pthread_create, , [
133 AC_CHECK_LIB(c_r, pthread_create, , [
134 AC_CHECK_LIB(PTL, pthread_create, , [
135 AC_MSG_ERROR([You need pthreads to run Basilisk II.])
136 ])
137 ])
138 ])
139 AC_CHECK_FUNCS(pthread_cancel)
140 AC_CHECK_FUNCS(pthread_mutexattr_setprotocol)
141 AC_CHECK_FUNCS(pthread_mutexattr_settype)
142 AC_CHECK_FUNCS(pthread_mutexattr_setpshared)
143 if [[ "x$HAVE_PTHREADS" = "xyes" ]]; then
144 AC_DEFINE(HAVE_PTHREADS, 1, [Define if pthreads are available.])
145 fi
146 dnl If POSIX.4 semaphores are not available, we emulate them with pthread mutexes.
147 SEMSRC=
148 AC_CHECK_FUNCS(sem_init, , [
149 if test "x$HAVE_PTHREADS" = "xyes"; then
150 SEMSRC=posix_sem.cpp
151 fi
152 ])
153 ;;
154 esac
155
156 dnl We use XFree86 DGA if possible.
157 if [[ "x$WANT_XF86_DGA" = "xyes" ]]; then
158 AC_CHECK_LIB(Xxf86dga, XF86DGAQueryExtension, [
159 AC_DEFINE(ENABLE_XF86_DGA)
160 LIBS="$LIBS -lXxf86dga"
161 ], [
162 AC_MSG_WARN([Could not find XFree86 DGA extension, ignoring --enable-xf86-dga.])
163 WANT_XF86_DGA=no
164 ])
165 fi
166
167 dnl We use XFree86 VidMode if possible.
168 if [[ "x$WANT_XF86_VIDMODE" = "xyes" ]]; then
169 AC_CHECK_LIB(Xxf86vm, XF86VidModeQueryExtension, [
170 AC_DEFINE(ENABLE_XF86_VIDMODE)
171 LIBS="$LIBS -lXxf86vm"
172 ], [
173 AC_MSG_WARN([Could not find XFree86 VidMode extension, ignoring --enable-xf86-vidmode.])
174 WANT_XF86_VIDMODE=no
175 ])
176 fi
177
178 dnl We use GTK+ if possible.
179 UISRCS=../dummy/prefs_editor_dummy.cpp
180 if [[ "x$WANT_GTK" = "xyes" ]]; then
181 AM_PATH_GTK(1.2.0, [
182 AC_DEFINE(ENABLE_GTK)
183 CFLAGS="$CFLAGS $GTK_CFLAGS"
184 CXXFLAGS="$CXXFLAGS $GTK_CFLAGS"
185 LIBS="$LIBS $GTK_LIBS"
186 UISRCS=prefs_editor_gtk.cpp
187 ], [
188 AC_MSG_WARN([Could not find GTK+, disabling user interface.])
189 WANT_GTK=no
190 ])
191 fi
192
193 dnl We use ESD if possible.
194 if [[ "x$WANT_ESD" = "xyes" ]]; then
195 AM_PATH_ESD(0.2.8, [
196 AC_DEFINE(ENABLE_ESD)
197 CFLAGS="$CFLAGS $ESD_CFLAGS"
198 CXXFLAGS="$CXXFLAGS $ESD_CFLAGS"
199 LIBS="$LIBS $ESD_LIBS"
200 ], [
201 AC_MSG_WARN([Could not find ESD, disabling ESD support.])
202 WANT_ESD=no
203 ])
204 fi
205
206 dnl Checks for header files.
207 AC_HEADER_STDC
208 AC_HEADER_SYS_WAIT
209 AC_CHECK_HEADERS(mach/vm_map.h mach/mach_init.h sys/mman.h)
210 AC_CHECK_HEADERS(sys/time.h sys/times.h)
211 AC_CHECK_HEADERS(unistd.h fcntl.h byteswap.h)
212 AC_CHECK_HEADERS(linux/if.h linux/if_tun.h net/if.h net/if_tun.h)
213
214 dnl Checks for typedefs, structures, and compiler characteristics.
215 AC_C_BIGENDIAN
216 AC_C_CONST
217 AC_C_INLINE
218 AC_CHECK_SIZEOF(short, 2)
219 AC_CHECK_SIZEOF(int, 4)
220 AC_CHECK_SIZEOF(long, 4)
221 AC_CHECK_SIZEOF(long long, 8)
222 AC_CHECK_SIZEOF(float, 4)
223 AC_CHECK_SIZEOF(double, 8)
224 AC_CHECK_SIZEOF(void *, 4)
225 AC_TYPE_OFF_T
226 AC_CHECK_TYPE(loff_t, off_t)
227 AC_TYPE_SIZE_T
228 AC_TYPE_SIGNAL
229 AC_HEADER_TIME
230 AC_STRUCT_TM
231
232 dnl Check whether struct sigaction has sa_restorer member.
233 AC_CACHE_CHECK([whether struct sigaction has sa_restorer],
234 ac_cv_signal_sa_restorer, [
235 AC_TRY_COMPILE([
236 #include <signal.h>
237 ], [struct sigaction sa; sa.sa_restorer = 0;],
238 ac_cv_signal_sa_restorer=yes, ac_cv_signal_sa_restorer=no,
239 dnl When cross-compiling, do not assume anything.
240 ac_cv_signal_sa_restorer=no
241 )
242 ])
243 if [[ "x$ac_cv_signal_sa_restorer" = "xyes" ]]; then
244 AC_DEFINE(HAVE_SIGNAL_SA_RESTORER)
245 fi
246
247 dnl Checks for library functions.
248 AC_CHECK_FUNCS(strdup cfmakeraw)
249 AC_CHECK_FUNCS(nanosleep)
250 AC_CHECK_FUNCS(sigaction signal)
251 AC_CHECK_FUNCS(mmap mprotect munmap)
252 AC_CHECK_FUNCS(vm_allocate vm_deallocate vm_protect)
253 AC_CHECK_FUNCS(posix_memalign memalign valloc)
254
255 dnl Darwin seems to define mach_task_self() instead of task_self().
256 AC_CHECK_FUNCS(mach_task_self task_self)
257
258 dnl We need clock_gettime() for better performance but it may drag
259 dnl libpthread in, which we don't want for native ppc mode
260 case $EMULATED_PPC:$target_os in
261 no:linux*)
262 ;;
263 *:*)
264 AC_SEARCH_LIBS(clock_gettime, [rt posix4])
265 AC_CHECK_FUNCS(clock_gettime)
266 ;;
267 esac
268
269 dnl Select system-dependant sources.
270 SERIALSRC=serial_unix.cpp
271 ETHERSRC=../dummy/ether_dummy.cpp
272 SCSISRC=../dummy/scsi_dummy.cpp
273 AUDIOSRC=../dummy/audio_dummy.cpp
274 EXTRASYSSRCS=
275 case "$target_os" in
276 linux*)
277 ETHERSRC=Linux/ether_linux.cpp
278 AUDIOSRC=audio_oss_esd.cpp
279 SCSISRC=Linux/scsi_linux.cpp
280 if [[ "x$EMULATED_PPC" = "xno" ]]; then
281 EXTRASYSSRCS="Linux/paranoia.cpp Linux/sheepthreads.c Linux/asm_linux.S"
282 fi
283 ;;
284 darwin*)
285 if [[ "x$EMULATED_PPC" = "xno" ]]; then
286 EXTRASYSSRCS="Darwin/paranoia.cpp Linux/asm_linux.S"
287 fi
288 ;;
289 esac
290
291 dnl SDL overrides
292 if [[ "x$WANT_SDL" = "xyes" ]]; then
293 AC_DEFINE(USE_SDL, 1, [Define to enble SDL support])
294 fi
295 if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then
296 VIDEOSRCS="../SDL/video_sdl.cpp ../dummy/clip_dummy.cpp"
297 AC_DEFINE(USE_SDL_VIDEO, 1, [Define to enable SDL video graphics support])
298 else
299 VIDEOSRCS="video_x.cpp clip_unix.cpp"
300 fi
301
302 SYSSRCS="$VIDEOSRCS $SERIALSRC $ETHERSRC $SCSISRC $AUDIOSRC $SEMSRC $UISRCS $MONSRCS $EXTRASYSSRCS"
303
304 dnl Define a macro that translates a yesno-variable into a C macro definition
305 dnl to be put into the config.h file
306 dnl $1 -- the macro to define
307 dnl $2 -- the value to translate
308 dnl $3 -- template name
309 AC_DEFUN(AC_TRANSLATE_DEFINE, [
310 if [[ "x$2" = "xyes" -o "x$2" = "xguessing yes" ]]; then
311 AC_DEFINE($1, 1, $3)
312 fi
313 ])
314
315 dnl Check that the host supports TUN/TAP devices
316 AC_CACHE_CHECK([whether TUN/TAP is supported],
317 ac_cv_tun_tap_support, [
318 AC_TRY_COMPILE([
319 #if defined(HAVE_LINUX_IF_H) && defined(HAVE_LINUX_IF_TUN_H)
320 #include <linux/if.h>
321 #include <linux/if_tun.h>
322 #endif
323 #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_IF_TUN_H)
324 #include <net/if.h>
325 #include <net/if_tun.h>
326 #endif
327 ], [
328 struct ifreq ifr;
329 memset(&ifr, 0, sizeof(ifr));
330 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
331 ],
332 ac_cv_tun_tap_support=yes, ac_cv_tun_tap_support=no
333 )
334 ])
335 AC_TRANSLATE_DEFINE(ENABLE_TUNTAP, "$ac_cv_tun_tap_support",
336 [Define if your system supports TUN/TAP devices.])
337
338 dnl Various checks if the system supports vm_allocate() and the like functions.
339 have_mach_vm=no
340 if [[ "x$ac_cv_func_vm_allocate" = "xyes" -a "x$ac_cv_func_vm_deallocate" = "xyes" -a \
341 "x$ac_cv_func_vm_protect" = "xyes" ]]; then
342 have_mach_vm=yes
343 fi
344 AC_TRANSLATE_DEFINE(HAVE_MACH_VM, "$have_mach_vm",
345 [Define if your system has a working vm_allocate()-based memory allocator.])
346
347 dnl Check that vm_allocate(), vm_protect() work
348 if [[ "x$have_mach_vm" = "xyes" ]]; then
349
350 AC_CACHE_CHECK([whether vm_protect works],
351 ac_cv_vm_protect_works, [
352 AC_LANG_SAVE
353 AC_LANG_CPLUSPLUS
354 ac_cv_vm_protect_works=yes
355 dnl First the tests that should segfault
356 for test_def in NONE_READ NONE_WRITE READ_WRITE; do
357 AC_TRY_RUN([
358 #define CONFIGURE_TEST_VM_MAP
359 #define TEST_VM_PROT_$test_def
360 #include "vm_alloc.cpp"
361 ], ac_cv_vm_protect_works=no, rm -f core,
362 dnl When cross-compiling, do not assume anything
363 ac_cv_vm_protect_works="guessing no"
364 )
365 done
366 AC_TRY_RUN([
367 #define CONFIGURE_TEST_VM_MAP
368 #define TEST_VM_PROT_RDWR_WRITE
369 #include "vm_alloc.cpp"
370 ], , ac_cv_vm_protect_works=no,
371 dnl When cross-compiling, do not assume anything
372 ac_cv_vm_protect_works="guessing no"
373 )
374 AC_LANG_RESTORE
375 ]
376 )
377
378 dnl Remove support for vm_allocate() if vm_protect() does not work
379 if [[ "x$have_mach_vm" = "xyes" ]]; then
380 case $ac_cv_vm_protect_works in
381 *yes) have_mach_vm=yes;;
382 *no) have_mach_vm=no;;
383 esac
384 fi
385 AC_TRANSLATE_DEFINE(HAVE_MACH_VM, "$have_mach_vm",
386 [Define if your system has a working vm_allocate()-based memory allocator.])
387
388 fi dnl HAVE_MACH_VM
389
390 dnl Various checks if the system supports mmap() and the like functions.
391 dnl ... and Mach memory allocators are not supported
392 have_mmap_vm=no
393 if [[ "x$ac_cv_func_mmap" = "xyes" -a "x$ac_cv_func_munmap" = "xyes" -a \
394 "x$ac_cv_func_mprotect" = "xyes" ]]; then
395 if [[ "x$have_mach_vm" = "xno" ]]; then
396 have_mmap_vm=yes
397 fi
398 fi
399 AC_TRANSLATE_DEFINE(HAVE_MMAP_VM, "$have_mmap_vm",
400 [Define if your system has a working mmap()-based memory allocator.])
401
402 dnl Check that mmap() and associated functions work.
403 if [[ "x$have_mmap_vm" = "xyes" ]]; then
404
405 dnl Check if we have a working anonymous mmap()
406 AC_CACHE_CHECK([whether mmap supports MAP_ANON],
407 ac_cv_mmap_anon, [
408 AC_LANG_SAVE
409 AC_LANG_CPLUSPLUS
410 AC_TRY_RUN([
411 #define HAVE_MMAP_ANON
412 #define CONFIGURE_TEST_VM_MAP
413 #define TEST_VM_MMAP_ANON
414 #include "vm_alloc.cpp"
415 ], ac_cv_mmap_anon=yes, ac_cv_mmap_anon=no,
416 dnl When cross-compiling, do not assume anything.
417 ac_cv_mmap_anon="guessing no"
418 )
419 AC_LANG_RESTORE
420 ]
421 )
422 AC_TRANSLATE_DEFINE(HAVE_MMAP_ANON, "$ac_cv_mmap_anon",
423 [Define if <sys/mman.h> defines MAP_ANON and mmap()'ing with MAP_ANON works.])
424
425 AC_CACHE_CHECK([whether mmap supports MAP_ANONYMOUS],
426 ac_cv_mmap_anonymous, [
427 AC_LANG_SAVE
428 AC_LANG_CPLUSPLUS
429 AC_TRY_RUN([
430 #define HAVE_MMAP_ANONYMOUS
431 #define CONFIGURE_TEST_VM_MAP
432 #define TEST_VM_MMAP_ANON
433 #include "vm_alloc.cpp"
434 ], ac_cv_mmap_anonymous=yes, ac_cv_mmap_anonymous=no,
435 dnl When cross-compiling, do not assume anything.
436 ac_cv_mmap_anonymous="guessing no"
437 )
438 AC_LANG_RESTORE
439 ]
440 )
441 AC_TRANSLATE_DEFINE(HAVE_MMAP_ANONYMOUS, "$ac_cv_mmap_anonymous",
442 [Define if <sys/mman.h> defines MAP_ANONYMOUS and mmap()'ing with MAP_ANONYMOUS works.])
443
444 AC_CACHE_CHECK([whether mprotect works],
445 ac_cv_mprotect_works, [
446 AC_LANG_SAVE
447 AC_LANG_CPLUSPLUS
448 ac_cv_mprotect_works=yes
449 dnl First the tests that should segfault
450 for test_def in NONE_READ NONE_WRITE READ_WRITE; do
451 AC_TRY_RUN([
452 #define CONFIGURE_TEST_VM_MAP
453 #define TEST_VM_PROT_$test_def
454 #include "vm_alloc.cpp"
455 ], ac_cv_mprotect_works=no, rm -f core,
456 dnl When cross-compiling, do not assume anything
457 ac_cv_mprotect_works="guessing no"
458 )
459 done
460 AC_TRY_RUN([
461 #define CONFIGURE_TEST_VM_MAP
462 #define TEST_VM_PROT_RDWR_WRITE
463 #include "vm_alloc.cpp"
464 ], , ac_cv_mprotect_works=no,
465 dnl When cross-compiling, do not assume anything
466 ac_cv_mprotect_works="guessing no"
467 )
468 AC_LANG_RESTORE
469 ]
470 )
471
472 dnl Remove support for mmap() if mprotect() does not work
473 if [[ "x$have_mmap_vm" = "xyes" ]]; then
474 case $ac_cv_mprotect_works in
475 *yes) have_mmap_vm=yes;;
476 *no) have_mmap_vm=no;;
477 esac
478 fi
479 AC_TRANSLATE_DEFINE(HAVE_MMAP_VM, $have_mmap_vm,
480 [Define if your system has a working mmap()-based memory allocator.])
481
482 fi dnl HAVE_MMAP_VM
483
484 dnl Check if we can modify the __PAGEZERO segment for use as Low Memory
485 AC_CACHE_CHECK([whether __PAGEZERO can be Low Memory area 0x0000-0x3000],
486 ac_cv_pagezero_hack, [
487 ac_cv_pagezero_hack=no
488 if AC_TRY_COMMAND([Darwin/testlmem.sh 0x3000]); then
489 ac_cv_pagezero_hack=yes
490 dnl might as well skip the test for mmap-able low memory
491 ac_cv_can_map_lm=no
492 fi
493 ])
494 AC_TRANSLATE_DEFINE(PAGEZERO_HACK, "$ac_cv_pagezero_hack",
495 [Define if the __PAGEZERO Mach-O Low Memory Globals hack works on this system.])
496
497 dnl Check if we can mmap 0x3000 bytes from 0x0000
498 AC_CACHE_CHECK([whether we can map Low Memory area 0x0000-0x3000],
499 ac_cv_can_map_lm, [
500 AC_LANG_SAVE
501 AC_LANG_CPLUSPLUS
502 AC_TRY_RUN([
503 #include "vm_alloc.cpp"
504 int main(void) { /* returns 0 if we could map the lowmem globals */
505 volatile char * lm = 0;
506 if (vm_init() < 0) exit(1);
507 if (vm_acquire_fixed(0, 0x2000) < 0) exit(1);
508 lm[0] = 'z';
509 if (vm_release((char *)lm, 0x2000) < 0) exit(1);
510 vm_exit(); exit(0);
511 }
512 ], ac_cv_can_map_lm=yes, ac_cv_can_map_lm=no,
513 dnl When cross-compiling, do not assume anything.
514 ac_cv_can_map_lm="guessing no"
515 )
516 AC_LANG_RESTORE
517 ]
518 )
519
520 dnl Check signal handlers need to be reinstalled
521 AC_CACHE_CHECK([whether signal handlers need to be reinstalled],
522 ac_cv_signal_need_reinstall, [
523 AC_LANG_SAVE
524 AC_LANG_CPLUSPLUS
525 AC_TRY_RUN([
526 #include <stdlib.h>
527 #ifdef HAVE_UNISTD_H
528 #include <unistd.h>
529 #endif
530 #include <signal.h>
531 static int handled_signal = 0;
532 RETSIGTYPE sigusr1_handler(int) { handled_signal++; }
533 int main(void) { /* returns 0 if signals need not to be reinstalled */
534 signal(SIGUSR1, sigusr1_handler); raise(SIGUSR1); raise(SIGUSR1);
535 exit(handled_signal == 2);
536 }
537 ], ac_cv_signal_need_reinstall=yes, ac_cv_signal_need_reinstall=no,
538 dnl When cross-compiling, do not assume anything.
539 ac_cv_signal_need_reinstall="guessing yes"
540 )
541 AC_LANG_RESTORE
542 ]
543 )
544 AC_TRANSLATE_DEFINE(SIGNAL_NEED_REINSTALL, "$ac_cv_signal_need_reinstall",
545 [Define if your system requires signals to be reinstalled.])
546
547 dnl Check if sigaction handlers need to be reinstalled
548 AC_CACHE_CHECK([whether sigaction handlers need to be reinstalled],
549 ac_cv_sigaction_need_reinstall, [
550 AC_LANG_SAVE
551 AC_LANG_CPLUSPLUS
552 AC_TRY_RUN([
553 #include <stdlib.h>
554 #ifdef HAVE_UNISTD_H
555 #include <unistd.h>
556 #endif
557 #include <signal.h>
558 static int handled_signal = 0;
559 RETSIGTYPE sigusr1_handler(int) { handled_signal++; }
560 typedef RETSIGTYPE (*signal_handler)(int);
561 static signal_handler mysignal(int sig, signal_handler handler) {
562 struct sigaction old_sa;
563 struct sigaction new_sa;
564 new_sa.sa_handler = handler;
565 return ((sigaction(sig,&new_sa,&old_sa) < 0) ? SIG_IGN : old_sa.sa_handler);
566 }
567 int main(void) { /* returns 0 if signals need not to be reinstalled */
568 mysignal(SIGUSR1, sigusr1_handler); raise(SIGUSR1); raise(SIGUSR1);
569 exit(handled_signal == 2);
570 }
571 ], ac_cv_sigaction_need_reinstall=yes, ac_cv_sigaction_need_reinstall=no,
572 dnl When cross-compiling, do not assume anything.
573 ac_cv_sigaction_need_reinstall="guessing yes"
574 )
575 AC_LANG_RESTORE
576 ]
577 )
578 AC_TRANSLATE_DEFINE(SIGACTION_NEED_REINSTALL, "$ac_cv_sigaction_need_reinstall",
579 [Define if your system requires sigactions to be reinstalled.])
580
581 dnl Check if Mach exceptions supported.
582 AC_CACHE_CHECK([whether your system supports Mach exceptions],
583 ac_cv_have_mach_exceptions, [
584 AC_LANG_SAVE
585 AC_LANG_CPLUSPLUS
586 AC_TRY_RUN([
587 #define HAVE_MACH_EXCEPTIONS 1
588 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
589 #include "vm_alloc.cpp"
590 #include "sigsegv.cpp"
591 ],
592 ac_cv_have_mach_exceptions=yes,
593 ac_cv_have_mach_exceptions=no,
594 dnl When cross-compiling, do not assume anything.
595 ac_cv_have_mach_exceptions=no
596 )
597 AC_LANG_RESTORE
598 ]
599 )
600 if [[ "$ac_cv_have_mach_exceptions" = "yes" ]]; then
601 sigsegv_recovery=mach
602 fi
603 AC_TRANSLATE_DEFINE(HAVE_MACH_EXCEPTIONS, "$ac_cv_have_mach_exceptions",
604 [Define if your system supports Mach exceptions.])
605
606 dnl Otherwise, check if extended signals are supported.
607 if [[ -z "$sigsegv_recovery" ]]; then
608 AC_CACHE_CHECK([whether your system supports extended signal handlers],
609 ac_cv_have_extended_signals, [
610 AC_LANG_SAVE
611 AC_LANG_CPLUSPLUS
612 AC_TRY_RUN([
613 #define HAVE_SIGINFO_T 1
614 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
615 #include "vm_alloc.cpp"
616 #include "sigsegv.cpp"
617 ],
618 ac_cv_have_extended_signals=yes,
619 ac_cv_have_extended_signals=no,
620 dnl When cross-compiling, do not assume anything.
621 ac_cv_have_extended_signals=no
622 )
623 AC_LANG_RESTORE
624 ]
625 )
626 if [[ "$ac_cv_have_extended_signals" = "yes" ]]; then
627 sigsegv_recovery=siginfo
628 fi
629 AC_TRANSLATE_DEFINE(HAVE_SIGINFO_T, "$ac_cv_have_extended_signals",
630 [Define if your system support extended signals.])
631 fi
632
633 dnl Otherwise, check for subterfuges.
634 if [[ -z "$sigsegv_recovery" ]]; then
635 AC_CACHE_CHECK([whether we then have a subterfuge for your system],
636 ac_cv_have_sigcontext_hack, [
637 AC_LANG_SAVE
638 AC_LANG_CPLUSPLUS
639 AC_TRY_RUN([
640 #define HAVE_SIGCONTEXT_SUBTERFUGE 1
641 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
642 #include "vm_alloc.cpp"
643 #include "sigsegv.cpp"
644 ],
645 ac_cv_have_sigcontext_hack=yes,
646 ac_cv_have_sigcontext_hack=no,
647 dnl When cross-compiling, do not assume anything.
648 ac_cv_have_sigcontext_hack=no
649 )
650 AC_LANG_RESTORE
651 ])
652 if [[ "$ac_cv_have_sigcontext_hack" = "yes" ]]; then
653 sigsegv_recovery=sigcontext
654 fi
655 AC_TRANSLATE_DEFINE(HAVE_SIGCONTEXT_SUBTERFUGE, "$ac_cv_have_sigcontext_hack",
656 [Define if we know a hack to replace siginfo_t->si_addr member.])
657 fi
658
659 dnl Check if we can ignore the fault (instruction skipping in SIGSEGV handler)
660 AC_CACHE_CHECK([whether we can skip instruction in SIGSEGV handler],
661 ac_cv_have_skip_instruction, [
662 AC_LANG_SAVE
663 AC_LANG_CPLUSPLUS
664 AC_TRY_RUN([
665 #define HAVE_SIGSEGV_SKIP_INSTRUCTION 1
666 #define CONFIGURE_TEST_SIGSEGV_RECOVERY
667 #include "vm_alloc.cpp"
668 #include "sigsegv.cpp"
669 ], ac_cv_have_skip_instruction=yes, ac_cv_have_skip_instruction=no,
670 dnl When cross-compiling, do not assume anything.
671 ac_cv_have_skip_instruction=no
672 )
673 AC_LANG_RESTORE
674 ]
675 )
676 AC_TRANSLATE_DEFINE(HAVE_SIGSEGV_SKIP_INSTRUCTION, "$ac_cv_have_skip_instruction",
677 [Define if we can ignore the fault (instruction skipping in SIGSEGV handler).])
678
679 dnl Can we do Video on SEGV Signals ?
680 CAN_VOSF=no
681 if [[ -n "$sigsegv_recovery" ]]; then
682 CAN_VOSF=yes
683 case $target_os in
684 darwin*)
685 dnl Signal handlers in darwin are way too slow since the whole
686 dnl machine state (GPRs, FPRs, VRs) is forcibly saved.
687 dnl In other words, VOSF is slower than static window refreshes.
688 CAN_VOSF=no
689 ;;
690 esac
691 fi
692
693 dnl Enable VOSF screen updates with this feature is requested and feasible
694 if [[ "x$WANT_VOSF" = "xyes" -a "x$CAN_VOSF" = "xyes" ]]; then
695 AC_DEFINE(ENABLE_VOSF, 1, [Define if using video enabled on SEGV signals.])
696 else
697 WANT_VOSF=no
698 fi
699
700 dnl Platform specific binary postprocessor
701 BLESS=/bin/true
702 if [[ "x$ac_cv_pagezero_hack" = "xyes" ]]; then
703 BLESS=Darwin/lowmem
704 LDFLAGS="$LDFLAGS -pagezero_size 0x3000"
705 fi
706
707 dnl Check for GCC 2.7 or higher.
708 HAVE_GCC27=no
709 AC_MSG_CHECKING(for GCC 2.7 or higher)
710 AC_EGREP_CPP(xyes,
711 [#if __GNUC__ - 1 > 1 || __GNUC_MINOR__ - 1 > 5
712 xyes
713 #endif
714 ], [AC_MSG_RESULT(yes); HAVE_GCC27=yes], AC_MSG_RESULT(no))
715
716 dnl Check for GCC 3.0 or higher.
717 HAVE_GCC30=no
718 AC_MSG_CHECKING(for GCC 3.0 or higher)
719 AC_EGREP_CPP(xyes,
720 [#if __GNUC__ >= 3
721 xyes
722 #endif
723 ], [AC_MSG_RESULT(yes); HAVE_GCC30=yes], AC_MSG_RESULT(no))
724
725 dnl Check for ICC.
726 AC_MSG_CHECKING(for ICC)
727 HAVE_ICC=no
728 if $CXX -V -v 2>&1 | grep -q "Intel(R) C++ Compiler"; then
729 HAVE_ICC=yes
730 fi
731 AC_MSG_RESULT($HAVE_ICC)
732
733 # Test if the compiler can generate ELF objects
734 AC_CACHE_CHECK([whether the compiler can generate ELF objects],
735 ac_cv_elf_objects, [
736 echo 'int i;' > conftest.$ac_ext
737 ac_cv_elf_objects=no
738 if AC_TRY_EVAL(ac_compile); then
739 case `/usr/bin/file conftest.$ac_objext` in
740 *"ELF"*)
741 ac_cv_elf_objects=yes
742 ;;
743 esac
744 fi
745 rm -rf conftest*
746 ])
747 ELF_OBJECTS=$ac_cv_elf_objects
748
749 dnl CPU emulator sources
750 if [[ "x$EMULATED_PPC" = "xyes" ]]; then
751 CPUSRCS="\
752 ../kpx_cpu/src/cpu/ppc/ppc-cpu.cpp \
753 ../kpx_cpu/src/cpu/ppc/ppc-decode.cpp \
754 ../kpx_cpu/src/cpu/ppc/ppc-execute.cpp \
755 ../kpx_cpu/src/cpu/ppc/ppc-translate.cpp"
756 CPPFLAGS="$CPPFLAGS -I../kpx_cpu/include -I../kpx_cpu/src"
757
758 dnl Enable JIT compiler, if possible
759 if [[ "x$WANT_JIT" = "xyes" ]]; then
760 AC_CACHE_CHECK([whether dyngen can be used],
761 ac_cv_use_dyngen, [
762 case $host_cpu:$ELF_OBJECTS in
763 powerpc:yes)
764 ac_cv_use_dyngen=yes
765 ;;
766 x86_64:yes)
767 ac_cv_use_dyngen=yes
768 ;;
769 i?86:yes)
770 ac_cv_use_dyngen=yes
771 ;;
772 *:*)
773 ac_cv_use_dyngen=no
774 ;;
775 esac
776 dnl Check for a suitable synthetic opcodes compiler (icc is faking itself as gcc 3.2.2)
777 if [[ -z "$DYNGEN_CC" ]]; then
778 if [[ "x$HAVE_GCC27" = "xyes" -a "x$HAVE_ICC" = "xno" ]]; then
779 DYNGEN_CC=$CXX
780 else
781 for p in /usr/bin /usr/local/bin; do
782 gxx="$p/g++"
783 if [[ -x "$gxx" ]]; then
784 DYNGEN_CC="$gxx"
785 fi
786 done
787 fi
788 fi
789 if [[ -z "$DYNGEN_CC" ]] || ! { echo '#include <limits>' | $DYNGEN_CC -xc++ -c -o /dev/null - >& /dev/null; }; then
790 ac_cv_use_dyngen=no
791 fi
792 ])
793 if [[ "x$ac_cv_use_dyngen" = "xyes" ]]; then
794 case $host_cpu in
795 i?86)
796 DYNGEN_OP_FLAGS="-fomit-frame-pointer -mpreferred-stack-boundary=2"
797 if [[ "x$HAVE_GCC30" = "xyes" ]]; then
798 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -falign-functions=0"
799 else
800 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -malign-functions=0"
801 fi
802 saved_CPPFLAGS=$CPPFLAGS
803 CPPFLAGS="$CPPFLAGS -mmmx"
804 AC_CHECK_HEADERS(mmintrin.h, [DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -mmmx"])
805 CPPFLAGS="$CPPFLAGS -msse"
806 AC_CHECK_HEADERS(xmmintrin.h, [DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -msse"])
807 CPPFLAGS="$CPPFLAGS -msse2"
808 AC_CHECK_HEADERS(emmintrin.h, [DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -msse2"])
809 CPPFLAGS=$saved_CPPFLAGS
810 ;;
811 x86_64)
812 AC_CHECK_HEADERS(mmintrin.h xmmintrin.h emmintrin.h)
813 ;;
814 esac
815 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -finline-limit=10000"
816 if [[ "x$HAVE_GCC30" = "xyes" ]]; then
817 DYNGEN_OP_FLAGS="$DYNGEN_OP_FLAGS -fno-reorder-blocks -fno-optimize-sibling-calls"
818 fi
819 else
820 WANT_JIT=no
821 fi
822 AC_TRANSLATE_DEFINE(ENABLE_DYNGEN, $ac_cv_use_dyngen, [Define to enable dyngen engine])
823 if [[ "x$WANT_JIT" = "xyes" ]]; then
824 DYNGENSRCS="\
825 ../kpx_cpu/src/cpu/jit/dyngen.c \
826 ../kpx_cpu/src/cpu/jit/cxxdemangle.cpp"
827 CPUSRCS="\
828 ../kpx_cpu/src/cpu/jit/jit-cache.cpp \
829 ../kpx_cpu/src/cpu/jit/basic-dyngen.cpp \
830 ../kpx_cpu/src/cpu/ppc/ppc-dyngen.cpp $CPUSRCS"
831 fi
832 fi
833 CPUSRCS="$CPUSRCS ../kpx_cpu/sheepshaver_glue.cpp"
834 else
835 WANT_JIT=no
836 fi
837 if [[ "x$ac_cv_use_dyngen" = "xyes" ]]; then
838 AC_CACHE_CHECK([whether static data regions are executable],
839 ac_cv_have_static_data_exec, [
840 AC_TRY_RUN([int main(void) {
841 #if defined(__powerpc__)
842 static unsigned int p[8] = {0x4e800020,};
843 asm volatile("dcbst 0,%0" : : "r" (p) : "memory");
844 asm volatile("sync" : : : "memory");
845 asm volatile("icbi 0,%0" : : "r" (p) : "memory");
846 asm volatile("sync" : : : "memory");
847 asm volatile("isync" : : : "memory");
848 ((void (*)(void))p)();
849 return 0;
850 #endif
851 return 1;
852 }], ac_cv_have_static_data_exec=yes, ac_cv_have_static_data_exec=no,
853 dnl When cross-compiling, do not assume anything.
854 ac_cv_have_static_data_exec=no
855 )
856 ])
857 fi
858 AC_TRANSLATE_DEFINE(HAVE_STATIC_DATA_EXEC, "$ac_cv_have_static_data_exec",
859 [Define if your system marks static data pages as executable.])
860
861 if [[ "x$WANT_JIT" = "xyes" ]]; then
862 CPPFLAGS="$CPPFLAGS -DUSE_JIT"
863 fi
864
865 dnl Generate Makefile.
866 AC_SUBST(DYNGENSRCS)
867 AC_SUBST(DYNGEN_CC)
868 AC_SUBST(DYNGEN_OP_FLAGS)
869 AC_SUBST(SYSSRCS)
870 AC_SUBST(CPUSRCS)
871 AC_SUBST(BLESS)
872 AC_OUTPUT(Makefile)
873
874 dnl Print summary.
875 echo
876 echo SheepShaver configuration summary:
877 echo
878 echo SDL support ...................... : $SDL_SUPPORT
879 echo XFree86 DGA support .............. : $WANT_XF86_DGA
880 echo XFree86 VidMode support .......... : $WANT_XF86_VIDMODE
881 echo Using PowerPC emulator ........... : $EMULATED_PPC
882 echo Enable JIT compiler .............. : $WANT_JIT
883 echo Enable video on SEGV signals ..... : $WANT_VOSF
884 echo ESD sound support ................ : $WANT_ESD
885 echo GTK user interface ............... : $WANT_GTK
886 echo mon debugger support ............. : $WANT_MON
887 echo Bad memory access recovery type .. : $sigsegv_recovery
888 echo
889 echo "Configuration done. Now type \"make\"."