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