From 73876205d11794a5b748dc3e800261c0f459ef76 Mon Sep 17 00:00:00 2001 From: Rumou Duan Date: Mon, 6 Jun 2016 18:52:08 +0000 Subject: Skyframe changes to support SpawnActionTemplate. 1. Adds ActionTemplateExpansion{Function, Value} for ActionTemplate expansion. 2. Changes ArtifactFunction to support evaluating TreeFileArtifacts and TreeArtifacts generated by ActionTemplate. -- MOS_MIGRATED_REVID=124160939 --- .../skyframe/ActionTemplateExpansionFunction.java | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java') diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java new file mode 100644 index 0000000000..26d254b9eb --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunction.java @@ -0,0 +1,88 @@ +// Copyright 2016 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.ImmutableList; +import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; +import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; +import com.google.devtools.build.lib.analysis.actions.SpawnActionTemplate; +import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey; +import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionException; +import com.google.devtools.build.skyframe.SkyFunctionException.Transience; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; + +import javax.annotation.Nullable; + +/** + * The SkyFunction for {@link ActionTemplateExpansionValue}. + * + *

Given an action template, this function resolves its input TreeArtifact, then expands the + * action template into a list of actions using the expanded {@link TreeFileArtifact}s under the + * input TreeArtifact. + */ +public class ActionTemplateExpansionFunction implements SkyFunction { + + @Override + public SkyValue compute(SkyKey skyKey, Environment env) + throws ActionTemplateExpansionFunctionException { + ActionTemplateExpansionKey key = (ActionTemplateExpansionKey) skyKey.argument(); + SpawnActionTemplate actionTemplate = key.getActionTemplate(); + + // Requests the TreeArtifactValue object for the input TreeArtifact. + SkyKey artifactValueKey = ArtifactValue.key(actionTemplate.getInputTreeArtifact(), true); + TreeArtifactValue treeArtifactValue = (TreeArtifactValue) env.getValue(artifactValueKey); + + // Input TreeArtifact is not ready yet. + if (env.valuesMissing()) { + return null; + } + Iterable inputTreeFileArtifacts = treeArtifactValue.getChildren(); + Iterable expandedActions; + try { + // Expand the action template using the list of expanded input TreeFileArtifacts. + expandedActions = ImmutableList.copyOf( + actionTemplate.generateActionForInputArtifacts(inputTreeFileArtifacts, key)); + } catch (ActionConflictException e) { + e.reportTo(env.getListener()); + throw new ActionTemplateExpansionFunctionException(e); + } catch (ArtifactPrefixConflictException e) { + env.getListener().handle(Event.error(e.getMessage())); + throw new ActionTemplateExpansionFunctionException(e); + } + + return new ActionTemplateExpansionValue(expandedActions); + } + + /** Exception thrown by {@link ActionTemplateExpansionFunction}. */ + public static final class ActionTemplateExpansionFunctionException extends SkyFunctionException { + ActionTemplateExpansionFunctionException(ActionConflictException e) { + super(e, Transience.PERSISTENT); + } + + ActionTemplateExpansionFunctionException(ArtifactPrefixConflictException e) { + super(e, Transience.PERSISTENT); + } + } + + @Nullable + @Override + public String extractTag(SkyKey skyKey) { + return null; + } +} -- cgit v1.2.3