| // 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.cmdline.Label; |
| import com.google.devtools.build.lib.collect.nestedset.Depset; |
| import net.starlark.java.annot.Param; |
| import net.starlark.java.annot.ParamType; |
| 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.NoneType; |
| import net.starlark.java.eval.Sequence; |
| import net.starlark.java.eval.StarlarkCallable; |
| import net.starlark.java.eval.StarlarkFunction; |
| import net.starlark.java.eval.StarlarkThread; |
| import net.starlark.java.eval.StarlarkValue; |
| |
| /** Module providing functions to create actions. */ |
| @StarlarkBuiltin( |
| name = "actions", |
| category = DocCategory.BUILTIN, |
| doc = |
| "Module providing functions to create actions. Access this module using <a" |
| + " href=\"../builtins/ctx.html#actions\"><code>ctx.actions</code></a>.") |
| public interface StarlarkActionFactoryApi extends StarlarkValue { |
| |
| static final String TRANSFORM_VERSION_FUNC_DOC = |
| "A Starlark callback method which takes <code>dict</code> as an input and returns" |
| + " <code>dict</code> as an output. The input <code>dict</code> is generated" |
| + " from <a" |
| + " href='https://bazel.build/rules/lib/builtins/ctx#version_file'>ctx.version_file</a>." |
| + " The output <code>dict</code> needs to contain the user translated key-value" |
| + " pairs. Output <code>dict</code> will serve as a substitutions" |
| + " dictionary for template expansion."; |
| static final String TRANSFORM_INFO_FUNC_DOC = |
| "A Starlark callback method which takes <code>dict</code> as an input and returns" |
| + " <code>dict</code> as an output. The input <code>dict</code> is generated" |
| + " from <a" |
| + " href='https://bazel.build/rules/lib/builtins/ctx#info_file'>ctx.info_file</a>," |
| + " the output <code>dict</code> needs to contain the user translated key-value" |
| + " pairs. Output <code>dict</code> will serve as a substitutions" |
| + " dictionary for template expansion."; |
| static final String TEMPLATE_DOC = |
| "A <code>template</code> file according to which the output <code>dict</code> from" |
| + " <code>transform_func</code> will be formatted and written to a file."; |
| static final String INFO_OUTPUT_DOC = |
| "Name of the output file of the action. File will be created under generating rule's" |
| + " directory, similar to what <code>ctx.actions.declare_file</code> does."; |
| static final String VERSION_OUTPUT_DOC = |
| "Name of the output file of the action. File will be created under generating rule's" |
| + " directory, similar to what <code>ctx.actions.declare_file</code> does. Due to its" |
| + " volatile nature the output file of this action is special cased in Bazel, similar to" |
| + " <code>ctx.version_file</code>. Therefore changes in this file will not retrigger" |
| + " actions depending on it."; |
| |
| @StarlarkMethod( |
| name = "declare_file", |
| doc = |
| "Declares that the rule or aspect creates a file with the given filename. If" |
| + " <code>sibling</code> is not specified, the file name is relative to the package" |
| + " directory, otherwise the file is in the same directory as <code>sibling</code>." |
| + " Files cannot be created outside of the current package.<p>Remember that in" |
| + " addition to declaring a file, you must separately create an action that emits the" |
| + " file. Creating that action will require passing the returned <code>File</code>" |
| + " object to the action's construction function.<p>Note that <a" |
| + " href='https://bazel.build/extending/rules#files'>predeclared output files</a> do" |
| + " not need to be (and cannot be) declared using this function. You can obtain their" |
| + " <code>File</code> objects from <a" |
| + " href=\"../builtins/ctx.html#outputs\"><code>ctx.outputs</code></a> instead. <a" |
| + " href=\"https://github.com/bazelbuild/examples/tree/main/rules/computed_dependencies/hash.bzl\">See" |
| + " example of use</a>.", |
| parameters = { |
| @Param( |
| name = "filename", |
| doc = |
| "If no 'sibling' provided, path of the new file, relative " |
| + "to the current package. Otherwise a base name for a file " |
| + "('sibling' determines a directory)."), |
| @Param( |
| name = "sibling", |
| doc = |
| "A file that lives in the same directory as the newly created file. " |
| + "The file must be in the current package.", |
| allowedTypes = { |
| @ParamType(type = FileApi.class), |
| @ParamType(type = NoneType.class), |
| }, |
| positional = false, |
| named = true, |
| defaultValue = "None") |
| }) |
| FileApi declareFile(String filename, Object sibling) throws EvalException; |
| |
| @StarlarkMethod( |
| name = "declare_directory", |
| doc = |
| "Declares that the rule or aspect creates a directory with the given name, in the " |
| + "current package. You must create an action that generates the directory. " |
| + "The contents of the directory are not directly accessible from Starlark, " |
| + "but can be expanded in an action command with " |
| + "<a href=\"../builtins/Args.html#add_all\"><code>Args.add_all()</code></a>. " |
| + "Only regular files and directories can be in the expanded contents of a " |
| + "declare_directory.", |
| parameters = { |
| @Param( |
| name = "filename", |
| doc = |
| "If no 'sibling' provided, path of the new directory, relative " |
| + "to the current package. Otherwise a base name for a file " |
| + "('sibling' defines a directory)."), |
| @Param( |
| name = "sibling", |
| doc = |
| "A file that lives in the same directory as the newly declared directory. " |
| + "The file must be in the current package.", |
| allowedTypes = { |
| @ParamType(type = FileApi.class), |
| @ParamType(type = NoneType.class), |
| }, |
| positional = false, |
| named = true, |
| defaultValue = "None") |
| }) |
| FileApi declareDirectory(String filename, Object sibling) throws EvalException; |
| |
| @StarlarkMethod( |
| name = "declare_symlink", |
| doc = |
| "Declares that the rule or aspect creates a symlink with the given name in the current" |
| + " package. You must create an action that generates this symlink. Bazel will never" |
| + " dereference this symlink and will transfer it verbatim to sandboxes or remote" |
| + " executors. Symlinks inside tree artifacts are not currently supported.", |
| parameters = { |
| @Param( |
| name = "filename", |
| doc = |
| "If no 'sibling' provided, path of the new symlink, relative " |
| + "to the current package. Otherwise a base name for a file " |
| + "('sibling' defines a directory)."), |
| @Param( |
| name = "sibling", |
| doc = "A file that lives in the same directory as the newly declared symlink.", |
| allowedTypes = { |
| @ParamType(type = FileApi.class), |
| @ParamType(type = NoneType.class), |
| }, |
| positional = false, |
| named = true, |
| defaultValue = "None") |
| }) |
| FileApi declareSymlink(String filename, Object sibling) throws EvalException; |
| |
| @StarlarkMethod( |
| name = "do_nothing", |
| doc = |
| "Creates an empty action that neither executes a command nor produces any " |
| + "output, but that is useful for inserting 'extra actions'.", |
| parameters = { |
| @Param( |
| name = "mnemonic", |
| named = true, |
| positional = false, |
| doc = "A one-word description of the action, for example, CppCompile or GoLink."), |
| @Param( |
| name = "inputs", |
| allowedTypes = { |
| @ParamType(type = Sequence.class, generic1 = FileApi.class), |
| @ParamType(type = Depset.class), |
| }, |
| named = true, |
| positional = false, |
| defaultValue = "[]", |
| doc = "List of the input files of the action."), |
| }) |
| void doNothing(String mnemonic, Object inputs) throws EvalException; |
| |
| @StarlarkMethod( |
| name = "symlink", |
| doc = |
| "Creates an action that writes a symlink in the file system.<p>This function must be" |
| + " called with exactly one of <code>target_file</code> or <code>target_path</code>" |
| + " specified.</p><p>When you use <code>target_file</code>, declare" |
| + " <code>output</code> with <a" |
| + " href=\"#declare_file\"><code>declare_file()</code></a> or <a" |
| + " href=\"#declare_directory\"><code>declare_directory()</code></a> and match the" |
| + " type of <code>target_file</code>. This makes the symlink point to" |
| + " <code>target_file</code>. Bazel invalidates the output of this action whenever" |
| + " the target of the symlink or its contents change.</p><p>Otherwise, when you use" |
| + " <code>target_path</code>, declare <code>output</code> with <a" |
| + " href=\"#declare_symlink\"><code>declare_symlink()</code></a>). In this case, the" |
| + " symlink points to <code>target_path</code>. Bazel never resolves the symlink" |
| + " and the output of this action is invalidated only when the text contents of the" |
| + " symlink (that is, the value of <code>readlink()</code>) changes. In particular," |
| + " this can be used to create a dangling symlink.</p>", |
| parameters = { |
| @Param( |
| name = "output", |
| named = true, |
| positional = false, |
| doc = "The output of this action."), |
| @Param( |
| name = "target_file", |
| allowedTypes = { |
| @ParamType(type = FileApi.class), |
| @ParamType(type = NoneType.class), |
| }, |
| named = true, |
| positional = false, |
| defaultValue = "None", |
| doc = "The File that the output symlink will point to."), |
| @Param( |
| name = "target_path", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| named = true, |
| positional = false, |
| defaultValue = "None", |
| doc = |
| "The exact path that the output symlink will point to. No normalization or other " |
| + "processing is applied."), |
| @Param( |
| name = "is_executable", |
| named = true, |
| positional = false, |
| defaultValue = "False", |
| doc = |
| "May only be used with <code>target_file</code>, not <code>target_path</code>. " |
| + "If true, when the action is executed, the <code>target_file</code>'s path " |
| + "is checked to confirm that it is executable, and an error is reported if it " |
| + "is not. Setting <code>is_executable</code> to False does not mean the " |
| + "target is not executable, just that no verification is done." |
| + "<p>This feature does not make sense for <code>target_path</code> because " |
| + "dangling symlinks might not exist at build time.</p>"), |
| @Param( |
| name = "progress_message", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| named = true, |
| positional = false, |
| defaultValue = "None", |
| doc = "Progress message to show to the user during the build."), |
| @Param( |
| name = "use_exec_root_for_source", |
| named = true, |
| positional = false, |
| defaultValue = "unbound", |
| documented = false) |
| }, |
| useStarlarkThread = true) |
| void symlink( |
| FileApi output, |
| Object targetFile, |
| Object targetPath, |
| Boolean isExecutable, |
| Object progressMessage, |
| Object useExecRootForSourceObject, |
| StarlarkThread thread) |
| throws EvalException; |
| |
| @StarlarkMethod( |
| name = "write", |
| doc = |
| "Creates a file write action. When the action is executed, it will write the given " |
| + "content to a file. This is used to generate files using information available in " |
| + "the analysis phase. If the file is large and with a lot of static content, " |
| + "consider using <a href=\"#expand_template\"><code>expand_template</code></a>.", |
| parameters = { |
| @Param(name = "output", doc = "The output file.", named = true), |
| @Param( |
| name = "content", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = CommandLineArgsApi.class) |
| }, |
| doc = |
| "the contents of the file. May be a either a string or an <a" |
| + " href=\"#args\"><code>actions.args()</code></a>" |
| + " object.", |
| named = true), |
| @Param( |
| name = "is_executable", |
| defaultValue = "False", |
| doc = "Whether the output file should be executable.", |
| named = true) |
| }) |
| void write(FileApi output, Object content, Boolean isExecutable) throws EvalException; |
| |
| @StarlarkMethod( |
| name = "run", |
| doc = |
| "Creates an action that runs an executable. " |
| + "<a href=\"https://github.com/bazelbuild/examples/tree/main/rules/" |
| + "actions_run/execute.bzl\">See example of use</a>.", |
| parameters = { |
| @Param( |
| name = "outputs", |
| allowedTypes = { |
| @ParamType(type = Sequence.class, generic1 = FileApi.class), |
| }, |
| named = true, |
| positional = false, |
| doc = "List of the output files of the action."), |
| @Param( |
| name = "inputs", |
| allowedTypes = { |
| @ParamType(type = Sequence.class, generic1 = FileApi.class), |
| @ParamType(type = Depset.class), |
| }, |
| defaultValue = "[]", |
| named = true, |
| positional = false, |
| doc = "List or depset of the input files of the action."), |
| @Param( |
| name = "unused_inputs_list", |
| allowedTypes = { |
| @ParamType(type = FileApi.class), |
| @ParamType(type = NoneType.class), |
| }, |
| named = true, |
| defaultValue = "None", |
| positional = false, |
| doc = |
| "File containing list of inputs unused by the action. " |
| + "" |
| + "<p>The content of this file (generally one of the outputs of the action) " |
| + "corresponds to the list of input files that were not used during the whole " |
| + "action execution. Any change in those files must not affect in any way the " |
| + "outputs of the action."), |
| @Param( |
| name = "executable", |
| allowedTypes = { |
| @ParamType(type = FileApi.class), |
| @ParamType(type = String.class), |
| @ParamType(type = FilesToRunProviderApi.class), |
| }, |
| named = true, |
| positional = false, |
| doc = "The executable file to be called by the action."), |
| @Param( |
| name = "tools", |
| allowedTypes = { |
| @ParamType(type = Sequence.class), |
| @ParamType(type = Depset.class), |
| }, |
| defaultValue = "unbound", |
| named = true, |
| positional = false, |
| doc = |
| "List or depset of any tools needed by the action. Tools are inputs with " |
| + "additional runfiles that are automatically made available to the action. " |
| + "When a list is provided, it can be a heterogenous collection of " |
| + "Files, FilesToRunProvider instances, or depsets of Files. Files which are " |
| + "directly in the list and come from ctx.executable will have their runfiles " |
| + "automatically added. When a depset is provided, it must contain only Files. " |
| + "In both cases, files within depsets are not cross-referenced with " |
| + "ctx.executable for runfiles."), |
| @Param( |
| name = "arguments", |
| // TODO(#13365): improve the @ParamType annotation once it can support multiple |
| // contained types. |
| allowedTypes = {@ParamType(type = Sequence.class)}, |
| defaultValue = "[]", |
| named = true, |
| positional = false, |
| doc = |
| "Command line arguments of the action. " |
| + "Must be a list of strings or " |
| + "<a href=\"#args\"><code>actions.args()</code></a> objects."), |
| @Param( |
| name = "mnemonic", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = "A one-word description of the action, for example, CppCompile or GoLink."), |
| @Param( |
| name = "progress_message", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Progress message to show to the user during the build, for example, \"Compiling" |
| + " foo.cc to create foo.o\". The message may contain <code>%{label}</code>," |
| + " <code>%{input}</code>, or <code>%{output}</code> patterns, which are" |
| + " substituted with label string, first input, or output's path," |
| + " respectively. Prefer to use patterns instead of static strings, because" |
| + " the former are more efficient."), |
| @Param( |
| name = "use_default_shell_env", |
| defaultValue = "False", |
| named = true, |
| positional = false, |
| doc = |
| "Whether the action should use the default shell environment, which consists of a" |
| + " few OS-dependent variables as well as variables set via <a" |
| + " href=\"/reference/command-line-reference#flag--action_env\"><code>--action_env</code></a>.<p>If" |
| + " both <code>use_default_shell_env</code> and <code>env</code> are set to" |
| + " <code>True</code>, values set in <code>env</code> will overwrite the" |
| + " default shell environment if <a " |
| + "href=\"/reference/command-line-reference#flag--incompatible_merge_fixed_and_default_shell_env\"><code>--incompatible_merge_fixed_and_default_shell_env</code></a>" |
| + " is enabled (default). If the flag is not enabled, <code>env</code> is" |
| + " ignored."), |
| @Param( |
| name = "env", |
| allowedTypes = { |
| @ParamType(type = Dict.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Sets the dictionary of environment variables.<p>If both" |
| + " <code>use_default_shell_env</code> and <code>env</code> are set to" |
| + " <code>True</code>, values set in <code>env</code> will overwrite the" |
| + " default shell environment if <a " |
| + "href=\"/reference/command-line-reference#flag--incompatible_merge_fixed_and_default_shell_env\"><code>--incompatible_merge_fixed_and_default_shell_env</code></a>" |
| + " is enabled (default). If the flag is not enabled, <code>env</code> is" |
| + " ignored."), |
| @Param( |
| name = "execution_requirements", |
| allowedTypes = { |
| @ParamType(type = Dict.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Information for scheduling the action. See " |
| + "<a href=\"${link common-definitions#common.tags}\">tags</a> " |
| + "for useful keys."), |
| @Param( |
| // TODO(bazel-team): The name here isn't accurate anymore. |
| // This is technically experimental, so folks shouldn't be too attached, |
| // but consider renaming to be more accurate/opaque. |
| name = "input_manifests", |
| allowedTypes = { |
| @ParamType(type = Sequence.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "(Experimental) sets the input runfiles metadata; " |
| + "they are typically generated by resolve_command."), |
| @Param( |
| name = "exec_group", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Runs the action on the given exec group's execution platform. If" |
| + " none, uses the target's default execution platform."), |
| @Param( |
| name = "shadowed_action", |
| allowedTypes = { |
| @ParamType(type = ActionApi.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Runs the action using the given shadowed action's inputs and" |
| + " environment added to the action's inputs list and environment. The action" |
| + " environment can overwrite any of the shadowed action's environment" |
| + " variables. If none, uses only the action's inputs and given environment."), |
| @Param( |
| name = "resource_set", |
| allowedTypes = { |
| @ParamType(type = StarlarkCallable.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "A callback function that returns a resource set dictionary, used to estimate" |
| + " resource usage at execution time if this action is run locally.<p>The" |
| + " function accepts two positional arguments: a string representing an OS name" |
| + " (e.g. \"osx\"), and an integer representing the number of inputs to the" |
| + " action. The returned dictionary may contain the following entries, each of" |
| + " which may be a float or an int:<ul><li>\"cpu\": number of CPUs; default" |
| + " 1<li>\"memory\": in MB; default 250<li>\"local_test\": number of local" |
| + " tests; default 1</ul><p>If this parameter is set to <code>None</code> or if" |
| + " <code>--experimental_action_resource_set</code> is false, the default" |
| + " values are used.<p>The callback must be top-level (lambda and nested" |
| + " functions aren't allowed)."), |
| @Param( |
| name = "toolchain", |
| allowedTypes = { |
| @ParamType(type = Label.class), |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "unbound", |
| named = true, |
| positional = false, |
| doc = |
| "<p>Toolchain type of the executable or tools used in this action. The parameter" |
| + " must be set, so that, the action executes on the correct execution" |
| + " platform. </p><p>It's a no-op right now, but we recommend to set it when a" |
| + " toolchain is used, because it will be required in the future Bazel" |
| + " releases.</p><p>Note that the rule which creates this action needs to" |
| + " define this toolchain inside its 'rule()' function.</p><p>When `toolchain`" |
| + " and `exec_group` parameters are both set, `exec_group` will be used. An" |
| + " error is raised in case the `exec_group` doesn't specify the same."), |
| }) |
| void run( |
| Sequence<?> outputs, |
| Object inputs, |
| Object unusedInputsList, |
| Object executableUnchecked, |
| Object toolsUnchecked, |
| Sequence<?> arguments, |
| Object mnemonicUnchecked, |
| Object progressMessage, |
| Boolean useDefaultShellEnv, |
| Object envUnchecked, |
| Object executionRequirementsUnchecked, |
| Object inputManifestsUnchecked, |
| Object execGroupUnchecked, |
| Object shadowedAction, |
| Object resourceSetUnchecked, |
| Object toolchainUnchecked) |
| throws EvalException; |
| |
| @StarlarkMethod( |
| name = "run_shell", |
| doc = |
| "Creates an action that runs a shell command. " |
| + "<a href=\"https://github.com/bazelbuild/examples/tree/main/rules/" |
| + "shell_command/rules.bzl\">See example of use</a>.", |
| parameters = { |
| @Param( |
| name = "outputs", |
| allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)}, |
| named = true, |
| positional = false, |
| doc = "List of the output files of the action."), |
| @Param( |
| name = "inputs", |
| allowedTypes = { |
| @ParamType(type = Sequence.class, generic1 = FileApi.class), |
| @ParamType(type = Depset.class), |
| }, |
| defaultValue = "[]", |
| named = true, |
| positional = false, |
| doc = "List or depset of the input files of the action."), |
| @Param( |
| name = "tools", |
| allowedTypes = { |
| @ParamType(type = Sequence.class, generic1 = FileApi.class), |
| @ParamType(type = Depset.class), |
| }, |
| defaultValue = "unbound", |
| named = true, |
| positional = false, |
| doc = |
| "List or depset of any tools needed by the action. Tools are inputs with " |
| + "additional runfiles that are automatically made available to the action. " |
| + "The list can contain Files or FilesToRunProvider instances."), |
| @Param( |
| name = "arguments", |
| // TODO(#13365): improve the @ParamType annotation once it can support multiple |
| // contained types. |
| allowedTypes = {@ParamType(type = Sequence.class)}, |
| defaultValue = "[]", |
| named = true, |
| positional = false, |
| doc = |
| "Command line arguments of the action. Must be a list of strings or " |
| + "<a href=\"#args\"><code>actions.args()</code></a> objects." |
| + "" |
| + "<p>Bazel passes the elements in this attribute as arguments to the command." |
| + "The command can access these arguments using shell variable substitutions " |
| + "such as <code>$1</code>, <code>$2</code>, etc. Note that since Args " |
| + "objects are flattened before indexing, if there is an Args object of " |
| + "unknown size then all subsequent strings will be at unpredictable indices. " |
| + "It may be useful to use <code>$@</code> (to retrieve all arguments) in " |
| + "conjunction with Args objects of indeterminate size." |
| + "" |
| + "<p>In the case where <code>command</code> is a list of strings, this " |
| + "parameter may not be used."), |
| @Param( |
| name = "mnemonic", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = "A one-word description of the action, for example, CppCompile or GoLink."), |
| @Param( |
| name = "command", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = Sequence.class, generic1 = String.class), |
| }, |
| named = true, |
| positional = false, |
| doc = |
| "Shell command to execute. This may either be a string (preferred) or a sequence " |
| + "of strings <b>(deprecated)</b>." |
| + "" |
| + "<p>If <code>command</code> is a string, then it is executed as if by " |
| + "<code>sh -c <command> \"\" <arguments></code> -- that is, the " |
| + "elements in <code>arguments</code> are made available to the command as " |
| + "<code>$1</code>, <code>$2</code> (or <code>%1</code>, <code>%2</code> if " |
| + "using Windows batch), etc. If <code>arguments</code> contains " |
| + "any <a href=\"#args\"><code>actions.args()</code></a> objects, " |
| + "their contents are appended one by one to the command line, so " |
| + "<code>$</code><i>i</i> can refer to individual strings within an Args " |
| + "object. Note that if an Args object of unknown size is passed as part of " |
| + "<code>arguments</code>, then the strings will be at unknown indices; in " |
| + "this case the <code>$@</code> shell substitution (retrieve all arguments) " |
| + "may be useful." |
| + "" |
| + "<p><b>(Deprecated)</b> If <code>command</code> is a sequence of strings, " |
| + "the first item is the executable to run and the remaining items are its " |
| + "arguments. If this form is used, the <code>arguments</code> parameter must " |
| + "not be supplied. <i>Note that this form is deprecated and will soon " |
| + "be removed. It is disabled with `--incompatible_run_shell_command_string`. " |
| + "Use this flag to verify your code is compatible. </i>" |
| + "" |
| + "<p>Bazel uses the same shell to execute the command as it does for " |
| + "genrules."), |
| @Param( |
| name = "progress_message", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Progress message to show to the user during the build, for example, \"Compiling" |
| + " foo.cc to create foo.o\". The message may contain <code>%{label}</code>," |
| + " <code>%{input}</code>, or <code>%{output}</code> patterns, which are" |
| + " substituted with label string, first input, or output's path," |
| + " respectively. Prefer to use patterns instead of static strings, because" |
| + " the former are more efficient."), |
| @Param( |
| name = "use_default_shell_env", |
| defaultValue = "False", |
| named = true, |
| positional = false, |
| doc = |
| "Whether the action should use the default shell environment, which consists of a" |
| + " few OS-dependent variables as well as variables set via <a" |
| + " href=\"/reference/command-line-reference#flag--action_env\"><code>--action_env</code></a>.<p>If" |
| + " both <code>use_default_shell_env</code> and <code>env</code> are set to" |
| + " <code>True</code>, values set in <code>env</code> will overwrite the" |
| + " default shell environment if <a " |
| + "href=\"/reference/command-line-reference#flag--incompatible_merge_fixed_and_default_shell_env\"><code>--incompatible_merge_fixed_and_default_shell_env</code></a>" |
| + " is enabled (default). If the flag is not enabled, <code>env</code> is" |
| + " ignored."), |
| @Param( |
| name = "env", |
| allowedTypes = { |
| @ParamType(type = Dict.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Sets the dictionary of environment variables.<p>If both" |
| + " <code>use_default_shell_env</code> and <code>env</code> are set to" |
| + " <code>True</code>, values set in <code>env</code> will overwrite the" |
| + " default shell environment if <a " |
| + "href=\"/reference/command-line-reference#flag--incompatible_merge_fixed_and_default_shell_env\"><code>--incompatible_merge_fixed_and_default_shell_env</code></a>" |
| + " is enabled (default). If the flag is not enabled, <code>env</code> is" |
| + " ignored."), |
| @Param( |
| name = "execution_requirements", |
| allowedTypes = { |
| @ParamType(type = Dict.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Information for scheduling the action. See " |
| + "<a href=\"${link common-definitions#common.tags}\">tags</a> " |
| + "for useful keys."), |
| @Param( |
| // TODO(bazel-team): The name here isn't accurate anymore. |
| // This is technically experimental, so folks shouldn't be too attached, |
| // but consider renaming to be more accurate/opaque. |
| name = "input_manifests", |
| allowedTypes = { |
| @ParamType(type = Sequence.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "(Experimental) sets the input runfiles metadata; " |
| + "they are typically generated by resolve_command."), |
| @Param( |
| name = "exec_group", |
| allowedTypes = { |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Runs the action on the given exec group's execution platform. If" |
| + " none, uses the target's default execution platform."), |
| @Param( |
| name = "shadowed_action", |
| allowedTypes = { |
| @ParamType(type = ActionApi.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "Runs the action using the given shadowed action's discovered inputs" |
| + " added to the action's inputs list. If none, uses only the action's" |
| + " inputs."), |
| @Param( |
| name = "resource_set", |
| allowedTypes = { |
| @ParamType(type = StarlarkCallable.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "None", |
| named = true, |
| positional = false, |
| doc = |
| "A callback function for estimating resource usage if run locally. See" |
| + "<a href=\"#run.resource_set\"><code>ctx.actions.run()</code></a>."), |
| @Param( |
| name = "toolchain", |
| allowedTypes = { |
| @ParamType(type = Label.class), |
| @ParamType(type = String.class), |
| @ParamType(type = NoneType.class), |
| }, |
| defaultValue = "unbound", |
| named = true, |
| positional = false, |
| doc = |
| "<p>Toolchain type of the executable or tools used in this action. The parameter" |
| + " must be set, so that, the action executes on the correct execution" |
| + " platform. </p><p>It's a no-op right now, but we recommend to set it when a" |
| + " toolchain is used, because it will be required in the future Bazel" |
| + " releases.</p><p>Note that the rule which creates this action needs to" |
| + " define this toolchain inside its 'rule()' function.</p><p>When `toolchain`" |
| + " and `exec_group` parameters are both set, `exec_group` will be used. An" |
| + " error is raised in case the `exec_group` doesn't specify the same." |
| + " toolchain.</p>"), |
| }) |
| void runShell( |
| Sequence<?> outputs, |
| Object inputs, |
| Object toolsUnchecked, |
| Sequence<?> arguments, |
| Object mnemonicUnchecked, |
| Object commandUnchecked, |
| Object progressMessage, |
| Boolean useDefaultShellEnv, |
| Object envUnchecked, |
| Object executionRequirementsUnchecked, |
| Object inputManifestsUnchecked, |
| Object execGroupUnchecked, |
| Object shadowedAction, |
| Object resourceSetUnchecked, |
| Object toolchainUnchecked) |
| throws EvalException; |
| |
| @StarlarkMethod( |
| name = "expand_template", |
| doc = |
| "Creates a template expansion action. When the action is executed, it will " |
| + "generate a file based on a template. Parts of the template will be replaced " |
| + "using the <code>substitutions</code> dictionary, in the order the substitutions " |
| + "are specified. Whenever a key of the dictionary appears in the template (or a " |
| + "result of a previous substitution), it is replaced with the associated value. " |
| + "There is no special syntax for the keys. You may, for example, use curly braces " |
| + "to avoid conflicts (for example, <code>{KEY}</code>). " |
| + "<a href=\"https://github.com/bazelbuild/examples/blob/main/rules/" |
| + "expand_template/hello.bzl\">" |
| + "See example of use</a>.", |
| parameters = { |
| @Param( |
| name = "template", |
| named = true, |
| positional = false, |
| doc = "The template file, which is a UTF-8 encoded text file."), |
| @Param( |
| name = "output", |
| named = true, |
| positional = false, |
| doc = "The output file, which is a UTF-8 encoded text file."), |
| @Param( |
| name = "substitutions", |
| named = true, |
| positional = false, |
| defaultValue = "{}", |
| doc = "Substitutions to make when expanding the template."), |
| @Param( |
| name = "is_executable", |
| defaultValue = "False", |
| named = true, |
| positional = false, |
| doc = "Whether the output file should be executable."), |
| @Param( |
| name = "computed_substitutions", |
| named = true, |
| positional = false, |
| allowedTypes = {@ParamType(type = TemplateDictApi.class)}, |
| defaultValue = "unbound", |
| doc = "Substitutions to make when expanding the template.") |
| }) |
| void expandTemplate( |
| FileApi template, |
| FileApi output, |
| Dict<?, ?> substitutionsUnchecked, |
| Boolean executable, |
| Object computedSubstitutions) |
| throws EvalException; |
| |
| @StarlarkMethod( |
| name = "args", |
| doc = "Returns an Args object that can be used to build memory-efficient command lines.", |
| useStarlarkThread = true) |
| CommandLineArgsApi args(StarlarkThread thread); |
| |
| @StarlarkMethod( |
| name = "template_dict", |
| doc = "Returns a TemplateDict object for memory-efficient template expansion.") |
| TemplateDictApi templateDict(); |
| |
| @StarlarkMethod( |
| name = "declare_shareable_artifact", |
| parameters = { |
| @Param(name = "path"), |
| @Param(name = "artifact_root", defaultValue = "unbound"), |
| }, |
| documented = false, |
| useStarlarkThread = true) |
| FileApi createShareableArtifact(String path, Object root, StarlarkThread thread) |
| throws EvalException; |
| |
| @StarlarkMethod( |
| name = "transform_version_file", |
| documented = false, |
| doc = |
| "Similar to <a href=\"#transform_info_file\">transform_info_file</a>, but transforms <a" |
| + " href='https://bazel.build/rules/lib/builtins/ctx#version_file'>ctx.version_file</a>.", |
| parameters = { |
| @Param( |
| name = "transform_func", |
| doc = TRANSFORM_VERSION_FUNC_DOC, |
| allowedTypes = {@ParamType(type = StarlarkFunction.class)}, |
| positional = false, |
| named = true), |
| @Param( |
| name = "template", |
| doc = TEMPLATE_DOC, |
| allowedTypes = {@ParamType(type = FileApi.class)}, |
| positional = false, |
| named = true), |
| @Param( |
| name = "output_file_name", |
| doc = VERSION_OUTPUT_DOC, |
| allowedTypes = {@ParamType(type = String.class)}, |
| positional = false, |
| named = true), |
| }, |
| useStarlarkThread = true) |
| FileApi transformVersionFile( |
| Object transformFuncObject, |
| Object templateObject, |
| String outputFileName, |
| StarlarkThread thread) |
| throws InterruptedException, EvalException; |
| |
| @StarlarkMethod( |
| name = "transform_info_file", |
| documented = false, |
| doc = |
| "Transforms <a" |
| + " href='https://bazel.build/rules/lib/builtins/ctx#info_file'>ctx.info_file</a> to" |
| + " a language-consumable file and writes its contents to <code>output</code>. Keys" |
| + " and values are transformed by calling the <code>transform_func</code> Starlark" |
| + " method, and the output file format is generated according to the" |
| + " <code>template</code>. Use this call to create an action in an auxiliary rule." |
| + " Create a single target for an auxiliary rule which is then used as an implicit" |
| + " dependency for the main rule. Main rule is the one which needs the transformed" |
| + " <code>info_file</code>. The auxiliary rule should also declare" |
| + " <code>output</code> file to which transformed content is written. The" |
| + " <code>output</code> file is then provided to the dependant main rule. This will" |
| + " avoid action conflicts and duplicated file generations.", |
| parameters = { |
| @Param( |
| name = "transform_func", |
| doc = TRANSFORM_INFO_FUNC_DOC, |
| allowedTypes = {@ParamType(type = StarlarkFunction.class)}, |
| positional = false, |
| named = true), |
| @Param( |
| name = "template", |
| doc = TEMPLATE_DOC, |
| allowedTypes = {@ParamType(type = FileApi.class)}, |
| positional = false, |
| named = true), |
| @Param( |
| name = "output_file_name", |
| doc = INFO_OUTPUT_DOC, |
| allowedTypes = {@ParamType(type = String.class)}, |
| positional = false, |
| named = true), |
| }, |
| useStarlarkThread = true) |
| FileApi transformInfoFile( |
| Object transformFuncObject, |
| Object templateObject, |
| String outputFileName, |
| StarlarkThread thread) |
| throws InterruptedException, EvalException; |
| } |