OSDN Git Service

For PR libgcj/5103:
[pf3gnuchains/gcc-fork.git] / libjava / configure.in
1 dnl Process this with autoconf to create configure
2 AC_INIT(java/lang/System.java)
3
4 AC_PROG_LN_S
5
6 dnl We use these options to decide which functions to include.
7 AC_ARG_WITH(target-subdir,
8 [  --with-target-subdir=SUBDIR
9                            configuring in a subdirectory])
10 AC_ARG_WITH(cross-host,
11 [  --with-cross-host=HOST  configuring with a cross compiler])
12
13 LIBGCJ_CONFIGURE(.)
14
15 AM_CONFIG_HEADER(include/config.h gcj/libgcj-config.h)
16
17 # Only use libltdl for native builds.
18 if test -z "${with_cross_host}"; then
19    AC_LIBLTDL_CONVENIENCE
20    AC_LIBTOOL_DLOPEN
21    DIRLTDL=libltdl
22    AC_DEFINE(USE_LTDL)
23    # Sigh.  Libtool's macro doesn't do the right thing.
24    INCLTDL="-I\$(top_srcdir)/libltdl $INCLTDL"
25    # FIXME: this is a hack.
26    sub_auxdir="`cd $ac_aux_dir && pwd`"
27    ac_configure_args="$ac_configure_args --with-auxdir=$sub_auxdir"
28 fi
29 AC_SUBST(INCLTDL)
30 AC_SUBST(LIBLTDL)
31 AC_SUBST(DIRLTDL)
32 AM_PROG_LIBTOOL
33 AC_CONFIG_SUBDIRS($DIRLTDL)
34
35 if test -z "$with_target_subdir" || test "$with_target_subdir" = "."; then
36    COMPPATH=.
37 else
38    COMPPATH=..
39 fi
40 AC_SUBST(COMPPATH)
41
42 dnl The -no-testsuite modules omit the test subdir.
43 AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)
44
45 dnl See whether the user prefers size or speed for Character.
46 dnl The default is size.
47 AC_ARG_ENABLE(fast-character,
48 [  --enable-fast-character prefer speed over size for Character],
49 # Nothing
50 , AC_DEFINE(COMPACT_CHARACTER))
51
52 dnl Should the runtime set system properties by examining the 
53 dnl environment variable GCJ_PROPERTIES?
54 AC_ARG_ENABLE(getenv-properties,
55 [  --disable-getenv-properties
56                           don't set system properties from GCJ_PROPERTIES])
57
58 dnl Whether GCJ_PROPERTIES is used depends on the target.
59 if test -z "$enable_getenv_properties"; then
60    enable_getenv_properties=${enable_getenv_properties_default-yes}
61 fi
62 if test "$enable_getenv_properties" = no; then
63    AC_DEFINE(DISABLE_GETENV_PROPERTIES)
64 fi
65
66
67 dnl Should we use hashtable-based synchronization?
68 dnl Currently works only for Linux X86/ia64
69 dnl Typically faster and more space-efficient
70 AC_ARG_ENABLE(hash-synchronization,
71 [  --enable-hash-synchronization
72                           Use global hash table for monitor locks])
73
74 if test -z "$enable_hash_synchronization"; then
75    enable_hash_synchronization=$enable_hash_synchronization_default
76 fi
77
78
79 dnl See if the user has requested runtime debugging.
80 LIBGCJDEBUG="false"
81 AC_SUBST(LIBGCJDEBUG)
82 AC_ARG_ENABLE(libgcj-debug,
83 [  --enable-libgcj-debug   enable runtime debugging code],
84   if test "$enable_libgcj_debug" = yes; then
85     AC_DEFINE(DEBUG)
86     LIBGCJDEBUG="true"
87   fi)
88
89 dnl See if the user has the interpreter included.
90 AC_ARG_ENABLE(interpreter,
91 [  --enable-interpreter    enable interpreter],
92   if test "$enable_interpreter" = yes; then
93     # This can also be set in configure.host.
94     libgcj_interpreter=yes
95   elif test "$enable_interpreter" = no; then
96     libgcj_interpreter=no
97   fi)
98
99 if test "$libgcj_interpreter" = yes; then
100    AC_DEFINE(INTERPRETER)
101 fi
102
103 AC_MSG_CHECKING([for exception model to use])
104 AC_LANG_SAVE
105 AC_LANG_CPLUSPLUS
106 AC_ARG_ENABLE(sjlj-exceptions,
107 [  --enable-sjlj-exceptions  force use of builtin_setjmp for exceptions],
108 [:],
109 [dnl Botheration.  Now we've got to detect the exception model.
110 dnl Link tests against libgcc.a are problematic since -- at least
111 dnl as of this writing -- we've not been given proper -L bits for
112 dnl single-tree newlib and libgloss.
113 dnl
114 dnl This is what AC_TRY_COMPILE would do if it didn't delete the
115 dnl conftest files before we got a change to grep them first.
116 cat > conftest.$ac_ext << EOF
117 [#]line __oline__ "configure"
118 struct S { ~S(); };
119 void bar();
120 void foo()
121 {
122   S s;
123   bar();
124 }
125 EOF
126 old_CXXFLAGS="$CXXFLAGS"  
127 CXXFLAGS=-S
128 if AC_TRY_EVAL(ac_compile); then
129   if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
130     enable_sjlj_exceptions=yes
131   elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
132     enable_sjlj_exceptions=no
133   fi
134 fi
135 CXXFLAGS="$old_CXXFLAGS"
136 rm -f conftest*])
137 if test x$enable_sjlj_exceptions = xyes; then
138   AC_DEFINE(SJLJ_EXCEPTIONS, 1,
139         [Define if the compiler is configured for setjmp/longjmp exceptions.])
140   ac_exception_model_name=sjlj
141 elif test x$enable_sjlj_exceptions = xno; then
142   ac_exception_model_name="call frame"
143 else
144   AC_MSG_ERROR([unable to detect exception model])
145 fi
146 AC_LANG_RESTORE
147 AC_MSG_RESULT($ac_exception_model_name)
148
149 dnl See if the user wants to disable java.net.  This is the mildly
150 dnl ugly way that we admit that target-side configuration sucks.
151 AC_ARG_ENABLE(java-net,
152 [  --disable-java-net      disable java.net])
153
154 dnl Whether java.net is built by default can depend on the target.
155 if test -z "$enable_java_net"; then
156    enable_java_net=${enable_java_net_default-yes}
157 fi
158 if test "$enable_java_net" = no; then
159    AC_DEFINE(DISABLE_JAVA_NET)
160 fi
161
162 dnl See if the user wants to configure without libffi.  Some
163 dnl architectures don't support it, and default values are set in 
164 dnl configure.host.
165 AC_ARG_WITH(libffi,
166 [  --without-libffi        don't use libffi],,with_libffi=${with_libffi_default-yes})
167
168 LIBFFI=
169 LIBFFIINCS=
170 if test "$with_libffi" != no; then
171    AC_DEFINE(USE_LIBFFI)
172    LIBFFI=../libffi/libfficonvenience.la
173    LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I$(MULTIBUILDTOP)../libffi/include'
174 fi
175 AC_SUBST(LIBFFI)
176 AC_SUBST(LIBFFIINCS)
177
178 dnl See if the user wants to disable JVMPI support.
179 AC_ARG_ENABLE(jvmpi,
180 [  --disable-jvmpi         disable JVMPI support])
181
182 if test "$enable_jvmpi" != no; then
183     AC_DEFINE(ENABLE_JVMPI)
184 fi
185
186 dnl If the target is an eCos system, use the appropriate eCos
187 dnl I/O routines.
188 dnl FIXME: this should not be a local option but a global target
189 dnl system; at present there is no eCos target.
190 TARGET_ECOS="no"
191 AC_ARG_WITH(ecos,
192 [  --with-ecos             enable runtime eCos target support],
193 TARGET_ECOS="$with_ecos"
194 )
195
196 case "$TARGET_ECOS" in
197    no)
198       FILE_DESCRIPTOR=natFileDescriptorPosix.cc
199       PROCESS=${PROCESS-Posix}
200       ;;
201    *)
202       FILE_DESCRIPTOR=natFileDescriptorEcos.cc
203       PROCESS=Ecos
204       AC_DEFINE(ECOS)
205       ;;
206 esac
207
208 AC_EGREP_HEADER(uint32_t, stdint.h, AC_DEFINE(HAVE_INT32_DEFINED))
209 AC_EGREP_HEADER(uint32_t, inttypes.h, AC_DEFINE(HAVE_INT32_DEFINED))
210 AC_EGREP_HEADER(u_int32_t, sys/types.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))
211 AC_EGREP_HEADER(u_int32_t, sys/config.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))
212
213
214 dnl These may not be defined in a non-ANS conformant embedded system.
215 dnl FIXME: Should these case a runtime exception in that case?
216 AC_EGREP_HEADER(mktime, time.h, AC_DEFINE(HAVE_MKTIME))
217 AC_EGREP_HEADER(localtime, time.h, AC_DEFINE(HAVE_LOCALTIME))
218
219 dnl Create the subdirectory for natFileDescriptor.cc, or the attempt
220 dnl to create the link will fail.
221 test -d java || mkdir java
222 test -d java/io || mkdir java/io
223 test -d gnu || mkdir gnu
224 AC_LINK_FILES(java/io/$FILE_DESCRIPTOR, java/io/natFileDescriptor.cc)
225
226 dnl Likewise for ConcreteProcess.java and natConcreteProcess.cc.
227 test -d java/lang || mkdir java/lang
228 AC_LINK_FILES(java/lang/${PROCESS}Process.java, java/lang/ConcreteProcess.java)
229 AC_LINK_FILES(java/lang/nat${PROCESS}Process.cc, java/lang/natConcreteProcess.cc)
230
231 SYSTEMSPEC=
232 AC_SUBST(SYSTEMSPEC)
233
234 LIBGCJTESTSPEC="-L`pwd`/.libs -rpath `pwd`/.libs"
235 AC_SUBST(LIBGCJTESTSPEC)
236
237 AC_ARG_WITH(system-zlib,
238 [  --with-system-zlib      use installed libz])
239 ZLIBSPEC=
240 AC_SUBST(ZLIBSPEC)
241 ZLIBTESTSPEC=
242 AC_SUBST(ZLIBTESTSPEC)
243
244 dnl FIXME: this should be _libs on some hosts.
245 libsubdir=.libs
246
247 dnl Allow the GC to be disabled.  Can be useful when debugging.
248 AC_MSG_CHECKING([for garbage collector to use])
249 AC_ARG_ENABLE(java-gc,
250 changequote(<<,>>)dnl
251 <<  --enable-java-gc=TYPE   choose garbage collector [boehm]>>,
252 changequote([,])
253   GC=$enableval,
254   GC=boehm)
255 GCLIBS=
256 GCINCS=
257 GCDEPS=
258 GCOBJS=
259 GCSPEC=
260 JC1GCSPEC=
261 GCTESTSPEC=
262 case "$GC" in
263  boehm)
264     AC_MSG_RESULT(boehm)
265     GCDEPS='$(top_builddir)/../boehm-gc/libgcjgc.la'
266     # We include the path to the boehm-gc build directory.
267     # See Makefile.am to understand why.
268     GCLIBS="$GCDEPS -L\$(here)/../boehm-gc/$libsubdir"
269     GCINCS='-I$(top_srcdir)/../boehm-gc/include'
270     GCSPEC='-lgcjgc'
271     JC1GCSPEC='-fuse-boehm-gc'
272     GCTESTSPEC="-L`pwd`/../boehm-gc/.libs -rpath `pwd`/../boehm-gc/.libs"
273     dnl We also want to pick up some cpp flags required when including
274     dnl boehm-config.h.  Yuck.
275     GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`"
276     GCOBJS=boehm.lo
277     GCHDR=boehm-gc.h
278     dnl The POSIX thread support needs to know this.
279     AC_DEFINE(HAVE_BOEHM_GC)
280     ;;
281  no)
282     AC_MSG_RESULT(none)
283     GCOBJS=nogc.lo
284     GCHDR=no-gc.h
285     ;;
286  *)
287     AC_MSG_ERROR(unrecognized collector \"$GC\")
288     ;;
289 esac
290 AC_SUBST(GCLIBS)
291 AC_SUBST(GCINCS)
292 AC_SUBST(GCDEPS)
293 AC_SUBST(GCOBJS)
294 AC_SUBST(GCSPEC)
295 AC_SUBST(JC1GCSPEC)
296 AC_SUBST(GCTESTSPEC)
297 AC_LINK_FILES(include/$GCHDR, include/java-gc.h)
298
299
300 AC_MSG_CHECKING([for thread model used by GCC])
301 THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
302 AC_MSG_RESULT([$THREADS])
303
304 case "$THREADS" in
305  no | none | single)
306     THREADS=none
307     ;;
308  posix | pthreads)
309     THREADS=posix
310     case "$host" in
311      *-*-linux*)
312         AC_DEFINE(LINUX_THREADS)
313         ;;
314     esac
315     ;;
316  decosf1 | irix | mach | os2 | solaris | win32 | dce | vxworks)
317     AC_MSG_ERROR(thread package $THREADS not yet supported)
318     ;;
319  *)
320     AC_MSG_ERROR($THREADS is an unknown thread package)
321     ;;
322 esac
323
324 THREADLIBS=
325 THREADINCS=
326 THREADDEPS=
327 THREADOBJS=
328 THREADH=
329 THREADSPEC=
330 case "$THREADS" in
331  posix)
332     case "$host" in
333      *-*-cygwin*)
334         # Don't set THREADLIBS here.  Cygwin doesn't have -lpthread.
335         ;;
336 changequote(<<,>>)   
337      *-*-freebsd[1234]*)
338 changequote([,])   
339         # Before FreeBSD 5, it didn't have -lpthread (or any library which
340         # merely adds pthread_* functions) but it does have a -pthread switch
341         # which is required at link-time to select -lc_r *instead* of -lc.
342         THREADLIBS=-pthread
343         # Don't set THREADSPEC here as might be expected since -pthread is
344         # not processed when found within a spec file, it must come from
345         # the command line.  For now, the user must provide the -pthread
346         # switch to link code compiled with gcj.  In future, consider adding
347         # support for weak references to pthread_* functions ala gthr.h API.
348         THREADSPEC='%{!pthread: %eUnder this configuration, the user must provide -pthread when linking.}'
349         ;;
350      *-*-freebsd*)
351         # FreeBSD 5 implements a model much closer to other modern UNIX
352         # which support threads.  However, it still does not support
353         # -lpthread.
354         THREADLIBS=-pthread
355         THREADSPEC=-lc_r
356         ;;
357      *)
358         THREADLIBS=-lpthread
359         THREADSPEC=-lpthread
360         ;;
361     esac
362     THREADOBJS=posix-threads.lo
363     THREADH=posix-threads.h
364     # MIT pthreads doesn't seem to have the mutexattr functions.
365     # But for now we don't check for it.  We just assume you aren't
366     # using MIT pthreads.
367     AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_INIT)
368
369     # If we're using the Boehm GC, then we happen to know that it
370     # defines _REENTRANT, so we don't bother.  Eww.
371     if test "$GC" != boehm; then
372        AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads])
373     fi
374     AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Required define if using POSIX threads])
375     ;;
376
377  none)
378     THREADOBJS=no-threads.lo
379     THREADH=no-threads.h
380     ;;
381 esac
382 AC_LINK_FILES(include/$THREADH, include/java-threads.h)
383 AC_SUBST(THREADLIBS)
384 AC_SUBST(THREADINCS)
385 AC_SUBST(THREADDEPS)
386 AC_SUBST(THREADOBJS)
387 AC_SUBST(THREADSPEC)
388
389 HASH_SYNC_SPEC=
390 # Hash synchronization is only useful with posix threads right now.
391 if test "$enable_hash_synchronization" = yes && test "$THREADS" = "posix"; then
392    HASH_SYNC_SPEC=-fhash-synchronization
393    AC_DEFINE(JV_HASH_SYNCHRONIZATION, 1, [Define if hash synchronization is in use])
394 fi
395 AC_SUBST(HASH_SYNC_SPEC)
396
397
398 AM_CONDITIONAL(USING_GCC, test "$GCC" = yes)
399
400 CANADIAN=no
401 NULL_TARGET=no
402 NATIVE=yes
403
404 # We're in the tree with gcc, and need to include some of its headers.
405 GCC_UNWIND_INCLUDE='-I$(libgcj_basedir)/../gcc'
406
407 if test -n "${with_cross_host}"; then
408    # We are being configured with a cross compiler.  AC_REPLACE_FUNCS
409    # may not work correctly, because the compiler may not be able to
410    # link executables.
411
412    # We assume newlib.  This lets us hard-code the functions we know
413    # we'll have.
414    AC_DEFINE(HAVE_MEMMOVE)
415    AC_DEFINE(HAVE_MEMCPY)
416    AC_DEFINE(HAVE_STRERROR)
417    AC_DEFINE(HAVE_GMTIME_R)
418    AC_DEFINE(HAVE_LOCALTIME_R)
419    dnl This is only for POSIX threads.
420    AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_INIT)
421    dnl We also assume we are using gcc, which provides alloca.
422    AC_DEFINE(HAVE_ALLOCA)
423
424    dnl Assume we do not have getuid and friends.
425    AC_DEFINE(NO_GETUID)
426
427    ZLIBSPEC=-lzgcj
428    ZLIBTESTSPEC="-L`pwd`/../zlib/.libs -rpath `pwd`/../zlib/.libs"
429
430    # If Canadian cross, then don't pick up tools from the build
431    # directory.
432    if test x"$build" != x"$with_cross_host" && x"$build" != x"$target"; then
433       CANADIAN=yes
434       GCC_UNWIND_INCLUDE=
435       GCJ="${target_alias}-gcj"
436    fi
437    NATIVE=no
438 else
439    AC_CHECK_FUNCS(strerror ioctl select fstat open fsync sleep)
440    AC_CHECK_FUNCS(gmtime_r localtime_r readdir_r getpwuid_r getcwd)
441    AC_CHECK_FUNCS(access stat mkdir rename rmdir unlink realpath utime chmod)
442    AC_CHECK_FUNCS(nl_langinfo setlocale)
443    AC_CHECK_FUNCS(inet_aton inet_addr, break)
444    AC_CHECK_FUNCS(inet_pton uname inet_ntoa)
445    AC_CHECK_FUNCS(backtrace fork execvp pipe sigaction)
446    AC_CHECK_HEADERS(execinfo.h unistd.h dlfcn.h) 
447    AC_CHECK_LIB(dl, dladdr, [
448      AC_DEFINE(HAVE_DLADDR)])
449    AC_CHECK_FILES(/proc/self/exe, [
450      AC_DEFINE(HAVE_PROC_SELF_EXE)])
451
452    AM_ICONV
453
454    AC_CHECK_FUNCS(gethostbyname_r, [
455      AC_DEFINE(HAVE_GETHOSTBYNAME_R)
456      # There are two different kinds of gethostbyname_r.
457      # We look for the one that returns `int'.
458      # Hopefully this check is robust enough.
459      AC_EGREP_HEADER(int.*gethostbyname_r, netdb.h, [
460        AC_DEFINE(GETHOSTBYNAME_R_RETURNS_INT)])
461
462      case " $GCINCS " in
463      *" -D_REENTRANT "*) ;;
464      *)
465         dnl On DU4.0, gethostbyname_r is only declared with -D_REENTRANT
466         AC_CACHE_CHECK([whether gethostbyname_r declaration requires -D_REENTRANT],
467         [libjava_cv_gethostbyname_r_needs_reentrant],
468         [ AC_LANG_SAVE
469           AC_LANG_CPLUSPLUS
470           AC_TRY_COMPILE([#include <netdb.h>],
471             [gethostbyname_r("", 0, 0);],
472             [libjava_cv_gethostbyname_r_needs_reentrant=no], [dnl
473                 CPPFLAGS_SAVE="$CPPFLAGS"
474                 CPPFLAGS="$CPPFLAGS -D_REENTRANT"
475                 AC_TRY_COMPILE([#include <netdb.h>], [gethostbyname_r("", 0, 0);],
476                     [libjava_cv_gethostbyname_r_needs_reentrant=yes],
477                     [libjava_cv_gethostbyname_r_needs_reentrant=fail])
478                 CPPFLAGS="$CPPFLAGS_SAVE"
479           ])
480           AC_LANG_RESTORE
481         ])
482         if test "x$libjava_cv_gethostbyname_r_needs_reentrant" = xyes; then
483           AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads])
484         fi
485      ;;
486      esac
487
488      AC_CACHE_CHECK([for struct hostent_data],
489         [libjava_cv_struct_hostent_data], [dnl
490         AC_TRY_COMPILE([
491 #if GETHOSTBYNAME_R_NEEDS_REENTRANT && !defined(_REENTRANT)
492 # define _REENTRANT 1
493 #endif
494 #include <netdb.h>], [struct hostent_data data;],
495           [libjava_cv_struct_hostent_data=yes],
496           [libjava_cv_struct_hostent_data=no])])
497      if test "x$libjava_cv_struct_hostent_data" = xyes; then
498        AC_DEFINE(HAVE_STRUCT_HOSTENT_DATA, 1,
499          [Define if struct hostent_data is defined in netdb.h])
500      fi
501    ])
502
503    # FIXME: libjava source code expects to find a prototype for
504    # gethostbyaddr_r in netdb.h.  The outer check ensures that
505    # HAVE_GETHOSTBYADDR_R will not be defined if the prototype fails
506    # to exist where expected.  (The root issue: AC_CHECK_FUNCS assumes C
507    # linkage check is enough, yet C++ code requires proper prototypes.)
508    AC_EGREP_HEADER(gethostbyaddr_r, netdb.h, [
509    AC_CHECK_FUNCS(gethostbyaddr_r, [
510      AC_DEFINE(HAVE_GETHOSTBYADDR_R)
511      # There are two different kinds of gethostbyaddr_r.
512      # We look for the one that returns `int'.
513      # Hopefully this check is robust enough.
514      AC_EGREP_HEADER(int.*gethostbyaddr_r, netdb.h, [
515        AC_DEFINE(GETHOSTBYADDR_R_RETURNS_INT)])])])
516
517    AC_CHECK_FUNCS(gethostname, [
518      AC_DEFINE(HAVE_GETHOSTNAME)
519      AC_EGREP_HEADER(gethostname, unistd.h, [
520        AC_DEFINE(HAVE_GETHOSTNAME_DECL)])])
521
522    # Look for these functions in the thread library, but only bother
523    # if using POSIX threads.
524    if test "$THREADS" = posix; then
525       save_LIBS="$LIBS"
526       LIBS="$LIBS $THREADLIBS"
527       # Some POSIX thread systems don't have pthread_mutexattr_settype.
528       # E.g., Solaris.
529       AC_CHECK_FUNCS(pthread_mutexattr_settype pthread_mutexattr_setkind_np)
530
531       # Look for sched_yield.  Up to Solaris 2.6, it is in libposix4, since
532       # Solaris 7 the name librt is preferred.
533       AC_CHECK_FUNCS(sched_yield, , [
534         AC_CHECK_LIB(rt, sched_yield, [
535           AC_DEFINE(HAVE_SCHED_YIELD)
536           THREADLIBS="$THREADLIBS -lrt"
537           THREADSPEC="$THREADSPEC -lrt"], [
538           AC_CHECK_LIB(posix4, sched_yield, [
539             AC_DEFINE(HAVE_SCHED_YIELD)
540             THREADLIBS="$THREADLIBS -lposix4"
541             THREADSPEC="$THREADSPEC -lposix4"])])])
542       LIBS="$save_LIBS"
543
544       # We can save a little space at runtime if the mutex has m_count
545       # or __m_count.  This is a nice hack for Linux.
546       AC_TRY_COMPILE([#include <pthread.h>], [
547           extern pthread_mutex_t *mutex; int q = mutex->m_count;
548         ], AC_DEFINE(PTHREAD_MUTEX_HAVE_M_COUNT), [
549         AC_TRY_COMPILE([#include <pthread.h>], [
550             extern pthread_mutex_t *mutex; int q = mutex->__m_count;
551           ], AC_DEFINE(PTHREAD_MUTEX_HAVE___M_COUNT))])
552    fi
553
554    # We require a way to get the time.
555    time_found=no
556    AC_CHECK_FUNCS(gettimeofday time ftime, time_found=yes)
557    if test "$time_found" = no; then
558       AC_MSG_ERROR([no function found to get the time])
559    fi
560
561    AC_CHECK_FUNCS(memmove)
562
563    # We require memcpy.
564    memcpy_found=no
565    AC_CHECK_FUNCS(memcpy, memcpy_found=yes)
566    if test "$memcpy_found" = no; then
567       AC_MSG_ERROR([memcpy is required])
568    fi
569
570    AC_CHECK_LIB(dl, dlopen, [
571        AC_DEFINE(HAVE_DLOPEN, 1, [Define if dlopen is available])])
572
573    # Some library-finding code we stole from Tcl.
574    #--------------------------------------------------------------------
575    #    Check for the existence of the -lsocket and -lnsl libraries.
576    #    The order here is important, so that they end up in the right
577    #    order in the command line generated by make.  Here are some
578    #    special considerations:
579    #    1. Use "connect" and "accept" to check for -lsocket, and
580    #       "gethostbyname" to check for -lnsl.
581    #    2. Use each function name only once:  can't redo a check because
582    #       autoconf caches the results of the last check and won't redo it.
583    #    3. Use -lnsl and -lsocket only if they supply procedures that
584    #       aren't already present in the normal libraries.  This is because
585    #       IRIX 5.2 has libraries, but they aren't needed and they're
586    #       bogus:  they goof up name resolution if used.
587    #    4. On some SVR4 systems, can't use -lsocket without -lnsl too.
588    #       To get around this problem, check for both libraries together
589    #       if -lsocket doesn't work by itself.
590    #--------------------------------------------------------------------
591
592    AC_CACHE_CHECK([for socket libraries], gcj_cv_lib_sockets,
593     [gcj_cv_lib_sockets=
594      gcj_checkBoth=0
595      unset ac_cv_func_connect
596      AC_CHECK_FUNC(connect, gcj_checkSocket=0, gcj_checkSocket=1)
597      if test "$gcj_checkSocket" = 1; then
598          unset ac_cv_func_connect
599          AC_CHECK_LIB(socket, main, gcj_cv_lib_sockets="-lsocket",
600                       gcj_checkBoth=1)
601      fi
602      if test "$gcj_checkBoth" = 1; then
603          gcj_oldLibs=$LIBS
604          LIBS="$LIBS -lsocket -lnsl"
605          unset ac_cv_func_accept
606          AC_CHECK_FUNC(accept,
607                        [gcj_checkNsl=0
608                         gcj_cv_lib_sockets="-lsocket -lnsl"])
609          unset ac_cv_func_accept
610          LIBS=$gcj_oldLibs
611      fi
612      unset ac_cv_func_gethostbyname
613      gcj_oldLibs=$LIBS
614      LIBS="$LIBS $gcj_cv_lib_sockets"
615      AC_CHECK_FUNC(gethostbyname, ,
616                    [AC_CHECK_LIB(nsl, main,
617                                  [gcj_cv_lib_sockets="$gcj_cv_lib_sockets -lnsl"])])
618      unset ac_cv_func_gethostbyname
619      LIBS=$gcj_oldLIBS
620    ])
621    SYSTEMSPEC="$SYSTEMSPEC $gcj_cv_lib_sockets"
622
623    if test "$with_system_zlib" = yes; then
624       AC_CHECK_LIB(z, deflate, ZLIBSPEC=-lz, ZLIBSPEC=-lzgcj)
625    else
626       ZLIBSPEC=-lzgcj
627       ZLIBTESTSPEC="-L`pwd`/../zlib/.libs -rpath `pwd`/../zlib/.libs"
628    fi
629
630    # On Solaris, and maybe other architectures, the Boehm collector
631    # requires -ldl.
632    if test "$GC" = boehm; then
633       AC_CHECK_LIB(dl, main, SYSTEMSPEC="$SYSTEMSPEC -ldl")
634    fi
635
636    if test -z "${with_multisubdir}"; then
637       builddotdot=.
638    else
639 changequote(<<,>>)
640       builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`
641 changequote([,])
642    fi
643    if test -x "${builddotdot}/../../gcc/gcj"; then
644       dir="`cd ${builddotdot}/../../gcc && pwd`"
645       GCJ="$dir/gcj -B`pwd`/ -B$dir/"
646    else
647       CANADIAN=yes
648       NULL_TARGET=yes
649       GCJ="gcj -B`pwd`/"
650    fi
651 fi
652
653 # Create it, so that compile/link tests don't fail
654 test -f libgcj.spec || touch libgcj.spec
655
656 # We must search the source tree for java.lang, since we still don't
657 # have libgcj.jar nor java/lang/*.class
658 GCJ_SAVE_CPPFLAGS=$CPPFLAGS
659 CPPFLAGS="$CPPFLAGS -I`pwd` -I`cd $srcdir && pwd`"
660
661 # Since some classes depend on this one, we need its source available
662 # before we can do any GCJ compilation test :-(
663 if test ! -f gnu/classpath/Configuration.java; then
664   test -d gnu || mkdir gnu
665   test -d gnu/classpath || mkdir gnu/classpath
666   sed 's,@LIBGCJDEBUG@,$LIBGCJDEBUG,' \
667         < $srcdir/gnu/classpath/Configuration.java.in \
668         > gnu/classpath/Configuration.java
669   # We do not want to redirect the output of the grep below to /dev/null,
670   # but we add /dev/null to the input list so that grep will print the
671   # filename of Configuration.java in case it finds any matches.
672   if grep @ gnu/classpath/Configuration.java /dev/null; then
673     AC_MSG_ERROR([configure.in is missing the substitutions above])
674   fi
675 fi
676
677 LT_AC_PROG_GCJ
678
679 CPPFLAGS=$GCJ_SAVE_CPPFLAGS
680
681 dnl FIXME: cross compilation
682 AC_CHECK_SIZEOF(void *)
683
684 ZLIBS=
685 ZDEPS=
686 ZINCS=
687 if test "x$ZLIBSPEC" = "x-lzgcj"; then
688    # We include the path to the zlib build directory.
689    # See Makefile.am to understand why.
690    ZDEPS='$(top_builddir)/../zlib/libzgcj.la'
691    ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir"
692    ZINCS='-I$(top_srcdir)/../zlib'
693 else
694    ZLIBS="$ZLIBSPEC"
695 fi
696 AC_SUBST(ZLIBS)
697 AC_SUBST(ZDEPS)
698 AC_SUBST(ZINCS)
699 AC_SUBST(DIVIDESPEC)
700 AC_SUBST(EXCEPTIONSPEC)
701
702 AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes)
703 AM_CONDITIONAL(NULL_TARGET, test "$NULL_TARGET" = yes)
704 AM_CONDITIONAL(NATIVE, test "$NATIVE" = yes || test "$NULL_TARGET" = yes)
705 AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host")
706 AM_CONDITIONAL(NEEDS_DATA_START, test "$NEEDS_DATA_START" = yes && test "$NATIVE" = yes)
707 AC_SUBST(GCC_UNWIND_INCLUDE)
708
709 # Determine gcj version number.
710 changequote(<<,>>)
711 gcjvers="`$GCJ -v 2>&1 | sed -n 's/^.*version \([^ ]*\).*$/\1/p'`"
712 changequote([,])
713 AC_DEFINE_UNQUOTED(GCJVERSION, "$gcjvers")
714 AC_SUBST(GCJVERSION)
715
716 AC_SUBST(AM_RUNTESTFLAGS)
717
718 dnl Work around a g++ bug.  Reported to gcc-bugs@gcc.gnu.org on Jan 22, 2000.
719 AC_MSG_CHECKING([for g++ -ffloat-store bug])
720 save_CFLAGS="$CFLAGS"
721 CFLAGS="-x c++ -O2 -ffloat-store"
722 AC_TRY_COMPILE([#include <math.h>], , 
723   [AC_MSG_RESULT(no)],
724   [AC_DEFINE(__NO_MATH_INLINES)
725    AC_MSG_RESULT(yes)])
726 CFLAGS="$save_CFLAGS"
727
728 dnl We check for sys/filio.h because Solaris 2.5 defines FIONREAD there.
729 dnl On that system, sys/ioctl.h will not include sys/filio.h unless
730 dnl BSD_COMP is defined; just including sys/filio.h is simpler.
731 AC_CHECK_HEADERS(unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h stdint.h langinfo.h locale.h)
732 dnl We avoid AC_HEADER_DIRENT since we really only care about dirent.h
733 dnl for now.  If you change this, you also must update natFile.cc.
734 AC_CHECK_HEADERS(dirent.h)
735 AC_CHECK_HEADERS(inttypes.h, [
736     AC_DEFINE(HAVE_INTTYPES_H, 1, [Define if <inttypes.h> is available])
737     AC_DEFINE(JV_HAVE_INTTYPES_H, 1, [Define if <inttypes.h> is available])
738 ])
739
740 AC_CHECK_TYPE([ssize_t], [int])
741
742 AC_MSG_CHECKING([for in_addr_t])
743 AC_TRY_COMPILE([#include <sys/types.h>
744 #if STDC_HEADERS
745 #include <stdlib.h>
746 #include <stddef.h>
747 #endif
748 #if HAVE_NETINET_IN_H
749 #include <netinet/in.h>
750 #endif], [in_addr_t foo;],
751   [AC_DEFINE([HAVE_IN_ADDR_T])
752    AC_MSG_RESULT(yes)],
753   [AC_MSG_RESULT(no)])
754
755 AC_MSG_CHECKING([whether struct ip_mreq is in netinet/in.h])
756 AC_TRY_COMPILE([#include <netinet/in.h>], [struct ip_mreq mreq;],
757   [AC_DEFINE(HAVE_STRUCT_IP_MREQ)
758    AC_MSG_RESULT(yes)],
759   [AC_MSG_RESULT(no)])
760
761 AC_MSG_CHECKING([whether struct ipv6_mreq is in netinet/in.h])
762 AC_TRY_COMPILE([#include <netinet/in.h>], [struct ipv6_mreq mreq6;],
763   [AC_DEFINE(HAVE_STRUCT_IPV6_MREQ)
764    AC_MSG_RESULT(yes)],
765   [AC_MSG_RESULT(no)])
766
767 AC_MSG_CHECKING([whether struct sockaddr_in6 is in netinet/in.h])
768 AC_TRY_COMPILE([#include <netinet/in.h>], [struct sockaddr_in6 addr6;],
769   [AC_DEFINE(HAVE_INET6)
770    AC_MSG_RESULT(yes)],
771   [AC_MSG_RESULT(no)])
772
773 AC_MSG_CHECKING([for socklen_t in sys/socket.h])
774 AC_TRY_COMPILE([#define _POSIX_PII_SOCKET
775 #include <sys/types.h>
776 #include <sys/socket.h>], [socklen_t x = 5;],
777   [AC_DEFINE(HAVE_SOCKLEN_T)
778    AC_MSG_RESULT(yes)],
779   [AC_MSG_RESULT(no)])
780
781 AC_MSG_CHECKING([for tm_gmtoff in struct tm])
782 AC_TRY_COMPILE([#include <time.h>], [struct tm tim; tim.tm_gmtoff = 0;],
783   [AC_DEFINE(STRUCT_TM_HAS_GMTOFF)
784    AC_MSG_RESULT(yes)],
785   [AC_MSG_RESULT(no)
786    AC_MSG_CHECKING([for global timezone variable])
787    dnl FIXME: we don't want a link check here because that won't work
788    dnl when cross-compiling.  So instead we make an assumption that
789    dnl the header file will mention timezone if it exists.
790    AC_TRY_COMPILE([#include <time.h>], [long z2 = timezone;],
791      [AC_DEFINE(HAVE_TIMEZONE)
792       AC_MSG_RESULT(yes)],
793      [AC_MSG_RESULT(no)])])
794
795 AC_FUNC_ALLOCA
796
797 AC_CHECK_PROGS(PERL, perl, false)
798
799 SYSDEP_SOURCES=
800
801 case "${host}" in
802  i?86-*-linux*)
803     SIGNAL_HANDLER=include/i386-signal.h
804     ;;
805  sparc-sun-solaris*)
806     SIGNAL_HANDLER=include/sparc-signal.h
807     ;;
808 # ia64-*)
809 #    SYSDEP_SOURCES=sysdep/ia64.c
810 #    test -d sysdep || mkdir sysdep
811 #    ;;
812  powerpc-*-linux*)
813     SIGNAL_HANDLER=include/dwarf2-signal.h
814     ;;
815  alpha*-*-linux*)
816     SIGNAL_HANDLER=include/dwarf2-signal.h
817     ;;
818  *)
819     SIGNAL_HANDLER=include/default-signal.h
820     ;;
821 esac
822
823 # If we're using sjlj exceptions, forget what we just learned.
824 if test "$enable_sjlj_exceptions" = yes; then
825    SIGNAL_HANDLER=include/default-signal.h
826 fi
827
828 AC_SUBST(SYSDEP_SOURCES)
829
830 AC_LINK_FILES($SIGNAL_HANDLER, include/java-signal.h)
831
832 if test "${multilib}" = "yes"; then
833   multilib_arg="--enable-multilib"
834 else
835   multilib_arg=
836 fi
837
838 AC_PATH_XTRA
839
840 dnl Determine which AWT peer libraries to build
841 AC_ARG_ENABLE(java-awt,
842 [  --enable-java-awt       list of AWT peer implementations to be built])
843
844 peerlibs="`echo ${enable_java_awt} | tr ',' ' '`"
845 use_xlib_awt=""
846 use_gtk_awt=""
847
848 for peer in $peerlibs ; do
849   case $peer in
850     xlib)
851       if [test "$no_x" = yes]; then
852         echo "*** xlib peers requested but no X library available" 1>&2
853         exit 1
854       else
855         use_xlib_awt="yes"
856       fi
857       ;;
858     gtk)
859       # Nothing, yet...
860       ;;
861     no)
862       use_xlib_awt=
863       use_gtk_awt=
864       break
865       ;;
866     *)
867       echo "*** unrecognised argument \"${peer}\" for --enable-java-awt" 1>&2
868       exit 1
869   esac
870 done
871
872 AM_CONDITIONAL(XLIB_AWT, test "$use_xlib_awt" = yes)
873 AM_CONDITIONAL(GTK_AWT, test "$use_gtk_awt" = yes)
874
875
876 here=`pwd`
877 AC_SUBST(here)
878
879 # We get this from the environment.
880 AC_SUBST(GCJFLAGS)
881
882 AC_OUTPUT(Makefile libgcj.spec libgcj-test.spec gnu/classpath/Configuration.java gcj/Makefile include/Makefile testsuite/Makefile,
883 [# Only add multilib support code if we just rebuilt top-level Makefile.
884 case " $CONFIG_FILES " in
885  *" Makefile "*)
886    ac_file=Makefile . ${libgcj_basedir}/../config-ml.in
887    ;;
888 esac
889
890 # Make subdirectories and `.d' files.  Look in both srcdir and
891 # builddir for the .java files.
892 h=`pwd`
893 : > deps.mk
894 ( (cd $srcdir && find . \( -name '*.java' -o -name '*.cc' \) -print) ;
895   find . \( -name '*.java' -o -name '*.cc' \) -print) | \
896    fgrep -v testsuite | \
897    sed -e 's/\.java/.d/'\;'s/\.cc/.d/' | \
898    while read f; do
899       echo "include $f" >> deps.mk
900       test -f $f || {
901 changequote(<<,>>)
902          d=`echo $f | sed -e 's,/[^/]*$,,'`
903 changequote([,])
904          if test ! -d $d; then
905            $libgcj_basedir/../mkinstalldirs $d
906          fi;
907          echo > $f
908       }
909    done
910 ],
911 srcdir=${srcdir}
912 host=${host}
913 target=${target}
914 with_multisubdir=${with_multisubdir}
915 ac_configure_args="${multilib_arg} ${ac_configure_args}"
916 CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
917 libgcj_basedir=${libgcj_basedir}
918 CC="${CC}"
919 CXX="${CXX}"
920 )