# Configure fragment invoked in the post-target section for subdirs
# wanting multilib support.
#
# Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
#   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.in.
#
# 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.

ml_verbose=--verbose
for option in ${ac_configure_args}
do
  # strip single quotes surrounding individual options
  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'`
	eval $enableopt="$optarg"
	;;
  --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

# 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.in ran (to
# configure the multilib subdirs), and another that all configure.in'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
arc-*-elf*)
	if [ x$enable_biendian != xyes ]
	then
	  old_multidirs=${multidirs}
	  multidirs=""
	  for x in ${old_multidirs}; do
	    case "${x}" in
	      *be*) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	    esac
	  done
	fi
	;;
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
	case " $multidirs " in
	*" mabi=64 "*)
	  # We will not be able to create libraries with -mabi=64 if
	  # we cannot even link a trivial program.  It usually
	  # indicates the 64bit libraries are missing.
	  if echo 'main() {}' > conftest.c &&
	     ${CC-gcc} -mabi=64 conftest.c -o conftest; then
	    :
	  else
	    echo Could not link program with -mabi=64, disabling it.
	    old_multidirs="${multidirs}"
	    multidirs=""
	    for x in ${old_multidirs}; do
	      case "$x" in
	      *mabi=64* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	      esac
	    done
	  fi
	  rm -f conftest.c conftest
	  ;;
	esac
	;;
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
	;;
sparc*-*-*)
	case " $multidirs " in
	*" m64 "*)
	  # We will not be able to create libraries with -m64 if
	  # we cannot even link a trivial program.  It usually
	  # indicates the 64bit libraries are missing.
	  if echo 'main() {}' > conftest.c &&
	     ${CC-gcc} -m64 conftest.c -o conftest; then
	    :
	  else
	    echo Could not link program with -m64, disabling it.
	    old_multidirs="${multidirs}"
	    multidirs=""
	    for x in ${old_multidirs}; do
	      case "$x" in
	      *m64* ) : ;;
	      *) multidirs="${multidirs} ${x}" ;;
	      esac
	    done
	  fi
	  rm -f conftest.c conftest
	  ;;
	esac
	;;
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)" \
				GCJFLAGS="$(GCJFLAGS) $${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 Makefile $(MULTIDIRS); do \
	    if [ -f ../$${dir}/$${lib}/Makefile ]; then \
	      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" GCJ="${GCJ_}$flags" GFORTRAN="${GFORTRAN_}$flags"'

    if [ "${with_target_subdir}" = "." ]; then
	CC_=$CC' '
	CXX_=$CXX' '
	F77_=$F77' '
	GCJ_=$GCJ' '
	GFORTRAN_=$GFORTRAN' '
    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

	GCJ_=
	for arg in ${GCJ}; do
	  case $arg in
	  -[BIL]"${ML_POPDIR}"/*)
	    GCJ_="${GCJ_}"`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}"/*)
	    GCJ_="${GCJ_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
	  *)
	    GCJ_="${GCJ_}${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

	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_srcdiroption} ; then
      true
    else
      exit 1
    fi

    cd ${ML_POPDIR}

  done

  cd ${ml_origdir}
fi

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