dnl Process this file with autoconf to produce a configure script.
AC_REVISION([$Id$])
AC_PREREQ(2.13)dnl		dnl Minimum Autoconf version required.
AC_INIT(vpath.c)dnl		dnl A distinctive file to look for in srcdir.

AM_INIT_AUTOMAKE(make, 3.77.90)
AM_CONFIG_HEADER(config.h)

dnl Regular configure stuff

AC_PROG_MAKE_SET
AC_PROG_CC
AC_PROG_INSTALL
AC_CHECK_PROG(AR, ar, ar, ar)
AC_PROG_RANLIB
AC_PROG_CPP			dnl Later checks need this.
AC_AIX
AC_ISC_POSIX
AC_MINIX

dnl This test must come as early as possible after the compiler configuration
dnl tests, because the choice of the file model can (in principle) affect
dnl whether functions and headers are available, whether they work, etc.
AC_LFS

AC_HEADER_STDC
AC_HEADER_DIRENT
AC_TYPE_UID_T			dnl Also does gid_t.
AC_TYPE_PID_T
AC_TYPE_SIGNAL
AC_CHECK_HEADERS(stdlib.h unistd.h limits.h sys/param.h fcntl.h string.h \
		 memory.h sys/timeb.h)
AC_PROG_CC_C_O
AC_C_CONST			dnl getopt needs this.
AC_HEADER_STAT

AC_STRUCT_ST_MTIM_NSEC
jm_AC_TYPE_UINTMAX_T

AC_SUBST(LIBOBJS)

AC_DEFUN(AC_CHECK_SYMBOL, [dnl
AC_MSG_CHECKING(for $1)
AC_CACHE_VAL(ac_cv_check_symbol_$1, [dnl
AC_TRY_LINK(, [extern char *sys_siglist[]; puts(*sys_siglist);],
	    ac_cv_check_symbol_$1=yes, ac_cv_check_symbol_$1=no)])
if test "$ac_cv_check_symbol_$1" = yes; then
changequote(,)dnl
  ac_tr_symbol=`echo $1 | tr '[a-z]' '[A-Z]'`
changequote([,])dnl
  AC_DEFINE_UNQUOTED(HAVE_${ac_tr_symbol})
fi
AC_MSG_RESULT($ac_cv_check_symbol_$1)])dnl

# clock_gettime is in -lposix4 in Solaris 2.6.
AC_CHECK_LIB(posix4, clock_gettime)

AC_CHECK_FUNCS(memmove strdup psignal mktemp pstat_getdynamic \
	       clock_gettime dup2 getcwd sigsetmask getgroups setlinebuf \
	       seteuid setegid setreuid setregid strerror strsignal pipe)
AC_CHECK_SYMBOL(sys_siglist)
AC_FUNC_ALLOCA
AC_FUNC_VFORK
AC_FUNC_VPRINTF
AC_FUNC_STRCOLL
AC_FUNC_CLOSEDIR_VOID
AC_FUNC_SETVBUF_REVERSED
AC_FUNC_GETLOADAVG
AC_FUNC_SELECT
AC_CHECK_LIB(kstat, kstat_open)

# Check out the wait reality.
AC_CHECK_HEADERS(sys/wait.h)
AC_CHECK_FUNCS(waitpid wait3)
AC_MSG_CHECKING(for union wait)
AC_CACHE_VAL(make_cv_union_wait, [dnl
AC_TRY_LINK([#include <sys/types.h>
#include <sys/wait.h>],
	    [union wait status; int pid; pid = wait (&status);
#ifdef WEXITSTATUS
/* Some POSIXoid systems have both the new-style macros and the old
   union wait type, and they do not work together.  If union wait
   conflicts with WEXITSTATUS et al, we don't want to use it at all.  */
if (WEXITSTATUS (status) != 0) pid = -1;
#ifdef WTERMSIG
/* If we have WEXITSTATUS and WTERMSIG, just use them on ints.  */
-- blow chunks here --
#endif
#endif
#ifdef HAVE_WAITPID
/* Make sure union wait works with waitpid.  */
pid = waitpid (-1, &status, 0);
#endif
],
	    [make_cv_union_wait=yes], [make_cv_union_wait=no])])
if test "$make_cv_union_wait" = yes; then
  AC_DEFINE(HAVE_UNION_WAIT)
fi
AC_MSG_RESULT($make_cv_union_wait)

AC_DECL_SYS_SIGLIST

# The presence of the following is not meant to imply
# that make necessarily works on those systems.
AC_CHECK_LIB(sun, getpwnam)

AC_SUBST(REMOTE) REMOTE=stub
make_try_customs=no
AC_ARG_WITH(customs,
[  --with-customs=DIR      Enable remote jobs via Customs--see README.customs],
[case "$withval" in
  n|no) ;;
  *) make_cppflags="$CPPFLAGS"
     case "$withval" in
       y|ye|yes) ;;
       *) CPPFLAGS="$CPPFLAGS -I$with_customs/include/customs"
	  make_ldflags="$LDFLAGS -L$with_customs/lib" ;;
     esac
     CF_NETLIBS
     AC_CHECK_HEADER(customs.h,
	             REMOTE=cstms
                       LIBS="$LIBS -lcustoms" LDFLAGS="$make_ldflags",
		     with_customs=no
                       CPPFLAGS="$make_cppflags" make_badcust=yes)
     ;;
esac])

dnl See if we can handle the job server feature, and if the user wants it.

AC_ARG_ENABLE(job-server,
  [  --disable-job-server    Disallow recursive make communication during -jN],
  [make_cv_job_server="$enableval"],
  [make_cv_job_server="yes"])

case "$ac_cv_func_pipe $make_cv_job_server" in
  "yes yes") AC_DEFINE(MAKE_JOBSERVER) ;;
esac

dnl Allow building with dmalloc

AC_ARG_ENABLE(dmalloc,
  [  --enable-dmalloc        Enable support for the dmalloc debugging library],
  [make_cv_dmalloc="$enableval"],
  [make_cv_dmalloc="no"])

case "$make_cv_dmalloc" in
  yes) AC_CHECK_HEADERS(dmalloc.h)
       AC_CHECK_LIB(dmalloc, dmalloc_shutdown)
       CPPFLAGS="$CPPFLAGS -DDMALLOC_FUNC_CHECK" ;;
esac

AC_CACHE_CHECK(for location of SCCS get command, make_cv_path_sccs_get, [
if test -f /usr/sccs/get; then
  make_cv_path_sccs_get=/usr/sccs/get
else
  make_cv_path_sccs_get=get
fi])
AC_DEFINE_UNQUOTED(SCCS_GET,["$make_cv_path_sccs_get"])

ac_clean_files="$ac_clean_files s.conftest conftoast" # Remove these later.
if ( /usr/sccs/admin -n s.conftest || admin -n s.conftest ) >/dev/null 2>&1 &&
   test -f s.conftest; then
  # We successfully created an SCCS file.
  AC_CACHE_CHECK(if SCCS get command understands -G, make_cv_sys_get_minus_G, [
    if $make_cv_path_sccs_get -Gconftoast s.conftest >/dev/null 2>&1 &&
       test -f conftoast; then
       make_cv_sys_get_minus_G=yes
    else
       make_cv_sys_get_minus_G=no
    fi])
  case "$make_cv_sys_get_minus_G" in
    yes) AC_DEFINE(SCCS_GET_MINUS_G);;
  esac
fi
rm -f s.conftest conftoast

AC_MSG_CHECKING(if system libc has GNU glob)
AC_CACHE_VAL(make_cv_sys_gnu_glob, [
 AC_TRY_CPP([
#include <features.h>
#include <glob.h>
#include <fnmatch.h>

#define GLOB_INTERFACE_VERSION 1
#if defined _LIBC || !defined __GNU_LIBRARY__ || __GNU_LIBRARY__ <= 1
# error no gnu glob
#else
# include <gnu-versions.h>
# if _GNU_GLOB_INTERFACE_VERSION != GLOB_INTERFACE_VERSION
#  error no gnu glob
# endif
#endif
 ], make_cv_sys_gnu_glob=yes, make_cv_sys_gnu_glob=no)])
case "$make_cv_sys_gnu_glob" in
  yes) AC_MSG_RESULT(yes) ;;
  no)  AC_MSG_RESULT([no; using local copy])
       CPPFLAGS="$CPPFLAGS -I$srcdir/glob"
       AC_SUBST(GLOBLIB) GLOBLIB=glob/libglob.a
       ;;
esac


MAINT_MAKEFILE=/dev/null
if test -r $srcdir/maintMakefile; then
  MAINT_MAKEFILE="$srcdir/maintMakefile"
fi
AC_SUBST_FILE(MAINT_MAKEFILE)

dnl build.sh is also an AC_OUTPUT, but we can't specify it here because
dnl it's built from build.template and autoconf will crap out.  So, we
dnl build it in the makefiles themselves.

AC_OUTPUT(build.sh Makefile glob/Makefile)

case "$make_badcust" in
  yes) echo
       echo "WARNING: --with-customs specified but no customs.h could be found;"
       echo "         disabling Customs support."
       echo ;;
esac

case "$with_customs" in
  ""|n|no|y|ye|yes) ;;
  *) if test -f "$with_customs/lib/libcustoms.a"; then
       :
     else
       echo
       echo "WARNING: \`$with_customs/lib' does not appear to contain the"
       echo "         Customs library.  You must build and install Customs"
       echo "         before compiling GNU make."
       echo
     fi ;;
esac

case "$ac_cv_func_waitpid/$ac_cv_func_wait3" in
  no/no) echo
         echo "WARNING: Your system has neither waitpid() nor wait3()."
         echo "         Without one of these, signal handling is unreliable."
         echo "         You should be aware that running GNU make with -j"
         echo "         could result in erratic behavior."
         echo ;;
esac

dnl Local Variables:
dnl comment-start: "dnl "
dnl comment-end: ""
dnl comment-start-skip: "\\bdnl\\b\\s *"
dnl compile-command: "make configure config.h.in"
dnl End:
