|
@@ -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(
|