linuxOS_MC3302/sdk/X-AIOS-LT00-V1.0.4/build/script/common/mkfirmware.sh
2026-01-30 16:53:24 +08:00

366 lines
10 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
MKIMG_TGT_OUT=$PRJ_TOP_DIR/out/$_top_img_out_dir_
export QM_ALL_IMAGES=$MKIMG_TGT_OUT/qmimages
export MKIMG_PATH_ROOT=$MKIMG_TGT_OUT/mkimg_part
MKIMG_PATH_IMGOUT=$MKIMG_PATH_ROOT/_imgout_
MKIMG_PATH_CURR=""
#default fs type
QM_SYS_DEF_FS_TYPE=${CONFIG_QM_SYS_PARTI_DEFAULT_FS_TYPE}
function finish_build(){
echo "Running ${FUNCNAME[1]} succeeded"
cd $PRJ_TOP_DIR
}
function build_genMkimgdir(){
echo " build_genMkimgdir"
echo "BoardConfig CONFIG_QM_SYS_PARTI_NAME_LIST${CONFIG_QM_SYS_PARTI_NAME_LIST}"
echo "BoardConfig CONFIG_QM_SYS_PARTI_INFOFILE${CONFIG_QM_SYS_PARTI_INFOFILE}"
if [ -n "${CONFIG_QM_SYS_PARTI_NAME_LIST}" ]; then
if [ -d "$MKIMG_TGT_OUT" ]; then
rm -rf $MKIMG_PATH_ROOT
mkdir -p $MKIMG_PATH_ROOT
mkdir -p $QM_ALL_IMAGES
mkdir -p $MKIMG_PATH_IMGOUT
pushd $MKIMG_PATH_ROOT
for partition in ${CONFIG_QM_SYS_PARTI_NAME_LIST}; do
mkdir -p "${MKIMG_PATH_ROOT}/${partition}"
#echo "mkdir: ${partition}"
done
cp -rf ${_top_board_conf_dir_}/${CONFIG_QM_SYS_PARTI_INFOFILE} ${MKIMG_PATH_IMGOUT}/${CONFIG_QM_SYS_PARTI_INFOFILE}
popd
else
echo -e "Failed: MKIMG_TGT_OUT:$MKIMG_TGT_OUT is not exist"
exit -1
fi
else
echo -e "Failed: CONFIG_QM_SYS_PARTI_NAME_LIST:${CONFIG_QM_SYS_PARTI_NAME_LIST} is empty, please check"
exit -1
fi
finish_build
}
function make_strip() {
local dir_path="$1"
if [ -d "$dir_path" ]; then
#find "$dir_path" -type f -exec ${_sdk_cross_compile}strip -v --strip-debug {} \;
find "$dir_path" -type f -not -name "*.ko" -exec ${_sdk_cross_compile}strip {} \;
else
return 1
fi
}
function build_backup_xos4dbg()
{
echo "build_backup_xos4dbg"
# 检查目录是否存在
if [ -d "$MKIMG_PATH_ROOT" ]; then
# mkdir backup_xos4dbg
mkdir -p $QM_ALL_IMAGES/backup_xos4dbg/
# add more backup copy files here
# backup system
if [ -d "$MKIMG_PATH_ROOT/system" ]; then
echo "backup unstrip $MKIMG_PATH_ROOT/system"
cp -arf $MKIMG_PATH_ROOT/system "$QM_ALL_IMAGES/backup_xos4dbg/"
fi
# backup rootfs
if [ -d "$MKIMG_PATH_ROOT/rootfs" ]; then
echo "backup unstrip $MKIMG_PATH_ROOT/rootfs"
cp -arf $MKIMG_PATH_ROOT/rootfs "$QM_ALL_IMAGES/backup_xos4dbg/"
fi
# backup data
if [ -d "$MKIMG_PATH_ROOT/data" ]; then
echo "backup unstrip $MKIMG_PATH_ROOT/data"
cp -arf $MKIMG_PATH_ROOT/data "$QM_ALL_IMAGES/backup_xos4dbg/"
fi
# backup qua
if [ -d "$MKIMG_PATH_ROOT/qua" ]; then
echo "backup unstrip $MKIMG_PATH_ROOT/qua"
cp -arf $MKIMG_PATH_ROOT/qua "$QM_ALL_IMAGES/backup_xos4dbg/"
fi
# pack backup_xos4dbg.tar.gz
if [ -d "$QM_ALL_IMAGES/backup_xos4dbg" ]; then
pushd $QM_ALL_IMAGES
echo "tar -czf backup_xos4dbg.tar.gz"
tar -czf backup_xos4dbg.tar.gz backup_xos4dbg
rm -rf backup_xos4dbg
popd
fi
fi
echo "build_backup_xos4dbg end"
}
function build_strip_all()
{
echo "build_strip_all"
# 检查目录是否存在
if [ -d "$MKIMG_PATH_ROOT" ]; then
# product-esl
if [ -d "$MKIMG_PATH_ROOT/system/qua/lib" ]; then
echo "strip $MKIMG_PATH_ROOT/system/qua/lib"
make_strip $MKIMG_PATH_ROOT/system/qua/lib/
fi
if [ -d "$MKIMG_PATH_ROOT/system/qua/lib/quamm" ]; then
echo "strip $MKIMG_PATH_ROOT/system/qua/lib/quamm"
make_strip $MKIMG_PATH_ROOT/system/qua/lib/quamm/
fi
if [ -d "$MKIMG_PATH_ROOT/system/app" ]; then
echo "strip $MKIMG_PATH_ROOT/system/app"
make_strip $MKIMG_PATH_ROOT/system/app/
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/bin" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/bin"
make_strip $MKIMG_PATH_ROOT/rootfs/bin/
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/sbin" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/sbin"
make_strip $MKIMG_PATH_ROOT/rootfs/sbin/
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/lib" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/lib"
make_strip $MKIMG_PATH_ROOT/rootfs/lib/
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/usr/lib" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/usr/lib"
make_strip $MKIMG_PATH_ROOT/rootfs/usr/lib/
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/usr/lib/quamm" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/usr/lib/quamm"
make_strip $MKIMG_PATH_ROOT/rootfs/usr/lib/quamm
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/vendor/qua/lib" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/vendor/qua/lib"
make_strip $MKIMG_PATH_ROOT/rootfs/vendor/qua/lib
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/vendor/qua/lib/quamm" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/vendor/qua/lib/quamm"
make_strip $MKIMG_PATH_ROOT/rootfs/vendor/qua/lib/quamm
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/system/qua/lib" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/system/qua/lib"
make_strip $MKIMG_PATH_ROOT/rootfs/system/qua/lib/
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/system/qua/lib/quamm" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/system/qua/lib/quamm"
make_strip $MKIMG_PATH_ROOT/rootfs/system/qua/lib/quamm/
fi
if [ -d "$MKIMG_PATH_ROOT/rootfs/system/app" ]; then
echo "strip $MKIMG_PATH_ROOT/rootfs/system/app"
make_strip $MKIMG_PATH_ROOT/rootfs/system/app/
fi
# other product-aicamera/kidc/ipc...
if [ -f "$MKIMG_PATH_ROOT/data/qxosui" ]; then
echo "strip $MKIMG_PATH_ROOT/data/qxosui"
${_sdk_cross_compile}strip $MKIMG_PATH_ROOT/data/qxosui
fi
if [ -d "$MKIMG_PATH_ROOT/qua/lib" ]; then
echo "strip $MKIMG_PATH_ROOT/qua/lib"
make_strip $MKIMG_PATH_ROOT/qua/lib/
fi
if [ -d "$MKIMG_PATH_ROOT/qua/lib/quamm" ]; then
echo "strip $MKIMG_PATH_ROOT/qua/lib/quamm"
make_strip $MKIMG_PATH_ROOT/qua/lib/quamm/
fi
if [ -d "$MKIMG_PATH_ROOT/system/qua/wifi/host" ]; then
echo "strip $MKIMG_PATH_ROOT/system/qua/wifi/host"
make_strip $MKIMG_PATH_ROOT/system/qua/wifi/host/
fi
fi
echo "build_strip_all end"
}
build_genMkimgdir
if [ $MKIMG_PATH_ROOT ]
then
QM_PARAMETER=${CONFIG_QM_SYS_PARTI_INFOFILE}
else
echo -e "CONFIG_QM_SYS_PARTI_INFOFILE:${CONFIG_QM_SYS_PARTI_INFOFILE} is not exist"
exit -1
fi
PARAMETER=$MKIMG_PATH_ROOT/$QM_PARAMETER
echo "MKIMG_PATH_IMGOUT:$MKIMG_PATH_IMGOUT"
if which fakeroot; then
FAKEROOT_TOOL="`which fakeroot`"
else
echo -e "Install fakeroot First"
echo -e " sudo apt-get install fakeroot"
exit -1
fi
QUA_FAKEROOT_SCRIPT=$MKIMG_PATH_IMGOUT/parti.fs
MKIMAGE=$XOS_SCRIPT_DIR/mk-image.sh
echo ""
echo ""
#copy files to each partition
echo "QM: copy images before mkimg, call ${_top_board_conf_dir_}/pre_mkimg_copy_files.sh"
if [ -n "${CONFIG_QM_SYS_PARTI_NAME_LIST}" ]; then
if [ -f "${_top_board_conf_dir_}/post_mkimg_copy_files.sh" ]; then
source ${_top_board_conf_dir_}/pre_mkimg_copy_files.sh
else
echo -e "warning: ${_top_board_conf_dir_}/pre_mkimg_copy_files.sh is not exist"
exit -1
fi
else
echo -e "warning: ${CONFIG_QM_SYS_PARTI_NAME_LIST} is empty"
exit -1
fi
#end of copy files
#backup xos for debug(unstrip lib/app)
build_backup_xos4dbg
#do strip all so/bin/ko (except mpp ko)
build_strip_all
# SIZE list for each every image
# create or clean code-size.txt
echo "code-size:${QM_ALL_IMAGES}/code-size.txt"
> ${QM_ALL_IMAGES}/code-size.txt
CODE_SIZE_MB=$(du -sh "$MKIMG_TGT_OUT/image/bsp/kernel/zImage" | awk '{print $1}')
echo "kernel: ${CODE_SIZE_MB} Mbyte" >> ${QM_ALL_IMAGES}/code-size.txt
do_code_size() {
pushd $MKIMG_PATH_ROOT
# 获取目标目录的大小(以 1K 块为单位)
CODE_SIZE_KB=$(du -s ${QM_PARTI_NAME} | cut -f1)
# 将目录大小转换为 MB 并向上取整
CODE_SIZE_MB=$(( (CODE_SIZE_KB + 1023) / 1024 ))
# 计算 20% 的元数据空间,并向上取整
METADATA_SIZE_MB=$(( (CODE_SIZE_MB + 9) / 10 ))
# 确保元数据空间最小为 10MB
if [ $METADATA_SIZE_MB -lt 10 ]; then
METADATA_SIZE_MB=$((METADATA_SIZE_MB + 10))
fi
# 设置扩展文件系统的大小(增加 10% 的空间用于文件系统元数据)
EXT4_SIZE_MB=$(( CODE_SIZE_MB + METADATA_SIZE_MB ))
# 比较 EXT4_SIZE_MB 和 QM_PARTI_SIZE取较小值
if [ $EXT4_SIZE_MB -gt $QM_PARTI_SIZE ]; then
EXT4_SIZE_MB=$QM_PARTI_SIZE
fi
echo "EXT4_SIZE_MB=$EXT4_SIZE_MB"
echo "METADATA_SIZE_MB=$METADATA_SIZE_MB"
# write partition name and code size into code-size.txt
echo "${QM_PARTI_NAME}: ${CODE_SIZE_MB} Mbyte" >> ${QM_ALL_IMAGES}/code-size.txt
popd
}
echo ""
echo ""
do_mkimg() {
echo "Creating image for partition: $QM_PARTI_NAME"
echo "File system type: $QM_PARTI_FSTYPE"
echo "Partition size: $QM_PARTI_SIZE"
echo "Partition auto: $QM_PARTI_AUTO"
echo "code size: $EXT4_SIZE_MB Mbyte"
MKIMG_PATH_CURR=${MKIMG_PATH_ROOT}/${QM_PARTI_NAME}
echo "mkimg path: $MKIMG_PATH_CURR!"
if [ $MKIMG_PATH_CURR ]
then
if [ -d "$MKIMG_PATH_CURR" ]
then
echo "#!/bin/sh" > $QUA_FAKEROOT_SCRIPT
echo "set -e" >> $QUA_FAKEROOT_SCRIPT
echo "$MKIMAGE $MKIMG_PATH_CURR $MKIMG_PATH_IMGOUT/$QM_PARTI_NAME.$QM_PARTI_FSTYPE $QM_PARTI_FSTYPE $QM_PARTI_SIZE $QM_PARTI_NAME" >> $QUA_FAKEROOT_SCRIPT
chmod a+x $QUA_FAKEROOT_SCRIPT
$FAKEROOT_TOOL -- $QUA_FAKEROOT_SCRIPT
rm -f $QUA_FAKEROOT_SCRIPT
if which img2simg; then
IMG2SIMG_TOOL="`which img2simg`"
else
echo -e "Install img2simg First"
echo -e " sudo apt-get install img2simg"
exit -1
fi
$IMG2SIMG_TOOL $MKIMG_PATH_IMGOUT/$QM_PARTI_NAME.$QM_PARTI_FSTYPE $MKIMG_PATH_IMGOUT/$QM_PARTI_NAME.img
else
echo "warning: $MKIMG_PATH_CURR not found!"
fi
fi
}
QM_PARTI_NAME=""
QM_PARTI_FSTYPE=""
QM_PARTI_SIZE=""
QM_PARTI_AUTO=""
EXT4_SIZE_MB=""
while IFS=',' read -r name fs size
do
[[ "$line" == \#* ]] && continue
if [[ "$name" == "::" ]]; then
break
fi
QM_PARTI_NAME="$name"
QM_PARTI_FSTYPE="$fs"
if [[ "$size" == *"+"* ]]; then
QM_PARTI_SIZE="${size%+*}"
QM_PARTI_AUTO="1"
else
QM_PARTI_SIZE="$size"
fi
echo "QM_PARTI_NAME=$QM_PARTI_NAME"
echo "QM_PARTI_FSTYPE=$QM_PARTI_FSTYPE"
echo "QM_PARTI_SIZE=$QM_PARTI_SIZE"
echo "QM_PARTI_AUTO=$QM_PARTI_AUTO"
echo ""
if [[ "$QM_PARTI_FSTYPE" != "raw" ]]; then
do_code_size
do_mkimg
fi
done < $MKIMG_PATH_IMGOUT/${CONFIG_QM_SYS_PARTI_INFOFILE}
echo -e "\e[36m Image: image in $QM_ALL_IMAGES is ready \e[0m"
echo ""
echo ""
#copy files to $QM_ALL_IMAGES
echo "QM: call ${_top_board_conf_dir_}/post_mkimg_copy_files.sh to copy binary files"
if [ -f "${_top_board_conf_dir_}/post_mkimg_copy_files.sh" ]; then
source ${_top_board_conf_dir_}/post_mkimg_copy_files.sh
else
echo -e "warning: ${_top_board_conf_dir_}/post_mkimg_copy_files.sh is not exist"
exit -1
fi
#end of copy files
echo "mv images to qmimages end"