From e3e3b2aec8fc7ac45f3b8f7d0adfdb7cdce2bd1f Mon Sep 17 00:00:00 2001 From: Makarand Dharmapurikar Date: Tue, 7 Mar 2017 16:12:56 -0800 Subject: changes for picking up well known protos Add dependency and protoc argument for picking up well known protos from the //third_party/protobuf repo --- bazel/cc_grpc_library.bzl | 7 ++++++- bazel/generate_cc.bzl | 17 ++++++++++++++++- bazel/grpc_build_system.bzl | 4 +++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/bazel/cc_grpc_library.bzl b/bazel/cc_grpc_library.bzl index b9d7eb5902..ab1add476e 100644 --- a/bazel/cc_grpc_library.bzl +++ b/bazel/cc_grpc_library.bzl @@ -2,7 +2,7 @@ load("//:bazel/generate_cc.bzl", "generate_cc") -def cc_grpc_library(name, srcs, deps, proto_only, use_external = False, **kwargs): +def cc_grpc_library(name, srcs, deps, proto_only, well_known_protos, use_external = False, **kwargs): """Generates C++ grpc classes from a .proto file. Assumes the generated classes will be used in cc_api_version = 2. @@ -12,6 +12,9 @@ def cc_grpc_library(name, srcs, deps, proto_only, use_external = False, **kwargs srcs: a single proto_library, which wraps the .proto files with services. deps: a list of C++ proto_library (or cc_proto_library) which provides the compiled code of any message that the services depend on. + well_known_protos: The target from protobuf library that exports well + known protos. Currently it will only work if the value is + "@submodule_protobuf//:well_known_protos" use_external: When True the grpc deps are prefixed with //external. This allows grpc to be used as a dependency in other bazel projects. **kwargs: rest of arguments, e.g., compatible_with and visibility. @@ -35,6 +38,7 @@ def cc_grpc_library(name, srcs, deps, proto_only, use_external = False, **kwargs generate_cc( name = codegen_target, srcs = [proto_target], + well_known_protos = well_known_protos, **kwargs ) @@ -49,6 +53,7 @@ def cc_grpc_library(name, srcs, deps, proto_only, use_external = False, **kwargs name = codegen_grpc_target, srcs = [proto_target], plugin = plugin, + well_known_protos = well_known_protos, **kwargs ) diff --git a/bazel/generate_cc.bzl b/bazel/generate_cc.bzl index d49cbe8d72..f3961f0a41 100644 --- a/bazel/generate_cc.bzl +++ b/bazel/generate_cc.bzl @@ -31,8 +31,20 @@ def generate_cc_impl(ctx): arguments += ["-I{0}={0}".format(include.path) for include in includes] arguments += [proto.path for proto in protos] + # create a list of well known proto files if the argument is non-None + well_known_proto_files = [] + if ctx.attr.well_known_protos: + f = ctx.attr.well_known_protos.files.to_list()[0].dirname + if f != "external/submodule_protobuf/src/google/protobuf": + print("Error: Only @submodule_protobuf//:well_known_protos is supported") + else: + # f points to "external/submodule_protobuf/src/google/protobuf" + # add -I argument to protoc so it knows where to look for the proto files. + arguments += ["-I{0}".format(f + "/../..")] + well_known_proto_files = [f for f in ctx.attr.well_known_protos.files] + ctx.action( - inputs = protos + includes + additional_input, + inputs = protos + includes + additional_input + well_known_proto_files, outputs = out_files, executable = ctx.executable._protoc, arguments = arguments, @@ -56,6 +68,9 @@ generate_cc = rule( mandatory = False, allow_empty = True, ), + "well_known_protos" : attr.label( + mandatory = False, + ), "_protoc": attr.label( default = Label("//external:protocol_compiler"), executable = True, diff --git a/bazel/grpc_build_system.bzl b/bazel/grpc_build_system.bzl index 855d2d7b72..8b524bd0e5 100644 --- a/bazel/grpc_build_system.bzl +++ b/bazel/grpc_build_system.bzl @@ -58,11 +58,13 @@ def grpc_proto_plugin(name, srcs = [], deps = []): load("//:bazel/cc_grpc_library.bzl", "cc_grpc_library") -def grpc_proto_library(name, srcs = [], deps = [], well_known_deps = [], has_services = True, use_external = False): +def grpc_proto_library(name, srcs = [], deps = [], well_known_protos = None, + has_services = True, use_external = False): cc_grpc_library( name = name, srcs = srcs, deps = deps, + well_known_protos = well_known_protos, proto_only = not has_services, use_external = use_external, ) -- cgit v1.2.3