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.
18 O2LIB_CMD_EVL='${AR} ${ARFLAGS} ${outputfile}.a $(echo ${OBJ_LIST})'
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
42 -f force to re-compile again even if code is compiled before.
47 clean clean output files.
48 bak clean and backup a tarball in the upper dir.
50 --help display help info in detail.
51 --version display version information in detail.
59 Email bug reports or enhancement requests to skeletone@126.com .
64 while test $# -gt 0; do
67 -v) shift; outdir=$1;;
68 -h) shift; dirargs="$dirargs -I '$1'"; dirs="$dirs $1";;
69 clean) echo cleaning ...; flag_clean=1;;
72 dir="$(basename $PWD)"
73 file="${dir}-$(date +%Y%m%d).zip"
78 [[ $BAKDIR != '../' && $BAKDIR != '..' ]] && mkdir -pv $BAKDIR && cp ../$file ${BAKDIR}/ -f
81 gz) echo TBD; exit 0;;
82 bz) echo TBD; exit 0;;
83 xz) echo TBD; exit 0;;
85 -v) echo "version: $scriptversion"; exit 0;;
86 -h) echo "$usage"; exit 0;;
88 --version) echo "$version"; exit 0;;
89 --help) echo "$usage"; exit 0;;
91 echo "$0: Unknown option \`$1'." >&2
92 echo "$0: Try \`--help' for more information." >&2
95 if test -z "$PACKAGE"; then
97 elif test -z "$MANUAL_TITLE"; then
100 echo "$0: extra non-option argument \`$1'." >&2
110 [[ ! -z $@ ]] && force=1
113 OBJDIR="$(eval echo ${OBJDIR_FMT})"
114 mkdir -pv $OUTDIR $OBJDIR
122 if [[ -n $line ]]; then
124 [[ -f "${line}_test.c" ]] && echo ${line}_test.c
133 [[ -z $SUB_SRCDIR_LIST ]] && return
135 for subdir in $SUB_SRCDIR_LIST; do
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
144 STATIC_LIBS+=" ${OUTDIR}lib${subdir##*/}.a"
145 echo =========================================================================
146 echo STATIC_LIBS=$STATIC_LIBS
147 # STATIC_LIBS+=" ${STATIC_LIB}"
153 OBJDIR="$(eval echo ${OBJDIR_FMT})"
155 for srcfile in $SRC_LIST; do
156 # objfile=${srcfile##*/}
157 objfile="${OBJDIR}${srcfile//\.c/\.o}"
158 echo $srcfile gcc compile to $objfile ...
160 if [[ $srcfile -nt $objfile
161 # || cmpl.sh -nt $srcfile
163 || ! -f $objfile ]]; then
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
175 for srcfile in $SRC_LIST; do
176 # objfile=${srcfile##*/}
177 objfile="$OBJDIR${srcfile//\.c/\.o}"
178 OBJ_LIST+=" $objfile"
180 echo OBJ_LIST=$OBJ_LIST
185 OBJDIR="$(eval echo ${OBJDIR_FMT})"
187 for srcfile in $SRC_LIST; do
188 # objfile=${srcfile##*/}
189 objfile="${OBJDIR}${srcfile//\.c/\.o}"
190 echo $srcfile gcc compile to $objfile ...
192 if [[ $srcfile -nt $objfile
193 # || cmpl.sh -nt $srcfile
195 || ! -f $objfile ]]; then
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
207 for srcfile in $SRC_LIST; do
208 # objfile=${srcfile##*/}
209 objfile="$OBJDIR${srcfile//\.c/\.o}"
210 OBJ_LIST+=" $objfile"
216 OBJDIR="$(eval echo ${OBJDIR_FMT})"
218 if [[ "${DST_FMT}" == '${dst}' ]]; then
219 outputfile="${DST_LIST%%[[:blank:]]}"
220 outputfile="${OUTDIR}lib${outputfile#*[[:blank:]]}"
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
233 [[ $flag_link != 1 ]] && return
235 echo ${outputfile} gcc static lib link ...
236 echo "########################################################################"
237 echo "$O2LIB_CMD_EVL"
238 eval O2LIB_CMD="\"$O2LIB_CMD_EVL\""
242 [[ $? != 0 ]] && echo "gcc link ($(echo $outputfile)) failed." && exit -1
244 ls -l ${outputfile}.a
246 STATIC_LIB="${outputfile}.a"
253 OBJDIR="$(eval echo ${OBJDIR_FMT})"
255 if [[ "${DST_FMT}" == '${dst}' ]]; then
256 outputfile="${DST_LIST%%[[:blank:]]}"
257 outputfile="${OUTDIR}${outputfile#*[[:blank:]]}"
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
270 [[ $flag_link != 1 ]] && return
272 echo $outputfile gcc link ...
274 echo STATIC_LIBS=$STATIC_LIBS
276 for file in $STATIC_LIBS; do
278 STATIC_LINK_LIBS+=" ${file//*lib/-l}";
280 # echo STATIC_LINK_LIBS=$STATIC_LINK_LIBS;
283 # XXX: pay attenssion on the sequence of -lxxx parameter.
284 # it would leading link error in un-suitable sequence.
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
297 for dst in $DST_LIST; do
298 outputfile="${OUTDIR}$(eval echo ${DST_FMT})"
299 echo $outputfile gcc build ...
301 objfile1="${OBJDIR}${dst}.o"
302 objfile2="${OBJDIR}${dst}_test.o"
303 if [[ $outputfile -nt $objfile1 || $outputfile -nt $objfile2
304 || build.sh -nt $outputfile
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
317 OBJDIR="$(eval echo ${OBJDIR_FMT})"
319 if [[ "${DST_FMT}" == '${dst}' ]]; then
320 outputfile="${DST_LIST%%[[:blank:]]}"
321 outputfile="${OUTDIR}${outputfile#*[[:blank:]]}"
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
334 [[ $flag_link != 1 ]] && return
336 echo $outputfile gcc link ...
338 echo STATIC_LIBS=$STATIC_LIBS
340 for file in $STATIC_LIBS; do
342 STATIC_LINK_LIBS+=" ${file//*lib/-l}";
344 # echo STATIC_LINK_LIBS=$STATIC_LINK_LIBS;
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
358 for dst in $DST_LIST; do
359 outputfile="${OUTDIR}$(eval echo ${DST_FMT})"
360 echo $outputfile gcc build ...
362 objfile1="${OBJDIR}${dst}.o"
363 objfile2="${OBJDIR}${dst}_test.o"
364 if [[ $outputfile -nt $objfile1 || $outputfile -nt $objfile2
365 || build.sh -nt $outputfile
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
378 CFLAGS=" -O2 ${MACRO_DEF} ${INC_PATHS} ${MISC_CFLAGS} "
379 echo CFLAGS="\"$CFLAGS\""
380 LDFLAGS="${INC_LIBS} ${MISC_LDFLAGS} "
381 echo LDFLAGS="\"$LDFLAGS\""
386 OBJDIR="$(eval echo ${OBJDIR_FMT})"
388 rm $OBJ_LIST ${OBJDIR} $OUTDIR -rf
391 [[ -z $dst ]] && continue
392 eval echo rm "${OUTDIR}${DST_FMT}" -rf
393 eval rm ${OUTDIR}${DST_FMT} -rf