diff --git a/.editorconfig b/.editorconfig index 740928132a..329f4bba7d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -22,6 +22,6 @@ charset = utf-8 end_of_line = lf insert_final_newline = true -[*.{java,xml,py}] +[*.{java,xml,py,sh}] indent_style = space indent_size = 4 diff --git a/thirdparty/build-thirdparty.sh b/thirdparty/build-thirdparty.sh index fa92259c21..ee20ac5fcf 100755 --- a/thirdparty/build-thirdparty.sh +++ b/thirdparty/build-thirdparty.sh @@ -28,45 +28,61 @@ ################################################################################# set -e -curdir=`dirname "$0"` -curdir=`cd "$curdir"; pwd` +curdir=$(dirname "$0") +curdir=$( + cd "$curdir" + pwd +) export DORIS_HOME=$curdir/.. export TP_DIR=$curdir # Check args usage() { - echo " + echo " Usage: $0 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" -PARALLEL=$[$(nproc)/4+1] -if [[ $# -ne 1 ]] ; then +PARALLEL=$(($(nproc) / 4 + 1)) +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 @@ -83,7 +99,7 @@ echo "Get params: # include custom environment variables 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 @@ -92,29 +108,27 @@ if [[ ! -f ${TP_DIR}/download-thirdparty.sh ]]; then 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 +. "${TP_DIR}/vars.sh" -cd $TP_DIR +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 # toolchain specific warning options and settings -if [[ "$CC" == *gcc ]] -then +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 +elif [[ "$CC" == *clang ]]; then warning_uninitialized=-Wno-uninitialized warning_shadow=-Wno-shadow warning_dangling_gsl=-Wno-dangling-gsl @@ -127,9 +141,11 @@ then libhdfs_cxx17=-std=c++1z fi +KERNEL="$(uname -s)" + # 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 @@ -137,10 +153,10 @@ check_prerequest() { local CMD=$1 local NAME=$2 if ! $CMD; then - echo $NAME is missing + echo "$NAME is missing" exit 1 else - echo $NAME is found + echo "$NAME is found" fi } @@ -165,9 +181,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,19 +205,18 @@ 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 + if [[ ! -d $TP_SOURCE_DIR/$1 ]]; then echo "$TP_SOURCE_DIR/$1 does not exist." exit 1 fi @@ -209,300 +224,329 @@ check_if_source_exist() { } 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 + 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 CPPFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \ - CXXFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \ - LDFLAGS="-L${TP_LIB_DIR}" \ - CFLAGS="-fPIC" \ - ./configure --prefix=$TP_INSTALL_DIR + CXXFLAGS="-I${TP_INCLUDE_DIR} -fPIC" \ + LDFLAGS="-L${TP_LIB_DIR}" \ + CFLAGS="-fPIC" \ + ./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}" + mkdir -p "${BUILD_DIR}" && cd "${BUILD_DIR}" 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 + 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 } 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} + 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}" # 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 + ./configure CPPFLAGS="${cppflags}" LDFLAGS="${ldflags}" 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 + 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 } # 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}" == "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 } # 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}" \ + CFLAGS="-fPIC" \ + ./configure --prefix="${TP_INSTALL_DIR}" --enable-frame-pointers --disable-shared --enable-static + make -j "${PARALLEL}" && make install } # 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 } # 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}" \ + 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 } # 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 + LDFLAGS="-L${TP_LIB_DIR}" \ + CFLAGS="-fPIC" \ + ./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 } # 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 + CFLAGS="-fPIC" \ + 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 + LDFLAGS="-L${TP_LIB_DIR}" \ + CFLAGS="-fPIC" \ + ./configure --prefix="${TP_INSTALL_DIR}" --disable-shared --enable-static + make -j "${PARALLEL}" && make install } # 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}" \ + 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 } # 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} -G "${GENERATOR}" -DBUILD_SHARED_LIBS=0 -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR - ${BUILD_SYSTEM} -j $PARALLEL install + "${CMAKE_CMD}" -G "${GENERATOR}" -DBUILD_SHARED_LIBS=0 -DCMAKE_INSTALL_PREFIX="${TP_INSTALL_DIR}" + "${BUILD_SYSTEM}" -j "${PARALLEL}" install } # hyperscan @@ -519,42 +563,56 @@ build_hyperscan() { 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 .. + -DBOOST_ROOT=$BOOST_SOURCE -DCMAKE_INSTALL_PREFIX=$TP_INSTALL_DIR .. ${BUILD_SYSTEM} -j $PARALLEL install fi } # 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 -fPIC -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 - 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 + if [[ "${KERNEL}" != 'Darwin' ]]; then + cflags='-static -pthread -lrt' + cxxflags='-static -pthread -lrt' + else + cflags='-pthread' + cxxflags='-pthread' + fi + + 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/ @@ -571,470 +629,550 @@ build_mysql() { #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 } # 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 + + LDFLAGS="${ldflags}" \ + "${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 + + remove_all_dylib } # 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="-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="${ldflags}" \ + PORTABLE=1 make USE_RTTI=1 -j "${PARALLEL}" static_lib cp librocksdb.a ../../installed/lib/librocksdb.a cp -r include/rocksdb ../../installed/include/ } # 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}" \ + CFLAGS="-fPIC" \ + ./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}" \ + CFLAGS="-fPIC" \ + ./configure --prefix="${TP_INSTALL_DIR}" --enable-static --enable-sasl --disable-c11threads + make -j "${PARALLEL}" && make install + remove_all_dylib } # 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}" \ + CFLAGS="-fPIC" \ + ./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="-fPIC ${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} + 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 .. + if [[ "${KERNEL}" != 'Darwin' ]]; then + ldflags="-L${TP_LIB_DIR} -static-libstdc++ -static-libgcc" + else + ldflags="-L${TP_LIB_DIR}" + fi - ${BUILD_SYSTEM} -j $PARALLEL && ${BUILD_SYSTEM} install + 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" } # 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 } # 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) + MACHINE_TYPE="$(uname -m)" # Becuase aarch64 don't support avx2, disable it. - if [[ "${MACHINE_TYPE}" == "aarch64" ]]; then + 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} ${arch_flag} -std=c99 "-I${PREFIX}/include/lz4" -O3 -DNDEBUG -fPIC -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 ' ' 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 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 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 ${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" } # 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" + 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} -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 + 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 + "${BUILD_SYSTEM}" -j "${PARALLEL}" && "${BUILD_SYSTEM}" install } #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_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/ + 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 + 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 } # 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 } # 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 } # 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 -fPIC -I${TP_INSTALL_DIR}/include" LDFLAGS="-L${TP_INSTALL_DIR}/lib" \ + ../configure --prefix="${TP_INSTALL_DIR}" --disable-shared --enable-static ${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 + 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 } + # 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 + mkdir -p "${BUILD_DIR}" && cd "${BUILD_DIR}" CXXFLAGS="-O3" \ - CFLAGS="-O3" \ - $CMAKE_CMD .. + CFLAGS="-O3" \ + $CMAKE_CMD .. $CMAKE_CMD --build . - cp $TP_SOURCE_DIR/$SIMDJSON_SOURCE/$BUILD_DIR/libsimdjson.a $TP_INSTALL_DIR/lib64 + 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/ + 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 + 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 + "${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 } # 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 @@ -1091,4 +1229,3 @@ build_libbacktrace build_sse2neon echo "Finished to build all thirdparties" - diff --git a/thirdparty/download-thirdparty.sh b/thirdparty/download-thirdparty.sh index c9d82949a3..bbd5141f93 100755 --- a/thirdparty/download-thirdparty.sh +++ b/thirdparty/download-thirdparty.sh @@ -349,4 +349,12 @@ fi cd - 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} + fi +fi +cd - +echo "Finished patching ${BRPC_SOURCE}" diff --git a/thirdparty/patches/brpc-1.1.0.patch b/thirdparty/patches/brpc-1.1.0.patch new file mode 100644 index 0000000000..fd9a177a70 --- /dev/null +++ b/thirdparty/patches/brpc-1.1.0.patch @@ -0,0 +1,461 @@ +diff --git a/Makefile b/Makefile +index 3538e47c..e2e1a6b2 100644 +--- a/Makefile ++++ b/Makefile +@@ -41,13 +41,15 @@ endif + + #required by butil/crc32.cc to boost performance for 10x + ifeq ($(shell test $(GCC_VERSION) -ge 40400; echo $$?),0) +- CXXFLAGS+=-msse4 -msse4.2 ++ ifeq ($(shell uname -p),i386) #note: i386 is processor family type, not the 32-bit x86 arch ++ CXXFLAGS+=-msse4 -msse4.2 ++ endif + endif + #not solved yet + ifeq ($(CC),gcc) +- ifeq ($(shell test $(GCC_VERSION) -ge 70000; echo $$?),0) +- CXXFLAGS+=-Wno-aligned-new +- endif ++ ifeq ($(shell test $(GCC_VERSION) -ge 70000; echo $$?),0) ++ CXXFLAGS+=-Wno-aligned-new ++ endif + endif + + BUTIL_SOURCES = \ +diff --git a/config_brpc.sh b/config_brpc.sh +index f52911db..842f100f 100755 +--- a/config_brpc.sh ++++ b/config_brpc.sh +@@ -154,16 +154,21 @@ find_dir_of_header_or_die() { + } + + if [ "$SYSTEM" = "Darwin" ]; then +- OPENSSL_LIB="/usr/local/opt/openssl/lib" +- OPENSSL_HDR="/usr/local/opt/openssl/include" +-else +- # User specified path of openssl, if not given it's empty +- OPENSSL_LIB=$(find_dir_of_lib ssl) +- # Inconvenient to check these headers in baidu-internal +- #PTHREAD_HDR=$(find_dir_of_header_or_die pthread.h) +- OPENSSL_HDR=$(find_dir_of_header_or_die openssl/ssl.h mesalink/openssl/ssl.h) ++ if [ -d "/usr/local/opt/openssl" ]; then ++ LIBS_IN="/usr/local/opt/openssl/lib $LIBS_IN" ++ HDRS_IN="/usr/local/opt/openssl/include $HDRS_IN" ++ elif [ -d "/opt/homebrew/Cellar" ]; then ++ LIBS_IN="/opt/homebrew/Cellar $LIBS_IN" ++ HDRS_IN="/opt/homebrew/Cellar $HDRS_IN" ++ fi + fi + ++# User specified path of openssl, if not given it's empty ++OPENSSL_LIB=$(find_dir_of_lib ssl) ++# Inconvenient to check these headers in baidu-internal ++#PTHREAD_HDR=$(find_dir_of_header_or_die pthread.h) ++OPENSSL_HDR=$(find_dir_of_header_or_die openssl/ssl.h mesalink/openssl/ssl.h) ++ + if [ $WITH_MESALINK != 0 ]; then + MESALINK_HDR=$(find_dir_of_header_or_die mesalink/openssl/ssl.h) + OPENSSL_HDR="$OPENSSL_HDR\n$MESALINK_HDR" +diff --git a/docs/cn/getting_started.md b/docs/cn/getting_started.md +index 53ef0f50..b4af85a5 100644 +--- a/docs/cn/getting_started.md ++++ b/docs/cn/getting_started.md +@@ -20,7 +20,7 @@ brpc有如下依赖: + ## Ubuntu/LinuxMint/WSL + ### 依赖准备 + +-安装通用依赖,[gflags](https://github.com/gflags/gflags), [protobuf](https://github.com/google/protobuf), [leveldb](https://github.com/google/leveldb): ++安装依赖: + ```shell + sudo apt-get install -y git g++ make libssl-dev libgflags-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev + ``` +@@ -113,14 +113,9 @@ CentOS一般需要安装EPEL,否则很多包都默认不可用。 + sudo yum install epel-release + ``` + +-安装通用依赖: ++安装依赖: + ```shell +-sudo yum install git gcc-c++ make openssl-devel +-``` +- +-安装 [gflags](https://github.com/gflags/gflags), [protobuf](https://github.com/google/protobuf), [leveldb](https://github.com/google/leveldb): +-```shell +-sudo yum install gflags-devel protobuf-devel protobuf-compiler leveldb-devel ++sudo yum install git gcc-c++ make openssl-devel gflags-devel protobuf-devel protobuf-compiler leveldb-devel + ``` + + 如果你要在样例中启用cpu/heap的profiler: +@@ -216,18 +211,13 @@ $ make + + ## MacOS + +-注意:在相同运行环境下,当前Mac版brpc的性能比Linux版差2.5倍。如果你的服务是性能敏感的,请不要使用MacOs作为你的生产环境。 ++注意:在相同硬件条件下,MacOS版brpc的性能可能明显差于Linux版。如果你的服务是性能敏感的,请不要使用MacOS作为你的生产环境。 + + ### 依赖准备 + +-安装通用依赖: +-```shell +-brew install openssl git gnu-getopt coreutils +-``` +- +-安装[gflags](https://github.com/gflags/gflags),[protobuf](https://github.com/google/protobuf),[leveldb](https://github.com/google/leveldb): ++安装依赖: + ```shell +-brew install gflags protobuf leveldb ++brew install openssl git gnu-getopt coreutils gflags protobuf leveldb + ``` + + 如果你要在样例中启用cpu/heap的profiler: +@@ -241,6 +231,17 @@ git clone https://github.com/google/googletest -b release-1.10.0 && cd googletes + ``` + 在编译完成后,复制include/和lib/目录到/usr/local/include和/usr/local/lib目录中,以便于让所有应用都能使用gtest。 + ++### Monterey ++Monterey中openssl的安装位置可能不再位于`/usr/local/opt/openssl`,很可能会在`/opt/homebrew/Cellar`目录下,如果编译时报告找不到openssl,可考虑设置软链如下: ++```shell ++sudo ln -s /opt/homebrew/Cellar/openssl@3/3.0.3 /usr/local/opt/openssl ++``` ++请注意上述命令中openssl的目录可能随环境变化而变化,你可以通过`brew info openssl`查看。 ++ ++### Apple Silicon ++ ++master HEAD已支持M1系列芯片,M2未测试过。欢迎通过issues向我们报告遗留的warning/error。 ++ + ### 使用config_brpc.sh编译brpc + git克隆brpc,进入到项目目录然后运行: + ```shell +diff --git a/docs/en/getting_started.md b/docs/en/getting_started.md +index 4d24f2d7..03e34cf6 100644 +--- a/docs/en/getting_started.md ++++ b/docs/en/getting_started.md +@@ -215,18 +215,13 @@ Same with [here](#compile-brpc-with-cmake) + + ## MacOS + +-Note: In the same running environment, the performance of the current Mac version is about 2.5 times worse than the Linux version. If your service is performance-critical, do not use MacOS as your production environment. ++Note: With same environment, the performance of the MacOS version is worse than the Linux version. If your service is performance-critical, do not use MacOS as your production environment. + + ### Prepare deps + +-Install common deps: ++Install dependencies: + ```shell +-brew install openssl git gnu-getopt coreutils +-``` +- +-Install [gflags](https://github.com/gflags/gflags), [protobuf](https://github.com/google/protobuf), [leveldb](https://github.com/google/leveldb): +-```shell +-brew install gflags protobuf leveldb ++brew install openssl git gnu-getopt coreutils gflags protobuf leveldb + ``` + + If you need to enable cpu/heap profilers in examples: +@@ -240,6 +235,20 @@ git clone https://github.com/google/googletest -b release-1.10.0 && cd googletes + ``` + After the compilation, copy include/ and lib/ into /usr/local/include and /usr/local/lib respectively to expose gtest to all apps + ++### Monterey ++ ++openssl installed in Monterey may not be found at `/usr/local/opt/openssl`, instead it's probably put under `/opt/homebrew/Cellar`. If the compiler cannot find openssl, consider making a soft link like below: ++ ++```shell ++sudo ln -s /opt/homebrew/Cellar/openssl@3/3.0.3 /usr/local/opt/openssl ++``` ++ ++Please note that the directory of installed openssl in above command may be different in different environments, you could check it out by running `brew info openssl`. ++ ++### Apple Silicon ++ ++The code at master HEAD already supports M1 series chips. M2 series are not tested yet. Please feel free to report remaining warnings/errors to us by issues. ++ + ### Compile brpc with config_brpc.sh + git clone brpc, cd into the repo and run + ```shell +diff --git a/src/brpc/span.h b/src/brpc/span.h +index 07771649..43ede3d5 100644 +--- a/src/brpc/span.h ++++ b/src/brpc/span.h +@@ -34,7 +34,7 @@ + #include "brpc/span.pb.h" + + namespace bthread { +-extern thread_local bthread::LocalStorage tls_bls; ++extern __thread bthread::LocalStorage tls_bls; + } + + +diff --git a/src/bthread/context.cpp b/src/bthread/context.cpp +index 5098bc39..b89d432a 100644 +--- a/src/bthread/context.cpp ++++ b/src/bthread/context.cpp +@@ -713,3 +713,100 @@ __asm ( + ); + + #endif ++ ++ ++#if defined(BTHREAD_CONTEXT_PLATFORM_apple_arm64) && defined(BTHREAD_CONTEXT_COMPILER_gcc) ++__asm ( ++".text\n" ++".globl _bthread_jump_fcontext\n" ++".balign 16\n" ++"_bthread_jump_fcontext:\n" ++" ; prepare stack for GP + FPU\n" ++" sub sp, sp, #0xb0\n" ++"#if (defined(__VFP_FP__) && !defined(__SOFTFP__))\n" ++" ; test if fpu env should be preserved\n" ++" cmp w3, #0\n" ++" b.eq 1f\n" ++" ; save d8 - d15\n" ++" stp d8, d9, [sp, #0x00]\n" ++" stp d10, d11, [sp, #0x10]\n" ++" stp d12, d13, [sp, #0x20]\n" ++" stp d14, d15, [sp, #0x30]\n" ++"1:\n" ++"#endif\n" ++" ; save x19-x30\n" ++" stp x19, x20, [sp, #0x40]\n" ++" stp x21, x22, [sp, #0x50]\n" ++" stp x23, x24, [sp, #0x60]\n" ++" stp x25, x26, [sp, #0x70]\n" ++" stp x27, x28, [sp, #0x80]\n" ++" stp fp, lr, [sp, #0x90]\n" ++" ; save LR as PC\n" ++" str lr, [sp, #0xa0]\n" ++" ; store RSP (pointing to context-data) in first argument (x0).\n" ++" ; STR cannot have sp as a target register\n" ++" mov x4, sp\n" ++" str x4, [x0]\n" ++" ; restore RSP (pointing to context-data) from A2 (x1)\n" ++" mov sp, x1\n" ++"#if (defined(__VFP_FP__) && !defined(__SOFTFP__))\n" ++" ; test if fpu env should be preserved\n" ++" cmp w3, #0\n" ++" b.eq 2f\n" ++" ; load d8 - d15\n" ++" ldp d8, d9, [sp, #0x00]\n" ++" ldp d10, d11, [sp, #0x10]\n" ++" ldp d12, d13, [sp, #0x20]\n" ++" ldp d14, d15, [sp, #0x30]\n" ++"2:\n" ++"#endif\n" ++" ; load x19-x30\n" ++" ldp x19, x20, [sp, #0x40]\n" ++" ldp x21, x22, [sp, #0x50]\n" ++" ldp x23, x24, [sp, #0x60]\n" ++" ldp x25, x26, [sp, #0x70]\n" ++" ldp x27, x28, [sp, #0x80]\n" ++" ldp fp, lr, [sp, #0x90]\n" ++" ; use third arg as return value after jump\n" ++" ; and as first arg in context function\n" ++" mov x0, x2\n" ++" ; load pc\n" ++" ldr x4, [sp, #0xa0]\n" ++" ; restore stack from GP + FPU\n" ++" add sp, sp, #0xb0\n" ++" ret x4\n" ++); ++ ++#endif ++ ++#if defined(BTHREAD_CONTEXT_PLATFORM_apple_arm64) && defined(BTHREAD_CONTEXT_COMPILER_gcc) ++__asm ( ++".text\n" ++".globl _bthread_make_fcontext\n" ++".balign 16\n" ++"_bthread_make_fcontext:\n" ++" ; shift address in x0 (allocated stack) to lower 16 byte boundary\n" ++" and x0, x0, ~0xF\n" ++" ; reserve space for context-data on context-stack\n" ++" sub x0, x0, #0xb0\n" ++" ; third arg of make_fcontext() == address of context-function\n" ++" ; store address as a PC to jump in\n" ++" str x2, [x0, #0xa0]\n" ++" ; compute abs address of label finish\n" ++" ; 0x0c = 3 instructions * size (4) before label 'finish'\n" ++" ; TODO: Numeric offset since llvm still does not support labels in ADR. Fix:\n" ++" ; http:\n" ++" adr x1, 0x0c\n" ++" ; save address of finish as return-address for context-function\n" ++" ; will be entered after context-function returns (LR register)\n" ++" str x1, [x0, #0x98]\n" ++" ret lr ; return pointer to context-data (x0)\n" ++"finish:\n" ++" ; exit code is zero\n" ++" mov x0, #0\n" ++" ; exit application\n" ++" bl __exit\n" ++); ++ ++#endif ++ +diff --git a/src/bthread/context.h b/src/bthread/context.h +index 8ff027df..ef98e458 100644 +--- a/src/bthread/context.h ++++ b/src/bthread/context.h +@@ -23,9 +23,9 @@ + + #if defined(__GNUC__) || defined(__APPLE__) + +- #define BTHREAD_CONTEXT_COMPILER_gcc ++ #define BTHREAD_CONTEXT_COMPILER_gcc + +- #if defined(__linux__) ++ #if defined(__linux__) + #ifdef __x86_64__ + #define BTHREAD_CONTEXT_PLATFORM_linux_x86_64 + #define BTHREAD_CONTEXT_CALL_CONVENTION +@@ -41,27 +41,30 @@ + #define BTHREAD_CONTEXT_CALL_CONVENTION + #endif + +- #elif defined(__MINGW32__) || defined (__MINGW64__) ++ #elif defined(__MINGW32__) || defined (__MINGW64__) + #if defined(__x86_64__) + #define BTHREAD_CONTEXT_COMPILER_gcc + #define BTHREAD_CONTEXT_PLATFORM_windows_x86_64 + #define BTHREAD_CONTEXT_CALL_CONVENTION +- #endif +- +- #if defined(__i386__) ++ #elif defined(__i386__) + #define BTHREAD_CONTEXT_COMPILER_gcc + #define BTHREAD_CONTEXT_PLATFORM_windows_i386 + #define BTHREAD_CONTEXT_CALL_CONVENTION __cdecl + #endif +- #elif defined(__APPLE__) && defined(__MACH__) ++ ++ #elif defined(__APPLE__) && defined(__MACH__) + #if defined (__i386__) + #define BTHREAD_CONTEXT_PLATFORM_apple_i386 + #define BTHREAD_CONTEXT_CALL_CONVENTION + #elif defined (__x86_64__) + #define BTHREAD_CONTEXT_PLATFORM_apple_x86_64 + #define BTHREAD_CONTEXT_CALL_CONVENTION +- #endif ++ #elif defined (__aarch64__) ++ #define BTHREAD_CONTEXT_PLATFORM_apple_arm64 ++ #define BTHREAD_CONTEXT_CALL_CONVENTION + #endif ++ #endif ++ + #endif + + #if defined(_WIN32_WCE) +diff --git a/src/bthread/key.cpp b/src/bthread/key.cpp +index 53f7594f..a4a08407 100644 +--- a/src/bthread/key.cpp ++++ b/src/bthread/key.cpp +@@ -34,7 +34,7 @@ class KeyTable; + + // defined in task_group.cpp + extern __thread TaskGroup* tls_task_group; +-extern thread_local LocalStorage tls_bls; ++extern __thread LocalStorage tls_bls; + static __thread bool tls_ever_created_keytable = false; + + // We keep thread specific data in a two-level array. The top-level array +diff --git a/src/bthread/task_group.cpp b/src/bthread/task_group.cpp +index 9f6d42fb..b8ead163 100644 +--- a/src/bthread/task_group.cpp ++++ b/src/bthread/task_group.cpp +@@ -61,7 +61,7 @@ __thread TaskGroup* tls_task_group = NULL; + // Sync with TaskMeta::local_storage when a bthread is created or destroyed. + // During running, the two fields may be inconsistent, use tls_bls as the + // groundtruth. +-thread_local LocalStorage tls_bls = BTHREAD_LOCAL_STORAGE_INITIALIZER; ++__thread LocalStorage tls_bls = BTHREAD_LOCAL_STORAGE_INITIALIZER; + + // defined in bthread/key.cpp + extern void return_keytable(bthread_keytable_pool_t*, KeyTable*); +diff --git a/src/butil/time.h b/src/butil/time.h +index b288d8e4..00949f8e 100644 +--- a/src/butil/time.h ++++ b/src/butil/time.h +@@ -215,6 +215,7 @@ inline int64_t monotonic_time_s() { + + namespace detail { + inline uint64_t clock_cycles() { ++#if defined(__x86_64__) || defined(__amd64__) + unsigned int lo = 0; + unsigned int hi = 0; + // We cannot use "=A", since this would use %rax on x86_64 +@@ -223,6 +224,31 @@ inline uint64_t clock_cycles() { + : "=a" (lo), "=d" (hi) + ); + return ((uint64_t)hi << 32) | lo; ++#elif defined(__aarch64__) ++ uint64_t virtual_timer_value; ++ asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value)); ++ return virtual_timer_value; ++#elif defined(__ARM_ARCH) ++ #if (__ARM_ARCH >= 6) ++ unsigned int pmccntr; ++ unsigned int pmuseren; ++ unsigned int pmcntenset; ++ // Read the user mode perf monitor counter access permissions. ++ asm volatile ("mrc p15, 0, %0, c9, c14, 0" : "=r" (pmuseren)); ++ if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. ++ asm volatile ("mrc p15, 0, %0, c9, c12, 1" : "=r" (pmcntenset)); ++ if (pmcntenset & 0x80000000ul) { // Is it counting? ++ asm volatile ("mrc p15, 0, %0, c9, c13, 0" : "=r" (pmccntr)); ++ // The counter is set up to count every 64th cycle ++ return static_cast(pmccntr) * 64; // Should optimize to << 6 ++ } ++ } ++ #else ++ #error "unsupported arm_arch" ++ #endif ++#else ++ #error "unsupported arch" ++#endif + } + extern int64_t read_invariant_cpu_frequency(); + // Be positive iff: +diff --git a/test/BUILD b/test/BUILD.bazel +similarity index 100% +rename from test/BUILD +rename to test/BUILD.bazel +diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt +index 7c274ef5..f3e0c9bb 100644 +--- a/test/CMakeLists.txt ++++ b/test/CMakeLists.txt +@@ -58,7 +58,7 @@ use_cxx11() + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + #required by butil/crc32.cc to boost performance for 10x +- if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4)) ++ if((CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4)) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4 -msse4.2") + endif() + if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)) +diff --git a/test/Makefile b/test/Makefile +index a6e035f4..99f7b4f7 100644 +--- a/test/Makefile ++++ b/test/Makefile +@@ -23,7 +23,9 @@ CXXFLAGS=$(CPPFLAGS) -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-invalid-offseto + + #required by butil/crc32.cc to boost performance for 10x + ifeq ($(shell test $(GCC_VERSION) -ge 40400; echo $$?),0) +- CXXFLAGS+=-msse4 -msse4.2 ++ ifeq ($(shell uname -p),i386) #note: i386 is processor family type, not the 32-bit x86 arch ++ CXXFLAGS+=-msse4 -msse4.2 ++ endif + endif + #not solved yet + ifeq ($(CC),gcc) +diff --git a/test/endpoint_unittest.cpp b/test/endpoint_unittest.cpp +index ba9a4ee6..8b515ef3 100644 +--- a/test/endpoint_unittest.cpp ++++ b/test/endpoint_unittest.cpp +@@ -384,6 +384,8 @@ TEST(EndPointTest, endpoint_sockaddr_conv_ipv6) { + in6_addr expect_in6_addr; + bzero(&expect_in6_addr, sizeof(expect_in6_addr)); + expect_in6_addr.__in6_u.__u6_addr8[15] = 1; ++ // jge: mac monterey上应该这样,但准确判定条件不明 ++ //expect_in6_addr.__u6_addr.__u6_addr8[15] = 1; + + sockaddr_storage ss; + const sockaddr_in6* sa6 = (sockaddr_in6*) &ss; diff --git a/thirdparty/vars.sh b/thirdparty/vars.sh index 9c344bcdde..14ba7ff033 100644 --- a/thirdparty/vars.sh +++ b/thirdparty/vars.sh @@ -180,16 +180,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.1.0.tar.gz" +BRPC_NAME="incubator-brpc-1.1.0.tar.gz" +BRPC_SOURCE="incubator-brpc-1.1.0" +BRPC_MD5SUM="e1439fd70e37a2bcffcf05b2526cacdd" # rocksdb ROCKSDB_DOWNLOAD="https://github.com/facebook/rocksdb/archive/v5.14.2.tar.gz" @@ -411,8 +411,6 @@ 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