diff options
author | John Cater <jcater@google.com> | 2018-06-05 11:09:01 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-05 11:10:48 -0700 |
commit | ee45c6610ae213c12d57bf9e8e5ff674d7a9d7fc (patch) | |
tree | a564f798205c25ec3987b00fdc38a19e4bbfdd65 /src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java | |
parent | 41bf88da4e4bf7d0ecfba2d935736cae9f93cf19 (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.java | 26 |
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). * |