// 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.devtools.build.lib.analysis.platform.PlatformInfo; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import javax.annotation.Nullable; /** * An interface for an {@link Action}, containing only side-effect-free query methods for * information needed during both action analysis and execution. * *

The split between {@link Action} and {@link ActionExecutionMetadata} is somewhat arbitrary, * other than that all methods with side effects must belong to the former. */ public interface ActionExecutionMetadata extends ActionAnalysisMetadata { /** * Return this key to signify a failed key computation. * *

Actions that return this value should fail to execute. * *

Consumers must either gracefully handle multiple failed actions having the same key, * (recommended), or check against this value explicitly. */ String KEY_ERROR = "1ea50e01-0349-4552-80cf-76cf520e8592"; /** * If this executable can supply verbose information, returns a string that can be used as a * progress message while this executable is running. A return value of {@code null} indicates no * message should be reported. */ @Nullable String getProgressMessage(); /** * Returns a string encoding all of the significant behaviour of this Action that might affect the * output. The general contract of getKey is this: if the work to be performed by the * execution of this action changes, the key must change. * *

As a corollary, the build system is free to omit the execution of an Action a1 * if (a) at some time in the past, it has already executed an Action a0 with the * same key as a1, (b) the names and contents of the input files listed by * a1.getInputs() are identical to the names and contents of the files listed by * a0.getInputs(), and (c) the names and values in the client environment of the variables * listed by a1.getClientEnvironmentVariables() are identical to those listed by * a0.getClientEnvironmentVariables(). * *

Examples of changes that should affect the key are: * *

*/ String getKey(ActionKeyContext actionKeyContext); /** * Returns a human-readable description of the inputs to {@link #getKey(ActionKeyContext)}. Used * in the output from '--explain', and in error messages for '--check_up_to_date' and * '--check_tests_up_to_date'. May return null, meaning no extra information is available. * *

If the return value is non-null, for consistency it should be a multiline message of the * form: * *

   *   Summary
   *     Fieldname: value
   *     Fieldname: value
   *     ...
   * 
* * where each line after the first one is intended two spaces, and where any fields that might * contain newlines or other funny characters are escaped using {@link * com.google.devtools.build.lib.shell.ShellUtils#shellEscape}. For example: * *
   *   Compiling foo.cc
   *     Command: /usr/bin/gcc
   *     Argument: '-c'
   *     Argument: foo.cc
   *     Argument: '-o'
   *     Argument: foo.o
   * 
*/ @Nullable String describeKey(); /** Returns a description of this action. */ String describe(); /** * Get the {@link RunfilesSupplier} providing runfiles needed by this action. */ RunfilesSupplier getRunfilesSupplier(); /** * Returns true iff the getInputs set is known to be complete. * *

For most Actions, this always returns true, but in some cases (e.g. C++ compilation), inputs * are dynamically discovered from the previous execution of the Action, and so before the initial * execution, this method will return false in those cases. * *

Any builder must unconditionally execute an Action for which inputsKnown() returns * false, regardless of all other inferences made by its dependency analysis. In addition, all * prerequisites mentioned in the (possibly incomplete) value returned by getInputs must also be * built first, as usual. */ @ThreadSafe boolean inputsDiscovered(); /** * Returns true iff inputsKnown() may ever return false. */ @ThreadSafe boolean discoversInputs(); /** * Returns the {@link PlatformInfo} platform this action should be executed on. If the execution * platform is {@code null}, then the host platform is assumed. */ @Nullable PlatformInfo getExecutionPlatform(); }