blob: 4371dbc4d5fc79072ef68dca2a4b78bf6fabc3b2 [file] [log] [blame]
// Copyright 2018 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.starlarkbuildapi;
import com.google.devtools.build.docgen.annot.DocCategory;
import com.google.devtools.build.lib.collect.nestedset.Depset;
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
import java.io.IOException;
import javax.annotation.Nullable;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.Dict;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.StarlarkValue;
/** Interface for actions in Starlark. */
@StarlarkBuiltin(
name = "Action",
category = DocCategory.BUILTIN,
doc =
"An action created during rule analysis.<p>This object is visible for the purpose of"
+ " testing, and may be obtained from an <code>Actions</code> provider. It is normally"
+ " not necessary to access <code>Action</code> objects or their fields within a rule's"
+ " implementation function. You may instead want to see the <a"
+ " href='https://bazel.build/extending/rules#actions'>Rules page</a> for a general"
+ " discussion of how to use actions when defining custom rules, or the <a"
+ " href='../builtins/actions.html'>API reference</a> for creating actions.<p>Some"
+ " fields of this object are only applicable for certain kinds of actions. Fields that"
+ " are inapplicable are set to <code>None</code>.")
public interface ActionApi extends StarlarkValue {
@StarlarkMethod(name = "mnemonic", structField = true, doc = "The mnemonic for this action.")
String getMnemonic();
@StarlarkMethod(
name = "inputs",
doc = "A set of the input files of this action.",
structField = true)
Depset getStarlarkInputs();
@StarlarkMethod(
name = "outputs",
doc = "A set of the output files of this action.",
structField = true)
Depset getStarlarkOutputs();
@StarlarkMethod(
name = "argv",
doc =
"For actions created by <a href=\"../builtins/actions.html#run\">ctx.actions.run()</a> or"
+ " <a href=\"../builtins/actions.html#run_shell\">ctx.actions.run_shell()</a> an"
+ " immutable list of the arguments for the command line to be executed. Note that"
+ " for shell actions the first two arguments will be the shell path and"
+ " <code>\"-c\"</code>.",
structField = true,
allowReturnNones = true)
@Nullable
Sequence<String> getStarlarkArgv() throws EvalException, InterruptedException;
@StarlarkMethod(
name = "args",
doc =
"A list of frozen <a href=\"../builtins/Args.html\">Args</a> objects containing"
+ " information about the action arguments. These objects contain accurate argument"
+ " information, including arguments involving expanded action output directories."
+ " However, <a href=\"../builtins/Args.html\">Args</a> objects are not readable in"
+ " the analysis phase. For a less accurate account of arguments which is available"
+ " in the analysis phase, see <a href=\"#argv\">argv</a>. <p>Note that some types of"
+ " actions do not yet support exposure of this field. For such action types, this is"
+ " <code>None</code>.",
structField = true,
allowReturnNones = true)
@Nullable
Sequence<CommandLineArgsApi> getStarlarkArgs() throws EvalException, InterruptedException;
/**
* If the action writes a file whose content is known at analysis time, returns that content;
* returns null otherwise.
*
* <p>The content might be unknown if, for instance, the action expands an {@code Args} object
* that includes a directory ({@link TreeArtifact}) with {@code expand_directories=False}.
*
* @throws EvalException if there is a Starlark evaluation error, e.g. in an {@code Args} object's
* call to a {@code map_each} callback.
* @throws IOException if there is a non-Starlark error in expanding an {@code Args} object.
*/
@StarlarkMethod(
name = "content",
doc =
"For actions created by <a"
+ " href=\"../builtins/actions.html#write\">ctx.actions.write()</a> or <a"
+ " href=\"../builtins/actions.html#expand_template\">ctx.actions.expand_template()</a>,"
+ " the contents of the file to be written, if those contents can be computed during "
+ " the analysis phase. The value is <code>None</code> if the contents cannot be"
+ " determined until the execution phase, such as when a directory in an <a"
+ " href=\"../builtins/Args.html\">Args</a> object needs to be expanded.",
structField = true,
allowReturnNones = true)
@Nullable
String getStarlarkContent() throws IOException, EvalException, InterruptedException;
@StarlarkMethod(
name = "substitutions",
doc =
"For actions created by <a"
+ " href=\"../builtins/actions.html#expand_template\">ctx.actions.expand_template()</a>,"
+ " an immutable dict holding the substitution mapping.",
structField = true,
allowReturnNones = true)
@Nullable
Dict<String, String> getStarlarkSubstitutions() throws EvalException;
@StarlarkMethod(
name = "env",
structField = true,
doc =
"The 'fixed' environment variables for this action. This includes only environment"
+ " settings which are explicitly set by the action definition, and thus omits"
+ " settings which are only pre-set in the execution environment.")
Dict<String, String> getEnv();
@StarlarkMethod(
name = "execution_info",
structField = true,
doc =
"The execution requirements for this action, set for this action specifically. This is a"
+ " dictionary that maps strings specifying execution info to arbitrary strings."
+ " This is in order to match the structure of execution info in other parts of the"
+ " code base; all relevant info is in the keyset. Returns None if this action does"
+ " not expose execution requirements.",
allowReturnNones = true,
enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_GOOGLE_LEGACY_API)
@Nullable
public Dict<String, String> getExecutionInfoDict();
}