aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2018-06-05 11:09:01 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-05 11:10:48 -0700
commitee45c6610ae213c12d57bf9e8e5ff674d7a9d7fc (patch)
treea564f798205c25ec3987b00fdc38a19e4bbfdd65 /src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
parent41bf88da4e4bf7d0ecfba2d935736cae9f93cf19 (diff)
Allow rules and targets to specify extra execution platform constraints.
RuleClass.Builder now allows authors to specify whether a rule's targets can add additional constraints on the execution platform, and to declare additional constraints for all targets of that rule. Targets which support this now have an attribute, "exec_compatible_with", which supports specifying additional constraints that the execution platform used must match. This attribute is non-configurable. It will only affect execution platforms used during toolchain resolution. Part of #5217. Change-Id: Id2400dbf869a00aa2be3e3d2f085c2850cd6dc00 Closes #5227. Change-Id: If7d55f08f7f44bc7d7f6dfec86a3e6bcd68574b9 PiperOrigin-RevId: 199326255
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 8363ff7144..f1df1166bc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.ConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.Dependency;
import com.google.devtools.build.lib.analysis.DependencyResolver.InconsistentAspectOrderException;
+import com.google.devtools.build.lib.analysis.PlatformSemantics;
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
import com.google.devtools.build.lib.analysis.ToolchainContext;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -57,9 +58,11 @@ import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.NoSuchThingException;
+import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.RawAttributeMapper;
import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.RuleClass.ExecutionPlatformConstraintsAllowed;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.RuleTransitionFactory;
import com.google.devtools.build.lib.packages.Target;
@@ -272,11 +275,15 @@ public final class ConfiguredTargetFunction implements SkyFunction {
if (rule.getRuleClassObject().supportsPlatforms()) {
ImmutableSet<Label> requiredToolchains =
rule.getRuleClassObject().getRequiredToolchains();
+
+ // Collect local (target, rule) constraints for filtering out execution platforms.
+ ImmutableSet<Label> execConstraintLabels = getExecutionPlatformConstraints(rule);
toolchainContext =
ToolchainUtil.createToolchainContext(
env,
rule.toString(),
requiredToolchains,
+ execConstraintLabels,
configuredTargetKey.getConfigurationKey());
if (env.valuesMissing()) {
return null;
@@ -384,6 +391,25 @@ public final class ConfiguredTargetFunction implements SkyFunction {
}
/**
+ * Returns the target-specific execution platform constraints, based on the rule definition and
+ * any constraints added by the target.
+ */
+ private static ImmutableSet<Label> getExecutionPlatformConstraints(Rule rule) {
+ NonconfigurableAttributeMapper mapper = NonconfigurableAttributeMapper.of(rule);
+ ImmutableSet.Builder<Label> execConstraintLabels = new ImmutableSet.Builder<>();
+
+ execConstraintLabels.addAll(rule.getRuleClassObject().getExecutionPlatformConstraints());
+
+ if (rule.getRuleClassObject().executionPlatformConstraintsAllowed()
+ == ExecutionPlatformConstraintsAllowed.PER_TARGET) {
+ execConstraintLabels.addAll(
+ mapper.get(PlatformSemantics.EXEC_COMPATIBLE_WITH_ATTR, BuildType.LABEL_LIST));
+ }
+
+ return execConstraintLabels.build();
+ }
+
+ /**
* Computes the direct dependencies of a node in the configured target graph (a configured target
* or an aspects).
*