allow starlark actions to declare which exec_group they belong to
#11250
FIG_LOSSY_EXPORT=Don't submit from Critique. Use hg submit instead, or sync and re-upload when the diffbase is submitted. See[]
PiperOrigin-RevId: 309306324
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 9e53631..606e831 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
@@ -14,6 +14,8 @@
package com.google.devtools.build.lib.analysis;
+import static com.google.devtools.build.lib.analysis.ToolchainCollection.DEFAULT_EXEC_GROUP_NAME;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
@@ -202,7 +204,9 @@
private final ImmutableSet<String> requiredConfigFragments;
private final List<Expander> makeVariableExpanders = new ArrayList<>();
- private ActionOwner actionOwner;
+ /** Map of exec group names to ActionOwners. */
+ private final Map<String, ActionOwner> actionOwners = new HashMap<>();
+
private final SymbolGenerator<ActionLookupValue.ActionLookupKey> actionOwnerSymbolGenerator;
/* lazily computed cache for Make variables, computed from the above. See get... method */
@@ -423,15 +427,26 @@
@Override
public ActionOwner getActionOwner() {
- if (actionOwner == null) {
- actionOwner =
- createActionOwner(
- rule,
- aspectDescriptors,
- getConfiguration(),
- getTargetExecProperties(),
- getExecutionPlatform());
+ return getActionOwner(DEFAULT_EXEC_GROUP_NAME);
+ }
+
+ @Override
+ public ActionOwner getActionOwner(String execGroup) {
+ if (actionOwners.containsKey(execGroup)) {
+ return actionOwners.get(execGroup);
}
+ Preconditions.checkState(
+ toolchainContexts == null || toolchainContexts.hasToolchainContext(execGroup),
+ "action owner requested for non-existent exec group '%s'.",
+ execGroup);
+ ActionOwner actionOwner =
+ createActionOwner(
+ rule,
+ aspectDescriptors,
+ getConfiguration(),
+ getTargetExecProperties(),
+ getExecutionPlatform(execGroup));
+ actionOwners.put(execGroup, actionOwner);
return actionOwner;
}
@@ -1207,13 +1222,21 @@
return configurationMakeVariableContext;
}
- // TODO(b/151742236): provide access to other non-default toolchain contexts.
@Nullable
public ResolvedToolchainContext getToolchainContext() {
return toolchainContexts == null ? null : toolchainContexts.getDefaultToolchainContext();
}
@Nullable
+ private ResolvedToolchainContext getToolchainContext(String execGroup) {
+ return toolchainContexts == null ? null : toolchainContexts.getToolchainContext(execGroup);
+ }
+
+ public boolean hasToolchainContext(String execGroup) {
+ return toolchainContexts != null && toolchainContexts.hasToolchainContext(execGroup);
+ }
+
+ @Nullable
public ToolchainCollection<ResolvedToolchainContext> getToolchainContexts() {
return toolchainContexts;
}
@@ -1274,6 +1297,16 @@
return getToolchainContext().executionPlatform();
}
+ @Override
+ @Nullable
+ public PlatformInfo getExecutionPlatform(String execGroup) {
+ if (getToolchainContexts() == null) {
+ return null;
+ }
+ ResolvedToolchainContext toolchainContext = getToolchainContext(execGroup);
+ return toolchainContext == null ? null : toolchainContext.executionPlatform();
+ }
+
private void checkAttribute(String attributeName, TransitionMode mode) {
Attribute attributeDefinition = attributes.getAttributeDefinition(attributeName);
if (attributeDefinition == null) {