xref: /aosp_15_r20/external/tensorflow/third_party/systemlibs/protobuf.bzl (revision b6fb3261f9314811a0f4371741dbb8839866f948)
1*b6fb3261SAndroid Build Coastguard Workerdef _GetPath(ctx, path):
2*b6fb3261SAndroid Build Coastguard Worker    if ctx.label.workspace_root:
3*b6fb3261SAndroid Build Coastguard Worker        return ctx.label.workspace_root + "/" + path
4*b6fb3261SAndroid Build Coastguard Worker    else:
5*b6fb3261SAndroid Build Coastguard Worker        return path
6*b6fb3261SAndroid Build Coastguard Worker
7*b6fb3261SAndroid Build Coastguard Workerdef _IsNewExternal(ctx):
8*b6fb3261SAndroid Build Coastguard Worker    # Bazel 0.4.4 and older have genfiles paths that look like:
9*b6fb3261SAndroid Build Coastguard Worker    #   bazel-out/local-fastbuild/genfiles/external/repo/foo
10*b6fb3261SAndroid Build Coastguard Worker    # After the exec root rearrangement, they look like:
11*b6fb3261SAndroid Build Coastguard Worker    #   ../repo/bazel-out/local-fastbuild/genfiles/foo
12*b6fb3261SAndroid Build Coastguard Worker    return ctx.label.workspace_root.startswith("../")
13*b6fb3261SAndroid Build Coastguard Worker
14*b6fb3261SAndroid Build Coastguard Workerdef _GenDir(ctx):
15*b6fb3261SAndroid Build Coastguard Worker    if _IsNewExternal(ctx):
16*b6fb3261SAndroid Build Coastguard Worker        # We are using the fact that Bazel 0.4.4+ provides repository-relative paths
17*b6fb3261SAndroid Build Coastguard Worker        # for ctx.genfiles_dir.
18*b6fb3261SAndroid Build Coastguard Worker        return ctx.genfiles_dir.path + (
19*b6fb3261SAndroid Build Coastguard Worker            "/" + ctx.attr.includes[0] if ctx.attr.includes and ctx.attr.includes[0] else ""
20*b6fb3261SAndroid Build Coastguard Worker        )
21*b6fb3261SAndroid Build Coastguard Worker
22*b6fb3261SAndroid Build Coastguard Worker    # This means that we're either in the old version OR the new version in the local repo.
23*b6fb3261SAndroid Build Coastguard Worker    # Either way, appending the source path to the genfiles dir works.
24*b6fb3261SAndroid Build Coastguard Worker    return ctx.var["GENDIR"] + "/" + _SourceDir(ctx)
25*b6fb3261SAndroid Build Coastguard Worker
26*b6fb3261SAndroid Build Coastguard Workerdef _SourceDir(ctx):
27*b6fb3261SAndroid Build Coastguard Worker    if not ctx.attr.includes:
28*b6fb3261SAndroid Build Coastguard Worker        return ctx.label.workspace_root
29*b6fb3261SAndroid Build Coastguard Worker    if not ctx.attr.includes[0]:
30*b6fb3261SAndroid Build Coastguard Worker        return _GetPath(ctx, ctx.label.package)
31*b6fb3261SAndroid Build Coastguard Worker    if not ctx.label.package:
32*b6fb3261SAndroid Build Coastguard Worker        return _GetPath(ctx, ctx.attr.includes[0])
33*b6fb3261SAndroid Build Coastguard Worker    return _GetPath(ctx, ctx.label.package + "/" + ctx.attr.includes[0])
34*b6fb3261SAndroid Build Coastguard Worker
35*b6fb3261SAndroid Build Coastguard Workerdef _CcHdrs(srcs, use_grpc_plugin = False):
36*b6fb3261SAndroid Build Coastguard Worker    ret = [s[:-len(".proto")] + ".pb.h" for s in srcs]
37*b6fb3261SAndroid Build Coastguard Worker    if use_grpc_plugin:
38*b6fb3261SAndroid Build Coastguard Worker        ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs]
39*b6fb3261SAndroid Build Coastguard Worker    return ret
40*b6fb3261SAndroid Build Coastguard Worker
41*b6fb3261SAndroid Build Coastguard Workerdef _CcSrcs(srcs, use_grpc_plugin = False):
42*b6fb3261SAndroid Build Coastguard Worker    ret = [s[:-len(".proto")] + ".pb.cc" for s in srcs]
43*b6fb3261SAndroid Build Coastguard Worker    if use_grpc_plugin:
44*b6fb3261SAndroid Build Coastguard Worker        ret += [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
45*b6fb3261SAndroid Build Coastguard Worker    return ret
46*b6fb3261SAndroid Build Coastguard Worker
47*b6fb3261SAndroid Build Coastguard Workerdef _CcOuts(srcs, use_grpc_plugin = False):
48*b6fb3261SAndroid Build Coastguard Worker    return _CcHdrs(srcs, use_grpc_plugin) + _CcSrcs(srcs, use_grpc_plugin)
49*b6fb3261SAndroid Build Coastguard Worker
50*b6fb3261SAndroid Build Coastguard Workerdef _PyOuts(srcs, use_grpc_plugin = False):
51*b6fb3261SAndroid Build Coastguard Worker    ret = [s[:-len(".proto")] + "_pb2.py" for s in srcs]
52*b6fb3261SAndroid Build Coastguard Worker    if use_grpc_plugin:
53*b6fb3261SAndroid Build Coastguard Worker        ret += [s[:-len(".proto")] + "_pb2_grpc.py" for s in srcs]
54*b6fb3261SAndroid Build Coastguard Worker    return ret
55*b6fb3261SAndroid Build Coastguard Worker
56*b6fb3261SAndroid Build Coastguard Workerdef _RelativeOutputPath(path, include, dest = ""):
57*b6fb3261SAndroid Build Coastguard Worker    if include == None:
58*b6fb3261SAndroid Build Coastguard Worker        return path
59*b6fb3261SAndroid Build Coastguard Worker
60*b6fb3261SAndroid Build Coastguard Worker    if not path.startswith(include):
61*b6fb3261SAndroid Build Coastguard Worker        fail("Include path %s isn't part of the path %s." % (include, path))
62*b6fb3261SAndroid Build Coastguard Worker
63*b6fb3261SAndroid Build Coastguard Worker    if include and include[-1] != "/":
64*b6fb3261SAndroid Build Coastguard Worker        include = include + "/"
65*b6fb3261SAndroid Build Coastguard Worker    if dest and dest[-1] != "/":
66*b6fb3261SAndroid Build Coastguard Worker        dest = dest + "/"
67*b6fb3261SAndroid Build Coastguard Worker
68*b6fb3261SAndroid Build Coastguard Worker    path = path[len(include):]
69*b6fb3261SAndroid Build Coastguard Worker    return dest + path
70*b6fb3261SAndroid Build Coastguard Worker
71*b6fb3261SAndroid Build Coastguard Workerdef _proto_gen_impl(ctx):
72*b6fb3261SAndroid Build Coastguard Worker    """General implementation for generating protos"""
73*b6fb3261SAndroid Build Coastguard Worker    srcs = ctx.files.srcs
74*b6fb3261SAndroid Build Coastguard Worker    deps = []
75*b6fb3261SAndroid Build Coastguard Worker    deps += ctx.files.srcs
76*b6fb3261SAndroid Build Coastguard Worker    source_dir = _SourceDir(ctx)
77*b6fb3261SAndroid Build Coastguard Worker    gen_dir = _GenDir(ctx)
78*b6fb3261SAndroid Build Coastguard Worker    if source_dir:
79*b6fb3261SAndroid Build Coastguard Worker        import_flags = ["-I" + source_dir, "-I" + gen_dir]
80*b6fb3261SAndroid Build Coastguard Worker    else:
81*b6fb3261SAndroid Build Coastguard Worker        import_flags = ["-I."]
82*b6fb3261SAndroid Build Coastguard Worker
83*b6fb3261SAndroid Build Coastguard Worker    for dep in ctx.attr.deps:
84*b6fb3261SAndroid Build Coastguard Worker        import_flags += dep.proto.import_flags
85*b6fb3261SAndroid Build Coastguard Worker        deps += dep.proto.deps
86*b6fb3261SAndroid Build Coastguard Worker    import_flags = depset(import_flags).to_list()
87*b6fb3261SAndroid Build Coastguard Worker    deps = depset(deps).to_list()
88*b6fb3261SAndroid Build Coastguard Worker
89*b6fb3261SAndroid Build Coastguard Worker    args = []
90*b6fb3261SAndroid Build Coastguard Worker    if ctx.attr.gen_cc:
91*b6fb3261SAndroid Build Coastguard Worker        args += ["--cpp_out=" + gen_dir]
92*b6fb3261SAndroid Build Coastguard Worker    if ctx.attr.gen_py:
93*b6fb3261SAndroid Build Coastguard Worker        args += ["--python_out=" + gen_dir]
94*b6fb3261SAndroid Build Coastguard Worker
95*b6fb3261SAndroid Build Coastguard Worker    inputs = srcs + deps
96*b6fb3261SAndroid Build Coastguard Worker    tools = [ctx.executable.protoc]
97*b6fb3261SAndroid Build Coastguard Worker    if ctx.executable.plugin:
98*b6fb3261SAndroid Build Coastguard Worker        plugin = ctx.executable.plugin
99*b6fb3261SAndroid Build Coastguard Worker        lang = ctx.attr.plugin_language
100*b6fb3261SAndroid Build Coastguard Worker        if not lang and plugin.basename.startswith("protoc-gen-"):
101*b6fb3261SAndroid Build Coastguard Worker            lang = plugin.basename[len("protoc-gen-"):]
102*b6fb3261SAndroid Build Coastguard Worker        if not lang:
103*b6fb3261SAndroid Build Coastguard Worker            fail("cannot infer the target language of plugin", "plugin_language")
104*b6fb3261SAndroid Build Coastguard Worker
105*b6fb3261SAndroid Build Coastguard Worker        outdir = gen_dir
106*b6fb3261SAndroid Build Coastguard Worker        if ctx.attr.plugin_options:
107*b6fb3261SAndroid Build Coastguard Worker            outdir = ",".join(ctx.attr.plugin_options) + ":" + outdir
108*b6fb3261SAndroid Build Coastguard Worker        args += ["--plugin=protoc-gen-%s=%s" % (lang, plugin.path)]
109*b6fb3261SAndroid Build Coastguard Worker        args += ["--%s_out=%s" % (lang, outdir)]
110*b6fb3261SAndroid Build Coastguard Worker        tools.append(plugin)
111*b6fb3261SAndroid Build Coastguard Worker
112*b6fb3261SAndroid Build Coastguard Worker    if args:
113*b6fb3261SAndroid Build Coastguard Worker        ctx.actions.run(
114*b6fb3261SAndroid Build Coastguard Worker            inputs = inputs,
115*b6fb3261SAndroid Build Coastguard Worker            outputs = ctx.outputs.outs,
116*b6fb3261SAndroid Build Coastguard Worker            arguments = args + import_flags + [s.path for s in srcs],
117*b6fb3261SAndroid Build Coastguard Worker            executable = ctx.executable.protoc,
118*b6fb3261SAndroid Build Coastguard Worker            mnemonic = "ProtoCompile",
119*b6fb3261SAndroid Build Coastguard Worker            tools = tools,
120*b6fb3261SAndroid Build Coastguard Worker            use_default_shell_env = True,
121*b6fb3261SAndroid Build Coastguard Worker        )
122*b6fb3261SAndroid Build Coastguard Worker
123*b6fb3261SAndroid Build Coastguard Worker    return struct(
124*b6fb3261SAndroid Build Coastguard Worker        proto = struct(
125*b6fb3261SAndroid Build Coastguard Worker            srcs = srcs,
126*b6fb3261SAndroid Build Coastguard Worker            import_flags = import_flags,
127*b6fb3261SAndroid Build Coastguard Worker            deps = deps,
128*b6fb3261SAndroid Build Coastguard Worker        ),
129*b6fb3261SAndroid Build Coastguard Worker    )
130*b6fb3261SAndroid Build Coastguard Worker
131*b6fb3261SAndroid Build Coastguard Workerproto_gen = rule(
132*b6fb3261SAndroid Build Coastguard Worker    attrs = {
133*b6fb3261SAndroid Build Coastguard Worker        "srcs": attr.label_list(allow_files = True),
134*b6fb3261SAndroid Build Coastguard Worker        "deps": attr.label_list(providers = ["proto"]),
135*b6fb3261SAndroid Build Coastguard Worker        "includes": attr.string_list(),
136*b6fb3261SAndroid Build Coastguard Worker        "protoc": attr.label(
137*b6fb3261SAndroid Build Coastguard Worker            cfg = "host",
138*b6fb3261SAndroid Build Coastguard Worker            executable = True,
139*b6fb3261SAndroid Build Coastguard Worker            allow_single_file = True,
140*b6fb3261SAndroid Build Coastguard Worker            mandatory = True,
141*b6fb3261SAndroid Build Coastguard Worker        ),
142*b6fb3261SAndroid Build Coastguard Worker        "plugin": attr.label(
143*b6fb3261SAndroid Build Coastguard Worker            cfg = "host",
144*b6fb3261SAndroid Build Coastguard Worker            allow_files = True,
145*b6fb3261SAndroid Build Coastguard Worker            executable = True,
146*b6fb3261SAndroid Build Coastguard Worker        ),
147*b6fb3261SAndroid Build Coastguard Worker        "plugin_language": attr.string(),
148*b6fb3261SAndroid Build Coastguard Worker        "plugin_options": attr.string_list(),
149*b6fb3261SAndroid Build Coastguard Worker        "gen_cc": attr.bool(),
150*b6fb3261SAndroid Build Coastguard Worker        "gen_py": attr.bool(),
151*b6fb3261SAndroid Build Coastguard Worker        "outs": attr.output_list(),
152*b6fb3261SAndroid Build Coastguard Worker    },
153*b6fb3261SAndroid Build Coastguard Worker    output_to_genfiles = True,
154*b6fb3261SAndroid Build Coastguard Worker    implementation = _proto_gen_impl,
155*b6fb3261SAndroid Build Coastguard Worker)
156*b6fb3261SAndroid Build Coastguard Worker"""Generates codes from Protocol Buffers definitions.
157*b6fb3261SAndroid Build Coastguard Worker
158*b6fb3261SAndroid Build Coastguard WorkerThis rule helps you to implement Skylark macros specific to the target
159*b6fb3261SAndroid Build Coastguard Workerlanguage. You should prefer more specific `cc_proto_library `,
160*b6fb3261SAndroid Build Coastguard Worker`py_proto_library` and others unless you are adding such wrapper macros.
161*b6fb3261SAndroid Build Coastguard Worker
162*b6fb3261SAndroid Build Coastguard WorkerArgs:
163*b6fb3261SAndroid Build Coastguard Worker  srcs: Protocol Buffers definition files (.proto) to run the protocol compiler
164*b6fb3261SAndroid Build Coastguard Worker    against.
165*b6fb3261SAndroid Build Coastguard Worker  deps: a list of dependency labels; must be other proto libraries.
166*b6fb3261SAndroid Build Coastguard Worker  includes: a list of include paths to .proto files.
167*b6fb3261SAndroid Build Coastguard Worker  protoc: the label of the protocol compiler to generate the sources.
168*b6fb3261SAndroid Build Coastguard Worker  plugin: the label of the protocol compiler plugin to be passed to the protocol
169*b6fb3261SAndroid Build Coastguard Worker    compiler.
170*b6fb3261SAndroid Build Coastguard Worker  plugin_language: the language of the generated sources
171*b6fb3261SAndroid Build Coastguard Worker  plugin_options: a list of options to be passed to the plugin
172*b6fb3261SAndroid Build Coastguard Worker  gen_cc: generates C++ sources in addition to the ones from the plugin.
173*b6fb3261SAndroid Build Coastguard Worker  gen_py: generates Python sources in addition to the ones from the plugin.
174*b6fb3261SAndroid Build Coastguard Worker  outs: a list of labels of the expected outputs from the protocol compiler.
175*b6fb3261SAndroid Build Coastguard Worker"""
176*b6fb3261SAndroid Build Coastguard Worker
177*b6fb3261SAndroid Build Coastguard Workerdef cc_proto_library(
178*b6fb3261SAndroid Build Coastguard Worker        name,
179*b6fb3261SAndroid Build Coastguard Worker        srcs = [],
180*b6fb3261SAndroid Build Coastguard Worker        deps = [],
181*b6fb3261SAndroid Build Coastguard Worker        cc_libs = [],
182*b6fb3261SAndroid Build Coastguard Worker        include = None,
183*b6fb3261SAndroid Build Coastguard Worker        protoc = "@com_google_protobuf//:protoc",
184*b6fb3261SAndroid Build Coastguard Worker        internal_bootstrap_hack = False,
185*b6fb3261SAndroid Build Coastguard Worker        use_grpc_plugin = False,
186*b6fb3261SAndroid Build Coastguard Worker        default_runtime = "@com_google_protobuf//:protobuf",
187*b6fb3261SAndroid Build Coastguard Worker        **kwargs):
188*b6fb3261SAndroid Build Coastguard Worker    """Bazel rule to create a C++ protobuf library from proto source files
189*b6fb3261SAndroid Build Coastguard Worker
190*b6fb3261SAndroid Build Coastguard Worker    NOTE: the rule is only an internal workaround to generate protos. The
191*b6fb3261SAndroid Build Coastguard Worker    interface may change and the rule may be removed when bazel has introduced
192*b6fb3261SAndroid Build Coastguard Worker    the native rule.
193*b6fb3261SAndroid Build Coastguard Worker
194*b6fb3261SAndroid Build Coastguard Worker    Args:
195*b6fb3261SAndroid Build Coastguard Worker      name: the name of the cc_proto_library.
196*b6fb3261SAndroid Build Coastguard Worker      srcs: the .proto files of the cc_proto_library.
197*b6fb3261SAndroid Build Coastguard Worker      deps: a list of dependency labels; must be cc_proto_library.
198*b6fb3261SAndroid Build Coastguard Worker      cc_libs: a list of other cc_library targets depended by the generated
199*b6fb3261SAndroid Build Coastguard Worker          cc_library.
200*b6fb3261SAndroid Build Coastguard Worker      include: a string indicating the include path of the .proto files.
201*b6fb3261SAndroid Build Coastguard Worker      protoc: the label of the protocol compiler to generate the sources.
202*b6fb3261SAndroid Build Coastguard Worker      internal_bootstrap_hack: a flag indicating if the cc_proto_library is used only
203*b6fb3261SAndroid Build Coastguard Worker          for bootstrapping. When it is set to True, no files will be generated.
204*b6fb3261SAndroid Build Coastguard Worker          The rule will simply be a provider for .proto files, so that other
205*b6fb3261SAndroid Build Coastguard Worker          cc_proto_library can depend on it.
206*b6fb3261SAndroid Build Coastguard Worker      use_grpc_plugin: a flag to indicate whether to call the grpc C++ plugin
207*b6fb3261SAndroid Build Coastguard Worker          when processing the proto files.
208*b6fb3261SAndroid Build Coastguard Worker      default_runtime: the implicitly default runtime which will be depended on by
209*b6fb3261SAndroid Build Coastguard Worker          the generated cc_library target.
210*b6fb3261SAndroid Build Coastguard Worker      **kwargs: other keyword arguments that are passed to cc_library.
211*b6fb3261SAndroid Build Coastguard Worker
212*b6fb3261SAndroid Build Coastguard Worker    """
213*b6fb3261SAndroid Build Coastguard Worker
214*b6fb3261SAndroid Build Coastguard Worker    includes = []
215*b6fb3261SAndroid Build Coastguard Worker    if include != None:
216*b6fb3261SAndroid Build Coastguard Worker        includes = [include]
217*b6fb3261SAndroid Build Coastguard Worker
218*b6fb3261SAndroid Build Coastguard Worker    if internal_bootstrap_hack:
219*b6fb3261SAndroid Build Coastguard Worker        # For pre-checked-in generated files, we add the internal_bootstrap_hack
220*b6fb3261SAndroid Build Coastguard Worker        # which will skip the codegen action.
221*b6fb3261SAndroid Build Coastguard Worker        proto_gen(
222*b6fb3261SAndroid Build Coastguard Worker            name = name + "_genproto",
223*b6fb3261SAndroid Build Coastguard Worker            srcs = srcs,
224*b6fb3261SAndroid Build Coastguard Worker            deps = [s + "_genproto" for s in deps],
225*b6fb3261SAndroid Build Coastguard Worker            includes = includes,
226*b6fb3261SAndroid Build Coastguard Worker            protoc = protoc,
227*b6fb3261SAndroid Build Coastguard Worker            visibility = ["//visibility:public"],
228*b6fb3261SAndroid Build Coastguard Worker        )
229*b6fb3261SAndroid Build Coastguard Worker
230*b6fb3261SAndroid Build Coastguard Worker        # An empty cc_library to make rule dependency consistent.
231*b6fb3261SAndroid Build Coastguard Worker        native.cc_library(
232*b6fb3261SAndroid Build Coastguard Worker            name = name,
233*b6fb3261SAndroid Build Coastguard Worker            **kwargs
234*b6fb3261SAndroid Build Coastguard Worker        )
235*b6fb3261SAndroid Build Coastguard Worker        return
236*b6fb3261SAndroid Build Coastguard Worker
237*b6fb3261SAndroid Build Coastguard Worker    grpc_cpp_plugin = None
238*b6fb3261SAndroid Build Coastguard Worker    if use_grpc_plugin:
239*b6fb3261SAndroid Build Coastguard Worker        grpc_cpp_plugin = "//external:grpc_cpp_plugin"
240*b6fb3261SAndroid Build Coastguard Worker
241*b6fb3261SAndroid Build Coastguard Worker    gen_srcs = _CcSrcs(srcs, use_grpc_plugin)
242*b6fb3261SAndroid Build Coastguard Worker    gen_hdrs = _CcHdrs(srcs, use_grpc_plugin)
243*b6fb3261SAndroid Build Coastguard Worker    outs = gen_srcs + gen_hdrs
244*b6fb3261SAndroid Build Coastguard Worker
245*b6fb3261SAndroid Build Coastguard Worker    proto_gen(
246*b6fb3261SAndroid Build Coastguard Worker        name = name + "_genproto",
247*b6fb3261SAndroid Build Coastguard Worker        srcs = srcs,
248*b6fb3261SAndroid Build Coastguard Worker        deps = [s + "_genproto" for s in deps],
249*b6fb3261SAndroid Build Coastguard Worker        includes = includes,
250*b6fb3261SAndroid Build Coastguard Worker        protoc = protoc,
251*b6fb3261SAndroid Build Coastguard Worker        plugin = grpc_cpp_plugin,
252*b6fb3261SAndroid Build Coastguard Worker        plugin_language = "grpc",
253*b6fb3261SAndroid Build Coastguard Worker        gen_cc = 1,
254*b6fb3261SAndroid Build Coastguard Worker        outs = outs,
255*b6fb3261SAndroid Build Coastguard Worker        visibility = ["//visibility:public"],
256*b6fb3261SAndroid Build Coastguard Worker    )
257*b6fb3261SAndroid Build Coastguard Worker
258*b6fb3261SAndroid Build Coastguard Worker    if default_runtime and not default_runtime in cc_libs:
259*b6fb3261SAndroid Build Coastguard Worker        cc_libs = cc_libs + [default_runtime]
260*b6fb3261SAndroid Build Coastguard Worker    if use_grpc_plugin:
261*b6fb3261SAndroid Build Coastguard Worker        cc_libs = cc_libs + ["//external:grpc_lib"]
262*b6fb3261SAndroid Build Coastguard Worker
263*b6fb3261SAndroid Build Coastguard Worker    native.cc_library(
264*b6fb3261SAndroid Build Coastguard Worker        name = name,
265*b6fb3261SAndroid Build Coastguard Worker        srcs = gen_srcs,
266*b6fb3261SAndroid Build Coastguard Worker        hdrs = gen_hdrs,
267*b6fb3261SAndroid Build Coastguard Worker        deps = cc_libs + deps,
268*b6fb3261SAndroid Build Coastguard Worker        includes = includes,
269*b6fb3261SAndroid Build Coastguard Worker        alwayslink = 1,
270*b6fb3261SAndroid Build Coastguard Worker        **kwargs
271*b6fb3261SAndroid Build Coastguard Worker    )
272*b6fb3261SAndroid Build Coastguard Worker
273*b6fb3261SAndroid Build Coastguard Workerdef internal_gen_well_known_protos_java(srcs):
274*b6fb3261SAndroid Build Coastguard Worker    """Bazel rule to generate the gen_well_known_protos_java genrule
275*b6fb3261SAndroid Build Coastguard Worker
276*b6fb3261SAndroid Build Coastguard Worker    Args:
277*b6fb3261SAndroid Build Coastguard Worker      srcs: the well known protos
278*b6fb3261SAndroid Build Coastguard Worker    """
279*b6fb3261SAndroid Build Coastguard Worker    root = Label("%s//protobuf_java" % (native.repository_name())).workspace_root
280*b6fb3261SAndroid Build Coastguard Worker    pkg = native.package_name() + "/" if native.package_name() else ""
281*b6fb3261SAndroid Build Coastguard Worker    if root == "":
282*b6fb3261SAndroid Build Coastguard Worker        include = " -I%ssrc " % pkg
283*b6fb3261SAndroid Build Coastguard Worker    else:
284*b6fb3261SAndroid Build Coastguard Worker        include = " -I%s/%ssrc " % (root, pkg)
285*b6fb3261SAndroid Build Coastguard Worker    native.genrule(
286*b6fb3261SAndroid Build Coastguard Worker        name = "gen_well_known_protos_java",
287*b6fb3261SAndroid Build Coastguard Worker        srcs = srcs,
288*b6fb3261SAndroid Build Coastguard Worker        outs = [
289*b6fb3261SAndroid Build Coastguard Worker            "wellknown.srcjar",
290*b6fb3261SAndroid Build Coastguard Worker        ],
291*b6fb3261SAndroid Build Coastguard Worker        cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" +
292*b6fb3261SAndroid Build Coastguard Worker              " %s $(SRCS) " % include +
293*b6fb3261SAndroid Build Coastguard Worker              " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar",
294*b6fb3261SAndroid Build Coastguard Worker        tools = [":protoc"],
295*b6fb3261SAndroid Build Coastguard Worker    )
296*b6fb3261SAndroid Build Coastguard Worker
297*b6fb3261SAndroid Build Coastguard Workerdef internal_copied_filegroup(name, srcs, strip_prefix, dest, **kwargs):
298*b6fb3261SAndroid Build Coastguard Worker    """Macro to copy files to a different directory and then create a filegroup.
299*b6fb3261SAndroid Build Coastguard Worker
300*b6fb3261SAndroid Build Coastguard Worker    This is used by the //:protobuf_python py_proto_library target to work around
301*b6fb3261SAndroid Build Coastguard Worker    an issue caused by Python source files that are part of the same Python
302*b6fb3261SAndroid Build Coastguard Worker    package being in separate directories.
303*b6fb3261SAndroid Build Coastguard Worker
304*b6fb3261SAndroid Build Coastguard Worker    Args:
305*b6fb3261SAndroid Build Coastguard Worker      srcs: The source files to copy and add to the filegroup.
306*b6fb3261SAndroid Build Coastguard Worker      strip_prefix: Path to the root of the files to copy.
307*b6fb3261SAndroid Build Coastguard Worker      dest: The directory to copy the source files into.
308*b6fb3261SAndroid Build Coastguard Worker      **kwargs: extra arguments that will be passesd to the filegroup.
309*b6fb3261SAndroid Build Coastguard Worker    """
310*b6fb3261SAndroid Build Coastguard Worker    outs = [_RelativeOutputPath(s, strip_prefix, dest) for s in srcs]
311*b6fb3261SAndroid Build Coastguard Worker
312*b6fb3261SAndroid Build Coastguard Worker    native.genrule(
313*b6fb3261SAndroid Build Coastguard Worker        name = name + "_genrule",
314*b6fb3261SAndroid Build Coastguard Worker        srcs = srcs,
315*b6fb3261SAndroid Build Coastguard Worker        outs = outs,
316*b6fb3261SAndroid Build Coastguard Worker        cmd = " && ".join(
317*b6fb3261SAndroid Build Coastguard Worker            ["cp $(location %s) $(location %s)" %
318*b6fb3261SAndroid Build Coastguard Worker             (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs],
319*b6fb3261SAndroid Build Coastguard Worker        ),
320*b6fb3261SAndroid Build Coastguard Worker    )
321*b6fb3261SAndroid Build Coastguard Worker
322*b6fb3261SAndroid Build Coastguard Worker    native.filegroup(
323*b6fb3261SAndroid Build Coastguard Worker        name = name,
324*b6fb3261SAndroid Build Coastguard Worker        srcs = outs,
325*b6fb3261SAndroid Build Coastguard Worker        **kwargs
326*b6fb3261SAndroid Build Coastguard Worker    )
327*b6fb3261SAndroid Build Coastguard Worker
328*b6fb3261SAndroid Build Coastguard Workerdef py_proto_library(
329*b6fb3261SAndroid Build Coastguard Worker        name,
330*b6fb3261SAndroid Build Coastguard Worker        srcs = [],
331*b6fb3261SAndroid Build Coastguard Worker        deps = [],
332*b6fb3261SAndroid Build Coastguard Worker        py_libs = [],
333*b6fb3261SAndroid Build Coastguard Worker        py_extra_srcs = [],
334*b6fb3261SAndroid Build Coastguard Worker        include = None,
335*b6fb3261SAndroid Build Coastguard Worker        default_runtime = "@com_google_protobuf//:protobuf_python",
336*b6fb3261SAndroid Build Coastguard Worker        protoc = "@com_google_protobuf//:protoc",
337*b6fb3261SAndroid Build Coastguard Worker        use_grpc_plugin = False,
338*b6fb3261SAndroid Build Coastguard Worker        **kwargs):
339*b6fb3261SAndroid Build Coastguard Worker    """Bazel rule to create a Python protobuf library from proto source files
340*b6fb3261SAndroid Build Coastguard Worker
341*b6fb3261SAndroid Build Coastguard Worker    NOTE: the rule is only an internal workaround to generate protos. The
342*b6fb3261SAndroid Build Coastguard Worker    interface may change and the rule may be removed when bazel has introduced
343*b6fb3261SAndroid Build Coastguard Worker    the native rule.
344*b6fb3261SAndroid Build Coastguard Worker
345*b6fb3261SAndroid Build Coastguard Worker    Args:
346*b6fb3261SAndroid Build Coastguard Worker      name: the name of the py_proto_library.
347*b6fb3261SAndroid Build Coastguard Worker      srcs: the .proto files of the py_proto_library.
348*b6fb3261SAndroid Build Coastguard Worker      deps: a list of dependency labels; must be py_proto_library.
349*b6fb3261SAndroid Build Coastguard Worker      py_libs: a list of other py_library targets depended by the generated
350*b6fb3261SAndroid Build Coastguard Worker          py_library.
351*b6fb3261SAndroid Build Coastguard Worker      py_extra_srcs: extra source files that will be added to the output
352*b6fb3261SAndroid Build Coastguard Worker          py_library. This attribute is used for internal bootstrapping.
353*b6fb3261SAndroid Build Coastguard Worker      include: a string indicating the include path of the .proto files.
354*b6fb3261SAndroid Build Coastguard Worker      default_runtime: the implicitly default runtime which will be depended on by
355*b6fb3261SAndroid Build Coastguard Worker          the generated py_library target.
356*b6fb3261SAndroid Build Coastguard Worker      protoc: the label of the protocol compiler to generate the sources.
357*b6fb3261SAndroid Build Coastguard Worker      use_grpc_plugin: a flag to indicate whether to call the Python C++ plugin
358*b6fb3261SAndroid Build Coastguard Worker          when processing the proto files.
359*b6fb3261SAndroid Build Coastguard Worker      **kwargs: other keyword arguments that are passed to py_library.
360*b6fb3261SAndroid Build Coastguard Worker
361*b6fb3261SAndroid Build Coastguard Worker    """
362*b6fb3261SAndroid Build Coastguard Worker    outs = _PyOuts(srcs, use_grpc_plugin)
363*b6fb3261SAndroid Build Coastguard Worker
364*b6fb3261SAndroid Build Coastguard Worker    includes = []
365*b6fb3261SAndroid Build Coastguard Worker    if include != None:
366*b6fb3261SAndroid Build Coastguard Worker        includes = [include]
367*b6fb3261SAndroid Build Coastguard Worker
368*b6fb3261SAndroid Build Coastguard Worker    grpc_python_plugin = None
369*b6fb3261SAndroid Build Coastguard Worker    if use_grpc_plugin:
370*b6fb3261SAndroid Build Coastguard Worker        grpc_python_plugin = "//external:grpc_python_plugin"
371*b6fb3261SAndroid Build Coastguard Worker        # Note: Generated grpc code depends on Python grpc module. This dependency
372*b6fb3261SAndroid Build Coastguard Worker        # is not explicitly listed in py_libs. Instead, host system is assumed to
373*b6fb3261SAndroid Build Coastguard Worker        # have grpc installed.
374*b6fb3261SAndroid Build Coastguard Worker
375*b6fb3261SAndroid Build Coastguard Worker    proto_gen(
376*b6fb3261SAndroid Build Coastguard Worker        name = name + "_genproto",
377*b6fb3261SAndroid Build Coastguard Worker        srcs = srcs,
378*b6fb3261SAndroid Build Coastguard Worker        deps = [s + "_genproto" for s in deps],
379*b6fb3261SAndroid Build Coastguard Worker        includes = includes,
380*b6fb3261SAndroid Build Coastguard Worker        protoc = protoc,
381*b6fb3261SAndroid Build Coastguard Worker        gen_py = 1,
382*b6fb3261SAndroid Build Coastguard Worker        outs = outs,
383*b6fb3261SAndroid Build Coastguard Worker        visibility = ["//visibility:public"],
384*b6fb3261SAndroid Build Coastguard Worker        plugin = grpc_python_plugin,
385*b6fb3261SAndroid Build Coastguard Worker        plugin_language = "grpc",
386*b6fb3261SAndroid Build Coastguard Worker    )
387*b6fb3261SAndroid Build Coastguard Worker
388*b6fb3261SAndroid Build Coastguard Worker    if default_runtime and not default_runtime in py_libs + deps:
389*b6fb3261SAndroid Build Coastguard Worker        py_libs = py_libs + [default_runtime]
390*b6fb3261SAndroid Build Coastguard Worker
391*b6fb3261SAndroid Build Coastguard Worker    native.py_library(
392*b6fb3261SAndroid Build Coastguard Worker        name = name,
393*b6fb3261SAndroid Build Coastguard Worker        srcs = outs + py_extra_srcs,
394*b6fb3261SAndroid Build Coastguard Worker        deps = py_libs + deps,
395*b6fb3261SAndroid Build Coastguard Worker        imports = includes,
396*b6fb3261SAndroid Build Coastguard Worker        **kwargs
397*b6fb3261SAndroid Build Coastguard Worker    )
398*b6fb3261SAndroid Build Coastguard Worker
399*b6fb3261SAndroid Build Coastguard Workerdef internal_protobuf_py_tests(
400*b6fb3261SAndroid Build Coastguard Worker        name,
401*b6fb3261SAndroid Build Coastguard Worker        modules = [],
402*b6fb3261SAndroid Build Coastguard Worker        **kwargs):
403*b6fb3261SAndroid Build Coastguard Worker    """Bazel rules to create batch tests for protobuf internal.
404*b6fb3261SAndroid Build Coastguard Worker
405*b6fb3261SAndroid Build Coastguard Worker    Args:
406*b6fb3261SAndroid Build Coastguard Worker      name: the name of the rule.
407*b6fb3261SAndroid Build Coastguard Worker      modules: a list of modules for tests. The macro will create a py_test for
408*b6fb3261SAndroid Build Coastguard Worker          each of the parameter with the source "google/protobuf/%s.py"
409*b6fb3261SAndroid Build Coastguard Worker      **kwargs: extra parameters that will be passed into the py_test.
410*b6fb3261SAndroid Build Coastguard Worker
411*b6fb3261SAndroid Build Coastguard Worker    """
412*b6fb3261SAndroid Build Coastguard Worker    for m in modules:
413*b6fb3261SAndroid Build Coastguard Worker        s = "python/google/protobuf/internal/%s.py" % m
414*b6fb3261SAndroid Build Coastguard Worker        native.py_test(
415*b6fb3261SAndroid Build Coastguard Worker            name = "py_%s" % m,
416*b6fb3261SAndroid Build Coastguard Worker            srcs = [s],
417*b6fb3261SAndroid Build Coastguard Worker            main = s,
418*b6fb3261SAndroid Build Coastguard Worker            **kwargs
419*b6fb3261SAndroid Build Coastguard Worker        )
420*b6fb3261SAndroid Build Coastguard Worker
421*b6fb3261SAndroid Build Coastguard Workerdef check_protobuf_required_bazel_version():
422*b6fb3261SAndroid Build Coastguard Worker    """For WORKSPACE files, to check the installed version of bazel.
423*b6fb3261SAndroid Build Coastguard Worker
424*b6fb3261SAndroid Build Coastguard Worker    This ensures bazel supports our approach to proto_library() depending on a
425*b6fb3261SAndroid Build Coastguard Worker    copied filegroup. (Fixed in bazel 0.5.4)
426*b6fb3261SAndroid Build Coastguard Worker    """
427*b6fb3261SAndroid Build Coastguard Worker    expected = apple_common.dotted_version("0.5.4")
428*b6fb3261SAndroid Build Coastguard Worker    current = apple_common.dotted_version(native.bazel_version)
429*b6fb3261SAndroid Build Coastguard Worker    if current.compare_to(expected) < 0:
430*b6fb3261SAndroid Build Coastguard Worker        fail("Bazel must be newer than 0.5.4")
431