xref: /aosp_15_r20/external/protobuf/protobuf.bzl (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Workerload("@bazel_skylib//lib:versions.bzl", "versions")
2*1b3f573fSAndroid Build Coastguard Workerload("@rules_cc//cc:defs.bzl", "cc_library")
3*1b3f573fSAndroid Build Coastguard Workerload("@rules_proto//proto:defs.bzl", "ProtoInfo")
4*1b3f573fSAndroid Build Coastguard Workerload("@rules_python//python:defs.bzl", "py_library", "py_test")
5*1b3f573fSAndroid Build Coastguard Worker
6*1b3f573fSAndroid Build Coastguard Workerdef _GetPath(ctx, path):
7*1b3f573fSAndroid Build Coastguard Worker    if ctx.label.workspace_root:
8*1b3f573fSAndroid Build Coastguard Worker        return ctx.label.workspace_root + "/" + path
9*1b3f573fSAndroid Build Coastguard Worker    else:
10*1b3f573fSAndroid Build Coastguard Worker        return path
11*1b3f573fSAndroid Build Coastguard Worker
12*1b3f573fSAndroid Build Coastguard Workerdef _IsNewExternal(ctx):
13*1b3f573fSAndroid Build Coastguard Worker    # Bazel 0.4.4 and older have genfiles paths that look like:
14*1b3f573fSAndroid Build Coastguard Worker    #   bazel-out/local-fastbuild/genfiles/external/repo/foo
15*1b3f573fSAndroid Build Coastguard Worker    # After the exec root rearrangement, they look like:
16*1b3f573fSAndroid Build Coastguard Worker    #   ../repo/bazel-out/local-fastbuild/genfiles/foo
17*1b3f573fSAndroid Build Coastguard Worker    return ctx.label.workspace_root.startswith("../")
18*1b3f573fSAndroid Build Coastguard Worker
19*1b3f573fSAndroid Build Coastguard Workerdef _GenDir(ctx):
20*1b3f573fSAndroid Build Coastguard Worker    if _IsNewExternal(ctx):
21*1b3f573fSAndroid Build Coastguard Worker        # We are using the fact that Bazel 0.4.4+ provides repository-relative paths
22*1b3f573fSAndroid Build Coastguard Worker        # for ctx.genfiles_dir.
23*1b3f573fSAndroid Build Coastguard Worker        return ctx.genfiles_dir.path + (
24*1b3f573fSAndroid Build Coastguard Worker            "/" + ctx.attr.includes[0] if ctx.attr.includes and ctx.attr.includes[0] else ""
25*1b3f573fSAndroid Build Coastguard Worker        )
26*1b3f573fSAndroid Build Coastguard Worker
27*1b3f573fSAndroid Build Coastguard Worker    # This means that we're either in the old version OR the new version in the local repo.
28*1b3f573fSAndroid Build Coastguard Worker    # Either way, appending the source path to the genfiles dir works.
29*1b3f573fSAndroid Build Coastguard Worker    return ctx.var["GENDIR"] + "/" + _SourceDir(ctx)
30*1b3f573fSAndroid Build Coastguard Worker
31*1b3f573fSAndroid Build Coastguard Workerdef _SourceDir(ctx):
32*1b3f573fSAndroid Build Coastguard Worker    if not ctx.attr.includes:
33*1b3f573fSAndroid Build Coastguard Worker        return ctx.label.workspace_root
34*1b3f573fSAndroid Build Coastguard Worker    if not ctx.attr.includes[0]:
35*1b3f573fSAndroid Build Coastguard Worker        return _GetPath(ctx, ctx.label.package)
36*1b3f573fSAndroid Build Coastguard Worker    if not ctx.label.package:
37*1b3f573fSAndroid Build Coastguard Worker        return _GetPath(ctx, ctx.attr.includes[0])
38*1b3f573fSAndroid Build Coastguard Worker    return _GetPath(ctx, ctx.label.package + "/" + ctx.attr.includes[0])
39*1b3f573fSAndroid Build Coastguard Worker
40*1b3f573fSAndroid Build Coastguard Workerdef _CcHdrs(srcs, use_grpc_plugin = False):
41*1b3f573fSAndroid Build Coastguard Worker    ret = [s[:-len(".proto")] + ".pb.h" for s in srcs]
42*1b3f573fSAndroid Build Coastguard Worker    if use_grpc_plugin:
43*1b3f573fSAndroid Build Coastguard Worker        ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs]
44*1b3f573fSAndroid Build Coastguard Worker    return ret
45*1b3f573fSAndroid Build Coastguard Worker
46*1b3f573fSAndroid Build Coastguard Workerdef _CcSrcs(srcs, use_grpc_plugin = False):
47*1b3f573fSAndroid Build Coastguard Worker    ret = [s[:-len(".proto")] + ".pb.cc" for s in srcs]
48*1b3f573fSAndroid Build Coastguard Worker    if use_grpc_plugin:
49*1b3f573fSAndroid Build Coastguard Worker        ret += [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
50*1b3f573fSAndroid Build Coastguard Worker    return ret
51*1b3f573fSAndroid Build Coastguard Worker
52*1b3f573fSAndroid Build Coastguard Workerdef _CcOuts(srcs, use_grpc_plugin = False):
53*1b3f573fSAndroid Build Coastguard Worker    return _CcHdrs(srcs, use_grpc_plugin) + _CcSrcs(srcs, use_grpc_plugin)
54*1b3f573fSAndroid Build Coastguard Worker
55*1b3f573fSAndroid Build Coastguard Workerdef _PyOuts(srcs, use_grpc_plugin = False):
56*1b3f573fSAndroid Build Coastguard Worker    ret = [s[:-len(".proto")] + "_pb2.py" for s in srcs]
57*1b3f573fSAndroid Build Coastguard Worker    if use_grpc_plugin:
58*1b3f573fSAndroid Build Coastguard Worker        ret += [s[:-len(".proto")] + "_pb2_grpc.py" for s in srcs]
59*1b3f573fSAndroid Build Coastguard Worker    return ret
60*1b3f573fSAndroid Build Coastguard Worker
61*1b3f573fSAndroid Build Coastguard Workerdef _RelativeOutputPath(path, include, dest = ""):
62*1b3f573fSAndroid Build Coastguard Worker    if include == None:
63*1b3f573fSAndroid Build Coastguard Worker        return path
64*1b3f573fSAndroid Build Coastguard Worker
65*1b3f573fSAndroid Build Coastguard Worker    if not path.startswith(include):
66*1b3f573fSAndroid Build Coastguard Worker        fail("Include path %s isn't part of the path %s." % (include, path))
67*1b3f573fSAndroid Build Coastguard Worker
68*1b3f573fSAndroid Build Coastguard Worker    if include and include[-1] != "/":
69*1b3f573fSAndroid Build Coastguard Worker        include = include + "/"
70*1b3f573fSAndroid Build Coastguard Worker    if dest and dest[-1] != "/":
71*1b3f573fSAndroid Build Coastguard Worker        dest = dest + "/"
72*1b3f573fSAndroid Build Coastguard Worker
73*1b3f573fSAndroid Build Coastguard Worker    path = path[len(include):]
74*1b3f573fSAndroid Build Coastguard Worker    return dest + path
75*1b3f573fSAndroid Build Coastguard Worker
76*1b3f573fSAndroid Build Coastguard Workerdef _proto_gen_impl(ctx):
77*1b3f573fSAndroid Build Coastguard Worker    """General implementation for generating protos"""
78*1b3f573fSAndroid Build Coastguard Worker    srcs = ctx.files.srcs
79*1b3f573fSAndroid Build Coastguard Worker    deps = depset(direct=ctx.files.srcs)
80*1b3f573fSAndroid Build Coastguard Worker    source_dir = _SourceDir(ctx)
81*1b3f573fSAndroid Build Coastguard Worker    gen_dir = _GenDir(ctx).rstrip("/")
82*1b3f573fSAndroid Build Coastguard Worker    import_flags = []
83*1b3f573fSAndroid Build Coastguard Worker
84*1b3f573fSAndroid Build Coastguard Worker    if source_dir:
85*1b3f573fSAndroid Build Coastguard Worker        has_sources = any([src.is_source for src in srcs])
86*1b3f573fSAndroid Build Coastguard Worker        if has_sources:
87*1b3f573fSAndroid Build Coastguard Worker            import_flags += ["-I" + source_dir]
88*1b3f573fSAndroid Build Coastguard Worker    else:
89*1b3f573fSAndroid Build Coastguard Worker        import_flags += ["-I."]
90*1b3f573fSAndroid Build Coastguard Worker
91*1b3f573fSAndroid Build Coastguard Worker    has_generated = any([not src.is_source for src in srcs])
92*1b3f573fSAndroid Build Coastguard Worker    if has_generated:
93*1b3f573fSAndroid Build Coastguard Worker        import_flags += ["-I" + gen_dir]
94*1b3f573fSAndroid Build Coastguard Worker
95*1b3f573fSAndroid Build Coastguard Worker    import_flags = depset(direct=import_flags)
96*1b3f573fSAndroid Build Coastguard Worker
97*1b3f573fSAndroid Build Coastguard Worker    for dep in ctx.attr.deps:
98*1b3f573fSAndroid Build Coastguard Worker        if type(dep.proto.import_flags) == "list":
99*1b3f573fSAndroid Build Coastguard Worker            import_flags = depset(transitive=[import_flags], direct=dep.proto.import_flags)
100*1b3f573fSAndroid Build Coastguard Worker        else:
101*1b3f573fSAndroid Build Coastguard Worker            import_flags = depset(transitive=[import_flags, dep.proto.import_flags])
102*1b3f573fSAndroid Build Coastguard Worker        if type(dep.proto.deps) == "list":
103*1b3f573fSAndroid Build Coastguard Worker            deps = depset(transitive=[deps], direct=dep.proto.deps)
104*1b3f573fSAndroid Build Coastguard Worker        else:
105*1b3f573fSAndroid Build Coastguard Worker            deps = depset(transitive=[deps, dep.proto.deps])
106*1b3f573fSAndroid Build Coastguard Worker
107*1b3f573fSAndroid Build Coastguard Worker    if not ctx.attr.gen_cc and not ctx.attr.gen_py and not ctx.executable.plugin:
108*1b3f573fSAndroid Build Coastguard Worker        return struct(
109*1b3f573fSAndroid Build Coastguard Worker            proto = struct(
110*1b3f573fSAndroid Build Coastguard Worker                srcs = srcs,
111*1b3f573fSAndroid Build Coastguard Worker                import_flags = import_flags,
112*1b3f573fSAndroid Build Coastguard Worker                deps = deps,
113*1b3f573fSAndroid Build Coastguard Worker            ),
114*1b3f573fSAndroid Build Coastguard Worker        )
115*1b3f573fSAndroid Build Coastguard Worker
116*1b3f573fSAndroid Build Coastguard Worker    for src in srcs:
117*1b3f573fSAndroid Build Coastguard Worker        args = []
118*1b3f573fSAndroid Build Coastguard Worker
119*1b3f573fSAndroid Build Coastguard Worker        in_gen_dir = src.root.path == gen_dir
120*1b3f573fSAndroid Build Coastguard Worker        if in_gen_dir:
121*1b3f573fSAndroid Build Coastguard Worker            import_flags_real = []
122*1b3f573fSAndroid Build Coastguard Worker            for f in import_flags.to_list():
123*1b3f573fSAndroid Build Coastguard Worker                path = f.replace("-I", "")
124*1b3f573fSAndroid Build Coastguard Worker                import_flags_real.append("-I$(realpath -s %s)" % path)
125*1b3f573fSAndroid Build Coastguard Worker
126*1b3f573fSAndroid Build Coastguard Worker        outs = []
127*1b3f573fSAndroid Build Coastguard Worker        use_grpc_plugin = (ctx.attr.plugin_language == "grpc" and ctx.attr.plugin)
128*1b3f573fSAndroid Build Coastguard Worker        path_tpl = "$(realpath %s)" if in_gen_dir else "%s"
129*1b3f573fSAndroid Build Coastguard Worker        if ctx.attr.gen_cc:
130*1b3f573fSAndroid Build Coastguard Worker            args += [("--cpp_out=" + path_tpl) % gen_dir]
131*1b3f573fSAndroid Build Coastguard Worker            outs.extend(_CcOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
132*1b3f573fSAndroid Build Coastguard Worker        if ctx.attr.gen_py:
133*1b3f573fSAndroid Build Coastguard Worker            args += [("--python_out=" + path_tpl) % gen_dir]
134*1b3f573fSAndroid Build Coastguard Worker            outs.extend(_PyOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
135*1b3f573fSAndroid Build Coastguard Worker
136*1b3f573fSAndroid Build Coastguard Worker        outs = [ctx.actions.declare_file(out, sibling = src) for out in outs]
137*1b3f573fSAndroid Build Coastguard Worker        inputs = [src] + deps.to_list()
138*1b3f573fSAndroid Build Coastguard Worker        tools = [ctx.executable.protoc]
139*1b3f573fSAndroid Build Coastguard Worker        if ctx.executable.plugin:
140*1b3f573fSAndroid Build Coastguard Worker            plugin = ctx.executable.plugin
141*1b3f573fSAndroid Build Coastguard Worker            lang = ctx.attr.plugin_language
142*1b3f573fSAndroid Build Coastguard Worker            if not lang and plugin.basename.startswith("protoc-gen-"):
143*1b3f573fSAndroid Build Coastguard Worker                lang = plugin.basename[len("protoc-gen-"):]
144*1b3f573fSAndroid Build Coastguard Worker            if not lang:
145*1b3f573fSAndroid Build Coastguard Worker                fail("cannot infer the target language of plugin", "plugin_language")
146*1b3f573fSAndroid Build Coastguard Worker
147*1b3f573fSAndroid Build Coastguard Worker            outdir = "." if in_gen_dir else gen_dir
148*1b3f573fSAndroid Build Coastguard Worker
149*1b3f573fSAndroid Build Coastguard Worker            if ctx.attr.plugin_options:
150*1b3f573fSAndroid Build Coastguard Worker                outdir = ",".join(ctx.attr.plugin_options) + ":" + outdir
151*1b3f573fSAndroid Build Coastguard Worker            args += [("--plugin=protoc-gen-%s=" + path_tpl) % (lang, plugin.path)]
152*1b3f573fSAndroid Build Coastguard Worker            args += ["--%s_out=%s" % (lang, outdir)]
153*1b3f573fSAndroid Build Coastguard Worker            tools.append(plugin)
154*1b3f573fSAndroid Build Coastguard Worker
155*1b3f573fSAndroid Build Coastguard Worker        if not in_gen_dir:
156*1b3f573fSAndroid Build Coastguard Worker            ctx.actions.run(
157*1b3f573fSAndroid Build Coastguard Worker                inputs = inputs,
158*1b3f573fSAndroid Build Coastguard Worker                tools = tools,
159*1b3f573fSAndroid Build Coastguard Worker                outputs = outs,
160*1b3f573fSAndroid Build Coastguard Worker                arguments = args + import_flags.to_list() + [src.path],
161*1b3f573fSAndroid Build Coastguard Worker                executable = ctx.executable.protoc,
162*1b3f573fSAndroid Build Coastguard Worker                mnemonic = "ProtoCompile",
163*1b3f573fSAndroid Build Coastguard Worker                use_default_shell_env = True,
164*1b3f573fSAndroid Build Coastguard Worker            )
165*1b3f573fSAndroid Build Coastguard Worker        else:
166*1b3f573fSAndroid Build Coastguard Worker            for out in outs:
167*1b3f573fSAndroid Build Coastguard Worker                orig_command = " ".join(
168*1b3f573fSAndroid Build Coastguard Worker                    ["$(realpath %s)" % ctx.executable.protoc.path] + args +
169*1b3f573fSAndroid Build Coastguard Worker                    import_flags_real + [src.basename],
170*1b3f573fSAndroid Build Coastguard Worker                )
171*1b3f573fSAndroid Build Coastguard Worker                command = ";".join([
172*1b3f573fSAndroid Build Coastguard Worker                    'CMD="%s"' % orig_command,
173*1b3f573fSAndroid Build Coastguard Worker                    "cd %s" % src.dirname,
174*1b3f573fSAndroid Build Coastguard Worker                    "${CMD}",
175*1b3f573fSAndroid Build Coastguard Worker                    "cd -",
176*1b3f573fSAndroid Build Coastguard Worker                ])
177*1b3f573fSAndroid Build Coastguard Worker                generated_out = "/".join([gen_dir, out.basename])
178*1b3f573fSAndroid Build Coastguard Worker                if generated_out != out.path:
179*1b3f573fSAndroid Build Coastguard Worker                    command += ";mv %s %s" % (generated_out, out.path)
180*1b3f573fSAndroid Build Coastguard Worker                ctx.actions.run_shell(
181*1b3f573fSAndroid Build Coastguard Worker                    inputs = inputs,
182*1b3f573fSAndroid Build Coastguard Worker                    outputs = [out],
183*1b3f573fSAndroid Build Coastguard Worker                    command = command,
184*1b3f573fSAndroid Build Coastguard Worker                    mnemonic = "ProtoCompile",
185*1b3f573fSAndroid Build Coastguard Worker                    tools = tools,
186*1b3f573fSAndroid Build Coastguard Worker                    use_default_shell_env = True,
187*1b3f573fSAndroid Build Coastguard Worker                )
188*1b3f573fSAndroid Build Coastguard Worker
189*1b3f573fSAndroid Build Coastguard Worker    return struct(
190*1b3f573fSAndroid Build Coastguard Worker        proto = struct(
191*1b3f573fSAndroid Build Coastguard Worker            srcs = srcs,
192*1b3f573fSAndroid Build Coastguard Worker            import_flags = import_flags,
193*1b3f573fSAndroid Build Coastguard Worker            deps = deps,
194*1b3f573fSAndroid Build Coastguard Worker        ),
195*1b3f573fSAndroid Build Coastguard Worker    )
196*1b3f573fSAndroid Build Coastguard Worker
197*1b3f573fSAndroid Build Coastguard Workerproto_gen = rule(
198*1b3f573fSAndroid Build Coastguard Worker    attrs = {
199*1b3f573fSAndroid Build Coastguard Worker        "srcs": attr.label_list(allow_files = True),
200*1b3f573fSAndroid Build Coastguard Worker        "deps": attr.label_list(providers = ["proto"]),
201*1b3f573fSAndroid Build Coastguard Worker        "includes": attr.string_list(),
202*1b3f573fSAndroid Build Coastguard Worker        "protoc": attr.label(
203*1b3f573fSAndroid Build Coastguard Worker            cfg = "exec",
204*1b3f573fSAndroid Build Coastguard Worker            executable = True,
205*1b3f573fSAndroid Build Coastguard Worker            allow_single_file = True,
206*1b3f573fSAndroid Build Coastguard Worker            mandatory = True,
207*1b3f573fSAndroid Build Coastguard Worker        ),
208*1b3f573fSAndroid Build Coastguard Worker        "plugin": attr.label(
209*1b3f573fSAndroid Build Coastguard Worker            cfg = "exec",
210*1b3f573fSAndroid Build Coastguard Worker            allow_files = True,
211*1b3f573fSAndroid Build Coastguard Worker            executable = True,
212*1b3f573fSAndroid Build Coastguard Worker        ),
213*1b3f573fSAndroid Build Coastguard Worker        "plugin_language": attr.string(),
214*1b3f573fSAndroid Build Coastguard Worker        "plugin_options": attr.string_list(),
215*1b3f573fSAndroid Build Coastguard Worker        "gen_cc": attr.bool(),
216*1b3f573fSAndroid Build Coastguard Worker        "gen_py": attr.bool(),
217*1b3f573fSAndroid Build Coastguard Worker        "outs": attr.output_list(),
218*1b3f573fSAndroid Build Coastguard Worker    },
219*1b3f573fSAndroid Build Coastguard Worker    output_to_genfiles = True,
220*1b3f573fSAndroid Build Coastguard Worker    implementation = _proto_gen_impl,
221*1b3f573fSAndroid Build Coastguard Worker)
222*1b3f573fSAndroid Build Coastguard Worker"""Generates codes from Protocol Buffers definitions.
223*1b3f573fSAndroid Build Coastguard Worker
224*1b3f573fSAndroid Build Coastguard WorkerThis rule helps you to implement Skylark macros specific to the target
225*1b3f573fSAndroid Build Coastguard Workerlanguage. You should prefer more specific `cc_proto_library `,
226*1b3f573fSAndroid Build Coastguard Worker`py_proto_library` and others unless you are adding such wrapper macros.
227*1b3f573fSAndroid Build Coastguard Worker
228*1b3f573fSAndroid Build Coastguard WorkerArgs:
229*1b3f573fSAndroid Build Coastguard Worker  srcs: Protocol Buffers definition files (.proto) to run the protocol compiler
230*1b3f573fSAndroid Build Coastguard Worker    against.
231*1b3f573fSAndroid Build Coastguard Worker  deps: a list of dependency labels; must be other proto libraries.
232*1b3f573fSAndroid Build Coastguard Worker  includes: a list of include paths to .proto files.
233*1b3f573fSAndroid Build Coastguard Worker  protoc: the label of the protocol compiler to generate the sources.
234*1b3f573fSAndroid Build Coastguard Worker  plugin: the label of the protocol compiler plugin to be passed to the protocol
235*1b3f573fSAndroid Build Coastguard Worker    compiler.
236*1b3f573fSAndroid Build Coastguard Worker  plugin_language: the language of the generated sources
237*1b3f573fSAndroid Build Coastguard Worker  plugin_options: a list of options to be passed to the plugin
238*1b3f573fSAndroid Build Coastguard Worker  gen_cc: generates C++ sources in addition to the ones from the plugin.
239*1b3f573fSAndroid Build Coastguard Worker  gen_py: generates Python sources in addition to the ones from the plugin.
240*1b3f573fSAndroid Build Coastguard Worker  outs: a list of labels of the expected outputs from the protocol compiler.
241*1b3f573fSAndroid Build Coastguard Worker"""
242*1b3f573fSAndroid Build Coastguard Worker
243*1b3f573fSAndroid Build Coastguard Workerdef _adapt_proto_library_impl(ctx):
244*1b3f573fSAndroid Build Coastguard Worker    deps = [dep[ProtoInfo] for dep in ctx.attr.deps]
245*1b3f573fSAndroid Build Coastguard Worker
246*1b3f573fSAndroid Build Coastguard Worker    srcs = [src for dep in deps for src in dep.direct_sources]
247*1b3f573fSAndroid Build Coastguard Worker    return struct(
248*1b3f573fSAndroid Build Coastguard Worker        proto = struct(
249*1b3f573fSAndroid Build Coastguard Worker            srcs = srcs,
250*1b3f573fSAndroid Build Coastguard Worker            import_flags = ["-I{}".format(path) for dep in deps for path in dep.transitive_proto_path.to_list()],
251*1b3f573fSAndroid Build Coastguard Worker            deps = srcs,
252*1b3f573fSAndroid Build Coastguard Worker        ),
253*1b3f573fSAndroid Build Coastguard Worker    )
254*1b3f573fSAndroid Build Coastguard Worker
255*1b3f573fSAndroid Build Coastguard Workeradapt_proto_library = rule(
256*1b3f573fSAndroid Build Coastguard Worker    implementation = _adapt_proto_library_impl,
257*1b3f573fSAndroid Build Coastguard Worker    attrs = {
258*1b3f573fSAndroid Build Coastguard Worker        "deps": attr.label_list(
259*1b3f573fSAndroid Build Coastguard Worker            mandatory = True,
260*1b3f573fSAndroid Build Coastguard Worker            providers = [ProtoInfo],
261*1b3f573fSAndroid Build Coastguard Worker        ),
262*1b3f573fSAndroid Build Coastguard Worker    },
263*1b3f573fSAndroid Build Coastguard Worker    doc = "Adapts `proto_library` from `@rules_proto` to be used with `{cc,py}_proto_library` from this file.",
264*1b3f573fSAndroid Build Coastguard Worker)
265*1b3f573fSAndroid Build Coastguard Worker
266*1b3f573fSAndroid Build Coastguard Workerdef cc_proto_library(
267*1b3f573fSAndroid Build Coastguard Worker        name,
268*1b3f573fSAndroid Build Coastguard Worker        srcs = [],
269*1b3f573fSAndroid Build Coastguard Worker        deps = [],
270*1b3f573fSAndroid Build Coastguard Worker        cc_libs = [],
271*1b3f573fSAndroid Build Coastguard Worker        include = None,
272*1b3f573fSAndroid Build Coastguard Worker        protoc = "@com_google_protobuf//:protoc",
273*1b3f573fSAndroid Build Coastguard Worker        use_grpc_plugin = False,
274*1b3f573fSAndroid Build Coastguard Worker        default_runtime = "@com_google_protobuf//:protobuf",
275*1b3f573fSAndroid Build Coastguard Worker        **kargs):
276*1b3f573fSAndroid Build Coastguard Worker    """Bazel rule to create a C++ protobuf library from proto source files
277*1b3f573fSAndroid Build Coastguard Worker
278*1b3f573fSAndroid Build Coastguard Worker    NOTE: the rule is only an internal workaround to generate protos. The
279*1b3f573fSAndroid Build Coastguard Worker    interface may change and the rule may be removed when bazel has introduced
280*1b3f573fSAndroid Build Coastguard Worker    the native rule.
281*1b3f573fSAndroid Build Coastguard Worker
282*1b3f573fSAndroid Build Coastguard Worker    Args:
283*1b3f573fSAndroid Build Coastguard Worker      name: the name of the cc_proto_library.
284*1b3f573fSAndroid Build Coastguard Worker      srcs: the .proto files of the cc_proto_library.
285*1b3f573fSAndroid Build Coastguard Worker      deps: a list of dependency labels; must be cc_proto_library.
286*1b3f573fSAndroid Build Coastguard Worker      cc_libs: a list of other cc_library targets depended by the generated
287*1b3f573fSAndroid Build Coastguard Worker          cc_library.
288*1b3f573fSAndroid Build Coastguard Worker      include: a string indicating the include path of the .proto files.
289*1b3f573fSAndroid Build Coastguard Worker      protoc: the label of the protocol compiler to generate the sources.
290*1b3f573fSAndroid Build Coastguard Worker      use_grpc_plugin: a flag to indicate whether to call the grpc C++ plugin
291*1b3f573fSAndroid Build Coastguard Worker          when processing the proto files.
292*1b3f573fSAndroid Build Coastguard Worker      default_runtime: the implicitly default runtime which will be depended on by
293*1b3f573fSAndroid Build Coastguard Worker          the generated cc_library target.
294*1b3f573fSAndroid Build Coastguard Worker      **kargs: other keyword arguments that are passed to cc_library.
295*1b3f573fSAndroid Build Coastguard Worker    """
296*1b3f573fSAndroid Build Coastguard Worker
297*1b3f573fSAndroid Build Coastguard Worker    includes = []
298*1b3f573fSAndroid Build Coastguard Worker    if include != None:
299*1b3f573fSAndroid Build Coastguard Worker        includes = [include]
300*1b3f573fSAndroid Build Coastguard Worker
301*1b3f573fSAndroid Build Coastguard Worker    grpc_cpp_plugin = None
302*1b3f573fSAndroid Build Coastguard Worker    if use_grpc_plugin:
303*1b3f573fSAndroid Build Coastguard Worker        grpc_cpp_plugin = "//external:grpc_cpp_plugin"
304*1b3f573fSAndroid Build Coastguard Worker
305*1b3f573fSAndroid Build Coastguard Worker    gen_srcs = _CcSrcs(srcs, use_grpc_plugin)
306*1b3f573fSAndroid Build Coastguard Worker    gen_hdrs = _CcHdrs(srcs, use_grpc_plugin)
307*1b3f573fSAndroid Build Coastguard Worker    outs = gen_srcs + gen_hdrs
308*1b3f573fSAndroid Build Coastguard Worker
309*1b3f573fSAndroid Build Coastguard Worker    proto_gen(
310*1b3f573fSAndroid Build Coastguard Worker        name = name + "_genproto",
311*1b3f573fSAndroid Build Coastguard Worker        srcs = srcs,
312*1b3f573fSAndroid Build Coastguard Worker        deps = [s + "_genproto" for s in deps],
313*1b3f573fSAndroid Build Coastguard Worker        includes = includes,
314*1b3f573fSAndroid Build Coastguard Worker        protoc = protoc,
315*1b3f573fSAndroid Build Coastguard Worker        plugin = grpc_cpp_plugin,
316*1b3f573fSAndroid Build Coastguard Worker        plugin_language = "grpc",
317*1b3f573fSAndroid Build Coastguard Worker        gen_cc = 1,
318*1b3f573fSAndroid Build Coastguard Worker        outs = outs,
319*1b3f573fSAndroid Build Coastguard Worker        visibility = ["//visibility:public"],
320*1b3f573fSAndroid Build Coastguard Worker    )
321*1b3f573fSAndroid Build Coastguard Worker
322*1b3f573fSAndroid Build Coastguard Worker    if default_runtime and not default_runtime in cc_libs:
323*1b3f573fSAndroid Build Coastguard Worker        cc_libs = cc_libs + [default_runtime]
324*1b3f573fSAndroid Build Coastguard Worker    if use_grpc_plugin:
325*1b3f573fSAndroid Build Coastguard Worker        cc_libs = cc_libs + ["//external:grpc_lib"]
326*1b3f573fSAndroid Build Coastguard Worker    cc_library(
327*1b3f573fSAndroid Build Coastguard Worker        name = name,
328*1b3f573fSAndroid Build Coastguard Worker        srcs = gen_srcs,
329*1b3f573fSAndroid Build Coastguard Worker        hdrs = gen_hdrs,
330*1b3f573fSAndroid Build Coastguard Worker        deps = cc_libs + deps,
331*1b3f573fSAndroid Build Coastguard Worker        includes = includes,
332*1b3f573fSAndroid Build Coastguard Worker        **kargs
333*1b3f573fSAndroid Build Coastguard Worker    )
334*1b3f573fSAndroid Build Coastguard Worker
335*1b3f573fSAndroid Build Coastguard Workerdef _internal_gen_well_known_protos_java_impl(ctx):
336*1b3f573fSAndroid Build Coastguard Worker    args = ctx.actions.args()
337*1b3f573fSAndroid Build Coastguard Worker
338*1b3f573fSAndroid Build Coastguard Worker    deps = [d[ProtoInfo] for d in ctx.attr.deps]
339*1b3f573fSAndroid Build Coastguard Worker
340*1b3f573fSAndroid Build Coastguard Worker    srcjar = ctx.actions.declare_file("{}.srcjar".format(ctx.attr.name))
341*1b3f573fSAndroid Build Coastguard Worker    if ctx.attr.javalite:
342*1b3f573fSAndroid Build Coastguard Worker        java_out = "lite:%s" % srcjar.path
343*1b3f573fSAndroid Build Coastguard Worker    else:
344*1b3f573fSAndroid Build Coastguard Worker        java_out = srcjar
345*1b3f573fSAndroid Build Coastguard Worker
346*1b3f573fSAndroid Build Coastguard Worker    args.add("--java_out", java_out)
347*1b3f573fSAndroid Build Coastguard Worker
348*1b3f573fSAndroid Build Coastguard Worker    descriptors = depset(
349*1b3f573fSAndroid Build Coastguard Worker        transitive = [dep.transitive_descriptor_sets for dep in deps],
350*1b3f573fSAndroid Build Coastguard Worker    )
351*1b3f573fSAndroid Build Coastguard Worker    args.add_joined(
352*1b3f573fSAndroid Build Coastguard Worker        "--descriptor_set_in",
353*1b3f573fSAndroid Build Coastguard Worker        descriptors,
354*1b3f573fSAndroid Build Coastguard Worker        join_with = ctx.configuration.host_path_separator,
355*1b3f573fSAndroid Build Coastguard Worker    )
356*1b3f573fSAndroid Build Coastguard Worker
357*1b3f573fSAndroid Build Coastguard Worker    for dep in deps:
358*1b3f573fSAndroid Build Coastguard Worker        if "." == dep.proto_source_root:
359*1b3f573fSAndroid Build Coastguard Worker            args.add_all([src.path for src in dep.direct_sources])
360*1b3f573fSAndroid Build Coastguard Worker        else:
361*1b3f573fSAndroid Build Coastguard Worker            source_root = dep.proto_source_root
362*1b3f573fSAndroid Build Coastguard Worker            offset = len(source_root) + 1  # + '/'.
363*1b3f573fSAndroid Build Coastguard Worker            args.add_all([src.path[offset:] for src in dep.direct_sources])
364*1b3f573fSAndroid Build Coastguard Worker
365*1b3f573fSAndroid Build Coastguard Worker    ctx.actions.run(
366*1b3f573fSAndroid Build Coastguard Worker        executable = ctx.executable._protoc,
367*1b3f573fSAndroid Build Coastguard Worker        inputs = descriptors,
368*1b3f573fSAndroid Build Coastguard Worker        outputs = [srcjar],
369*1b3f573fSAndroid Build Coastguard Worker        arguments = [args],
370*1b3f573fSAndroid Build Coastguard Worker        use_default_shell_env = True,
371*1b3f573fSAndroid Build Coastguard Worker    )
372*1b3f573fSAndroid Build Coastguard Worker
373*1b3f573fSAndroid Build Coastguard Worker    return [
374*1b3f573fSAndroid Build Coastguard Worker        DefaultInfo(
375*1b3f573fSAndroid Build Coastguard Worker            files = depset([srcjar]),
376*1b3f573fSAndroid Build Coastguard Worker        ),
377*1b3f573fSAndroid Build Coastguard Worker    ]
378*1b3f573fSAndroid Build Coastguard Worker
379*1b3f573fSAndroid Build Coastguard Workerinternal_gen_well_known_protos_java = rule(
380*1b3f573fSAndroid Build Coastguard Worker    implementation = _internal_gen_well_known_protos_java_impl,
381*1b3f573fSAndroid Build Coastguard Worker    attrs = {
382*1b3f573fSAndroid Build Coastguard Worker        "deps": attr.label_list(
383*1b3f573fSAndroid Build Coastguard Worker            mandatory = True,
384*1b3f573fSAndroid Build Coastguard Worker            providers = [ProtoInfo],
385*1b3f573fSAndroid Build Coastguard Worker        ),
386*1b3f573fSAndroid Build Coastguard Worker        "javalite": attr.bool(
387*1b3f573fSAndroid Build Coastguard Worker            default = False,
388*1b3f573fSAndroid Build Coastguard Worker        ),
389*1b3f573fSAndroid Build Coastguard Worker        "_protoc": attr.label(
390*1b3f573fSAndroid Build Coastguard Worker            executable = True,
391*1b3f573fSAndroid Build Coastguard Worker            cfg = "exec",
392*1b3f573fSAndroid Build Coastguard Worker            default = "@com_google_protobuf//:protoc",
393*1b3f573fSAndroid Build Coastguard Worker        ),
394*1b3f573fSAndroid Build Coastguard Worker    },
395*1b3f573fSAndroid Build Coastguard Worker)
396*1b3f573fSAndroid Build Coastguard Worker
397*1b3f573fSAndroid Build Coastguard Workerdef _internal_gen_kt_protos(ctx):
398*1b3f573fSAndroid Build Coastguard Worker    args = ctx.actions.args()
399*1b3f573fSAndroid Build Coastguard Worker
400*1b3f573fSAndroid Build Coastguard Worker    deps = [d[ProtoInfo] for d in ctx.attr.deps]
401*1b3f573fSAndroid Build Coastguard Worker
402*1b3f573fSAndroid Build Coastguard Worker    srcjar = ctx.actions.declare_file("{}.srcjar".format(ctx.attr.name))
403*1b3f573fSAndroid Build Coastguard Worker    if ctx.attr.lite:
404*1b3f573fSAndroid Build Coastguard Worker        out = "lite:%s" % srcjar.path
405*1b3f573fSAndroid Build Coastguard Worker    else:
406*1b3f573fSAndroid Build Coastguard Worker        out = srcjar
407*1b3f573fSAndroid Build Coastguard Worker
408*1b3f573fSAndroid Build Coastguard Worker    args.add("--kotlin_out", out)
409*1b3f573fSAndroid Build Coastguard Worker
410*1b3f573fSAndroid Build Coastguard Worker    descriptors = depset(
411*1b3f573fSAndroid Build Coastguard Worker        transitive = [dep.transitive_descriptor_sets for dep in deps],
412*1b3f573fSAndroid Build Coastguard Worker    )
413*1b3f573fSAndroid Build Coastguard Worker    args.add_joined(
414*1b3f573fSAndroid Build Coastguard Worker        "--descriptor_set_in",
415*1b3f573fSAndroid Build Coastguard Worker        descriptors,
416*1b3f573fSAndroid Build Coastguard Worker        join_with = ctx.configuration.host_path_separator,
417*1b3f573fSAndroid Build Coastguard Worker    )
418*1b3f573fSAndroid Build Coastguard Worker
419*1b3f573fSAndroid Build Coastguard Worker    for dep in deps:
420*1b3f573fSAndroid Build Coastguard Worker        if "." == dep.proto_source_root:
421*1b3f573fSAndroid Build Coastguard Worker            args.add_all([src.path for src in dep.direct_sources])
422*1b3f573fSAndroid Build Coastguard Worker        else:
423*1b3f573fSAndroid Build Coastguard Worker            source_root = dep.proto_source_root
424*1b3f573fSAndroid Build Coastguard Worker            offset = len(source_root) + 1  # + '/'.
425*1b3f573fSAndroid Build Coastguard Worker            args.add_all([src.path[offset:] for src in dep.direct_sources])
426*1b3f573fSAndroid Build Coastguard Worker
427*1b3f573fSAndroid Build Coastguard Worker    ctx.actions.run(
428*1b3f573fSAndroid Build Coastguard Worker        executable = ctx.executable._protoc,
429*1b3f573fSAndroid Build Coastguard Worker        inputs = descriptors,
430*1b3f573fSAndroid Build Coastguard Worker        outputs = [srcjar],
431*1b3f573fSAndroid Build Coastguard Worker        arguments = [args],
432*1b3f573fSAndroid Build Coastguard Worker        use_default_shell_env = True,
433*1b3f573fSAndroid Build Coastguard Worker    )
434*1b3f573fSAndroid Build Coastguard Worker
435*1b3f573fSAndroid Build Coastguard Worker    return [
436*1b3f573fSAndroid Build Coastguard Worker        DefaultInfo(
437*1b3f573fSAndroid Build Coastguard Worker            files = depset([srcjar]),
438*1b3f573fSAndroid Build Coastguard Worker        ),
439*1b3f573fSAndroid Build Coastguard Worker    ]
440*1b3f573fSAndroid Build Coastguard Worker
441*1b3f573fSAndroid Build Coastguard Workerinternal_gen_kt_protos = rule(
442*1b3f573fSAndroid Build Coastguard Worker    implementation = _internal_gen_kt_protos,
443*1b3f573fSAndroid Build Coastguard Worker    attrs = {
444*1b3f573fSAndroid Build Coastguard Worker        "deps": attr.label_list(
445*1b3f573fSAndroid Build Coastguard Worker            mandatory = True,
446*1b3f573fSAndroid Build Coastguard Worker            providers = [ProtoInfo],
447*1b3f573fSAndroid Build Coastguard Worker        ),
448*1b3f573fSAndroid Build Coastguard Worker        "lite": attr.bool(
449*1b3f573fSAndroid Build Coastguard Worker            default = False,
450*1b3f573fSAndroid Build Coastguard Worker        ),
451*1b3f573fSAndroid Build Coastguard Worker        "_protoc": attr.label(
452*1b3f573fSAndroid Build Coastguard Worker            executable = True,
453*1b3f573fSAndroid Build Coastguard Worker            cfg = "exec",
454*1b3f573fSAndroid Build Coastguard Worker            default = "//:protoc",
455*1b3f573fSAndroid Build Coastguard Worker        ),
456*1b3f573fSAndroid Build Coastguard Worker    },
457*1b3f573fSAndroid Build Coastguard Worker)
458*1b3f573fSAndroid Build Coastguard Worker
459*1b3f573fSAndroid Build Coastguard Worker
460*1b3f573fSAndroid Build Coastguard Worker
461*1b3f573fSAndroid Build Coastguard Workerdef internal_copied_filegroup(name, srcs, strip_prefix, dest, **kwargs):
462*1b3f573fSAndroid Build Coastguard Worker    """Macro to copy files to a different directory and then create a filegroup.
463*1b3f573fSAndroid Build Coastguard Worker
464*1b3f573fSAndroid Build Coastguard Worker    This is used by the //:protobuf_python py_proto_library target to work around
465*1b3f573fSAndroid Build Coastguard Worker    an issue caused by Python source files that are part of the same Python
466*1b3f573fSAndroid Build Coastguard Worker    package being in separate directories.
467*1b3f573fSAndroid Build Coastguard Worker
468*1b3f573fSAndroid Build Coastguard Worker    Args:
469*1b3f573fSAndroid Build Coastguard Worker      srcs: The source files to copy and add to the filegroup.
470*1b3f573fSAndroid Build Coastguard Worker      strip_prefix: Path to the root of the files to copy.
471*1b3f573fSAndroid Build Coastguard Worker      dest: The directory to copy the source files into.
472*1b3f573fSAndroid Build Coastguard Worker      **kwargs: extra arguments that will be passesd to the filegroup.
473*1b3f573fSAndroid Build Coastguard Worker    """
474*1b3f573fSAndroid Build Coastguard Worker    outs = [_RelativeOutputPath(s, strip_prefix, dest) for s in srcs]
475*1b3f573fSAndroid Build Coastguard Worker
476*1b3f573fSAndroid Build Coastguard Worker    native.genrule(
477*1b3f573fSAndroid Build Coastguard Worker        name = name + "_genrule",
478*1b3f573fSAndroid Build Coastguard Worker        srcs = srcs,
479*1b3f573fSAndroid Build Coastguard Worker        outs = outs,
480*1b3f573fSAndroid Build Coastguard Worker        cmd_bash = " && ".join(
481*1b3f573fSAndroid Build Coastguard Worker            ["cp $(location %s) $(location %s)" %
482*1b3f573fSAndroid Build Coastguard Worker             (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs]),
483*1b3f573fSAndroid Build Coastguard Worker        cmd_bat = " && ".join(
484*1b3f573fSAndroid Build Coastguard Worker            ["@copy /Y $(location %s) $(location %s) >NUL" %
485*1b3f573fSAndroid Build Coastguard Worker             (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs]),
486*1b3f573fSAndroid Build Coastguard Worker    )
487*1b3f573fSAndroid Build Coastguard Worker
488*1b3f573fSAndroid Build Coastguard Worker    native.filegroup(
489*1b3f573fSAndroid Build Coastguard Worker        name = name,
490*1b3f573fSAndroid Build Coastguard Worker        srcs = outs,
491*1b3f573fSAndroid Build Coastguard Worker        **kwargs
492*1b3f573fSAndroid Build Coastguard Worker    )
493*1b3f573fSAndroid Build Coastguard Worker
494*1b3f573fSAndroid Build Coastguard Workerdef py_proto_library(
495*1b3f573fSAndroid Build Coastguard Worker        name,
496*1b3f573fSAndroid Build Coastguard Worker        srcs = [],
497*1b3f573fSAndroid Build Coastguard Worker        deps = [],
498*1b3f573fSAndroid Build Coastguard Worker        py_libs = [],
499*1b3f573fSAndroid Build Coastguard Worker        py_extra_srcs = [],
500*1b3f573fSAndroid Build Coastguard Worker        include = None,
501*1b3f573fSAndroid Build Coastguard Worker        default_runtime = "@com_google_protobuf//:protobuf_python",
502*1b3f573fSAndroid Build Coastguard Worker        protoc = "@com_google_protobuf//:protoc",
503*1b3f573fSAndroid Build Coastguard Worker        use_grpc_plugin = False,
504*1b3f573fSAndroid Build Coastguard Worker        **kargs):
505*1b3f573fSAndroid Build Coastguard Worker    """Bazel rule to create a Python protobuf library from proto source files
506*1b3f573fSAndroid Build Coastguard Worker
507*1b3f573fSAndroid Build Coastguard Worker    NOTE: the rule is only an internal workaround to generate protos. The
508*1b3f573fSAndroid Build Coastguard Worker    interface may change and the rule may be removed when bazel has introduced
509*1b3f573fSAndroid Build Coastguard Worker    the native rule.
510*1b3f573fSAndroid Build Coastguard Worker
511*1b3f573fSAndroid Build Coastguard Worker    Args:
512*1b3f573fSAndroid Build Coastguard Worker      name: the name of the py_proto_library.
513*1b3f573fSAndroid Build Coastguard Worker      srcs: the .proto files of the py_proto_library.
514*1b3f573fSAndroid Build Coastguard Worker      deps: a list of dependency labels; must be py_proto_library.
515*1b3f573fSAndroid Build Coastguard Worker      py_libs: a list of other py_library targets depended by the generated
516*1b3f573fSAndroid Build Coastguard Worker          py_library.
517*1b3f573fSAndroid Build Coastguard Worker      py_extra_srcs: extra source files that will be added to the output
518*1b3f573fSAndroid Build Coastguard Worker          py_library. This attribute is used for internal bootstrapping.
519*1b3f573fSAndroid Build Coastguard Worker      include: a string indicating the include path of the .proto files.
520*1b3f573fSAndroid Build Coastguard Worker      default_runtime: the implicitly default runtime which will be depended on by
521*1b3f573fSAndroid Build Coastguard Worker          the generated py_library target.
522*1b3f573fSAndroid Build Coastguard Worker      protoc: the label of the protocol compiler to generate the sources.
523*1b3f573fSAndroid Build Coastguard Worker      use_grpc_plugin: a flag to indicate whether to call the Python C++ plugin
524*1b3f573fSAndroid Build Coastguard Worker          when processing the proto files.
525*1b3f573fSAndroid Build Coastguard Worker      **kargs: other keyword arguments that are passed to py_library.
526*1b3f573fSAndroid Build Coastguard Worker
527*1b3f573fSAndroid Build Coastguard Worker    """
528*1b3f573fSAndroid Build Coastguard Worker    outs = _PyOuts(srcs, use_grpc_plugin)
529*1b3f573fSAndroid Build Coastguard Worker
530*1b3f573fSAndroid Build Coastguard Worker    includes = []
531*1b3f573fSAndroid Build Coastguard Worker    if include != None:
532*1b3f573fSAndroid Build Coastguard Worker        includes = [include]
533*1b3f573fSAndroid Build Coastguard Worker
534*1b3f573fSAndroid Build Coastguard Worker    grpc_python_plugin = None
535*1b3f573fSAndroid Build Coastguard Worker    if use_grpc_plugin:
536*1b3f573fSAndroid Build Coastguard Worker        grpc_python_plugin = "//external:grpc_python_plugin"
537*1b3f573fSAndroid Build Coastguard Worker        # Note: Generated grpc code depends on Python grpc module. This dependency
538*1b3f573fSAndroid Build Coastguard Worker        # is not explicitly listed in py_libs. Instead, host system is assumed to
539*1b3f573fSAndroid Build Coastguard Worker        # have grpc installed.
540*1b3f573fSAndroid Build Coastguard Worker
541*1b3f573fSAndroid Build Coastguard Worker    proto_gen(
542*1b3f573fSAndroid Build Coastguard Worker        name = name + "_genproto",
543*1b3f573fSAndroid Build Coastguard Worker        srcs = srcs,
544*1b3f573fSAndroid Build Coastguard Worker        deps = [s + "_genproto" for s in deps],
545*1b3f573fSAndroid Build Coastguard Worker        includes = includes,
546*1b3f573fSAndroid Build Coastguard Worker        protoc = protoc,
547*1b3f573fSAndroid Build Coastguard Worker        gen_py = 1,
548*1b3f573fSAndroid Build Coastguard Worker        outs = outs,
549*1b3f573fSAndroid Build Coastguard Worker        visibility = ["//visibility:public"],
550*1b3f573fSAndroid Build Coastguard Worker        plugin = grpc_python_plugin,
551*1b3f573fSAndroid Build Coastguard Worker        plugin_language = "grpc",
552*1b3f573fSAndroid Build Coastguard Worker    )
553*1b3f573fSAndroid Build Coastguard Worker
554*1b3f573fSAndroid Build Coastguard Worker    if default_runtime and not default_runtime in py_libs + deps:
555*1b3f573fSAndroid Build Coastguard Worker        py_libs = py_libs + [default_runtime]
556*1b3f573fSAndroid Build Coastguard Worker    py_library(
557*1b3f573fSAndroid Build Coastguard Worker        name = name,
558*1b3f573fSAndroid Build Coastguard Worker        srcs = outs + py_extra_srcs,
559*1b3f573fSAndroid Build Coastguard Worker        deps = py_libs + deps,
560*1b3f573fSAndroid Build Coastguard Worker        imports = includes,
561*1b3f573fSAndroid Build Coastguard Worker        **kargs
562*1b3f573fSAndroid Build Coastguard Worker    )
563*1b3f573fSAndroid Build Coastguard Worker
564*1b3f573fSAndroid Build Coastguard Workerdef internal_protobuf_py_tests(
565*1b3f573fSAndroid Build Coastguard Worker        name,
566*1b3f573fSAndroid Build Coastguard Worker        modules = [],
567*1b3f573fSAndroid Build Coastguard Worker        **kargs):
568*1b3f573fSAndroid Build Coastguard Worker    """Bazel rules to create batch tests for protobuf internal.
569*1b3f573fSAndroid Build Coastguard Worker
570*1b3f573fSAndroid Build Coastguard Worker    Args:
571*1b3f573fSAndroid Build Coastguard Worker      name: the name of the rule.
572*1b3f573fSAndroid Build Coastguard Worker      modules: a list of modules for tests. The macro will create a py_test for
573*1b3f573fSAndroid Build Coastguard Worker          each of the parameter with the source "google/protobuf/%s.py"
574*1b3f573fSAndroid Build Coastguard Worker      kargs: extra parameters that will be passed into the py_test.
575*1b3f573fSAndroid Build Coastguard Worker
576*1b3f573fSAndroid Build Coastguard Worker    """
577*1b3f573fSAndroid Build Coastguard Worker    for m in modules:
578*1b3f573fSAndroid Build Coastguard Worker        s = "python/google/protobuf/internal/%s.py" % m
579*1b3f573fSAndroid Build Coastguard Worker        py_test(
580*1b3f573fSAndroid Build Coastguard Worker            name = "py_%s" % m,
581*1b3f573fSAndroid Build Coastguard Worker            srcs = [s],
582*1b3f573fSAndroid Build Coastguard Worker            main = s,
583*1b3f573fSAndroid Build Coastguard Worker            **kargs
584*1b3f573fSAndroid Build Coastguard Worker        )
585*1b3f573fSAndroid Build Coastguard Worker
586*1b3f573fSAndroid Build Coastguard Workerdef check_protobuf_required_bazel_version():
587*1b3f573fSAndroid Build Coastguard Worker    """For WORKSPACE files, to check the installed version of bazel.
588*1b3f573fSAndroid Build Coastguard Worker
589*1b3f573fSAndroid Build Coastguard Worker    This ensures bazel supports our approach to proto_library() depending on a
590*1b3f573fSAndroid Build Coastguard Worker    copied filegroup. (Fixed in bazel 0.5.4)
591*1b3f573fSAndroid Build Coastguard Worker    """
592*1b3f573fSAndroid Build Coastguard Worker    versions.check(minimum_bazel_version = "0.5.4")
593