|  | // 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.skylarkbuildapi; | 
|  |  | 
|  | import com.google.common.collect.ImmutableList; | 
|  | import com.google.devtools.build.lib.cmdline.Label; | 
|  | import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi; | 
|  | import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi; | 
|  | import com.google.devtools.build.lib.skylarkbuildapi.core.TransitiveInfoCollectionApi; | 
|  | import com.google.devtools.build.lib.skylarkbuildapi.platform.ConstraintValueInfoApi; | 
|  | import com.google.devtools.build.lib.skylarkbuildapi.platform.ToolchainContextApi; | 
|  | import com.google.devtools.build.lib.skylarkinterface.Param; | 
|  | import com.google.devtools.build.lib.skylarkinterface.ParamType; | 
|  | import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; | 
|  | import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; | 
|  | import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; | 
|  | import com.google.devtools.build.lib.syntax.ClassObject; | 
|  | import com.google.devtools.build.lib.syntax.Depset; | 
|  | import com.google.devtools.build.lib.syntax.Dict; | 
|  | import com.google.devtools.build.lib.syntax.EvalException; | 
|  | import com.google.devtools.build.lib.syntax.NoneType; | 
|  | import com.google.devtools.build.lib.syntax.Sequence; | 
|  | import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier; | 
|  | import com.google.devtools.build.lib.syntax.StarlarkThread; | 
|  | import com.google.devtools.build.lib.syntax.StarlarkValue; | 
|  | import com.google.devtools.build.lib.syntax.Tuple; | 
|  | import javax.annotation.Nullable; | 
|  |  | 
|  | /** Interface for a context object given to rule implementation functions. */ | 
|  | @SkylarkModule( | 
|  | name = "ctx", | 
|  | category = SkylarkModuleCategory.BUILTIN, | 
|  | doc = | 
|  | "A context object that is passed to the implementation function for a rule or aspect. It" | 
|  | + " provides access to the information and methods needed to analyze the current" | 
|  | + " target.<p>In particular, it lets the implementation function access the current" | 
|  | + " target's label, attributes, configuration, and the providers of its dependencies." | 
|  | + " It has methods for declaring output files and the actions that produce them." | 
|  | + "<p>Context objects essentially live for the duration of the call to the" | 
|  | + " implementation function. It is not useful to access these objects outside of their" | 
|  | + " associated function. See the <a" | 
|  | + " href='../rules.$DOC_EXT#implementation-function'>Rules page</a> for more " | 
|  | + "information.") | 
|  | public interface SkylarkRuleContextApi<ConstraintValueT extends ConstraintValueInfoApi> | 
|  | extends StarlarkValue { | 
|  |  | 
|  | String DOC_NEW_FILE_TAIL = | 
|  | "Does not actually create a file on the file system, just declares that some action will do" | 
|  | + " so. You must create an action that generates the file. If the file should be visible" | 
|  | + " to other rules, declare a rule output instead when possible. Doing so enables Blaze" | 
|  | + " to associate a label with the file that rules can refer to (allowing finer" | 
|  | + " dependency control) instead of referencing the whole rule."; | 
|  | String EXECUTABLE_DOC = | 
|  | "A <code>struct</code> containing executable files defined in <a " | 
|  | + "href='attr.html#label'>label type attributes</a> marked as <a " | 
|  | + "href='attr.html#label.executable'><code>executable=True</code><a>. The struct " | 
|  | + "fields correspond to the attribute names. Each value in the struct is either a <a " | 
|  | + "href='File.html'><code>File</code></a> or <code>None</code>. If an optional " | 
|  | + "attribute is not specified in the rule then the corresponding struct value is " | 
|  | + "<code>None</code>. If a label type is not marked as <code>executable=True</code>, no " | 
|  | + "corresponding struct field is generated. <a " | 
|  | + "href=\"https://github.com/bazelbuild/examples/blob/master/rules/actions_run/" | 
|  | + "execute.bzl\">See example of use</a>."; | 
|  | String FILES_DOC = | 
|  | "A <code>struct</code> containing files defined in <a href='attr.html#label'>label</a>" | 
|  | + " or <a href='attr.html#label_list'>label list</a> type attributes. The struct" | 
|  | + " fields correspond to the attribute names. The struct values are <code>list</code> of" | 
|  | + " <a href='File.html'><code>File</code></a>s.  It is a shortcut for:<pre" | 
|  | + " class=language-python>[f for t in ctx.attr.<ATTR> for f in t.files]</pre> In" | 
|  | + " other words, use <code>files</code> to access the <a" | 
|  | + " href=\"../rules.$DOC_EXT#requesting-output-files\">default outputs</a> of a" | 
|  | + " dependency. <a" | 
|  | + " href=\"https://github.com/bazelbuild/examples/blob/master/rules/depsets/foo.bzl\">See" | 
|  | + " example of use</a>."; | 
|  | String FILE_DOC = | 
|  | "A <code>struct</code> containing files defined in <a href='attr.html#label'>label type" | 
|  | + " attributes</a> marked as <a" | 
|  | + " href='attr.html#label.allow_single_file'><code>allow_single_file</code></a>. The" | 
|  | + " struct fields correspond to the attribute names. The struct value is always a <a" | 
|  | + " href='File.html'><code>File</code></a> or <code>None</code>. If an optional" | 
|  | + " attribute is not specified in the rule then the corresponding struct value is" | 
|  | + " <code>None</code>. If a label type is not marked as <code>allow_single_file</code>," | 
|  | + " no corresponding struct field is generated. It is a shortcut for:<pre" | 
|  | + " class=language-python>list(ctx.attr.<ATTR>.files)[0]</pre>In other words, use" | 
|  | + " <code>file</code> to access the (singular) <a" | 
|  | + " href=\"../rules.$DOC_EXT#requesting-output-files\">default output</a> of a" | 
|  | + " dependency. <a" | 
|  | + " href=\"https://github.com/bazelbuild/examples/blob/master/rules/expand_template/hello.bzl\">See" | 
|  | + " example of use</a>."; | 
|  | String ATTR_DOC = | 
|  | "A struct to access the values of the <a href='../rules.$DOC_EXT#attributes'>attributes</a>. " | 
|  | + "The values are provided by the user (if not, a default value is used). The attributes " | 
|  | + "of the struct and the types of their values correspond to the keys and values of the " | 
|  | + "<a href='globals.html#rule.attrs'><code>attrs</code> dict</a> provided to the <a " | 
|  | + "href='globals.html#rule'><code>rule</code> function</a>. <a " | 
|  | + "href=\"https://github.com/bazelbuild/examples/blob/master/rules/attributes/" | 
|  | + "printer.bzl\">See example of use</a>."; | 
|  | String SPLIT_ATTR_DOC = | 
|  | "A struct to access the values of attributes with split configurations. If the attribute is " | 
|  | + "a label list, the value of split_attr is a dict of the keys of the split (as strings) " | 
|  | + "to lists of the ConfiguredTargets in that branch of the split. If the attribute is a " | 
|  | + "label, then the value of split_attr is a dict of the keys of the split (as strings) " | 
|  | + "to single ConfiguredTargets. Attributes with split configurations still appear in the " | 
|  | + "attr struct, but their values will be single lists with all the branches of the split " | 
|  | + "merged together."; | 
|  | String OUTPUTS_DOC = | 
|  | "A pseudo-struct containing all the predeclared output files, represented by " | 
|  | + "<a href='File.html'><code>File</code></a> objects. See the " | 
|  | + "<a href='../rules.$DOC_EXT#files'>Rules page</a> for more information and examples." | 
|  | + "<p>This field does not exist on aspect contexts, since aspects do not have " | 
|  | + "predeclared outputs." | 
|  | + "<p>The fields of this object are defined as follows. It is an error if two outputs " | 
|  | + "produce the same field name or have the same label." | 
|  | + "<ul>" | 
|  | + "<li>If the rule declares an <a href='globals.html#rule.outputs'><code>outputs</code>" | 
|  | + "</a> dict, then for every entry in the dict, there is a field whose name is the key " | 
|  | + "and whose value is the corresponding <code>File</code>." | 
|  | + "<li>For every attribute of type <a href='attr.html#output'><code>attr.output</code>" | 
|  | + "</a> that the rule declares, there is a field whose name is the attribute's name. " | 
|  | + "If the target specified a label for that attribute, then the field value is the " | 
|  | + "corresponding <code>File</code>; otherwise the field value is <code>None</code>." | 
|  | + "<li>For every attribute of type <a href='attr.html#output_list'><code>attr.output_list" | 
|  | + "</code></a> that the rule declares, there is a field whose name is the attribute's " | 
|  | + "name. The field value is a list of <code>File</code> objects corresponding to the " | 
|  | + "labels given for that attribute in the target, or an empty list if the attribute was " | 
|  | + "not specified in the target." | 
|  | + "<li><b>(Deprecated)</b> If the rule is marked <a href='globals.html#rule.executable'>" | 
|  | + "<code>executable</code></a> or <a href='globals.html#rule.test'><code>test</code>" | 
|  | + "</a>, there is a field named <code>\"executable\"</code>, which is the default " | 
|  | + "executable. It is recommended that instead of using this, you pass another file " | 
|  | + "(either predeclared or not) to the <code>executable</code> arg of " | 
|  | + "<a href='DefaultInfo.html'><code>DefaultInfo</code></a>." | 
|  | + "</ul>"; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "default_provider", | 
|  | structField = true, | 
|  | doc = "Deprecated. Use <a href=\"DefaultInfo.html\">DefaultInfo</a> instead.") | 
|  | ProviderApi getDefaultProvider(); | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "actions", | 
|  | structField = true, | 
|  | doc = "Contains methods for declaring output files and the actions that produce them.") | 
|  | SkylarkActionFactoryApi actions(); | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "created_actions", | 
|  | doc = | 
|  | "For rules with <a href=\"globals.html#rule._skylark_testable\">_skylark_testable</a>" | 
|  | + " set to <code>True</code>, this returns an <a" | 
|  | + " href=\"globals.html#Actions\">Actions</a> provider representing all actions" | 
|  | + " created so far for the current rule. For all other rules, returns" | 
|  | + " <code>None</code>. Note that the provider is not updated when subsequent actions" | 
|  | + " are created, so you will have to call this function again if you wish to inspect" | 
|  | + " them. <br/><br/>This is intended to help write tests for rule-implementation" | 
|  | + " helper functions, which may take in a <code>ctx</code> object and create actions" | 
|  | + " on it.") | 
|  | StarlarkValue createdActions() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable(name = "attr", structField = true, doc = ATTR_DOC) | 
|  | StructApi getAttr() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable(name = "split_attr", structField = true, doc = SPLIT_ATTR_DOC) | 
|  | StructApi getSplitAttr() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable(name = "executable", structField = true, doc = EXECUTABLE_DOC) | 
|  | StructApi getExecutable() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable(name = "file", structField = true, doc = FILE_DOC) | 
|  | StructApi getFile() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable(name = "files", structField = true, doc = FILES_DOC) | 
|  | StructApi getFiles() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "workspace_name", | 
|  | structField = true, | 
|  | doc = "Returns the workspace name as defined in the WORKSPACE file.") | 
|  | String getWorkspaceName() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "label", | 
|  | structField = true, | 
|  | doc = "The label of the target currently being analyzed.") | 
|  | Label getLabel() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "fragments", | 
|  | structField = true, | 
|  | doc = "Allows access to configuration fragments in target configuration.") | 
|  | FragmentCollectionApi getFragments() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "host_fragments", | 
|  | structField = true, | 
|  | doc = "Allows access to configuration fragments in host configuration.") | 
|  | FragmentCollectionApi getHostFragments() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "configuration", | 
|  | structField = true, | 
|  | doc = | 
|  | "Returns the default configuration. See the <a href=\"configuration.html\">" | 
|  | + "configuration</a> type for more details.") | 
|  | BuildConfigurationApi getConfiguration() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "host_configuration", | 
|  | structField = true, | 
|  | doc = | 
|  | "Returns the host configuration. See the <a href=\"configuration.html\">" | 
|  | + "configuration</a> type for more details.") | 
|  | BuildConfigurationApi getHostConfiguration() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "build_setting_value", | 
|  | structField = true, | 
|  | enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_BUILD_SETTING_API, | 
|  | doc = | 
|  | "<b>Experimental. This field is experimental and subject to change at any time. Do not " | 
|  | + "depend on it.</b> <p>Returns the value of the build setting that is represented " | 
|  | + "by the current target. It is an error to access this field for rules that do not " | 
|  | + "set the <code>build_setting</code> attribute in their rule definition.") | 
|  | Object getBuildSettingValue() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "coverage_instrumented", | 
|  | doc = | 
|  | "Returns whether code coverage instrumentation should be generated when performing " | 
|  | + "compilation actions for this rule or, if <code>target</code> is provided, the " | 
|  | + "rule specified by that Target. (If a non-rule or a Starlark rule Target is " | 
|  | + "provided, this returns False.) Checks if the sources of the current rule " | 
|  | + "(if no Target is provided) or the sources of Target should be instrumented " | 
|  | + "based on the --instrumentation_filter and " | 
|  | + "--instrument_test_targets config settings. " | 
|  | + "This differs from <code>coverage_enabled</code> in the " | 
|  | + "<a href=\"configuration.html\">configuration</a>, which notes whether coverage " | 
|  | + "data collection is enabled for the entire run, but not whether a specific " | 
|  | + "target should be instrumented.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "target", | 
|  | type = TransitiveInfoCollectionApi.class, | 
|  | defaultValue = "None", | 
|  | noneable = true, | 
|  | named = true, | 
|  | doc = "A Target specifying a rule. If not provided, defaults to the current rule.") | 
|  | }) | 
|  | boolean instrumentCoverage(Object targetUnchecked) throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "features", | 
|  | structField = true, | 
|  | doc = "Returns the set of features that are explicitly enabled by the user for this rule.") | 
|  | ImmutableList<String> getFeatures() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "disabled_features", | 
|  | structField = true, | 
|  | doc = "Returns the set of features that are explicitly disabled by the user for this rule.") | 
|  | ImmutableList<String> getDisabledFeatures() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "bin_dir", | 
|  | structField = true, | 
|  | doc = "The root corresponding to bin directory.") | 
|  | FileRootApi getBinDirectory() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "genfiles_dir", | 
|  | structField = true, | 
|  | doc = "The root corresponding to genfiles directory.") | 
|  | FileRootApi getGenfilesDirectory() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable(name = "outputs", structField = true, doc = OUTPUTS_DOC) | 
|  | ClassObject outputs() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "rule", | 
|  | structField = true, | 
|  | doc = | 
|  | "Returns rule attributes descriptor for the rule that aspect is applied to." | 
|  | + " Only available in aspect implementation functions.") | 
|  | SkylarkAttributesCollectionApi rule() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "aspect_ids", | 
|  | structField = true, | 
|  | doc = | 
|  | "Returns a list ids for all aspects applied to the target." | 
|  | + " Only available in aspect implementation functions.") | 
|  | ImmutableList<String> aspectIds() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "var", | 
|  | structField = true, | 
|  | doc = "Dictionary (String to String) of configuration variables.") | 
|  | Dict<String, String> var() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "toolchains", | 
|  | structField = true, | 
|  | doc = "Toolchains required for this rule.") | 
|  | ToolchainContextApi toolchains() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "target_platform_has_constraint", | 
|  | doc = "Returns true if the given constraint value is part of the current target platform.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "constraintValue", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = ConstraintValueInfoApi.class, | 
|  | doc = "The constraint value to check the target platform against.") | 
|  | }) | 
|  | boolean targetPlatformHasConstraint(ConstraintValueT constraintValue); | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "tokenize", | 
|  | doc = "Splits a shell command into a list of tokens.", | 
|  | // TODO(cparsons): Look into flipping this to true. | 
|  | documented = false, | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "option", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = String.class, | 
|  | doc = "The string to split."), | 
|  | }) | 
|  | Sequence<String> tokenize(String optionString) throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "expand", | 
|  | doc = | 
|  | "Expands all references to labels embedded within a string for all files using a mapping " | 
|  | + "from definition labels (i.e. the label in the output type attribute) to files. " | 
|  | + "Deprecated.", | 
|  | // TODO(cparsons): Look into flipping this to true. | 
|  | documented = false, | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "expression", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = String.class, | 
|  | doc = "The string expression to expand."), | 
|  | @Param( | 
|  | name = "files", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = Sequence.class, | 
|  | doc = "The list of files."), | 
|  | @Param( | 
|  | name = "label_resolver", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = Label.class, | 
|  | doc = "The label resolver."), | 
|  | }) | 
|  | String expand( | 
|  | @Nullable String expression, | 
|  | Sequence<?> artifacts, // <FileT> | 
|  | Label labelResolver) | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "new_file", | 
|  | doc = | 
|  | "DEPRECATED. Use <a href=\"actions.html#declare_file\">ctx.actions.declare_file</a>. <br>" | 
|  | + "Creates a file object. There are four possible signatures to this method:<br><ul>" | 
|  | + "" | 
|  | + "<li>new_file(filename): Creates a file object with the given filename in the " | 
|  | + "current package.</li>" | 
|  | + "" | 
|  | + "<li>new_file(file_root, filename): Creates a file object with the given " | 
|  | + "filename under the given file root.</li>" | 
|  | + "" | 
|  | + "<li>new_file(sibling_file, filename): Creates a file object in the same " | 
|  | + "directory as the given sibling file.</li>" | 
|  | + "" | 
|  | + "<li>new_file(file_root, sibling_file, suffix): Creates a file object with same " | 
|  | + "base name of the sibling_file but with different given suffix, under the given " | 
|  | + "file root.</li></ul> <br>" | 
|  | + DOC_NEW_FILE_TAIL, | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "var1", | 
|  | allowedTypes = { | 
|  | @ParamType(type = String.class), | 
|  | @ParamType(type = FileRootApi.class), | 
|  | @ParamType(type = FileApi.class), | 
|  | }, | 
|  | doc = ""), | 
|  | @Param( | 
|  | name = "var2", | 
|  | allowedTypes = { | 
|  | @ParamType(type = String.class), | 
|  | @ParamType(type = FileApi.class), | 
|  | }, | 
|  | defaultValue = "unbound", | 
|  | doc = ""), | 
|  | @Param( | 
|  | name = "var3", | 
|  | allowedTypes = { | 
|  | @ParamType(type = String.class), | 
|  | }, | 
|  | defaultValue = "unbound", | 
|  | doc = "") | 
|  | }) | 
|  | FileApi newFile(Object var1, Object var2, Object var3) throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "experimental_new_directory", | 
|  | documented = false, | 
|  | parameters = { | 
|  | @Param(name = "name", type = String.class), | 
|  | @Param( | 
|  | name = "sibling", | 
|  | type = FileApi.class, | 
|  | defaultValue = "None", | 
|  | noneable = true, | 
|  | named = true) | 
|  | }) | 
|  | FileApi newDirectory(String name, Object siblingArtifactUnchecked) throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "check_placeholders", | 
|  | documented = false, | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "template", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = String.class, | 
|  | doc = "The template."), | 
|  | @Param( | 
|  | name = "allowed_placeholders", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = Sequence.class, | 
|  | doc = "The allowed placeholders."), | 
|  | }) | 
|  | boolean checkPlaceholders(String template, Sequence<?> allowedPlaceholders) // <String> | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "expand_make_variables", | 
|  | doc = | 
|  | "<b>Deprecated.</b> Use <a href=\"ctx.html#var\">ctx.var</a> to access the variables " | 
|  | + "instead.<br>Returns a string after expanding all references to \"Make " | 
|  | + "variables\". The " | 
|  | + "variables must have the following format: <code>$(VAR_NAME)</code>. Also, " | 
|  | + "<code>$$VAR_NAME</code> expands to <code>$VAR_NAME</code>. " | 
|  | + "Examples:" | 
|  | + "<pre class=language-python>\n" | 
|  | + "ctx.expand_make_variables(\"cmd\", \"$(MY_VAR)\", {\"MY_VAR\": \"Hi\"})  " | 
|  | + "# == \"Hi\"\n" | 
|  | + "ctx.expand_make_variables(\"cmd\", \"$$PWD\", {})  # == \"$PWD\"\n" | 
|  | + "</pre>" | 
|  | + "Additional variables may come from other places, such as configurations. Note " | 
|  | + "that this function is experimental.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "attribute_name", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = String.class, | 
|  | doc = "The attribute name. Used for error reporting."), | 
|  | @Param( | 
|  | name = "command", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = String.class, | 
|  | doc = | 
|  | "The expression to expand. It can contain references to " + "\"Make variables\"."), | 
|  | @Param( | 
|  | name = "additional_substitutions", | 
|  | positional = true, | 
|  | named = false, | 
|  | type = Dict.class, | 
|  | doc = "Additional substitutions to make beyond the default make variables."), | 
|  | }) | 
|  | String expandMakeVariables( | 
|  | String attributeName, | 
|  | String command, | 
|  | final Dict<?, ?> additionalSubstitutions) // <String, String> | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "info_file", | 
|  | structField = true, | 
|  | documented = false, | 
|  | doc = | 
|  | "Returns the file that is used to hold the non-volatile workspace status for the " | 
|  | + "current build request.") | 
|  | FileApi getStableWorkspaceStatus() throws InterruptedException, EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "version_file", | 
|  | structField = true, | 
|  | documented = false, | 
|  | doc = | 
|  | "Returns the file that is used to hold the volatile workspace status for the " | 
|  | + "current build request.") | 
|  | FileApi getVolatileWorkspaceStatus() throws InterruptedException, EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "build_file_path", | 
|  | structField = true, | 
|  | documented = true, | 
|  | doc = "Returns path to the BUILD file for this rule, relative to the source root.") | 
|  | String getBuildFileRelativePath() throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "action", | 
|  | doc = | 
|  | "DEPRECATED. Use <a href=\"actions.html#run\">ctx.actions.run()</a> or" | 
|  | + " <a href=\"actions.html#run_shell\">ctx.actions.run_shell()</a>. <br>" | 
|  | + "Creates an action that runs an executable or a shell command." | 
|  | + " You must specify either <code>command</code> or <code>executable</code>.\n" | 
|  | + "Actions and genrules are very similar, but have different use cases. Actions are " | 
|  | + "used inside rules, and genrules are used inside macros. Genrules also have make " | 
|  | + "variable expansion.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "outputs", | 
|  | 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), | 
|  | @ParamType(type = Depset.class), | 
|  | }, | 
|  | generic1 = FileApi.class, | 
|  | defaultValue = "[]", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "List of the input files of the action."), | 
|  | @Param( | 
|  | name = "executable", | 
|  | type = Object.class, | 
|  | allowedTypes = { | 
|  | @ParamType(type = FileApi.class), | 
|  | @ParamType(type = String.class), | 
|  | @ParamType(type = NoneType.class), | 
|  | }, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | 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), | 
|  | }, | 
|  | generic1 = FileApi.class, | 
|  | defaultValue = "unbound", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "List of the any tools needed by the action. Tools are inputs with additional " | 
|  | + "runfiles that are automatically made available to the action."), | 
|  | @Param( | 
|  | name = "arguments", | 
|  | allowedTypes = { | 
|  | @ParamType(type = Sequence.class), | 
|  | }, | 
|  | defaultValue = "[]", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "Command line arguments of the action. Must be a list of strings or actions.args() " | 
|  | + "objects."), | 
|  | @Param( | 
|  | name = "mnemonic", | 
|  | type = String.class, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "A one-word description of the action, e.g. CppCompile or GoLink."), | 
|  | @Param( | 
|  | name = "command", | 
|  | type = Object.class, | 
|  | allowedTypes = { | 
|  | @ParamType(type = String.class), | 
|  | @ParamType(type = Sequence.class, generic1 = String.class), | 
|  | @ParamType(type = NoneType.class), | 
|  | }, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "Shell command to execute. It is usually preferable to " | 
|  | + "use <code>executable</code> instead. " | 
|  | + "Arguments are available with <code>$1</code>, <code>$2</code>, etc."), | 
|  | @Param( | 
|  | name = "progress_message", | 
|  | type = String.class, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "Progress message to show to the user during the build, " | 
|  | + "e.g. \"Compiling foo.cc to create foo.o\"."), | 
|  | @Param( | 
|  | name = "use_default_shell_env", | 
|  | type = Boolean.class, | 
|  | defaultValue = "False", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "Whether the action should use the built in shell environment or not."), | 
|  | @Param( | 
|  | name = "env", | 
|  | type = Dict.class, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "Sets the dictionary of environment variables."), | 
|  | @Param( | 
|  | name = "execution_requirements", | 
|  | type = Dict.class, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "Information for scheduling the action. See " | 
|  | + "<a href=\"$BE_ROOT/common-definitions.html#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", | 
|  | type = Sequence.class, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "(Experimental) sets the input runfiles metadata; " | 
|  | + "they are typically generated by resolve_command.") | 
|  | }, | 
|  | allowReturnNones = true, | 
|  | useStarlarkThread = true) | 
|  | NoneType action( | 
|  | Sequence<?> outputs, | 
|  | Object inputs, | 
|  | Object executableUnchecked, | 
|  | Object toolsUnchecked, | 
|  | Object arguments, | 
|  | Object mnemonicUnchecked, | 
|  | Object commandUnchecked, | 
|  | Object progressMessage, | 
|  | Boolean useDefaultShellEnv, | 
|  | Object envUnchecked, | 
|  | Object executionRequirementsUnchecked, | 
|  | Object inputManifestsUnchecked, | 
|  | StarlarkThread thread) | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "expand_location", | 
|  | doc = | 
|  | "Expands all <code>$(location ...)</code> templates in the given string by replacing " | 
|  | + "<code>$(location //x)</code> with the path of the output file of target //x. " | 
|  | + "Expansion only works for labels that point to direct dependencies of this rule or " | 
|  | + "that are explicitly listed in the optional argument <code>targets</code>. " | 
|  | + "<br/><br/>" | 
|  | // | 
|  | + "<code>$(location ...)</code> will cause an error if the referenced target has " | 
|  | + "multiple outputs. In this case, please use <code>$(locations ...)</code> since it " | 
|  | + "produces a space-separated list of output paths. It can be safely used for a " | 
|  | + "single output file, too." | 
|  | + "<br/><br/>" | 
|  | // | 
|  | + "This function is useful to let the user specify a command in a BUILD file (like" | 
|  | + " for <code>genrule</code>). In other cases, it is often better to manipulate" | 
|  | + " labels directly.", | 
|  | parameters = { | 
|  | @Param(name = "input", type = String.class, doc = "String to be expanded."), | 
|  | @Param( | 
|  | name = "targets", | 
|  | type = Sequence.class, | 
|  | generic1 = TransitiveInfoCollectionApi.class, | 
|  | defaultValue = "[]", | 
|  | named = true, | 
|  | doc = "List of targets for additional lookup information."), | 
|  | }, | 
|  | allowReturnNones = true, | 
|  | useStarlarkThread = true) | 
|  | String expandLocation(String input, Sequence<?> targets, StarlarkThread thread) | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "file_action", | 
|  | doc = | 
|  | "DEPRECATED. Use <a href =\"actions.html#write\">ctx.actions.write</a> instead. <br>" | 
|  | + "Creates a file write action.", | 
|  | parameters = { | 
|  | @Param(name = "output", type = FileApi.class, named = true, doc = "The output file."), | 
|  | @Param( | 
|  | name = "content", | 
|  | type = String.class, | 
|  | named = true, | 
|  | doc = "The contents of the file."), | 
|  | @Param( | 
|  | name = "executable", | 
|  | type = Boolean.class, | 
|  | defaultValue = "False", | 
|  | named = true, | 
|  | doc = "Whether the output file should be executable (default is False).") | 
|  | }, | 
|  | allowReturnNones = true, | 
|  | useStarlarkThread = true) | 
|  | NoneType fileAction(FileApi output, String content, Boolean executable, StarlarkThread thread) | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "empty_action", | 
|  | doc = | 
|  | "DEPRECATED. Use <a href=\"actions.html#do_nothing\">ctx.actions.do_nothing</a> instead." | 
|  | + " <br>" | 
|  | + "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", | 
|  | type = String.class, | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "A one-word description of the action, e.g. CppCompile or GoLink."), | 
|  | @Param( | 
|  | name = "inputs", | 
|  | allowedTypes = { | 
|  | @ParamType(type = Sequence.class), | 
|  | @ParamType(type = Depset.class), | 
|  | }, | 
|  | generic1 = FileApi.class, | 
|  | named = true, | 
|  | positional = false, | 
|  | defaultValue = "[]", | 
|  | doc = "List of the input files of the action."), | 
|  | }, | 
|  | allowReturnNones = true, | 
|  | useStarlarkThread = true) | 
|  | NoneType emptyAction(String mnemonic, Object inputs, StarlarkThread thread) throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "template_action", | 
|  | doc = | 
|  | "DEPRECATED. " | 
|  | + "Use <a href=\"actions.html#expand_template\">ctx.actions.expand_template()</a> " | 
|  | + "instead. <br>Creates a template expansion action.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "template", | 
|  | type = FileApi.class, | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "The template file, which is a UTF-8 encoded text file."), | 
|  | @Param( | 
|  | name = "output", | 
|  | type = FileApi.class, | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "The output file, which is a UTF-8 encoded text file."), | 
|  | @Param( | 
|  | name = "substitutions", | 
|  | type = Dict.class, | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "Substitutions to make when expanding the template."), | 
|  | @Param( | 
|  | name = "executable", | 
|  | type = Boolean.class, | 
|  | defaultValue = "False", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "Whether the output file should be executable (default is False).") | 
|  | }, | 
|  | allowReturnNones = true, | 
|  | useStarlarkThread = true) | 
|  | NoneType templateAction( | 
|  | FileApi template, | 
|  | FileApi output, | 
|  | Dict<?, ?> substitutionsUnchecked, | 
|  | Boolean executable, | 
|  | StarlarkThread thread) | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "runfiles", | 
|  | doc = "Creates a runfiles object.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "files", | 
|  | type = Sequence.class, | 
|  | generic1 = FileApi.class, | 
|  | named = true, | 
|  | defaultValue = "[]", | 
|  | doc = "The list of files to be added to the runfiles."), | 
|  | // TODO(bazel-team): If we have a memory efficient support for lazy list containing | 
|  | // NestedSets we can remove this and just use files = [file] + list(set) | 
|  | // Also, allow empty set for init | 
|  | @Param( | 
|  | name = "transitive_files", | 
|  | type = Depset.class, | 
|  | generic1 = FileApi.class, | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | doc = | 
|  | "The (transitive) set of files to be added to the runfiles. The depset should " | 
|  | + "use the <code>default</code> order (which, as the name implies, is the " | 
|  | + "default)."), | 
|  | @Param( | 
|  | name = "collect_data", | 
|  | type = Boolean.class, | 
|  | defaultValue = "False", | 
|  | named = true, | 
|  | doc = | 
|  | "<b>Use of this parameter is not recommended. See " | 
|  | + "<a href=\"../rules.html#runfiles\">runfiles guide</a></b>. " | 
|  | + "<p>Whether to collect the data " | 
|  | + "runfiles from the dependencies in srcs, data and deps attributes."), | 
|  | @Param( | 
|  | name = "collect_default", | 
|  | type = Boolean.class, | 
|  | defaultValue = "False", | 
|  | named = true, | 
|  | doc = | 
|  | "<b>Use of this parameter is not recommended. See " | 
|  | + "<a href=\"../rules.html#runfiles\">runfiles guide</a></b>. " | 
|  | + "<p>Whether to collect the default " | 
|  | + "runfiles from the dependencies in srcs, data and deps attributes."), | 
|  | @Param( | 
|  | name = "symlinks", | 
|  | type = Dict.class, | 
|  | defaultValue = "{}", | 
|  | named = true, | 
|  | doc = "The map of symlinks to be added to the runfiles, prefixed by workspace name."), | 
|  | @Param( | 
|  | name = "root_symlinks", | 
|  | type = Dict.class, | 
|  | defaultValue = "{}", | 
|  | named = true, | 
|  | doc = "The map of symlinks to be added to the runfiles.") | 
|  | }) | 
|  | RunfilesApi runfiles( | 
|  | Sequence<?> files, | 
|  | Object transitiveFiles, | 
|  | Boolean collectData, | 
|  | Boolean collectDefault, | 
|  | Dict<?, ?> symlinks, | 
|  | Dict<?, ?> rootSymlinks) | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "resolve_command", | 
|  | // TODO(bazel-team): The naming here isn't entirely accurate (input_manifests is no longer | 
|  | // manifests), but this is experimental/should be opaque to the end user. | 
|  | doc = | 
|  | "<i>(Experimental)</i> Returns a tuple <code>(inputs, command, input_manifests)</code>" | 
|  | + " of the list of resolved inputs, the argv list for the resolved command, and the" | 
|  | + " runfiles metadata required to run the command, all of them suitable for passing" | 
|  | + " as the same-named arguments of the <code>ctx.action</code> method.<br/><b>Note" | 
|  | + " for Windows users</b>: this method requires Bash (MSYS2). Consider using" | 
|  | + " <code>resolve_tools()</code> instead (if that fits your needs).", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "command", | 
|  | type = String.class, // string | 
|  | defaultValue = "''", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "Command to resolve."), | 
|  | @Param( | 
|  | name = "attribute", | 
|  | type = String.class, // string | 
|  | defaultValue = "None", | 
|  | noneable = true, | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "Name of the associated attribute for which to issue an error, or None."), | 
|  | @Param( | 
|  | name = "expand_locations", | 
|  | type = Boolean.class, | 
|  | defaultValue = "False", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "Shall we expand $(location) variables? See <a" | 
|  | + " href=\"#expand_location\">ctx.expand_location()</a> for more details."), | 
|  | @Param( | 
|  | name = "make_variables", | 
|  | type = Dict.class, // dict(string, string) | 
|  | noneable = true, | 
|  | defaultValue = "None", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "Make variables to expand, or None."), | 
|  | @Param( | 
|  | name = "tools", | 
|  | defaultValue = "[]", | 
|  | type = Sequence.class, | 
|  | generic1 = TransitiveInfoCollectionApi.class, | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "List of tools (list of targets)."), | 
|  | @Param( | 
|  | name = "label_dict", | 
|  | type = Dict.class, | 
|  | defaultValue = "{}", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "Dictionary of resolved labels and the corresponding list of Files " | 
|  | + "(a dict of Label : list of Files)."), | 
|  | @Param( | 
|  | name = "execution_requirements", | 
|  | type = Dict.class, | 
|  | defaultValue = "{}", | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = | 
|  | "Information for scheduling the action to resolve this command. See " | 
|  | + "<a href=\"$BE_ROOT/common-definitions.html#common.tags\">tags</a> " | 
|  | + "for useful keys."), | 
|  | }, | 
|  | useStarlarkThread = true) | 
|  | Tuple<Object> resolveCommand( | 
|  | String command, | 
|  | Object attributeUnchecked, | 
|  | Boolean expandLocations, | 
|  | Object makeVariablesUnchecked, | 
|  | Sequence<?> tools, | 
|  | Dict<?, ?> labelDictUnchecked, | 
|  | Dict<?, ?> executionRequirementsUnchecked, | 
|  | StarlarkThread thread) | 
|  | throws EvalException; | 
|  |  | 
|  | @SkylarkCallable( | 
|  | name = "resolve_tools", | 
|  | doc = | 
|  | "Returns a tuple <code>(inputs, input_manifests)</code> of the depset of resolved inputs" | 
|  | + " and the runfiles metadata required to run the tools, both of them suitable for" | 
|  | + " passing as the same-named arguments of the <code>ctx.actions.run</code> method." | 
|  | + "<br/><br/>In contrast to <code>ctx.resolve_command</code>, this method does not" | 
|  | + " require that Bash be installed on the machine, so it's suitable for rules built" | 
|  | + " on Windows.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "tools", | 
|  | defaultValue = "[]", | 
|  | type = Sequence.class, | 
|  | generic1 = TransitiveInfoCollectionApi.class, | 
|  | named = true, | 
|  | positional = false, | 
|  | doc = "List of tools (list of targets)."), | 
|  | }) | 
|  | Tuple<Object> resolveTools(Sequence<?> tools) throws EvalException; | 
|  | } |