diff options
author | 2017-09-06 18:19:20 +0200 | |
---|---|---|
committer | 2017-09-07 09:57:15 +0200 | |
commit | 1099b54281c51f947ecaa93e2b6569460f2895fa (patch) | |
tree | e55ed76b7162cc3aa1464b9556525b062f8a6e98 /src/main/java/com/google/devtools/build | |
parent | 4a12e66757a5d12080744c7289342db1a0f67df7 (diff) |
RuleContext instances obtained through BuildViewTestCase#getRuleContext have a
ToolchainContext.
PiperOrigin-RevId: 167729868
Diffstat (limited to 'src/main/java/com/google/devtools/build')
5 files changed, 98 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java index 9708f3eb8b..7797838c06 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java @@ -86,6 +86,7 @@ import com.google.devtools.build.lib.skyframe.CoverageReportValue; import com.google.devtools.build.lib.skyframe.SkyframeAnalysisResult; import com.google.devtools.build.lib.skyframe.SkyframeBuildView; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; +import com.google.devtools.build.lib.skyframe.ToolchainUtil.ToolchainContextException; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.SkylarkImport; import com.google.devtools.build.lib.syntax.SkylarkImports; @@ -1225,10 +1226,11 @@ public class BuildView { */ @VisibleForTesting public RuleContext getRuleContextForTesting( - ConfiguredTarget target, StoredEventHandler eventHandler, + ConfiguredTarget target, + StoredEventHandler eventHandler, BuildConfigurationCollection configurations) throws EvalException, InvalidConfigurationException, InterruptedException, - InconsistentAspectOrderException { + InconsistentAspectOrderException, ToolchainContextException { BuildConfiguration targetConfig = target.getConfiguration(); CachingAnalysisEnvironment env = new CachingAnalysisEnvironment(getArtifactFactory(), @@ -1243,12 +1245,20 @@ public class BuildView { * given configured target. */ @VisibleForTesting - public RuleContext getRuleContextForTesting(ExtendedEventHandler eventHandler, + public RuleContext getRuleContextForTesting( + ExtendedEventHandler eventHandler, ConfiguredTarget target, - AnalysisEnvironment env, BuildConfigurationCollection configurations) + AnalysisEnvironment env, + BuildConfigurationCollection configurations) throws EvalException, InvalidConfigurationException, InterruptedException, - InconsistentAspectOrderException { + InconsistentAspectOrderException, ToolchainContextException { BuildConfiguration targetConfig = target.getConfiguration(); + List<Label> requiredToolchains = + target.getTarget().getAssociatedRule().getRuleClassObject().getRequiredToolchains(); + ToolchainContext toolchainContext = + skyframeExecutor.getToolchainContextForTesting( + requiredToolchains, targetConfig, eventHandler); + return new RuleContext.Builder( env, (Rule) target.getTarget(), @@ -1263,6 +1273,7 @@ public class BuildView { .setPrerequisites(getPrerequisiteMapForTesting(eventHandler, target, configurations)) .setConfigConditions(ImmutableMap.<Label, ConfigMatchingProvider>of()) .setUniversalFragment(ruleClassProvider.getUniversalFragment()) + .setToolchainContext(toolchainContext) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java index d93c5a6dea..bc47c69d57 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java @@ -40,8 +40,9 @@ public class PlatformSemantics { @Override public List<Label> resolve( Rule rule, AttributeMap attributes, BuildConfiguration configuration) { - if (rule.getRuleClassObject().getRequiredToolchains().isEmpty()) { - return null; + // rule may be null for tests + if (rule == null || rule.getRuleClassObject().getRequiredToolchains().isEmpty()) { + return ImmutableList.of(); } return configuration.getFragment(PlatformConfiguration.class).getTargetPlatforms(); } @@ -52,7 +53,8 @@ public class PlatformSemantics { new Attribute.LateBoundLabel<BuildConfiguration>(PlatformConfiguration.class) { @Override public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) { - if (rule.getRuleClassObject().getRequiredToolchains().isEmpty()) { + // rule may be null for tests + if (rule == null || rule.getRuleClassObject().getRequiredToolchains().isEmpty()) { return null; } return configuration.getFragment(PlatformConfiguration.class).getExecutionPlatform(); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java index 9cbdd475ac..8754c3e892 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java @@ -142,6 +142,7 @@ public class ToolchainContext { prerequisiteMap .keys() .stream() + .filter(attribute -> attribute != null) .filter(attribute -> attribute.getName().equals(PlatformSemantics.TOOLCHAINS_ATTR)) .findFirst(); Preconditions.checkState( diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java new file mode 100644 index 0000000000..7df8afddd5 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java @@ -0,0 +1,65 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.skyframe; + +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.util.ResourceUsage; +import com.google.devtools.build.skyframe.AbstractSkyFunctionEnvironment; +import com.google.devtools.build.skyframe.BuildDriver; +import com.google.devtools.build.skyframe.EvaluationResult; +import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; +import com.google.devtools.build.skyframe.ValueOrExceptionUtils; +import com.google.devtools.build.skyframe.ValueOrUntypedException; +import java.util.Map; + +/** A skyframe environment that can be used to evaluate arbitrary skykeys for testing. */ +public class SkyFunctionEnvironmentForTesting extends AbstractSkyFunctionEnvironment + implements SkyFunction.Environment { + + private final BuildDriver buildDriver; + private final ExtendedEventHandler eventHandler; + + /** Creates a SkyFunctionEnvironmentForTesting that uses a BuildDriver to evaluate skykeys. */ + public SkyFunctionEnvironmentForTesting( + BuildDriver buildDriver, ExtendedEventHandler eventHandler) { + this.buildDriver = buildDriver; + this.eventHandler = eventHandler; + } + + @Override + protected Map<SkyKey, ValueOrUntypedException> getValueOrUntypedExceptions( + Iterable<? extends SkyKey> depKeys) throws InterruptedException { + ImmutableMap.Builder<SkyKey, ValueOrUntypedException> resultMap = ImmutableMap.builder(); + EvaluationResult<SkyValue> evaluationResult = + buildDriver.evaluate(depKeys, true, ResourceUsage.getAvailableProcessors(), eventHandler); + for (SkyKey depKey : depKeys) { + resultMap.put(depKey, ValueOrExceptionUtils.ofValue(evaluationResult.get(depKey))); + } + return resultMap.build(); + } + + @Override + public ExtendedEventHandler getListener() { + return eventHandler; + } + + @Override + public boolean inErrorBubblingForTesting() { + return false; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index d46779124c..d6aec311a1 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -59,6 +59,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.Dependency; import com.google.devtools.build.lib.analysis.MergedConfiguredTarget; import com.google.devtools.build.lib.analysis.MergedConfiguredTarget.DuplicateException; +import com.google.devtools.build.lib.analysis.ToolchainContext; import com.google.devtools.build.lib.analysis.TopLevelArtifactContext; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory; @@ -117,6 +118,7 @@ import com.google.devtools.build.lib.skyframe.PackageLookupValue.BuildFileName; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; +import com.google.devtools.build.lib.skyframe.ToolchainUtil.ToolchainContextException; import com.google.devtools.build.lib.syntax.SkylarkSemanticsOptions; import com.google.devtools.build.lib.util.AbruptExitException; import com.google.devtools.build.lib.util.ExitCode; @@ -830,6 +832,15 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { return (WorkspaceStatusAction) value.get(); } + @VisibleForTesting + public ToolchainContext getToolchainContextForTesting( + List<Label> requiredToolchains, BuildConfiguration config, ExtendedEventHandler eventHandler) + throws ToolchainContextException, InterruptedException { + SkyFunctionEnvironmentForTesting env = + new SkyFunctionEnvironmentForTesting(buildDriver, eventHandler); + return ToolchainUtil.createToolchainContext(env, "", requiredToolchains, config); + } + /** * Informs user about number of modified files (source and output files). */ |