automake-patches
[Top][All Lists]
Advanced

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

Re: Faster install for libtool outputs.


From: Ralf Wildenhues
Subject: Re: Faster install for libtool outputs.
Date: Sat, 20 Sep 2008 12:51:03 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

* Ralf Wildenhues wrote on Sun, Sep 14, 2008 at 03:23:45PM CEST:
> 
> Sigh, this was overly optimistic.  With libtool libraries, the
> eventual need to relink at install time requires that the ordering
> is exactly the same as given in the Makefile.am lines.
> 
> This is because automake is not smart enough to translate *_LIBADD
> settings into install-order dependencies, so it has to rely on the
> developer listing libraries in correct install order.  Luckily that
> coincides with build order requirements, at least when all libraries
> are listed in the same primary.
> 
> So we only get a small advantage out of ltlib: passing multiple
> nobase_ libraries to be installed in the same directory can still
> be done at once, as libtool will treat them in the order given.

Fixed thusly.

BTW, I am really grateful for the fact that Automake has so many
regression tests.  Otherwise, I'm sure many more such issues would
go unnoticed at first; I regularly find problems with 'make check'
when working on a patch.

One downside of the large test suite is the time it takes to complete.
Since there are lots of instances of $sleep in it, I've found it helpful
to use a munged version of coreutils' check.mk for running tests in
parallel.  Hmm, maybe that will push me to eventually finish its
inclusion into Automake proper.

Cheers,
Ralf

    Do not reorder nobase ltlib installation.
    
    This patch changes back the order of installation of nobase
    LTLIBRARIES to that in which files are listed in the variables.
    It does not fix the issue of strict dependency ordering, as
    implied by *_LIBADD, but as before allows to steer the order by
    listing the libraries in nobase_*_LTLIBRARIES appropriately.
    
    As an advantage over the state of 1.10, multiple consecutive
    nobase libraries to be installed in the same directory are
    passed to libtool in one invocation.
    
    * lib/am/ltlib.am (install-%DIR%LTLIBRARIES) [!%?BASE%]: Do not
    reorder libraries upon installation.  Remove spurious empty
    line.
    * tests/ltorder.test: New test.
    * tests/Makefile.am: Update.

diff --git a/lib/am/ltlib.am b/lib/am/ltlib.am
index 7afc657..c6d731d 100644
--- a/lib/am/ltlib.am
+++ b/lib/am/ltlib.am
@@ -49,23 +49,26 @@ if %?BASE%
 ?!LIBTOOL?       $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$list 
"$(DESTDIR)$(%NDIR%dir)"; \
        }
 else !%?BASE%
-       @list='$(%DIR%_LTLIBRARIES)'; $(am__nobase_list) | \
+       @list='$(%DIR%_LTLIBRARIES)'; for p in $$list; do \
+         if test -f "$$p"; then echo "$$p $$p"; else :; fi; done | \
+       sed '/ .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+       $(AWK) 'BEGIN { cur = "." } \
+         { if ($$2 == cur) { files = files " " $$1 } \
+           else { print cur, files; files = $$1; cur = $$2 } } \
+         END { print cur, files }' | \
        while read dir files; do \
-         xfiles=; for p in $$files; do \
-           if test -f "$$p"; then xfiles="$$xfiles $$p"; else :; fi; done; \
-         test -z "$$xfiles" || { \
+         test -z "$$files" || { \
            test "x$$dir" = x. || { \
              echo "$(MKDIR_P) '$(DESTDIR)$(%NDIR%dir)/$$dir'"; \
              $(MKDIR_P) "$(DESTDIR)$(%NDIR%dir)/$$dir"; }; \
-
 ## Note that we explicitly set the libtool mode.  This avoids any lossage
 ## if the program doesn't have a name that libtool expects.
 ## Use INSTALL and not INSTALL_DATA because libtool knows the right
 ## permissions to use.
-?LIBTOOL?          echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) 
--mode=install $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$xfiles 
'$(DESTDIR)$(%NDIR%dir)/$$dir'"; \
-?LIBTOOL?          $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) 
--mode=install $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$xfiles 
"$(DESTDIR)$(%NDIR%dir)/$$dir" || exit $$?; \
-?!LIBTOOL?         echo " $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) 
$$xfiles '$(DESTDIR)$(%NDIR%dir)/$$dir'"; \
-?!LIBTOOL?         $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$xfiles 
"$(DESTDIR)$(%NDIR%dir)/$$dir" || exit $$?; \
+?LIBTOOL?          echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) 
--mode=install $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$files 
'$(DESTDIR)$(%NDIR%dir)/$$dir'"; \
+?LIBTOOL?          $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) 
--mode=install $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$files 
"$(DESTDIR)$(%NDIR%dir)/$$dir" || exit $$?; \
+?!LIBTOOL?         echo " $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) 
$$files '$(DESTDIR)$(%NDIR%dir)/$$dir'"; \
+?!LIBTOOL?         $(%DIR%LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$files 
"$(DESTDIR)$(%NDIR%dir)/$$dir" || exit $$?; \
          }; \
        done
 endif !%?BASE%
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4445c40..f3a0880 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -379,6 +379,7 @@ ltdeps.test \
 ltinstloc.test \
 ltlibobjs.test \
 ltlibsrc.test \
+ltorder.test \
 lzma.test \
 maintclean.test \
 make.test \
diff --git a/tests/ltorder.test b/tests/ltorder.test
new file mode 100755
index 0000000..9994008
--- /dev/null
+++ b/tests/ltorder.test
@@ -0,0 +1,59 @@
+#!/bin/sh
+# Copyright (C) 2008  Free Software Foundation, Inc.
+#
+# This program 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 3, 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, see <http://www.gnu.org/licenses/>.
+
+# Test for correct installation order of nobase libtool libraries.
+
+required='libtoolize'
+. ./defs || Exit 1
+
+set -e
+
+cat >>configure.in <<'END'
+AC_PROG_CC
+AC_PROG_LIBTOOL
+AC_OUTPUT
+END
+
+cat >Makefile.am <<'END'
+nobase_lib_LTLIBRARIES = liba1.la sub/liba2.la sub/liba3.la liba4.la liba5.la
+sub_liba2_la_LIBADD = liba1.la
+sub_liba3_la_LIBADD = sub/liba2.la
+liba4_la_LIBADD = sub/liba3.la
+liba5_la_LIBADD = liba4.la
+END
+
+mkdir sub
+echo 'int a1 () { return 1; }' >liba1.c
+echo 'extern int a1 (); int a2 () { return a1 (); }' >sub/liba2.c
+echo 'extern int a2 (); int a3 () { return a2 (); }' >sub/liba3.c
+echo 'extern int a3 (); int a4 () { return a3 (); }' >liba4.c
+echo 'extern int a4 (); int a5 () { return a4 (); }' >liba5.c
+
+libtoolize
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE --add-missing
+
+./configure "--prefix=`pwd`/inst"
+
+$MAKE
+$MAKE install 2>stderr || { cat stderr >&2; Exit 1; }
+cat stderr >&2
+grep 'has not been installed' stderr && Exit 1
+
+$MAKE uninstall
+test `find inst -type f -print | wc -l` -eq 0
+:




reply via email to

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