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.
This commit is contained in:
Kaarle Ritvanen 2015-11-04 19:43:17 +02:00 committed by Natanael Copa
parent d9eba16d35
commit f37a174836

View File

@ -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