summaryrefslogtreecommitdiff
path: root/mk/buildlink3/libtool-fix-la
diff options
context:
space:
mode:
authorjlam <jlam@pkgsrc.org>2003-09-02 06:59:37 +0000
committerjlam <jlam@pkgsrc.org>2003-09-02 06:59:37 +0000
commit841b57441b803acb6edd290521d4343593e7e175 (patch)
tree84e91cd88c93c01f847527b25d244510cb5b95db /mk/buildlink3/libtool-fix-la
parent97e17132ab11f03e7cfe511b3e6188812a6c47e4 (diff)
downloadpkgsrc-841b57441b803acb6edd290521d4343593e7e175.tar.gz
Merge pkgviews-mk branch into the HEAD by running:
cd pkgsrc/mk cvs update -Pd -A cvs update -Pd -j pkgviews-mk-base -j pkgviews-mk
Diffstat (limited to 'mk/buildlink3/libtool-fix-la')
-rw-r--r--mk/buildlink3/libtool-fix-la275
1 files changed, 275 insertions, 0 deletions
diff --git a/mk/buildlink3/libtool-fix-la b/mk/buildlink3/libtool-fix-la
new file mode 100644
index 00000000000..c6ab415fb71
--- /dev/null
+++ b/mk/buildlink3/libtool-fix-la
@@ -0,0 +1,275 @@
+# $NetBSD: libtool-fix-la,v 1.2 2003/09/02 06:59:57 jlam Exp $
+#
+# 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.
+
+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
+ -R*)
+ # Skip all -R* options... rpath info shouldn't go into the
+ # dependency_libs line.
+ ;;
+ # 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
+ if $test -z "$deps" && $test -z "$relink" || \
+ @EGREP@ "^#.*modified by buildlink3" $lafile >/dev/null 2>&1; then
+ :
+ else
+ # 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 "# This file has been modified by buildlink3." >> $lafile
+ @RM@ ${lafile}.tmp
+ $echo "==> Fixed $lafile" >> $wrapperlog
+ fi
+ #
+ # 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
+ L=; l=; lexist=; prev=
+ for i in ${dependency_libs}; 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 "X$i" | $Xsed -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=`$echo "X$libbase" | $Xsed -e "s/^lib//"`
+ lexist=1
+ l="$l -l$lib"
+ ;;
+ # 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/^[ ]*//"`
+ @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
+ $echo "==> Fixed $laifile" >> $wrapperlog
+ if $test "$libdir" != "${BUILDLINK_DIR}/.tmp/inst" && \
+ @EGREP@ "${BUILDLINK_DIR}" $laifile >/dev/null 2>&1; then
+ $echo "==> [buildlink3] Error: buildlink3 leakage into $laifile" >> $wrapperlog
+ $echo "==> [buildlink3] Error: buildlink3 leakage into $laifile" 1>&2
+ wrapper_result=1
+ fi
+ fi
+fi