automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

multilibs (Was: Re: -recursive)


From: Alexandre Duret-Lutz
Subject: multilibs (Was: Re: -recursive)
Date: Thu, 17 Jul 2003 01:27:37 +0200
User-agent: Gnus/5.1002 (Gnus v5.10.2) Emacs/21.3 (gnu/linux)

>>> "Ralf" == Ralf Corsepius <address@hidden> writes:

[...]

 Ralf> Anyway, below is a test case triggering some of the nastinesses lurking
 Ralf> in autoconf/automake and config-ml.in.

Thanks a lot!

[...]

 Ralf> Note: The tarball only works with VPATH builds (in-source-tree builds
 Ralf> with multilibs also don't work.)

 >> (I'm not familiar with the multilib stuff though.)
 Ralf> ... and I don't understand what you are doing with the recursive make
 Ralf> targets in automake ... :(

Here is my attempt to turn your tarball into an Automake test
case and to fix the issues that popped up.  The patch is against
branch-1-7.

It tests VPATH and non-VPATH builds.  It also tests setups with
and with SUBDIRS (the previous code in multilib.am was written
conditionally wrt SUBDIRS but it's no longer the case).

I must insist that I'm completely ignorant of the multilib
usage, so I'd really appreciate feedback on all this.
Especially if you have improvements to suggest for the test case
that would be welcome.  

For instance I can see that the multilib rules are triggered
during the build, but I can't really ensure that they do work
because `gcc -print-multi-lib' returns `.;' here.  When does
this print something different?  Is that a situation we can
easily trigger in a test case?

Also, is it normal that I have to use --with-target-subdir=.
in non-VPATH builds?


2003-07-17  Alexandre Duret-Lutz  <address@hidden>

        * automake.in (handle_multilib): Register all-multi.
        (file_contents_internal): Insert \n when concatenating actions
        from "factored" rules.
        * lib/Makefile.am (dist_script_DATA): Add config-ml.in.
        * lib/config-ml.in: New file, from GCC, including patch
        from Ralf Corsepius (see GCC's PR 11526).
        * lib/am/clean.am (distclean-generic): Do not delete Makefile here...
        (distclean, maintainer-clean): ... do it here.
        * lib/am/depend.am (distclean-depend): Likewise, replace by
        (distclean, maintainer-clean): ... these.
        * lib/am/multilib.am (all-recursive, install-recursive,
        mostlyclean-recursive, clean-recursive, distclean-recursive,
        maintainer-clean-recursive): Remove this rules.  Only the -am
        versions are needed.
        (all-am): Remove, done in handle_multilib.
        (install-am): Replace by ...
        (install-exec-am): ... this.
        * tests/Makefile.am (TESTS): Add multlib.test.
        * tests/multlib.test: New file, based on a test case by
        Ralf Corsepius

Index: automake.in
===================================================================
RCS file: /cvs/automake/automake/automake.in,v
retrieving revision 1.1365.2.48
diff -u -r1.1365.2.48 automake.in
--- automake.in 15 Jul 2003 21:21:48 -0000      1.1365.2.48
+++ automake.in 16 Jul 2003 23:03:25 -0000
@@ -4099,6 +4099,7 @@
     if ($seen_multilib && $relative_dir eq '.')
     {
        $output_rules .= &file_contents ('multilib');
+       push (@all, 'all-multi');
     }
 }
 
@@ -8444,7 +8445,14 @@
              if (defined $dependencies{$_} && $cond ne 'FALSE')
                {
                  &depend ($_, @deps);
-                 $actions{$_} .= $actions;
+                 if ($actions{$_})
+                   {
+                     $actions{$_} .= "\n$actions";
+                   }
+                 else
+                   {
+                     $actions{$_} = $actions;
+                   }
                }
              else
                {
Index: lib/Makefile.am
===================================================================
RCS file: /cvs/automake/automake/lib/Makefile.am,v
retrieving revision 1.4
diff -u -r1.4 Makefile.am
--- lib/Makefile.am     15 Jan 2002 23:54:12 -0000      1.4
+++ lib/Makefile.am     16 Jul 2003 23:03:25 -0000
@@ -28,7 +28,8 @@
 ## what we want.  So we make them executable by hand.
 scriptdir = $(pkgvdatadir)
 dist_script_DATA = config.guess config.sub install-sh mdate-sh missing \
-mkinstalldirs elisp-comp ylwrap acinstall depcomp compile py-compile
+  mkinstalldirs elisp-comp ylwrap acinstall depcomp compile py-compile \
+  config-ml.in
 
 install-data-hook:
        @$(POST_INSTALL)
Index: lib/config-ml.in
===================================================================
RCS file: lib/config-ml.in
diff -N lib/config-ml.in
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/config-ml.in    16 Jul 2003 23:03:26 -0000
@@ -0,0 +1,852 @@
+# Configure fragment invoked in the post-target section for subdirs
+# wanting multilib support.
+#
+# 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_arguments="${ac_configure_args}"
+ml_realsrcdir=${srcdir}
+
+# Scan all the arguments and set all the ones we need.
+
+ml_verbose=--verbose
+for option in ${ml_arguments}
+do
+  case $option in
+  \'--*\' ) eval option="$option" ;;
+  --*) ;;
+  -*) 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*)
+       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=$${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}`/; export rootpre; \
+         srcrootpre=`cd $(srcdir); ${PWD}`/; 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}" \
+                               prefix="$(prefix)" \
+                               exec_prefix="$(exec_prefix)" \
+                               GCJFLAGS="$(GCJFLAGS) $${flags}" \
+                               CXXFLAGS="$(CXXFLAGS) $${flags}" \
+                               LIBCFLAGS="$(LIBCFLAGS) $${flags}" \
+                               LIBCXXFLAGS="$(LIBCXXFLAGS) $${flags}" \
+                               LDFLAGS="$(LDFLAGS) $${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} | 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 --cache-file=../config.cache"
+    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" GCJ="${GCJ_}$flags"'
+
+    if [ "${with_target_subdir}" = "." ]; then
+       CC_=$CC' '
+       CXX_=$CXX' '
+       GCJ_=$GCJ' '
+    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
+
+       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
+
+       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} \
+       ${ml_arguments} ${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
Index: lib/am/clean.am
===================================================================
RCS file: /cvs/automake/automake/lib/am/clean.am,v
retrieving revision 1.42
diff -u -r1.42 clean.am
--- lib/am/clean.am     24 Aug 2002 20:43:02 -0000      1.42
+++ lib/am/clean.am     16 Jul 2003 23:25:20 -0000
@@ -29,9 +29,19 @@
 
 distclean-am: distclean-generic clean-am
 distclean-generic:
-       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f $(CONFIG_CLEAN_FILES)
 %DISTCLEAN_RMS%
 
+# Makefiles and their dependencies cannot be cleaned by
+# an -am dependency, because that would prevent other -am
+# dependencies from calling make recursively.  (The multilib
+# cleaning rules do this.)
+#
+# If you change distclean here, you probably also want to change
+# maintainer-clean below.
+distclean:
+       -rm -f Makefile
+
 maintainer-clean-am: maintainer-clean-generic distclean-am
 maintainer-clean-generic:
 ## FIXME: shouldn't we really print these messages before running
@@ -39,6 +49,10 @@
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
 %MAINTAINER_CLEAN_RMS%
+
+# See comment for distclean.
+maintainer-clean:
+       -rm -f Makefile
 
 .PHONY: clean mostlyclean distclean maintainer-clean \
 clean-generic mostlyclean-generic distclean-generic maintainer-clean-generic
Index: lib/am/depend.am
===================================================================
RCS file: /cvs/automake/automake/lib/am/depend.am,v
retrieving revision 1.36
diff -u -r1.36 depend.am
--- lib/am/depend.am    23 Jan 2002 20:53:26 -0000      1.36
+++ lib/am/depend.am    16 Jul 2003 23:03:26 -0000
@@ -17,8 +17,12 @@
 ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 ## 02111-1307, USA.
 
-distclean-am: distclean-depend
-distclean-depend:
+# Depdirs's files are dependency of this Makefile, so we should never
+# erase them in -am or -recursive rules; that would prevent any other
+# rule from being recursive (for instance multilib clean rules are
+# recursive).
+distclean:
        -rm -rf %DEPDIRS%
 
-.PHONY: distclean-depend
+maintainer-clean:
+       -rm -rf %DEPDIRS%
Index: lib/am/multilib.am
===================================================================
RCS file: /cvs/automake/automake/lib/am/multilib.am,v
retrieving revision 1.5
diff -u -r1.5 multilib.am
--- lib/am/multilib.am  27 May 2001 17:06:34 -0000      1.5
+++ lib/am/multilib.am  16 Jul 2003 23:03:26 -0000
@@ -30,18 +30,6 @@
 
 .PHONY: all-multi install-multi
 
-if %?SUBDIRS%
-all-recursive: all-multi
-install-recursive: install-multi
-else !%?SUBDIRS%
-all-am: all-multi
-install-am: install-multi
-endif !%?SUBDIRS%
-
-mostlyclean-am: mostlyclean-multi
-clean-am: clean-multi
-distclean-am: distclean-multi
-maintainer-clean-am: maintainer-clean-multi
 
 mostlyclean-multi:
        $(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean
@@ -54,15 +42,10 @@
 
 .PHONY: mostlyclean-multi clean-multi distclean-multi maintainer-clean-multi
 
+install-exec-am: install-multi
+# No uninstall rule?
 
-if %?SUBDIRS%
-mostlyclean-recursive: mostlyclean-multi
-clean-recursive: clean-multi
-distclean-recursive: distclean-multi
-maintainer-clean-recursive: maintainer-clean-multi
-else !%?SUBDIRS%
 mostlyclean-am: mostlyclean-multi
 clean-am: clean-multi
 distclean-am: distclean-multi
 maintainer-clean-am: maintainer-clean-multi
-endif !%?SUBDIRS%
Index: tests/Makefile.am
===================================================================
RCS file: /cvs/automake/automake/tests/Makefile.am,v
retrieving revision 1.443.2.33
diff -u -r1.443.2.33 Makefile.am
--- tests/Makefile.am   4 Jul 2003 21:22:26 -0000       1.443.2.33
+++ tests/Makefile.am   16 Jul 2003 23:03:26 -0000
@@ -280,6 +280,7 @@
 mdate4.test \
 mkinst2.test \
 mkinstall.test \
+multlib.test \
 nobase.test \
 nodef.test \
 nodef2.test \
Index: tests/multlib.test
===================================================================
RCS file: tests/multlib.test
diff -N tests/multlib.test
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/multlib.test  16 Jul 2003 23:03:26 -0000
@@ -0,0 +1,121 @@
+#! /bin/sh
+# Copyright (C) 2003  Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake 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, or (at your option)
+# any later version.
+#
+# GNU Automake 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 Automake; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Check multilib support.
+# Based on a test case from Ralf Corsepius.
+
+required='gcc GNUmake'
+. ./defs || exit 1
+
+set -e
+
+cat >>configure.in <<'END'
+AC_CONFIG_SRCDIR(libfoo/foo.c)
+AC_CONFIG_AUX_DIR(.)
+AC_CONFIG_SUBDIRS(libfoo)
+AC_CONFIG_SUBDIRS(libbar)
+AC_OUTPUT
+END
+
+cat >Makefile.am <<'EOF'
+SUBDIRS = @subdirs@
+EXTRA_DIST = config-ml.in
+EOF
+
+# libfoo tests multilib supports when there are no subdirectories
+# libbar tests multilib supports when there are subdirectories
+
+mkdir libfoo
+
+cat >libfoo/configure.in <<'END'
+AC_PREREQ(2.57)
+AC_INIT(libfoo, 0.1, address@hidden)
+AC_CONFIG_SRCDIR(foo.c)
+AC_CONFIG_AUX_DIR(..)
+AM_INIT_AUTOMAKE(foreign)
+AC_PROG_CC
+AC_PROG_RANLIB
+AM_ENABLE_MULTILIB(Makefile,[..])
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
+END
+
+cat >libfoo/Makefile.am <<'END'
+noinst_LIBRARIES = libfoo.a
+libfoo_a_SOURCES = foo.c
+END
+
+: > libfoo/foo.c
+
+mkdir libbar
+
+cat >libbar/configure.in <<'END'
+AC_PREREQ(2.57)
+AC_INIT(libbar, 0.1, address@hidden)
+AC_CONFIG_AUX_DIR(..)
+AM_INIT_AUTOMAKE(foreign)
+AC_PROG_CC
+AC_PROG_RANLIB
+AM_ENABLE_MULTILIB(Makefile,[..])
+AC_CONFIG_FILES([Makefile sub/Makefile])
+AC_OUTPUT
+END
+
+cat >libbar/Makefile.am <<'END'
+SUBDIRS = sub
+noinst_LIBRARIES = libbar.a
+libbar_a_SOURCES = bar.c
+END
+
+mkdir libbar/sub
+
+: >libbar/sub/Makefile.am
+
+: > libbar/bar.c
+
+cp $testsrcdir/../lib/config-ml.in .
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+cd libfoo
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+cd ../libbar
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+cd ..
+
+
+# Check VPATH builds
+mkdir build
+cd build
+../configure --enable-multilib
+$MAKE
+$MAKE install
+$MAKE distcleancheck
+
+# Check standard builds.
+cd ..
+# Why to I have to specify --with-target-subdir?
+./configure --enable-multilib --with-target-subdir=.
+$MAKE
-- 
Alexandre Duret-Lutz





reply via email to

[Prev in Thread] Current Thread [Next in Thread]