|
|
|
@ -74,7 +74,7 @@ def _proto_gen_impl(ctx): |
|
|
|
|
deps = [] |
|
|
|
|
deps += ctx.files.srcs |
|
|
|
|
source_dir = _SourceDir(ctx) |
|
|
|
|
gen_dir = _GenDir(ctx) |
|
|
|
|
gen_dir = _GenDir(ctx).rstrip('/') |
|
|
|
|
if source_dir: |
|
|
|
|
import_flags = ["-I" + source_dir, "-I" + gen_dir] |
|
|
|
|
else: |
|
|
|
@ -84,37 +84,83 @@ def _proto_gen_impl(ctx): |
|
|
|
|
import_flags += dep.proto.import_flags |
|
|
|
|
deps += dep.proto.deps |
|
|
|
|
|
|
|
|
|
args = [] |
|
|
|
|
if ctx.attr.gen_cc: |
|
|
|
|
args += ["--cpp_out=" + gen_dir] |
|
|
|
|
if ctx.attr.gen_py: |
|
|
|
|
args += ["--python_out=" + gen_dir] |
|
|
|
|
|
|
|
|
|
inputs = srcs + deps |
|
|
|
|
if ctx.executable.plugin: |
|
|
|
|
plugin = ctx.executable.plugin |
|
|
|
|
lang = ctx.attr.plugin_language |
|
|
|
|
if not lang and plugin.basename.startswith('protoc-gen-'): |
|
|
|
|
lang = plugin.basename[len('protoc-gen-'):] |
|
|
|
|
if not lang: |
|
|
|
|
fail("cannot infer the target language of plugin", "plugin_language") |
|
|
|
|
|
|
|
|
|
outdir = gen_dir |
|
|
|
|
if ctx.attr.plugin_options: |
|
|
|
|
outdir = ",".join(ctx.attr.plugin_options) + ":" + outdir |
|
|
|
|
args += ["--plugin=protoc-gen-%s=%s" % (lang, plugin.path)] |
|
|
|
|
args += ["--%s_out=%s" % (lang, outdir)] |
|
|
|
|
inputs += [plugin] |
|
|
|
|
|
|
|
|
|
if args: |
|
|
|
|
ctx.action( |
|
|
|
|
inputs=inputs, |
|
|
|
|
outputs=ctx.outputs.outs, |
|
|
|
|
arguments=args + import_flags + [s.path for s in srcs], |
|
|
|
|
executable=ctx.executable.protoc, |
|
|
|
|
mnemonic="ProtoCompile", |
|
|
|
|
use_default_shell_env=True, |
|
|
|
|
) |
|
|
|
|
if not ctx.attr.gen_cc and not ctx.attr.gen_py and not ctx.executable.plugin: |
|
|
|
|
return struct( |
|
|
|
|
proto=struct( |
|
|
|
|
srcs=srcs, |
|
|
|
|
import_flags=import_flags, |
|
|
|
|
deps=deps, |
|
|
|
|
), |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
for src in srcs: |
|
|
|
|
args = [] |
|
|
|
|
|
|
|
|
|
in_gen_dir = src.root.path == gen_dir |
|
|
|
|
if in_gen_dir: |
|
|
|
|
import_flags_real = [] |
|
|
|
|
for f in depset(import_flags): |
|
|
|
|
path = f.replace('-I', '') |
|
|
|
|
import_flags_real.append('-I$(realpath -s %s)' % path) |
|
|
|
|
|
|
|
|
|
outs = [] |
|
|
|
|
use_grpc_plugin = (ctx.attr.plugin_language == "grpc" and ctx.attr.plugin) |
|
|
|
|
path_tpl = "$(realpath %s)" if in_gen_dir else "%s" |
|
|
|
|
if ctx.attr.gen_cc: |
|
|
|
|
args += [("--cpp_out=" + path_tpl) % gen_dir] |
|
|
|
|
outs.extend(_CcOuts([src.basename], use_grpc_plugin=use_grpc_plugin)) |
|
|
|
|
if ctx.attr.gen_py: |
|
|
|
|
args += [("--python_out=" + path_tpl) % gen_dir] |
|
|
|
|
outs.extend(_PyOuts([src.basename], use_grpc_plugin=use_grpc_plugin)) |
|
|
|
|
|
|
|
|
|
outs = [ctx.actions.declare_file(out, sibling=src) for out in outs] |
|
|
|
|
inputs = [src] + deps |
|
|
|
|
if ctx.executable.plugin: |
|
|
|
|
plugin = ctx.executable.plugin |
|
|
|
|
lang = ctx.attr.plugin_language |
|
|
|
|
if not lang and plugin.basename.startswith('protoc-gen-'): |
|
|
|
|
lang = plugin.basename[len('protoc-gen-'):] |
|
|
|
|
if not lang: |
|
|
|
|
fail("cannot infer the target language of plugin", "plugin_language") |
|
|
|
|
|
|
|
|
|
outdir = "." if in_gen_dir else gen_dir |
|
|
|
|
|
|
|
|
|
if ctx.attr.plugin_options: |
|
|
|
|
outdir = ",".join(ctx.attr.plugin_options) + ":" + outdir |
|
|
|
|
args += [("--plugin=protoc-gen-%s=" + path_tpl) % (lang, plugin.path)] |
|
|
|
|
args += ["--%s_out=%s" % (lang, outdir)] |
|
|
|
|
inputs += [plugin] |
|
|
|
|
|
|
|
|
|
if not in_gen_dir: |
|
|
|
|
ctx.action( |
|
|
|
|
inputs=inputs, |
|
|
|
|
outputs=outs, |
|
|
|
|
arguments=args + import_flags + [src.path], |
|
|
|
|
executable=ctx.executable.protoc, |
|
|
|
|
mnemonic="ProtoCompile", |
|
|
|
|
use_default_shell_env=True, |
|
|
|
|
) |
|
|
|
|
else: |
|
|
|
|
for out in outs: |
|
|
|
|
orig_command = " ".join( |
|
|
|
|
["$(realpath %s)" % ctx.executable.protoc.path] + args + |
|
|
|
|
import_flags_real + ["-I.", src.basename]) |
|
|
|
|
command = ";".join([ |
|
|
|
|
'CMD="%s"' % orig_command, |
|
|
|
|
"cd %s" % src.dirname, |
|
|
|
|
"${CMD}", |
|
|
|
|
"cd -", |
|
|
|
|
]) |
|
|
|
|
generated_out = '/'.join([gen_dir, out.basename]) |
|
|
|
|
if generated_out != out.path: |
|
|
|
|
command += ";mv %s %s" % (generated_out, out.path) |
|
|
|
|
ctx.action( |
|
|
|
|
inputs=inputs + [ctx.executable.protoc], |
|
|
|
|
outputs=[out], |
|
|
|
|
command=command, |
|
|
|
|
mnemonic="ProtoCompile", |
|
|
|
|
use_default_shell_env=True, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
return struct( |
|
|
|
|
proto=struct( |
|
|
|
|