| // 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.cmdline.RepositoryMapping; |
| 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. |
| * |
| * <p>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 { |
| |
| /** |
| * 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(); |
| |
| /** |
| * A variant of {@link #getProgressMessage} that additionally takes the {@link RepositoryMapping} |
| * of the main repository, which can be used by the implementation to emit labels with apparent |
| * instead of canonical repository names. A return value of {@code null} indicates no message |
| * should be reported. |
| * |
| * <p>The default implementation simply returns the result of {@link #getProgressMessage}. |
| */ |
| @Nullable |
| default String getProgressMessage(RepositoryMapping mainRepositoryMapping) { |
| return getProgressMessage(); |
| } |
| |
| /** |
| * Returns a human-readable description of the inputs to {@link #getKey}. 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. |
| * |
| * <p>If the return value is non-null, for consistency it should be a multiline message of the |
| * form: |
| * |
| * <pre> |
| * <var>Summary</var> |
| * <var>Fieldname</var>: <var>value</var> |
| * <var>Fieldname</var>: <var>value</var> |
| * ... |
| * </pre> |
| * |
| * 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: |
| * |
| * <pre> |
| * Compiling foo.cc |
| * Command: /usr/bin/gcc |
| * Argument: '-c' |
| * Argument: foo.cc |
| * Argument: '-o' |
| * Argument: foo.o |
| * </pre> |
| */ |
| @Nullable |
| String describeKey(); |
| |
| /** |
| * Get the {@link RunfilesSupplier} providing runfiles needed by this action. |
| */ |
| RunfilesSupplier getRunfilesSupplier(); |
| |
| /** |
| * Returns true iff the {@link #getInputs} set is known to be complete. |
| * |
| * <p>For most actions, this always returns true. For actions which {@linkplain #discoversInputs |
| * discover inputs} (e.g. C++ compilation), inputs are dynamically discovered from the previous |
| * execution of the action, and so before the initial execution, this method returns false. |
| * |
| * <p>Any builder <em>must</em> unconditionally execute an action for which this method returns |
| * false, regardless of all other inferences made by its dependency analysis. In addition, all |
| * prerequisites mentioned in the (possibly incomplete) value returned by {@link #getInputs} must |
| * also be built first, as usual. |
| */ |
| @ThreadSafe |
| boolean inputsKnown(); |
| |
| /** |
| * Returns true if this action discovers inputs. |
| * |
| * <p>The value returned by this method is constant for lifetime of this action. |
| */ |
| @ThreadSafe |
| boolean discoversInputs(); |
| |
| /** |
| * Returns true if the action may create output artifacts whose contents aren't generated by this |
| * action, and also, this action does not consume its input artifacts' contents. |
| * |
| * <p>This is rarely true. Symlink actions are an example where this is true: their outputs' |
| * contents are equal to their inputs' contents, and a symlink action does not consume its inputs' |
| * contents. |
| * |
| * <p>This property is relevant for action rewinding and top-level output fetching. |
| */ |
| default boolean mayInsensitivelyPropagateInputs() { |
| return false; |
| } |
| } |