Add support for toolchain java 14
Closes #11017.
Test Plan:
1. Create java_tools from this commit:
```bash
$ bazel build src:java_tools_java14.zip
```
2. Switch to using the java_tools from the above step in WORKSPACE file:
```python
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "remote_java_tools_linux",
urls = [
"file:///<path to the java_tools_java14.zip>",
],
)
```
3. Add Zulu OpenJDK14 to use as javabase in WORKSPACE file:
```python
http_archive(
name = "openjdk14_linux_archive",
build_file_content = """
java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])
exports_files(["WORKSPACE"], visibility = ["//visibility:public"])
""",
sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
urls = ["https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz"],
)
```
4. Activate custom java toolchain and javabase in .bazelrc file:
```bash
build --java_toolchain=@remote_java_tools_linux//:toolchain_jdk_14
build --host_java_toolchain=@remote_java_tools_linux//:toolchain_jdk_14
build --javabase=@openjdk14_linux_archive//:runtime
build --host_javabase=@openjdk14_linux_archive//:runtime
```
5. Create Java 14 example class file:
```java
public class Javac14Example {
record Point(int x, int y) {}
public static void main(String[] args) {
Point point = new Point(0, 1);
System.out.println(point.x);
}
}
```
6. Add Bazel file to build Java 14 syntax class with activated preview
features:
```python
java_binary(
name = "Javac14Example",
srcs = ["Javac14Example.java"],
javacopts = ["--enable-preview"],
jvm_flags = ["--enable-preview"],
main_class = "Javac14Example",
)
```
7. Test that it works as expected:
```
$ bazel run java:Javac14Example
INFO: Analyzed target //java:Javac14Example (1 packages loaded, 2 targets configured).
INFO: Found 1 target...
INFO: From Building java/Javac14Example.jar (1 source file):
Note: java/Javac14Example.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
Target //java:Javac14Example up-to-date:
bazel-bin/java/Javac14Example.jar
bazel-bin/java/Javac14Example
INFO: Elapsed time: 1.502s, Critical Path: 1.30s
INFO: 1 process: 1 worker.
INFO: Build completed successfully, 2 total actions
INFO: Build completed successfully, 2 total actions
0
```
Closes #11514.
PiperOrigin-RevId: 322759522
diff --git a/src/BUILD b/src/BUILD
index 2b9f3cc..204dc18 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -567,15 +567,17 @@
"//conditions:default": [],
})
-JAVA_VERSIONS = ("11",)
+JAVA_VERSIONS = ("11", "14")
+
+# TODO(davido): Hard code the javac 11 for now; it is required for default toolchain.
[
genrule(
name = "jars_java_tools_java" + java_version + "_zip",
srcs = JAVA_TOOLS_DEPLOY_JARS + [
- "@java_tools_langtools_javac" + java_version + "//:jdk_compiler_jar",
- "@java_tools_langtools_javac" + java_version + "//:java_compiler_jar",
- "@java_tools_langtools_javac" + java_version + "//:javac_jar",
+ "@java_tools_langtools_javac11//:jdk_compiler_jar",
+ "@java_tools_langtools_javac11//:java_compiler_jar",
+ "@java_tools_langtools_javac11//:javac_jar",
],
outs = ["jars_java_tools_java" + java_version + ".zip"],
cmd = "zip -qjX $@ $$(echo $(SRCS) | sort)",
@@ -598,7 +600,7 @@
"//third_party/ijar:transitive_sources",
"//third_party/java/jacoco:transitive_sources",
"//third_party/java/proguard:srcs",
- "@java_tools_langtools_javac" + java_version + "//:srcs",
+ "@java_tools_langtools_javac11//:srcs",
],
outs = ["java_tools_dist_javac" + java_version + ".zip"],
cmd = "zip -qXr $@ $$(echo $(SRCS) | sort)",
@@ -638,8 +640,10 @@
[
# The java_tools releases can have BUILD files that vary depending on the
# javac version they embed. Currently the only difference is in the
- # java_toolchain source version which has to be 12 for javac 12 to be able
- # to build new Java 12 features.
+ # java_toolchain source version which has to be 14 for javac 14 to be able
+ # to build new Java 14 features. This is not used atm, as the toolchain for
+ # javac 14 was duplicated, but it might be used in future Bazel releases to
+ # support new javac release, so that we preserve this step for now.
genrule(
name = "create_java_tools_build_java" + java_version,
srcs = ["//tools/jdk:BUILD.java_tools"],
@@ -744,6 +748,9 @@
"@openjdk11_darwin_archive//:WORKSPACE",
"@openjdk11_linux_archive//:WORKSPACE",
"@openjdk11_windows_archive//:WORKSPACE",
+ "@openjdk14_darwin_archive//:WORKSPACE",
+ "@openjdk14_linux_archive//:WORKSPACE",
+ "@openjdk14_windows_archive//:WORKSPACE",
"@openjdk_linux_aarch64_minimal//file",
"@openjdk_linux_minimal//file",
"@openjdk_macos_minimal//file",
@@ -760,6 +767,9 @@
"@remotejdk11_linux_ppc64le_for_testing//:WORKSPACE",
"@remotejdk11_macos_for_testing//:WORKSPACE",
"@remotejdk11_win_for_testing//:WORKSPACE",
+ "@remotejdk14_linux_for_testing//:WORKSPACE",
+ "@remotejdk14_macos_for_testing//:WORKSPACE",
+ "@remotejdk14_win_for_testing//:WORKSPACE",
"@rules_cc//:WORKSPACE",
"@rules_java//:WORKSPACE",
"@rules_pkg//:WORKSPACE",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE
index 91823eb..c62cf98 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE
@@ -157,6 +157,38 @@
# This must be kept in sync with the top-level WORKSPACE file.
maybe(
http_archive,
+ name = "remotejdk14_linux",
+ build_file = "@local_jdk//:BUILD.bazel",
+ sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
+ strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
+ urls = [
+ "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz",
+ ],
+)
+
+# This must be kept in sync with the top-level WORKSPACE file.
+maybe(
+ http_archive,
+ name = "remotejdk14_macos",
+ build_file = "@local_jdk//:BUILD.bazel",
+ sha256 = "088bd4d0890acc9f032b738283bf0f26b2a55c50b02d1c8a12c451d8ddf080dd",
+ strip_prefix = "zulu14.28.21-ca-jdk14.0.1-macosx_x64",
+ urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
+)
+
+# This must be kept in sync with the top-level WORKSPACE file.
+maybe(
+ http_archive,
+ name = "remotejdk14_win",
+ build_file = "@local_jdk//:BUILD.bazel",
+ sha256 = "9cb078b5026a900d61239c866161f0d9558ec759aa15c5b4c7e905370e868284",
+ strip_prefix = "zulu14.28.21-ca-jdk14.0.1-win_x64",
+ urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-win_x64.zip"],
+)
+
+# This must be kept in sync with the top-level WORKSPACE file.
+maybe(
+ http_archive,
name = "remote_java_tools_linux",
sha256 = "0be37f4227590ecb6bc929a6a7e427c65e6239363e4c3b28b1a211718b9636c9",
urls = [
diff --git a/src/test/py/bazel/test_base.py b/src/test/py/bazel/test_base.py
index 1909afe..baf7303 100644
--- a/src/test/py/bazel/test_base.py
+++ b/src/test/py/bazel/test_base.py
@@ -61,6 +61,9 @@
'remotejdk11_linux_ppc64le_for_testing',
'remotejdk11_macos_for_testing',
'remotejdk11_win_for_testing',
+ 'remotejdk14_linux_for_testing',
+ 'remotejdk14_macos_for_testing',
+ 'remotejdk14_win_for_testing',
'remote_java_tools_darwin_for_testing',
'remote_java_tools_linux_for_testing',
'remote_java_tools_windows_for_testing',
diff --git a/src/test/shell/bazel/BUILD b/src/test/shell/bazel/BUILD
index 26feef3..e81f8ba 100644
--- a/src/test/shell/bazel/BUILD
+++ b/src/test/shell/bazel/BUILD
@@ -179,6 +179,30 @@
)
sh_test(
+ name = "bazel_java14_test",
+ srcs = ["bazel_java14_test.sh"],
+ args = [
+ # --java_toolchain and --host_java_toolchain values
+ "@local_java_tools//:toolchain_jdk_14",
+ # java_tools zip to test
+ "src/java_tools_java14.zip",
+ ] + select({
+ # --javabase and --host_javabase values
+ "//src/conditions:darwin": ["@openjdk14_darwin_archive//:runtime"],
+ "//src/conditions:darwin_x86_64": ["@openjdk14_darwin_archive//:runtime"],
+ "//src/conditions:windows": ["@openjdk14_windows_archive//:runtime"],
+ "//src/conditions:linux_x86_64": ["@openjdk14_linux_archive//:runtime"],
+ }),
+ data = [
+ ":test-deps",
+ "//src:java_tools_java14_zip",
+ "//src/test/shell/bazel/testdata:jdk_http_archives_filegroup",
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+ tags = ["local"],
+)
+
+sh_test(
name = "bazel_java_test",
# TODO(iirina): Investigate if the 'large' and 'eternal' values still apply.
size = "large",
@@ -196,7 +220,10 @@
exec_compatible_with = ["//:highcpu_machine"],
)
-JAVA_VERSIONS = ("11",)
+JAVA_VERSIONS = ("11", "14")
+
+# TODO(davido): Remove this once remote_java_tools_javac14 is released
+JAVA_TOOLS_VERSIONS = ("11",)
[
sh_test(
@@ -467,7 +494,7 @@
"no_windows",
],
)
- for java_version in JAVA_VERSIONS
+ for java_version in JAVA_TOOLS_VERSIONS
]
# Test java coverage with the java_toolchain in the java_tools zip built at head.
diff --git a/src/test/shell/bazel/bazel_java14_test.sh b/src/test/shell/bazel/bazel_java14_test.sh
new file mode 100755
index 0000000..ed82037
--- /dev/null
+++ b/src/test/shell/bazel/bazel_java14_test.sh
@@ -0,0 +1,116 @@
+#!/bin/bash
+#
+# Copyright 2020 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.
+#
+# Tests that bazel runs projects with Java 14 features.
+
+# --- begin runfiles.bash initialization ---
+if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
+ if [[ -f "$0.runfiles_manifest" ]]; then
+ export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
+ elif [[ -f "$0.runfiles/MANIFEST" ]]; then
+ export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
+ elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+ export RUNFILES_DIR="$0.runfiles"
+ fi
+fi
+if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+ source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
+elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
+ source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
+ "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
+else
+ echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
+ exit 1
+fi
+# --- end runfiles.bash initialization ---
+
+source "$(rlocation "io_bazel/src/test/shell/integration_test_setup.sh")" \
+ || { echo "integration_test_setup.sh not found!" >&2; exit 1; }
+
+case "$(uname -s | tr [:upper:] [:lower:])" in
+msys*|mingw*|cygwin*)
+ declare -r is_windows=true
+ ;;
+*)
+ declare -r is_windows=false
+ ;;
+esac
+
+if "$is_windows"; then
+ export MSYS_NO_PATHCONV=1
+ export MSYS2_ARG_CONV_EXCL="*"
+fi
+
+JAVA_TOOLCHAIN="$1"; shift
+JAVA_TOOLS_ZIP="$1"; shift
+JAVA_RUNTIME="$1"; shift
+
+echo "JAVA_TOOLS_ZIP=$JAVA_TOOLS_ZIP"
+
+
+JAVA_TOOLS_RLOCATION=$(rlocation io_bazel/$JAVA_TOOLS_ZIP)
+
+if "$is_windows"; then
+ JAVA_TOOLS_ZIP_FILE_URL="file:///${JAVA_TOOLS_RLOCATION}"
+else
+ JAVA_TOOLS_ZIP_FILE_URL="file://${JAVA_TOOLS_RLOCATION}"
+fi
+JAVA_TOOLS_ZIP_FILE_URL=${JAVA_TOOLS_ZIP_FILE_URL:-}
+
+add_to_bazelrc "build --java_toolchain=${JAVA_TOOLCHAIN}"
+add_to_bazelrc "build --host_java_toolchain=${JAVA_TOOLCHAIN}"
+add_to_bazelrc "build --javabase=${JAVA_RUNTIME}"
+add_to_bazelrc "build --host_javabase=${JAVA_RUNTIME}"
+
+function set_up() {
+ cat >>WORKSPACE <<EOF
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+# java_tools versions only used to test Bazel with various JDK toolchains.
+
+http_archive(
+ name = "local_java_tools",
+ urls = ["${JAVA_TOOLS_ZIP_FILE_URL}"]
+)
+EOF
+ cat $(rlocation io_bazel/src/test/shell/bazel/testdata/jdk_http_archives) >> WORKSPACE
+}
+
+function test_java14_record_type() {
+ mkdir -p java/main
+ cat >java/main/BUILD <<EOF
+java_binary(
+ name = 'Javac14Example',
+ srcs = ['Javac14Example.java'],
+ main_class = 'Javac14Example',
+ javacopts = ["--enable-preview"],
+ jvm_flags = ["--enable-preview"],
+)
+EOF
+
+ cat >java/main/Javac14Example.java <<EOF
+public class Javac14Example {
+ record Point(int x, int y) {}
+ public static void main(String[] args) {
+ Point point = new Point(0, 1);
+ System.out.println(point.x);
+ }
+}
+EOF
+ bazel run java/main:Javac14Example --test_output=all --verbose_failures &>"${TEST_log}"
+ expect_log "0"
+}
+
+run_suite "Tests new Java 14 language features"
diff --git a/src/test/shell/bazel/testdata/jdk_http_archives b/src/test/shell/bazel/testdata/jdk_http_archives
index 4a24878..1618193 100644
--- a/src/test/shell/bazel/testdata/jdk_http_archives
+++ b/src/test/shell/bazel/testdata/jdk_http_archives
@@ -49,3 +49,29 @@
strip_prefix = "zulu11.37.17-ca-jdk11.0.6-win_x64",
urls = ["https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-win_x64.zip"],
)
+
+#################################### JDK 14 ####################################
+# This must be kept in sync with the top-level WORKSPACE file.
+http_archive(
+ name = "openjdk14_linux_archive",
+ build_file_content = "java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])",
+ sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
+ strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
+ urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz"],
+)
+# This must be kept in sync with the top-level WORKSPACE file.
+http_archive(
+ name = "openjdk14_darwin_archive",
+ build_file_content = "java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])",
+ sha256 = "088bd4d0890acc9f032b738283bf0f26b2a55c50b02d1c8a12c451d8ddf080dd",
+ strip_prefix = "zulu14.28.21-ca-jdk14.0.1-macosx_x64",
+ urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
+)
+# This must be kept in sync with the top-level WORKSPACE file.
+http_archive(
+ name = "openjdk14_windows_archive",
+ build_file_content = "java_runtime(name = 'runtime', srcs = glob(['**']), visibility = ['//visibility:public'])",
+ sha256 = "9cb078b5026a900d61239c866161f0d9558ec759aa15c5b4c7e905370e868284",
+ strip_prefix = "zulu14.28.21-ca-jdk14.0.1-win_x64",
+ urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-win_x64.zip"],
+)
diff --git a/src/test/shell/testenv.sh b/src/test/shell/testenv.sh
index 248baf5..a1cbb9d 100755
--- a/src/test/shell/testenv.sh
+++ b/src/test/shell/testenv.sh
@@ -280,6 +280,9 @@
"openjdk11_darwin_archive"
"openjdk11_linux_archive"
"openjdk11_windows_archive"
+ "openjdk14_darwin_archive"
+ "openjdk14_linux_archive"
+ "openjdk14_windows_archive"
"openjdk_linux_aarch64_minimal"
"openjdk_linux_minimal"
"openjdk_macos_minimal"
@@ -296,6 +299,9 @@
"remotejdk11_linux_ppc64le_for_testing"
"remotejdk11_macos_for_testing"
"remotejdk11_win_for_testing"
+ "remotejdk14_linux_for_testing"
+ "remotejdk14_macos_for_testing"
+ "remotejdk14_win_for_testing"
"rules_cc"
"rules_java"
"rules_pkg"
diff --git a/src/upload_all_java_tools.sh b/src/upload_all_java_tools.sh
index e96fd01..3c79696 100755
--- a/src/upload_all_java_tools.sh
+++ b/src/upload_all_java_tools.sh
@@ -48,7 +48,7 @@
# Passing the same commit_hash and timestamp to all targets to mark all the artifacts
# uploaded on GCS with the same identifier.
-for java_version in 11; do
+for java_version in 11 14; do
bazel build //src:java_tools_java${java_version}_zip
zip_path=${PWD}/bazel-bin/src/java_tools_java${java_version}.zip