Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: third_party/protobuf/protobuf.bzl

Issue 2495533002: third_party/protobuf: Update to HEAD (83d681ee2c) (Closed)
Patch Set: Update to new HEAD (b7632464b4) + restore GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # -*- mode: python; -*- PYTHON-PREPROCESSING-REQUIRED 1 # -*- mode: python; -*- PYTHON-PREPROCESSING-REQUIRED
2 2
3 def _GetPath(ctx, path): 3 def _GetPath(ctx, path):
4 if ctx.label.workspace_root: 4 if ctx.label.workspace_root:
5 return ctx.label.workspace_root + '/' + path 5 return ctx.label.workspace_root + '/' + path
6 else: 6 else:
7 return path 7 return path
8 8
9 def _GenDir(ctx): 9 def _GenDir(ctx):
10 if not ctx.attr.includes: 10 if not ctx.attr.includes:
11 return ctx.label.workspace_root 11 return ctx.label.workspace_root
12 if not ctx.attr.includes[0]: 12 if not ctx.attr.includes[0]:
13 return _GetPath(ctx, ctx.label.package) 13 return _GetPath(ctx, ctx.label.package)
14 if not ctx.label.package: 14 if not ctx.label.package:
15 return _GetPath(ctx, ctx.attr.includes[0]) 15 return _GetPath(ctx, ctx.attr.includes[0])
16 return _GetPath(ctx, ctx.label.package + '/' + ctx.attr.includes[0]) 16 return _GetPath(ctx, ctx.label.package + '/' + ctx.attr.includes[0])
17 17
18 def _CcHdrs(srcs, use_grpc_plugin=False):
19 ret = [s[:-len(".proto")] + ".pb.h" for s in srcs]
20 if use_grpc_plugin:
21 ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs]
22 return ret
23
24 def _CcSrcs(srcs, use_grpc_plugin=False):
25 ret = [s[:-len(".proto")] + ".pb.cc" for s in srcs]
26 if use_grpc_plugin:
27 ret += [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
28 return ret
29
18 def _CcOuts(srcs, use_grpc_plugin=False): 30 def _CcOuts(srcs, use_grpc_plugin=False):
19 ret = [s[:-len(".proto")] + ".pb.h" for s in srcs] + \ 31 return _CcHdrs(srcs, use_grpc_plugin) + _CcSrcs(srcs, use_grpc_plugin)
20 [s[:-len(".proto")] + ".pb.cc" for s in srcs]
21 if use_grpc_plugin:
22 ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs] + \
23 [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
24 return ret
25 32
26 def _PyOuts(srcs): 33 def _PyOuts(srcs):
27 return [s[:-len(".proto")] + "_pb2.py" for s in srcs] 34 return [s[:-len(".proto")] + "_pb2.py" for s in srcs]
28 35
29 def _RelativeOutputPath(path, include): 36 def _RelativeOutputPath(path, include, dest=""):
30 if include == None: 37 if include == None:
31 return path 38 return path
32 39
33 if not path.startswith(include): 40 if not path.startswith(include):
34 fail("Include path %s isn't part of the path %s." % (include, path)) 41 fail("Include path %s isn't part of the path %s." % (include, path))
35 42
36 if include and include[-1] != '/': 43 if include and include[-1] != '/':
37 include = include + '/' 44 include = include + '/'
45 if dest and dest[-1] != '/':
46 dest = dest + '/'
38 47
39 path = path[len(include):] 48 path = path[len(include):]
40 49 return dest + path
41 if not path.startswith(PACKAGE_NAME):
42 fail("The package %s is not within the path %s" % (PACKAGE_NAME, path))
43
44 if not PACKAGE_NAME:
45 return path
46
47 return path[len(PACKAGE_NAME)+1:]
48 50
49 def _proto_gen_impl(ctx): 51 def _proto_gen_impl(ctx):
50 """General implementation for generating protos""" 52 """General implementation for generating protos"""
51 srcs = ctx.files.srcs 53 srcs = ctx.files.srcs
52 deps = [] 54 deps = []
53 deps += ctx.files.srcs 55 deps += ctx.files.srcs
54 gen_dir = _GenDir(ctx) 56 gen_dir = _GenDir(ctx)
55 if gen_dir: 57 if gen_dir:
56 import_flags = ["-I" + gen_dir] 58 import_flags = ["-I" + gen_dir, "-I" + ctx.var["GENDIR"] + "/" + gen_dir]
57 else: 59 else:
58 import_flags = ["-I."] 60 import_flags = ["-I."]
59 61
60 for dep in ctx.attr.deps: 62 for dep in ctx.attr.deps:
61 import_flags += dep.proto.import_flags 63 import_flags += dep.proto.import_flags
62 deps += dep.proto.deps 64 deps += dep.proto.deps
63 65
64 args = [] 66 args = []
65 if ctx.attr.gen_cc: 67 if ctx.attr.gen_cc:
66 args += ["--cpp_out=" + ctx.var["GENDIR"] + "/" + gen_dir] 68 args += ["--cpp_out=" + ctx.var["GENDIR"] + "/" + gen_dir]
67 if ctx.attr.gen_py: 69 if ctx.attr.gen_py:
68 args += ["--python_out=" + ctx.var["GENDIR"] + "/" + gen_dir] 70 args += ["--python_out=" + ctx.var["GENDIR"] + "/" + gen_dir]
69 71
70 if ctx.executable.grpc_cpp_plugin: 72 inputs = srcs + deps
71 args += ["--plugin=protoc-gen-grpc=" + ctx.executable.grpc_cpp_plugin.path] 73 if ctx.executable.plugin:
72 args += ["--grpc_out=" + ctx.var["GENDIR"] + "/" + gen_dir] 74 plugin = ctx.executable.plugin
75 lang = ctx.attr.plugin_language
76 if not lang and plugin.basename.startswith('protoc-gen-'):
77 lang = plugin.basename[len('protoc-gen-'):]
78 if not lang:
79 fail("cannot infer the target language of plugin", "plugin_language")
80
81 outdir = ctx.var["GENDIR"] + "/" + gen_dir
82 if ctx.attr.plugin_options:
83 outdir = ",".join(ctx.attr.plugin_options) + ":" + outdir
84 args += ["--plugin=protoc-gen-%s=%s" % (lang, plugin.path)]
85 args += ["--%s_out=%s" % (lang, outdir)]
86 inputs += [plugin]
73 87
74 if args: 88 if args:
75 ctx.action( 89 ctx.action(
76 inputs=srcs + deps, 90 inputs=inputs,
77 outputs=ctx.outputs.outs, 91 outputs=ctx.outputs.outs,
78 arguments=args + import_flags + [s.path for s in srcs], 92 arguments=args + import_flags + [s.path for s in srcs],
79 executable=ctx.executable.protoc, 93 executable=ctx.executable.protoc,
94 mnemonic="ProtoCompile",
80 ) 95 )
81 96
82 return struct( 97 return struct(
83 proto=struct( 98 proto=struct(
84 srcs=srcs, 99 srcs=srcs,
85 import_flags=import_flags, 100 import_flags=import_flags,
86 deps=deps, 101 deps=deps,
87 ), 102 ),
88 ) 103 )
89 104
90 _proto_gen = rule( 105 proto_gen = rule(
91 attrs = { 106 attrs = {
92 "srcs": attr.label_list(allow_files = True), 107 "srcs": attr.label_list(allow_files = True),
93 "deps": attr.label_list(providers = ["proto"]), 108 "deps": attr.label_list(providers = ["proto"]),
94 "includes": attr.string_list(), 109 "includes": attr.string_list(),
95 "protoc": attr.label( 110 "protoc": attr.label(
96 cfg = HOST_CFG, 111 cfg = "host",
97 executable = True, 112 executable = True,
98 single_file = True, 113 single_file = True,
99 mandatory = True, 114 mandatory = True,
100 ), 115 ),
101 "grpc_cpp_plugin": attr.label( 116 "plugin": attr.label(
102 cfg = HOST_CFG, 117 cfg = "host",
118 allow_files = True,
103 executable = True, 119 executable = True,
104 single_file = True,
105 ), 120 ),
121 "plugin_language": attr.string(),
122 "plugin_options": attr.string_list(),
106 "gen_cc": attr.bool(), 123 "gen_cc": attr.bool(),
107 "gen_py": attr.bool(), 124 "gen_py": attr.bool(),
108 "outs": attr.output_list(), 125 "outs": attr.output_list(),
109 }, 126 },
110 output_to_genfiles = True, 127 output_to_genfiles = True,
111 implementation = _proto_gen_impl, 128 implementation = _proto_gen_impl,
112 ) 129 )
130 """Generates codes from Protocol Buffers definitions.
131
132 This rule helps you to implement Skylark macros specific to the target
133 language. You should prefer more specific `cc_proto_library `,
134 `py_proto_library` and others unless you are adding such wrapper macros.
135
136 Args:
137 srcs: Protocol Buffers definition files (.proto) to run the protocol compiler
138 against.
139 deps: a list of dependency labels; must be other proto libraries.
140 includes: a list of include paths to .proto files.
141 protoc: the label of the protocol compiler to generate the sources.
142 plugin: the label of the protocol compiler plugin to be passed to the protocol
143 compiler.
144 plugin_language: the language of the generated sources
145 plugin_options: a list of options to be passed to the plugin
146 gen_cc: generates C++ sources in addition to the ones from the plugin.
147 gen_py: generates Python sources in addition to the ones from the plugin.
148 outs: a list of labels of the expected outputs from the protocol compiler.
149 """
113 150
114 def cc_proto_library( 151 def cc_proto_library(
115 name, 152 name,
116 srcs=[], 153 srcs=[],
117 deps=[], 154 deps=[],
118 cc_libs=[], 155 cc_libs=[],
119 include=None, 156 include=None,
120 protoc="//:protoc", 157 protoc="//:protoc",
121 internal_bootstrap_hack=False, 158 internal_bootstrap_hack=False,
122 use_grpc_plugin=False, 159 use_grpc_plugin=False,
(...skipping 25 matching lines...) Expand all
148 185
149 """ 186 """
150 187
151 includes = [] 188 includes = []
152 if include != None: 189 if include != None:
153 includes = [include] 190 includes = [include]
154 191
155 if internal_bootstrap_hack: 192 if internal_bootstrap_hack:
156 # For pre-checked-in generated files, we add the internal_bootstrap_hack 193 # For pre-checked-in generated files, we add the internal_bootstrap_hack
157 # which will skip the codegen action. 194 # which will skip the codegen action.
158 _proto_gen( 195 proto_gen(
159 name=name + "_genproto", 196 name=name + "_genproto",
160 srcs=srcs, 197 srcs=srcs,
161 deps=[s + "_genproto" for s in deps], 198 deps=[s + "_genproto" for s in deps],
162 includes=includes, 199 includes=includes,
163 protoc=protoc, 200 protoc=protoc,
164 visibility=["//visibility:public"], 201 visibility=["//visibility:public"],
165 ) 202 )
166 # An empty cc_library to make rule dependency consistent. 203 # An empty cc_library to make rule dependency consistent.
167 native.cc_library( 204 native.cc_library(
168 name=name, 205 name=name,
169 **kargs) 206 **kargs)
170 return 207 return
171 208
172 grpc_cpp_plugin = None 209 grpc_cpp_plugin = None
173 if use_grpc_plugin: 210 if use_grpc_plugin:
174 grpc_cpp_plugin = "//external:grpc_cpp_plugin" 211 grpc_cpp_plugin = "//external:grpc_cpp_plugin"
175 212
176 outs = _CcOuts(srcs, use_grpc_plugin) 213 gen_srcs = _CcSrcs(srcs, use_grpc_plugin)
214 gen_hdrs = _CcHdrs(srcs, use_grpc_plugin)
215 outs = gen_srcs + gen_hdrs
177 216
178 _proto_gen( 217 proto_gen(
179 name=name + "_genproto", 218 name=name + "_genproto",
180 srcs=srcs, 219 srcs=srcs,
181 deps=[s + "_genproto" for s in deps], 220 deps=[s + "_genproto" for s in deps],
182 includes=includes, 221 includes=includes,
183 protoc=protoc, 222 protoc=protoc,
184 grpc_cpp_plugin=grpc_cpp_plugin, 223 plugin=grpc_cpp_plugin,
224 plugin_language="grpc",
185 gen_cc=1, 225 gen_cc=1,
186 outs=outs, 226 outs=outs,
187 visibility=["//visibility:public"], 227 visibility=["//visibility:public"],
188 ) 228 )
189 229
190 if default_runtime and not default_runtime in cc_libs: 230 if default_runtime and not default_runtime in cc_libs:
191 cc_libs += [default_runtime] 231 cc_libs += [default_runtime]
192 if use_grpc_plugin: 232 if use_grpc_plugin:
193 cc_libs += ["//external:grpc_lib"] 233 cc_libs += ["//external:grpc_lib"]
194 234
195 native.cc_library( 235 native.cc_library(
196 name=name, 236 name=name,
197 srcs=outs, 237 srcs=gen_srcs,
238 hdrs=gen_hdrs,
198 deps=cc_libs + deps, 239 deps=cc_libs + deps,
199 includes=includes, 240 includes=includes,
200 **kargs) 241 **kargs)
201 242
202 243
203 def internal_gen_well_known_protos_java(srcs): 244 def internal_gen_well_known_protos_java(srcs):
204 """Bazel rule to generate the gen_well_known_protos_java genrule 245 """Bazel rule to generate the gen_well_known_protos_java genrule
205 246
206 Args: 247 Args:
207 srcs: the well known protos 248 srcs: the well known protos
208 """ 249 """
209 root = Label("%s//protobuf_java" % (REPOSITORY_NAME)).workspace_root 250 root = Label("%s//protobuf_java" % (REPOSITORY_NAME)).workspace_root
210 if root == "": 251 if root == "":
211 include = " -Isrc " 252 include = " -Isrc "
212 else: 253 else:
213 include = " -I%s/src " % root 254 include = " -I%s/src " % root
214 native.genrule( 255 native.genrule(
215 name = "gen_well_known_protos_java", 256 name = "gen_well_known_protos_java",
216 srcs = srcs, 257 srcs = srcs,
217 outs = [ 258 outs = [
218 "wellknown.srcjar", 259 "wellknown.srcjar",
219 ], 260 ],
220 cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" + 261 cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" +
221 " %s $(SRCS) " % include + 262 " %s $(SRCS) " % include +
222 " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar", 263 " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar",
223 tools = [":protoc"], 264 tools = [":protoc"],
224 ) 265 )
225 266
226 267
268 def internal_copied_filegroup(name, srcs, strip_prefix, dest, **kwargs):
269 """Macro to copy files to a different directory and then create a filegroup.
270
271 This is used by the //:protobuf_python py_proto_library target to work around
272 an issue caused by Python source files that are part of the same Python
273 package being in separate directories.
274
275 Args:
276 srcs: The source files to copy and add to the filegroup.
277 strip_prefix: Path to the root of the files to copy.
278 dest: The directory to copy the source files into.
279 **kwargs: extra arguments that will be passesd to the filegroup.
280 """
281 outs = [_RelativeOutputPath(s, strip_prefix, dest) for s in srcs]
282
283 native.genrule(
284 name = name + "_genrule",
285 srcs = srcs,
286 outs = outs,
287 cmd = " && ".join(
288 ["cp $(location %s) $(location %s)" %
289 (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs]),
290 )
291
292 native.filegroup(
293 name = name,
294 srcs = outs,
295 **kwargs)
296
297
227 def py_proto_library( 298 def py_proto_library(
228 name, 299 name,
229 srcs=[], 300 srcs=[],
230 deps=[], 301 deps=[],
231 py_libs=[], 302 py_libs=[],
232 py_extra_srcs=[], 303 py_extra_srcs=[],
233 include=None, 304 include=None,
234 default_runtime="//:protobuf_python", 305 default_runtime="//:protobuf_python",
235 protoc="//:protoc", 306 protoc="//:protoc",
236 **kargs): 307 **kargs):
(...skipping 17 matching lines...) Expand all
254 protoc: the label of the protocol compiler to generate the sources. 325 protoc: the label of the protocol compiler to generate the sources.
255 **kargs: other keyword arguments that are passed to cc_library. 326 **kargs: other keyword arguments that are passed to cc_library.
256 327
257 """ 328 """
258 outs = _PyOuts(srcs) 329 outs = _PyOuts(srcs)
259 330
260 includes = [] 331 includes = []
261 if include != None: 332 if include != None:
262 includes = [include] 333 includes = [include]
263 334
264 _proto_gen( 335 proto_gen(
265 name=name + "_genproto", 336 name=name + "_genproto",
266 srcs=srcs, 337 srcs=srcs,
267 deps=[s + "_genproto" for s in deps], 338 deps=[s + "_genproto" for s in deps],
268 includes=includes, 339 includes=includes,
269 protoc=protoc, 340 protoc=protoc,
270 gen_py=1, 341 gen_py=1,
271 outs=outs, 342 outs=outs,
272 visibility=["//visibility:public"], 343 visibility=["//visibility:public"],
273 ) 344 )
274 345
(...skipping 20 matching lines...) Expand all
295 kargs: extra parameters that will be passed into the py_test. 366 kargs: extra parameters that will be passed into the py_test.
296 367
297 """ 368 """
298 for m in modules: 369 for m in modules:
299 s = "python/google/protobuf/internal/%s.py" % m 370 s = "python/google/protobuf/internal/%s.py" % m
300 native.py_test( 371 native.py_test(
301 name="py_%s" % m, 372 name="py_%s" % m,
302 srcs=[s], 373 srcs=[s],
303 main=s, 374 main=s,
304 **kargs) 375 **kargs)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698