From f37a1748366d08d9062f847a27f218e184ef737f Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Wed, 4 Nov 2015 19:43:17 +0200 Subject: abuild: exclude non-dangling symlinks from dependency resolution This commit also fixes incorrect behavior in case where an absolute symlink points to a file installed on the build host but which is missing from the package. --- abuild.in | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'abuild.in') diff --git a/abuild.in b/abuild.in index 38d6efd..a81ac49 100644 --- a/abuild.in +++ b/abuild.in @@ -886,13 +886,14 @@ prepare_trace_rpaths() { # search for broken symlinks so we later can pull in proper depends prepare_symlinks() { + local target local dir="${subpkgdir:-$pkgdir}" options_has "!tracedeps" && return 0 cd "$dir" || return 1 find -type l | while read symlink; do - if ! [ -e "$symlink" ]; then - echo "$symlink $(readlink $symlink)" \ - >> "$controldir"/.symlinks + target=$(readlink "$symlink") + if ! [ -e "$dir$(normalize_target_path "$target" "$symlink")" ]; then + echo "$symlink $target" >> "$controldir"/.symlinks fi done } @@ -1190,11 +1191,16 @@ scan_shared_objects() { done > "$controldir"/.needs-so } -# normalize a path string -normalize_path() { +# normalize a symlink target path (1st arg) +# Converts a relative path to absolute with respect to the symlink +# path (2nd arg). +normalize_target_path() { + local path=$1 + [ "${path:0:1}" = / ] || path=$(dirname "$2")/$path + local oifs="$IFS" pathstr= i= IFS='/' - set -- $1 + set -- $path for i; do case "$i" in "."|"") continue;; @@ -1217,10 +1223,7 @@ scan_symlink_targets() { fi while read symlink target; do - if [ "${target#/}" = "$target" ]; then - target="${symlink%/*}/$target" - fi - targetpath="$datadir"/$(normalize_path "$target") + targetpath=$datadir$(normalize_target_path "$target" "$symlink") if [ -e "$targetpath" ] || [ -L "$targetpath" ]; then echo "$name=$pkgver-r$pkgrel" \ >> "$d"/.symlinks-needs -- cgit v1.2.3-60-g2f50