aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar elenairina <elenairina@google.com>2017-07-11 16:51:56 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-07-11 18:26:17 +0200
commitec9027911dda9074c27b2889b0dbb0db68d856bf (patch)
tree41485df52c7e55d81738e23e5ba880a725b0e639
parent64a6c153fe3650d1c28b5f5b44dd41032f0c28cc (diff)
Expose current java_toolchain target to Skylark.
This value can be passed in Skylark to java_common.compile#java_toolchain in order to avoid incompatibility issues when the value of --java_toolchain uses a different Java version. PiperOrigin-RevId: 161528114
-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(