6c25dec844
This is based on the decision The NetBSD Foundation made in 2008 to do so, which was already applied to src. This change has been applied to code which is likely not in other repositories. ok board@, reviewed by riastradh@
325 lines
9.5 KiB
Text
325 lines
9.5 KiB
Text
# $NetBSD: libtool-fix-la,v 1.10 2018/08/22 20:48:36 maya 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.
|
|
#
|
|
# 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".
|
|
|
|
BUILDLINK_DIR="@BUILDLINK_DIR@"
|
|
LOCALBASE="@LOCALBASE@"
|
|
WRKSRC="@WRKSRC@"
|
|
|
|
basename="@BASENAME@"
|
|
dirname="@DIRNAME@"
|
|
egrep="@EGREP@"
|
|
mv="@MV@"
|
|
pwd="@PWD@"
|
|
rm="@RM@"
|
|
|
|
wrksrc_physical=`cd ${WRKSRC}; $pwd`
|
|
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_command=""}
|
|
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 | $sed -e "s,^${wrksrc_physical},${WRKSRC},"`"'" >> $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.
|
|
######################################
|
|
-L*)
|
|
case $i in
|
|
-L${BUILDLINK_DIR}/*)
|
|
;;
|
|
-L${WRKSRC}|-L${WRKSRC}/*)
|
|
;;
|
|
*)
|
|
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",
|
|
# This works correctly with wildcard
|
|
# dependencies.
|
|
######################################
|
|
*.la)
|
|
dir=`$dirname $i`
|
|
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
|