linuxOS_AP05/buildroot/board/rockchip/rv1108/pack-root.sh
2025-06-02 13:59:07 +08:00

266 lines
6.9 KiB
Bash
Executable File

#!/bin/bash
CMD=`realpath $0`
CMD_DIR=`dirname $CMD`
BUILDROOT_DIR=`pwd`
SDK_DIR=`dirname $BUILDROOT_DIR`
RV_ROOT_DIR=$TARGET_OUTPUT_DIR/root
RV_IMAGE_DIR=$TARGET_OUTPUT_DIR/image
TOOLCHAINS_ARM_LINUX_READELF=$HOST_DIR/bin/arm-linux-readelf
NECESSARY_APP=`echo $RK_FIRST_START_APP | cut -d '"' -f2 | cut -d '"' -f1`
function list_usr_target()
{
echo "#######################################"
echo "# list_usr_target #"
echo "#######################################"
# bin full path
temp_target_usr_bin_array=(
`ls $TARGET_DIR/usr/bin/* | sort`
)
for element in ${temp_target_usr_bin_array[@]}
do
if [ ! -L $element ]; then
target_usr_bin_array=(${target_usr_bin_array[@]} $element);
fi
done
target_usr_bin_array_len=${#target_usr_bin_array[@]}
echo target_usr_bin_array_len=$target_usr_bin_array_len
# sbin full path
temp_target_usr_sbin_array=(
`ls $TARGET_DIR/usr/sbin/* | sort`
)
for element in ${temp_target_usr_sbin_array[@]}
do
if [ ! -L $element ]; then
target_usr_sbin_array=(${target_usr_sbin_array[@]} $element);
fi
done
target_usr_sbin_array_len=${#target_usr_sbin_array[@]}
echo target_usr_sbin_array_len=$target_usr_sbin_array_len
# lib full path
temp_target_usr_lib_array=(
`ls $TARGET_DIR/usr/lib/ | grep "so" | sort`
)
for element in ${temp_target_usr_lib_array[@]}
do
if [ ! -d $TARGET_DIR/usr/lib/$element ]; then
path=`find $TARGET_DIR/usr/lib -name $element | sort`
if [ ! -z $path ]; then
target_usr_lib_array=(${target_usr_lib_array[@]} $path);
fi
fi
done
target_usr_lib_array_len=${#target_usr_lib_array[@]}
echo target_usr_lib_array_len=$target_usr_lib_array_len
}
function collect_necessary_target()
{
echo "#######################################"
echo "# choose_necessary_target #"
echo "#######################################"
# app
if [ $# == 0 ]; then return; fi
app_targets=$@
for target in ${app_targets}; do
echo "Processing app: $target"
if [ ! -z $target ]; then
path=`find $TARGET_DIR/usr -name $target | sort`
if [ -z $path ]; then
path=`find $TARGET_DIR/sbin -name $target | sort`
fi
if [ ! -z $path ]; then
necessary_bin_array=(${necessary_bin_array[@]} $path)
necessary_bins_string+=" "$path
fi
fi
done
if [ 0 == ${#necessary_bin_array[@]} ]; then
echo necessary_bin_array is null
return
else
necessary_bin_array_len=${#necessary_bin_array[@]}
echo necessary_bin_array_len=$necessary_bin_array_len
fi
# lib
temp_necessary_lib_array=(
`$TOOLCHAINS_ARM_LINUX_READELF -d $necessary_bins_string | \
grep NEEDED | cut -d '[' -f2 | cut -d ']' -f1 | cut -d '.' -f1 | cut -d '-' -f1 | sort -u`
)
temp_necessary_lib_array_len=${#temp_necessary_lib_array[@]}
if [ 0 == $temp_necessary_lib_array_len ]; then
return
fi
i=0
for element in ${temp_necessary_lib_array[@]}
do
path=(`find $TARGET_DIR/usr/lib -name ${element}*so* | sort -u`)
if [ 0 == ${#path[@]} ]; then continue; fi
for path_element in ${path[@]}
do
necessary_lib_array[$i]=$path_element
i=`expr $i + 1`
done
done
necessary_lib_array_len=${#necessary_lib_array[@]}
echo first necessary_lib_array_len=$necessary_lib_array_len
#lib depends on lib
for element in ${necessary_lib_array[@]}
do
if [ ! -z `echo $element | grep .py` ]; then continue; fi
temp_necessary_lib_depend_array=(
`$TOOLCHAINS_ARM_LINUX_READELF -d ${element} | \
grep NEEDED | cut -d '[' -f2 | cut -d ']' -f1 | cut -d '.' -f1 | sort -u`)
if [ 0 == ${#temp_necessary_lib_depend_array[@]} ]; then continue; fi
for depend_element in ${temp_necessary_lib_depend_array[@]}
do
depend_path=(`find $TARGET_DIR/usr/lib -name ${depend_element}.so* | sort -u`)
if [ 0 == ${#depend_path[@]} ]; then continue; fi
for depend_path_element in ${depend_path[@]}
do
no_find_new_lib=0
for path_element in ${necessary_lib_array[@]}
do
if [ $depend_path_element == $path_element ]; then
no_find_new_lib=1
fi
done
if [ $no_find_new_lib == 0 ]; then
echo depend_path_element=$depend_path_element
necessary_lib_array[$i]=$depend_path_element
i=`expr $i + 1`
else
no_find_new_lib=0
fi
done
done
done
necessary_lib_array_len=${#necessary_lib_array[@]}
echo second necessary_lib_array_len=$necessary_lib_array_len
}
function collect_unnecessary_target()
{
echo "#######################################"
echo "# collect_unnecessary_target #"
echo "#######################################"
# bin
is_unnecessary=1
for temp_element in ${temp_target_usr_bin_array[@]}
do
if [ -L $temp_element ]; then
continue
fi
for element in ${necessary_bin_array[@]}
do
if [ $temp_element == $element ]; then
is_unnecessary=0
break;
fi
done
if [ $is_unnecessary == 1 ]; then
unnecessary_usr_bin_array=(${unnecessary_usr_bin_array[@]} $temp_element)
else
is_unnecessary=1
fi
done
unnecessary_usr_bin_array_len=${#unnecessary_usr_bin_array[@]}
echo unnecessary_usr_bin_array_len=$unnecessary_usr_bin_array_len
#sbin
is_unnecessary=1
for temp_element in ${temp_target_usr_sbin_array[@]}
do
if [ -L $temp_element ]; then
continue
fi
for element in ${necessary_bin_array[@]}
do
if [ $temp_element == $element ]; then
is_unnecessary=0
break;
fi
done
if [ $is_unnecessary == 1 ]; then
unnecessary_usr_sbin_array=(${unnecessary_usr_sbin_array[@]} $temp_element)
else
is_unnecessary=1
fi
done
unnecessary_usr_sbin_array_len=${#unnecessary_usr_sbin_array[@]}
echo unnecessary_usr_sbin_array_len=$unnecessary_usr_sbin_array_len
#lib
is_unnecessary=1
for temp_element in ${target_usr_lib_array[@]}
do
for element in ${necessary_lib_array[@]}
do
if [ $temp_element == $element ]; then
is_unnecessary=0
break;
fi
done
if [ $is_unnecessary == 1 ]; then
unnecessary_usr_lib_array=(${unnecessary_usr_lib_array[@]} $temp_element)
else
is_unnecessary=1
fi
done
unnecessary_usr_lib_array_len=${#unnecessary_usr_lib_array[@]}
echo unnecessary_usr_lib_array_len=$unnecessary_usr_lib_array_len
}
function pack_root()
{
echo "#######################################"
echo "# pack_root #"
echo "#######################################"
### clean root dir
if [ ! -d $RV_ROOT_DIR ]; then mkdir -p $RV_ROOT_DIR; fi
if [ ! -d $RV_ROOT_DIR/bin ]; then mkdir -p $RV_ROOT_DIR/bin; fi
if [ ! -d $RV_ROOT_DIR/sbin ]; then mkdir -p $RV_ROOT_DIR/sbin; fi
if [ ! -d $RV_ROOT_DIR/lib ]; then mkdir -p $RV_ROOT_DIR/lib; fi
#### copy target to root & delete target
for element in ${unnecessary_usr_bin_array[@]}
do
cp -fr $element $RV_ROOT_DIR/bin
rm -fr $element
done
for element in ${unnecessary_usr_sbin_array[@]}
do
cp -fr $element $RV_ROOT_DIR/sbin
rm -fr $element
done
for element in ${unnecessary_usr_lib_array[@]}
do
cp -fr $element $RV_ROOT_DIR/lib
rm -fr $element
done
}
list_usr_target
collect_necessary_target $NECESSARY_APP
collect_unnecessary_target
pack_root