ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/Unix/configure.ac
Revision: 1.5
Committed: 2004-07-07T04:13:37Z (19 years, 11 months ago) by gbeauche
Branch: MAIN
Changes since 1.4: +4 -1 lines
Log Message:
MacOS X bundle stuff. make SheepShaver_app to build the .app.

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