aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2017-02-03 16:42:22 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2017-02-06 19:35:39 +0000
commit1f42581891cc5f463edc94f8e96502f1b3aff033 (patch)
treeb6989376228fd4895661147ee69fffe7aadb7ae8 /src/main/java/com/google/devtools
parente77ad90fb6289a39d644ca4699976285922ff49d (diff)
Update GenRule to include the Cpp and Jdk toolchains and properly handle
expanded make variables. -- PiperOrigin-RevId: 146478427 MOS_MIGRATED_REVID=146478427
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/genrule/BazelGenRuleRule.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genrule/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBaseRule.java1
7 files changed, 49 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
index c711787225..e38c3d9cc8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
@@ -22,6 +22,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.RunfilesSupplier;
+import com.google.devtools.build.lib.analysis.actions.ExecutionRequirements;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -296,7 +297,7 @@ public final class CommandHelper {
*/
private PathFragment shellPath(Map<String, String> executionInfo) {
// Use vanilla /bin/bash for actions running on mac machines.
- return executionInfo.containsKey("requires-darwin")
+ return executionInfo.containsKey(ExecutionRequirements.REQUIRES_DARWIN)
? new PathFragment("/bin/bash") : ruleContext.getConfiguration().getShellExecutable();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 7e24e9829e..d454a20cfa 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -286,9 +286,11 @@ public class BazelRuleClassProvider {
TESTING_SUPPORT.init(builder);
VARIOUS_WORKSPACE_RULES.init(builder);
- // This rule is a little special: it needs to depend on every configuration fragment that has
- // Make variables, so we can't put it in any of the above buckets.
+ // These rules are a little special: they need to depend on every configuration fragment that
+ // has Make variables, so we can't put them in any of the above buckets.
builder.addRuleDefinition(new BazelToolchainLookupRule());
+ builder.addRuleDefinition(new GenRuleBaseRule());
+ builder.addRuleDefinition(new BazelGenRuleRule());
}
public static final RuleSet BAZEL_SETUP =
@@ -342,8 +344,6 @@ public class BazelRuleClassProvider {
builder.addRuleDefinition(new AliasRule());
builder.addRuleDefinition(new BazelFilegroupRule());
builder.addRuleDefinition(new TestSuiteRule());
- builder.addRuleDefinition(new GenRuleBaseRule());
- builder.addRuleDefinition(new BazelGenRuleRule());
builder.addRuleDefinition(new GenQueryRule());
try {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
index 07c0044f6d..5889ab4c13 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
@@ -122,7 +122,7 @@ public class BazelCppRuleClasses {
};
public static final LateBoundLabel<BuildConfiguration> CC_TOOLCHAIN =
- new LateBoundLabel<BuildConfiguration>(CROSSTOOL_LABEL) {
+ new LateBoundLabel<BuildConfiguration>(CROSSTOOL_LABEL, CppConfiguration.class) {
@Override
public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
return configuration.getFragment(CppConfiguration.class).getCcToolchainRuleLabel();
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 21683f2dc7..fafd65d6a6 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
@@ -20,8 +20,12 @@ import static com.google.devtools.build.lib.syntax.Type.BOOLEAN;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppRuleClasses;
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.
@@ -43,9 +47,14 @@ public final class BazelGenRuleRule implements RuleDefinition {
.add(attr("$genrule_setup", LABEL).cfg(HOST).value(env.getToolsLabel(GENRULE_SETUP_LABEL)))
+ .requiresConfigurationFragments(CppConfiguration.class, JavaConfiguration.class)
+
// TODO(bazel-team): stamping doesn't seem to work. Fix it or remove attribute.
.add(attr("stamp", BOOLEAN).value(false))
+ .add(attr(":cc_toolchain", LABEL).value(BazelCppRuleClasses.CC_TOOLCHAIN))
+ .add(attr(":host_jdk", LABEL).cfg(HOST).value(JavaSemantics.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 92001c609e..f8c42c9005 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
@@ -11,10 +11,12 @@ java_library(
deps = [
"//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:packages",
"//src/main/java/com/google/devtools/build/lib:vfs",
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/cmdline",
+ "//src/main/java/com/google/devtools/build/lib/rules/cpp",
"//third_party:guava",
"//third_party:jsr305",
"//third_party/protobuf",
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 3da9cc2048..988321c6fd 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
@@ -41,10 +41,13 @@ import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.rules.AliasProvider;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.ToolchainProvider;
+import com.google.devtools.build.lib.rules.cpp.CppHelper;
+import com.google.devtools.build.lib.rules.java.JavaHelper;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.List;
import java.util.Map;
+import java.util.regex.Pattern;
/**
* A base implementation of genrule, to be used by specific implementing rules which can change some
@@ -52,6 +55,19 @@ import java.util.Map;
*/
public abstract class GenRuleBase implements RuleConfiguredTargetFactory {
+ private static final Pattern CROSSTOOL_MAKE_VARIABLE =
+ Pattern.compile("\\$\\((CC|AR|NM|OBJCOPY|STRIP|GCOVTOOL)\\)");
+ private static final Pattern JDK_MAKE_VARIABLE =
+ Pattern.compile("\\$\\((JAVABASE|JAVA)\\)");
+
+ protected boolean requiresCrosstool(String command) {
+ return CROSSTOOL_MAKE_VARIABLE.matcher(command).find();
+ }
+
+ protected boolean requiresJdk(String command) {
+ return JDK_MAKE_VARIABLE.matcher(command).find();
+ }
+
/**
* Returns a {@link Map} of execution info, which will be used in later processing to construct
* the actual command line that will be executed.
@@ -172,6 +188,17 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory {
List<String> argv = commandHelper.buildCommandLine(command, inputs, ".genrule_script.sh",
ImmutableMap.copyOf(executionInfo));
+ // TODO(bazel-team): Make the make variable expander pass back a list of these.
+ if (requiresCrosstool(baseCommand)) {
+ // If cc is used, silently throw in the crosstool filegroup as a dependency.
+ inputs.addTransitive(CppHelper.getToolchain(ruleContext).getCrosstoolMiddleman());
+ }
+ if (requiresJdk(baseCommand)) {
+ // If javac is used, silently throw in the jdk filegroup as a dependency.
+ // Note we expand Java-related variables with the *host* configuration.
+ inputs.addTransitive(JavaHelper.getHostJavabaseInputs(ruleContext));
+ }
+
for (NestedSet<Artifact> extraInputs : getExtraInputArtifacts(ruleContext, baseCommand)) {
inputs.addTransitive(extraInputs);
}
@@ -312,6 +339,10 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory {
ruleContext.getRule().getLabel().getPackageIdentifier().getSourceRoot();
return dir.getRelative(relPath).getPathString();
}
+ } else if (JDK_MAKE_VARIABLE.matcher("$(" + name + ")").find()) {
+ return new ConfigurationMakeVariableContext(
+ ruleContext.getTarget().getPackage(), ruleContext.getHostConfiguration())
+ .lookupMakeVariable(name);
} else {
return super.lookupMakeVariable(name);
}
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 3a389cacd2..36ee679de5 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
@@ -67,7 +67,6 @@ public class GenRuleBaseRule implements RuleDefinition {
.direct_compile_time_input()
.allowedFileTypes(FileTypeSet.ANY_FILE))
-
/* <!-- #BLAZE_RULE(genrule).ATTRIBUTE(tools) -->
A list of <i>tool</i> dependencies for this rule. See the definition of
<a href="../build-ref.html#deps">dependencies</a> for more information. <br/>