Skip to content

Commit 3907126

Browse files
wiwaShane Delmore
and
Shane Delmore
authored
Use a public java_compile_toolchain attr instead of _java_toolchain (#1389)
* Use a public java_compile_toolchain common attr instead of _java_toolchain Co-authored-by: Shane Delmore <[email protected]> * Add _java_toolchain default for aspects * Remove missing test * use specified_java_compile_toolchain in scala_import.bzl; lint * assertTrue -> assertEquals Co-authored-by: Shane Delmore <[email protected]>
1 parent ddde9b3 commit 3907126

File tree

10 files changed

+132
-15
lines changed

10 files changed

+132
-15
lines changed

scala/private/common_attributes.bzl

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ common_attrs_for_plugin_bootstrapping = {
2828
"resources": attr.label_list(allow_files = True),
2929
"resource_strip_prefix": attr.string(),
3030
"resource_jars": attr.label_list(allow_files = True),
31+
"java_compile_toolchain": attr.label(
32+
default = Label("@bazel_tools//tools/jdk:current_java_toolchain"),
33+
providers = [java_common.JavaToolchainInfo],
34+
),
3135
"scalacopts": attr.string_list(),
3236
"javacopts": attr.string_list(),
3337
"scalac_jvm_flags": attr.string_list(),
@@ -89,9 +93,6 @@ implicit_deps = {
8993
default = Label("@bazel_tools//tools/zip:zipper"),
9094
allow_files = True,
9195
),
92-
"_java_toolchain": attr.label(
93-
default = Label("@bazel_tools//tools/jdk:current_java_toolchain"),
94-
),
9596
"_java_runtime": attr.label(
9697
default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
9798
),

scala/private/phases/phase_compile.bzl

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#
44
# DOCUMENT THIS
55
#
6-
load("@bazel_tools//tools/jdk:toolchain_utils.bzl", "find_java_toolchain")
76
load(
87
"@io_bazel_rules_scala//scala/private:paths.bzl",
98
_get_files_with_extension = "get_files_with_extension",
@@ -13,6 +12,7 @@ load(
1312
)
1413
load(
1514
"@io_bazel_rules_scala//scala/private:rule_impls.bzl",
15+
"specified_java_compile_toolchain",
1616
_compile_java = "compile_java",
1717
_compile_scala = "compile_scala",
1818
)
@@ -217,7 +217,7 @@ def _compile_or_empty(
217217
ctx.actions,
218218
jar = ctx.outputs.jar,
219219
target_label = ctx.label,
220-
java_toolchain = find_java_toolchain(ctx, ctx.attr._java_toolchain),
220+
java_toolchain = specified_java_compile_toolchain(ctx),
221221
)
222222
else:
223223
# macro code needs to be available at compile-time,
@@ -333,7 +333,7 @@ def _pack_source_jar(ctx, scala_srcs, input_srcjars):
333333
output_source_jar = output_source_jar,
334334
sources = scala_srcs,
335335
source_jars = input_srcjars,
336-
java_toolchain = find_java_toolchain(ctx, ctx.attr._java_toolchain),
336+
java_toolchain = specified_java_compile_toolchain(ctx),
337337
)
338338

339339
def _try_to_compile_java_jar(

scala/private/rule_impls.bzl

+15-2
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ def compile_scala(
141141
)
142142

143143
def compile_java(ctx, source_jars, source_files, output, extra_javac_opts, providers_of_dependencies):
144+
java_toolchain = specified_java_compile_toolchain(ctx)
145+
144146
return java_common.compile(
145147
ctx,
146148
source_jars = source_jars,
@@ -150,7 +152,7 @@ def compile_java(ctx, source_jars, source_files, output, extra_javac_opts, provi
150152
ctx,
151153
extra_javac_opts +
152154
java_common.default_javac_opts(
153-
java_toolchain = ctx.attr._java_toolchain[java_common.JavaToolchainInfo],
155+
java_toolchain = java_toolchain,
154156
),
155157
),
156158
deps = providers_of_dependencies,
@@ -159,13 +161,24 @@ def compile_java(ctx, source_jars, source_files, output, extra_javac_opts, provi
159161
#workaround until https://github.com/bazelbuild/bazel/issues/3528 is resolved
160162
exports = [],
161163
neverlink = getattr(ctx.attr, "neverlink", False),
162-
java_toolchain = find_java_toolchain(ctx, ctx.attr._java_toolchain),
164+
java_toolchain = java_toolchain,
163165
strict_deps = ctx.fragments.java.strict_java_deps,
164166
)
165167

166168
def runfiles_root(ctx):
167169
return "${TEST_SRCDIR}/%s" % ctx.workspace_name
168170

171+
def specified_java_compile_toolchain(ctx):
172+
# Aspects such as scrooge_java_aspect are not allowed public label attrs
173+
# And so will still use an implicit _java_toolchain
174+
java_compile_toolchain = getattr(
175+
ctx.attr,
176+
"java_compile_toolchain",
177+
getattr(ctx.attr, "_java_toolchain", None),
178+
)
179+
180+
return find_java_toolchain(ctx, java_compile_toolchain)
181+
169182
def specified_java_runtime(ctx, default_runtime = None):
170183
use_specified_java = "runtime_jdk" in dir(ctx.attr)
171184
if use_specified_java:

scala/scala_import.bzl

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
load("@io_bazel_rules_scala//scala:jars_to_labels.bzl", "JarsToLabelsInfo")
22
load("//scala/settings:stamp_settings.bzl", "StampScalaImport")
3+
load(
4+
"@io_bazel_rules_scala//scala/private:rule_impls.bzl",
5+
"specified_java_compile_toolchain",
6+
)
37

48
def _stamp_jar(ctx, jar):
59
stamped_jar_filename = "%s.stamp/%s" % (ctx.label.name, jar.basename)
@@ -9,7 +13,7 @@ def _stamp_jar(ctx, jar):
913
actions = ctx.actions,
1014
jar = symlink_file,
1115
target_label = ctx.label,
12-
java_toolchain = ctx.attr._java_toolchain[java_common.JavaToolchainInfo],
16+
java_toolchain = specified_java_compile_toolchain(ctx),
1317
)
1418

1519
# intellij part is tested manually, tread lightly when changing there
@@ -139,7 +143,7 @@ scala_import = rule(
139143
doc = "Adds Target-Label attribute to MANIFEST.MF for dep tracking",
140144
default = Label("@io_bazel_rules_scala//scala/settings:stamp_scala_import"),
141145
),
142-
"_java_toolchain": attr.label(
146+
"java_compile_toolchain": attr.label(
143147
default = Label("@bazel_tools//tools/jdk:current_java_toolchain"),
144148
),
145149
},

scala_proto/private/scala_proto_aspect.bzl

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
load("@rules_proto//proto:defs.bzl", "ProtoInfo")
22
load("//scala/private:common.bzl", "write_manifest_file")
33
load("//scala/private:dependency.bzl", "legacy_unclear_dependency_info_for_protobuf_scrooge")
4-
load("//scala/private:rule_impls.bzl", "compile_scala")
5-
load("//scala/private/toolchain_deps:toolchain_deps.bzl", "find_deps_info_on")
64
load(
7-
"@bazel_tools//tools/jdk:toolchain_utils.bzl",
8-
"find_java_toolchain",
5+
"//scala/private:rule_impls.bzl",
6+
"compile_scala",
7+
"specified_java_compile_toolchain",
98
)
9+
load("//scala/private/toolchain_deps:toolchain_deps.bzl", "find_deps_info_on")
1010
load(
1111
"@io_bazel_rules_scala//scala_proto/private:scala_proto_aspect_provider.bzl",
1212
"ScalaProtoAspectInfo",
@@ -51,7 +51,7 @@ def _pack_sources(ctx, src_jars):
5151
ctx.actions,
5252
source_jars = src_jars,
5353
output_source_jar = ctx.actions.declare_file(ctx.label.name + "_scalapb-src.jar"),
54-
java_toolchain = find_java_toolchain(ctx, ctx.attr._java_toolchain),
54+
java_toolchain = specified_java_compile_toolchain(ctx),
5555
)
5656

5757
def _generate_sources(ctx, toolchain, proto):

test/BUILD

+12
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,18 @@ scala_binary(
482482
runtime_jdk = "@bazel_tools//tools/jdk:remote_jdk11",
483483
)
484484

485+
# Make sure scala_library respects java_compile_toolchain during builds
486+
scala_junit_test(
487+
name = "CheckBytecodeMajorVersion",
488+
srcs = ["CheckBytecodeMajorVersionTest.scala"],
489+
suffixes = ["Test"],
490+
runtime_deps = [
491+
"//test/src/main/resources/java_sources:CompiledWithJava11",
492+
"//test/src/main/resources/java_sources:CompiledWithJava8",
493+
],
494+
deps = ["@io_bazel_rules_scala_junit_junit"],
495+
)
496+
485497
# Generate a file containing the rootpaths of a Scala binary.
486498
genrule(
487499
name = "rootpath-script",
+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package scalarules.test
2+
3+
import java.nio.file.Files
4+
import java.io.InputStream
5+
6+
import org.junit.Assert;
7+
import org.junit.Test;
8+
9+
class CheckBytecodeMajorVersionTest {
10+
11+
// https://stackoverflow.com/questions/27065/tool-to-read-and-display-java-class-versions
12+
def getBytecodeMajorVersion(classFileInput: InputStream): Int = {
13+
val eighthByte = classFileInput.readNBytes(8)(7)
14+
eighthByte.toInt
15+
}
16+
17+
// https://stackoverflow.com/questions/9170832/list-of-java-class-file-format-major-version-numbers
18+
val majorVersionToJdkVersion = Map(
19+
52 -> 8,
20+
55 -> 11
21+
)
22+
23+
@Test
24+
def someTest(): Unit = {
25+
26+
val expectJava8 = getBytecodeMajorVersion(
27+
getClass
28+
.getClassLoader
29+
.getResourceAsStream("java_sources/SimpleJavaSourceFileA.class")
30+
)
31+
32+
val expectJava11 = getBytecodeMajorVersion(
33+
getClass
34+
.getClassLoader
35+
.getResourceAsStream("java_sources/SimpleJavaSourceFileB.class")
36+
)
37+
38+
Assert.assertEquals(
39+
s"Expected Java 8 bytecode (major version 52) but got major version $expectJava8",
40+
8,
41+
majorVersionToJdkVersion(expectJava8)
42+
)
43+
44+
Assert.assertEquals(
45+
s"Expected Java 11 bytecode (major version 55) but got major version $expectJava11",
46+
11,
47+
majorVersionToJdkVersion(expectJava11)
48+
)
49+
}
50+
}
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
load("//scala:scala.bzl", "scala_library")
2+
3+
package(default_visibility = ["//visibility:public"])
4+
5+
scala_library(
6+
name = "CompiledWithJava8",
7+
srcs = ["SimpleJavaSourceFileA.java"],
8+
java_compile_toolchain = "@bazel_tools//tools/jdk:toolchain_java8",
9+
)
10+
11+
scala_library(
12+
name = "CompiledWithJava11",
13+
srcs = ["SimpleJavaSourceFileB.java"],
14+
java_compile_toolchain = "@bazel_tools//tools/jdk:toolchain_java11",
15+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package java_sources;
2+
3+
public class SimpleJavaSourceFileA {
4+
5+
public int someIntField;
6+
7+
public SimpleJavaSourceFileA() {
8+
this.someIntField = 0;
9+
}
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package java_sources;
2+
3+
public class SimpleJavaSourceFileB {
4+
5+
public int someIntField;
6+
7+
public SimpleJavaSourceFileB() {
8+
this.someIntField = 0;
9+
}
10+
11+
}

0 commit comments

Comments
 (0)