Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using cmake to create protobuf / grpc cc files

If I want to recreate the following protoc command in cmake:

protoc -I ../proto/ --cpp_out=. service.proto

I use the following lines in cmake:

file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto")
PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles})

If I instead want to recreate the protoc command below:

protoc -I ../proto/ --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` service.proto

In the case above I am not able to determine how to change the cmake file, please help!

The Question is how do I address the:

--plugin=EXECUTABLE           Specifies a plugin executable to use.
                              Normally, protoc searches the PATH for
                              plugins, but you may specify additional
                              executables not in the path using this flag.
                              Additionally, EXECUTABLE may be of the form
                              NAME=PATH, in which case the given plugin name
                              is mapped to the given executable even if
                              the executable's own name differs.

I have been reading the PROTOBUF_GENERATE_CPP documentation, but did not find an answer!

like image 923
Martin Christiansen Avatar asked Sep 28 '15 12:09

Martin Christiansen


2 Answers

Starting at version 3.12, protobuf_generate supports a PLUGIN argument

https://github.com/protocolbuffers/protobuf/blob/v3.12.0/cmake/protobuf-config.cmake.in#L46

so you could try something along the line: PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles} PLUGIN protoc-gen-grpc=${GRPC_CPP_PLUGIN_PATH})

like image 93
Julien Pilet Avatar answered Sep 19 '22 15:09

Julien Pilet


For me the blogpost https://www.falkoaxmann.de/dev/2020/11/08/grpc-plugin-cmake-support.html lead to success because it provides a full example (thanks @powerpete).

I'm putting the code here so it is available as an answer and not just as a comment:

project(my-service VERSION 1.0 LANGUAGES CXX C)

find_package(protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)
find_package(Threads)

set(PROTO_FILES
    MyService.proto
)

# protobuf source files go into the lib just like any other CPP source file
add_library(my-service ${PROTO_FILES})
target_link_libraries(my-service
    PUBLIC
        protobuf::libprotobuf
        gRPC::grpc
        gRPC::grpc++
)

target_include_directories(my-service
    PUBLIC
        ${CMAKE_CURRENT_BINARY_DIR}
)

get_target_property(grpc_cpp_plugin_location gRPC::grpc_cpp_plugin LOCATION)

# compile the message types
protobuf_generate(TARGET my-service LANGUAGE cpp)

# compile the GRPC services
protobuf_generate(
    TARGET
        my-service
    LANGUAGE
        grpc
    GENERATE_EXTENSIONS
        .grpc.pb.h
        .grpc.pb.cc
    PLUGIN
        "protoc-gen-grpc=${grpc_cpp_plugin_location}"
)
like image 43
bselu Avatar answered Sep 20 '22 15:09

bselu