linuxOS_AP06/device/rockchip/common/scripts/mk-rootfs.sh
2025-06-03 12:28:32 +08:00

412 lines
11 KiB
Bash
Executable File

#!/bin/bash -e
build_buildroot()
{
check_config RK_BUILDROOT || false
IMAGE_DIR="${1:-$RK_OUTDIR/buildroot}"
BUILDROOT_VERSION=$(grep "export BR2_VERSION := " \
"$RK_SDK_DIR/buildroot/Makefile" | xargs -n 1 | tail -n 1)
message "=========================================="
message " Start building buildroot($BUILDROOT_VERSION)"
message "=========================================="
"$RK_SCRIPTS_DIR/mk-buildroot.sh" $RK_BUILDROOT_CFG "$IMAGE_DIR"
if [ -r "$RK_LOG_DIR/post-rootfs.log" ]; then
cat "$RK_LOG_DIR/post-rootfs.log"
else
warning "Building without post-rootfs stage!"
fi
if [ "$RK_SECURITY" ]; then
if [ "$RK_ROOTFS_TYPE" == "ubi" ]; then
# UBIFS DOES NOT support R/W block device,
# so it only support RO encrypted image.
SUFFIX=squashfs
else
SUFFIX=$RK_ROOTFS_TYPE
fi
"$RK_SCRIPTS_DIR/mk-security.sh" system \
$RK_SECURITY_CHECK_METHOD $IMAGE_DIR/rootfs.$SUFFIX
if [ "$RK_ROOTFS_TYPE" == "ubi" ]; then
# Force to using dynamic to faster bootup.
sed -e "s;BR2_ROOTFS_UBI_PATH;${IMAGE_DIR}/security_system.img;" \
-e "s;UBI_VOL_TYPE;dynamic;" \
${RK_SDK_DIR}/buildroot/fs/ubi/ubinize.cfg > \
${RK_OUTDIR}/security/ubinize.cfg
# Repack ubifs, source variables from buildroot configuration
(
eval $(cat "$RK_SDK_DIR/buildroot/output/$RK_BUILDROOT_CFG/.config" | \
grep ^BR2_TARGET_ROOTFS_UBI_)
ubinize -o ${RK_OUTDIR}/security/security-system.ubi \
-m ${BR2_TARGET_ROOTFS_UBI_MINIOSIZE} \
-p ${BR2_TARGET_ROOTFS_UBI_PEBSIZE} \
-s ${BR2_TARGET_ROOTFS_UBI_SUBSIZE} \
${RK_OUTDIR}/security/ubinize.cfg
)
fi
fi
finish_build build_buildroot $@
}
build_yocto()
{
check_config RK_YOCTO || false
IMAGE_DIR="${1:-$RK_OUTDIR/yocto}"
"$RK_SCRIPTS_DIR/check-yocto.sh"
cd yocto
# Overrided configs for Rockchip SDK
{
echo "include include/rksdk.conf"
echo "include include/rksdk/kernel.conf"
echo "include include/rksdk/rkbin.conf"
echo "include include/rksdk/u-boot.conf"
[ ! -d "$RK_SDK_DIR/external/alsa-config" ] || \
echo "include include/rksdk/alsa-config.conf"
[ ! -d "$RK_SDK_DIR/external/gstreamer-rockchip" ] || \
echo "include include/rksdk/gstreamer-rockchip.conf"
[ ! -d "$RK_SDK_DIR/external/libmali" ] || \
echo "include include/rksdk/libmali.conf"
[ ! -d "$RK_SDK_DIR/external/linux-rga" ] || \
echo "include include/rksdk/librga.conf"
[ ! -d "$RK_SDK_DIR/external/mpp" ] || \
echo "include include/rksdk/mpp.conf"
[ ! -d "$RK_SDK_DIR/external/camera_engine_rkaiq" ] || \
echo "include include/rksdk/rkaiq.conf"
[ ! -d "$RK_SDK_DIR/external/camera_engine_rkisp" ] || \
echo "include include/rksdk/rkisp.conf"
[ ! -d "$RK_SDK_DIR/external/rknpu-fw" ] || \
echo "include include/rksdk/rknpu.conf"
[ ! -d "$RK_SDK_DIR/external/rkwifibt" ] || \
echo "include include/rksdk/rkwifibt.conf"
echo
echo "PREFERRED_PROVIDER_virtual/kernel := \"linux-dummy\""
echo "LINUXLIBCVERSION := \"$RK_KERNEL_VERSION_RAW-custom%\""
echo "OLDEST_KERNEL := \"$RK_KERNEL_VERSION_RAW\""
echo "USE_DEPMOD := \"0\""
case "$RK_CHIP_FAMILY" in
px30|rk3326|rk3562|rk3566_rk3568|rk3576|rk3588)
echo "MALI_VERSION := \"g24p0\"" ;;
esac
} > build/conf/rksdk_override.conf
rm -f build/conf/local.conf
if [ "$RK_YOCTO_CFG_CUSTOM" ]; then
if [ ! -r "$RK_CHIP_DIR/$RK_YOCTO_CFG" ]; then
error "$RK_CHIP_DIR/$RK_YOCTO_CFG not exist!"
return 1
fi
echo "include $RK_CHIP_DIR/$RK_YOCTO_CFG" > build/conf/local.conf
message "=========================================="
message " Start building for custom $RK_YOCTO_CFG"
message "=========================================="
else
{
echo "include include/common.conf"
echo "include include/debug.conf"
echo "include include/display.conf"
echo "include include/multimedia.conf"
echo "include include/audio.conf"
if [ "$RK_WIFIBT" ]; then
echo "include include/wifibt.conf"
fi
if [ "$RK_CHIP_HAS_GPU" ]; then
echo "include include/glmark2.conf"
if [ "$RK_YOCTO_CHROMIUM" ]; then
echo "include include/browser.conf"
fi
elif [ "$RK_YOCTO_DISPLAY_PLATFORM" = wayland ]; then
echo "PACKAGECONFIG:append:pn-weston-init = \" use-pixman\""
fi
echo
echo "DISPLAY_PLATFORM := \"$RK_YOCTO_DISPLAY_PLATFORM\""
echo
echo "MACHINE = \"$RK_YOCTO_MACHINE\""
} > build/conf/local.conf
message "=========================================="
message " Start building for machine($RK_YOCTO_MACHINE)"
message "=========================================="
fi
{
echo
echo "include rksdk_override.conf"
} >> build/conf/local.conf
if [ "$RK_YOCTO_EXTRA_CFG" ]; then
message "=========================================="
message " With extra config:($RK_YOCTO_EXTRA_CFG)"
message "=========================================="
{
echo "include $RK_CHIP_DIR/$RK_YOCTO_EXTRA_CFG"
} >> build/conf/local.conf
fi
source oe-init-build-env build
LANG=en_US.UTF-8 LANGUAGE=en_US.en LC_ALL=en_US.UTF-8 \
bitbake core-image-minimal -C rootfs
ln -rsf "$PWD/latest/rootfs.img" "$IMAGE_DIR/rootfs.ext4"
if [ -r "$RK_LOG_DIR/post-rootfs.log" ]; then
cat "$RK_LOG_DIR/post-rootfs.log"
else
warning "Building without post-rootfs stage!"
fi
finish_build build_yocto $@
}
build_debian()
{
check_config RK_DEBIAN || false
IMAGE_DIR="${1:-$RK_OUTDIR/debian}"
ARCH=${RK_DEBIAN_ARCH:-armhf}
"$RK_SCRIPTS_DIR/check-debian.sh"
message "=========================================="
message " Start building $RK_DEBIAN_VERSION($ARCH)"
message "=========================================="
cd debian
if [ ! -f linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz ]; then
RELEASE=$RK_DEBIAN_VERSION TARGET=desktop ARCH=$ARCH \
./mk-base-debian.sh
ln -sf linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz \
linaro-$RK_DEBIAN_VERSION-$ARCH.tar.gz
fi
DEBIAN_SCRIPT=mk-rootfs-$RK_DEBIAN_VERSION.sh
if [ "$RK_DEBIAN_MIRROR" ]; then
notice "Using mirror source $RK_DEBIAN_MIRROR in $DEBIAN_SCRIPT..."
sed -i "s#\(http://\)[^/]*#\1$RK_DEBIAN_MIRROR#" "$DEBIAN_SCRIPT"
fi
VERSION=debug ARCH=$ARCH ./$DEBIAN_SCRIPT
./mk-image.sh
if ! [ -r "$RK_LOG_DIR/post-rootfs.log" ]; then
warning "Building without post-rootfs stage!"
fi
ln -rsf "$PWD/linaro-rootfs.img" "$IMAGE_DIR/rootfs.ext4"
finish_build build_debian $@
}
# Hooks
usage_hook()
{
usage_oneline "buildroot-config[:<config>]" "modify buildroot defconfig"
usage_oneline "bconfig[:<config>]" "alias of buildroot-config"
usage_oneline "buildroot-make[:<arg1>:<arg2>]" "run buildroot make"
usage_oneline "bmake[:<arg1>:<arg2>]" "alias of buildroot-make"
usage_oneline "buildroot-sdk" "build the buildroot SDK tarball"
usage_oneline "bsdk" "alias of buildroot-sdk"
usage_oneline "rootfs[:<rootfs type>]" "build default rootfs"
usage_oneline "buildroot" "build buildroot rootfs"
usage_oneline "yocto" "build yocto rootfs"
usage_oneline "debian" "build debian rootfs"
}
clean_hook()
{
rm -rf yocto/build/tmp yocto/build/*cache
rm -rf debian/binary
if check_config RK_BUILDROOT &>/dev/null; then
rm -rf buildroot/output/$RK_BUILDROOT_CFG
fi
rm -rf "$RK_OUTDIR/buildroot"
rm -rf "$RK_OUTDIR/yocto"
rm -rf "$RK_OUTDIR/debian"
rm -rf "$RK_OUTDIR/rootfs"
rm -rf "$RK_FIRMWARE_DIR/rootfs.img"
}
INIT_CMDS="default buildroot debian yocto"
init_hook()
{
load_config RK_ROOTFS
check_config RK_ROOTFS &>/dev/null || return 0
# Priority: cmdline > custom env
if [ "$1" != default ]; then
export RK_ROOTFS_SYSTEM=$1
notice "Using rootfs system($RK_ROOTFS_SYSTEM) from cmdline"
elif [ "$RK_ROOTFS_SYSTEM" ]; then
export RK_ROOTFS_SYSTEM=${RK_ROOTFS_SYSTEM//\"/}
notice "Using rootfs system($RK_ROOTFS_SYSTEM) from environment"
else
return 0
fi
ROOTFS_CONFIG="RK_ROOTFS_SYSTEM=\"$RK_ROOTFS_SYSTEM\""
ROOTFS_UPPER=$(echo $RK_ROOTFS_SYSTEM | tr 'a-z' 'A-Z')
ROOTFS_CHOICE="RK_ROOTFS_SYSTEM_$ROOTFS_UPPER"
if ! grep -q "^$ROOTFS_CONFIG$" "$RK_CONFIG"; then
if ! grep -wq "$ROOTFS_CHOICE" "$RK_CONFIG"; then
error "$RK_ROOTFS_SYSTEM not supported!"
return 1
fi
sed -i -e "/RK_ROOTFS_SYSTEM/d" "$RK_CONFIG"
echo "$ROOTFS_CONFIG" >> "$RK_CONFIG"
echo "$ROOTFS_CHOICE=y" >> "$RK_CONFIG"
"$RK_SCRIPTS_DIR/mk-config.sh" olddefconfig &>/dev/null
fi
}
PRE_BUILD_CMDS="buildroot-config bconfig buildroot-make bmake"
pre_build_hook()
{
check_config RK_ROOTFS || false
case "$1" in
buildroot-make | bmake)
check_config RK_BUILDROOT || false
shift
"$RK_SCRIPTS_DIR/mk-buildroot.sh" \
$RK_BUILDROOT_CFG make $@
finish_build buildroot-make $@
;;
buildroot-config | bconfig)
BUILDROOT_BOARD="${2:-"$RK_BUILDROOT_CFG"}"
[ "$BUILDROOT_BOARD" ] || return 0
TEMP_DIR=$(mktemp -d)
unset BUILDROOT_OUTPUT_DIR
make -C "$RK_SDK_DIR/buildroot" O="$TEMP_DIR" \
"${BUILDROOT_BOARD}_defconfig" menuconfig
"$RK_SDK_DIR/buildroot/scripts/update_defconfig.sh" \
"$BUILDROOT_BOARD" "$TEMP_DIR"
rm -rf "$TEMP_DIR"
finish_build $@
;;
esac
}
BUILD_CMDS="rootfs buildroot debian yocto"
build_hook()
{
check_config RK_ROOTFS || false
if [ -z "$1" -o "$1" = rootfs ]; then
ROOTFS=${RK_ROOTFS_SYSTEM:-buildroot}
else
ROOTFS=$1
fi
ROOTFS_IMG=rootfs.${RK_ROOTFS_TYPE}
ROOTFS_DIR="$RK_OUTDIR/$ROOTFS"
IMAGE_DIR="$ROOTFS_DIR/images"
message "=========================================="
message " Start building rootfs($ROOTFS)"
message "=========================================="
case "$ROOTFS" in
yocto | debian | buildroot) ;;
*) usage ;;
esac
rm -rf "$ROOTFS_DIR" "$RK_OUTDIR/rootfs"
mkdir -p "$IMAGE_DIR"
ln -rsf "$ROOTFS_DIR" "$RK_OUTDIR/rootfs"
touch "$ROOTFS_DIR/.stamp_build_start"
case "$ROOTFS" in
yocto) build_yocto "$IMAGE_DIR" ;;
debian) build_debian "$IMAGE_DIR" ;;
buildroot) build_buildroot "$IMAGE_DIR" ;;
esac
touch "$ROOTFS_DIR/.stamp_build_finish"
if [ ! -f "$IMAGE_DIR/$ROOTFS_IMG" ]; then
error "There's no $ROOTFS_IMG generated..."
exit 1
fi
if [ "$RK_ROOTFS_INITRD" ]; then
"$RK_SCRIPTS_DIR/mk-ramboot.sh" "$ROOTFS_DIR" \
"$IMAGE_DIR/$ROOTFS_IMG" "$RK_BOOT_FIT_ITS"
ln -rsf "$ROOTFS_DIR/ramboot.img" "$RK_FIRMWARE_DIR/boot.img"
elif [ "$RK_SECURITY_CHECK_SYSTEM_ENCRYPTION" -o \
"$RK_SECURITY_CHECK_SYSTEM_VERITY" ]; then
if [ "$RK_ROOTFS_TYPE" == "ubi" ]; then
ln -rsf "${RK_OUTDIR}/security/security-system.ubi" \
"$RK_FIRMWARE_DIR/rootfs.img"
else
ln -rsf "$IMAGE_DIR/security_system.img" \
"$RK_FIRMWARE_DIR/rootfs.img"
fi
else
ln -rsf "$IMAGE_DIR/$ROOTFS_IMG" "$RK_FIRMWARE_DIR/rootfs.img"
fi
finish_build build_rootfs $@
}
POST_BUILD_CMDS="buildroot-sdk bsdk"
post_build_hook()
{
check_config RK_ROOTFS || false
build_hook buildroot
pre_build_hook bmake sdk
BUILDROOT_SDK_TARBALL="$RK_OUTDIR/buildroot/buildroot-sdk.tar.gz"
ln -rsf "$RK_OUTDIR/buildroot/images/"*sdk-buildroot.tar.gz \
"$BUILDROOT_SDK_TARBALL"
message "Generated buildroot SDK tarball at: $BUILDROOT_SDK_TARBALL"
finish_build $@
}
source "${RK_BUILD_HELPER:-$(dirname "$(realpath "$0")")/build-helper}"
case "${1:-rootfs}" in
buildroot-config | bconfig | buildroot-make | bmake) pre_build_hook $@ ;;
buildroot-sdk | bsdk) post_build_hook $@ ;;
buildroot | debian | yocto) init_hook $@ ;&
*) build_hook $@ ;;
esac