# 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.10) project(echo_c++_ubrpc_compack C CXX) option(LINK_SO "Whether examples are linked dynamically" OFF) execute_process( COMMAND bash -c "find ${PROJECT_SOURCE_DIR}/../.. -type d -regex \".*output/include$\" | head -n1 | xargs dirname | tr -d '\n'" OUTPUT_VARIABLE OUTPUT_PATH ) set(CMAKE_PREFIX_PATH ${OUTPUT_PATH}) include(FindThreads) include(FindProtobuf) protobuf_generate_cpp(PROTO_SRC PROTO_HEADER echo.proto) # include PROTO_HEADER include_directories(${CMAKE_CURRENT_BINARY_DIR}) # Search for libthrift* by best effort. If it is not found and brpc is # compiled with thrift protocol enabled, a link error would be reported. find_library(THRIFT_LIB NAMES thrift) if (NOT THRIFT_LIB) set(THRIFT_LIB "") endif() find_library(THRIFTNB_LIB NAMES thriftnb) if (NOT THRIFTNB_LIB) set(THRIFTNB_LIB "") endif() find_path(BRPC_INCLUDE_PATH NAMES brpc/server.h) if(LINK_SO) find_library(BRPC_LIB NAMES brpc) else() find_library(BRPC_LIB NAMES libbrpc.a brpc) endif() if((NOT BRPC_INCLUDE_PATH) OR (NOT BRPC_LIB)) message(FATAL_ERROR "Fail to find brpc") endif() include_directories(${BRPC_INCLUDE_PATH}) find_path(GFLAGS_INCLUDE_PATH gflags/gflags.h) find_library(GFLAGS_LIBRARY NAMES gflags libgflags) if((NOT GFLAGS_INCLUDE_PATH) OR (NOT GFLAGS_LIBRARY)) message(FATAL_ERROR "Fail to find gflags") endif() include_directories(${GFLAGS_INCLUDE_PATH}) execute_process( COMMAND bash -c "grep \"namespace [_A-Za-z0-9]\\+ {\" ${GFLAGS_INCLUDE_PATH}/gflags/gflags_declare.h | head -1 | awk '{print $2}' | tr -d '\n'" OUTPUT_VARIABLE GFLAGS_NS ) if(${GFLAGS_NS} STREQUAL "GFLAGS_NAMESPACE") execute_process( COMMAND bash -c "grep \"#define GFLAGS_NAMESPACE [_A-Za-z0-9]\\+\" ${GFLAGS_INCLUDE_PATH}/gflags/gflags_declare.h | head -1 | awk '{print $3}' | tr -d '\n'" OUTPUT_VARIABLE GFLAGS_NS ) endif() 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() endif() set(CMAKE_CPP_FLAGS "${DEFINE_CLOCK_GETTIME} -DGFLAGS_NS=${GFLAGS_NS}") set(CMAKE_CXX_FLAGS "${CMAKE_CPP_FLAGS} -DNDEBUG -O2 -D__const__= -pipe -W -Wall -Wno-unused-parameter -fPIC -fno-omit-frame-pointer") 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() 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() include_directories(${LEVELDB_INCLUDE_PATH}) find_library(SSL_LIB NAMES ssl) if (NOT SSL_LIB) message(FATAL_ERROR "Fail to find ssl") endif() find_library(CRYPTO_LIB NAMES crypto) if (NOT CRYPTO_LIB) message(FATAL_ERROR "Fail to find crypto") endif() set(DYNAMIC_LIB ${CMAKE_THREAD_LIBS_INIT} ${GFLAGS_LIBRARY} ${PROTOBUF_LIBRARIES} ${LEVELDB_LIB} ${SSL_LIB} ${CRYPTO_LIB} ${THRIFT_LIB} ${THRIFTNB_LIB} dl ) if(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") endif() execute_process( COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ${PROTO_FLAGS} --cpp_out=${CMAKE_CURRENT_BINARY_DIR} --proto_path=${PROTOBUF_INCLUDE_DIR} --proto_path=${PROJECT_SOURCE_DIR} --plugin=protoc-gen-mcpack=${OUTPUT_PATH}/bin/protoc-gen-mcpack --mcpack_out=${CMAKE_CURRENT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/echo.proto WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) add_executable(echo_ubrpc_compack_client client.cpp ${CMAKE_CURRENT_BINARY_DIR}/echo.pb.cc) add_executable(echo_ubrpc_compack_server server.cpp ${CMAKE_CURRENT_BINARY_DIR}/echo.pb.cc) target_link_libraries(echo_ubrpc_compack_client ${BRPC_LIB} ${DYNAMIC_LIB}) target_link_libraries(echo_ubrpc_compack_server ${BRPC_LIB} ${DYNAMIC_LIB})