159 lines
3.3 KiB
Bash
Raw Permalink Normal View History

2025-05-10 21:58:58 +08:00
#!/bin/bash -e
message() {
echo -e "\e[36m$@\e[0m"
}
fatal() {
echo -e "\e[31m$@\e[0m"
exit 1
}
# Get partition size limit, 0 means unlimited or not exists.
partition_size_kb() {
PART_SIZE="$(rk_partition_size "$1")"
echo $(( ${PART_SIZE:-0} / 2))
}
link_image() {
SRC="$1"
DST="$2"
message "Linking $DST from $SRC..."
ln -rsf "$SRC" "$DST"
}
pack_extra_partitions() {
for idx in $(seq 1 "$(rk_extra_part_num)"); do
# Skip built-in partitions
if rk_extra_part_builtin $idx; then
continue
fi
PART_NAME="$(rk_extra_part_name $idx)"
FS_TYPE="$(rk_extra_part_fstype $idx)"
SIZE="$(rk_extra_part_size $idx)"
FAKEROOT_SCRIPT="$(rk_extra_part_fakeroot_script $idx)"
OUTDIR="$(rk_extra_part_outdir $idx)"
DST="$(rk_extra_part_img $idx)"
if [ -z "$(rk_extra_part_src $idx)" ]; then
echo "Ignoring $PART_NAME for no sources"
continue
fi
rk_extra_part_prepare $idx
if [ "$SIZE" = max ]; then
SIZE="$(partition_size_kb "$PART_NAME")K"
if [ "$SIZE" = 0K ]; then
fatal "Unable to detect max size of $PART_NAME"
fi
echo "Using maxium size: $SIZE"
fi
sed -i '/mk-image.sh/d' "$FAKEROOT_SCRIPT"
echo "\"$SCRIPTS_DIR/mk-image.sh\" \
\"$OUTDIR\" \"$DST\" \"$FS_TYPE\" \
\"$SIZE\" \"$PART_NAME\"" >> "$FAKEROOT_SCRIPT"
message "Packing $DST from $FAKEROOT_SCRIPT"
cd "$OUTDIR"
fakeroot -- "$FAKEROOT_SCRIPT"
message "Done packing $DST"
done
}
build_firmware()
{
if ! which fakeroot &>/dev/null; then
echo "fakeroot not found! (sudo apt-get install fakeroot)"
exit 1
fi
mkdir -p "$RK_FIRMWARE_DIR" "$RK_SECURITY_FIRMWARE_DIR"
if [ "$RK_SECURITY" ]; then
FIRMWARE_DIR="$RK_SECURITY_FIRMWARE_DIR"
else
FIRMWARE_DIR="$RK_FIRMWARE_DIR"
fi
rm -rf "$RK_ROCKDEV_DIR"
ln -rsf "$FIRMWARE_DIR" "$RK_ROCKDEV_DIR"
"$SCRIPTS_DIR/check-grow-align.sh"
link_image "$CHIP_DIR/$RK_PARAMETER" "$RK_FIRMWARE_DIR/parameter.txt"
if [ "$RK_MISC_IMG" ]; then
link_image "$RK_IMAGE_DIR/$RK_MISC_IMG" \
"$RK_FIRMWARE_DIR/misc.img"
fi
pack_extra_partitions
if [ "$RK_SECURITY" ]; then
# Link non-security images
for f in $(ls "$RK_FIRMWARE_DIR/"); do
if [ -r "$FIRMWARE_DIR/$f" ]; then
continue
fi
link_image "$RK_FIRMWARE_DIR/$f" "$FIRMWARE_DIR/$f"
done
fi
echo "Packed files:"
for f in "$FIRMWARE_DIR"/*; do
NAME=$(basename "$f")
echo -n "$NAME"
if [ -L "$f" ]; then
echo -n "($(readlink -f "$f"))"
fi
FILE_SIZE=$(ls -lLh $f | xargs | cut -d' ' -f 5)
echo ": $FILE_SIZE"
echo "$NAME" | grep -q ".img$" || continue
# Assert the image's size smaller then the limit
PART_SIZE_KB="$(partition_size_kb "${NAME%.img}")"
[ ! "$PART_SIZE_KB" -eq 0 ] || continue
FILE_SIZE_KB="$(( $(stat -Lc "%s" "$f") / 1024 ))"
if [ "$PART_SIZE_KB" -lt "$FILE_SIZE_KB" ]; then
fatal "error: $NAME's size exceed parameter's limit!"
fi
done
message "Images in $FIRMWARE_DIR are ready!"
finish_build
}
# Hooks
usage_hook()
{
echo -e "firmware \tpack and check firmwares"
}
clean_hook()
{
rm -rf "$RK_FIRMWARE_DIR" "$RK_SECURITY_FIRMWARE_DIR" "$RK_ROCKDEV_DIR"
}
POST_BUILD_CMDS="firmware"
post_build_hook()
{
echo "=========================================="
echo " Start packing firmwares"
echo "=========================================="
build_firmware
}
source "${BUILD_HELPER:-$(dirname "$(realpath "$0")")/../build-hooks/build-helper}"
post_build_hook $@