From e8d34d11799fc79c7c53bdcd40f9b4ee7be7a2c5 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Wed, 25 Sep 2024 17:42:22 +0800
Subject: [PATCH] Merge branch 'master' of ssh://weike-iot.com:2280/framwork

---
 openlibs/libressl/build.sh    |  192 +
 openlibs/ntpdate/build.sh     |  194 +
 openlibs/iptables/build.sh    |  195 +
 openlibs/zlib/build.sh        |  185 +
 openlibs/libkcapi/build.sh    |  191 +
 openlibs/alsa/build.sh        |  221 +
 openlibs/mplayer/build.sh     |  196 +
 openlibs/dnsmasq/build.sh     |  189 +
 openlibs/file/build.sh        |  194 +
 openlibs/gstreamer/build.sh   |   57 
 openlibs/util-linux/build.sh  |  189 +
 openlibs/iconv/build.sh       |  191 +
 openlibs/dropbear/build.sh    |  212 +
 openlibs/imageMagick/build.sh |  184 +
 openlibs/vsftpd/build.sh      |  191 +
 openlibs/build.sh             |   45 
 openlibs/ethtool/build.sh     |  191 +
 openlibs/dhcpd/build.sh       |   20 
 openlibs/glib/build.sh        |   19 
 openlibs/qt/build.sh          |   20 
 openlibs/curl/build.sh        |  196 +
 openlibs/openssh/build.sh     |  214 +
 openlibs/tree/build.sh        |  194 +
 openlibs/fbgrab/build.sh      |  196 +
 /dev/null                     |   93 -
 openlibs/zbar/build.sh        |  206 +
 openlibs/ffmpeg/build.sh      |  191 +
 openlibs/libconfig/build.sh   |  178 +
 openlibs/dosfstools/build.sh  |  194 +
 openlibs/libdrm/build.sh      |  199 +
 openlibs/appweb/build.sh      |   24 
 openlibs/e2fsprogs/build.sh   |  195 +
 openlibs/libpng/build.sh      |  198 +
 33 files changed, 3,781 insertions(+), 1,573 deletions(-)

diff --git a/openlibs/alsa/build.sh b/openlibs/alsa/build.sh
index 69a6d19..d770058 100755
--- a/openlibs/alsa/build.sh
+++ b/openlibs/alsa/build.sh
@@ -1,44 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile alsa-lib and alsa-utils for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official:  ftp://ftp.alsa-project.org/pub/lib/
+LIB_NAME=alsa-lib-1.1.9
+PACK_SUFIX=tar.bz2
 
-PRJ_PATH=`pwd`
-PREFIX_PATH=`pwd`/../install
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/aplay
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -47,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -55,81 +131,78 @@
     export CFLAGS=
 }
 
-function compile_alsa_lib()
+function do_fetch()
 {
-    SRC_NAME=alsa-lib-1.1.9
-    PACK_SUFIX=tar.bz2
-    IMG_NAME=libasound.so.2.0.0 
-
-    if [ -f ${PREFIX_PATH}/lib/${IMG_NAME} ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget ftp://ftp.alsa-project.org/pub/lib/${SRC_NAME}.${PACK_SUFIX}
-        wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xjf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --datarootdir=/apps/etc/share
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build_alsa_lib()
+{
+    if [ -e ${LIB_PATH}/libasound.so ] ; then
+        return ;
+    fi
+
+    cd $LIB_NAME
+
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} 
     check_result "ERROR: configure ${SRC_NAME} failure"
 
-    make  && make install
+    make -j ${JOBS} && make install
     check_result "ERROR: compile ${SRC_NAME} failure"
 
     cd -
 }
 
-
-
-function compile_alsa_utils()
+function do_build_alsa_utils()
 {
-    SRC_NAME=alsa-utils-1.1.9
-    PACK_SUFIX=tar.bz2
-    IMG_NAME=aplay
+    cd $LIB_NAME
 
-    if [ -f ${PREFIX_PATH}/bin/${IMG_NAME} ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
-    fi
+    export DESTDIR=${PREFIX_PATH}
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget  ftp://ftp.alsa-project.org/pub/utils/$SRC_NAME.$PACK_SUFIX
-        wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX
-        check_result "ERROR: download ${SRC_NAME} failure"
-    fi
-
-    tar -xjf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
-
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS}  --datarootdir=/apps/etc/share \
+    ./configure ${CONFIG_CROSS}  \
     --disable-largefile --disable-nls --disable-alsamixer --without-curses \
-    --with-alsa-prefix=${PREFIX_PATH}/lib  --with-alsa-inc-prefix=${PREFIX_PATH}/include 
+    --with-alsa-prefix=${PREFIX_PATH}/lib  --with-alsa-inc-prefix=${PREFIX_PATH}/include
     check_result "ERROR: configure ${SRC_NAME} failure"
 
-    make 
+    make -j ${JOBS} && make install
     check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} aplay/aplay
-
-    cp aplay/aplay ${PREFIX_PATH}/bin/
 
     cd -
 }
 
+function do_clean()
+{
+    rm -rf *alsa*
+}
 
-export_cross
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
-compile_alsa_lib
+do_export
 
-compile_alsa_utils
+export LIB_NAME=alsa-lib-1.1.9
+do_fetch
+do_build_alsa_lib
 
+export LIB_NAME=alsa-utils-1.1.9
+do_fetch
+do_build_alsa_utils
 
diff --git a/openlibs/appweb/build.sh b/openlibs/appweb/build.sh
index 75d6570..a8a812e 100755
--- a/openlibs/appweb/build.sh
+++ b/openlibs/appweb/build.sh
@@ -53,7 +53,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -93,15 +93,15 @@
     --enable-sockets --enable-track-vars --enable-trans-sid -enable-wddx --sysconfdir=/apps/appWeb/etc --with-pic \
     --with-db --with-regex=system --with-pear --without-zlib --without-iconv --disable-dom --disable-libxml \
     --disable-simplexml --disable-xml --disable-wddx --disable-xmlreader --without-xmlrpc --disable-xmlwriter \
-    --with-config-file-path=/apps/appweb  
+    --with-config-file-path=/apps/appweb
     check_result "ERROR: configure ${SRC_NAME} failure"
 
-    export LDFLAGS+="-lpthread -ldl" 
+    export LDFLAGS+="-lpthread -ldl"
     make  && make install
     check_result "ERROR: compile ${SRC_NAME} failure"
 
     # install and clear PHP
-    ${STRIP} ${PREFIX_PATH}/lib/libphp5.so 
+    ${STRIP} ${PREFIX_PATH}/lib/libphp5.so
     cp -rf $PREFIX_PATH/lib/libphp5.so $PREFIX_PATH/modules
     rm -rf ${PREFIX_PATH}/bin/*
     rm -rf $PREFIX_PATH/include
@@ -139,7 +139,7 @@
     --enable-test --enable-send --enable-upload --enable-file --enable-regex --with-php=${PRJ_PATH}/${PHP_SRC_NAME}
     check_result "ERROR: configure ${SRC_NAME} failure"
 
-    make TRACE=1  
+    make TRACE=1
     check_result "ERROR: compile ${SRC_NAME} failure"
 
 
@@ -180,7 +180,7 @@
 ./bin/appweb --config appweb.conf &
 EOF
 
-    chmod 755 run.sh 
+    chmod 755 run.sh
     mv run.sh $PREFIX_PATH/
 
     tar -cjf ${TARBALL} `basename $PREFIX_PATH`
@@ -190,6 +190,18 @@
     fi
 }
 
+function do_clean()
+{
+    rm -rf appweb* php*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    echo "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+exit;
 
 export_cross
 
diff --git a/openlibs/build.sh b/openlibs/build.sh
index cbc3f36..34c8de6 100755
--- a/openlibs/build.sh
+++ b/openlibs/build.sh
@@ -1,6 +1,27 @@
 #!/bin/bash
 
-function do_compile
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+cd $PRJ_PATH
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
+}
+
+function do_build
 {
     for dir in `ls`
     do
@@ -12,5 +33,25 @@
     done
 }
 
-do_compile
+function do_clean()
+{
+    for dir in `ls`
+    do
+        if [ -f $dir/build*.sh ] ; then
+            cd $dir
+               ./build*.sh -c
+            cd -
+        fi
+    done
+
+    rm -rf install
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_build
 
diff --git a/openlibs/curl/build.sh b/openlibs/curl/build.sh
index f9bccac..7ad04a7 100755
--- a/openlibs/curl/build.sh
+++ b/openlibs/curl/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile curl for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://github.com/curl/curl/releases/
+LIB_NAME=curl-8.2.1
+PACK_SUFIX=tar.bz2
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/lib/libgpiod.so
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,49 +132,53 @@
     export CFLAGS=
 }
 
-
-function compile_curl()
+function do_fetch()
 {
-    SRC_NAME=curl-7.65.3
-    PACK_SUFIX=tar.bz2
-
-    if [ -f ${PREFIX_PATH}/bin/curl ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://github.com/curl/curl/releases/download/curl-7_65_3/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xjf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static --with-ssl=${PREFIX_PATH}
-
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-
-    ${STRIP} ${PREFIX_PATH}/bin/curl
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-cd ../openssl
-   ./build.sh
-cd -
+    do_export
 
-export_cross
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static --with-ssl=${PREFIX_PATH}
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
-compile_curl
+    make -j ${JOBS} && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+cd ../openssl && ./build.sh && cd -
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/dhcpd/build.sh b/openlibs/dhcpd/build.sh
index bcedeac..61477b0 100755
--- a/openlibs/dhcpd/build.sh
+++ b/openlibs/dhcpd/build.sh
@@ -46,7 +46,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -81,16 +81,28 @@
     --with-srv-pid-file=/var/run/dhcpd.pid --with-relay-pid-file=/var/run/dhcrelay.pid
     check_result "ERROR: configure ${SRC_NAME} failure"
 
-    make 
+    make
     check_result "ERROR: compile ${SRC_NAME} failure"
 
     ${STRIP} server/${IMG_NAME}
-    cp server/${IMG_NAME} ${PREFIX_PATH} 
-    cp client/dhclient  ${PREFIX_PATH} 
+    cp server/${IMG_NAME} ${PREFIX_PATH}
+    cp client/dhclient  ${PREFIX_PATH}
 
     cd -
 }
 
+function do_clean()
+{
+    rm -rf dhcpd*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    echo "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+exit;
 
 export_cross
 
diff --git a/openlibs/dnsmasq/build.sh b/openlibs/dnsmasq/build.sh
index 4ddcb68..e68570e 100755
--- a/openlibs/dnsmasq/build.sh
+++ b/openlibs/dnsmasq/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile dnsmasq for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://thekelleys.org.uk/dnsmasq/doc.html
+LIB_NAME=dnsmasq-2.79
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install/bin
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/dnsmasq
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,40 +132,51 @@
     export CFLAGS=
 }
 
-function compile_dnsmasq()
+function do_fetch()
 {
-    SRC_NAME=dnsmasq-2.79
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/dnsmasq ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget http://www.thekelleys.org.uk/dnsmasq/${SRC_NAME}.${PACK_SUFIX}
-        wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    make 
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} src/dnsmasq
-    cp src/dnsmasq ../
-    cp src/dnsmasq ${PREFIX_PATH} 
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
-export_cross
+function do_build()
+{
+    cd $LIB_NAME
 
-compile_dnsmasq
+    do_export
 
+    make -j ${JOBS}
+    check_result "ERROR: compile ${LIB_NAME} failure"
+
+    install -d ${BIN_PATH}
+    install -m 755 src/dnsmasq ${BIN_PATH}
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/dosfstools/build.sh b/openlibs/dosfstools/build.sh
index 912824f..596e7e0 100755
--- a/openlibs/dosfstools/build.sh
+++ b/openlibs/dosfstools/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile dosfstools for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://github.com/dosfstools/dosfstools
+LIB_NAME=dosfstools-4.1
+PACK_SUFIX=tar.xz
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/sbin/fsck.fat
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,45 +132,51 @@
     export CFLAGS=
 }
 
-
-function compile_dosfstools()
+function do_fetch()
 {
-    SRC_NAME=dosfstools-4.1
-    PACK_SUFIX=tar.xz
-
-    if [ -f ${PREFIX_PATH}/sbin/fsck.vfat ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        # https://github.com/dosfstools/dosfstools/releases
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xJf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static 
-
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-#    check_result "ERROR: compile ${SRC_NAME} failure"
-
-
-    ${STRIP} ${PREFIX_PATH}/sbin/fsck.fat
-    mv ${PREFIX_PATH}/sbin/fsck.fat ${PREFIX_PATH}/sbin/fsck.vfat
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
-export_cross
+function do_build()
+{
+    cd $LIB_NAME
 
-compile_dosfstools
+    do_export
 
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static
+    check_result "ERROR: configure ${LIB_NAME} failure"
+
+    make -j ${JOBS} && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/dropbear/build.sh b/openlibs/dropbear/build.sh
index d6a55c7..04d0844 100755
--- a/openlibs/dropbear/build.sh
+++ b/openlibs/dropbear/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile dropbear for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: http://matt.ucc.asn.au/dropbear/releases
+LIB_NAME=dropbear-2019.78
+PACK_SUFIX=tar.bz2
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/dropbear
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,71 +132,55 @@
     export CFLAGS=
 }
 
-function compile_x86()
+function do_fetch()
 {
-    # compile for X86 and generate Key
-    msg_banner "Start compile $SRC_NAME for X86"
-    make distclean
-    ./configure && make
-    ./dropbearkey -t rsa -f ${PREFIX_PATH}/dropbear_rsa_host_key
-    chmod 644 ${PREFIX_PATH}/dropbear_rsa_host_key
-    make distclean
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
+    fi
+
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
+    fi
+
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
+
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
-function compile_dropbear()
+function do_build()
 {
-    SRC_NAME=dropbear-2019.78
-    PACK_SUFIX=tar.bz2
+    cd $LIB_NAME
 
-    if [ -f ${PREFIX_PATH}/bin/dropbear ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
-    fi
-
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget http://matt.ucc.asn.au/dropbear/releases/${SRC_NAME}.${PACK_SUFIX}
-        wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX
-        check_result "ERROR: download ${SRC_NAME} failure"
-    fi
-
-    tar -xjf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
-
-    msg_banner "Start cross compile $SRC_NAME "
+    do_export
 
     ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --disable-zlib
-    check_result "ERROR: configure ${SRC_NAME} failure"
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
-    make 
-    check_result "ERROR: compile ${SRC_NAME} failure"
+    make -j ${JOBS}
+    check_result "ERROR: compile ${LIB_NAME} failure"
 
-    ${STRIP} dbclient  dropbear
-    cp dropbear ..
-    cp dbclient ../ssh
-    cp dbclient ${PREFIX_PATH}/bin/ssh
-    cp dropbear ${PREFIX_PATH}/bin/
-
-    cd -
+    install -d ${BIN_PATH}
+    install -m 755 dbclient ${BIN_PATH}/ssh
+    install -m 755 dropbear ${BIN_PATH}/
 }
 
-function install_script()
+function do_clean()
 {
-    init_script=S20_dropbear
-cat << EOF > ${init_script}
-#!/bin/sh
-
-mkdir -p /etc/dropbear/
-dropbear -R
-EOF
-
-   chmod 755 ${init_script}
-
+    rm -rf *${LIB_NAME}*
 }
 
-export_cross
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
-compile_dropbear
+do_fetch
 
-install_script
+do_build
 
diff --git a/openlibs/e2fsprogs/build.sh b/openlibs/e2fsprogs/build.sh
index 0d39ea1..6a8b7e0 100755
--- a/openlibs/e2fsprogs/build.sh
+++ b/openlibs/e2fsprogs/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile e2fsprogs for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
+LIB_NAME=e2fsprogs-1.45.3
+PACK_SUFIX=tar.xz
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/sbin/blkid
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,45 +132,52 @@
     export CFLAGS=
 }
 
-
-function compile_e2fsprogs()
+function do_fetch()
 {
-    SRC_NAME=e2fsprogs-1.45.3
-    PACK_SUFIX=tar.xz
-
-    if [ -f ${PREFIX_PATH}/sbin/fsck.ext4 ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        # https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xJf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static \
-        --without-libpth-prefix --without-libintl-prefix
-
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-#    check_result "ERROR: compile ${SRC_NAME} failure"
-
-
-    ${STRIP} ${PREFIX_PATH}/sbin/fsck.*
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
-export_cross
+function do_build()
+{
+    cd $LIB_NAME
 
-compile_e2fsprogs
+    do_export
 
+    export DESTDIR=${PREFIX_PATH}
+    ./configure ${CONFIG_CROSS} --enable-static --without-libpth-prefix --without-libintl-prefix
+    check_result "ERROR: configure ${LIB_NAME} failure"
+
+    make -j ${JOBS} && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/ethtool/build.sh b/openlibs/ethtool/build.sh
index f16f65c..5c75ed5 100755
--- a/openlibs/ethtool/build.sh
+++ b/openlibs/ethtool/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile ethtool for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://mirrors.edge.kernel.org/pub/software/network/ethtool/
+LIB_NAME=ethtool-5.2
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install/bin
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/ethtool
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,43 +132,52 @@
     export CFLAGS=
 }
 
-function compile_ethtool()
+function do_fetch()
 {
-    SRC_NAME=ethtool-5.2
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/ethtool ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://mirrors.edge.kernel.org/pub/software/network/ethtool/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} 
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make 
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} ethtool
-    cp ethtool ${PREFIX_PATH}
-    cp ethtool ..
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_ethtool
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    pr_info "${LIB_NAME} installed to '${BIN_PATH}'"
+    make -j ${JOBS} && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/fbgrab/build.sh b/openlibs/fbgrab/build.sh
index 4b8f3c7..da9abdf 100755
--- a/openlibs/fbgrab/build.sh
+++ b/openlibs/fbgrab/build.sh
@@ -1,44 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile fbgrab for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://fbgrab.monells.se
+LIB_NAME=fbgrab-1.3
+PACK_SUFIX=tar.gz
 
-PRJ_PATH=`pwd`
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/fbgrab
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -47,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -55,52 +132,55 @@
     export CFLAGS=
 }
 
-function compile_fbgrab()
+function do_fetch()
 {
-    IMG_NAME=fbgrab
-    SRC_NAME=fbgrab-1.3
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/bin/${IMG_NAME} ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://fbgrab.monells.se/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    export LDFLAGS=" -L${PREFIX_PATH}/lib -static "
-    export CFLAGS+=" -I${PREFIX_PATH}/include "
-    sed -i "s/-lpng -lz/-lpng -lz -lm/g" Makefile 
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
+
+    export LDFLAGS=" -L${LIB_PATH}/ -static "
+    export CFLAGS+=" -I${INC_PATH}/ "
+
+    sed -i "s/-lpng -lz/-lpng -lz -lm/g" Makefile
     make
     check_result "ERROR: compile ${SRC_NAME} failure"
 
-    set -x
-    ${STRIP} ${IMG_NAME}
-    cp ${IMG_NAME} ..
-    cp ${IMG_NAME} ${PREFIX_PATH}/bin 
-
-    cd -
+    install -d ${BIN_PATH}
+    install -m 755 fbgrab ${BIN_PATH}
 }
 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-export_cross
-
-if [ ! -f ${PREFIX_PATH}/lib/libpng.a ] ; then
-    cd ../libpng
-    ./build.sh
-    cd -
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
 fi
 
-compile_fbgrab
+do_fetch
 
+do_build
 
diff --git a/openlibs/ffmpeg/build.sh b/openlibs/ffmpeg/build.sh
index 4761809..82d62f0 100755
--- a/openlibs/ffmpeg/build.sh
+++ b/openlibs/ffmpeg/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile ffmpeg for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: http://ffmpeg.org/releases
+LIB_NAME=ffmpeg-4.1.4
+PACK_SUFIX=tar.bz2
 
-PREFIX_PATH=`pwd`/../install/bin/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/ethtool
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,44 +132,51 @@
     export CFLAGS=
 }
 
-function compile_ffmpeg()
+function do_fetch()
 {
-    SRC_NAME=ffmpeg-4.1.4
-    PACK_SUFIX=tar.bz2
-    IMG_NAME=ffmpeg
-
-    if [ -f ${PREFIX_PATH}/${IMG_NAME} ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget http://ffmpeg.org/releases/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xjf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${PREFIX_PATH} --cross-prefix=${CROSS_COMPILE} --target-os=linux --enable-cross-compile --arch=arm
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make 
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} ${IMG_NAME}
-    cp ${IMG_NAME} ${PREFIX_PATH}
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_ffmpeg
+    ./configure --prefix=${PREFIX_PATH} --cross-prefix=${CROSS_COMPILE} --target-os=linux --enable-cross-compile --arch=arm
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    make -j ${JOBS} && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/file/build.sh b/openlibs/file/build.sh
index 5b1ffeb..814119a 100755
--- a/openlibs/file/build.sh
+++ b/openlibs/file/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile file for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: ftp://ftp.astron.com/pub/file
+LIB_NAME=file-5.04
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install/bin
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/file
+
+# shell script will exit once get command error
+#set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,44 +132,54 @@
     export CFLAGS=
 }
 
-function compile_file()
+function do_fetch()
 {
-    # CentOS 6.0 use file-5.04, so we should cross compile 5.04 for ARM too, for make magic file
-    SRC_NAME=file-5.04
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/file ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget ftp://ftp.astron.com/pub/file/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static --disable-shared
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make 
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} src/file
-    cp src/file ..
-    cp src/file ${PREFIX_PATH} 
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_file
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static --disable-shared
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    make -j ${JOBS}
+
+    pr_info "${LIB_NAME} installed to '${BIN_PATH}'"
+    install -d ${BIN_PATH}
+    install -m 755 src/file ${BIN_PATH}
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/glib/build.sh b/openlibs/glib/build.sh
index c1f5606..df02ff8 100755
--- a/openlibs/glib/build.sh
+++ b/openlibs/glib/build.sh
@@ -48,7 +48,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -68,7 +68,7 @@
     fi
 
     msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
+    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
         #wget ftp://sourceware.org/pub/libffi/${SRC_NAME}.${PACK_SUFIX}
         wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
         check_result "ERROR: download ${SRC_NAME} failure"
@@ -79,7 +79,7 @@
 
     msg_banner "Start cross compile $SRC_NAME "
 
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} 
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS}
 
     check_result "ERROR: configure ${SRC_NAME} failure"
 
@@ -137,6 +137,19 @@
     cd -
 }
 
+function do_clean()
+{
+    rm -rf libffi* glib*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    echo "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+exit
+
 export_cross
 
 compile_libffi
diff --git a/openlibs/gstreamer/build.sh b/openlibs/gstreamer/build.sh
index ee7939b..a6d1cf0 100755
--- a/openlibs/gstreamer/build.sh
+++ b/openlibs/gstreamer/build.sh
@@ -49,7 +49,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -106,19 +106,19 @@
     if [ -f ${PREFIX_PATH}/lib/libgstaudio-1.0.so ] ; then
         msg_banner "$SRC_NAME already compile and installed"
         return 0;
-    fi  
+    fi
 
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
+    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
         msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} "
         #wget https://gstreamer.freedesktop.org/src/gst-plugins-base/${SRC_NAME}.${PACK_SUFIX}
         wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
         check_result "ERROR: download ${SRC_NAME} failure"
-    fi  
+    fi
 
     msg_banner "Start decompress $SRC_NAME.${PACK_SUFIX} "
     if [ ! -d ${SRC_NAME} ] ; then
         tar -xJf ${SRC_NAME}.${PACK_SUFIX}
-    fi  
+    fi
 
     cd ${SRC_NAME}
 
@@ -134,9 +134,9 @@
         LDFLAGS="-L${PREFIX_PATH}/lib -lglib-2.0 -lgobject-2.0 -lgmodule-2.0 -lffi"
 
 
-    check_result "ERROR: configure ${SRC_NAME} failure" 
+    check_result "ERROR: configure ${SRC_NAME} failure"
 
-    make && make install 
+    make && make install
     check_result "ERROR: compile ${SRC_NAME} failure"
 
     cd -
@@ -150,19 +150,19 @@
     if [ -f ${PREFIX_PATH}/lib/gstreamer-1.0/libgstcamerabin.so ] ; then
         msg_banner "$SRC_NAME already compile and installed"
         return 0;
-    fi  
+    fi
 
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
+    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
         msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} "
         #wget https://gstreamer.freedesktop.org/src/gst-plugins-bad/${SRC_NAME}.${PACK_SUFIX}
         wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
         check_result "ERROR: download ${SRC_NAME} failure"
-    fi  
+    fi
 
     msg_banner "Start decompress $SRC_NAME.${PACK_SUFIX} "
     if [ ! -d ${SRC_NAME} ] ; then
         tar -xJf ${SRC_NAME}.${PACK_SUFIX}
-    fi  
+    fi
 
     cd ${SRC_NAME}
 
@@ -180,9 +180,9 @@
         CFLAGS="-I${PREFIX_PATH}/include/glib-2.0" \
         LDFLAGS="-L${PREFIX_PATH}/lib -lglib-2.0 -lgobject-2.0 -lgmodule-2.0 -lffi"
 
-    check_result "ERROR: configure ${SRC_NAME} failure" 
+    check_result "ERROR: configure ${SRC_NAME} failure"
 
-    make -v && make install 
+    make -v && make install
     check_result "ERROR: compile ${SRC_NAME} failure"
 
     cd -
@@ -196,19 +196,19 @@
     if [ -f ${PREFIX_PATH}/lib/gstreamer-1.0/libgstmultifile.so ] ; then
         msg_banner "$SRC_NAME already compile and installed"
         return 0;
-    fi  
+    fi
 
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
+    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
         msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} "
         #wget https://gstreamer.freedesktop.org/src/gst-plugins-good/${SRC_NAME}.${PACK_SUFIX}
         wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
         check_result "ERROR: download ${SRC_NAME} failure"
-    fi  
+    fi
 
     msg_banner "Start decompress $SRC_NAME.${PACK_SUFIX} "
     if [ ! -d ${SRC_NAME} ] ; then
         tar -xJf ${SRC_NAME}.${PACK_SUFIX}
-    fi  
+    fi
 
     cd ${SRC_NAME}
 
@@ -224,18 +224,31 @@
         CFLAGS="-I${PREFIX_PATH}/include/glib-2.0" \
         LDFLAGS="-L${PREFIX_PATH}/lib -lglib-2.0 -lgobject-2.0 -lgmodule-2.0 -lffi"
 
-    check_result "ERROR: configure ${SRC_NAME} failure" 
+    check_result "ERROR: configure ${SRC_NAME} failure"
 
-    make -v && make install 
+    make -v && make install
     check_result "ERROR: compile ${SRC_NAME} failure"
 
     cd -
 }
 
+function do_clean()
+{
+    rm -rf gst*
+}
 
-if [ ! -f ${PREFIX_PATH}/lib/libglib-2.0.so ] ; then 
-    cd ../glib 
-    ./build.sh 
+if [[ $# == 1 && $1 == -c ]] ;then
+    echo "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+exit
+
+
+if [ ! -f ${PREFIX_PATH}/lib/libglib-2.0.so ] ; then
+    cd ../glib
+    ./build.sh
     cd -
 fi
 
diff --git a/openlibs/iconv/build.sh b/openlibs/iconv/build.sh
index b6afe8b..9b558bb 100755
--- a/openlibs/iconv/build.sh
+++ b/openlibs/iconv/build.sh
@@ -1,44 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile libiconv for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://ftp.gnu.org/gnu/libiconv/
+LIB_NAME=libiconv-1.15
+PACK_SUFIX=tar.gz
 
-PROJ_PATH=`pwd`/../
-INST_PATH=${PROJ_PATH}/install
-
-CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
+CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
+
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/lib/libiconv.so
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -47,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -55,38 +131,55 @@
     export CFLAGS=
 }
 
-
-function compile_libiconv()
+function do_fetch()
 {
-    SRC_NAME=libiconv-1.15
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${INST_PATH}/lib/libiconv.so ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://ftp.gnu.org/gnu/libiconv/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX} 
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${INST_PATH} ${CONFIG_CROSS}
-    make && make install
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_libiconv
+    export CFLAGS=" -I${INC_PATH}"
+    export CPPFLAGS=" -I${INC_PATH}"
+    export LDFLAGS=" -L${LIB_PATH}"
 
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    make && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/imageMagick/build.sh b/openlibs/imageMagick/build.sh
index c95837f..030d73b 100755
--- a/openlibs/imageMagick/build.sh
+++ b/openlibs/imageMagick/build.sh
@@ -1,43 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile imageMagick for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://imagemagick.org/archive/releases/
+LIB_NAME=ImageMagick-6.9.10-57
+PACK_SUFIX=tar.bz2
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/animate
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,45 +131,60 @@
     export CFLAGS=
 }
 
-
-function compile_imageMagick()
+function do_fetch()
 {
-    SRC_NAME=ImageMagick6-6.9.4-0
-    PACK_SUFIX=tar.gz
-
-    if [ -f $PREFIX_PATH/lib/libMagickCore-6.Q16.a ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
+
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
 
     CFLAGS="-I${PREFIX_PATH}/include -DMAGICKCORE_QUANTUM_DEPTH=16" LDFLAGS=-L${PREFIX_PATH}/lib \
     ./configure --host=arm-linux --enable-static --disable-shared --prefix=$PREFIX_PATH \
     --without-magick-plus-plus --without-perl --without-x --without-dps --without-xml \
     --without-pango --without-freetype --without-png --without-openexr --without-fontconfig \
     --without-lzma
-
-    check_result "ERROR: configure ${SRC_NAME} failure"
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
     make && make install
-#    check_result "ERROR: compile ${SRC_NAME} failure"
+    check_result "ERROR: compile ${LIB_NAME} failure"
 
-    cd -
+    pr_info "${LIB_NAME} installed to '${BIN_PATH}'"
+    mkdir -p ${BIN_PATH}
+    install -m 755 src/lsz ${BIN_PATH}/sz
+    install -m 755 src/lrz ${BIN_PATH}/rz
 }
 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-export_cross
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
-compile_imageMagick
+do_fetch
 
-
+do_build
 
diff --git a/openlibs/iptables/build.sh b/openlibs/iptables/build.sh
index f3d1c89..4b490bc 100755
--- a/openlibs/iptables/build.sh
+++ b/openlibs/iptables/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile iptables for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: http://www.netfilter.org/projects/iptables
+LIB_NAME=iptables-1.4.21
+PACK_SUFIX=tar.bz2
 
-PREFIX_PATH=`pwd`/../install/bin
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/iptables
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,44 +132,55 @@
     export CFLAGS=
 }
 
-function compile_iptables()
+function do_fetch()
 {
-    SRC_NAME=iptables-1.4.21
-    PACK_SUFIX=tar.bz2
-    IMG_NAME=iptables
-
-    if [ -f ${PREFIX_PATH}/${IMG_NAME} ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget http://www.netfilter.org/projects/iptables/files/${SRC_NAME}.${PACK_SUFIX}
-        wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xjf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static --disable-shared --disable-ipv6 --disable-largefile  
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make 
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} iptables/xtables-multi
-    cp iptables/xtables-multi ${PREFIX_PATH}/${IMG_NAME}
-    cp iptables/xtables-multi ../${IMG_NAME}
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_iptables
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static --disable-shared --disable-ipv6 --disable-largefile
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    make -j ${JOBS}
+    check_result "ERROR: compile ${LIB_NAME} failure"
+
+    pr_info "${LIB_NAME} installed to '${BIN_PATH}'"
+    mkdir -p ${BIN_PATH}
+    install -m 755 iptables/xtables-multi ${BIN_PATH}/iptables
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/libconfig/build.sh b/openlibs/libconfig/build.sh
index 1cf2145..1f11600 100755
--- a/openlibs/libconfig/build.sh
+++ b/openlibs/libconfig/build.sh
@@ -1,41 +1,117 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile libconfig for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: http://hyperrealm.github.io/libconfig/
+LIB_NAME=libconfig-1.7.2
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/lib/libconfig.so
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
     export CXX=${CROSS_COMPILE}g++
@@ -47,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -55,40 +131,52 @@
     export CFLAGS=
 }
 
-function compile_libconfig()
+function do_fetch()
 {
-    SRC_NAME=libconfig-1.7.2
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/lib/libconfig.so ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget http://hyperrealm.github.io/libconfig/dist/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
+
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
 
     export "CFLAGS+=-undefHAVE_USELOCALE"
     ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS}
-    check_result "ERROR: configure ${SRC_NAME} failure"
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
     make && make install
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    cd -
+    check_result "ERROR: compile ${LIB_NAME} failure"
 }
 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-export_cross
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
-compile_libconfig
+do_fetch
 
+do_build
 
diff --git a/openlibs/libdrm/build.sh b/openlibs/libdrm/build.sh
index 739910d..38008d1 100755
--- a/openlibs/libdrm/build.sh
+++ b/openlibs/libdrm/build.sh
@@ -1,54 +1,129 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile libdrm for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://dri.freedesktop.org/libdrm/
+LIB_NAME=libdrm-2.4.99
+PACK_SUFIX=tar.gz
 
-PROJ_PATH=`pwd`/../
-CUR_PATH=`pwd`
-INST_PATH=${PROJ_PATH}/install
-
-CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
+CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
+
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/modetest
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
     export NM=${CROSS_COMPILE}nm
     export RANLIB=${CROSS_COMPILE}ranlib
     export OBJDUMP=${CROSS_COMPILE}objdump
-    export STRIP=${CROSS_COMPILE}strip
+    INST_PATEFIX_PATHTRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -56,41 +131,57 @@
     export CFLAGS=
 }
 
-
-function compile_libdrm()
+function do_fetch()
 {
-    SRC_NAME=libdrm-2.4.99
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${INST_PATH}/lib/libiconv.so ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX} 
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${INST_PATH} ${CONFIG_CROSS} --disable-radeon --disable-amdgpu \
-        --disable-nouveau --disable-vmwgfx --disable-freedreno --disable-vc4 
-    make 
-
-    set -x
-    cp tests/modetest/.libs/modetest ${CUR_PATH}/
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_libdrm
+    #export DESTDIR=${PREFIX_PATH}
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --disable-radeon --disable-amdgpu \
+        --disable-nouveau --disable-vmwgfx --disable-freedreno --disable-vc4
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    make && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
 
+    pr_info "${LIB_NAME} installed to '${BIN_PATH}'"
+    mkdir -p ${BIN_PATH}
+    install -m 755 tests/modetest/.libs/modetest ${BIN_PATH}/
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/libkcapi/build.sh b/openlibs/libkcapi/build.sh
index 93db40f..518e307 100755
--- a/openlibs/libkcapi/build.sh
+++ b/openlibs/libkcapi/build.sh
@@ -1,48 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile libkcapi for ARM
-#|            libkcapi is linux kernel crypto userspace API library, official introduction site:  
-#|    Linux Kernel:  https://www.kernel.org/doc/html/latest/crypto/userspace-if.html
-#|        libkcapi:  http://www.chronox.de/libkcapi.html
-#| 
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://codeload.github.com/smuellerDD/libkcapi/tar.gz/v1.1.5
+LIB_NAME=libkcapi-1.1.5
+PACK_SUFIX=tar.gz
 
-PRJ_PATH=`pwd`
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/kcapi
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -51,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -59,47 +131,58 @@
     export CFLAGS=
 }
 
-
-function compile_libkcapi()
+function do_fetch()
 {
-    SRC_NAME=libkcapi-1.1.5
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/lib/libkcapi.a ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        wget https://codeload.github.com/smuellerDD/libkcapi/tar.gz/v1.1.5 -O ${SRC_NAME}.${PACK_SUFIX}
-        #wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    export CFLAGS=" -I${PREFIX_PATH}/include" 
-    export CPPFLAGS=" -I${PREFIX_PATH}/include" 
-    export LDFLAGS=" -L${PREFIX_PATH}/lib" 
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
+
+    export CFLAGS=" -I${PREFIX_PATH}/include"
+    export CPPFLAGS=" -I${PREFIX_PATH}/include"
+    export LDFLAGS=" -L${PREFIX_PATH}/lib"
 
     autoreconf -i
 
     ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static  --enable-shared --enable-kcapi-test  \
-        --enable-kcapi-rngapp 
+        --enable-kcapi-rngapp
     check_result "ERROR: configure ${SRC_NAME} failure"
 
     make && make install
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    cd -
+    check_result "ERROR: compile ${LIB_NAME} failure"
 }
 
-export_cross
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-compile_libkcapi
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
+do_fetch
 
+do_build
 
diff --git a/openlibs/libpng/build.sh b/openlibs/libpng/build.sh
index 73b4b27..b115898 100755
--- a/openlibs/libpng/build.sh
+++ b/openlibs/libpng/build.sh
@@ -1,44 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile libpng for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://nchc.dl.sourceforge.net/project/libpng/
+LIB_NAME=libpng-1.6.37
+PACK_SUFIX=tar.gz
 
-PRJ_PATH=`pwd`
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/lib/libpng.so
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -47,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -55,49 +131,55 @@
     export CFLAGS=
 }
 
-
-function compile_png()
+function do_fetch()
 {
-    SRC_NAME=libpng-1.6.37
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/lib/libpng.a ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://nchc.dl.sourceforge.net/project/libpng/libpng16/1.6.37/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    export CFLAGS=" -I${PREFIX_PATH}/include" 
-    export CPPFLAGS=" -I${PREFIX_PATH}/include" 
-    export LDFLAGS=" -L${PREFIX_PATH}/lib" 
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static  --enable-shared --enable-arm-neon 
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
-export_cross
+function do_build()
+{
+    cd $LIB_NAME
 
-if [ ! -f ${PREFIX_PATH}/lib/libz.a ] ; then 
-    cd ../zlib
-    ./build.sh
-    cd -
+    do_export
+
+    export CFLAGS=" -I${INC_PATH}"
+    export CPPFLAGS=" -I${INC_PATH}"
+    export LDFLAGS=" -L${LIB_PATH}"
+
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static  --enable-shared --enable-arm-neon
+    check_result "ERROR: configure ${LIB_NAME} failure"
+
+    make && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
 fi
 
-compile_png
+do_fetch
 
-
+do_build
 
diff --git a/openlibs/libressl/build.sh b/openlibs/libressl/build.sh
index 7819209..7cda61e 100755
--- a/openlibs/libressl/build.sh
+++ b/openlibs/libressl/build.sh
@@ -1,43 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile libressl for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://ftp.openbsd.org/pub/OpenBSD/LibreSSL
+LIB_NAME=libressl-3.9.0
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/lib/libssl.so
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,42 +131,53 @@
     export CFLAGS=
 }
 
-function compile_libressl()
+function do_fetch()
 {
-    SRC_NAME=libressl-2.9.2
-    PACK_SUFIX=tar.gz 
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
+    fi
 
-    if [ -f ${PREFIX_PATH}/lib/libcrypto.a ] ; then 
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
-    fi  
-    
-    msg_banner "Start cross compile $SRC_NAME " 
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
-        #wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/${SRC_NAME}.${PACK_SUFIX} 
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
-    fi  
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
+    fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME} 
-    touch *
-    
-    export CFLAGS=-fPIC
-    #./configure ${CONFIG_CROSS} --prefix=${PREFIX_PATH} --with-pic --disable-shared --enable-static LIBS="-lpthread"
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
+
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
+
     ./configure ${CONFIG_CROSS} --prefix=${PREFIX_PATH} --with-pic LIBS="-lpthread"
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
-    make && make install 
-    check_result "ERROR: compile ${SRC_NAME} failure" 
+    make && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
 
-    cd - 
-} 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-printf "\nWARRNING: libressl is a candidate of openssl, so don't compile it if openssl enabled\n\n"
-exit;
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
-export_cross
+exit
 
-compile_libressl
+do_fetch
 
+do_build
 
diff --git a/openlibs/mplayer/build.sh b/openlibs/mplayer/build.sh
index e009c3c..b751cb1 100755
--- a/openlibs/mplayer/build.sh
+++ b/openlibs/mplayer/build.sh
@@ -1,45 +1,118 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile mplayer for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|
-#|  Usage:
-#|      mplayer -slave -quiet test.mp4  -vo fbdev2 -vf scale -fs -zoom -x 320 -y 240 
-#|
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: http://www.mplayerhq.hu/MPlayer/releases
+LIB_NAME=MPlayer-1.4
+PACK_SUFIX=tar.xz
 
-PREFIX_PATH=`pwd`/../install
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/ethtool
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
     export CXX=${CROSS_COMPILE}g++
@@ -51,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -59,27 +132,34 @@
     export CFLAGS=
 }
 
-function compile_mplayer()
+function do_fetch()
 {
-    SRC_NAME=MPlayer-1.4
-    PACK_SUFIX=tar.xz
-
-    if [ -f ${PREFIX_PATH}/bin/mencoder ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget wget http://www.mplayerhq.hu/MPlayer/releases/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xJf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
+
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
+
+    export CFLAGS=-I${INC_PATH}
+    export LDFLAGS="-L${LIB_PATH} "
 
     ./configure --prefix=${PREFIX_PATH} --enable-cross-compile --disable-mencoder \
         --disable-gui --disable-termcap --disable-termios --disable-lirc --disable-lircc \
@@ -92,20 +172,30 @@
         --cc=${CC} --as=${AS} --ar=${AR} --nm=${NM} --ranlib=${RANLIB} \
         --target=arm-linux
 
-    check_result "ERROR: configure ${SRC_NAME} failure"
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    #make -j ${JOBS}
     make
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} mplayer
-    make install
-
-    cd -
+    check_result "ERROR: compile ${LIB_NAME} failure"
 }
 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-export_cross
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
-compile_mplayer
+# failed on: ./libavutil/arm/intmath.h:77:5: error: impossible constraint in 'asm'
+exit;
 
+cd ../zlib/ && ./build.sh && cd -
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/ntpdate/build.sh b/openlibs/ntpdate/build.sh
index dd77c47..6b441f5 100755
--- a/openlibs/ntpdate/build.sh
+++ b/openlibs/ntpdate/build.sh
@@ -1,43 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile ntpdate for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://www.eecis.udel.edu/
+LIB_NAME=ntp-4.2.6p5
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/ntpdate
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,45 +131,52 @@
     export CFLAGS=
 }
 
-
-function compile_ntpdate()
+function do_fetch()
 {
-    SRC_NAME=ntp-4.2.6p5
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/bin/ntpdate ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --disable-ipv6 --disable-tickadj --disable-tick \
-        --disable-ntp-signd 
-
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-
-    ${STRIP} ${PREFIX_PATH}/bin/ntpdate
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
-export_cross
+function do_build()
+{
+    cd $LIB_NAME
 
-compile_ntpdate
+    do_export
 
+    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --disable-ipv6 \
+        --disable-tickadj --disable-tick --disable-ntp-signd
+    check_result "ERROR: configure ${LIB_NAME} failure"
+
+    make && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/openssh/build.sh b/openlibs/openssh/build.sh
index 96afb7c..cb33f5f 100755
--- a/openlibs/openssh/build.sh
+++ b/openlibs/openssh/build.sh
@@ -1,45 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile openssh for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/${SRC_NAME}.${PACK_SUFIX}
+LIB_NAME=openssh-8.0p1
+PACK_SUFIX=tar.gz
 
-PRJ_PATH=`pwd`
-PREFIX_PATH=${PRJ_PATH}/../install/
-#PREFIX_PATH=${PRJ_PATH}/install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/sbin/sshd
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -48,12 +123,32 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
     export LDFLAGS=
     export CFLAGS=
+}
+
+function do_fetch()
+{
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
+    fi
+
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
+    fi
+
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
+
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
 function modify_config()
@@ -63,72 +158,51 @@
     #sed -i -e "s|.*HAS_SHADOW_EXPIRE.*|/* #undef HAS_SHADOW_EXPIRE */|g" config.h
     #sed -i -e "s|.*USE_LINUX_AUDIT.*|/* #undef USE_LINUX_AUDIT */|g" config.h
     sed -i -e "s|.*HAVE___PROGNAME.*|/* #undef HAVE___PROGNAME */|g" config.h
-    echo "modify done"
+    sed -i -e "s|^prefix=.*|prefix=|g" Makefile
+    sed -i -e "s|^DESTDIR=.*|DESTDIR=${PREFIX_PATH}|g" Makefile
+    pr_warn "modify done"
 }
 
-function compile_openssh()
+function do_build()
 {
-    SRC_NAME=openssh-8.0p1
-    PACK_SUFIX=tar.gz
+    cd $LIB_NAME
 
-    if [ -f ${PREFIX_PATH}/sbin/sshd ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
-    fi
-
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
-    fi 
-
-    rm -rf ${SRC_NAME}
-
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-
-    cd ${SRC_NAME}
-
-    msg_banner "Start cross compile $SRC_NAME "
+    do_export
 
     # must --disable-utmpx for lost these  files
     # must --with-audit=debug can not use linux
     # must --without-pie or environ is NULL will case SIGSEGV
     export ac_cv_func_realloc_0_nonnull=yes
     export ac_cv_func_malloc_0_nonnull=yes
-    ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --disable-largefile --disable-pkcs11 --disable-strip \
+    ./configure ${CONFIG_CROSS} --disable-largefile --disable-pkcs11 --disable-strip \
         --disable-etc-default-login --disable-lastlog --disable-utmp --disable-utmpx --disable-wtmp --without-stackprotect \
         --disable-wtmpx --disable-pututline --disable-pututxline --without-hardening --without-rpath \
         --with-audit=debug --without-pie --without-pam --with-privsep-user=sshd --without-selinux \
-        --with-libs --with-zlib=${PREFIX_PATH} --with-ssl-dir=${PREFIX_PATH} --with-ssl-engine 
-
-    check_result "ERROR: configure ${SRC_NAME} failure"
+        --with-libs --with-zlib=${PREFIX_PATH} --with-ssl-dir=${PREFIX_PATH} --with-ssl-engine
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
     modify_config
 
-    make && make install
-
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-
-    cd -
+    make && make install-nosysconf
+    check_result "ERROR: compile ${LIB_NAME} failure"
 }
 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-if [ ! -f ${PREFIX_PATH}/lib/libz.a ] ; then
-    cd ../zlib
-       ./build.sh
-    cd -
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
 fi
 
+cd ../zlib/ && ./build.sh && cd -
 
-if [ ! -f ${PREFIX_PATH}/lib/libcrypto.a ] ; then
-    cd ../openssl
-       ./build.sh
-    cd -
-fi
+cd ../openssl/ && ./build.sh && cd -
 
-export_cross
-compile_openssh
+do_fetch
 
+do_build
 
diff --git a/openlibs/openssh/openssl/build.sh b/openlibs/openssh/openssl/build.sh
deleted file mode 100755
index dc90b85..0000000
--- a/openlibs/openssh/openssl/build.sh
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/bash
-
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile openssl for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
-
-PREFIX_PATH=`pwd`/../install
-
-LYFTP_SRC=http://master.weike-iot.com:2211/src/
-
-CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
-
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
-}
-
-function check_result()
-{
-    if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
-    fi
-}
-
-function export_cross()
-{
-    # export cross toolchain
-    export CC=${CROSS_COMPILE}gcc
-    export AS=${CROSS_COMPILE}as
-    export AR=${CROSS_COMPILE}ar
-    export LD=${CROSS_COMPILE}ld
-    export NM=${CROSS_COMPILE}nm
-    export RANLIB=${CROSS_COMPILE}ranlib
-    export OBJDUMP=${CROSS_COMPILE}objdump
-    export STRIP=${CROSS_COMPILE}strip
-
-    # export cross configure 
-    export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
-
-    # Clear LDFLAGS and CFLAGS
-    export LDFLAGS=
-    export CFLAGS=
-}
-
-function compile_openssl()
-{
-    SRC_NAME=openssl-1.0.2s
-    PACK_SUFIX=tar.gz 
-
-    if [ -f ${PREFIX_PATH}/lib/libcrypto.a ] ; then 
-        return 0;
-    fi  
-    
-    msg_banner "Start cross compile $SRC_NAME " 
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
-        wget https://www.openssl.org/source/${SRC_NAME}.${PACK_SUFIX} 
-        #wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
-    fi  
-
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME} 
-    
-    CROSS_COMPILE=${CROSS_COMPILE} ./Configure threads -shared -no-zlib --prefix=$PREFIX_PATH --openssldir=$PREFIX_PATH linux-armv4
-
-    make && make install 
-    check_result "ERROR: compile ${SRC_NAME} failure" 
-
-    cd - 
-} 
-
-compile_openssl
-
-
diff --git a/openlibs/openssh/zlib/build.sh b/openlibs/openssh/zlib/build.sh
deleted file mode 100755
index ca78a2f..0000000
--- a/openlibs/openssh/zlib/build.sh
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/bash
-
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile zlib for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
-
-PREFIX_PATH=`pwd`/../install/
-
-LYFTP_SRC=http://master.weike-iot.com:2211/src/
-
-CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
-
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
-}
-
-function check_result()
-{
-    if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
-    fi
-}
-
-function export_cross()
-{
-    # export cross toolchain
-    export CC=${CROSS_COMPILE}gcc
-    export AS=${CROSS_COMPILE}as
-    export AR=${CROSS_COMPILE}ar
-    export LD=${CROSS_COMPILE}ld
-    export NM=${CROSS_COMPILE}nm
-    export RANLIB=${CROSS_COMPILE}ranlib
-    export OBJDUMP=${CROSS_COMPILE}objdump
-    export STRIP=${CROSS_COMPILE}strip
-
-    # export cross configure 
-    export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
-
-    # Clear LDFLAGS and CFLAGS
-    export LDFLAGS=
-    export CFLAGS=
-}
-
-
-function compile_zlib()
-{
-    SRC_NAME=zlib-1.2.11
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/lib/libz.a ] ; then
-        return 0;
-    fi
-
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://zlib.net/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
-    fi
-
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
-
-    ./configure --prefix=${PREFIX_PATH}
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    cd -
-}
-
-
-export_cross
-
-compile_zlib
-
-
-
diff --git a/openlibs/qt/build_QT5.sh b/openlibs/qt/build.sh
similarity index 93%
rename from openlibs/qt/build_QT5.sh
rename to openlibs/qt/build.sh
index ff33cff..6b420d6 100755
--- a/openlibs/qt/build_QT5.sh
+++ b/openlibs/qt/build.sh
@@ -62,7 +62,7 @@
         return 0;
     fi
 
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
+    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
         msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} "
         wget ${LYFTP_SRC}/qt/${SRC_NAME}.${PACK_SUFIX}
         check_result "ERROR: download ${SRC_NAME} failure"
@@ -78,7 +78,7 @@
     QMAKE_FILE=qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
 
     grep "`dirname ${CROSS_COMPILE}`" ${QMAKE_FILE} > /dev/null 2>&1
-    if [ $? != 0 ] ; then 
+    if [ $? != 0 ] ; then
         sed -i "s|arm-linux-gnueabi-|$CROSS_COMPILE|" ${QMAKE_FILE}
     fi
 
@@ -117,7 +117,7 @@
     fi
 
 
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then 
+    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
         msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} "
         wget ${LYFTP_SRC}/qt/${SRC_NAME}.${PACK_SUFIX}
         check_result "ERROR: download ${SRC_NAME} failure"
@@ -130,7 +130,7 @@
 
     cd ${SRC_NAME}
 
-    ${QT_INST_PATH}/bin/qmake 
+    ${QT_INST_PATH}/bin/qmake
 
     make && make install
 }
@@ -151,6 +151,18 @@
     #rm -rf ${QTDIR_NAME}
 }
 
+function do_clean()
+{
+    rm -rf appweb* php*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    echo "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+exit;
 
 compile_qt
 
diff --git a/openlibs/tree/build.sh b/openlibs/tree/build.sh
index 0141eb6..779ab56 100755
--- a/openlibs/tree/build.sh
+++ b/openlibs/tree/build.sh
@@ -1,43 +1,124 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile tree for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: ftp://ftp.astron.com/pub/file
+LIB_NAME=tree-1.8.0
+PACK_SUFIX=tgz
 
-PREFIX_PATH=`pwd`/../install/bin
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/tree
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tgz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +127,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,42 +135,53 @@
     export CFLAGS=
 }
 
-function compile_tree()
+function do_fetch()
 {
-    SRC_NAME=tree-1.8.0
-    PACK_SUFIX=tgz
-
-    if [ -f ${PREFIX_PATH}/tree ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget ftp://ftp.astron.com/pub/file/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/tree-1.8.0.tgz
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    sed -i -e "s|^CC=.*|CC=${CROSS_COMPILE}gcc|g" Makefile
-
-    make 
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} tree
-    cp tree ${PREFIX_PATH} 
-    cp tree ..
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_tree
+    sed -i -e "s|^CC=.*|CC=${CROSS_COMPILE}gcc|g" Makefile
+    make
+    check_result "ERROR: compile ${LIB_NAME} failure"
 
+    pr_info "${LIB_NAME} installed to '${BIN_PATH}'"
+    mkdir -p ${BIN_PATH}
+    install -m 755 tree ${BIN_PATH}/
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/util-linux/build.sh b/openlibs/util-linux/build.sh
index 14c02b6..4b1da59 100755
--- a/openlibs/util-linux/build.sh
+++ b/openlibs/util-linux/build.sh
@@ -1,43 +1,121 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile util-linux for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://github.com/karelzak/util-linux/releases
+LIB_NAME=util-linux-2.33
+PACK_SUFIX=tar.xz
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/sbin/fsck
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,47 +132,56 @@
     export CFLAGS=
 }
 
-
-function compile_util-linux()
+function do_fetch()
 {
-    SRC_NAME=util-linux-2.33
-    PACK_SUFIX=tar.xz
-
-    if [ -f ${PREFIX_PATH}/sbin/fsck ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start donwload $SRC_NAME "
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        # https://github.com/karelzak/util-linux/releases
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xJf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    msg_banner "Start cross compile $SRC_NAME "
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
+
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
 
     ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-static \
         --without-ncursesw --without-selinux --without-audit --without-udev \
         --without-ncurses --without-tinfo --without-utempter --without-cap-ng \
          --without-user --without-btrfs --without-systemd --without-python
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-#    check_result "ERROR: compile ${SRC_NAME} failure"
-
-
-    ${STRIP} ${PREFIX_PATH}/sbin/fsck
-
-    cd -
+    make -j ${JOBS} && make install
+    #check_result "ERROR: compile ${LIB_NAME} failure"
 }
 
-export_cross
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-compile_util-linux
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
+exit;
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/vsftpd/build.sh b/openlibs/vsftpd/build.sh
index de3c9e9..d21242d 100755
--- a/openlibs/vsftpd/build.sh
+++ b/openlibs/vsftpd/build.sh
@@ -1,41 +1,118 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile vsftpd for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2018.08.16
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://ftp.osuosl.org/pub/blfs/conglomeration/vsftpd/
+LIB_NAME=vsftpd-3.0.3
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/vsftpd
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/bin/ethtool
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
+        exit
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
     export CXX=${CROSS_COMPILE}g++
@@ -47,7 +124,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -55,41 +132,53 @@
     export CFLAGS=
 }
 
-
-function compile_vsftpd()
+function do_fetch()
 {
-    SRC_NAME=vsftpd-3.0.3
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/bin/vsftpd ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://ftp.osuosl.org/pub/blfs/conglomeration/vsftpd/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    sed -i -e "s|^CC.*|CC  =  ${CROSS_COMPILE}gcc|g" Makefile
-    make
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    ${STRIP} vsftpd
-    cp vsftpd ${PREFIX_PATH}/bin
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
-export_cross
+function do_build()
+{
+    cd $LIB_NAME
 
-compile_vsftpd
+    do_export
 
+    sed -i -e "s|^CC.*|CC  =  ${CROSS_COMPILE}gcc|g" Makefile
+    sed -i -e "s|-Werror||g" Makefile
+    make
+
+    pr_info "${LIB_NAME} installed to '${BIN_PATH}'"
+    mkdir -p ${BIN_PATH}
+    install -m 755 vsftpd ${BIN_PATH}
+}
+
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 
diff --git a/openlibs/zbar/build.sh b/openlibs/zbar/build.sh
index ad030f8..94c48b9 100755
--- a/openlibs/zbar/build.sh
+++ b/openlibs/zbar/build.sh
@@ -1,41 +1,117 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile zbar for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2018.08.16
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://zbar.sourceforge.net/
+LIB_NAME=zbar-0.10
+PACK_SUFIX=tar.bz2
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/lib/libzbar.so
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
     export CXX=${CROSS_COMPILE}g++
@@ -47,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -55,72 +131,70 @@
     export CFLAGS=
 }
 
-
-function compile_zbar()
+function do_fetch()
 {
-    #SRC_NAME=zbar-latest
-    SRC_NAME=zbar-0.10
-    PACK_SUFIX=tar.bz2
-
-    set -e
-
-    if [ -f ${PREFIX_PATH}/bin/zbarcam ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xjf ${SRC_NAME}.${PACK_SUFIX}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    cd ${SRC_NAME}
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
+}
 
-    # zbar-latest need follow command
-    #git checkout 8edfa5f8c4d11a54 && rm -rf * && git checkout .
-    #autoreconf --install 
-    #libtoolize -f
-    #sed -i -e "s|-Wno-parentheses -Werror|-Wno-parentheses|g" configure
+function do_build()
+{
+    cd $LIB_NAME
+
+    do_export
 
     CFLAGS="-DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16" \
     ./configure --host=arm-linux --enable-static --enable-shared --prefix=$PREFIX_PATH \
     --without-gtk --without-python --without-qt --without-x --without-java --disable-video \
     --with-imagemagick=${PREFIX_PATH}/ --without-graphicsmagick \
     MAGICK_CFLAGS=-I${PREFIX_PATH}//include/ImageMagick-6 \
-    MAGICK_LIBS="-L${PREFIX_PATH}/lib -lMagickWand-6.Q16 -lMagickCore-6.Q16 -lm -lz -L`pwd`/zbar/.libs/ -lzbar" 
+    MAGICK_LIBS="-L${PREFIX_PATH}/lib -lMagickWand-6.Q16 -lMagickCore-6.Q16 -lm -lz -L`pwd`/zbar/.libs/ -lzbar"
 
     #LIBS="-liconv"
 
     sed -i -e "s|^LIBS = -lpthread.*|LIBS = -lpthread -liconv|g" Makefile
 
-     mkdir -p ./doc/man/ 
-     touch ./doc/man/zbarimg.1 
-     touch ./doc/man/zbarcam.1 
-     make all && make install
-
-    cd -
+    mkdir -p ./doc/man/
+    touch ./doc/man/zbarimg.1
+    touch ./doc/man/zbarcam.1
+    make all && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
 }
 
-cd ../iconv
-    ./build.sh 
-cd -
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
 
-cd ../zlib 
-    ./build.sh 
-cd -
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
 
-cd ../imageMagick
-    ./build.sh 
-cd -
+cd ../zlib/ && ./build.sh && cd -
 
+cd ../iconv/ && ./build.sh && cd -
 
-export_cross
+cd ../imageMagick && ./build.sh  && cd -
 
-compile_zbar
+cd $PRJ_PATH
 
+do_fetch
+
+do_build
 
diff --git a/openlibs/zlib/build.sh b/openlibs/zlib/build.sh
index 1f75580..ca9a7e5 100755
--- a/openlibs/zlib/build.sh
+++ b/openlibs/zlib/build.sh
@@ -1,43 +1,120 @@
 #!/bin/bash
 
-#+--------------------------------------------------------------------------------------------
-#|Description:  This shell script used download and compile zlib for ARM
-#|     Author:  GuoWenxue <guowenxue@gmail.com>
-#|  ChangeLog:
-#|           1, Initialize 1.0.0 on 2011.04.12
-#+--------------------------------------------------------------------------------------------
+# library name and version
+# Official: https://zlib.net/
+LIB_NAME=zlib-1.2.11
+PACK_SUFIX=tar.gz
 
-PREFIX_PATH=`pwd`/../install/
-
+# LingYun source code FTP server
 LYFTP_SRC=http://master.weike-iot.com:2211/src/
 
+# library download URL address
+LIB_URL=$LYFTP_SRC
+
+# Cross compiler for cross compile on Linux server
 CROSS_COMPILE=/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-
 
-function msg_banner()
-{
-    echo ""
-    echo "+-----------------------------------------------------------------------"
-    echo "|  $1 "
-    echo "+-----------------------------------------------------------------------"
-    echo ""
+# compile jobs
+JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l`
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries install path
+PREFIX_PATH=$TOP_PATH/install
+BIN_PATH=$PREFIX_PATH/bin
+LIB_PATH=$PREFIX_PATH/lib
+INC_PATH=$PREFIX_PATH/include
+
+# check installed or not file
+INST_FILE=$PREFIX_PATH/lib/libz.a
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions  |
+#+-------------------------+
+
+function pr_error() {
+    echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+    echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+    echo -e "\033[40;32m $1 \033[0m"
 }
 
 function check_result()
 {
     if [ $? != 0 ] ; then
-       echo ""
-       echo "+-----------------------------------------------------------------------"
-       echo "|  $1 "
-       echo "+-----------------------------------------------------------------------"
-       echo ""
-       exit ;
+        pr_error "$1"
     fi
 }
-
-function export_cross()
+# decompress a packet to destination path
+function do_unpack()
 {
+    tarball=$1
+    dstpath=`pwd`
+
+    if [[ $# == 2 ]] ; then
+        dstpath=$2
+    fi
+
+    pr_info "decompress $tarball => $dstpath"
+
+    mkdir -p $dstpath
+    case $tarball in
+        *.tar.gz)
+            tar -xzf $tarball -C $dstpath
+            ;;
+
+        *.tar.bz2)
+            tar -xjf $tarball -C $dstpath
+            ;;
+
+        *.tar.xz)
+            tar -xJf $tarball -C $dstpath
+            ;;
+
+        *.tar.zst)
+            tar -I zstd -xf $tarball -C $dstpath
+            ;;
+
+        *.tar)
+            tar -xf $tarball -C $dstpath
+            ;;
+
+        *.zip)
+            unzip -qo $tarball -d $dstpath
+            ;;
+
+        *)
+            pr_error "decompress Unsupport packet: $tarball"
+            return 1;
+            ;;
+    esac
+}
+
+function do_export()
+{
+    BUILD_ARCH=$(uname -m)
+    if [[ $BUILD_ARCH =~ "arm" ]] ; then
+        pr_warn "local($BUILD_ARCH) compile $LIB_NAME"
+        return ;
+    fi
+
+    pr_warn "cross(${CROSS_COMPILE}) compile $LIB_NAME"
+
     # export cross toolchain
     export CC=${CROSS_COMPILE}gcc
+    export CXX=${CROSS_COMPILE}g++
     export AS=${CROSS_COMPILE}as
     export AR=${CROSS_COMPILE}ar
     export LD=${CROSS_COMPILE}ld
@@ -46,7 +123,7 @@
     export OBJDUMP=${CROSS_COMPILE}objdump
     export STRIP=${CROSS_COMPILE}strip
 
-    # export cross configure 
+    # export cross configure
     export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux "
 
     # Clear LDFLAGS and CFLAGS
@@ -54,41 +131,51 @@
     export CFLAGS=
 }
 
-
-function compile_zlib()
+function do_fetch()
 {
-    SRC_NAME=zlib-1.2.11
-    PACK_SUFIX=tar.gz
-
-    if [ -f ${PREFIX_PATH}/lib/libz.a ] ; then
-        msg_banner "$SRC_NAME already compile and installed"
-        return 0;
+    if [ -e ${INST_FILE} ] ; then
+        pr_warn "$LIB_NAME compile and installed alredy"
+        exit ;
     fi
 
-    msg_banner "Start cross compile $SRC_NAME "
-
-    if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then
-        #wget https://zlib.net/${SRC_NAME}.${PACK_SUFIX}
-        wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX}
-        check_result "ERROR: download ${SRC_NAME} failure"
+    if [ -d $LIB_NAME ] ; then
+        pr_warn "$LIB_NAME fetch already"
+        return ;
     fi
 
-    tar -xzf ${SRC_NAME}.${PACK_SUFIX}
-    cd ${SRC_NAME}
+    if [ ! -f ${LIB_NAME}.${PACK_SUFIX} ] ; then
+        wget ${LIB_URL}/${LIB_NAME}.${PACK_SUFIX}
+        check_result "ERROR: download ${LIB_NAME} failure"
+    fi
 
-    ./configure --prefix=${PREFIX_PATH}
-    check_result "ERROR: configure ${SRC_NAME} failure"
-
-    make && make install
-    check_result "ERROR: compile ${SRC_NAME} failure"
-
-    cd -
+    do_unpack ${LIB_NAME}.${PACK_SUFIX}
 }
 
+function do_build()
+{
+    cd $LIB_NAME
 
-export_cross
+    do_export
 
-compile_zlib
+    ./configure --prefix=${PREFIX_PATH}
+    check_result "ERROR: configure ${LIB_NAME} failure"
 
+    make && make install
+    check_result "ERROR: compile ${LIB_NAME} failure"
+}
 
+function do_clean()
+{
+    rm -rf *${LIB_NAME}*
+}
+
+if [[ $# == 1 && $1 == -c ]] ;then
+    pr_warn "start clean ${LIB_NAME}"
+    do_clean
+    exit;
+fi
+
+do_fetch
+
+do_build
 

--
Gitblit v1.9.1