# Process this file with autoconf to produce a configure script.
#   Copyright (C) 1995, 1998, 1999 Free Software Foundation, Inc.
#   Contributed by Dave Love (d.love@dl.ac.uk).
#
#This file is part of the GNU Fortran libU77 library.
#
#This library is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2, or (at your option)
#any later version.
#
#GNU Fortran is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU Library General Public License for more details.
#
#You should have received a copy of the GNU Library General Public
#License along with GNU Fortran; see the file COPYING.  If not, write
#to Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307,
#USA.

AC_PREREQ(2.12.1)
AC_INIT(access_.c)
AC_CONFIG_HEADER(config.h:config.hin)

dnl Checks for programs.

dnl FIXME AC_PROG_CC wants CC to be able to link things, but it may
dnl not be able to.
define([AC_PROG_CC_WORKS],[])

# For g77 we'll set CC to point at the built gcc, but this will get it into
# the makefiles
AC_PROG_CC
dnl AC_C_CROSS
dnl Gives misleading `(cached)' message from the check.
if test "$CROSS";then
  ac_cv_c_cross=yes
else
  ac_cv_c_cross=no
fi

test "$AR" || AR=ar
AC_SUBST(AR)
AC_PROG_MAKE_SET

dnl This is only because we (horribly) punt the chmod job to the program at
dnl present.  Note that the result of this test could be wrong in the cross
dnl case.
AC_PATH_PROG(ac_cv_prog_chmod, chmod, no)
if test "$ac_cv_prog_chmod" != no || test "$CROSS"; then
  MAYBES=chmod_.o
  AC_DEFINE_UNQUOTED(CHMOD_PATH,"$ac_cv_prog_chmod")
else
  MAYBES=""
fi

dnl Checks for header files.
AC_HEADER_STDC
dnl We could do this if we didn't know we were using gcc
dnl AC_MSG_CHECKING(for prototype-savvy compiler)
dnl AC_CACHE_VAL(ac_cv_sys_proto,                
dnl   [AC_TRY_LINK(,                             
dnl dnl looks screwy because TRY_LINK expects a function body
dnl    [return 0;} int foo (int * bar) {],       
dnl    ac_cv_sys_proto=yes,                      
dnl    [ac_cv_sys_proto=no                       
dnl     AC_DEFINE(KR_headers)])])                
dnl AC_MSG_RESULT($ac_cv_sys_proto)              

AC_HEADER_TIME
AC_CHECK_HEADERS(limits.h unistd.h sys/time.h string.h stdlib.h \
  sys/param.h sys/times.h)

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
AC_TYPE_MODE_T

AC_TYPE_PID_T
dnl The next 3 demand a dummy fileblocks.o (added to LIBOJS).  We don't use
dnl LIBOJS, though.
AC_STRUCT_ST_BLKSIZE
AC_STRUCT_ST_BLOCKS
AC_STRUCT_ST_RDEV
AC_STRUCT_TM

dnl Some systems (SVR4, SCO OpenServer) need -lsocket for gethostname()
AC_CHECK_LIB(socket, gethostname, [LIBS="$LIBS -lsocket"])

dnl Checks for library functions.

AC_CHECK_FUNCS(symlink getcwd getwd lstat gethostname strerror clock \
  getrusage times alarm getlogin getgid getuid kill link ttyname)

dnl The standard autoconf HAVE_STRUCT_TIMEZONE doesn't actually check
dnl for struct timezone, as you might think.  We also need to check how
dnl to call gettimeofday if we have it.
LIBU77_GETTIMEOFDAY

test $ac_cv_func_symlink = yes && MAYBES="$MAYBES symlnk_.o"
test $ac_cv_func_lstat = yes && MAYBES="$MAYBES lstat_.o"
test $ac_cv_func_gethostname = yes && MAYBES="$MAYBES hostnm_.o"
test $ac_cv_func_clock = yes && MAYBES="$MAYBES mclock_.o"
AC_SUBST(MAYBES)

AC_SUBST(CROSS)
AC_SUBST(RANLIB)
AC_SUBST(RANLIB_TEST)
AC_OUTPUT(Makefile)
