gerrit/tools
David Ostrovsky f55b69f5c9 Bazel: Add support for Java 10
Bazel@HEAD doesn't support Java 10 any more. The tool chain is extended
to support building with Java 10 using host_javabase option and vanilla
java builder. To use --host_javabase option we have to provide absolute
path to the JDK 10. To keep that non-portable part out of the build file
we use variable that is substitued during build invocation. Say, the
location of the JDK 10 is: /usr/lib64/jvm/java-10, then the build is
invoked with:

  $ bazel build --host_javabase=:absolute_javabase \
    --define=ABSOLUTE_JAVABASE=/usr/lib64/jvm/java-10 ...

Given that absolute_javabase rule is not a part of released Bazel yet,
but will be only included in future Bazel releases, we have to add it in
our own build file:

  java_runtime(
      name = "absolute_javabase",
      java_home = "$(ABSOLUTE_JAVABASE)",
      visibility = ["//visibility:public"],
  )

While this works, it fails the Gerrit-CI, because recently it was
changed to exercise //... rule, and cannot resolve ABSOLUTE_JAVABASE
variable, because it wasn't provided in the CI environment. CI is still
using Java 8.

One approach to address that problem would be to use "manual" tag for a
rule that would exclude it from generic targets like //..., but
unfortunately, java_runtime rule doesn't expose tag attribute.

The next workaround is to hide that variable behind a select statement.
This is a harmless hack:

  config_setting(
      name = "use_absolute_javabase",
      values = {"define": "USE_ABSOLUTE_JAVABASE=true"},
  )

  java_runtime(
      name = "absolute_javabase",
      java_home = select({
          ":use_absolute_javabase": "$(ABSOLUTE_JAVABASE)",
          "//conditions:default": "",
      }),
      visibility = ["//visibility:public"],
  )

Now from the CI the rule: //:absolute_javabase would produce non working
java_runtime, because java_home wasn't specified, but given that this
java_runtime is not used during the build, it doesn't matter. Add also
a TODO comment to replace that interim solution when absolute_javabase
is supported in released Bazel version. As the consequence for hiding
that rule behind a condition, we need to provide additional variable so
that Bazel can correctly resolve java_home in java_runtime rule:

  $ bazel build --host_javabase=:absolute_javabase \
    --define=ABSOLUTE_JAVABASE=/usr/lib64/jvm/java-10 \
    --define=USE_ABSOLUTE_JAVABASE=true [...]

Also extend tools/eclipse/project.py to accept Java 10 specific options.
There is already --java <jdk number> option that was added recently to
support Eclipse .classpath generation when JDK 9 is used, but this can
not be used, because for Java 10 we have to provide absolute path to the
Java 10 location. Add new option --edge_java where all Java 10 specific
options can be passed:

  $ tools/eclipse/project.py --edge_java \
    "--host_javabase=:absolute_javabase \
    --define=ABSOLUTE_JAVABASE=/usr/lib64/jvm/java-10 \
    --define=USE_ABSOLUTE_JAVABASE=true \
    --host_java_toolchain=//:toolchain_vanilla \
    --java_toolchain=//:toolchain_vanilla"

Alternative approach would be to add those options to Bazel resource
file.

Test Plan:

  $ bazel build --host_javabase=:absolute_javabase \
    --define=ABSOLUTE_JAVABASE=/usr/lib64/jvm/java-10 \
    --define=USE_ABSOLUTE_JAVABASE=true \
    --host_java_toolchain=//:toolchain_vanilla \
    --java_toolchain=//:toolchain_vanilla \
    :release

and replace ABSOLUTE_JAVABASE variable with the location of JDK 10.

To verify that major version of generated classes is 54, use:

  $ $JAVA_HOME/bin/javap -verbose \
    -cp bazel-bin/java/com/google/gerrit/common/libserver.jar \
     com.google.gerrit.common.data.ProjectAccess | grep "major version"
  54

[1] https://github.com/bazelbuild/bazel/issues/6012
Change-Id: I5e652f7a19afbcf3607febd9a7a165dc07918bd0
2018-09-25 07:31:33 +00:00
..
bzl Bazel: Add support for Java 10 2018-09-25 07:31:33 +00:00
eclipse Bazel: Add support for Java 10 2018-09-25 07:31:33 +00:00
intellij Update documentation of code style settings for IntelliJ 2017-03-02 11:58:36 +01:00
js Replace vulcanize with bundle_assets build rule 2018-07-18 11:20:14 -07:00
maven Apply buildifier to .bzl files. 2018-07-10 20:38:52 +09:00
util Don't hardcode bash location 2015-08-26 09:03:24 -06:00
__init__.py Buck: Adjust to unflattened directory structure for python libraries 2013-11-30 20:19:33 +01:00
BUILD Merge branch 'stable-2.15' 2018-09-19 15:27:19 +09:00
coverage.sh Dissolve gerrit-common top-level directory 2017-10-31 11:02:36 -04:00
download_file.py Python cleanups, round 2: line too long, etc. 2018-05-19 22:48:43 +01:00
jgit-snapshot-deploy-pom.diff Provide a diff file to make it easier to deploy JGit snapshot 2016-08-31 11:13:47 +09:00
merge_jars.py Python cleanups, round 2: line too long, etc. 2018-05-19 22:48:43 +01:00
setup_gjf.sh setup_gjf.sh: amend SHA1 for GJF 1.6 2018-06-02 23:22:33 +00:00
util_test.py Python cleanups, round 2: line too long, etc. 2018-05-19 22:48:43 +01:00
util.py Python cleanups, round 2: line too long, etc. 2018-05-19 22:48:43 +01:00
version.py Python cleanups, round 1: whitespace 2018-05-19 22:47:19 +01:00
workspace-status.cmd Bazel: Add workspace-status-command script for other platform 2017-10-25 16:14:00 +00:00
workspace-status.sh Specify "unknown" if version generation for plugins fails. 2017-10-01 09:50:46 +01:00