Как создать объявленные файлы и каталоги, используя java_common.compile.annotation_processor_additional_outputs? - PullRequest
1 голос
/ 18 января 2020

Я использую процессор аннотаций для генерации языковых привязок из интерфейсов, определенных в Java. Я хочу заменить действия, созданные с помощью ctx.actions.run, действиями, сгенерированными с помощью java_common.compile, чтобы я мог использовать встроенную поддержку Базеля для постоянных javac рабочих.

Вот макет оригинальной работает Реализация правила Базеля с использованием ctx.actions.run:

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 создается, но пусто. Я могу найти свои файлы в выводе Базеля root, запустив find -L bazel-out -name uniqueOutputDir, но они похоронены под 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?

Спасибо!

1 Ответ

2 голосов
/ 20 января 2020

Убеждение 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]))
...