forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
#!/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