| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | # Minimum CMake requiredcmake_minimum_required(VERSION 2.8)# Projectproject(HelloWorld C CXX)if(NOT MSVC)  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")else()  add_definitions(-D_WIN32_WINNT=0x600)endif()# Protobuf# NOTE: we cannot use "CONFIG" mode here because protobuf-config.cmake# is broken when used with CMAKE_INSTALL_PREFIXfind_package(Protobuf REQUIRED)message(STATUS "Using protobuf ${protobuf_VERSION}")# {Protobuf,PROTOBUF}_FOUND is defined based on find_package type ("MODULE" vs "CONFIG").# For "MODULE", the case has also changed between cmake 3.5 and 3.6.# We use the legacy uppercase version for *_LIBRARIES AND *_INCLUDE_DIRS variables# as newer cmake versions provide them too for backward compatibility.if(Protobuf_FOUND OR PROTOBUF_FOUND)  if(TARGET protobuf::libprotobuf)    set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)  else()    set(_PROTOBUF_LIBPROTOBUF ${PROTOBUF_LIBRARIES})    include_directories(${PROTOBUF_INCLUDE_DIRS})  endif()  if(TARGET protobuf::protoc)    set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)  else()    set(_PROTOBUF_PROTOC ${PROTOBUF_PROTOC_EXECUTABLE})  endif()else()  message(WARNING "Failed to locate libprotobuf and protoc!")endif()# gRPCfind_package(gRPC CONFIG REQUIRED)message(STATUS "Using gRPC ${gRPC_VERSION}")# gRPC C++ pluginget_target_property(gRPC_CPP_PLUGIN_EXECUTABLE gRPC::grpc_cpp_plugin    IMPORTED_LOCATION_RELEASE)# Proto fileget_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE)get_filename_component(hw_proto_path "${hw_proto}" PATH)# Generated sourcesprotobuf_generate_cpp(hw_proto_srcs hw_proto_hdrs "${hw_proto}")set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc")set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h")add_custom_command(      OUTPUT "${hw_grpc_srcs}" "${hw_grpc_hdrs}"      COMMAND ${_PROTOBUF_PROTOC}      ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" -I "${hw_proto_path}"        --plugin=protoc-gen-grpc="${gRPC_CPP_PLUGIN_EXECUTABLE}"        "${hw_proto}"      DEPENDS "${hw_proto}")# Generated include directoryinclude_directories("${CMAKE_CURRENT_BINARY_DIR}")# Targets greeter_[async_](client|server)foreach(_target  greeter_client greeter_server  greeter_async_client greeter_async_server)  add_executable(${_target} "${_target}.cc"    ${hw_proto_srcs}    ${hw_grpc_srcs})  target_link_libraries(${_target}    ${_PROTOBUF_LIBPROTOBUF}    gRPC::grpc++_unsecure)endforeach()
 |