# 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() |