rpm-build/scripts/find-debuginfo-files.in
Dmitry V. Levin 9e73931c30 find-debuginfo-files: fix packaging of symlinks
Package only those /usr/lib/debug/* symlinks that complement the package
being processed and point to debuginfo regular files which are going to
be packaged along with these symlinks.

The most obvious consequence of this change is that library symlinks for
use of ld(1) will not result to their
/usr/lib/debug/usr/lib*/libNAME.so.debug counterparts to be packaged.
2011-12-06 15:04:05 +00:00

89 lines
1.9 KiB
Bash
Executable File

#!/bin/sh -efu
#
# find-debuginfo-files - make %files list for debuginfo package
#
# Written by Alexey Tourbin <at@altlinux.org>.
# License: GPLv2+.
. @RPMCONFIGDIR@/functions
ValidateBuildRoot
cd "$RPM_BUILD_ROOT"
rm -rf .tmp
mkdir .tmp
>.tmp/files
>.tmp/files-can
>.tmp/links
>.tmp/links-in
>.tmp/src
while read -r f; do
f=${f#$RPM_BUILD_ROOT}
if [ -f .debuginfo/src/"$f" ]; then
LC_ALL=C sort -m -u -o .tmp/src .tmp/src .debuginfo/src/"$f"
fi
debugf=./usr/lib/debug$f.debug
[ -f "$debugf" ] || continue
if [ -L "$debugf" ]; then
# Save symlink for later filtering.
printf '%s\n' "$debugf" >> .tmp/links-in
continue
fi
printf '%s\n' "${debugf#.}" >> .tmp/files
# Save canonical file name for later symlinks filtering.
readlink -ve "$debugf" >> .tmp/files-can
id=$(@RPMCONFIGDIR@/debugedit -i "$debugf")
[ -n "$id" ] || continue
link=./usr/lib/debug/.build-id/${id:0:2}/${id:2}
if [ ! -L "$link" ]; then
mkdir -p "${link%/*}"
ln -snf "$(relative "$f" "${link#.}")" "$link"
ln -snf "$(relative "${debugf#.}" "${link#.}".debug)" "$link".debug
fi
to=$(readlink -vm "$link")
if [ "$to" = "$RPM_BUILD_ROOT$f" ]; then
printf '%s\n' "${link#.}" >> .tmp/links
printf '%s\n' "${link#.}".debug >> .tmp/links
fi
done
# Filter out symlinks pointing out of the package.
sort -u .tmp/links-in |
while read -r link; do
to=$(readlink -vm "$link")
if grep -Fqsxe "$to" .tmp/files-can; then
printf '%s\n' "${link#.}" >> .tmp/links
fi
done
sed 's|\(.*\)/.*|\1|' .tmp/files .tmp/links .tmp/src |sort -u |
while read -r dir; do
while [ -n "$dir" ]; do
case $dir in
/usr/lib/debug/usr/*/*)
printf '%s\n' "$dir" ;;
/usr/lib/debug/usr/*)
break ;;
/usr/lib/debug/*/*)
printf '%s\n' "$dir" ;;
/usr/lib/debug/*)
break ;;
/usr/src/debug/*)
printf '%s\n' "$dir" ;;
*)
break ;;
esac
dir=${dir%/*}
done
done |
sort -u |
sed 's/^/%dir /'
sort .tmp/files .tmp/links .tmp/src