This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch dev-1.1.2
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/dev-1.1.2 by this push:
     new 1e69b90fb5 [dev-1.1.2][chore] Update thirdparties to be same as 
master@08c5e0b1 (#12304)
1e69b90fb5 is described below

commit 1e69b90fb546ffb1d19ab5d64163e4e706d89f45
Author: Mingyu Chen <morningman....@gmail.com>
AuthorDate: Fri Sep 2 16:46:50 2022 +0800

    [dev-1.1.2][chore] Update thirdparties to be same as master@08c5e0b1 
(#12304)
---
 thirdparty/CHANGELOG.md                          |   15 +-
 thirdparty/build-thirdparty.sh                   | 1384 ++++++++++++++--------
 thirdparty/download-thirdparty.sh                |  332 +++---
 thirdparty/patches/apache-arrow-7.0.0.patch      |   70 ++
 thirdparty/patches/brpc-1.1.0-_dl_sym.patch      |   28 -
 thirdparty/patches/brpc-1.2.0.patch              |   13 +
 thirdparty/patches/opentelemetry-cpp-1.4.0.patch |  264 +++--
 thirdparty/patches/vectorscan-5.4.7.patch        |   31 +
 thirdparty/vars.sh                               |  164 +--
 9 files changed, 1388 insertions(+), 913 deletions(-)

diff --git a/thirdparty/CHANGELOG.md b/thirdparty/CHANGELOG.md
index ae9b8c31f8..dd5818aa1f 100644
--- a/thirdparty/CHANGELOG.md
+++ b/thirdparty/CHANGELOG.md
@@ -2,12 +2,23 @@
 
 This file contains version of the third-party dependency libraries in the 
build-env image. The docker build-env image is apache/doris, and the tag is 
`build-env-${version}`
 
-## v20220812
+## v20220811
+- Modified: brpc 1.1.0 -> 1.2.0 fix _dl_sym undefined reference on Ubuntu22.04
+
+## v20220802
 
 - Modified: libhdfs3 2.3.1 -> 2.3.2
 
+## v20220718
+
+- Modified: brpc 1.0.0 -> 1.1.0
+- Modified: leveldb 1.20 -> 1.23
+
+## v20220606
+- Added: vectorscan 5.4.7, and a patch for compilation
+
 ## v20220613
-- Modified: update libhdfs3 from 2.3.0 to 2.3.1  fix client uuid set error
+- Modified: update libhdfs3 from 2.3.0 to 2.3.1 fix client uuid set error
 
 ## v20220608
 - Remove: remove libhdfs3 without kerberos support
diff --git a/thirdparty/build-thirdparty.sh b/thirdparty/build-thirdparty.sh
index 51d95a9b9a..a9ceb3820c 100755
--- a/thirdparty/build-thirdparty.sh
+++ b/thirdparty/build-thirdparty.sh
@@ -1,4 +1,6 @@
 #!/usr/bin/env bash
+# shellcheck disable=2034
+
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -26,121 +28,140 @@
 # This script will run *download-thirdparty.sh* once again
 # to check if all thirdparties have been downloaded, unpacked and patched.
 
#################################################################################
-set -e
 
-curdir=`dirname "$0"`
-curdir=`cd "$curdir"; pwd`
+set -eo pipefail
+
+curdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
 
-export DORIS_HOME=$curdir/..
-export TP_DIR=$curdir
+export DORIS_HOME="${curdir}/.."
+export TP_DIR="${curdir}"
 
 # Check args
 usage() {
-  echo "
+    echo "
 Usage: $0 <options>
   Optional options:
      -j                 build thirdparty parallel
   "
-  exit 1
+    exit 1
 }
 
-OPTS=$(getopt \
-  -n $0 \
-  -o '' \
-  -o 'h' \
-  -l 'help' \
-  -o 'j:' \
-  -- "$@")
-
-if [ $? != 0 ] ; then
+if ! OPTS="$(getopt \
+    -n "$0" \
+    -o '' \
+    -o 'h' \
+    -l 'help' \
+    -o 'j:' \
+    -- "$@")"; then
     usage
 fi
 
-eval set -- "$OPTS"
+eval set -- "${OPTS}"
+
+KERNEL="$(uname -s)"
+
+if [[ "${KERNEL}" == 'Darwin' ]]; then
+    PARALLEL="$(($(sysctl -n hw.logicalcpu) / 4 + 1))"
+else
+    PARALLEL="$(($(nproc) / 4 + 1))"
+fi
 
-PARALLEL=$[$(nproc)/4+1]
-if [[ $# -ne 1 ]] ; then
+if [[ "$#" -ne 1 ]]; then
     while true; do
         case "$1" in
-            -j) PARALLEL=$2; shift 2 ;;
-            -h) HELP=1; shift ;;
-            --help) HELP=1; shift ;;
-            --) shift ;  break ;;
-            *) echo "Internal error" ; exit 1 ;;
+        -j)
+            PARALLEL="$2"
+            shift 2
+            ;;
+        -h)
+            HELP=1
+            shift
+            ;;
+        --help)
+            HELP=1
+            shift
+            ;;
+        --)
+            shift
+            break
+            ;;
+        *)
+            echo "Internal error"
+            exit 1
+            ;;
         esac
     done
 fi
 
-if [[ ${HELP} -eq 1 ]]; then
+if [[ "${HELP}" -eq 1 ]]; then
     usage
     exit
 fi
 
 echo "Get params:
-    PARALLEL            -- $PARALLEL
+    PARALLEL            -- ${PARALLEL}
 "
 
 # include custom environment variables
-if [[ -f ${DORIS_HOME}/env.sh ]]; then
+if [[ -f "${DORIS_HOME}/env.sh" ]]; then
     export BUILD_THIRDPARTY_WIP=1
-    . ${DORIS_HOME}/env.sh
+    . "${DORIS_HOME}/env.sh"
     export BUILD_THIRDPARTY_WIP=
 fi
 
-if [[ ! -f ${TP_DIR}/download-thirdparty.sh ]]; then
+if [[ ! -f "${TP_DIR}/download-thirdparty.sh" ]]; then
     echo "Download thirdparty script is missing".
     exit 1
 fi
 
-if [ ! -f ${TP_DIR}/vars.sh ]; then
+if [[ ! -f "${TP_DIR}/vars.sh" ]]; then
     echo "vars.sh is missing".
     exit 1
 fi
-. ${TP_DIR}/vars.sh
 
-cd $TP_DIR
+. "${TP_DIR}/vars.sh"
+
+cd "${TP_DIR}"
 
 # Download thirdparties.
-${TP_DIR}/download-thirdparty.sh
+"${TP_DIR}/download-thirdparty.sh"
 
-export LD_LIBRARY_PATH=$TP_DIR/installed/lib:$LD_LIBRARY_PATH
+export LD_LIBRARY_PATH="${TP_DIR}/installed/lib:${LD_LIBRARY_PATH}"
 
 # toolchain specific warning options and settings
-if [[ "$CC" == *gcc ]]
-then
-    warning_uninitialized=-Wno-maybe-uninitialized
-    warning_stringop_truncation=-Wno-stringop-truncation
-    warning_class_memaccess=-Wno-class-memaccess
-    warning_array_parameter=-Wno-array-parameter
-    boost_toolset=gcc
-elif [[ "$CC" == *clang ]]
-then
-    warning_uninitialized=-Wno-uninitialized
-    warning_shadow=-Wno-shadow
-    warning_dangling_gsl=-Wno-dangling-gsl
-    warning_unused_but_set_variable=-Wno-unused-but-set-variable
-    warning_defaulted_function_deleted=-Wno-defaulted-function-deleted
-    warning_reserved_identifier=-Wno-reserved-identifier
-    warning_suggest_override="-Wno-suggest-override 
-Wno-suggest-destructor-override"
-    warning_option_ignored=-Wno-option-ignored
-    boost_toolset=clang
-    libhdfs_cxx17=-std=c++1z
+if [[ "${CC}" == *gcc ]]; then
+    warning_uninitialized='-Wno-maybe-uninitialized'
+    warning_stringop_truncation='-Wno-stringop-truncation'
+    warning_class_memaccess='-Wno-class-memaccess'
+    warning_array_parameter='-Wno-array-parameter'
+    boost_toolset='gcc'
+elif [[ "${CC}" == *clang ]]; then
+    warning_uninitialized='-Wno-uninitialized'
+    warning_shadow='-Wno-shadow'
+    warning_dangling_gsl='-Wno-dangling-gsl'
+    warning_unused_but_set_variable='-Wno-unused-but-set-variable'
+    warning_defaulted_function_deleted='-Wno-defaulted-function-deleted'
+    warning_reserved_identifier='-Wno-reserved-identifier'
+    warning_suggest_override='-Wno-suggest-override 
-Wno-suggest-destructor-override'
+    warning_option_ignored='-Wno-option-ignored'
+    boost_toolset='clang'
+    libhdfs_cxx17='-std=c++1z'
 fi
 
 # prepare installed prefix
-mkdir -p ${TP_DIR}/installed/lib64
-pushd  ${TP_DIR}/installed/
+mkdir -p "${TP_DIR}/installed/lib64"
+pushd "${TP_DIR}/installed"/
 ln -sf lib64 lib
 popd
 
 check_prerequest() {
-    local CMD=$1
-    local NAME=$2
-    if ! $CMD; then
-        echo $NAME is missing
+    local CMD="$1"
+    local NAME="$2"
+    if ! ${CMD}; then
+        echo "${NAME} is missing"
         exit 1
     else
-        echo $NAME is found
+        echo "${NAME} is found"
     fi
 }
 
@@ -165,9 +186,9 @@ check_prerequest "automake --version" "automake"
 check_prerequest "libtoolize --version" "libtool"
 
 # aclocal_version should equal to automake_version
-aclocal_version=`aclocal --version | sed -n '1p'|awk 'NF>1{print $NF}'`
-automake_version=`automake --version | sed -n '1p'|awk 'NF>1{print $NF}'`
-if [ ${aclocal_version} != ${automake_version} ] ; then
+aclocal_version=$(aclocal --version | sed -n '1p' | awk 'NF>1{print $NF}')
+automake_version=$(automake --version | sed -n '1p' | awk 'NF>1{print $NF}')
+if [[ "${aclocal_version}" != "${automake_version}" ]]; then
     echo "Error: aclocal version(${aclocal_version}) is not equal to automake 
version(${automake_version})."
     exit 1
 fi
@@ -189,372 +210,481 @@ fi
 # build all thirdparties
 #########################
 
-
 # Name of cmake build directory in each thirdpary project.
 # Do not use `build`, because many projects contained a file named `BUILD`
 # and if the filesystem is not case sensitive, `mkdir` will fail.
 BUILD_DIR=doris_build
 
 check_if_source_exist() {
-    if [ -z $1 ]; then
+    if [[ -z $1 ]]; then
         echo "dir should specified to check if exist."
         exit 1
     fi
 
-    if [ ! -d $TP_SOURCE_DIR/$1 ];then
-        echo "$TP_SOURCE_DIR/$1 does not exist."
+    if [[ ! -d "${TP_SOURCE_DIR}/$1" ]]; then
+        echo "${TP_SOURCE_DIR}/$1 does not exist."
         exit 1
     fi
     echo "===== begin build $1"
 }
 
 check_if_archieve_exist() {
-    if [ -z $1 ]; then
+    if [[ -z $1 ]]; then
         echo "archieve should specified to check if exist."
         exit 1
     fi
 
-    if [ ! -f $TP_SOURCE_DIR/$1 ];then
-        echo "$TP_SOURCE_DIR/$1 does not exist."
+    if [[ ! -f "${TP_SOURCE_DIR}/$1" ]]; then
+        echo "${TP_SOURCE_DIR}/$1 does not exist."
         exit 1
     fi
 }
 
+remove_all_dylib() {
+    if [[ "${KERNEL}" == 'Darwin' ]]; then
+        find "${TP_INSTALL_DIR}/lib64" -name "*.dylib" -delete
+    fi
+}
+
 #libbacktrace
 build_libbacktrace() {
-    check_if_source_exist $LIBBACKTRACE_SOURCE
-    cd $TP_SOURCE_DIR/$LIBBACKTRACE_SOURCE
+    check_if_source_exist "${LIBBACKTRACE_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${LIBBACKTRACE_SOURCE}"
 
-    CPPFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \
-    CXXFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR
-    make -j $PARALLEL
+    CPPFLAGS="-I${TP_INCLUDE_DIR}" \
+        CXXFLAGS="-I${TP_INCLUDE_DIR}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}"
+
+    make -j "${PARALLEL}"
     make install
 }
 
 # libevent
 build_libevent() {
-    check_if_source_exist $LIBEVENT_SOURCE
-    cd $TP_SOURCE_DIR/$LIBEVENT_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    check_if_source_exist "${LIBEVENT_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${LIBEVENT_SOURCE}"
 
-    CFLAGS="-std=c99 -fPIC -D_BSD_SOURCE -fno-omit-frame-pointer -g -ggdb -O2 
-I${TP_INCLUDE_DIR}" \
-    CPPLAGS="-I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    ${CMAKE_CMD} -G "${GENERATOR}" -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR 
-DEVENT__DISABLE_TESTS=ON \
-    -DEVENT__DISABLE_OPENSSL=ON -DEVENT__DISABLE_SAMPLES=ON 
-DEVENT__DISABLE_REGRESS=ON ..
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    CFLAGS="-std=c99 -D_BSD_SOURCE -fno-omit-frame-pointer -g -ggdb -O2 
-I${TP_INCLUDE_DIR}" \
+        CPPLAGS="-I${TP_INCLUDE_DIR}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" -DEVENT__DISABLE_TESTS=ON \
+        -DEVENT__DISABLE_OPENSSL=ON -DEVENT__DISABLE_SAMPLES=ON 
-DEVENT__DISABLE_REGRESS=ON ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
+
+    remove_all_dylib
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libevent.a
 }
 
 build_openssl() {
-    MACHINE_TYPE=$(uname -m)
+    MACHINE_TYPE="$(uname -m)"
     OPENSSL_PLATFORM="linux-x86_64"
-    if [[ "${MACHINE_TYPE}" == "aarch64" ]]; then
+    if [[ "${KERNEL}" == 'Darwin' ]]; then
+        OPENSSL_PLATFORM="darwin64-${MACHINE_TYPE}-cc"
+    elif [[ "${MACHINE_TYPE}" == "aarch64" ]]; then
         OPENSSL_PLATFORM="linux-aarch64"
     fi
 
-    check_if_source_exist $OPENSSL_SOURCE
-    cd $TP_SOURCE_DIR/$OPENSSL_SOURCE
+    check_if_source_exist "${OPENSSL_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${OPENSSL_SOURCE}"
 
-    CPPFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \
-    CXXFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    LIBDIR="lib" \
-    ./Configure --prefix=$TP_INSTALL_DIR --with-rand-seed=devrandom -shared 
${OPENSSL_PLATFORM}
+    CPPFLAGS="-I${TP_INCLUDE_DIR}" \
+        CXXFLAGS="-I${TP_INCLUDE_DIR}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        LIBDIR="lib" \
+        ./Configure --prefix="${TP_INSTALL_DIR}" --with-rand-seed=devrandom 
-shared "${OPENSSL_PLATFORM}"
     # NOTE(amos): Never use '&&' to concat commands as it will eat error code
     # See https://mywiki.wooledge.org/BashFAQ/105 for more detail.
-    make -j $PARALLEL
+    make -j "${PARALLEL}"
     make install_sw
     # NOTE(zc): remove this dynamic library files to make libcurl static link.
     # If I don't remove this files, I don't known how to make libcurl link 
static library
-    if [ -f $TP_INSTALL_DIR/lib64/libcrypto.so ]; then
-        rm -rf $TP_INSTALL_DIR/lib64/libcrypto.so*
+    if [[ -f "${TP_INSTALL_DIR}/lib64/libcrypto.so" ]]; then
+        rm -rf "${TP_INSTALL_DIR}"/lib64/libcrypto.so*
     fi
-    if [ -f $TP_INSTALL_DIR/lib64/libssl.so ]; then
-        rm -rf $TP_INSTALL_DIR/lib64/libssl.so*
+    if [[ -f "${TP_INSTALL_DIR}/lib64/libssl.so" ]]; then
+        rm -rf "${TP_INSTALL_DIR}"/lib64/libssl.so*
     fi
+    remove_all_dylib
 }
 
 # thrift
 build_thrift() {
-    check_if_source_exist $THRIFT_SOURCE
-    cd $TP_SOURCE_DIR/$THRIFT_SOURCE
+    check_if_source_exist "${THRIFT_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${THRIFT_SOURCE}"
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        cppflags="-I${TP_INCLUDE_DIR}"
+        ldflags="-L${TP_LIB_DIR} --static"
+    else
+        cppflags="-I${TP_INCLUDE_DIR} -Wno-implicit-function-declaration"
+        ldflags="-L${TP_LIB_DIR}"
+    fi
 
-    echo ${TP_LIB_DIR}
     # NOTE(amos): libtool discard -static. --static works.
-    ./configure CPPFLAGS="-I${TP_INCLUDE_DIR}" LDFLAGS="-L${TP_LIB_DIR} 
--static" LIBS="-lcrypto -ldl -lssl" CFLAGS="-fPIC" \
-    --prefix=$TP_INSTALL_DIR --docdir=$TP_INSTALL_DIR/doc --enable-static 
--disable-shared --disable-tests \
-    --disable-tutorial --without-qt4 --without-qt5 --without-csharp 
--without-erlang --without-nodejs --without-nodets --without-swift \
-    --without-lua --without-perl --without-php --without-php_extension 
--without-dart --without-ruby --without-cl \
-    --without-haskell --without-go --without-haxe --without-d --without-python 
-without-java --without-dotnetcore -without-rs --with-cpp \
-    --with-libevent=$TP_INSTALL_DIR --with-boost=$TP_INSTALL_DIR 
--with-openssl=$TP_INSTALL_DIR
-
-    if [ -f compiler/cpp/thrifty.hh ];then
+    ./configure CPPFLAGS="${cppflags}" LDFLAGS="${ldflags}" LIBS="-lcrypto 
-ldl -lssl" \
+        --prefix="${TP_INSTALL_DIR}" --docdir="${TP_INSTALL_DIR}/doc" 
--enable-static --disable-shared --disable-tests \
+        --disable-tutorial --without-qt4 --without-qt5 --without-csharp 
--without-erlang --without-nodejs --without-nodets --without-swift \
+        --without-lua --without-perl --without-php --without-php_extension 
--without-dart --without-ruby --without-cl \
+        --without-haskell --without-go --without-haxe --without-d 
--without-python -without-java --without-dotnetcore -without-rs --with-cpp \
+        --with-libevent="${TP_INSTALL_DIR}" --with-boost="${TP_INSTALL_DIR}" 
--with-openssl="${TP_INSTALL_DIR}"
+
+    if [[ -f compiler/cpp/thrifty.hh ]]; then
         mv compiler/cpp/thrifty.hh compiler/cpp/thrifty.h
     fi
 
-    make -j $PARALLEL && make install
+    make -j "${PARALLEL}"
+    make install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libthrift.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libthriftnb.a
 }
 
 # protobuf
 build_protobuf() {
-    check_if_source_exist $PROTOBUF_SOURCE
-    cd $TP_SOURCE_DIR/$PROTOBUF_SOURCE
+    check_if_source_exist "${PROTOBUF_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${PROTOBUF_SOURCE}"
     rm -fr gmock
+
     # NOTE(amos): -Wl,--undefined=pthread_create force searching for pthread 
symbols.
     # See https://stackoverflow.com/a/65348893/1329147 for detailed 
explanation.
-    mkdir gmock && cd gmock && tar xf ${TP_SOURCE_DIR}/${GTEST_NAME} \
-    && mv ${GTEST_SOURCE} gtest && cd $TP_SOURCE_DIR/$PROTOBUF_SOURCE && 
./autogen.sh
+    mkdir gmock
+    cd gmock
+    tar xf "${TP_SOURCE_DIR}/${GTEST_NAME}"
+
+    mv "${GTEST_SOURCE}" gtest
+
+    cd "${TP_SOURCE_DIR}/${PROTOBUF_SOURCE}"
+
+    ./autogen.sh
+
+    if [[ "${KERNEL}" == 'Darwin' ]]; then
+        ldflags="-L${TP_LIB_DIR}"
+    else
+        ldflags="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc 
-Wl,--undefined=pthread_create"
+    fi
+
     CXXFLAGS="-fPIC -O2 -I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc 
-Wl,--undefined=pthread_create" \
-    ./configure --prefix=${TP_INSTALL_DIR} --disable-shared --enable-static 
--with-zlib=${TP_INSTALL_DIR}/include
+        LDFLAGS="${ldflags}" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --disable-shared 
--enable-static --with-zlib="${TP_INSTALL_DIR}/include"
 
     # ATTN: If protoc is not built fully statically the linktime libc may 
newer than runtime.
     #       This will casue protoc cannot run
     #       If you really need to dynamically link protoc, please set the 
environment variable DYN_LINK_PROTOC=1
 
-    if [[ "${DYN_LINK_PROTOC}" == "1" ]]; then
+    if [[ "${DYN_LINK_PROTOC:-0}" == "1" || "${KERNEL}" == 'Darwin' ]]; then
         echo "link protoc dynamiclly"
-    else 
+    else
         cd src
         sed -i 's/^AM_LDFLAGS\(.*\)$/AM_LDFLAGS\1 -all-static/' Makefile
         cd -
     fi
 
-    make -j $PARALLEL && make install
+    make -j "${PARALLEL}"
+    make install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libprotobuf.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libprotoc.a
 }
 
 # gflags
 build_gflags() {
-    check_if_source_exist $GFLAGS_SOURCE
+    check_if_source_exist "${GFLAGS_SOURCE}"
+
+    cd "${TP_SOURCE_DIR}/${GFLAGS_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
 
-    cd $TP_SOURCE_DIR/$GFLAGS_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
     rm -rf CMakeCache.txt CMakeFiles/
-    ${CMAKE_CMD} -G "${GENERATOR}" -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR \
-    -DCMAKE_POSITION_INDEPENDENT_CODE=On ../
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+
+    "${CMAKE_CMD}" -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" \
+        -DCMAKE_POSITION_INDEPENDENT_CODE=On ../
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
 }
 
 # glog
 build_glog() {
-    check_if_source_exist $GLOG_SOURCE
-    cd $TP_SOURCE_DIR/$GLOG_SOURCE
+    check_if_source_exist "${GLOG_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${GLOG_SOURCE}"
 
     # to generate config.guess and config.sub to support aarch64
     rm -rf config.*
     autoreconf -i
 
     CPPFLAGS="-I${TP_INCLUDE_DIR} -fpermissive -fPIC" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR --enable-frame-pointers 
--disable-shared --enable-static
-    make -j $PARALLEL && make install
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --enable-frame-pointers 
--disable-shared --enable-static
+
+    make -j "${PARALLEL}"
+    make install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libglog.a
 }
 
 # gtest
 build_gtest() {
-    check_if_source_exist $GTEST_SOURCE
+    check_if_source_exist "${GTEST_SOURCE}"
+
+    cd "${TP_SOURCE_DIR}/${GTEST_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
 
-    cd $TP_SOURCE_DIR/$GTEST_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
     rm -rf CMakeCache.txt CMakeFiles/
-    ${CMAKE_CMD} ../ -G "${GENERATOR}" -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR 
-DCMAKE_POSITION_INDEPENDENT_CODE=On
+    "${CMAKE_CMD}" ../ -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" -DCMAKE_POSITION_INDEPENDENT_CODE=On
     # -DCMAKE_CXX_FLAGS="$warning_uninitialized"
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libgtest.a
 }
 
 # rapidjson
 build_rapidjson() {
-    check_if_source_exist $RAPIDJSON_SOURCE
-    cd $TP_SOURCE_DIR/$RAPIDJSON_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    check_if_source_exist "${RAPIDJSON_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${RAPIDJSON_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
     rm -rf CMakeCache.txt CMakeFiles/
-    ${CMAKE_CMD} ../ -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR 
-DRAPIDJSON_BUILD_DOC=OFF \
-    -DRAPIDJSON_BUILD_EXAMPLES=OFF -DRAPIDJSON_BUILD_TESTS=OFF
-    make -j $PARALLEL && make install
+
+    "${CMAKE_CMD}" ../ -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" 
-DRAPIDJSON_BUILD_DOC=OFF \
+        -DRAPIDJSON_BUILD_EXAMPLES=OFF -DRAPIDJSON_BUILD_TESTS=OFF
+
+    make -j "${PARALLEL}"
+    make install
 }
 
 # snappy
 build_snappy() {
-    check_if_source_exist $SNAPPY_SOURCE
-    cd $TP_SOURCE_DIR/$SNAPPY_SOURCE
+    check_if_source_exist "${SNAPPY_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${SNAPPY_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
 
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
     rm -rf CMakeCache.txt CMakeFiles/
-    CFLAGS="-O3" CXXFLAGS="-O3" ${CMAKE_CMD} -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR \
-    -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-    -DCMAKE_INSTALL_INCLUDEDIR=$TP_INCLUDE_DIR/snappy \
-    -DSNAPPY_BUILD_TESTS=0 ../
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+
+    CFLAGS="-O3" CXXFLAGS="-O3" "${CMAKE_CMD}" -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" \
+        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+        -DCMAKE_INSTALL_INCLUDEDIR="${TP_INCLUDE_DIR}"/snappy \
+        -DSNAPPY_BUILD_TESTS=0 ../
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
 
     #build for libarrow.a
-    cp $TP_INCLUDE_DIR/snappy/snappy-c.h  $TP_INCLUDE_DIR/snappy-c.h && \
-    cp $TP_INCLUDE_DIR/snappy/snappy-sinksource.h  
$TP_INCLUDE_DIR/snappy-sinksource.h && \
-    cp $TP_INCLUDE_DIR/snappy/snappy-stubs-public.h  
$TP_INCLUDE_DIR/snappy-stubs-public.h && \
-    cp $TP_INCLUDE_DIR/snappy/snappy.h  $TP_INCLUDE_DIR/snappy.h
+    cp "${TP_INCLUDE_DIR}/snappy/snappy-c.h" "${TP_INCLUDE_DIR}/snappy-c.h"
+    cp "${TP_INCLUDE_DIR}/snappy/snappy-sinksource.h" 
"${TP_INCLUDE_DIR}/snappy-sinksource.h"
+    cp "${TP_INCLUDE_DIR}/snappy/snappy-stubs-public.h" 
"${TP_INCLUDE_DIR}/snappy-stubs-public.h"
+    cp "${TP_INCLUDE_DIR}/snappy/snappy.h" "${TP_INCLUDE_DIR}/snappy.h"
 }
 
 # gperftools
 build_gperftools() {
-    check_if_source_exist $GPERFTOOLS_SOURCE
-    cd $TP_SOURCE_DIR/$GPERFTOOLS_SOURCE
-    if [ ! -f configure ]; then
+    check_if_source_exist "${GPERFTOOLS_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${GPERFTOOLS_SOURCE}"
+    if [[ ! -f configure ]]; then
         ./autogen.sh
     fi
 
     CPPFLAGS="-I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    LD_LIBRARY_PATH="${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    LD_LIBRARY_PATH="${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR/gperftools --disable-shared 
--enable-static --disable-libunwind --with-pic --enable-frame-pointers
-    make -j $PARALLEL && make install
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        LD_LIBRARY_PATH="${TP_LIB_DIR}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        LD_LIBRARY_PATH="${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}/gperftools" --disable-shared 
--enable-static --disable-libunwind --with-pic --enable-frame-pointers
+
+    make -j "${PARALLEL}"
+    make install
 }
 
 # zlib
 build_zlib() {
-    check_if_source_exist $ZLIB_SOURCE
-    cd $TP_SOURCE_DIR/$ZLIB_SOURCE
+    check_if_source_exist "${ZLIB_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${ZLIB_SOURCE}"
 
-    CPPFLAGS="-I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
     CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR --static
-    make -j $PARALLEL && make install
+        CPPFLAGS="-I${TP_INCLUDE_DIR}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --static
+
+    make -j "${PARALLEL}"
+    make install
 
     # minizip
     cd contrib/minizip
     autoreconf --force --install
-    ./configure --prefix=$TP_INSTALL_DIR --enable-static=yes --enable-shared=no
-    make -j $PARALLEL && make install
+    ./configure --prefix="${TP_INSTALL_DIR}" --enable-static=yes 
--enable-shared=no
+    make -j "${PARALLEL}"
+    make install
 }
 
 # lz4
 build_lz4() {
-    check_if_source_exist $LZ4_SOURCE
-    cd $TP_SOURCE_DIR/$LZ4_SOURCE
+    check_if_source_exist "${LZ4_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${LZ4_SOURCE}"
 
     # clean old symbolic links
     local old_symbolic_links=('lz4c' 'lz4cat' 'unlz4')
-    for link in ${old_symbolic_links[@]}; do
+    for link in "${old_symbolic_links[@]}"; do
         rm -f "${TP_INSTALL_DIR}/bin/${link}"
     done
 
-    make -j $PARALLEL install PREFIX=$TP_INSTALL_DIR BUILD_SHARED=no\
-    INCLUDEDIR=$TP_INCLUDE_DIR/lz4/
+    make -j "${PARALLEL}" install PREFIX="${TP_INSTALL_DIR}" BUILD_SHARED=no 
INCLUDEDIR="${TP_INCLUDE_DIR}/lz4"
 }
 
 # zstd
 build_zstd() {
-    check_if_source_exist $ZSTD_SOURCE
-    cd $TP_SOURCE_DIR/$ZSTD_SOURCE/build/cmake
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
-    ${CMAKE_CMD} -G "${GENERATOR}" -DBUILD_TESTING=OFF -DZSTD_BUILD_TESTS=OFF 
-DZSTD_BUILD_STATIC=ON \
-    -DZSTD_BUILD_PROGRAMS=OFF -DZSTD_BUILD_SHARED=OFF  
-DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR ..
-    ${BUILD_SYSTEM} -j $PARALLEL install
+    check_if_source_exist "${ZSTD_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${ZSTD_SOURCE}/build/cmake"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    "${CMAKE_CMD}" -G "${GENERATOR}" -DBUILD_TESTING=OFF 
-DZSTD_BUILD_TESTS=OFF -DZSTD_BUILD_STATIC=ON \
+        -DZSTD_BUILD_PROGRAMS=OFF -DZSTD_BUILD_SHARED=OFF 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}" install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libzstd.a
 }
 
 # bzip
 build_bzip() {
-    check_if_source_exist $BZIP_SOURCE
-    cd $TP_SOURCE_DIR/$BZIP_SOURCE
+    check_if_source_exist "${BZIP_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${BZIP_SOURCE}"
 
-    CFLAGS="-fPIC"
-    make -j $PARALLEL install PREFIX=$TP_INSTALL_DIR
+    make -j "${PARALLEL}" install PREFIX="${TP_INSTALL_DIR}"
 }
 
 # lzo2
 build_lzo2() {
-    check_if_source_exist $LZO2_SOURCE
-    cd $TP_SOURCE_DIR/$LZO2_SOURCE
+    check_if_source_exist "${LZO2_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${LZO2_SOURCE}"
 
-    CPPFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR --disable-shared --enable-static
-    make -j $PARALLEL && make install
+    CPPFLAGS="-I${TP_INCLUDE_DIR}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --disable-shared 
--enable-static
+
+    make -j "${PARALLEL}"
+    make install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/liblzo2.a
 }
 
 # curl
 build_curl() {
-    check_if_source_exist $CURL_SOURCE
-    cd $TP_SOURCE_DIR/$CURL_SOURCE
+    check_if_source_exist "${CURL_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${CURL_SOURCE}"
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        libs='-lcrypto -lssl -lcrypto -ldl -static'
+    else
+        libs='-lcrypto -lssl -lcrypto -ldl'
+    fi
 
     CPPFLAGS="-I${TP_INCLUDE_DIR} -DNGHTTP2_STATICLIB" \
-    LDFLAGS="-L${TP_LIB_DIR}" LIBS="-lcrypto -lssl -lcrypto -ldl -static" \
-    CFLAGS="-fPIC" \
-    PKG_CONFIG="pkg-config --static" \
-    ./configure --prefix=$TP_INSTALL_DIR --disable-shared --enable-static \
-    --without-librtmp --with-ssl=${TP_INSTALL_DIR} --without-libidn2 
--disable-ldap --enable-ipv6 \
-    --without-libssh2 --without-brotli
-    make curl_LDFLAGS=-all-static -j $PARALLEL && make 
curl_LDFLAGS=-all-static install
+        LDFLAGS="-L${TP_LIB_DIR}" LIBS="${libs}" \
+        PKG_CONFIG="pkg-config --static" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --disable-shared 
--enable-static \
+        --without-librtmp --with-ssl="${TP_INSTALL_DIR}" --without-libidn2 
--disable-ldap --enable-ipv6 \
+        --without-libssh2 --without-brotli
+
+    make curl_LDFLAGS=-all-static -j "${PARALLEL}"
+    make curl_LDFLAGS=-all-static install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libcurl.a
 }
 
 # re2
 build_re2() {
-    check_if_source_exist $RE2_SOURCE
-    cd $TP_SOURCE_DIR/$RE2_SOURCE
+    check_if_source_exist "${RE2_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${RE2_SOURCE}"
 
-    ${CMAKE_CMD} -DCMAKE_BUILD_TYPE=Release -G "${GENERATOR}" 
-DBUILD_SHARED_LIBS=0 -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR
-    ${BUILD_SYSTEM} -j $PARALLEL install
+    "${CMAKE_CMD}" -DCMAKE_BUILD_TYPE=Release -G "${GENERATOR}" 
-DBUILD_SHARED_LIBS=0 -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}"
+    "${BUILD_SYSTEM}" -j "${PARALLEL}" install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libre2.a
 }
 
 # hyperscan
 build_hyperscan() {
-    MACHINE_TYPE=$(uname -m)
-    if [[ "${MACHINE_TYPE}" == "aarch64" ]]; then
-        echo "hyperscan is not supporting aarch64 now."
+    check_if_source_exist "${RAGEL_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${RAGEL_SOURCE}"
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        cxxflags='-static'
     else
-        check_if_source_exist $RAGEL_SOURCE
-        cd $TP_SOURCE_DIR/$RAGEL_SOURCE
-        ./configure --prefix=$TP_INSTALL_DIR && make install
-
-        check_if_source_exist $HYPERSCAN_SOURCE
-        cd $TP_SOURCE_DIR/$HYPERSCAN_SOURCE
-        mkdir -p $BUILD_DIR && cd $BUILD_DIR
-        PATH=$TP_INSTALL_DIR/bin:$PATH ${CMAKE_CMD} -G "${GENERATOR}" 
-DBUILD_SHARED_LIBS=0 \
-        -DBOOST_ROOT=$BOOST_SOURCE -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR ..
-        ${BUILD_SYSTEM} -j $PARALLEL install
+        cxxflags=''
     fi
+
+    CXXFLAGS="${cxxflags}" \
+        ./configure --prefix="${TP_INSTALL_DIR}"
+    make install
+
+    check_if_source_exist "${HYPERSCAN_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${HYPERSCAN_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    "${CMAKE_CMD}" -G "${GENERATOR}" -DBUILD_SHARED_LIBS=0 \
+        -DBOOST_ROOT="${BOOST_SOURCE}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" -DBUILD_EXAMPLES=OFF ..
+    "${BUILD_SYSTEM}" -j "${PARALLEL}" install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libhs.a
 }
 
 # boost
 build_boost() {
-    check_if_source_exist $BOOST_SOURCE
-    cd $TP_SOURCE_DIR/$BOOST_SOURCE
+    check_if_source_exist "${BOOST_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${BOOST_SOURCE}"
 
-    CXXFLAGS="-static" \
-    ./bootstrap.sh --prefix=$TP_INSTALL_DIR --with-toolset=$boost_toolset
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        cxxflags='-static'
+    else
+        cxxflags=''
+    fi
+
+    CXXFLAGS="${cxxflags}" \
+        ./bootstrap.sh --prefix="${TP_INSTALL_DIR}" 
--with-toolset="${boost_toolset}"
     # -q: Fail at first error
-    ./b2 -q link=static runtime-link=static -j $PARALLEL --without-mpi 
--without-graph --without-graph_parallel --without-python cxxflags="-std=c++11 
-g -fPIC -I$TP_INCLUDE_DIR -L$TP_LIB_DIR" install
+    ./b2 -q link=static runtime-link=static -j "${PARALLEL}" --without-mpi 
--without-graph --without-graph_parallel --without-python cxxflags="-std=c++11 
-g -I${TP_INCLUDE_DIR} -L${TP_LIB_DIR}" install
 }
 
 # mysql
 build_mysql() {
-    check_if_source_exist $MYSQL_SOURCE
-    check_if_source_exist $BOOST_SOURCE
+    check_if_source_exist "${MYSQL_SOURCE}"
+    check_if_source_exist "${BOOST_SOURCE}"
+
+    cd "${TP_SOURCE_DIR}/${MYSQL_SOURCE}"
 
-    cd $TP_SOURCE_DIR/$MYSQL_SOURCE
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
 
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
     rm -rf CMakeCache.txt CMakeFiles/
-    if [ ! -d $BOOST_SOURCE ]; then
-        cp -rf $TP_SOURCE_DIR/$BOOST_SOURCE ./
+
+    if [[ ! -d "${BOOST_SOURCE}" ]]; then
+        cp -rf "${TP_SOURCE_DIR}/${BOOST_SOURCE}" ./
+    fi
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        cflags='-static -pthread -lrt'
+        cxxflags='-static -pthread -lrt'
+    else
+        cflags='-pthread'
+        cxxflags='-pthread'
     fi
 
-    CFLAGS="-static -pthread -lrt" CXXFLAGS="-static -pthread -lrt" \
-    ${CMAKE_CMD} -G "${GENERATOR}" ../ -DCMAKE_LINK_SEARCH_END_STATIC=1 \
-    -DWITH_BOOST=`pwd`/$BOOST_SOURCE 
-DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR/mysql/ \
-    -DWITHOUT_SERVER=1 -DWITH_ZLIB=1 -DZLIB_ROOT=$TP_INSTALL_DIR \
-    -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="-O3 -g -fabi-version=2 
-fno-omit-frame-pointer -fno-strict-aliasing -std=gnu++11" \
-    -DDISABLE_SHARED=1 -DBUILD_SHARED_LIBS=0 
-DZLIB_LIBRARY=$TP_INSTALL_DIR/lib/libz.a -DENABLE_DTRACE=0
-    ${BUILD_SYSTEM} -j $PARALLEL mysqlclient
+    CFLAGS="${cflags}" CXXFLAGS="${cxxflags}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" ../ -DCMAKE_LINK_SEARCH_END_STATIC=1 \
+        -DWITH_BOOST="$(pwd)/${BOOST_SOURCE}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}/mysql" \
+        -DWITHOUT_SERVER=1 -DWITH_ZLIB=1 -DZLIB_ROOT="${TP_INSTALL_DIR}" \
+        -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="-O3 -g -fabi-version=2 
-fno-omit-frame-pointer -fno-strict-aliasing -std=gnu++11" \
+        -DDISABLE_SHARED=1 -DBUILD_SHARED_LIBS=0 
-DZLIB_LIBRARY="${TP_INSTALL_DIR}/lib/libz.a" -DENABLE_DTRACE=0
+    "${BUILD_SYSTEM}" -j "${PARALLEL}" mysqlclient
 
     # copy headers manually
     rm -rf ../../../installed/include/mysql/
@@ -567,474 +697,689 @@ build_mysql() {
     # copy libmysqlclient.a
     cp libmysql/libmysqlclient.a ../../../installed/lib/
     echo "mysql client lib is installed."
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libmysqlclient.a
 }
 
 #leveldb
 build_leveldb() {
-    check_if_source_exist $LEVELDB_SOURCE
-    cd $TP_SOURCE_DIR/$LEVELDB_SOURCE
-    rm -rf out-shared/ out-static/
-    CXXFLAGS="-fPIC" make -j $PARALLEL
-    cp out-static/libleveldb.a ../../installed/lib/libleveldb.a
-    cp -r include/leveldb ../../installed/include/
+    check_if_source_exist "${LEVELDB_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${LEVELDB_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    rm -rf CMakeCache.txt CMakeFiles/
+
+    CXXFLAGS="-fPIC" "${CMAKE_CMD}" -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" -DLEVELDB_BUILD_BENCHMARKS=OFF \
+        -DLEVELDB_BUILD_TESTS=OFF ..
+    "${BUILD_SYSTEM}" -j "${PARALLEL}" install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libleveldb.a
 }
 
 # brpc
 build_brpc() {
-    check_if_source_exist $BRPC_SOURCE
+    check_if_source_exist "${BRPC_SOURCE}"
+
+    cd "${TP_SOURCE_DIR}/${BRPC_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
 
-    cd $TP_SOURCE_DIR/$BRPC_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
     rm -rf CMakeCache.txt CMakeFiles/
-    LDFLAGS="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc" \
-    ${CMAKE_CMD} -G "${GENERATOR}" -DBUILD_SHARED_LIBS=0 -DWITH_GLOG=ON 
-DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR \
-    -DCMAKE_LIBRARY_PATH=$TP_INSTALL_DIR/lib64 
-DCMAKE_INCLUDE_PATH="$TP_INSTALL_DIR/include" \
-    -DPROTOBUF_PROTOC_EXECUTABLE=$TP_INSTALL_DIR/bin/protoc ..
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        ldflags="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc"
+    else
+        ldflags="-L${TP_LIB_DIR}"
+    fi
+
+    # Currently, BRPC can't be built for static libraries only (without .so). 
Therefore, we should add `-fPIC`
+    # to the dependencies which are required by BRPC. Dependencies: zlib, 
glog, protobuf, leveldb
+    LDFLAGS="${ldflags}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" -DBUILD_SHARED_LIBS=1 -DWITH_GLOG=ON 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" \
+        -DCMAKE_LIBRARY_PATH="${TP_INSTALL_DIR}/lib64" 
-DCMAKE_INCLUDE_PATH="${TP_INSTALL_DIR}/include" \
+        -DPROTOBUF_PROTOC_EXECUTABLE="${TP_INSTALL_DIR}/bin/protoc" ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
+
+    remove_all_dylib
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libbrpc.a
 }
 
 # rocksdb
 build_rocksdb() {
-    check_if_source_exist $ROCKSDB_SOURCE
+    check_if_source_exist "${ROCKSDB_SOURCE}"
 
-    cd $TP_SOURCE_DIR/$ROCKSDB_SOURCE
+    cd "${TP_SOURCE_DIR}/${ROCKSDB_SOURCE}"
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        ldflags='-static-libstdc++ -static-libgcc'
+    else
+        ldflags=''
+    fi
 
     # -Wno-range-loop-construct gcc-11
     CFLAGS="-I ${TP_INCLUDE_DIR} -I ${TP_INCLUDE_DIR}/snappy -I 
${TP_INCLUDE_DIR}/lz4" \
-    CXXFLAGS="-fPIC -Wno-deprecated-copy $warning_stringop_truncation 
$warning_shadow $warning_dangling_gsl \
-    $warning_defaulted_function_deleted $warning_unused_but_set_variable 
-Wno-pessimizing-move -Wno-range-loop-construct" \
-    LDFLAGS="-static-libstdc++ -static-libgcc" \
-    PORTABLE=1 make USE_RTTI=1 -j $PARALLEL static_lib
+        CXXFLAGS="-Wno-deprecated-copy ${warning_stringop_truncation} 
${warning_shadow} ${warning_dangling_gsl} \
+    ${warning_defaulted_function_deleted} ${warning_unused_but_set_variable} 
-Wno-pessimizing-move -Wno-range-loop-construct" \
+        LDFLAGS="${ldflags}" \
+        PORTABLE=1 make USE_RTTI=1 -j "${PARALLEL}" static_lib
     cp librocksdb.a ../../installed/lib/librocksdb.a
     cp -r include/rocksdb ../../installed/include/
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/librocksdb.a
 }
 
 # cyrus_sasl
 build_cyrus_sasl() {
-    check_if_source_exist $CYRUS_SASL_SOURCE
-    cd $TP_SOURCE_DIR/$CYRUS_SASL_SOURCE
+    check_if_source_exist "${CYRUS_SASL_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${CYRUS_SASL_SOURCE}"
+
     CPPFLAGS="-I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR --enable-static --enable-shared=no 
--with-openssl=$TP_INSTALL_DIR --with-pic
-    make -j $PARALLEL && make install
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --enable-static 
--enable-shared=no --with-openssl="${TP_INSTALL_DIR}" --with-pic
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        make -j "${PARALLEL}"
+        make install
+    else
+        make -j "${PARALLEL}"
+        make framedir="${TP_INCLUDE_DIR}/sasl" install
+    fi
 }
 
 # librdkafka
 build_librdkafka() {
-    check_if_source_exist $LIBRDKAFKA_SOURCE
+    check_if_source_exist "${LIBRDKAFKA_SOURCE}"
 
-    cd $TP_SOURCE_DIR/$LIBRDKAFKA_SOURCE
+    cd "${TP_SOURCE_DIR}/${LIBRDKAFKA_SOURCE}"
 
     CPPFLAGS="-I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR --enable-static --enable-sasl 
--disable-c11threads
-    make -j $PARALLEL && make install
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --enable-static --enable-sasl 
--disable-c11threads
+
+    make -j "${PARALLEL}"
+    make install
+
+    remove_all_dylib
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/librdkafka.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/librdkafka++.a
 }
 
 # libunixodbc
 build_libunixodbc() {
-    check_if_source_exist $ODBC_SOURCE
+    check_if_source_exist "${ODBC_SOURCE}"
 
-    cd $TP_SOURCE_DIR/$ODBC_SOURCE
+    cd "${TP_SOURCE_DIR}/${ODBC_SOURCE}"
 
-    CPPFLAGS="-I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    CFLAGS="-fPIC" \
-    ./configure --prefix=$TP_INSTALL_DIR --with-included-ltdl 
--enable-static=yes --enable-shared=no
-    make -j $PARALLEL && make install
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        cppflags="-I${TP_INCLUDE_DIR}"
+    else
+        cppflags="-I${TP_INCLUDE_DIR} -Wno-implicit-function-declaration"
+    fi
+
+    CPPFLAGS="${cppflags}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ./configure --prefix="${TP_INSTALL_DIR}" --with-included-ltdl 
--enable-static=yes --enable-shared=no
+
+    make -j "${PARALLEL}"
+    make install
 }
 
 # flatbuffers
 build_flatbuffers() {
-  check_if_source_exist $FLATBUFFERS_SOURCE
-  cd $TP_SOURCE_DIR/$FLATBUFFERS_SOURCE
-  mkdir -p $BUILD_DIR && cd $BUILD_DIR
-  rm -rf CMakeCache.txt CMakeFiles/
-  CXXFLAGS="-fPIC $warning_class_memaccess" \
-  LDFLAGS="-static-libstdc++ -static-libgcc" \
-  ${CMAKE_CMD} -G "${GENERATOR}" -DFLATBUFFERS_BUILD_TESTS=OFF ..
-  ${BUILD_SYSTEM} -j $PARALLEL
-  cp flatc  ../../../installed/bin/flatc
-  cp -r ../include/flatbuffers  ../../../installed/include/flatbuffers
-  cp libflatbuffers.a ../../../installed/lib/libflatbuffers.a
+    check_if_source_exist "${FLATBUFFERS_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${FLATBUFFERS_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    rm -rf CMakeCache.txt CMakeFiles/
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        ldflags='-static-libstdc++ -static-libgcc'
+    else
+        ldflags=''
+    fi
+
+    CXXFLAGS="${warning_class_memaccess}" \
+        LDFLAGS="${ldflags}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" -DFLATBUFFERS_BUILD_TESTS=OFF ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+
+    cp flatc ../../../installed/bin/flatc
+    cp -r ../include/flatbuffers ../../../installed/include/flatbuffers
+    cp libflatbuffers.a ../../../installed/lib/libflatbuffers.a
 }
 
 # arrow
 build_arrow() {
-    check_if_source_exist $ARROW_SOURCE
-    cd $TP_SOURCE_DIR/$ARROW_SOURCE/cpp && mkdir -p release && cd release
-    export ARROW_BROTLI_URL=${TP_SOURCE_DIR}/${BROTLI_NAME}
-    export ARROW_GLOG_URL=${TP_SOURCE_DIR}/${GLOG_NAME}
-    export ARROW_LZ4_URL=${TP_SOURCE_DIR}/${LZ4_NAME}
-    export ARROW_FLATBUFFERS_URL=${TP_SOURCE_DIR}/${FLATBUFFERS_NAME}
-    export ARROW_ZSTD_URL=${TP_SOURCE_DIR}/${ZSTD_NAME}
-    export ARROW_JEMALLOC_URL=${TP_SOURCE_DIR}/${JEMALLOC_NAME}
-    export ARROW_Thrift_URL=${TP_SOURCE_DIR}/${THRIFT_NAME}
-    export ARROW_SNAPPY_URL=${TP_SOURCE_DIR}/${SNAPPY_NAME}
-    export ARROW_ZLIB_URL=${TP_SOURCE_DIR}/${ZLIB_NAME}
-    export ARROW_XSIMD_URL=${TP_SOURCE_DIR}/${XSIMD_NAME}
-    export ARROW_ORC_URL=${TP_SOURCE_DIR}/${ORC_NAME}
-
-    LDFLAGS="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc" \
-    ${CMAKE_CMD} -G "${GENERATOR}" -DARROW_PARQUET=ON -DARROW_IPC=ON 
-DARROW_BUILD_SHARED=OFF \
-    -DARROW_BUILD_STATIC=ON -DARROW_WITH_BROTLI=ON -DARROW_WITH_LZ4=ON 
-DARROW_USE_GLOG=ON \
-    -DARROW_WITH_SNAPPY=ON -DARROW_WITH_ZLIB=ON -DARROW_WITH_ZSTD=ON 
-DARROW_JSON=ON \
-    -DARROW_WITH_UTF8PROC=OFF -DARROW_WITH_RE2=ON -DARROW_ORC=ON \
-    -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR \
-    -DCMAKE_INSTALL_LIBDIR=lib64 \
-    -DARROW_BOOST_USE_SHARED=OFF \
-    -DBoost_USE_STATIC_RUNTIME=ON \
-    -DARROW_GFLAGS_USE_SHARED=OFF \
-    -Dgflags_ROOT=$TP_INSTALL_DIR \
-    -DGLOG_ROOT=$TP_INSTALL_DIR \
-    -DRE2_ROOT=$TP_INSTALL_DIR \
-    -DZLIB_LIBRARY=$TP_INSTALL_DIR/lib/libz.a 
-DZLIB_INCLUDE_DIR=$TP_INSTALL_DIR/include \
-    -DRapidJSON_ROOT=$TP_INSTALL_DIR \
-    -DORC_ROOT=$TP_INSTALL_DIR \
-    -DBrotli_SOURCE=BUNDLED \
-    -DLZ4_LIB=$TP_INSTALL_DIR/lib/liblz4.a 
-DLZ4_INCLUDE_DIR=$TP_INSTALL_DIR/include/lz4 \
-    -DLz4_SOURCE=SYSTEM \
-    -DZSTD_LIB=$TP_INSTALL_DIR/lib/libzstd.a 
-DZSTD_INCLUDE_DIR=$TP_INSTALL_DIR/include \
-    -Dzstd_SOURCE=SYSTEM \
-    -DSnappy_LIB=$TP_INSTALL_DIR/lib/libsnappy.a 
-DSnappy_INCLUDE_DIR=$TP_INSTALL_DIR/include \
-    -DSnappy_SOURCE=SYSTEM \
-    -DBOOST_ROOT=$TP_INSTALL_DIR --no-warn-unused-cli \
-    -DThrift_ROOT=$TP_INSTALL_DIR ..
-
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+    check_if_source_exist "${ARROW_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${ARROW_SOURCE}/cpp"
+
+    mkdir -p release
+    cd release
+
+    export ARROW_BROTLI_URL="${TP_SOURCE_DIR}/${BROTLI_NAME}"
+    export ARROW_GLOG_URL="${TP_SOURCE_DIR}/${GLOG_NAME}"
+    export ARROW_LZ4_URL="${TP_SOURCE_DIR}/${LZ4_NAME}"
+    export ARROW_FLATBUFFERS_URL="${TP_SOURCE_DIR}/${FLATBUFFERS_NAME}"
+    export ARROW_ZSTD_URL="${TP_SOURCE_DIR}/${ZSTD_NAME}"
+    export ARROW_JEMALLOC_URL="${TP_SOURCE_DIR}/${JEMALLOC_NAME}"
+    export ARROW_Thrift_URL="${TP_SOURCE_DIR}/${THRIFT_NAME}"
+    export ARROW_SNAPPY_URL="${TP_SOURCE_DIR}/${SNAPPY_NAME}"
+    export ARROW_ZLIB_URL="${TP_SOURCE_DIR}/${ZLIB_NAME}"
+    export ARROW_XSIMD_URL="${TP_SOURCE_DIR}/${XSIMD_NAME}"
+    export ARROW_ORC_URL="${TP_SOURCE_DIR}/${ORC_NAME}"
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        ldflags="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc"
+    else
+        ldflags="-L${TP_LIB_DIR}"
+    fi
+
+    LDFLAGS="${ldflags}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" -DARROW_PARQUET=ON -DARROW_IPC=ON 
-DARROW_BUILD_SHARED=OFF \
+        -DARROW_BUILD_STATIC=ON -DARROW_WITH_BROTLI=ON -DARROW_WITH_LZ4=ON 
-DARROW_USE_GLOG=ON \
+        -DARROW_WITH_SNAPPY=ON -DARROW_WITH_ZLIB=ON -DARROW_WITH_ZSTD=ON 
-DARROW_JSON=ON \
+        -DARROW_WITH_UTF8PROC=OFF -DARROW_WITH_RE2=ON -DARROW_ORC=ON \
+        -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" \
+        -DCMAKE_INSTALL_LIBDIR=lib64 \
+        -DARROW_BOOST_USE_SHARED=OFF \
+        -DBoost_USE_STATIC_RUNTIME=ON \
+        -DARROW_GFLAGS_USE_SHARED=OFF \
+        -Dgflags_ROOT="${TP_INSTALL_DIR}" \
+        -DGLOG_ROOT="${TP_INSTALL_DIR}" \
+        -DRE2_ROOT="${TP_INSTALL_DIR}" \
+        -DZLIB_LIBRARY="${TP_INSTALL_DIR}/lib/libz.a" 
-DZLIB_INCLUDE_DIR="${TP_INSTALL_DIR}/include" \
+        -DRapidJSON_ROOT="${TP_INSTALL_DIR}" \
+        -DORC_ROOT="${TP_INSTALL_DIR}" \
+        -DBrotli_SOURCE=BUNDLED \
+        -DLZ4_LIB="${TP_INSTALL_DIR}/lib/liblz4.a" 
-DLZ4_INCLUDE_DIR="${TP_INSTALL_DIR}/include/lz4" \
+        -DLz4_SOURCE=SYSTEM \
+        -DZSTD_LIB="${TP_INSTALL_DIR}/lib/libzstd.a" 
-DZSTD_INCLUDE_DIR="${TP_INSTALL_DIR}/include" \
+        -Dzstd_SOURCE=SYSTEM \
+        -DSnappy_LIB="${TP_INSTALL_DIR}/lib/libsnappy.a" 
-DSnappy_INCLUDE_DIR="${TP_INSTALL_DIR}/include" \
+        -DSnappy_SOURCE=SYSTEM \
+        -DBOOST_ROOT="${TP_INSTALL_DIR}" --no-warn-unused-cli \
+        -DThrift_ROOT="${TP_INSTALL_DIR}" ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
 
     #copy dep libs
-    cp -rf ./jemalloc_ep-prefix/src/jemalloc_ep/dist/lib/libjemalloc_pic.a 
$TP_INSTALL_DIR/lib64/libjemalloc.a
-    cp -rf ./brotli_ep/src/brotli_ep-install/lib/libbrotlienc-static.a 
$TP_INSTALL_DIR/lib64/libbrotlienc.a
-    cp -rf ./brotli_ep/src/brotli_ep-install/lib/libbrotlidec-static.a 
$TP_INSTALL_DIR/lib64/libbrotlidec.a
-    cp -rf ./brotli_ep/src/brotli_ep-install/lib/libbrotlicommon-static.a 
$TP_INSTALL_DIR/lib64/libbrotlicommon.a
+    cp -rf ./jemalloc_ep-prefix/src/jemalloc_ep/dist/lib/libjemalloc_pic.a 
"${TP_INSTALL_DIR}/lib64/libjemalloc.a"
+    cp -rf ./brotli_ep/src/brotli_ep-install/lib/libbrotlienc-static.a 
"${TP_INSTALL_DIR}/lib64/libbrotlienc.a"
+    cp -rf ./brotli_ep/src/brotli_ep-install/lib/libbrotlidec-static.a 
"${TP_INSTALL_DIR}/lib64/libbrotlidec.a"
+    cp -rf ./brotli_ep/src/brotli_ep-install/lib/libbrotlicommon-static.a 
"${TP_INSTALL_DIR}/lib64/libbrotlicommon.a"
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libarrow.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libjemalloc.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libparquet.a
 }
 
 # s2
 build_s2() {
-    check_if_source_exist $S2_SOURCE
-    cd $TP_SOURCE_DIR/$S2_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    check_if_source_exist "${S2_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${S2_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
     rm -rf CMakeCache.txt CMakeFiles/
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        ldflags="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc"
+    else
+        ldflags="-L${TP_LIB_DIR}"
+    fi
+
     CXXFLAGS="-O3" \
-    LDFLAGS="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc" \
-    ${CMAKE_CMD} -G "${GENERATOR}" -DBUILD_SHARED_LIBS=0 
-DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR \
-    -DCMAKE_INCLUDE_PATH="$TP_INSTALL_DIR/include" \
-    -DBUILD_SHARED_LIBS=OFF \
-    -DGFLAGS_ROOT_DIR="$TP_INSTALL_DIR/include" \
-    -DWITH_GFLAGS=ON \
-    -DGLOG_ROOT_DIR="$TP_INSTALL_DIR/include" \
-    -DCMAKE_LIBRARY_PATH="$TP_INSTALL_DIR/lib64" \
-    -DOPENSSL_ROOT_DIR="$TP_INSTALL_DIR/include" \
-    -DWITH_GLOG=ON ..
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+        LDFLAGS="${ldflags}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" -DBUILD_SHARED_LIBS=0 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" \
+        -DCMAKE_INCLUDE_PATH="${TP_INSTALL_DIR}/include" \
+        -DBUILD_SHARED_LIBS=OFF \
+        -DGFLAGS_ROOT_DIR="${TP_INSTALL_DIR}/include" \
+        -DWITH_GFLAGS=ON \
+        -DGLOG_ROOT_DIR="${TP_INSTALL_DIR}/include" \
+        -DCMAKE_LIBRARY_PATH="${TP_INSTALL_DIR}/lib64" \
+        -DOPENSSL_ROOT_DIR="${TP_INSTALL_DIR}/include" \
+        -DWITH_GLOG=ON ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libs2.a
 }
 
 # bitshuffle
 build_bitshuffle() {
-    check_if_source_exist $BITSHUFFLE_SOURCE
-    cd $TP_SOURCE_DIR/$BITSHUFFLE_SOURCE
-    PREFIX=$TP_INSTALL_DIR
+    check_if_source_exist "${BITSHUFFLE_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${BITSHUFFLE_SOURCE}"
+    PREFIX="${TP_INSTALL_DIR}"
 
     # This library has significant optimizations when built with -mavx2. 
However,
     # we still need to support non-AVX2-capable hardware. So, we build it 
twice,
     # once with the flag and once without, and use some linker tricks to
     # suffix the AVX2 symbols with '_avx2'.
-    arches="default avx2"
-    MACHINE_TYPE=$(uname -m)
+    arches=('default' 'avx2')
+    MACHINE_TYPE="$(uname -m)"
     # Becuase aarch64 don't support avx2, disable it.
-    if [[ "${MACHINE_TYPE}" == "aarch64" ]]; then
-        arches="default"
+    if [[ "${MACHINE_TYPE}" == "aarch64" || "${MACHINE_TYPE}" == 'arm64' ]]; 
then
+        arches=('default')
     fi
 
     to_link=""
-    for arch in $arches ; do
+    for arch in "${arches[@]}"; do
         arch_flag=""
-        if [ "$arch" == "avx2" ]; then
+        if [[ "${arch}" == "avx2" ]]; then
             arch_flag="-mavx2"
         fi
-        tmp_obj=bitshuffle_${arch}_tmp.o
-        dst_obj=bitshuffle_${arch}.o
-        $CC $EXTRA_CFLAGS $arch_flag -std=c99 -I$PREFIX/include/lz4/ -O3 
-DNDEBUG -fPIC -c \
+        tmp_obj="bitshuffle_${arch}_tmp.o"
+        dst_obj="bitshuffle_${arch}.o"
+        "${CC}" ${EXTRA_CFLAGS:+${EXTRA_CFLAGS}} ${arch_flag:+${arch_flag}} 
-std=c99 "-I${PREFIX}/include/lz4" -O3 -DNDEBUG -c \
             "src/bitshuffle_core.c" \
             "src/bitshuffle.c" \
             "src/iochain.c"
         # Merge the object files together to produce a combined .o file.
-        $DORIS_BIN_UTILS/ld -r -o $tmp_obj bitshuffle_core.o bitshuffle.o 
iochain.o
+        "${DORIS_BIN_UTILS}/ld" -r -o "${tmp_obj}" bitshuffle_core.o 
bitshuffle.o iochain.o
         # For the AVX2 symbols, suffix them.
-        if [ "$arch" == "avx2" ]; then
+        if [[ "${arch}" == "avx2" ]]; then
             # Create a mapping file with '<old_sym> <suffixed_sym>' on each 
line.
-            $DORIS_BIN_UTILS/nm --defined-only --extern-only $tmp_obj | while 
read addr type sym ; do
-              echo ${sym} ${sym}_${arch}
-            done > renames.txt
-            $DORIS_BIN_UTILS/objcopy --redefine-syms=renames.txt $tmp_obj 
$dst_obj
+            "${DORIS_BIN_UTILS}/nm" --defined-only --extern-only "${tmp_obj}" 
| while read -r addr type sym; do
+                echo "${sym} ${sym}_${arch}"
+            done >renames.txt
+            "${DORIS_BIN_UTILS}/objcopy" --redefine-syms=renames.txt 
"${tmp_obj}" "${dst_obj}"
         else
-            mv $tmp_obj $dst_obj
+            mv "${tmp_obj}" "${dst_obj}"
         fi
-        to_link="$to_link $dst_obj"
+        to_link="${to_link} ${dst_obj}"
     done
+    local links
+    read -r -a links <<<"${to_link}"
     rm -f libbitshuffle.a
-    $DORIS_BIN_UTILS/ar rs libbitshuffle.a $to_link
-    mkdir -p $PREFIX/include/bitshuffle
-    cp libbitshuffle.a $PREFIX/lib/
-    cp $TP_SOURCE_DIR/$BITSHUFFLE_SOURCE/src/bitshuffle.h 
$PREFIX/include/bitshuffle/bitshuffle.h
-    cp $TP_SOURCE_DIR/$BITSHUFFLE_SOURCE/src/bitshuffle_core.h 
$PREFIX/include/bitshuffle/bitshuffle_core.h
+    "${DORIS_BIN_UTILS}/ar" rs libbitshuffle.a "${links[@]}"
+    mkdir -p "${PREFIX}/include/bitshuffle"
+    cp libbitshuffle.a "${PREFIX}"/lib/
+    cp "${TP_SOURCE_DIR}/${BITSHUFFLE_SOURCE}/src/bitshuffle.h" 
"${PREFIX}/include/bitshuffle/bitshuffle.h"
+    cp "${TP_SOURCE_DIR}/${BITSHUFFLE_SOURCE}/src/bitshuffle_core.h" 
"${PREFIX}/include/bitshuffle/bitshuffle_core.h"
 }
 
 # croaring bitmap
 build_croaringbitmap() {
-    avx_flag=
-    if [ ! -z "$USE_AVX2" -a "$USE_AVX2" -eq 0 ];then
-        echo "set USE_AVX2=$USE_AVX2 to FORCE disable AVX2 in croaringbitmap"
+    avx_flag=''
+    if [[ -n "${USE_AVX2}" && "${USE_AVX2}" -eq 0 ]]; then
+        echo "set USE_AVX2=${USE_AVX2} to FORCE disable AVX2 in croaringbitmap"
         avx_flag="-DROARING_DISABLE_AVX=ON"
     fi
 
-    check_if_source_exist $CROARINGBITMAP_SOURCE
-    cd $TP_SOURCE_DIR/$CROARINGBITMAP_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    check_if_source_exist "${CROARINGBITMAP_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${CROARINGBITMAP_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
     rm -rf CMakeCache.txt CMakeFiles/
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        ldflags="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc"
+    else
+        ldflags="-L${TP_LIB_DIR}"
+    fi
+
     CXXFLAGS="-O3" \
-    LDFLAGS="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc" \
-    ${CMAKE_CMD} -G "${GENERATOR}" ${avx_flag} -DROARING_BUILD_STATIC=ON 
-DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR \
-    -DENABLE_ROARING_TESTS=OFF ..
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+        LDFLAGS="${ldflags}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" ${avx_flag:+${avx_flag}} 
-DROARING_BUILD_STATIC=ON -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" \
+        -DENABLE_ROARING_TESTS=OFF ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
 }
 
 # fmt
 build_fmt() {
-    check_if_source_exist $FMT_SOURCE
-    cd $TP_SOURCE_DIR/$FMT_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    check_if_source_exist "${FMT_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${FMT_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
     rm -rf CMakeCache.txt CMakeFiles/
-    $CMAKE_CMD -G "${GENERATOR}" -DBUILD_SHARED_LIBS=FALSE -DFMT_TEST=OFF 
-DFMT_DOC=OFF -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR ..
-    ${BUILD_SYSTEM} -j$PARALLEL && ${BUILD_SYSTEM} install
+
+    "${CMAKE_CMD}" -G "${GENERATOR}" -DBUILD_SHARED_LIBS=FALSE -DFMT_TEST=OFF 
-DFMT_DOC=OFF -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" ..
+    "${BUILD_SYSTEM}" -j"${PARALLEL}"
+    "${BUILD_SYSTEM}" install
 }
 
 # parallel_hashmap
 build_parallel_hashmap() {
-    check_if_source_exist $PARALLEL_HASHMAP_SOURCE
-    cd $TP_SOURCE_DIR/$PARALLEL_HASHMAP_SOURCE
-    cp -r parallel_hashmap $TP_INSTALL_DIR/include/
+    check_if_source_exist "${PARALLEL_HASHMAP_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${PARALLEL_HASHMAP_SOURCE}"
+    cp -r parallel_hashmap "${TP_INSTALL_DIR}/include/"
 }
 
 # pdqsort
 build_pdqsort() {
-    check_if_source_exist $PDQSORT_SOURCE
-    cd $TP_SOURCE_DIR/$PDQSORT_SOURCE
-    cp -r pdqsort.h $TP_INSTALL_DIR/include/
+    check_if_source_exist "${PDQSORT_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${PDQSORT_SOURCE}"
+    cp -r pdqsort.h "${TP_INSTALL_DIR}/include/"
 }
 
 # libdivide
 build_libdivide() {
-    check_if_source_exist $LIBDIVIDE_SOURCE
-    cd $TP_SOURCE_DIR/$LIBDIVIDE_SOURCE
-    cp -r libdivide.h $TP_INSTALL_DIR/include/
+    check_if_source_exist "${LIBDIVIDE_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${LIBDIVIDE_SOURCE}"
+    cp -r libdivide.h "${TP_INSTALL_DIR}/include/"
 }
 
 #orc
 build_orc() {
-    check_if_source_exist $ORC_SOURCE
-    cd $TP_SOURCE_DIR/$ORC_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    check_if_source_exist "${ORC_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${ORC_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
     rm -rf CMakeCache.txt CMakeFiles/
-    CXXFLAGS="-O3 -Wno-array-bounds $warning_reserved_identifier 
$warning_suggest_override" \
-    ${CMAKE_CMD} -G "${GENERATOR}" ../ -DBUILD_JAVA=OFF \
-    -DPROTOBUF_HOME=$TP_INSTALL_DIR \
-    -DSNAPPY_HOME=$TP_INSTALL_DIR \
-    -DLZ4_HOME=$TP_INSTALL_DIR \
-    -DLZ4_INCLUDE_DIR=$TP_INSTALL_DIR/include/lz4 \
-    -DZLIB_HOME=$TP_INSTALL_DIR \
-    -DZSTD_HOME=$TP_INSTALL_DIR \
-    -DZSTD_INCLUDE_DIR=$TP_INSTALL_DIR/include \
-    -DBUILD_LIBHDFSPP=OFF \
-    -DBUILD_CPP_TESTS=OFF \
-    -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR
-
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+
+    CXXFLAGS="-O3 -Wno-array-bounds ${warning_reserved_identifier} 
${warning_suggest_override}" \
+        "${CMAKE_CMD}" -G "${GENERATOR}" ../ -DBUILD_JAVA=OFF \
+        -DPROTOBUF_HOME="${TP_INSTALL_DIR}" \
+        -DSNAPPY_HOME="${TP_INSTALL_DIR}" \
+        -DLZ4_HOME="${TP_INSTALL_DIR}" \
+        -DLZ4_INCLUDE_DIR="${TP_INSTALL_DIR}/include/lz4" \
+        -DZLIB_HOME="${TP_INSTALL_DIR}" \
+        -DZSTD_HOME="${TP_INSTALL_DIR}" \
+        -DZSTD_INCLUDE_DIR="${TP_INSTALL_DIR}/include" \
+        -DBUILD_LIBHDFSPP=OFF \
+        -DBUILD_CPP_TESTS=OFF \
+        -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}"
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/liborc.a
 }
 
 #cctz
 build_cctz() {
-    check_if_source_exist $CCTZ_SOURCE
-    cd $TP_SOURCE_DIR/$CCTZ_SOURCE
-    PREFIX=$TP_INSTALL_DIR make -j $PARALLEL
-    PREFIX=$TP_INSTALL_DIR make install
+    check_if_source_exist "${CCTZ_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${CCTZ_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    rm -rf CMakeCache.txt CMakeFiles/
+
+    "${CMAKE_CMD}" -G "${GENERATOR}" -DCMAKE_BUILD_TYPE=Release 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" -DBUILD_TESTING=OFF ..
+    "${BUILD_SYSTEM}" -j "${PARALLEL}" install
 }
 
 # all js and csss related
 build_js_and_css() {
-    check_if_source_exist $DATATABLES_SOURCE
-    check_if_source_exist Bootstrap-3.3.7/
-    check_if_source_exist jQuery-3.3.1/
-
-    mkdir -p $TP_INSTALL_DIR/webroot/
-    cd $TP_SOURCE_DIR/
-    cp -r $DATATABLES_SOURCE $TP_INSTALL_DIR/webroot/
-    cp -r Bootstrap-3.3.7/ $TP_INSTALL_DIR/webroot/
-    cp -r jQuery-3.3.1/ $TP_INSTALL_DIR/webroot/
-    cp bootstrap-table.min.js $TP_INSTALL_DIR/webroot/Bootstrap-3.3.7/js
-    cp bootstrap-table.min.css $TP_INSTALL_DIR/webroot/Bootstrap-3.3.7/css
+    check_if_source_exist "${DATATABLES_SOURCE}"
+    check_if_source_exist 'Bootstrap-3.3.7'
+    check_if_source_exist 'jQuery-3.3.1'
+
+    mkdir -p "${TP_INSTALL_DIR}/webroot"
+    cd "${TP_SOURCE_DIR}"
+    cp -r "${DATATABLES_SOURCE}" "${TP_INSTALL_DIR}/webroot/"
+    cp -r Bootstrap-3.3.7 "${TP_INSTALL_DIR}/webroot/"
+    cp -r jQuery-3.3.1 "${TP_INSTALL_DIR}/webroot/"
+    cp bootstrap-table.min.js "${TP_INSTALL_DIR}/webroot/Bootstrap-3.3.7/js"
+    cp bootstrap-table.min.css "${TP_INSTALL_DIR}/webroot/Bootstrap-3.3.7/css"
 }
 
 build_tsan_header() {
-    cd $TP_SOURCE_DIR/
-    if [[ ! -f $TSAN_HEADER_FILE ]]; then
-        echo "$TSAN_HEADER_FILE should exist."
+    cd "${TP_SOURCE_DIR}"
+    if [[ ! -f "${TSAN_HEADER_FILE}" ]]; then
+        echo "${TSAN_HEADER_FILE} should exist."
         exit 1
     fi
 
-    mkdir -p $TP_INSTALL_DIR/include/sanitizer/
-    cp $TSAN_HEADER_FILE $TP_INSTALL_DIR/include/sanitizer/
+    mkdir -p "${TP_INSTALL_DIR}/include/sanitizer"
+    cp "${TSAN_HEADER_FILE}" "${TP_INSTALL_DIR}/include/sanitizer/"
 }
 
 # aws_sdk
 build_aws_sdk() {
-    check_if_source_exist $AWS_SDK_SOURCE
-    cd $TP_SOURCE_DIR/$AWS_SDK_SOURCE
-    rm -rf $BUILD_DIR
+    check_if_source_exist "${AWS_SDK_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${AWS_SDK_SOURCE}"
+
+    rm -rf "${BUILD_DIR}"
+
     # -Wno-nonnull gcc-11
-    $CMAKE_CMD -G "${GENERATOR}" -B$BUILD_DIR 
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR \
-    -DCMAKE_PREFIX_PATH=$TP_INSTALL_DIR -DBUILD_SHARED_LIBS=OFF 
-DENABLE_TESTING=OFF \
-    -DCURL_LIBRARY_RELEASE=${TP_INSTALL_DIR}/lib/libcurl.a 
-DZLIB_LIBRARY_RELEASE=${TP_INSTALL_DIR}/lib/libz.a \
-    -DBUILD_ONLY="core;s3;s3-crt;transfer" -DCMAKE_CXX_FLAGS="-Wno-nonnull" 
-DCPP_STANDARD=17
-    cd $BUILD_DIR
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+    "${CMAKE_CMD}" -G "${GENERATOR}" -B"${BUILD_DIR}" 
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" \
+        -DCMAKE_PREFIX_PATH="${TP_INSTALL_DIR}" -DBUILD_SHARED_LIBS=OFF 
-DENABLE_TESTING=OFF \
+        -DCURL_LIBRARY_RELEASE="${TP_INSTALL_DIR}/lib/libcurl.a" 
-DZLIB_LIBRARY_RELEASE="${TP_INSTALL_DIR}/lib/libz.a" \
+        -DBUILD_ONLY="core;s3;s3-crt;transfer" 
-DCMAKE_CXX_FLAGS="-Wno-nonnull" -DCPP_STANDARD=17
+
+    cd "${BUILD_DIR}"
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libaws-cpp-sdk-s3-crt.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-cpp-sdk-s3.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-cpp-sdk-core.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libs2n.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-crt-cpp.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-http.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-common.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-auth.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-io.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-mqtt.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-s3.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libaws-c-event-stream.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-cal.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libaws-cpp-sdk-transfer.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-checksums.a
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libaws-c-compression.a
 }
 
 # lzma
 build_lzma() {
-    if [ ! -x "$(command -v autopoint)" ]; then
+    if [[ ! -x "$(command -v autopoint)" ]]; then
         echo "autopoint is required by $0, install it first"
-        return -1
+        return 255
     fi
-    check_if_source_exist $LZMA_SOURCE
-    cd $TP_SOURCE_DIR/$LZMA_SOURCE
-    export ACLOCAL_PATH=/usr/share/aclocal
+
+    check_if_source_exist "${LZMA_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${LZMA_SOURCE}"
+
+    export ACLOCAL_PATH='/usr/share/aclocal'
+
     sh autogen.sh
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
-    ../configure --prefix=$TP_INSTALL_DIR --enable-shared=no --with-pic
-    make -j $PARALLEL && make install
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    ../configure --prefix="${TP_INSTALL_DIR}" --enable-shared=no --with-pic
+
+    make -j "${PARALLEL}"
+    make install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/liblzma.a
 }
 
 # xml2
 build_xml2() {
-    if [ ! -x "$(command -v pkg-config)" ]; then
+    if [[ ! -x "$(command -v pkg-config)" ]]; then
         echo "pkg-config is required by $0, install it first"
-        return -1
+        return 255
     fi
-    check_if_source_exist $XML2_SOURCE
-    cd $TP_SOURCE_DIR/$XML2_SOURCE
-    export ACLOCAL_PATH=/usr/share/aclocal
+
+    check_if_source_exist "${XML2_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${XML2_SOURCE}"
+
+    export ACLOCAL_PATH='/usr/share/aclocal'
+
     sh autogen.sh
     make distclean
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
     CPPLAGS="-I${TP_INCLUDE_DIR}" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    ../configure --prefix=$TP_INSTALL_DIR --enable-shared=no --with-pic 
--with-python=no --with-lzma=$TP_INSTALL_DIR
-    make -j $PARALLEL && make install
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ../configure --prefix="${TP_INSTALL_DIR}" --enable-shared=no 
--with-pic --with-python=no --with-lzma="${TP_INSTALL_DIR}"
+
+    make -j "${PARALLEL}"
+    make install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libxml2.a
 }
 
 # idn
 build_idn() {
-    check_if_source_exist $IDN_SOURCE
-    cd $TP_SOURCE_DIR/$IDN_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
-    ../configure --prefix=$TP_INSTALL_DIR --enable-shared=no --with-pic
-    make -j $PARALLEL && make install
+    check_if_source_exist "${IDN_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${IDN_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    ../configure --prefix="${TP_INSTALL_DIR}" --enable-shared=no --with-pic
+
+    make -j "${PARALLEL}"
+    make install
 }
 
 # gsasl
 build_gsasl() {
-    check_if_source_exist $GSASL_SOURCE
-    cd $TP_SOURCE_DIR/$GSASL_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
-    ../configure --prefix=$TP_INSTALL_DIR --with-gssapi-impl=mit 
--enable-shared=no --with-pic --with-libidn-prefix=$TP_INSTALL_DIR
-    make -j $PARALLEL && make install
+    check_if_source_exist "${GSASL_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${GSASL_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        cflags=''
+    else
+        cflags='-Wno-implicit-function-declaration'
+    fi
+
+    CFLAGS="${cflags}" ../configure --prefix="${TP_INSTALL_DIR}" 
--with-gssapi-impl=mit --enable-shared=no --with-pic 
--with-libidn-prefix="${TP_INSTALL_DIR}"
+
+    make -j "${PARALLEL}"
+    make install
 }
 
 # krb5
 build_krb5() {
-    check_if_source_exist $KRB5_SOURCE
-    cd $TP_SOURCE_DIR/$KRB5_SOURCE/src
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
-    CFLAGS="-fcommon -fPIC" \
-    ../configure --prefix=$TP_INSTALL_DIR --disable-shared --enable-static
-    make -j $PARALLEL && make install
+    check_if_source_exist "${KRB5_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${KRB5_SOURCE}/src"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    if [[ "${KERNEL}" == 'Darwin' ]]; then
+        with_crypto_impl='--with-crypto-impl=openssl'
+    fi
+
+    CFLAGS="-fcommon -I${TP_INSTALL_DIR}/include" 
LDFLAGS="-L${TP_INSTALL_DIR}/lib" \
+        ../configure --prefix="${TP_INSTALL_DIR}" --disable-shared 
--enable-static ${with_crypto_impl:+${with_crypto_impl}}
+
+    make -j "${PARALLEL}"
+    make install
 }
 
 # hdfs3
 build_hdfs3() {
-    check_if_source_exist $HDFS3_SOURCE
-    cd $TP_SOURCE_DIR/$HDFS3_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR && rm ./* -rf
+    check_if_source_exist "${HDFS3_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${HDFS3_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+    rm -rf ./*
+
     # build libhdfs3 with kerberos support
-    CPPLAGS="-I${TP_INCLUDE_DIR} -fPIC" \
-    LDFLAGS="-L${TP_LIB_DIR}" \
-    ../bootstrap --dependency="$TP_INSTALL_DIR" --prefix=$TP_INSTALL_DIR 
--disable-shared --enable-static
-    make CXXFLAGS="$libhdfs_cxx17" -j $PARALLEL
+    CPPLAGS="-I${TP_INCLUDE_DIR}" \
+        LDFLAGS="-L${TP_LIB_DIR}" \
+        ../bootstrap --dependency="${TP_INSTALL_DIR}" 
--prefix="${TP_INSTALL_DIR}" --disable-shared --enable-static
+
+    make CXXFLAGS="${libhdfs_cxx17}" -j "${PARALLEL}"
     make install
+    strip --strip-debug --strip-unneeded "${TP_LIB_DIR}"/libhdfs3.a
 }
+
 # benchmark
 build_benchmark() {
-    check_if_source_exist $BENCHMARK_SOURCE
+    check_if_source_exist "${BENCHMARK_SOURCE}"
 
-    cd $TP_SOURCE_DIR/$BENCHMARK_SOURCE
+    cd "${TP_SOURCE_DIR}/${BENCHMARK_SOURCE}"
 
     cmake -E make_directory "build"
+
+    if [[ "${KERNEL}" != 'Darwin' ]]; then
+        cxxflags='-lresolv -pthread -lrt'
+    else
+        cxxflags='-lresolv -pthread'
+    fi
+
     # NOTE(amos): -DHAVE_STD_REGEX=1 avoid runtime checks as it will fail when 
compiling with non-standard toolchain
-    CXXFLAGS="-lresolv -pthread -lrt" cmake -E chdir "build" \
-    cmake ../ -DBENCHMARK_ENABLE_GTEST_TESTS=OFF 
-DBENCHMARK_ENABLE_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DHAVE_STD_REGEX=1
+    CXXFLAGS="${cxxflags}" cmake -E chdir "build" \
+        cmake ../ -DBENCHMARK_ENABLE_GTEST_TESTS=OFF 
-DBENCHMARK_ENABLE_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DHAVE_STD_REGEX=1
     cmake --build "build" --config Release
 
-    mkdir -p $TP_INCLUDE_DIR/benchmark
-    cp $TP_SOURCE_DIR/$BENCHMARK_SOURCE/include/benchmark/benchmark.h 
$TP_INCLUDE_DIR/benchmark/
-    cp $TP_SOURCE_DIR/$BENCHMARK_SOURCE/build/src/libbenchmark.a $TP_LIB_DIR/
+    mkdir -p "${TP_INCLUDE_DIR}/benchmark"
+    cp "${TP_SOURCE_DIR}/${BENCHMARK_SOURCE}/include/benchmark/benchmark.h" 
"${TP_INCLUDE_DIR}/benchmark/"
+    cp "${TP_SOURCE_DIR}/${BENCHMARK_SOURCE}/build/src/libbenchmark.a" 
"${TP_LIB_DIR}"
 }
 
 # simdjson
 build_simdjson() {
-    check_if_source_exist $SIMDJSON_SOURCE
-    cd $TP_SOURCE_DIR/$SIMDJSON_SOURCE
+    check_if_source_exist "${SIMDJSON_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${SIMDJSON_SOURCE}"
 
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
-    CXXFLAGS="-O3" \
-    CFLAGS="-O3" \
-    $CMAKE_CMD ..
-    $CMAKE_CMD --build .
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
 
-    cp $TP_SOURCE_DIR/$SIMDJSON_SOURCE/$BUILD_DIR/libsimdjson.a 
$TP_INSTALL_DIR/lib64
+    CXXFLAGS="-O3" CFLAGS="-O3" \
+        "${CMAKE_CMD}" -DSIMDJSON_EXCEPTIONS=OFF \
+        -DSIMDJSON_DEVELOPER_MODE=OFF -DSIMDJSON_BUILD_STATIC=ON \
+        -DSIMDJSON_JUST_LIBRARY=ON -DSIMDJSON_ENABLE_THREADS=ON ..
+    "${CMAKE_CMD}" --build . --config Release
 
-    cp -r $TP_SOURCE_DIR/$SIMDJSON_SOURCE/include/* $TP_INCLUDE_DIR/
+    cp "${TP_SOURCE_DIR}/${SIMDJSON_SOURCE}/${BUILD_DIR}/libsimdjson.a" 
"${TP_INSTALL_DIR}/lib64"
+    cp -r "${TP_SOURCE_DIR}/${SIMDJSON_SOURCE}/include"/* "${TP_INCLUDE_DIR}/"
 }
 
 # nlohmann_json
 build_nlohmann_json() {
-    check_if_source_exist $NLOHMANN_JSON_SOURCE
-    cd $TP_SOURCE_DIR/$NLOHMANN_JSON_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    check_if_source_exist "${NLOHMANN_JSON_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${NLOHMANN_JSON_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
 
-    $CMAKE_CMD -G "${GENERATOR}" -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR 
-DCMAKE_PREFIX_PATH=$TP_INSTALL_DIR -DJSON_BuildTests=OFF ..
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+    "${CMAKE_CMD}" -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" 
-DCMAKE_PREFIX_PATH="${TP_INSTALL_DIR}" -DJSON_BuildTests=OFF ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
 }
 
 # opentelemetry
 build_opentelemetry() {
-    check_if_source_exist $OPENTELEMETRY_SOURCE
-    cd $TP_SOURCE_DIR/$OPENTELEMETRY_SOURCE
-    mkdir -p $BUILD_DIR && cd $BUILD_DIR
-
-    $CMAKE_CMD -G "${GENERATOR}" -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR 
-DCMAKE_PREFIX_PATH=$TP_INSTALL_DIR -DBUILD_TESTING=OFF \
-    -DWITH_OTLP=ON -DWITH_OTLP_GRPC=OFF -DWITH_OTLP_HTTP=ON -DWITH_ZIPKIN=ON 
-DWITH_EXAMPLES=OFF ..
-    ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install
+    check_if_source_exist "${OPENTELEMETRY_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${OPENTELEMETRY_SOURCE}"
+
+    mkdir -p "${BUILD_DIR}"
+    cd "${BUILD_DIR}"
+
+    "${CMAKE_CMD}" -G "${GENERATOR}" 
-DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" 
-DCMAKE_PREFIX_PATH="${TP_INSTALL_DIR}" -DBUILD_TESTING=OFF \
+        -DWITH_OTLP=ON -DWITH_OTLP_GRPC=OFF -DWITH_OTLP_HTTP=ON 
-DWITH_ZIPKIN=ON -DWITH_EXAMPLES=OFF ..
+
+    "${BUILD_SYSTEM}" -j "${PARALLEL}"
+    "${BUILD_SYSTEM}" install
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libopentelemetry_exporter_zipkin_trace.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libopentelemetry_trace.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libopentelemetry_proto.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libopentelemetry_resources.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libopentelemetry_exporter_ostream_span.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libopentelemetry_http_client_curl.a
+    strip --strip-debug --strip-unneeded 
"${TP_LIB_DIR}"/libopentelemetry_exporter_otlp_http_client.a
 }
 
 # sse2neon
 build_sse2neon() {
-    check_if_source_exist $SSE2NEON_SOURCE
-    cd $TP_SOURCE_DIR/$SSE2NEON_SOURCE
-    cp sse2neon.h $TP_INSTALL_DIR/include/
+    check_if_source_exist "${SSE2NEON_SOURCE}"
+    cd "${TP_SOURCE_DIR}/${SSE2NEON_SOURCE}"
+    cp sse2neon.h "${TP_INSTALL_DIR}/include/"
 }
 
 build_libunixodbc
@@ -1055,7 +1400,7 @@ build_snappy
 build_gperftools
 build_curl
 build_re2
-# build_hyperscan
+build_hyperscan
 build_thrift
 build_leveldb
 build_brpc
@@ -1091,4 +1436,3 @@ build_libbacktrace
 build_sse2neon
 
 echo "Finished to build all thirdparties"
-
diff --git a/thirdparty/download-thirdparty.sh 
b/thirdparty/download-thirdparty.sh
index b236a64e34..3856993c2f 100755
--- a/thirdparty/download-thirdparty.sh
+++ b/thirdparty/download-thirdparty.sh
@@ -16,138 +16,135 @@
 # specific language governing permissions and limitations
 # under the License.
 
-set -e
 ################################################################
 # This script will download all thirdparties and java libraries
 # which are defined in *vars.sh*, unpack patch them if necessary.
 # You can run this script multi-times.
 # Things will only be downloaded, unpacked and patched once.
 ################################################################
-curdir=`dirname "$0"`
-curdir=`cd "$curdir"; pwd`
+
+set -eo pipefail
+
+curdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
 
 if [[ -z "${DORIS_HOME}" ]]; then
-    DORIS_HOME=$curdir/..
+    DORIS_HOME="${curdir}/.."
 fi
 
 # include custom environment variables
-if [[ -f ${DORIS_HOME}/custom_env.sh ]]; then
-    . ${DORIS_HOME}/custom_env.sh
+if [[ -f "${DORIS_HOME}/custom_env.sh" ]]; then
+    # shellcheck disable=1091
+    . "${DORIS_HOME}/custom_env.sh"
 fi
 
 if [[ -z "${TP_DIR}" ]]; then
-    TP_DIR=$curdir
+    TP_DIR="${curdir}"
 fi
 
-if [ ! -f ${TP_DIR}/vars.sh ]; then
-    echo "vars.sh is missing".
+if [[ ! -f "${TP_DIR}/vars.sh" ]]; then
+    echo 'vars.sh is missing'.
     exit 1
 fi
-. ${TP_DIR}/vars.sh
 
-mkdir -p ${TP_DIR}/src
+. "${TP_DIR}/vars.sh"
 
-md5sum_bin=md5sum
-if ! command -v ${md5sum_bin} >/dev/null 2>&1; then
+mkdir -p "${TP_DIR}/src"
+
+md5sum_bin='md5sum'
+if ! command -v "${md5sum_bin}" >/dev/null 2>&1; then
     echo "Warn: md5sum is not installed"
     md5sum_bin=""
 fi
 
 md5sum_func() {
-    local FILENAME=$1
-    local DESC_DIR=$2
-    local MD5SUM=$3
+    local FILENAME="$1"
+    local DESC_DIR="$2"
+    local MD5SUM="$3"
+    local md5
 
-    if [ "$md5sum_bin" == "" ]; then
-       return 0
+    if [[ "${md5sum_bin}" == "" ]]; then
+        return 0
     else
-       md5=`md5sum "$DESC_DIR/$FILENAME"`
-       if [ "$md5" != "$MD5SUM  $DESC_DIR/$FILENAME" ]; then
-           echo "$DESC_DIR/$FILENAME md5sum check failed!"
-           echo -e "except-md5 $MD5SUM \nactual-md5 $md5"
-           return 1
-       fi
+        md5="$(md5sum "${DESC_DIR}/${FILENAME}")"
+        if [[ "${md5}" != "${MD5SUM}  ${DESC_DIR}/${FILENAME}" ]]; then
+            echo "${DESC_DIR}/${FILENAME} md5sum check failed!"
+            echo -e "except-md5 ${MD5SUM} \nactual-md5 ${md5}"
+            return 1
+        fi
     fi
-
     return 0
 }
 
 # return 0 if download succeed.
 # return 1 if not.
 download_func() {
-    local FILENAME=$1
-    local DOWNLOAD_URL=$2
-    local DESC_DIR=$3
-    local MD5SUM=$4
+    local FILENAME="$1"
+    local DOWNLOAD_URL="$2"
+    local DESC_DIR="$3"
+    local MD5SUM="$4"
 
-    if [ -z "$FILENAME" ]; then
+    if [[ -z "${FILENAME}" ]]; then
         echo "Error: No file name specified to download"
         exit 1
     fi
-    if [ -z "$DOWNLOAD_URL" ]; then
-        echo "Error: No download url specified for $FILENAME"
+    if [[ -z "${DOWNLOAD_URL}" ]]; then
+        echo "Error: No download url specified for ${FILENAME}"
         exit 1
     fi
-    if [ -z "$DESC_DIR" ]; then
-        echo "Error: No dest dir specified for $FILENAME"
+    if [[ -z "${DESC_DIR}" ]]; then
+        echo "Error: No dest dir specified for ${FILENAME}"
         exit 1
     fi
 
-
     local STATUS=1
     for attemp in 1 2; do
-        if [ -r "$DESC_DIR/$FILENAME" ]; then
-            if md5sum_func $FILENAME $DESC_DIR $MD5SUM; then
-                echo "Archive $FILENAME already exist."
+        if [[ -r "${DESC_DIR}/${FILENAME}" ]]; then
+            if md5sum_func "${FILENAME}" "${DESC_DIR}" "${MD5SUM}"; then
+                echo "Archive ${FILENAME} already exist."
                 STATUS=0
-                break;
+                break
             fi
-            echo "Archive $FILENAME will be removed and download again."
-            rm -f "$DESC_DIR/$FILENAME"
+            echo "Archive ${FILENAME} will be removed and download again."
+            rm -f "${DESC_DIR}/${FILENAME}"
         else
-            echo "Downloading $FILENAME from $DOWNLOAD_URL to $DESC_DIR"
-            wget --no-check-certificate -q $DOWNLOAD_URL -O $DESC_DIR/$FILENAME
-            if [ "$?"x == "0"x ]; then
-                if md5sum_func $FILENAME $DESC_DIR $MD5SUM; then
+            echo "Downloading ${FILENAME} from ${DOWNLOAD_URL} to ${DESC_DIR}"
+            if wget --no-check-certificate -q "${DOWNLOAD_URL}" -O 
"${DESC_DIR}/${FILENAME}"; then
+                if md5sum_func "${FILENAME}" "${DESC_DIR}" "${MD5SUM}"; then
                     STATUS=0
-                    echo "Success to download $FILENAME"
-                    break;
+                    echo "Success to download ${FILENAME}"
+                    break
                 fi
-                echo "Archive $FILENAME will be removed and download again."
-                rm -f "$DESC_DIR/$FILENAME"
+                echo "Archive ${FILENAME} will be removed and download again."
+                rm -f "${DESC_DIR}/${FILENAME}"
             else
-                echo "Failed to download $FILENAME. attemp: $attemp"
+                echo "Failed to download ${FILENAME}. attemp: ${attemp}"
             fi
         fi
     done
 
-    if [ $STATUS -ne 0 ]; then
-        echo "Failed to download $FILENAME"
+    if [[ "${STATUS}" -ne 0 ]]; then
+        echo "Failed to download ${FILENAME}"
     fi
-    return $STATUS
+    return "${STATUS}"
 }
 
 # download thirdparty archives
 echo "===== Downloading thirdparty archives..."
-for TP_ARCH in ${TP_ARCHIVES[*]}
-do
-    NAME=$TP_ARCH"_NAME"
-    MD5SUM=$TP_ARCH"_MD5SUM"
-    if test "x$REPOSITORY_URL" = x; then
-        URL=$TP_ARCH"_DOWNLOAD"
-        download_func ${!NAME} ${!URL} $TP_SOURCE_DIR ${!MD5SUM}
-        if [ "$?"x != "0"x ]; then
+for TP_ARCH in "${TP_ARCHIVES[@]}"; do
+    NAME="${TP_ARCH}_NAME"
+    MD5SUM="${TP_ARCH}_MD5SUM"
+    if [[ -z "${REPOSITORY_URL}" ]]; then
+        URL="${TP_ARCH}_DOWNLOAD"
+        if ! download_func "${!NAME}" "${!URL}" "${TP_SOURCE_DIR}" 
"${!MD5SUM}"; then
             echo "Failed to download ${!NAME}"
             exit 1
         fi
     else
         URL="${REPOSITORY_URL}/${!NAME}"
-        download_func ${!NAME} ${URL} $TP_SOURCE_DIR ${!MD5SUM}
-        if [ "$?x" != "0x" ]; then
+        if ! download_func "${!NAME}" "${URL}" "${TP_SOURCE_DIR}" 
"${!MD5SUM}"; then
             #try to download from home
-            URL=$TP_ARCH"_DOWNLOAD"
-            download_func ${!NAME} ${!URL} $TP_SOURCE_DIR ${!MD5SUM}
-            if [ "$?"x != "0"x ]; then
+            URL="${TP_ARCH}_DOWNLOAD"
+            if ! download_func "${!NAME}" "${!URL}" "${TP_SOURCE_DIR}" 
"${!MD5SUM}"; then
                 echo "Failed to download ${!NAME}"
                 exit 1 # download failed again exit.
             fi
@@ -158,10 +155,9 @@ echo "===== Downloading thirdparty archives...done"
 
 # check if all tp archives exists
 echo "===== Checking all thirdpart archives..."
-for TP_ARCH in ${TP_ARCHIVES[*]}
-do
-    NAME=$TP_ARCH"_NAME"
-    if [ ! -r $TP_SOURCE_DIR/${!NAME} ]; then
+for TP_ARCH in "${TP_ARCHIVES[@]}"; do
+    NAME="${TP_ARCH}_NAME"
+    if [[ ! -r "${TP_SOURCE_DIR}/${!NAME}" ]]; then
         echo "Failed to fetch ${!NAME}"
         exit 1
     fi
@@ -176,37 +172,36 @@ SUFFIX_TGZ="\.(tar\.gz|tgz)$"
 SUFFIX_XZ="\.tar\.xz$"
 SUFFIX_ZIP="\.zip$"
 SUFFIX_BZ2="\.tar\.bz2$"
-for TP_ARCH in ${TP_ARCHIVES[*]}
-do
-    NAME=$TP_ARCH"_NAME"
-    SOURCE=$TP_ARCH"_SOURCE"
+for TP_ARCH in "${TP_ARCHIVES[@]}"; do
+    NAME="${TP_ARCH}_NAME"
+    SOURCE="${TP_ARCH}_SOURCE"
 
-    if [ -z "${!SOURCE}" ]; then
+    if [[ -z "${!SOURCE}" ]]; then
         continue
     fi
 
-    if [ ! -d $TP_SOURCE_DIR/${!SOURCE} ]; then
-        if [[ "${!NAME}" =~ $SUFFIX_TGZ  ]]; then
-            echo "$TP_SOURCE_DIR/${!NAME}"
-            echo "$TP_SOURCE_DIR/${!SOURCE}"
-            if ! $TAR_CMD xzf "$TP_SOURCE_DIR/${!NAME}" -C "$TP_SOURCE_DIR/"; 
then
+    if [[ ! -d "${TP_SOURCE_DIR}/${!SOURCE}" ]]; then
+        if [[ "${!NAME}" =~ ${SUFFIX_TGZ} ]]; then
+            echo "${TP_SOURCE_DIR}/${!NAME}"
+            echo "${TP_SOURCE_DIR}/${!SOURCE}"
+            if ! "${TAR_CMD}" xzf "${TP_SOURCE_DIR}/${!NAME}" -C 
"${TP_SOURCE_DIR}/"; then
                 echo "Failed to untar ${!NAME}"
                 exit 1
             fi
-        elif [[ "${!NAME}" =~ $SUFFIX_XZ ]]; then
-            echo "$TP_SOURCE_DIR/${!NAME}"
-            echo "$TP_SOURCE_DIR/${!SOURCE}"
-            if ! $TAR_CMD xJf "$TP_SOURCE_DIR/${!NAME}" -C "$TP_SOURCE_DIR/"; 
then
+        elif [[ "${!NAME}" =~ ${SUFFIX_XZ} ]]; then
+            echo "${TP_SOURCE_DIR}/${!NAME}"
+            echo "${TP_SOURCE_DIR}/${!SOURCE}"
+            if ! "${TAR_CMD}" xJf "${TP_SOURCE_DIR}/${!NAME}" -C 
"${TP_SOURCE_DIR}/"; then
                 echo "Failed to untar ${!NAME}"
                 exit 1
             fi
-        elif [[ "${!NAME}" =~ $SUFFIX_ZIP ]]; then
-            if ! $UNZIP_CMD -o -qq "$TP_SOURCE_DIR/${!NAME}" -d 
"$TP_SOURCE_DIR/"; then
+        elif [[ "${!NAME}" =~ ${SUFFIX_ZIP} ]]; then
+            if ! "${UNZIP_CMD}" -o -qq "${TP_SOURCE_DIR}/${!NAME}" -d 
"${TP_SOURCE_DIR}/"; then
                 echo "Failed to unzip ${!NAME}"
                 exit 1
             fi
-        elif [[ "${!NAME}" =~ $SUFFIX_BZ2 ]]; then
-            if ! $TAR_CMD xf "$TP_SOURCE_DIR/${!NAME}" -C "$TP_SOURCE_DIR/"; 
then
+        elif [[ "${!NAME}" =~ ${SUFFIX_BZ2} ]]; then
+            if ! "${TAR_CMD}" xf "${TP_SOURCE_DIR}/${!NAME}" -C 
"${TP_SOURCE_DIR}/"; then
                 echo "Failed to untar ${!NAME}"
                 exit 1
             fi
@@ -227,116 +222,132 @@ echo "===== Patching thirdparty archives..."
 PATCHED_MARK="patched_mark"
 
 # glog patch
-cd $TP_SOURCE_DIR/$GLOG_SOURCE
-if [ ! -f $PATCHED_MARK ]; then
-    patch -p1 < $TP_PATCH_DIR/glog-0.4.0.patch
-    touch $PATCHED_MARK
+cd "${TP_SOURCE_DIR}/${GLOG_SOURCE}"
+if [[ ! -f "${PATCHED_MARK}" ]]; then
+    patch -p1 <"${TP_PATCH_DIR}/glog-0.4.0.patch"
+    touch "${PATCHED_MARK}"
 fi
 cd -
-echo "Finished patching $GLOG_SOURCE"
+echo "Finished patching ${GLOG_SOURCE}"
 
 # gtest patch
-cd $TP_SOURCE_DIR/$GTEST_SOURCE
-if [ ! -f $PATCHED_MARK ]; then
-    patch -p1 < $TP_PATCH_DIR/googletest-release-1.11.0.patch
-    touch $PATCHED_MARK
+cd "${TP_SOURCE_DIR}/${GTEST_SOURCE}"
+if [[ ! -f "${PATCHED_MARK}" ]]; then
+    patch -p1 <"${TP_PATCH_DIR}/googletest-release-1.11.0.patch"
+    touch "${PATCHED_MARK}"
 fi
 cd -
-echo "Finished patching $GTEST_SOURCE"
+echo "Finished patching ${GTEST_SOURCE}"
 
 # mysql patch
-cd $TP_SOURCE_DIR/$MYSQL_SOURCE
-if [ ! -f $PATCHED_MARK ]; then
-    patch -p1 < $TP_PATCH_DIR/mysql-server-mysql-5.7.18.patch
-    touch $PATCHED_MARK
+cd "${TP_SOURCE_DIR}/${MYSQL_SOURCE}"
+if [[ ! -f "${PATCHED_MARK}" ]]; then
+    patch -p1 <"${TP_PATCH_DIR}/mysql-server-mysql-5.7.18.patch"
+    touch "${PATCHED_MARK}"
 fi
 cd -
-echo "Finished patching $MYSQL_SOURCE"
+echo "Finished patching ${MYSQL_SOURCE}"
 
 # libevent patch
-cd $TP_SOURCE_DIR/$LIBEVENT_SOURCE
-if [ ! -f $PATCHED_MARK ]; then
-    patch -p1 < $TP_PATCH_DIR/libevent.patch
-    touch $PATCHED_MARK
+cd "${TP_SOURCE_DIR}/${LIBEVENT_SOURCE}"
+if [[ ! -f "${PATCHED_MARK}" ]]; then
+    patch -p1 <"${TP_PATCH_DIR}/libevent.patch"
+    touch "${PATCHED_MARK}"
 fi
 cd -
-echo "Finished patching $LIBEVENT_SOURCE"
+echo "Finished patching ${LIBEVENT_SOURCE}"
 
 # s2 patch to disable shared library
-cd $TP_SOURCE_DIR/$S2_SOURCE
-if [ ! -f $PATCHED_MARK ]; then
-    patch -p1 < $TP_PATCH_DIR/s2geometry-0.9.0.patch
-    touch $PATCHED_MARK
+cd "${TP_SOURCE_DIR}/${S2_SOURCE}"
+if [[ ! -f "${PATCHED_MARK}" ]]; then
+    patch -p1 <"${TP_PATCH_DIR}/s2geometry-0.9.0.patch"
+    touch "${PATCHED_MARK}"
 fi
 cd -
-echo "Finished patching $S2_SOURCE"
+echo "Finished patching ${S2_SOURCE}"
 
 # gsasl2 patch to fix link error such as mutilple func defination
 # when link target with kerberos
-cd $TP_SOURCE_DIR/$GSASL_SOURCE
-if [ ! -f $PATCHED_MARK ]; then
-    patch -p1 < $TP_PATCH_DIR/libgsasl-1.8.0.patch
-    touch $PATCHED_MARK
+cd "${TP_SOURCE_DIR}/${GSASL_SOURCE}"
+if [[ ! -f ${PATCHED_MARK} ]]; then
+    patch -p1 <"${TP_PATCH_DIR}/libgsasl-1.8.0.patch"
+    touch "${PATCHED_MARK}"
 fi
 cd -
-echo "Finished patching $GSASL_SOURCE"
+echo "Finished patching ${GSASL_SOURCE}"
 
 # rocksdb patch to fix compile error
-if [ $ROCKSDB_SOURCE == "rocksdb-5.14.2" ]; then
-    cd $TP_SOURCE_DIR/$ROCKSDB_SOURCE
-    if [ ! -f $PATCHED_MARK ]; then
-        patch -p1 < $TP_PATCH_DIR/rocksdb-5.14.2.patch
-        touch $PATCHED_MARK
+if [[ "${ROCKSDB_SOURCE}" == "rocksdb-5.14.2" ]]; then
+    cd "${TP_SOURCE_DIR}/${ROCKSDB_SOURCE}"
+    if [[ ! -f "${PATCHED_MARK}" ]]; then
+        patch -p1 <"${TP_PATCH_DIR}/rocksdb-5.14.2.patch"
+        touch "${PATCHED_MARK}"
     fi
     cd -
 fi
-echo "Finished patching $ROCKSDB_SOURCE"
+echo "Finished patching ${ROCKSDB_SOURCE}"
 
 # opentelemetry patch is used to solve the problem that threadlocal depends on 
GLIBC_2.18
 # see: https://github.com/apache/doris/pull/7911
-if [ $OPENTELEMETRY_SOURCE == "opentelemetry-cpp-1.4.0" ]; then
-    rm -rf 
$TP_SOURCE_DIR/$OPENTELEMETRY_SOURCE/third_party/opentelemetry-proto/*
-    cp -r $TP_SOURCE_DIR/$OPENTELEMETRY_PROTO_SOURCE/* 
$TP_SOURCE_DIR/$OPENTELEMETRY_SOURCE/third_party/opentelemetry-proto
-    mkdir -p 
$TP_SOURCE_DIR/$OPENTELEMETRY_SOURCE/third_party/opentelemetry-proto/.git
-
-    cd $TP_SOURCE_DIR/$OPENTELEMETRY_SOURCE
-    if [ ! -f $PATCHED_MARK ]; then
-        patch -p1 < $TP_PATCH_DIR/opentelemetry-cpp-1.4.0.patch
-        touch $PATCHED_MARK
+if [[ "${OPENTELEMETRY_SOURCE}" == "opentelemetry-cpp-1.4.0" ]]; then
+    rm -rf 
"${TP_SOURCE_DIR}/${OPENTELEMETRY_SOURCE}/third_party/opentelemetry-proto"/*
+    cp -r "${TP_SOURCE_DIR}/${OPENTELEMETRY_PROTO_SOURCE}"/* 
"${TP_SOURCE_DIR}/${OPENTELEMETRY_SOURCE}/third_party/opentelemetry-proto"
+    mkdir -p 
"${TP_SOURCE_DIR}/${OPENTELEMETRY_SOURCE}/third_party/opentelemetry-proto/.git"
+
+    cd "${TP_SOURCE_DIR}/${OPENTELEMETRY_SOURCE}"
+    if [[ ! -f "${PATCHED_MARK}" ]]; then
+        patch -p1 <"${TP_PATCH_DIR}/opentelemetry-cpp-1.4.0.patch"
+        touch "${PATCHED_MARK}"
+    fi
+    cd -
+fi
+echo "Finished patching ${OPENTELEMETRY_SOURCE}"
+
+# arrow patch is used to get the raw orc reader for filter prune.
+if [[ "${ARROW_SOURCE}" == "apache-arrow-7.0.0" ]]; then
+    cd "${TP_SOURCE_DIR}/${ARROW_SOURCE}"
+    if [[ ! -f "${PATCHED_MARK}" ]]; then
+        patch -p1 <"${TP_PATCH_DIR}/apache-arrow-7.0.0.patch"
+        touch "${PATCHED_MARK}"
     fi
     cd -
 fi
-echo "Finished patching $OPENTELEMETRY_SOURCE"
+echo "Finished patching ${ARROW_SOURCE}"
 
 # patch librdkafka to avoid crash
-if [ $LIBRDKAFKA_SOURCE = "librdkafka-1.8.2" ]; then
-    cd $TP_SOURCE_DIR/$LIBRDKAFKA_SOURCE
-    if [ ! -f $PATCHED_MARK ]; then
-        patch -p0 < $TP_PATCH_DIR/librdkafka-1.8.2.patch
-        touch $PATCHED_MARK
+if [[ "${LIBRDKAFKA_SOURCE}" == "librdkafka-1.8.2" ]]; then
+    cd "${TP_SOURCE_DIR}/${LIBRDKAFKA_SOURCE}"
+    if [[ ! -f "${PATCHED_MARK}" ]]; then
+        patch -p0 <"${TP_PATCH_DIR}/librdkafka-1.8.2.patch"
+        touch "${PATCHED_MARK}"
     fi
     cd -
 fi
-echo "Finished patching $LIBRDKAFKA_SOURCE"
+echo "Finished patching ${LIBRDKAFKA_SOURCE}"
 
 # patch hyperscan
 # https://github.com/intel/hyperscan/issues/292
-if [ $HYPERSCAN_SOURCE = "hyperscan-5.4.0" ]; then
-    cd $TP_SOURCE_DIR/$HYPERSCAN_SOURCE
-    if [ ! -f $PATCHED_MARK ]; then
-        patch -p0 < $TP_PATCH_DIR/hyperscan-5.4.0.patch
-        touch $PATCHED_MARK
+if [[ "${HYPERSCAN_SOURCE}" == "hyperscan-5.4.0" ]]; then
+    cd "${TP_SOURCE_DIR}/${HYPERSCAN_SOURCE}"
+    if [[ ! -f "${PATCHED_MARK}" ]]; then
+        patch -p0 <"${TP_PATCH_DIR}/hyperscan-5.4.0.patch"
+        touch "${PATCHED_MARK}"
+    fi
+    cd -
+elif [[ "${HYPERSCAN_SOURCE}" == "vectorscan-vectorscan-5.4.7" ]]; then
+    cd "${TP_SOURCE_DIR}/${HYPERSCAN_SOURCE}"
+    if [[ ! -f "${PATCHED_MARK}" ]]; then
+        patch -p0 <"${TP_PATCH_DIR}/vectorscan-5.4.7.patch"
+        touch "${PATCHED_MARK}"
     fi
     cd -
 fi
-echo "Finished patching $HYPERSCAN_SOURCE"
-
-cd $TP_SOURCE_DIR/$AWS_SDK_SOURCE
-if [ ! -f $PATCHED_MARK ]; then
-    if [ $AWS_SDK_SOURCE == "aws-sdk-cpp-1.9.211" ]; then
-        wget --no-check-certificate -q 
https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/aws-crt-cpp-1.9.211.tar.gz
 -O aws-crt-cpp-1.9.211.tar.gz
-        ret="$?"
-        if [ $ret -eq 0 ] ; then
+echo "Finished patching ${HYPERSCAN_SOURCE}"
+
+cd "${TP_SOURCE_DIR}/${AWS_SDK_SOURCE}"
+if [[ ! -f "${PATCHED_MARK}" ]]; then
+    if [[ "${AWS_SDK_SOURCE}" == "aws-sdk-cpp-1.9.211" ]]; then
+        if wget --no-check-certificate -q 
https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/aws-crt-cpp-1.9.211.tar.gz
 -O aws-crt-cpp-1.9.211.tar.gz; then
             tar xzf aws-crt-cpp-1.9.211.tar.gz
         else
             bash ./prefetch_crt_dependency.sh
@@ -344,20 +355,15 @@ if [ ! -f $PATCHED_MARK ]; then
     else
         bash ./prefetch_crt_dependency.sh
     fi
-    touch $PATCHED_MARK
+    touch "${PATCHED_MARK}"
 fi
 cd -
-echo "Finished patching $AWS_SDK_SOURCE"
+echo "Finished patching ${AWS_SDK_SOURCE}"
 
 cd "${TP_SOURCE_DIR}/${BRPC_SOURCE}"
-if [[ ! -f $PATCHED_MARK ]]; then
-    if [[ "$(uname -s)" == 'Darwin' ]]; then
-        patch -p1 <"${TP_PATCH_DIR}/brpc-1.1.0.patch"
-        touch ${PATCHED_MARK}
-    else
-        patch -p0 <"$TP_PATCH_DIR/brpc-1.1.0-_dl_sym.patch"
-        touch ${PATCHED_MARK}
-    fi
+if [[ ! -f "${PATCHED_MARK}" ]]; then
+    patch -p1 <"${TP_PATCH_DIR}/brpc-1.2.0.patch"
+    touch "${PATCHED_MARK}"
 fi
 cd -
 echo "Finished patching ${BRPC_SOURCE}"
diff --git a/thirdparty/patches/apache-arrow-7.0.0.patch 
b/thirdparty/patches/apache-arrow-7.0.0.patch
new file mode 100644
index 0000000000..9cb1812b35
--- /dev/null
+++ b/thirdparty/patches/apache-arrow-7.0.0.patch
@@ -0,0 +1,70 @@
+diff --git a/cpp/src/arrow/adapters/orc/adapter.cc 
b/cpp/src/arrow/adapters/orc/adapter.cc
+index 03243e7..cbb3ed9 100644
+--- a/cpp/src/arrow/adapters/orc/adapter.cc
++++ b/cpp/src/arrow/adapters/orc/adapter.cc
+@@ -47,9 +47,6 @@
+ #include "arrow/util/visibility.h"
+ #include "orc/Exceptions.hh"
+
+-// alias to not interfere with nested orc namespace
+-namespace liborc = orc;
+-
+ #define ORC_THROW_NOT_OK(s)                   \
+   do {                                        \
+     Status _s = (s);                          \
+@@ -198,6 +195,11 @@ class ORCFileReader::Impl {
+     return Init();
+   }
+
++  virtual liborc::Reader* GetRawORCReader() {
++    return reader_.get();
++  }
++
++
+   Status Init() {
+     int64_t nstripes = reader_->getNumberOfStripes();
+     stripes_.resize(nstripes);
+@@ -504,6 +506,7 @@ class ORCFileReader::Impl {
+     return Status::OK();
+   }
+
++
+   Status NextStripeReader(int64_t batch_size, 
std::shared_ptr<RecordBatchReader>* out) {
+     return NextStripeReader(batch_size, {}, out);
+   }
+@@ -531,6 +534,10 @@ Result<std::unique_ptr<ORCFileReader>> 
ORCFileReader::Open(
+   return std::move(result);
+ }
+
++liborc::Reader* ORCFileReader::GetRawORCReader() {
++  return impl_->GetRawORCReader();
++}
++
+ Result<std::shared_ptr<const KeyValueMetadata>> ORCFileReader::ReadMetadata() 
{
+   return impl_->ReadMetadata();
+ }
+diff --git a/cpp/src/arrow/adapters/orc/adapter.h 
b/cpp/src/arrow/adapters/orc/adapter.h
+index 223efa5..a0d112a 100644
+--- a/cpp/src/arrow/adapters/orc/adapter.h
++++ b/cpp/src/arrow/adapters/orc/adapter.h
+@@ -30,6 +30,10 @@
+ #include "arrow/type_fwd.h"
+ #include "arrow/util/macros.h"
+ #include "arrow/util/visibility.h"
++#include "orc/Reader.hh"
++
++// alias to not interfere with nested orc namespace
++namespace liborc = orc;
+
+ namespace arrow {
+ namespace adapters {
+@@ -50,6 +54,9 @@ class ARROW_EXPORT ORCFileReader {
+   ARROW_DEPRECATED("Deprecated in 6.0.0. Use Result-returning overload 
instead.")
+   static Status Open(const std::shared_ptr<io::RandomAccessFile>& file, 
MemoryPool* pool,
+                      std::unique_ptr<ORCFileReader>* reader);
++ 
++  /// \brief Get ORC reader from inside.
++  liborc::Reader* GetRawORCReader();
+
+   /// \brief Creates a new ORC reader
+   ///
\ No newline at end of file
diff --git a/thirdparty/patches/brpc-1.1.0-_dl_sym.patch 
b/thirdparty/patches/brpc-1.1.0-_dl_sym.patch
deleted file mode 100644
index 35d06b7708..0000000000
--- a/thirdparty/patches/brpc-1.1.0-_dl_sym.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- src/bthread/mutex.cpp      2022-08-10 13:14:11.792739916 +0800
-+++ src/bthread/mutex.cpp      2022-08-10 13:04:54.644764937 +0800
-@@ -44,7 +44,7 @@
- #include "bthread/log.h"
- 
- extern "C" {
--extern void* _dl_sym(void* handle, const char* symbol, void* caller);
-+extern void* __attribute__((weak)) _dl_sym(void* handle, const char* symbol, 
void* caller);
- }
- 
- namespace bthread {
-@@ -408,8 +408,14 @@ static void init_sys_mutex_lock() {
- #if defined(OS_LINUX)
-     // TODO: may need dlvsym when GLIBC has multiple versions of a same 
symbol.
-     // 
http://blog.fesnel.com/blog/2009/08/25/preloading-with-multiple-symbol-versions
--    sys_pthread_mutex_lock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_lock", (void*)init_sys_mutex_lock);
--    sys_pthread_mutex_unlock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_unlock", (void*)init_sys_mutex_lock);
-+    if (_dl_sym) {
-+        sys_pthread_mutex_lock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_lock", (void*)init_sys_mutex_lock);
-+        sys_pthread_mutex_unlock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_unlock", (void*)init_sys_mutex_lock);
-+    } else {
-+        // _dl_sym may be undefined reference in some system, fallback to 
dlsym
-+        sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_lock");
-+        sys_pthread_mutex_unlock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_unlock");
-+    }
- #elif defined(OS_MACOSX)
-     // TODO: look workaround for dlsym on mac
-     sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_lock");
diff --git a/thirdparty/patches/brpc-1.2.0.patch 
b/thirdparty/patches/brpc-1.2.0.patch
new file mode 100644
index 0000000000..7414a388b9
--- /dev/null
+++ b/thirdparty/patches/brpc-1.2.0.patch
@@ -0,0 +1,13 @@
+diff --git a/tools/rpc_press/rpc_press_impl.cpp 
b/tools/rpc_press/rpc_press_impl.cpp
+index 8a873eff..d1ff2a1e 100644
+--- a/tools/rpc_press/rpc_press_impl.cpp
++++ b/tools/rpc_press/rpc_press_impl.cpp
+@@ -222,7 +222,7 @@ void RpcPress::sync_client() {
+     int64_t last_expected_time = butil::monotonic_time_ns();
+     const int64_t interval = (int64_t) (1000000000L / req_rate);
+     // the max tolerant delay between end_time and expected_time. 10ms or 10 
intervals
+-    int64_t max_tolerant_delay = std::max(10000000L, 10 * interval);    
++    int64_t max_tolerant_delay = std::max<int64_t>(10000000L, 10 * interval);
+     while (!_stop) {
+         brpc::Controller* cntl = new brpc::Controller;
+         msg_index = (msg_index + _options.test_thread_num) % _msgs.size();
diff --git a/thirdparty/patches/opentelemetry-cpp-1.4.0.patch 
b/thirdparty/patches/opentelemetry-cpp-1.4.0.patch
index 2862d11c29..6317c60bf3 100644
--- a/thirdparty/patches/opentelemetry-cpp-1.4.0.patch
+++ b/thirdparty/patches/opentelemetry-cpp-1.4.0.patch
@@ -1,19 +1,15 @@
 diff --git a/api/include/opentelemetry/common/threadlocal.h 
b/api/include/opentelemetry/common/threadlocal.h
 new file mode 100644
-index 0000000..799ec6c
+index 0000000..23a39e1
 --- /dev/null
 +++ b/api/include/opentelemetry/common/threadlocal.h
-@@ -0,0 +1,206 @@
+@@ -0,0 +1,123 @@
 +// Copyright The OpenTelemetry Authors
 +// SPDX-License-Identifier: Apache-2.0
 +
 +#pragma once
 +
-+#include <pthread.h>
-+
-+#include <memory>
-+#include <mutex>
-+#include <ostream>
++#include "opentelemetry/version.h"
 +
 +//
 +// GCC can be told that a certain branch is not likely to be taken (for
@@ -21,20 +17,8 @@ index 0000000..799ec6c
 +// Giving it this information can help it optimize for the common case in
 +// the absence of better information (ie. -fprofile-arcs).
 +//
-+#ifndef PREDICT_FALSE
-+#if defined(__GNUC__)
-+#define PREDICT_FALSE(x) (__builtin_expect(x, 0))
-+#else
-+#define PREDICT_FALSE(x) x
-+#endif
-+#endif
-+#ifndef PREDICT_TRUE
-+#if defined(__GNUC__)
-+#define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
-+#else
-+#define PREDICT_TRUE(x) x
-+#endif
-+#endif
++#define LIKELY(expr) __builtin_expect(!!(expr), 1)
++#define UNLIKELY(expr) __builtin_expect(!!(expr), 0)
 +
 +// Block-scoped static thread local implementation.
 +//
@@ -55,14 +39,16 @@ index 0000000..799ec6c
 +// BLOCK_STATIC_THREAD_LOCAL_TELEMTRY(SomeClass, instance, arg1, arg2, arg3);
 +// instance->DoSomething();
 +//
-+#define BLOCK_STATIC_THREAD_LOCAL_TELEMTRY(T, t, ...)                         
           \
-+static __thread T* t;                                                         
  \
-+do {                                                                          
  \
-+  if (PREDICT_FALSE(t == NULL)) {                                             
  \
-+    t = new T(__VA_ARGS__);                                                   
  \
-+    
internal_threadlocal::ThreadLocal::AddDestructor(internal_threadlocal::ThreadLocal::Destroy<T>,
 t); \
-+  }                                                                           
  \
-+} while (false)
++#define BLOCK_STATIC_THREAD_LOCAL_TELEMTRY(T, t, ...)                         
  \
++  static __thread T *t;                                                       
  \
++  do                                                                          
  \
++  {                                                                           
  \
++    if (UNLIKELY(t == nullptr))                                               
  \
++    {                                                                         
  \
++      t = new T(__VA_ARGS__);                                                 
  \
++      internal_threadlocal::AddDestructor(internal_threadlocal::Destroy<T>, 
t); \
++    }                                                                         
  \
++  } while (false)
 +
 +// Class-scoped static thread local implementation.
 +//
@@ -108,111 +94,42 @@ index 0000000..799ec6c
 +// dtor must be destructed _after_ t, so it gets defined first.
 +// Uses a mangled variable name for dtor since it must also be a member of the
 +// class.
-+#define DECLARE_STATIC_THREAD_LOCAL_TELEMETRY(T, t)                           
                          \
-+static __thread T* t
++#define DECLARE_STATIC_THREAD_LOCAL_TELEMETRY(T, t) static __thread T *t
 +
 +// You must also define the instance in the .cc file.
-+#define DEFINE_STATIC_THREAD_LOCAL_TELEMETRY(T, Class, t)                     
                          \
-+__thread T* Class::t
++#define DEFINE_STATIC_THREAD_LOCAL_TELEMETRY(T, Class, t) __thread T *Class::t
 +
 +// Must be invoked at least once by each thread that will access t.
-+#define INIT_STATIC_THREAD_LOCAL_TELEMETRY(T, t, ...)                         
              \
-+do {                                                                          
    \
-+  if (PREDICT_FALSE(t == NULL)) {                                             
    \
-+    t = new T(__VA_ARGS__);                                                   
    \
-+    
internal_threadlocal::ThreadLocal::AddDestructor(internal_threadlocal::ThreadLocal::Destroy<T>,
 t);     \
-+  }                                                                           
    \
-+} while (false)
++#define INIT_STATIC_THREAD_LOCAL_TELEMETRY(T, t, ...)                         
  \
++  do                                                                          
  \
++  {                                                                           
  \
++    if (UNLIKELY(t == nullptr))                                               
  \
++    {                                                                         
  \
++      t = new T(__VA_ARGS__);                                                 
  \
++      internal_threadlocal::AddDestructor(internal_threadlocal::Destroy<T>, 
t); \
++    }                                                                         
  \
++  } while (false)
 +
 +// Internal implementation below.
 +OPENTELEMETRY_BEGIN_NAMESPACE
 +namespace internal_threadlocal
 +{
 +
-+// One key used by the entire process to attach destructors on thread exit.
-+static pthread_key_t destructors_key;
-+
-+static std::once_flag once_init;
-+
-+namespace
-+{
-+// List of destructors for all thread locals instantiated on a given thread.
-+struct PerThreadDestructorList
-+{
-+  void (*destructor)(void *);
-+  void *arg;
-+  PerThreadDestructorList *next;
-+};
-+
-+}  // anonymous namespace
++// Add a destructor to the list.
++void AddDestructor(void (*destructor)(void *), void *arg);
 +
-+class ThreadLocal {
-+public:
 +// Destroy the passed object of type T.
-+  template <class T>
-+  static void Destroy(void *t)
-+  {
-+    // With tcmalloc, this should be pretty cheap (same thread as new).
-+    delete reinterpret_cast<T *>(t);
-+  }
-+
-+  // Call all the destructors associated with all THREAD_LOCAL instances in 
this
-+// thread.
-+  static void InvokeDestructors(void *t)
-+  {
-+    PerThreadDestructorList *d = reinterpret_cast<PerThreadDestructorList 
*>(t);
-+    while (d != nullptr)
-+    {
-+      d->destructor(d->arg);
-+      PerThreadDestructorList *next = d->next;
-+      delete d;
-+      d = next;
-+    }
-+  }
-+
-+// This key must be initialized only once.
-+  static void CreateKey()
-+  {
-+    int ret = pthread_key_create(&destructors_key, &InvokeDestructors);
-+    // Linux supports up to 1024 keys, we will use only one for all thread 
locals.
-+/*    if (ret != 0)
-+    {
-+      std::stringstream ss;
-+      ss << "[thread local] pthread_key_create() failed, cannot add 
destructor to thread: "
-+         << "error " << ret;
-+      OTEL_INTERNAL_LOG_ERROR(ss.str());
-+    }*/
-+  }
-+
-+// Adds a destructor to the list.
-+  static void AddDestructor(void (*destructor)(void *), void *arg)
-+  {
-+    std::call_once(once_init, &CreateKey);
-+
-+    // Returns NULL if nothing is set yet.
-+    std::unique_ptr<PerThreadDestructorList> p(new PerThreadDestructorList());
-+    p->destructor = destructor;
-+    p->arg        = arg;
-+    p->next       = reinterpret_cast<PerThreadDestructorList 
*>(pthread_getspecific(destructors_key));
-+    int ret       = pthread_setspecific(destructors_key, p.release());
-+    // The only time this check should fail is if we are out of memory, or if
-+    // somehow key creation failed, which should be caught by the above CHECK.
-+/*    if (ret != 0)
-+    {
-+      std::stringstream ss;
-+      ss << "[thread local] pthread_setspecific() failed, cannot update 
destructor list: "
-+         << "error " << ret;
-+      OTEL_INTERNAL_LOG_ERROR(ss.str());
-+    }*/
-+  }
-+
-+};
-+
-+}  // namespace threadlocal
++template <class T>
++static void Destroy(void *t)
++{
++  // With tcmalloc, this should be pretty cheap (same thread as new).
++  delete reinterpret_cast<T *>(t);
++}
++}  // namespace internal_threadlocal
 +OPENTELEMETRY_END_NAMESPACE
 \ No newline at end of file
 diff --git a/api/include/opentelemetry/context/runtime_context.h 
b/api/include/opentelemetry/context/runtime_context.h
-index 5cb793b..24ba44b 100644
+index 167a928..608b6da 100644
 --- a/api/include/opentelemetry/context/runtime_context.h
 +++ b/api/include/opentelemetry/context/runtime_context.h
 @@ -4,6 +4,7 @@
@@ -223,7 +140,7 @@ index 5cb793b..24ba44b 100644
  
  OPENTELEMETRY_BEGIN_NAMESPACE
  namespace context
-@@ -178,7 +179,7 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
+@@ -188,7 +189,7 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
    ThreadLocalContextStorage() noexcept = default;
  
    // Return the current context.
@@ -232,7 +149,7 @@ index 5cb793b..24ba44b 100644
  
    // Resets the context to the value previous to the passed in token. This 
will
    // also detach all child contexts of the passed in token.
-@@ -186,23 +187,23 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
+@@ -196,23 +197,23 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
    bool Detach(Token &token) noexcept override
    {
      // In most cases, the context to be detached is on the top of the stack.
@@ -262,7 +179,7 @@ index 5cb793b..24ba44b 100644
  
      return true;
    }
-@@ -211,14 +212,14 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
+@@ -221,14 +222,14 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
    // that can be used to reset to the previous Context.
    nostd::unique_ptr<Token> Attach(const Context &context) noexcept override
    {
@@ -279,7 +196,7 @@ index 5cb793b..24ba44b 100644
      friend class ThreadLocalContextStorage;
  
      Stack() noexcept : size_(0), capacity_(0), base_(nullptr){};
-@@ -305,9 +306,10 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
+@@ -315,9 +316,10 @@ class ThreadLocalContextStorage : public 
RuntimeContextStorage
      Context *base_;
    };
  
@@ -293,7 +210,7 @@ index 5cb793b..24ba44b 100644
    }
  };
 diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt
-index 9aa4588..e2c5a4a 100644
+index 1a824fe..91d4b5c 100644
 --- a/sdk/CMakeLists.txt
 +++ b/sdk/CMakeLists.txt
 @@ -1,4 +1,4 @@
@@ -302,6 +219,16 @@ index 9aa4588..e2c5a4a 100644
  target_include_directories(
    opentelemetry_sdk
    INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
+diff --git a/sdk/src/common/CMakeLists.txt b/sdk/src/common/CMakeLists.txt
+index debffef..b4fc875 100644
+--- a/sdk/src/common/CMakeLists.txt
++++ b/sdk/src/common/CMakeLists.txt
+@@ -1,4 +1,4 @@
+-set(COMMON_SRCS random.cc core.cc)
++set(COMMON_SRCS random.cc core.cc threadlocal.cc)
+ if(WIN32)
+   list(APPEND COMMON_SRCS platform/fork_windows.cc)
+ else()
 diff --git a/sdk/src/common/random.cc b/sdk/src/common/random.cc
 index 77b88cf..dc71f9c 100644
 --- a/sdk/src/common/random.cc
@@ -372,3 +299,92 @@ index ecd6dab..1aaa220 100644
  };
  }  // namespace common
  }  // namespace sdk
+diff --git a/sdk/src/common/threadlocal.cc b/sdk/src/common/threadlocal.cc
+new file mode 100644
+index 0000000..1f8b6b1
+--- /dev/null
++++ b/sdk/src/common/threadlocal.cc
+@@ -0,0 +1,82 @@
++// Copyright The OpenTelemetry Authors
++// SPDX-License-Identifier: Apache-2.0
++
++#include <opentelemetry/common/threadlocal.h>
++
++#include <pthread.h>
++#include <memory>
++#include <mutex>
++#include <ostream>
++#include <sstream>
++
++OPENTELEMETRY_BEGIN_NAMESPACE
++namespace internal_threadlocal
++{
++
++// One key used by the entire process to attach destructors on thread exit.
++static pthread_key_t destructors_key;
++
++static std::once_flag once_init;
++
++namespace
++{
++// List of destructors for all thread locals instantiated on a given thread.
++struct PerThreadDestructorList
++{
++  void (*destructor)(void *);
++  void *arg;
++  PerThreadDestructorList *next;
++};
++
++}  // anonymous namespace
++
++// Call all the destructors associated with all THREAD_LOCAL instances in 
this thread.
++static void InvokeDestructors(void *t)
++{
++  auto *d = reinterpret_cast<PerThreadDestructorList *>(t);
++  while (d != nullptr)
++  {
++    d->destructor(d->arg);
++    PerThreadDestructorList *next = d->next;
++    delete d;
++    d = next;
++  }
++}
++
++// This key must be initialized only once.
++static void CreateKey()
++{
++  int ret = pthread_key_create(&destructors_key, &InvokeDestructors);
++  // Linux supports up to 1024 keys, we will use only one for all thread 
locals.
++  if (ret != 0)
++  {
++    std::stringstream ss;
++    ss << "[thread local] pthread_key_create() failed, cannot add destructor 
to thread: "
++       << "error " << ret;
++    fprintf(stderr, "%s\n", ss.str().c_str());
++  }
++}
++
++// Adds a destructor to the list.
++void AddDestructor(void (*destructor)(void *), void *arg)
++{
++  std::call_once(once_init, &CreateKey);
++
++  // Returns NULL if nothing is set yet.
++  std::unique_ptr<PerThreadDestructorList> p(new PerThreadDestructorList());
++  p->destructor = destructor;
++  p->arg        = arg;
++  p->next       = reinterpret_cast<PerThreadDestructorList 
*>(pthread_getspecific(destructors_key));
++  int ret       = pthread_setspecific(destructors_key, p.release());
++  // The only time this check should fail is if we are out of memory, or if
++  // somehow key creation failed, which should be caught by the above CHECK.
++  if (ret != 0)
++  {
++    std::stringstream ss;
++    ss << "[thread local] pthread_setspecific() failed, cannot update 
destructor list: "
++       << "error " << ret;
++    fprintf(stderr, "%s\n", ss.str().c_str());
++  }
++}
++}  // namespace internal_threadlocal
++OPENTELEMETRY_END_NAMESPACE
+\ No newline at end of file
diff --git a/thirdparty/patches/vectorscan-5.4.7.patch 
b/thirdparty/patches/vectorscan-5.4.7.patch
new file mode 100644
index 0000000000..712c11e86a
--- /dev/null
+++ b/thirdparty/patches/vectorscan-5.4.7.patch
@@ -0,0 +1,31 @@
+diff --git CMakeLists.txt CMakeLists.txt
+index cb4ba80..9a106e5 100644
+--- CMakeLists.txt
++++ CMakeLists.txt
+@@ -170,7 +170,7 @@ if (CMAKE_COMPILER_IS_GNUCC AND NOT CROSS_COMPILE)
+
+     # arg1 might exist if using ccache
+     string (STRIP "${CMAKE_C_COMPILER_ARG1}" CC_ARG1)
+-    set (EXEC_ARGS ${CC_ARG1} -c -Q --help=target -${ARCH_FLAG}=native 
-mtune=native)
++    set (EXEC_ARGS ${CC_ARG1} -c -Q --help=target -mtune=native)
+     execute_process(COMMAND ${CMAKE_C_COMPILER} ${EXEC_ARGS}
+         OUTPUT_VARIABLE _GCC_OUTPUT)
+     string(FIND "${_GCC_OUTPUT}" "${ARCH_FLAG}" POS)
+diff --git cmake/build_wrapper.sh cmake/build_wrapper.sh
+index 895610c..becfbf4 100755
+--- cmake/build_wrapper.sh
++++ cmake/build_wrapper.sh
+@@ -17,11 +17,11 @@ KEEPSYMS=$(mktemp -p /tmp keep.syms.XXXXX)
+ LIBC_SO=$("$@" --print-file-name=libc.so.6)
+ cp ${KEEPSYMS_IN} ${KEEPSYMS}
+ # get all symbols from libc and turn them into patterns
+-nm -f p -g -D ${LIBC_SO} | sed -s 's/\([^ @]*\).*/^\1$/' >> ${KEEPSYMS}
++nm -f posix -g -D ${LIBC_SO} | sed -s 's/\([^ @]*\).*/^\1$/' >> ${KEEPSYMS}
+ # build the object
+ "$@"
+ # rename the symbols in the object
+-nm -f p -g ${OUT} | cut -f1 -d' ' | grep -v -f ${KEEPSYMS} | sed -e 
"s/\(.*\)/\1\ ${PREFIX}_\1/" >> ${SYMSFILE}
++nm -f posix -g ${OUT} | cut -f1 -d' ' | grep -v -f ${KEEPSYMS} | sed -e 
"s/\(.*\)/\1\ ${PREFIX}_\1/" >> ${SYMSFILE}
+ if test -s ${SYMSFILE}
+ then
+     objcopy --redefine-syms=${SYMSFILE} ${OUT}
diff --git a/thirdparty/vars.sh b/thirdparty/vars.sh
index de005c6dbb..96148f6628 100755
--- a/thirdparty/vars.sh
+++ b/thirdparty/vars.sh
@@ -1,4 +1,6 @@
 #!/bin/bash
+# shellcheck disable=2034
+
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -27,25 +29,25 @@
 ###################################################
 
 # thirdparties will be downloaded and unpacked here
-export TP_SOURCE_DIR=$TP_DIR/src
+export TP_SOURCE_DIR="${TP_DIR:-.}/src"
 
 # thirdparties will be installed to here
-export TP_INSTALL_DIR=$TP_DIR/installed
+export TP_INSTALL_DIR="${TP_DIR:-.}/installed"
 
 # patches for all thirdparties
-export TP_PATCH_DIR=$TP_DIR/patches
+export TP_PATCH_DIR="${TP_DIR:-.}/patches"
 
 # header files of all thirdparties will be intalled to here
-export TP_INCLUDE_DIR=$TP_INSTALL_DIR/include
+export TP_INCLUDE_DIR="${TP_INSTALL_DIR}/include"
 
 # libraries of all thirdparties will be intalled to here
-export TP_LIB_DIR=$TP_INSTALL_DIR/lib
+export TP_LIB_DIR="${TP_INSTALL_DIR}/lib"
 
 # all java libraries will be unpacked to here
-export TP_JAR_DIR=$TP_INSTALL_DIR/lib/jar
+export TP_JAR_DIR="${TP_INSTALL_DIR}/lib/jar"
 
 # source of all dependencies, default unuse it
-export REPOSITORY_URL=
+# export REPOSITORY_URL=
 
 #####################################################
 # Download url, filename and unpaced filename
@@ -155,6 +157,16 @@ HYPERSCAN_NAME=hyperscan-5.4.0.tar.gz
 HYPERSCAN_SOURCE=hyperscan-5.4.0
 HYPERSCAN_MD5SUM="65e08385038c24470a248f6ff2fa379b"
 
+# vectorscan (support arm for hyperscan)
+MACHINE_TYPE=$(uname -m)
+if [[ "${MACHINE_TYPE}" == "aarch64" || "${MACHINE_TYPE}" == 'arm64' ]]; then
+    echo "use vectorscan instead of hyperscan on aarch64"
+    
HYPERSCAN_DOWNLOAD="https://github.com/VectorCamp/vectorscan/archive/refs/tags/vectorscan/5.4.7.tar.gz";
+    HYPERSCAN_NAME=vectorscan-5.4.7.tar.gz
+    HYPERSCAN_SOURCE=vectorscan-vectorscan-5.4.7
+    HYPERSCAN_MD5SUM="ae924ccce79ef9bf6bf118693ae14fe5"
+fi
+
 # ragel (dependency for hyperscan)
 RAGEL_DOWNLOAD="http://www.colm.net/files/ragel/ragel-6.10.tar.gz";
 RAGEL_NAME=ragel-6.10.tar.gz
@@ -180,16 +192,16 @@ ODBC_SOURCE=unixODBC-2.3.7
 ODBC_MD5SUM="274a711b0c77394e052db6493840c6f9"
 
 # leveldb
-LEVELDB_DOWNLOAD="https://github.com/google/leveldb/archive/v1.20.tar.gz";
-LEVELDB_NAME=leveldb-1.20.tar.gz
-LEVELDB_SOURCE=leveldb-1.20
-LEVELDB_MD5SUM="298b5bddf12c675d6345784261302252"
+LEVELDB_DOWNLOAD="https://github.com/google/leveldb/archive/refs/tags/1.23.tar.gz";
+LEVELDB_NAME=leveldb-1.23.tar.gz
+LEVELDB_SOURCE=leveldb-1.23
+LEVELDB_MD5SUM="afbde776fb8760312009963f09a586c7"
 
 # brpc
-BRPC_DOWNLOAD="https://github.com/apache/incubator-brpc/archive/refs/tags/1.0.0.tar.gz";
-BRPC_NAME="incubator-brpc-1.0.0.tar.gz"
-BRPC_SOURCE="incubator-brpc-1.0.0"
-BRPC_MD5SUM="73b201192a10107628e3af5ccd643676"
+BRPC_DOWNLOAD="https://github.com/apache/incubator-brpc/archive/refs/tags/1.2.0.tar.gz";
+BRPC_NAME="incubator-brpc-1.2.0.tar.gz"
+BRPC_SOURCE="incubator-brpc-1.2.0"
+BRPC_MD5SUM="556c024d5f770dbd2336ca4541ae8c96"
 
 # rocksdb
 ROCKSDB_DOWNLOAD="https://github.com/facebook/rocksdb/archive/v5.14.2.tar.gz";
@@ -411,65 +423,65 @@ SSE2NEON_NAME=sse2neon-1.5.1.tar.gz
 SSE2NEON_SOURCE=sse2neon-1.5.1
 SSE2NEON_MD5SUM="9de5dc2970aa7efac7faee59e2826c51"
 
-
-
 # all thirdparties which need to be downloaded is set in array TP_ARCHIVES
-export TP_ARCHIVES="LIBEVENT
-OPENSSL
-THRIFT
-PROTOBUF
-GFLAGS
-GLOG
-GTEST
-RAPIDJSON
-SNAPPY
-GPERFTOOLS
-ZLIB
-LZ4
-BZIP
-LZO2
-CURL
-RE2
-HYPERSCAN
-RAGEL
-BOOST
-MYSQL
-ODBC
-LEVELDB
-BRPC
-ROCKSDB
-CYRUS_SASL
-LIBRDKAFKA
-FLATBUFFERS
-ARROW
-BROTLI
-ZSTD
-S2
-BITSHUFFLE
-CROARINGBITMAP
-FMT
-PARALLEL_HASHMAP
-ORC
-JEMALLOC
-CCTZ
-DATATABLES
-BOOTSTRAP_TABLE_JS
-BOOTSTRAP_TABLE_CSS
-TSAN_HEADER
-AWS_SDK
-LZMA
-XML2
-IDN
-GSASL
-KRB5
-HDFS3
-LIBDIVIDE
-PDQSORT
-BENCHMARK
-XSIMD
-SIMDJSON
-NLOHMANN_JSON
-OPENTELEMETRY_PROTO
-OPENTELEMETRY
-LIBBACKTRACE
-SSE2NEON"
+export TP_ARCHIVES=(
+    'LIBEVENT'
+    'OPENSSL'
+    'THRIFT'
+    'PROTOBUF'
+    'GFLAGS'
+    'GLOG'
+    'GTEST'
+    'RAPIDJSON'
+    'SNAPPY'
+    'GPERFTOOLS'
+    'ZLIB'
+    'LZ4'
+    'BZIP'
+    'LZO2'
+    'CURL'
+    'RE2'
+    'HYPERSCAN'
+    'RAGEL'
+    'BOOST'
+    'MYSQL'
+    'ODBC'
+    'LEVELDB'
+    'BRPC'
+    'ROCKSDB'
+    'CYRUS_SASL'
+    'LIBRDKAFKA'
+    'FLATBUFFERS'
+    'ARROW'
+    'BROTLI'
+    'ZSTD'
+    'S2'
+    'BITSHUFFLE'
+    'CROARINGBITMAP'
+    'FMT'
+    'PARALLEL_HASHMAP'
+    'ORC'
+    'JEMALLOC'
+    'CCTZ'
+    'DATATABLES'
+    'BOOTSTRAP_TABLE_JS'
+    'BOOTSTRAP_TABLE_CSS'
+    'TSAN_HEADER'
+    'AWS_SDK'
+    'LZMA'
+    'XML2'
+    'IDN'
+    'GSASL'
+    'KRB5'
+    'HDFS3'
+    'LIBDIVIDE'
+    'PDQSORT'
+    'BENCHMARK'
+    'XSIMD'
+    'SIMDJSON'
+    'NLOHMANN_JSON'
+    'OPENTELEMETRY_PROTO'
+    'OPENTELEMETRY'
+    'LIBBACKTRACE'
+    'SSE2NEON'
+)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to