aboutsummaryrefslogtreecommitdiffhomepage
path: root/bazel/generate_cc.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'bazel/generate_cc.bzl')
-rw-r--r--bazel/generate_cc.bzl68
1 files changed, 68 insertions, 0 deletions
diff --git a/bazel/generate_cc.bzl b/bazel/generate_cc.bzl
new file mode 100644
index 0000000000..d49cbe8d72
--- /dev/null
+++ b/bazel/generate_cc.bzl
@@ -0,0 +1,68 @@
+"""Generates C++ grpc stubs from proto_library rules.
+
+This is an internal rule used by cc_grpc_library, and shouldn't be used
+directly.
+"""
+
+def generate_cc_impl(ctx):
+ """Implementation of the generate_cc rule."""
+ protos = [f for src in ctx.attr.srcs for f in src.proto.direct_sources]
+ includes = [f for src in ctx.attr.srcs for f in src.proto.transitive_imports]
+ outs = []
+ if ctx.executable.plugin:
+ outs += [proto.basename[:-len(".proto")] + ".grpc.pb.h" for proto in protos]
+ outs += [proto.basename[:-len(".proto")] + ".grpc.pb.cc" for proto in protos]
+ else:
+ outs += [proto.basename[:-len(".proto")] + ".pb.h" for proto in protos]
+ outs += [proto.basename[:-len(".proto")] + ".pb.cc" for proto in protos]
+ out_files = [ctx.new_file(out) for out in outs]
+ # The following should be replaced with ctx.configuration.buildout
+ # whenever this is added to Skylark.
+ dir_out = out_files[0].dirname[:-len(protos[0].dirname)]
+
+ arguments = []
+ if ctx.executable.plugin:
+ arguments += ["--plugin=protoc-gen-PLUGIN=" + ctx.executable.plugin.path]
+ arguments += ["--PLUGIN_out=" + ",".join(ctx.attr.flags) + ":" + dir_out]
+ additional_input = [ctx.executable.plugin]
+ else:
+ arguments += ["--cpp_out=" + ",".join(ctx.attr.flags) + ":" + dir_out]
+ additional_input = []
+ arguments += ["-I{0}={0}".format(include.path) for include in includes]
+ arguments += [proto.path for proto in protos]
+
+ ctx.action(
+ inputs = protos + includes + additional_input,
+ outputs = out_files,
+ executable = ctx.executable._protoc,
+ arguments = arguments,
+ )
+
+ return struct(files=set(out_files))
+
+generate_cc = rule(
+ attrs = {
+ "srcs": attr.label_list(
+ mandatory = True,
+ non_empty = True,
+ providers = ["proto"],
+ ),
+ "plugin": attr.label(
+ executable = True,
+ providers = ["files_to_run"],
+ cfg = "host",
+ ),
+ "flags": attr.string_list(
+ mandatory = False,
+ allow_empty = True,
+ ),
+ "_protoc": attr.label(
+ default = Label("//external:protocol_compiler"),
+ executable = True,
+ cfg = "host",
+ ),
+ },
+ # We generate .h files, so we need to output to genfiles.
+ output_to_genfiles = True,
+ implementation = generate_cc_impl,
+)