rpm-build/scripts/find-debuginfo-files.in
Vitaly Chikunov b9ea232966 debuginfo: Fix adding non-existent files into debuginfo package
Do not add (uncompressed) module (or vmlinux) into debuginfo package if
it does not actually exists.

Due to other bugs there could be compressed kernel module, (which
implies adding uncompressed module into debuginfo), but, uncompressed
version (which brp-debuginfo should create) does not exist, making
build errors such as:

  error: No such file or directory: /usr/src/tmp/kernel-image-std-def-buildroot/usr/lib/debug/lib/modules/5.8.0-std-def-alt1/kernel/fs/nfs/flexfilelayout/nfs_layout_flexfiles.ko

Reported-by: Anton V. Boyarshinov <boyarsh@altlinux.org>
Fixes: 7aa048df ("Generate debuginfo for kernel packages")
2020-08-28 03:09:00 +03:00

117 lines
2.6 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}
[ -n "$f" ] || continue
if [ -z "${f##/boot/vmlinuz-*}" ]; then
# Redirect to vmlinux saved by debuginfo.brp into debug tree's
# %modules_dir.
kver=${f#/boot/vmlinuz-}
f=/usr/lib/debug/lib/modules/$kver/vmlinux
if [ -e ".$f" ]; then
printf '%s\n' "$f" >> .tmp/files
else
Warning "Expected $f not found."
fi
fi
fbin=$f # Actual binary for linking
if [ -z "${f#/lib/modules/*.ko.[gx]z}" ]; then
# For gzipped modules actual binary is kept in debug tree
# (placed by debuginfo.brp) and goes into -debuginfo package.
f=${f%.[gx]z}
fbin=/usr/lib/debug$f
if [ -e ".$fbin" ]; then
printf '%s\n' "$fbin" >> .tmp/files
else
Warning "Expected $fbin not found."
fi
fi
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 -n -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 "$fbin" "${link#.}")" "$link"
ln -snf "$(relative "${debugf#.}" "${link#.}".debug)" "$link".debug
fi
to=$(readlink -vm "$link")
if [ "$to" = "$RPM_BUILD_ROOT$fbin" ]; 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