# 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 3.16...3.28) 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.17.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 MATCHES "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(BRPC_COMMON_COMPILE_OPTIONS) set(BRPC_COMMON_DEFINITIONS) set(BRPC_COMMON_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ) set(BRPC_COMMON_LINK_OPTIONS) set(BRPC_CXX_STANDARD 11) set(WITH_GLOG_VAL "0") if(WITH_GLOG) set(WITH_GLOG_VAL "1") set(BRPC_WITH_GLOG 1) endif() if(WITH_DEBUG_SYMBOLS) list(APPEND BRPC_COMMON_COMPILE_OPTIONS -g) endif() set(WITH_DEBUG_LOCK_VAL "0") if(WITH_DEBUG_LOCK) set(WITH_DEBUG_LOCK_VAL "1") endif() if(WITH_THRIFT) list(APPEND BRPC_COMMON_DEFINITIONS ENABLE_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) list(APPEND BRPC_COMMON_DEFINITIONS BRPC_BTHREAD_TRACER) list(APPEND BRPC_COMMON_INCLUDE_DIRS ${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) execute_process( COMMAND bash -c "${PROJECT_SOURCE_DIR}/tools/get_brpc_revision.sh ${PROJECT_SOURCE_DIR} | tr -d '\n'" OUTPUT_VARIABLE BRPC_REVISION ) string(REPLACE "\\|" "|" BRPC_REVISION "${BRPC_REVISION}") if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") include(CheckFunctionExists) CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME) if(NOT HAVE_CLOCK_GETTIME) list(APPEND BRPC_COMMON_DEFINITIONS NO_CLOCK_GETTIME_IN_MAC) endif() list(APPEND BRPC_COMMON_COMPILE_OPTIONS -Wno-deprecated-declarations -Wno-inconsistent-missing-override ) endif() list(APPEND BRPC_COMMON_DEFINITIONS BRPC_WITH_GLOG=${WITH_GLOG_VAL} BRPC_WITH_RDMA=${WITH_RDMA_VAL} BRPC_DEBUG_BTHREAD_SCHE_SAFETY=${WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL} BRPC_DEBUG_LOCK=${WITH_DEBUG_LOCK_VAL} BTHREAD_USE_FAST_PTHREAD_MUTEX __const__=__unused__ _GNU_SOURCE USE_SYMBOLIZE NO_TCMALLOC __STDC_FORMAT_MACROS __STDC_LIMIT_MACROS __STDC_CONSTANT_MACROS __STRICT_ANSI__ ) if(NOT DEBUG) list(APPEND BRPC_COMMON_DEFINITIONS NDEBUG) endif() if(WITH_ASAN) list(APPEND BRPC_COMMON_COMPILE_OPTIONS -fsanitize=address) list(APPEND BRPC_COMMON_LINK_OPTIONS -fsanitize=address) endif() if(WITH_MESALINK) list(APPEND BRPC_COMMON_DEFINITIONS USE_MESALINK) endif() list(APPEND BRPC_COMMON_COMPILE_OPTIONS -O2 -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-unused-parameter -fno-omit-frame-pointer "-DBRPC_REVISION=\"${BRPC_REVISION}\"" $<$:-Wno-invalid-offsetof> ) 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)) list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-msse4> $<$:-msse4.2> ) elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")) # segmentation fault in libcontext list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-fno-gcse>) elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64")) # RISC-V specific optimizations option(WITH_RISCV_ZBC "Enable RISC-V Zbc carry-less multiplication for CRC32C acceleration" OFF) option(WITH_RISCV_ZVBC "Enable RISC-V Zvbc vector carry-less multiplication for CRC32C acceleration" OFF) if(WITH_RISCV_ZVBC) list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-march=rv64gcv_zbc_zvbc>) elseif(WITH_RISCV_ZBC) list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-march=rv64gc_zbc>) else() list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-march=rv64gc>) endif() endif() if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)) list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-Wno-aligned-new>) endif() endif() find_package(Protobuf REQUIRED) if(Protobuf_VERSION VERSION_GREATER 4.21) # required by absl set(BRPC_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_globals absl::log_severity absl::memory absl::node_hash_map absl::node_hash_set absl::random_distributions absl::random_random absl::span absl::status absl::statusor absl::strings absl::synchronization absl::time absl::type_traits absl::utility absl::variant ) 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() list(APPEND BRPC_COMMON_INCLUDE_DIRS ${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() list(APPEND BRPC_COMMON_INCLUDE_DIRS ${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() list(APPEND BRPC_COMMON_INCLUDE_DIRS ${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() list(APPEND BRPC_COMMON_INCLUDE_DIRS ${RDMA_INCLUDE_PATH}) 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) list(APPEND BRPC_COMMON_INCLUDE_DIRS ${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 REQUIRED) list(APPEND BRPC_COMMON_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR}) endif() list(APPEND BRPC_COMMON_INCLUDE_DIRS ${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() list(REMOVE_DUPLICATES BRPC_COMMON_INCLUDE_DIRS) add_library(brpc_common_config INTERFACE) target_include_directories(brpc_common_config INTERFACE ${BRPC_COMMON_INCLUDE_DIRS}) target_compile_definitions(brpc_common_config INTERFACE ${BRPC_COMMON_DEFINITIONS}) target_compile_options(brpc_common_config INTERFACE ${BRPC_COMMON_COMPILE_OPTIONS}) target_compile_features(brpc_common_config INTERFACE cxx_std_${BRPC_CXX_STANDARD}) if(BRPC_COMMON_LINK_OPTIONS) target_link_options(brpc_common_config INTERFACE ${BRPC_COMMON_LINK_OPTIONS}) 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 CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/bvar/*.cpp") file(GLOB_RECURSE BTHREAD_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/bthread/*.cpp") file(GLOB_RECURSE JSON2PB_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/json2pb/*.cpp") file(GLOB_RECURSE BRPC_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/brpc/*.cpp") file(GLOB_RECURSE THRIFT_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/brpc/thrift*.cpp") file(GLOB_RECURSE EXCLUDE_SOURCES CONFIGURE_DEPENDS "${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 brpc/rdma/rdma_handshake.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}) target_link_libraries(PROTO_LIB PRIVATE brpc_common_config) 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)