| # Minimum CMake required | |
| cmake_minimum_required(VERSION 2.8) | |
| # Project | |
| project(HelloWorld CXX) | |
| # Protobuf | |
| set(protobuf_MODULE_COMPATIBLE TRUE) | |
| find_package(protobuf CONFIG REQUIRED) | |
| message(STATUS "Using protobuf ${protobuf_VERSION}") | |
| # gRPC | |
| find_package(gRPC CONFIG REQUIRED) | |
| message(STATUS "Using gRPC ${gRPC_VERSION}") | |
| # gRPC C++ plugin | |
| get_target_property(gRPC_CPP_PLUGIN_EXECUTABLE gRPC::grpc_cpp_plugin | |
| IMPORTED_LOCATION_RELEASE) | |
| # Proto file | |
| get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE) | |
| get_filename_component(hw_proto_path "${hw_proto}" PATH) | |
| # Generated sources | |
| protobuf_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 directory | |
| include_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() |