From 155e83061b934dbb20540854cfc5173e2c41328c Mon Sep 17 00:00:00 2001 From: skeletone Date: Thu, 23 Mar 2023 09:06:59 +0800 Subject: [PATCH] 20230310 --- build/build-config.shlib | 40 +- build/constructor | 640 ++++-------- build/dest/NOTE.txt | 119 +++ build/dest/build-step.imi | 1070 ++++++++++---------- build/dest/dest-bconfig/LDFLAGS-LIB.list | 2 +- build/dest/dest-bconfig/c-src-file.list | 33 +- build/dest/dest-bconfig/dest.imi | 29 +- build/dest/dest-bconfig/paramters.imi | 2 +- .../dest-bconfig/{ => tmp}/CFLAGS-INCPATH.list | 0 build/dest/dest-bconfig/{ => tmp}/CFLAGS.imi | 0 .../dest-bconfig/{ => tmp}/LDFLAGS-LIBPATH.list | 0 build/dest/dest-bconfig/{ => tmp}/LDFLAGS.imi | 6 +- build/dest/dest-bconfig/{ => tmp}/build.imi | 0 build/dest/dest-bconfig/{ => tmp}/c-src-dir.list | 0 .../{dest-general => dest-blank}/ARFLAGS-MISC.imi | 2 +- build/dest/dest-blank/CFLAGS-DBG.imi | 4 + build/dest/dest-blank/CFLAGS-DEF.list | 5 + build/dest/dest-blank/CFLAGS-INCPATH.list | 4 + .../{dest-general => dest-blank}/CFLAGS-MISC.imi | 1 + build/dest/dest-blank/LDFLAGS-DBG.imi | 4 + .../{dest-general => dest-blank}/LDFLAGS-LIB.list | 0 .../LDFLAGS-LIBPATH.list | 0 .../{dest-general => dest-blank}/LDFLAGS-MISC.imi | 0 build/dest/dest-blank/dep-pkg.list | 5 + build/dest/dest-blank/opt.imi | 17 + build/dest/dest-blank/readme.txt | 4 + build/dest/dest-gconfig/LDFLAGS-LIB.list | 5 + build/dest/dest-gconfig/c-src-file.list | 5 + build/dest/{dest-bconfig => dest-gconfig}/dest.imi | 15 +- .../{dest-libconfig => dest-gconfig}/paramters.imi | 2 +- build/dest/dest-gconfig/tmp/LDFLAGS-LIBPATH.list | 5 + .../tmp}/c-src-dir.list | 0 build/dest/dest-gconfig/tmp/obj.list | 6 + build/dest/dest-general/CFLAGS-DEF.list | 14 +- build/dest/dest-general/CFLAGS-INCPATH.list | 6 +- build/dest/dest-general/CFLAGS-MISC.imi | 7 + build/dest/dest-general/LDFLAGS-LIB.list | 5 +- build/dest/dest-general/LDFLAGS-LIBPATH.list | 2 +- build/dest/dest-general/LDFLAGS-MISC.imi | 3 +- build/dest/dest-general/readme.txt | 20 - build/dest/dest-libconfig/ARFLAGS-MISC.imi | 9 + build/dest/dest-libconfig/c-src-file.list | 42 +- build/dest/dest-libconfig/dest.imi | 15 +- build/dest/dest-libconfig/obj.list | 0 build/dest/dest-libconfig/paramters.imi | 3 +- .../dest-libconfig/{ => tmp}/CFLAGS-INCPATH.list | 0 build/dest/dest-libconfig/{ => tmp}/CFLAGS.imi | 0 .../dest/dest-libconfig/{ => tmp}/LDFLAGS-LIB.list | 0 .../dest-libconfig/{ => tmp}/LDFLAGS-LIBPATH.list | 0 .../dest/dest-libconfig/{ => tmp}/LDFLAGS-MISC.imi | 0 build/dest/dest-libconfig/{ => tmp}/LDFLAGS.imi | 6 +- build/dest/dest-libconfig/{ => tmp}/build.imi | 0 .../tmp}/c-src-dir.list | 0 .../{dest-bconfig => dest-libconfig/tmp}/obj.list | 0 build/dest/dest-mconfig/obj.list | 6 + build/dest/dest-nconfig/LDFLAGS-LIB.list | 5 + build/dest/dest-nconfig/c-src-file.list | 7 + build/dest/{dest-bconfig => dest-nconfig}/dest.imi | 15 +- .../{dest-libconfig => dest-nconfig}/paramters.imi | 2 +- build/dest/dest-qconfig/LDFLAGS-LIB.list | 5 + build/dest/dest-qconfig/cxx-src-file.list | 6 + build/dest/{dest-bconfig => dest-qconfig}/dest.imi | 15 +- .../{dest-libconfig => dest-qconfig}/paramters.imi | 2 +- build/dest/dest.list | 11 +- build/liba-note.txt | 17 + build/shlib/constructor.shlib | 771 +++++++------- build/shlib/toolchain.shlib | 292 +++--- build/tmp/constructor-tmp.shlib | 302 ++++++ build/tmp/constructor.tmp | 360 +++++++ src/bconfig/conf.dir/mconf.o | Bin 0 -> 153512 bytes src/bconfig/lxdialog/checklist.o | Bin 7752 -> 4444 bytes src/bconfig/lxdialog/inputbox.o | Bin 5396 -> 3628 bytes src/bconfig/lxdialog/menubox.o | Bin 8856 -> 5440 bytes src/bconfig/lxdialog/util.o | Bin 16076 -> 9416 bytes src/bconfig/lxdialog/yesno.o | Bin 3028 -> 1764 bytes src/bconfig/{conf.dir => lxrgmr}/confdata.c | 0 src/bconfig/lxrgmr/zconf.tab.c | 2 +- 77 files changed, 2301 insertions(+), 1674 deletions(-) create mode 100644 build/dest/NOTE.txt rewrite build/dest/build-step.imi (65%) rewrite build/dest/dest-bconfig/c-src-file.list (93%) rename build/dest/dest-bconfig/{ => tmp}/CFLAGS-INCPATH.list (100%) rename build/dest/dest-bconfig/{ => tmp}/CFLAGS.imi (100%) rename build/dest/dest-bconfig/{ => tmp}/LDFLAGS-LIBPATH.list (100%) rename build/dest/dest-bconfig/{ => tmp}/LDFLAGS.imi (63%) rename build/dest/dest-bconfig/{ => tmp}/build.imi (100%) copy build/dest/dest-bconfig/{ => tmp}/c-src-dir.list (100%) rename build/dest/{dest-general => dest-blank}/ARFLAGS-MISC.imi (72%) create mode 100644 build/dest/dest-blank/CFLAGS-DBG.imi create mode 100644 build/dest/dest-blank/CFLAGS-DEF.list create mode 100644 build/dest/dest-blank/CFLAGS-INCPATH.list copy build/dest/{dest-general => dest-blank}/CFLAGS-MISC.imi (96%) create mode 100644 build/dest/dest-blank/LDFLAGS-DBG.imi copy build/dest/{dest-general => dest-blank}/LDFLAGS-LIB.list (100%) copy build/dest/{dest-general => dest-blank}/LDFLAGS-LIBPATH.list (100%) copy build/dest/{dest-general => dest-blank}/LDFLAGS-MISC.imi (100%) create mode 100644 build/dest/dest-blank/dep-pkg.list create mode 100644 build/dest/dest-blank/opt.imi create mode 100644 build/dest/dest-blank/readme.txt create mode 100644 build/dest/dest-gconfig/LDFLAGS-LIB.list create mode 100644 build/dest/dest-gconfig/c-src-file.list copy build/dest/{dest-bconfig => dest-gconfig}/dest.imi (78%) copy build/dest/{dest-libconfig => dest-gconfig}/paramters.imi (76%) create mode 100644 build/dest/dest-gconfig/tmp/LDFLAGS-LIBPATH.list rename build/dest/{dest-libconfig => dest-gconfig/tmp}/c-src-dir.list (100%) create mode 100644 build/dest/dest-gconfig/tmp/obj.list create mode 100644 build/dest/dest-libconfig/ARFLAGS-MISC.imi rewrite build/dest/dest-libconfig/c-src-file.list (64%) delete mode 100644 build/dest/dest-libconfig/obj.list rename build/dest/dest-libconfig/{ => tmp}/CFLAGS-INCPATH.list (100%) rename build/dest/dest-libconfig/{ => tmp}/CFLAGS.imi (100%) rename build/dest/dest-libconfig/{ => tmp}/LDFLAGS-LIB.list (100%) rename build/dest/dest-libconfig/{ => tmp}/LDFLAGS-LIBPATH.list (100%) rename build/dest/dest-libconfig/{ => tmp}/LDFLAGS-MISC.imi (100%) rename build/dest/dest-libconfig/{ => tmp}/LDFLAGS.imi (62%) rename build/dest/dest-libconfig/{ => tmp}/build.imi (100%) rename build/dest/{dest-bconfig => dest-libconfig/tmp}/c-src-dir.list (100%) rename build/dest/{dest-bconfig => dest-libconfig/tmp}/obj.list (100%) create mode 100644 build/dest/dest-nconfig/LDFLAGS-LIB.list create mode 100644 build/dest/dest-nconfig/c-src-file.list copy build/dest/{dest-bconfig => dest-nconfig}/dest.imi (78%) copy build/dest/{dest-libconfig => dest-nconfig}/paramters.imi (76%) create mode 100644 build/dest/dest-qconfig/LDFLAGS-LIB.list create mode 100644 build/dest/dest-qconfig/cxx-src-file.list copy build/dest/{dest-bconfig => dest-qconfig}/dest.imi (78%) copy build/dest/{dest-libconfig => dest-qconfig}/paramters.imi (76%) create mode 100644 build/liba-note.txt create mode 100644 build/tmp/constructor-tmp.shlib create mode 100644 build/tmp/constructor.tmp create mode 100644 src/bconfig/conf.dir/mconf.o rewrite src/bconfig/lxdialog/checklist.o (64%) rewrite src/bconfig/lxdialog/util.o (73%) rename src/bconfig/{conf.dir => lxrgmr}/confdata.c (100%) diff --git a/build/build-config.shlib b/build/build-config.shlib index 4981c8b..c6c70f8 100644 --- a/build/build-config.shlib +++ b/build/build-config.shlib @@ -59,15 +59,16 @@ include stdio.shlib # on_prev_construct () { + echo "on_prev_construct ($@)" echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # check-lxdialog.sh -check -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="" -DLOCALE -DKBUILD_NO_NLS -I. -DCONFIG_=\"\" -lncurses # return 0 - CFLAGS_ORG="$(check-lxdialog.sh -ccflags)" + CFLAGS_EXT="$(check-lxdialog.sh -ccflags)" # if there are char of newline, this assignment will translate it to blank. - CFLAGS_ORG="$(echo ${CFLAGS_ORG})" -# echo $CFLAGS_ORG + CFLAGS_EXT="$(echo ${CFLAGS_EXT})" + echo CFLAGS_EXT=$CFLAGS_EXT return 0 } @@ -78,7 +79,8 @@ on_prev_construct () # on_post_construct () { - : + echo "on_post_construct ($@)" + return 0 } # @@ -87,7 +89,8 @@ on_post_construct () # on_prev_dest_build () { - : + echo "on_prev_dest_build ($@)" + return 0 } # @@ -96,7 +99,8 @@ on_prev_dest_build () # on_post_dest_build () { - : + echo "on_post_dest_build ($@)" + return 0 } # @@ -105,7 +109,8 @@ on_post_dest_build () # on_prev_cmpl () { - : + echo "on_prev_cmpl ($@)" + return 0 } # @@ -114,7 +119,8 @@ on_prev_cmpl () # on_post_cmpl () { - : + echo "on_post_cmpl ($@)" + return 0 } # @@ -123,7 +129,8 @@ on_post_cmpl () # on_prev_link () { - : + echo "on_prev_link ($@)" + return 0 } # @@ -132,7 +139,8 @@ on_prev_link () # on_post_link () { - : + echo "on_post_link ($@)" + return 0 } # @@ -141,7 +149,8 @@ on_post_link () # on_prev_instpkg_gen () { - : + echo "on_prev_instpkg_gen ($@)" + return 0 } # @@ -150,7 +159,8 @@ on_prev_instpkg_gen () # on_post_instpkg_gen () { - : + echo "on_post_instpkg_gen ($@)" + return 0 } # @@ -159,7 +169,8 @@ on_post_instpkg_gen () # on_prev_arch_build () { - : + echo "on_prev_arch_build ($@)" + return 0 } # @@ -168,7 +179,8 @@ on_prev_arch_build () # on_post_arch_build () { - : + echo "on_post_arch_build ($@)" + return 0 } diff --git a/build/constructor b/build/constructor index e063056..478a45b 100644 --- a/build/constructor +++ b/build/constructor @@ -69,6 +69,35 @@ OUTPUT_DIR_ABP_EVAL='$SRCPKG_TOPDIR_ABP/build/output' SRCPKG_NAME= +DEST_LIST_FILE_EVL='${SRCPKG_TOPDIR}/build/dest/dest.list' +BUILD_STEP_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/build-step.imi' +VERSION_FILE_EVL='${SRCPKG_TOPDIR}/doc/VERSION' + + +# +# XXX: +# + +DEST_GENERAL_CFG_DIR_EVL='${SRCPKG_TOPDIR}/build/dest/dest-general' +DEST_CFG_DIR_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME' + +DEST_NAME= +DEST_CFG_DIR_NAME= +DEST_CFG_DIR= +# for one dest, there are those config files in dest setting dir. +DEST_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/dest.imi' +ARFLAGS_MISC_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/ARFLAGS-MISC.imi' +CFLAGS_DEF_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/CFLAGS-DEF.list' +CFLAGS_INCPATH_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/CFLAGS-INCPATH.list' +CFLAGS_MISC_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/CFLAGS-MISC.imi' +DEP_PKG_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/dep-pkg.list' +LDFLAGS_LIB_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/LDFLAGS-LIB.list' +LDFLAGS_LIBPATH_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/LDFLAGS-LIBPATH.list' +LDFLAGS_MISC_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/LDFLAGS-MISC.imi' +PARAMTERS_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/paramters.imi' + + +OBJ_LIST= ############################## @@ -104,11 +133,11 @@ load_list_file () local bak= local i=0 + buildparam_dbgout "load_list_file($1)\n" + [[ ${1##*\.} != "lst" && ${1##*\.} != "list" ]] && err "specified file $1 is not .list or .lst file.\n" && return 1 if [[ -e "$1" ]]; then - param_dbgout "load_list_file($1)\n" >&2 - while read data; do : $(( i++ )) # filter comment, and skip blank line. @@ -137,14 +166,6 @@ load_list_file () } # -# -# -__setvar () -{ - eval "$@" -} - -# # fsyntax: load_imi_file # load_imi_file () @@ -152,18 +173,41 @@ load_imi_file () local data= local bak= local vlist= + local flag="" + local tmp= + + buildparam_dbgout "load_imi_file ($@)\n" + + # it's normal if file is not exist. + [[ ! -e ${1} ]] && echo "parameter file($1) is not exist." && return 0 [[ ${1##*\.} != "imi" ]] && err "specified file $1 is not .imi file.\n" && return 1 if [[ -e "$1" ]]; then - param_dbgout "load_imi_file($1)\n" - while read data; do + [[ "${data}" =~ $'\r' ]] && data=$(echo ${data:0:-1}) # filter comment, and skip blank line. [[ -z ${data//[[:space:]]/} ]] && continue if [[ ${data} =~ '#' ]]; then [[ ${data} =~ ^[[:space:]]*[#] ]] && continue - data="${data//[[:space:]]*[#]*/}" + data="${data//[[:space:]]*[#].*/}" + fi + + if [[ "${data}" =~ '=(' ]]; then + flag="array" + tmp="${data}"$'\n' + continue + fi + + if [[ "${flag}" == 'array' ]]; then + if [[ "${data}" =~ ')' ]]; then + tmp+="${data%%\)*})"$'\n' + data="$tmp" + flag="" + else + tmp+="${data}"$'\n' + continue + fi fi # ignore [xxx] section setting, use it as an ini file. @@ -178,10 +222,13 @@ load_imi_file () # data="${data//\"/\\\"}" data="${data//\'/\\\'}" +# echo "=== ${data}" eval "$(eval echo ${data})" # \$\'\\\"\"\\\n\\\"\"\' else # append newline after every one. - eval ${data}$'"\n"' +# echo "=== ${data}" + eval ${data} + #$'"\n"' fi # backup var name. @@ -204,25 +251,69 @@ load_imi_file () fi } + + +############################## +# section: public function +############################## + # -# dest +# fsyntax: dbgout_construct_param +# fdesc: # +dbgout_construct_param () +{ + [[ -n $CFLAGS_DEF ]] && buildparam_dbgout "CFLAGS_DEF=\"$CFLAGS_DEF\"\n" + [[ -n $CFLAGS_INCPATH ]] && buildparam_dbgout "CFLAGS_INCPATH=\"$CFLAGS_INCPATH\"\n" + [[ -n $INC_PKG ]] && buildparam_dbgout "INC_PKG=\"$INC_PKG\"\n" + [[ -n $LDFLAGS_LIBS ]] && buildparam_dbgout "LDFLAGS_LIBS=\"$LDFLAGS_LIBS\"\n" + [[ -n $LDFLAGS_LIBPATH ]] && buildparam_dbgout "LDFLAGS_LIBPATH=\"$LDFLAGS_LIBPATH\"\n\n" + + [[ -n $CFLAGS_DBG ]] && buildparam_dbgout "CFLAGS_DBG=\"$CFLAGS_DBG\"\n" + [[ -n $CFLAGS_SHARE ]] && buildparam_dbgout "CFLAGS_SHARE=\"$CFLAGS_SHARE\"\n" + [[ -n $LDFLAGS_MISC ]] && buildparam_dbgout "LDFLAGS_MISC=\"$LDFLAGS_MISC\"\n" + [[ -n $LDFLAGS_DBG ]] && buildparam_dbgout "LDFLAGS_DBG=\"$LDFLAGS_DBG\"\n" + [[ -n $LDFLAGS_SHARE ]] && buildparam_dbgout "LDFLAGS_SHARE=\"$LDFLAGS_SHARE\"\n\n" + + [[ -n $CFLAGS ]] && buildparam_dbgout "CFLAGS=\"$CFLAGS\"\n" + [[ -n $LDFLAGS ]] && buildparam_dbgout "LDFLAGS=\"$LDFLAGS\"\n" +} -DEST_GENERAL_CFG_DIR_EVL='${SRCPKG_TOPDIR}/build/dest/dest-general' -DEST_CFG_DIR_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME' +# +# fsyntax: dbgout_construct_param +# fdesc: +# +dest_param_reset () +{ + CFLAGS_DEF="" + CFLAGS_INCPATH="" + INC_PKG="" + LDFLAGS_LIBS="" + LDFLAGS_LIBPATH="" + + CFLAGS_DBG="" + CFLAGS_SHARE="" + LDFLAGS_MISC="" + LDFLAGS_DBG="" + LDFLAGS_SHARE="" + + LDFLAGS="" + CFLAGS="" +} -DEST_NAME= -DEST_CFG_DIR_NAME= -DEST_CFG_DIR= -# for one dest, there are those config files in dest setting dir. -CFLAGS_DEF_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/CFLAGS-DEF.list' -CFLAGS_INCPATH_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/CFLAGS-INCPATH.list' -CFLAGS_MISC_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/CFLAGS-MISC.imi' -DEP_PKG_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/dep-pkg.list' -LDFLAGS_LIB_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/LDFLAGS-LIB.list' -LDFLAGS_LIBPATH_LIST_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/LDFLAGS-LIBPATH.list' -LDFLAGS_MISC_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/LDFLAGS-MISC.imi' -PARAMTERS_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/paramters.imi' +# +# dest +# + +# +# +# +dest_info_init () +{ + # load dest.imi + eval "DEST_IMI=\"${DEST_IMI_EVL}\"" + load_imi_file $DEST_IMI +} # # fsyntax: one_dest_init @@ -230,12 +321,17 @@ PARAMTERS_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/$DEST_CFG_DIR_NAME/paramters.imi' # one_dest_init () { - local DEST_CFG_DIR_NAME=$1 + DEST_CFG_DIR_NAME=$1 - param_dbgout "one_dest_init($1)\n" + buildparam_dbgout "one_dest_init($1)\n" eval "DEST_CFG_DIR=\"${DEST_CFG_DIR_EVL}\"" + # load ARFLAGS_MISC.list + eval "ARFLAGS_MISC_IMI=\"${ARFLAGS_MISC_IMI_EVL}\"" +# param_dbgout "ARFLAGS_MISC_IMI=$ARFLAGS_MISC_IMI\n" + load_imi_file $ARFLAGS_MISC_IMI + # load CFLAGS-DEF.list eval "CFLAGS_DEF_LIST=\"${CFLAGS_DEF_LIST_EVL}\"" # param_dbgout "CFLAGS_DEF_LIST=$CFLAGS_DEF_LIST\n" @@ -271,12 +367,16 @@ one_dest_init () # param_dbgout "LDFLAGS_MISC_IMI=$LDFLAGS_MISC_IMI\n" load_imi_file $LDFLAGS_MISC_IMI - # load src list files - # -src-file and -src-dir can be included in this loading. - while read file; do - [[ ! ${file} =~ .+-src-.+ ]] && continue - load_list_file $file - done < <(ls -d -1 -f $DEST_CFG_DIR/{*.lst,*.list} 2>/dev/null) + # TBD: disable src-list load in init. load it before corresponding + # program language src file list compile. + if false; then + # load src list files + # -src-file and -src-dir can be included in this loading. + while read file; do + [[ ! ${file} =~ .+-src-.+ ]] && continue + load_list_file $file + done < <(ls -d -1 -f $DEST_CFG_DIR/{*.lst,*.list} 2>/dev/null) + fi # load CFLAGS & LDFLAGS imi file @@ -284,104 +384,60 @@ one_dest_init () eval "PARAMTERS_IMI=\"${PARAMTERS_IMI_EVL}\"" # param_dbgout "PARAMTERS_IMI=$PARAMTERS_IMI\n" load_imi_file $PARAMTERS_IMI - echo LDFLAGS=$LDFLAGS -} - -# -# fsyntax: dbgout_construct_param -# fdesc: -# -dbgout_construct_param () -{ - [[ -n $CFLAGS_DEF ]] && param_dbgout "CFLAGS_DEF=\"$CFLAGS_DEF\"\n" - [[ -n $CFLAGS_INCPATH ]] && param_dbgout "CFLAGS_INCPATH=\"$CFLAGS_INCPATH\"\n" - [[ -n $INC_PKG ]] && param_dbgout "INC_PKG=\"$INC_PKG\"\n" - [[ -n $LDFLAGS_LIBS ]] && param_dbgout "LDFLAGS_LIBS=\"$LDFLAGS_LIBS\"\n" - [[ -n $LDFLAGS_LIBPATH ]] && param_dbgout "LDFLAGS_LIBPATH=\"$LDFLAGS_LIBPATH\"\n\n" - - [[ -n $CFLAGS_DBG ]] && param_dbgout "CFLAGS_DBG=\"$CFLAGS_DBG\"\n" - [[ -n $CFLAGS_SHARE ]] && param_dbgout "CFLAGS_SHARE=\"$CFLAGS_SHARE\"\n" - [[ -n $LDFLAGS_MISC ]] && param_dbgout "LDFLAGS_MISC=\"$LDFLAGS_MISC\"\n" - [[ -n $LDFLAGS_DBG ]] && param_dbgout "LDFLAGS_DBG=\"$LDFLAGS_DBG\"\n" - [[ -n $LDFLAGS_SHARE ]] && param_dbgout "LDFLAGS_SHARE=\"$LDFLAGS_SHARE\"\n\n" - - [[ -n $CFLAGS ]] && param_dbgout "CFLAGS=\"$CFLAGS\"\n" - [[ -n $LDFLAGS ]] && param_dbgout "LDFLAGS=\"$LDFLAGS\"\n" -} - -# -# fsyntax: dbgout_construct_param -# fdesc: -# -dest_param_reset () -{ - CFLAGS_DEF="" - CFLAGS_INCPATH="" - INC_PKG="" - LDFLAGS_LIBS="" - LDFLAGS_LIBPATH="" - CFLAGS_DBG="" - CFLAGS_SHARE="" - LDFLAGS_MISC="" - LDFLAGS_DBG="" - LDFLAGS_SHARE="" - - LDFLAGS="" - CFLAGS="" -} - -running_dest_steps () -{ - : + buildparam_dbgout "CFLAGS=$CFLAGS\n" + buildparam_dbgout "LDFLAGS=$LDFLAGS\n" } # -# fsyntax: construct_one_dest -# fdesc: construct one dest executables. +# fsyntax: dest_init +# fdesc: init one dest build. it loads the relative paramter files. # -construct_one_dest () +dest_init () { local dest=${dest#*-} local step= local ret= - dbgoutd "############################\n" - dbgoutd "construct_one_dest(${1#*-})\n" + buildparam_dbgout "############################\n" + buildparam_dbgout "dest_init(${2#*-}, $@)\n" + + declare -g $1="${2#*-}" # init one dest cfg paramter eval "DEST_GENERAL_CFG_DIR=\"${DEST_GENERAL_CFG_DIR_EVL}\"" dest_param_reset one_dest_init dest-general - one_dest_init $1 + one_dest_init $2 CFLAGS="$CFLAGS" mkdir -p ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/ - dbgout_construct_param - - # check src file list to be compiled. - check_and_get_src_compile_list - - # compile if needed. - if [[ $? == 0 ]]; then - compile_src_list - - [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1\n" && return 1 - fi + unset OBJ_LIST + declare -g OBJ_LIST="" - # try to check dest and obj tp, it output OBJ_LIST. - dest_link_check $dest - [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2\n" && return 1 - - link_dest $dest - return $? + dest_info_init + + dbgout_construct_param + dbgoutd "############################\n" + dbgoutd "construct_one_dest($1, ${!1}, ${2#*-})\n" } -DEST_LIST_FILE_EVL='${SRCPKG_TOPDIR}/build/dest/dest.list' -BUILD_STEP_IMI_EVL='${SRCPKG_TOPDIR}/build/dest/build-step.imi' -VERSION_FILE_EVL='${SRCPKG_TOPDIR}/doc/VERSION' +# +# fsyntax: build_step_init +# fdesc: load build-step.imi cfg file. +# +build_step_init () +{ + # load CFLAGS-MISC.imi + eval "BUILD_STEP_IMI=\"${BUILD_STEP_IMI_EVL}\"" + buildparam_dbgout "BUILD_STEP_IMI=$BUILD_STEP_IMI\n" +# param_dbgout "BUILD_STEP_IMI=$BUILD_STEP_IMI\n" +# load_imi_file $BUILD_STEP_IMI + # use source instead of load_imi_file + . $BUILD_STEP_IMI +} # # fsyntax: dest_list_init @@ -393,18 +449,15 @@ dest_list_init () DEST_NAME= param_dbgout "SRCPKG_TOPDIR=$SRCPKG_TOPDIR\n" + # BUILD_DEST is defined in this file eval DEST_LIST_FILE="$DEST_LIST_FILE_EVL" . $DEST_LIST_FILE DEST_LIST="${BUILD_DEST//dest-/$'\ndest-'}" - - # load CFLAGS-MISC.imi - eval "BUILD_STEP_IMI=\"${BUILD_STEP_IMI_EVL}\"" - echo "BUILD_STEP_IMI=$BUILD_STEP_IMI" -# param_dbgout "BUILD_STEP_IMI=$BUILD_STEP_IMI\n" -# load_imi_file $BUILD_STEP_IMI - # use source instead of load_imi_file - . $BUILD_STEP_IMI + + buildparam_dbgout "###############################\n" + buildparam_dbgout "dest_list_init($DEST_LIST_FILE)\n" + buildparam_dbgout "DEST_LIST=\"$DEST_LIST\"\n" declare -g -A DEST_CFG_DIR=( ) # INST_PKG is defined in this file @@ -413,48 +466,6 @@ dest_list_init () } # -# fsyntax: construct_all_dest -# fdesc: construct all dest executables. -# -construct_all_dest () -{ - # - # load valid each dest. - # - if [[ -n $BUILD_DEST ]]; then -# BUILD_DEST="${BUILD_DEST//dest-/$'\ndest-'}" - for dest in $BUILD_DEST; do -# declare -g -A DEST_CFG_DIR[${dest#*dest.?-}]="${SRCPKG_TOPDIR}/build/$dest" - DEST_CFG_DIR_NAME="$dest" - construct_one_dest $dest - [[ $? != 0 ]] && err "${CHIGHL}[build-dest][${dest#*-}]: build dest file \"$dest\" err.${CNORMAL}" && return 1 - done -# DEST_LIST=( ${DEST_CFG_DIR[@]} ) -# echo DEST_CFG_DIR[@]=${DEST_CFG_DIR[@]} - else - err "no build dest defined in ${SRCPKG_TOPDIR}/build/dest/dest.list.\n" - return 1 - fi -} - -construct () -{ - construct_init - - TASK_RUNNING "BUILD_DEST_STEP" - - #compile_src_list -# construct_all_dest -} - - -############################## -# section: public function -############################## - -eval "SRCPKG_TOPDIR=\"$SRCPKG_TOPDIR_EVAL\"" - -# # fsyntax: construct_init # fdesc: init construct variables. # output: @@ -472,13 +483,14 @@ construct_init () if [[ -d build ]]; then SRCPKG_TOPDIR="" # SRCPKG_TOPDIR="$PWD" + eval "SRCPKG_TOPDIR_ABP=\"$PWD\"" elif [[ $(basename $PWD) == build ]]; then SRCPKG_TOPDIR="." # SRCPKG_TOPDIR="$(cd ..; pwd)" cd .. + eval "SRCPKG_TOPDIR_ABP=\"$PWD\"" fi # SRCPKG_TOPDIR="." - eval "SRCPKG_TOPDIR_ABP=\"$PWD\"" # if it has been defined, create src-pkg name sub-dir if [[ -z $OUTPUT_DIR ]]; then @@ -491,7 +503,6 @@ construct_init () fi date > ${OUTPUT_DIR}/build.log -# time >> ${OUTPUT_DIR}/build.log echo >> ${OUTPUT_DIR}/build.log # load srcpkg name & version string. @@ -509,6 +520,7 @@ construct_init () # load dest.list & build-step.imi to get dest list. dest_list_init + build_step_init # load srcpkg shlib file [[ -z $SRCPKG_NAME ]] && err "SRCPKG_NAME defined in file of doc/VERSION is not valid.\n" @@ -516,271 +528,20 @@ construct_init () } # -# fsyntax: get_CFLAGS -# fdesc: get CFLAGS. -# -get_CFLAGS () -{ - : -} - -# -# fsyntax: src2dst_filename -# fdesc: compile each src file. -# -src2dst_filename () -{ - local ext= - local dst= - ext="${SRC_FILE[0]##*.}" - - obj="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj//\.$ext/\.o}" - - DST_FILE[0]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${SRC_FILE[0]//\.$ext/\.o}" - DST_FILE[1]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${SRC_FILE[0]//\.$ext/\.dep}" - SRC_FILE[0]="${SRCPKG_TOPDIR}/${SRC_FILE[0]}" -} - -src_obj_map[s]="o" -src_obj_map[S]="o" -src_obj_map[c]="o" -src_obj_map[cpp]="o" - -src_obj_map[asm]="obj" -#src_obj_map[c]="obj" -#src_obj_map[cpp]="obj" - -# -# fsyntax: compile_src_file -# fdesc: compile each src file. -# -compile_src_file () -{ - local ret= - - SRC_FILE[0]="$1" - - src2dst_filename -# DST_FILE[0]="output/test.o" -# DST_FILE[1]="output/test.dep" - - CMPL_FUNC - - return $? -} - -foo () -{ -# local C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.list" - - echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE - if [[ -e $C_SRC_LIST_FILE ]]; then - . $C_SRC_LIST_FILE - C_SRC_LIST="${C_SRC_LIST//\.c/$'.c\n'}" - else - C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.lst" - echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE - [[ -e $C_SRC_LIST_FILE ]] && C_SRC_LIST=( $(cat $C_SRC_LIST_FILE | grep -v "^[[:space:]]*#" | sed -e "s/[[:space:]]*#.*$//g") ) - fi -} - -# -# fsyntax: compile_src_list -# fdesc: compile each src file in src file list. -# -compile_src_list () -{ - local file= - local c_src_list= - local cpp_src_list= - - for file in $C_SRC_CMPL_LIST $CPP_SRC_CMPL_LIST; do - [[ -z "$file" ]] && continue - compile_src_file $file - [[ $? != 0 ]] && err "${CHIGHL}[build-compile]: compile file \"$file\" err.${CNORMAL}" && return 1 - done - - return 0 -} - -OBJ_LIST= - -# -# fsyntax: check_and_get_src_compile_list -# fdesc: check if src file is newer then dest file in $obj, -# -check_and_get_src_compile_list () -{ - local obj= - local srcfile= - local dstfile= - local SRC_LIST_N2B_CMPL= - - #C_SRC_LIST="${C_SRC_LIST//.c/.c$'\n'}" - #echo C_SRC_LIST="${C_SRC_LIST}" - - # check if no file to be compiled, and return 0. - [[ -z ${C_SRC_LIST[@]} && -z ${CPP_SRC_LIST[@]} ]] && echo no src file in src list. && return 0 - - # - # CPP_SRC_LIST list. - # - if [[ -n "$C_SRC_LIST" ]]; then - # get compiled obj file list - OBJ_LIST_N2B_CPLE=`cd ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/; ls ${C_SRC_LIST[@]//\.c/\.o} 2>/dev/null` - - # test compiled obj file, to check if it need to be recompiled. - if [[ -n "$OBJ_LIST_N2B_CPLE" ]]; then - dbgoutd "OBJ_LIST_N2B_CPLE=${OBJ_LIST_N2B_CPLE}\n" - for obj in ${OBJ_LIST_N2B_CPLE}; do - srcfile="${obj//\.o/\.c}" - dstfile="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" - - # check if file does not need to be compiled. - if [[ "$dstfile" -nt "${srcfile}" ]]; then - SRC_LIST_N2B_CMPL+="${srcfile}"$'\n' - flag=compile - fi - done - fi - - # filter compiled file. - # compare two list, delete lines in C_SRC_LIST list with that in SRC_LIST_N2B_CMPL. - # and store it to C_SRC_CMPL_LIST. - if [[ -n $SRC_LIST_N2B_CMPL ]]; then - C_SRC_CMPL_LIST="`comm <(echo "$C_SRC_LIST" | sort) <(echo "$SRC_LIST_N2B_CMPL" | sort) | sed -e "/^\t/d"`" - else - C_SRC_CMPL_LIST="$C_SRC_LIST" - fi - - echo C_SRC_CMPL_LIST="$C_SRC_CMPL_LIST" - fi - - # - # CPP_SRC_LIST list. - # - if [[ -n "$CPP_SRC_LIST" ]]; then - # get compiled obj file list - OBJ_LIST_N2B_CPLE="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${CPP_SRC_LIST[@]//\.c/\.o}" - - # test compiled obj file, to check if it need to be recompiled. - if [[ -n "$OBJ_LIST_N2B_CPLE" ]]; then -# dbgoutd "OBJ_LIST_N2B_CPLE=${OBJ_LIST_N2B_CPLE}\n" - for obj in ${OBJ_LIST_N2B_CPLE}; do - srcfile="${obj//\.o/\.cpp}" - dstfile="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" - - # check if file does not need to be compiled. - if [[ "$dstfile" -nt "${srcfile}" ]]; then - SRC_LIST_N2B_CMPL+="${srcfile}"$'\n' - flag=compile - fi - done - fi - - [[ -n $SRC_LIST_N2B_CMPL ]] && CPP_SRC_CMPL_LIST="`comm <(echo "$CPP_SRC_LIST" | sort) <(echo "$SRC_LIST_N2B_CMPL" | sort) | sed -e "/^\t/d"`" - echo CPP_SRC_CMPL_LIST="$CPP_SRC_CMPL_LIST" - fi - - return 0 -} - -# -# fsyntax: dest_link_check -# fdesc: check dest if it is not exist, or file in $obj is newer then dest, +# construct_init +# construct_all_dest => dest_list_init()/construct_one_dest() => one_dest_init() => +# compile_src_list()/link_list() => c2o()/o2exe() # -dest_link_check () -{ - local obj= - local file= - local flag= - - #SRC_FILE=( ${DS3T_FILE[@]} ) - DST_FILE[0]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/$1" - - # translate src file list to obj file list - #[[ -n "$C_SRC_LIST" ]] && OBJ_LIST=" ${C_SRC_LIST[@]//\.c/\.o} " - #[[ -n "$CPP_SRC_LIST" ]] && OBJ_LIST+=" ${CPP_SRC_LIST[@]//\.cpp/\.o} " - # translate to multi-line form. - #OBJ_LIST="$(echo ${OBJ_LIST[@]} | tr -s ' ' $'\n')" - - #SRC_FILE=( `cd ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/; ls ${C_SRC_LIST[@]//\.c/\.o} 2>/dev/null` ) - SRC_FILE="${C_SRC_LIST[@]//\.c/\.o}" - SRC_FILE+=" ${CPP_SRC_LIST[@]//\.c/\.o}" - SRC_FILE="$(echo ${SRC_FILE} | tr '[\ |$'\\n']' ',')" -# if [[ ${SRC_FILE[@]: -1:1} == ',' ]]; then -# SRC_FILE="${SRC_FILE%,}" -# fi - SRC_FILE="ls ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/{${SRC_FILE:0:-1}} 2>/dev/null" - -# echo "$SRC_FILE" - #ls ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/{${SRC_FILE:0:-1}} 2>/dev/null" - -# set -x - SRC_FILE="`eval $SRC_FILE`" -# set +x - -# echo === SRC_FILE="${SRC_FILE[@]}" -# echo === DST_FILE="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${DST_FILE[@]}" - - flag=link; - if [[ -f ${DST_FILE[0]} ]]; then - # dest is linked, check if obj to be compiled. - - # do not use for loop here, especially in large number - # of file to be compiled. - # for obj in ${OBJ_LIST[@]}; do - while read obj; do - file="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" - echo file=$file - [[ -f $file && $file -nt ${DST_FILE[0]} ]] && flag=compile - #OBJ_LIST+="$obj"$'\n'; - done <<< "${SRC_FILE[@]}" - - echo "OBJ_LIST=$OBJ_LIST" - - [[ $flag == 'link' ]] && info "destination \"${DST_FILE[0]}\" has been existing." && return 1 - else - # if dest is not exist, all file should try to be recompiled. - return 0 - fi - - if [[ $flag == 'link' ]]; then - return 0 - else - return 1 - fi -} -# -# fsyntax: link_dest -# fdesc: link .o files to an executable. -# -link_dest () +construct () { -# SRC_FILE=( ${OBJ_LIST[@]} ) - DST_FILE="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/$1" - -# echo === SRC_LIST[@] = ${SRC_LIST[@]} -# echo === DST_FILE[@] = ${DST_FILE[@]} - - o2exe - [[ $? != 0 ]] && err "${CHIGHL}[build-link]: link file \"$1\" err.${CNORMAL}" && return 1 + construct_init - return 0 -# fi + TASK_RUNNING "STEP_BUILD_DEST" } -# -# construct_init -# construct_all_dest => dest_list_init()/construct_one_dest() => one_dest_init() => -# compile_src_list()/link_list() => c2o()/o2exe() -# - main_constructor () { - echo GNU_CC=$GNU_CC - # # program arguments resolve. # it invoke opt_desc_str_dispatch and prog_opt_proc seperatly, @@ -789,6 +550,7 @@ main_constructor () # 初始化测试的tmp目录路径,设置testcase的目录 # # prog_opt_dispatch "$@" + # opt_desc_str_dispatch scripttest_desc_str # opt_desc_str_dispatch another_desc_str # prog_opt_proc "$@" @@ -803,9 +565,10 @@ main_constructor () return } +########################################################################## +# +########################################################################## -#echo xxxxxxxxxxaaa -#exit main_constructor "$@" @@ -814,34 +577,3 @@ main_constructor "$@" # section: file tail ############################## - -# -# fsyntax: compile_src_list -# fdesc: compile each src file in src file list. -# -compile_src_list_bak () -{ - local abc= - local C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.list" - - echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE - if [[ -e $C_SRC_LIST_FILE ]]; then - . $C_SRC_LIST_FILE - C_SRC_LIST="${C_SRC_LIST//\.c/$'.c\n'}" - else - C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.lst" - echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE - [[ -e $C_SRC_LIST_FILE ]] && C_SRC_LIST=( $(cat $C_SRC_LIST_FILE | grep -v "^[[:space:]]*#" | sed -e "s/[[:space:]]*#.*$//g") ) - fi - - [[ -z ${C_SRC_LIST[@]} ]] && echo no src file in src list. && return 0 - - echo C_SRC_LIST=${C_SRC_LIST[$i]} - - while read file; do - [[ -z "$file" ]] && continue - - echo file=$file - compile_src_file $file - done < $C_SRC_LIST_FILE -} diff --git a/build/dest/NOTE.txt b/build/dest/NOTE.txt new file mode 100644 index 0000000..5a2b72d --- /dev/null +++ b/build/dest/NOTE.txt @@ -0,0 +1,119 @@ + +if false; then + +###################################################### + +STEP_PREV_CMPL="on_prev_cmpl()" + +# compile +STEP_CMPL="desttpchk() hdrtpchk() STEP_SRC_CMPL()" + +# STEP_SRC2EXE() +STEP_SRC2EXE=( [STEP_C_SRC2EXE] STEP_C_SRC2EXE STEP_CXX_SRC2EXE STEP_CPP_SRC2EXE STEP_ASM_SRC2EXE STEP_S_SRC2EXE ) +STEP_C_SRC2EXE=c2exe +STEP_CXX_SRC2EXE=cxx2exe +STEP_CPP_SRC2EXE=cpp2exe +STEP_ASM_SRC2EXE=asm2exe +STEP_S_SRC2EXE=asm2exe + +# STEP_SRC_CMPL and various kinds of STEP_SRC_CMPL. +STEP_SRC_CMPL=( [STEP_C_SRC_CMPL] STEP_C_SRC_CMPL STEP_CXX_SRC_CMPL STEP_CPP_SRC_CMPL STEP_ASM_SRC_CMPL STEP_S_SRC_CMPL ) +STEP_C_SRC_CMPL=c2o +STEP_CXX_SRC_CMPL=cxx2o +STEP_CPP_SRC_CMPL=cpp2o +STEP_ASM_SRC_CMPL=asm2o +STEP_S_SRC_CMPL=asm2o + +# kinds of LINK(). +STEP_LINK="steplink()" +#( [STEP_EXE_LINK] STEP_EXE_LINK STEP_DLL_LINK STEP_DRV_LINK STEP_LIB_LINK STEP_LA_LINK STEP_O_LINK STEP_LO_LINK ) +STEP_EXE_LINK="desttpchk o2exe" +STEP_DLL_LINK="desttpchk o2dll" +STEP_DRV_LINK="desttpchk o2drv" +STEP_LIB_LINK="desttpchk o2lib" +STEP_LA_LINK="desttpchk o2la" +STEP_O_LINK="desttpchk o2o" +STEP_LO_LINK="desttpchk o2lo" + +#STEP_ELF_LINK="desttpchk o2exe" +#STEP_SO_LINK="desttpchk o2dll" +#STEP_KO_LINK="desttpchk o2drv" +#STEP_A_LINK="desttpchk o2lib" + + +###################################################### + +# _SRC_LIST +# C_SRC_LIST= +# CPP_SRC_LIST= + +# C_EXELIST= +# C_OBJLIST= + + + + + + + +# @ build postage & previous¡£ +# CONFIG: config.h.in£¬.config£¬tmpl£¬config.h +# VERSION: VERSION£¬version.h£¬pkgname£¬ +# SCRIPT: +# @ build.cfg: +CONFIG_OPT=y +set obj_${CONFIG_OPT}= +obj_y= +obj_m= +obj_n= + + + + +# @ srclistʹÓÃÒ»×麯Êý½øÐÐʹÓá£add()/del()/foreach()/scan() +# @ build-step£¬dbg/rls + +# buildµÄ±í´ï£¬ÒÔinput-output-relationship±í´ï£¬µ¥¸öprocedureÒÔÒ»¸öname³Æºô£¬ÔËÐйý³ÌÌí¼Óµ½ÔËÐжÓÁУ¬Ê¹ÓÃtaskº¯Êýµ÷Óᣠ+# CMPL_DBG: INFO +# CMPL_PREV: SCRIPT +# srcdir: TASKLIST(CMPL)=>LINK +# src: CONFIG=>VERSION=>SCRIPT=> +# [src] obj exe info hexbin +# build: (CMPL)=>LINK=>INFO=>HEXBIN +# TASKLIST +# [srclist] objlist +# CMPL: .asm/.S/.c/.cc/.cpp/.vala +# LINK: exe/lib/dll/drv + +# @ kinds of constructor +# c£¬c2o£¬c2exe£¬ +# cpp£¬cpp2o£¬cpp2exe£¬ +# *vala£¬ +# srclist: TASKLIST(CMPL()) +# exelist[]: TASKLIST(SRC2EXE()) +# src£ºxxx2o()£¬o2i()£¬DEST_FILE_FMT="$(extset $SRC_FILE $srcext $dstext)"£¬extset(name£¬insfx£¬outsfx)£¬ +# exe£ºo2exe()/...£¬i2o()£¬extset(name£¬insfx£¬outsfx)£¬DEST_FILE_FMT="$DEST" +# dll£¬ +# lib£¬ +# drv£¬ +# cmpl-info +# @ codegen +# @ constructor + +# destÐÅÏ¢£¬ +# ¸÷ÖÖdestÀàÐ͵Ästep£¬ +# .c±àÒë֮ǰµÄ¸¨Öú½Å±¾£¬ +# config/versionÐÅÏ¢µÄgen£¬ +# dbg/rls°æ±¾£¬dbgÊä³ö±àÒëÎļþµÄinfo£¬±£´æΪlog¡£ +# ±àÒëÊä³ölogÐÅÏ¢£¬ +# strÊä³öÐÅÏ¢¡£ + +# @ taskʹÓÃpipe´¦Àítask²ÎÊý£¬ÔËÐбàÒ롣ʹÓÃdaemon³ÌÐòΪscheduler¡£ +# @ vartype(fundamental£¬sqltga£¬dataset/dataview£¬string£¬buff£¬stream£¬container£¬compo) + + + + + +fi + diff --git a/build/dest/build-step.imi b/build/dest/build-step.imi dissimilarity index 65% index 472a0bd..1e89ec8 100644 --- a/build/dest/build-step.imi +++ b/build/dest/build-step.imi @@ -1,563 +1,507 @@ - - - - -# -# [note] -# @ script test output info through stdout, current testing info through stderr. -# direction '>' re-direct compile infos from stdout. stderr is used as debug -# info. -# -# - - -# -# task and step defined as a variable with upper-char name string, -# func defined as a lower-char name string. -# it does not means upper-char name string must be a task or step, -# but it should be a task or step defination in normal. -# it is a bit similar with marcro name defination in c language. -# generally, a macro define is upper-char, and func/var name is -# lower-char. althought we can define upper-char func/var name string, -# but it's not better for code reading. -# - -# -# build sequence expression. -# @ in make file, it express build sequence with node define. -# one node is the combination of input, output, process cmd list. -# @ in build-pkg, it uses step list to show which steps should be invoking. -# there is a corresponding func associated with step. the inputs and outputs -# are described in the func. this func called TASK. -# - -###################################################### -# @ external list parameter. -# -# LANG_LIST -# HELPER_DOC_LIST, UMDOC_LIST, WEBDOC_LIST, -# DEST_LIST, -# C_SRC_LIST, CXX_SRC_LIST, CPP_SRC_LIST, ASM_SRC_LIST, -# ASFLAGS ASFLAGS_XXX -# CCFLAGS_XXX CFLAGS CXXFLAGS CPPFLAGS -# LDFLAGS LDFLAGS_XXX ARFLAGS ARFLAGS_XXX -# -# - - EXT_NAME[bin]="bin" - EXT_NAME[hex]="hex" - EXT_NAME[la]="la" - EXT_NAME[lo]="lo" -if [[ ${SYSTEM_TYPE,,} == linux ]]; then - EXT_NAME[exe]="" - EXT_NAME[dll]="so" - EXT_NAME[lib]="a" - EXT_NAME[drv]="ko" - EXT_NAME[obj]="o" - EXT_NAME[objlist]="o" - EXT_NAME[exelist]="" -elif [[ ${SYSTEM_TYPE,,} == windows ]]; then - EXT_NAME[exe]="exe" - EXT_NAME[dll]="dll" - EXT_NAME[lib]="lib" - EXT_NAME[drv]="sys" - EXT_NAME[obj]="obj" - EXT_NAME[objlist]="obj" - EXT_NAME[exelist]="exe" -elif [[ ${SYSTEM_TYPE,,} == mac ]]; then - EXT_NAME[exe]="" - EXT_NAME[dll]="so" - EXT_NAME[lib]="a" - EXT_NAME[drv]="o" - EXT_NAME[obj]="o" - EXT_NAME[objlist]="o" - EXT_NAME[exelist]="" -else - : -fi - - LANG_EXT_NAME[c]="c" - LANG_EXT_NAME[sh]="sh" -if [[ ${COMPILER_TYPE,,} == gcc ]]; then - LANG_EXT_NAME[cxx]="cc" - LANG_EXT_NAME[cpp]="cpp" - LANG_EXT_NAME[c++]="cpp" - LANG_EXT_NAME[asm]="S" -elif [[ ${SYSTEM_TYPE,,} == mac ]]; then - LANG_EXT_NAME[cxx]="cc" - LANG_EXT_NAME[cpp]="cpp" - LANG_EXT_NAME[c++]="cpp" - LANG_EXT_NAME[asm]="asm" -fi - -LANG_LIST="c -cxx -cpp -asm -sh" - -build_map=" -all ALL_STEP -full FULL_STEP -doc DOC_STEP -umdoc UMDOC_STEP -test TEST_STEP -src SRC_STEP -pkg PKG_STEP -" - -SRC_STEP="BUILD_DEST_STEP" - -DOC_STEP="" -UMDOC_STEP="" -TEST_STEP="" - -PKG_STEP="" -INST_STEP="" - -ALL_STEP="" -FULL_STEP="" - - -########################################################### -# pre-build step -########################################################### - -# wwwwwwww -# dest build step -PREPROC_STEP=" - TOOLCHAIN_CHK - DEV_ENV_CHK - DEP_LIB_CHK - DEP_SYSHDR_CHK - CONFIG_GEN - VERSION_GEN" - -# steps before dest-constructing. -TOOLCHAIN_CHK="toolchain_chk()" -DEV_ENV_CHK="dev_env_chk()" -DEP_LIB_CHK="dep_lib_chk()" -DEP_SYSHDR_CHK="dep_syshdr_chk()" - -CONFIG_GEN="config_gen()" -VERSION_GEN="version_gen()" - - -########################################################### -# build step -########################################################### - -# -# todo: -# @ append second parameter with item in first list. -# -# - -DEST_INIT_STEP="dest_init()" -# CONSTRUCT_INIT="construct_init()" - -BUILD_DEST_STEP=" - PRI_PREV_CONSTRUCT -# TASKLIST(DEST_LIST, DEST_BUILD) - TASKLIST(DEST_LIST, DEFAULT_DEST_STEP) - PRI_POST_CONSTRUCT" -DEFAULT_DEST_STEP=" - DEST_INIT_STEP(DEST_NAME) - PRI_PREV_DEST_BUILD - DEST_CHK(DEST_NAME) - LANG_TPCHK - TASKLIST(LANG_LIST, LANG_CMPL) - LINK(OBJ_LIST, DEST_NAME) - STRIP(DEBUG) - PROGINFO(DEBUG) - PRI_POST_DEST_BUILD" - -OBJLIST_DEST_STEP=" - OBJ2SRCLIST - TASKLIST(LANG_LIST, LANG_CMPL)" -EXELIST_DEST_STEP=" - TASKLIST(LANG_LIST, LANG_SRC2EXE) - STRIP(DEBUG)" - -HEX_DEST_STEP="deststep EXE2HEX" -BIN_DEST_STEP="deststep EXE2BIN" - -BUILD_DOC_STEP=" - TASKLIST(HELPER_DOC_LIST, DOC_BUILD) - TASKLIST(UMDOC_LIST, DOC_BUILD) - TASKLIST(WEBDOC_LIST, DOC_BUILD)" - - -########################################################### -# src build step -########################################################### - -TASKLIST="tasklist()" -STRIP="progstrip()" -PROGINFO="prog_sizeinfo()" - -DEST_BUILD="dest_build()" -LANG_TPCHK="lang_tpchk()" -LANG_CMPL="lang_cmpl()" -LANG_SRC2EXE="lang_src2exe()" - -############################################### -# src tp chk -# - -# C_SRC_LIST defined in .list file -C_LANG_TPCHK="c_lang_tpchk()" - -# CXX_SRC_LIST defined in .list file -CXX_LANG_TPCHK="cxx_lang_tpchk()" - -# CPP_SRC_LIST defined in .list file -CPP_LANG_TPCHK="cpp_lang_tpchk()" - -# ASM_SRC_LIST defined in .list file -ASM_LANG_TPCHK="asm_lang_tpchk()" - -# SH_SRC_LIST defined in .list file -SH_LANG_TPCHK="sh_lang_tpchk()" - - -############################################### -# src compile -# - -# C_SRC_LIST defined in .list file -C_LANG_CMPL="TASKLIST(C_SRC_LIST, C_SRC_CMPL)" -C_SRC_CMPL=" - PRI_PREV_CMPL - tpchk hdrtpchk c2o() - PRI_POST_CMPL" - -# CXX_SRC_LIST defined in .list file -CXX_LANG_CMPL="TASKLIST(CXX_SRC_LIST, CXX_SRC_CMPL)" -CXX_SRC_CMPL=" - PRI_PREV_CMPL - tpchk hdrtpchk cxx2o() - PRI_POST_CMPL" - -# CPP_SRC_LIST defined in .list file -CPP_LANG_CMPL="TASKLIST(CPP_SRC_LIST, CPP_SRC_CMPL)" -CPP_SRC_CMPL=" - PRI_PREV_CMPL - tpchk hdrtpchk cpp2o() - PRI_POST_CMPL" - -# ASM_SRC_LIST defined in .list file -ASM_LANG_CMPL="TASKLIST(ASM_SRC_LIST, ASM_SRC_CMPL)" -ASM_SRC_CMPL=" - PRI_PREV_CMPL - tpchk hdrtpchk asm2o() - PRI_POST_CMPL" - -# SH_SRC_LIST defined in .list file -SH_LANG_CMPL="TASKLIST(SH_SRC_LIST, SH_SRC_CMPL)" -SH_SRC_CMPL=" - PRI_PREV_CMPL - tpchk hdrtpchk sh2o() - PRI_POST_CMPL" - -############################################### -# src2exe -# - -# C_SRC_LIST defined in .list file -C_LANG_SRC2EXE="TASKLIST(C_SRC_LIST, C_SRC2EXE)" -C_SRC2EXE=" - PRI_PREV_CMPL - PRI_PREV_LINK - tpchk hdrtpchk c2exe() - PRI_POST_CMPL - PRI_POST_LINK" - -# CXX_SRC_LIST defined in .list file -CXX_LANG_SRC2EXE="TASKLIST(CXX_SRC_LIST, CXX_SRC2EXE)" -CXX_SRC2EXE=" - PRI_PREV_CMPL - PRI_PREV_LINK - tpchk hdrtpchk cxx2exe() - PRI_POST_CMPL - PRI_POST_LINK" - -# CPP_SRC_LIST defined in .list file -CPP_LANG_SRC2EXE="TASKLIST(CPP_SRC_LIST, CPP_SRC2EXE)" -CPP_SRC2EXE=" - PRI_PREV_CMPL - PRI_PREV_LINK - tpchk hdrtpchk cpp2exe() - PRI_POST_CMPL - PRI_POST_LINK" - -# ASM_SRC_LIST defined in .list file -ASM_LANG_SRC2EXE="TASKLIST(ASM_SRC_LIST, ASM_SRC2EXE)" -ASM_SRC2EXE=" - PRI_PREV_CMPL - PRI_PREV_LINK - tpchk hdrtpchk asm2exe() - PRI_PREV_CMPL - PRI_POST_LINK" - -# SH_SRC_LIST defined in .list file -SH_LANG_SRC2EXE="TASKLIST(SH_SRC_LIST, SH_SRC2EXE)" -SH_SRC2EXE=" - PRI_PREV_CMPL - PRI_PREV_LINK - tpchk hdrtpchk sh2exe() - PRI_POST_CMPL - PRI_POST_LINK" - -############################################### -# link -# - -# LINK() -LINK=( [EXE_LINK] EXE_LINK DLL_LINK DRV_LINK LIB_LINK LA_LINK O_LINK LO_LINK ) -EXE_LINK=" - PRI_PREV_LINK - tpchk o2exe - PRI_POST_LINK" -DLL_LINK=" - PRI_PREV_LINK - tpchk o2dll - PRI_POST_LINK" -DRV_LINK=" - PRI_PREV_LINK - tpchk o2drv - PRI_POST_LINK" -LIB_LINK=" - PRI_PREV_LINK - tpchk o2lib - PRI_POST_LINK" -LA_LINK=" - PRI_PREV_LINK - tpchk o2la - PRI_POST_LINK" -O_LINK=" - PRI_PREV_LINK - tpchk o2o - PRI_POST_LINK" -LO_LINK=" - PRI_PREV_LINK - tpchk o2lo - PRI_POST_LINK" - -#ELF_LINK="tpchk o2exe" -#SO_LINK="tpchk o2dll" -#KO_LINK="tpchk o2drv" -#A_LINK="tpchk o2lib" - - -############################################### -# prev-post-proc -# - -# private steps in a dest-constructing. -PRI_PREV_CONSTRUCT="on_prev_construct()" -PRI_POST_CONSTRUCT="on_post_construct()" -PRI_PREV_DEST_BUILD="on_prev_dest_build()" -PRI_POST_DEST_BUILD="on_post_dest_build()" -PRI_PREV_CMPL="on_prev_cmpl()" -PRI_POST_CMPL="on_post_cmpl()" -PRI_PREV_LINK="on_prev_link()" -PRI_POST_LINK="on_post_link()" -PRI_PREV_INSTPKG_GEN="on_prev_instpkg_gen()" -PRI_POST_INSTPKG_GEN="on_post_instpkg_gen()" -PRI_PREV_ARCH_BUILD="on_prev_arch_build()" -PRI_POST_ARCH_BUILD="on_post_arch_build()" - - -################################################################# -# document gen. -DOC_GEN=( -"[TEX_2_MAN TEX_2_TXT TEX_2_PDF TEX_2_HTML MD_2_HTML HTML_2_CHM ]" -INFO_2_MAN -INFO_2_HTML -INFO_2_PDF -TEX_2_MAN -TEX_2_INFO -TEX_2_TXT -TEX_2_PDF -TEX_2_HTML -TEX_2_DVI -TEX_2_DOCBOOK -DOCBOOK_2_TXT -DOCBOOK_2_PDF -DOCBOOK_2_HTML -DOCBOOK_2_DVI -MD_2_HTML -RST_2_HTML -HTML_2_CHM -) -INFO_2_MAN="info_2_man()" -INFO_2_HTML="info_2_html()" -INFO_2_PDF="info_2_pdf()" -TEX_2_MAN="tex_2_man()" -TEX_2_INFO="tex_2_info()" -TEX_2_TXT="tex_2_txt()" -TEX_2_PDF="tex_2_pdf()" -TEX_2_HTML="tex_2_html()" -TEX_2_DVI="tex_2_dvi()" -TEX_2_DOCBOOK="tex_2_docbook()" -DOCBOOK_2_TXT="docbook_2_txt()" -DOCBOOK_2_PDF="docbook_2_pdf()" -DOCBOOK_2_HTML="docbook_2_html()" -DOCBOOK_2_DVI="docbook_2_dvi()" - -MD_2_HTML="md2html()" -RST_2_HTML="rst2html()" -HTML_2_CHM="html2chm()" - -# others -APIDOC_GEN="apidocgen()" -GRAPHVIZE_GEN="graphvize()" - -################################################################# -# intl -INTL_GEN="intl()" - - - - - - - - - - - - - - -###################################################### - -PREV_CMPL="on_prev_cmpl()" - -# compile -CMPL="tpchk() hdrtpchk() SRC_CMPL()" - -# SRC2EXE() -SRC2EXE=( [C_SRC2EXE] C_SRC2EXE CXX_SRC2EXE CPP_SRC2EXE ASM_SRC2EXE S_SRC2EXE ) -C_SRC2EXE=c2exe -CXX_SRC2EXE=cxx2exe -CPP_SRC2EXE=cpp2exe -ASM_SRC2EXE=asm2exe -S_SRC2EXE=asm2exe - -# SRC_CMPL and various kinds of SRC_CMPL. -SRC_CMPL=( [C_SRC_CMPL] C_SRC_CMPL CXX_SRC_CMPL CPP_SRC_CMPL ASM_SRC_CMPL S_SRC_CMPL ) -C_SRC_CMPL=c2o -CXX_SRC_CMPL=cxx2o -CPP_SRC_CMPL=cpp2o -ASM_SRC_CMPL=asm2o -S_SRC_CMPL=asm2o - -# kinds of LINK(). -LINK=( [EXE_LINK] EXE_LINK DLL_LINK DRV_LINK LIB_LINK LA_LINK O_LINK LO_LINK ) -EXE_LINK="tpchk o2exe" -DLL_LINK="tpchk o2dll" -DRV_LINK="tpchk o2drv" -LIB_LINK="tpchk o2lib" -LA_LINK="tpchk o2la" -O_LINK="tpchk o2o" -LO_LINK="tpchk o2lo" - -#ELF_LINK="tpchk o2exe" -#SO_LINK="tpchk o2dll" -#KO_LINK="tpchk o2drv" -#A_LINK="tpchk o2lib" - - -###################################################### - -# _SRC_LIST -# C_SRC_LIST= -# CPP_SRC_LIST= - -# C_EXELIST= -# C_OBJLIST= - - - - - - - -# @ build postage & previous。 -# CONFIG: config.h.in,.config,tmpl,config.h -# VERSION: VERSION,version.h,pkgname, -# SCRIPT: -# @ build.cfg: -CONFIG_OPT=y -set obj_${CONFIG_OPT}= -obj_y= -obj_m= -obj_n= - - - - -# @ srclist使用一组函数进行使用。add()/del()/foreach()/scan() -# @ build-step,dbg/rls - -# build的表达,以input-output-relationship表达,单个procedure以一个name称呼,运行过程添加到运行队列,使用task函数调用。 -# CMPL_DBG: INFO -# CMPL_PREV: SCRIPT -# srcdir: TASKLIST(CMPL)=>LINK -# src: CONFIG=>VERSION=>SCRIPT=> -# [src] obj exe info hexbin -# build: (CMPL)=>LINK=>INFO=>HEXBIN -# TASKLIST -# [srclist] objlist -# CMPL: .asm/.S/.c/.cc/.cpp/.vala -# LINK: exe/lib/dll/drv - -# @ kinds of constructor -# c,c2o,c2exe, -# cpp,cpp2o,cpp2exe, -# *vala, -# srclist: TASKLIST(CMPL()) -# exelist[]: TASKLIST(SRC2EXE()) -# src:xxx2o(),o2i(),DEST_FILE_FMT="$(extset $SRC_FILE $srcext $dstext)",extset(name,insfx,outsfx), -# exe:o2exe()/...,i2o(),extset(name,insfx,outsfx),DEST_FILE_FMT="$DEST" -# dll, -# lib, -# drv, -# cmpl-info -# @ codegen -# @ constructor - -# dest信息, -# 各种dest类型的step, -# .c编译之前的辅助脚本, -# config/version信息的gen, -# dbg/rls版本,dbg输出编译文件的info,保存为log。 -# 编译输出log信息, -# str输出信息。 - -# @ task使用pipe处理task参数,运行编译。使用daemon程序为scheduler。 -# @ vartype(fundamental,sqltga,dataset/dataview,string,buff,stream,container,compo) - - - - - - - - - - - - - - - - - - - - - - + + + + +# +# [note] +# @ script test output info through stdout, current testing info through stderr. +# direction '>' re-direct compile infos from stdout. stderr is used as debug +# info. +# +# + + +# +# task and step defined as a variable with upper-char name string, +# func defined as a lower-char name string. +# it does not means upper-char name string must be a task or step, +# but it should be a task or step defination in normal. +# it is a bit similar with marcro name defination in c language. +# generally, a macro define is upper-char, and func/var name is +# lower-char. althought we can define upper-char func/var name string, +# but it's not better for code reading. +# + +# +# build sequence expression. +# @ in make file, it express build sequence with node define. +# one node is the combination of input, output, process cmd list. +# @ in build-pkg, it uses step list to show which steps should be invoking. +# there is a corresponding func associated with step. the inputs and outputs +# are described in the func. this func called TASK. +# + +###################################################### +# @ external list parameter. +# +# LANG_LIST +# HELPER_DOC_LIST, UMDOC_LIST, WEBDOC_LIST, +# DEST_LIST, +# C_SRC_LIST, CXX_SRC_LIST, CPP_SRC_LIST, ASM_SRC_LIST, +# ASFLAGS ASFLAGS_XXX +# CCFLAGS_XXX CFLAGS CXXFLAGS CPPFLAGS +# LDFLAGS LDFLAGS_XXX ARFLAGS ARFLAGS_XXX +# +# + +declare -g -A EXT_NAME +declare -g -A LANG_EXT_NAME + +COMPILER_TYPE=gcc +SYSTEM_TYPE=linux + + +# +# file name sfx define. +# + + EXT_NAME[bin]="bin" + EXT_NAME[hex]="hex" + EXT_NAME[la]="la" + EXT_NAME[lo]="lo" +if [[ ${SYSTEM_TYPE,,} == linux ]]; then + EXT_NAME[exe]="" + EXT_NAME[dll]="so" + EXT_NAME[lib]="a" + EXT_NAME[drv]="ko" + EXT_NAME[obj]="o" + EXT_NAME[objlist]="o" + EXT_NAME[exelist]="" +elif [[ ${SYSTEM_TYPE,,} == windows ]]; then + EXT_NAME[exe]="exe" + EXT_NAME[dll]="dll" + EXT_NAME[lib]="lib" + EXT_NAME[drv]="sys" + EXT_NAME[obj]="obj" + EXT_NAME[objlist]="obj" + EXT_NAME[exelist]="exe" +elif [[ ${SYSTEM_TYPE,,} == mac ]]; then + EXT_NAME[exe]="" + EXT_NAME[dll]="so" + EXT_NAME[lib]="a" + EXT_NAME[drv]="o" + EXT_NAME[obj]="o" + EXT_NAME[objlist]="o" + EXT_NAME[exelist]="" +else + : +fi + + LANG_EXT_NAME[c]="c" + LANG_EXT_NAME[sh]="sh" +if [[ ${COMPILER_TYPE,,} == gcc ]]; then + LANG_EXT_NAME[cxx]="cc" + LANG_EXT_NAME[cpp]="cpp" + LANG_EXT_NAME[c++]="cpp" + LANG_EXT_NAME[asm]="S" +elif [[ ${SYSTEM_TYPE,,} == mac ]]; then + LANG_EXT_NAME[cxx]="cc" + LANG_EXT_NAME[cpp]="cpp" + LANG_EXT_NAME[c++]="cpp" + LANG_EXT_NAME[asm]="asm" +fi + +# +# lang set define. it can be re-setted in src-pkg. +# +LANG_LIST="c +cxx +cpp +asm +sh" + +# +# build sub-cmd map to step. +# +build_map=" +default STEP_DEFAULT +all STEP_ALL +full STEP_FULL +doc STEP_DOC +umdoc STEP_UMDOC +test STEP_TEST +src STEP_SRC +pkg STEP_PKG +" + +STEP_SRC="STEP_BUILD_DEST" + +STEP_DOC="" +STEP_UMDOC="" +STEP_TEST="" + +STEP_PKG="" +STEP_INST="" + +STEP_DEFAULT="" +STEP_ALL="" +STEP_FULL="" + + +########################################################### +# pre-build step +########################################################### + +# wwwwwwww +# dest build step +STEP_PREPROC=" + STEP_TOOLCHAIN_CHK + STEP_DEV_ENV_CHK + STEP_DEP_LIB_CHK + STEP_DEP_SYSHDR_CHK + STEP_CONFIG_GEN + STEP_VERSION_GEN" + +# steps before dest-constructing. +STEP_TOOLCHAIN_CHK="toolchain_chk()" +STEP_DEV_ENV_CHK="dev_env_chk()" +STEP_DEP_LIB_CHK="dep_lib_chk()" +STEP_DEP_SYSHDR_CHK="dep_syshdr_chk()" + +STEP_CONFIG_GEN="config_gen()" +STEP_VERSION_GEN="version_gen()" + + +########################################################### +# main compile build step +########################################################### + +# +# todo: +# @ append second parameter with item in first list. +# +# + +STEP_DEST_INIT="dest_init()" +# STEP_CONSTRUCT_INIT="construct_init()" + +STEP_BUILD_DEST=" + STEP_PRI_PREV_CONSTRUCT + TASKLIST(DEST_LIST, STEP_DEFAULT_DEST) + STEP_PRI_POST_CONSTRUCT" + +STEP_DEFAULT_DEST=" + STEP_DEST_INIT(DEST_NAME) + STEP_PRI_PREV_DEST_BUILD + STEP_DEST_CHK(DEST_NAME) + TASKLIST(LANG_LIST, STEP_LANG_SRC_TPCHK) + TASKLIST(LANG_LIST, STEP_LANG_CMPL) + STEP_LINK(OBJ_LIST, DEST_FILENAME) + STEP_PROGINFO(DEBUG) + STEP_PRI_POST_DEST_BUILD" + +# TBD: append corresponding dest steps, +# some of them need STRIP in non DEBUG version. +# STEP_STRIP(DEBUG) + +# TBD: +# STEP_OBJLIST2SRCLIST=objlist2srclist + +STEP_EXE_DEST="STEP_DEFAULT_DEST STEP_STRIP(DEBUG) " +STEP_DLL_DEST="STEP_DEFAULT_DEST STEP_STRIP(DEBUG) " +STEP_LIB_DEST="STEP_DEFAULT_DEST" +STEP_DRV_DEST="STEP_DEFAULT_DEST STEP_STRIP(DEBUG) " +STEP_LA_DEST="STEP_DEFAULT_DEST" +STEP_LO_DEST="STEP_DEFAULT_DEST" +STEP_OBJ_DEST="STEP_DEFAULT_DEST" + +STEP_OBJLIST_DEST=" + STEP_OBJLIST2SRCLIST + TASKLIST(LANG_LIST, STEP_LANG_CMPL)" +STEP_EXELIST_DEST=" + TASKLIST(LANG_LIST, STEP_LANG_SRC2EXE) + TASKLIST(LANG_LIST, STEP_STRIP(DEBUG))" + +STEP_HEX_DEST="STEP_DEFAULT_DEST STEP_EXE2HEX" +STEP_BIN_DEST="STEP_DEFAULT_DEST STEP_EXE2BIN" + + +########################################################### +# DOC build step +########################################################### + +# TBD: have not been implemented. +STEP_BUILD_DOC=" + TASKLIST(HELPER_DOC_LIST, STEP_DOC_BUILD) + TASKLIST(UMDOC_LIST, STEP_DOC_BUILD) + TASKLIST(WEBDOC_LIST, STEP_DOC_BUILD)" + + +########################################################### +# src build step +########################################################### + +TASKLIST="tasklist()" +STEP_STRIP="progstrip()" +STEP_PROGINFO="prog_sizeinfo()" + +STEP_LANG_SRC_TPCHK="lang_src_tpchk()" +STEP_LANG_CMPL=" +lang_cmpl()" +# TBD: +STEP_LANG_SRC2EXE="lang_src2exe()" + + +#lang_src_tpchk() +#STEP_LANG_HDRTPCHK="lang_hdrtpchk()" + +############################################### +# src tp chk +# hdrtpchk() is included in tpchk(). +# this step decrease files to be compiled. +# in compile step, it will run tpchk() and hdrtpchk() +# again. +# + +# _SRC_LIST defined in .list file +STEP_C_LANG_SRC_TPCHK="c_lang_src_tpchk()" +STEP_CXX_LANG_SRC_TPCHK="cxx_lang_src_tpchk()" +STEP_CPP_LANG_SRC_TPCHK="cpp_lang_src_tpchk()" +STEP_ASM_LANG_SRC_TPCHK="asm_lang_src_tpchk()" +STEP_SH_LANG_SRC_TPCHK="sh_lang_src_tpchk()" + + +############################################### +# src compile +# + +# +# dest names are named as "exe/dll/lib/drv", it'scan +# the short name of output file, it doesn't means +# that it uses windows sytle name. if it use 'elf' for +# a executable file, it's not general in various env. +# + +# C_SRC_LIST defined in .list file +STEP_C_LANG_CMPL="TASKLIST(C_SRC_CMPL_LIST, STEP_C_SRC_CMPL)" +STEP_C_SRC_CMPL=" + STEP_PRI_PREV_CMPL + tpchk() + hdrtpchk() + c2o() + STEP_PRI_POST_CMPL" + +# CXX_SRC_LIST defined in .list file +STEP_CXX_LANG_CMPL="TASKLIST(CXX_SRC_CMPL_LIST, STEP_CXX_SRC_CMPL)" +STEP_CXX_SRC_CMPL=" + STEP_PRI_PREV_CMPL + tpchk() + hdrtpchk() + cxx2o() + STEP_PRI_POST_CMPL" + +# CPP_SRC_LIST defined in .list file +STEP_CPP_LANG_CMPL="TASKLIST(CPP_SRC_CMPL_LIST, STEP_CPP_SRC_CMPL)" +STEP_CPP_SRC_CMPL=" + STEP_PRI_PREV_CMPL + tpchk() + hdrtpchk() + cpp2o() + STEP_PRI_POST_CMPL" + +# ASM_SRC_LIST defined in .list file +STEP_ASM_LANG_CMPL="TASKLIST(ASM_SRC_CMPL_LIST, STEP_ASM_SRC_CMPL)" +STEP_ASM_SRC_CMPL=" + STEP_PRI_PREV_CMPL + tpchk() + hdrtpchk() + asm2o() + STEP_PRI_POST_CMPL" + +# SH_SRC_LIST defined in .list file +STEP_SH_LANG_CMPL="TASKLIST(SH_SRC_CMPL_LIST, STEP_SH_SRC_CMPL)" +STEP_SH_SRC_CMPL=" + STEP_PRI_PREV_CMPL + tpchk() + hdrtpchk() + sh2o() + STEP_PRI_POST_CMPL" + +############################################### +# src2exe +# + +# C_SRC_LIST defined in .list file +STEP_C_LANG_SRC2EXE="TASKLIST(C_SRC_LIST, STEP_C_SRC2EXE)" +STEP_C_SRC2EXE=" + STEP_PRI_PREV_CMPL + STEP_PRI_PREV_LINK + tpchk() + hdrtpchk() + c2exe() + STEP_PRI_POST_CMPL + STEP_PRI_POST_LINK" + +# CXX_SRC_LIST defined in .list file +STEP_CXX_LANG_SRC2EXE="TASKLIST(CXX_SRC_LIST, STEP_CXX_SRC2EXE)" +STEP_CXX_SRC2EXE=" + STEP_PRI_PREV_CMPL + STEP_PRI_PREV_LINK + tpchk() + hdrtpchk() + STEP_cxx2exe() + STEP_PRI_POST_CMPL + STEP_PRI_POST_LINK" + +# CPP_SRC_LIST defined in .list file +STEP_CPP_LANG_SRC2EXE="TASKLIST(CPP_SRC_LIST, STEP_CPP_SRC2EXE)" +STEP_CPP_SRC2EXE=" + STEP_PRI_PREV_CMPL + STEP_PRI_PREV_LINK + tpchk() + hdrtpchk() + cpp2exe() + STEP_PRI_POST_CMPL + STEP_PRI_POST_LINK" + +# ASM_SRC_LIST defined in .list file +STEP_ASM_LANG_SRC2EXE="TASKLIST(ASM_SRC_LIST, STEP_ASM_SRC2EXE)" +STEP_ASM_SRC2EXE=" + STEP_PRI_PREV_CMPL + STEP_PRI_PREV_LINK + tpchk() + hdrtpchk() + asm2exe() + STEP_PRI_PREV_CMPL + STEP_PRI_POST_LINK" + +# SH_SRC_LIST defined in .list file +STEP_SH_LANG_SRC2EXE="TASKLIST(SH_SRC_LIST, STEP_SH_SRC2EXE)" +STEP_SH_SRC2EXE=" + STEP_PRI_PREV_CMPL + STEP_PRI_PREV_LINK + tpchk() + hdrtpchk() + sh2exe() + STEP_PRI_POST_CMPL + STEP_PRI_POST_LINK" + +############################################### +# link +# + +# LINK() +STEP_LINK="step_link()" + +# build steps below is setted accroding DEST_TYPE in dest.imi +STEP_EXE_LINK=" + STEP_PRI_PREV_LINK + desttpchk() + o2exe() + STEP_PRI_POST_LINK" +STEP_DLL_LINK=" + STEP_PRI_PREV_LINK + desttpchk() + o2dll() + STEP_PRI_POST_LINK" +STEP_DRV_LINK=" + STEP_PRI_PREV_LINK + desttpchk() + o2drv() + STEP_PRI_POST_LINK" +STEP_LIB_LINK=" + STEP_PRI_PREV_LINK + desttpchk() + o2lib() + STEP_PRI_POST_LINK" +STEP_LA_LINK=" + STEP_PRI_PREV_LINK + desttpchk() + o2la() + STEP_PRI_POST_LINK" +STEP_O_LINK=" + STEP_PRI_PREV_LINK + desttpchk() + o2o() + STEP_PRI_POST_LINK" +STEP_LO_LINK=" + STEP_PRI_PREV_LINK + desttpchk() + o2lo() + STEP_PRI_POST_LINK" + + +############################################### +# prev-post-proc +# those proc functions are defined in .shlib, +# it's a privaate function for a srcpkg. +# + +# private steps in a dest-constructing. +STEP_PRI_PREV_CONSTRUCT="on_prev_construct()" +STEP_PRI_POST_CONSTRUCT="on_post_construct()" +STEP_PRI_PREV_DEST_BUILD="on_prev_dest_build()" +STEP_PRI_POST_DEST_BUILD="on_post_dest_build()" +STEP_PRI_PREV_CMPL="on_prev_cmpl()" +STEP_PRI_POST_CMPL="on_post_cmpl()" +STEP_PRI_PREV_LINK="on_prev_link()" +STEP_PRI_POST_LINK="on_post_link()" +STEP_PRI_PREV_INSTPKG_GEN="on_prev_instpkg_gen()" +STEP_PRI_POST_INSTPKG_GEN="on_post_instpkg_gen()" +STEP_PRI_PREV_ARCH_BUILD="on_prev_arch_build()" +STEP_PRI_POST_ARCH_BUILD="on_post_arch_build()" + + +################################################################# +# document gen. +# TBD: + +STEP_DOC_GEN=( +"[STEP_TEX_2_MAN STEP_TEX_2_TXT STEP_TEX_2_PDF STEP_TEX_2_HTML STEP_MD_2_HTML STEP_HTML_2_CHM ]" +STEP_INFO_2_MAN +STEP_INFO_2_HTML +STEP_INFO_2_PDF +STEP_TEX_2_MAN +STEP_TEX_2_INFO +STEP_TEX_2_TXT +STEP_TEX_2_PDF +STEP_TEX_2_HTML +STEP_TEX_2_DVI +STEP_TEX_2_DOCBOOK +STEP_DOCBOOK_2_TXT +STEP_DOCBOOK_2_PDF +STEP_DOCBOOK_2_HTML +STEP_DOCBOOK_2_DVI +STEP_MD_2_HTML +STEP_RST_2_HTML +STEP_HTML_2_CHM +) + +GEN_DOC_TYPE_LIST=" +STEP_TEX_2_MAN +STEP_TEX_2_TXT +STEP_TEX_2_PDF +STEP_TEX_2_HTML +STEP_MD_2_HTML +STEP_HTML_2_CHM" + +STEP_DOC_GEN="TASKLIST(GEN_DOC_TYPE_LIST, doc_gen())" + +STEP_INFO_2_MAN="info_2_man()" +STEP_INFO_2_HTML="info_2_html()" +STEP_INFO_2_PDF="info_2_pdf()" +STEP_TEX_2_MAN="tex_2_man()" +STEP_TEX_2_INFO="tex_2_info()" +STEP_TEX_2_TXT="tex_2_txt()" +STEP_TEX_2_PDF="tex_2_pdf()" +STEP_TEX_2_HTML="tex_2_html()" +STEP_TEX_2_DVI="tex_2_dvi()" +STEP_TEX_2_DOCBOOK="tex_2_docbook()" +STEP_DOCBOOK_2_TXT="docbook_2_txt()" +STEP_DOCBOOK_2_PDF="docbook_2_pdf()" +STEP_DOCBOOK_2_HTML="docbook_2_html()" +STEP_DOCBOOK_2_DVI="docbook_2_dvi()" + +STEP_MD_2_HTML="md2html()" +STEP_RST_2_HTML="rst2html()" +STEP_HTML_2_CHM="html2chm()" + +# others +STEP_APIDOC_GEN="apidocgen()" +STEP_GRAPHVIZE_GEN="graphvize()" + +################################################################# +# intl +# TBD: +STEP_INTL_GEN="intl()" + diff --git a/build/dest/dest-bconfig/LDFLAGS-LIB.list b/build/dest/dest-bconfig/LDFLAGS-LIB.list index 7b05891..58fd24e 100644 --- a/build/dest/dest-bconfig/LDFLAGS-LIB.list +++ b/build/dest/dest-bconfig/LDFLAGS-LIB.list @@ -1,5 +1,5 @@ # libs -#LDFLAGS_LIBS+="-lncurses " +LDFLAGS_LIBS+="-lconfig" diff --git a/build/dest/dest-bconfig/c-src-file.list b/build/dest/dest-bconfig/c-src-file.list dissimilarity index 93% index b935735..b26e46b 100644 --- a/build/dest/dest-bconfig/c-src-file.list +++ b/build/dest/dest-bconfig/c-src-file.list @@ -1,28 +1,5 @@ - -# lib-list - -#C_SRC_LIST+="src/bconfig/conf.dir/conf.c" -#C_SRC_LIST+="src/bconfig/conf.dir/confdata.c" -#C_SRC_LIST+="src/bconfig/conf.dir/gconf.c" -C_SRC_LIST+="src/bconfig/conf.dir/mconf.c" -#C_SRC_LIST+="src/bconfig/conf.dir/nconf.c" -#C_SRC_LIST+="src/bconfig/conf.dir/nconf.gui.c" - -C_SRC_LIST+="src/bconfig/lxdialog/checklist.c" -C_SRC_LIST+="src/bconfig/lxdialog/inputbox.c" -C_SRC_LIST+="src/bconfig/lxdialog/menubox.c" -C_SRC_LIST+="src/bconfig/lxdialog/textbox.c" -C_SRC_LIST+="src/bconfig/lxdialog/util.c" -C_SRC_LIST+="src/bconfig/lxdialog/yesno.c" - -C_SRC_LIST+="src/bconfig/lxrgmr/zconf.tab.c" - -#C_SRC_LIST+="src/bconfig/lxrgmr/kconf_id.c" -#C_SRC_LIST+="src/bconfig/lxrgmr/zconf.lex.c" -#C_SRC_LIST+="src/bconfig/src/expr.c" -#C_SRC_LIST+="src/bconfig/src/images.c" -#C_SRC_LIST+="src/bconfig/src/kxgettext.c" -#C_SRC_LIST+="src/bconfig/src/menu.c" -#C_SRC_LIST+="src/bconfig/src/symbol.c" -#C_SRC_LIST+="src/bconfig/src/util.c" - + +# lib-list + +C_SRC_LIST+="src/bconfig/conf.dir/mconf.c" + diff --git a/build/dest/dest-bconfig/dest.imi b/build/dest/dest-bconfig/dest.imi index b092b65..d0493f3 100644 --- a/build/dest/dest-bconfig/dest.imi +++ b/build/dest/dest-bconfig/dest.imi @@ -1,18 +1,39 @@ -[global] -destname=bconfig +[ global ] +DEST_NAME=bconfig # dest type -desttype=( +DEST_TYPE=( [exe] exe dll drv lib bin hex exelist objlist la obj lo ) # elf/exe so/dll ko/drv a/lib +DEST_FILENAME=bconfig + # on linux system, binaray executable does not have extname. # on win system, it is ".exe" # on linux, dynamic lib is ".so" file # on win, it is ".dll". # this parameter can be generated automatically by desttype. -extname="" +DEST_EXTNAME="" +DEST_BUILD_STEP= + +# parameters file to load +[ load ] +BUILD_INIT_PARAM_FILE_LIST=( +ARFLAGS-MISC.imi +CFLAGS-DBG.imi +CFLAGS-DEF.list +CFLAGS-INCPATH.list +CFLAGS-MISC.imi +dep-pkg.list +LDFLAGS-DBG.imi +LDFLAGS-LIB.list +LDFLAGS-LIBPATH.list +LDFLAGS-MISC.imi +opt.imi) + + + diff --git a/build/dest/dest-bconfig/paramters.imi b/build/dest/dest-bconfig/paramters.imi index 79a12bf..3cb3a69 100644 --- a/build/dest/dest-bconfig/paramters.imi +++ b/build/dest/dest-bconfig/paramters.imi @@ -2,6 +2,6 @@ # disable general paramter by '#'. CFLAGS_EVL="${CFLAGS_DEF} ${CFLAGS_INCPATH} ${CFLAGS_DBG} ${CFLAGS_SHARE}" -LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS}" +LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS} ${LDFLAGS_GLOBAL_LIBS}" diff --git a/build/dest/dest-bconfig/CFLAGS-INCPATH.list b/build/dest/dest-bconfig/tmp/CFLAGS-INCPATH.list similarity index 100% rename from build/dest/dest-bconfig/CFLAGS-INCPATH.list rename to build/dest/dest-bconfig/tmp/CFLAGS-INCPATH.list diff --git a/build/dest/dest-bconfig/CFLAGS.imi b/build/dest/dest-bconfig/tmp/CFLAGS.imi similarity index 100% rename from build/dest/dest-bconfig/CFLAGS.imi rename to build/dest/dest-bconfig/tmp/CFLAGS.imi diff --git a/build/dest/dest-bconfig/LDFLAGS-LIBPATH.list b/build/dest/dest-bconfig/tmp/LDFLAGS-LIBPATH.list similarity index 100% rename from build/dest/dest-bconfig/LDFLAGS-LIBPATH.list rename to build/dest/dest-bconfig/tmp/LDFLAGS-LIBPATH.list diff --git a/build/dest/dest-bconfig/LDFLAGS.imi b/build/dest/dest-bconfig/tmp/LDFLAGS.imi similarity index 63% rename from build/dest/dest-bconfig/LDFLAGS.imi rename to build/dest/dest-bconfig/tmp/LDFLAGS.imi index e265cb9..a4fc6db 100644 --- a/build/dest/dest-bconfig/LDFLAGS.imi +++ b/build/dest/dest-bconfig/tmp/LDFLAGS.imi @@ -1,10 +1,10 @@ # link misc option -LDFLAGS_MISC+="-Wl,-rpath,." +#LDFLAGS_MISC+="-Wl,-rpath,." # link debug option -LDFLAGS_DBG+="-g -O2 " +#LDFLAGS_DBG+=" -g -O2 " # link shared lib option -LDFLAGS_SHARE+="-fPIC -shared " +#LDFLAGS_SHARE+=" -fPIC " # -shared -Wl,-soname,`basename $@ .${REL_VERSION}`.${ABI_VERSION},-stats,-lc diff --git a/build/dest/dest-bconfig/build.imi b/build/dest/dest-bconfig/tmp/build.imi similarity index 100% rename from build/dest/dest-bconfig/build.imi rename to build/dest/dest-bconfig/tmp/build.imi diff --git a/build/dest/dest-bconfig/c-src-dir.list b/build/dest/dest-bconfig/tmp/c-src-dir.list similarity index 100% copy from build/dest/dest-bconfig/c-src-dir.list copy to build/dest/dest-bconfig/tmp/c-src-dir.list diff --git a/build/dest/dest-general/ARFLAGS-MISC.imi b/build/dest/dest-blank/ARFLAGS-MISC.imi similarity index 72% rename from build/dest/dest-general/ARFLAGS-MISC.imi rename to build/dest/dest-blank/ARFLAGS-MISC.imi index 70d5566..03c4797 100644 --- a/build/dest/dest-general/ARFLAGS-MISC.imi +++ b/build/dest/dest-blank/ARFLAGS-MISC.imi @@ -2,5 +2,5 @@ # AR option # c, create # x, extract -ARFLAGS=" vcr" +ARFLAGS="" diff --git a/build/dest/dest-blank/CFLAGS-DBG.imi b/build/dest/dest-blank/CFLAGS-DBG.imi new file mode 100644 index 0000000..aaa4dcb --- /dev/null +++ b/build/dest/dest-blank/CFLAGS-DBG.imi @@ -0,0 +1,4 @@ + +# debug option +CFLAGS_DBG="" + diff --git a/build/dest/dest-blank/CFLAGS-DEF.list b/build/dest/dest-blank/CFLAGS-DEF.list new file mode 100644 index 0000000..f237528 --- /dev/null +++ b/build/dest/dest-blank/CFLAGS-DEF.list @@ -0,0 +1,5 @@ +# HAVE_CONFIG_H +# _GNU_SOURCE +# _DEFAULT_SOURCE + +CFLAGS_DEF="" diff --git a/build/dest/dest-blank/CFLAGS-INCPATH.list b/build/dest/dest-blank/CFLAGS-INCPATH.list new file mode 100644 index 0000000..0efe6c4 --- /dev/null +++ b/build/dest/dest-blank/CFLAGS-INCPATH.list @@ -0,0 +1,4 @@ + +# include path +#CFLAGS_INCPATH+="-I" + diff --git a/build/dest/dest-general/CFLAGS-MISC.imi b/build/dest/dest-blank/CFLAGS-MISC.imi similarity index 96% copy from build/dest/dest-general/CFLAGS-MISC.imi copy to build/dest/dest-blank/CFLAGS-MISC.imi index b36e7e0..5f5f96b 100644 --- a/build/dest/dest-general/CFLAGS-MISC.imi +++ b/build/dest/dest-blank/CFLAGS-MISC.imi @@ -6,6 +6,7 @@ # @ common CCFLAGS_XXX paramter. # shared lib opt. CCFLAGS_SHARED="-fPIC" +CCFLAGS_SHARED="-fPIC" # cpu arch optimize opt. CCFLAGS_ARCH_EVL="-mcpu=${ARCH_CPU}" diff --git a/build/dest/dest-blank/LDFLAGS-DBG.imi b/build/dest/dest-blank/LDFLAGS-DBG.imi new file mode 100644 index 0000000..063e178 --- /dev/null +++ b/build/dest/dest-blank/LDFLAGS-DBG.imi @@ -0,0 +1,4 @@ + + +# link debug option +LDFLAGS_DBG="-g -O2 " diff --git a/build/dest/dest-general/LDFLAGS-LIB.list b/build/dest/dest-blank/LDFLAGS-LIB.list similarity index 100% copy from build/dest/dest-general/LDFLAGS-LIB.list copy to build/dest/dest-blank/LDFLAGS-LIB.list diff --git a/build/dest/dest-general/LDFLAGS-LIBPATH.list b/build/dest/dest-blank/LDFLAGS-LIBPATH.list similarity index 100% copy from build/dest/dest-general/LDFLAGS-LIBPATH.list copy to build/dest/dest-blank/LDFLAGS-LIBPATH.list diff --git a/build/dest/dest-general/LDFLAGS-MISC.imi b/build/dest/dest-blank/LDFLAGS-MISC.imi similarity index 100% copy from build/dest/dest-general/LDFLAGS-MISC.imi copy to build/dest/dest-blank/LDFLAGS-MISC.imi diff --git a/build/dest/dest-blank/dep-pkg.list b/build/dest/dest-blank/dep-pkg.list new file mode 100644 index 0000000..6b33a48 --- /dev/null +++ b/build/dest/dest-blank/dep-pkg.list @@ -0,0 +1,5 @@ + +# include pkg +INC_PKG+="ncurses.pc" + + diff --git a/build/dest/dest-blank/opt.imi b/build/dest/dest-blank/opt.imi new file mode 100644 index 0000000..21b5b60 --- /dev/null +++ b/build/dest/dest-blank/opt.imi @@ -0,0 +1,17 @@ + +# +# config with 'y' means configure this option. +# + +# debug is setted by a file, it's easy to recognize by [[ -f file ]] +# or setted in .imi file, check it on publish. +#opt_debug= + +opt_shared=y +opt_call_graph=n +opt_gcov=n +opt_build_type=debug +opt_optimize=( [2] 0 1 3 z fast s ) +opt_arch=cortex-a7 +opt_prog_sizeinfo=y +opt_obj_sizeinfo=n diff --git a/build/dest/dest-blank/readme.txt b/build/dest/dest-blank/readme.txt new file mode 100644 index 0000000..5634472 --- /dev/null +++ b/build/dest/dest-blank/readme.txt @@ -0,0 +1,4 @@ + +# this file defined parameters with blank content. +# it's juest for parameter value init, or clear. + diff --git a/build/dest/dest-gconfig/LDFLAGS-LIB.list b/build/dest/dest-gconfig/LDFLAGS-LIB.list new file mode 100644 index 0000000..2442127 --- /dev/null +++ b/build/dest/dest-gconfig/LDFLAGS-LIB.list @@ -0,0 +1,5 @@ + +# libs +LDFLAGS_LIBS+=" -lconfig " + + diff --git a/build/dest/dest-gconfig/c-src-file.list b/build/dest/dest-gconfig/c-src-file.list new file mode 100644 index 0000000..b53064c --- /dev/null +++ b/build/dest/dest-gconfig/c-src-file.list @@ -0,0 +1,5 @@ + +# lib-list + +C_SRC_LIST+="src/bconfig/conf.dir/gconf.c" + diff --git a/build/dest/dest-bconfig/dest.imi b/build/dest/dest-gconfig/dest.imi similarity index 78% copy from build/dest/dest-bconfig/dest.imi copy to build/dest/dest-gconfig/dest.imi index b092b65..e339e3f 100644 --- a/build/dest/dest-bconfig/dest.imi +++ b/build/dest/dest-gconfig/dest.imi @@ -1,18 +1,27 @@ [global] -destname=bconfig +DEST_NAME=gconfig # dest type -desttype=( +DEST_TYPE=( [exe] exe dll drv lib bin hex exelist objlist la obj lo ) # elf/exe so/dll ko/drv a/lib +DEST_FILENAME=gconfig + # on linux system, binaray executable does not have extname. # on win system, it is ".exe" # on linux, dynamic lib is ".so" file # on win, it is ".dll". # this parameter can be generated automatically by desttype. -extname="" +DEST_EXTNAME="" +DEST_BUILD_STEP= + + + + + + diff --git a/build/dest/dest-libconfig/paramters.imi b/build/dest/dest-gconfig/paramters.imi similarity index 76% copy from build/dest/dest-libconfig/paramters.imi copy to build/dest/dest-gconfig/paramters.imi index 79a12bf..3cb3a69 100644 --- a/build/dest/dest-libconfig/paramters.imi +++ b/build/dest/dest-gconfig/paramters.imi @@ -2,6 +2,6 @@ # disable general paramter by '#'. CFLAGS_EVL="${CFLAGS_DEF} ${CFLAGS_INCPATH} ${CFLAGS_DBG} ${CFLAGS_SHARE}" -LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS}" +LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS} ${LDFLAGS_GLOBAL_LIBS}" diff --git a/build/dest/dest-gconfig/tmp/LDFLAGS-LIBPATH.list b/build/dest/dest-gconfig/tmp/LDFLAGS-LIBPATH.list new file mode 100644 index 0000000..20d789e --- /dev/null +++ b/build/dest/dest-gconfig/tmp/LDFLAGS-LIBPATH.list @@ -0,0 +1,5 @@ + +# lib path +LDFLAGS_LIBPATH+=" -L${SRCPKG_TOPDIR}/build/output/ " + + diff --git a/build/dest/dest-libconfig/c-src-dir.list b/build/dest/dest-gconfig/tmp/c-src-dir.list similarity index 100% rename from build/dest/dest-libconfig/c-src-dir.list rename to build/dest/dest-gconfig/tmp/c-src-dir.list diff --git a/build/dest/dest-gconfig/tmp/obj.list b/build/dest/dest-gconfig/tmp/obj.list new file mode 100644 index 0000000..57981de --- /dev/null +++ b/build/dest/dest-gconfig/tmp/obj.list @@ -0,0 +1,6 @@ + +# this file set .o file to be generated. +# it compatible with linux build style. + + + diff --git a/build/dest/dest-general/CFLAGS-DEF.list b/build/dest/dest-general/CFLAGS-DEF.list index d9ec297..e7eede3 100644 --- a/build/dest/dest-general/CFLAGS-DEF.list +++ b/build/dest/dest-general/CFLAGS-DEF.list @@ -1,7 +1,3 @@ -# HAVE_CONFIG_H -# _GNU_SOURCE -# _DEFAULT_SOURCE - # defines #CFLAGS_DEF+="-DHAVE_CONFIG_H " @@ -9,10 +5,16 @@ #CFLAGS_DEF+="-D_DEFAULT_SOURCE " # -DLOCALE -I. +#CFLAGS_DEF+="-DCURSES_LOC=\"\"" +#CFLAGS_DEF+=" -DCONFIG_=\"\"" + + +# +# some of paramters are generated by 'check.sh'. +# CFLAGS_DEF+="-D_DEFAULT_SOURCE" CFLAGS_DEF+="-D_XOPEN_SOURCE=600" -#CFLAGS_DEF+="-DCURSES_LOC=\"\"" CFLAGS_DEF+="-DLOCALE" CFLAGS_DEF+=" -DKBUILD_NO_NLS" -CFLAGS_DEF+=" -DCONFIG_=\"\"" + diff --git a/build/dest/dest-general/CFLAGS-INCPATH.list b/build/dest/dest-general/CFLAGS-INCPATH.list index 43b32fe..28d3c7c 100644 --- a/build/dest/dest-general/CFLAGS-INCPATH.list +++ b/build/dest/dest-general/CFLAGS-INCPATH.list @@ -1,5 +1,7 @@ # include path -CFLAGS_INCPATH+="-I../../include " -CFLAGS_INCPATH+="-I. " +CFLAGS_INCPATH+=" -I../../include " +CFLAGS_INCPATH+=" -I. " +CFLAGS_INCPATH+=" -I./include " +CFLAGS_INCPATH+=" -I./src/bconfig " diff --git a/build/dest/dest-general/CFLAGS-MISC.imi b/build/dest/dest-general/CFLAGS-MISC.imi index b36e7e0..94c6547 100644 --- a/build/dest/dest-general/CFLAGS-MISC.imi +++ b/build/dest/dest-general/CFLAGS-MISC.imi @@ -1,7 +1,14 @@ # enable those flags in dest config file. +# debug +CFLAGS_DBG=" -g -O2 " +#CFLAGS_SHARE=" -fPIC " +# +# TBD: +# parameters below are not used. +# # @ common CCFLAGS_XXX paramter. # shared lib opt. diff --git a/build/dest/dest-general/LDFLAGS-LIB.list b/build/dest/dest-general/LDFLAGS-LIB.list index e33a7ad..bdf651e 100644 --- a/build/dest/dest-general/LDFLAGS-LIB.list +++ b/build/dest/dest-general/LDFLAGS-LIB.list @@ -1,6 +1,7 @@ -# libs +# libs defined here is referenced by all dest. +# and should be putted after LDFLAGS_LIBS, or it will dispaly err like 'undefined reference to'. #LDFLAGS_LIBS+="-ltui " -LDFLAGS_LIBS+="-lncurses " +LDFLAGS_GLOBAL_LIBS+="-lncurses " diff --git a/build/dest/dest-general/LDFLAGS-LIBPATH.list b/build/dest/dest-general/LDFLAGS-LIBPATH.list index ead00b3..41b44af 100644 --- a/build/dest/dest-general/LDFLAGS-LIBPATH.list +++ b/build/dest/dest-general/LDFLAGS-LIBPATH.list @@ -1,7 +1,7 @@ # lib path LDFLAGS_LIBPATH+="-L. " -LDFLAGS_LIBPATH+="-Lbuild/output " +LDFLAGS_LIBPATH+="-L${OUTPUT_DIR} " LDFLAGS_LIBPATH+="-L/lib " LDFLAGS_LIBPATH+="-L/usr/lib/i386-linux-gnu " diff --git a/build/dest/dest-general/LDFLAGS-MISC.imi b/build/dest/dest-general/LDFLAGS-MISC.imi index 380e626..4d3d5cd 100644 --- a/build/dest/dest-general/LDFLAGS-MISC.imi +++ b/build/dest/dest-general/LDFLAGS-MISC.imi @@ -1,6 +1,7 @@ # link shared lib option -LDFLAGS_SHARE=" -shared -fPIC" +#LDFLAGS_SHARE=" -shared -fPIC " +#LDFLAGS_SHARE=" -fPIC " # link misc option diff --git a/build/dest/dest-general/readme.txt b/build/dest/dest-general/readme.txt index 751d35c..43d5546 100644 --- a/build/dest/dest-general/readme.txt +++ b/build/dest/dest-general/readme.txt @@ -2,26 +2,6 @@ -@ -# instruction language -# command list language -# compile language -# script language (use similar grammar of compile-lang, but running in - interpreter) -# config language (lightweight lang usd in expr or param setting) - - - -@ features: -# compile flags from out of pkg. -# compile flags generated by cmd or script in build. -# list flags configured in .lst file. -# flags setted in .imi file. -# default flgas defined in .imi file in build-pkg. -# compile flags trimming, since some opt should be putted before/after others. -# integerated parameter file contains parameter in one file. seperated config - file contains one parameter for some purpose, it can be parsing easily in - code. @ general parameters. diff --git a/build/dest/dest-libconfig/ARFLAGS-MISC.imi b/build/dest/dest-libconfig/ARFLAGS-MISC.imi new file mode 100644 index 0000000..43d88ea --- /dev/null +++ b/build/dest/dest-libconfig/ARFLAGS-MISC.imi @@ -0,0 +1,9 @@ + +# AR option +# c, create +# x, extract +# u, append tp chk for .o file. +# s, insert symbol index. +# r, if .o file exist in .a, replace it. +ARFLAGS=" vucsr" + diff --git a/build/dest/dest-libconfig/c-src-file.list b/build/dest/dest-libconfig/c-src-file.list dissimilarity index 64% index 2dab8aa..cf8b564 100644 --- a/build/dest/dest-libconfig/c-src-file.list +++ b/build/dest/dest-libconfig/c-src-file.list @@ -1,30 +1,12 @@ - -# lib-list - -C_SRC_LIST+="src/bconfig/conf.dir/mconf.c" - -#C_SRC_LIST+="src/bconfig/conf.dir/conf.c" -#C_SRC_LIST+="src/bconfig/conf.dir/confdata.c" -#C_SRC_LIST+="src/bconfig/conf.dir/gconf.c" -#C_SRC_LIST+="src/bconfig/conf.dir/nconf.c" -#C_SRC_LIST+="src/bconfig/conf.dir/nconf.gui.c" - -C_SRC_LIST+="src/bconfig/lxdialog/checklist.c" -C_SRC_LIST+="src/bconfig/lxdialog/inputbox.c" -C_SRC_LIST+="src/bconfig/lxdialog/menubox.c" -C_SRC_LIST+="src/bconfig/lxdialog/textbox.c" -C_SRC_LIST+="src/bconfig/lxdialog/util.c" -C_SRC_LIST+="src/bconfig/lxdialog/yesno.c" - - -C_SRC_LIST+="src/bconfig/lxrgmr/zconf.tab.c" - -#C_SRC_LIST+="src/bconfig/lxrgmr/kconf_id.c" -#C_SRC_LIST+="src/bconfig/lxrgmr/zconf.lex.c" -#C_SRC_LIST+="src/bconfig/src/expr.c" -#C_SRC_LIST+="src/bconfig/src/images.c" -#C_SRC_LIST+="src/bconfig/src/kxgettext.c" -#C_SRC_LIST+="src/bconfig/src/menu.c" -#C_SRC_LIST+="src/bconfig/src/symbol.c" -#C_SRC_LIST+="src/bconfig/src/util.c" - + +# lib-list + +C_SRC_LIST+="src/bconfig/lxdialog/checklist.c" +C_SRC_LIST+="src/bconfig/lxdialog/inputbox.c" +C_SRC_LIST+="src/bconfig/lxdialog/menubox.c" +C_SRC_LIST+="src/bconfig/lxdialog/textbox.c" +C_SRC_LIST+="src/bconfig/lxdialog/util.c" +C_SRC_LIST+="src/bconfig/lxdialog/yesno.c" + +C_SRC_LIST+="src/bconfig/lxrgmr/zconf.tab.c" + diff --git a/build/dest/dest-libconfig/dest.imi b/build/dest/dest-libconfig/dest.imi index 97c5624..6db2ca6 100644 --- a/build/dest/dest-libconfig/dest.imi +++ b/build/dest/dest-libconfig/dest.imi @@ -1,5 +1,14 @@ [dest] -destname=libconfig -desttype=STATIC_LIB -filename=libconfig.a +DEST_NAME=libconfig +DEST_TYPE=( +[lib] +exe dll drv lib +bin hex +exelist objlist +la obj lo ) # elf/exe so/dll ko/drv a/lib + +DEST_FILENAME=libconfig.a +DEST_EXTNAME=a +DEST_BUILD_STEP= + diff --git a/build/dest/dest-libconfig/obj.list b/build/dest/dest-libconfig/obj.list deleted file mode 100644 index e69de29..0000000 diff --git a/build/dest/dest-libconfig/paramters.imi b/build/dest/dest-libconfig/paramters.imi index 79a12bf..3ef9c55 100644 --- a/build/dest/dest-libconfig/paramters.imi +++ b/build/dest/dest-libconfig/paramters.imi @@ -2,6 +2,7 @@ # disable general paramter by '#'. CFLAGS_EVL="${CFLAGS_DEF} ${CFLAGS_INCPATH} ${CFLAGS_DBG} ${CFLAGS_SHARE}" -LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS}" +LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS} ${LDFLAGS_GLOBAL_LIBS}" +#ARFLAGS_EVL="${ARFLAGS}" diff --git a/build/dest/dest-libconfig/CFLAGS-INCPATH.list b/build/dest/dest-libconfig/tmp/CFLAGS-INCPATH.list similarity index 100% rename from build/dest/dest-libconfig/CFLAGS-INCPATH.list rename to build/dest/dest-libconfig/tmp/CFLAGS-INCPATH.list diff --git a/build/dest/dest-libconfig/CFLAGS.imi b/build/dest/dest-libconfig/tmp/CFLAGS.imi similarity index 100% rename from build/dest/dest-libconfig/CFLAGS.imi rename to build/dest/dest-libconfig/tmp/CFLAGS.imi diff --git a/build/dest/dest-libconfig/LDFLAGS-LIB.list b/build/dest/dest-libconfig/tmp/LDFLAGS-LIB.list similarity index 100% rename from build/dest/dest-libconfig/LDFLAGS-LIB.list rename to build/dest/dest-libconfig/tmp/LDFLAGS-LIB.list diff --git a/build/dest/dest-libconfig/LDFLAGS-LIBPATH.list b/build/dest/dest-libconfig/tmp/LDFLAGS-LIBPATH.list similarity index 100% rename from build/dest/dest-libconfig/LDFLAGS-LIBPATH.list rename to build/dest/dest-libconfig/tmp/LDFLAGS-LIBPATH.list diff --git a/build/dest/dest-libconfig/LDFLAGS-MISC.imi b/build/dest/dest-libconfig/tmp/LDFLAGS-MISC.imi similarity index 100% rename from build/dest/dest-libconfig/LDFLAGS-MISC.imi rename to build/dest/dest-libconfig/tmp/LDFLAGS-MISC.imi diff --git a/build/dest/dest-libconfig/LDFLAGS.imi b/build/dest/dest-libconfig/tmp/LDFLAGS.imi similarity index 62% rename from build/dest/dest-libconfig/LDFLAGS.imi rename to build/dest/dest-libconfig/tmp/LDFLAGS.imi index e265cb9..f397aac 100644 --- a/build/dest/dest-libconfig/LDFLAGS.imi +++ b/build/dest/dest-libconfig/tmp/LDFLAGS.imi @@ -1,10 +1,10 @@ # link misc option -LDFLAGS_MISC+="-Wl,-rpath,." +#LDFLAGS_MISC+="-Wl,-rpath,." # link debug option -LDFLAGS_DBG+="-g -O2 " +#LDFLAGS_DBG+="-g -O2 " # link shared lib option -LDFLAGS_SHARE+="-fPIC -shared " +#LDFLAGS_SHARE+="-fPIC -shared " # -shared -Wl,-soname,`basename $@ .${REL_VERSION}`.${ABI_VERSION},-stats,-lc diff --git a/build/dest/dest-libconfig/build.imi b/build/dest/dest-libconfig/tmp/build.imi similarity index 100% rename from build/dest/dest-libconfig/build.imi rename to build/dest/dest-libconfig/tmp/build.imi diff --git a/build/dest/dest-bconfig/c-src-dir.list b/build/dest/dest-libconfig/tmp/c-src-dir.list similarity index 100% rename from build/dest/dest-bconfig/c-src-dir.list rename to build/dest/dest-libconfig/tmp/c-src-dir.list diff --git a/build/dest/dest-bconfig/obj.list b/build/dest/dest-libconfig/tmp/obj.list similarity index 100% rename from build/dest/dest-bconfig/obj.list rename to build/dest/dest-libconfig/tmp/obj.list diff --git a/build/dest/dest-mconfig/obj.list b/build/dest/dest-mconfig/obj.list index e69de29..57981de 100644 --- a/build/dest/dest-mconfig/obj.list +++ b/build/dest/dest-mconfig/obj.list @@ -0,0 +1,6 @@ + +# this file set .o file to be generated. +# it compatible with linux build style. + + + diff --git a/build/dest/dest-nconfig/LDFLAGS-LIB.list b/build/dest/dest-nconfig/LDFLAGS-LIB.list new file mode 100644 index 0000000..2442127 --- /dev/null +++ b/build/dest/dest-nconfig/LDFLAGS-LIB.list @@ -0,0 +1,5 @@ + +# libs +LDFLAGS_LIBS+=" -lconfig " + + diff --git a/build/dest/dest-nconfig/c-src-file.list b/build/dest/dest-nconfig/c-src-file.list new file mode 100644 index 0000000..69f9155 --- /dev/null +++ b/build/dest/dest-nconfig/c-src-file.list @@ -0,0 +1,7 @@ + +# lib-list + + +C_SRC_LIST+="src/bconfig/conf.dir/nconf.c" +C_SRC_LIST+="src/bconfig/conf.dir/nconf.gui.c" + diff --git a/build/dest/dest-bconfig/dest.imi b/build/dest/dest-nconfig/dest.imi similarity index 78% copy from build/dest/dest-bconfig/dest.imi copy to build/dest/dest-nconfig/dest.imi index b092b65..40a1b35 100644 --- a/build/dest/dest-bconfig/dest.imi +++ b/build/dest/dest-nconfig/dest.imi @@ -1,18 +1,27 @@ [global] -destname=bconfig +DEST_NAME=nconfig # dest type -desttype=( +DEST_TYPE=( [exe] exe dll drv lib bin hex exelist objlist la obj lo ) # elf/exe so/dll ko/drv a/lib +DEST_FILENAME=nconfig + # on linux system, binaray executable does not have extname. # on win system, it is ".exe" # on linux, dynamic lib is ".so" file # on win, it is ".dll". # this parameter can be generated automatically by desttype. -extname="" +DEST_EXTNAME="" +DEST_BUILD_STEP= + + + + + + diff --git a/build/dest/dest-libconfig/paramters.imi b/build/dest/dest-nconfig/paramters.imi similarity index 76% copy from build/dest/dest-libconfig/paramters.imi copy to build/dest/dest-nconfig/paramters.imi index 79a12bf..3cb3a69 100644 --- a/build/dest/dest-libconfig/paramters.imi +++ b/build/dest/dest-nconfig/paramters.imi @@ -2,6 +2,6 @@ # disable general paramter by '#'. CFLAGS_EVL="${CFLAGS_DEF} ${CFLAGS_INCPATH} ${CFLAGS_DBG} ${CFLAGS_SHARE}" -LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS}" +LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS} ${LDFLAGS_GLOBAL_LIBS}" diff --git a/build/dest/dest-qconfig/LDFLAGS-LIB.list b/build/dest/dest-qconfig/LDFLAGS-LIB.list new file mode 100644 index 0000000..2442127 --- /dev/null +++ b/build/dest/dest-qconfig/LDFLAGS-LIB.list @@ -0,0 +1,5 @@ + +# libs +LDFLAGS_LIBS+=" -lconfig " + + diff --git a/build/dest/dest-qconfig/cxx-src-file.list b/build/dest/dest-qconfig/cxx-src-file.list new file mode 100644 index 0000000..a78b5bc --- /dev/null +++ b/build/dest/dest-qconfig/cxx-src-file.list @@ -0,0 +1,6 @@ + +# lib-list + + +CXX_SRC_LIST+="src/bconfig/conf.dir/qconf.cc" + diff --git a/build/dest/dest-bconfig/dest.imi b/build/dest/dest-qconfig/dest.imi similarity index 78% copy from build/dest/dest-bconfig/dest.imi copy to build/dest/dest-qconfig/dest.imi index b092b65..aa69356 100644 --- a/build/dest/dest-bconfig/dest.imi +++ b/build/dest/dest-qconfig/dest.imi @@ -1,18 +1,27 @@ [global] -destname=bconfig +DEST_NAME=qconfig # dest type -desttype=( +DEST_TYPE=( [exe] exe dll drv lib bin hex exelist objlist la obj lo ) # elf/exe so/dll ko/drv a/lib +DEST_FILENAME=qconfig + # on linux system, binaray executable does not have extname. # on win system, it is ".exe" # on linux, dynamic lib is ".so" file # on win, it is ".dll". # this parameter can be generated automatically by desttype. -extname="" +DEST_EXTNAME="" +DEST_BUILD_STEP= + + + + + + diff --git a/build/dest/dest-libconfig/paramters.imi b/build/dest/dest-qconfig/paramters.imi similarity index 76% copy from build/dest/dest-libconfig/paramters.imi copy to build/dest/dest-qconfig/paramters.imi index 79a12bf..3cb3a69 100644 --- a/build/dest/dest-libconfig/paramters.imi +++ b/build/dest/dest-qconfig/paramters.imi @@ -2,6 +2,6 @@ # disable general paramter by '#'. CFLAGS_EVL="${CFLAGS_DEF} ${CFLAGS_INCPATH} ${CFLAGS_DBG} ${CFLAGS_SHARE}" -LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS}" +LDFLAGS_EVL="${LDFLAGS_LIBPATH} ${LDFLAGS_DBG} ${LDFLAGS_SHARE} ${LDFLAGS_MISC} ${LDFLAGS_LIBS} ${LDFLAGS_GLOBAL_LIBS}" diff --git a/build/dest/dest.list b/build/dest/dest.list index eb5ff45..a28fed7 100644 --- a/build/dest/dest.list +++ b/build/dest/dest.list @@ -1,7 +1,12 @@ + + # dest list. # dest-general should not be appended. it's the public setting. -BUILD_DEST+="dest-libconfig " -BUILD_DEST+="dest-bconfig " -BUILD_DEST+="dest-mconfig " +BUILD_DEST+=" dest-libconfig " +BUILD_DEST+=" dest-bconfig " +#BUILD_DEST+="dest-gconfig " +#BUILD_DEST+="dest-qconfig " +#BUILD_DEST+="dest-nconfig " +#BUILD_DEST+="dest-mconfig " # same as bconfig, use src code in linux-kernel. diff --git a/build/liba-note.txt b/build/liba-note.txt new file mode 100644 index 0000000..78cff63 --- /dev/null +++ b/build/liba-note.txt @@ -0,0 +1,17 @@ + + + + +@echo xxx $(AM_V_CCLD)$(LINK) $(libcsv_la_OBJECTS) $(libcsv_la_LIBADD) $(LIBS) + + + +/bin/sh ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../src -g -O2 -MT libcsv.lo -MD -MP -MF $depbase.Tpo -c -o libcsv.lo libcsv.c &&\ +mv -f $depbase.Tpo $depbase.Plo +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I../src -g -O2 -MT libcsv.lo -MD -MP -MF .deps/libcsv.Tpo -c libcsv.c -fPIC -DPIC -o .libs/libcsv.o +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I../src -g -O2 -MT libcsv.lo -MD -MP -MF .deps/libcsv.Tpo -c libcsv.c -o libcsv.o >/dev/null 2>&1 +/bin/sh ../libtool --tag=CC --mode=link gcc -g -O2 -o libcsv.la libcsv.lo +libtool: link: ar cru .libs/libcsv.a .libs/libcsv.o +libtool: link: ranlib .libs/libcsv.a +libtool: link: ( cd ".libs" && rm -f "libcsv.la" && ln -s "../libcsv.la" "libcsv.la" ) +/bin/sh ../libtool --tag=CC --mode=link gcc -g -O2 -o libcsv.la libcsv.lo diff --git a/build/shlib/constructor.shlib b/build/shlib/constructor.shlib index 9c5ad3e..5150d4f 100644 --- a/build/shlib/constructor.shlib +++ b/build/shlib/constructor.shlib @@ -33,14 +33,124 @@ include stdio.shlib ############################## +declare -g P_RET= +declare -g P_FUNC= +declare -g P_PARAM= +task_level=0 +build_step_dbgout_list=" +STEP_DEST_INIT +STEP_C_SRC_CMPL +STEP_CXX_SRC_CMPL +STEP_CPP_SRC_CMPL +STEP_ASM_SRC_CMPL +STEP_SH_SRC_CMPL +STEP_LINK +" ############################## # section: private function ############################## +# +# fsyntax: info_dbgout_init +# fdesc: init debug out info. +# +info_dbgout_init () +{ + task_level=0 + echo > ${OUTPUT_DIR}/buildstep.log + echo > ${OUTPUT_DIR}/buildinfo.log + echo > ${OUTPUT_DIR}/buildparam.log +} + +# +# fsyntax: task_dbgout +# fdesc: output string by dbgout switch. +# +task_dbgout () +{ + local pfx= + local i= + + for ((i=0; i<$task_level; i++)); do + pfx+="=" + done + + dbgoutd "${pfx}>$@" + echo -ne "${pfx}>$@" >> ${OUTPUT_DIR}/buildstep.log + echo -ne "${pfx}>$@" >> ${OUTPUT_DIR}/buildinfo.log + return +} + +# +# fsyntax: taskstep_dbgout +# fdesc: output string by dbgout switch. +# +taskstep_dbgout () +{ + local pfx= + local i= + + for ((i=0; i<$task_level; i++)); do + pfx+="=" + done + + dbgoutd "${pfx}>$@" + echo -ne "${pfx}>$@" >> ${OUTPUT_DIR}/buildstep.log + echo -ne "${pfx}>$@" >> ${OUTPUT_DIR}/buildinfo.log + return +} + +# +# fsyntax: buildstep_dbgout +# fdesc: output string by dbgout switch. +# +buildstep_dbgout () +{ + local pfx= + local i= + + if [[ ! "${build_step_dbgout_list}" =~ "$1" ]]; then + return + fi + shift + + for ((i=0; i<$task_level; i++)); do + pfx+="=" + done + + dbgoutd "${pfx}>$@" + echo -ne "${pfx}>$@" >> ${OUTPUT_DIR}/buildstep.log + echo -ne "${pfx}>$@" >> ${OUTPUT_DIR}/buildinfo.log + return +} + +# +# fsyntax: taskinfo_dbgout +# fdesc: output string by dbgout switch. +# +taskinfo_dbgout () +{ + dbgoutd "$@" + echo -ne "$@" >> ${OUTPUT_DIR}/buildinfo.log + return +} + +# +# fsyntax: buildparam_dbgout +# fdesc: output string by dbgout switch. +# +buildparam_dbgout () +{ + return + dbgoutd "$@" + echo -ne "$@" >> ${OUTPUT_DIR}/buildparam.log + echo -ne "$@" >> ${OUTPUT_DIR}/buildinfo.log +} + ############################## @@ -121,10 +231,6 @@ version_gen () # general -declare -g P_RET= -declare -g P_FUNC= -declare -g P_PARAM= - # $ [[ "VOID on_prev_construct (int a)" =~ ((.*)[[:space:]]+)?([[:alnum:]_]*)[[:space:]]*([\(](.*)[\)])? ]] && echo "BASH_REMATCH=\"${BASH_REMATCH[@]}\"" # BASH_REMATCH="VOID on_prev_construct (int a) VOID on_prev_construct VOID on_prev_construct (int a) int a" # @@ -145,6 +251,7 @@ str2func () declare -g P_RET="" declare -g P_PARAM="" declare -g P_FUNC="" + # check if func expr # echo \$@=$@ if [[ "$1" =~ ((.*)[[:space:]]+)?([[:alnum:]_]*)[[:space:]]*([\(](.*)[\)])? ]]; then @@ -173,19 +280,24 @@ str2func () P_FUNC="$1" else P_FUNC="$1" - return 1 + return 2 fi +# echo "declare -F $P_FUNC >/dev/null 2>&1" +# declare -F $P_FUNC declare -F $P_FUNC >/dev/null 2>&1 -# [[ $? != 0 ]] && warn "'$P_FUNC' is a defination of func form, but it is not defined.\n" && return 1 - [[ $? != 0 ]] && return 2 +# [[ $? != 0 ]] && warn "'$P_FUNC' is a defination of func form, but it is not defined.\n" && return 2 + [[ $? != 0 ]] && return 3 return 0 } # # fsyntax: TASK_RUNNING [, ... ] # fdesc: running a task by the name of var in arg. -# +# freturn: 0, normal. +# 1, break current step. +# 2, err, stop doing. +# 3, TASK_RUNNING () { local j= @@ -196,106 +308,140 @@ TASK_RUNNING () local stepdef= local param= - info "TASK_RUNNING ($@)\n" + : $((task_level++)) +# taskstep_dbgout "TASK_RUNNING ($@)\n" + buildstep_dbgout "$1" "TASK_RUNNING ($@)\n" - [[ ! -n $1 ]] && warn "'$1' is not a valid step name." && return 1 - - # TBD: - # check if it is an array. - # if yes, use array directly. - # the form between multi-line string and array define are all well. - # sometimes, use array is better, it can write config info in the - # same line. - - # use seperator with new line, to avoid ' ' in func param. - OLD_IFS="$IFS" - IFS=$'\n' - name="$(echo $1)" - content="${!1}" - stepdef=( $content ) - IFS="$OLD_IFS" - - shift 1 - param=("$@") + while true; do + [[ ! -n $1 ]] && warn "'$1' is not a valid step name." && ret=2 && break + + # TBD: + # check if it is an array. + # if yes, use array directly. + # the form between multi-line string and array define are all well. + # sometimes, use array is better, it can write config info in the + # same line. + + # use seperator with new line, to avoid ' ' in func param. + OLD_IFS="$IFS" + IFS=$'\n' + # use cmdline to strip string. + name="$(echo $1)" + content="${!1}" + stepdef=( $content ) + IFS="$OLD_IFS" - # - # if only one item in defination, and it's not a variable define, - # it's a func, invoke it. - # - if [[ ${#stepdef[@]} == 1 && ! -v stepdef ]]; then + shift 1 + param=("$@") - info "TASK_RUNNING ($stepdef)\n" - str2func "${stepdef[@]}" - ret=$? - if [[ $ret == 0 ]]; then + taskinfo_dbgout "xxxxxxxxxxxxxxxxxxxxxxxxxx stepdef[@]=${stepdef[@]}\n" - info "TASK_RUNNING ($stepdef)\n" - $P_FUNC ${P_PARAM[@]} "$@" - ret=$? - [[ $? != 0 ]] && warn "func '$P_FUNC (${P_PARAM[@]//\ /,\ })("$@")' return failed($ret).\n" && return $ret + # skip undefined step. + if [[ ${#stepdef[@]} == 0 && ! -v $stepdef ]]; then + warn "TASK_RUNNING (). parameter in \$$1 are not exist.\n" + ret=0 + break fi - return $ret - fi - dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxx\n" - # - # if there are several sub-steps, or the only one is also a step defination, - # use nestly invoking. - # - for ((j=0; j<${#stepdef[@]}; j++)); do - step="$(echo ${stepdef[$j]})" - dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxx step=$step\n" - - # skip null content and comment content - [[ -z $step ]] && continue - [[ "$step" =~ ^[[:blank:]]*\# ]] && continue - - if [[ ! $step =~ '(' ]]; then - # if it's an existing var, it's may be a sub-step, invoke TASK_RUNNING() nestly. - # but not use ${!step} to access content. - # if it's also an existing func, it will be invoked in TASK_RUNNING. - - #[[ -v $step ]] && -# $step="$(echo $step)" - TASK_RUNNING "$step" "${param[@]}" + # + # if only one item in defination, and it's not a variable define, + # it's a func, invoke it. + # + if [[ ${#stepdef[@]} == 1 ]]; then + str2func "${stepdef[@]}" ret=$? - [[ $ret != 0 ]] && return $ret - else + if [[ $ret != 3 && ! -n ${!P_FUNC} ]]; then + : $((task_level++)) + task_dbgout "$P_FUNC(${P_PARAM[@]} "$@")\n" + $P_FUNC ${P_PARAM[@]} "$@" + ret=$? + task_dbgout "ret $P_FUNC($ret)\n" + : $((task_level--)) + [[ $ret == 1 ]] && ret=0 && break + [[ $ret != 0 ]] && warn "func '$P_FUNC (${P_PARAM[@]//\ /,\ })("$@")' return failed($ret).\n" && break + ret=0 + break + fi + fi + + # + # if there are several sub-steps, or the only one is also a step defination, + # use nestly invoking. + # + for ((j=0; j<${#stepdef[@]}; j++)); do + step="$(echo ${stepdef[$j]})" + taskinfo_dbgout "xxxxxxxxxxxxxxxxxxxxxxxxxx step[$j]=$step\n" + + # skip null content and comment content + [[ -z $step ]] && continue + [[ "$step" =~ ^[[:blank:]]*\# ]] && continue + + if [[ ! $step =~ '(' ]]; then + # if it's an existing var, it's may be a sub-step, invoke TASK_RUNNING() nestly. + # but not use ${!step} to access content. + # if it's also an existing func, it will be invoked in TASK_RUNNING. + + #[[ -v $step ]] && + # $step="$(echo $step)" + TASK_RUNNING "$step" "${param[@]}" + ret=$? + [[ $ret != 0 ]] && break + else + # if it's a func, invoke func also. + str2func "${step}" + ret=$? + taskinfo_dbgout "ret=$ret\n" + if [[ $ret == 0 ]]; then + if [[ "${P_FUNC^^}" == "${P_FUNC}" ]]; then + # if full upper char, it's a step + # P_FUNC="$(echo $P_FUNC)" + TASK_RUNNING $P_FUNC ${P_PARAM[@]} "${param[@]}" + [[ $? != 0 ]] && taskinfo_dbgout "aaaaaaaaa" && break + continue + else + # otherwize, it's a normal function. + : + fi + : $((task_level++)) + task_dbgout "$P_FUNC(${P_PARAM[@]} "$@")\n" + $P_FUNC ${P_PARAM[@]} "$@" + ret=$? + task_dbgout "ret $P_FUNC($ret)\n" + : $((task_level--)) + [[ $ret == 1 ]] && ret=0 && break + [[ $ret != 0 ]] && warn "func '$P_FUNC (${P_PARAM[@]//\ /,\ })("$@")' return failed($ret).\n" && break + elif [[ $ret == 3 ]]; then + # $P_FUNC="$(echo $P_FUNC)" + TASK_RUNNING $P_FUNC ${P_PARAM[@]} "${param[@]}" + [[ $? != 0 ]] && taskinfo_dbgout "func ($P_FUNC) invoking failed." && break + fi + fi + done + + if [[ ! j<${#stepdef[@]} && ret == 0 ]]; then # if it's a func, invoke func also. - str2func "${step}" + str2func "${name}" ret=$? if [[ $ret == 0 ]]; then - if [[ "${P_FUNC^^}" == "${P_FUNC}" ]]; then - # if full upper char, it's a step -# $P_FUNC="$(echo $P_FUNC)" - TASK_RUNNING $P_FUNC ${P_PARAM[@]} "${param[@]}" - [[ $? != 0 ]] && return $ret - else - # otherwize, it's a normal function. - : - fi + : $((task_level++)) + task_dbgout "$P_FUNC(${P_PARAM[@]} "$@")\n" $P_FUNC ${P_PARAM[@]} "$@" ret=$? - [[ $ret != 0 ]] && warn "func '$P_FUNC (${P_PARAM[@]//\ /,\ })("$@")' return failed($ret).\n" && return $ret - elif [[ $ret == 2 ]]; then -# $P_FUNC="$(echo $P_FUNC)" - TASK_RUNNING $P_FUNC ${P_PARAM[@]} "${param[@]}" - [[ $? != 0 ]] && return $ret + task_dbgout "ret $P_FUNC($ret)\n" + : $((task_level--)) + [[ $ret == 1 ]] && ret=0 && break + [[ $ret != 0 ]] && warn "func '$P_FUNC (${P_PARAM[@]//\ /,\ })("$@")' return failed($ret).\n" && break fi fi - done - # if it's a func, invoke func also. - str2func "${name}" - ret=$? - if [[ $ret == 0 ]]; then - $P_FUNC ${P_PARAM[@]} "$@" - [[ $? != 0 ]] && warn "func '$P_FUNC (${P_PARAM[@]//\ /,\ })("$@")' return failed($ret).\n" && return $ret - fi + ret=0 + break + done - info "ret TASK_RUNNING ($name)\n" + taskstep_dbgout "ret $ret TASK_RUNNING ($name)\n" + : $((task_level--)) - return 0 + return $ret } foo () { local i=0; while [[ -n $1 ]]; do echo "\$1=$1"; shift; done; } @@ -325,61 +471,39 @@ tasklist () local list="$1" local task="$(echo $2)" + : $((task_level++)) + taskstep_dbgout "tasklist ($@)\n" + info "..................... tasklist ($*)\n" if [[ -z $1 ]]; then warn "specified list var name '$1' is not valid.\n" - return 1 + return 2 fi - dbgoutd "list=$list\n" - dbgoutd "$list=${!list}\n" + taskinfo_dbgout "list=$list\n" + taskinfo_dbgout "$list=${!list}\n" shift 2 while read data; do [[ -z $data ]] && continue SRC_FILE=( $data ) - dbgoutd "SRC_FILE=${SRC_FILE[@]}\n" + taskinfo_dbgout "SRC_FILE=${SRC_FILE[@]}\n" TASK_RUNNING "$task" $data "$@" # break tasklist running if one of them failed. - [[ $? != 0 ]] && return 1 - done <<< "${!list}" - - return 0 -} + if [[ $? != 0 ]]; then + taskstep_dbgout "ret 2 tasklist ($@)\n" + : $((task_level--)) -# -# fsyntax: tpchk -# fdesc: chk tp between src-file and dest-file. -# -tpchk () -{ - [[ $1 -nt $2 ]] && return 1 -} + return 2 + fi + done <<< "${!list}" -# -# fsyntax: hdrtpchk -# fdesc: chk tp between srcfile and hdrfile. -# -hdrtpchk () -{ - local hdrfile= + taskstep_dbgout "ret 0 tasklist ($@)\n" + : $((task_level--)) - for hdrfile in ${!1}; do - [[ $hdrfile -nt $2 ]] && return 1 - done + return 0 } - - - - - - - - - - - # # fsyntax: dest_init # fdesc: init one dest build. it loads the relative paramter files. @@ -390,140 +514,104 @@ dest_init () local step= local ret= - dbgoutd "############################\n" - dbgoutd "construct_one_dest($1, ${!1}, ${2#*-})\n" + taskinfo_dbgout "############################\n" + taskinfo_dbgout "dest_init($1, ${!1}, ${2#*-})\n" - eval "$1=${2#*-}" + declare -g $1="${2#*-}" # init one dest cfg paramter eval "DEST_GENERAL_CFG_DIR=\"${DEST_GENERAL_CFG_DIR_EVL}\"" dest_param_reset one_dest_init dest-general - one_dest_init $1 + one_dest_init $2 CFLAGS="$CFLAGS" mkdir -p ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/ + unset OBJ_LIST + declare -g OBJ_LIST="" + dbgout_construct_param - dbgoutd "############################\n" - dbgoutd "construct_one_dest($1, ${!1}, ${2#*-})\n" -} + taskinfo_dbgout "############################\n" + taskinfo_dbgout "construct_one_dest($1, ${!1}, ${2#*-})\n" -xxx_foo () -{ - # check src file list to be compiled. - check_and_get_src_compile_list - - # compile if needed. - if [[ $? == 0 ]]; then - compile_src_list - - [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1\n" && return 1 - fi - - # try to check dest and obj tp, it output OBJ_LIST. - dest_link_check $dest - [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2\n" && return 1 - - link_dest $dest - return $? + info_dbgout_init } -dest_build () +# +# fsyntax: src_list_init +# fdesc: load src-list file. +# +src_list_init () { - # TBD: - # dispose parameters, - # build each dest. - local data= - local dest="${!1}" - - info "..................... dest_build ($dest)\n" - - if [[ -z $dest ]]; then - warn "specified list var name '$1' is not valid.\n" - return 1 - fi - - # init one dest cfg paramter - eval "DEST_GENERAL_CFG_DIR=\"${DEST_GENERAL_CFG_DIR_EVL}\"" - dest_param_reset - one_dest_init dest-general - one_dest_init $1 - - CFLAGS="$CFLAGS" - - mkdir -p ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/ - - dbgout_construct_param + local vname= + local lang=$1 + local destdir=$2 + local extname="${LANG_EXT_NAME[${lang,,}]}" + local SRC_LIST_FILE="build/dest/$destdir/${lang,,}-src-file.list" +# local ${lang^^}_SRC_LIST= - # check src file list to be compiled. - check_and_get_src_compile_list - - # compile if needed. - if [[ $? == 0 ]]; then - compile_src_list - - shift 1 - while read data; do - [[ -z $data ]] && continue - SRC_FILE=( $data ) - dbgoutd "SRC_FILE=${SRC_FILE[@]}\n" -# TASK_RUNNING $task SRC_FILE "$@" - TASK_RUNNING DEFAULT_DEST_STEP $SRC_FILE "$@" - # break tasklist running if one of them failed. - [[ $? != 0 ]] && return 1 - done <<< "${!list}" - - [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1\n" && return 1 + info "src_list_init($extname, $@)\n" + + vname=${lang^^}_SRC_LIST + eval "${vname}=\"\"" + if [[ -e ${SRC_LIST_FILE} ]]; then + . $SRC_LIST_FILE 2>/dev/null + eval "${vname}=\"\${!vname//\.${extname,,}/\$'.${extname,,}\n'}\"" + taskinfo_dbgout ${vname}="${!vname}" fi - - - - - - - - return 0 - - DEST_CFG_DIR_NAME="$dest" +# [[ -e $SRC_LIST_FILE ]] && eval "${lang^^}_SRC_LIST=( $(cat $SRC_LIST_FILE | grep -v \"[[:space:]]*#\" | sed -e \"s/^[[:space:]]*#.*$//g\") )" - construct_one_dest $dest - [[ $? != 0 ]] && err "${CHIGHL}[build-dest][${dest#*-}]: build dest file \"$dest\" err.${CNORMAL}" && return 1 + [[ -z ${!vname} ]] && taskinfo_dbgout no src file in src list. && return 0 + +# taskinfo_dbgout ${lang^^}_SRC_LIST=${${lang^^}_SRC_LIST[$i]} return 0 } # -# fsyntax: construct_one_dest -# fdesc: construct one dest executables. +# fsyntax: lang_src_hdrtpchk +# fdesc: chk tp between srcfile and hdrfile. # -construct_one_dest () +lang_src_hdrtpchk () { - local dest=${dest#*-} - local step= - local ret= + local line= + local extname="" + local objfile=${1//\.${extname}/\.o} + local deplistfile="${OUTPUT_DIR}/${3}/${objfile//\.o/.dep}" - dbgoutd "############################\n" - dbgoutd "construct_one_dest(${1#*-})\n" + info "lang_src_hdrtpchk ($@)\n" - + [[ ! -f $deplistfile ]] && return 0 + extname="${LANG_EXT_NAME[${2,,}]}" + while read line; do + [[ -f $line ]] && warn "hdr file ($line) in $deplistfile file does not exist.\n" && continue - # try to check dest and obj tp, it output OBJ_LIST. - dest_link_check $dest - [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2\n" && return 1 + if [[ ${line:0:1} == '/' ]]; then + SYS_INC_LIST+="$line"$'\n' + [[ $line -nt $1 ]] && return 0 + else + APP_INC_LIST+="$line"$'\n' + # + # hdr file newer then src file, + # src file to be recompiled. + # + [[ $line -nt $objfile ]] && return 0 + fi + done < <(cat ${deplistfile} | grep -v "[\\]$" | grep -e "\.h") - link_dest $dest - return $? + return 1 } # -# fsyntax: check_and_get_src_compile_list -# fdesc: check if src file is newer then dest file in $obj, +# fsyntax: lang_src_tpchk [ ... ] +# fdesc: chk tp between srcfile and dstfile(obj). # -check_and_get_src_compile_list () +lang_src_tpchk () { + local extname= local obj= local srcfile= local dstfile= @@ -531,33 +619,39 @@ check_and_get_src_compile_list () local langlist=( $1 ) local lang= local vname= + + taskinfo_dbgout "lang_src_tpchk ($@)" + src_list_init "$@" - # - # check ${lang}_SRC list. + # check ${lang}_SRC_LIST list. # - for lang in ${langlist[@]} ; do - vname="${lang}_SRC[@]" + lang="${1^^}" + extname=${LANG_EXT_NAME[${lang,,}]} +# for lang in ${langlist[@]} ; do + vname="${lang}_SRC_LIST[@]" if [[ -z ${!vname} ]]; then eval ${lang}_SRC_CMPL_LIST="" - echo no src file in src list \'\${${lang}_SRC[@]}\'. - continue + taskinfo_dbgout "no src file in src list \'\${${lang}_SRC_LIST[@]}\'." + return 0 fi + OBJ_LIST+="${!vname//\.${extname}/\.o}" +# OBJ_LIST+="${!vname}" # get obj file list that has been compiled. OBJ_LIST_N2B_CPLE=`cd ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/; ls -1 ${!vname//\.c/\.o} 2>/dev/null` - [[ -z "$OBJ_LIST_N2B_CPLE" ]] && eval ${lang}_SRC_CMPL_LIST=\"\${\!vname}\" && continue + [[ -z "$OBJ_LIST_N2B_CPLE" ]] && eval ${lang}_SRC_CMPL_LIST=\"\${\!vname}\" && return 0 # test compiled obj file, to check if it need to be recompiled. # dbgoutd "OBJ_LIST_N2B_CPLE=${OBJ_LIST_N2B_CPLE}\n" for obj in ${OBJ_LIST_N2B_CPLE}; do - srcfile="${obj//\.o/\.cpp}" + srcfile="${obj//\.o/\.${extname}}" dstfile="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" # check if file does not need to be compiled. if [[ "${dstfile}" -nt "${srcfile}" ]]; then # hdr file tp chk. - hdrtpchk $dstfile + lang_src_hdrtpchk $dstfile [[ $? == 0 ]] && SRC_LIST_N2B_CMPL+="${srcfile}"$'\n' fi done @@ -565,40 +659,15 @@ check_and_get_src_compile_list () # get files to be compiled. if [[ -n $SRC_LIST_N2B_CMPL ]]; then flag=compile - eval ${lang}_SRC_CMPL_LIST="`comm <(echo "${!vname}" | sort) <(echo "$SRC_LIST_N2B_CMPL" | sort) -1`" + eval "${lang}_SRC_CMPL_LIST=\"`comm <(echo \"${!vname}\" | sort) <(echo \"$SRC_LIST_N2B_CMPL\" | sort) -3`\"" # | sed -e "/^\t/d" - fi - eval echo ${lang}_SRC_CMPL_LIST="\${${lang}_SRC_CMPL_LIST}" - done - - return 0 -} - -SYS_INC_LIST= -APP_INC_LIST= - -hdrtpchk () -{ - local line= - local deplistfile=${1//\.o/.dep} - - while read line; do - if [[ ${line:0:1} == '/' ]]; then - SYS_INC_LIST+="$line"$'\n' else - APP_INC_LIST+="$line"$'\n' - [[ $line -nt $1 ]] && return 1 + eval "${lang}_SRC_CMPL_LIST=\"${!vname}\"" fi - done < $(cat ${deplistfile} | grep -v "[\\]" | grep -e "\.h") -} - -lang_tpchk () -{ - local lang= - -# for lang in $1; do -# TASK_RUNNING ${lang^^}_LANG_TPCHK +# eval taskinfo_dbgout "========= ${lang}_SRC_CMPL_LIST=\"\${${lang}_SRC_CMPL_LIST}\"" # done + + return 0 } lang_cmpl () @@ -607,171 +676,59 @@ lang_cmpl () local langlist="${!1}" info "lang_cmpl ($@)\n" - src_list_init ${lang} # for lang in $langlist; do - TASK_RUNNING ${lang^^}_LANG_CMPL + TASK_RUNNING STEP_${lang^^}_LANG_CMPL "$@" # done } -# -# fsyntax: src_list_init -# fdesc: load src-list file. -# -src_list_init () -{ - local vname= - local lang=$1 - local extname="${LANG_EXT_NAME[${lang,,}]}" - local ${lang^^}_SRC_LIST_FILE="dest/dest-libtui.so/${lang,,}-src-file.list" - - vname=${lang^^}_SRC_LIST_FILE - eval echo ${vname}=\$${lang^^}_SRC_LIST_FILE - if [[ -e $${lang^^}_SRC_LIST_FILE ]]; then - . $${lang^^}_SRC_LIST_FILE - eval "${lang^^}_SRC_LIST=\"\${${lang^^}_SRC_LIST//\.${extname,,}/$'.${extname,,}\n'}\"" - else - eval "${lang^^}_SRC_LIST_FILE=\"dest/dest-libtui.so/${lang,,}-src-file.lst\"" - echo ${lang^^}_SRC_LIST_FILE=$${lang^^}_SRC_LIST_FILE - [[ -e $${lang^^}_SRC_LIST_FILE ]] && eval "${lang^^}_SRC_LIST=( $(cat $${lang^^}_SRC_LIST_FILE | grep -v \"^[[:space:]]*#\" | sed -e \"s/[[:space:]]*#.*$//g\") )" - fi - - [[ -z ${${lang^^}_SRC_LIST[@]} ]] && echo no src file in src list. && return 0 - -# echo ${lang^^}_SRC_LIST=${${lang^^}_SRC_LIST[$i]} -} - -src2exe () +step_link () { - local lang= + local linkstep= - for lang in $1; do - TASK_RUNNING ${lang^^}_LANG_CMPL - done -} - + CCFLAGS_CALLGRAPH "step_link ($@)" + taskinfo_dbgout "OBJ_LIST=$OBJ_LIST" -# -# -# -c_lang_tpchk () -{ - : -} + DST_FILE="${OUTPUT_DIR}/${!2}" + SRC_FILE=( $OBJ_LIST ) -# -# -# -cxx_lang_tpchk () -{ - : -} + taskinfo_dbgout "DST_FILE=$DST_FILE" + taskinfo_dbgout "DEST_NAME=$DEST_NAME" + taskinfo_dbgout "DEST_FILENAME=$DEST_FILENAME" + taskinfo_dbgout "DEST_TYPE=$DEST_TYPE" + taskinfo_dbgout "DEST_EXTNAME=$DEST_EXTNAME" + + if [[ ${DEST_TYPE:0:1} == '[' ]]; then + DEST_TYPE=${DEST_TYPE:1:-1} + fi + taskinfo_dbgout "DEST_TYPE=$DEST_TYPE" -# -# -# -cpp_lang_tpchk () -{ - : -} + linkstep="STEP_${DEST_TYPE^^}_LINK" + taskinfo_dbgout "${linkstep}=${!linkstep}" + [[ -z ${!linkstep} ]] && err "dest type ${DEST_TYPE} have not define a step named 'STEP_${DEST_TYPE^^}_LINK'.\n" && return 2 + TASK_RUNNING "${linkstep}" "$@" -# -# -# -asm_lang_tpchk () -{ - : -} + [[ $? != 0 ]] && err "${CHIGHL}[build-link]: link file \"$DEST_FILENAME\" err.${CNORMAL}" && exit && return 2 -# -# -# -sh_lang_tpchk () -{ - : + return 0 } - - - - - - - - - - - - -# -# fsyntax: src2exe -# fdesc: compile srcfile, and output exe file directly. -# src2exe () { - [[ $1 -nt $2 ]] && return 1 -} - -# -# fsyntax: TASK_CMPL [ ... ] -# fdesc: running compile task accroding srcfile sfx name. -# it recognize srcfile, and invoke corresponding function. -# -TASK_CMPL () -{ - local srcfile="$1" - local ext="${srcfile##*.}" - local name="${ext^^}_SRC_CMPL" - - declare -F $name >/dev/null 2>&1 - [[ -v $name && $? == 0 ]] && ${!name} "$@" -} - -# -# fsyntax: TASK_LINK -# fdesc: compile obj list to dest accroding dest type. -# -TASK_LINK () -{ - : + local lang= + + for lang in $1; do + TASK_RUNNING STEP_${lang^^}_LANG_CMPL + done } - - - - ############################## # section: file tail ############################## +return 0 - -# -# fsyntax: TASK_STEP_RUNNING -# fdesc: running tasks by the name of var in arg. -# -TASK_STEP_RUNNING () -{ - local step= - local stepdef=( ${!1} ) - - for step in $stepdef; do - declare -F $step >/dev/null 2>&1 - [[ $? == 0 ]] && shift 2; $step "$@" - declare -F ${!step} >/dev/null 2>&1 - [[ -v $step && $? == 0 ]] && shift 2; ${!step} SRC_FILE "$@" - done -} - -# -aslkffoo () -{ - declare -F $1 >/dev/null 2>&1 - [[ $? == 0 ]] && shift 2; $1 "$@" - declare -F ${!1} >/dev/null 2>&1 - [[ -v $1 && $? == 0 ]] && shift 2; ${!1} SRC_FILE "$@" -} diff --git a/build/shlib/toolchain.shlib b/build/shlib/toolchain.shlib index e556cb2..8b82b55 100644 --- a/build/shlib/toolchain.shlib +++ b/build/shlib/toolchain.shlib @@ -110,6 +110,25 @@ CCFLAGS_DEPHDR_EVL=' -MT ${DST_FILE[0]} -MD -MP -MF ${DST_FILE[1]} ' ###################### +# +# fsyntax: src2dst_filename +# fdesc: compile each src file. +# +src2dst_filename () +{ + local ext= + local dst= + ext="${SRC_FILE[0]##*.}" + + obj="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj//\.$ext/\.o}" + + DST_FILE[0]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${SRC_FILE[0]//\.$ext/\.o}" + DST_FILE[1]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${SRC_FILE[0]//\.$ext/\.dep}" + SRC_FILE[0]="${SRCPKG_TOPDIR}/${SRC_FILE[0]}" +} + + + ############################################################################# # compile with dep info # copy code directly from build-aux/depcomp. @@ -385,7 +404,7 @@ asm2o () # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${AS} ${CFLAGS_EXT} ${ASFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE}" + cmd="${AS} ${ASFLAGS_OUT} ${ASFLAGS_EXT} ${ASFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE}" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -405,36 +424,45 @@ asm2o () fi return $ret - - - local SRC_FILE="$1" - local DST_FILE="${2:=${1//\.c/\.o}}" - } # -# fsyntax: c2o +# fsyntax: c2o # fdesc: c语言程序.c文件编译成.o文件。 c2o () { local cmd= local output= local ret= + local srcdir= + local dstdir= + + info "c2o ($@)\n" + + SRC_FILE[0]="$1" + src2dst_filename + + srcdir="$(dirname ${SRC_FILE[0]})" + dstdir="$(dirname ${DST_FILE[0]})" + mkdir -p $srcdir $dstdir + + echo "CFLAGS_EVL=$CFLAGS_EVL" + echo "CFLAGS=$CFLAGS" - CFLAGS_DEPHDR="" - CFLAGS_CALLGRAPH="" - if [[ -e ${DST_FILE[1]} ]]; then - eval "$CCFLAGS_DEPHDR=\"$CCFLAGS_DEPHDR_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log + CCFLAGS_DEPHDR="" + CCFLAGS_CALLGRAPH="" + if [[ -n ${DST_FILE[1]} ]]; then + eval "CCFLAGS_DEPHDR=\"$CCFLAGS_DEPHDR_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log fi - if [[ -e ${DST_FILE[2]} ]]; then - eval "$CFLAGS_CALLGRAPH=\"$CFLAGS_CALLGRAPH_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log + if [[ -n ${DST_FILE[2]} ]]; then + eval "CCFLAGS_CALLGRAPH=\"$CCFLAGS_CALLGRAPH_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log fi echo CCFLAGS_DEPHDR="$CCFLAGS_DEPHDR" >> ${OUTPUT_DIR}/build-dbgout.log - echo CFLAGS_CALLGRAPH="$CFLAGS_CALLGRAPH" >> ${OUTPUT_DIR}/build-dbgout.log + echo CCFLAGS_CALLGRAPH="$CCFLAGS_CALLGRAPH" >> ${OUTPUT_DIR}/build-dbgout.log # ${SRC_DEP_OPT:="$CCFLAGS_DEPHDR"} ==> $CCFLAGS_DEPHDR - cmd="${CC} ${CFLAGS_EXT} ${CFLAGS} $CCFLAGS_DEPHDR ${CFLAGS_CALLGRAPH} -c ${SRC_FILE[0]} -o ${DST_FILE[0]}" + cmd="${CC} ${CFLAGS_OUT} ${CFLAGS_EXT} ${CFLAGS} ${CCFLAGS_DEPHDR} ${CCFLAGS_CALLGRAPH} -c ${SRC_FILE[0]} -o ${DST_FILE[0]}" output="$( eval $cmd 2>&1; )" ret=$? @@ -451,72 +479,10 @@ c2o () echo "$output" >> ${OUTPUT_DIR}/build-dbgout.log fi + [[ $ret != 0 ]] && ret=2 return $ret } -INPUT[0]="" -OUTPUT[0]="" - -CMPL_FUNC () -{ - local srcdir="$(dirname ${SRC_FILE[0]})" - local dstdir="$(dirname ${DST_FILE[0]})" - local src="${SRC_FILE[0]}" - local dst="${DST_FILE[0]}" - local dep="${DST_FILE[1]}" - local dephdr= - local file= - local flag= - - mkdir -p $srcdir $dstdir - - echo srcdir=$srcdir >> ${OUTPUT_DIR}/build-dbgout.log - - echo src=$src >> ${OUTPUT_DIR}/build-dbgout.log - echo dst=$dst >> ${OUTPUT_DIR}/build-dbgout.log - echo dep=$dep >> ${OUTPUT_DIR}/build-dbgout.log - - if [[ ! -e "${DST_FILE[0]}" ]]; then - flag=compile - fi - - if [[ -e "${DST_FILE[1]}" ]]; then - dephdr=( $(cat ${DST_FILE[1]} | grep -e ":[[:blank:]]*$") ) - echo dephdr="${dephdr[@]}\n" >> ${OUTPUT_DIR}/build-dbgout.log - else - flag=compile - fi - - # src file time stamp chk. - if [[ $src -nt $dst || $src -nt $dep ]]; then - flag=compile - echo "$src is newer then $dst." >> ${OUTPUT_DIR}/build-dbgout.log - fi - - # hdr file time stamp chk. - for file in ${dephdr[@]}; do -# [[ ${file:0:1} != '/' ]] && file="$srcdir/$file" - file=${file:0:-1} - echo file="${file}" >> ${OUTPUT_DIR}/build-dbgout.log - if [[ $file -nt $dst ]]; then - flag=compile - echo "$file is newer then $dst." >> ${OUTPUT_DIR}/build-dbgout.log - break; - fi - done - - echo flag=$flag >> ${OUTPUT_DIR}/build-dbgout.log - - if [[ $flag != compile ]]; then - return 0 - fi - - echo [CC] ${SRC_FILE[0]} ${DST_FILE[0]} >> ${OUTPUT_DIR}/build-compact-info.log - - c2o - return $? -} - # # fsyntax: cxx2o # fdesc: .cc文件编译成.o文件。 @@ -527,19 +493,19 @@ cxx2o () local ret= CCFLAGS_DEPHDR="" - CFLAGS_CALLGRAPH="" - if [[ -e ${DST_FILE[1]} ]]; then - eval "$CCFLAGS_DEPHDR=\"$CCFLAGS_DEPHDR_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log + CCFLAGS_CALLGRAPH="" + if [[ -n ${DST_FILE[1]} ]]; then + eval "CCFLAGS_DEPHDR=\"$CCFLAGS_DEPHDR_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log fi - if [[ -e ${DST_FILE[2]} ]]; then - eval "$CFLAGS_CALLGRAPH=\"$CFLAGS_CALLGRAPH_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log + if [[ -n ${DST_FILE[2]} ]]; then + eval "CCFLAGS_CALLGRAPH=\"$CCFLAGS_CALLGRAPH_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log fi echo CCFLAGS_DEPHDR="$CCFLAGS_DEPHDR" >> ${OUTPUT_DIR}/build-dbgout.log - echo CFLAGS_CALLGRAPH="$CFLAGS_CALLGRAPH" >> ${OUTPUT_DIR}/build-dbgout.log + echo CCFLAGS_CALLGRAPH="$CCFLAGS_CALLGRAPH" >> ${OUTPUT_DIR}/build-dbgout.log # ${SRC_DEP_OPT:="$CCFLAGS_DEPHDR"} ==> $CCFLAGS_DEPHDR - cmd="${CXX} ${CXXFLAGS_EXT} ${CXXFLAGS} $CCFLAGS_DEPHDR ${CCFLAGS_CALLGRAPH} -c ${SRC_FILE[0]} -o ${DST_FILE[0]}" + cmd="${CXX} ${CXXFLAGS_OUT} ${CXXFLAGS_EXT} ${CXXFLAGS} ${CCFLAGS_DEPHDR} ${CCFLAGS_CALLGRAPH} -c ${SRC_FILE[0]} -o ${DST_FILE[0]}" output="$( eval $cmd 2>&1; )" ret=$? @@ -570,20 +536,20 @@ cpp2o () local ret= CCFLAGS_DEPHDR="" - CFLAGS_CALLGRAPH="" - if [[ -e ${DST_FILE[1]} ]]; then - eval "$CCFLAGS_DEPHDR=\"$CCFLAGS_DEPHDR_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log + CCFLAGS_CALLGRAPH="" + if [[ -n ${DST_FILE[1]} ]]; then + eval "CCFLAGS_DEPHDR=\"$CCFLAGS_DEPHDR_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log fi - if [[ -e ${DST_FILE[2]} ]]; then - eval "$CFLAGS_CALLGRAPH=\"$CFLAGS_CALLGRAPH_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log + if [[ -n ${DST_FILE[2]} ]]; then + eval "CCFLAGS_CALLGRAPH=\"$CCFLAGS_CALLGRAPH_EVL\"" >> ${OUTPUT_DIR}/build-dbgout.log fi echo CCFLAGS_DEPHDR="$CCFLAGS_DEPHDR" >> ${OUTPUT_DIR}/build-dbgout.log - echo CFLAGS_CALLGRAPH="$CFLAGS_CALLGRAPH" >> ${OUTPUT_DIR}/build-dbgout.log + echo CCFLAGS_CALLGRAPH="$CCFLAGS_CALLGRAPH" >> ${OUTPUT_DIR}/build-dbgout.log # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${CPP} ${CPPFLAGS_EXT} ${CPPFLAGS} ${CCFLAGS_DEPHDR} ${CFLAGS_CALLGRAPH} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" + cmd="${CPP} ${CPPFLAGS_OUT} ${CPPFLAGS_EXT} ${CPPFLAGS} ${CCFLAGS_DEPHDR} ${CCFLAGS_CALLGRAPH} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -626,7 +592,7 @@ asm2exe () # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${CC} ${CFLAGS_EXT} ${CFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" + cmd="${CC} ${ASFLAGS_OUT} ${ASFLAGS_EXT} ${CFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -659,7 +625,7 @@ c2exe () # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${CC} ${CFLAGS_EXT} ${CFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" + cmd="${CC} ${CFLAGS_OUT} ${CFLAGS_EXT} ${CFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -693,7 +659,7 @@ cxx2exe () # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${CXX} ${CPPFLAGS_EXT} ${CPPFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" + cmd="${CXX} ${CXXFLAGS_OUT} ${CXXFLAGS_EXT} ${CPPFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -727,7 +693,7 @@ cpp2exe () # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${CPP} ${CPPFLAGS_EXT} ${CPPFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" + cmd="${CPP} ${CPPFLAGS_OUT} ${CPPFLAGS_EXT} ${CPPFLAGS} ${LDFLAGS} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]}" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -816,18 +782,41 @@ o2o () } # -# fsyntax: o2a +# fsyntax: src2dst_filename +# fdesc: compile each src file. +# +link_filename_fix () +{ + local ext= + local dst= + + ext="${LANG_EXT_NAME[${lang,,}]}" + #"${SRC_FILE[0]##*.}" + +# obj="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj//\.$ext/\.o}" + +# DST_FILE[0]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${DST_FILE[0]}" + + for ((i=0; i<${#SRC_FILE[@]}; i++)); do + SRC_FILE[$i]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${SRC_FILE[$i]}" + done +} + +# +# fsyntax: o2lib # fdesc: .o文件链接成.a文件。 # -o2a () +o2lib () { local cmd= local output= local ret= + link_filename_fix + # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${AR} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]} ${ARFLAGS}" + cmd="${AR} ${ARFLAGS} ${DST_FILE[0]} $(echo ${SRC_FILE[@]})" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -845,7 +834,9 @@ o2a () echo "$output" echo "$output" >> ${OUTPUT_DIR}/build-dbgout.log fi - + + ranlib ${DST_FILE[0]} + return $ret } @@ -867,7 +858,10 @@ o2dlib () local cmd= local output= local ret= - + + # XXX: if some symbol display 'undefined reference to ', maybe the lib param -lxxx + # is before then the lib -lyyy which is referenced by some symbol. + # # ${CC} ${LDFLAGS} ${LIB_OBJECT} ${LIBS} cmd="${LINK} $(echo ${SRC_FILE[@]}) -o ${DST_FILE[0]} ${LDFLAGS} ${LDFLAGS_SHARED}" @@ -899,6 +893,8 @@ o2exe () local output= local ret= + link_filename_fix + # cmd="${SRC_FILE[@]}" # attention -lncurses paramter must be put after .o file, @@ -991,7 +987,7 @@ progstrip () # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. - cmd="${STRIP} $(echo ${SRC_FILE[@]})" + cmd="${STRIP} $(echo ${DST_FILE[@]})" echo -ne "${CHIGHL} === ${cmd}${CNORMAL}\n" @@ -1023,6 +1019,8 @@ prog_sizeinfo () local output= local ret= + echo "prog_sizeinfo ($@)" + # attention -lncurses paramter must be put after .o file, # or it report err that symbol not found. cmd="${SIZE} $(echo ${SRC_FILE[@]})" @@ -1135,19 +1133,10 @@ prog_var_symbs () # -# fsyntax: bin2hex -# fdesc: bin二进制文件转换成hex字符串。 -# -exelist () -{ - : -} - -# -# fsyntax: bin2hex +# fsyntax: exe2hex # fdesc: bin二进制文件转换成hex字符串。 # -objlist () +exe2hex () { : } @@ -1204,5 +1193,82 @@ fhex2fbin () # section: file tail ###################### +return 0 + + + + +# +# fsyntax: bin2hex +# fdesc: bin二进制文件转换成hex字符串。 +# +objlist () +{ + : +} + + + +INPUT[0]="" +OUTPUT[0]="" + +CMPL_FUNC () +{ + local srcdir="$(dirname ${SRC_FILE[0]})" + local dstdir="$(dirname ${DST_FILE[0]})" + local src="${SRC_FILE[0]}" + local dst="${DST_FILE[0]}" + local dep="${DST_FILE[1]}" + local dephdr= + local file= + local flag= + + mkdir -p $srcdir $dstdir + echo srcdir=$srcdir >> ${OUTPUT_DIR}/build-dbgout.log + + echo src=$src >> ${OUTPUT_DIR}/build-dbgout.log + echo dst=$dst >> ${OUTPUT_DIR}/build-dbgout.log + echo dep=$dep >> ${OUTPUT_DIR}/build-dbgout.log + + if [[ ! -e "${DST_FILE[0]}" ]]; then + flag=compile + fi + + if [[ -e "${DST_FILE[1]}" ]]; then + dephdr=( $(cat ${DST_FILE[1]} | grep -e ":[[:blank:]]*$") ) + echo dephdr="${dephdr[@]}\n" >> ${OUTPUT_DIR}/build-dbgout.log + else + flag=compile + fi + + # src file time stamp chk. + if [[ $src -nt $dst || $src -nt $dep ]]; then + flag=compile + echo "$src is newer then $dst." >> ${OUTPUT_DIR}/build-dbgout.log + fi + + # hdr file time stamp chk. + for file in ${dephdr[@]}; do +# [[ ${file:0:1} != '/' ]] && file="$srcdir/$file" + file=${file:0:-1} + echo file="${file}" >> ${OUTPUT_DIR}/build-dbgout.log + if [[ $file -nt $dst ]]; then + flag=compile + echo "$file is newer then $dst." >> ${OUTPUT_DIR}/build-dbgout.log + break; + fi + done + + echo flag=$flag >> ${OUTPUT_DIR}/build-dbgout.log + + if [[ $flag != compile ]]; then + return 0 + fi + + echo [CC] ${SRC_FILE[0]} ${DST_FILE[0]} >> ${OUTPUT_DIR}/build-compact-info.log + + c2o + return $? +} diff --git a/build/tmp/constructor-tmp.shlib b/build/tmp/constructor-tmp.shlib new file mode 100644 index 0000000..0b84ffd --- /dev/null +++ b/build/tmp/constructor-tmp.shlib @@ -0,0 +1,302 @@ + + +# +# fsyntax: TASK_CMPL [ ... ] +# fdesc: running compile task accroding srcfile sfx name. +# it recognize srcfile, and invoke corresponding function. +# +TASK_CMPL () +{ + local srcfile="$1" + local ext="${srcfile##*.}" + local name="${ext^^}_SRC_CMPL" + + declare -F $name >/dev/null 2>&1 + [[ -v $name && $? == 0 ]] && ${!name} "$@" +} + +# +# fsyntax: TASK_LINK +# fdesc: compile obj list to dest accroding dest type. +# +TASK_LINK () +{ + : +} + +# +# fsyntax: TASK_STEP_RUNNING +# fdesc: running tasks by the name of var in arg. +# +TASK_STEP_RUNNING () +{ + local step= + local stepdef=( ${!1} ) + + for step in $stepdef; do + declare -F $step >/dev/null 2>&1 + [[ $? == 0 ]] && shift 2; $step "$@" + declare -F ${!step} >/dev/null 2>&1 + [[ -v $step && $? == 0 ]] && shift 2; ${!step} SRC_FILE "$@" + done +} + +# +aslkffoo () +{ + declare -F $1 >/dev/null 2>&1 + [[ $? == 0 ]] && shift 2; $1 "$@" + declare -F ${!1} >/dev/null 2>&1 + [[ -v $1 && $? == 0 ]] && shift 2; ${!1} SRC_FILE "$@" +} + + + +dest_build () +{ + # TBD: + # dispose parameters, + # build each dest. + local data= + local dest="${!1}" + + info "..................... dest_build ($dest)\n" + + if [[ -z $dest ]]; then + warn "specified list var name '$1' is not valid.\n" + return 2 + fi + + # init one dest cfg paramter + eval "DEST_GENERAL_CFG_DIR=\"${DEST_GENERAL_CFG_DIR_EVL}\"" + dest_param_reset + one_dest_init dest-general + one_dest_init $1 + + CFLAGS="$CFLAGS" + + mkdir -p ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/ + + dbgout_construct_param + + # check src file list to be compiled. + check_and_get_src_compile_list + + # compile if needed. + if [[ $? == 0 ]]; then + compile_src_list + + shift 1 + while read data; do + [[ -z $data ]] && continue + SRC_FILE=( $data ) + dbgoutd "SRC_FILE=${SRC_FILE[@]}\n" +# TASK_RUNNING $task SRC_FILE "$@" + TASK_RUNNING STEP_DEFAULT_DEST $SRC_FILE "$@" + # break tasklist running if one of them failed. + [[ $? != 0 ]] && return 2 + done <<< "${!list}" + + [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1\n" && return 2 + fi + + + + + + + + return 0 + + + DEST_CFG_DIR_NAME="$dest" + + construct_one_dest $dest + [[ $? != 0 ]] && err "${CHIGHL}[build-dest][${dest#*-}]: build dest file \"$dest\" err.${CNORMAL}" && return 2 + return 0 +} + +# +# fsyntax: construct_one_dest +# fdesc: construct one dest executables. +# +construct_one_dest () +{ + local dest=${dest#*-} + local step= + local ret= + + dbgoutd "############################\n" + dbgoutd "construct_one_dest(${1#*-})\n" + + + + + # try to check dest and obj tp, it output OBJ_LIST. + dest_link_check $dest + [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2\n" && return 2 + + link_dest $dest + return $? +} + +# +# fsyntax: check_and_get_src_compile_list +# fdesc: check if src file is newer then dest file in $obj, +# +check_and_get_src_compile_list () +{ + local obj= + local srcfile= + local dstfile= + local SRC_LIST_N2B_CMPL= + local langlist=( $1 ) + local lang= + local vname= + + # + # check ${lang}_SRC_LIST list. + # + for lang in ${langlist[@]} ; do + vname="${lang}_SRC_LIST[@]" + if [[ -z ${!vname} ]]; then + eval ${lang}_SRC_CMPL_LIST="" + task_info no src file in src list \'\${${lang}_SRC_LIST[@]}\'. + continue + fi + + # get obj file list that has been compiled. + OBJ_LIST_N2B_CPLE=`cd ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/; ls -1 ${!vname//\.c/\.o} 2>/dev/null` + [[ -z "$OBJ_LIST_N2B_CPLE" ]] && eval ${lang}_SRC_CMPL_LIST=\"\${\!vname}\" && continue + + # test compiled obj file, to check if it need to be recompiled. +# dbgoutd "OBJ_LIST_N2B_CPLE=${OBJ_LIST_N2B_CPLE}\n" + for obj in ${OBJ_LIST_N2B_CPLE}; do + srcfile="${obj//\.o/\.cpp}" + dstfile="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" + + # check if file does not need to be compiled. + if [[ "${dstfile}" -nt "${srcfile}" ]]; then + # hdr file tp chk. + lang_src_hdrtpchk $dstfile + [[ $? == 0 ]] && SRC_LIST_N2B_CMPL+="${srcfile}"$'\n' + fi + done + + # get files to be compiled. + if [[ -n $SRC_LIST_N2B_CMPL ]]; then + flag=compile + eval ${lang}_SRC_CMPL_LIST="`comm <(echo "${!vname}" | sort) <(echo "$SRC_LIST_N2B_CMPL" | sort) -1`" + # | sed -e "/^\t/d" + fi + eval task_info ${lang}_SRC_CMPL_LIST="\${${lang}_SRC_CMPL_LIST}" + done + + return 0 +} + +SYS_INC_LIST= +APP_INC_LIST= + +full_lang_src_tpchk () +{ + local obj= + local srcfile= + local dstfile= + local SRC_LIST_N2B_CMPL= + local langlist=( $1 ) + local lang= + local vname= + + info "lang_src_tpchk ($@)" + + # + # check ${lang}_SRC list. + # + for lang in ${langlist[@]} ; do + vname="${lang}_SRC_LIST[@]" + if [[ -z ${!vname} ]]; then + eval ${lang}_SRC_CMPL_LIST="" + task_info "no src file in src list \'\${${lang}_SRC_LIST[@]}\'." + continue + fi + + # get obj file list that has been compiled. + OBJ_LIST_N2B_CPLE=`cd ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/; ls -1 ${!vname//\.c/\.o} 2>/dev/null` + [[ -z "$OBJ_LIST_N2B_CPLE" ]] && eval ${lang}_SRC_CMPL_LIST=\"\${\!vname}\" && continue + + # test compiled obj file, to check if it need to be recompiled. +# dbgoutd "OBJ_LIST_N2B_CPLE=${OBJ_LIST_N2B_CPLE}\n" + for obj in ${OBJ_LIST_N2B_CPLE}; do + srcfile="${obj//\.o/\.cpp}" + dstfile="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" + + # check if file does not need to be compiled. + if [[ "${dstfile}" -nt "${srcfile}" ]]; then + # hdr file tp chk. + lang_src_hdrtpchk $dstfile + [[ $? == 0 ]] && SRC_LIST_N2B_CMPL+="${srcfile}"$'\n' + fi + done + + # get files to be compiled. + if [[ -n $SRC_LIST_N2B_CMPL ]]; then + flag=compile + eval ${lang}_SRC_CMPL_LIST="`comm <(echo "${!vname}" | sort) <(echo "$SRC_LIST_N2B_CMPL" | sort) -1`" + # | sed -e "/^\t/d" + fi + eval task_info "${lang}_SRC_CMPL_LIST=\"\${${lang}_SRC_CMPL_LIST}\"" + done + + return 0 +} + +# +# fsyntax: desttpchk +# fdesc: chk tp between src-file and dest-file. +# +desttpchk () +{ + local extname="${DEST_EXTNAME}" + local srcfile= + local destfile="${!2}" + + task_info "desttpchk ($@)" + task_info "destfile($2)=$destfile" + + srcfile="${1}[@]" + srcfile="${srcfile}" + [[ -z "$srcfile" ]] && err "input file list '${1}' does not have content" && return 2 + [[ -z "$destfile" ]] && err "output file list '${2}' does not have content" && return 2 + + [[ ! -f ${destfile} ]] && return 0 + [[ ${srcfile} -nt ${destfile} ]] && return 2 +} + +# +# fsyntax: tpchk +# fdesc: chk tp between src-file and dest-file. +# +tpchk () +{ + local extname="${LANG_EXT_NAME[$2]}" + local srcfile="$1" + local destfile="${OUTPUT_DIR}/${3}/${1//\.${extname}/\.o}" + + task_info "tpchk ($@)" + task_info "destfile=$destfile" + [[ ! -f ${destfile} ]] && return 0 + [[ ${srcfile} -nt ${destfile} ]] && return 2 +} + + + +# +# fsyntax: src2exe +# fdesc: compile srcfile, and output exe file directly. +# +src2exe () +{ + [[ $1 -nt $2 ]] && return 2 +} + diff --git a/build/tmp/constructor.tmp b/build/tmp/constructor.tmp new file mode 100644 index 0000000..83f706d --- /dev/null +++ b/build/tmp/constructor.tmp @@ -0,0 +1,360 @@ + + +# +# +# +__setvar () +{ + eval "$@" +} + + +running_dest_steps () +{ + : +} + +# +# fsyntax: construct_one_dest +# fdesc: construct one dest executables. +# +construct_one_dest () +{ + local dest=${dest#*-} + local step= + local ret= + + dbgoutd "############################\n" + dbgoutd "construct_one_dest(${1#*-})\n" + + # init one dest cfg paramter + eval "DEST_GENERAL_CFG_DIR=\"${DEST_GENERAL_CFG_DIR_EVL}\"" + dest_param_reset + one_dest_init dest-general + one_dest_init $1 + + CFLAGS="$CFLAGS" + + mkdir -p ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/ + + dbgout_construct_param + + # check src file list to be compiled. + check_and_get_src_compile_list + + # compile if needed. + if [[ $? == 0 ]]; then + compile_src_list + + [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1\n" && return 1 + fi + + # try to check dest and obj tp, it output OBJ_LIST. + dest_link_check $dest + [[ $? != 0 ]] && dbgoutd "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2\n" && return 1 + + link_dest $dest + return $? +} + +# +# fsyntax: construct_all_dest +# fdesc: construct all dest executables. +# +construct_all_dest () +{ + # + # load valid each dest. + # + if [[ -n $BUILD_DEST ]]; then +# BUILD_DEST="${BUILD_DEST//dest-/$'\ndest-'}" + for dest in $BUILD_DEST; do +# declare -g -A DEST_CFG_DIR[${dest#*dest.?-}]="${SRCPKG_TOPDIR}/build/$dest" + DEST_CFG_DIR_NAME="$dest" + construct_one_dest $dest + [[ $? != 0 ]] && err "${CHIGHL}[build-dest][${dest#*-}]: build dest file \"$dest\" err.${CNORMAL}" && return 1 + done +# DEST_LIST=( ${DEST_CFG_DIR[@]} ) +# echo DEST_CFG_DIR[@]=${DEST_CFG_DIR[@]} + else + err "no build dest defined in ${SRCPKG_TOPDIR}/build/dest/dest.list.\n" + return 1 + fi +} + +################################################# +# public +################################################# +eval "SRCPKG_TOPDIR=\"$SRCPKG_TOPDIR_EVAL\"" + +# +# fsyntax: get_CFLAGS +# fdesc: get CFLAGS. +# +get_CFLAGS () +{ + : +} + + +src_obj_map[s]="o" +src_obj_map[S]="o" +src_obj_map[c]="o" +src_obj_map[cpp]="o" + +src_obj_map[asm]="obj" +#src_obj_map[c]="obj" +#src_obj_map[cpp]="obj" + +# +# fsyntax: compile_src_file +# fdesc: compile each src file. +# +compile_src_file () +{ + local ret= + + SRC_FILE[0]="$1" + + src2dst_filename +# DST_FILE[0]="output/test.o" +# DST_FILE[1]="output/test.dep" + + CMPL_FUNC + + return $? +} + +foo () +{ +# local C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.list" + + echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE + if [[ -e $C_SRC_LIST_FILE ]]; then + . $C_SRC_LIST_FILE + C_SRC_LIST="${C_SRC_LIST//\.c/$'.c\n'}" + else + C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.lst" + echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE + [[ -e $C_SRC_LIST_FILE ]] && C_SRC_LIST=( $(cat $C_SRC_LIST_FILE | grep -v "^[[:space:]]*#" | sed -e "s/[[:space:]]*#.*$//g") ) + fi +} + +# +# fsyntax: compile_src_list +# fdesc: compile each src file in src file list. +# +compile_src_list () +{ + local file= + local c_src_list= + local cpp_src_list= + + for file in $C_SRC_CMPL_LIST $CPP_SRC_CMPL_LIST; do + [[ -z "$file" ]] && continue + compile_src_file $file + [[ $? != 0 ]] && err "${CHIGHL}[build-compile]: compile file \"$file\" err.${CNORMAL}" && return 1 + done + + return 0 +} + + +# +# fsyntax: check_and_get_src_compile_list +# fdesc: check if src file is newer then dest file in $obj, +# +check_and_get_src_compile_list () +{ + local obj= + local srcfile= + local dstfile= + local SRC_LIST_N2B_CMPL= + + #C_SRC_LIST="${C_SRC_LIST//.c/.c$'\n'}" + #echo C_SRC_LIST="${C_SRC_LIST}" + + # check if no file to be compiled, and return 0. + [[ -z ${C_SRC_LIST[@]} && -z ${CPP_SRC_LIST[@]} ]] && echo no src file in src list. && return 0 + + # + # CPP_SRC_LIST list. + # + if [[ -n "$C_SRC_LIST" ]]; then + # get compiled obj file list + OBJ_LIST_N2B_CPLE=`cd ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/; ls ${C_SRC_LIST[@]//\.c/\.o} 2>/dev/null` + + # test compiled obj file, to check if it need to be recompiled. + if [[ -n "$OBJ_LIST_N2B_CPLE" ]]; then + dbgoutd "OBJ_LIST_N2B_CPLE=${OBJ_LIST_N2B_CPLE}\n" + for obj in ${OBJ_LIST_N2B_CPLE}; do + srcfile="${obj//\.o/\.c}" + dstfile="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" + + # check if file does not need to be compiled. + if [[ "$dstfile" -nt "${srcfile}" ]]; then + SRC_LIST_N2B_CMPL+="${srcfile}"$'\n' + flag=compile + fi + done + fi + + # filter compiled file. + # compare two list, delete lines in C_SRC_LIST list with that in SRC_LIST_N2B_CMPL. + # and store it to C_SRC_CMPL_LIST. + if [[ -n $SRC_LIST_N2B_CMPL ]]; then + C_SRC_CMPL_LIST="`comm <(echo "$C_SRC_LIST" | sort) <(echo "$SRC_LIST_N2B_CMPL" | sort) | sed -e "/^\t/d"`" + else + C_SRC_CMPL_LIST="$C_SRC_LIST" + fi + + echo C_SRC_CMPL_LIST="$C_SRC_CMPL_LIST" + fi + + # + # CPP_SRC_LIST list. + # + if [[ -n "$CPP_SRC_LIST" ]]; then + # get compiled obj file list + OBJ_LIST_N2B_CPLE="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${CPP_SRC_LIST[@]//\.c/\.o}" + + # test compiled obj file, to check if it need to be recompiled. + if [[ -n "$OBJ_LIST_N2B_CPLE" ]]; then +# dbgoutd "OBJ_LIST_N2B_CPLE=${OBJ_LIST_N2B_CPLE}\n" + for obj in ${OBJ_LIST_N2B_CPLE}; do + srcfile="${obj//\.o/\.cpp}" + dstfile="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" + + # check if file does not need to be compiled. + if [[ "$dstfile" -nt "${srcfile}" ]]; then + SRC_LIST_N2B_CMPL+="${srcfile}"$'\n' + flag=compile + fi + done + fi + + [[ -n $SRC_LIST_N2B_CMPL ]] && CPP_SRC_CMPL_LIST="`comm <(echo "$CPP_SRC_LIST" | sort) <(echo "$SRC_LIST_N2B_CMPL" | sort) | sed -e "/^\t/d"`" + echo CPP_SRC_CMPL_LIST="$CPP_SRC_CMPL_LIST" + fi + + return 0 +} + +# +# fsyntax: dest_link_check +# fdesc: check dest if it is not exist, or file in $obj is newer then dest, +# +dest_link_check () +{ + local obj= + local file= + local flag= + + #SRC_FILE=( ${DS3T_FILE[@]} ) + DST_FILE[0]="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/$1" + + # translate src file list to obj file list + #[[ -n "$C_SRC_LIST" ]] && OBJ_LIST=" ${C_SRC_LIST[@]//\.c/\.o} " + #[[ -n "$CPP_SRC_LIST" ]] && OBJ_LIST+=" ${CPP_SRC_LIST[@]//\.cpp/\.o} " + # translate to multi-line form. + #OBJ_LIST="$(echo ${OBJ_LIST[@]} | tr -s ' ' $'\n')" + + #SRC_FILE=( `cd ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/; ls ${C_SRC_LIST[@]//\.c/\.o} 2>/dev/null` ) + SRC_FILE="${C_SRC_LIST[@]//\.c/\.o}" + SRC_FILE+=" ${CPP_SRC_LIST[@]//\.c/\.o}" + SRC_FILE="$(echo ${SRC_FILE} | tr '[\ |$'\\n']' ',')" +# if [[ ${SRC_FILE[@]: -1:1} == ',' ]]; then +# SRC_FILE="${SRC_FILE%,}" +# fi + SRC_FILE="ls ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/{${SRC_FILE:0:-1}} 2>/dev/null" + +# echo "$SRC_FILE" + #ls ${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/{${SRC_FILE:0:-1}} 2>/dev/null" + +# set -x + SRC_FILE="`eval $SRC_FILE`" +# set +x + +# echo === SRC_FILE="${SRC_FILE[@]}" +# echo === DST_FILE="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${DST_FILE[@]}" + + flag=link; + if [[ -f ${DST_FILE[0]} ]]; then + # dest is linked, check if obj to be compiled. + + # do not use for loop here, especially in large number + # of file to be compiled. + # for obj in ${OBJ_LIST[@]}; do + while read obj; do + file="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/${obj}" + echo file=$file + [[ -f $file && $file -nt ${DST_FILE[0]} ]] && flag=compile + #OBJ_LIST+="$obj"$'\n'; + done <<< "${SRC_FILE[@]}" + + echo "OBJ_LIST=$OBJ_LIST" + + [[ $flag == 'link' ]] && info "destination \"${DST_FILE[0]}\" has been existing." && return 1 + else + # if dest is not exist, all file should try to be recompiled. + return 0 + fi + + if [[ $flag == 'link' ]]; then + return 0 + else + return 1 + fi +} + +# +# fsyntax: link_dest +# fdesc: link .o files to an executable. +# +link_dest () +{ +# SRC_FILE=( ${OBJ_LIST[@]} ) + DST_FILE="${OUTPUT_DIR}/${DEST_CFG_DIR_NAME}/$1" + +# echo === SRC_LIST[@] = ${SRC_LIST[@]} +# echo === DST_FILE[@] = ${DST_FILE[@]} + + o2exe + [[ $? != 0 ]] && err "${CHIGHL}[build-link]: link file \"$1\" err.${CNORMAL}" && return 1 + + return 0 +# fi +} + +# +# fsyntax: compile_src_list +# fdesc: compile each src file in src file list. +# +compile_src_list_bak () +{ + local abc= + local C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.list" + + echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE + if [[ -e $C_SRC_LIST_FILE ]]; then + . $C_SRC_LIST_FILE + C_SRC_LIST="${C_SRC_LIST//\.c/$'.c\n'}" + else + C_SRC_LIST_FILE="dest/dest-libtui.so/c-src-file.lst" + echo C_SRC_LIST_FILE=$C_SRC_LIST_FILE + [[ -e $C_SRC_LIST_FILE ]] && C_SRC_LIST=( $(cat $C_SRC_LIST_FILE | grep -v "^[[:space:]]*#" | sed -e "s/[[:space:]]*#.*$//g") ) + fi + + [[ -z ${C_SRC_LIST[@]} ]] && echo no src file in src list. && return 0 + + echo C_SRC_LIST=${C_SRC_LIST[$i]} + + while read file; do + [[ -z "$file" ]] && continue + + echo file=$file + compile_src_file $file + done < $C_SRC_LIST_FILE +} + + diff --git a/src/bconfig/conf.dir/mconf.o b/src/bconfig/conf.dir/mconf.o new file mode 100644 index 0000000000000000000000000000000000000000..614afd7b7fe1c54f66e44ff224c032365053839f GIT binary patch literal 153512 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 V{zbjt_;+#Xc;ETzXY?=P{x9&(vU&gj literal 0 HcwPel00001 diff --git a/src/bconfig/lxdialog/checklist.o b/src/bconfig/lxdialog/checklist.o dissimilarity index 64% index 55fd513f4a8ccad2072f129e88db4e12189bfa23..de2605433e3a508a4f8bb8e6ea3d77d1f1719198 100644 GIT binary patch delta 129 zcwReUb4O`{g76o91~4!IlNt=13>+JctN6L}iZhB!ib@ib7$*OhHs(mph)*j@%uSu_ zD5K5-RLDI!Q%0RpaPm$dDL(ljkd&FsDXY$?GT9JF>Q0UXlD3l@Wz|I)fvTAq5MT|^ KLifoV`GoF(PS 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 diff --git a/src/bconfig/lxdialog/inputbox.o b/src/bconfig/lxdialog/inputbox.o index a34f022f4bfc16174ac88d269fbc296f99586773..6be9656818571db1cf1b86373c1aba66a18a56bf 100644 GIT binary patch delta 121 zcwU>LwMJ%wg76U@1~4!IlNt=13>+Jcy?D6viZhB!ib@ib7$%<yNY{bYt*;H7a zRS>9*aq>oCWk&JIYlYPrWhP$*k}8w`0!iJ;sv_!)wv&BD)I}MA>X;c2pay7>`{YI* FVF3OT7gYcN delta 1887 zcwS|dZ-^9S9LK*ivwOR@yVK>JSDBV)N1hZO#YIFUC=yfzbzyHr8fIt4+qJpfb>=z8 ztAh;;E`n5?K!gbCRf!k{Mo|O>YDF(h4B@~Ry~#I~7>E#p{eJuW7T3pxna}h6{d<1< z%rnoNT=(H)hbP8rW9a>!>fJZNMdgc`mumU%wUK<6Tkf*8fNQrf@N-}dO45#@3x+PD zCgXE-*>~la3|;OIyJ8r^gTx8CEb^_wzqh6b67HqzX+v)}^oxdm4Z4~06=0MasvG`h zZ`8eQ=okS@hCX2E_YHl}&_@k@+|Zx$pgUmr+z9yA(7zb^H$$%&`VT{2HS~4dp1)_f zX#|u89wTcsTb%_}Z||QD&`Fvt<<%FIYPV8^O+RkWc|E_EMCn4TFc&Em?N@h1BAajT zi;yMJZi;Fk><%PSVWcVvI*Wub4HATjpLuD+58D}9QI<7Zcr#k;_#wi0PJ1~i^OZ`{ zNWl+MZ{F{aAq<0t%&eL!j%4gFsCJf61kDpi)J~ToTO^QCyOiR2fm-ZDUfqk^0d~he zHyOn|bGzly?fEm@HMZ$eGhPj z18Ju^wB$Ceb(LtX0#*y36Fx7T7w!`t6MiB*BV6Hnqrg8*ItnbCxEiPst#Nw(BQn^? zj{AUV(a*BJADFdur*E+R0bmd7HNe}VmqmXpc_$?AOYwg%{tHZc$5$loPaW5VO=pX} zmL_ntBM>e-x}j5!Zs04i|LEum&NJ5mlLbA&4(3BZtDxhT3VLM^F&_qQ6m-5*)cJdv zF0KFZqAqY&_*YRE_^+r7Y#!2jhw#9Vj{8jbv)D@|%^6|6r2X#+Pl^3k=6b46w7S&M zP+50$q^tveDC>kPLU&l(*ADB3HZdoFOUw=QUJG|tbX=pN<4RSn$E#Xztm?Q|n2%6{ z#O-X@!-h%VT?v@rO-aw^1tF%>#d+n|i7L@-^hZe)=gYMjhxtuy##*2MU7OlW&lA)Y zw#w;oaRm5@Dph%#1HJDDe*+$6oo{m|t;h2%?v(XJ9?|`o`~$jg%TLq&_589swPn_* z_tB_6k*ZRsUypYD9p9>x6zAo$?%1n5t3BXZqPK7>8Th+ZkqTUK*r@OwE!_CPIoKcm E51*Cb+W-In diff --git a/src/bconfig/lxdialog/menubox.o b/src/bconfig/lxdialog/menubox.o index 19c99d99b2ac63420cbef22625b5376a99e6172c..bc8c4010b1dc970834444e7f8730580fee2c8d6a 100644 GIT binary patch delta 144 zcwU>~dO&M}g76Jt1~4!IlNt=13>+JcWDJgV>*)Ji*s z{|Fw(NxRHP`>Ws)Y45?(8bm^vCFC9pun75X>_->A0{Jbh^Aa#0U9d*safMgI+6vwT zT;~A~u_MLMr*K!{0}9`!@SO^ON8!Vj9Q%iTis2)LA5!=+g`ZIP8HJz6|MOJ<=js5O zaRo0|#6vP%Q4;=D_#K5uE6xJ(gu;^wpRDlC2RtkZ3l+oD3SX)4bqe30@RY*)6z<>W zAq%f5hBp+xTjBc@eo)~@75=Tlzc2GpgbRw{vcj(`9I|$-=p)1NlL za(W>!eBaC4J_K2Jiw%M4c)n}94hAeMhgqeDnT8(E#;|82=F?!9c|B|NL$B@o_JBXC zd!U{}?6nU9Y&u|N49D%&X+Ag(3pJjQ=@xQ6Se_B+`LtoV0p#o;$mF2U9_%+Pj^J8A zkm~ETXpr2EpYa{LJpF?21|E(iUr14Esc_mhLQDE6NN1Me8{868F5_^63YQw0yzU#l zBGSxrZox0lIKZjmGU&SL5BA%7N~cxzUB?YmL?$dh=91{NM*%!elV-ito1ehxPF~NnTN7z3p!v5J2 z_Tz0Ff;OI?^%U4F0os+chjAc;699e@{VyqaQwsh^d?K!d2BkVJ8qaL9#sitIv45V% z{>2*mSBQVL7P9cN2q`h-gl`ePUHAcw2XaK?ft`~Mew7aX6#qZszas;RMR`CCQT9)a zvcD~iaza;>6BYBs#$LnTrRj;aI@g+Fs#_ zFNtuqn$OAIYMx1=hL?I=4KHC45Qu+=`1cTY0DK_6gTzBj zJVlL8fS)OV%Xd|9e4McpQJVp&{EXCUa3c^FdA;Dq6{e&|CK8@3z zhK<7{;Ct9H!4p*Iae%XgPvF2r|6TBk;NOBb3A=EG9^zB=f?!7QDB)~?5yCkDzY)&G z+crV>|2*8$5!wi9;ac1(zGv)>Rt32>VHxN7H!FThin;0~*5 zxug18jwgxZ18<7x^J_yckger}f&^ZbgdLLbmgom+**{Xt107q(d2Mw(vw3yw+adap z=pTxHOLVQC_2#gi154|*4xFUh1AkF0hjjPswgVT=FlP7*7-8j&f1(dJ`ACO^EO8ALA-%PXT;I zxENPx4Euf*ye4>Cun8|*Z3(P|R@yW)-lYg%5!@yCnILrK2eZDBLi9bxbh+i(PH}It zJ4$#q*&Uf$jI?yjz^4=7l~$@uzqL4xukq%lPZoNe!daKT7ut(6S~?=LitF$=r#Ohm zMaBJie5UvV9$zfpXz2*oDYfFQ^dZHy;uW=UcB4L$=CqFfz=%|!R-q5!b6^A$@%jK< a`BFW4&!aw3o_6237M~<{D_#c6&Hn+ue4dQ} diff --git a/src/bconfig/lxdialog/util.o b/src/bconfig/lxdialog/util.o dissimilarity index 73% index 1c16bb7b321ee563fbe61a7a19012b7986081a89..171dbfe5a31169191470f011659a36ceee9db51a 100644 GIT binary patch delta 117 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%0DAt`4{9X|84NEfxQ9t!%SLFUCirg zzsXnQ@<+C33DF1J7^&Bp`v`N65PO)kE`G?ofyNo^1m8!#zaZau>Vv0* zt}Bz)%_5>PpXL|a3uxbjeGl_%Li`JJ9<5K-7Ygw_^p~KYhJ6P1Upe1Rv~P}5_9aBm z*XjPur1`rL{+mase$>K_ft%rPMcf|ve~S2%u-^m!3SK-~wPQFqaPUo~ zb;>BOtEmasl2%(64Hw?Hv}~$;i=?8$mBBR)p_;Jxr$2nlq#>059hX1T>F?1omTrJF zZ3S=lC9r#^&=}LbYzXpDx8yG(6JTc`Uze>cA*}MIAiq7I*Ot#r7a_)D%eT;$&n#~S z(nYZI$Kv-|TR#4qYm4E}(y_wvF|{(`thbc%b=n$eCT|wbaVegqe#7E%@d;~O_?@uX wSN>EKt9M1_$FR|?lRx>i_im+UJpON-{GOf5029Ax!Osrgb#TmsVMJ0(z43oP#jVB-CG-BkQ{FPIk zRS>9*adIJ-GNbt9TrPD+naNXuq{`&IKvH+|Qy^(OnU`B#lo6P!#(Qc#xh%-)!FEb_^uH`M!Dc=4CRO_5RPp56251 zvuIz_?dJjXBll{`vCrs=w-moyz~`ktmAX!?Ttsz$NgxVhaWfEM6>iP( z{EFSqfKa+&Ie;5DksVeY*N@N;QB-T-mT1j8E?lpY_Llr6B1g&~6cSE3wCm118LnHd z@_e!;J;7~fQTkD!BB&;caD^AEtbW6$#I^{_ohH>(yDe~(Udph56GSryTvE&f74|*$ z@38+uaVzjfu^;%V;}uEBjz&Eq&0r0xC2;G900zk{sOSZ z{H6Rs;5X~6NqQ$RZl;Az5RD<=l+v{0FUD+KW20`S16w@sF8AN({%4B2s34Ae&2g)W zyMYbG5!#&e7npl!(=j(P>5BCAqQsS(moZ=@fKaDL!e3Pl2;!CXrCeK9N3?HvWnIrrIJ-^ zpK&A^?JXK7lUaJ6PwMo%nmq0;&Ro&*-N>ffKF@hN`RMa(I