123 lines
2.7 KiB
Bash
123 lines
2.7 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Generate Supplements: lines for the kernel-firmware package, by looking at
|
|
# the firmware: and alias: fields of kernel modules.
|
|
|
|
USAGE="find <firmware directory> | $0 --find-supplements [kernel directory | kernel.rpm]
|
|
$0 --kill-duplicates <firmware directory> [kernel directory | kernel.rpm]"
|
|
usage()
|
|
{
|
|
echo "Usage: $USAGE" >&2
|
|
exit 1
|
|
}
|
|
|
|
get_kernel_dir()
|
|
{
|
|
# default to the running or last installed kernel
|
|
if test -z "$kernel"; then
|
|
if test -d "/lib/modules/$(uname -r)/kernel"; then
|
|
kernel="$_"
|
|
return
|
|
fi
|
|
local pkg=$(rpm -q --qf '%{buildtime} %{n}-%{v}-%{r}\n' \
|
|
kernel-default kernel-desktop kernel-pae | sort -rn |
|
|
head -n1 | cut -d' ' -f 2)
|
|
if test -n "$pkg"; then
|
|
kernel=$(rpm -ql "$pkg" | \
|
|
grep -m1 '^/lib/modules/[2-9][^/]*/kernel$')
|
|
fi
|
|
if test -d "$kernel"; then
|
|
return
|
|
fi
|
|
echo "No kernel found" >&2
|
|
usage
|
|
fi
|
|
# /lib/modules/$version ?
|
|
if test -d "$kernel/kernel"; then
|
|
kernel="$_"
|
|
return
|
|
fi
|
|
# just $version ?
|
|
if test -d "/lib/modules/$kernel/kernel"; then
|
|
kernel="$_"
|
|
return
|
|
fi
|
|
# a kernel rpm?
|
|
case "$kernel" in
|
|
*.rpm)
|
|
mkdir "$tmp/kernel"
|
|
rpm2cpio "$kernel" | (cd "$tmp/kernel"; cpio -id --quiet)
|
|
kernel=($tmp/kernel/lib/modules/*/kernel)
|
|
kernel=${kernel[0]}
|
|
return
|
|
esac
|
|
usage
|
|
}
|
|
|
|
cache=
|
|
if test "$1" = "--cache" ; then
|
|
cache=$2
|
|
shift
|
|
shift
|
|
fi
|
|
|
|
if test "$1" = "--find-supplements" -a -n "$cache" ; then
|
|
if ! test -e "$cache"; then
|
|
get_kernel_dir
|
|
echo "Using $kernel" >&2
|
|
find "$kernel" -name '*.ko' -type f | while read ko; do
|
|
/sbin/modinfo -F firmware "$ko" | sed -e "s@\$@ $ko@"
|
|
done > $cache
|
|
fi
|
|
hits=$(while read fw ; do
|
|
sed -n -e "s@^${fw#$RPM_BUILD_ROOT/lib/firmware/} @@p" < "$cache"
|
|
done | sort)
|
|
if test -n "$hits"; then
|
|
echo "$hits" | RPMBUILD_SPECFILE=/dev/null /usr/lib/rpm/find-supplements.ksyms | \
|
|
sed 's/^modalias(kernel-[^:]*:/modalias(/' # strip the kernel-$flavor: prefix
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
trap 'rm -rf "$tmp"' EXIT
|
|
tmp=$(mktemp -d)
|
|
|
|
case "$1" in
|
|
--find-supplements)
|
|
kernel=$2
|
|
cat >"$tmp/filelist"
|
|
if test ! -s "$tmp/filelist"; then
|
|
usage
|
|
fi
|
|
get_kernel_dir
|
|
echo "Using $kernel" >&2
|
|
find "$kernel" -name '*.ko' -type f | while read ko; do
|
|
if grep -qFf <(/sbin/modinfo -F firmware "$ko") \
|
|
"$tmp/filelist"; then
|
|
echo "$ko"
|
|
fi
|
|
done | sort | \
|
|
RPMBUILD_SPECFILE=/dev/null /usr/lib/rpm/find-supplements.ksyms dummy-package-please-ignore | \
|
|
sed 's/^modalias(kernel-[^:]*:/modalias(/' # strip the kernel-$flavor: prefix
|
|
;;
|
|
--kill-duplicates)
|
|
firmware=$2
|
|
kernel=$3
|
|
get_kernel_dir
|
|
kernel=${kernel/\/lib\/modules\//\/lib\/firmware\/}
|
|
kernel=${kernel%/kernel}
|
|
echo "Using $kernel" >&2
|
|
find "$firmware" -type f -printf '%P\n' | while read f; do
|
|
if cmp -s "$kernel/$f" "$firmware/$f"; then
|
|
rm -v "$_"
|
|
fi
|
|
done
|
|
;;
|
|
*)
|
|
usage
|
|
esac
|
|
|
|
|
|
|
|
|