# $NetBSD: libtool-fix-la,v 1.7 2005/12/09 16:16:41 hira 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@"
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=
	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.  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