aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java12
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java81
2 files changed, 93 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
index 4d3359161c..75ad63bde0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
@@ -444,6 +444,18 @@ public class JavaSkylarkCommon {
.build();
}
+ @SkylarkCallable(
+ name = "java_toolchain_attr",
+ doc = "Creates a dependency on the current Java toolchain. Should only be used in the "
+ + "attribute dictionary of a rule definition.",
+ structField = true
+ )
+ public SkylarkAttr.Descriptor getJavaToolchainAttribute() {
+ return new SkylarkAttr.Descriptor(
+ "java_toolchain_attr",
+ new Attribute.Builder<>("", BuildType.LABEL).value(JavaSemantics.JAVA_TOOLCHAIN));
+ }
+
private static StrictDepsMode getStrictDepsMode(String strictDepsMode) {
switch (strictDepsMode) {
case "OFF":
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index b16dd4e24e..a9b7685c74 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -637,6 +637,87 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
assertThat(((String) skylarkClassObject.getValue("strict_java_deps"))).isEqualTo("error");
}
+ @Test
+ public void javaToolchainFlag_default() throws Exception {
+ writeBuildFileForJavaToolchain();
+ scratch.file(
+ "foo/rule.bzl",
+ "result = provider()",
+ "def _impl(ctx):",
+ " return [result(java_toolchain_label=ctx.attr._java_toolchain.label)]",
+ "myrule = rule(",
+ " implementation=_impl,",
+ " fragments = ['java'],",
+ " attrs = { '_java_toolchain': java_common.java_toolchain_attr }",
+ ")"
+ );
+ scratch.file(
+ "foo/BUILD",
+ "load(':rule.bzl', 'myrule')",
+ "myrule(name='myrule')"
+ );
+ ConfiguredTarget configuredTarget = getConfiguredTarget("//foo:myrule");
+ SkylarkClassObject skylarkClassObject =
+ configuredTarget.get(new SkylarkKey(Label.parseAbsolute("//foo:rule.bzl"), "result"));
+ Label javaToolchainLabel = ((Label) skylarkClassObject.getValue("java_toolchain_label"));
+ assertThat(javaToolchainLabel.toString()).endsWith("jdk:toolchain");
+ }
+
+ @Test
+ public void javaToolchainFlag_set() throws Exception {
+ writeBuildFileForJavaToolchain();
+ scratch.file(
+ "foo/rule.bzl",
+ "result = provider()",
+ "def _impl(ctx):",
+ " return [result(java_toolchain_label=ctx.attr._java_toolchain.label)]",
+ "myrule = rule(",
+ " implementation=_impl,",
+ " fragments = ['java'],",
+ " attrs = { '_java_toolchain': java_common.java_toolchain_attr }",
+ ")"
+ );
+ scratch.file(
+ "foo/BUILD",
+ "load(':rule.bzl', 'myrule')",
+ "myrule(name='myrule')"
+ );
+ useConfiguration("--java_toolchain=//java/com/google/test:toolchain");
+ ConfiguredTarget configuredTarget = getConfiguredTarget("//foo:myrule");
+ SkylarkClassObject skylarkClassObject =
+ configuredTarget.get(new SkylarkKey(Label.parseAbsolute("//foo:rule.bzl"), "result"));
+ Label javaToolchainLabel = ((Label) skylarkClassObject.getValue("java_toolchain_label"));
+ assertThat(javaToolchainLabel.toString()).isEqualTo("//java/com/google/test:toolchain");
+ }
+
+ private void writeBuildFileForJavaToolchain() throws Exception {
+ scratch.file("java/com/google/test/turbine_canary_deploy.jar");
+ scratch.file("java/com/google/test/tzdata.jar");
+ scratch.overwriteFile(
+ "java/com/google/test/BUILD",
+ "java_toolchain(name = 'toolchain',",
+ " source_version = '6',",
+ " target_version = '6',",
+ " bootclasspath = ['rt.jar'],",
+ " extclasspath = ['ext/lib.jar'],",
+ " encoding = 'ISO-8859-1',",
+ " xlint = [ 'toto' ],",
+ " misc = [ '-Xmaxerrs 500' ],",
+ " compatible_javacopts = {",
+ " 'appengine': [ '-XDappengineCompatible' ],",
+ " 'android': [ '-XDandroidCompatible' ],",
+ " },",
+ " javac = [':javac_canary.jar'],",
+ " javabuilder = [':JavaBuilderCanary_deploy.jar'],",
+ " header_compiler = [':turbine_canary_deploy.jar'],",
+ " singlejar = ['SingleJar_deploy.jar'],",
+ " ijar = ['ijar'],",
+ " genclass = ['GenClass_deploy.jar'],",
+ " timezone_data = 'tzdata.jar',",
+ ")"
+ );
+ }
+
private static boolean javaCompilationArgsHaveTheSameParent(
JavaCompilationArgs args, JavaCompilationArgs otherArgs) {
if (!nestedSetsOfArtifactHaveTheSameParent(