#! /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*-*-*)
    # 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:
#
