aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2017-09-06 18:19:20 +0200
committerGravatar Yun Peng <pcloudy@google.com>2017-09-07 09:57:15 +0200
commit1099b54281c51f947ecaa93e2b6569460f2895fa (patch)
treee55ed76b7162cc3aa1464b9556525b062f8a6e98 /src/main/java
parent4a12e66757a5d12080744c7289342db1a0f67df7 (diff)
RuleContext instances obtained through BuildViewTestCase#getRuleContext have a
ToolchainContext. PiperOrigin-RevId: 167729868
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/PlatformSemantics.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctionEnvironmentForTesting.java65
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java11
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).
*/