libtool-patches
[Top][All Lists]
Advanced

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

Re: multilib patch


From: Peter O'Gorman
Subject: Re: multilib patch
Date: Wed, 30 Jan 2008 15:06:20 -0600
User-agent: Thunderbird 2.0.0.9 (X11/20071115)

Ralf Wildenhues wrote:
> Hi Peter,
> 
> * Peter O'Gorman wrote on Wed, Jan 30, 2008 at 09:16:38AM CET:
>> Not much response last time, here we go again.
> 
> Sorry about the delay.
> 
>> Ok to apply to branch-1-5 and forward port to HEAD?
> 
> Nits below.
> 
> FWIW, on Debian x86_64, this patch causes for me /usr/lib to appear
> in the front, with both 64bit mode (./configure) and 32bit mode
> (./configure CPPFLAGS=-m32 LDFLAGS=-m32).  For Debian, the latter
> is wrong, /usr/lib64 is a symlink to /usr/lib.  Before the patch,
> both modes looked better.

Thank you!

I think this one should do the right thing on your debian system too.
Would you be kind enough to give it a try for me?

I killed the awk, test for pwd -P, and try to get the real absolute dir
name.

Peter
-- 
Peter O'Gorman
http://pogma.com
Index: libtool.m4
===================================================================
RCS file: /sources/libtool/libtool/Attic/libtool.m4,v
retrieving revision 1.314.2.195
diff -u -r1.314.2.195 libtool.m4
--- libtool.m4  30 Jan 2008 06:40:57 -0000      1.314.2.195
+++ libtool.m4  30 Jan 2008 21:03:32 -0000
@@ -1315,42 +1315,93 @@
   else
     lt_search_path_spec=`echo "$lt_search_path_spec" | $SED  -e 
"s/$PATH_SEPARATOR/ /g"`
   fi
+
+lt_pwdP=
+if (pwd -P || exit) >/dev/null 2>&1; then lt_pwdP="pwd -P";fi
+
+lt_func_print_dir_resolving_links () {
+lt_func_print_dir_resolving_links_result=
+if test -n "$lt_pwdP"; then
+  lt_func_print_dir_resolving_links_result=`cd [$]1 && $lt_pwdP`
+else
+  if test -h "[$]1"; then
+    _lt_dir=`ls -ld [$]1 | ${SED} 's/.* -> //'`
+  else
+    _lt_dir=[$]1
+  fi
+  lt_func_print_dir_resolving_links_result=`cd $_lt_dir && pwd`    
+fi
+}
+
   # Ok, now we have the path, separated by spaces, we can step through it
   # and add multilib dir if necessary.
   lt_tmp_lt_search_path_spec=
   lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 
2>/dev/null`
   for lt_sys_path in $lt_search_path_spec; do
     if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec 
$lt_sys_path/$lt_multi_os_dir"
+       lt_func_print_dir_resolving_links $lt_sys_path/$lt_multi_os_dir
+       case " $lt_tmp_lt_search_path_spec " in
+         *" $lt_func_print_dir_resolving_links_result ") ;;
+         *) lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec 
$lt_func_print_dir_resolving_links_result" ;;
+       esac
     else
-      test -d "$lt_sys_path" && \
-       lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+      if test -d "$lt_sys_path"; then
+       lt_func_print_dir_resolving_links $lt_sys_path
+       case " $lt_tmp_lt_search_path_spec " in
+         *" $lt_func_print_dir_resolving_links_result ") ;;
+         *) lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec 
$lt_func_print_dir_resolving_links_result" ;;
+       esac
+      fi
     fi
   done
-  lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
+
+  sys_lib_search_path_spec=`echo $lt_tmp_lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+# And it gets worse. gcc -print-search-dirs combined with gcc
+# -print-multi-os-directory does not find all the directories that gcc
+# searches. When building gcc -m32 on a system which defaults to 64
+# bit builds, gcc also searches directories like e.g.
+# /usr/lib/gcc/x86_64-redhat-linux/4.1.2/32 but
+# -print-multi-os-directory outputs ../lib. I no longer know why we
+# don't just assume that gcc does the right thing, so we now verbose
+# link something grab the -L paths and prepend to
+# sys_lib_search_path_spec is not already there...
+# Sad yet?
+#
+# We could probably get away without conftest.c and just do 
+# 'gcc -v -x c -o /dev/null /dev/null', but lets be conservative.
+#
+# Need LDFLAGS, but not with -L.
+_lt_ldflags=
+for _ld_flag in "$LDFLAGS"; do
+  case "$_ld_flag" in
+    -L*) ;;
+    *) _lt_ldflags="$_ld_flag $_lt_ldflags" ;;
+  esac
+done 
+echo 'int main() { return 1;}' > conftest.c
+_lt_verbose_search_libs=`$CC $CPPFLAGS $CFLAGS $_lt_ldflags -o conftest -v 
conftest.c 2>&1 | awk '
+BEGIN {lt_space=0;} /-L/ {
+  for (lt_x=1; lt_x <= NF; lt_x++) {
+    if ( substr($lt_x,1,2) == "-L") {
+      lt_y=substr($lt_x,3,length($lt_x) -2);
+      if (lt_space > 0) { printf " "; }
+      printf lt_y;
+      lt_space++;
     }
   }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
 }'`
-  sys_lib_search_path_spec=`echo $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
+rm -rf conftest*
+for _lt_verbose_search_lib in $_lt_verbose_search_libs; do
+  lt_func_print_dir_resolving_links $_lt_verbose_search_lib
+  case " $sys_lib_search_path_spec " in
+   *" $lt_func_print_dir_resolving_links_result "*) ;;
+   *) sys_lib_search_path_spec="$_lt_verbose_search_lib 
$sys_lib_search_path_spec" ;;
+  esac
+done
+])
 need_lib_prefix=unknown
 hardcode_into_libs=no
 

reply via email to

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