| // Copyright 2014 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.actions; | 
 |  | 
 | import com.google.common.collect.ImmutableSet; | 
 |  | 
 | /** | 
 |  * An Analysis phase interface for an {@link Action} or Action-like object, containing only | 
 |  * side-effect-free query methods for information needed during action analysis. | 
 |  */ | 
 | public interface ActionAnalysisMetadata { | 
 |   /** | 
 |    * Returns the owner of this executable if this executable can supply verbose information. This is | 
 |    * typically the rule that constructed it; see ActionOwner class comment for details. Returns | 
 |    * {@code null} if no owner can be determined. | 
 |    * | 
 |    * <p>If this executable does not supply verbose information, this function may throw an | 
 |    * IllegalStateException. | 
 |    */ | 
 |   ActionOwner getOwner(); | 
 |  | 
 |   /** | 
 |    * Returns true if the action can be shared, i.e. multiple configured targets can create the same | 
 |    * action. | 
 |    * | 
 |    * <p>In theory, these should not exist, but in practice, they do. | 
 |    */ | 
 |   boolean isShareable(); | 
 |  | 
 |   /** | 
 |    * Returns a mnemonic (string constant) for this kind of action; written into | 
 |    * the master log so that the appropriate parser can be invoked for the output | 
 |    * of the action. Effectively a public method as the value is used by the | 
 |    * extra_action feature to match actions. | 
 |    */ | 
 |   String getMnemonic(); | 
 |  | 
 |   /** | 
 |    * Returns a pretty string representation of this action, suitable for use in | 
 |    * progress messages or error messages. | 
 |    */ | 
 |   String prettyPrint(); | 
 |  | 
 |   /** | 
 |    * Returns the tool Artifacts that this Action depends upon. May be empty. This is a subset of | 
 |    * getInputs(). | 
 |    * | 
 |    * <p>This may be used by spawn strategies to determine whether an external tool has not changed | 
 |    * since the last time it was used and could thus be reused, or whether it has to be restarted. | 
 |    * | 
 |    * <p>See {@link AbstractAction#getTools()} for an explanation of why it's important that this | 
 |    * set contains exactly the right set of artifacts in order for the build to stay correct and the | 
 |    * worker strategy to work. | 
 |    */ | 
 |   Iterable<Artifact> getTools(); | 
 |  | 
 |   /** | 
 |    * Returns the input Artifacts that this Action depends upon. May be empty. | 
 |    * | 
 |    * <p>During execution, the {@link Iterable} returned by {@code getInputs} <em>must not</em> be | 
 |    * concurrently modified before the value is fully read in {@code JavaDistributorDriver#exec} (via | 
 |    * the {@code Iterable<ActionInput>} argument there). Violating this would require somewhat | 
 |    * pathological behavior by the {@link Action}, since it would have to modify its inputs, as a | 
 |    * list, say, without reassigning them. This should never happen with any Action subclassing | 
 |    * AbstractAction, since AbstractAction's implementation of getInputs() returns an immutable | 
 |    * iterable. | 
 |    */ | 
 |   Iterable<Artifact> getInputs(); | 
 |  | 
 |   /** | 
 |    * Returns the environment variables from the client environment that this action depends on. May | 
 |    * be empty. | 
 |    * | 
 |    * <p>Warning: For optimization reasons, the available environment variables are restricted to | 
 |    * those white-listed on the command line. If actions want to specify additional client | 
 |    * environment variables to depend on, that restriction must be lifted in | 
 |    * {@link com.google.devtools.build.lib.runtime.CommandEnvironment}. | 
 |    */ | 
 |   Iterable<String> getClientEnvironmentVariables(); | 
 |  | 
 |   /** | 
 |    * Returns the (unordered, immutable) set of output Artifacts that | 
 |    * this action generates.  (It would not make sense for this to be empty.) | 
 |    */ | 
 |   ImmutableSet<Artifact> getOutputs(); | 
 |  | 
 |   /** | 
 |    * Returns input files that need to be present to allow extra_action rules to shadow this action | 
 |    * correctly when run remotely. This is at least the normal inputs of the action, but may include | 
 |    * other files as well. For example C(++) compilation may perform include file header scanning. | 
 |    * This needs to be mirrored by the extra_action rule. Called by | 
 |    * {@link com.google.devtools.build.lib.analysis.extra.ExtraAction} at execution time for actions | 
 |    * that return true for {link #discoversInputs()}. | 
 |    * | 
 |    * @param actionExecutionContext Services in the scope of the action, like the Out/Err streams. | 
 |    * @throws ActionExecutionException only when code called from this method | 
 |    *     throws that exception. | 
 |    * @throws InterruptedException if interrupted | 
 |    */ | 
 |   Iterable<Artifact> getInputFilesForExtraAction(ActionExecutionContext actionExecutionContext) | 
 |       throws ActionExecutionException, InterruptedException; | 
 |  | 
 |   /** | 
 |    * Returns the set of output Artifacts that are required to be saved. This is | 
 |    * used to identify items that would otherwise be potentially identified as | 
 |    * orphaned (not consumed by any downstream {@link Action}s and potentially | 
 |    * discarded during the build process. | 
 |    */ | 
 |   ImmutableSet<Artifact> getMandatoryOutputs(); | 
 |  | 
 |   /** | 
 |    * Returns the "primary" input of this action, if applicable. | 
 |    * | 
 |    * <p>For example, a C++ compile action would return the .cc file which is being compiled, | 
 |    * irrespective of the other inputs. | 
 |    * | 
 |    * <p>May return null. | 
 |    */ | 
 |   Artifact getPrimaryInput(); | 
 |  | 
 |   /** | 
 |    * Returns the "primary" output of this action. | 
 |    * | 
 |    * <p>For example, the linked library would be the primary output of a LinkAction. | 
 |    * | 
 |    * <p>Never returns null. | 
 |    */ | 
 |   Artifact getPrimaryOutput(); | 
 |  | 
 |   /** | 
 |    * Returns an iterable of input Artifacts that MUST exist prior to executing an action. In other | 
 |    * words, in case when action is scheduled for execution, builder will ensure that all artifacts | 
 |    * returned by this method are present in the filesystem (artifact.getPath().exists() is true) or | 
 |    * action execution will be aborted with an error that input file does not exist. While in | 
 |    * majority of cases this method will return all action inputs, for some actions (e.g. | 
 |    * CppCompileAction) it can return a subset of inputs because that not all action inputs might be | 
 |    * mandatory for action execution to succeed (e.g. header files retrieved from *.d file from the | 
 |    * previous build). | 
 |    */ | 
 |   Iterable<Artifact> getMandatoryInputs(); | 
 |  | 
 |   /** | 
 |    * @return true iff path prefix conflict (conflict where two actions generate | 
 |    *         two output artifacts with one of the artifact's path being the | 
 |    *         prefix for another) between this action and another action should | 
 |    *         be reported. | 
 |    */ | 
 |   boolean shouldReportPathPrefixConflict(ActionAnalysisMetadata action); | 
 |  | 
 |   /** Returns the action type. Must not be {@code null}. */ | 
 |   MiddlemanType getActionType(); | 
 |  | 
 |   /** The action type. */ | 
 |   public enum MiddlemanType { | 
 |  | 
 |     /** A normal action. */ | 
 |     NORMAL, | 
 |  | 
 |     /** A normal middleman, which just encapsulates a list of artifacts. */ | 
 |     AGGREGATING_MIDDLEMAN, | 
 |  | 
 |     /** | 
 |      * A middleman that enforces action ordering, is not validated by the dependency checker, but | 
 |      * allows errors to be propagated. | 
 |      */ | 
 |     ERROR_PROPAGATING_MIDDLEMAN, | 
 |  | 
 |     /** | 
 |      * A runfiles middleman, which is validated by the dependency checker, but is not expanded | 
 |      * in blaze. Instead, the runfiles manifest is sent to remote execution client, which | 
 |      * performs the expansion. | 
 |      */ | 
 |     RUNFILES_MIDDLEMAN; | 
 |  | 
 |     public boolean isMiddleman() { | 
 |       return this != NORMAL; | 
 |     } | 
 |   } | 
 |  | 
 |   /** | 
 |    * Whether this action has loose headers. | 
 |    * | 
 |    * <p>If this is true, top-down evaluation considers an action changed if any source files in | 
 |    * package have changed. | 
 |    */ | 
 |   default boolean hasLooseHeaders() { | 
 |     return false; | 
 |   } | 
 | } |