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
 

Reply via email to