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