diff options
Diffstat (limited to 'bazel/generate_cc.bzl')
-rw-r--r-- | bazel/generate_cc.bzl | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/bazel/generate_cc.bzl b/bazel/generate_cc.bzl new file mode 100644 index 0000000000..3665733681 --- /dev/null +++ b/bazel/generate_cc.bzl @@ -0,0 +1,66 @@ +"""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] + else: + arguments += ["--cpp_out=" + ",".join(ctx.attr.flags) + ":" + dir_out] + arguments += ["-I{0}={0}".format(include.path) for include in includes] + arguments += [proto.path for proto in protos] + + ctx.action( + inputs = protos + includes, + 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, +) |