From f2a4b879b1cddce84c56de63809e831aea53d1ba Mon Sep 17 00:00:00 2001
From: Frank Lange <langefrq@gmx.de>
Date: Fri, 30 Apr 2021 22:56:39 +0200
Subject: [PATCH] FindProtobuf: Add PLUGIN parameter to protobuf_generate

This allows for example reusing the function for generating gRPC code by
specifying which grpc plugin to use.
---
 Modules/FindProtobuf.cmake                         |  8 ++++++--
 Tests/FindProtobuf/CMakeLists.txt                  |  1 +
 Tests/FindProtobuf/Test/CMakeLists.txt             | 13 +++++++++++++
 Tests/FindProtobuf/Test/main-generate-grpc.cxx     |  6 ++++++
 Tests/FindProtobuf/Test/msgs/example_service.proto |  8 ++++++++
 5 files changed, 34 insertions(+), 2 deletions(-)
 create mode 100644 Tests/FindProtobuf/Test/main-generate-grpc.cxx
 create mode 100644 Tests/FindProtobuf/Test/msgs/example_service.proto

diff --git a/Modules/FindProtobuf.cmake b/Modules/FindProtobuf.cmake
index 4b1e336893..c73a2d81ab 100644
--- a/Modules/FindProtobuf.cmake
+++ b/Modules/FindProtobuf.cmake
@@ -140,7 +140,7 @@ Example:
 
 function(protobuf_generate)
   set(_options APPEND_PATH DESCRIPTORS)
-  set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR)
+  set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR PLUGIN)
   if(COMMAND target_sources)
     list(APPEND _singleargs TARGET)
   endif()
@@ -171,6 +171,10 @@ function(protobuf_generate)
     set(_dll_export_decl "dllexport_decl=${protobuf_generate_EXPORT_MACRO}:")
   endif()
 
+  if(protobuf_generate_PLUGIN)
+    set(_plugin "--plugin=${protobuf_generate_PLUGIN}")
+  endif()
+
   if(NOT protobuf_generate_GENERATE_EXTENSIONS)
     if(protobuf_generate_LANGUAGE STREQUAL cpp)
       set(protobuf_generate_GENERATE_EXTENSIONS .pb.h .pb.cc)
@@ -245,7 +249,7 @@ function(protobuf_generate)
     add_custom_command(
       OUTPUT ${_generated_srcs}
       COMMAND  protobuf::protoc
-      ARGS --${protobuf_generate_LANGUAGE}_out ${_dll_export_decl}${protobuf_generate_PROTOC_OUT_DIR} ${_dll_desc_out} ${_protobuf_include_path} ${_abs_file}
+      ARGS --${protobuf_generate_LANGUAGE}_out ${_dll_export_decl}${protobuf_generate_PROTOC_OUT_DIR} ${_plugin} ${_dll_desc_out} ${_protobuf_include_path} ${_abs_file}
       DEPENDS ${_abs_file} protobuf::protoc
       COMMENT "Running ${protobuf_generate_LANGUAGE} protocol buffer compiler on ${_proto}"
       VERBATIM )
diff --git a/Tests/FindProtobuf/CMakeLists.txt b/Tests/FindProtobuf/CMakeLists.txt
index 1cdb2ae13b..b4ca29bc73 100644
--- a/Tests/FindProtobuf/CMakeLists.txt
+++ b/Tests/FindProtobuf/CMakeLists.txt
@@ -6,5 +6,6 @@ add_test(NAME FindProtobuf.Test COMMAND
   ${build_generator_args}
   --build-project TestFindProtobuf
   --build-options ${build_options}
+  "-DCMake_TEST_FindProtobuf_gRPC=${CMake_TEST_FindProtobuf_gRPC}"
   --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
   )
diff --git a/Tests/FindProtobuf/Test/CMakeLists.txt b/Tests/FindProtobuf/Test/CMakeLists.txt
index fc6b37e951..84041eaf4e 100644
--- a/Tests/FindProtobuf/Test/CMakeLists.txt
+++ b/Tests/FindProtobuf/Test/CMakeLists.txt
@@ -52,3 +52,16 @@ target_include_directories(test_desc PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 target_link_libraries(test_desc msgs ${Protobuf_LIBRARIES})
 target_compile_features(test_desc PRIVATE cxx_std_11)
 add_test(NAME test_desc COMMAND test_desc ${DESC_PROTO_DESC})
+
+if(CMake_TEST_FindProtobuf_gRPC)
+  find_program(gRPC_CPP_PLUGIN grpc_cpp_plugin)
+  add_library(msgs_grpc msgs/example_service.proto)
+  target_include_directories(msgs_grpc PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
+  target_link_libraries(msgs_grpc PUBLIC ${Protobuf_LIBRARIES})
+  protobuf_generate(TARGET msgs_grpc LANGUAGE cpp)
+  protobuf_generate(TARGET msgs_grpc LANGUAGE grpc GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc PLUGIN "protoc-gen-grpc=${gRPC_CPP_PLUGIN}")
+
+  add_executable(test_generate_grpc main-generate-grpc.cxx)
+  target_link_libraries(test_generate_grpc PRIVATE msgs_grpc)
+  add_test(NAME test_generate_grpc COMMAND test_generate_grpc)
+endif()
diff --git a/Tests/FindProtobuf/Test/main-generate-grpc.cxx b/Tests/FindProtobuf/Test/main-generate-grpc.cxx
new file mode 100644
index 0000000000..070c6b46e7
--- /dev/null
+++ b/Tests/FindProtobuf/Test/main-generate-grpc.cxx
@@ -0,0 +1,6 @@
+#include <msgs/example_service.grpc.pb.h>
+
+int main()
+{
+  return 0;
+}
diff --git a/Tests/FindProtobuf/Test/msgs/example_service.proto b/Tests/FindProtobuf/Test/msgs/example_service.proto
new file mode 100644
index 0000000000..f35eeb5389
--- /dev/null
+++ b/Tests/FindProtobuf/Test/msgs/example_service.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+package example.msgs;
+
+import "google/protobuf/empty.proto";
+
+service ExampleService {
+    rpc nothing(google.protobuf.Empty) returns (google.protobuf.Empty) {}
+}
-- 
GitLab