我如何使用java_common.compile.annotation_processor_additional_outputs生成声明的文件和目录?

问题描述 投票:0回答:1

我使用注释处理器从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

谢谢!

bazel
1个回答
0
投票
说服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]))

© www.soinside.com 2019 - 2024. All rights reserved.