[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Bug#419228: unnecessary linkage when libtool convenience libraries (
From: |
Ralf Wildenhues |
Subject: |
Re: Bug#419228: unnecessary linkage when libtool convenience libraries (noinst_LTLIBRARIES) are used |
Date: |
Mon, 23 Apr 2007 19:31:38 +0200 |
User-agent: |
Mutt/1.5.13 (2006-08-11) |
Hello Kurt, all,
Thanks for the patch.
* Kurt Roeckx wrote on Sun, Apr 22, 2007 at 01:22:30AM CEST:
>
> So would the attached patch be acceptable for now? I'm thinking about
> adding that to the Debian patch.
Hmm. It breaks when -static is used.
Here's how I tested your patch, as a new test against the testsuite of
CVS HEAD (apologies, but I rather prefer writing new tests for HEAD;
the patch contains two tests; the first one belongs to this bug).
If you're inclined, here's how you can use HEAD's new testsuite with
an 1.5.x libtool: get CVS HEAD, bootstrap and compile it. Then run
make check-local TESTSUITEFLAGS="-v -d -x -k indirect \
LIBTOOL=/path/to/the/1.5.x/libtool"
Both of those two tests work with Debian's current libtool, but break
with your patch. Note that they also break if -static is used for all
libraries (add LDFLAGS=-static to TESTSUITEFLAGS to try out), rather
than only to the final ones.
Libtool developers: ok to apply the patch, which serves to document
behavior that works and should continue to do so?
Cheers,
Ralf
* tests/indirect_deps.at: New file, with tests to ensure
`link_all_deplibs=no' does not break functionality.
* Makefile.am: Adjust.
Index: Makefile.am
===================================================================
RCS file: /cvsroot/libtool/libtool/Makefile.am,v
retrieving revision 1.216
diff -u -r1.216 Makefile.am
--- Makefile.am 29 Mar 2007 18:09:37 -0000 1.216
+++ Makefile.am 23 Apr 2007 17:16:59 -0000
@@ -439,6 +441,7 @@
tests/export.at \
tests/search-path.at \
tests/destdir.at \
+ tests/indirect_deps.at \
tests/old-m4-iface.at \
tests/am-subdir.at \
tests/lt_dlexit.at \
--- /dev/null 2007-04-15 17:46:43.220064750 +0200
+++ tests/indirect_deps.at 2007-04-23 19:20:14.000000000 +0200
@@ -0,0 +1,117 @@
+# indirect_deps.at -- support for link_all_deplibs=no -*- Autotest -*-
+
+# Copyright (C) 2007 Free Software Foundation, Inc.
+# Written by Ralf Wildenhues, 2007.
+#
+# This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+####
+
+AT_SETUP([indirect convenience])
+AT_KEYWORDS([libtool])
+
+AT_DATA([a.c], [[
+#include <math.h>
+int a () { return 0; }
+double ad (double x) { return sin (x); }
+]])
+AT_DATA([b.c], [[
+extern int a ();
+extern double ad (double);
+int b () { return a () + (int) ad (0.0); }
+]])
+AT_DATA([c.c], [[
+extern int b ();
+int c () { return b (); }
+]])
+AT_DATA([m.c], [[
+extern int c ();
+int main () { return c (); }
+]])
+
+LDFLAGS="$LDFLAGS -no-undefined"
+for file in a.c b.c c.c; do
+ $LIBTOOL --mode=compile --tag=CC $CC $CPPFLAGS $CFLAGS -c $file
+done
+$CC $CPPFLAGS $CFLAGS -c m.c
+
+# liba is an indirect dependency of libd and of libconv.
+$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o liba.la a.lo -rpath
/nowhere -lm
+$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libb.la b.lo liba.la
-rpath /nowhere
+$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libconv.la c.lo libb.la
+$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libd.la libconv.la
-rpath /nowhere
+
+for st in '' -static; do
+ AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS $st -o m1
m.$OBJEXT libd.la],
+ [], [ignore], [ignore])
+ AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS $st -o m2
m.$OBJEXT libconv.la],
+ [], [ignore], [ignore])
+ LT_AT_EXEC_CHECK([./m1])
+ LT_AT_EXEC_CHECK([./m2])
+done
+
+AT_CLEANUP
+
+
+AT_SETUP([indirect uninstalled])
+AT_KEYWORDS([libtool])
+
+AT_DATA([a.c], [[
+int a () { return 0; }
+]])
+AT_DATA([b.c], [[
+extern int a ();
+int b () { return a (); }
+]])
+AT_DATA([c.c], [[
+extern int b ();
+int c () { return b (); }
+]])
+
+AT_DATA([m1.c], [[
+extern int b ();
+int main () { return b (); }
+]])
+AT_DATA([m2.c], [[
+extern int c ();
+int main () { return c (); }
+]])
+
+mkdir a b c
+LDFLAGS="$LDFLAGS -no-undefined"
+for file in a.c b.c c.c; do
+ $LIBTOOL --mode=compile --tag=CC $CC $CPPFLAGS $CFLAGS -c $file
+done
+for file in m1.c m2.c; do
+ $CC $CPPFLAGS $CFLAGS -c $file
+done
+
+for st in '' -static; do
+ $LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o a/liba.la a.lo -rpath
/nowherea
+ $LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o b/libb.la b.lo
a/liba.la -rpath /nowhereb
+ $LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o c/libcee.la c.lo
b/libb.la -rpath /nowherec
+
+ AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS $st -o m1
m1.$OBJEXT b/libb.la],
+ [], [ignore], [ignore])
+ AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS $st -o m2
m2.$OBJEXT c/libcee.la],
+ [], [ignore], [ignore])
+ LT_AT_EXEC_CHECK([./m1])
+ LT_AT_EXEC_CHECK([./m2])
+done
+
+AT_CLEANUP