+2005-04-08 Alexandre Oliva <aoliva@redhat.com>,
+ Peter O'Gorman <peter@pogma.com>
+
+ * ltmain.in: Don't add files with the same base name to an
+ archive; rename duplicates instead.
+ (func_extract_an_archive): Remove section to deal with duplicate
+ base names in an archive.
+ * tests/func_extract_archives.test: remove.
+ * tests/duplicate_members.test: new test.
+ * tests/Makefile.am: Add new test, remove old.
+
2005-04-08 Alexandre Oliva <aoliva@redhat.com>,
Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
{
f_ex_an_ar_dir="$1"; shift
f_ex_an_ar_oldlib="$1"
- f_ex_an_ar_lib=`$echo "X$f_ex_an_ar_oldlib" | $Xsed -e 's%^.*/%%'`
$show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
$run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
:
else
- $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
- $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
- $show "cp $f_ex_an_ar_oldlib $f_ex_an_ar_dir/$f_ex_an_ar_lib"
- $run eval "cp \$f_ex_an_ar_oldlib \$f_ex_an_ar_dir/\$f_ex_an_ar_lib"
- $AR t "$f_ex_an_ar_oldlib" | sort | uniq -c \
- | $EGREP -v '^[ ]*1[ ]' | while read count name
- do
- i=1
- while test "$i" -le "$count"
- do
- # Put our $i before any first dot (extension)
- # Never overwrite any file
- name_to="$name"
- while test "X$name_to" = "X$name" || test -f "$f_ex_an_ar_dir/$name_to"
- do
- name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
- done
- $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_lib '$name' && $mv '$name' '$name_to')"
- $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_lib '$name' && $mv '$name' '$name_to' && $AR -d \$f_ex_an_ar_lib '$name')" || exit $?
- i=`expr $i + 1`
- done
- done
- $show "$rm $f_ex_an_ar_dir/$f_ex_an_ar_lib"
- $run eval "$rm \$f_ex_an_ar_dir/\$f_ex_an_ar_lib"
+ $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+ exit $EXIT_FAILURE
fi
}
if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
cmds=$old_archive_from_new_cmds
else
+ # POSIX demands no paths to be encoded in archives. We have
+ # to avoid creating archives with duplicate basenames if we
+ # might have to extract them afterwards, e.g., when creating a
+ # static archive out of a convenience library, or when linking
+ # the entirety of a libtool archive into another (currently
+ # not supported by libtool).
+ if (for obj in $oldobjs
+ do
+ $echo "X$obj" | $Xsed -e 's%^.*/%%'
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "copying selected object files to avoid basename conflicts..."
+
+ if test -z "$gentop"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ fi
+
+ save_oldobjs=$oldobjs
+ oldobjs=
+ counter=1
+ for obj in $save_oldobjs
+ do
+ objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ case " $oldobjs " in
+ " ") oldobjs=$obj ;;
+ *[\ /]"$objbase "*)
+ while :; do
+ # Make sure we don't pick an alternate name that also
+ # overlaps.
+ newobj=lt$counter-$objbase
+ counter=`expr $counter + 1`
+ case " $oldobjs " in
+ *[\ /]"$newobj "*) ;;
+ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+ esac
+ done
+ $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+ $run ln "$obj" "$gentop/$newobj" ||
+ $run cp "$obj" "$gentop/$newobj"
+ oldobjs="$oldobjs $gentop/$newobj"
+ ;;
+ *) oldobjs="$oldobjs $obj" ;;
+ esac
+ done
+ fi
+
eval cmds=\"$old_archive_cmds\"
if len=`expr "X$cmds" : ".*"` &&
objlist=
concat_cmds=
save_oldobjs=$oldobjs
- # GNU ar 2.10+ was changed to match POSIX; thus no paths are
- # encoded into archives. This makes 'ar r' malfunction in
- # this piecewise linking case whenever conflicting object
- # names appear in distinct ar calls; check, warn and compensate.
- if (for obj in $save_oldobjs
- do
- $echo "X$obj" | $Xsed -e 's%^.*/%%'
- done | sort | sort -uc >/dev/null 2>&1); then
- :
- else
- $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2
- $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2
- AR_FLAGS=cq
- fi
+
# Is there a better way of finding the last object in the list?
for obj in $save_oldobjs
do
--- /dev/null
+#! /bin/sh
+# duplicate members
+
+need_prefix=no
+if test -z "$srcdir"; then
+ srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
+ test "$srcdir" = "$0" && srcdir=.
+ test "${VERBOSE+set}" != "set" && VERBOSE=yes
+fi
+. $srcdir/defs || exit 1
+
+test -d duplicate_members.dir && rm -rf duplicate_members.dir
+mkdir duplicate_members.dir
+# we don't want to use whole_archive_flag_spec, even if available
+sed -e 's|^whole_archive_flag_spec=.*|whole_archive_flag_spec=|g' < $libtool > duplicate_members.dir/libtool
+
+cd duplicate_members.dir
+chmod +x ./libtool
+
+for a in 1 2 3 4 5 6
+do
+ mkdir $a
+ echo "int foo$a() {return $a;}" > $a/a.c
+done
+eval `./libtool --config | grep ^CC`
+
+for a in 1 2 3 4 5 6
+do
+ ./libtool --mode=compile --tag=CC $CC -c $CFLAGS -o $a/a.lo $a/a.c
+done
+./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libc0.la 6/a.lo
+./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libconv.la 1/a.lo 2/a.lo 3/a.lo 4/a.lo 5/a.lo libc0.la
+
+cat <<EOF > bar.c
+int bar() {
+ int result=foo1() +foo2() +foo3() +foo4() +foo5() +foo6();
+ return result;
+}
+EOF
+
+./libtool --mode=compile --tag=CC $CC -c $CFLAGS -o bar.lo bar.c
+./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o libbar.la bar.lo libconv.la -rpath /notexist
+
+cat <<EOF > main.c
+int bar();
+int main()
+{
+if (bar() == 21) return 0;
+return 1;
+}
+EOF
+./libtool --mode=compile --tag=CC $CC -c $CFLAGS -o main.lo main.c
+./libtool --mode=link --tag=CC $CC $CFLAGS $LDFLAGS -o main main.lo ./libbar.la
+./main
+retcode=$?
+cd ..
+rm -rf duplicate_members.dir
+exit $retcode
+++ /dev/null
-#! /bin/sh
-# func_extract_archives.test
-
-need_prefix=no
-if test -z "$srcdir"; then
- srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
- test "$srcdir" = "$0" && srcdir=.
- test "${VERBOSE+set}" != "set" && VERBOSE=yes
-fi
-. $srcdir/defs || exit 1
-rm -f foo.o bar.o libfoo.a
-SED=${SED-sed}
-Xsed="$SED -e s/^X//"
-for afile in baz foobar foobaz
-do
- echo "$afile" > $afile.o
- ar -q libfoo.a $afile.o
- rm -f $afile.o
-done
-for anum in 1 2 3 4 5 6 7 8 9 10 11 12
-do
- echo "foo $anum" > foo.o
- echo "bar $anum" > bar.o
- ar -q libfoo.a foo.o bar.o
-done
-test -d .libs || mkdir .libs
-
-eval "`$SED -n -e '/^# Shell function definitions:'$z'$/,/^# End of Shell function definitions'$z'$/p' < $libtool`"
-
-modename=libtool
-show=echo
-run=
-mkdir=mkdir
-rm="rm -f"
-mv=mv
-echo=echo
-AR=${AR-ar}
-func_extract_archives ".libs/libfoo" "libfoo.a"
-for anum in 1 2 3 4 5 6 7 8 9 10 11 12
-do
- test -f ".libs/libfoo/libfoo.a/foo-$anum.o" || exit 1
- $EGREP -v "foo-$anum" ".libs/libfoo/libfoo.a/foo-$anum.o" || exit 1
- rm -f ".libs/libfoo/libfoo.a/foo-$anum.o"
-done
-rm -rf ".libs/libfoo" libfoo.a bar.o foo.o
-exit 0