pkgsrc/mk/buildlink3/libtool-fix-la
jlam 4149dcc90e We were writing the wrong directory path for the location to the
uninstalled libtool archive in the case where we build it into some
place other than the current directory.  Older versions of libtool
didn't allow you to build a *.la file anywhere other than the current
directory, and libtool-fix-la made use of this assumption in libtool's
behavior.  More recent versions of libtool *do* let you build a *.la
file anywhere you'd like, so instead of blindly assuming it's the
current directory, use the path to the argument of the -o option.
This embeds the proper directory path into the uninstalled libtool
archive.

This has no impact on packages that just build libtool archives into
the current directory.  The packages that *are* impacted are the ones
that:

   (1) pkgsrc converted to use libtool, and,
   (2) build shared libraries that are linked into other things
       as part of the build, and,
   (3) builds the libtool archives in some place other than the
       current directory.
2005-06-22 21:08:37 +00:00

352 lines
11 KiB
Text

# $NetBSD: libtool-fix-la,v 1.6 2005/06/22 21:08:37 jlam Exp $
#
# Copyright (c) 2004 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Johnny C. Lam.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by the NetBSD
# Foundation, Inc. and its contributors.
# 4. Neither the name of The NetBSD Foundation nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# For *.la files, in the "relink_command" line, we make the following
# replacements:
#
# "libfoo.la" -> "-L./.libs libfoo.la"
# "dirpath/libfoo.la" -> "-Ldirpath/.libs libfoo.la"
#
# This allows the libraries to be found within ${WRKSRC} during
# relinking. We rely on the proper rpath settings to be set by libtool.
#
# For the *.lai files, in the "dependency_libs" line, we remove
# redundant -Ldir and -llib options. We also make sure that we don't
# ever reference other .la files, only referring to other libraries
# via the usual "-L/path -llib" and making sure that /path is always
# somewhere under the default view. This makes wildcard dependencies
# work for "overwrite" packages by letting libtool find libraries in
# the default view.
BUILDLINK_DIR="@BUILDLINK_DIR@"
DEPOTBASE="@DEPOTBASE@"
LOCALBASE="@LOCALBASE@"
WRKSRC="@WRKSRC@"
basename="@BASENAME@"
dirname="@DIRNAME@"
egrep="@EGREP@"
mv="@MV@"
rm="@RM@"
labase=`$basename $lafile .la`
ladir=`$dirname $lafile`
latimestamp=${ladir}/.${labase}.la.timestamp
laifile=${ladir}/.libs/${labase}.lai
if $test -f $lafile; then
. ${ladir}/${labase}.la
deps=
for i in ${dependency_libs}; do
case $i in
####################################################
# Skip all -R* options... rpath info shouldn't go into
# the dependency_libs line.
####################################################
-R*)
;;
####################################################
# Catch -L<dir> and remove redundant ones.
####################################################
-L*)
case $deps in
*"$i "*) ;;
*"$i") ;;
*) deps="$deps $i" ;;
esac
;;
####################################################
# Convert "dirpath/libfoo.la" into "-Ldirpath/.libs
# libfoo.la" if it's an uninstalled libtool archive.
# This allows proper relinking by libtool during the
# install stage by allowing it to find the uninstalled
# shared library in the .libs directory.
####################################################
*.la)
fixla=0
ltlibsdir=`$dirname $i`/.libs
case $ltlibsdir in
/*)
# fix if an absolute path in ${WRKSRC}
case $ltlibsdir in
${WRKSRC}/*) fixla=1 ;;
esac
;;
*)
# fix all relative paths
fixla=1
;;
esac
if $test $fixla -gt 0; then
case $deps in
*"-L$ltlibsdir "*) ;;
*"-L$ltlibsdir") ;;
*) deps="$deps -L$ltlibsdir" ;;
esac
fi
deps="$deps $i"
;;
####################################################
# Everything else Just Belongs in the dependency_libs
# line.
####################################################
*)
deps="$deps $i"
;;
esac
done
relink=
for i in ${relink_command}; do
case $i in
####################################################
# -I* and -D* are useless for linking.
####################################################
-I*|-D*)
;;
####################################################
# Catch -L<dir> and remove redundant ones.
####################################################
-L*)
case $relink in
*"$i "*) ;;
*"$i") ;;
*) relink="$relink $i" ;;
esac
;;
# This is the .la file we're relinking... don't touch it!
$lafile)
relink="$relink $i"
;;
####################################################
# Convert "dirpath/libfoo.la" into "-Ldirpath/.libs
# libfoo.la" if it's an uninstalled libtool archive.
# This allows proper relinking by libtool during the
# install stage by allowing it to find the uninstalled
# shared library in the .libs directory.
####################################################
*.la)
fixla=0
ltlibsdir=`$dirname $i`/.libs
case $ltlibsdir in
/*)
# fix if an absolute path in ${WRKSRC}
case $ltlibsdir in
${WRKSRC}/*) fixla=1 ;;
esac
;;
*)
# fix all relative paths
fixla=1
;;
esac
if $test $fixla -gt 0; then
case $relink in
*"-L$ltlibsdir "*) ;;
*"-L$ltlibsdir") ;;
*) relink="$relink -L$ltlibsdir" ;;
esac
fi
relink="$relink $i"
;;
####################################################
# Everything else Just Belongs in the relink_command
# line.
####################################################
*)
relink="$relink $i"
;;
esac
done
##############################################################
# Save the orignal .la file produced by libtool as .la.blsav,
# and create the new one with a signature.
##############################################################
$mv -f $lafile ${lafile}.blsav
if $test -n "$deps"; then
(
$cat ${lafile}.blsav | $sed -e '/^dependency_libs=/,$d'
$echo "dependency_libs='$deps'"
$cat ${lafile}.blsav | $sed -e '1,/^dependency_libs=/d'
) > ${lafile}.tmp
else
$cat ${lafile}.blsav > ${lafile}.tmp
fi
if $test -n "$relink"; then
(
$cat ${lafile}.tmp | $sed -e '/^relink_command=/,$d'
$echo "relink_command='$relink'"
$cat ${lafile}.tmp | $sed -e '1,/^relink_command=/d'
) > $lafile
else
$cat ${lafile}.tmp > $lafile
fi
$echo >> $lafile
$echo "# Directory that this library was built in:" >> $lafile
$echo "buildlibdir='"`cd $ladir; $pwd`"'" >> $lafile
$echo >> $lafile
$echo "# This file has been modified by buildlink3." >> $lafile
$rm ${lafile}.tmp
msg_log $wrapperlog "==> Fixed $lafile"
##############################################################
# Fix up any .lai files (libtool archives that will be
# installed).
##############################################################
if $test -z "$laifile" || $test ! -f "$laifile" || \
$egrep "^#.*modified by buildlink3" $laifile >/dev/null 2>&1; then
:
else
$sed @_BLNK_WRAP_LT_UNTRANSFORM_SED@ \
$laifile > ${laifile}.tmp
. ${laifile}.tmp
deps_ok=no
deps="${dependency_libs}"
while $test "$deps_ok" = "no"; do
deps_ok=yes
L=; l=; lexist=; prev=
for i in $deps; do
case $i in
######################################
# Don't allowed repeated arguments, so
# "-lm -lm" becomes just "-lm".
######################################
$prev)
;;
######################################
# Skip all -R* options... rpath info
# shouldn't go into the dependency_libs
# line.
######################################
-R*)
;;
######################################
# Skip directories that should never
# appear in the -L<dir> flags. Also
# modify directories in ${DEPOTBASE} to
# point to somewhere in the default view
# ${LOCALBASE}, since we want "overwrite"
# packages to think the libraries really
# do just exist through the default view.
######################################
-L*)
case $i in
-L${BUILDLINK_DIR}/*)
;;
-L${WRKSRC}|-L${WRKSRC}/*)
;;
-L${DEPOTBASE}/*)
i=`$echo "$i" | $sed -e "s,-L${DEPOTBASE}/[^/]*/,-L${LOCALBASE}/,"`
case $L in
*"$i "*) ;;
*"$i") ;;
*) L="$L $i" ;;
esac
;;
*)
case $L in
*"$i "*) ;;
*"$i") ;;
*) L="$L $i" ;;
esac
;;
esac
;;
######################################
# Libraries really do exist, so we want
# to keep any -L<dir> flags we've seen
# in the generated dependency_libs line.
######################################
-l*)
lexist=1
l="$l $i"
;;
######################################
# Libtool archives should be changed from
# "/path/libfoo.la" to "-L/path -lfoo",
# where /path is appropriately modified
# so that the depot directory is changed
# to the views directory. This allows
# the .la files to be used by either
# "overwrite" or "pkgviews" packages and
# works correctly with wildcard
# dependencies.
######################################
*.la)
dirbase=`$dirname $i`
dir=`$echo "X$dirbase" | $Xsed -e "s,^${DEPOTBASE}/[^/]*/,${LOCALBASE}/,"`
case $L in
*"-L$dir "*) ;;
*"-L$dir") ;;
*) L="$L -L$dir" ;;
esac
libbase=`$basename $i .la`
lib="${libbase#lib}"
lexist=1
l="$l -l$lib"
deps_ok=no
;;
######################################
# Everything else Just Belongs.
######################################
*)
l="$l $i"
;;
esac
prev="$i"
done
if $test -z "$lexist"; then
L=
fi
deps="$L$l"
deps=`$echo "X$deps" | $Xsed -e "s/^[ ]*//"`
done
$mv -f $laifile ${laifile}.blsav
(
$cat ${laifile}.tmp | $sed -e '/^dependency_libs=/,$d'
$echo "dependency_libs='$deps'"
$cat ${laifile}.tmp | $sed -e '1,/^dependency_libs=/d'
$echo
$echo "# This file has been modified by buildlink3."
) > ${laifile}
$rm -f ${laifile}.tmp
msg_log $wrapperlog "==> Fixed $laifile"
if $egrep "${BUILDLINK_DIR}" $laifile >/dev/null 2>&1; then
msg_log $wrapperlog "==> [buildlink3] Error: buildlink3 leakage into $laifile"
$echo "==> [buildlink3] Error: buildlink3 leakage into $laifile" 1>&2
wrapper_result=1
fi
fi
fi