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