linuxOS_MC3302/sdk/X-AIOS-LT00-V1.0.4/build/script/common/mkfirmware.sh

366 lines
10 KiB
Bash
Raw Normal View History

2026-01-30 08:53:24 +00:00
#!/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"