# $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
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 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 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 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