# Configure fragment invoked in the post-target section for subdirs
# wanting multilib support.
#
# Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008, 2010, 2011, 2014 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., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
#
# Please report bugs to <gcc-bugs@gnu.org>
# and send patches to <gcc-patches@gnu.org>.

# It is advisable to support a few --enable/--disable options to let the
# user select which libraries s/he really wants.
#
# Subdirectories wishing to use multilib should put the following lines
# in the "post-target" section of configure.ac.
#
# if [ "${srcdir}" = "." ] ; then
#   if [ "${with_target_subdir}" != "." ] ; then
#     . ${with_multisrctop}../../config-ml.in
#   else
#     . ${with_multisrctop}../config-ml.in
#   fi
# else
#   . ${srcdir}/../config-ml.in
# fi
#
#
# Things are complicated because 6 separate cases must be handled:
# 2 (native, cross) x 3 (absolute-path, relative-not-dot, dot) = 6.
#
# srcdir=. is special.  It must handle make programs that don't handle VPATH.
# To implement this, a symlink tree is built for each library and for each
# multilib subdir.
#
# The build tree is layed out as
#
# ./
#   newlib
#   m68020/
#          newlib
#          m68881/
#                 newlib
#
# The nice feature about this arrangement is that inter-library references
# in the build tree work without having to care where you are.  Note that
# inter-library references also work in the source tree because symlink trees
# are built when srcdir=.
#
# Unfortunately, trying to access the libraries in the build tree requires
# the user to manually choose which library to use as GCC won't be able to
# find the right one.  This is viewed as the lesser of two evils.
#
# Configure variables:
# ${with_target_subdir} = "." for native, or ${target_alias} for cross.
# Set by top level Makefile.
# ${with_multisrctop} = how many levels of multilibs there are in the source
# tree.  It exists to handle the case of configuring in the source tree:
# ${srcdir} is not constant.
# ${with_multisubdir} = name of multilib subdirectory (eg: m68020/m68881).
#
# Makefile variables:
# MULTISRCTOP = number of multilib levels in source tree (+1 if cross)
# (FIXME: note that this is different than ${with_multisrctop}.  Check out.).
# MULTIBUILDTOP = number of multilib levels in build tree
# MULTIDIRS = list of multilib subdirs (eg: m68000 m68020 ...)
# (only defined in each library's main Makefile).
# MULTISUBDIR = installed subdirectory name with leading '/' (eg: /m68000)
# (only defined in each multilib subdir).

# FIXME: Multilib is currently disabled by default for everything other than
# newlib.  It is up to each target to turn on multilib support for the other
# libraries as desired.

# Autoconf incoming variables:
# srcdir, host, ac_configure_args
#
# We *could* figure srcdir and host out, but we'd have to do work that
# our caller has already done to figure them out and requiring these two
# seems reasonable.
# Note that `host' in this case is GCC's `target'.  Target libraries are
# configured for a particular host.

Makefile=${ac_file-Makefile}
ml_config_shell=${CONFIG_SHELL-/bin/sh}
ml_realsrcdir=${srcdir}

# Scan all the arguments and set all the ones we need.

scan_arguments ()
{
  ml_verbose=--verbose
  for option
  do
    # Strip single quotes surrounding individual options, that is, remove one
    # level of shell quoting for these.
    case $option in
      \'*\') eval option=$option ;;
    esac

    case $option in
      --*) ;;
      -*) option=-$option ;;
    esac

    case $option in
      --*=*)
	optarg=`echo $option | sed -e 's/^[^=]*=//'`
	;;
    esac

    case $option in
      --disable-*)
	enableopt=`echo ${option} | sed 's:^--disable-:enable_:;s:-:_:g'`
	eval $enableopt=no
	;;
      --enable-*)
	case "$option" in
	*=*)	;;
	*)	optarg=yes ;;
	esac
	enableopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
	# enable_shared and enable_static are handled by configure.
	# Don't undo its work.
	case $enableopt in
	enable_shared | enable_static) ;;
	*) eval $enableopt='$optarg' ;;
	esac
	;;
      --norecursion | --no-recursion)
	ml_norecursion=yes
	;;
      --silent | --sil* | --quiet | --q*)
	ml_verbose=--silent
	;;
      --verbose | --v | --verb*)
	ml_verbose=--verbose
	;;
      --with-*)
	case "$option" in
	*=*)	;;
	*)	optarg=yes ;;
	esac
	withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
	eval $withopt='$optarg'
	;;
      --without-*)
	withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
	eval $withopt=no
	;;
    esac
  done
}
# Use eval to properly handle configure arguments such as
# --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'.
eval scan_arguments "${ac_configure_args}"
unset scan_arguments

# Only do this if --enable-multilib.
if [ "${enable_multilib}" = yes ]; then

# Compute whether this is the library's top level directory
# (ie: not a multilib subdirectory, and not a subdirectory like newlib/src).
# ${with_multisubdir} tells us we're in the right branch, but we could be
# in a subdir of that.
# ??? The previous version could void this test by separating the process into
# two files: one that only the library's toplevel configure.ac ran (to
# configure the multilib subdirs), and another that all configure.ac's ran to
# update the Makefile.  It seemed reasonable to collapse all multilib support
# into one file, but it does leave us with having to perform this test.
ml_toplevel_p=no
if [ -z "${with_multisubdir}" ]; then
  if [ "${srcdir}" = "." ]; then
    # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
    # ${with_target_subdir} = "." for native, otherwise target alias.
    if [ "${with_target_subdir}" = "." ]; then
      if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
	ml_toplevel_p=yes
      fi
    else
      if [ -f ${ml_realsrcdir}/../../config-ml.in ]; then
	ml_toplevel_p=yes
      fi
    fi
  else
    # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
    if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
      ml_toplevel_p=yes
    fi
  fi
fi

# If this is the library's top level directory, set multidirs to the
# multilib subdirs to support.  This lives at the top because we need
# `multidirs' set right away.

if [ "${ml_toplevel_p}" = yes ]; then

multidirs=
for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
  dir=`echo $i | sed -e 's/;.*$//'`
  if [ "${dir}" = "." ]; then
    true
  else
    if [ -z "${multidirs}" ]; then
      multidirs="${dir}"
    else
      multidirs="${multidirs} ${dir}"
    fi
  fi
done

# Target libraries are configured for the host they run on, so we check
# $host here, not $target.

case "${host}" in
arm-*-*)
	if [ x"$enable_fpu" = xno ]
	then
	  old_multidirs=${multidirs}
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "${x}" in
	      *fpu*) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x"$enable_26bit" = xno ]
	then
	  old_multidirs=${multidirs}
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "${x}" in
	      *26bit*) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x"$enable_underscore" = xno ]
	then
	  old_multidirs=${multidirs}
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "${x}" in
	      *under*) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x"$enable_interwork" = xno ]
	then
	  old_multidirs=${multidirs}
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "${x}" in
	      *interwork*) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_biendian = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *le* ) : ;;
	      *be* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x"$enable_nofmult" = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *nofmult* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	;;
m68*-*-*)
	if [ x$enable_softfloat = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *soft-float* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_m68881 = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *m68881* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_m68000 = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *m68000* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_m68020 = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *m68020* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	;;
mips*-*-*)
	if [ x$enable_single_float = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *single* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_biendian = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *el* ) : ;;
	      *eb* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_softfloat = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *soft-float* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	;;
msp430-*-*)
	if [ x$enable_no_exceptions = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *no-exceptions* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	;;
powerpc*-*-* | rs6000*-*-*)
	if [ x$enable_aix64 = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *ppc64* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_pthread = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *pthread* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_softfloat = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *soft-float* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_powercpu = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      power | */power | */power/* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_powerpccpu = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *powerpc* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_powerpcos = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *mcall-linux* | *mcall-solaris* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_biendian = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *mlittle* | *mbig* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	if [ x$enable_sysv = xno ]
	then
	  old_multidirs="${multidirs}"
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "$x" in
	      *mcall-sysv* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	;;
esac

# Remove extraneous blanks from multidirs.
# Tests like `if [ -n "$multidirs" ]' require it.
multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'`

# Add code to library's top level makefile to handle building the multilib
# subdirs.

cat > Multi.tem <<\EOF

PWD_COMMAND=$${PWDCMD-pwd}

multi-do:
	@if [ -z "$(MULTIDIRS)" ]; then \
	  true; \
	else \
	  rootpre=`${PWD_COMMAND}`/; export rootpre; \
	  srcrootpre=`cd $(srcdir); ${PWD_COMMAND}`/; export srcrootpre; \
	  lib=`echo "$${rootpre}" | sed -e 's,^.*/\([^/][^/]*\)/$$,\1,'`; \
	  compiler="$(CC)"; \
	  for i in `$${compiler} --print-multi-lib 2>/dev/null`; do \
	    dir=`echo $$i | sed -e 's/;.*$$//'`; \
	    if [ "$${dir}" = "." ]; then \
	      true; \
	    else \
	      if [ -d ../$${dir}/$${lib} ]; then \
		flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
		if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \
				CFLAGS="$(CFLAGS) $${flags}" \
				CCASFLAGS="$(CCASFLAGS) $${flags}" \
				FCFLAGS="$(FCFLAGS) $${flags}" \
				FFLAGS="$(FFLAGS) $${flags}" \
				ADAFLAGS="$(ADAFLAGS) $${flags}" \
				prefix="$(prefix)" \
				exec_prefix="$(exec_prefix)" \
				GOCFLAGS="$(GOCFLAGS) $${flags}" \
				GDCFLAGS="$(GDCFLAGS) $${flags}" \
				CXXFLAGS="$(CXXFLAGS) $${flags}" \
				LIBCFLAGS="$(LIBCFLAGS) $${flags}" \
				LIBCXXFLAGS="$(LIBCXXFLAGS) $${flags}" \
				LDFLAGS="$(LDFLAGS) $${flags}" \
				MULTIFLAGS="$${flags}" \
				DESTDIR="$(DESTDIR)" \
				INSTALL="$(INSTALL)" \
				INSTALL_DATA="$(INSTALL_DATA)" \
				INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \
				INSTALL_SCRIPT="$(INSTALL_SCRIPT)" \
				$(DO)); then \
		  true; \
		else \
		  exit 1; \
		fi; \
	      else true; \
	      fi; \
	    fi; \
	  done; \
	fi

multi-clean:
	@if [ -z "$(MULTIDIRS)" ]; then \
	  true; \
	else \
	  lib=`${PWD_COMMAND} | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \
	  for dir in : $(MULTIDIRS); do \
	    test $$dir != : || continue; \
EOF
cat >>Multi.tem <<EOF
	    if [ -f ../\$\${dir}/\$\${lib}/${Makefile} ]; then \\
EOF
cat >>Multi.tem <<\EOF
	      if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) $(DO)); \
	      then true; \
	      else exit 1; \
	      fi; \
	    else true; \
	    fi; \
	  done; \
	fi
EOF

cat ${Makefile} Multi.tem > Makefile.tem
rm -f ${Makefile} Multi.tem
mv Makefile.tem ${Makefile}

fi # ${ml_toplevel_p} = yes

if [ "${ml_verbose}" = --verbose ]; then
  echo "Adding multilib support to ${Makefile} in ${ml_realsrcdir}"
  if [ "${ml_toplevel_p}" = yes ]; then
    echo "multidirs=${multidirs}"
  fi
  echo "with_multisubdir=${with_multisubdir}"
fi

if [ "${srcdir}" = "." ]; then
  if [ "${with_target_subdir}" != "." ]; then
    ml_srcdotdot="../"
  else
    ml_srcdotdot=""
  fi
else
  ml_srcdotdot=""
fi

if [ -z "${with_multisubdir}" ]; then
  ml_subdir=
  ml_builddotdot=
  : # ml_srcdotdot= # already set
else
  ml_subdir="/${with_multisubdir}"
  # The '[^/][^/]*' appears that way to work around a SunOS sed bug.
  ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/
  if [ "$srcdir" = "." ]; then
    ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot}
  else
    : # ml_srcdotdot= # already set
  fi
fi

if [ "${ml_toplevel_p}" = yes ]; then
  ml_do='$(MAKE)'
  ml_clean='$(MAKE)'
else
  ml_do=true
  ml_clean=true
fi

# TOP is used by newlib and should not be used elsewhere for this purpose.
# MULTI{SRC,BUILD}TOP are the proper ones to use.  MULTISRCTOP is empty
# when srcdir != builddir.  MULTIBUILDTOP is always some number of ../'s.
# FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can
# delete TOP.  Newlib may wish to continue to use TOP for its own purposes
# of course.
# MULTIDIRS is non-empty for the cpu top level Makefile (eg: newlib/Makefile)
# and lists the subdirectories to recurse into.
# MULTISUBDIR is non-empty in each cpu subdirectory's Makefile
# (eg: newlib/h8300h/Makefile) and is the installed subdirectory name with
# a leading '/'.
# MULTIDO is used for targets like all, install, and check where
# $(FLAGS_TO_PASS) augmented with the subdir's compiler option is needed.
# MULTICLEAN is used for the *clean targets.
#
# ??? It is possible to merge MULTIDO and MULTICLEAN into one.  They are
# currently kept separate because we don't want the *clean targets to require
# the existence of the compiler (which MULTIDO currently requires) and
# therefore we'd have to record the directory options as well as names
# (currently we just record the names and use --print-multi-lib to get the
# options).

sed -e "s:^TOP[ 	]*=[ 	]*\([./]*\)[ 	]*$:TOP = ${ml_builddotdot}\1:" \
    -e "s:^MULTISRCTOP[ 	]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \
    -e "s:^MULTIBUILDTOP[ 	]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \
    -e "s:^MULTIDIRS[ 	]*=.*$:MULTIDIRS = ${multidirs}:" \
    -e "s:^MULTISUBDIR[ 	]*=.*$:MULTISUBDIR = ${ml_subdir}:" \
    -e "s:^MULTIDO[ 	]*=.*$:MULTIDO = $ml_do:" \
    -e "s:^MULTICLEAN[ 	]*=.*$:MULTICLEAN = $ml_clean:" \
	${Makefile} > Makefile.tem
rm -f ${Makefile}
mv Makefile.tem ${Makefile}

# If this is the library's top level, configure each multilib subdir.
# This is done at the end because this is the loop that runs configure
# in each multilib subdir and it seemed reasonable to finish updating the
# Makefile before going on to configure the subdirs.

if [ "${ml_toplevel_p}" = yes ]; then

# We must freshly configure each subdirectory.  This bit of code is
# actually partially stolen from the main configure script.  FIXME.

if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then

  if [ "${ml_verbose}" = --verbose ]; then
    echo "Running configure in multilib subdirs ${multidirs}"
    echo "pwd: `${PWDCMD-pwd}`"
  fi

  ml_origdir=`${PWDCMD-pwd}`
  ml_libdir=`echo "$ml_origdir" | sed -e 's,^.*/,,'`
  # cd to top-level-build-dir/${with_target_subdir}
  cd ..

  for ml_dir in ${multidirs}; do

    if [ "${ml_verbose}" = --verbose ]; then
      echo "Running configure in multilib subdir ${ml_dir}"
      echo "pwd: `${PWDCMD-pwd}`"
    fi

    if [ -d ${ml_dir} ]; then true; else
      # ``mkdir -p ${ml_dir}'' See also mkinstalldirs.
      pathcomp=""
      for d in `echo ":${ml_dir}" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`; do
        pathcomp="$pathcomp$d"
        case "$pathcomp" in
          -* ) pathcomp=./$pathcomp ;;
        esac
        if test ! -d "$pathcomp"; then
           echo "mkdir $pathcomp" 1>&2
           mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$?
        fi
        if test ! -d "$pathcomp"; then
	   exit $lasterr
        fi
        pathcomp="$pathcomp/"
      done
    fi
    if [ -d ${ml_dir}/${ml_libdir} ]; then true; else mkdir ${ml_dir}/${ml_libdir}; fi

    # Eg: if ${ml_dir} = m68000/m68881, dotdot = ../../
    dotdot=../`echo ${ml_dir} | sed -e 's|[^/]||g' -e 's|/|../|g'`

    case ${srcdir} in
    ".")
      echo "Building symlink tree in `${PWDCMD-pwd}`/${ml_dir}/${ml_libdir}"
      if [ "${with_target_subdir}" != "." ]; then
	ml_unsubdir="../"
      else
	ml_unsubdir=""
      fi
      (cd ${ml_dir}/${ml_libdir};
       ../${dotdot}${ml_unsubdir}symlink-tree ../${dotdot}${ml_unsubdir}${ml_libdir} "")
      if [ -f ${ml_dir}/${ml_libdir}/${Makefile} ]; then
	if [ x"${MAKE}" = x ]; then
	  (cd ${ml_dir}/${ml_libdir}; make distclean)
	else
	  (cd ${ml_dir}/${ml_libdir}; ${MAKE} distclean)
	fi
      fi
      ml_newsrcdir="."
      ml_srcdiroption=
      multisrctop=${dotdot}
      ;;
    *)
      case "${srcdir}" in
      /* | [A-Za-z]:[\\/]* ) # absolute path
        ml_newsrcdir=${srcdir}
        ;;
      *) # otherwise relative
        ml_newsrcdir=${dotdot}${srcdir}
        ;;
      esac
      ml_srcdiroption="-srcdir=${ml_newsrcdir}"
      multisrctop=
      ;;
    esac

    case "${progname}" in
    /* | [A-Za-z]:[\\/]* )     ml_recprog=${progname} ;;
    *)      ml_recprog=${dotdot}${progname} ;;
    esac

    # FIXME: POPDIR=${PWD=`pwd`} doesn't work here.
    ML_POPDIR=`${PWDCMD-pwd}`
    cd ${ml_dir}/${ml_libdir}

    if [ -f ${ml_newsrcdir}/configure ]; then
      ml_recprog="${ml_newsrcdir}/configure"
    fi

    # find compiler flag corresponding to ${ml_dir}
    for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
      dir=`echo $i | sed -e 's/;.*$//'`
      if [ "${dir}" = "${ml_dir}" ]; then
        flags=`echo $i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`
        break
      fi
    done
    ml_config_env='CC="${CC_}$flags" CXX="${CXX_}$flags" F77="${F77_}$flags" GFORTRAN="${GFORTRAN_}$flags" GOC="${GOC_}$flags" GDC="${GDC_}$flags"'

    if [ "${with_target_subdir}" = "." ]; then
	CC_=$CC' '
	CXX_=$CXX' '
	F77_=$F77' '
	GFORTRAN_=$GFORTRAN' '
	GOC_=$GOC' '
	GDC_=$GDC' '
    else
	# Create a regular expression that matches any string as long
	# as ML_POPDIR.
	popdir_rx=`echo "${ML_POPDIR}" | sed 's,.,.,g'`
	CC_=
	for arg in ${CC}; do
	  case $arg in
	  -[BIL]"${ML_POPDIR}"/*)
	    CC_="${CC_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\1/p"`' ' ;;
	  "${ML_POPDIR}"/*)
	    CC_="${CC_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  *)
	    CC_="${CC_}${arg} " ;;
	  esac
	done

	CXX_=
	for arg in ${CXX}; do
	  case $arg in
	  -[BIL]"${ML_POPDIR}"/*)
	    CXX_="${CXX_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  "${ML_POPDIR}"/*)
	    CXX_="${CXX_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  *)
	    CXX_="${CXX_}${arg} " ;;
	  esac
	done

	F77_=
	for arg in ${F77}; do
	  case $arg in
	  -[BIL]"${ML_POPDIR}"/*)
	    F77_="${F77_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  "${ML_POPDIR}"/*)
	    F77_="${F77_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  *)
	    F77_="${F77_}${arg} " ;;
	  esac
	done

	GFORTRAN_=
	for arg in ${GFORTRAN}; do
	  case $arg in
	  -[BIL]"${ML_POPDIR}"/*)
	    GFORTRAN_="${GFORTRAN_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  "${ML_POPDIR}"/*)
	    GFORTRAN_="${GFORTRAN_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  *)
	    GFORTRAN_="${GFORTRAN_}${arg} " ;;
	  esac
	done

	GOC_=
	for arg in ${GOC}; do
	  case $arg in
	  -[BIL]"${ML_POPDIR}"/*)
	    GOC_="${GOC_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  "${ML_POPDIR}"/*)
	    GOC_="${GOC_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  *)
	    GOC_="${GOC_}${arg} " ;;
	  esac
	done

	GDC_=
	for arg in ${GDC}; do
	  case $arg in
	  -[BIL]"${ML_POPDIR}"/*)
	    GDC_="${GDC_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  "${ML_POPDIR}"/*)
	    GDC_="${GDC_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  *)
	    GDC_="${GDC_}${arg} " ;;
	  esac
	done

	if test "x${LD_LIBRARY_PATH+set}" = xset; then
	  LD_LIBRARY_PATH_=
	  for arg in `echo "$LD_LIBRARY_PATH" | tr ':' ' '`; do
	    case "$arg" in
	    "${ML_POPDIR}"/*)
	      arg=`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`
	      ;;
	    esac
	    if test "x$LD_LIBRARY_PATH_" != x; then
	      LD_LIBRARY_PATH_=$LD_LIBRARY_PATH_:$arg
	    else
	      LD_LIBRARY_PATH_=$arg
	    fi
          done
	  ml_config_env="$ml_config_env LD_LIBRARY_PATH=$LD_LIBRARY_PATH_"
	fi

	if test "x${SHLIB_PATH+set}" = xset; then
	  SHLIB_PATH_=
	  for arg in `echo "$SHLIB_PATH" | tr ':' ' '`; do
	    case "$arg" in
	    "${ML_POPDIR}"/*)
	      arg=`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`
	      ;;
	    esac
	    if test "x$SHLIB_PATH_" != x; then
	      SHLIB_PATH_=$SHLIB_PATH_:$arg
	    else
	      SHLIB_PATH_=$arg
	    fi
          done
	  ml_config_env="$ml_config_env SHLIB_PATH=$SHLIB_PATH_"
	fi
    fi

    if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
	--with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
	"${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
      true
    else
      exit 1
    fi

    cd "${ML_POPDIR}"

  done

  cd "${ml_origdir}"
fi

fi # ${ml_toplevel_p} = yes
fi # ${enable_multilib} = yes
