From 8c41633a8700cbadd2ef219879cba305b576070e Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 5 Apr 2017 16:02:11 +0000 Subject: Genrules only depend on the host JDK if they have Java make variables. e.g.: cmd = "$(JAVA) foo.java ..." PiperOrigin-RevId: 152263822 --- .../lib/bazel/rules/genrule/BazelGenRuleRule.java | 3 +-- .../com/google/devtools/build/lib/rules/genrule/BUILD | 1 + .../devtools/build/lib/rules/genrule/GenRuleBase.java | 2 +- .../build/lib/rules/genrule/GenRuleBaseRule.java | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BazelGenRuleRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BazelGenRuleRule.java index ccc2c6c042..1d843da2cd 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BazelGenRuleRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BazelGenRuleRule.java @@ -24,7 +24,6 @@ import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.genrule.GenRuleBaseRule; import com.google.devtools.build.lib.rules.java.JavaConfiguration; -import com.google.devtools.build.lib.rules.java.JavaSemantics; /** * Rule definition for genrule for Bazel. @@ -52,7 +51,7 @@ public final class BazelGenRuleRule implements RuleDefinition { .add(attr("stamp", BOOLEAN).value(false)) .add(attr(":cc_toolchain", LABEL).value(GenRuleBaseRule.CC_TOOLCHAIN)) - .add(attr(":host_jdk", LABEL).cfg(HOST).value(JavaSemantics.HOST_JDK)) + .add(attr(":host_jdk", LABEL).cfg(HOST).value(GenRuleBaseRule.HOST_JDK)) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/BUILD b/src/main/java/com/google/devtools/build/lib/rules/genrule/BUILD index 5c97ae1988..81ab46717a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genrule/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/BUILD @@ -12,6 +12,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:build-base", "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:java-compilation", + "//src/main/java/com/google/devtools/build/lib:java-implicit-attributes", "//src/main/java/com/google/devtools/build/lib:packages", "//src/main/java/com/google/devtools/build/lib:vfs", "//src/main/java/com/google/devtools/build/lib/actions", diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java index 407a45cb3d..1aab9b1648 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java @@ -64,7 +64,7 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory { return CROSSTOOL_MAKE_VARIABLE.matcher(command).find(); } - protected boolean requiresJdk(String command) { + protected static boolean requiresJdk(String command) { return JDK_MAKE_VARIABLE.matcher(command).find(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java index 544a03df21..d4cb75844f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java @@ -37,6 +37,9 @@ import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; import com.google.devtools.build.lib.rules.MakeVariableProvider; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.cpp.CppRuleClasses; +import com.google.devtools.build.lib.rules.java.JavaImplicitAttributes; +import com.google.devtools.build.lib.rules.java.JavaSemantics; +import com.google.devtools.build.lib.rules.java.Jvm; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileTypeSet; @@ -63,6 +66,22 @@ public class GenRuleBaseRule implements RuleDefinition { } }; + /** + * Late-bound dependency on the host JDK iff the genrule has make variables that need + * that rule. + */ + public static final Attribute.LateBoundLabel HOST_JDK = + new Attribute.LateBoundLabel( + JavaImplicitAttributes.JDK_LABEL, Jvm.class) { + @Override + public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) { + return attributes != null + && GenRuleBase.requiresJdk(attributes.get("cmd", Type.STRING)) + ? JavaSemantics.HOST_JDK.resolve(rule, attributes, configuration) + : null; + } + }; + @Override public RuleClass build( RuleClass.Builder builder, RuleDefinitionEnvironment env) { -- cgit v1.2.3