#! /bin/bash
##############################################################################

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

## Be warned, there are two types of configure.in files.  There are those
## used by Autoconf, which are macros which are expanded into a configure
## script by autoconf.  The other sort, of which this is one, is executed
## by Cygnus configure.  

## For more information on these two systems, check out the documentation
## for 'Autoconf' (autoconf.texi) and 'Configure' (configure.texi).  

#   Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
#
# This file 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 of the License, or
# (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

##############################################################################

### To add a new directory to the tree, first choose whether it is a target
### or a host dependent tool.  Then put it into the appropriate list
### (library or tools, host or target), doing a dependency sort.  For
### example, gdb requires that byacc (or bison) be built first, so it is in
### the ${host_tools} list after byacc and bison.  


# these libraries are used by various programs built for the host environment
#
host_libs="mmalloc libiberty opcodes bfd readline gash db tcl tk tclX itcl tix"

if [ "${enable_gdbgui}" = "yes" ] ; then
	host_libs="${host_libs} libgui"
fi

# these tools are built for the host environment
# Note, the powerpc-eabi build depends on sim occurring before gdb in order to
# know that we are building the simulator.
host_tools="texinfo byacc flex bison binutils ld gas gcc sim gdb make patch prms send-pr gprof gdbtest tgas etc expect dejagnu bash m4 autoconf automake ispell grep diff rcs cvs fileutils shellutils time textutils wdiff find emacs emacs19 uudecode hello tar gzip indent recode release sed utils guile perl apache inet gawk findutils sn"

# these libraries are built for the target environment, and are built after
# the host libraries and the host tools (which may be a cross compiler)
#
target_libs="target-libiberty target-libgloss target-newlib target-libio target-librx target-libstdc++ target-libg++"


# these tools are built using the target libs, and are intended to run only
# in the target environment
#
# note: any program that *uses* libraries that are in the "target_libs"
# list belongs in this list.  those programs are also very likely
# candidates for the "native_only" list which follows
#
target_tools="target-examples target-groff target-gperf"

################################################################################

## These two lists are of directories that are to be removed from the
## ${configdirs} list for either cross-compilations or for native-
## compilations.  For example, it doesn't make that much sense to
## cross-compile Emacs, nor is it terribly useful to compile target-libiberty in
## a native environment.  

# directories to be built in the native environment only
#
# This must be a single line because of the way it is searched by grep in
# the code below.
native_only="autoconf automake cvs emacs emacs19 fileutils find gawk grep gzip hello indent ispell m4 rcs recode sed shellutils tar textutils gash uudecode wdiff gprof target-groff guile perl apache inet time bash prms sn gnuserv target-gperf"

# directories to be built in a cross environment only
#
cross_only="target-libgloss target-newlib"

## All tools belong in one of the four categories, and are assigned above
## We assign ${configdirs} this way to remove all embedded newlines.  This
## is important because configure will choke if they ever get through.
## ${configdirs} is directories we build using the host tools.
## ${target_configdirs} is directories we build using the target tools.
#
configdirs=`echo ${host_libs} ${host_tools}`
target_configdirs=`echo ${target_libs} ${target_tools}`

################################################################################

srctrigger=move-if-change
srcname="gnu development package"

# This gets set non-empty for some net releases of packages.
appdirs=""

# per-host:

# Work in distributions that contain no compiler tools, like Autoconf.
if [ -d ${srcdir}/config ]; then
case "${host}" in
  m68k-hp-hpux*)	  host_makefile_frag=config/mh-hp300 ;;
  m68k-apollo-sysv*)      host_makefile_frag=config/mh-apollo68 ;;
  m68k-apollo-bsd*)       host_makefile_frag=config/mh-a68bsd ;;
  m88k-dg-dgux*)	  host_makefile_frag=config/mh-dgux ;;
  m88k-harris-cxux*)	  host_makefile_frag=config/mh-cxux ;;
  m88k-motorola-sysv*)    host_makefile_frag=config/mh-delta88;;
  mips*-dec-ultrix*)      host_makefile_frag=config/mh-decstation ;;
  mips*-nec-sysv4*)	  host_makefile_frag=config/mh-necv4 ;;
  mips*-sgi-irix6*)	  host_makefile_frag=config/mh-irix6 ;;
  mips*-sgi-irix5*)	  host_makefile_frag=config/mh-irix5 ;;
  mips*-sgi-irix4*)       host_makefile_frag=config/mh-irix4 ;;
  mips*-sgi-irix3*)       host_makefile_frag=config/mh-sysv ;;
  mips*-*-sysv4*)	  host_makefile_frag=config/mh-sysv4 ;;
  mips*-*-sysv*)	  host_makefile_frag=config/mh-riscos ;;
  i[3456]86-*-dgux*)	  host_makefile_frag=config/mh-dgux386 ;;
  i[3456]86-ncr-sysv4.3*) host_makefile_frag=config/mh-ncrsvr43 ;;
  i[3456]86-ncr-sysv4*)   host_makefile_frag=config/mh-ncr3000 ;;
  i[3456]86-*-sco3.2v5*)  host_makefile_frag=config/mh-sysv ;;
  i[3456]86-*-sco*)       host_makefile_frag=config/mh-sco ;;
  i[3456]86-*-isc*)	  host_makefile_frag=config/mh-sysv ;;
  i[3456]86-*-solaris2*)  host_makefile_frag=config/mh-sysv4 ;;
  i[3456]86-*-aix*)	  host_makefile_frag=config/mh-aix386 ;;
  i[3456]86-*-go32*)	  host_makefile_frag=config/mh-go32 ;;
  i[3456]86-*-msdosdjgpp*) host_makefile_frag=config/mh-go32 ;;
  *-cygwin32*)	  	  host_makefile_frag=config/mh-cygwin32 ;;
  *-windows*)	  	  host_makefile_frag=config/mh-windows ;;
  vax-*-ultrix2*)         host_makefile_frag=config/mh-vaxult2 ;;
  *-*-solaris2*)          host_makefile_frag=config/mh-solaris ;;
  m68k-sun-sunos*)	  host_makefile_frag=config/mh-sun3 ;;
  *-hp-hpux[78]*)         host_makefile_frag=config/mh-hpux8 ;;
  *-hp-hpux*)             host_makefile_frag=config/mh-hpux ;;
  *-*-hiux*)              host_makefile_frag=config/mh-hpux ;;
  rs6000-*-lynxos*)	  host_makefile_frag=config/mh-lynxrs6k ;;
  *-*-lynxos*)	  	  host_makefile_frag=config/mh-lynxos ;;
  *-*-sysv4*)             host_makefile_frag=config/mh-sysv4 ;;
  *-*-sysv*)              host_makefile_frag=config/mh-sysv ;;
esac
fi

# If we aren't going to be using gcc, see if we can extract a definition
# of CC from the fragment.
if [ -z "${CC}" -a "${build}" = "${host}" ]; then
  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}:"
  found=
  for dir in $PATH; do
    test -z "$dir" && dir=.
    if test -f $dir/gcc; then
      found=yes
      break
    fi
  done
  IFS="$save_ifs"
  if [ -z "${found}" -a -n "${host_makefile_frag}" -a -f "${srcdir}/${host_makefile_frag}" ]; then
    xx=`sed -n -e 's/^[ 	]*CC[ 	]*=[ 	]*\(.*\)$/\1/p' < ${srcdir}/${host_makefile_frag}`
    if [ -n "${xx}" ] ; then
      CC=$xx
    fi
  fi
fi

# We default to --with-shared on platforms where -fpic is meaningless.
# Well, we don't yet, but we will.
if false && [ "${host}" = "${target}" ] && [ x${enable_shared} = x ]; then
  case "${target}" in
    alpha-dec-osf*)	enable_shared=yes ;;
    alpha-*-linux*)	enable_shared=yes ;;
    mips-sgi-irix5*)	enable_shared=yes ;;
    *)			enable_shared=no ;;
  esac
fi

case "${enable_shared}" in
  yes) shared=yes ;;
  no) shared=no ;;
  "") shared=no ;;
  *) shared=yes ;;
esac

if [ x${shared} = xyes ]; then
  waugh=
  case "${host}" in
    hppa*)		waugh=config/mh-papic ;;
    i[3456]86-*)	waugh=config/mh-x86pic ;;
    sparc64-*)		waugh=config/mh-sparcpic ;;
    powerpc*-*)		waugh=config/mh-ppcpic ;;
    alpha-*-linux*)     waugh=config/mh-elfalphapic ;;
    *)			waugh=config/mh-${host_cpu}pic ;;
  esac
  if [ -f ${srcdir}/${waugh} ]; then
    if [ -n "${host_makefile_frag}" ] ; then
      cat ${srcdir}/${host_makefile_frag} > mh-frag
      cat ${srcdir}/${waugh} >> mh-frag
      host_makefile_frag=mh-frag
    else
      host_makefile_frag=${waugh}
    fi
  fi
fi

# per-target:

case "${target}" in
  v810*)		target_makefile_frag=config/mt-v810 ;;
  i[3456]86-*-netware*) target_makefile_frag=config/mt-netware ;;
  powerpc-*-netware*)   target_makefile_frag=config/mt-netware ;;
  *-*-linux-gnu)        target_makefile_frag=config/mt-linux ;;
esac

skipdirs=
gasdir=gas
use_gnu_ld=
use_gnu_as=

# some tools are so dependent upon X11 that if we're not building with X, 
# it's not even worth trying to configure, much less build, that tool.

case ${with_x} in
  yes | "")  # the default value for this tree is that X11 is available
	;;
  no)
	skipdirs="${skipdirs} tk gash"
	;;
  *)
    	echo "*** bad value \"${with_x}\" for -with-x flag; ignored" 1>&2
    	;;
esac

# Some tools are only suitable for building in a "native" situation.
# Those are added when we have a host==target configuration.  For cross
# toolchains, we add some directories that should only be useful in a
# cross-compiler.

is_cross_compiler=

if [ x"${host}" = x"${target}" ] ; then
	# when doing a native toolchain, don't build the targets
	# that are in the 'cross only' list
	skipdirs="${skipdirs} ${cross_only}"
	is_cross_compiler=no
	# Default to --enable-multilib.  See similar code below.
	if [ x${enable_multilib} = xno ]; then
	  target_subdir=.
	else
	  target_subdir=libraries
	fi
else
	# similarly, don't build the targets in the 'native only' 
	# list when building a cross compiler
	skipdirs="${skipdirs} ${native_only}"
	is_cross_compiler=yes
	target_subdir=${target_alias}
fi	

if [ ! -d ${target_subdir} ] ; then
  if mkdir ${target_subdir} ; then true
  else
    echo "'*** could not make ${PWD=`pwd`}/${target_subdir}" 1>&2
    exit 1
  fi
fi

copy_dirs=

# Handle --with-headers=XXX.  The contents of the named directory are
# copied to $(tooldir)/sys-include.
if [ x"${with_headers}" != x ]; then
  if [ x${is_cross_compiler} = xno ]; then
    echo 1>&2 '***' --with-headers is only supported when cross compiling
    exit 1
  fi
  case "${exec_prefixoption}" in
  "") x=${prefix} ;;
  *) x=${exec_prefix} ;;
  esac
  copy_dirs="${copy_dirs} ${with_headers} $x/${target_alias}/sys-include"
fi

# Handle --with-libs=XXX.  Multiple directories are permitted.  The
# contents are copied to $(tooldir)/lib.
if [ x"${with_libs}" != x ]; then
  if [ x${is_cross_compiler} = xno ]; then
    echo 1>&2 '***' --with-libs is only supported when cross compiling
    exit 1
  fi
  # Copy the libraries in reverse order, so that files in the first named
  # library override files in subsequent libraries.
  case "${exec_prefixoption}" in
  "") x=${prefix} ;;
  *) x=${exec_prefix} ;;
  esac
  for l in ${with_libs}; do
    copy_dirs="$l $x/${target_alias}/lib ${copy_dirs}"
  done
fi

# If both --with-headers and --with-libs are specified, default to
# --without-newlib.
if [ x"${with_headers}" != x ] && [ x"${with_libs}" != x ]; then
  if [ x"${with_newlib}" = x ]; then
    with_newlib=no
  fi
fi

# Recognize --with-newlib/--without-newlib.
if [ x${with_newlib} = xno ]; then
  skipdirs="${skipdirs} target-newlib"
elif [ x${with_newlib} = xyes ]; then
  skipdirs=`echo " ${skipdirs} " | sed -e 's/ target-newlib / /'`
fi

# Default to using --with-stabs for certain targets.
if [ x${with_stabs} = x ]; then
  case "${target}" in
  mips*-*-irix6*)
    ;;
  mips*-*-* | alpha*-*-osf* | i[3456]86*-*-sysv4* | i[3456]86*-*-unixware*)
    with_stabs=yes;
    withoptions="${withoptions} --with-stabs"
    ;;
  esac
fi

# Handle ${copy_dirs}
set fnord ${copy_dirs}
shift
while [ $# != 0 ]; do
  if [ -f $2/COPIED ] && [ x"`cat $2/COPIED`" = x"$1" ]; then
    :
  else
    echo Copying $1 to $2

    # Use the install script to create the directory and all required
    # parent directories.
    if [ -d $2 ]; then
      :
    else
      echo >config.temp
      ${srcdir}/install-sh -c -m 644 config.temp $2/COPIED
    fi

    # Copy the directory, assuming we have tar.
    # FIXME: Should we use B in the second tar?  Not all systems support it.
    (cd $1; tar -cf - .) | (cd $2; tar -xpf -)

    # It is the responsibility of the user to correctly adjust all
    # symlinks.  If somebody can figure out how to handle them correctly
    # here, feel free to add the code.

    echo $1 > $2/COPIED
  fi
  shift; shift
done

# Configure extra directories which are host specific

case "${host}" in
	i[3456]86-*-go32*)
	  configdirs="$configdirs dosrel" ;;
	*-cygwin32*)
	  configdirs="$configdirs dosrel" ;;
esac

# Remove more programs from consideration, based on the host or 
# target this usually means that a port of the program doesn't
# exist yet.

noconfigdirs=""

case "${host}" in
  i[3456]86-*-vsta)
    noconfigdirs="tcl expect dejagnu make texinfo bison patch flex byacc send-pr gprof uudecode dejagnu diff guile perl apache inet itcl tix db sn gnuserv"
    ;;
  i[3456]86-*-go32* | i[3456]86-*-msdosdjgpp*)
    noconfigdirs="tcl tk expect dejagnu make texinfo bison patch flex byacc send-pr uudecode dejagnu diff guile perl apache inet itcl tix db sn gnuserv"
	;;
  *-*-cygwin32)
     noconfigdirs="expect dejagnu cvs autoconf automake bison send-pr gprof rcs guile perl texinfo apache inet"
    ;;
  *-*-windows*)
# This is only used to build WinGDB...
# note that powerpc-eabi depends on sim configured before gdb.
     configdirs="bfd libiberty opcodes readline sim gdb"
     target_configdirs=
    ;;
  ppc*-*-pe)
     noconfigdirs="patch diff make tk tcl expect dejagnu cvs autoconf automake texinfo bison send-pr gprof rcs guile perl apache inet itcl tix db sn gnuserv"
    ;;
esac


case "${target}" in
  *-*-netware)
    noconfigdirs="$noconfigdirs target-libg++ target-libstdc++ target-librx target-newlib target-libiberty target-libgloss"
    ;;
  *-*-rtems*)
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
  *-*-vxworks*)
    noconfigdirs="$noconfigdirs target-newlib target-libgloss"
    ;;
  alpha-dec-osf*)
    # ld works, but does not support shared libraries.  emacs doesn't
    # work.  newlib is not 64 bit ready.  I'm not sure about fileutils.
    # gas doesn't generate exception information.
    noconfigdirs="$noconfigdirs gas ld emacs fileutils target-newlib target-libgloss"
    ;;
  alpha*-*-*vms*)
    noconfigdirs="$noconfigdirs gdb ld target-newlib target-libgloss"
    ;;
  alpha*-*-linux*)
    # newlib is not 64 bit ready
    noconfigdirs="$noconfigdirs target-newlib target-libgloss"
    # linux has rx in libc
    skipdirs="$skipdirs target-librx"
    ;;
  alpha*-*-*)
    # newlib is not 64 bit ready
    noconfigdirs="$noconfigdirs target-newlib target-libgloss"
    ;;
  arc-*-*)
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
  arm-*-pe*)
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
  arm-*-coff*)
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
  arm-*-riscix*)
    noconfigdirs="$noconfigdirs ld target-libgloss"
    ;;
  d10v-*-*)
    noconfigdirs="$noconfigdirs target-librx target-libg++ target-libstdc++ target-libio target-libgloss"
    ;;
  h8300*-*-* | \
  h8500-*-*)
    noconfigdirs="$noconfigdirs target-libg++ target-libstdc++ target-libio target-librx target-libgloss"
    ;;
  hppa*-*-*elf* | \
  hppa*-*-lites*)
    # Do configure ld/binutils/gas for this case.
    ;;
  hppa*-*-*)
    # HP's C compiler doesn't handle Emacs correctly (but on BSD and Mach
    # cc is gcc, and on any system a user should be able to link cc to
    # whatever they want.  FIXME, emacs emacs19).
    case "${CC}" in
	"" | cc*) noconfigdirs="$noconfigdirs emacs emacs19" ;;
        *) ;;
    esac
    noconfigdirs="$noconfigdirs ld shellutils"
    ;;
  i[3456]86-*-go32* | i[3456]-*-msdosdjgpp*)
    # but don't build gdb
    noconfigdirs="$noconfigdirs gdb target-libg++ target-libstdc++ target-libio target-librx"
    ;;
  *-*-linux*)
    # linux has rx in libc
    skipdirs="$skipdirs target-librx"
    ;;
  *-*-cygwin32)
    target_configdirs="$target_configdirs target-winsup"
    noconfigdirs="$noconfigdirs expect target-libgloss"
    # always build newlib.
    skipdirs=`echo " ${skipdirs} " | sed -e 's/ target-newlib / /'`

    # Can't build gdb for cygwin32 if not native.
    case "${host}" in
      *-*-cygwin32) ;; # keep gdb tcl tk expect etc.
      *) noconfigdirs="$noconfigdirs gdb tcl tk expect itcl tix db sn gnuserv"
         ;;
    esac
    ;;    
  i[3456]86-*-pe)
    noconfigdirs="$noconfigdirs target-libg++ target-libstdc++ target-libio target-librx target-libgloss"
    ;;
  i[3456]86-*-sco3.2v5*)
    # The linker does not yet know about weak symbols in COFF,
    # and is not configured to handle mixed ELF and COFF.
    noconfigdirs="$noconfigdirs gprof ld target-libgloss"
    ;;
  i[3456]86-*-sco*)
    noconfigdirs="$noconfigdirs gprof target-libgloss"
    ;;
  i[3456]86-*-solaris2*)
    # The linker does static linking correctly, but the Solaris C library
    # has bugs such that some important functions won't work when statically
    # linked.  (See man pages for getpwuid, for example.)
    noconfigdirs="$noconfigdirs ld target-libgloss"
    ;;
  i[3456]86-*-sysv4*)
    # The SYSV4 C compiler doesn't handle Emacs correctly
    case "${CC}" in
	"" | cc*) noconfigdirs="$noconfigdirs emacs emacs19" ;;
        *) ;;
    esac
    # but that's okay since emacs doesn't work anyway
    noconfigdirs="$noconfigdirs emacs emacs19 target-libgloss"
    ;;
  mn10200-*-*)
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
  mn10300-*-*)
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
  powerpc-*-aix*)
    # copied from rs6000-*-* entry
    noconfigdirs="$noconfigdirs gprof cvs target-libgloss"
    # This is needed until gcc and ld are fixed to work together.
    use_gnu_ld=no
    ;;
  powerpc*-*-winnt* | powerpc*-*-pe* | ppc*-*-pe)
    target_configdirs="$target_configdirs target-winsup"
    noconfigdirs="$noconfigdirs gdb tcl tk make expect target-libgloss itcl tix db sn gnuserv"
    # always build newlib.
    skipdirs=`echo " ${skipdirs} " | sed -e 's/ target-newlib / /'`
    ;;
    # This is temporary until we can link against shared libraries
  powerpcle-*-solaris*)
    noconfigdirs="$noconfigdirs gdb sim make tcl tk expect itcl tix db sn gnuserv"
    ;;
  rs6000-*-lynxos*)
    # The CVS server code doesn't work on the RS/6000
    # Newlib makes problems for libg++ in crosses.
    noconfigdirs="$noconfigdirs target-newlib gprof cvs"
    ;;
  rs6000-*-aix*)
    noconfigdirs="$noconfigdirs gprof"
    # This is needed until gcc and ld are fixed to work together.
    use_gnu_ld=no
    ;;
  rs6000-*-*)
    noconfigdirs="$noconfigdirs gprof"
    ;;
  m68k-apollo-*)
    noconfigdirs="$noconfigdirs ld binutils gprof target-libgloss"
    ;;
  mips*-*-irix5*)
    # The GNU linker does not support shared libraries.
    # emacs is emacs 18, which does not work on Irix 5 (emacs19 does work)
    noconfigdirs="$noconfigdirs ld gprof emacs target-libgloss"
    ;;
  mips*-*-irix6*)
    # The GNU assembler and linker do not support IRIX 6.
    # emacs is emacs 18, which does not work on Irix 5 (emacs19 does work)
    noconfigdirs="$noconfigdirs ld gas gprof emacs target-libgloss"
    ;;
  mips*-dec-bsd*)
    noconfigdirs="$noconfigdirs gprof target-libgloss"
    ;;
  mips*-*-bsd*)
    noconfigdirs="$noconfigdirs gprof target-libgloss"
    ;;
  mips*-*-*)
    noconfigdirs="$noconfigdirs gprof"
    ;;
  romp-*-*)
    noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss"
    ;;
  sh-*-*)
    case "${host}" in
      i[3456]86-*-vsta) ;; # don't add gprof back in
      i[3456]86-*-go32*) ;; # don't add gprof back in
      i[3456]86-*-msdosdjgpp*) ;; # don't add gprof back in
      *) skipdirs=`echo " ${skipdirs} " | sed -e 's/ gprof / /'` ;;
    esac
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
  sparc-*-sunos4*)
    if [ x${is_cross_compiler} != xno ] ; then
           noconfigdirs="$noconfigdirs gdb gdbtest target-newlib target-libgloss"
    else
           use_gnu_ld=no
    fi
    ;;
  v810-*-*)
    noconfigdirs="$noconfigdirs bfd binutils gas gcc gdb ld target-libio target-libg++ target-libstdc++ opcodes target-libgloss"
    ;;
  vax-*-vms)
    noconfigdirs="$noconfigdirs bfd binutils gdb ld target-newlib opcodes target-libgloss"
    ;;
  vax-*-*)
    noconfigdirs="$noconfigdirs target-newlib target-libgloss"
    ;;
  *-*-lynxos*)
    # Newlib makes problems for libg++ in crosses.
    noconfigdirs="$noconfigdirs target-newlib target-libgloss"
    ;; 
  *-*-macos* | \
  *-*-mpw*)
    # Macs want a resource compiler.
    configdirs="$configdirs grez"
    ;;    
esac

# targets that need a second pass
case "${target}" in
  *-gm-magic*)
    noconfigdirs="$noconfigdirs target-libgloss"
    ;;
esac

# If we aren't building newlib, then don't build libgloss, since libgloss
# depends upon some newlib header files.
case "${noconfigdirs}" in
  *target-libgloss*) ;;
  *target-newlib*) noconfigdirs="$noconfigdirs target-libgloss" ;;
esac

# If we are building a Canadian Cross, discard tools that can not be built
# using a cross compiler.  FIXME: These tools should be fixed.
if [ "${build}" != "${host}" ]; then
  noconfigdirs="$noconfigdirs expect dejagnu"
fi

# Make sure we don't let GNU ld be added if we didn't want it.
if [ x$with_gnu_ld = xno ]; then
  use_gnu_ld=no
  noconfigdirs="$noconfigdirs ld"
fi

# Make sure we don't let GNU as be added if we didn't want it.
if [ x$with_gnu_as = xno ]; then
  use_gnu_as=no
  noconfigdirs="$noconfigdirs gas"
fi

# Remove the entries in $skipdirs and $noconfigdirs from $configdirs and
# $target_configdirs.
# If we have the source for $noconfigdirs entries, add them to $notsupp.

notsupp=""
for dir in . $skipdirs $noconfigdirs ; do
  dirname=`echo $dir | sed -e s/target-//g`
  if [ $dir != . ]  && echo " ${configdirs} " | grep " ${dir} " >/dev/null 2>&1; then
    configdirs=`echo " ${configdirs} " | sed -e "s/ ${dir} / /"`
    if [ -r $srcdir/$dirname/configure ] \
	|| [ -r $srcdir/$dirname/configure.in ]; then
      if echo " ${skipdirs} " | grep " ${dir} " >/dev/null 2>&1; then
	true
      else
	notsupp="$notsupp $dir"
      fi
    fi
  fi
  if [ $dir != . ]  && echo " ${target_configdirs} " | grep " ${dir} " >/dev/null 2>&1; then
    target_configdirs=`echo " ${target_configdirs} " | sed -e "s/ ${dir} / /"`
    if [ -r $srcdir/$dirname/configure ] \
	|| [ -r $srcdir/$dirname/configure.in ]; then
      if echo " ${skipdirs} " | grep " ${dir} " >/dev/null 2>&1; then
	true
      else
	notsupp="$notsupp $dir"
      fi
    fi
  fi
done

# Sometimes the tools are distributed with libiberty but with no other
# libraries.  In that case, we don't want to build target-libiberty.
if [ -n "${target_configdirs}" ]; then
  others=
  for i in `echo ${target_configdirs} | sed -e s/target-//g` ; do
    if [ "$i" != "libiberty" ]; then
      if [ -r $srcdir/$i/configure ] || [ -r $srcdir/$i/configure.in ]; then
	others=yes;
	break;
      fi
    fi
  done
  if [ -z "${others}" ]; then
    target_configdirs=
  fi
fi

# Deconfigure all subdirectories, in case we are changing the
# configuration from one where a subdirectory is supported to one where it
# is not.
if [ -z "${norecursion}" -a -n "${configdirs}" ]; then
  for i in `echo ${configdirs} | sed -e s/target-//g` ; do
    rm -f $i/Makefile
  done
fi
if [ -z "${norecursion}" -a -n "${target_configdirs}" ]; then
  for i in `echo ${target_configdirs} | sed -e s/target-//g` ; do
    rm -f ${target_subdir}/$i/Makefile
  done
fi

# Produce a warning message for the subdirs we can't configure.
# This isn't especially interesting in the Cygnus tree, but in the individual
# FSF releases, it's important to let people know when their machine isn't
# supported by the one or two programs in a package.

if [ -n "${notsupp}" ] && [ -z "${norecursion}" ]; then
  # If $appdirs is non-empty, at least one of those directories must still
  # be configured, or we error out.  (E.g., if the gas release supports a
  # specified target in some subdirs but not the gas subdir, we shouldn't
  # pretend that all is well.)
  if [ -n "$appdirs" ]; then
    for dir in $appdirs ; do
      if [ -r $dir/Makefile.in ]; then
	if echo " ${configdirs} " | grep " ${dir} " >/dev/null 2>&1; then
	  appdirs=""
	  break
	fi
	if echo " ${target_configdirs} " | grep " ${dir} " >/dev/null 2>&1; then
	  appdirs=""
	  break
	fi
      fi
    done
    if [ -n "$appdirs" ]; then
      echo "*** This configuration is not supported by this package." 1>&2
      exit 1
    fi
  fi
  # Okay, some application will build, or we don't care to check.  Still
  # notify of subdirs not getting built.
  echo "*** This configuration is not supported in the following subdirectories:" 1>&2
  echo "    ${notsupp}" 1>&2
  echo "    (Any other directories should still work fine.)" 1>&2
fi

# Set with_gnu_as and with_gnu_ld as appropriate.
#
# This is done by determining whether or not the appropriate directory
# is available, and by checking whether or not specific configurations
# have requested that this magic not happen.
# 
# The command line options always override the explicit settings in 
# configure.in, and the settings in configure.in override this magic.
#
# If the default for a toolchain is to use GNU as and ld, and you don't 
# want to do that, then you should use the --without-gnu-as and
# --without-gnu-ld options for the configure script.

if [ x${use_gnu_as} = x ] ; then
  if [ x${with_gnu_as} != xno ] && echo " ${configdirs} " | grep " ${gasdir} " > /dev/null 2>&1 && [ -d ${srcdir}/${gasdir} ] ; then
    with_gnu_as=yes
    withoptions="$withoptions --with-gnu-as"
  fi
fi

if [ x${use_gnu_ld} = x ] ; then
  if [ x${with_gnu_ld} != xno ] && echo " ${configdirs} " | grep " ld " > /dev/null 2>&1 && [ -d ${srcdir}/ld ] ; then
    with_gnu_ld=yes
    withoptions="$withoptions --with-gnu-ld"
  fi
fi

# If using newlib, add --with-newlib to the withoptions so that gcc/configure
# can detect this case.

if [ x${with_newlib} != xno ] && echo " ${target_configdirs} " | grep " target-newlib " > /dev/null 2>&1 && [ -d ${srcdir}/newlib ] ; then
  with_newlib=yes
  withoptions="$withoptions --with-newlib"
fi

if [ x${shared} = xyes ]; then
  case "${target}" in
    hppa*)		target_makefile_frag=config/mt-papic ;;
    i[3456]86-*)	target_makefile_frag=config/mt-x86pic ;;
    powerpc*-*)		target_makefile_frag=config/mt-ppcpic ;;
    alpha-*-linux*)	target_makefile_frag=config/mt-elfalphapic ;;
    *)			target_makefile_frag=config/mt-${target_cpu}pic ;;
  esac
fi

# post-target:

# Make sure that the compiler is able to generate an executable.  If it
# can't, we are probably in trouble.  We don't care whether we can run the
# executable--we might be using a cross compiler--we only care whether it
# can be created.  At this point the main configure script has set CC.
echo "int main () { return 0; }" > conftest.c
${CC} -o conftest ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} conftest.c
if [ $? = 0 ] && [ -s conftest ]; then
  :
else
  echo 1>&2 "*** The command '${CC} -o conftest ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} conftest.c' failed."
  echo 1>&2 "*** You must set the environment variable CC to a working compiler."
  rm -f conftest*
  exit 1
fi
rm -f conftest*

# The Solaris /usr/ucb/cc compiler does not appear to work.
case "${host}" in
  sparc-sun-solaris2*)
      CCBASE="`echo ${CC-cc} | sed 's/ .*$//'`"
      if [ "`/usr/bin/which $CCBASE`" = "/usr/ucb/cc" ] ; then
          could_use=
          [ -d /opt/SUNWspro/bin ] && could_use="/opt/SUNWspro/bin"
          if [ -d /opt/cygnus/bin ] ; then
              if [ "$could_use" = "" ] ; then
                  could_use="/opt/cygnus/bin"
              else
                  could_use="$could_use or /opt/cygnus/bin"
              fi
          fi
        if [ "$could_use" = "" ] ; then
            echo "Warning: compilation may fail because you're using"
            echo "/usr/ucb/cc.  You should change your PATH or CC "
            echo "variable and rerun configure."
        else
            echo "Warning: compilation may fail because you're using"
            echo "/usr/ucb/cc, when you should use the C compiler from"
            echo "$could_use.  You should change your"
            echo "PATH or CC variable and rerun configure."
        fi
      fi
  ;;
esac

# If --enable-shared was set, we must set LD_LIBRARY_PATH so that the
# binutils tools will find libbfd.so.
if [ "${shared}" = "yes" ]; then
  sed -e 's/^SET_LIB_PATH[ 	]*=.*$/SET_LIB_PATH = $(REALLY_SET_LIB_PATH)/' \
      Makefile > Makefile.tem
  rm -f Makefile
  mv -f Makefile.tem Makefile

  case "${host}" in
  *-*-hpux*)
    sed -e 's/RPATH_ENVVAR[ 	]*=.*$/RPATH_ENVVAR = SHLIB_PATH/' \
	Makefile > Makefile.tem
    rm -f Makefile
    mv -f Makefile.tem Makefile
    ;;
  esac
fi

# If we are building for a cygwin32 host, then set INSTALL_PROGRAM_ARGS to
# -x.  This will cause programs to be installed with .exe extensions.
case "${host}" in
*-*-cygwin32*)
    sed -e 's/^INSTALL_PROGRAM_ARGS[ 	]*=.*$/INSTALL_PROGRAM_ARGS = -x/' \
	Makefile > Makefile.tem
    rm -f Makefile
    mv -f Makefile.tem Makefile
    ;;
esac

# Record target_configdirs and the configure arguments in Makefile.
target_configdirs=`echo "${target_configdirs}" | sed -e 's/target-//g'`
targargs=`echo "${arguments}" | \
	sed -e 's/--norecursion//' \
	    -e 's/--cache[a-z-]*=[^ 	]*//' \
	    -e 's/--ho[a-z-]*=[^ 	]*//' \
	    -e 's/--bu[a-z-]*=[^ 	]*//' \
	    -e 's/--ta[a-z-]*=[^ 	]*//'`

# Passing a --with-cross-host argument lets the target libraries know
# whether they are being built with a cross-compiler or being built
# native.  However, it would be better to use other mechanisms to make the
# sorts of decisions they want to make on this basis.  Please consider
# this option to be deprecated.  FIXME.
if [ x${is_cross_compiler} = xyes ]; then
  targargs="--with-cross-host=${host_alias} ${targargs}"
fi

# Default to --enable-multilib.
if [ x${enable_multilib} = x ]; then
  targargs="--enable-multilib ${targargs}"
fi

targargs="--host=${target_alias} --build=${build_alias} ${targargs}"
sed -e "s:^TARGET_CONFIGDIRS[ 	]*=.*$:TARGET_CONFIGDIRS = ${target_configdirs}:" \
    -e "s%^CONFIG_ARGUMENTS[ 	]*=.*$%CONFIG_ARGUMENTS = ${targargs}%" \
    -e "s%^TARGET_SUBDIR[ 	]*=.*$%TARGET_SUBDIR = ${target_subdir}%" \
       Makefile > Makefile.tem
rm -f Makefile
mv -f Makefile.tem Makefile

#
# Local Variables:
# fill-column: 131
# End:
#
