mirror of
https://gitlab.com/kernel-firmware/linux-firmware.git
synced 2025-12-10 07:44:48 +01:00
Currently, 'Raw: <filename>' needs to be added to WHENCE for files that
must not be compressed. This means that such files need to be listed
twice ('File: <filename>' and 'Raw: <filename>') which is not pretty and
error prone. Also, the current implementation is broken for filenames
that contain quotes (") and it also requires grep'ing of WHENCE for every
processed line which slows things down.
Fix all of the above by introducing a new keyword 'RawFile' so that such
files are listed only once, quotes are handled correctly and grep is no
longer needed.
Signed-off-by: Juerg Haefliger <juerg.haefliger@canonical.com>
Signed-off-by: Josh Boyer <jwboyer@kernel.org>
120 lines
3.3 KiB
Bash
Executable file
120 lines
3.3 KiB
Bash
Executable file
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# Copy firmware files based on WHENCE list
|
|
#
|
|
|
|
verbose=:
|
|
prune=no
|
|
# shellcheck disable=SC2209
|
|
compress=cat
|
|
compext=
|
|
|
|
while test $# -gt 0; do
|
|
case $1 in
|
|
-v | --verbose)
|
|
# shellcheck disable=SC2209
|
|
verbose=echo
|
|
shift
|
|
;;
|
|
|
|
-P | --prune)
|
|
prune=yes
|
|
shift
|
|
;;
|
|
|
|
--xz)
|
|
if test "$compext" = ".zst"; then
|
|
echo "ERROR: cannot mix XZ and ZSTD compression"
|
|
exit 1
|
|
fi
|
|
compress="xz --compress --quiet --stdout --check=crc32"
|
|
compext=".xz"
|
|
shift
|
|
;;
|
|
|
|
--zstd)
|
|
if test "$compext" = ".xz"; then
|
|
echo "ERROR: cannot mix XZ and ZSTD compression"
|
|
exit 1
|
|
fi
|
|
# shellcheck disable=SC2209
|
|
compress="zstd --compress --quiet --stdout"
|
|
compext=".zst"
|
|
shift
|
|
;;
|
|
|
|
-*)
|
|
if test "$compress" = "cat"; then
|
|
echo "ERROR: unknown command-line option: $1"
|
|
exit 1
|
|
fi
|
|
compress="$compress $1"
|
|
shift
|
|
;;
|
|
*)
|
|
if test "x$destdir" != "x"; then
|
|
echo "ERROR: unknown command-line options: $*"
|
|
exit 1
|
|
fi
|
|
|
|
destdir="$1"
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# shellcheck disable=SC2162 # file/folder name can include escaped symbols
|
|
grep -E '^(RawFile|File):' WHENCE | sed -E -e 's/^(RawFile|File): */\1 /;s/"//g' | while read k f; do
|
|
test -f "$f" || continue
|
|
install -d "$destdir/$(dirname "$f")"
|
|
$verbose "copying/compressing file $f$compext"
|
|
if test "$compress" != "cat" && test "$k" = "RawFile"; then
|
|
$verbose "compression will be skipped for file $f"
|
|
cat "$f" > "$destdir/$f"
|
|
else
|
|
$compress "$f" > "$destdir/$f$compext"
|
|
fi
|
|
done
|
|
|
|
# shellcheck disable=SC2162 # file/folder name can include escaped symbols
|
|
grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read f d; do
|
|
if test -L "$f$compext"; then
|
|
test -f "$destdir/$f$compext" && continue
|
|
$verbose "copying link $f$compext"
|
|
install -d "$destdir/$(dirname "$f")"
|
|
cp -d "$f$compext" "$destdir/$f$compext"
|
|
|
|
if test "x$d" != "x"; then
|
|
target="$(readlink "$f")"
|
|
|
|
if test "x$target" != "x$d"; then
|
|
$verbose "WARNING: inconsistent symlink target: $target != $d"
|
|
else
|
|
if test "x$prune" != "xyes"; then
|
|
$verbose "WARNING: unneeded symlink detected: $f"
|
|
else
|
|
$verbose "WARNING: pruning unneeded symlink $f"
|
|
rm -f "$f$compext"
|
|
fi
|
|
fi
|
|
else
|
|
$verbose "WARNING: missing target for symlink $f"
|
|
fi
|
|
else
|
|
directory="$destdir/$(dirname "$f")"
|
|
install -d "$directory"
|
|
target="$(cd "$directory" && realpath -m -s "$d")"
|
|
if test -d "$target"; then
|
|
$verbose "creating link $f -> $d"
|
|
ln -s "$d" "$destdir/$f"
|
|
else
|
|
$verbose "creating link $f$compext -> $d$compext"
|
|
ln -s "$d$compext" "$destdir/$f$compext"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
exit 0
|
|
|
|
# vim: et sw=4 sts=4 ts=4
|