dnl Process this with autoconf to create configure
AC_INIT(java/lang/System.java)

# This works around the fact that libtool configuration may change LD
# for this particular configuration, but some shells, instead of
# keeping the changes in LD private, export them just because LD is
# exported.
ORIGINAL_LD_FOR_MULTILIBS=$LD

AC_PROG_LN_S

dnl We use these options to decide which functions to include.
AC_ARG_WITH(target-subdir,
[  --with-target-subdir=SUBDIR
                           configuring in a subdirectory])
AC_ARG_WITH(cross-host,
[  --with-cross-host=HOST  configuring with a cross compiler])

LIBGCJ_CONFIGURE(.)

AM_CONFIG_HEADER(include/config.h gcj/libgcj-config.h)

# Only use libltdl for native builds.
if test -z "${with_cross_host}"; then
   AC_LIBLTDL_CONVENIENCE
   AC_LIBTOOL_DLOPEN
   DIRLTDL=libltdl
   AC_DEFINE(USE_LTDL)
   # Sigh.  Libtool's macro doesn't do the right thing.
   INCLTDL="-I\$(top_srcdir)/libltdl $INCLTDL"
   # FIXME: this is a hack.
   sub_auxdir="`cd $ac_aux_dir && pwd`"
   ac_configure_args="$ac_configure_args --with-auxdir=$sub_auxdir"
fi
AC_SUBST(INCLTDL)
AC_SUBST(LIBLTDL)
AC_SUBST(DIRLTDL)
AM_PROG_LIBTOOL
AC_CONFIG_SUBDIRS($DIRLTDL)

if test -z "$with_target_subdir" || test "$with_target_subdir" = "."; then
   COMPPATH=.
else
   COMPPATH=..
fi
AC_SUBST(COMPPATH)

dnl The -no-testsuite modules omit the test subdir.
AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)

dnl Should the runtime set system properties by examining the 
dnl environment variable GCJ_PROPERTIES?
AC_ARG_ENABLE(getenv-properties,
[  --disable-getenv-properties
                          don't set system properties from GCJ_PROPERTIES])

dnl Whether GCJ_PROPERTIES is used depends on the target.
if test -z "$enable_getenv_properties"; then
   enable_getenv_properties=${enable_getenv_properties_default-yes}
fi
if test "$enable_getenv_properties" = no; then
   AC_DEFINE(DISABLE_GETENV_PROPERTIES)
fi

dnl Whether we should use arguments to main()
if test -z "$enable_main_args"; then
   enable_main_args=${enable_main_args_default-yes}
fi
if test "$enable_main_args" = no; then
   AC_DEFINE(DISABLE_MAIN_ARGS)
fi


dnl Should we use hashtable-based synchronization?
dnl Currently works only for Linux X86/ia64
dnl Typically faster and more space-efficient
AC_ARG_ENABLE(hash-synchronization,
[  --enable-hash-synchronization
                          Use global hash table for monitor locks])

if test -z "$enable_hash_synchronization"; then
   enable_hash_synchronization=$enable_hash_synchronization_default
fi

dnl configure.host sets slow_pthread_self if the synchronization code should 
dnl try to avoid pthread_self calls by caching thread IDs in a hashtable.
if test "${slow_pthread_self}" = "yes"; then
  AC_DEFINE(SLOW_PTHREAD_SELF)
fi


dnl See if the user has requested runtime debugging.
LIBGCJDEBUG="false"
AC_SUBST(LIBGCJDEBUG)
AC_ARG_ENABLE(libgcj-debug,
[  --enable-libgcj-debug   enable runtime debugging code],
  if test "$enable_libgcj_debug" = yes; then
    AC_DEFINE(DEBUG)
    LIBGCJDEBUG="true"
  fi)

dnl See if the user has the interpreter included.
AC_ARG_ENABLE(interpreter,
[  --enable-interpreter    enable interpreter],
  if test "$enable_interpreter" = yes; then
    # This can also be set in configure.host.
    libgcj_interpreter=yes
  elif test "$enable_interpreter" = no; then
    libgcj_interpreter=no
  fi)

if test "$libgcj_interpreter" = yes; then
   AC_DEFINE(INTERPRETER)
fi

AC_MSG_CHECKING([for exception model to use])
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_ARG_ENABLE(sjlj-exceptions,
[  --enable-sjlj-exceptions  force use of builtin_setjmp for exceptions],
[:],
[dnl Botheration.  Now we've got to detect the exception model.
dnl Link tests against libgcc.a are problematic since -- at least
dnl as of this writing -- we've not been given proper -L bits for
dnl single-tree newlib and libgloss.
dnl
dnl This is what AC_TRY_COMPILE would do if it didn't delete the
dnl conftest files before we got a change to grep them first.
cat > conftest.$ac_ext << EOF
[#]line __oline__ "configure"
struct S { ~S(); };
void bar();
void foo()
{
  S s;
  bar();
}
EOF
old_CXXFLAGS="$CXXFLAGS"  
CXXFLAGS=-S
if AC_TRY_EVAL(ac_compile); then
  if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then
    enable_sjlj_exceptions=yes
  elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then
    enable_sjlj_exceptions=no
  fi
fi
CXXFLAGS="$old_CXXFLAGS"
rm -f conftest*])
if test x$enable_sjlj_exceptions = xyes; then
  AC_DEFINE(SJLJ_EXCEPTIONS, 1,
	[Define if the compiler is configured for setjmp/longjmp exceptions.])
  ac_exception_model_name=sjlj
elif test x$enable_sjlj_exceptions = xno; then
  ac_exception_model_name="call frame"
else
  AC_MSG_ERROR([unable to detect exception model])
fi
AC_LANG_RESTORE
AC_MSG_RESULT($ac_exception_model_name)

# If we are non using SJLJ exceptions, and this host does not have support 
# for unwinding from a signal handler, enable checked dereferences and divides.
if test $can_unwind_signal = no && test $enable_sjlj_exceptions = no; then
  CHECKREFSPEC=-fcheck-references
  DIVIDESPEC=-fuse-divide-subroutine
  EXCEPTIONSPEC=
fi

dnl See if the user wants to disable java.net.  This is the mildly
dnl ugly way that we admit that target-side configuration sucks.
AC_ARG_ENABLE(java-net,
[  --disable-java-net      disable java.net])

dnl Whether java.net is built by default can depend on the target.
if test -z "$enable_java_net"; then
   enable_java_net=${enable_java_net_default-yes}
fi
if test "$enable_java_net" = no; then
   AC_DEFINE(DISABLE_JAVA_NET)
fi

dnl See if the user wants to configure without libffi.  Some
dnl architectures don't support it, and default values are set in 
dnl configure.host.
AC_ARG_WITH(libffi,
[  --without-libffi        don't use libffi],,with_libffi=${with_libffi_default-yes})

LIBFFI=
LIBFFIINCS=
if test "$with_libffi" != no; then
   AC_DEFINE(USE_LIBFFI)
   LIBFFI=../libffi/libffi_convenience.la
   LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I$(MULTIBUILDTOP)../libffi/include'
fi
AC_SUBST(LIBFFI)
AC_SUBST(LIBFFIINCS)

dnl See if the user wants to disable JVMPI support.
AC_ARG_ENABLE(jvmpi,
[  --disable-jvmpi         disable JVMPI support])

if test "$enable_jvmpi" != no; then
    AC_DEFINE(ENABLE_JVMPI)
fi

dnl If the target is an eCos system, use the appropriate eCos
dnl I/O routines.
dnl FIXME: this should not be a local option but a global target
dnl system; at present there is no eCos target.
TARGET_ECOS=${PROCESS-"no"}
AC_ARG_WITH(ecos,
[  --with-ecos             enable runtime eCos target support],
TARGET_ECOS="$with_ecos"
)

PLATFORMOBJS=
case "$TARGET_ECOS" in
   no) case "$host" in
      *mingw*)
            PLATFORM=Win32
            PLATFORMOBJS=win32.lo
	    PLATFORMH=win32.h
      ;;
      *)
            PLATFORM=Posix
            PLATFORMOBJS=posix.lo
	    PLATFORMH=posix.h
      ;;
      esac
      ;;
   *)
      PLATFORM=Ecos
      AC_DEFINE(ECOS)
      PLATFORMOBJS=posix.lo
      PLATFORMH=posix.h
      ;;
esac
AC_SUBST(PLATFORMOBJS)
AC_LINK_FILES(include/$PLATFORMH, include/platform.h)

AC_EGREP_HEADER(uint32_t, stdint.h, AC_DEFINE(HAVE_INT32_DEFINED))
AC_EGREP_HEADER(uint32_t, inttypes.h, AC_DEFINE(HAVE_INT32_DEFINED))
AC_EGREP_HEADER(u_int32_t, sys/types.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))
AC_EGREP_HEADER(u_int32_t, sys/config.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))


dnl These may not be defined in a non-ANS conformant embedded system.
dnl FIXME: Should these case a runtime exception in that case?
AC_EGREP_HEADER(mktime, time.h, AC_DEFINE(HAVE_MKTIME))
AC_EGREP_HEADER(localtime, time.h, AC_DEFINE(HAVE_LOCALTIME))

dnl Create the subdirectory for natFileDescriptor.cc, or the attempt
dnl to create the link will fail.
test -d java || mkdir java
test -d java/io || mkdir java/io
test -d gnu || mkdir gnu
AC_LINK_FILES(java/io/natFile${FILE-${PLATFORM}}.cc, java/io/natFile.cc)
AC_LINK_FILES(java/io/natFileDescriptor${FILE-${PLATFORM}}.cc, java/io/natFileDescriptor.cc)

dnl Likewise for ConcreteProcess.java and natConcreteProcess.cc.
test -d java/lang || mkdir java/lang
AC_LINK_FILES(java/lang/${PLATFORM}Process.java, java/lang/ConcreteProcess.java)
AC_LINK_FILES(java/lang/nat${PLATFORM}Process.cc, java/lang/natConcreteProcess.cc)

case "${host}" in
    *mingw*)
      SYSTEMSPEC="-lgdi32 -lwsock32 -lws2_32"
    ;;
    *)
      SYSTEMSPEC=
    ;;
esac
AC_SUBST(SYSTEMSPEC)

LIBGCJTESTSPEC="-L`pwd`/.libs -rpath `pwd`/.libs"
AC_SUBST(LIBGCJTESTSPEC)

AC_ARG_WITH(system-zlib,
[  --with-system-zlib      use installed libz])
ZLIBSPEC=
AC_SUBST(ZLIBSPEC)
ZLIBTESTSPEC=
AC_SUBST(ZLIBTESTSPEC)

dnl FIXME: this should be _libs on some hosts.
libsubdir=.libs

dnl Allow the GC to be disabled.  Can be useful when debugging.
AC_MSG_CHECKING([for garbage collector to use])
AC_ARG_ENABLE(java-gc,
changequote(<<,>>)dnl
<<  --enable-java-gc=TYPE   choose garbage collector [boehm]>>,
changequote([,])
  GC=$enableval,
  GC=boehm)
GCLIBS=
GCINCS=
GCDEPS=
GCOBJS=
GCSPEC=
JC1GCSPEC=
GCTESTSPEC=
case "$GC" in
 boehm)
    AC_MSG_RESULT(boehm)
    GCLIBS=../boehm-gc/libgcjgc_convenience.la
    GCINCS='-I$(top_srcdir)/../boehm-gc/include'
    JC1GCSPEC='-fuse-boehm-gc'
    GCTESTSPEC="-L`pwd`/../boehm-gc/.libs -rpath `pwd`/../boehm-gc/.libs"

    dnl We also want to pick up some cpp flags required when including
    dnl boehm-config.h.  Yuck.
    GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`"
    GCOBJS=boehm.lo
    GCHDR=boehm-gc.h
    dnl The POSIX thread support needs to know this.
    AC_DEFINE(HAVE_BOEHM_GC)
    ;;
 no)
    AC_MSG_RESULT(none)
    GCOBJS=nogc.lo
    GCHDR=no-gc.h
    ;;
 *)
    AC_MSG_ERROR(unrecognized collector \"$GC\")
    ;;
esac
AC_SUBST(GCLIBS)
AC_SUBST(GCINCS)
AC_SUBST(GCDEPS)
AC_SUBST(GCOBJS)
AC_SUBST(GCSPEC)
AC_SUBST(JC1GCSPEC)
AC_SUBST(GCTESTSPEC)
AC_LINK_FILES(include/$GCHDR, include/java-gc.h)


AC_MSG_CHECKING([for thread model used by GCC])
THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'`
AC_MSG_RESULT([$THREADS])

case "$THREADS" in
 no | none | single)
    THREADS=none
    ;;
 posix | pthreads)
    THREADS=posix
    case "$host" in
     *-*-linux*)
	AC_DEFINE(LINUX_THREADS)
	;;
    esac
    ;;
 win32)
    ;;
 decosf1 | irix | mach | os2 | solaris | dce | vxworks)
    AC_MSG_ERROR(thread package $THREADS not yet supported)
    ;;
 *)
    AC_MSG_ERROR($THREADS is an unknown thread package)
    ;;
esac

THREADLDFLAGS=
THREADLIBS=
THREADINCS=
THREADDEPS=
THREADOBJS=
THREADH=
THREADSPEC=
case "$THREADS" in
 posix)
    case "$host" in
     *-*-cygwin*)
	# Don't set THREADLIBS here.  Cygwin doesn't have -lpthread.
	;;
changequote(<<,>>)   
     *-*-freebsd[1234]*)
changequote([,])   
	# Before FreeBSD 5, it didn't have -lpthread (or any library which
	# merely adds pthread_* functions) but it does have a -pthread switch
	# which is required at link-time to select -lc_r *instead* of -lc.
	THREADLDFLAGS=-pthread
	# Don't set THREADSPEC here as might be expected since -pthread is
	# not processed when found within a spec file, it must come from
	# the command line.  For now, the user must provide the -pthread
	# switch to link code compiled with gcj.  In future, consider adding
	# support for weak references to pthread_* functions ala gthr.h API.
	THREADSPEC='%{!pthread: %eUnder this configuration, the user must provide -pthread when linking.}'
	;;
     *-*-freebsd*)
	# FreeBSD 5 implements a model much closer to other modern UNIX
	# which support threads.  However, it still does not support
	# -lpthread.
	THREADLDFLAGS=-pthread
	THREADSPEC=-lc_r
	;;
     *)
	THREADLIBS=-lpthread
	THREADSPEC=-lpthread
	;;
    esac
    THREADOBJS=posix-threads.lo
    THREADH=posix-threads.h
    # MIT pthreads doesn't seem to have the mutexattr functions.
    # But for now we don't check for it.  We just assume you aren't
    # using MIT pthreads.
    AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_INIT)

    # If we're using the Boehm GC, then we happen to know that it
    # defines _REENTRANT, so we don't bother.  Eww.
    if test "$GC" != boehm; then
       AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads])
    fi
    AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Required define if using POSIX threads])
    ;;

 win32)
    THREADOBJS=win32-threads.lo
    THREADH=win32-threads.h
    ;;

 none)
    THREADOBJS=no-threads.lo
    THREADH=no-threads.h
    ;;
esac
AC_LINK_FILES(include/$THREADH, include/java-threads.h)
AC_SUBST(THREADLIBS)
AC_SUBST(THREADINCS)
AC_SUBST(THREADDEPS)
AC_SUBST(THREADOBJS)
AC_SUBST(THREADSPEC)
AC_SUBST(THREADLDFLAGS)

if test -d sysdep; then true; else mkdir sysdep; fi
AC_LINK_FILES(sysdep/$sysdeps_dir/locks.h, sysdep/locks.h)

HASH_SYNC_SPEC=
# Hash synchronization is only useful with posix threads right now.
if test "$enable_hash_synchronization" = yes && test "$THREADS" = "posix"; then
   HASH_SYNC_SPEC=-fhash-synchronization
   AC_DEFINE(JV_HASH_SYNCHRONIZATION, 1, [Define if hash synchronization is in use])
fi
AC_SUBST(HASH_SYNC_SPEC)


AM_CONDITIONAL(USING_GCC, test "$GCC" = yes)

CANADIAN=no
NULL_TARGET=no
NATIVE=yes

# We're in the tree with gcc, and need to include some of its headers.
GCC_UNWIND_INCLUDE='-I$(libgcj_basedir)/../gcc'

# Figure out where generated headers like libgcj-config.h get installed.
changequote(,)dnl
gcc_version_trigger=${libgcj_basedir}/../gcc/version.c
gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'`
gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
tool_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include
changequote([,])dnl
AC_SUBST(tool_include_dir)
AC_SUBST(gcc_version)

if test -n "${with_cross_host}"; then
   # We are being configured with a cross compiler.  AC_REPLACE_FUNCS
   # may not work correctly, because the compiler may not be able to
   # link executables.

   # We assume newlib.  This lets us hard-code the functions we know
   # we'll have.
   AC_DEFINE(HAVE_MEMMOVE)
   AC_DEFINE(HAVE_MEMCPY)
   AC_DEFINE(HAVE_STRERROR)
   AC_DEFINE(HAVE_TIME)
   AC_DEFINE(HAVE_GMTIME_R)
   AC_DEFINE(HAVE_LOCALTIME_R)
   dnl This is only for POSIX threads.
   AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_INIT)
   dnl We also assume we are using gcc, which provides alloca.
   AC_DEFINE(HAVE_ALLOCA)

   dnl Assume we do not have getuid and friends.
   AC_DEFINE(NO_GETUID)

   # If Canadian cross, then don't pick up tools from the build
   # directory.
   if test x"$build" != x"$with_cross_host" && x"$build" != x"$target"; then
      CANADIAN=yes
      GCC_UNWIND_INCLUDE=
      GCJ="${target_alias}-gcj"
   fi
   NATIVE=no
else
   AC_CHECK_FUNCS(strerror ioctl select fstat open fsync sleep opendir)
   AC_CHECK_FUNCS(gmtime_r localtime_r readdir_r getpwuid_r getcwd)
   AC_CHECK_FUNCS(access stat mkdir rename rmdir unlink realpath utime chmod)
   AC_CHECK_FUNCS(nl_langinfo setlocale)
   AC_CHECK_FUNCS(inet_aton inet_addr, break)
   AC_CHECK_FUNCS(inet_pton uname inet_ntoa)
   AC_CHECK_FUNCS(fork execvp pipe sigaction)
   AC_CHECK_HEADERS(execinfo.h unistd.h dlfcn.h) 
   AC_CHECK_FUNC(backtrace, [
     case "$host" in
       ia64-*-linux*)
	 # Has broken backtrace()
	 ;;
       *)
         AC_DEFINE(HAVE_BACKTRACE)
	 ;;
     esac
   ])

   AC_CHECK_LIB(dl, dladdr, [
     AC_DEFINE(HAVE_DLADDR)])
   AC_CHECK_FILES(/proc/self/exe, [
     AC_DEFINE(HAVE_PROC_SELF_EXE)])

   AM_ICONV
   AM_LC_MESSAGES
   AC_STRUCT_TIMEZONE

   AC_CHECK_FUNCS(gethostbyname_r, [
     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
     # There are two different kinds of gethostbyname_r.
     # We look for the one that returns `int'.
     # Hopefully this check is robust enough.
     AC_EGREP_HEADER(int.*gethostbyname_r, netdb.h, [
       AC_DEFINE(GETHOSTBYNAME_R_RETURNS_INT)])

     case " $GCINCS " in
     *" -D_REENTRANT "*) ;;
     *)
	dnl On DU4.0, gethostbyname_r is only declared with -D_REENTRANT
	AC_CACHE_CHECK([whether gethostbyname_r declaration requires -D_REENTRANT],
	[libjava_cv_gethostbyname_r_needs_reentrant],
	[ AC_LANG_SAVE
	  AC_LANG_CPLUSPLUS
	  AC_TRY_COMPILE([#include <netdb.h>],
	    [gethostbyname_r("", 0, 0);],
	    [libjava_cv_gethostbyname_r_needs_reentrant=no], [dnl
		CPPFLAGS_SAVE="$CPPFLAGS"
		CPPFLAGS="$CPPFLAGS -D_REENTRANT"
		AC_TRY_COMPILE([#include <netdb.h>], [gethostbyname_r("", 0, 0);],
		    [libjava_cv_gethostbyname_r_needs_reentrant=yes],
		    [libjava_cv_gethostbyname_r_needs_reentrant=fail])
		CPPFLAGS="$CPPFLAGS_SAVE"
	  ])
	  AC_LANG_RESTORE
	])
	if test "x$libjava_cv_gethostbyname_r_needs_reentrant" = xyes; then
	  AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads])
	fi
     ;;
     esac

     AC_CACHE_CHECK([for struct hostent_data],
	[libjava_cv_struct_hostent_data], [dnl
	AC_TRY_COMPILE([
#if GETHOSTBYNAME_R_NEEDS_REENTRANT && !defined(_REENTRANT)
# define _REENTRANT 1
#endif
#include <netdb.h>], [struct hostent_data data;],
	  [libjava_cv_struct_hostent_data=yes],
	  [libjava_cv_struct_hostent_data=no])])
     if test "x$libjava_cv_struct_hostent_data" = xyes; then
       AC_DEFINE(HAVE_STRUCT_HOSTENT_DATA, 1,
         [Define if struct hostent_data is defined in netdb.h])
     fi
   ])

   # FIXME: libjava source code expects to find a prototype for
   # gethostbyaddr_r in netdb.h.  The outer check ensures that
   # HAVE_GETHOSTBYADDR_R will not be defined if the prototype fails
   # to exist where expected.  (The root issue: AC_CHECK_FUNCS assumes C
   # linkage check is enough, yet C++ code requires proper prototypes.)
   AC_EGREP_HEADER(gethostbyaddr_r, netdb.h, [
   AC_CHECK_FUNCS(gethostbyaddr_r, [
     AC_DEFINE(HAVE_GETHOSTBYADDR_R)
     # There are two different kinds of gethostbyaddr_r.
     # We look for the one that returns `int'.
     # Hopefully this check is robust enough.
     AC_EGREP_HEADER(int.*gethostbyaddr_r, netdb.h, [
       AC_DEFINE(GETHOSTBYADDR_R_RETURNS_INT)])])])

   AC_CHECK_FUNCS(gethostname, [
     AC_DEFINE(HAVE_GETHOSTNAME)
     AC_EGREP_HEADER(gethostname, unistd.h, [
       AC_DEFINE(HAVE_GETHOSTNAME_DECL)])])

   # Look for these functions in the thread library, but only bother
   # if using POSIX threads.
   if test "$THREADS" = posix; then
      save_LIBS="$LIBS"
      LIBS="$LIBS $THREADLIBS"
      # Some POSIX thread systems don't have pthread_mutexattr_settype.
      # E.g., Solaris.
      AC_CHECK_FUNCS(pthread_mutexattr_settype pthread_mutexattr_setkind_np)

      # Look for sched_yield.  Up to Solaris 2.6, it is in libposix4, since
      # Solaris 7 the name librt is preferred.
      AC_CHECK_FUNCS(sched_yield, , [
	AC_CHECK_LIB(rt, sched_yield, [
	  AC_DEFINE(HAVE_SCHED_YIELD)
	  THREADLIBS="$THREADLIBS -lrt"
	  THREADSPEC="$THREADSPEC -lrt"], [
	  AC_CHECK_LIB(posix4, sched_yield, [
	    AC_DEFINE(HAVE_SCHED_YIELD)
	    THREADLIBS="$THREADLIBS -lposix4"
	    THREADSPEC="$THREADSPEC -lposix4"])])])
      LIBS="$save_LIBS"

      # We can save a little space at runtime if the mutex has m_count
      # or __m_count.  This is a nice hack for Linux.
      AC_TRY_COMPILE([#include <pthread.h>], [
          extern pthread_mutex_t *mutex; int q = mutex->m_count;
        ], AC_DEFINE(PTHREAD_MUTEX_HAVE_M_COUNT), [
	AC_TRY_COMPILE([#include <pthread.h>], [
	    extern pthread_mutex_t *mutex; int q = mutex->__m_count;
	  ], AC_DEFINE(PTHREAD_MUTEX_HAVE___M_COUNT))])
   fi

   # We require a way to get the time.
   time_found=no
   AC_CHECK_FUNCS(gettimeofday time ftime, time_found=yes)
   if test "$time_found" = no; then
      AC_MSG_ERROR([no function found to get the time])
   fi

   AC_CHECK_FUNCS(memmove)

   # We require memcpy.
   memcpy_found=no
   AC_CHECK_FUNCS(memcpy, memcpy_found=yes)
   if test "$memcpy_found" = no; then
      AC_MSG_ERROR([memcpy is required])
   fi

   AC_CHECK_LIB(dl, dlopen, [
       AC_DEFINE(HAVE_DLOPEN, 1, [Define if dlopen is available])])

   # Some library-finding code we stole from Tcl.
   #--------------------------------------------------------------------
   #	Check for the existence of the -lsocket and -lnsl libraries.
   #	The order here is important, so that they end up in the right
   #	order in the command line generated by make.  Here are some
   #	special considerations:
   #	1. Use "connect" and "accept" to check for -lsocket, and
   #	   "gethostbyname" to check for -lnsl.
   #	2. Use each function name only once:  can't redo a check because
   #	   autoconf caches the results of the last check and won't redo it.
   #	3. Use -lnsl and -lsocket only if they supply procedures that
   #	   aren't already present in the normal libraries.  This is because
   #	   IRIX 5.2 has libraries, but they aren't needed and they're
   #	   bogus:  they goof up name resolution if used.
   #	4. On some SVR4 systems, can't use -lsocket without -lnsl too.
   #	   To get around this problem, check for both libraries together
   #	   if -lsocket doesn't work by itself.
   #--------------------------------------------------------------------

   AC_CACHE_CHECK([for socket libraries], gcj_cv_lib_sockets,
    [gcj_cv_lib_sockets=
     gcj_checkBoth=0
     unset ac_cv_func_connect
     AC_CHECK_FUNC(connect, gcj_checkSocket=0, gcj_checkSocket=1)
     if test "$gcj_checkSocket" = 1; then
	 unset ac_cv_func_connect
	 AC_CHECK_LIB(socket, main, gcj_cv_lib_sockets="-lsocket",
		      gcj_checkBoth=1)
     fi
     if test "$gcj_checkBoth" = 1; then
	 gcj_oldLibs=$LIBS
	 LIBS="$LIBS -lsocket -lnsl"
	 unset ac_cv_func_accept
	 AC_CHECK_FUNC(accept,
		       [gcj_checkNsl=0
			gcj_cv_lib_sockets="-lsocket -lnsl"])
	 unset ac_cv_func_accept
	 LIBS=$gcj_oldLibs
     fi
     unset ac_cv_func_gethostbyname
     gcj_oldLibs=$LIBS
     LIBS="$LIBS $gcj_cv_lib_sockets"
     AC_CHECK_FUNC(gethostbyname, ,
		   [AC_CHECK_LIB(nsl, main,
				 [gcj_cv_lib_sockets="$gcj_cv_lib_sockets -lnsl"])])
     unset ac_cv_func_gethostbyname
     LIBS=$gcj_oldLIBS
   ])
   SYSTEMSPEC="$SYSTEMSPEC $gcj_cv_lib_sockets"

   if test "$with_system_zlib" = yes; then
      AC_CHECK_LIB(z, deflate, ZLIBSPEC=-lz, ZLIBSPEC=)
   fi

   # On Solaris, and maybe other architectures, the Boehm collector
   # requires -ldl.
   if test "$GC" = boehm; then
      AC_CHECK_LIB(dl, main, SYSTEMSPEC="$SYSTEMSPEC -ldl")
   fi

   if test -z "${with_multisubdir}"; then
      builddotdot=.
   else
changequote(<<,>>)
      builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`
changequote([,])
   fi
   if test -x "${builddotdot}/../../gcc/gcj"; then
      dir="`cd ${builddotdot}/../../gcc && pwd`"
      GCJ="$dir/gcj -B`pwd`/ -B$dir/"
   else
      CANADIAN=yes
      NULL_TARGET=yes
      GCJ="gcj -B`pwd`/"
   fi
fi

# Create it, so that compile/link tests don't fail
test -f libgcj.spec || touch libgcj.spec

# We must search the source tree for java.lang, since we still don't
# have libgcj.jar nor java/lang/*.class
GCJ_SAVE_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I`pwd` -I`cd $srcdir && pwd`"

# Since some classes depend on this one, we need its source available
# before we can do any GCJ compilation test :-(
if test ! -f gnu/classpath/Configuration.java; then
  test -d gnu || mkdir gnu
  test -d gnu/classpath || mkdir gnu/classpath
  sed 's,@LIBGCJDEBUG@,$LIBGCJDEBUG,' \
	< $srcdir/gnu/classpath/Configuration.java.in \
	> gnu/classpath/Configuration.java
  # We do not want to redirect the output of the grep below to /dev/null,
  # but we add /dev/null to the input list so that grep will print the
  # filename of Configuration.java in case it finds any matches.
  if grep @ gnu/classpath/Configuration.java /dev/null; then
    AC_MSG_ERROR([configure.in is missing the substitutions above])
  fi
fi

LT_AC_PROG_GCJ

CPPFLAGS=$GCJ_SAVE_CPPFLAGS

AC_COMPILE_CHECK_SIZEOF(void *)

ZLIBS=
SYS_ZLIBS=
ZINCS=

if test -z "$ZLIBSPEC"; then
   # Use zlib from the GCC tree.
   ZINCS='-I$(top_srcdir)/../zlib'
   ZLIBS=../zlib/libzgcj_convenience.la
else
   # System's zlib.
   SYS_ZLIBS="$ZLIBSPEC"
fi
AC_SUBST(ZLIBS)
AC_SUBST(SYS_ZLIBS)
AC_SUBST(ZINCS)
AC_SUBST(DIVIDESPEC)
AC_SUBST(CHECKREFSPEC)
AC_SUBST(EXCEPTIONSPEC)

AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes)
AM_CONDITIONAL(NULL_TARGET, test "$NULL_TARGET" = yes)
AM_CONDITIONAL(NATIVE, test "$NATIVE" = yes || test "$NULL_TARGET" = yes)
AM_CONDITIONAL(NEEDS_DATA_START, test "$NEEDS_DATA_START" = yes && test "$NATIVE" = yes)
AC_SUBST(GCC_UNWIND_INCLUDE)

if test -n "$with_cross_host" &&
   test x"$with_cross_host" != x"no"; then
  toolexecdir='$(exec_prefix)/$(target_alias)'
  toolexecmainlibdir='$(toolexecdir)/lib'
else
  toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
  toolexecmainlibdir='$(libdir)'
fi
toolexeclibdir=$toolexecmainlibdir/`$CC -print-multi-os-directory`
AC_SUBST(toolexecdir)
AC_SUBST(toolexecmainlibdir)
AC_SUBST(toolexeclibdir)

AC_SUBST(AM_RUNTESTFLAGS)

# Determine gcj version number.
changequote(<<,>>)
gcjversion=`$GCJ -v 2>&1 | sed -n 's/^.*version \([^ ]*\).*$/\1/p'`
changequote([,])
GCJVERSION=$gcjversion
AC_SUBST(GCJVERSION)
AC_DEFINE_UNQUOTED(GCJVERSION, "$GCJVERSION", [Short GCJ version])

dnl Work around a g++ bug.  Reported to gcc-bugs@gcc.gnu.org on Jan 22, 2000.
AC_MSG_CHECKING([for g++ -ffloat-store bug])
save_CFLAGS="$CFLAGS"
CFLAGS="-x c++ -O2 -ffloat-store"
AC_TRY_COMPILE([#include <math.h>], , 
  [AC_MSG_RESULT(no)],
  [AC_DEFINE(__NO_MATH_INLINES)
   AC_MSG_RESULT(yes)])
CFLAGS="$save_CFLAGS"

dnl We check for sys/filio.h because Solaris 2.5 defines FIONREAD there.
dnl On that system, sys/ioctl.h will not include sys/filio.h unless
dnl BSD_COMP is defined; just including sys/filio.h is simpler.
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)
dnl We avoid AC_HEADER_DIRENT since we really only care about dirent.h
dnl for now.  If you change this, you also must update natFile.cc.
AC_CHECK_HEADERS(dirent.h)
AC_CHECK_HEADERS(inttypes.h, [
    AC_DEFINE(HAVE_INTTYPES_H, 1, [Define if <inttypes.h> is available])
    AC_DEFINE(JV_HAVE_INTTYPES_H, 1, [Define if <inttypes.h> is available])
])
AC_HEADER_SYS_WAIT

AC_CHECK_TYPE([ssize_t], [int])

AC_MSG_CHECKING([for in_addr_t])
AC_TRY_COMPILE([#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
#if HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif], [in_addr_t foo;],
  [AC_DEFINE([HAVE_IN_ADDR_T])
   AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)])

AC_MSG_CHECKING([whether struct ip_mreq is in netinet/in.h])
AC_TRY_COMPILE([#include <netinet/in.h>], [struct ip_mreq mreq;],
  [AC_DEFINE(HAVE_STRUCT_IP_MREQ)
   AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)])

AC_MSG_CHECKING([whether struct ipv6_mreq is in netinet/in.h])
AC_TRY_COMPILE([#include <netinet/in.h>], [struct ipv6_mreq mreq6;],
  [AC_DEFINE(HAVE_STRUCT_IPV6_MREQ)
   AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)])

AC_MSG_CHECKING([whether struct sockaddr_in6 is in netinet/in.h])
AC_TRY_COMPILE([#include <netinet/in.h>], [struct sockaddr_in6 addr6;],
  [AC_DEFINE(HAVE_INET6)
   AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)])

AC_MSG_CHECKING([for socklen_t in sys/socket.h])
AC_TRY_COMPILE([#define _POSIX_PII_SOCKET
#include <sys/types.h>
#include <sys/socket.h>], [socklen_t x = 5;],
  [AC_DEFINE(HAVE_SOCKLEN_T)
   AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)])

AC_MSG_CHECKING([for tm_gmtoff in struct tm])
AC_TRY_COMPILE([#include <time.h>], [struct tm tim; tim.tm_gmtoff = 0;],
  [AC_DEFINE(STRUCT_TM_HAS_GMTOFF)
   AC_MSG_RESULT(yes)],
  [AC_MSG_RESULT(no)
   AC_MSG_CHECKING([for global timezone variable])
   dnl FIXME: we don't want a link check here because that won't work
   dnl when cross-compiling.  So instead we make an assumption that
   dnl the header file will mention timezone if it exists.
   AC_TRY_COMPILE([#include <time.h>], [long z2 = timezone;],
     [AC_DEFINE(HAVE_TIMEZONE)
      AC_MSG_RESULT(yes)],
     [AC_MSG_RESULT(no)])])

AC_FUNC_ALLOCA

AC_CHECK_PROGS(PERL, perl, false)

SYSDEP_SOURCES=

case "${host}" in
 i?86-*-linux*)
    SIGNAL_HANDLER=include/i386-signal.h
    ;;
 sparc*-sun-solaris*)
    SIGNAL_HANDLER=include/sparc-signal.h
    ;;
# ia64-*)
#    SYSDEP_SOURCES=sysdep/ia64.c
#    test -d sysdep || mkdir sysdep
#    ;;
 ia64-*-linux*)
    SIGNAL_HANDLER=include/dwarf2-signal.h
    ;;
 powerpc-*-linux*)
    SIGNAL_HANDLER=include/dwarf2-signal.h
    ;;
 alpha*-*-linux*)
    SIGNAL_HANDLER=include/dwarf2-signal.h
    ;;
 sparc*-*-linux*)
    SIGNAL_HANDLER=include/dwarf2-signal.h
    ;;
 *mingw*)
    SIGNAL_HANDLER=include/win32-signal.h
    ;;
 *)
    SIGNAL_HANDLER=include/default-signal.h
    ;;
esac

# If we're using sjlj exceptions, forget what we just learned.
if test "$enable_sjlj_exceptions" = yes; then
   SIGNAL_HANDLER=include/default-signal.h
fi

AC_SUBST(SYSDEP_SOURCES)

AC_LINK_FILES($SIGNAL_HANDLER, include/java-signal.h)

if test "${multilib}" = "yes"; then
  multilib_arg="--enable-multilib"
else
  multilib_arg=
fi

AC_PATH_XTRA

dnl Determine which AWT peer libraries to build
AC_ARG_ENABLE(java-awt,
[  --enable-java-awt       list of AWT peer implementations to be built])

peerlibs="`echo ${enable_java_awt} | tr ',' ' '`"
use_xlib_awt=""
use_gtk_awt=""

for peer in $peerlibs ; do
  case $peer in
    xlib)
      if [test "$no_x" = yes]; then
        echo "*** xlib peers requested but no X library available" 1>&2
        exit 1
      else
        use_xlib_awt="yes"
      fi
      ;;
    gtk)
      # Nothing, yet...
      ;;
    no)
      use_xlib_awt=
      use_gtk_awt=
      break
      ;;
    *)
      echo "*** unrecognised argument \"${peer}\" for --enable-java-awt" 1>&2
      exit 1
  esac
done

AM_CONDITIONAL(XLIB_AWT, test "$use_xlib_awt" = yes)
AM_CONDITIONAL(GTK_AWT, test "$use_gtk_awt" = yes)


here=`pwd`
AC_SUBST(here)

# We get this from the environment.
AC_SUBST(GCJFLAGS)

AC_OUTPUT(Makefile libgcj.spec libgcj-test.spec gnu/classpath/Configuration.java gcj/Makefile include/Makefile testsuite/Makefile,
[# Only add multilib support code if we just rebuilt top-level Makefile.
case " $CONFIG_FILES " in
 *" Makefile "*)
   LD="${ORIGINAL_LD_FOR_MULTILIBS}"
   ac_file=Makefile . ${libgcj_basedir}/../config-ml.in
   ;;
esac

# Make subdirectories and `.d' files.  Look in both srcdir and
# builddir for the .java files.
h=`pwd`
: > deps.mk
( (cd $srcdir && find . \( -name '*.java' -o -name '*.cc' \) -print) ;
  find . \( -name '*.java' -o -name '*.cc' \) -print) | \
   fgrep -v testsuite | \
   sed -e 's/\.java/.d/'\;'s/\.cc/.d/' | \
   while read f; do
      echo "include $f" >> deps.mk
      test -f $f || {
changequote(<<,>>)
	 d=`echo $f | sed -e 's,/[^/]*$,,'`
changequote([,])
	 if test ! -d $d; then
	   $libgcj_basedir/../mkinstalldirs $d
	 fi;
	 echo > $f
      }
   done
],
srcdir=${srcdir}
host=${host}
target=${target}
with_multisubdir=${with_multisubdir}
ac_configure_args="${multilib_arg} ${ac_configure_args}"
CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
libgcj_basedir=${libgcj_basedir}
CC="${CC}"
CXX="${CXX}"
)
