112 lines
2.6 KiB
Bash
112 lines
2.6 KiB
Bash
#! /bin/bash
|
|
|
|
unset LANG ${!LC_*}
|
|
|
|
# Usage: make-symsets symsets.tar.gz [old-symsets.tar.gz]
|
|
# < symvers.gz
|
|
#
|
|
# symsets.tar.gz
|
|
# Create this symbol set tarball.
|
|
#
|
|
# old-symsets.tar.gz
|
|
# Reuse all possible symbol sets from this tarball.
|
|
|
|
tarball=$1
|
|
old_tarball=$2
|
|
|
|
# Classify all the symbols by the directory they live in
|
|
unset ${!class_*}
|
|
while read class ignore line; do
|
|
class=class_${class//[^a-zA-Z0-9_]/_}
|
|
eval "$class[\${#$class[@]}]=\"$line\""
|
|
if [ $ignore -gt 0 ]; then
|
|
eval "ignore_$class=1"
|
|
fi
|
|
done < <(
|
|
awk '
|
|
BEGIN { FS="\t" ; OFS="\t" }
|
|
{ class=$3
|
|
sub(/\/[^/]+$/, "", class)
|
|
ignore=sub(/.*=>/, "", $1)
|
|
print class, ignore, $0
|
|
}
|
|
'
|
|
)
|
|
|
|
tmpdir=$(mktemp -t -d ${0##*/}.XXXXXX)
|
|
trap "rm -rf $tmpdir" EXIT
|
|
|
|
basename=$(basename ${tarball:-.} .tar.gz)
|
|
|
|
# Save all the new sets, computer and output their hashes
|
|
newdir=$tmpdir/new/$basename
|
|
mkdir -p $newdir
|
|
for class in ${!class_*} ; do
|
|
class=${class#class_}
|
|
eval "printf \"%s\\n\" \"\${class_$class[@]}\"" \
|
|
| sort -k2 \
|
|
> $newdir/tmp
|
|
set -- $(md5sum $newdir/tmp) ; set -- ${1:0:16}
|
|
mv $newdir/tmp $newdir/$class.$1
|
|
#echo "Provides: kernel($class) = $1"
|
|
done
|
|
|
|
shopt -s nullglob
|
|
|
|
if [ -n "$old_tarball" ]; then
|
|
# Reuse all sets of symbols from the old tarball that are
|
|
# still the same.
|
|
old_basename=$(basename $old_tarball .tar.gz)
|
|
|
|
mkdir -p $tmpdir/old
|
|
zcat $old_tarball \
|
|
| tar xf - -C $tmpdir/old
|
|
set -- $tmpdir/old/*
|
|
olddir=$1
|
|
if [ ! -d $olddir ]; then
|
|
echo "$old_tarball does not contain directory $old_basename"
|
|
exit 1
|
|
fi
|
|
|
|
for oldset in $olddir/* ; do
|
|
[ -e $newdir/${oldset#$olddir/} ] && continue
|
|
class=${oldset##*/} ; class=${class%.*}
|
|
set -- $newdir/$class.*
|
|
[ $# -eq 1 ] || continue
|
|
newset=$1
|
|
# '*' doesn't occur in either file.
|
|
missing="$(join -t '*' -j 1 -v 1 <(sort "$oldset") <(sort "$newset"))"
|
|
if [ -z "$missing" ]; then
|
|
keep_oldset[${#keep_oldset[@]}]=$oldset
|
|
#echo "Provides: kernel($class) = ${oldset##*.} (old)"
|
|
else
|
|
set -- $(echo "$missing" | awk '{ print $2 "(" $1 ")" }')
|
|
ignore=ignore_class_$class
|
|
if [ -n "${!ignore}" ]; then
|
|
ignore="; ignoring"
|
|
else
|
|
ignore=
|
|
status=1
|
|
fi
|
|
echo "No longer provided: kernel($class) = ${oldset##*.} (missing/changed: $@$ignore)" >&2
|
|
fi
|
|
done
|
|
|
|
if [ ${#keep_oldset[@]} -gt 0 ]; then
|
|
mv "${keep_oldset[@]}" $newdir/
|
|
fi
|
|
else
|
|
echo "No longer provided: previous kernel(...) symbols that may still be" \
|
|
"compatible" >&2
|
|
fi
|
|
|
|
# Store the generated sets in $tarball
|
|
tar cf - -C $tmpdir/new $basename \
|
|
| gzip -9 \
|
|
> $tarball \
|
|
|| exit 1
|
|
|
|
exit $status
|
|
|
|
# vim:shiftwidth=4 softtabstop=4
|