java_toolchain: как я могу использовать компилятор Eclipse в сборке Bazel

Я хочу перенести сборку муравья на Bazel 4.2.1. Сборка ant использует компилятор Eclipse (ecj-3.27.0).

Способ объявления компилятора Java в Bazel: java_toolchain.

Итак, я взглянул на результат bazel query @bazel_tools//tools/jdk:all и попытался использовать ванильный набор инструментов в качестве источника вдохновения ( bazelisk query --output=build @bazel_tools//tools/jdk:toolchain_vanilla).

      java_toolchain(
  # modified settings
  name = "my-ecj-toolchain", 
  javabuilder = ["@ecj//:ecj.jar"], # my Eclipse compiler jar
  target_version = "8",
  # prevent ecj.jar's error message 'unknown option --persistent_workers' 
  javac_supports_workers = False,
  # prevent ecj.jar's error message 'unknown option --persistent_workers' 
  javac_supports_multiplex_workers = False, 

  # keeping most vanilla-toolchain settings
  bootclasspath = ["@bazel_tools//tools/jdk:platformclasspath"],
  misc = ["-XDskipDuplicateBridges=true", "-XDcompilePolicy=simple", "-g", "-parameters"],
  jvm_opts = [],
  tools = ["@bazel_tools//tools/jdk:javac_jar", "@bazel_tools//tools/jdk:java_compiler_jar", "@bazel_tools//tools/jdk:jdk_compiler_jar"],
  singlejar = ["@bazel_tools//tools/jdk:singlejar"],
  forcibly_disable_header_compilation = True,
  genclass = ["@bazel_tools//tools/jdk:genclass"],
  ijar = ["@bazel_tools//tools/jdk:ijar"],
  header_compiler = ["@bazel_tools//tools/jdk:turbine_direct"],
  header_compiler_direct = ["@bazel_tools//tools/jdk:turbine_direct"],
  jacocorunner = "@bazel_tools//tools/jdk:JacocoCoverageFilegroup",
)

Однако это все равно не работает. компилирует вывод неизвестной опции.

bazel aquery MYTARGET отображает всю командную строку компилятора (плюс еще несколько шагов сборки):

       Command Line: (exec external/remotejdk11_linux/bin/java \
    -jar \
    external/ecj/ecj.jar \
    --output \
    bazel-out/k8-opt/bin/[...].jar \
    --native_header_output \
    bazel-out/k8-opt/bin/[...]-native-header.jar \
    --output_manifest_proto \
    bazel-out/k8-opt/bin/[...].jar_manifest_proto \
    --compress_jar \
    --output_deps_proto \
    bazel-out/k8-opt/bin/[...].jdeps \
    --bootclasspath \
    bazel-out/k8-opt/bin/external/bazel_tools/tools/jdk/platformclasspath.jar \
    --sources \
    bazel-out/k8-opt/bin/[...].java \
    --javacopts \
    -target \
    8 \
    '-XDskipDuplicateBridges=true' \
    '-XDcompilePolicy=simple' \
    -g \
    -parameters \
    -g \
    -- \
    --target_label \
    bazel-out/k8-opt/bin/[...]:[...] \
    --strict_java_deps \
    ERROR \
    --direct_dependencies \
[...]

Я не знаю компилятора Java, который принимает --output. Я должен пройти ecj.jar по-другому?

2 ответа

Я не знаю компилятора Java, который принимает --output.

В самом деле, Bazel не вызывает исполняемый файл javac OpenJDK напрямую, а скорее создает собственную оболочку для вызываемых API. Об этом немного сказано в документации Bazel; включает некоторые из более причудливых функций Java Bazel.

Итак, вам нужно будет предоставить -совместимую оболочку для EJC. Ближайшая отправная точка для такой реализации, вероятно,VanillaJavaBuilder, который предназначен для OpenJDK javac без какого-либо инвазивного использования API в обычном buildjar реализация.

Компилятор Eclipse Java доступен в виде набора инструментов для Bazel.

https://github.com/salesforce/bazel-jdt-java-toolchain

Это превращает ECJ в строителя для «Базэла». Есть несколько ограничений. Например, он еще не поддерживает Error Prone. Однако обработка аннотаций работает.

Мы заметили, что ECJ имеет некоторое преимущество в нашей большой базе кода с точки зрения производительности и потребления ресурсов.

Другие вопросы по тегам