dnl Process this file with autoconf 1.8 or later to make a configure script.
AC_REVISION($Revision$)dnl
AC_PREREQ(1.8)dnl
AC_INIT(Include/object.h)
AC_CONFIG_HEADER(config.h)dnl
# Don't suppress compiler output when --verbose is specified
test -n "$verbose" &&
	ac_compile=`echo "$ac_compile" | sed "s|>/dev/null 2>&1||"`
AC_VERBOSE(setting ac_compile to '$ac_compile')

# checks for alternative programs
AC_CHECKING(for --with(out)-gcc)
AC_WITH(gcc, [
	case $withval in
	no)	withval=cc;;
	yes)	withval=gcc;;
	esac
	CC=$withval])
AC_PROG_CC
AC_PROG_RANLIB
AC_SUBST(AR)
AC_PROGRAMS_CHECK(AR, ar aal, ar)
AC_SUBST(INSTALL)
# Install just never works :-(
if test -z "$INSTALL"
then INSTALL=cp
fi
AC_SUBST(OPT)
# Optimizer/debugger flags passed between Makefiles
if test -z "$OPT"
then OPT=-O
fi

# checks for UNIX variants that set C preprocessor variables
AC_AIX
AC_ISC_POSIX
AC_MINIX
dnl DYNIX test runs compile so must be last
AC_DYNIX_SEQ
AC_CHECKING(for NeXT)
AC_TEST_PROGRAM([
#ifdef _NEXT_SOURCE
main() { exit(0); }
#endif
], AC_DEFINE(_POSIX_SOURCE))

# checks for header files
AC_STDC_HEADERS
AC_HAVE_HEADERS(dlfcn.h fcntl.h limits.h signal.h stdarg.h stdlib.h thread.h unistd.h utime.h sys/audioio.h sys/param.h sys/select.h sys/time.h sys/times.h sys/un.h sys/utsname.h)
AC_DIR_HEADER

# checks for typedefs
AC_CHECKING(for clock_t in time.h)
AC_HEADER_EGREP(clock_t, time.h, , AC_DEFINE(clock_t, long))
AC_MODE_T
AC_OFF_T
AC_PID_T
AC_RETSIGTYPE
AC_SIZE_T
AC_UID_T

# Set name for machine-dependent library files
AC_SUBST(MACHDEP)
if test -z "$MACHDEP"
then
	ac_system=`uname -s | tr '[[A-Z]]' '[[a-z]]'`
	ac_release=`uname -r | sed 's/\..*//'`
	MACHDEP="$ac_system$ac_release"
	case MACHDEP in
	'')	MACHDEP=unknown;;
	esac
	AC_VERBOSE(setting MACHDEP to '$MACHDEP')
fi

# Set info about shared libraries.
# XXX This should try things out instead of testing uname!
AC_SUBST(SO)
AC_SUBST(LDSHARED)
AC_SUBST(CCSHARED)
AC_SUBST(LINKFORSHARED)
ac_system=`uname -s`
ac_release=`uname -r`
# SO is the extension of shared libraries `(including the dot!)
# -- usually .so, .sl on HP-UX
if test -z "$SO"
then
	case $ac_system in
	hp*|HP*) SO=.sl;;
	*)	SO=.so;;
	esac
	AC_VERBOSE(setting SO to '$SO')
fi
# LDSHARED is the ld *command* used to create shared library
# -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5
if test -z "$LDSHARED"
then
	case $ac_system/$ac_release in
	IRIX*) LDSHARED="ld -shared";;
	SunOS/4*) LDSHARED="ld";;
	SunOS/5*) LDSHARED="ld -G";;
	hp*|HP*) LDSHARED="ld -b";;
	*)	LDSHARED="ld";;
	esac
	AC_VERBOSE(setting LDSHARED= to '$LDSHARED')
fi
# CCSHARED are the C *flags* used to create objects to go into a shared
# library -- this is only needed for HP-UX
if test -z "$CCSHARED"
then
	case $ac_system in
	hp*|HP*) CCSHARED="+z";;
	esac
	AC_VERBOSE(setting CCSHARED= to '$CCSHARED')
fi
# LINKFORSHARED are the flags passed to the $(CC) command that links
# the python executable -- this is only needed for HP-UX
if test -z "$LINKFORSHARED"
then
	case $ac_system in
	hp*|HP*) LINKFORSHARED="-Wl,-E";;
	esac
	AC_VERBOSE(setting LINKFORSHARED to '$LINKFORSHARED')
fi

# checks for libraries
AC_HAVE_LIBRARY(dl)

AC_CHECKING(for --with-svr4)
AC_WITH(svr4, [
AC_HAVE_LIBRARY(socket)
AC_HAVE_LIBRARY(inet)
AC_HAVE_LIBRARY(nsl)
])

AC_CHECKING(for --with-readline)
AC_WITH(readline, [AC_DEFINE(WITH_READLINE)
if test ! -d "$withval"
then AC_ERROR(proper usage is --with-readline=DIRECTORY)
fi
termcap=
AC_HAVE_LIBRARY(termcap, [termcap=termcap], [AC_HAVE_LIBRARY(termlib, [termcap=termlib])])
if test ! -z "$termcap"
then LIBS="$LIBS $withval/libreadline.a"
     # Avoid possible conflict between shared libraries termcap and gl
     # on IRIX 5: both contain a routine called clear.
     if test -f /usr/lib/lib$termcap.a
     then LIBS="$LIBS /usr/lib/lib$termcap.a"
     else LIBS="$LIBS -l$termcap"
     fi
else AC_ERROR(no working termcap/termlib, do not use --with-readline)
fi])

AC_CHECKING(for --with-thread)
AC_WITH(thread, [
if test -d "$withval"
then LIBS="$LIBS -L$withval"
fi
AC_HAVE_LIBRARY(pthreads, [AC_DEFINE(WITH_THREAD)
AC_DEFINE(_POSIX_THREADS)
LIBS="$LIBS -lpthreads"
LIBOBJS="$LIBOBJS thread.o"])
AC_HAVE_LIBRARY(mpc, [AC_DEFINE(WITH_THREAD)
LIBS="$LIBS -lmpc"
LIBOBJS="$LIBOBJS thread.o"])
AC_HAVE_LIBRARY(thread, [AC_DEFINE(WITH_THREAD)
LIBS="$LIBS -lthread"
LIBOBJS="$LIBOBJS thread.o"])
])

# -I${DLINCLDIR} is added to the compile rule for import.o
AC_SUBST(DLINCLDIR)
DLINCLDIR=/

AC_CHECKING(for --with-sgi-dl)
AC_WITH(sgi-dl, [AC_DEFINE(WITH_SGI_DL)
dldir=$withval
if test -d "$dldir"
then LIBS="$LIBS -L$dldir"
else AC_ERROR(proper usage is --with-sgi-dl=DIRECTORY)
fi
DLINCLDIR=${dldir}
LIBS="$LIBS -ldl -lmld"])

AC_CHECKING(for --with-dl-dld)
AC_WITH(dl-dld, [AC_DEFINE(WITH_DL_DLD)
dldir=`echo "$withval" | sed 's/,.*//'`
dlddir=`echo "$withval" | sed 's/.*,//'`
if test -d "$dldir" -a -d "$dlddir"
then LIBS="$LIBS -L$dldir -L$dlddir"
else AC_ERROR(proper usage is --with-dl-dld=DL_DIRECTORY,DLD_DIRECTORY)
fi
DLINCLDIR=${dldir}
LIBS="$LIBS -ldl -ldld"])

# checks for library functions
AC_HAVE_FUNCS(chown clock dlopen ftime gettimeofday getpeername getpgrp getpid getwd link lstat nice readlink select setgid setuid setsid setpgid setpgrp setvbuf siginterrupt symlink tcgetpgrp tcsetpgrp times uname waitpid)
AC_REPLACE_FUNCS(dup2 getcwd strerror memmove)
AC_FUNC_CHECK(getpgrp, AC_COMPILE_CHECK([argument to getpgrp], [#include <unistd.h>], [getpgrp(0);], AC_DEFINE(GETPGRP_HAVE_ARG)))

# checks for structures
AC_TIME_WITH_SYS_TIME
AC_STRUCT_TM
AC_TIMEZONE
AC_COMPILE_CHECK([whether we have altzone], [#include <time.h>], [return altzone;], AC_DEFINE(HAVE_ALTZONE))
AC_COMPILE_CHECK([whether sys/select.h and sys/time.h may both be included], [
#include <sys/types.h>
#include <sys/select.h>
#include <sys/time.h>
], [;], [AC_DEFINE(SYS_SELECT_WITH_SYS_TIME)])

# checks for compiler characteristics

AC_CHAR_UNSIGNED

AC_CONST

AC_COMPILE_CHECK([lack of working volatile],[],[volatile int x; x = 0;],,AC_DEFINE(volatile,))

AC_COMPILE_CHECK([lack of working signed char], [], [signed char c;],,AC_DEFINE(signed, []))

AC_CHECKING(for prototypes)
AC_TEST_PROGRAM([
int foo(int x) { return 0; }
int main() { return foo(10); }
], AC_DEFINE(HAVE_PROTOTYPES) have_prototypes=1)

AC_CHECKING(for variable length prototypes and stdarg.h)
AC_TEST_PROGRAM([
#include <stdarg.h>
int foo(int x, ...) { return 0; }
int main() { return foo(10, 11, 12); }
], AC_DEFINE(HAVE_STDARG_PROTOTYPES) have_prototypes=1)
if test "$have_prototypes"; then
AC_COMPILE_CHECK(["bad exec* prototypes"], [#include <unistd.h>], [char **t;execve("@",t,t);], , AC_DEFINE(BAD_EXEC_PROTOTYPES))
fi

AC_CHECKING(for bad static forward)
AC_TEST_PROGRAM([
struct s { int a; int b; };
static struct s foo;
int foobar() { return !foo.a; }
static struct s foo = { 1, 2 };
main() { exit(foobar()); }
], , AC_DEFINE(BAD_STATIC_FORWARD))

# checks for system services
# (none yet)

# other checks for UNIX variants
AC_IRIX_SUN
AC_XENIX_DIR

# check for --with-libm=...
AC_SUBST(LIBM)
LIBM=-lm
AC_WITH(libm, [if test "$withval" != yes
then LIBM=$withval
else AC_ERROR(proper usage is --with-libm=STRING)
fi])

# check for --with-libc=...
AC_SUBST(LIBC)
AC_WITH(libc, [if test "$withval" != yes
then LIBC=$withval
else AC_ERROR(proper usage is --with-libc=STRING)
fi])

# generate output files
AC_OUTPUT(Makefile Objects/Makefile Parser/Makefile Python/Makefile Modules/Makefile.pre)
