#!/bin/bash
# Copyright Huawei Technologies Co., Ltd. 2010-2018. All rights reserved.
# This script is used for compiling code via CMake and making packages

set -e

CURRENT_PATH=$(dirname $(readlink -f $0))
PS4=':${LINENO}+'
declare VERSION_DESCRIP=""
declare VERSION_MYSQLIP=""
declare PACK_PREFIX=""
declare PROJECT_VERSION=""
declare RUN_PACK_DIR_NAME=""
declare LOGICREP_DIR_NAME=""
declare ALL_PACK_DIR_NAME=""
declare SYMBOL_PACK_DIR_NAME=""
declare TOOLS_PACK_DIR_NAME=""
declare COMPILE_OPTS=""
declare SHARDING_INNER_TOOLS_PACK_NAME=""
declare MYSQL_BUILD_TYPE=""
declare JDRIVER_PACK_DIR_NAME=""
declare WITHOUT_DEPS=""
export BUILD_MODE=""
export PYTHON_INCLUDE_DIR=""
export LOGICREP_PERSONAL_PKG_DIR=""
export WORKSPACE=$(dirname $(dirname $(pwd)))
DFT_WORKSPACE="/home/regress"

source ./common.sh
source ./function.sh

CONFIG_IN_FILE=${CANTIANDB_BUILD}/include/config.h

CTDB_CODE_PATH="${CURRENT_PATH}"/..
CMAKE_C_COMPILER=$(which gcc)
CMAKE_CXX_COMPILER=$(which g++)
PYTHON3_HOME=${PYTHON3_HOME}
MYSQL_CODE_PATH=${WORKSPACE}/cantian-connector-mysql/mysql-source
INSTALL_DIR=/opt/cantiandb
INITSQL_DIR=../
func_prepare_git_msg
PROJECT_VERSION=$(cat ${CONFIG_IN_FILE} | grep 'PROJECT_VERSION' | awk '{print $3}')
CANTIAND_BIN=cantiand-${PROJECT_VERSION}
JDBC_DIR=${CANTIANDB_HOME}/src/jdbc/cantian-jdbc/build/Cantian_PKG
LOGICREP_PERSONAL_PKG_DIR=${CANTIANDB_HOME}/src/logicrep
LOGICREP_DIR=${CANTIANDB_HOME}/src/zlogicrep/build/Cantian_PKG
LOGICREP_FILE_DIR=${CANTIANDB_HOME}/src/zlogicrep/build/Cantian_PKG/file
LOGICREP_GZ_NAME=com.huawei.cantian.logicrep.tar.gz
GODRIVER_NAME=go-cantian-driver
ZEBRATOOL_DIR=${CANTIANDB_HOME}/src/zebratool
MYSQL_DIR=${CANTIANDB_HOME}/../../cantian-connector-mysql/mysql-source
CANTIAN_LIB_DIR=${CANTIANDB_HOME}/../cantian_lib
CANTIAN_LIB_DIR_TMP=${CANTIANDB_HOME}/../cantian_lib/tmp/
MYSQL_BUILD_MODE=${MYSQL_BUILD_MODE:-"multiple"}
HOME_PATH=${MYSQL_DIR}/..
BOOST_PATH=/tools/boost_1_73_0
ENABLE_LLT_GCOV="NO"
ENABLE_LLT_ASAN="NO"
BUILD_MYSQL_SO=${BUILD_MYSQL_SO:-"YES"}
FEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL:-"0"}
OS_ARCH=$(uname -i)

export INTERNAL_BUILD="TRUE"

if [[ ! -d "${CTDB_CODE_PATH}"/../ProductComm_DoradoAA ]];then
    export INTERNAL_BUILD="FALSE"
fi

if [[ ${OS_ARCH} =~ "x86_64" ]]; then
    export CPU_CORES_NUM=`cat /proc/cpuinfo |grep "cores" |wc -l`
    LIB_OS_ARCH="lib_x86"
elif [[ ${OS_ARCH} =~ "aarch64" ]]; then
    export CPU_CORES_NUM=`cat /proc/cpuinfo |grep "architecture" |wc -l`
    LIB_OS_ARCH="lib_arm"
else
    echo "OS_ARCH: ${OS_ARCH} is unknown, set CPU_CORES_NUM=16 "
    export CPU_CORES_NUM=16
fi

WITH_CTC_STORAGE_ENGINE=1
if [ "${branch}" == "develop_616_finale" ]; then
    branch=develop_616_finale_dbstore
fi

if [ "${BUILD_MYSQL_SO}" == "YES" ]; then
  WITH_CTC_STORAGE_ENGINE=0
fi

echo ${CANTIANDB_HOME}
func_prepare_pkg_name()
{
    cd ${CANTIANDB_HOME}

    if [[ ! -e "${CONFIG_IN_FILE}" ]]; then
        echo "config file not exist..."
        exit 1
    fi

    VERSION_DESCRIP=$(cat ${CONFIG_IN_FILE} | grep 'VERSION_DESCRIP' | awk '{print $3}')
    PACK_PREFIX=$(cat ${CONFIG_IN_FILE} | grep 'PACK_PREFIX' | awk '{print $3}')
    PROJECT_VERSION=$(cat ${CONFIG_IN_FILE} | grep 'PROJECT_VERSION' | awk '{print $3}')

    # arm_euler临时规避
    if [[ ${OS_ARCH} =~ "aarch64" ]]; then
        OS_SUFFIX=CENTOS
    fi

    RUN_PACK_DIR_NAME=${PACK_PREFIX}-RUN-${OS_SUFFIX}-${ARCH}bit
    LOGICREP_DIR_NAME=${PACK_PREFIX}-LOGICREP
    ALL_PACK_DIR_NAME=${PACK_PREFIX}-DATABASE-${OS_SUFFIX}-${ARCH}bit
    SYMBOL_PACK_DIR_NAME=${PACK_PREFIX}-DATABASE-${OS_SUFFIX}-${ARCH}bit-SYMBOL
    CTBOX_DIR_NAME=${PACK_PREFIX}-CTBOX
    TOOLS_PACK_DIR_NAME=${PACK_PREFIX}-TOOLS
    JDRIVER_PACK_DIR_NAME=${PACK_PREFIX}-CLIENT-JDBC
    LOGICREP_AGENT_DIR_NAME=${PACK_PREFIX}-LOGICREP-AGENT
    CTSQL_PACK_DIR_NAME=${PACK_PREFIX}-CTSQL-${OS_SUFFIX}-${ARCH}bit

    if [[ ! -d "${CANTIANDB_BIN}" ]]; then
        echo "bin dir not exist"
        exit 1
    else
        echo "chmod 755"
        chmod -R 755 ${CANTIANDB_BIN}/*
    fi

    cd ${CANTIANDB_BIN}
    rm -rf ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}*
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/lib
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/data
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/log
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/protect
    mkdir -p ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/var
}


func_prepare_no_clean_debug()
{
    export BUILD_MODE=Debug
    cd ${CANTIANDB_BUILD}
    cmake -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_BUILD_TYPE=Debug \
          -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DUSE32BIT=OFF ${COMPILE_OPTS} ..
}

func_prepare_no_clean_release()
{
    export BUILD_MODE=Release
    cd ${CANTIANDB_BUILD}
    cmake -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_BUILD_TYPE=Release -DUSE32BIT=OFF \
          -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} ${COMPILE_OPTS} ..
    sed -i "s/-O3/-O2/g" CMakeCache.txt
}

func_prepare_debug()
{
    export PYTHON_INCLUDE_DIR=${PYTHON3_HOME}
    func_prepare_no_clean_debug
}


func_prepare_release()
{
    export PYTHON_INCLUDE_DIR=${PYTHON3_HOME}
    func_prepare_no_clean_release
}

func_all()
{
    ## download dependency:
    func_prepare_dependency

    local build_mode=$1
    if [[ -z "${build_mode}" ]]; then
        build_mode='Debug'
    fi

    if [[ "${build_mode}" = 'Debug' ]]; then
        func_prepare_debug
    else
        func_prepare_release
    fi

    cd ${CT_SRC_BUILD_DIR}
    set +e
    make all -sj 8
    if [ $? -ne 0 ]; then
        ls -al ${CANTIANDB_LIB}
        ls -al /home/regress
        ls -al /home/regress/CantianKernel/build
        exit 1
    fi
    set -e

    if [[ -e "${CANTIANDB_BIN}"/cantiand ]]; then
        cd ${CANTIANDB_BIN}
        if [ -e "${CANTIAND_BIN}" ]; then
          rm ${CANTIAND_BIN}
        fi
        ln cantiand ${CANTIAND_BIN}
    fi
}

func_release_symbol()
{
    if [ "${ENABLE_LLT_ASAN}" == "NO" ]; then
        echo "release symbol"
        mkdir -p ${CANTIANDB_SYMBOL}
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_LIB}/libzeclient.so
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_LIB}/libzecommon.so
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_LIB}/libzeprotocol.so
        mv -f ${CANTIANDB_LIB}/libzeclient.${SO}.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/libzeclient.${SO}.${SYMBOLFIX}
        mv -f ${CANTIANDB_LIB}/libzecommon.${SO}.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/libzecommon.${SO}.${SYMBOLFIX}
        mv -f ${CANTIANDB_LIB}/libzeprotocol.${SO}.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/libzeprotocol.${SO}.${SYMBOLFIX}

        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_BIN}/${CANTIAND_BIN}
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_BIN}/cms
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_BIN}/ctencrypt
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_BIN}/ctsql
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_BIN}/ctbox
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_BIN}/ctbackup
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${CANTIANDB_BIN}/dbstor
        mv -f ${CANTIANDB_BIN}/${CANTIAND_BIN}.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/${CANTIAND_BIN}.${SYMBOLFIX}
        mv -f ${CANTIANDB_BIN}/cms.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/cms.${SYMBOLFIX}
        mv -f ${CANTIANDB_BIN}/ctencrypt.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/ctencrypt.${SYMBOLFIX}
        mv -f ${CANTIANDB_BIN}/ctsql.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/ctsql.${SYMBOLFIX}
        mv -f ${CANTIANDB_BIN}/ctbox.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/ctbox.${SYMBOLFIX}
        mv -f ${CANTIANDB_BIN}/ctbackup.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/ctbackup.${SYMBOLFIX}
        mv -f ${CANTIANDB_BIN}/dbstor.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/dbstor.${SYMBOLFIX}

        ##opensource library
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${LZ4_LIB_PATH}/liblz4.so.1.9.4
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${Z_LIB_PATH}/libz.so.1.2.13
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${PCRE_LIB_PATH}/libpcre2-8.so.0.11.0
        sh  ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${ZSTD_LIB_PATH}/libzstd.so.1.5.2
        mv -f ${LZ4_LIB_PATH}/liblz4.so.1.9.4.${SYMBOLFIX}   ${CANTIANDB_SYMBOL}/liblz4.so.1.9.4.${SYMBOLFIX}
        mv -f ${Z_LIB_PATH}/libz.so.1.2.13.${SYMBOLFIX}       ${CANTIANDB_SYMBOL}/libz.so.1.2.13.${SYMBOLFIX}
        mv -f ${PCRE_LIB_PATH}/libpcre2-8.so.0.11.0.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/libpcre2-8.so.0.11.0.${SYMBOLFIX}
        mv -f ${ZSTD_LIB_PATH}/libzstd.so.1.5.2.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/libzstd.so.1.5.2.${SYMBOLFIX}

        sh ${CANTIANDB_BUILD}/${DBG_SYMBOL_SCRIPT} ${ZSTD_LIB_PATH}/../bin/zstd
        mv -f ${ZSTD_LIB_PATH}/../bin/zstd.${SYMBOLFIX} ${CANTIANDB_SYMBOL}/zstd.${SYMBOLFIX}

        func_pkg_symbol
    fi
}

func_version()
{
    echo "Start build CTC func_version..."
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > ${CANTIANDB_BIN}/package.xml
    echo "<PackageInfo>" >> ${CANTIANDB_BIN}/package.xml
    echo "----------Start build Cantian-----------" >> ${CANTIANDB_BIN}/package.xml
    echo "name=\"CantianDB 100\"" >> ${CANTIANDB_BIN}/package.xml
    echo "version=\"${VERSION_DESCRIP} ${BUILD_MODE}\"" >> ${CANTIANDB_BIN}/package.xml
    echo "desc=\"CantianDB 100 install\"" >> ${CANTIANDB_BIN}/package.xml
    merge_time=$(cat ${CANTIANDB_BUILD}/conf/git_message.in | grep merge_time |  awk -F'=' '{print  $2}')
    echo "createDate=\"${merge_time}\"" >> ${CANTIANDB_BIN}/package.xml
    cantian_merge_time=$(cat ${CANTIANDB_BUILD}/conf/git_message.in | grep cantian_merge_time |  awk -F'=' '{print  $2}')
    echo "createDate=\"${cantian_merge_time}\"" >> ${CANTIANDB_BIN}/package.xml
    WHOLE_COMMIT_ID=$(cat ${CANTIANDB_BUILD}/conf/git_message.in | grep gitVersion |  awk -F'=' '{print  $2}')
    echo "gitVersion=\"${WHOLE_COMMIT_ID}\"" >> ${CANTIANDB_BIN}/package.xml
    echo "Start build Mysql func_version..."
    echo "---------- Start build Mysql -----------" >> ${CANTIANDB_BIN}/package.xml
    echo "name=\"Mysql\"" >> ${CANTIANDB_BIN}/package.xml
    echo "version=\"${VERSION_MYSQLIP} ${BUILD_MODE}\"" >> ${CANTIANDB_BIN}/package.xml
    echo "desc=\"Mysql install\"" >> ${CANTIANDB_BIN}/package.xml
    mysql_merge_time=$(cat ${CANTIANDB_BUILD}/conf/git_message.in | grep mysql_merge_time |  awk -F'=' '{print  $2}')
    echo "createDate=\"${mysql_merge_time}\"" >> ${CANTIANDB_BIN}/package.xml
    MYSQL_COMMIT_ID=$(cat ${CANTIANDB_BUILD}/conf/git_message.in | grep mysqlGitVersion |  awk -F'=' '{print  $2}')
    echo "Start build Mysql func_version mysql COMMITID: \"${MYSQL_COMMIT_ID}\""
    echo "gitVersion=\"${MYSQL_COMMIT_ID}\"" >> ${CANTIANDB_BIN}/package.xml
    echo "</PackageInfo>" >> ${CANTIANDB_BIN}/package.xml
}

func_version_run_pkg()
{
    func_version
    cp  ${CANTIANDB_BIN}/package.xml ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}
}

func_version_ctsql_pkg()
{
    func_version
    cp  ${CANTIANDB_BIN}/package.xml ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}
}

func_pkg_run_basic()
{
    func_version_run_pkg

    cd ${CANTIANDB_BIN}
    cp ctsql cantiand ctencrypt cms ctbackup ctbox ctrst dbstor ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cp -d ${ZSTD_LIB_PATH}/../bin/zstd ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cd ${CANTIANDB_HOME}
    cp ${CANTIANDB_INSTALL}/installdb.sh  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cp ${CANTIANDB_INSTALL}/shutdowndb.sh  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cp ${CANTIANDB_INSTALL}/uninstall.py  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cp ${CANTIANDB_INSTALL}/script/cluster/cluster.sh  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cp ${CANTIANDB_INSTALL}/sql_process.py  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cp ${CANTIANDB_INSTALL}/Common.py  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/
    cp -d ${CANTIANDB_LIB}/libzeclient.so  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/lib/
    cp -d ${CANTIANDB_LIB}/libzecommon.so  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/lib/
    cp -d ${CANTIANDB_LIB}/libzeprotocol.so  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/lib/
    cp -d ${CANTIANDB_LIB}/libcantian.so  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/lib/
    cp -d ${CANTIANDB_LIB}/libmessage_queue.so  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/lib/

    cp -d ${PCRE_LIB_PATH}/libpcre2-8.so*  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/
    cp -d ${Z_LIB_PATH}/libz.so*  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/
    cp -d ${ZSTD_LIB_PATH}/libzstd.so*  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/
    cp -d ${LZ4_LIB_PATH}/liblz4.so*  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/

    cp -R ${CANTIANDB_HOME}/admin  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/
    cp -R ${CANTIANDB_HOME}/cfg  ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/
    if [ "${ENABLE_LLT_ASAN}" == "YES" ]; then
        if [[ ${OS_ARCH} =~ "x86_64" ]]; then
            cp -d /usr/lib64/libubsan.so* ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/
            cp -d /usr/lib64/libasan.so* ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/
        elif [[ ${OS_ARCH} =~ "aarch64" ]]; then
            cp -d ${CANTIANDB_HOME}/../library/protobuf/${LIB_OS_ARCH}/libubsan.so* ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/
            cp -d ${CANTIANDB_HOME}/../library/protobuf/${LIB_OS_ARCH}/libasan.so* ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/
        else
            echo "OS_ARCH: ${OS_ARCH} is unknown."
        fi
    fi

    chmod -R 700 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/*
    chmod 500 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/*
    chmod 500 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/*
    chmod 600 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/cfg/*
    chmod 500 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/lib/*
    chmod 500 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/add-ons/*
    chmod 400 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/package.xml
}

fun_pkg_mysql_lib()
{
    echo "CANTIAN_LIB_DIR:${CANTIAN_LIB_DIR}"
    echo "CANTIAN_LIB_DIR_TMP:${CANTIAN_LIB_DIR_TMP}"
    rm -rf ${CANTIAN_LIB_DIR}
    mkdir -p ${CANTIAN_LIB_DIR}
    mkdir -p ${CANTIAN_LIB_DIR_TMP}
    cp -d ${CANTIANDB_HOME}/../output/lib/*.a ${CANTIAN_LIB_DIR_TMP}
    cp -d ${CANTIANDB_HOME}/../library/huawei_security/lib/*.a ${CANTIAN_LIB_DIR_TMP}
    cp -d ${CANTIANDB_HOME}/../library/huawei_security/lib/libsecurec.so ${CANTIAN_LIB_DIR}

    cd ${CANTIAN_LIB_DIR_TMP} && rm -rf libzecmssrc.a
    cd ${CANTIAN_LIB_DIR_TMP} && find . -name '*.a' -exec ar -x {} \;
    cd ${CANTIAN_LIB_DIR_TMP} && rm -rf *.a
    if [[ ${INTERNAL_BUILD} == "TRUE" ]];then
	  cd ${CANTIAN_LIB_DIR_TMP} && rm -rf ctc_mysql_proxy.o
      cp ${CANTIANDB_HOME}/../build/pkg/src/server/CMakeFiles/cantiand.dir/__/version/ct_version.c.o ${CANTIAN_LIB_DIR_TMP}/
    fi
   
    rm -rf ${CANTIAN_LIB_DIR_TMP}/

    cd ${CANTIANDB_HOME}/../library/protobuf/lib/ && cp *.a ${CANTIAN_LIB_DIR}

    cp -d ${CANTIANDB_HOME}/../library/pcre/lib/libpcre2-8.so* ${CANTIAN_LIB_DIR}
    cp -d ${CANTIANDB_HOME}/../output/lib/*.so ${CANTIAN_LIB_DIR}
    if [ "${ENABLE_LLT_ASAN}" == "YES" ]; then
        if [[ ${OS_ARCH} =~ "x86_64" ]]; then
            cp -d /usr/lib64/libubsan.so* ${CANTIAN_LIB_DIR}
            cp -d /usr/lib64/libasan.so* ${CANTIAN_LIB_DIR}
        elif [[ ${OS_ARCH} =~ "aarch64" ]]; then
            cp -d ${CANTIANDB_HOME}/../library/protobuf/lib_arm/libubsan.so* ${CANTIAN_LIB_DIR}
            cp -d ${CANTIANDB_HOME}/../library/protobuf/lib_arm/libasan.so* ${CANTIAN_LIB_DIR}
        else
            echo "OS_ARCH: ${OS_ARCH} is unknown."
        fi
    fi
    chmod -R 755 ${CANTIAN_LIB_DIR}
}

func_pkg_run()
{
    fun_pkg_mysql_lib
    func_pkg_run_basic
    find ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/admin/scripts/ -type f -print0 | xargs -0 chmod 400
    find ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/admin/scripts/ -type d -print0 | xargs -0 chmod 700
    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${RUN_PACK_DIR_NAME}.tar.gz ${RUN_PACK_DIR_NAME}
    rm -rf ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/script
}

func_pkg_symbol()
{
    echo "pkg symbol"

    rm -rf ${CANTIANDB_BIN}/${SYMBOL_PACK_DIR_NAME}*
    mkdir -p ${CANTIANDB_BIN}/${SYMBOL_PACK_DIR_NAME}
    cp -rf ${CANTIANDB_SYMBOL}/*.${SYMBOLFIX} ${CANTIANDB_BIN}/${SYMBOL_PACK_DIR_NAME}/
    chmod 500 ${CANTIANDB_BIN}/${SYMBOL_PACK_DIR_NAME}/*
    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${SYMBOL_PACK_DIR_NAME}.tar.gz ${SYMBOL_PACK_DIR_NAME}
    sha256sum ${CANTIANDB_BIN}/${SYMBOL_PACK_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${SYMBOL_PACK_DIR_NAME}.sha256
}

func_make_debug()
{
    echo "make debug"
    func_all Debug
    func_prepare_pkg_name
    func_pkg_run
}

func_make_release()
{
    echo "make release"
    func_all Release
    func_prepare_pkg_name
    # func_release_symbol
    func_pkg_run
}


func_collect_mysql_target()
{
  local node_id=$1
  if [ "${node_id}" == "node0" ]; then
    mkdir -p ${MYSQL_DIR}/mysql_bin/mysql
    cp -arf /usr/local/mysql/* ${MYSQL_DIR}/mysql_bin/mysql/
  elif [ "${node_id}" == "node1" ]; then
    cp -arf ${MYSQL_DIR}/cantian_lib/libsecurec.so /usr/lib64/
  else
    echo "input error node_id, please check!"
    exit 1
  fi
}

func_prepare_header_files()
{
    if [[ ${INTERNAL_BUILD} == "TRUE" ]]; then
      return
    fi
    if [[ ! -e "${MYSQL_DIR}/include/protobuf-c" ]]; then
      mkdir -p ${MYSQL_DIR}/3rdPartyPkg
      cd ${MYSQL_DIR}/3rdPartyPkg
      wget --no-check-certificate https://gitee.com/solid-yang/cantian-test/repository/archive/cantian3.0.0.zip
      unzip cantian3.0.0.zip
      mv cantian-test-cantian3.0.0/* ./
      rm -rf cantian-test-cantian3.0.0
      tar -zxvf protobuf-c-1.4.1.tar.gz
      mkdir -p ${MYSQL_DIR}/include/protobuf-c
      cp ${MYSQL_DIR}/3rdPartyPkg/protobuf-c-1.4.1/protobuf-c/protobuf-c.h ${MYSQL_DIR}/include/protobuf-c/
      cd -
      rm -rf ${MYSQL_DIR}/3rdPartyPkg
    fi
}
func_make_mysql_debug()
{
  echo "Start build Mysql Debug..."
  func_prepare_header_files	

  rm -rf ${MYSQL_CODE_PATH}/cantian_lib
  mkdir -p ${MYSQL_CODE_PATH}/cantian_lib
  cp -arf ${CANTIAN_LIB_DIR}/* ${MYSQL_CODE_PATH}/cantian_lib/
  mkdir -p ${MYSQL_CODE_PATH}/bld_debug
  local LLT_TEST_TYPE="NORMAL"
  if [ "${ENABLE_LLT_GCOV}" == "YES" ]; then
    LLT_TEST_TYPE="GCOV"
  elif [ "${ENABLE_LLT_ASAN}" == "YES" ]; then
    LLT_TEST_TYPE="ASAN"
  fi
  prepareGetMysqlClientStaticLibToCantianlib ${MYSQL_CODE_PATH} "DEBUG" ${LLT_TEST_TYPE} ${BOOST_PATH} ${CPU_CORES_NUM} ${MYSQL_CODE_PATH}/bld_debug

  cd ${MYSQL_CODE_PATH}/bld_debug
  cp -arf "${CANTIANDB_LIBRARY}"/shared_lib/lib/libsecurec.so /usr/lib64/
  if [ "${MYSQL_BUILD_MODE}" == "multiple" ]; then
    if [ "${ENABLE_LLT_GCOV}" == "YES" ]; then
      cmake .. -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DENABLE_GCOV=1 -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=${BOOST_PATH} -DWITHOUT_SERVER=OFF
    elif [ "${ENABLE_LLT_ASAN}" == "YES" ]; then
      cmake .. -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DWITH_ASAN=ON -DWITH_ASAN_SCOPE=ON -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=${BOOST_PATH} -DWITHOUT_SERVER=OFF
    else
      cmake .. -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=${BOOST_PATH} -DWITHOUT_SERVER=OFF -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_C_FLAGS="-Wno-error=attributes" -DCMAKE_CXX_FLAGS="-Wno-error=attributes"
    fi
  elif [ "${MYSQL_BUILD_MODE}" == "single" ]; then
    cmake .. -DWITH_CANTIAN=1 -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=${BOOST_PATH} -DWITHOUT_SERVER=OFF -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_C_FLAGS="-Wno-error=attributes" -DCMAKE_CXX_FLAGS="-Wno-error=attributes"
  fi

  MYSQL_BUILD_TYPE="debug"

  if [ -f ${MYSQL_BINARY_CODE_PATH}/mysql_${MYSQL_BUILD_TYPE}_${OS_ARCH}_${MYSQL_COMMIT_ID}.tar.gz ]; then
      cd  ${MYSQL_CODE_PATH}/bld_debug/storage/ctc && make -j${CPU_CORES_NUM} && make install
      cd ${MYSQL_BINARY_CODE_PATH} && tar -xzf mysql_${MYSQL_BUILD_TYPE}_${OS_ARCH}_${MYSQL_COMMIT_ID}.tar.gz -C /usr/local/
      echo "mysql binary code untar succeed"
      chmod +x /usr/local/mysql/bin/*
      cp -arf /${MYSQL_CODE_PATH}/mysql-test /usr/local/mysql/
  else
      make -j${CPU_CORES_NUM}
      make install
  fi
  cp -r -f -p ${MYSQL_CODE_PATH}/cantian_lib/libctc_proxy.so /usr/lib64
  echo 'log_raw=ON' >> /usr/local/mysql/mysql-test/include/default_mysqld.cnf
  cd -
}

func_make_mysql_release()
{
  echo "Start build Mysql Release..."
  func_prepare_header_files
  rm -rf ${MYSQL_CODE_PATH}/cantian_lib
  mkdir -p ${MYSQL_CODE_PATH}/cantian_lib
  cp -arf ${CANTIAN_LIB_DIR}/* ${MYSQL_CODE_PATH}/cantian_lib/
  mkdir -p ${MYSQL_CODE_PATH}/bld_debug
  local LLT_TEST_TYPE="NORMAL"
  if [ "${ENABLE_LLT_GCOV}" == "YES" ]; then
    LLT_TEST_TYPE="GCOV"
  elif [ "${ENABLE_LLT_ASAN}" == "YES" ]; then
    LLT_TEST_TYPE="ASAN"
  fi
  prepareGetMysqlClientStaticLibToCantianlib ${MYSQL_CODE_PATH} "RELEASE" ${LLT_TEST_TYPE} ${BOOST_PATH} ${CPU_CORES_NUM} ${MYSQL_CODE_PATH}/bld_debug

  cd ${MYSQL_CODE_PATH}/bld_debug
  cp -arf "${CANTIANDB_LIBRARY}"/shared_lib/lib/libsecurec.so /usr/lib64/
  if [ "${MYSQL_BUILD_MODE}" == "multiple" ]; then
    if [[ ${OS_ARCH} =~ "aarch64" ]]; then
        cmake .. -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Release -DWITH_BOOST=${BOOST_PATH} -DCMAKE_C_FLAGS="-g -march=armv8.2-a+crc+lse" -DCMAKE_CXX_FLAGS="-g -march=armv8.2-a+crc+lse" -DWITHOUT_SERVER=OFF -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
    else
        cmake .. -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Release -DWITH_BOOST=${BOOST_PATH} -DCMAKE_C_FLAGS=-g -DCMAKE_CXX_FLAGS=-g -DWITHOUT_SERVER=OFF -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
    fi
  elif [ "${MYSQL_BUILD_MODE}" == "single" ]; then
    if [[ ${OS_ARCH} =~ "aarch64" ]]; then
        cmake .. -DWITH_CANTIAN=1 -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Release -DWITH_BOOST=${BOOST_PATH} -DCMAKE_C_FLAGS="-g -march=armv8.2-a+crc+lse" -DCMAKE_CXX_FLAGS="-g -march=armv8.2-a+crc+lse" -DWITHOUT_SERVER=OFF -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
    else
        cmake .. -DWITH_CANTIAN=1 -DWITH_CTC_STORAGE_ENGINE=${WITH_CTC_STORAGE_ENGINE} -DFEATURE_FOR_EVERSQL=${FEATURE_FOR_EVERSQL} -DCMAKE_BUILD_TYPE=Release -DWITH_BOOST=${BOOST_PATH} -DCMAKE_C_FLAGS=-g -DCMAKE_CXX_FLAGS=-g -DWITHOUT_SERVER=OFF -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
    fi
    
  fi


  MYSQL_BUILD_TYPE="release"
  if [ -f ${MYSQL_BINARY_CODE_PATH}/mysql_${MYSQL_BUILD_TYPE}_${OS_ARCH}_${MYSQL_COMMIT_ID}.tar.gz ]; then
      cd  ${MYSQL_CODE_PATH}/bld_debug/storage/ctc && make -j${CPU_CORES_NUM} && make install
      cd ${MYSQL_BINARY_CODE_PATH} && tar -xzf mysql_${MYSQL_BUILD_TYPE}_${OS_ARCH}_${MYSQL_COMMIT_ID}.tar.gz -C /usr/local/
      echo "mysql binary code untar succeed"
      chmod +x /usr/local/mysql/bin/*
      cp -arf /${MYSQL_CODE_PATH}/mysql-test /usr/local/mysql/
  else
      make -j${CPU_CORES_NUM}
      make install
  fi
  cp -r -f -p ${MYSQL_CODE_PATH}/cantian_lib/libctc_proxy.so /usr/lib64
  echo 'log_raw=ON' >> /usr/local/mysql/mysql-test/include/default_mysqld.cnf
  cd -
}

func_test()
{
    echo "make test"
    func_all Debug
    strip -N main ${CANTIANDB_LIB}/libzeserver.a
    cd ${CT_TEST_BUILD_DIR}
    make -sj 8

    if [[ -e "${CANTIANDB_BIN}"/cantiand ]]; then
        cd ${CANTIANDB_BIN}
        rm -rf ${CANTIAND_BIN} && ln cantiand ${CANTIAND_BIN}
    fi

    if [[ ! -d "${CANTIANDB_HOME}"/add-ons ]]; then
        mkdir -p  ${CANTIANDB_HOME}/add-ons
    fi

    cp -d ${ZSTD_LIB_PATH}/libzstd.so*  ${CANTIANDB_HOME}/add-ons/
    cp -d ${LZ4_LIB_PATH}/liblz4.so* ${CANTIANDB_HOME}/add-ons/
    cp -rf ${CANTIANDB_BIN} ${CANTIANDB_HOME}
    cp -rf ${CANTIANDB_LIB} ${CANTIANDB_HOME}
    cp -rf ${CANTIANDB_LIBRARY} ${CANTIANDB_HOME}

}

func_clean()
{
    echo "make clean"
    func_prepare_debug
    func_prepare_pkg_name

    cd ${CANTIANDB_BUILD}
    make clean

    cd ${CT_TEST_BUILD_DIR}
    make clean

    if [[ -d "${CANTIANDB_BIN}" ]];then
        echo ${CANTIANDB_BIN}
        chmod -R 700 ${CANTIANDB_BIN}
    fi

    echo ${CANTIANDB_OUTPUT}

    rm -rf ${CANTIANDB_OUTPUT}/*
    rm -rf ${CANTIANDB_HOME}/../${ALL_PACK_DIR_NAME}

    cd ${CANTIANDB_BUILD}
    rm -rf pkg
    rm -rf CMakeFiles
    rm -f Makefile
    rm -f cmake_install.cmake
    rm -f CMakeCache.txt

    rm -rf ${MYSQL_DIR}/bld_debug/*
}

func_pkg_ctsql()
{
    echo "make pkg ctsql"

    rm -rf ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}*
    mkdir -p ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}
    mkdir -p ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/bin
    mkdir -p ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/lib
    mkdir -p ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/add-ons

    func_version_ctsql_pkg

    cp ${CANTIANDB_BIN}/ctsql ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/bin/ctsql
    cp -d ${CANTIANDB_LIB}/libzeclient.so ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/lib/
    cp -d ${CANTIANDB_LIB}/libzecommon.so ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/lib/
    cp -d ${CANTIANDB_LIB}/libzeprotocol.so ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/lib/

    cp -d ${Z_LIB_PATH}/libz.so* ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/add-ons/
    cp -d ${PCRE_LIB_PATH}/libpcre2-8.so* ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/add-ons/

    chmod -R 700 ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/*
    chmod 500 ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/add-ons/*
    chmod 500 ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/bin/*
    chmod 500 ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/lib/*
    chmod 400 ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}/package.xml

    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${CTSQL_PACK_DIR_NAME}.tar.gz ${CTSQL_PACK_DIR_NAME}
    sha256sum ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${CTSQL_PACK_DIR_NAME}.sha256

}

func_logic_rep()
{
    if [[ -d "${LOGICREP_FILE_DIR}" ]]; then
        chmod -R 700 ${LOGICREP_FILE_DIR}/*
    fi
    rm -rf ${LOGICREP_DIR}/file

    cd ${LOGICREP_DIR} && sh build_package_unix.sh
    rm -rf ${LOGICREP_DIR}/file/${LOGICREP_GZ_NAME}
    chmod 700 ${LOGICREP_DIR}/file/*
    chmod 500 ${LOGICREP_DIR}/file/*.sh
    chmod 600 ${LOGICREP_DIR}/file/*.ini
    chmod 500 ${LOGICREP_DIR}/file/*.jar
    chmod 500 ${LOGICREP_DIR}/file/*.py
    chmod -R 700 ${LOGICREP_DIR}/file/conf/*
    chmod 600 ${LOGICREP_DIR}/file/conf/*.xml
    chmod 600 ${LOGICREP_DIR}/file/conf/*.properties
    chmod 600 ${LOGICREP_DIR}/file/conf/repconf/*.xml
    chmod 600 ${LOGICREP_DIR}/file/conf/topicconf/*.properties
    chmod 600 ${LOGICREP_DIR}/file/conf/sec/*.properties
    chmod -R 500 ${LOGICREP_DIR}/file/lib/*
    chmod -R 500 ${LOGICREP_DIR}/file/plugin/*

    rm -rf ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}*
    mkdir -p ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}/logicrep
    chmod 700 ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}/logicrep
    cd ${LOGICREP_DIR}/file/lib/
    cp -r ${LOGICREP_DIR}/file/* ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}/logicrep/
    cd ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}/logicrep/ && ln -s com.huawei.cantian.logicrep-*.jar com.huawei.cantian.logicrep.jar
    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${LOGICREP_DIR_NAME}.tar.gz ${LOGICREP_DIR_NAME}
    sha256sum ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}.sha256
}

func_toolkit()
{
    if [[ ${INTERNAL_BUILD} == "FALSE" ]];then
        return
    fi
    cp -r /usr1/build/logicrep/pkg/src/zlogicrep ${CANTIANDB_HOME}/src
    func_logic_rep
    rm -rf ${CANTIANDB_BIN}/${TOOLS_PACK_DIR_NAME}
    mkdir -p ${CANTIANDB_BIN}/${TOOLS_PACK_DIR_NAME}
    mv ${CANTIANDB_BIN}/${LOGICREP_DIR_NAME}.tar.gz ${CANTIANDB_BIN}/${TOOLS_PACK_DIR_NAME}
    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${TOOLS_PACK_DIR_NAME}.tar.gz ${TOOLS_PACK_DIR_NAME}
    sha256sum ${CANTIANDB_BIN}/${TOOLS_PACK_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${TOOLS_PACK_DIR_NAME}.sha256
}

func_making_package()
{
    build_package_mode=$1
    if [[ -z "${build_package_mode}" ]]; then
        build_package_mode='Debug'
    fi

    if [[ "${build_package_mode}" = 'Debug' ]] || [[ "${build_package_mode}" = 'Shard_Debug' ]]; then
        func_make_debug
    else
        echo "make release"
        func_all Release
        func_prepare_pkg_name
    fi

    if [[ "${build_package_mode}" = 'Release' ]] || [[ "${build_package_mode}" = 'Shard_Release' ]]; then
        # func_release_symbol
        func_pkg_run
    fi
    func_toolkit
    rm -rf ${CANTIANDB_HOME}/../${ALL_PACK_DIR_NAME}
    rm -rf ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}
    rm -rf ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}.tar.gz
    mkdir -p ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}
    cp ${CANTIANDB_HOME}/install/install.py ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/
    cp ${CANTIANDB_HOME}/install/funclib.py ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/
    cp ${CANTIANDB_HOME}/install/installdb.sh ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/
    mkdir -p ${CANTIANDB_LIBRARY}/shared_lib/lib/
    cp -f ${CANTIANDB_HOME}/../platform/HuaweiSecureC/lib/* ${CANTIANDB_LIBRARY}/shared_lib/lib/

    chmod -R 500 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/install.py
    chmod -R 500 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/funclib.py
    chmod -R 500 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/installdb.sh
    mv ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}.tar.gz ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/
    sha256sum ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/${RUN_PACK_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/${RUN_PACK_DIR_NAME}.sha256
    chmod 400 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/${RUN_PACK_DIR_NAME}.sha256
    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${ALL_PACK_DIR_NAME}.tar.gz ${ALL_PACK_DIR_NAME}
    sha256sum ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}.sha256
    func_pkg_ctsql

    find ${CANTIANDB_BIN} -name "*.sha256" -exec chmod 400 {} \;
    cp -arf ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME} ${CANTIANDB_HOME}/../${ALL_PACK_DIR_NAME}
}

func_download_3rdparty()
{
    if [[ "${WORKSPACE}" == *"regress"* ]]; then
        DOWNLOAD_PATH=$DFT_WORKSPACE"/CantianKernel"
    else
        DOWNLOAD_PATH=${WORKSPACE}"/cantian"
    fi
    
    cd ${DOWNLOAD_PATH}
    if [[ ${INTERNAL_BUILD} == "FALSE" ]]; then
      git submodule init
      git submodule update --recursive
    else
      echo "Clone source start"
      if [[ x"${proxy_user}" != x"" ]]; then
        export http_proxy=http://${proxy_user}:${proxy_pwd}@${proxy_url}
        export https_proxy=${http_proxy}
        export no_proxy=127.0.0.1,.huawei.com,localhost,local,.local
      fi    
      git clone https://gitee.com/cantian-repo/cantian-repo.git
      rm -rf open_source
      mv cantian-repo open_source 
    fi    

    cd -

    echo "start compile 3rdparty : "
    sh compile_opensource_new.sh
}

## download 3rd-party lib and platform lib
func_prepare_dependency()
{
    echo "Prepare LCRP_HOME dependency func : "
    if [[ ! -d ${CANTIANDB_LIBRARY} ]]; then
        echo "library dir not exist"
        mkdir -p ${CANTIANDB_LIBRARY}
    fi

    if [[ ! -d ${CANTIANDB_OPEN_SOURCE} ]]; then
        echo "open_source dir not exist"
        mkdir -p ${CANTIANDB_OPEN_SOURCE}
    fi

    if [[ ! -d ${CANTIANDB_OUTPUT} ]]; then
        echo "output dir not exist"
        mkdir -p ${CANTIANDB_OUTPUT}
    fi

    if [[ ! -d ${CANTIANDB_PLATFORM} ]]; then
        echo "platform dir not exist"
        mkdir -p ${CANTIANDB_PLATFORM}
    fi

    if [[ ! -d ${MYSQL_BINARY_CODE_PATH} ]]; then
        echo "mysql binary code dir not exist"
        mkdir -p ${MYSQL_BINARY_CODE_PATH}
    fi

    #下载三方库并编译
    if [[ -z ${WITHOUT_DEPS} ]]; then
        func_download_3rdparty
    fi

    chmod 755 ${CANTIANDB_HOME}/../library/protobuf/lib/libprotobuf-c.a
}

func_prepare_LLT_dependency()
{
    echo "Prepare LCRP_HOME dependency func : "
    if [[ ! -d ${CANTIANDB_LIBRARY} ]]; then
        echo "library dir not exist"
        mkdir -p ${CANTIANDB_LIBRARY}
    fi

    if [[ ! -d ${CANTIANDB_OPEN_SOURCE} ]]; then
        echo "open_source dir not exist"
        mkdir -p ${CANTIANDB_OPEN_SOURCE}
    fi

    if [[ ! -d ${CANTIANDB_OUTPUT} ]]; then
        echo "output dir not exist"
        mkdir -p ${CANTIANDB_OUTPUT}
    fi

    if [[ ! -d ${CANTIANDB_PLATFORM} ]]; then
        echo "platform dir not exist"
        mkdir -p ${CANTIANDB_PLATFORM}
    fi

    if [[ ! -d ${MYSQL_BINARY_CODE_PATH} ]]; then
        echo "mysql binary code dir not exist"
        mkdir -p ${MYSQL_BINARY_CODE_PATH}
    fi

    echo ${LCRP_HOME}
    mkdir -p /root/.ArtGet/conf
    cp -f ${CANTIANDB_CI_PATH}/CMC/Setting.xml /root/.ArtGet/conf
    OS_Version=`sh ${CANTIANDB_CI_PATH}/CMC/get_OS_Version.sh`

    #下载三方库并编译
    if [[ ${INTERNAL_BUILD} == "FALSE" ]]; then
      func_download_3rdparty
    fi
    if [[ "${WORKSPACE}" == *"regress"* ]]; then
        DOWNLOAD_PATH=$DFT_WORKSPACE"/CantianKernel"
    else
        DOWNLOAD_PATH=${WORKSPACE}"/cantian"
    fi

    echo "start download 3rdparty : ${DOWNLOAD_PATH}"
    python ${CANTIANDB_CI_PATH}/CMC/manifest_opensource_download.py manifest_opensource.xml ${DOWNLOAD_PATH}
    sh download_opensource_cmc.sh
    echo "start download 3rdparty lib: "
    artget pull -d ${CANTIANDB_CI_PATH}/CMC/CantianKernel_opensource_dependency.xml -p "{'OS_Version':'${OS_Version}'}"  -user ${cmc_username} -pwd ${cmc_password}

    artget pull -d ${CANTIANDB_CI_PATH}/CMC/CantianKernel_dependency_new.xml -p "{'OS_Version':'${OS_Version}'}"  -user ${cmc_username} -pwd ${cmc_password}
    if [[ $? -ne 0 ]]; then
        echo "dependency download failed"
        exit 1
    else
        echo "dependency download succeed"
    fi

    chmod 755 ${CANTIANDB_HOME}/../library/protobuf/lib/libprotobuf-c.a
}

#获取最新包地址
function expect_ssh_get_latest_tar_file_path() {
	local ip=$1
    local file_path=$2
    /usr/bin/expect << EOF
    spawn ssh aa_release@${ip} "ls ~${file_path} | sort | uniq | tail -n 1"
    expect {
        "*yes/no" { send "yes\r"; exp_continue }
        "*password:*" { send "aa_release\r"}
    }
    expect eof
EOF
}

# 从sftp服务器上下载包
function down_client_file() {
    local ip=$1
    local file_path=$2
    local local_file=$3
    /usr/bin/expect << EOF
    set timeout -1
    spawn scp -rp aa_release@${ip}:${file_path} ${local_file}
    expect {
        "*yes/no" { send "yes\r"; exp_continue }
        "*password:*" { send "aa_release\r"}
    }
    expect eof
EOF
}

func_make_raft()
{
    ## download dependency:
    func_prepare_dependency

    echo "make raft"

    raft_build_mode=$1
    if [[ -z "${raft_build_mode}" ]]; then
        raft_build_mode='Debug'
    fi

    if [[ "${raft_build_mode}" = 'Debug' ]]; then
        func_prepare_debug
    else
        func_prepare_release
    fi

    cd ${CT_SRC_BUILD_DIR}/raft && make -sj 8
}

func_regress_test()
{
    echo "make debug"
    ## download dependency:
    func_prepare_LLT_dependency
    func_prepare_debug
    cd ${CT_SRC_BUILD_DIR}
    set +e
    make all -sj 8
    if [ $? -ne 0 ]; then
        ls -al ${CANTIANDB_LIB}
        ls -al /home/regress
        ls -al /home/regress/CantianKernel/build
        exit 1
    fi
    set -e

    if [[ -e "${CANTIANDB_BIN}"/cantiand ]]; then
        cd ${CANTIANDB_BIN}
        if [ -e "${CANTIAND_BIN}" ]; then
          rm ${CANTIAND_BIN}
        fi
        ln cantiand ${CANTIAND_BIN}
    fi
}

func_make_test_debug()
{
    echo "make debug"
    ## download dependency:
    func_prepare_LLT_dependency
    func_prepare_debug
    cd ${CT_SRC_BUILD_DIR}
    set +e
    make all -sj 8
    if [ $? -ne 0 ]; then
        ls -al ${CANTIANDB_LIB}
        ls -al /home/regress
        ls -al /home/regress/CantianKernel/build
        exit 1
    fi
    set -e

    if [[ -e "${CANTIANDB_BIN}"/cantiand ]]; then
        cd ${CANTIANDB_BIN}
        if [ -e "${CANTIAND_BIN}" ]; then
          rm ${CANTIAND_BIN}
        fi
        ln cantiand ${CANTIAND_BIN}
    fi
    func_prepare_pkg_name
    func_pkg_run_basic
    chmod 400 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/admin/scripts/*
    #chmod 700 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/admin/scripts/upgrade
    #chmod 400 ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/admin/scripts/upgrade/*
    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${RUN_PACK_DIR_NAME}.tar.gz ${RUN_PACK_DIR_NAME}
    rm -rf ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}/bin/script
}

func_making_package_test()
{
    build_package_mode=$1
    if [[ -z "${build_package_mode}" ]]; then
        build_package_mode = 'Debug'
    fi

    func_make_test_debug

    rm -rf ${CANTIANDB_HOME}/../${ALL_PACK_DIR_NAME}
    rm -rf ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}
    rm -rf ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}.tar.gz
    mkdir -p ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}
    cp ${CANTIANDB_HOME}/install/install.py ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/
    cp ${CANTIANDB_HOME}/install/funclib.py ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/
    cp ${CANTIANDB_HOME}/install/installdb.sh ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/

    chmod -R 500 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/install.py
    chmod -R 500 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/funclib.py
    chmod -R 500 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/installdb.sh
    mv ${CANTIANDB_BIN}/${RUN_PACK_DIR_NAME}.tar.gz ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/
    sha256sum ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/${RUN_PACK_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/${RUN_PACK_DIR_NAME}.sha256
    chmod 400 ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}/${RUN_PACK_DIR_NAME}.sha256
    cd ${CANTIANDB_BIN} && tar --owner=root --group=root -zcf ${ALL_PACK_DIR_NAME}.tar.gz ${ALL_PACK_DIR_NAME}
    sha256sum ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}.tar.gz | cut -c1-64 > ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME}.sha256

    find ${CANTIANDB_BIN} -name "*.sha256" -exec chmod 400 {} \;
    cp -arf ${CANTIANDB_BIN}/${ALL_PACK_DIR_NAME} ${CANTIANDB_HOME}/../${ALL_PACK_DIR_NAME}
}

main()
{
    echo "Main Function : "
    arg0=$0
    arg1=$1

    until [[ -z "$2" ]]
    do {
        echo $2
        arg2=$2

        case "${arg2}" in
        'test_cbo=1')
            echo "test_cbo enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_CBOTEST=ON"
            ;;
        'protect_buf=1')
            echo "protect_buf enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_PROTECT_BUF=ON"
            ;;
        'crc=1')
            echo "crc enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_CRC=ON"
            ;;
        'protect_vm=1')
            echo "protect_vm enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_PROTECT_VM=ON"
            ;;
        'cantiand_cn=1')
            echo "cantiand_cn enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_CANTIAND_CN=ON"
            ;;
        'test_mem=1')
            echo "test_mem enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_TEST_MEM=ON"
            ;;
        'lcov=1')
            echo "lcov enable"
            ENABLE_LLT_GCOV="YES"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_LCOV=ON"
            ;;
        'llt=1')
            echo "llt enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_LLT=ON"
            ;;
        'asan=1')
            echo "ASAN enable"
            ENABLE_LLT_ASAN="YES"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_ASAN=ON"
            ;;
        'fuzzasan=1')
            echo "FUZZ ASAN ENABLE"
            mkdir -p ${CANTIANDB_LIB}
            cp -f ${CANTIANDB_LIBRARY}/secodefuzz/lib/* ${CANTIANDB_LIB}
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_ASAN=ON"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_FUZZASAN=ON"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_LCOV=ON"
            ;;
        'tsan=1')
            echo "TSAN enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_TSAN=ON"
            ;;
        'canalyze=1')
            echo "Canalyze enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DCMAKE_EXPORT_COMPILE_COMMANDS=1 "
            ;;
        'h1620=1')
            echo "h1620 enable"
            COMPILE_OPTS="${COMPILE_OPTS} -DUSE_H1620=ON"
            ;;
        'no_shm=1')
            echo "build with out shm"
            COMPILE_OPTS="${COMPILE_OPTS} -DNO_SHM=ON"
            MYSQL_BUILD_MODE="single"
            ;;
        'CANTIAN_READ_WRITE=1')
            echo "build with CANTIAN_READ_WRITE"
            COMPILE_OPTS="${COMPILE_OPTS} -DCANTIAN_READ_WRITE=ON"
            ;;
        'FEATURE_FOR_EVERSQL=1')
            echo "build with FEATURE FOR_EVERSQL"
            FEATURE_FOR_EVERSQL="1";
            ;;
        '--without-deps')
            echo "no need for 3rdparty dependency compilation"
            WITHOUT_DEPS="true"
            ;;
        *)
            echo "Wrong compile options"
            exit 1
            ;;
        esac
        shift
    }
    done

    case "${arg1}" in
    'all')
        COMPILE_OPTS="${COMPILE_OPTS} -DUSE_PROTECT_VM=ON"
        func_all Debug
        ;;
    'debug')
        COMPILE_OPTS="${COMPILE_OPTS} -DUSE_PROTECT_VM=ON"
        func_make_debug
        ;;
    'release')
        func_make_release
        ;;
    'mysqllib')
        fun_pkg_mysql_lib
        ;;
    'mysql'|'mysql_debug')
        func_make_mysql_debug
        ;;
    'mysql_release')
        func_make_mysql_release
        ;;
    'mysql_package_node0')
        func_collect_mysql_target node0
        ;;
    'mysql_package_node1')
        func_collect_mysql_target node1
        ;;
    'clean')
        func_clean
        ;;
    'test')
	    COMPILE_OPTS="${COMPILE_OPTS} -DCMS_UT_TEST=ON"
        func_test
        ;;
    'package'|'package-debug')
        COMPILE_OPTS="${COMPILE_OPTS} -DUSE_PROTECT_VM=ON"
        func_making_package Debug
        ;;
    'package-release')
        func_making_package Release
        ;;
    'make_regress_test')
        COMPILE_OPTS="${COMPILE_OPTS} -DUSE_PROTECT_VM=ON -DCMS_UT_TEST=ON"
        func_regress_test
        ;;
    'make_cantian_pkg_test')
        COMPILE_OPTS="${COMPILE_OPTS} -DUSE_PROTECT_VM=ON"
        func_making_package_test Debug
        ;;
    *)

        echo "Wrong parameters"
        exit 1
        ;;
    esac
}

main $@