From 841b57441b803acb6edd290521d4343593e7e175 Mon Sep 17 00:00:00 2001 From: jlam Date: Tue, 2 Sep 2003 06:59:37 +0000 Subject: 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 --- mk/buildlink3/libtool-fix-la | 275 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 mk/buildlink3/libtool-fix-la (limited to 'mk/buildlink3/libtool-fix-la') 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 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 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 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 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 -- cgit v1.2.3