Repository: apache/brpc Branch: master Commit: 0565d8d2c7a1 Files: 11 Total size: 81.8 KB Directory structure: gitextract_27i_xhfr/ ├── BUILD.bazel ├── CHANGES.md ├── CMakeLists.txt ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── MODULE.bazel ├── README.md ├── README_cn.md ├── WORKSPACE.bzlmod ├── config.h.in └── config_brpc.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: BUILD.bazel ================================================ # 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. load("@rules_proto//proto:defs.bzl", "proto_library") load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library", "objc_library") licenses(["notice"]) # Apache v2 exports_files(["LICENSE"]) COPTS = [ "-fno-omit-frame-pointer", "-DBTHREAD_USE_FAST_PTHREAD_MUTEX", "-D__const__=__unused__", "-D_GNU_SOURCE", "-DUSE_SYMBOLIZE", "-DNO_TCMALLOC", "-D__STDC_FORMAT_MACROS", "-D__STDC_LIMIT_MACROS", "-D__STDC_CONSTANT_MACROS", ] + select({ "//bazel/config:brpc_with_glog": ["-DBRPC_WITH_GLOG=1"], "//conditions:default": ["-DBRPC_WITH_GLOG=0"], }) + select({ "//bazel/config:brpc_with_mesalink": ["-DUSE_MESALINK"], "//conditions:default": [""], }) + select({ "//bazel/config:brpc_with_thrift": ["-DENABLE_THRIFT_FRAMED_PROTOCOL=1"], "//conditions:default": [""], }) + select({ "//bazel/config:brpc_with_thrift_legacy_version": [], "//conditions:default": ["-DTHRIFT_STDCXX=std"], }) + select({ "//bazel/config:brpc_with_rdma": ["-DBRPC_WITH_RDMA=1"], "//conditions:default": [""], }) + select({ "//bazel/config:brpc_with_debug_bthread_sche_safety": ["-DBRPC_DEBUG_BTHREAD_SCHE_SAFETY=1"], "//conditions:default": ["-DBRPC_DEBUG_BTHREAD_SCHE_SAFETY=0"], }) + select({ "//bazel/config:brpc_with_debug_lock": ["-DBRPC_DEBUG_LOCK=1"], "//conditions:default": ["-DBRPC_DEBUG_LOCK=0"], }) + select({ "//bazel/config:brpc_with_asan": ["-fsanitize=address"], "//conditions:default": [""], }) + select({ "//bazel/config:brpc_with_no_pthread_mutex_hook": ["-DNO_PTHREAD_MUTEX_HOOK"], "//conditions:default": [""], }) LINKOPTS = [ "-pthread", "-ldl", ] + select({ "@bazel_tools//src/conditions:darwin": [ "-framework CoreFoundation", "-framework CoreGraphics", "-framework CoreData", "-framework CoreText", "-framework Security", "-framework Foundation", "-Wl,-U,_MallocExtension_ReleaseFreeMemory", "-Wl,-U,_ProfilerStart", "-Wl,-U,_ProfilerStop", "-Wl,-U,__Z13GetStackTracePPvii", "-Wl,-U,_RegisterThriftProtocol", "-Wl,-U,_mallctl", "-Wl,-U,_malloc_stats_print", ], "//conditions:default": [ "-lrt", ], }) + select({ "//bazel/config:brpc_with_mesalink": [ "-lmesalink", ], "//conditions:default": [], }) + select({ "//bazel/config:brpc_with_rdma": [ "-libverbs", ], "//conditions:default": [], }) + select({ "//bazel/config:brpc_with_asan": ["-fsanitize=address"], "//conditions:default": [""], }) genrule( name = "config_h", outs = [ "src/butil/config.h", ], cmd = """cat << EOF >$@""" + """ // This file is auto-generated. #ifndef BUTIL_CONFIG_H #define BUTIL_CONFIG_H #ifdef BRPC_WITH_GLOG #undef BRPC_WITH_GLOG #endif #define BRPC_WITH_GLOG """ + select({ "//bazel/config:brpc_with_glog": "1", "//conditions:default": "0", }) + """ #endif // BUTIL_CONFIG_H EOF """, ) BUTIL_SRCS = [ "src/butil/third_party/dmg_fp/g_fmt.cc", "src/butil/third_party/dmg_fp/dtoa_wrapper.cc", "src/butil/third_party/dynamic_annotations/dynamic_annotations.c", "src/butil/third_party/icu/icu_utf.cc", "src/butil/third_party/superfasthash/superfasthash.c", "src/butil/third_party/modp_b64/modp_b64.cc", "src/butil/third_party/symbolize/demangle.cc", "src/butil/third_party/symbolize/symbolize.cc", "src/butil/third_party/snappy/snappy-sinksource.cc", "src/butil/third_party/snappy/snappy-stubs-internal.cc", "src/butil/third_party/snappy/snappy.cc", "src/butil/third_party/murmurhash3/murmurhash3.cpp", "src/butil/arena.cpp", "src/butil/at_exit.cc", "src/butil/atomicops_internals_x86_gcc.cc", "src/butil/base64.cc", "src/butil/base64url.cc", "src/butil/big_endian.cc", "src/butil/cpu.cc", "src/butil/debug/alias.cc", "src/butil/debug/asan_invalid_access.cc", "src/butil/debug/crash_logging.cc", "src/butil/debug/debugger.cc", "src/butil/debug/debugger_posix.cc", "src/butil/debug/dump_without_crashing.cc", "src/butil/debug/proc_maps_linux.cc", "src/butil/debug/stack_trace.cc", "src/butil/debug/stack_trace_posix.cc", "src/butil/environment.cc", "src/butil/files/file.cc", "src/butil/files/file_posix.cc", "src/butil/files/file_enumerator.cc", "src/butil/files/file_enumerator_posix.cc", "src/butil/files/file_path.cc", "src/butil/files/file_path_constants.cc", "src/butil/files/memory_mapped_file.cc", "src/butil/files/memory_mapped_file_posix.cc", "src/butil/files/scoped_file.cc", "src/butil/files/scoped_temp_dir.cc", "src/butil/file_util.cc", "src/butil/file_util_posix.cc", "src/butil/guid.cc", "src/butil/guid_posix.cc", "src/butil/hash.cc", "src/butil/lazy_instance.cc", "src/butil/location.cc", "src/butil/memory/aligned_memory.cc", "src/butil/memory/ref_counted.cc", "src/butil/memory/ref_counted_memory.cc", "src/butil/memory/singleton.cc", "src/butil/memory/weak_ptr.cc", "src/butil/posix/file_descriptor_shuffle.cc", "src/butil/posix/global_descriptors.cc", "src/butil/process_util.cc", "src/butil/rand_util.cc", "src/butil/rand_util_posix.cc", "src/butil/fast_rand.cpp", "src/butil/safe_strerror_posix.cc", "src/butil/sha1_portable.cc", "src/butil/strings/latin1_string_conversions.cc", "src/butil/strings/nullable_string16.cc", "src/butil/strings/safe_sprintf.cc", "src/butil/strings/string16.cc", "src/butil/strings/string_number_conversions.cc", "src/butil/strings/string_split.cc", "src/butil/strings/string_piece.cc", "src/butil/strings/string_util.cc", "src/butil/strings/string_util_constants.cc", "src/butil/strings/stringprintf.cc", "src/butil/strings/utf_offset_string_conversions.cc", "src/butil/strings/utf_string_conversion_utils.cc", "src/butil/strings/utf_string_conversions.cc", "src/butil/synchronization/cancellation_flag.cc", "src/butil/synchronization/condition_variable_posix.cc", "src/butil/synchronization/waitable_event_posix.cc", "src/butil/threading/non_thread_safe_impl.cc", "src/butil/threading/platform_thread_posix.cc", "src/butil/threading/simple_thread.cc", "src/butil/threading/thread_checker_impl.cc", "src/butil/threading/thread_collision_warner.cc", "src/butil/threading/thread_id_name_manager.cc", "src/butil/threading/thread_local_posix.cc", "src/butil/threading/thread_local_storage.cc", "src/butil/threading/thread_local_storage_posix.cc", "src/butil/threading/thread_restrictions.cc", "src/butil/threading/watchdog.cc", "src/butil/time/clock.cc", "src/butil/time/default_clock.cc", "src/butil/time/default_tick_clock.cc", "src/butil/time/tick_clock.cc", "src/butil/time/time.cc", "src/butil/time/time_posix.cc", "src/butil/version.cc", "src/butil/logging.cc", "src/butil/class_name.cpp", "src/butil/errno.cpp", "src/butil/find_cstr.cpp", "src/butil/status.cpp", "src/butil/string_printf.cpp", "src/butil/thread_local.cpp", "src/butil/thread_key.cpp", "src/butil/unix_socket.cpp", "src/butil/endpoint.cpp", "src/butil/fd_utility.cpp", "src/butil/files/temp_file.cpp", "src/butil/files/file_watcher.cpp", "src/butil/time.cpp", "src/butil/zero_copy_stream_as_streambuf.cpp", "src/butil/crc32c.cc", "src/butil/containers/case_ignored_flat_map.cpp", "src/butil/iobuf.cpp", "src/butil/single_iobuf.cpp", "src/butil/iobuf_profiler.cpp", "src/butil/binary_printer.cpp", "src/butil/recordio.cc", "src/butil/popen.cpp", ] + select({ "@bazel_tools//src/conditions:darwin": [ "src/butil/time/time_mac.cc", "src/butil/mac/scoped_mach_port.cc", ], "//conditions:default": [ "src/butil/file_util_linux.cc", "src/butil/threading/platform_thread_linux.cc", "src/butil/strings/sys_string_conversions_posix.cc", ], }) objc_library( name = "macos_lib", hdrs = [ "src/butil/atomicops.h", "src/butil/atomicops_internals_atomicword_compat.h", "src/butil/atomicops_internals_mac.h", "src/butil/base_export.h", "src/butil/basictypes.h", "src/butil/build_config.h", "src/butil/compat.h", "src/butil/compiler_specific.h", "src/butil/containers/hash_tables.h", "src/butil/debug/debugger.h", "src/butil/debug/leak_annotations.h", "src/butil/file_descriptor_posix.h", "src/butil/file_util.h", "src/butil/files/file.h", "src/butil/files/file_path.h", "src/butil/files/scoped_file.h", "src/butil/lazy_instance.h", "src/butil/logging.h", "src/butil/mac/bundle_locations.h", "src/butil/mac/foundation_util.h", "src/butil/mac/scoped_cftyperef.h", "src/butil/mac/scoped_typeref.h", "src/butil/macros.h", "src/butil/string_printf.h", "src/butil/memory/aligned_memory.h", "src/butil/memory/scoped_policy.h", "src/butil/memory/scoped_ptr.h", "src/butil/move.h", "src/butil/port.h", "src/butil/posix/eintr_wrapper.h", "src/butil/scoped_generic.h", "src/butil/strings/string16.h", "src/butil/strings/string_piece.h", "src/butil/strings/string_util.h", "src/butil/strings/string_util_posix.h", "src/butil/strings/sys_string_conversions.h", "src/butil/synchronization/lock.h", "src/butil/third_party/dynamic_annotations/dynamic_annotations.h", "src/butil/third_party/murmurhash3/murmurhash3.h", "src/butil/threading/platform_thread.h", "src/butil/threading/thread_id_name_manager.h", "src/butil/threading/thread_restrictions.h", "src/butil/time.h", "src/butil/time/time.h", "src/butil/type_traits.h", ":config_h", ], enable_modules = True, includes = ["src/"], non_arc_srcs = [ "src/butil/mac/bundle_locations.mm", "src/butil/mac/foundation_util.mm", "src/butil/file_util_mac.mm", "src/butil/threading/platform_thread_mac.mm", "src/butil/strings/sys_string_conversions_mac.mm", ], tags = ["manual"], deps = [ "@com_github_gflags_gflags//:gflags", ] + select({ "//bazel/config:brpc_with_glog": ["@com_github_google_glog//:glog"], "//conditions:default": [], }), ) cc_library( name = "butil", srcs = BUTIL_SRCS, hdrs = glob([ "src/butil/*.h", "src/butil/*.hpp", "src/butil/**/*.h", "src/butil/**/*.hpp", "src/butil/**/**/*.h", "src/butil/**/**/*.hpp", "src/butil/**/**/**/*.h", "src/butil/**/**/**/*.hpp", ]) + [ "src/butil/third_party/dmg_fp/dtoa.cc", ":config_h", ], copts = COPTS + select({ "//bazel/config:brpc_build_for_unittest": [ "-DBVAR_NOT_LINK_DEFAULT_VARIABLES", "-DUNIT_TEST", ], "//conditions:default": [], }), includes = [ "src/", ], linkopts = LINKOPTS, visibility = ["//visibility:public"], deps = [ "@com_github_gflags_gflags//:gflags", "@com_github_madler_zlib//:zlib", "@com_google_protobuf//:protobuf", ] + select({ "//bazel/config:brpc_with_glog": ["@com_github_google_glog//:glog"], "//conditions:default": [], }) + select({ "@bazel_tools//src/conditions:darwin": [":macos_lib"], "//conditions:default": [], }) + select({ "//bazel/config:brpc_with_boringssl": ["@boringssl//:ssl", "@boringssl//:crypto"], "//conditions:default": ["@openssl//:ssl", "@openssl//:crypto"], }), ) cc_library( name = "bvar", srcs = glob( [ "src/bvar/*.cpp", "src/bvar/detail/*.cpp", ], exclude = [ "src/bvar/default_variables.cpp", ], ) + select({ "//bazel/config:brpc_build_for_unittest": [], "//conditions:default": ["src/bvar/default_variables.cpp"], }), hdrs = glob([ "src/bvar/*.h", "src/bvar/utils/*.h", "src/bvar/detail/*.h", ]), defines = [] + select({ "//bazel/config:with_babylon_counter": ["WITH_BABYLON_COUNTER=1"], "//conditions:default": [], }), copts = COPTS + select({ "//bazel/config:brpc_build_for_unittest": [ "-DBVAR_NOT_LINK_DEFAULT_VARIABLES", "-DUNIT_TEST", ], "//conditions:default": [], }), includes = [ "src/", ], linkopts = LINKOPTS, visibility = ["//visibility:public"], deps = [ ":butil", ] + select({ "//bazel/config:with_babylon_counter": ["@babylon//:concurrent_counter"], "//conditions:default": [], }), ) cc_library( name = "bthread", srcs = glob([ "src/bthread/*.cpp", ]), hdrs = glob([ "src/bthread/*.h", "src/bthread/*.list", ]), defines = [] + select({ "//bazel/config:brpc_with_bthread_tracer": [ "BRPC_BTHREAD_TRACER", ], "//conditions:default": [], }), copts = COPTS, includes = [ "src/", ], linkopts = LINKOPTS, visibility = ["//visibility:public"], deps = [ ":butil", ":bvar", ] + select({ "//bazel/config:brpc_with_bthread_tracer": [ "@com_github_libunwind_libunwind//:libunwind", "@com_google_absl//absl/debugging:stacktrace", "@com_google_absl//absl/debugging:symbolize", ], "//conditions:default": [], }), ) cc_library( name = "json2pb", srcs = glob([ "src/json2pb/*.cpp", ]), hdrs = glob([ "src/json2pb/*.h", ]), copts = COPTS, includes = [ "src/", ], linkopts = LINKOPTS, visibility = ["//visibility:public"], deps = [ ":butil", ], ) cc_library( name = "mcpack2pb", srcs = [ "src/mcpack2pb/field_type.cpp", "src/mcpack2pb/mcpack2pb.cpp", "src/mcpack2pb/parser.cpp", "src/mcpack2pb/serializer.cpp", ], hdrs = glob([ "src/mcpack2pb/*.h", ]), copts = COPTS, includes = [ "src/", ], linkopts = LINKOPTS, visibility = ["//visibility:public"], deps = [ ":brpc_idl_options_cc_proto", ":butil", "@com_google_protobuf//src/google/protobuf/compiler:code_generator", ], ) filegroup( name = "brpc_idl_options_proto_srcs", srcs = [ "src/idl_options.proto", ], visibility = ["//visibility:public"], ) proto_library( name = "brpc_idl_options_proto", srcs = [":brpc_idl_options_proto_srcs"], strip_import_prefix = "src", visibility = ["//visibility:public"], deps = [ "@com_google_protobuf//:descriptor_proto", ], ) cc_proto_library( name = "brpc_idl_options_cc_proto", visibility = ["//visibility:public"], deps = [":brpc_idl_options_proto"], ) filegroup( name = "brpc_internal_proto_srcs", srcs = glob([ "src/brpc/*.proto", "src/brpc/policy/*.proto", ]), visibility = ["//visibility:public"], ) proto_library( name = "brpc_internal_proto", srcs = [":brpc_internal_proto_srcs"], strip_import_prefix = "src", visibility = ["//visibility:public"], deps = [ ":brpc_idl_options_proto", "@com_google_protobuf//:descriptor_proto", ], ) cc_proto_library( name = "brpc_internal_cc_proto", visibility = ["//visibility:public"], deps = [":brpc_internal_proto"], ) cc_library( name = "brpc", srcs = glob([ "src/brpc/*.cpp", "src/brpc/**/*.cpp", ], exclude = [ "src/brpc/thrift_service.cpp", "src/brpc/thrift_message.cpp", "src/brpc/policy/thrift_protocol.cpp", "src/brpc/event_dispatcher_epoll.cpp", "src/brpc/event_dispatcher_kqueue.cpp", ]) + select({ "//bazel/config:brpc_with_thrift": glob([ "src/brpc/thrift*.cpp", "src/brpc/**/thrift*.cpp", ]), "//conditions:default": [], }), hdrs = glob([ "src/brpc/*.h", "src/brpc/**/*.h", "src/brpc/event_dispatcher_epoll.cpp", "src/brpc/event_dispatcher_kqueue.cpp", ]), copts = COPTS, includes = [ "src/", ], linkopts = LINKOPTS, visibility = ["//visibility:public"], deps = [ ":brpc_internal_cc_proto", ":bthread", ":butil", ":bvar", ":json2pb", ":mcpack2pb", "@com_github_google_leveldb//:leveldb", ] + select({ "//bazel/config:brpc_with_thrift": [ "@org_apache_thrift//:thrift", ], "//conditions:default": [], }), ) cc_binary( name = "protoc-gen-mcpack", srcs = [ "src/mcpack2pb/generator.cpp", ], copts = COPTS, linkopts = LINKOPTS, visibility = ["//visibility:public"], deps = [ ":brpc", ":brpc_idl_options_cc_proto", ], ) ================================================ FILE: CHANGES.md ================================================ # Table of Contents - [0.9.7](#0.9.7) - [0.9.6](#0.9.6) - [0.9.5](#0.9.5) - [0.9.0](#0.9.0) ## 0.9.7 * Add DISCLAIMER-WIP as license issues are not all resolved * Fix many license related issues * Ignore flow control in h2 when sending first request * Add flame graph view for profiling builtin service * Fix bug that _avg_latency maybe zero in lalb * Fix bug that logging namespace conflicts with others * Add gdb_bthread_stack.py to read bthread stack * Adapt to Arm64 * Support redis server protocol * Enable circuit breaker for backup request * Support zone for bilibili discovery naming service when fetching server nodes * Add brpc revision in release version ## 0.9.6 * Health (of a connection) can be checked at rpc-level * Fix SSL-related compilation issues on Mac * Support SSL-replacement lib MesaLink * Support consistent hashing with ketama algo. * bvar variables can be exported for prometheus services * String[Multi]Splitter supports '\0' as separator * Support for bilibili discovery service * Improved CircuitBreaker * grpc impl. supports timeout ## 0.9.5 * h2c/grpc are supported now, h2(encrypted) is not included. * thrift support. * Mac build support * Extend ConcurrencyLimiter to control max-concurrency dynamically and an "auto" CL is supported by default * CircuitBreaker support to isolate abnormal servers more effectively ## 0.9.0 * Contains major features of brpc, OK for production usages. * No h2/h2c/rdma support, Mac/Windows ports are not ready yet. ================================================ FILE: CMakeLists.txt ================================================ # 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. cmake_minimum_required(VERSION 2.8.12) project(brpc C CXX) option(WITH_GLOG "With glog" OFF) option(WITH_MESALINK "With MesaLink" OFF) option(WITH_BORINGSSL "With BoringSSL" OFF) option(DEBUG "Print debug logs" OFF) option(WITH_DEBUG_SYMBOLS "With debug symbols" ON) option(WITH_THRIFT "With thrift framed protocol supported" OFF) option(WITH_BTHREAD_TRACER "With bthread tracer supported" OFF) option(WITH_SNAPPY "With snappy" OFF) option(WITH_RDMA "With RDMA" OFF) option(WITH_DEBUG_BTHREAD_SCHE_SAFETY "With debugging bthread sche safety" OFF) option(WITH_DEBUG_LOCK "With debugging lock" OFF) option(WITH_ASAN "With AddressSanitizer" OFF) option(BUILD_UNIT_TESTS "Whether to build unit tests" OFF) option(BUILD_FUZZ_TESTS "Whether to build fuzz tests" OFF) option(BUILD_BRPC_TOOLS "Whether to build brpc tools" ON) option(DOWNLOAD_GTEST "Download and build a fresh copy of googletest. Requires Internet access." ON) # Enable MACOSX_RPATH. Run "cmake --help-policy CMP0042" for policy details. if(POLICY CMP0042) cmake_policy(SET CMP0042 NEW) endif() set(BRPC_VERSION 1.16.0) SET(CPACK_GENERATOR "DEB") SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "brpc authors") INCLUDE(CPack) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # require at least gcc 4.8 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) message(FATAL_ERROR "GCC is too old, please install a newer version supporting C++11") endif() elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # require at least clang 3.3 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.3) message(FATAL_ERROR "Clang is too old, please install a newer version supporting C++11") endif() else() message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang and GCC.") endif() set(WITH_GLOG_VAL "0") if(WITH_GLOG) set(WITH_GLOG_VAL "1") set(BRPC_WITH_GLOG 1) endif() if(WITH_DEBUG_SYMBOLS) set(DEBUG_SYMBOL "-g") endif() set(WITH_DEBUG_LOCK_VAL "0") if(WITH_DEBUG_LOCK) set(WITH_DEBUG_LOCK_VAL "1") endif() if(WITH_THRIFT) set(THRIFT_CPP_FLAG "-DENABLE_THRIFT_FRAMED_PROTOCOL") find_library(THRIFT_LIB NAMES thrift) if (NOT THRIFT_LIB) message(FATAL_ERROR "Fail to find Thrift") endif() endif() if (WITH_BTHREAD_TRACER) if (NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux") OR NOT (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")) message(FATAL_ERROR "bthread tracer is only supported on Linux x86_64 platform") endif() find_path(LIBUNWIND_INCLUDE_PATH NAMES libunwind.h) find_library(LIBUNWIND_LIB NAMES unwind) find_library(LIBUNWIND_X86_64_LIB NAMES unwind-x86_64) if (NOT LIBUNWIND_INCLUDE_PATH OR NOT LIBUNWIND_LIB) message(FATAL_ERROR "Fail to find libunwind, which is needed by bthread tracer") endif() find_package(absl REQUIRED CONFIG) set(bthread_tracer_ABSL_USED_TARGETS absl::base absl::stacktrace absl::symbolize) add_definitions(-DBRPC_BTHREAD_TRACER) include_directories(${LIBUNWIND_INCLUDE_PATH}) endif () set(WITH_RDMA_VAL "0") if(WITH_RDMA) set(WITH_RDMA_VAL "1") endif() set(WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL "0") if(WITH_DEBUG_BTHREAD_SCHE_SAFETY) set(WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL "1") endif() include(GNUInstallDirs) configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_SOURCE_DIR}/src/butil/config.h @ONLY) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") find_package(GFLAGS REQUIRED) include_directories( ${PROJECT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ) execute_process( COMMAND bash -c "${PROJECT_SOURCE_DIR}/tools/get_brpc_revision.sh ${PROJECT_SOURCE_DIR} | tr -d '\n'" OUTPUT_VARIABLE BRPC_REVISION ) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") include(CheckFunctionExists) CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME) if(NOT HAVE_CLOCK_GETTIME) set(DEFINE_CLOCK_GETTIME "-DNO_CLOCK_GETTIME_IN_MAC") endif() set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -Wno-deprecated-declarations -Wno-inconsistent-missing-override") endif() set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} ${DEFINE_CLOCK_GETTIME} -DBRPC_WITH_GLOG=${WITH_GLOG_VAL} -DBRPC_WITH_RDMA=${WITH_RDMA_VAL} -DBRPC_DEBUG_BTHREAD_SCHE_SAFETY=${WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL} -DBRPC_DEBUG_LOCK=${WITH_DEBUG_LOCK_VAL}") if (WITH_ASAN) set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -fsanitize=address") set(CMAKE_C_FLAGS "${CMAKE_CPP_FLAGS} -fsanitize=address") endif() if(WITH_MESALINK) set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -DUSE_MESALINK") endif() set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -DBTHREAD_USE_FAST_PTHREAD_MUTEX -D__const__=__unused__ -D_GNU_SOURCE -DUSE_SYMBOLIZE -DNO_TCMALLOC -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -DBRPC_REVISION=\\\"${BRPC_REVISION}\\\" -D__STRICT_ANSI__") set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} ${DEBUG_SYMBOL} ${THRIFT_CPP_FLAG}") set(CMAKE_CXX_FLAGS "${CMAKE_CPP_FLAGS} ${CMAKE_CXX_FLAGS} -O2 -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-invalid-offsetof -Wno-unused-parameter -fno-omit-frame-pointer") set(CMAKE_C_FLAGS "${CMAKE_CPP_FLAGS} -O2 -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-unused-parameter -fno-omit-frame-pointer") macro(use_cxx11) if(CMAKE_VERSION VERSION_LESS "3.1.3") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() else() set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) endif() endmacro(use_cxx11) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") #required by butil/crc32.cc to boost performance for 10x 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") elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")) # segmentation fault in libcontext set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-gcse") elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64")) # RISC-V specific optimizations set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64gc") endif() if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-aligned-new") endif() endif() find_package(Protobuf REQUIRED) if(Protobuf_VERSION GREATER 4.21) # required by absl set(CMAKE_CXX_STANDARD 17) find_package(absl REQUIRED CONFIG) set(protobuf_ABSL_USED_TARGETS absl::absl_check absl::absl_log absl::algorithm absl::base absl::bind_front absl::bits absl::btree absl::cleanup absl::cord absl::core_headers absl::debugging absl::die_if_null absl::dynamic_annotations absl::flags absl::flat_hash_map absl::flat_hash_set absl::function_ref absl::hash absl::layout absl::log_initialize absl::log_severity absl::memory absl::node_hash_map absl::node_hash_set absl::optional absl::span absl::status absl::statusor absl::strings absl::synchronization absl::time absl::type_traits absl::utility absl::variant ) else() use_cxx11() endif() find_package(Threads REQUIRED) find_path(LEVELDB_INCLUDE_PATH NAMES leveldb/db.h) find_library(LEVELDB_LIB NAMES leveldb) if ((NOT LEVELDB_INCLUDE_PATH) OR (NOT LEVELDB_LIB)) message(FATAL_ERROR "Fail to find leveldb") endif() if(WITH_SNAPPY) find_path(SNAPPY_INCLUDE_PATH NAMES snappy.h) find_library(SNAPPY_LIB NAMES snappy) if ((NOT SNAPPY_INCLUDE_PATH) OR (NOT SNAPPY_LIB)) message(FATAL_ERROR "Fail to find snappy") endif() include_directories(${SNAPPY_INCLUDE_PATH}) endif() if(WITH_GLOG) find_path(GLOG_INCLUDE_PATH NAMES glog/logging.h) find_library(GLOG_LIB NAMES glog) if((NOT GLOG_INCLUDE_PATH) OR (NOT GLOG_LIB)) message(FATAL_ERROR "Fail to find glog") endif() include_directories(${GLOG_INCLUDE_PATH}) endif() if(WITH_MESALINK) find_path(MESALINK_INCLUDE_PATH NAMES mesalink/openssl/ssl.h) find_library(MESALINK_LIB NAMES mesalink) if((NOT MESALINK_INCLUDE_PATH) OR (NOT MESALINK_LIB)) message(FATAL_ERROR "Fail to find MesaLink") else() message(STATUS "Found MesaLink: ${MESALINK_LIB}") endif() include_directories(${MESALINK_INCLUDE_PATH}) endif() if(WITH_RDMA) message("brpc compile with rdma") find_path(RDMA_INCLUDE_PATH NAMES infiniband/verbs.h) find_library(RDMA_LIB NAMES ibverbs) if((NOT RDMA_INCLUDE_PATH) OR (NOT RDMA_LIB)) message(FATAL_ERROR "Fail to find ibverbs") endif() endif() find_library(PROTOC_LIB NAMES protoc) if(NOT PROTOC_LIB) message(FATAL_ERROR "Fail to find protoc lib") endif() if(WITH_BORINGSSL) find_package(BoringSSL) include_directories(${BORINGSSL_INCLUDE_DIR}) else() if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT OPENSSL_ROOT_DIR) set(OPENSSL_ROOT_DIR "/usr/local/opt/openssl" # Homebrew installed OpenSSL ) endif() find_package(OpenSSL) include_directories(${OPENSSL_INCLUDE_DIR}) endif() include_directories( ${GFLAGS_INCLUDE_PATH} ${PROTOBUF_INCLUDE_DIRS} ${LEVELDB_INCLUDE_PATH} ) set(DYNAMIC_LIB ${GFLAGS_LIBRARY} ${PROTOBUF_LIBRARIES} ${protobuf_ABSL_USED_TARGETS} ${LEVELDB_LIB} ${PROTOC_LIB} ${CMAKE_THREAD_LIBS_INIT} ${THRIFT_LIB} dl z) if(WITH_BORINGSSL) list(APPEND DYNAMIC_LIB ${BORINGSSL_SSL_LIBRARY}) list(APPEND DYNAMIC_LIB ${BORINGSSL_CRYPTO_LIBRARY}) else() if(WITH_MESALINK) list(APPEND DYNAMIC_LIB ${OPENSSL_CRYPTO_LIBRARY}) list(APPEND DYNAMIC_LIB ${MESALINK_LIB}) else() list(APPEND DYNAMIC_LIB ${OPENSSL_SSL_LIBRARY}) list(APPEND DYNAMIC_LIB ${OPENSSL_CRYPTO_LIBRARY}) endif() endif() if(WITH_RDMA) list(APPEND DYNAMIC_LIB ${RDMA_LIB}) endif() set(BRPC_PRIVATE_LIBS "-lgflags -lprotobuf -lleveldb -lprotoc -lssl -lcrypto -ldl -lz") if(WITH_GLOG) set(DYNAMIC_LIB ${GLOG_LIB} ${DYNAMIC_LIB}) set(BRPC_PRIVATE_LIBS "-lglog ${BRPC_PRIVATE_LIBS}") endif() if(WITH_SNAPPY) set(DYNAMIC_LIB ${DYNAMIC_LIB} ${SNAPPY_LIB}) set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lsnappy") endif() if (WITH_BTHREAD_TRACER) set(DYNAMIC_LIB ${DYNAMIC_LIB} ${LIBUNWIND_LIB} ${LIBUNWIND_X86_64_LIB} ${bthread_tracer_ABSL_USED_TARGETS}) set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lunwind -lunwind-x86_64 -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_base") endif() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(DYNAMIC_LIB ${DYNAMIC_LIB} rt) set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lrt") elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") set(DYNAMIC_LIB ${DYNAMIC_LIB} pthread "-framework CoreFoundation" "-framework CoreGraphics" "-framework CoreData" "-framework CoreText" "-framework Security" "-framework Foundation" "-Wl,-U,_MallocExtension_ReleaseFreeMemory" "-Wl,-U,_ProfilerStart" "-Wl,-U,_ProfilerStop" "-Wl,-U,__Z13GetStackTracePPvii" "-Wl,-U,_mallctl" "-Wl,-U,_malloc_stats_print" ) endif() # for *.so set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/output/lib) # for *.a set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/output/lib) # the reason why not using file(GLOB_RECURSE...) is that we want to # include different files on different platforms. set(BUTIL_SOURCES ${PROJECT_SOURCE_DIR}/src/butil/third_party/dmg_fp/g_fmt.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/dmg_fp/dtoa_wrapper.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/dynamic_annotations/dynamic_annotations.c ${PROJECT_SOURCE_DIR}/src/butil/third_party/icu/icu_utf.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/superfasthash/superfasthash.c ${PROJECT_SOURCE_DIR}/src/butil/third_party/modp_b64/modp_b64.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/symbolize/demangle.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/symbolize/symbolize.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy-sinksource.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy-stubs-internal.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy.cc ${PROJECT_SOURCE_DIR}/src/butil/third_party/murmurhash3/murmurhash3.cpp ${PROJECT_SOURCE_DIR}/src/butil/arena.cpp ${PROJECT_SOURCE_DIR}/src/butil/at_exit.cc ${PROJECT_SOURCE_DIR}/src/butil/atomicops_internals_x86_gcc.cc ${PROJECT_SOURCE_DIR}/src/butil/base64.cc ${PROJECT_SOURCE_DIR}/src/butil/base64url.cc ${PROJECT_SOURCE_DIR}/src/butil/big_endian.cc ${PROJECT_SOURCE_DIR}/src/butil/cpu.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/alias.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/asan_invalid_access.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/crash_logging.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/debugger.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/debugger_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/dump_without_crashing.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/proc_maps_linux.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/stack_trace.cc ${PROJECT_SOURCE_DIR}/src/butil/debug/stack_trace_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/environment.cc ${PROJECT_SOURCE_DIR}/src/butil/files/file.cc ${PROJECT_SOURCE_DIR}/src/butil/files/file_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/files/file_enumerator.cc ${PROJECT_SOURCE_DIR}/src/butil/files/file_enumerator_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/files/file_path.cc ${PROJECT_SOURCE_DIR}/src/butil/files/file_path_constants.cc ${PROJECT_SOURCE_DIR}/src/butil/files/memory_mapped_file.cc ${PROJECT_SOURCE_DIR}/src/butil/files/memory_mapped_file_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/files/scoped_file.cc ${PROJECT_SOURCE_DIR}/src/butil/files/scoped_temp_dir.cc ${PROJECT_SOURCE_DIR}/src/butil/file_util.cc ${PROJECT_SOURCE_DIR}/src/butil/file_util_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/guid.cc ${PROJECT_SOURCE_DIR}/src/butil/guid_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/hash.cc ${PROJECT_SOURCE_DIR}/src/butil/lazy_instance.cc ${PROJECT_SOURCE_DIR}/src/butil/location.cc ${PROJECT_SOURCE_DIR}/src/butil/memory/aligned_memory.cc ${PROJECT_SOURCE_DIR}/src/butil/memory/ref_counted.cc ${PROJECT_SOURCE_DIR}/src/butil/memory/ref_counted_memory.cc ${PROJECT_SOURCE_DIR}/src/butil/memory/singleton.cc ${PROJECT_SOURCE_DIR}/src/butil/memory/weak_ptr.cc ${PROJECT_SOURCE_DIR}/src/butil/posix/file_descriptor_shuffle.cc ${PROJECT_SOURCE_DIR}/src/butil/posix/global_descriptors.cc ${PROJECT_SOURCE_DIR}/src/butil/process_util.cc ${PROJECT_SOURCE_DIR}/src/butil/rand_util.cc ${PROJECT_SOURCE_DIR}/src/butil/rand_util_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/fast_rand.cpp ${PROJECT_SOURCE_DIR}/src/butil/safe_strerror_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/sha1_portable.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/latin1_string_conversions.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/nullable_string16.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/safe_sprintf.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/string16.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/string_number_conversions.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/string_split.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/string_piece.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/string_util.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/string_util_constants.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/stringprintf.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/utf_offset_string_conversions.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/utf_string_conversion_utils.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/utf_string_conversions.cc ${PROJECT_SOURCE_DIR}/src/butil/synchronization/cancellation_flag.cc ${PROJECT_SOURCE_DIR}/src/butil/synchronization/condition_variable_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/synchronization/waitable_event_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/non_thread_safe_impl.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/simple_thread.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_checker_impl.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_collision_warner.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_id_name_manager.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_storage.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_storage_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_restrictions.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/watchdog.cc ${PROJECT_SOURCE_DIR}/src/butil/time/clock.cc ${PROJECT_SOURCE_DIR}/src/butil/time/default_clock.cc ${PROJECT_SOURCE_DIR}/src/butil/time/default_tick_clock.cc ${PROJECT_SOURCE_DIR}/src/butil/time/tick_clock.cc ${PROJECT_SOURCE_DIR}/src/butil/time/time.cc ${PROJECT_SOURCE_DIR}/src/butil/time/time_posix.cc ${PROJECT_SOURCE_DIR}/src/butil/version.cc ${PROJECT_SOURCE_DIR}/src/butil/logging.cc ${PROJECT_SOURCE_DIR}/src/butil/class_name.cpp ${PROJECT_SOURCE_DIR}/src/butil/errno.cpp ${PROJECT_SOURCE_DIR}/src/butil/find_cstr.cpp ${PROJECT_SOURCE_DIR}/src/butil/status.cpp ${PROJECT_SOURCE_DIR}/src/butil/string_printf.cpp ${PROJECT_SOURCE_DIR}/src/butil/thread_local.cpp ${PROJECT_SOURCE_DIR}/src/butil/thread_key.cpp ${PROJECT_SOURCE_DIR}/src/butil/unix_socket.cpp ${PROJECT_SOURCE_DIR}/src/butil/endpoint.cpp ${PROJECT_SOURCE_DIR}/src/butil/fd_utility.cpp ${PROJECT_SOURCE_DIR}/src/butil/files/temp_file.cpp ${PROJECT_SOURCE_DIR}/src/butil/files/file_watcher.cpp ${PROJECT_SOURCE_DIR}/src/butil/time.cpp ${PROJECT_SOURCE_DIR}/src/butil/zero_copy_stream_as_streambuf.cpp ${PROJECT_SOURCE_DIR}/src/butil/crc32c.cc ${PROJECT_SOURCE_DIR}/src/butil/containers/case_ignored_flat_map.cpp ${PROJECT_SOURCE_DIR}/src/butil/iobuf.cpp ${PROJECT_SOURCE_DIR}/src/butil/single_iobuf.cpp ${PROJECT_SOURCE_DIR}/src/butil/iobuf_profiler.cpp ${PROJECT_SOURCE_DIR}/src/butil/binary_printer.cpp ${PROJECT_SOURCE_DIR}/src/butil/recordio.cc ${PROJECT_SOURCE_DIR}/src/butil/popen.cpp ) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(BUTIL_SOURCES ${BUTIL_SOURCES} ${PROJECT_SOURCE_DIR}/src/butil/file_util_linux.cc ${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_linux.cc ${PROJECT_SOURCE_DIR}/src/butil/strings/sys_string_conversions_posix.cc) elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") set(BUTIL_SOURCES ${BUTIL_SOURCES} ${PROJECT_SOURCE_DIR}/src/butil/mac/bundle_locations.mm ${PROJECT_SOURCE_DIR}/src/butil/mac/foundation_util.mm ${PROJECT_SOURCE_DIR}/src/butil/file_util_mac.mm ${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_mac.mm ${PROJECT_SOURCE_DIR}/src/butil/strings/sys_string_conversions_mac.mm ${PROJECT_SOURCE_DIR}/src/butil/time/time_mac.cc ${PROJECT_SOURCE_DIR}/src/butil/mac/scoped_mach_port.cc) endif() file(GLOB_RECURSE BVAR_SOURCES "${PROJECT_SOURCE_DIR}/src/bvar/*.cpp") file(GLOB_RECURSE BTHREAD_SOURCES "${PROJECT_SOURCE_DIR}/src/bthread/*.cpp") file(GLOB_RECURSE JSON2PB_SOURCES "${PROJECT_SOURCE_DIR}/src/json2pb/*.cpp") file(GLOB_RECURSE BRPC_SOURCES "${PROJECT_SOURCE_DIR}/src/brpc/*.cpp") file(GLOB_RECURSE THRIFT_SOURCES "${PROJECT_SOURCE_DIR}/src/brpc/thrift*.cpp") file(GLOB_RECURSE EXCLUDE_SOURCES "${PROJECT_SOURCE_DIR}/src/brpc/event_dispatcher_*.cpp") if(WITH_THRIFT) message("brpc compile with thrift protocol") else() # Remove thrift sources foreach(v ${THRIFT_SOURCES}) list(REMOVE_ITEM BRPC_SOURCES ${v}) endforeach() set(THRIFT_SOURCES "") endif() foreach(v ${EXCLUDE_SOURCES}) list(REMOVE_ITEM BRPC_SOURCES ${v}) endforeach() set(MCPACK2PB_SOURCES ${PROJECT_SOURCE_DIR}/src/mcpack2pb/field_type.cpp ${PROJECT_SOURCE_DIR}/src/mcpack2pb/mcpack2pb.cpp ${PROJECT_SOURCE_DIR}/src/mcpack2pb/parser.cpp ${PROJECT_SOURCE_DIR}/src/mcpack2pb/serializer.cpp) include(CompileProto) set(PROTO_FILES idl_options.proto brpc/rtmp.proto brpc/rpc_dump.proto brpc/get_favicon.proto brpc/span.proto brpc/builtin_service.proto brpc/grpc_health_check.proto brpc/get_js.proto brpc/errno.proto brpc/nshead_meta.proto brpc/options.proto brpc/policy/baidu_rpc_meta.proto brpc/policy/hulu_pbrpc_meta.proto brpc/policy/public_pbrpc_meta.proto brpc/policy/sofa_pbrpc_meta.proto brpc/policy/mongo.proto brpc/trackme.proto brpc/streaming_rpc_meta.proto brpc/proto_base.proto) file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/output/include/brpc) set(PROTOC_FLAGS ${PROTOC_FLAGS} -I${PROTOBUF_INCLUDE_DIR}) compile_proto(PROTO_HDRS PROTO_SRCS ${PROJECT_BINARY_DIR} ${PROJECT_BINARY_DIR}/output/include ${PROJECT_SOURCE_DIR}/src "${PROTO_FILES}") add_library(PROTO_LIB OBJECT ${PROTO_SRCS} ${PROTO_HDRS}) set(SOURCES ${BVAR_SOURCES} ${BTHREAD_SOURCES} ${JSON2PB_SOURCES} ${MCPACK2PB_SOURCES} ${BRPC_SOURCES} ${THRIFT_SOURCES} ) add_subdirectory(src) if(BUILD_UNIT_TESTS) enable_testing() add_subdirectory(test) endif() if(BUILD_FUZZ_TESTS) if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") message(FATAL_ERROR "Fuzzing is only supported with clang") endif() if(NOT BUILD_UNIT_TESTS) message(FATAL_ERROR "BUILD_UNIT_TESTS must be enabled to build fuzz tests") endif() endif() if(BUILD_BRPC_TOOLS) add_subdirectory(tools) endif() file(COPY ${CMAKE_CURRENT_BINARY_DIR}/brpc/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/output/include/brpc/ FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ) file(COPY ${PROJECT_SOURCE_DIR}/src/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/output/include/ FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/output/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ) # Install pkgconfig configure_file(cmake/brpc.pc.in ${PROJECT_BINARY_DIR}/brpc.pc @ONLY) install(FILES ${PROJECT_BINARY_DIR}/brpc.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at dev@brpc.apache.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ ================================================ FILE: CONTRIBUTING.md ================================================ If you meet any problem or request a new feature, you're welcome to [create an issue](https://github.com/apache/brpc/issues/new/choose). If you can solve any of [the issues](https://github.com/apache/brpc/issues), you're welcome to send the PR to us. Before the PR: * Make sure your code style conforms to [google C++ coding style](https://google.github.io/styleguide/cppguide.html). Indentation is preferred to be 4 spaces. * The code appears where it should be. For example the code to support an extra protocol should not be put in general classes like server.cpp, channel.cpp, while a general modification would better not be hidden inside a very specific protocol. * Has unittests. After the PR: * Make sure the [GitHub Actions](https://github.com/apache/brpc/actions) passed. # Chinese version 如果你遇到问题或需要新功能,欢迎[创建issue](https://github.com/apache/brpc/issues/new/choose)。 如果你可以解决某个[issue](https://github.com/apache/brpc/issues), 欢迎发送PR。 发送PR前请确认: * 你的代码符合[google C++代码规范](https://google.github.io/styleguide/cppguide.html)。缩进最好为4个空格。 * 代码出现的位置和其定位相符。比如对于某特定协议的扩展代码不该出现在server.cpp, channel.cpp这些较为通用的类中,而一些非常通用的改动也不该深藏在某个特定协议的cpp中。 * 有对应的单测代码。 提交PR后请确认: * [GitHub Actions](https://github.com/apache/brpc/actions)成功通过。 ================================================ FILE: MODULE.bazel ================================================ module( name = 'brpc', version = '1.16.0', compatibility_level = 1, ) # --registry=https://bcr.bazel.build bazel_dep(name = 'abseil-cpp', version = '20210324.2', repo_name = 'com_google_absl') bazel_dep(name = 'bazel_skylib', version = '1.0.3') bazel_dep(name = 'boringssl', version = '0.0.0-20211025-d4f1ab9') bazel_dep(name = 'protobuf', version = '27.3', repo_name = 'com_google_protobuf') bazel_dep(name = 'gflags', version = '2.2.2', repo_name = 'com_github_gflags_gflags') bazel_dep(name = 'glog', version = '0.5.0', repo_name = 'com_github_google_glog') bazel_dep(name = 'platforms', version = '0.0.4') bazel_dep(name = "apple_support", version = "1.17.1") bazel_dep(name = 'rules_cc', version = '0.0.1') bazel_dep(name = 'rules_proto', version = '4.0.0') bazel_dep(name = 'zlib', version = '1.3.1.bcr.5', repo_name = 'com_github_madler_zlib') bazel_dep(name = 'libunwind', version = '1.8.1', repo_name = 'com_github_libunwind_libunwind') bazel_dep(name = 'babylon', version = '1.4.4') # --registry=https://baidu.github.io/babylon/registry bazel_dep(name = 'leveldb', version = '1.23', repo_name = 'com_github_google_leveldb') single_version_override( module_name = "leveldb", registry = "https://raw.githubusercontent.com/secretflow/bazel-registry/main", ) bazel_dep(name = 'openssl', version = '3.3.2') single_version_override( module_name = "openssl", version = "3.3.2.bcr.1", registry = "https://raw.githubusercontent.com/secretflow/bazel-registry/main", ) bazel_dep(name = 'thrift', version = '0.21.0', repo_name = 'org_apache_thrift') # test only bazel_dep(name = 'googletest', version = '1.14.0.bcr.1', repo_name = 'com_google_googletest', dev_dependency = True) bazel_dep(name = 'hedron_compile_commands', dev_dependency = True) git_override( module_name = 'hedron_compile_commands', remote = 'https://github.com/hedronvision/bazel-compile-commands-extractor.git', commit = '1e08f8e0507b6b6b1f4416a9a22cf5c28beaba93', # Jun 28, 2024 ) ================================================ FILE: README.md ================================================ [中文版](README_cn.md) [![Linux Build Status](https://github.com/apache/brpc/actions/workflows/ci-linux.yml/badge.svg)](https://github.com/apache/brpc/actions/workflows/ci-linux.yml) [![MacOs Build Status](https://github.com/apache/brpc/actions/workflows/ci-macos.yml/badge.svg)](https://github.com/apache/brpc/actions/workflows/ci-macos.yml) ![brpc logo (light)](docs/images/logo.png#gh-light-mode-only) ![brpc logo (dark)](docs/images/logo-white.png#gh-dark-mode-only) [bRPC](https://brpc.apache.org/) is an Industrial-grade RPC framework using C++ Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. ### "bRPC" means "better RPC". You can use it to: * Build a server that can talk in multiple protocols (**on same port**), or access all sorts of services * restful http/https, [h2](https://httpwg.org/specs/rfc9113.html)/[gRPC](https://grpc.io). using http/h2 in bRPC is much more friendly than [libcurl](https://curl.haxx.se/libcurl/). Access protobuf-based protocols with HTTP/h2+json, probably from another language. * [redis](docs/en/redis_client.md) and [memcached](docs/en/memcache_client.md), thread-safe, more friendly and performant than the official clients. * [rtmp](https://github.com/apache/brpc/blob/master/src/brpc/rtmp.h)/[flv](https://en.wikipedia.org/wiki/Flash_Video)/[hls](https://en.wikipedia.org/wiki/HTTP_Live_Streaming), for building [streaming services](https://github.com/brpc/media-server). * hadoop_rpc (may be opensourced) * [rdma](https://en.wikipedia.org/wiki/Remote_direct_memory_access) support * [thrift](docs/en/thrift.md) support, thread-safe, more friendly and performant than the official clients. * all sorts of protocols used in Baidu: [baidu_std](docs/cn/baidu_std.md), [streaming_rpc](docs/en/streaming_rpc.md), hulu_pbrpc, [sofa_pbrpc](https://github.com/baidu/sofa-pbrpc), nova_pbrpc, public_pbrpc, ubrpc and nshead-based ones. * Build [HA](https://en.wikipedia.org/wiki/High_availability) distributed services using an industrial-grade implementation of [RAFT consensus algorithm](https://raft.github.io) which is opensourced at [braft](https://github.com/brpc/braft) * Servers can handle requests [synchronously](docs/en/server.md) or [asynchronously](docs/en/server.md#asynchronous-service). * Clients can access servers [synchronously](docs/en/client.md#synchronus-call), [asynchronously](docs/en/client.md#asynchronous-call), [semi-synchronously](docs/en/client.md#semi-synchronous-call), or use [combo channels](docs/en/combo_channel.md) to simplify sharded or parallel accesses declaratively. * Debug services [via http](docs/en/builtin_service.md), and run [cpu](docs/cn/cpu_profiler.md), [heap](docs/cn/heap_profiler.md) and [contention](docs/cn/contention_profiler.md) profilers. * Get [better latency and throughput](docs/en/overview.md#better-latency-and-throughput). * [Extend bRPC](docs/en/new_protocol.md) with the protocols used in your organization quickly, or customize components, including [naming services](docs/cn/load_balancing.md#命名服务) (dns, zk, etcd), [load balancers](docs/cn/load_balancing.md#负载均衡) (rr, random, consistent hashing) # Try it! * Read [overview](docs/en/overview.md) to know where bRPC can be used and its advantages. * Read [getting started](docs/cn/getting_started.md) for building steps and play with [examples](https://github.com/apache/brpc/tree/master/example/). * Docs: * [Performance benchmark](docs/cn/benchmark.md) * [bvar](docs/en/bvar.md) * [bvar_c++](docs/cn/bvar_c++.md) * [bthread](docs/cn/bthread.md) * [bthread or not](docs/cn/bthread_or_not.md) * [thread-local](docs/cn/thread_local.md) * [Execution Queue](docs/cn/execution_queue.md) * Client * [Basics](docs/en/client.md) * [Error code](docs/en/error_code.md) * [Combo channels](docs/en/combo_channel.md) * [Access http/h2](docs/en/http_client.md) * [Access gRPC](docs/en/http_derivatives.md#h2grpc) * [Access thrift](docs/en/thrift.md#client-accesses-thrift-server) * [Access UB](docs/cn/ub_client.md) * [Streaming RPC](docs/en/streaming_rpc.md) * [Access redis](docs/en/redis_client.md) * [Access memcached](docs/en/memcache_client.md) * [Backup request](docs/en/backup_request.md) * [Dummy server](docs/en/dummy_server.md) * Server * [Basics](docs/en/server.md) * [Serve http/h2](docs/en/http_service.md) * [Serve gRPC](docs/en/http_derivatives.md#h2grpc) * [Serve thrift](docs/en/thrift.md#server-processes-thrift-requests) * [Serve Nshead](docs/cn/nshead_service.md) * [Debug server issues](docs/cn/server_debugging.md) * [Server push](docs/en/server_push.md) * [Avalanche](docs/cn/avalanche.md) * [Auto ConcurrencyLimiter](docs/cn/auto_concurrency_limiter.md) * [Media Server](https://github.com/brpc/media-server) * [json2pb](docs/cn/json2pb.md) * [Builtin Services](docs/en/builtin_service.md) * [status](docs/en/status.md) * [vars](docs/en/vars.md) * [connections](docs/cn/connections.md) * [flags](docs/cn/flags.md) * [rpcz](docs/cn/rpcz.md) * [cpu_profiler](docs/cn/cpu_profiler.md) * [heap_profiler](docs/cn/heap_profiler.md) * [contention_profiler](docs/cn/contention_profiler.md) * Tools * [rpc_press](docs/cn/rpc_press.md) * [rpc_replay](docs/cn/rpc_replay.md) * [rpc_view](docs/cn/rpc_view.md) * [benchmark_http](docs/cn/benchmark_http.md) * [parallel_http](docs/cn/parallel_http.md) * Others * [IOBuf](docs/en/iobuf.md) * [Streaming Log](docs/en/streaming_log.md) * [FlatMap](docs/cn/flatmap.md) * [bRPC introduction](docs/cn/brpc_intro.pptx)(training material) * [A tutorial on building large-scale services](docs/en/tutorial_on_building_services.pptx)(training material) * [bRPC internal](docs/en/brpc_internal.pptx)(training material) * RPC in depth * [New Protocol](docs/en/new_protocol.md) * [Atomic instructions](docs/en/atomic_instructions.md) * [IO](docs/en/io.md) * [Threading Overview](docs/en/threading_overview.md) * [Load Balancing](docs/cn/load_balancing.md) * [Locality-aware](docs/cn/lalb.md) * [Consistent Hashing](docs/cn/consistent_hashing.md) * [Memory Management](docs/cn/memory_management.md) * [Timer keeping](docs/cn/timer_keeping.md) * [bthread_id](docs/cn/bthread_id.md) * Use cases * [User cases](community/cases.md) # Contribute code Please refer to [here](CONTRIBUTING.md). # Feedback and Getting involved * Report bugs, ask questions or give suggestions by [Github Issues](https://github.com/apache/brpc/issues) * Subscribe to the mailing list(dev-subscribe@brpc.apache.org) to get updated with the project # Code of Conduct We follow the code of conduct from Apache Software Foundation, please refer it here [Link](https://www.apache.org/foundation/policies/conduct) ================================================ FILE: README_cn.md ================================================ [English version](README.md) [![Build Status](https://api.travis-ci.com/apache/brpc.svg?branch=master)](https://travis-ci.com/github/apache/brpc) ![brpc logo (light)](docs/images/logo.png#gh-light-mode-only) ![brpc logo (dark)](docs/images/logo-white.png#gh-dark-mode-only) [bRPC](https://brpc.apache.org/)是用C++语言编写的工业级RPC框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。 ### "bRPC"的含义是"better RPC" 你可以使用它: * 搭建能在**一个端口**支持多协议的服务, 或访问各种服务 * restful http/https, [h2](https://httpwg.org/specs/rfc9113.html)/[gRPC](https://grpc.io)。使用bRPC的http实现比[libcurl](https://curl.haxx.se/libcurl/)方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议. * [redis](docs/cn/redis_client.md)和[memcached](docs/cn/memcache_client.md), 线程安全,比官方client更方便。 * [rtmp](https://github.com/apache/brpc/blob/master/src/brpc/rtmp.h)/[flv](https://en.wikipedia.org/wiki/Flash_Video)/[hls](https://en.wikipedia.org/wiki/HTTP_Live_Streaming), 可用于搭建[流媒体服务](https://github.com/brpc/media-server). * hadoop_rpc(可能开源) * 支持[rdma](https://en.wikipedia.org/wiki/Remote_direct_memory_access) * 支持[thrift](docs/cn/thrift.md) , 线程安全,比官方client更方便 * 各种百度内使用的协议: [baidu_std](docs/cn/baidu_std.md), [streaming_rpc](docs/cn/streaming_rpc.md), hulu_pbrpc, [sofa_pbrpc](https://github.com/baidu/sofa-pbrpc), nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议. * 基于工业级的[RAFT算法](https://raft.github.io)实现搭建[高可用](https://en.wikipedia.org/wiki/High_availability)分布式系统,已在[braft](https://github.com/brpc/braft)开源。 * Server能[同步](docs/cn/server.md)或[异步](docs/cn/server.md#异步service)处理请求。 * Client支持[同步](docs/cn/client.md#同步访问)、[异步](docs/cn/client.md#异步访问)、[半同步](docs/cn/client.md#半同步),或使用[组合channels](docs/cn/combo_channel.md)简化复杂的分库或并发访问。 * [通过http界面](docs/cn/builtin_service.md)调试服务, 使用[cpu](docs/cn/cpu_profiler.md), [heap](docs/cn/heap_profiler.md), [contention](docs/cn/contention_profiler.md) profilers. * 获得[更好的延时和吞吐](docs/cn/overview.md#更好的延时和吞吐). * 把你组织中使用的协议快速地[加入bRPC](docs/cn/new_protocol.md),或定制各类组件, 包括[命名服务](docs/cn/load_balancing.md#命名服务) (dns, zk, etcd), [负载均衡](docs/cn/load_balancing.md#负载均衡) (rr, random, consistent hashing) # 试一下! * 通过[概述](docs/cn/overview.md)了解哪里可以用bRPC及其优势。 * 阅读[编译步骤](docs/cn/getting_started.md)了解如何开始使用, 之后可以运行一下[示例程序](https://github.com/apache/brpc/tree/master/example/). * 文档: * [性能测试](docs/cn/benchmark.md) * [bvar](docs/cn/bvar.md) * [bvar_c++](docs/cn/bvar_c++.md) * [bthread](docs/cn/bthread.md) * [bthread or not](docs/cn/bthread_or_not.md) * [thread-local](docs/cn/thread_local.md) * [Execution Queue](docs/cn/execution_queue.md) * [bthread tracer](docs/cn/bthread_tracer.md) * Client * [基础功能](docs/cn/client.md) * [错误码](docs/cn/error_code.md) * [组合channels](docs/cn/combo_channel.md) * [访问http/h2](docs/cn/http_client.md) * [访问gRPC](docs/cn/http_derivatives.md#h2grpc) * [访问thrift](docs/cn/thrift.md#client端访问thrift-server) * [访问UB](docs/cn/ub_client.md) * [Streaming RPC](docs/cn/streaming_rpc.md) * [访问redis](docs/cn/redis_client.md) * [访问memcached](docs/cn/memcache_client.md) * [Backup request](docs/cn/backup_request.md) * [Dummy server](docs/cn/dummy_server.md) * Server * [基础功能](docs/cn/server.md) * [搭建http/h2服务](docs/cn/http_service.md) * [搭建gRPC服务](docs/cn/http_derivatives.md#h2grpc) * [搭建thrift服务](docs/cn/thrift.md#server端处理thrift请求) * [搭建Nshead服务](docs/cn/nshead_service.md) * [高效率排查server卡顿](docs/cn/server_debugging.md) * [推送](docs/cn/server_push.md) * [雪崩](docs/cn/avalanche.md) * [自适应限流](docs/cn/auto_concurrency_limiter.md) * [流媒体服务](https://github.com/brpc/media-server) * [json2pb](docs/cn/json2pb.md) * [内置服务](docs/cn/builtin_service.md) * [status](docs/cn/status.md) * [vars](docs/cn/vars.md) * [connections](docs/cn/connections.md) * [flags](docs/cn/flags.md) * [rpcz](docs/cn/rpcz.md) * [cpu_profiler](docs/cn/cpu_profiler.md) * [heap_profiler](docs/cn/heap_profiler.md) * [contention_profiler](docs/cn/contention_profiler.md) * 工具 * [rpc_press](docs/cn/rpc_press.md) * [rpc_replay](docs/cn/rpc_replay.md) * [rpc_view](docs/cn/rpc_view.md) * [benchmark_http](docs/cn/benchmark_http.md) * [parallel_http](docs/cn/parallel_http.md) * 其他 * [IOBuf](docs/cn/iobuf.md) * [Streaming Log](docs/cn/streaming_log.md) * [FlatMap](docs/cn/flatmap.md) * [bRPC外功修炼宝典](docs/cn/brpc_intro.pptx)(培训材料) * [搭建大型服务入门](docs/en/tutorial_on_building_services.pptx)(培训材料) * [bRPC内功修炼宝典](docs/en/brpc_internal.pptx)(培训材料) * 深入RPC * [New Protocol](docs/cn/new_protocol.md) * [Atomic instructions](docs/cn/atomic_instructions.md) * [IO](docs/cn/io.md) * [Threading Overview](docs/cn/threading_overview.md) * [Load Balancing](docs/cn/load_balancing.md) * [Locality-aware](docs/cn/lalb.md) * [Consistent Hashing](docs/cn/consistent_hashing.md) * [Memory Management](docs/cn/memory_management.md) * [Timer keeping](docs/cn/timer_keeping.md) * [bthread_id](docs/cn/bthread_id.md) * Use cases inside Baidu * [百度地图api入口](docs/cn/case_apicontrol.md) * [联盟DSP](docs/cn/case_baidu_dsp.md) * [ELF学习框架](docs/cn/case_elf.md) * [云平台代理服务](docs/cn/case_ubrpc.md) # 贡献代码 请参考[这里](CONTRIBUTING.md#chinese-version)。 # 反馈和参与 * bug、疑惑、修改建议都欢迎提在[Github Issues](https://github.com/apache/brpc/issues)中 * 订阅邮件列表(dev-subscribe@brpc.apache.org)获得项目最新信息 # 行为准则 我们遵守Apache软件基金会的行为准则, 请参考如下 [链接](https://www.apache.org/foundation/policies/conduct) ================================================ FILE: WORKSPACE.bzlmod ================================================ ================================================ FILE: config.h.in ================================================ // 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. #ifndef BUTIL_CONFIG_H #define BUTIL_CONFIG_H #ifdef BRPC_WITH_GLOG #undef BRPC_WITH_GLOG #endif #cmakedefine BRPC_WITH_GLOG @WITH_GLOG_VAL@ #endif // BUTIL_CONFIG_H ================================================ FILE: config_brpc.sh ================================================ #!/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. 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,nodebugsymbols,werror -n 'config_brpc' -- "$@"` WITH_GLOG=0 WITH_THRIFT=0 WITH_RDMA=0 WITH_MESALINK=0 WITH_BTHREAD_TRACER=0 WITH_ASAN=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 ;; --nodebugsymbols ) DEBUGSYMBOLS=; shift 1 ;; --werror ) WERROR=-Werror; shift 1 ;; -- ) shift; break ;; * ) break ;; esac done 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 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 # 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" 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 PROTOBUF_LIB=$(find_dir_of_lib_or_die protobuf) append_linking $PROTOBUF_LIB protobuf LEVELDB_LIB=$(find_dir_of_lib_or_die leveldb) # 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) 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" else CXXFLAGS="-std=c++0x" 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 " 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 # write to config.mk $ECHO "$OUTPUT_CONTENT" > config.mk