dnl Process this file file with autoconf to produce a configure script.
dnl This file is a shell script fragment that supplies the information
dnl necessary to tailor a template configure script into the configure
dnl script appropriate for this directory.  For more information, check
dnl any existing configure script.

AC_PREREQ(2.12.1)
AC_INIT(gdb.base)

CC=${CC-cc}
AC_SUBST(CC)
AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/../..)
AC_CANONICAL_SYSTEM

# Directories to use in all configurations.
configdirs="gdb.arch \
            gdb.asm \
            gdb.base \
            gdb.c++ \
            gdb.java \
            gdb.disasm \
            gdb.mi \
            gdb.threads \
            gdb.trace"


# Directories to use for a configuration which uses stabs.
stabsdirs="gdb.stabs"

	# this section is for targets that use stabs
# add stabs tests for appropriate targets
case "${target}" in
	powerpc-*-aix*)	configdirs="${configdirs} ${stabsdirs}" ;;
	rs6000-*-aix*)	configdirs="${configdirs} ${stabsdirs}" ;;
	*-*-bsd*)	configdirs="${configdirs} ${stabsdirs}" ;;
	*-*-go32*)	configdirs="${configdirs} ${stabsdirs}" ;;
	*-*-linux*)	configdirs="${configdirs} ${stabsdirs}" ;;
	*-*-lynxos*)	configdirs="${configdirs} ${stabsdirs}" ;;
	*-sun-*)	configdirs="${configdirs} ${stabsdirs}" ;;
	hppa*-*-*)	configdirs="${configdirs} ${stabsdirs}" ;;
	*-*-elf*)	configdirs="${configdirs} ${stabsdirs}" ;;
	*)		if test "x${with_stabs}" = x"yes" ; then
			  configdirs="${configdirs} ${stabsdirs}"
			fi ;;
esac

# Directory with HP specific tests. They will run only with HP's compilers. 
# These tests will not work on other platforms and compilers.

hpdir="gdb.hp"

case "${target}" in
 hppa*-*-hpux*) configdirs="${configdirs} ${hpdir}" ;;
esac


# Begin stuff to support --enable-shared
AC_ARG_ENABLE(shared,
[  --enable-shared         use shared libraries],
[case "${enableval}" in
  yes) shared=true ;;
  no)  shared=false ;;
  *) shared=true ;;
esac])dnl
RPATH_ENVVAR=LD_LIBRARY_PATH
# If we have shared libraries, try to set RPATH_ENVVAR reasonably.
if test "${shared}" = "true"; then
  case "${host}" in
  *-*-hpux*)
    RPATH_ENVVAR=SHLIB_PATH
    ;;
  esac
fi
AC_SUBST(RPATH_ENVVAR)
# End stuff to support --enable-shared
# Start stuff to support --enable-gdbtk
AC_ARG_ENABLE(gdbtk,
[  --enable-gdbtk ],
[case "${enableval}" in
    yes)
        case "$host" in
        *go32*)
            enable_gdbtk=no ;;
        *windows*)
            enable_gdbtk=no ;;
        *)
            enable_gdbtk=yes ;;
        esac ;;
    no)
        enable_gdbtk=no  ;;
    *)
        AC_MSG_ERROR(bad value ${enableval} given for gdbtk option) ;;
esac],
[
# Default is on for everything but go32 and windows
case "$host" in
    *go32* | *windows*)
        ;;
    *)
        enable_gdbtk=yes ;;
    esac
])

if test "${enable_gdbtk}" = "yes"; then
    configdirs="${configdirs} gdb.gdbtk"
fi
# End stuff to support --enable-shared

dnl Check for exe extension set on certain hosts (e.g. Win32)
AC_EXEEXT

# configure the subdirectories too
AC_CONFIG_SUBDIRS($configdirs)

dnl AC_SUBST(gdb_target_cpu)
AC_OUTPUT(Makefile)
