improve of cmpl.
[bush.git] / tools / cmpl / shlib / cmplib.shlib
blobd7e17753a99b442e988d2e039986444efae9f961
3 # features:
4 # @ src list compile
5 # @ gen src list from a subdir, and compile
6 # @ compile a subdir by invoke build in subdir.
7 # @ compile & link for a target in target list.
9 # @ EXT_OBJ_LIST
13 # default param
15 CC="gcc"
16 LINK="gcc"
17 AR="ar"
18 O2LIB_CMD_EVL='${AR} ${ARFLAGS} ${outputfile}.a $(echo ${OBJ_LIST})'
19 ARFLAGS=" cr"
20 DST_FMT='${dst}'
21 OUTDIR_FMT='${PWD}/output/'
22 [[ -z $OUTDIR ]] && export OUTDIR="$PWD/output/" && echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  # it must have a '/' at last.
23 OBJDIR_FMT='${OUTDIR}/obj/'
24 OBJDIR="${OUTDIR}/obj/"
25 BAKDIR=${BAKDIR='../'}
27 scriptversion=v0.1.0-231025
29 version="cmpl.sh $scriptversion
31 Copyright 2020 Free Software Foundation, Inc.
32 There is NO warranty.  You may redistribute this software
33 under the terms of the GNU General Public License.
34 For more information about these matters, see the files named COPYING."
36 usage="Usage: $prog [OPTION]
38 It's a file of compile.
39   https://repo.or.cz/devutils.git
41 Options:
42   -f           force to re-compile again even if code is compiled before.
43   -v           version info.
44   -h           help info.
46 sub-cmd:
47         clean      clean output files.
48         bak        clean and backup a tarball in the upper dir.
49         
50   --help       display help info in detail.
51   --version    display version information in detail.
53 Simple example:
54 $ $prog -f
55 $ $prog
56 $ $prog clean
57 $ $prog bak
59 Email bug reports or enhancement requests to skeletone@126.com .
62 cmd_opt()
64         while test $# -gt 0; do
65           case $1 in
66                         -f)          force=1;;
67                         -v)          shift; outdir=$1;;
68                         -h)          shift; dirargs="$dirargs -I '$1'"; dirs="$dirs $1";;
69                         clean)       echo cleaning ...; flag_clean=1;;
70                         bak)
71                                 $0 clean
72                                 dir="$(basename $PWD)"
73                                 file="${dir}-$(date +%Y%m%d).zip"
74                                 cd ..
75                                 rm ${file}
76                                 zip -r ${file} ${dir}
77                                 cd - 2>/dev/null
78                                 [[ $BAKDIR != '../' && $BAKDIR != '..' ]] && mkdir -pv $BAKDIR && cp ../$file ${BAKDIR}/ -f
79                                 exit 0
80                         ;;
81                         gz)         echo TBD; exit 0;;
82                         bz)         echo TBD; exit 0;;
83                         xz)         echo TBD; exit 0;;
84                         
85                         -v)          echo "version: $scriptversion"; exit 0;;
86                         -h)          echo "$usage"; exit 0;;
87                         
88                         --version)   echo "$version"; exit 0;;
89                         --help)      echo "$usage"; exit 0;;
90                         -*)
91                                 echo "$0: Unknown option \`$1'." >&2
92                                 echo "$0: Try \`--help' for more information." >&2
93                                 exit 1;;
94                         *)
95                                 if test -z "$PACKAGE"; then
96                                         PACKAGE=$1
97                                 elif test -z "$MANUAL_TITLE"; then
98                                         MANUAL_TITLE=$1
99                                 else
100                                         echo "$0: extra non-option argument \`$1'." >&2
101                                         exit 1
102                                 fi;;
103                 esac
104                 shift
105         done
108 build_init()
110         [[ ! -z $@ ]] && force=1
112         OBJ_LIST=""
113         OBJDIR="$(eval echo ${OBJDIR_FMT})"
114         mkdir -pv $OUTDIR $OBJDIR
117 srclist ()
119         SRC_LIST="$(
120                 echo
121                 while read line; do
122                         if [[ -n $line ]]; then
123                                 echo ${line}.c
124                                 [[ -f "${line}_test.c" ]] && echo ${line}_test.c
125                         fi
126                 done <<< "$DST_LIST"
127                 echo
128         )"
131 dirbuild ()
133         [[ -z $SUB_SRCDIR_LIST ]] && return
135         for subdir in $SUB_SRCDIR_LIST; do
136                 cd $subdir
137                 [[ ! -f "cmpl.sh" ]] && echo "err: there no cmpl.sh file exist in subdir '$subdir'." && exit -1
139                 # running in subscript, parameters are not changed by sub-script.
140                 ( SUB_SRCDIR_LIST="" ./cmpl.sh "$@" )
141                 [[ $? != 0 ]] && echo "err: builld dir $subdir failed." && exit -1
142                 
143                 cd - 2>/dev/null
144                 STATIC_LIBS+=" ${OUTDIR}lib${subdir##*/}.a"
145                 echo =========================================================================
146                 echo STATIC_LIBS=$STATIC_LIBS
147 #               STATIC_LIBS+=" ${STATIC_LIB}"
148         done
151 compilenew ()
153         OBJDIR="$(eval echo ${OBJDIR_FMT})"
154         
155         for srcfile in $SRC_LIST; do
156 #               objfile=${srcfile##*/}
157                 objfile="${OBJDIR}${srcfile//\.c/\.o}"
158                 echo $srcfile gcc compile to $objfile ...
159                 
160                 if [[ $srcfile -nt $objfile
161 #                       || cmpl.sh -nt $srcfile
162                         || $force == 1
163                         || ! -f $objfile ]]; then
164         #               touch $srcfile
165                         mkdir -p $(dirname $objfile)
166                         echo $CC ${CFLAGS} -c $srcfile -o $objfile
167                         $CC ${CFLAGS} -c $srcfile -o $objfile
168                         [[ $? != 0 ]] && echo "gcc($CC) compile ($objfile) failed." && exit -1
169                         size $objfile
170                         force=1
171                 fi
172         done
174         OBJ_LIST=""
175         for srcfile in $SRC_LIST; do
176 #               objfile=${srcfile##*/}
177                 objfile="$OBJDIR${srcfile//\.c/\.o}"
178                 OBJ_LIST+=" $objfile"
179         done
180         echo OBJ_LIST=$OBJ_LIST
183 compile ()
185         OBJDIR="$(eval echo ${OBJDIR_FMT})"
186         
187         for srcfile in $SRC_LIST; do
188 #               objfile=${srcfile##*/}
189                 objfile="${OBJDIR}${srcfile//\.c/\.o}"
190                 echo $srcfile gcc compile to $objfile ...
191                 
192                 if [[ $srcfile -nt $objfile
193 #                       || cmpl.sh -nt $srcfile
194                         || $force == 1
195                         || ! -f $objfile ]]; then
196         #               touch $srcfile
197                         mkdir -p $(dirname $objfile)
198                         echo $CC ${CFLAGS} -c $srcfile -o $objfile
199                         $CC ${CFLAGS} -c $srcfile -o $objfile
200                         [[ $? != 0 ]] && echo "gcc($CC) compile ($objfile) failed." && exit -1
201                         size $objfile
202                         force=1
203                 fi
204         done
206         OBJ_LIST=""
207         for srcfile in $SRC_LIST; do
208 #               objfile=${srcfile##*/}
209                 objfile="$OBJDIR${srcfile//\.c/\.o}"
210                 OBJ_LIST+=" $objfile"
211         done
214 staticlib ()
216         OBJDIR="$(eval echo ${OBJDIR_FMT})"
218         if [[ "${DST_FMT}" == '${dst}' ]]; then
219                 outputfile="${DST_LIST%%[[:blank:]]}"
220                 outputfile="${OUTDIR}lib${outputfile#*[[:blank:]]}"
221                 
222                 OBJ_LIST=""
223                 flag_link=""
224                 for srcfile in $SRC_LIST; do
225 #                       objfile=${srcfile##*/}
226                         objfile="${OBJDIR}${srcfile//\.c/\.o}"
227                         OBJ_LIST+=" $objfile"
228                         [[ -z $flag_link && "$srcfile" -nt "$outputfile" ]] && flag_link=1 \
229                                 #&& echo $srcfile '-nt' $outputfile && ls -l $srcfile $outputfile
230                         [[ -z $flag_link && "$objfile" -nt "$outputfile" ]] && flag_link=1 \
231                                 #&& echo $objfile '-nt' $outputfile && ls -l $objfile $outputfile
232                 done
233                 [[ $flag_link != 1 ]] && return
234                 
235                 echo ${outputfile} gcc static lib link ...
236                 echo "########################################################################"
237                 echo "$O2LIB_CMD_EVL"
238                 eval O2LIB_CMD="\"$O2LIB_CMD_EVL\""
239 #               echo "$O2LIB_CMD"
240                 eval $O2LIB_CMD
241                 
242                 [[ $? != 0 ]] && echo "gcc link ($(echo $outputfile)) failed." && exit -1
243                 size ${outputfile}.a
244                 ls -l ${outputfile}.a
245                 
246                 STATIC_LIB="${outputfile}.a"
247                 return
248         fi
251 linknew ()
253         OBJDIR="$(eval echo ${OBJDIR_FMT})"
255         if [[ "${DST_FMT}" == '${dst}' ]]; then
256                 outputfile="${DST_LIST%%[[:blank:]]}"
257                 outputfile="${OUTDIR}${outputfile#*[[:blank:]]}"
258                 
259 #               OBJ_LIST=""
260                 flag_link=""
261                 for srcfile in $SRC_LIST; do
262                         objfile=${srcfile##*/}
263                         objfile="${OBJDIR}${objfile//\.c/\.o}"
264 #                       OBJ_LIST+=" $objfile"
265                         [[ -z $flag_link && "$srcfile" -nt "$outputfile" ]] && flag_link=1 \
266                                 #&& echo $srcfile '-nt' $outputfile && ls -l $srcfile $outputfile
267                         [[ -z $flag_link && "$objfile" -nt "$outputfile" ]] && flag_link=1 \
268                                 #&& echo $objfile '-nt' $outputfile && ls -l $objfile $outputfile
269                 done
270                 [[ $flag_link != 1 ]] && return
271                 
272                 echo $outputfile gcc link ...
273                 
274                 echo STATIC_LIBS=$STATIC_LIBS
276         for file in $STATIC_LIBS; do
277             file="${file//.a/}";
278             STATIC_LINK_LIBS+=" ${file//*lib/-l}";
279         done
280 #        echo STATIC_LINK_LIBS=$STATIC_LINK_LIBS;
282                 #
283                 # XXX: pay attenssion on the sequence of -lxxx parameter.
284                 # it would leading link error in un-suitable sequence.
285                 #
286                 echo LDFLAGS=$LDFLAGS
287                 echo ===========================================================
288                 echo "$LINK -L${OUTDIR} $OBJ_LIST -o $outputfile ${STATIC_LINK_LIBS}  $LDFLAGS "
289                 $LINK -L${OUTDIR} $OBJ_LIST -o $outputfile ${STATIC_LINK_LIBS} $LDFLAGS 
290                 [[ $? != 0 ]] && echo "gcc link ($(echo $outputfile)) failed." && exit -1
291                 size $outputfile
292                 ls -l $outputfile
293                 
294                 return
295         fi
296         
297         for dst in $DST_LIST; do
298                 outputfile="${OUTDIR}$(eval echo ${DST_FMT})"
299                 echo $outputfile gcc build ...
300                 
301                 objfile1="${OBJDIR}${dst}.o"
302                 objfile2="${OBJDIR}${dst}_test.o"
303                 if [[ $outputfile -nt $objfile1 || $outputfile -nt $objfile2
304                         || build.sh -nt $outputfile
305                         || $force == 1
306                         || ! -f $outputfile ]]; then
307                         echo "$LINK $LDFLAGS $SLIB_LIST $objfile1 $objfile2 -o $outputfile"
308                         $LINK $LDFLAGS $SLIB_LIST $objfile1 $objfile2 -o $outputfile
309                         [[ $? != 0 ]] && echo "gcc($CC) link ($outputfile) failed." && exit -1
310                         size $outputfile
311                 fi
312         done
315 link ()
317         OBJDIR="$(eval echo ${OBJDIR_FMT})"
319         if [[ "${DST_FMT}" == '${dst}' ]]; then
320                 outputfile="${DST_LIST%%[[:blank:]]}"
321                 outputfile="${OUTDIR}${outputfile#*[[:blank:]]}"
322                 
323                 OBJ_LIST=""
324                 flag_link=""
325                 for srcfile in $SRC_LIST; do
326 #                       objfile=${srcfile##*/}
327                         objfile="${OBJDIR}${srcfile//\.c/\.o}"
328                         OBJ_LIST+=" $objfile"
329                         [[ -z $flag_link && "$srcfile" -nt "$outputfile" ]] && flag_link=1 \
330                                 #&& echo $srcfile '-nt' $outputfile && ls -l $srcfile $outputfile
331                         [[ -z $flag_link && "$objfile" -nt "$outputfile" ]] && flag_link=1 \
332                                 #&& echo $objfile '-nt' $outputfile && ls -l $objfile $outputfile
333                 done
334                 [[ $flag_link != 1 ]] && return
335                 
336                 echo $outputfile gcc link ...
338                 echo STATIC_LIBS=$STATIC_LIBS
340         for file in $STATIC_LIBS; do
341             file="${file//.a/}";
342             STATIC_LINK_LIBS+=" ${file//*lib/-l}";
343         done
344 #        echo STATIC_LINK_LIBS=$STATIC_LINK_LIBS;
345                 
346                 echo $SLIB_LIST
347                 echo "$LINK -L${OUTDIR} $OBJ_LIST -o $outputfile ${STATIC_LINK_LIBS}  $LDFLAGS "
348                 $LINK -L${OUTDIR} $OBJ_LIST -o $outputfile ${STATIC_LINK_LIBS}  $LDFLAGS 
349 #               echo "$LINK $LDFLAGS -O2 $SLIB_LIST $OBJ_LIST -o $outputfile"
350 #               $LINK $LDFLAGS -O2 $OBJ_LIST $SLIB_LIST -o $outputfile
351                 [[ $? != 0 ]] && echo "gcc link ($(echo $outputfile)) failed." && exit -1
352                 size $outputfile
353                 ls -l $outputfile
354                 
355                 return
356         fi
357         
358         for dst in $DST_LIST; do
359                 outputfile="${OUTDIR}$(eval echo ${DST_FMT})"
360                 echo $outputfile gcc build ...
361                 
362                 objfile1="${OBJDIR}${dst}.o"
363                 objfile2="${OBJDIR}${dst}_test.o"
364                 if [[ $outputfile -nt $objfile1 || $outputfile -nt $objfile2
365                         || build.sh -nt $outputfile
366                         || $force == 1
367                         || ! -f $outputfile ]]; then
368                         echo "$LINK $LDFLAGS -O2 $SLIB_LIST $objfile1 $objfile2 -o $outputfile"
369                         $LINK $LDFLAGS -O2 $SLIB_LIST $objfile1 $objfile2 -o $outputfile
370                         [[ $? != 0 ]] && echo "gcc($CC) link ($outputfile) failed." && exit -1
371                         size $outputfile
372                 fi
373         done
376 update_param ()
378         CFLAGS=" -O2 ${MACRO_DEF} ${INC_PATHS} ${MISC_CFLAGS} "
379         echo CFLAGS="\"$CFLAGS\""
380         LDFLAGS="${INC_LIBS} ${MISC_LDFLAGS} "
381         echo LDFLAGS="\"$LDFLAGS\""
384 build_clean ()
386         OBJDIR="$(eval echo ${OBJDIR_FMT})"
388         rm $OBJ_LIST ${OBJDIR} $OUTDIR -rf
389         
390         while read dst; do
391                 [[ -z $dst ]] && continue
392                 eval echo rm "${OUTDIR}${DST_FMT}" -rf
393                 eval rm ${OUTDIR}${DST_FMT} -rf
394         done <<< "$DST_LIST"