bug-libtool
[Top][All Lists]
Advanced

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

Re: --preserve-dup-deps seems not to work


From: Ralf Wildenhues
Subject: Re: --preserve-dup-deps seems not to work
Date: Wed, 13 Sep 2006 08:54:22 +0200
User-agent: Mutt/1.5.13 (2006-09-01)

Hello Stefan,

Thanks for the bug report.

* Stefan Traby wrote on Wed, Sep 13, 2006 at 04:01:19AM CEST:
> 
> I tried libtool-1.4.3 (which introduced --preserve-dup-deps)
> in addition to 1.5.22 which I use normally:
> 
> The long (real-world) output is here:
> http://txt.hello-penguin.com/b841990fcf3769591e90b01c8947e03a.txt
> 
> here a short variant:
> /bin/sh ./libtool --preserve-dup-deps --mode=link gcc  -g -O2 -o prog prog.o 
> liba.la libb.la liba.la libb.la 
> gcc -g -O2 -o prog prog.o  ./.libs/liba.a ./.libs/libb.a
> 
> I don't know how to make libtool to honor duplicate dependencies.

In this special case, you have two convenience archives liba.la and
libb.la which have a circular dependency (as opposed to: one or both
libraries are to-be-installed static or shared libraries).  I agree
that this case should work.  But this case is also the easiest to work
around: you could add liba.la as a dependency to the link line of
libb.la:
  $LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libb.la \
           b.lo [OBJECTS...] liba.la

This is a bit wasteful in that all objects from liba will also appear
in some form or other in libb, but it should be portable.  It will
require you to add a dependency of libb.la on liba.la in your Makefile
(in case you use Automake it should take care of that, I believe).

I think we should fix this.  Proposed test case below.

Cheers,
Ralf

        * tests/duplicate_deps.at: New file.  Test circular depending
        convenience archives (currently failing).
        * Makefile.am: Update.
        Report by Stefan Traby <address@hidden>.

Index: Makefile.am
===================================================================
RCS file: /cvsroot/libtool/libtool/Makefile.am,v
retrieving revision 1.198
diff -u -r1.198 Makefile.am
--- Makefile.am 12 Sep 2006 18:02:31 -0000      1.198
+++ Makefile.am 13 Sep 2006 05:48:01 -0000
@@ -399,6 +399,7 @@
                  tests/libtoolize.at \
                  tests/duplicate_members.at \
                  tests/duplicate_conv.at \
+                 tests/duplicate_deps.at \
                  tests/inherited_flags.at \
                  tests/convenience.at \
                  tests/link-order.at \
--- /dev/null   2006-09-05 22:40:33.520458500 +0200
+++ tests/duplicate_deps.at     2006-09-13 07:48:16.000000000 +0200
@@ -0,0 +1,64 @@
+# Hand crafted tests for GNU Libtool.                         -*- Autotest -*-
+# Copyright 2006 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 2, 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.
+
+AT_SETUP([preserve duplicate convenience deps])
+AT_KEYWORDS([libtool])
+
+# --preserve-dup-deps should work for convenience archives.
+
+# Create a circular dependency of liba and libb:
+# a1 pulls in b1, that pulls in a2.
+cat >a1.c <<\EOF
+extern int b1 ();
+int a1 () { return b1 (); }
+EOF
+cat >a2.c <<\EOF
+int a2 () { return 0; }
+EOF
+cat >b1.c <<\EOF
+extern int a2 ();
+int b1 () { return a2 (); }
+EOF
+cat >main.c <<\EOF
+extern int a1 ();
+int main () { return a1 (); }
+EOF
+
+for file in a1.c a2.c b1.c; do
+  $LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c $file
+done
+$CC $CPPFLAGS $CFLAGS -c main.c
+$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o liba.la a1.lo a2.lo
+
+# This could be worked around by adding liba.la to libb.la
+# (in that case all objects from liba would be merged into
+# libb.a as well, possibly renamed.)
+$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libb.la b1.lo liba.la
+AT_CHECK([$LIBTOOL --mode=link --tag=CC \
+         $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT liba.la libb.la],
+         [0], [ignore], [ignore])
+LT_AT_EXEC_CHECK([./main])
+
+# This currently fails:
+AT_XFAIL_IF([:])
+$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libb.la b1.lo
+AT_CHECK([$LIBTOOL --mode=link --preserve-dup-deps --tag=CC \
+         $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT liba.la libb.la liba.la],
+         [0], [ignore], [ignore])
+
+AT_CLEANUP




reply via email to

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