# 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}

# FIXME: There should be an @-sign in front of the `if'.
# Leave out until this is tested a bit more.
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

# FIXME: There should be an @-sign in front of the `if'.
# Leave out until this is tested a bit more.
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
