#!/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