#!/usr/bin/env sh # 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 regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. BOLD='\033[1m' GREEN='\033[0;32m' YELLOW='\033[0;33m' CYAN='\033[0;36m' NC='\033[0m' # No Color print_info() { printf "${CYAN}[INFO]${NC} %s\n" "$1" } print_success() { printf "${GREEN}[OK]${NC} %s\n" "$1" } print_step() { printf "${BOLD}==> %s${NC}\n" "$1" } SYSTEM=$(uname -s) if [ "$SYSTEM" = "Darwin" ]; then if [ -z "$BASH" ] || [ "$BASH" = "/bin/sh" ] ; then ECHO=echo else ECHO='echo -e' fi SO=dylib LDD="otool -L" if [ "$(getopt -V)" = " --" ]; then >&2 $ECHO "gnu-getopt must be installed and used" exit 1 fi else if [ -z "$BASH" ]; then ECHO=echo else ECHO='echo -e' fi SO=so LDD=ldd fi TEMP=`getopt -o v: --long headers:,libs:,cc:,cxx:,with-glog,with-thrift,with-rdma,with-mesalink,with-bthread-tracer,with-debug-bthread-sche-safety,with-debug-lock,with-asan,with-riscv-zvbc,with-riscv-zbc,nodebugsymbols,werror -n 'config_brpc' -- "$@"` WITH_GLOG=0 WITH_THRIFT=0 WITH_RDMA=0 WITH_MESALINK=0 WITH_BTHREAD_TRACER=0 WITH_ASAN=0 WITH_RISCV_ZVBC=0 WITH_RISCV_ZBC=0 BRPC_DEBUG_BTHREAD_SCHE_SAFETY=0 DEBUGSYMBOLS=-g WERROR= BRPC_DEBUG_LOCK=0 if [ $? != 0 ] ; then >&2 $ECHO "Terminating..."; exit 1 ; fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" if [ "$SYSTEM" = "Darwin" ]; then REALPATH=realpath else REALPATH="readlink -f" fi # Convert to abspath always so that generated mk is include-able from everywhere while true; do case "$1" in --headers ) HDRS_IN="$(${REALPATH} $2)"; shift 2 ;; --libs ) LIBS_IN="$(${REALPATH} $2)"; shift 2 ;; --cc ) CC=$2; shift 2 ;; --cxx ) CXX=$2; shift 2 ;; --with-glog ) WITH_GLOG=1; shift 1 ;; --with-thrift) WITH_THRIFT=1; shift 1 ;; --with-rdma) WITH_RDMA=1; shift 1 ;; --with-mesalink) WITH_MESALINK=1; shift 1 ;; --with-bthread-tracer) WITH_BTHREAD_TRACER=1; shift 1 ;; --with-debug-bthread-sche-safety ) BRPC_DEBUG_BTHREAD_SCHE_SAFETY=1; shift 1 ;; --with-debug-lock ) BRPC_DEBUG_LOCK=1; shift 1 ;; --with-asan) WITH_ASAN=1; shift 1 ;; --with-riscv-zvbc) WITH_RISCV_ZVBC=1; shift 1 ;; --with-riscv-zbc) WITH_RISCV_ZBC=1; shift 1 ;; --nodebugsymbols ) DEBUGSYMBOLS=; shift 1 ;; --werror ) WERROR=-Werror; shift 1 ;; -- ) shift; break ;; * ) break ;; esac done print_step "Configuring brpc (${SYSTEM})" print_info "Headers path: ${HDRS_IN}" print_info "Libs path: ${LIBS_IN}" if [ -z "$CC" ]; then if [ ! -z "$CXX" ]; then >&2 $ECHO "--cc and --cxx must be both set or unset" exit 1 fi CC=gcc CXX=g++ if [ "$SYSTEM" = "Darwin" ]; then CC=clang CXX=clang++ fi elif [ -z "$CXX" ]; then >&2 $ECHO "--cc and --cxx must be both set or unset" exit 1 fi print_info "CC=$CC, CXX=$CXX" GCC_VERSION=$(CXX=$CXX tools/print_gcc_version.sh) if [ $GCC_VERSION -gt 0 ] && [ $GCC_VERSION -lt 40800 ]; then >&2 $ECHO "GCC is too old, please install a newer version supporting C++11" exit 1 fi if [ -z "$HDRS_IN" ] || [ -z "$LIBS_IN" ]; then >&2 $ECHO "config_brpc: --headers=HDRPATHS --libs=LIBPATHS must be specified" exit 1 fi find_dir_of_lib() { local lib=$(find ${LIBS_IN} -name "lib${1}.a" -o -name "lib${1}.$SO" 2>/dev/null | head -n1) if [ ! -z "$lib" ]; then dirname $lib fi } find_dir_of_lib_or_die() { local dir=$(find_dir_of_lib $1) if [ -z "$dir" ]; then >&2 $ECHO "Fail to find $1 from --libs" exit 1 else $ECHO $dir fi } find_bin() { TARGET_BIN=$(find -L ${LIBS_IN} -type f -name "$1" 2>/dev/null | head -n1) if [ ! -z "$TARGET_BIN" ]; then $ECHO $TARGET_BIN else which "$1" 2>/dev/null fi } find_bin_or_die() { TARGET_BIN=$(find_bin "$1") if [ ! -z "$TARGET_BIN" ]; then $ECHO $TARGET_BIN else >&2 $ECHO "Fail to find $1" exit 1 fi } find_dir_of_header() { find -L ${HDRS_IN} -path "*/$1" | head -n1 | sed "s|$1||g" } find_dir_of_header_excluding() { find -L ${HDRS_IN} -path "*/$1" | grep -v "$2\$" | head -n1 | sed "s|$1||g" } find_dir_of_header_or_die() { if [ -z "$2" ]; then local dir=$(find_dir_of_header $1) else local dir=$(find_dir_of_header_excluding $1 $2) fi if [ -z "$dir" ]; then >&2 $ECHO "Fail to find $1 from --headers" exit 1 fi $ECHO $dir } if [ "$SYSTEM" = "Darwin" ]; then 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 print_step "Checking dependencies" # 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) print_success "Found openssl: lib=${OPENSSL_LIB:-system}, hdr=${OPENSSL_HDR}" if [ $WITH_MESALINK != 0 ]; then MESALINK_HDR=$(find_dir_of_header_or_die mesalink/openssl/ssl.h) OPENSSL_HDR="$OPENSSL_HDR\n$MESALINK_HDR" fi STATIC_LINKINGS= DYNAMIC_LINKINGS="-lpthread -lssl -lcrypto -ldl -lz" if [ $WITH_MESALINK != 0 ]; then DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lmesalink" fi if [ "$SYSTEM" = "Linux" ]; then DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lrt" fi if [ "$SYSTEM" = "Darwin" ]; then DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreFoundation" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreGraphics" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreData" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreText" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework Security" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework Foundation" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_MallocExtension_ReleaseFreeMemory" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_ProfilerStart" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_ProfilerStop" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,__Z13GetStackTracePPvii" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_RegisterThriftProtocol" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_mallctl" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_malloc_stats_print" fi append_linking() { if [ -f $1/lib${2}.a ]; then if [ "$SYSTEM" = "Darwin" ]; then # *.a must be explicitly specified in clang STATIC_LINKINGS="$STATIC_LINKINGS $1/lib${2}.a" else STATIC_LINKINGS="$STATIC_LINKINGS -l$2" fi export STATICALLY_LINKED_$2=1 else DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -l$2" export STATICALLY_LINKED_$2=0 fi } GFLAGS_LIB=$(find_dir_of_lib_or_die gflags) append_linking $GFLAGS_LIB gflags print_success "Found gflags: $GFLAGS_LIB" PROTOBUF_LIB=$(find_dir_of_lib_or_die protobuf) append_linking $PROTOBUF_LIB protobuf print_success "Found protobuf: $PROTOBUF_LIB" LEVELDB_LIB=$(find_dir_of_lib_or_die leveldb) print_success "Found leveldb: $LEVELDB_LIB" # required by leveldb if [ -f $LEVELDB_LIB/libleveldb.a ]; then if [ -f $LEVELDB_LIB/libleveldb.$SO ]; then if $LDD $LEVELDB_LIB/libleveldb.$SO | grep -q libsnappy; then SNAPPY_LIB=$(find_dir_of_lib snappy) REQUIRE_SNAPPY="yes" fi fi if [ -z "$REQUIRE_SNAPPY" ]; then if [ "$SYSTEM" = "Darwin" ]; then STATIC_LINKINGS="$STATIC_LINKINGS $LEVELDB_LIB/libleveldb.a" else STATIC_LINKINGS="$STATIC_LINKINGS -lleveldb" fi elif [ -f $SNAPPY_LIB/libsnappy.a ]; then if [ "$SYSTEM" = "Darwin" ]; then STATIC_LINKINGS="$STATIC_LINKINGS $LEVELDB_LIB/libleveldb.a $SNAPPY_LIB/libsnappy.a" else STATIC_LINKINGS="$STATIC_LINKINGS -lleveldb -lsnappy" fi else DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lleveldb" fi else DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lleveldb" fi PROTOC=$(find_bin_or_die protoc) print_success "Found protoc: $PROTOC" GFLAGS_HDR=$(find_dir_of_header_or_die gflags/gflags.h) PROTOBUF_HDR=$(find_dir_of_header_or_die google/protobuf/message.h) PROTOBUF_VERSION=$(grep '#define GOOGLE_PROTOBUF_VERSION [0-9]\+' $PROTOBUF_HDR/google/protobuf/stubs/common.h | awk '{print $3}') if [ "$PROTOBUF_VERSION" -ge 4022000 ]; then # from v22, utf8_validity should be explicitly linked # https://github.com/protocolbuffers/protobuf/blob/a847a8dc4ba1d99e7ba917146c84438b4de7d085/cmake/libprotobuf.cmake#L47 UTF8_VALIDITY_LIB=$(find_dir_of_lib utf8_validity) append_linking "$UTF8_VALIDITY_LIB" utf8_validity ABSL_HDR=$(find_dir_of_header_or_die absl/base/config.h) ABSL_LIB=$(find_dir_of_lib_or_die absl_strings) ABSL_TARGET_NAMES=" absl_bad_optional_access absl_bad_variant_access absl_base absl_city absl_civil_time absl_cord absl_cord_internal absl_cordz_functions absl_cordz_handle absl_cordz_info absl_crc32c absl_crc_cord_state absl_crc_cpu_detect absl_crc_internal absl_debugging_internal absl_demangle_internal absl_die_if_null absl_examine_stack absl_exponential_biased absl_flags absl_flags_commandlineflag absl_flags_commandlineflag_internal absl_flags_config absl_flags_internal absl_flags_marshalling absl_flags_private_handle_accessor absl_flags_program_name absl_flags_reflection absl_graphcycles_internal absl_hash absl_hashtablez_sampler absl_int128 absl_kernel_timeout_internal absl_leak_check absl_log_entry absl_log_globals absl_log_initialize absl_log_internal_check_op absl_log_internal_conditions absl_log_internal_format absl_log_internal_globals absl_log_internal_log_sink_set absl_log_internal_message absl_log_internal_nullguard absl_log_internal_proto absl_log_severity absl_log_sink absl_low_level_hash absl_malloc_internal absl_raw_hash_set absl_raw_logging_internal absl_spinlock_wait absl_stacktrace absl_status absl_statusor absl_str_format_internal absl_strerror absl_string_view absl_strings absl_strings_internal absl_symbolize absl_synchronization absl_throw_delegate absl_time absl_time_zone " for i in $ABSL_TARGET_NAMES; do # ignore interface targets if [ -n "$(find_dir_of_lib $i)" ]; then append_linking "$ABSL_LIB" "$i" fi done CXXFLAGS="-std=c++17" print_success "Found protobuf version $PROTOBUF_VERSION (>= v22, using C++17 with abseil)" else CXXFLAGS="-std=c++0x" print_success "Found protobuf version $PROTOBUF_VERSION" fi CPPFLAGS= if [ $WITH_ASAN != 0 ]; then CPPFLAGS="${CPPFLAGS} -fsanitize=address" DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -fsanitize=address" fi LEVELDB_HDR=$(find_dir_of_header_or_die leveldb/db.h) if [ $WITH_BTHREAD_TRACER != 0 ]; then if [ "$SYSTEM" != "Linux" ] || [ "$(uname -m)" != "x86_64" ]; then >&2 $ECHO "bthread tracer is only supported on Linux x86_64 platform" exit 1 fi LIBUNWIND_HDR=$(find_dir_of_header_or_die libunwind.h) LIBUNWIND_LIB=$(find_dir_of_lib_or_die unwind) ABSL_HDR=$(find_dir_of_header_or_die absl/base/config.h) ABSL_LIB=$(find_dir_of_lib_or_die absl_symbolize) CPPFLAGS="${CPPFLAGS} -DBRPC_BTHREAD_TRACER" if [ -f "$LIBUNWIND_LIB/libunwind.$SO" ]; then DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lunwind -lunwind-x86_64" else STATIC_LINKINGS="$STATIC_LINKINGS -lunwind -lunwind-x86_64" fi if [ -f "$ABSL_LIB/libabsl_base.$SO" ]; then DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_base" else STATIC_LINKINGS="$STATIC_LINKINGS -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_base" fi fi HDRS=$($ECHO "$LIBUNWIND_HDR\n$GFLAGS_HDR\n$PROTOBUF_HDR\n$ABSL_HDR\n$LEVELDB_HDR\n$OPENSSL_HDR" | sort | uniq) LIBS=$($ECHO "$LIBUNWIND_LIB\n$GFLAGS_LIB\n$PROTOBUF_LIB\n$ABSL_LIB\n$LEVELDB_LIB\n$OPENSSL_LIB\n$SNAPPY_LIB" | sort | uniq) absent_in_the_list() { TMP=`$ECHO "$1\n$2" | sort | uniq` if [ "${TMP}" = "$2" ]; then return 1 fi return 0 } OUTPUT_CONTENT="# Generated by config_brpc.sh, don't modify manually" append_to_output() { OUTPUT_CONTENT="${OUTPUT_CONTENT}\n$*" } # $1: libname, $2: indentation append_to_output_headers() { if absent_in_the_list "$1" "$HDRS"; then append_to_output "${2}HDRS+=$1" HDRS=`$ECHO "${HDRS}\n$1" | sort | uniq` fi } # $1: libname, $2: indentation append_to_output_libs() { if absent_in_the_list "$1" "$LIBS"; then append_to_output "${2}LIBS+=$1" LIBS=`$ECHO "${LIBS}\n$1" | sort | uniq` fi } # $1: libdir, $2: libname, $3: indentation append_to_output_linkings() { if [ -f $1/lib$2.a ]; then append_to_output_libs $1 $3 if [ "$SYSTEM" = "Darwin" ]; then append_to_output "${3}STATIC_LINKINGS+=$1/lib$2.a" else append_to_output "${3}STATIC_LINKINGS+=-l$2" fi export STATICALLY_LINKED_$2=1 else append_to_output_libs $1 $3 append_to_output "${3}DYNAMIC_LINKINGS+=-l$2" export STATICALLY_LINKED_$2=0 fi } #can't use \n in texts because sh does not support -e append_to_output "SYSTEM=$SYSTEM" append_to_output "HDRS=$($ECHO $HDRS)" append_to_output "LIBS=$($ECHO $LIBS)" append_to_output "PROTOC=$PROTOC" append_to_output "PROTOBUF_HDR=$PROTOBUF_HDR" append_to_output "CC=$CC" append_to_output "CXX=$CXX" append_to_output "GCC_VERSION=$GCC_VERSION" append_to_output "STATIC_LINKINGS=$STATIC_LINKINGS" append_to_output "DYNAMIC_LINKINGS=$DYNAMIC_LINKINGS" # CPP means C PreProcessing, not C PlusPlus CPPFLAGS="${CPPFLAGS} -DBRPC_WITH_GLOG=$WITH_GLOG -DBRPC_DEBUG_BTHREAD_SCHE_SAFETY=$BRPC_DEBUG_BTHREAD_SCHE_SAFETY -DBRPC_DEBUG_LOCK=$BRPC_DEBUG_LOCK" # Avoid over-optimizations of TLS variables by GCC>=4.8 # See: https://github.com/apache/brpc/issues/1693 CPPFLAGS="${CPPFLAGS} -D__const__=__unused__" if [ ! -z "$DEBUGSYMBOLS" ]; then CPPFLAGS="${CPPFLAGS} $DEBUGSYMBOLS" fi if [ ! -z "$WERROR" ]; then CPPFLAGS="${CPPFLAGS} $WERROR" fi if [ "$SYSTEM" = "Darwin" ]; then CPPFLAGS="${CPPFLAGS} -Wno-deprecated-declarations -Wno-inconsistent-missing-override" version=`sw_vers -productVersion | awk -F '.' '{print $1 "." $2}'` if [[ `echo "$version<10.12" | bc -l` == 1 ]]; then CPPFLAGS="${CPPFLAGS} -DNO_CLOCK_GETTIME_IN_MAC" fi fi if [ $WITH_THRIFT != 0 ]; then THRIFT_LIB=$(find_dir_of_lib_or_die thriftnb) THRIFT_HDR=$(find_dir_of_header_or_die thrift/Thrift.h) append_to_output_libs "$THRIFT_LIB" append_to_output_headers "$THRIFT_HDR" CPPFLAGS="${CPPFLAGS} -DENABLE_THRIFT_FRAMED_PROTOCOL" if [ -f "$THRIFT_LIB/libthriftnb.$SO" ]; then append_to_output "DYNAMIC_LINKINGS+=-lthriftnb -levent -lthrift" else append_to_output "STATIC_LINKINGS+=-lthriftnb" fi # get thrift version thrift_version=$(thrift --version | awk '{print $3}') major=$(echo "$thrift_version" | awk -F '.' '{print $1}') minor=$(echo "$thrift_version" | awk -F '.' '{print $2}') if [ $((major)) -eq 0 -a $((minor)) -lt 11 ]; then CPPFLAGS="${CPPFLAGS} -D_THRIFT_VERSION_LOWER_THAN_0_11_0_" echo "less" else echo "greater" fi fi if [ $WITH_RDMA != 0 ]; then RDMA_LIB=$(find_dir_of_lib_or_die ibverbs) RDMA_HDR=$(find_dir_of_header_or_die infiniband/verbs.h) append_to_output_libs "$RDMA_LIB" append_to_output_headers "$RDMA_HDR" CPPFLAGS="${CPPFLAGS} -DBRPC_WITH_RDMA" append_to_output "DYNAMIC_LINKINGS+=-libverbs" append_to_output "WITH_RDMA=1" fi if [ $WITH_MESALINK != 0 ]; then CPPFLAGS="${CPPFLAGS} -DUSE_MESALINK" fi append_to_output "CPPFLAGS=${CPPFLAGS}" append_to_output "# without the flag, linux+arm64 may crash due to folding on TLS. ifeq (\$(CC),gcc) ifeq (\$(shell uname -p),aarch64) CPPFLAGS+=-fno-gcse endif endif " # RISC-V Zvbc/Zbc support if [ "$(uname -m)" = "riscv64" ]; then if [ $WITH_RISCV_ZVBC != 0 ]; then CXXFLAGS="${CXXFLAGS} -march=rv64gcv_zbc_zvbc" print_success "RISC-V Zvbc enabled: -march=rv64gcv_zbc_zvbc" elif [ $WITH_RISCV_ZBC != 0 ]; then CXXFLAGS="${CXXFLAGS} -march=rv64gc_zbc" print_success "RISC-V Zbc enabled: -march=rv64gc_zbc" fi fi append_to_output "CXXFLAGS=${CXXFLAGS}" append_to_output "ifeq (\$(NEED_LIBPROTOC), 1)" PROTOC_LIB=$(find $PROTOBUF_LIB -name "libprotoc.*" | head -n1) if [ -z "$PROTOC_LIB" ]; then append_to_output " \$(error \"Fail to find libprotoc\")" else # libprotobuf and libprotoc must be linked same statically or dynamically # otherwise the bin will crash. if [ $STATICALLY_LINKED_protobuf -gt 0 ]; then if [ "$SYSTEM" = "Darwin" ]; then append_to_output " STATIC_LINKINGS+=$(find $PROTOBUF_LIB -name "libprotoc.a" | head -n1)" else append_to_output " STATIC_LINKINGS+=-lprotoc" fi else append_to_output " DYNAMIC_LINKINGS+=-lprotoc" fi fi append_to_output "endif" OLD_HDRS=$HDRS OLD_LIBS=$LIBS append_to_output "ifeq (\$(NEED_GPERFTOOLS), 1)" # required by cpu/heap profiler TCMALLOC_LIB=$(find_dir_of_lib tcmalloc_and_profiler) if [ -z "$TCMALLOC_LIB" ]; then append_to_output " \$(error \"Fail to find gperftools\")" elif [ $WITH_ASAN != 0 ]; then append_to_output " \$(error \"gperftools is not compatible with ASAN\")" else append_to_output " CPPFLAGS+=-DBRPC_ENABLE_CPU_PROFILER" append_to_output_libs "$TCMALLOC_LIB" " " if [ -f $TCMALLOC_LIB/libtcmalloc.$SO ]; then append_to_output " DYNAMIC_LINKINGS+=-ltcmalloc_and_profiler" else if [ "$SYSTEM" = "Darwin" ]; then append_to_output " STATIC_LINKINGS+=$TCMALLOC_LIB/libtcmalloc.a" else append_to_output " STATIC_LINKINGS+=-ltcmalloc_and_profiler" fi fi fi append_to_output "endif" if [ $WITH_GLOG != 0 ]; then GLOG_LIB=$(find_dir_of_lib_or_die glog) GLOG_HDR=$(find_dir_of_header_or_die glog/logging.h windows/glog/logging.h) append_to_output_libs "$GLOG_LIB" append_to_output_headers "$GLOG_HDR" if [ -f "$GLOG_LIB/libglog.$SO" ]; then append_to_output "DYNAMIC_LINKINGS+=-lglog" else if [ "$SYSTEM" = "Darwin" ]; then append_to_output "STATIC_LINKINGS+=$GLOG_LIB/libglog.a" else append_to_output "STATIC_LINKINGS+=-lglog" fi fi fi # required by UT #gtest GTEST_LIB=$(find_dir_of_lib gtest) HDRS=$OLD_HDRS LIBS=$OLD_LIBS append_to_output "ifeq (\$(NEED_GTEST), 1)" if [ -z "$GTEST_LIB" ]; then append_to_output " \$(error \"Fail to find gtest\")" else GTEST_HDR=$(find_dir_of_header_or_die gtest/gtest.h) append_to_output_libs $GTEST_LIB " " append_to_output_headers $GTEST_HDR " " append_to_output_linkings $GTEST_LIB gtest " " append_to_output_linkings $GTEST_LIB gtest_main " " fi append_to_output "endif" # generate src/butil/config.h cat << EOF > src/butil/config.h // This file is auto-generated by $(basename "$0"). DON'T edit it! #ifndef BUTIL_CONFIG_H #define BUTIL_CONFIG_H #ifdef BRPC_WITH_GLOG #undef BRPC_WITH_GLOG #endif #define BRPC_WITH_GLOG $WITH_GLOG #endif // BUTIL_CONFIG_H EOF print_step "Generating output files" # write to config.mk $ECHO "$OUTPUT_CONTENT" > config.mk print_success "Generated config.mk" print_success "Generated src/butil/config.h" printf "\n" print_step "Configuration complete" print_info "Compiler: $CC / $CXX" print_info "C++ std: $CXXFLAGS" print_info "System: $SYSTEM" if [ $WITH_GLOG -ne 0 ]; then print_info "With glog: yes"; fi if [ $WITH_THRIFT -ne 0 ]; then print_info "With thrift: yes"; fi if [ $WITH_RDMA -ne 0 ]; then print_info "With RDMA: yes"; fi if [ $WITH_MESALINK -ne 0 ]; then print_info "With MesaLink: yes"; fi if [ $WITH_BTHREAD_TRACER -ne 0 ]; then print_info "With bthread tracer: yes"; fi if [ $WITH_ASAN -ne 0 ]; then print_info "With ASAN: yes"; fi printf "\n${GREEN}brpc is now configured. You can build it with 'make'.${NC}\n"