view configure.in @ 832:3984a1e61ebc

[project @ 1994-10-19 04:34:56 by jwe]
author jwe
date Wed, 19 Oct 1994 04:36:12 +0000
parents 0e9df7d20066
children 44ce29d8cb7b
line wrap: on
line source

dnl configure.in
dnl
dnl Process this file with autoconf to produce a configure script.
dnl Requires GNU autoconf 1.8 or later.
dnl
dnl Copyright (C) 1992, 1993, 1994 John W. Eaton
dnl 
dnl This file is part of Octave.
dnl 
dnl Octave is free software; you can redistribute it and/or modify it
dnl under the terms of the GNU General Public License as published by the
dnl Free Software Foundation; either version 2, or (at your option) any
dnl later version.
dnl 
dnl Octave is distributed in the hope that it will be useful, but WITHOUT
dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
dnl for more details.
dnl 
dnl You should have received a copy of the GNU General Public License
dnl along with Octave; see the file COPYING.  If not, write to the Free
dnl Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
dnl
AC_REVISION($Revision: 1.63 $)dnl
AC_PREREQ(1.122)
AC_INIT(src/octave.cc)
AC_CONFIG_HEADER(config.h kpathsea/c-auto.h)
dnl
AC_DEFINE(OCTAVE_SOURCE, 1)dnl
dnl
dnl See if we were given the target host type.  If not, use
dnl config.guess to try to guess the target host type.
dnl
if test $# -gt 0; then
  TARGET=`eval echo $\{\`echo $#\`\}`
  case $TARGET in
    -*)
      target_host_type=
    ;;
    *)
      target_host_type=$TARGET
    ;;
  esac
fi
dnl
if test -z "$target_host_type" -o "$target_host_type" = unknown; then
  target_host_type=`sh $srcdir/config.guess`
  if test -z "$target_host_type"; then
    AC_MSG_WARN([unable to guess system type])
    target_host_type=unknown
  fi
fi
dnl
dnl Use config.sub to come up with a standard vendor-host-os triple.
dnl
canonical_host_type=`sh $srcdir/config.sub $target_host_type 2>&1`
status=$?
if test $status -eq 0; then
  echo "configuring Octave for a $target_host_type"
else
  canonical_host_type=unknown
  AC_MSG_WARN([configuring Octave for an unknown system type])
fi
AC_SUBST(target_host_type)dnl
AC_MSG_RESULT([target_host_type is $target_host_type])
AC_MSG_RESULT([canonical_host_type is $canonical_host_type])
dnl
dnl Allow the user to force us to use f2c.
dnl
AC_ARG_WITH(f2c,
  [  --with-f2c              use f2c even if Fortran compiler is available],
  use_f2c=true, use_f2c=false)dnl
dnl
dnl Allow the user to experiment with dynamic linking using GNU dld.
dnl
AC_ARG_ENABLE(dld,
  [  --enable-dld            use DLD for dynamic linking (not all systems)],
  use_dld=true, use_dld=false)dnl
AC_SUBST(use_dld)dnl
dnl
dnl Allow compilation of smaller kernel.  This only works if some form
dnl of dynamic linking is also supported and used.
dnl
AC_ARG_ENABLE(lite-kernel,
  [  --enable-lite-kernel    compile smaller kernel (requires DLD)],
  lite_kernel=true, lite_kernel=false)dnl
if $lite_kernel; then
  AC_DEFINE(OCTAVE_LITE, 1)dnl
fi
AC_SUBST(lite_kernel)dnl
dnl
dnl some defaults
dnl
exec_prefix='$(prefix)'
bindir='$(exec_prefix)/bin'
datadir='$(prefix)/lib'
libdir='$(exec_prefix)/lib'
includedir='$(prefix)/include/octave'
mandir='$(prefix)/man/man1'
infodir='$(prefix)/info'
fcnfiledir='$(datadir)/octave/$(version)/m'
localfcnfiledir='$(datadir)/octave/site/m'
localfcnfilepath='$(localfcnfiledir)//'
archlibdir='$(libdir)/octave/$(version)/exec/$(target_host_type)'
octfiledir='$(libdir)/octave/$(version)/oct/$(target_host_type)'
localoctfiledir='$(datadir)/octave/site/oct/$(target_host_type)'
localoctfilepath='$(localoctfiledir)//'
fcnfilepath='.:$(localoctfilepath):$(localfcnfilepath):$(octfiledir)//:$(fcnfiledir)//'
imagedir='$(datadir)/octave/$(version)/imagelib'
imagepath='.:$(imagedir)//'
dnl
AC_MSG_RESULT([defining prefix to be $prefix])
AC_MSG_RESULT([defining exec_prefix to be $exec_prefix])
AC_MSG_RESULT([defining bindir to be $bindir])
AC_MSG_RESULT([defining datadir to be $datadir])
AC_MSG_RESULT([defining libdir to be $libdir])
AC_MSG_RESULT([defining includedir to be $includedir])
AC_MSG_RESULT([defining mandir to be $mandir])
AC_MSG_RESULT([defining infodir to be $infodir])
AC_MSG_RESULT([defining fcnfiledir to be $fcnfiledir])
AC_MSG_RESULT([defining localfcnfiledir to be $localfcnfiledir])
AC_MSG_RESULT([defining localfcnfilepath to be $localfcnfilepath])
AC_MSG_RESULT([defining archlibdir to be $archlibdir])
AC_MSG_RESULT([defining octfiledir to be $octfiledir])
AC_MSG_RESULT([defining localoctfiledir to be $localoctfiledir])
AC_MSG_RESULT([defining localoctfilepath to be $localoctfilepath])
AC_MSG_RESULT([defining fcnfilepath to be $fcnfilepath])
AC_MSG_RESULT([defining imagedir to be $imagedir])
AC_MSG_RESULT([defining imagepath to be $imagepath])
AC_SUBST(exec_prefix)
AC_SUBST(bindir)
AC_SUBST(datadir)
AC_SUBST(libdir)
AC_SUBST(includedir)
AC_SUBST(mandir)
AC_SUBST(infodir)
AC_SUBST(fcnfiledir)
AC_SUBST(localfcnfiledir)
AC_SUBST(localfcnfilepath)
AC_SUBST(archlibdir)
AC_SUBST(octfiledir)
AC_SUBST(localoctfiledir)
AC_SUBST(localoctfilepath)
AC_SUBST(fcnfilepath)
AC_SUBST(imagedir)
AC_SUBST(imagepath)
dnl
dnl Do special stuff if using dld.
dnl
DLD_DIR=
LIBDLD=
LIBOCTDLD='liboctdld.a'
LD_STATIC_FLAG=
if $use_dld; then
  DLD_DIR=dld
  LIBDLD='../dld/libdld.a'
# don't link them in only if doing dynamic linking and small kernel
# requested.
  if $lite_kernel; then
    LIBOCTDLD=
  fi
  LD_STATIC_FLAG=-static
  AC_DEFINE(WITH_DLD, 1)dnl
fi
dnl
dnl Also use -static if compiling on Alpha OSF/1 1.3 systems.
dnl
case "$canonical_host_type" in
  alpha-dec-osf1.3)
    LD_STATIC_FLAG=-static
  ;;
esac
dnl
if test -n "$DLD_DIR"; then
  AC_MSG_RESULT([defining DLD_DIR to be $DLD_DIR])
fi
if test -n "$LIBDLD"; then
  AC_MSG_RESULT([defining LIBDLD to be $LIBDLD])
fi
if test -n "$LIBOCTDLD"; then
  AC_MSG_RESULT([defining LIBOCTDLD to be $LIBOCTDLD])
fi
if test -n "$LD_STATIC_FLAG"; then
  AC_MSG_RESULT([defining LD_STATIC_FLAG to be $LD_STATIC_FLAG])
fi
AC_SUBST(DLD_DIR)dnl
AC_SUBST(LIBDLD)dnl
AC_SUBST(LIBOCTDLD)dnl
AC_SUBST(LD_STATIC_FLAG)dnl
dnl
dnl See if the optional nonlinear programming code is present.
dnl
AC_MSG_CHECKING([for npsol])
if test -f $srcdir/libcruft/npsol/npsol.f; then
  AC_MSG_RESULT([yes])
else
  AC_MSG_RESULT([no])
  AC_DEFINE(NPSOL_MISSING, 1)dnl
fi
dnl
AC_MSG_CHECKING([for qpsol])
if test -f $srcdir/libcruft/qpsol/qpsol.f; then
  AC_MSG_RESULT([yes])
else
  AC_MSG_RESULT([no])
  AC_DEFINE(QPSOL_MISSING, 1)dnl
fi
dnl
AC_MSG_CHECKING([for fsqp])
if test -f $srcdir/libcruft/fsqp/fsqpd.f; then
  AC_MSG_RESULT([yes])
else
  AC_MSG_RESULT([no])
  AC_DEFINE(FSQP_MISSING, 1)dnl
fi
dnl
dnl See which C++ compiler to use (we expect to find g++).
dnl
AC_PROG_CXX
AC_PROG_CXXCPP
dnl
dnl Do special things for g++.
dnl
ADD_CXX_WALL=false
NO_IMPLICIT_TEMPLATES=
gxx_version=`$CXX -v 2>&1 | grep "^g.. version" | sed 's/^g.. version *//'`
case "$gxx_version" in
changequote(,)dnl
  2.[6789].*|2.[123456789][0123456789].*)
changequote([,])dnl
    CXXFLAGS="-g -O"
    AC_MSG_RESULT([defining CXXFLAGS to be $CXXFLAGS])
    NO_IMPLICIT_TEMPLATES="-fno-implicit-templates"
    AC_MSG_RESULT([defining NO_IMPLICIT_TEMPLATES to be $NO_IMPLICIT_TEMPLATES])
    ADD_CXX_WALL=true
  ;;
changequote(,)dnl
  1.*|2.[012345].*)
changequote([,])dnl
    AC_MSG_WARN([g++ version $gxx_version will not work to compile Octave])
  ;;
  *)
    AC_MSG_WARN([Octave has only been tested with g++, and I can't find it])
  ;;
esac
dnl
dnl See what libraries are used by the C++ compiler.  Need this for
dnl dynamic linking.
dnl
CXXLIBS=`sh $srcdir/cxxlibs.sh`
AC_MSG_RESULT([defining CXXLIBS to be $CXXLIBS])
dnl
AC_SUBST(CXXFLAGS)dnl
AC_SUBST(NO_IMPLICIT_TEMPLATES)dnl
AC_SUBST(CXXLIBS)dnl
dnl
dnl See which C compiler to use (we expect to find gcc).
dnl
AC_PROG_CC
AC_PROG_CPP
AC_PROG_GCC_TRADITIONAL
dnl
dnl Do special things for gcc.
dnl
ADD_CC_WALL=false
gcc_version=`$CC -v 2>&1 | grep "^gcc version" | sed 's/^gcc version *//'`
case "$gcc_version" in
  2.*)
    CFLAGS="-g -O"
    AC_MSG_RESULT([defining CFLAGS to be $CFLAGS])
    LDFLAGS="-g"
    AC_MSG_RESULT([defining LDFLAGS to be $LDFLAGS])
    ADD_CC_WALL=true
  ;;
  1.*)
    AC_MSG_WARN([gcc version $gcc_version is likely to cause problems])
  ;;
  *)
    AC_MSG_WARN([Octave has only been tested with gcc, and I can't find it])
  ;;
esac
dnl
AC_SUBST(CFLAGS)dnl
AC_SUBST(LDFLAGS)dnl
dnl
dnl On Linux systems we need to compile with -mieee-fp to get full
dnl support for IEEE floating point.
dnl
case "$canonical_host_type" in
  i386-*-linux | i486-*-linux | i586-*-linux)
    GCC_IEEE_FP_FLAG="-mieee-fp"
    AC_MSG_RESULT([defining GCC_IEEE_FP_FLAG to be $GCC_IEEE_FP_FLAG])
  ;;
esac
dnl
AC_SUBST(GCC_IEEE_FP_FLAG)dnl
dnl
dnl Special checks for odd OS specific things.
dnl
AC_ISC_POSIX
AC_MINIX
AC_AIX
AC_FUNC_STRFTIME
AC_CHECK_LIB(sun, getpwnam)
dnl
dnl How big are ints and how are they oriented?  These could probably
dnl be eliminated in favor of run-time checks.
dnl
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_C_BIGENDIAN
dnl
dnl Try to determine the floating point format.  This could probably
dnl be eliminated in favor of run-time checks.
dnl
AC_MSG_CHECKING([floating point format])
changequote(,)dnl
XCFLAGS=`echo $CFLAGS | sed 's/-O[^ \t]*//'`
changequote([,])dnl
${CC-cc} -DDP $XCFLAGS $LDFLAGS $srcdir/float-type.c -o conftest >/dev/null 2>&1
FLOAT_FORMAT=`./conftest`
case "$FLOAT_FORMAT" in
  IEEE_BIG_ENDIAN)
    AC_MSG_RESULT([IEEE big endian])
    AC_DEFINE(IEEE_BIG_ENDIAN, 1)dnl
  ;;
  IEEE_LITTLE_ENDIAN)
    AC_MSG_RESULT([IEEE little endian])
    AC_DEFINE(IEEE_LITTLE_ENDIAN, 1)dnl
  ;;
  VAX_D_FLOAT)
    AC_MSG_RESULT([VAX D floating])
    AC_DEFINE(VAX_D_FLOAT, 1)dnl
  ;;
  VAX_G_FLOAT)
    AC_MSG_RESULT([VAX G floating])
    AC_DEFINE(VAX_G_FLOAT, 1)dnl
  ;;
  *)
    AC_MSG_RESULT()
    AC_MSG_WARN("unrecognized floating point format!")
  ;;
esac
dnl
dnl Does the C compiler handle alloca() and const correctly?
dnl
AC_ALLOCA
dnl
dnl This one is for kpathsea.
dnl
dnl It would be nicer to test for the requisite putenv features directly,
dnl but can't figure out how to do that.
dnl
if test "`(uname) 2>/dev/null`" = NetBSD \
   || test "`(uname) 2>/dev/null`" = FreeBSD; then
  AC_DEFINE(SMART_PUTENV)
fi
dnl
AC_C_CONST
dnl
dnl If we haven't been forced to use f2c, try to find a Fortran compiler
dnl under any one of several common Un*x Fortran compiler names. 
dnl Put fc last to avoid confusion with some vendor's /bin/sh fc
dnl builtin.
dnl
dnl    xlf : IBM / AIX
dnl   cf77 : Cray / Unicos
dnl    g77 : GNU Fortran (someday...)
dnl     fc : Convex
dnl
dnl I don't think the Cray compiler will ever work like f2c...
dnl
if $use_f2c; then
  true
else
  F77=
  AC_CHECK_PROGS(F77, xlf cf77 f77 g77 fc)dnl

  # If it looks like we have a Fortran compiler, try to determine
  # whether it might be compatible with f2c.

  if test -n "$F77"; then
    AC_MSG_CHECKING([$F77/f2c compatibility])
    export F77
    export CC
    tmpdef=`sh $srcdir/f2c-compat.sh $srcdir/flibs.sh`
    status=$?
    if test $status -eq 0; then
      AC_MSG_RESULT([yes])
      if test "$tmpdef" = '-DF77_APPEND_UNDERSCORE=1'; then
        AC_DEFINE(F77_APPEND_UNDERSCORE, 1)dnl
      fi
    else
      AC_MSG_RESULT([no])
      F77=
    fi
  fi
fi
dnl
dnl If we can't find a Fortran compiler, or if it looks like it isn't
dnl compatible with f2c, try to find f2c.
dnl
if test -z "$F77"; then
  AC_CHECK_PROG(F2C, f2c, f2c, [])dnl
fi
dnl
F2CFLAGS=
FFLAGS="-O"
AC_MSG_RESULT([defining FFLAGS to be $FFLAGS])
if test -n "$F77"; then
  export F77
  FLIBS=`sh $srcdir/flibs.sh`
  AC_MSG_RESULT([defining FLIBS to be $FLIBS])
  DOT_O_DOT_F_C1=
  DOT_O_DOT_F_C2=
  DOT_O_DOT_F_C3=
  DOT_O_DOT_F_C4=
  DEFAULT_DOT_C_FROM_DOT_F=
  DEFAULT_DOT_O_FROM_DOT_F=
elif test -n "$F2C" || $use_f2c; then
  AC_CHECK_LIB(f2c, main, FLIBS=-lf2c, [])dnl
  if test -z "$FLIBS" ; then
    AC_CHECK_LIB(F77, main, FLIBS=-lF77, [])dnl
    if test -n "$FLIBS" ; then
      AC_CHECK_LIB(I77, main, FLIBS="$FLIBS -lI77", [])dnl
    fi
  fi
  if test -z "$FLIBS" ; then
    AC_MSG_WARN([I found f2c but not libf2c.a, or libF77.a and libI77.a])
  fi
DEFAULT_DOT_C_FROM_DOT_F='# A rule for making C source from Fortran source.\
# If we are using f2c we should also turn off the default rule for\
# making objects from .f files so that we do not invoke the fortran\
# compiler by mistake.\
\
\%.c : \%.f\
	cat $< | $(F2C) $(F2CFLAGS) > $(@F)'
  AC_MSG_RESULT([defining DEFAULT_DOT_C_FROM_DOT_F to be $DEFAULT_DOT_C_FROM_DOT_F])
  DEFAULT_DOT_O_FROM_DOT_F='\%.o : \%.f'
  AC_MSG_RESULT([defining DEFAULT_DOT_O_FROM_DOT_F to be $DEFAULT_DOT_O_FROM_DOT_F])
  AC_DEFINE(F77_APPEND_UNDERSCORE, 1)dnl
else
  AC_MSG_WARN([in order to build octave, you must have a compatible])
  AC_MSG_WARN([Fortran compiler or f2c installed and in your path.])
  AC_MSG_WARN([See the file INSTALL for more information.])
  AC_MSG_WARN([Continuing anyway...])
fi
dnl
AC_SUBST(F77)dnl
AC_SUBST(FFLAGS)dnl
AC_SUBST(FLIBS)dnl
AC_SUBST(F2C)dnl
AC_SUBST(F2CFLAGS)dnl
AC_SUBST(DEFAULT_DOT_C_FROM_DOT_F)dnl
AC_SUBST(DEFAULT_DOT_O_FROM_DOT_F)dnl
dnl
dnl Extract libraries and directories from FLIBS and CXXLIBS.
dnl
dnl Leave only libraries, with -lfoo converted to libfoo.a:
dnl
changequote(,)dnl
FLIB_LIST=`echo "$FLIBS" | sed -e 's/-Xlinker *[^ ]*//g' \
	-e 's/-L *[^ ]*//g' \
	-e 's/-l *\([^ ]*\)/lib\1.a/g' -e 's/-u *[^ ]*//g' \
	-e 's/^ *//' -e 's/ *$//' -e 's/  */:/g'`
dnl
CXXLIB_LIST=`echo "$CXXLIBS" | sed -e 's/-Xlinker *[^ ]*//g' \
	-e 's/-L *[^ ]*//g' \
	-e 's/-l *\([^ ]*\)/lib\1.a/g' -e 's/-u *[^ ]*//g' \
	-e 's/^ *//' -e 's/ *$//' -e 's/  */:/g'`
dnl
dnl Leave only directories where libraries might be found:
dnl
FLIB_PATH=`echo "$FLIBS" | sed -e 's/-Xlinker *[^ ]*//g' \
	-e 's/-L *\([^ ]*\)/\1/g' -e 's, /.*\.a , ,g' \
	-e 's/-l *[^ ]*//g' -e 's/-u *[^ ]*//g' -e 's/^ *//' \
	-e 's/ *$//' -e 's/  */:/g'`
dnl
CXXLIB_PATH=`echo "$CXXLIBS" | sed -e 's/-Xlinker *[^ ]*//g' \
	-e 's/-L *\([^ ]*\)/\1/g' -e 's, /.*\.a , ,g' \
	-e 's/-l *[^ ]*//g' -e 's/-u *[^ ]*//g' -e 's/^ *//' \
	-e 's/ *$//' -e 's/  */:/g'`
changequote([,])dnl
dnl
AC_MSG_RESULT([defining FLIB_LIST to be $FLIB_LIST])
AC_MSG_RESULT([defining FLIB_PATH to be $FLIB_PATH])
dnl
AC_MSG_RESULT([defining CXXLIB_LIST to be $CXXLIB_LIST])
AC_MSG_RESULT([defining CXXLIB_PATH to be $CXXLIB_PATH])
dnl
AC_SUBST(FLIB_LIST)dnl
AC_SUBST(FLIB_PATH)dnl
dnl
AC_SUBST(CXXLIB_LIST)dnl
AC_SUBST(CXXLIB_PATH)dnl
dnl
dnl Checks for header files.
dnl
AC_HEADER_STDC
AC_CHECK_HEADERS(assert.h float.h limits.h memory.h pwd.h stdlib.h)dnl
AC_CHECK_HEADERS(string.h varargs.h unistd.h floatingpoint.h)dnl
AC_CHECK_HEADERS(sys/utsname.h sys/time.h sys/fcntl.h)dnl
AC_CHECK_HEADERS(sys/ttold.h sys/ptem.h sys/select.h)dnl
AC_HEADER_DIRENT
AC_TIME_WITH_SYS_TIME
dnl
dnl Use sgtty on Ultrix so that using DEC Migrate to convert a Mips
dnl binary to an Alpha binary will work.  Also on Alpha/OSF to avoid
dnl a readline bug.
dnl
OCTAVE_HAVE_TERM_HEADER=false
case "$canonical_host_type" in
  mips-dec-ultrix* | alpha-dec-osf*)
    AC_CHECK_HEADER(sgtty.h, [AC_DEFINE(HAVE_SGTTY_H, 1)
      OCTAVE_HAVE_TERM_HEADER=true], [])
  ;;
esac
dnl
if $OCTAVE_HAVE_TERM_HEADER; then
  true
else
  AC_CHECK_HEADER(termios.h, [AC_DEFINE(HAVE_TERMIOS_H, 1)
    OCTAVE_HAVE_TERM_HEADER=true],
    AC_CHECK_HEADER(termio.h, [AC_DEFINE(HAVE_TERMIO_H, 1)
      OCTAVE_HAVE_TERM_HEADER=true],
      AC_CHECK_HEADER(sgtty.h, [AC_DEFINE(HAVE_SGTTY_H, 1)
	OCTAVE_HAVE_TERM_HEADER=true], [])))
fi
if $OCTAVE_HAVE_TERM_HEADER; then
  true
else
  AC_MSG_ERROR([I couldn't find termios.h, termio.h, or sgtty.h!])
fi
dnl
dnl Checks for functions.
dnl
AC_CHECK_FUNCS(setvbuf getcwd gethostname bzero rindex vfprintf vsprintf)dnl
AC_CHECK_FUNCS(stricmp strnicmp strcasecmp strncasecmp strerror)dnl
AC_CHECK_FUNCS(atexit on_exit tempnam memmove putenv gettimeofday)dnl
dnl
dnl Would like to get rid of this cruft, and just have
dnl
dnl   AC_CHECK_FUNCS(finite isnan isinf)
dnl
dnl instead, but that used to fail on some systems...
dnl
dnl Check to see if we have IEEE math functions, and if so, which ones.
dnl
dnl For Linux: add -mieee-fp flag to CFLAGS when checking for IEEE FP
dnl functions, otherwise we may not find them.
dnl
dnl Also just using AC_CHECK_FUNCS doesn't seem to work to find isinf
dnl and isnan on Linux systems, so we use AC_CHECK_FUNC, and if that
dnl fails, we try again by including math.h and invoking the function
dnl with an argument. 
dnl
dnl Also check for some additional trig functions that aren't ANSI but
dnl are often available.  If they are missing, we try to replace them
dnl with functions from the BSD/NET2 math library.
dnl
AC_CHECK_LIB(sunmath, main)dnl
AC_CHECK_LIB(m, main)dnl
dnl
XCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $GCC_IEEE_FP_FLAG"
dnl
AC_CHECK_FUNCS(finite isnan isinf infinity quiet_nan erf erfc lgamma)dnl
dnl
AC_MSG_CHECKING([for signgam declaration in math.h])
AC_TRY_LINK([#include <math.h>],
  [int foo = signgam + 1;],
  AC_MSG_RESULT(yes)
  AC_DEFINE(SIGNGAM_DECLARED, 1),
  AC_MSG_RESULT(no))dnl
dnl
CFLAGS="$XCFLAGS"
dnl
dnl Check for nonstandard but common trig functions that we need.
dnl If they are missing, we replace them using functions from the BSD
dnl math library, and we may need to replace some other functions too.
dnl
AC_REPLACE_FUNCS(acosh asinh atanh)
dnl
if test -n "$LIBOBJS"; then
  for func in $LIBOBJS
  do
    case "$func" in
      *acosh.o*)
	AC_DEFINE(ACOSH_MISSING, 1)dnl
      ;;
      *asinh.o*)
	AC_DEFINE(ASINH_MISSING, 1)dnl
      ;;
      *atanh.o*)
	AC_DEFINE(ATANH_MISSING, 1)dnl
      ;;
    esac
  done
  case $LIBOBJS in
    *acosh.o* | *asinh.o*)
      AC_REPLACE_FUNCS(copysign)
    ;;
  esac
  case $LIBOBJS in
    *acosh.o* | *asinh.o* | *atanh.o*)
      AC_REPLACE_FUNCS(log1p)
    ;;
  esac
  case $LIBOBJS in
    *log1p*)
      AC_REPLACE_FUNCS(log__L)
    ;;
  esac
  case $LIBOBJS in
    *log1p*)
      AC_REPLACE_FUNCS(finite)
    ;;
  esac
  case $LIBOBJS in
    *copysign* | *finite* | *log1p*)
      AC_REPLACE_FUNCS(logb scalb)
    ;;
  esac
fi
dnl
dnl Checks for OS specific cruft.
dnl
AC_STRUCT_TM
AC_FUNC_SETVBUF_REVERSED
TERMLIBS=""
for termlib in termcap terminfo curses termlib ; do
  AC_CHECK_LIB(${termlib}, main, [TERMLIBS="${TERMLIBS} -l${termlib}"])
  case "${TERMLIBS}" in
    *-l${termlib}*)
      AC_MSG_RESULT([defining TERMLIBS to be $TERMLIBS])
      break
    ;;
  esac
done
dnl
AC_MSG_CHECKING([for struct exception in math.h])
AC_TRY_LINK([#include <math.h>],
  [struct exception *x; x->type; x->name;],
  AC_MSG_RESULT(YES)
  AC_DEFINE(EXCEPTION_IN_MATH, 1),
  AC_MSG_RESULT(no))dnl
dnl
AC_SUBST(TERMLIBS)
dnl
dnl Define VOID_SIGHANDLER for readline.
dnl
AC_TYPE_SIGNAL
case "$RETSIGTYPE" in
  int)
  ;;
  *)
    VOID_SIGHANDLER="-DVOID_SIGHANDLER=1"
    AC_MSG_RESULT([defining VOID_SIGHANDLER to be 1])
  ;;
esac
AC_SUBST(VOID_SIGHANDLER)dnl
dnl
dnl Checks for other programs used for building, testing, installing,
dnl and running Octave.
dnl
dnl For now, don't define LEXLIB to be -lfl -- we don't use anything in
dnl it, and it might not be installed.
dnl
dnl Also make sure that we generate an interactive scanner if we are
dnl using flex.
dnl
AC_PROG_LEX
case "$LEX" in
  flex*)
    LFLAGS="-t -I"
    AC_MSG_RESULT([defining LFLAGS to be $LFLAGS])
    LEXLIB=
  ;;
  *)
    LFLAGS="-t"
    AC_MSG_RESULT([defining LFLAGS to be $LFLAGS])
    AC_MSG_WARN([I didn't find flex, but that's only a problem])
    AC_MSG_WARN([if you need to reconstruct lex.cc])
  ;;
esac
AC_SUBST(LFLAGS)dnl
dnl
AC_PROG_YACC
case "$YACC" in
  bison*)
  ;;
  *)
    AC_MSG_WARN([I didn't find bison, but that's only a problem])
    AC_MSG_WARN([if you need to reconstruct parse.cc])
  ;;
esac
dnl
AC_PROG_RANLIB
dnl
AC_CHECK_PROG(RUNTEST, runtest, runtest, [])dnl
AC_CHECK_PROG(EXPECT, expect, expect, [])dnl
if test -z "$EXPECT" ; then
  RUNTEST=
fi
AC_SUBST(RUNTEST)dnl
dnl
AC_PROG_INSTALL
dnl
AC_CHECK_PROG(GNUPLOT_BINARY, gnuplot, gnuplot, [])dnl
if test -z "$GNUPLOT_BINARY"; then
  AC_MSG_WARN([I didn't find gnuplot.  It isn't necessary to have gnuplot])
  AC_MSG_WARN([installed, but you won't be able to use any of Octave's])
  AC_MSG_WARN([plotting commands without it.])
  AC_MSG_WARN([])
  AC_MSG_WARN([If gnuplot is installed but it isn't in your path, you can])
  AC_MSG_WARN([tell Octave where to find it by typing the command])
  AC_MSG_WARN([])
  AC_MSG_WARN([gnuplot_binary = "/full/path/to/gnuplot/binary"])
  AC_MSG_WARN([])
  AC_MSG_WARN([at the Octave prompt.])
fi
dnl
AC_CHECK_PROGS(DEFAULT_PAGER, less more page pg, [])dnl
if test -z "$DEFAULT_PAGER"; then
  AC_MSG_WARN([I couldn't find `less', `more', `page', or `pg'])
elif test "$DEFAULT_PAGER" = less; then
  DEFAULT_PAGER="less -e"
  AC_MSG_RESULT([defining DEFAULT_PAGER to be $DEFAULT_PAGER])
fi
dnl
dnl Even though we include config.h in most files, some need to be
dnl compiled with the -D options on the compiler command line.  Use
dnl UGLY_DEFS for that.
dnl
AC_OUTPUT_MAKE_DEFS
UGLY_DEFS="$DEFS"
AC_MSG_RESULT([defining UGLY_DEFS to be $UGLY_DEFS])
AC_SUBST(UGLY_DEFS)dnl
dnl
dnl Maybe add -Wall to compiler flags now that we're done feature
dnl testing. 
dnl
dnl To get gcc and g++ to be really picky, try these adding these
dnl options to CFLAGS and CXXFLAGS along with -Wall:
dnl
dnl   -ansi
dnl   -pedantic
dnl   -Wwrite-strings
dnl   -Wid-clash-31
dnl   -Wpointer-arith
dnl   -Wcast-qual
dnl   -Wenum-clash
dnl   -Wcast-align
dnl   -Wtraditional
dnl   -Wstrict-prototypes
dnl   -Wmissing-prototypes
dnl   -Wnested-externs
dnl   -Woverloaded-virtual
dnl   -Winline
dnl   -felide-constructors
dnl   -fnonnull-objects
dnl
if $ADD_CXX_WALL; then
  CXXFLAGS="$CXXFLAGS -Wall"
  AC_MSG_RESULT([adding -Wall to CXXFLAGS])
fi
if $ADD_CC_WALL; then
  CFLAGS="$CFLAGS -Wall"
  AC_MSG_RESULT([adding -Wall to CFLAGS])
fi
dnl
dnl Do the substitutions in all the Makefiles.
dnl
define([tmpA], [Makefile Makeconf libcruft/Makefile libcruft/Makerules])dnl
define([tmpB], [liboctave/Makefile src/Makefile dld/Makefile])dnl
define([tmpC], [info/Makefile readline/Makefile readline/doc/Makefile])dnl
define([tmpD], [readline/examples/Makefile doc/Makefile])dnl
define([tmpE], [test/Makefile kpathsea/Makefile])dnl
define([srcdirs], [tmpA tmpB tmpC tmpD tmpE])dnl
dnl
define([tmpa], [libcruft/blas/Makefile libcruft/balgen/Makefile])dnl
define([tmpb], [libcruft/dassl/Makefile libcruft/eispack/Makefile])dnl
define([tmpc], [libcruft/fftpack/Makefile libcruft/fsqp/Makefile])dnl
define([tmpd], [libcruft/lapack/Makefile libcruft/linpack/Makefile])dnl
define([tmpe], [libcruft/minpack/Makefile libcruft/misc/Makefile])dnl
define([tmpf], [libcruft/npsol/Makefile libcruft/odepack/Makefile])dnl
define([tmpg], [libcruft/qpsol/Makefile libcruft/quadpack/Makefile])dnl
define([tmph], [libcruft/ranlib/Makefile libcruft/villad/Makefile])dnl 
dnl
define([cruftdirs], [tmpa tmpb tmpc tmpd tmpe tmpf tmpg tmph])dnl
define([tmpSA], [scripts/Makefile scripts/control/Makefile])dnl
define([tmpSB], [scripts/general/Makefile scripts/image/Makefile])dnl
define([tmpSC], [scripts/linear-algebra/Makefile])dnl
define([tmpSD], [scripts/miscellaneous/Makefile scripts/plot/Makefile])dnl
define([tmpSE], [scripts/polynomial/Makefile scripts/set/Makefile])dnl
define([tmpSF], [scripts/signal/Makefile scripts/special-matrix/Makefile])dnl
define([tmpSG], [scripts/startup/Makefile scripts/statistics/Makefile])dnl
define([tmpSH], [scripts/elfun/Makefile scripts/specfun/Makefile])dnl
define([scriptdirs], [tmpSA tmpSB tmpSC tmpSD tmpSE tmpSF tmpSG tmpSH])dnl
dnl
AC_OUTPUT([srcdirs cruftdirs scriptdirs])dnl