* libltdl/config/ltmain.m4sh (extracted_archives) (extracted_serial): New globals. (func_extract_archives): Use them to rename extraction archives for linking against multiple convenience libraries with the same name. * tests/duplicate_conv.at: New tests. * Makefile.am: Adjusted. Reported by Carlo Contavalli . Index: libltdl/config/ltmain.m4sh =================================================================== RCS file: /cvsroot/libtool/libtool/libltdl/config/ltmain.m4sh,v retrieving revision 1.34 diff -u -r1.34 ltmain.m4sh --- libltdl/config/ltmain.m4sh 5 Feb 2006 10:24:42 -0000 1.34 +++ libltdl/config/ltmain.m4sh 5 Feb 2006 10:59:48 -0000 @@ -116,6 +116,8 @@ preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 opt_dry_run=false opt_duplicate_deps=false @@ -1058,7 +1060,17 @@ esac func_basename "$my_xlib" my_xlib="$func_basename_result" - my_xdir="$my_gentop/$my_xlib" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" Index: Makefile.am =================================================================== RCS file: /cvsroot/libtool/libtool/Makefile.am,v retrieving revision 1.189 diff -u -r1.189 Makefile.am --- Makefile.am 1 Feb 2006 19:54:33 -0000 1.189 +++ Makefile.am 5 Feb 2006 10:59:46 -0000 @@ -384,6 +384,7 @@ TESTSUITE_AT = tests/testsuite.at \ tests/libtoolize.at \ tests/duplicate_members.at \ + tests/duplicate_conv.at \ tests/inherited_flags.at \ tests/convenience.at \ tests/link-order.at \ --- /dev/null 2006-01-25 19:46:43.433914872 +0100 +++ tests/duplicate_conv.at 2006-02-05 11:48:55.000000000 +0100 @@ -0,0 +1,81 @@ +# 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([duplicate convenience archive names]) +AT_KEYWORDS([libtool]) + +# We create two convenience archives with the same name, and _also_ +# containing an object with the same name. This is necessary to detect +# the failure with both 1.5.22 and HEAD, since the latter does not (did +# not?) remove the temporary output directory, thus masking the failure +# when all objects have distinct names. + +mkdir a b c + +echo 'int a () { return 0; }' > a/a.c +echo 'int a2() { return 0; }' > b/a.c +echo 'int b () { return 0; }' > b/b.c +echo 'extern int a(), a2(), b(); int c() { return a() + a2() + b(); }' > c.c +echo 'extern int c(); int main() { return c(); }' > main.c + +$LIBTOOL --mode=compile --tag=CC $CC $CPPFLAGS $CFLAGS -c a/a.c -o a/a.lo +$LIBTOOL --mode=compile --tag=CC $CC $CPPFLAGS $CFLAGS -c b/a.c -o b/a.lo +$LIBTOOL --mode=compile --tag=CC $CC $CPPFLAGS $CFLAGS -c b/b.c -o b/b.lo +$LIBTOOL --mode=compile --tag=CC $CC $CPPFLAGS $CFLAGS -c c.c +$CC $CPPFLAGS $CFLAGS -c main.c +$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o a/liba.la a/a.lo +$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o b/liba.la b/a.lo b/b.lo + +# Fold into convenience archive. +AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libcee.la c.lo a/liba.la b/liba.la], + [0], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT ./libcee.la], + [0], [ignore], [ignore]) +LT_AT_EXEC_CHECK([./main],[0],[ignore],[ignore]) +$LIBTOOL --mode=clean rm -f libcee.la + + +# FIXME: For this test, we may want to zero out whole_archive_flag_spec; +# OTOH, we'd like to test the other situation, too. + +# Fold into static library. +AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -rpath /foo -static -o libcee.la c.lo a/liba.la b/liba.la], + [0], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT ./libcee.la], + [0], [ignore], [ignore]) +LT_AT_EXEC_CHECK([./main],[0],[ignore],[ignore]) +$LIBTOOL --mode=clean rm -f libcee.la + +# Fold into library. +AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -rpath /foo -o libcee.la c.lo a/liba.la b/liba.la], + [0], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT ./libcee.la], + [0], [ignore], [ignore]) +LT_AT_EXEC_CHECK([./main],[0],[ignore],[ignore]) +$LIBTOOL --mode=clean rm -f libcee.la + +# Test whether this works with reloadable objects as well. +AT_CHECK([$LIBTOOL --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o cee.$OBJEXT c.lo a/liba.la b/liba.la], + [0], [ignore], [ignore]) +AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o main main.$OBJEXT cee.$OBJEXT], + [0], [ignore], [ignore]) +LT_AT_EXEC_CHECK([./main],[0],[ignore],[ignore]) + +# TODO: test dlpreloading of duplicates (when it is implemented) + +AT_CLEANUP