diff options
author | 2017-02-03 16:42:22 +0000 | |
---|---|---|
committer | 2017-02-06 19:35:39 +0000 | |
commit | 1f42581891cc5f463edc94f8e96502f1b3aff033 (patch) | |
tree | b6989376228fd4895661147ee69fffe7aadb7ae8 /src/main/java/com/google/devtools | |
parent | e77ad90fb6289a39d644ca4699976285922ff49d (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')
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/> |