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(); }