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