dnl Autoconf configure script for GDB, the GNU debugger.
dnl Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
dnl Free Software Foundation, Inc.
dnl
dnl This file is part of GDB.
dnl 
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl 
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dnl GNU General Public License for more details.
dnl 
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

dnl Process this file with autoconf to produce a configure script.

AC_PREREQ(2.13)dnl
AC_INIT(main.c)
AC_CONFIG_HEADER(config.h:config.in)
AM_MAINTAINER_MODE

AC_PROG_CC
AC_GNU_SOURCE
AC_AIX
AC_ISC_POSIX
AM_PROG_CC_STDC

AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/..)
AC_CANONICAL_SYSTEM

# FIXME: kettenis/20030102: The AC_PROG_RANLIB from Autoconf 2.13
# doesn't support cross-compilation, but the one from Autoconf 2.5x
# does.  Override RANLIB here (i.e. before running AC_PROG_RANLIB) to
# deal with the lossage.  Note that CY_GNU_GETTEXT currently calls
# AC_PROG_RANLIB.  This can be removed when we switch to Autoconf
# 2.5x.
AC_CHECK_TOOL(RANLIB, ranlib, :)

dnl Set up for gettext.  PACKAGE is used when we call bindtextdomain.
ALL_LINGUAS=
CY_GNU_GETTEXT
AC_DEFINE(PACKAGE, "gdb", [Name of this package. ])

debugdir=${libdir}/debug
	 
AC_ARG_WITH(separate-debug-dir,
[  --with-separate-debug-dir=path   Look for global separate debug info in this path [LIBDIR/debug]],
[debugdir="${withval}"])
	
AC_DEFINE_DIR(DEBUGDIR, debugdir,
              [Global directory for separate debug files. ])
#AC_DEFINE_UNQUOTED(DEBUGDIR, "$debugdir"),

dnl List of object files added by configure.

CONFIG_OBS=
CONFIG_LIB_OBS=
CONFIG_DEPS=
CONFIG_SRCS=
CONFIG_INITS=
ENABLE_CFLAGS=
CONFIG_ALL=
CONFIG_CLEAN=
CONFIG_INSTALL=
CONFIG_UNINSTALL=

AC_CONFIG_SUBDIRS(doc testsuite)
configdirs=

. $srcdir/configure.host

. $srcdir/configure.tgt

# Fetch the default architecture and default target vector from BFD.
targ=$target; . $srcdir/../bfd/config.bfd

# We only want the first architecture, so strip off the others if
# there is more than one.
targ_archs=`echo $targ_archs | sed 's/ .*//'`

if test "x$targ_archs" != x; then
  AC_DEFINE_UNQUOTED(DEFAULT_BFD_ARCH, $targ_archs,
    [Define to BFD's default architecture. ])
fi
if test "x$targ_defvec" != x; then
  AC_DEFINE_UNQUOTED(DEFAULT_BFD_VEC, $targ_defvec,
    [Define to BFD's default target vector. ])
fi

AC_ARG_PROGRAM

# The CLI cannot be disabled yet, but may be in the future.

# Enable CLI.
AC_ARG_ENABLE(gdbcli,
[  --disable-gdbcli        disable command-line interface (CLI)],
  [case $enableval in
    yes)
      ;;
    no)
      AC_MSG_ERROR([the command-line interface cannot be disabled yet]) ;;
    *)
      AC_MSG_ERROR([bad value $enableval for --enable-gdbcli]) ;;
  esac],
  [enable_gdbcli=yes])
if test x"$enable_gdbcli" = xyes; then
  if test -d $srcdir/cli; then
    CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_CLI_OBS)"
    CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_CLI_DEPS)"
    CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_CLI_SRCS)"
    CONFIG_INITS="$CONFIG_INITS \$(SUBDIR_CLI_INITS)"
    ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_CLI_CFLAGS)"
    CONFIG_ALL="$CONFIG_ALL \$(SUBDIR_CLI_ALL)"
    CONFIG_CLEAN="$CONFIG_CLEAN \$(SUBDIR_CLI_CLEAN)"
    CONFIG_INSTALL="$CONFIG_INSTALL \$(SUBDIR_CLI_INSTALL)"
    CONFIG_UNINSTALL="$CONFIG_UNINSTALL \$(SUBDIR_CLI_UNINSTALL)"
  fi
fi

# Enable MI.
AC_ARG_ENABLE(gdbmi,
[  --disable-gdbmi         disable machine-interface (MI)],
  [case $enableval in
    yes | no)
      ;;
    *)
      AC_MSG_ERROR([bad value $enableval for --enable-gdbmi]) ;;
  esac],
  [enable_gdbmi=yes])
if test x"$enable_gdbmi" = xyes; then
  if test -d $srcdir/mi; then
    CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_MI_OBS)"
    CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_MI_DEPS)"
    CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_MI_SRCS)"
    CONFIG_INITS="$CONFIG_INITS \$(SUBDIR_MI_INITS)"
    ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_MI_CFLAGS)"
    CONFIG_ALL="$CONFIG_ALL \$(SUBDIR_MI_ALL)"
    CONFIG_CLEAN="$CONFIG_CLEAN \$(SUBDIR_MI_CLEAN)"
    CONFIG_INSTALL="$CONFIG_INSTALL \$(SUBDIR_MI_INSTALL)"
    CONFIG_UNINSTALL="$CONFIG_UNINSTALL \$(SUBDIR_MI_UNINSTALL)"
  fi
fi

# Enable TUI.
AC_ARG_ENABLE(tui,
[  --enable-tui            enable full-screen terminal user interface (TUI)],
  [case $enableval in
    yes | no)
      ;;
    *)
      AC_MSG_ERROR([bad value $enableval for --enable-tui]) ;;
  esac])
if test x"$enable_tui" = xyes; then
  if test -d $srcdir/tui; then
    CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_TUI_OBS)"
    CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_TUI_DEPS)"
    CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_TUI_SRCS)"
    CONFIG_INITS="$CONFIG_INITS \$(SUBDIR_TUI_INITS)"
    ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_TUI_CFLAGS)"
    CONFIG_ALL="$CONFIG_ALL \$(SUBDIR_TUI_ALL)"
    CONFIG_CLEAN="$CONFIG_CLEAN \$(SUBDIR_TUI_CLEAN)"
    CONFIG_INSTALL="$CONFIG_INSTALL \$(SUBDIR_TUI_INSTALL)"
    CONFIG_UNINSTALL="$CONFIG_UNINSTALL \$(SUBDIR_TUI_UNINSTALL)"
    need_curses=yes
  fi
fi

# Enable gdbtk.
AC_ARG_ENABLE(gdbtk,
[  --enable-gdbtk          enable gdbtk graphical user interface (GUI)],
  [case $enableval in
    yes | no)
      ;;
    *)
      AC_MSG_ERROR([bad value $enableval for --enable-gdbtk]) ;;
  esac],
  [if test -d $srcdir/gdbtk; then
    enable_gdbtk=yes
  else
    enable_gdbtk=no
  fi])
# We unconditionally disable gdbtk tests on selected platforms.
case $host_os in
  go32* | windows*)
    AC_MSG_WARN([gdbtk isn't supported on $host; disabling])
    enable_gdbtk=no ;;
esac

# Libunwind support.
AC_ARG_WITH(libunwind,
[  --with-libunwind            Use libunwind frame unwinding support],
[case "${withval}" in
  yes)  enable_libunwind=yes ;;
  no)   enable_libunwind=no ;;
  *)    AC_MSG_ERROR(bad value ${withval} for GDB with-libunwind option) ;;
esac],[
  AC_CHECK_HEADERS(libunwind.h)
  AC_CHECK_HEADERS(libunwind-ia64.h)
  if test x"$ac_cv_header_libunwind_h" = xyes -a x"$ac_cv_header_libunwind_ia64_h" = xyes; then
    enable_libunwind=yes;
  fi
])
   
if test x"$enable_libunwind" = xyes; then
  AC_CHECK_HEADERS(libunwind.h)
  AC_CHECK_HEADERS(libunwind-ia64.h)
  AC_DEFINE(HAVE_LIBUNWIND, 1)
  CONFIG_OBS="$CONFIG_OBS libunwind-frame.o"
  CONFIG_DEPS="$CONFIG_DEPS libunwind-frame.o"
  CONFIG_SRCS="$CONFIG_SRCS libunwind-frame.c"
fi

# Profiling support.
AC_ARG_ENABLE(profiling,
[  --enable-profiling      enable profiling of GDB],
  [case $enableval in
    yes | no)
      ;;
    *)
      AC_MSG_ERROR([bad value $enableval for --enable-profile]) ;;
  esac],
 [enable_profiling=no])

AC_CHECK_FUNCS(monstartup _mcleanup)
AC_CACHE_CHECK([for _etext], ac_cv_var__etext,
[AC_TRY_LINK(
[#include <stdlib.h>
extern char _etext;
],
[free (&_etext);], ac_cv_var__etext=yes, ac_cv_var__etext=no)])
if test $ac_cv_var__etext = yes; then
  AC_DEFINE(HAVE__ETEXT, 1,
            [Define to 1 if your system has the _etext variable. ])
fi
if test "$enable_profiling" = yes ; then
  if test $ac_cv_func_monstartup = no || test $ac_cv_func__mcleanup = no; then
    AC_MSG_ERROR(--enable-profiling requires monstartup and _mcleanup)
  fi
  PROFILE_CFLAGS=-pg
  OLD_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS $PROFILE_CFLAGS"

  AC_CACHE_CHECK([whether $CC supports -pg], ac_cv_cc_supports_pg,
    [AC_TRY_COMPILE([], [int x;], ac_cv_cc_supports_pg=yes,
     ac_cv_cc_supports_pg=no)])

  if test $ac_cv_cc_supports_pg = no; then
    AC_MSG_ERROR(--enable-profiling requires a compiler which supports -pg)
  fi

  CFLAGS="$OLD_CFLAGS"
fi

# --------------------- #
# Checks for programs.  #
# --------------------- #

AC_PROG_AWK
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_RANLIB
AC_PROG_YACC

AC_CHECK_TOOL(AR, ar)
AC_CHECK_TOOL(DLLTOOL, dlltool)
AC_CHECK_TOOL(WINDRES, windres)

# Needed for GNU/Hurd.
AC_CHECK_TOOL(MIG, mig)

# ---------------------- #
# Checks for libraries.  #
# ---------------------- #

# We might need to link with -lm; most simulators need it.
AC_CHECK_LIB(m, main)

# We need to link with -lw to get `wctype' on Solaris before Solaris
# 2.6.  Solaris 2.6 and beyond have this function in libc, and have a
# libw that some versions of the GNU linker cannot hanle (GNU ld 2.9.1
# is known to have this problem).  Therefore we avoid libw if we can.
AC_CHECK_FUNC(wctype, [],
  [AC_CHECK_LIB(w, wctype)])

# Some systems (e.g. Solaris) have `gethostbyname' in libnsl.
AC_SEARCH_LIBS(gethostbyname, nsl)

# Some systems (e.g. Solaris) have `socketpair' in libsocket.
AC_SEARCH_LIBS(socketpair, socket)

# Since GDB uses Readline, we need termcap functionality, so we need
# to find a library that provides that.  When GDB is configured with
# --enable-tui, we need full curses functionality.
#
# FIXME: kettenis/20030102: We seem to prefer HP curses (Hcurses) over
# Xcurses on HP-UX; see the `-D__HP_CURSES' in the relevant host
# Makefile fragments.  That's why we need to have `Hcurses' before
# `curses'.  I don't see why we should use HP curses if a more
# standard curses is available, except that according to HP's
# documentation one needs to compile `-D_XOPEN_SOURCE_EXTENDED' on
# HP-UX 10.10 and 10.20.

if test "$need_curses" = yes; then
  AC_SEARCH_LIBS(initscr, [ncurses Hcurses curses], [],
    [AC_MSG_ERROR([no curses library found])])
fi

case $host_os in
  cygwin*)
    if test -d $srcdir/libtermcap; then
      LIBS="../libtermcap/libtermcap.a $LIBS"
      ac_cv_search_tgetent="../libtermcap/libtermcap.a"
    fi ;;
  go32* | *djgpp*)
    ac_cv_search_tgetent="none required"
    ;;
  aix*)
    # Readline prefers curses over termcap on AIX.
    # ??? Why?
    AC_SEARCH_LIBS(tgetent, [tinfo ncurses curses termcap])
    ;;
esac

# Note: We used to check for libtermlib and libterminfo too, but
# Readline doesn't, so I think we're safe with leaving them out.
AC_SEARCH_LIBS(tgetent, [termcap tinfo ncurses Hcurses curses])

if test "$ac_cv_search_tgetent" = no; then
  AC_MSG_ERROR([no termcap library found])
fi

# ------------------------- #
# Checks for header files.  #
# ------------------------- #

AC_HEADER_DIRENT
AC_HEADER_STAT
AC_HEADER_STDC
AC_CHECK_HEADERS(link.h)
AC_CHECK_HEADERS(machine/reg.h)
AC_CHECK_HEADERS(nlist.h)
AC_CHECK_HEADERS(poll.h sys/poll.h)
AC_CHECK_HEADERS(proc_service.h thread_db.h)
AC_CHECK_HEADERS(stddef.h)
AC_CHECK_HEADERS(stdlib.h)
AC_CHECK_HEADERS(stdint.h)
AC_CHECK_HEADERS(string.h memory.h strings.h)
AC_CHECK_HEADERS(sys/fault.h)
AC_CHECK_HEADERS(sys/file.h)
AC_CHECK_HEADERS(sys/filio.h)
AC_CHECK_HEADERS(sys/ioctl.h)
AC_CHECK_HEADERS(sys/param.h)
AC_CHECK_HEADERS(sys/proc.h)
AC_CHECK_HEADERS(sys/procfs.h)
AC_CHECK_HEADERS(sys/ptrace.h ptrace.h)
AC_CHECK_HEADERS(sys/reg.h sys/debugreg.h)
AC_CHECK_HEADERS(sys/select.h)
AC_CHECK_HEADERS(sys/syscall.h)
AC_CHECK_HEADERS(sys/user.h)
AC_CHECK_HEADERS(sys/wait.h wait.h)
AC_CHECK_HEADERS(termios.h termio.h sgtty.h)
AC_CHECK_HEADERS(unistd.h)

# On Solaris 2.[78], we need to define _MSE_INT_H to avoid a clash
# between <widec.h> and <wchar.h> that would cause AC_CHECK_HEADERS to
# think that we don't have <curses.h> if we're using GCC.
case $host_os in
  solaris2.[[78]])
    if test "$GCC" = yes; then
      AC_DEFINE(_MSE_INT_H, 1,
        [[Define to 1 to avoid a clash between <widec.h> and <wchar.h> on
   Solaris 2.[78] when using GCC. ]])
    fi ;;
esac
AC_CHECK_HEADERS(curses.h ncurses.h term.h)

# FIXME: kettenis/20030102: In most cases we include these
# unconditionally, so what's the point in checking these?
AC_CHECK_HEADERS(ctype.h time.h)

dnl Check for struct stat with an st_blocks member
AC_MSG_CHECKING(for member st_blocks in struct stat)
AC_CACHE_VAL(gdb_cv_have_struct_stat_with_st_blocks_member,
  [AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/stat.h>],
                  [struct stat st; (void) st.st_blocks;],
                  gdb_cv_have_struct_stat_with_st_blocks_member=yes,
                  gdb_cv_have_struct_stat_with_st_blocks_member=no)])
AC_MSG_RESULT($gdb_cv_have_struct_stat_with_st_blocks_member)
if test $gdb_cv_have_struct_stat_with_st_blocks_member = yes; then
  AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS)
fi
# ------------------------- #
# Checks for declarations.  #
# ------------------------- #

gcc_AC_CHECK_DECLS(getopt)

# ------------------ #
# Checks for types.  #
# ------------------ #

AC_TYPE_SIGNAL

# ------------------------------------- #
# Checks for compiler characteristics.  #
# ------------------------------------- #

AC_C_CONST
AC_C_INLINE

# ------------------------------ #
# Checks for library functions.  #
# ------------------------------ #

AC_FUNC_ALLOCA
AC_FUNC_MMAP
AC_FUNC_VFORK
AC_CHECK_FUNCS(canonicalize_file_name realpath)
AC_CHECK_FUNCS(poll)
AC_CHECK_FUNCS(pread64)
AC_CHECK_FUNCS(sbrk)
AC_CHECK_FUNCS(setpgid setpgrp)
AC_CHECK_FUNCS(sigaction sigprocmask sigsetmask)
AC_CHECK_FUNCS(socketpair)
AC_CHECK_FUNCS(syscall)

dnl AC_FUNC_SETPGRP does not work when cross compiling
dnl Instead, assume we will have a prototype for setpgrp if cross compiling.
if test "$cross_compiling" = no; then
  AC_FUNC_SETPGRP
else
  AC_CACHE_CHECK([whether setpgrp takes no argument], ac_cv_func_setpgrp_void,
    [AC_TRY_COMPILE([
#include <unistd.h>
], [
  if (setpgrp(1,1) == -1)
    exit (0);
  else
    exit (1);
], ac_cv_func_setpgrp_void=no, ac_cv_func_setpgrp_void=yes)])
if test $ac_cv_func_setpgrp_void = yes; then
  AC_DEFINE(SETPGRP_VOID, 1)
fi
fi

# Check if sigsetjmp is available.  Using AC_CHECK_FUNCS won't do
# since sigsetjmp might only be defined as a macro.
AC_CACHE_CHECK([for sigsetjmp], gdb_cv_func_sigsetjmp,
[AC_TRY_COMPILE([
#include <setjmp.h>
], [sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);],
gdb_cv_func_sigsetjmp=yes, gdb_cv_func_sigsetjmp=no)])
if test $gdb_cv_func_sigsetjmp = yes; then
  AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available. ])
fi

# Assume we'll default to using the included libiberty regex.
gdb_use_included_regex=yes

# However, if the system regex is GNU regex, then default to *not*
# using the included regex.
AC_CACHE_CHECK(
  [for GNU regex],
  [gdb_cv_have_gnu_regex],
  [AC_TRY_COMPILE(
    [#include <gnu-versions.h>],
    [#define REGEX_INTERFACE_VERSION 1
#if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
# error "Version mismatch"
#endif],
    gdb_cv_have_gnu_regex=yes,
    gdb_cv_have_gnu_regex=no)])
if test $gdb_cv_have_gnu_regex = yes; then
  gdb_use_included_regex=no
fi

AC_ARG_WITH(included-regex,
  [  --without-included-regex don't use included regex; this is the default
                          on systems with version 2 of the GNU C library
                          (use with caution on other system)],
  gdb_with_regex=$withval,
  gdb_with_regex=$gdb_use_included_regex)
if test "$gdb_with_regex" = yes; then
  AC_DEFINE(USE_INCLUDED_REGEX, 1,
    [Define to 1 if the regex included in libiberty should be used.])
fi

# See if <machine/reg.h> degines `struct reg'.
AC_CACHE_CHECK([for struct reg in machine/reg.h], gdb_cv_struct_reg,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <machine/reg.h>], [struct reg r;],
gdb_cv_struct_reg=yes, gdb_cv_struct_reg=no)])
if test $gdb_cv_struct_reg = yes; then
  AC_DEFINE(HAVE_STRUCT_REG, 1,
            [Define to 1 if your system has struct reg in <machine/reg.h>.])
fi

# See if <machine/reg.h> supports the %fs and %gs i386 segment registers.
# Older i386 BSD's don't have the r_fs and r_gs members of `struct reg'.
AC_CACHE_CHECK([for r_fs in struct reg], gdb_cv_struct_reg_r_fs,
[AC_TRY_COMPILE([#include <machine/reg.h>], [struct reg r; r.r_fs;],
gdb_cv_struct_reg_r_fs=yes, gdb_cv_struct_reg_r_fs=no)])
if test $gdb_cv_struct_reg_r_fs = yes; then
  AC_DEFINE(HAVE_STRUCT_REG_R_FS)
fi
AC_CACHE_CHECK([for r_gs in struct reg], gdb_cv_struct_reg_r_gs,
[AC_TRY_COMPILE([#include <machine/reg.h>], [struct reg r; r.r_gs;],
gdb_cv_struct_reg_r_gs=yes, gdb_cv_struct_reg_r_gs=no)])
if test $gdb_cv_struct_reg_r_gs = yes; then
  AC_DEFINE(HAVE_STRUCT_REG_R_GS)
fi

# See if <sys/ptrace.h> provides the PTRACE_GETREGS request.
AC_MSG_CHECKING(for PTRACE_GETREGS)
AC_CACHE_VAL(gdb_cv_have_ptrace_getregs,
[AC_TRY_COMPILE([#include <sys/ptrace.h>],
		[PTRACE_GETREGS;],
		[gdb_cv_have_ptrace_getregs=yes],
		[gdb_cv_have_ptrace_getregs=no])])
AC_MSG_RESULT($gdb_cv_have_ptrace_getregs)
if test $gdb_cv_have_ptrace_getregs = yes; then
  AC_DEFINE(HAVE_PTRACE_GETREGS)
fi

# See if <sys/ptrace.h> provides the PTRACE_GETFPXREGS request.
AC_MSG_CHECKING(for PTRACE_GETFPXREGS)
AC_CACHE_VAL(gdb_cv_have_ptrace_getfpxregs,
[AC_TRY_COMPILE([#include <sys/ptrace.h>],
		[PTRACE_GETFPXREGS;],
		[gdb_cv_have_ptrace_getfpxregs=yes],
		[gdb_cv_have_ptrace_getfpxregs=no])])
AC_MSG_RESULT($gdb_cv_have_ptrace_getfpxregs)
if test $gdb_cv_have_ptrace_getfpxregs = yes; then
  AC_DEFINE(HAVE_PTRACE_GETFPXREGS)
fi

# See if <sys/ptrace.h> provides the PT_GETDBREGS request.
AC_MSG_CHECKING(for PT_GETDBREGS)
AC_CACHE_VAL(gdb_cv_have_pt_getdbregs,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/ptrace.h>],
		[PT_GETDBREGS;],
		[gdb_cv_have_pt_getdbregs=yes],
		[gdb_cv_have_pt_getdbregs=no])])
AC_MSG_RESULT($gdb_cv_have_pt_getdbregs)
if test $gdb_cv_have_pt_getdbregs = yes; then
  AC_DEFINE(HAVE_PT_GETDBREGS)
fi

# See if <sys/ptrace.h> provides the PT_GETXMMREGS request.
AC_MSG_CHECKING(for PT_GETXMMREGS)
AC_CACHE_VAL(gdb_cv_have_pt_getxmmregs,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/ptrace.h>],
		[PT_GETXMMREGS;],
		[gdb_cv_have_pt_getxmmregs=yes],
		[gdb_cv_have_pt_getxmmregs=no])])
AC_MSG_RESULT($gdb_cv_have_pt_getxmmregs)
if test $gdb_cv_have_pt_getxmmregs = yes; then
  AC_DEFINE(HAVE_PT_GETXMMREGS)
fi

# See if stdint.h provides the uintptr_t type.
# Autoconf 2.5X has an improved AC_CHECK_TYPE which will simplify this.
AC_CACHE_CHECK([for uintptr_t in stdint.h], gdb_cv_have_uintptr_t,
  [AC_TRY_COMPILE(
    [#include <stdint.h>],
    [uintptr_t foo = 0;],
    gdb_cv_have_uintptr_t=yes,
    gdb_cv_have_uintptr_t=no)])
if test $gdb_cv_have_uintptr_t = yes; then
  AC_DEFINE(HAVE_UINTPTR_T, 1, [Define if <stdint.h> provides the uintptr_t type.])
fi

BFD_NEED_DECLARATION(malloc)
BFD_NEED_DECLARATION(realloc)
BFD_NEED_DECLARATION(free)
BFD_NEED_DECLARATION(strerror)
BFD_NEED_DECLARATION(strdup)
BFD_NEED_DECLARATION(strstr)
BFD_NEED_DECLARATION(canonicalize_file_name)

# The following save_state_t checkery is only necessary for HPUX 
# versions earlier than 10.20.  When those fade from memory, this 
# could be expunged. --jsm 1999-03-22

AC_MSG_CHECKING(for HPUX save_state structure)
AC_EGREP_HEADER(save_state_t, machine/save_state.h, 
                gdb_cv_hpux_savestate=yes, gdb_cv_hpux_savestate=no)
AC_EGREP_HEADER(ss_wide, machine/save_state.h, gdb_cv_hpux_sswide=yes,
                gdb_cv_hpux_sswide=no)
if test $gdb_cv_hpux_savestate = yes
then
  AC_DEFINE(HAVE_STRUCT_SAVE_STATE_T, 1)
fi
if test $gdb_cv_hpux_sswide = yes
then
  AC_DEFINE(HAVE_STRUCT_MEMBER_SS_WIDE, 1)
fi
AC_MSG_RESULT($gdb_cv_hpux_sswide)


# If we are configured native on GNU/Linux, work around problems with
# sys/procfs.h
# Also detect which type of /proc is in use, such as for Unixware or Solaris.

if test "${target}" = "${host}"; then
  case "${host}" in
  i[[3456]]86-*-linux*)
	AC_DEFINE(START_INFERIOR_TRAPS_EXPECTED,2)
	AC_DEFINE(sys_quotactl)
	;;
  ia64-*-aix*)
      AC_DEFINE(NEW_PROC_API)
      ;;
  *-*-unixware* | *-*-sysv4.2* | *-*-sysv5* | *-*-interix* )
      AC_DEFINE(NEW_PROC_API)
      ;;
  *-*-solaris2.[[678]])
      AC_DEFINE(NEW_PROC_API)
      ;;
  esac
fi

if test "$ac_cv_header_sys_procfs_h" = yes; then
  BFD_HAVE_SYS_PROCFS_TYPE(pstatus_t)
  BFD_HAVE_SYS_PROCFS_TYPE(prrun_t)
  BFD_HAVE_SYS_PROCFS_TYPE(gregset_t)
  BFD_HAVE_SYS_PROCFS_TYPE(fpregset_t)
  BFD_HAVE_SYS_PROCFS_TYPE(prgregset_t)
  BFD_HAVE_SYS_PROCFS_TYPE(prfpregset_t)
  BFD_HAVE_SYS_PROCFS_TYPE(prgregset32_t)
  BFD_HAVE_SYS_PROCFS_TYPE(prfpregset32_t)
  BFD_HAVE_SYS_PROCFS_TYPE(lwpid_t)
  BFD_HAVE_SYS_PROCFS_TYPE(psaddr_t)
  BFD_HAVE_SYS_PROCFS_TYPE(prsysent_t)
  BFD_HAVE_SYS_PROCFS_TYPE(pr_sigset_t)
  BFD_HAVE_SYS_PROCFS_TYPE(pr_sigaction64_t)
  BFD_HAVE_SYS_PROCFS_TYPE(pr_siginfo64_t)


  dnl Check for broken prfpregset_t type

  dnl For Linux/i386, glibc 2.1.3 was released with a bogus
  dnl prfpregset_t type (it's a typedef for the pointer to a struct
  dnl instead of the struct itself).  We detect this here, and work
  dnl around it in gdb_proc_service.h.

  if test $bfd_cv_have_sys_procfs_type_prfpregset_t = yes; then
    AC_MSG_CHECKING(whether prfpregset_t type is broken)
    AC_CACHE_VAL(gdb_cv_prfpregset_t_broken,
      [AC_TRY_RUN([#include <sys/procfs.h>
       int main ()
       {
         if (sizeof (prfpregset_t) == sizeof (void *))
           return 1;
         return 0;
       }],
       gdb_cv_prfpregset_t_broken=no,
       gdb_cv_prfpregset_t_broken=yes,
       gdb_cv_prfpregset_t_broken=yes)])
    AC_MSG_RESULT($gdb_cv_prfpregset_t_broken)
    if test $gdb_cv_prfpregset_t_broken = yes; then
      AC_DEFINE(PRFPREGSET_T_BROKEN)
    fi
  fi

  dnl Check for PIOCSET ioctl entry 

  AC_MSG_CHECKING(for PIOCSET ioctl entry in sys/procfs.h)
  AC_CACHE_VAL(gdb_cv_have_procfs_piocset,
  [AC_TRY_COMPILE([#include <unistd.h>
#include <sys/types.h>
#include <sys/procfs.h>
], [
    int dummy;;
    dummy = ioctl(0, PIOCSET, &dummy);
  ],
  gdb_cv_have_procfs_piocset=yes, gdb_cv_have_procfs_piocset=no)])
  AC_MSG_RESULT($gdb_cv_have_procfs_piocset)
  if test $gdb_cv_have_procfs_piocset = yes; then
    AC_DEFINE(HAVE_PROCFS_PIOCSET)
  fi
fi

dnl For native ports (host == target), check to see what kind of
dnl legacy link.h support is needed.  (See solib-legacy.c.)
if test ${host} = ${target} ; then
  dnl Check for struct link_map with l_ members which are indicative
  dnl of SVR4-like shared libraries

  AC_MSG_CHECKING(for member l_addr in struct link_map)
  AC_CACHE_VAL(gdb_cv_have_struct_link_map_with_l_members,
    [AC_TRY_COMPILE([#include <link.h>],
                    [struct link_map lm; (void) lm.l_addr;],
                    gdb_cv_have_struct_link_map_with_l_members=yes,
                    gdb_cv_have_struct_link_map_with_l_members=no)])
  AC_MSG_RESULT($gdb_cv_have_struct_link_map_with_l_members)
  if test $gdb_cv_have_struct_link_map_with_l_members = yes; then
    AC_DEFINE(HAVE_STRUCT_LINK_MAP_WITH_L_MEMBERS)
  fi

  dnl Check for struct link_map with lm_ members which are indicative
  dnl of SunOS-like shared libraries

  AC_MSG_CHECKING(for member lm_addr in struct link_map)
  AC_CACHE_VAL(gdb_cv_have_struct_link_map_with_lm_members,
    [AC_TRY_COMPILE([#include <sys/types.h>
#include <link.h>],
                    [struct link_map lm; (void) lm.lm_addr;],
                    gdb_cv_have_struct_link_map_with_lm_members=yes,
                    gdb_cv_have_struct_link_map_with_lm_members=no)])
  AC_MSG_RESULT($gdb_cv_have_struct_link_map_with_lm_members)
  if test $gdb_cv_have_struct_link_map_with_lm_members = yes; then
    AC_DEFINE(HAVE_STRUCT_LINK_MAP_WITH_LM_MEMBERS)
  fi

  dnl Check for struct so_map with som_ members which are found on 
  dnl some *BSD systems.

  AC_MSG_CHECKING(for member som_addr in struct so_map)
  AC_CACHE_VAL(gdb_cv_have_struct_so_map_with_som_members,
    [AC_TRY_COMPILE([#include <sys/types.h>
#ifdef HAVE_NLIST_H
#include <nlist.h>
#endif
#include <link.h>],
                    [struct so_map lm; (void) lm.som_addr;],
                    gdb_cv_have_struct_so_map_with_som_members=yes,
                    gdb_cv_have_struct_so_map_with_som_members=no)])
  AC_MSG_RESULT($gdb_cv_have_struct_so_map_with_som_members)
  if test $gdb_cv_have_struct_so_map_with_som_members = yes; then
    AC_DEFINE(HAVE_STRUCT_SO_MAP_WITH_SOM_MEMBERS)
  fi

  dnl Check for struct link_map32 type, which allows a 64-bit Solaris
  dnl debugger to debug a 32-bit Solaris app with 32-bit shared libraries.

  AC_MSG_CHECKING(for struct link_map32 in sys/link.h)
  AC_CACHE_VAL(gdb_cv_have_struct_link_map32, 
    [AC_TRY_COMPILE([#define _SYSCALL32
#include <sys/link.h>], [struct link_map32 l;],
     gdb_cv_have_struct_link_map32=yes,
     gdb_cv_have_struct_link_map32=no)])
  AC_MSG_RESULT($gdb_cv_have_struct_link_map32)
  if test $gdb_cv_have_struct_link_map32 = yes; then
    AC_DEFINE(HAVE_STRUCT_LINK_MAP32)
    AC_DEFINE(_SYSCALL32)
  fi
fi

dnl See if compiler supports "long long" type.

AC_MSG_CHECKING(for long long support in compiler)
AC_CACHE_VAL(gdb_cv_c_long_long,
[AC_TRY_COMPILE(, [
  extern long long foo;
  switch (foo & 2) { case 0: return 1; }
],
gdb_cv_c_long_long=yes, gdb_cv_c_long_long=no)])
AC_MSG_RESULT($gdb_cv_c_long_long)
if test $gdb_cv_c_long_long = yes; then
  AC_DEFINE(CC_HAS_LONG_LONG)
fi

dnl See if the compiler and runtime support printing long long

AC_MSG_CHECKING(for long long support in printf)
AC_CACHE_VAL(gdb_cv_printf_has_long_long,
[AC_TRY_RUN([
int main () {
  char buf[32];
  long long l = 0;
  l = (l << 16) + 0x0123;
  l = (l << 16) + 0x4567;
  l = (l << 16) + 0x89ab;
  l = (l << 16) + 0xcdef;
  sprintf (buf, "0x%016llx", l);
  return (strcmp ("0x0123456789abcdef", buf));
}],
gdb_cv_printf_has_long_long=yes,
gdb_cv_printf_has_long_long=no,
gdb_cv_printf_has_long_long=no)])
if test $gdb_cv_printf_has_long_long = yes; then
  AC_DEFINE(PRINTF_HAS_LONG_LONG)
fi
AC_MSG_RESULT($gdb_cv_printf_has_long_long)

dnl See if compiler supports "long double" type.  Can't use AC_C_LONG_DOUBLE
dnl because autoconf complains about cross-compilation issues.  However, this
dnl code uses the same variables as the macro for compatibility.

AC_MSG_CHECKING(for long double support in compiler)
AC_CACHE_VAL(ac_cv_c_long_double,
[AC_TRY_COMPILE(, [long double foo;],
ac_cv_c_long_double=yes, ac_cv_c_long_double=no)])
AC_MSG_RESULT($ac_cv_c_long_double)
if test $ac_cv_c_long_double = yes; then
  AC_DEFINE(HAVE_LONG_DOUBLE)
fi

dnl See if the compiler and runtime support printing long doubles

AC_MSG_CHECKING(for long double support in printf)
AC_CACHE_VAL(gdb_cv_printf_has_long_double,
[AC_TRY_RUN([
int main () {
  char buf[16];
  long double f = 3.141592653;
  sprintf (buf, "%Lg", f);
  return (strncmp ("3.14159", buf, 7));
}],
gdb_cv_printf_has_long_double=yes,
gdb_cv_printf_has_long_double=no,
gdb_cv_printf_has_long_double=no)])
if test $gdb_cv_printf_has_long_double = yes; then
  AC_DEFINE(PRINTF_HAS_LONG_DOUBLE)
fi
AC_MSG_RESULT($gdb_cv_printf_has_long_double)

dnl See if the compiler and runtime support scanning long doubles

AC_MSG_CHECKING(for long double support in scanf)
AC_CACHE_VAL(gdb_cv_scanf_has_long_double,
[AC_TRY_RUN([
int main () {
  char *buf = "3.141592653";
  long double f = 0;
  sscanf (buf, "%Lg", &f);
  return !(f > 3.14159 && f < 3.14160);
}],
gdb_cv_scanf_has_long_double=yes,
gdb_cv_scanf_has_long_double=no,
gdb_cv_scanf_has_long_double=no)])
if test $gdb_cv_scanf_has_long_double = yes; then
  AC_DEFINE(SCANF_HAS_LONG_DOUBLE)
fi
AC_MSG_RESULT($gdb_cv_scanf_has_long_double)

case ${host_os} in
aix*)
  AC_CACHE_CHECK([for -bbigtoc option], [gdb_cv_bigtoc], [
    SAVE_LDFLAGS=$LDFLAGS

    case $GCC in
    yes) gdb_cv_bigtoc=-Wl,-bbigtoc ;;
    *) gdb_cv_bigtoc=-bbigtoc ;;
    esac

    LDFLAGS=$LDFLAGS\ $gdb_cv_bigtoc
    AC_TRY_LINK([], [int i;], [], [gdb_cv_bigtoc=])
  ])
  CONFIG_LDFLAGS="${CONFIG_LDFLAGS} ${gdb_cv_bigtoc}"
  ;;
esac


dnl For certain native configurations, we need to check whether thread
dnl support can be built in or not.
dnl
dnl Note that we only want this if we are both native (host == target),
dnl and not doing a canadian cross build (build == host).

if test ${build} = ${host} -a ${host} = ${target} ; then
   case ${host_os} in
   hpux*)
      AC_MSG_CHECKING(for HPUX/OSF thread support)
      if test -f /usr/include/dce/cma_config.h ; then
         if test "$GCC" = "yes" ; then
            AC_MSG_RESULT(yes)
            AC_DEFINE(HAVE_HPUX_THREAD_SUPPORT)
            CONFIG_LIB_OBS="${CONFIG_LIB_OBS} hpux-thread.o"
            CONFIG_SRCS="${CONFIG_SRCS} hpux-thread.c"
         else
            AC_MSG_RESULT(no (suppressed because you are not using GCC))
         fi
      else
         AC_MSG_RESULT(no)
      fi
      ;;
   solaris*)
      # See if thread_db library is around for Solaris thread debugging.
      # Note that we must explicitly test for version 1 of the library
      # because version 0 (present on Solaris 2.4 or earlier) doesn't have
      # the same API.
      AC_MSG_CHECKING(for Solaris thread debugging library)
      if test -f /usr/lib/libthread_db.so.1 ; then
         AC_MSG_RESULT(yes)
         AC_DEFINE(HAVE_THREAD_DB_LIB)
         CONFIG_LIB_OBS="${CONFIG_LIB_OBS} sol-thread.o"
         CONFIG_SRCS="${CONFIG_SRCS} sol-thread.c"
         AC_CHECK_LIB(dl, dlopen)
         if test "$GCC" = "yes" ; then
            # The GNU linker requires the -export-dynamic option to make
            # all symbols visible in the dynamic symbol table.
            hold_ldflags=$LDFLAGS
            AC_MSG_CHECKING(for the ld -export-dynamic flag)
            LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
            AC_TRY_LINK(, [int i;], found=yes, found=no)
            LDFLAGS=$hold_ldflags
            AC_MSG_RESULT($found)
            if test $found = yes; then
               CONFIG_LDFLAGS="${CONFIG_LDFLAGS} -Wl,-export-dynamic"
            fi
         fi
	 # Sun randomly tweaked the prototypes in <proc_service.h>
	 # at one point.
	 AC_MSG_CHECKING(if <proc_service.h> is old)
	 AC_CACHE_VAL(gdb_cv_proc_service_is_old,[
	    AC_TRY_COMPILE([
		#include <proc_service.h>
		ps_err_e ps_pdwrite
		    (struct ps_prochandle*, psaddr_t, const void*, size_t);
	    ],, gdb_cv_proc_service_is_old=no,
	        gdb_cv_proc_service_is_old=yes)
	 ])
	 AC_MSG_RESULT($gdb_cv_proc_service_is_old)
	 if test $gdb_cv_proc_service_is_old = yes; then
	    AC_DEFINE(PROC_SERVICE_IS_OLD)
	 fi
      else
         AC_MSG_RESULT(no)
      fi
      ;;
   aix*)
      AC_MSG_CHECKING(for AiX thread debugging library)
      AC_CACHE_VAL(gdb_cv_have_aix_thread_debug,
                   [AC_TRY_COMPILE([#include <sys/pthdebug.h>],
                                   [#ifndef PTHDB_VERSION_3
                                    #error
                                    #endif],
                                   gdb_cv_have_aix_thread_debug=yes,
                                   gdb_cv_have_aix_thread_debug=no)])
      AC_MSG_RESULT($gdb_cv_have_aix_thread_debug)
      if test $gdb_cv_have_aix_thread_debug = yes; then
         CONFIG_SRCS="${CONFIG_SRCS} aix-thread.c"
         CONFIG_LIB_OBS="${CONFIG_LIB_OBS} aix-thread.o"
         CONFIG_LDFLAGS="${CONFIG_LDFLAGS} -lpthdebug"
      fi
      ;;
   esac
   AC_SUBST(CONFIG_LDFLAGS)
fi

dnl See if we have a thread_db header file that has TD_NOTALLOC.
if test "x$ac_cv_header_thread_db_h" = "xyes"; then
   AC_CACHE_CHECK([whether <thread_db.h> has TD_NOTALLOC],
                  gdb_cv_thread_db_h_has_td_notalloc,
     AC_TRY_COMPILE(
       [#include <thread_db.h>],
       [int i = TD_NOTALLOC;],
       gdb_cv_thread_db_h_has_td_notalloc=yes,
       gdb_cv_thread_db_h_has_td_notalloc=no
     )
   )
fi
if test "x$gdb_cv_thread_db_h_has_td_notalloc" = "xyes"; then
  AC_DEFINE(THREAD_DB_HAS_TD_NOTALLOC, 1,
            [Define if <thread_db.h> has the TD_NOTALLOC error code.])
fi

dnl See if we have a sys/syscall header file that has __NR_tkill.
if test "x$ac_cv_header_sys_syscall_h" = "xyes"; then
   AC_CACHE_CHECK([whether <sys/syscall.h> has __NR_tkill],
                  gdb_cv_sys_syscall_h_has_tkill,
     AC_TRY_COMPILE(
       [#include <sys/syscall.h>],
       [int i = __NR_tkill;],
       gdb_cv_sys_syscall_h_has_tkill=yes,
       gdb_cv_sys_syscall_h_has_tkill=no
     )
   )
fi
dnl See if we can issue tkill syscall.
if test "x$gdb_cv_sys_syscall_h_has_tkill" = "xyes" && test "x$ac_cv_func_syscall" = "xyes"; then
  AC_DEFINE(HAVE_TKILL_SYSCALL, 1,
            [Define if we can use the tkill syscall.])
fi

dnl Handle optional features that can be enabled.

AC_ARG_WITH(sysroot,
[  --with-sysroot[=DIR] Search for usr/lib et al within DIR.],
[
 case ${with_sysroot} in
 yes) TARGET_SYSTEM_ROOT='${exec_prefix}/${target_alias}/sys-root' ;;
 *) TARGET_SYSTEM_ROOT=$with_sysroot ;;
 esac

 TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"$(TARGET_SYSTEM_ROOT)\"'

 if test "x$exec_prefix" = xNONE; then
  if test "x$prefix" = xNONE; then
   test_prefix=/usr/local
  else
   test_prefix=$prefix
  fi
 else
  test_prefix=$exec_prefix
 fi
 case ${TARGET_SYSTEM_ROOT} in
 "${test_prefix}"|"${test_prefix}/"*|\
 '${exec_prefix}'|'${exec_prefix}/'*)
   t="$TARGET_SYSTEM_ROOT_DEFINE -DTARGET_SYSTEM_ROOT_RELOCATABLE"
   TARGET_SYSTEM_ROOT_DEFINE="$t"
   ;;
 esac
], [
 TARGET_SYSTEM_ROOT=
 TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"\"'
])
AC_SUBST(TARGET_SYSTEM_ROOT)
AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE)

# NOTE: Don't add -Wall or -Wunused, they both include
# -Wunused-parameter which reports bogus warnings.
# NOTE: If you add to this list, remember to update
# gdb/doc/gdbint.texinfo.
build_warnings="-Wimplicit -Wreturn-type -Wcomment -Wtrigraphs \
-Wformat -Wparentheses -Wpointer-arith -Wuninitialized -Wformat-nonliteral \
-Wunused-label"
# Up for debate: -Wswitch -Wcomment -trigraphs -Wtrigraphs
# -Wunused-function -Wunused-variable -Wunused-value
# -Wchar-subscripts -Wtraditional -Wshadow -Wcast-qual
# -Wcast-align -Wwrite-strings -Wconversion -Wstrict-prototypes
# -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls
# -Woverloaded-virtual -Winline -Werror"
AC_ARG_ENABLE(build-warnings,
[  --enable-build-warnings Enable build-time compiler warnings if gcc is used],
[case "${enableval}" in
  yes)	;;
  no)	build_warnings="-w";;
  ,*)   t=`echo "${enableval}" | sed -e "s/,/ /g"`
        build_warnings="${build_warnings} ${t}";;
  *,)   t=`echo "${enableval}" | sed -e "s/,/ /g"`
        build_warnings="${t} ${build_warnings}";;
  *)    build_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;;
esac
if test x"$silent" != x"yes" && test x"$build_warnings" != x""; then
  echo "Setting compiler warning flags = $build_warnings" 6>&1
fi])dnl
AC_ARG_ENABLE(gdb-build-warnings,
[  --enable-gdb-build-warnings Enable GDB specific build-time compiler warnings if gcc is used],
[case "${enableval}" in
  yes)	;;
  no)	build_warnings="-w";;
  ,*)   t=`echo "${enableval}" | sed -e "s/,/ /g"`
        build_warnings="${build_warnings} ${t}";;
  *,)   t=`echo "${enableval}" | sed -e "s/,/ /g"`
        build_warnings="${t} ${build_warnings}";;
  *)    build_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;;
esac
if test x"$silent" != x"yes" && test x"$build_warnings" != x""; then
  echo "Setting GDB specific compiler warning flags = $build_warnings" 6>&1
fi])dnl
WARN_CFLAGS=""
WERROR_CFLAGS=""
if test "x${build_warnings}" != x -a "x$GCC" = xyes
then
    AC_MSG_CHECKING(compiler warning flags)
    # Separate out the -Werror flag as some files just cannot be
    # compiled with it enabled.
    for w in ${build_warnings}; do
	case $w in
	-Werr*) WERROR_CFLAGS=-Werror ;;
	*) # Check that GCC accepts it
	    saved_CFLAGS="$CFLAGS"
	    CFLAGS="$CFLAGS $w"
	    AC_TRY_COMPILE([],[],WARN_CFLAGS="${WARN_CFLAGS} $w",)
	    CFLAGS="$saved_CFLAGS"
	esac
    done
    AC_MSG_RESULT(${WARN_CFLAGS}${WERROR_CFLAGS})
fi
AC_SUBST(WARN_CFLAGS)
AC_SUBST(WERROR_CFLAGS)

# In the Cygwin environment, we need some additional flags.
AC_CACHE_CHECK([for cygwin], gdb_cv_os_cygwin,
[AC_EGREP_CPP(lose, [
#if defined (__CYGWIN__) || defined (__CYGWIN32__)
lose
#endif],[gdb_cv_os_cygwin=yes],[gdb_cv_os_cygwin=no])])


dnl Figure out which of the many generic ser-*.c files the _host_ supports.
SER_HARDWIRE="ser-unix.o ser-pipe.o ser-tcp.o"
case ${host} in
  *go32* ) SER_HARDWIRE=ser-go32.o ;;
  *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
esac
AC_SUBST(SER_HARDWIRE)

# libreadline needs libuser32.a in a cygwin environment
WIN32LIBS=
if test x$gdb_cv_os_cygwin = xyes; then
    WIN32LIBS="-luser32"
    case "${target}" in
	*cygwin*) WIN32LIBS="$WIN32LIBS -limagehlp"
	;;
    esac
fi
AC_SUBST(WIN32LIBS)

LIBGUI="../libgui/src/libgui.a"
GUI_CFLAGS_X="-I${srcdir}/../libgui/src"
AC_SUBST(LIBGUI)
AC_SUBST(GUI_CFLAGS_X)

WIN32LDAPP=
AC_SUBST(WIN32LIBS)
AC_SUBST(WIN32LDAPP)

configdir="unix"

GDBTKLIBS=
if test "${enable_gdbtk}" = "yes"; then

    # Gdbtk must have an absolute path to srcdir in order to run
    # properly when not installed.
    here=`pwd`
    cd ${srcdir}
    GDBTK_SRC_DIR=`pwd`
    cd $here

    CY_AC_PATH_TCLCONFIG
    if test -z "${no_tcl}"; then
	CY_AC_LOAD_TCLCONFIG
	CY_AC_PATH_TKCONFIG

	# now look for Tcl library stuff

	case "${host}" in
	*-*-cygwin*)
	    tcldir=../tcl/win/
	    ;;
	*)
	    tcldir=../tcl/unix/
	    ;;
	esac

	TCL_DEPS="${tcldir}${TCL_LIB_FILE}"

	# If $no_tk is nonempty, then we can't do Tk, and there is no
	# point to doing Tcl.
	if test -z "${no_tk}"; then
	   CY_AC_LOAD_TKCONFIG
	   CY_AC_PATH_TCLH
	   CY_AC_PATH_TKH
	   CY_AC_PATH_ITCLH
	   CY_AC_PATH_ITKH


	   # now look for Tk library stuff

	   case "${host}" in
	   *-*-cygwin*)
	       tkdir=../tk/win/
	       ;;
	   *)
	       tkdir=../tk/unix/
	       ;;
	   esac

	   TK_DEPS="${tkdir}${TK_LIB_FILE}"

	   # now look for Itcl library stuff

	   CY_AC_PATH_ITCLCONFIG
           if test -z "${no_itcl}"; then
             CY_AC_LOAD_ITCLCONFIG 

	     ITCLLIB="${ITCL_BUILD_LIB_SPEC}"
	     ITCL_DEPS="${ITCL_LIB_FULL_PATH}"
           fi

	   
	   # now look for Itk library stuff
	   CY_AC_PATH_ITKCONFIG
           if test -z "${no_itcl}"; then
             CY_AC_LOAD_ITKCONFIG

	     ITKLIB="${ITK_BUILD_LIB_SPEC}"
	     ITK_DEPS="${ITK_LIB_FULL_PATH}"
           fi

           ENABLE_CFLAGS="${ENABLE_CFLAGS} \$(SUBDIR_GDBTK_CFLAGS)"
	   # Tcl/Tk 8.1 require -fwritable strings.  I don't
           # know whether 8.2 will or not, but I bet it will.
           # I don't have to worry about 7.x since we don't support it.
           GDBTK_CFLAGS=""
	   if test "$GCC" = "yes"; then
               if test "$TCL_VERSION" != "8.0" ; then
                   GDBTK_CFLAGS="-fwritable-strings"
	       fi
           fi

	   # Include some libraries that Tcl and Tk want.
	   TCL_LIBS='$(LIBGUI) $(ITCL) $(ITK) $(TK) $(TCL) $(X11_LDFLAGS) $(X11_LIBS)'
	   # Yes, the ordering seems wrong here.  But it isn't.
	   # TK_LIBS is the list of libraries that need to be linked
	   # after Tcl/Tk.  Note that this isn't put into LIBS.  If it
	   # were in LIBS then any link tests after this point would
	   # try to include things like `$(LIBGUI)', which wouldn't work.
	   GDBTKLIBS="${TCL_LIBS} ${TK_LIBS}"

           CONFIG_OBS="${CONFIG_OBS} \$(SUBDIR_GDBTK_OBS)"
           CONFIG_DEPS="${CONFIG_DEPS} \$(SUBDIR_GDBTK_DEPS)"
           CONFIG_SRCS="${CONFIG_SRCS} \$(SUBDIR_GDBTK_SRCS)"
           CONFIG_INITS="${CONFIG_INITS} \$(SUBDIR_GDBTK_INITS)"
	   CONFIG_ALL="${CONFIG_ALL} \$(SUBDIR_GDBTK_ALL)"
	   CONFIG_CLEAN="${CONFIG_CLEAN} \$(SUBDIR_GDBTK_CLEAN)"
	   CONFIG_INSTALL="${CONFIG_INSTALL} \$(SUBDIR_GDBTK_INSTALL)"
	   CONFIG_UNINSTALL="${CONFIG_UNINSTALL} \$(SUBDIR_GDBTK_UNINSTALL)"

	   if test x$gdb_cv_os_cygwin = xyes; then
	      WIN32LIBS="${WIN32LIBS} -lshell32 -lgdi32 -lcomdlg32 -ladvapi32"
	      WIN32LDAPP="-Wl,--subsystem,console"
	      CONFIG_OBS="${CONFIG_OBS} gdbres.o"
	   fi
	fi
    fi

    configdirs="${configdirs} gdbtk"
fi

AC_SUBST(X_CFLAGS)
AC_SUBST(X_LDFLAGS)
AC_SUBST(X_LIBS)
AC_SUBST(TCL_DEPS)
AC_SUBST(TK_DEPS)
AC_SUBST(ITCLLIB)
AC_SUBST(ITCL_DEPS)
AC_SUBST(ITKLIB)
AC_SUBST(ITK_DEPS)
AC_SUBST(GDBTKLIBS)
AC_SUBST(GDBTK_CFLAGS)
AC_SUBST(GDBTK_SRC_DIR)

AC_PATH_X

 
# Unlike the sim directory, whether a simulator is linked is controlled by 
# presence of a SIM= and a SIM_OBS= definition in the target '.mt' file.  
# This code just checks for a few cases where we'd like to ignore those
# definitions, even when they're present in the '.mt' file.  These cases
# are when --disable-sim is specified, or if the simulator directory is
# not part of the source tree.
#
AC_ARG_ENABLE(sim,
[  --enable-sim            Link gdb with simulator],
[echo "enable_sim = $enable_sim";
 echo "enableval = ${enableval}";
 case "${enableval}" in
  yes) ignore_sim=false ;;
  no)  ignore_sim=true ;;
  *)   ignore_sim=false ;;
 esac],
[ignore_sim=false])

if test ! -d "${srcdir}/../sim"; then
  ignore_sim=true
fi

if test "${ignore_sim}" = "true"; then
    IGNORE_SIM="SIM="
    IGNORE_SIM_OBS="SIM_OBS="
else
    IGNORE_SIM=""
    IGNORE_SIM_OBS=""
    AC_DEFINE(WITH_SIM)
fi
AC_SUBST(IGNORE_SIM)
AC_SUBST(IGNORE_SIM_OBS)

AC_SUBST(ENABLE_CFLAGS)
AC_SUBST(PROFILE_CFLAGS)

AC_SUBST(CONFIG_OBS)
AC_SUBST(CONFIG_LIB_OBS)
AC_SUBST(CONFIG_DEPS)
AC_SUBST(CONFIG_SRCS)
AC_SUBST(CONFIG_INITS)
AC_SUBST(CONFIG_ALL)
AC_SUBST(CONFIG_CLEAN)
AC_SUBST(CONFIG_INSTALL)
AC_SUBST(CONFIG_UNINSTALL)

# target_subdir is used by the testsuite to find the target libraries.
target_subdir=
if test "${host}" != "${target}"; then
    target_subdir="${target_alias}/"
fi
AC_SUBST(target_subdir)

frags=
host_makefile_frag=${srcdir}/config/${gdb_host_cpu}/${gdb_host}.mh
if test ! -f ${host_makefile_frag}; then
    # When building a native debuger the .mh file containing things
    # like NATDEPFILES is needed.  Cross debuggers don't need .mh
    # since it no longer contains anything useful.
    if test "${target}" = "${host}"; then
	AC_MSG_ERROR("*** Gdb does not support native target ${host}")
    else
	host_makefile_frag=/dev/null
    fi
fi
frags="$frags $host_makefile_frag"

target_makefile_frag=${srcdir}/config/${gdb_target_cpu}/${gdb_target}.mt
if test ! -f ${target_makefile_frag}; then
AC_MSG_ERROR("*** Gdb does not support target ${target}")
fi
frags="$frags $target_makefile_frag"

AC_SUBST_FILE(host_makefile_frag)
AC_SUBST_FILE(target_makefile_frag)
AC_SUBST(frags)

changequote(,)dnl
hostfile=`sed -n '
s/XM_FILE[ 	]*=[ 	]*\([^ 	]*\)/\1/p
' ${host_makefile_frag}`

targetfile=`sed -n '
s/TM_FILE[ 	]*=[ 	]*\([^ 	]*\)/\1/p
' ${target_makefile_frag}`

if test "${target}" = "${host}"; then
# We pick this up from the host configuration file (.mh) because we
# do not have a native configuration Makefile fragment.
nativefile=`sed -n '
s/NAT_FILE[ 	]*=[ 	]*\([^ 	]*\)/\1/p
' ${host_makefile_frag}`
fi
changequote([,])

if test x"${gdb_osabi}" != x ; then
    AC_DEFINE_UNQUOTED(GDB_OSABI_DEFAULT, $gdb_osabi,
		       [Define to the default OS ABI for this configuration.])
fi

# Enable multi-ice-gdb-server.
AC_ARG_ENABLE(multi-ice,
[  --enable-multi-ice      build the multi-ice-gdb-server],
  [case $enableval in
    yes | no)
      ;;
    *) AC_MSG_ERROR([bad value $enableval for --enable-multi-ice]) ;;
  esac])
if test "x$enable_multi_ice" = xyes; then
  configdirs="$configdirs multi-ice"
fi

# We only build gdbserver automatically if host and target are the same.
if test "x$target" = "x$host"; then
  AC_MSG_CHECKING(whether gdbserver is supported on this host)
  if test "x$build_gdbserver" = xyes; then
    configdirs="$configdirs gdbserver"
    AC_MSG_RESULT(yes)
  else
    AC_MSG_RESULT(no)
  fi
fi

AC_CONFIG_SUBDIRS($configdirs)

# If hostfile (XM_FILE) and/or targetfile (TM_FILE) and/or nativefile
# (NAT_FILE) is not set in config/*/*.m[ht] files, we link to an empty
# version.

files=
links=

rm -f xm.h
xm_h=""
if test "${hostfile}" != ""; then
    xm_h=xm.h
    GDB_XM_FILE="config/${gdb_host_cpu}/${hostfile}"
    files="${files} ${GDB_XM_FILE}"
    links="${links} xm.h"
    AC_DEFINE_UNQUOTED(GDB_XM_FILE, ${GDB_XM_FILE})
fi
AC_SUBST(xm_h)

rm -f tm.h
tm_h=""
if test "${targetfile}" != ""; then
    tm_h=tm.h
    GDB_TM_FILE="config/${gdb_target_cpu}/${targetfile}"
    files="${files} ${GDB_TM_FILE}"
    links="${links} tm.h"
    AC_DEFINE_UNQUOTED(GDB_TM_FILE, ${GDB_TM_FILE})
fi
AC_SUBST(tm_h)

rm -f nm.h
nm_h=""
if test "${nativefile}" != ""; then
    nm_h=nm.h
    GDB_NM_FILE="config/${gdb_host_cpu}/${nativefile}"
    files="${files} ${GDB_NM_FILE}"
    links="${links} nm.h"
    AC_DEFINE_UNQUOTED(GDB_NM_FILE, ${GDB_NM_FILE})
fi
AC_SUBST(nm_h)

AC_LINK_FILES($files, $links)

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

dnl  Detect the character set used by this host.

dnl  At the moment, we just assume it's ISO-8859-1 (which is a
dnl  superset of ASCII containing the characters needed for French,
dnl  German, Spanish, Italian, and possibly others), but if were
dnl  *were* to support any host character sets other than ISO-8859-1,
dnl  here's where we'd detect it.
AC_DEFINE(GDB_DEFAULT_HOST_CHARSET, "ISO-8859-1",
          [Define to be a string naming the default host character set.])

AM_ICONV

AC_OUTPUT(Makefile .gdbinit:gdbinit.in,
[
dnl Autoconf doesn't provide a mechanism for modifying definitions 
dnl provided by makefile fragments.
dnl
if test "${nativefile}" = ""; then
        < Makefile \
        sed -e '/^NATDEPFILES[[ 	]]*=.*\\$/,/[[^\\]]$/s/^/# /' \
            -e '/^NATDEPFILES[[ 	]]*=/s/^/# /' \
        | sed -e '/^\(NATDEPFILES[[ 	]]*[[+]]=[[ 	]]*\)/s//# \1/' \
	> Makefile.tem
mv -f Makefile.tem Makefile
fi

changequote(,)dnl
sed -e '/^TM_FILE[ 	]*=/s,^TM_FILE[ 	]*=[ 	]*,&config/'"${gdb_target_cpu}"'/,
/^XM_FILE[ 	]*=/s,^XM_FILE[ 	]*=[ 	]*,&config/'"${gdb_host_cpu}"'/,
/^NAT_FILE[ 	]*=/s,^NAT_FILE[ 	]*=[ 	]*,&config/'"${gdb_host_cpu}"'/,' <Makefile >Makefile.tmp
mv -f Makefile.tmp Makefile
changequote([,])dnl


case x$CONFIG_HEADERS in
xconfig.h:config.in)
echo > stamp-h ;;
esac
],
[
gdb_host_cpu=$gdb_host_cpu
gdb_target_cpu=$gdb_target_cpu
nativefile=$nativefile
])

exit 0
