void-packages/common/hooks/pre-pkg/04-generate-runtime-deps.sh
classabbyamp 5e9fb8708c common/hooks/pre-pkg/04-generate-runtime-deps: partially revert sorting
only sort shlib-deps, as those are automatically found.
regular dependencies should not be sorted as that can mess with the
order for things like virtual packages or alternatives groups, notably
for gawk (needs to be before anything that depends on the awk virtual
package) and dash (needs to be before bash to select the correct sh
alternatives group).

partial revert of 5ec2556004
2024-03-12 16:03:59 -04:00

149 lines
5 KiB
Bash

# vim: set ts=4 sw=4 et:
#
# This hook executes the following tasks:
# - Generates rdeps file with run-time dependencies for xbps-create(1)
# - Generates shlib-requires file for xbps-create(1)
add_rundep() {
local dep="$1" i= rpkgdep= _depname= found=
_depname="$($XBPS_UHELPER_CMD getpkgdepname ${dep} 2>/dev/null)"
if [ -z "${_depname}" ]; then
_depname="$($XBPS_UHELPER_CMD getpkgname ${dep} 2>/dev/null)"
fi
for i in ${run_depends}; do
rpkgdep="$($XBPS_UHELPER_CMD getpkgdepname $i 2>/dev/null)"
if [ -z "$rpkgdep" ]; then
rpkgdep="$($XBPS_UHELPER_CMD getpkgname $i 2>/dev/null)"
fi
if [ "${rpkgdep}" != "${_depname}" ]; then
continue
fi
$XBPS_UHELPER_CMD cmpver "$i" "$dep"
rval=$?
if [ $rval -eq 255 ]; then
run_depends="${run_depends/${i}/${dep}}"
fi
found=1
done
if [ -z "$found" ]; then
run_depends+=" ${dep}"
fi
}
store_pkgdestdir_rundeps() {
if [ -n "$run_depends" ]; then
for f in ${run_depends}; do
_curdep="$(echo "$f" | sed -e 's,\(.*\)?.*,\1,')"
if [ -z "$($XBPS_UHELPER_CMD getpkgdepname ${_curdep} 2>/dev/null)" -a \
-z "$($XBPS_UHELPER_CMD getpkgname ${_curdep} 2>/dev/null)" ]; then
_curdep="${_curdep}>=0"
fi
printf "%s " "${_curdep}"
done > "${PKGDESTDIR}/rdeps"
fi
}
hook() {
local depsftmp f lf j mapshlibs sorequires _curdep elfmagic broken_shlibs verify_deps
local _shlib_dir="${XBPS_STATEDIR}/shlib-provides"
# Disable trap on ERR, xbps-uhelper cmd might return error... but not something
# to be worried about because if there are broken shlibs this hook returns
# error via msg_error().
trap - ERR
mapshlibs=$XBPS_COMMONDIR/shlibs
if [ -n "$noverifyrdeps" ]; then
store_pkgdestdir_rundeps
return 0
fi
depsftmp=$(mktemp) || exit 1
find ${PKGDESTDIR} -type f -perm -u+w > $depsftmp 2>/dev/null
for f in ${shlib_requires}; do
verify_deps+=" ${f}"
done
exec 3<&0 # save stdin
exec < $depsftmp
while read -r f; do
lf=${f#${PKGDESTDIR}}
if [ "${skiprdeps/${lf}/}" != "${skiprdeps}" ]; then
msg_normal "Skipping dependency scan for ${lf}\n"
continue
fi
read -n4 elfmagic < "$f"
if [ "$elfmagic" = $'\177ELF' ]; then
for nlib in $($OBJDUMP -p "$f"|awk '/NEEDED/{print $2}'); do
[ -z "$verify_deps" ] && verify_deps="$nlib" && continue
found=0
for j in ${verify_deps}; do
[[ $j == $nlib ]] && found=1 && break
done
[[ $found -eq 0 ]] && verify_deps="$verify_deps $nlib"
done
fi
done
exec 0<&3 # restore stdin
rm -f $depsftmp
#
# Add required run time packages by using required shlibs resolved
# above, the mapping is done thru the common/shlibs file.
#
for f in ${verify_deps}; do
unset _rdep _pkgname _rdepver
if [ "$(find ${PKGDESTDIR} -name "$f")" ]; then
# Ignore libs by current pkg
echo " SONAME: $f <-> $pkgname (ignored)"
continue
# If this library is provided by a subpkg of sourcepkg, use that subpkg
elif _pkgname="$(cd "$_shlib_dir" && grep -F -l -x "$f" *.soname 2>/dev/null)"; then
# If that library has SONAME, add it to shlibs-requires, too.
_pkgname=${_pkgname%.soname}
_sdep="${_pkgname}-${version}_${revision}"
sorequires+="${f} "
elif _pkgname="$(cd "$_shlib_dir" && grep -F -l -x "$f" *.nosoname 2>/dev/null)"; then
_pkgname=${_pkgname%.nosoname}
_sdep="${_pkgname}-${version}_${revision}"
else
_rdep="$(awk -v sl="$f" '$1 == sl { print $2; exit; }' "$mapshlibs")"
if [ -z "$_rdep" ]; then
msg_red_nochroot " SONAME: $f <-> UNKNOWN PKG PLEASE FIX!\n"
broken_shlibs=1
continue
fi
_pkgname=$($XBPS_UHELPER_CMD getpkgname "${_rdep}" 2>/dev/null)
_rdepver=$($XBPS_UHELPER_CMD getpkgversion "${_rdep}" 2>/dev/null)
if [ -z "${_pkgname}" -o -z "${_rdepver}" ]; then
msg_red_nochroot " SONAME: $f <-> UNKNOWN PKG PLEASE FIX!\n"
broken_shlibs=1
continue
fi
_sdep="${_pkgname}>=${_rdepver}"
# By this point, SONAME can't be found in current pkg
sorequires+="${f} "
fi
echo " SONAME: $f <-> ${_sdep}"
add_rundep "${_sdep}"
done
#
# If pkg uses any unknown SONAME error out.
#
if [ -n "$broken_shlibs" -a -z "$allow_unknown_shlibs" ]; then
msg_error "$pkgver: cannot guess required shlibs, aborting!\n"
fi
store_pkgdestdir_rundeps
if [ -n "${sorequires}" ]; then
echo "${sorequires}" | xargs -n1 | sort | xargs > ${PKGDESTDIR}/shlib-requires
fi
}