我使用注释处理器从Java定义的接口生成语言绑定。我想将ctx.actions.run
创建的动作替换为java_common.compile
生成的动作,以便可以利用Bazel对持久javac工作者的本机支持。
这是原始的[[工作使用ctx.actions.run
的Bazel规则实现的模型:
def _impl(ctx):
output_dir = ctx.actions.declare_directory(output)
args = ctx.actions.args()
args.add(output_dir.path, format = "-AoutputDir=%s")
ctx.actions.run(
...,
outputs = [output_dir],
arguments = [args],
)
return DefaultInfo(files = depset([output_dir]))
我现在想做的是将ctx.actions.run
换成java_common.compile
。这是我想出的一个模型:
def _impl(ctx): output_dir = ctx.actions.declare_directory(output) java_common.compile( ... output = ctx.label.name + "-placeholder.jar", # -proc:only javac_opts = [ "-proc:only", "-AoutputDir={}".format(output_dir.path), ], plugins = [ctx.attr._emitter[JavaInfo]], annotation_processor_additional_outputs = [output_dir], ) return DefaultInfo(files = depset([output_dir]))
[这是我的问题:建立目标后,创建了output_dir
,但为空。通过运行find -L bazel-out -name uniqueOutputDir
,我可以在Bazel的输出根目录中找到我的文件,但是它们被埋在bazel-out/darwin-fastbuild/bin/my_packages/_javac/my_target/my_target-placeholder_sourcegenfiles/uniqueOutputDir
下,然后滚动到bazel-bin/my_package/my_target-placeholder-gensrc.jar
中。有什么想法吗?例如,
annotation_processor_additional_outputs
应该如何工作?如何通过javac_opts
指定不带output_dir.path
前缀直接写入...sourcegenfiles
?谢谢!
java_compile
让我的处理器直接发射到output_dir
似乎是一个不起眼的事情。 (输出位置似乎受Bazel-impl定义的sourcegendir控制。)因此,在java_common.compile
之后,我添加了一个动作,该动作将从生成的源jar中提取我的输出,这似乎可以解决我的问题。
def _impl(ctx):
output_dir = ctx.actions.declare_directory(output)
java_common.compile(
...
output = ctx.label.name + "-placeholder.jar", # -proc:only
javac_opts = [
"-proc:only",
"-AoutputDir={}".format(output_dir.basename),
],
plugins = [ctx.attr._emitter[JavaInfo]],
annotation_processor_additional_outputs = [output_dir],
)
extract_args = ctx.actions.args()
extract_args.add(output_dir.dirname)
extract_args.add(java_info.annotation_processing.source_jar)
ctx.actions.run_shell(
inputs = [java_info.annotation_processing.source_jar],
outputs = [output_dir],
arguments = [extract_args],
command = """
set -euo pipefail
output_root=$1
gensrcjar=$2
unzip -q -d $output_root $gensrcjar
""",
)
return DefaultInfo(files = depset([output_dir]))