# Process this file with autoconf to produce a configure script.
#   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
#   Contributed by Dave Love (d.love@dl.ac.uk).
#
#This file is part of GNU Fortran.
#
#GNU Fortran 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 General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with GNU Fortran; see the file COPYING.  If not, write to
#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#02111-1307, USA.

AC_INIT(libF77/Version.c)

AC_REVISION(1.10)

dnl Checks for programs.
# 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

dnl These should be inherited in the recursive make, but ensure they are
dnl defined:
test "$AR" || AR=ar
AC_SUBST(AR)
if test "$RANLIB"; then :
  AC_SUBST(RANLIB)
dnl Make sure that RANLIB_TEST is set also.
  if test -z "$RANLIB_TEST"; then
    RANLIB_TEST=true
  fi
else
  RANLIB_TEST=true
  AC_PROG_RANLIB
fi
AC_SUBST(RANLIB_TEST)

dnl not needed for g77?
dnl AC_PROG_MAKE_SET

dnl Checks for libraries.

dnl Checks for header files.
# Sanity check for the cross-compilation case:
AC_CHECK_HEADER(stdio.h,:,
  [AC_MSG_ERROR([Can't find stdio.h.
You must have a usable C system for the target already installed, at least
including headers and, preferably, the library, before you can configure
the G77 runtime system.  If necessary, install gcc now with \`LANGUAGES=c',
then the target library, then build with \`LANGUAGES=f77'.])])

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(g77_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    g77_cv_sys_proto=yes,                      
dnl    [g77_cv_sys_proto=no                       
dnl     AC_DEFINE(KR_headers)])])                
dnl AC_MSG_RESULT($g77_cv_sys_proto)              

dnl for U77
dnl AC_CHECK_HEADERS(unistd.h)

AC_MSG_CHECKING(for posix)
AC_CACHE_VAL(g77_cv_header_posix,
  AC_EGREP_CPP(yes,
  [#include <sys/types.h>
#include <unistd.h>
#ifdef _POSIX_VERSION
  yes
#endif
], 
  g77_cv_header_posix=yes,
  g77_cv_header_posix=no))
AC_MSG_RESULT($g77_cv_header_posix)

# We can rely on the GNU library being posix-ish.  I guess checking the 
# header isn't actually like checking the functions, though...
AC_MSG_CHECKING(for GNU library)
AC_CACHE_VAL(g77_cv_lib_gnu,
  AC_EGREP_CPP(yes,
    [#include <stdio.h>
#ifdef __GNU_LIBRARY__
  yes
#endif
], 
  g77_cv_lib_gnu=yes, g77_cv_lib_gnu=no))
AC_MSG_RESULT($g77_cv_lib_gnu)

# Apparently cygwin needs to be special-cased.
AC_MSG_CHECKING([for cyg\`win'32])
AC_CACHE_VAL(g77_cv_sys_cygwin32,
  AC_EGREP_CPP(yes,
  [#ifdef __CYGWIN32__
  yes
#endif
],
  g77_cv_sys_cygwin32=yes,
  g77_cv_sys_cygwin32=no))
AC_MSG_RESULT($g77_cv_sys_cygwin32)

AC_CHECK_HEADER(fcntl.h,
   test $g77_cv_header_posix = yes && AC_DEFINE(_POSIX_SOURCE),
   AC_DEFINE(NO_FCNTL) AC_DEFINE(OPEN_DECL))

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

dnl Checks for library functions.
AC_TYPE_SIGNAL
# we'll get atexit by default
if test $ac_cv_header_stdc != yes; then
AC_CHECK_FUNC(atexit,
  AC_DEFINE(onexit,atexit),dnl just in case
  [AC_DEFINE(NO_ONEXIT)
  AC_CHECK_FUNC(onexit,,
    [AC_CHECK_FUNC(on_exit,
     AC_DEFINE(onexit,on_exit),)])])
else true
fi

# This should always succeed on unix.
# Apparently positive result on cygwin loses re. NON_UNIX_STDIO
# (as of cygwin b18).
AC_CHECK_FUNC(fstat)
AC_MSG_CHECKING([need for NON_UNIX_STDIO])
if test $g77_cv_sys_cygwin32 = yes || test $ac_cv_func_fstat = no; then
  AC_MSG_RESULT(yes)
  AC_DEFINE(NON_UNIX_STDIO)
else
  AC_MSG_RESULT(no)
fi

# This is necessary for e.g. Linux:
AC_MSG_CHECKING([for necessary members of struct FILE])
AC_CACHE_VAL(g77_cv_struct_FILE,
[AC_TRY_COMPILE([#include <stdio.h>],
  [FILE s; s._ptr; s._base; s._flag;],g77_cv_struct_FILE=yes,
  g77_cv_struct_FILE=no)])dnl
AC_MSG_RESULT($g77_cv_struct_FILE)
if test $g77_cv_struct_FILE = no; then
  AC_DEFINE(MISSING_FILE_ELEMS)
fi

dnl perhaps should check also for remainder
dnl Unfortunately, the message implies we're just checking for -lm...
AC_CHECK_LIB(m,drem,AC_DEFINE(IEEE_drem))

dnl for U77:
dnl AC_CHECK_FUNCS(symlink getcwd lstat)
dnl test $ac_cv_func_symlink = yes && SYMLNK=symlnk_.o
dnl test $ac_cv_func_lstat = yes && SYMLNK="$SYMLNK lstat_.o"
dnl AC_SUBST(SYMLNK)

# posix will guarantee the right behaviour for sprintf, else we can't be
# sure; HEADER_STDC wouldn't be the right check in sunos4, for instance.
# However, on my sunos4/gcc setup unistd.h leads us wrongly to believe
# we're posix-conformant, so always do the test.
AC_MSG_CHECKING(for ansi/posix sprintf result)
dnl This loses if included as an argument to AC_CACHE_VAL because the
dnl changequote doesn't take effect and the [] vanish.
dnl fixme: use cached value
AC_TRY_RUN(changequote(<<, >>)dnl
  <<#include <stdio.h>
    /* does sprintf return the number of chars transferred? */
    main () {char foo[2]; (sprintf(foo, "1") == 1) ? exit(0) : exit(1);}
>>changequote([, ]),
    g77_cv_sys_sprintf_ansi=yes,
    g77_cv_sys_sprintf_ansi=no,
    g77_cv_sys_sprintf_ansi=no)
AC_CACHE_VAL(g77_cv_sys_sprintf_ansi,
     g77_cv_sys_sprintf_ansi=$g77_cv_sys_sprintf_ansi)
dnl We get a misleading `(cached)' message...
if test $ac_cv_c_cross = no; then
  AC_MSG_RESULT($g77_cv_sys_sprintf_ansi)
else
  AC_MSG_RESULT([can't tell -- assuming no])
fi
# The cygwin patch takes steps to avoid defining USE_STRLEN here -- I don't
# understand why.
if test $g77_cv_sys_sprintf_ansi != yes; then 
  AC_DEFINE(USE_STRLEN)
fi

# define NON_ANSI_RW_MODES on unix (can't hurt)
AC_MSG_CHECKING(NON_ANSI_RW_MODES)
AC_EGREP_CPP(yes,
[#ifdef unix
  yes
#endif
#ifdef __unix
  yes
#endif
#ifdef __unix__
  yes
#endif
], is_unix=yes, is_unix=no)
if test $g77_cv_sys_cygwin32 = yes; then
  AC_MSG_RESULT(no)
else
  if test $is_unix = yes; then
    AC_DEFINE(NON_ANSI_RW_MODES)
    AC_MSG_RESULT(yes)
  else
    AC_MSG_RESULT(no)
  fi
fi

# We have to firkle with the info in hconfig.h to figure out suitable types
# (via com.h).  proj.h and com.h are in $srcdir/.., config.h which they need
# is in ../.. and the config files are in $srcdir/../../config.
AC_MSG_CHECKING(f2c integer type)
late_ac_cpp=$ac_cpp
ac_cpp="$late_ac_cpp -I$srcdir/.. -I../.. -I$srcdir/../.. -I$srcdir/../../config"
AC_CACHE_VAL(g77_cv_sys_f2cinteger,
AC_EGREP_CPP(F2C_INTEGER=long int,
[#include "proj.h"
#define FFECOM_DETERMINE_TYPES 1
#include "com.h"
#if FFECOM_f2cINTEGER == FFECOM_f2ccodeLONG
F2C_INTEGER=long int
#elif FFECOM_f2cINTEGER == FFECOM_f2ccodeINT
F2C_INTEGER=int
#else
#  error "Cannot find a suitable type for F2C_INTEGER"
#endif
],
 g77_cv_sys_f2cinteger="long int",)
if test "$g77_cv_sys_f2cinteger" = ""; then
  AC_EGREP_CPP(F2C_INTEGER=int,
[#include "proj.h"
#define FFECOM_DETERMINE_TYPES 1
#include "com.h"
#if FFECOM_f2cINTEGER == FFECOM_f2ccodeLONG
F2C_INTEGER=long int
#elif FFECOM_f2cINTEGER == FFECOM_f2ccodeINT
F2C_INTEGER=int
#else
#  error "Cannot find a suitable type for F2C_INTEGER"
#endif
],
   g77_cv_sys_f2cinteger=int,)
fi
if test "$g77_cv_sys_f2cinteger" = ""; then
  AC_MSG_RESULT("")
  AC_MSG_ERROR([Can't determine type for f2c integer; config.log may help.])
fi
)
AC_MSG_RESULT($g77_cv_sys_f2cinteger)
F2C_INTEGER=$g77_cv_sys_f2cinteger
ac_cpp=$late_ac_cpp
AC_SUBST(F2C_INTEGER)

AC_MSG_CHECKING(f2c long int type)
late_ac_cpp=$ac_cpp
ac_cpp="$late_ac_cpp -I$srcdir/.. -I../.. -I$srcdir/../.. -I$srcdir/../../config"
AC_CACHE_VAL(g77_cv_sys_f2clongint,
AC_EGREP_CPP(F2C_LONGINT=long int,
[#include "proj.h"
#define FFECOM_DETERMINE_TYPES 1
#include "com.h"
#if FFECOM_f2cLONGINT == FFECOM_f2ccodeLONG
F2C_LONGINT=long int
#elif FFECOM_f2cLONGINT == FFECOM_f2ccodeLONGLONG
F2C_LONGINT=long long int
#else
#  error "Cannot find a suitable type for F2C_LONGINT"
#endif
],
 g77_cv_sys_f2clongint="long int",)
if test "$g77_cv_sys_f2clongint" = ""; then
  AC_EGREP_CPP(F2C_LONGINT=long long int,
[#include "proj.h"
#define FFECOM_DETERMINE_TYPES 1
#include "com.h"
#if FFECOM_f2cLONGINT == FFECOM_f2ccodeLONG
F2C_LONGINT=long int
#elif FFECOM_f2cLONGINT == FFECOM_f2ccodeLONGLONG
F2C_LONGINT=long long int
#else
#  error "Cannot find a suitable type for F2C_LONGINT"
#endif
],
   g77_cv_sys_f2clongint="long long int",)
fi
if test "$g77_cv_sys_f2clongint" = ""; then
  AC_MSG_RESULT("")
  AC_MSG_ERROR([Can't determine type for f2c long int; config.log may help.])
fi
)
AC_MSG_RESULT($g77_cv_sys_f2clongint)
F2C_LONGINT=$g77_cv_sys_f2clongint
ac_cpp=$late_ac_cpp
AC_SUBST(F2C_LONGINT)

dnl maybe check for drem/remainder

AC_SUBST(CROSS)


# This EOF_CHAR is a misfeature on unix.
AC_DEFINE(NO_EOF_CHAR_CHECK)

AC_DEFINE(Skip_f2c_Undefs)

dnl Craig had these in f2c.h, but they're only relevant for building libf2c
dnl anyway.

dnl   For GNU Fortran (g77), we always enable the following behaviors for
dnl   libf2c, to make things easy on the programmer.  The alternate
dnl   behaviors have their uses, and g77 might provide them as compiler,
dnl   rather than library, options, so only a single copy of a shared libf2c
dnl   need be built for a system.

dnl   This makes unformatted I/O more consistent in relation to other
dnl   systems.  It is not required by the F77 standard.

AC_DEFINE(Pad_UDread)

dnl   This makes ERR= and IOSTAT= returns work properly in disk-full
dnl   situations, making things work more as expected.  It slows things
dnl   down, so g77 will probably someday choose the original implementation
dnl   on a case-by-case basis when it can be shown to not be necessary
dnl   (e.g. no ERR= or IOSTAT=) or when it is given the appropriate
dnl   compile-time option or, perhaps, source-code directive.

dnl AC_DEFINE(ALWAYS_FLUSH)

dnl   Most Fortran implementations do this, so to make it easier
dnl   to compare the output of g77-compiled programs to those compiled
dnl   by most other compilers, tell libf2c to put leading zeros in
dnl   appropriate places on output

AC_DEFINE(WANT_LEAD_0)

# avoid confusion in case the `makefile's from the f2c distribution have
# got put here
test -f libF77/makefile && mv libF77/makefile  libF77/makefile.ori
test -f libI77/makefile && mv libI77/makefile  libI77/makefile.ori
test -f libU77/makefile && mv libU77/makefile  libU77/makefile.ori

AC_OUTPUT(Makefile ../../include/f2c.h:f2c.h.in libI77/Makefile libF77/Makefile libU77/Makefile)

dnl We might have configuration options to:
dnl * allow non-standard string concatenation (use libF77 s_catow.o,
dnl   not s_cat.o)
dnl * change unit preconnexion in libI77/err.c (f_init.c)
dnl * -DALWAYS_FLUSH in libI77
dnl * -DOMIT_BLANK_CC in libI77

dnl Local Variables:
dnl comment-start: "dnl "
dnl comment-end: ""
dnl comment-start-skip: "\\bdnl\\b\\s *"
dnl End:
