6bfa4a28aa
In an environment created by `hsh --initroot-only`: $ for i in /usr/lib/rpm/*; do rpm -qf --qf='%{name}: '"$i"'\n' "$i"; done | grep '^rpm:' rpm: /usr/lib/rpm/0ldconfig.filetrigger rpm: /usr/lib/rpm/GROUPS rpm: /usr/lib/rpm/find-package rpm: /usr/lib/rpm/functions rpm: /usr/lib/rpm/macros.d rpm: /usr/lib/rpm/pdeath_execute rpm: /usr/lib/rpm/platform rpm: /usr/lib/rpm/posttrans-filetriggers rpm: /usr/lib/rpm/postupdate rpm: /usr/lib/rpm/rpmd rpm: /usr/lib/rpm/rpmdb_loadcvt rpm: /usr/lib/rpm/rpme rpm: /usr/lib/rpm/rpmi rpm: /usr/lib/rpm/rpmk rpm: /usr/lib/rpm/rpmpopt-4.13.0.1 rpm: /usr/lib/rpm/rpmq rpm: /usr/lib/rpm/rpmu rpm: /usr/lib/rpm/rpmv The `scripts/functions` file is provided from the rpm project in real installations. Let's ensure scripts in this package use the functions file from this package.
111 lines
3.9 KiB
Bash
Executable File
111 lines
3.9 KiB
Bash
Executable File
#!/bin/sh -efu
|
|
#
|
|
# brp-debuginfo - generate /usr/lib/debug and /usr/src/debug contents
|
|
# for debuginfo packages
|
|
#
|
|
# Written by Alexey Tourbin <at@altlinux.org>. Based on find-debuginfo.sh
|
|
# by Jeff Johnson <jbj@rpm5.org> and Roland McGrath <roland@redhat.com>.
|
|
# Copyright (c) 2020 Vitaly Chikunov <vt@altlinux.org>.
|
|
# License: GPLv2+.
|
|
|
|
. @RPMCONFIGDIR@/rpmb-functions
|
|
ValidateBuildRoot
|
|
|
|
cd "$RPM_BUILD_ROOT"
|
|
|
|
rm -rf .tmp
|
|
mkdir .tmp
|
|
|
|
# Strip binaries, create .debug files under /usr/lib/debug and install sources into /usr/src/debug.
|
|
|
|
: ${RPM_DEBUGINFO_SKIPLIST:=}
|
|
: ${RPM_DEBUGINFO_STRIPPED_TERMINATE:=}
|
|
|
|
prune_paths="/lib/firmware /usr/lib/debug /usr/share /usr/src $RPM_DEBUGINFO_SKIPLIST"
|
|
prune_tests="$(printf %s "$prune_paths" |
|
|
tr '[:space:]' '\n' |
|
|
sort -u |
|
|
sed -n '/^\// s/.*/ -o -path .&/p')"
|
|
find . '(' -path './.*' $prune_tests ')' -prune -o -type f -print |sort |
|
|
file4 -NF$'\t' -f - >.tmp/file_full
|
|
|
|
sed -n -e 's/\t.* ELF .* \(executable\|shared object\), .*, stripped.*//p' <.tmp/file_full >.tmp/fstripped
|
|
if [ -s .tmp/fstripped ]; then
|
|
howmuch=$(wc -l <.tmp/fstripped)
|
|
Warning "You have $howmuch stripped ELF objects. Please compile with debugging information!"
|
|
Warning "An excerpt from the list of affected files follows:"
|
|
sed 's/^/ /; 10q' <.tmp/fstripped >&2
|
|
[ -z "$RPM_DEBUGINFO_STRIPPED_TERMINATE" ] \
|
|
|| Fatal "Stripped files found, terminating build"
|
|
fi
|
|
|
|
sed -n -e '/ ELF .* shared object, no machine, /d' \
|
|
-e 's/\t.* ELF .* \(executable\|shared object\), .*, not stripped.*//p' \
|
|
-e 's/^\(\.\/lib\/modules\/[^[:space:]]\+\.ko\)\t.* ELF .* relocatable, .*, not stripped.*/\1/p' \
|
|
-e 's/^\(\.\/lib\/modules\/[^[:space:]]\+\.ko\.[gx]z\)\t.* \(gzip\|xz\) compressed data.*/\1/p' \
|
|
-e 's/^\(\.\/lib\/modules\/[^[:space:]]\+\.ko\.zst\)\t.* Zstandard compressed data.*/\1/p' \
|
|
-e 's/^\(\.\/boot\/vmlinuz-[^[:space:]]\+\)\t.*/\1/p' <.tmp/file_full |
|
|
xargs -r --delimiter='\n' stat -c '%h %i %n' >.tmp/flist
|
|
|
|
# Filter out what will be hard-linked later and process the rest.
|
|
while read -r nlink ino f; do
|
|
if [ "$nlink" -gt 1 ]; then
|
|
eval f0="\${f0_$ino-}"
|
|
if [ -n "$f0" ]; then
|
|
printf '%u %s\n' "$ino" "$f" >&3
|
|
continue
|
|
else
|
|
eval f0_$ino="\$f"
|
|
fi
|
|
fi
|
|
printf '%s\n' "$f"
|
|
done <.tmp/flist \
|
|
>.tmp/xargs-list \
|
|
3>.tmp/link-list
|
|
|
|
xargs -r -P$(nproc) -n1 @RPMCONFIGDIR@/process-debuginfo <.tmp/xargs-list
|
|
|
|
# Hard-link debuginfo for hard-linked binaries
|
|
while read -r ino f; do
|
|
debugf=./usr/lib/debug${f#.}.debug
|
|
eval f0="\${f0_$ino-}"
|
|
debugf0=./usr/lib/debug${f0#.}.debug
|
|
if [ -f "$debugf0" ]; then
|
|
mkdir -p "${debugf%/*}"
|
|
ln -nf "$debugf0" "$debugf"
|
|
fi
|
|
mkdir -p .debuginfo/src/"${f%/*}"
|
|
ln -nf .debuginfo/src/"$f0" .debuginfo/src/"$f"
|
|
done <.tmp/link-list
|
|
|
|
# Make symbolic links that mimic the original tree.
|
|
find . '(' -path './.*' $prune_tests ')' -prune -o -type l -print |sort >.tmp/flist
|
|
while read -r l; do
|
|
f=$(readlink -vm "$l")
|
|
f=${f#$RPM_BUILD_ROOT}
|
|
debugf=./usr/lib/debug$f.debug
|
|
[ -f "$debugf" ] || continue
|
|
debugl=./usr/lib/debug${l#.}.debug
|
|
mkdir -p "${debugl%/*}"
|
|
ln -snf "$(relative "${debugf#.}" "${debugl#.}")" "$debugl"
|
|
mkdir -p .debuginfo/links/"${debugf%/*}"
|
|
printf '%s\n' "${debugl#.}" >>.debuginfo/links/"$debugf"
|
|
done <.tmp/flist
|
|
|
|
if [ -s .tmp/no_debug_info ]; then
|
|
howmuch=$(wc -l < .tmp/no_debug_info)
|
|
Warning "$howmuch non-stripped binaries don't contain .debug sections making -debuginfo"
|
|
Warning "package less relevant. An excerpt from the list of affected files follows:"
|
|
sed 's/^/ /; 10q' < .tmp/no_debug_info >&2
|
|
if grep -E -q '/lib/modules/.*(/vmlinux|\.ko)$' .tmp/no_debug_info; then
|
|
Warning "Please enable CONFIG_DEBUG_INFO=y in the kernel package!"
|
|
fi
|
|
[ -z "$RPM_DEBUGINFO_STRIPPED_TERMINATE" ] \
|
|
|| Fatal "Files with stripped .debug_info found, terminating build"
|
|
fi
|
|
|
|
if [ -n "$(find usr/lib/debug -type f -print -quit 2>/dev/null)" ] &&
|
|
[ -z "$(find usr/src/debug -type f -print -quit 2>/dev/null)" ]; then
|
|
Warning 'debuginfo without debug sources.'
|
|
fi
|