Hi,
I have a cross compiling toolchain which use libtool-1.5.10.
The toolchain place binaries, libraries ... in another path
(ex:/usr/local/toolchain/).
However, the *.la files were created with another path, it looks like
$ cat libpng12.la |grep libdir
libdir='/usr/lib'
Actually, the libpng12.la was placed in /usr/local/toolchain/usr/lib.
I had made a patch that let libtoo-1.5.10 support SYSROOT_PATH.
Before people use libtool to cross compilie, he can add a sysroot path
in *libdir* if he export LIBTOOL_SYSROOT_PATH first.
ex:
$export LIBTOOL_SYSROOT_PATH=/usr/local/foo
Once libtool try to read in libdir='/usr/lib' in la file, it will
replace it with libdir='/usr/local/foo/usr/lib'
I add the patch as attachment.
Best Regards,
-Julian
Index: libtool-1.5.10/ltmain.in
===================================================================
--- libtool-1.5.10.orig/ltmain.in 2008-07-25 16:24:21.000000000 +0800
+++ libtool-1.5.10/ltmain.in 2008-07-25 18:31:41.000000000 +0800
@@ -137,6 +137,52 @@
# Shell function definitions:
# This seems to be the best place for them
+# func_add_sysroot_path add LIBTOOL_SYSROOT_PATH as prefix in search path
+# -L/usr/lib -> -L/home/foo/usr/lib if sysroot is /home/foo
+func_add_sysroot_path ()
+{
+ _suffix=""
+ _leading=""
+ case "${1}" in
+ -L*)
+ _suffix=`echo ${1} |sed -e s:-L::`
+ _suffix=${LIBTOOL_SYSROOT_PATH}${_suffix}
+ _leading="-L"
+ ;;
+ -I*)
+ _suffix=`echo ${1} |sed -e s:-I::`
+ _suffix=${LIBTOOL_SYSROOT_PATH}${_suffix}
+ _leading="-I"
+ ;;
+ /*)
+ _suffix=${LIBTOOL_SYSROOT_PATH}${1}
+ _leading=""
+ ;;
+ *)
+ _suffix=${1}
+ _leading=""
+ esac
+ eval add_sysroot_path_result=${_leading}${_suffix}
+}
+
+# func_rm_sysroot_path remove LIBTOOL_SYSROOT_PATH
+# -L/home/foo/usr/lib => if sysroot is /home/foo
+func_rm_sysroot_path () {
+ __rm_sysroot_path=${1}
+ case $__rm_sysroot_path in
+ -L*)
+ __rm_sysroot_path=`echo ${1}|sed -e s:$LIBTOOL_SYSROOT_PATH:/:g`
+ ;;
+ -I*)
+ __rm_sysroot_path=`echo ${1}|sed -e s:$LIBTOOL_SYSROOT_PATH:/:g`
+ ;;
+ /*)
+ __rm_sysroot_path=`echo ${1}|sed -e s:$LIBTOOL_SYSROOT_PATH:/:g`
+ ;;
+ esac
+ rm_sysroot_path_result=`echo ${__rm_sysroot_path}|sed -e s://:/:g`
+}
+
# func_win32_libid arg
# return the library type of file 'arg'
#
@@ -2196,6 +2242,16 @@
*) . ./$lib ;;
esac
+ # Add Sysroot to path #
+ tmp_depen_libs=
+ for depen_lib in $dependency_libs; do
+ func_add_sysroot_path $depen_lib
+ tmp_depen_libs="$tmp_depen_libs $add_sysroot_path_result "
+ done
+ dependency_libs=$tmp_depen_libs
+ func_add_sysroot_path $libdir
+ libdir="$add_sysroot_path_result"
+
if test "$linkmode,$pass" = "lib,link" ||
test "$linkmode,$pass" = "prog,scan" ||
{ test "$linkmode" != prog && test "$linkmode" != lib; }; then
@@ -2777,6 +2833,10 @@
# $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
# fi
if ! grep "^installed=no" $deplib > /dev/null; then
+ #Add Sysroot to libdir
+ func_add_sysroot_path $libdir
+ libdir=$add_sysroot_path_result
+
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
if test -z "$libdir"; then
$echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
@@ -5243,6 +5303,17 @@
case $host,$output,$installed,$module,$dlname in
*cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
esac
+
+ # Remove Sysroot from path before write in .la file #
+ tmp_depen_libs=
+ for depen_lib in $dependency_libs; do
+ func_rm_sysroot_path $depen_lib
+ tmp_depen_libs="$tmp_depen_libs $rm_sysroot_path_result "
+ done
+ dependency_libs=$tmp_depen_libs
+ func_rm_sysroot_path $libdir
+ libdir="$rm_sysroot_path_result"
+
$echo > $output "\
# $outputname - a libtool library file
# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP