Add all available toolchains to the FileProvider of cc_toolchain_suite.
This is necessary because we don't have a replacement for saying "this genrule needs the C++ toolchain" and I'd prefer this to do it in a backward-compatible way; burned myself here by trying to be principled, so let's now do the pragmatic thing.
--
MOS_MIGRATED_REVID=127317024
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index dc6064c..85b2be3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -648,6 +648,28 @@
}
/**
+ * Returns the dependencies through a {@code LABEL_DICT_UNARY} attribute as a map from
+ * a string to a {@link TransitiveInfoCollection}.
+ */
+ public Map<String, TransitiveInfoCollection> getPrerequisiteMap(String attributeName) {
+ Attribute attributeDefinition = getAttribute(attributeName);
+ Preconditions.checkState(attributeDefinition.getType() == BuildType.LABEL_DICT_UNARY);
+
+ ImmutableMap.Builder<String, TransitiveInfoCollection> result = ImmutableMap.builder();
+ Map<String, Label> dict = attributes().get(attributeName, BuildType.LABEL_DICT_UNARY);
+ Map<Label, ConfiguredTarget> labelToDep = new HashMap<>();
+ for (ConfiguredTarget dep : targetMap.get(attributeName)) {
+ labelToDep.put(dep.getLabel(), dep);
+ }
+
+ for (Map.Entry<String, Label> entry : dict.entrySet()) {
+ result.put(entry.getKey(), Preconditions.checkNotNull(labelToDep.get(entry.getValue())));
+ }
+
+ return result.build();
+ }
+
+ /**
* Returns the list of transitive info collections that feed into this target through the
* specified attribute. Note that you need to specify the correct mode for the attribute,
* otherwise an assertion will be raised.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
index 637d86a..83aa0fd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java
@@ -18,9 +18,8 @@
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
/**
@@ -35,8 +34,16 @@
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
+ NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
+ for (TransitiveInfoCollection dep : ruleContext.getPrerequisiteMap("toolchains").values()) {
+ CcToolchainProvider provider = dep.getProvider(CcToolchainProvider.class);
+ if (provider != null) {
+ filesToBuild.addTransitive(provider.getCrosstool());
+ }
+ }
+
return new RuleConfiguredTargetBuilder(ruleContext)
- .setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER))
+ .setFilesToBuild(filesToBuild.build())
.add(RunfilesProvider.class, RunfilesProvider.EMPTY)
.build();
}