From 8e34e0b92015f24969f4710da5f765c6faf8bbb7 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sun, 8 Nov 2020 08:09:25 -0800 Subject: [PATCH] scons: Add support for GRPC protobuf files. These files are used to generate stubs for calling across GRPC protocols, an RPC mechanism which is based around the protocol buffer system. The support for these files is heavily based on and calls into the existing protobuf file support, but with the extra step which generates the additional .grpc.pb.cc and .grpc.pb.h files. Change-Id: I89022928c08aa9f7ed024b7380ddcc54ca75b55e Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/37277 Reviewed-by: Nikos Nikoleris Maintainer: Gabe Black Tested-by: kokoro --- src/SConscript | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/SConscript b/src/SConscript index 12f7abf2e..9446242c4 100644 --- a/src/SConscript +++ b/src/SConscript @@ -41,6 +41,7 @@ from __future__ import print_function import array import bisect +import distutils.spawn import functools import imp import os @@ -435,6 +436,45 @@ class ProtoBuf(SourceFile): append={'CXXFLAGS': '-Wno-array-bounds'}) + +env['PROTOC_GRPC'] = distutils.spawn.find_executable('grpc_cpp_plugin') +if env['PROTOC_GRPC']: + env.Append(LIBS=['grpc++']) + +def protoc_grpc_emitter(target, source, env): + root, ext = os.path.splitext(source[0].get_abspath()) + return [root + '.grpc.pb.cc', root + '.grpc.pb.h'], source + +env.Append(BUILDERS={'GrpcProtoBufCC' : Builder( + action=MakeAction('${PROTOC} --grpc_out ${BUILDDIR} ' + '--plugin=protoc-gen-grpc=${PROTOC_GRPC} ' + '--proto_path ${BUILDDIR} ' + '${SOURCE.get_abspath()}', + Transform("PROTOC")), + emitter=protoc_grpc_emitter + )}) + +class GrpcProtoBuf(SourceFile): + '''Add a GRPC protocol buffer to the build''' + + def __init__(self, source, tags=None, add_tags=None): + '''Specify the source file, and any tags''' + + super(GrpcProtoBuf, self).__init__(source, tags, add_tags) + + if not env['PROTOC_GRPC']: + error('No grpc_cpp_plugin found') + + self.cc_file, self.hh_file = env.GrpcProtoBufCC(source=source) + + # We still need to build the normal protobuf code too. + self.protobuf = ProtoBuf(source, tags=self.tags) + + # Add the C++ source file. + Source(self.cc_file, tags=self.tags, + append={'CXXFLAGS': '-Wno-array-bounds'}) + + exectuable_classes = [] class ExecutableMeta(type): '''Meta class for Executables.''' @@ -573,6 +613,7 @@ Export('Source') Export('PySource') Export('SimObject') Export('ProtoBuf') +Export('GrpcProtoBuf') Export('Executable') Export('UnitTest') Export('GTest') -- 2.30.2