linux-firmware/copy-firmware.sh
Juerg Haefliger db99828b24
copy-firmware: Introduce 'RawFile' keyword
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>
2023-08-28 07:18:15 -04:00

121 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