Hi,
Some discussion was ongoing recently in cooker ML about the
uncomfortably long time for libtool to compile stuff, because
of it's duplication of -lfoo -lbar handling. Somebody (I forgot
the name) has said that a patch was submitted to libtool maintainers,
but it's not merged into libtool 1.4.2.
After a closer look, I found that it's committed into CVS
soon after 1.4.2, so I tried to backport it, and the result
is attached. Though it works for me, I still want to see if
anybody can find any fault in it before the patch goes into
cooker, since libtool is such a critical piece of software.
Anybody want to test it?
For those who don't want to merge the patch themselves, I
have packed a trial RPM for downloading:
http://cle.org.hk/~maddog/files/Mandrake/libtool/
This patch is mostly useful for those software that got
stuck during libtool linking. Here's a few comparision of
compilation on my mobile PIII 700:
without patch with patch
evolution > 3 days 3.5 hrs
gtkhtml several hrs around 20 min
Abel
--- libtool-1.4.2/ltmain.sh.duplicatedep Tue Sep 11 07:40:18 2001
+++ libtool-1.4.2/ltmain.sh Tue Jan 1 08:06:36 2002
@@ -177,6 +177,8 @@
--mode) prevopt="--mode" prev=mode ;;
--mode=*) mode="$optarg" ;;
+ --preserve-dup-deps) duplicate_deps="yes" ;;
+
--quiet | --silent)
show=:
;;
@@ -1330,11 +1332,32 @@
# Find all interdependent deplibs by searching for libraries
# that are linked more than once (e.g. -la -lb -la)
for deplib in $deplibs; do
- case "$libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
libs="$libs $deplib"
done
+
+ if test "$linkmode" = lib; then
+ libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+ # Compute libraries that are listed more than once in $predeps
+ # $postdeps and mark them as special (i.e., whose duplicates are
+ # not to be eliminated).
+ pre_post_deps=
+ if test "X$duplicate_deps" = "Xyes" ; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$pre_post_deps $pre_post_dep"
+ done
+ fi
+ pre_post_deps=
+ fi
+
deplibs=
newdependency_libs=
newlib_search_path=
@@ -1555,9 +1578,11 @@
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
- case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
tmp_libs="$tmp_libs $deplib"
done
elif test $linkmode != prog && test $linkmode != lib; then
@@ -1680,9 +1705,11 @@
# or/and link against static libraries
newdependency_libs="$deplib $newdependency_libs"
fi
- case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
tmp_libs="$tmp_libs $deplib"
done # for deplib
continue
@@ -1981,9 +2008,11 @@
tmp_libs=
for deplib in $dependency_libs; do
newdependency_libs="$deplib $newdependency_libs"
- case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
tmp_libs="$tmp_libs $deplib"
done