Enable using custom java home for rbe_autoconfig (#267) * allow overriding java home with attr * enable setting java_home from env var * fix build issue * fix docs * fail if JAVA_HOME is empty * refactor java_home resolution and fix for env var case * disable versbose * modify sample .bazelrc file * buildify * addressing review comments * addressing review comments
diff --git a/examples/remotebuildexecution/rbe_system_check/.bazelrc.sample b/examples/remotebuildexecution/rbe_system_check/.bazelrc.sample index 02e10ed..bea5525 100644 --- a/examples/remotebuildexecution/rbe_system_check/.bazelrc.sample +++ b/examples/remotebuildexecution/rbe_system_check/.bazelrc.sample
@@ -31,8 +31,8 @@ # Toolchain/platform flags that work with rbe_autoconfig rule. # Note target name must be set to "rbe_default" to use these flags as is. build:remote --crosstool_top=@rbe_default//rbe_config_cc:toolchain -build:remote --host_javabase=@rbe_default//config:jdk8 -build:remote --javabase=@rbe_default//config:jdk8 +build:remote --host_javabase=@rbe_default//config:jdk +build:remote --javabase=@rbe_default//config:jdk build:remote --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 build:remote --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 build:remote --extra_execution_platforms=@rbe_default//config:platform
diff --git a/rules/BUILD.platform.tpl b/rules/BUILD.platform.tpl index 7daa34c..aa12bb0 100644 --- a/rules/BUILD.platform.tpl +++ b/rules/BUILD.platform.tpl
@@ -24,15 +24,9 @@ ) java_runtime( - name = "jdk8", + name = "jdk", srcs = [], - java_home = "/usr/lib/jvm/java-8-openjdk-amd64", -) - -java_runtime( - name = "jdk10", - srcs = [], - java_home = "/usr/lib/jvm/zulu" + JDK_VERSION + "-linux_x64-allmodules", + java_home = "%{java_home}", ) toolchain(
diff --git a/rules/get_java_home.sh.tpl b/rules/get_java_home.sh.tpl new file mode 100644 index 0000000..7cd2593 --- /dev/null +++ b/rules/get_java_home.sh.tpl
@@ -0,0 +1,23 @@ +#!/bin/bash +# +# Copyright 2017 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -ex + +# This is a generated file that gets the value of the JAVA_HOME env +# var in a docker image. + +echo $(docker inspect -f '{{range $i, $v := .Config.Env}}{{println $v}}{{end}}' %{image_name} | grep JAVA_HOME | cut -d'=' -f2) +
diff --git a/rules/rbe_repo.bzl b/rules/rbe_repo.bzl index 750b128..cbfb8a8 100644 --- a/rules/rbe_repo.bzl +++ b/rules/rbe_repo.bzl
@@ -97,8 +97,8 @@ bazel build ... \ --crosstool_top=//rbe-configs/bazel_{bazel_version}:toolchain \ - --host_javabase=//rbe-configs/bazel_{bazel_version}/config:jdk8 \ - --javabase=//rbe-configs/bazel_{bazel_version}/config:jdk8 \ + --host_javabase=//rbe-configs/bazel_{bazel_version}/config:jdk \ + --javabase=//rbe-configs/bazel_{bazel_version}/config:jdk \ --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \ --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \ --extra_execution_platforms=/rbe-configs/bazel_{bazel_version}/config:platform \ @@ -120,8 +120,8 @@ bazel build ... \ --crosstool_top=@rbe_default//rbe_config_cc:toolchain \ - --host_javabase=@rbe_default//config:jdk8 \ - --javabase=@rbe_default//config:jdk8 \ + --host_javabase=@rbe_default//config:jdk \ + --javabase=@rbe_default//config:jdk \ --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \ --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8 \ --extra_execution_platforms=@rbe_default//config:platform \ @@ -198,7 +198,7 @@ "@bazel_tools//platforms:linux", "@bazel_tools//platforms:x86_64", ] -_VERBOSE = False +_VERBOSE = True def _impl(ctx): """Core implementation of _rbe_autoconfig repository rule.""" @@ -241,6 +241,10 @@ bazel_version = ctx.attr.bazel_version bazel_rc_version = ctx.attr.bazel_rc_version + # Get the value of JAVA_HOME to set in the produced + # java_runtime + java_home = _get_java_home(ctx, image_name) + # run the container and extract the autoconf directory _run_and_extract( ctx, @@ -258,6 +262,7 @@ ctx, bazel_version = bazel_version, image_name = image_name, + java_home = java_home, name = name, ) @@ -299,6 +304,32 @@ _print_exec_results("pull image", result, fail_on_error = True) print("Image pulled.") +# Gets the value of java_home either from attr or +# by running docker run image_name printenv JAVA_HOME. +def _get_java_home(ctx, image_name): + if ctx.attr.java_home: + return ctx.attr.java_home + + # Create the template to run + template = ctx.path(Label("@bazel_toolchains//rules:get_java_home.sh.tpl")) + ctx.template( + "get_java_home.sh", + template, + { + "%{image_name}": image_name, + }, + True, + ) + + # run get_java_home.sh + result = ctx.execute(["./get_java_home.sh"]) + _print_exec_results("get java_home", result, fail_on_error = True) + java_home = result.stdout.splitlines()[0] + if java_home == "": + fail("Could not find JAVA_HOME in the container and one was not " + + "passed to rbe_autoconfig rule.") + return java_home + # Creates file "container/run_in_container.sh" which can be mounted onto container # to run the commands to install bazel, run it and create the output tar def _create_docker_cmd( @@ -450,6 +481,7 @@ ctx, bazel_version, image_name, + java_home, name): toolchain_target = "@" + name + "//" + _RBE_CONFIG_DIR if ctx.attr.output_base: @@ -469,6 +501,7 @@ { "%{exec_compatible_with}": exec_compatible_with, "%{image_name}": image_name, + "%{java_home}": java_home, "%{target_compatible_with}": target_compatible_with, "%{toolchain}": toolchain_target, }, @@ -537,6 +570,13 @@ doc = ("If set to False the flag --all_incompatible_changes will " + "be used when generating the toolchain configs."), ), + "java_home": attr.string( + doc = ("Optional. The location of java_home in the container. " + + "For example, '/usr/lib/jvm/java-8-openjdk-amd64'. If " + + "not set, the rule will attempt to read the JAVA_HOME env " + + "var from the container. If that is not set the rule will " + + "fail."), + ), "output_base": attr.string( doc = ("Optional. The directory (under the project root) where the " + "produced toolchain configs will be copied to."), @@ -599,8 +639,9 @@ bazel_rc = None, config_dir = None, digest = None, - env = clang_env(), + env = None, exec_compatible_with = None, + java_home = None, output_base = None, revision = None, registry = None, @@ -626,6 +667,10 @@ digest: Optional. The digest of the image to pull. Should only be set if a custom container is required. Must be set together with registry and repository. + java_home: Optional. The location of java_home in the container. For + example , '/usr/lib/jvm/java-8-openjdk-amd64'. If not set, the rule + will attempt to read the JAVA_HOME env var from the container. + If that is not set the rule will fail. output_base: Optional. The directory (under the project root) where the produced toolchain configs will be copied to. config_dir: Optional. Subdirectory where configs will be copied to. @@ -665,6 +710,8 @@ if not revision or revision == "latest": revision = RBE_UBUNTU16_04_LATEST digest = public_rbe_ubuntu16_04_sha256s().get(revision, None) + if not env: + env = clang_env() if not digest: fail(("Could not find a valid digest for revision %s, " + "please make sure it is declared in " + @@ -677,6 +724,7 @@ digest = digest, env = env, exec_compatible_with = exec_compatible_with, + java_home = java_home, output_base = output_base, registry = registry, repository = repository,