rpm-build/autodeps/linux.req.in
Alexey Tourbin 6f60362519 find-requires: absolute smbolic links should not be passed to file(1)
Again, this is to improve 'buildreq -bi' support.  See, file(1) is
so full of shit that, to determine whether a link is broken, it has
to read the link and stat its destination (instead of bare stat
on the link).  This hardly makes any sense, but enables buildreq
to calculate self-dependency when the package is installed.
2011-02-09 07:09:01 +03:00

141 lines
4.0 KiB
Bash
Executable File

#!/bin/sh -efu
#
# Copyright (C) 2000-2006 Dmitry V. Levin <ldv@altlinux.org>
# Copyright (C) 2007 Alexey Tourbin <at@altlinux.org>
#
# find-requires - generate list of linux-specific package requires.
# Inspired by tool with same name from RPM distribution.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
. @RPMCONFIGDIR@/functions
ValidateBuildRoot
workdir=
exit_handler()
{
local rc=$?
trap - EXIT
[ -z "$workdir" ] || rm -rf "$workdir"
cat >/dev/null
exit $rc
}
trap exit_handler EXIT HUP INT QUIT PIPE TERM
methods=$(SetupMethods req "$RPM_FINDREQ_METHOD")
if [ -z "$methods" ]; then
Info "AutoReq disabled, nothing to do"
exit 0
fi
workdir=$(mktemp -dt "$PROG".XXXXXXXX)
# filter file list through TOPDIR and SKIPLIST patterns
while IFS= read -r f; do
fname="${f#$RPM_BUILD_ROOT}"
printf '%s\n' "$fname" >&3
if [ -n "${RPM_FINDREQ_TOPDIR-}" ] && [ -z "${fname%%$RPM_FINDREQ_TOPDIR/*}" ]; then
Debug "skip $f due to RPM_FINDREQ_TOPDIR=$RPM_FINDREQ_TOPDIR"
continue
fi
if [ -n "${RPM_FINDREQ_SKIPLIST-}" ]; then
for skip in $RPM_FINDREQ_SKIPLIST; do
if [ -z "${fname##$skip}" ]; then
Debug "skip $f due to RPM_FINDREQ_SKIPLIST pattern $skip"
continue 2
fi
done
fi
# absolute symbolic links should not be passed down to file(1)
if [ -L "$f" ]; then
to="$(readlink "$f")"
if [ -n "$to" -a -z "${to##/*}" ]; then
if [ -e "$f" ]; then
printf '%s\t symbolic link to `%s'\''\n' "$f" "$to"
else
printf '%s\t broken symbolic link to `%s'\''\n' "$f" "$to"
fi
continue
fi >&4
fi
printf '%s\n' "$f"
done >"$workdir"/files 3>"$RPM_BUILD_ROOT/.files:$RPM_SUBPACKAGE_NAME" 4>"$workdir"/files+types
if ! [ -s "$workdir"/files ]; then
Info "empty file list, nothing to do"
exit 0
fi
# filter file list through file(1) to append types
if ! file -NF$'\t' -f "$workdir"/files >>"$workdir"/files+types; then
sed -n '/\t *ERROR:/p' "$workdir"/files+types >&2
exit 1
fi
found=
RunMethod()
{
local exe="$1"; shift
local filter="$exe".files
if ! [ -x "$filter" ]; then
# XXX should be Fatal
Info "$filter not available"
return
fi
local filelist="$workdir/${exe##*/}".files
local deplist="$workdir/${exe##*/}".deps
Debug "running $filter"
"$filter" <"$workdir"/files+types >"$filelist" ||
Fatal "$filter failed"
Verbose "$filter: $(wc -l <"$filelist") files"
[ -s "$filelist" ] || return 0
# XXX validate $filelist
Debug "running $exe"
"$exe" <"$filelist" >"$deplist" ||
Fatal "$exe failed"
if [ -s "$deplist" ]; then
LC_COLLATE=C sort -u -o "$deplist" "$deplist"
Verbose "$exe: $(wc -l <"$deplist") dependencies"
found=1
else
rm -f "$deplist"
fi
}
export RPM_FINDPACKAGE_COMMANDS_LOG="$RPM_BUILD_ROOT"/.findpackage-commands
>"$RPM_FINDPACKAGE_COMMANDS_LOG"
Info "running scripts ($methods)"
RunMethods req "$methods" RunMethod
if [ -n "$found" ]; then
(set +f && LC_ALL=C sort -u -m "$workdir"/*.deps) >"$workdir"/find-requires-deps || false
if [ -n "${RPM_FIND_REQUIRES_FILTER-}" ]; then
(eval "set -x; $RPM_FIND_REQUIRES_FILTER") <"$workdir"/find-requires-deps >"$workdir"/filter-requires-deps
[ $? = 0 ] || Fatal "filter failed"
(cd "$workdir" && diff -U1 find-requires-deps filter-requires-deps) >&2 ||:
cat "$workdir"/filter-requires-deps
else
cat "$workdir"/find-requires-deps
fi
fi
if [ -s "$RPM_FINDPACKAGE_COMMANDS_LOG" ]; then
LC_ALL=C sort -u -o "$RPM_FINDPACKAGE_COMMANDS_LOG"{,}
Info "FINDPACKAGE-COMMANDS:" $(cat <"$RPM_FINDPACKAGE_COMMANDS_LOG")
fi