diff options
author | cparsons <cparsons@google.com> | 2018-05-11 11:54:17 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-05-11 11:56:04 -0700 |
commit | abbb9002c41bbd53588e7249756aab236f6fcb4b (patch) | |
tree | cef41e8fe2b6cce4d8692d2c2dc286dd046b6b94 /src/main/java/com/google/devtools/build/lib/skylarkbuildapi | |
parent | 0565a930c218f9686c8bb11023cc10348cd16ed8 (diff) |
Migrate SkylarkRuleContext (and a few dependencies) to the build API
RELNOTES: None.
PiperOrigin-RevId: 196287081
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skylarkbuildapi')
5 files changed, 1111 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java new file mode 100644 index 0000000000..ad73c80e88 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java @@ -0,0 +1,69 @@ +// 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.ImmutableMap; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; + +/** Interface for a configuration object which holds information about the build environment. */ +@SkylarkModule( + name = "configuration", + category = SkylarkModuleCategory.BUILTIN, + doc = "This object holds information about the environment in which the build is running. See " + + "the <a href='../rules.$DOC_EXT#configurations'>Rules page</a> for more on the general " + + "concept of configurations." +) +public interface BuildConfigurationApi { + + @SkylarkCallable(name = "bin_dir", structField = true, documented = false) + @Deprecated + public FileRootApi getBinDirectory(); + + @SkylarkCallable(name = "genfiles_dir", structField = true, documented = false) + @Deprecated + public FileRootApi getGenfilesDirectory(); + + @SkylarkCallable(name = "host_path_separator", structField = true, + doc = "Returns the separator for PATH environment variable, which is ':' on Unix.") + public String getHostPathSeparator(); + + @SkylarkCallable( + name = "default_shell_env", + structField = true, + doc = + "A dictionary representing the static local shell environment. It maps variables " + + "to their values (strings)." + ) + @Deprecated // Use getActionEnvironment instead. + public ImmutableMap<String, String> getLocalShellEnvironment(); + + @SkylarkCallable( + name = "test_env", + structField = true, + doc = + "A dictionary containing user-specified test environment variables and their values, " + + "as set by the --test_env options. DO NOT USE! This is not the complete environment!" + ) + public ImmutableMap<String, String> getTestEnv(); + + @SkylarkCallable(name = "coverage_enabled", structField = true, + doc = "A boolean that tells whether code coverage is enabled for this run. Note that this " + + "does not compute whether a specific rule should be instrumented for code coverage " + + "data collection. For that, see the <a href=\"ctx.html#coverage_instrumented\"><code>" + + "ctx.coverage_instrumented</code></a> function.") + public boolean isCodeCoverageEnabled(); +} diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java new file mode 100644 index 0000000000..5ddc5da973 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java @@ -0,0 +1,34 @@ +// 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.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; +import com.google.devtools.build.lib.syntax.ClassObject; + +/** Represents a collection of configuration fragments in Skylark. */ +@SkylarkModule( + name = "fragments", + category = SkylarkModuleCategory.NONE, + doc = + "Possible fields are " + + "<a href=\"android.html\">android</a>, <a href=\"apple.html\">apple</a>, " + + "<a href=\"cpp.html\">cpp</a>, <a href=\"java.html\">java</a>, " + + "<a href=\"jvm.html\">jvm</a>, and <a href=\"objc.html\">objc</a>. " + + "Access a specific fragment by its field name " + + "ex:</p><code>ctx.fragments.apple</code></p>" + + "Note that rules have to declare their required fragments in order to access them " + + "(see <a href=\"../rules.md#fragments\">here</a>).") +public interface FragmentCollectionApi extends ClassObject {} diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttributesCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttributesCollectionApi.java new file mode 100644 index 0000000000..7092b70338 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttributesCollectionApi.java @@ -0,0 +1,54 @@ +// 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.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.skylarkinterface.SkylarkValue; +import com.google.devtools.build.lib.syntax.EvalException; + +/** + * Interface for a type containing information about the attributes of a rule. + */ +@SkylarkModule( + name = "rule_attributes", + category = SkylarkModuleCategory.NONE, + doc = "Information about attributes of a rule an aspect is applied to." +) +public interface SkylarkAttributesCollectionApi extends SkylarkValue { + + @SkylarkCallable(name = "attr", structField = true, doc = SkylarkRuleContextApi.ATTR_DOC) + public StructApi getAttr() throws EvalException; + + @SkylarkCallable( + name = "executable", + structField = true, + doc = SkylarkRuleContextApi.EXECUTABLE_DOC) + public StructApi getExecutable() throws EvalException; + + @SkylarkCallable(name = "file", structField = true, doc = SkylarkRuleContextApi.FILE_DOC) + public StructApi getFile() throws EvalException; + + @SkylarkCallable(name = "files", structField = true, doc = SkylarkRuleContextApi.FILES_DOC) + public StructApi getFiles() throws EvalException; + + @SkylarkCallable( + name = "kind", + structField = true, + doc = "The kind of a rule, such as 'cc_library'" + ) + public String getRuleClassName() throws EvalException; +} diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java new file mode 100644 index 0000000000..64b50ebdb5 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java @@ -0,0 +1,896 @@ +// 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.events.Location; +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.skylarkinterface.SkylarkValue; +import com.google.devtools.build.lib.syntax.ClassObject; +import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.FuncallExpression.FuncallException; +import com.google.devtools.build.lib.syntax.Runtime; +import com.google.devtools.build.lib.syntax.SkylarkDict; +import com.google.devtools.build.lib.syntax.SkylarkIndexable; +import com.google.devtools.build.lib.syntax.SkylarkList; +import com.google.devtools.build.lib.syntax.SkylarkList.Tuple; +import com.google.devtools.build.lib.syntax.SkylarkNestedSet; +import java.util.Map; +import javax.annotation.Nullable; + +/** Interface for a context object given to rule implementation functions. */ +@SkylarkModule( + name = "ctx", + category = SkylarkModuleCategory.BUILTIN, + doc = "The context of the rule containing helper functions and " + + "information about attributes, depending targets and outputs. " + + "You get a ctx object as an argument to the <code>implementation</code> function when " + + "you create a rule.") +public interface SkylarkRuleContextApi extends SkylarkValue { + + public static final 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."; + public static final String EXECUTABLE_DOC = + "A <code>struct</code> containing executable files defined in label type " + + "attributes marked as <code>executable=True</code>. The struct fields correspond " + + "to the attribute names. Each value in the struct is either a <code>file</code> 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>."; + public static final String FILES_DOC = + "A <code>struct</code> containing files defined in label or label list " + + "type attributes. The struct fields correspond to the attribute names. The struct " + + "values are <code>list</code> of <code>file</code>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>."; + public static final String FILE_DOC = + "A <code>struct</code> containing files defined in label type " + + "attributes marked as <code>allow_single_file</code>. The struct fields correspond " + + "to the attribute names. The struct value is always a <code>file</code> 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>."; + public static final String ATTR_DOC = + "A struct to access the values of the attributes. 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 <code>attrs</code> " + + "dict provided to the <code>rule</code> function. " + + "<a href=\"https://github.com/bazelbuild/examples/blob/master/rules/attributes/" + + "printer.bzl\">See example of use</a>."; + public static final 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."; + public static final 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='globals.html#DefaultInfo'><code>DefaultInfo</code></a>." + + "</ul>"; + + @SkylarkCallable( + name = "default_provider", + structField = true, + doc = "Deprecated. Use <a href=\"globals.html#DefaultInfo\">DefaultInfo</a> instead." + ) + public ProviderApi getDefaultProvider(); + + @SkylarkCallable( + name = "actions", + structField = true, + doc = "Functions to declare files and create actions." + ) + public 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.") + public SkylarkValue createdActions() throws EvalException; + + @SkylarkCallable(name = "attr", structField = true, doc = ATTR_DOC) + public StructApi getAttr() throws EvalException; + + @SkylarkCallable(name = "split_attr", structField = true, doc = SPLIT_ATTR_DOC) + public StructApi getSplitAttr() throws EvalException; + + @SkylarkCallable(name = "executable", structField = true, doc = EXECUTABLE_DOC) + public StructApi getExecutable() throws EvalException; + + @SkylarkCallable(name = "file", structField = true, doc = FILE_DOC) + public StructApi getFile() throws EvalException; + + @SkylarkCallable(name = "files", structField = true, doc = FILES_DOC) + public StructApi getFiles() throws EvalException; + + @SkylarkCallable( + name = "workspace_name", + structField = true, + doc = "Returns the workspace name as defined in the WORKSPACE file." + ) + public String getWorkspaceName() throws EvalException; + + @SkylarkCallable(name = "label", structField = true, doc = "The label of this rule.") + public Label getLabel() throws EvalException; + + @SkylarkCallable( + name = "fragments", + structField = true, + doc = "Allows access to configuration fragments in target configuration." + ) + public FragmentCollectionApi getFragments() throws EvalException; + + @SkylarkCallable( + name = "host_fragments", + structField = true, + doc = "Allows access to configuration fragments in host configuration." + ) + public 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." + ) + public 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." + ) + public BuildConfigurationApi getHostConfiguration() 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 Skylark 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.") + } + ) + public boolean instrumentCoverage(Object targetUnchecked) throws EvalException; + + @SkylarkCallable( + name = "features", + structField = true, + doc = "Returns the set of features that are enabled for this rule." + ) + public ImmutableList<String> getFeatures() throws EvalException; + + @SkylarkCallable( + name = "bin_dir", + structField = true, + doc = "The root corresponding to bin directory." + ) + public FileRootApi getBinDirectory() throws EvalException; + + @SkylarkCallable( + name = "genfiles_dir", + structField = true, + doc = "The root corresponding to genfiles directory." + ) + public FileRootApi getGenfilesDirectory() throws EvalException; + + @SkylarkCallable(structField = true, doc = OUTPUTS_DOC) + public ClassObject outputs() throws EvalException; + + @SkylarkCallable( + structField = true, + doc = + "Returns rule attributes descriptor for the rule that aspect is applied to." + + " Only available in aspect implementation functions." + ) + public SkylarkAttributesCollectionApi rule() throws EvalException; + + @SkylarkCallable( + structField = true, + name = "aspect_ids", + doc = + "Returns a list ids for all aspects applied to the target." + + " Only available in aspect implementation functions." + ) + public ImmutableList<String> aspectIds() throws EvalException; + + @SkylarkCallable( + structField = true, + doc = "Dictionary (String to String) of configuration variables." + ) + public SkylarkDict<String, String> var() throws EvalException; + + @SkylarkCallable(structField = true, doc = "Toolchains required for this rule.") + public SkylarkIndexable toolchains() throws EvalException; + + @SkylarkCallable(doc = "Splits a shell command to a list of tokens.", documented = false) + public SkylarkList<String> tokenize(String optionString) throws FuncallException, EvalException; + + @SkylarkCallable( + 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.", + documented = false + ) + public String expand( + @Nullable String expression, SkylarkList<Object> artifacts, Label labelResolver) + throws EvalException, FuncallException; + + @SkylarkCallable( + name = "new_file", + doc = + "DEPRECATED. Use <a href=\"actions.html#declare_file\">ctx.actions.declare_file</a>. <br>" + + "Creates a file object with the given filename, in the current package. " + + DOC_NEW_FILE_TAIL, + parameters = { + @Param( + name = "filename", + type = String.class, + doc = "The path of the new file, relative to the current package." + ) + } + ) + public FileApi newFile(String filename) throws EvalException; + + @SkylarkCallable(documented = false) + public FileApi newFile(FileRootApi root, String filename) throws EvalException; + + @SkylarkCallable( + name = "new_file", + doc = + "Creates a new file object in the same directory as the original file. " + + DOC_NEW_FILE_TAIL, + parameters = { + @Param( + name = "sibling_file", + type = FileApi.class, + doc = "A file that lives in the same directory as the newly created file." + ), + @Param( + name = "basename", + type = String.class, + doc = "The base name of the newly created file." + ) + } + ) + public FileApi newFile(FileApi baseArtifact, String newBaseName) throws EvalException; + + @SkylarkCallable(documented = false) + public FileApi newFile(FileRootApi root, FileApi baseArtifact, String suffix) + 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 + ) + } + ) + public FileApi newDirectory(String name, Object siblingArtifactUnchecked) throws EvalException; + + @SkylarkCallable(documented = false) + public boolean checkPlaceholders(String template, SkylarkList<Object> allowedPlaceholders) + throws EvalException; + + @SkylarkCallable( + doc = "<b>Deprecated.</b> Use <code>ctx.var</code> 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>. Parameters:" + + "<ul><li>The name of the attribute (<code>string</code>). It's only used for error " + + "reporting.</li>\n" + + "<li>The expression to expand (<code>string</code>). It can contain references to " + + "\"Make variables\".</li>\n" + + "<li>A mapping of additional substitutions (<code>dict</code> of <code>string</code> : " + + "<code>string</code>).</li></ul>\n" + + "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.") + public String expandMakeVariables( + String attributeName, String command, final Map<String, String> additionalSubstitutions) + 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." + ) + public 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." + ) + public 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." + ) + public 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 = SkylarkList.class, + generic1 = FileApi.class, + named = true, + positional = false, + doc = "List of the output files of the action." + ), + @Param( + name = "inputs", + allowedTypes = { + @ParamType(type = SkylarkList.class), + @ParamType(type = SkylarkNestedSet.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 = Runtime.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 = SkylarkList.class), + @ParamType(type = SkylarkNestedSet.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 = SkylarkList.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 = SkylarkList.class, generic1 = String.class), + @ParamType(type = Runtime.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 = SkylarkDict.class, + noneable = true, + defaultValue = "None", + named = true, + positional = false, + doc = "Sets the dictionary of environment variables." + ), + @Param( + name = "execution_requirements", + type = SkylarkDict.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 = SkylarkList.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, + useLocation = true, + useEnvironment = true + ) + public Runtime.NoneType action( + SkylarkList outputs, + Object inputs, + Object executableUnchecked, + Object toolsUnchecked, + Object arguments, + Object mnemonicUnchecked, + Object commandUnchecked, + Object progressMessage, + Boolean useDefaultShellEnv, + Object envUnchecked, + Object executionRequirementsUnchecked, + Object inputManifestsUnchecked, + Location loc, + Environment env) + 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.", + parameters = { + @Param(name = "input", type = String.class, doc = "String to be expanded."), + @Param( + name = "targets", + type = SkylarkList.class, + generic1 = TransitiveInfoCollectionApi.class, + defaultValue = "[]", + named = true, + doc = "List of targets for additional lookup information." + ), + }, + allowReturnNones = true, + useLocation = true, + useEnvironment = true + ) + public String expandLocation(String input, SkylarkList targets, Location loc, Environment env) + 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, + useLocation = true, + useEnvironment = true + ) + public Runtime.NoneType fileAction( + FileApi output, String content, Boolean executable, Location loc, Environment env) + 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 = SkylarkList.class), + @ParamType(type = SkylarkNestedSet.class), + }, + generic1 = FileApi.class, + named = true, + positional = false, + defaultValue = "[]", + doc = "List of the input files of the action." + ), + }, + allowReturnNones = true, + useLocation = true, + useEnvironment = true + ) + public Runtime.NoneType emptyAction(String mnemonic, Object inputs, Location loc, Environment env) + 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 = SkylarkDict.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, + useLocation = true, + useEnvironment = true + ) + public Runtime.NoneType templateAction( + FileApi template, + FileApi output, + SkylarkDict<?, ?> substitutionsUnchecked, + Boolean executable, + Location loc, + Environment env) + throws EvalException; + + @SkylarkCallable( + name = "runfiles", + doc = "Creates a runfiles object.", + parameters = { + @Param( + name = "files", + type = SkylarkList.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 = SkylarkNestedSet.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 `default` order (which, as the name implies, is the default)." + ), + @Param( + name = "collect_data", + type = Boolean.class, + defaultValue = "False", + named = true, + doc = + "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 = + "Whether to collect the default " + + "runfiles from the dependencies in srcs, data and deps attributes." + ), + @Param( + name = "symlinks", + type = SkylarkDict.class, + defaultValue = "{}", + named = true, + doc = "The map of symlinks to be added to the runfiles, prefixed by workspace name." + ), + @Param( + name = "root_symlinks", + type = SkylarkDict.class, + defaultValue = "{}", + named = true, + doc = "The map of symlinks to be added to the runfiles." + ) + }, + useLocation = true + ) + public RunfilesApi runfiles( + SkylarkList files, + Object transitiveFiles, + Boolean collectData, + Boolean collectDefault, + SkylarkDict<?, ?> symlinks, + SkylarkDict<?, ?> rootSymlinks, + Location loc) + 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.", + 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 = SkylarkDict.class, // dict(string, string) + noneable = true, + defaultValue = "None", + named = true, + positional = false, + doc = "Make variables to expand, or None." + ), + @Param( + name = "tools", + defaultValue = "[]", + type = SkylarkList.class, + generic1 = TransitiveInfoCollectionApi.class, + named = true, + positional = false, + doc = "List of tools (list of targets)." + ), + @Param( + name = "label_dict", + type = SkylarkDict.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 = SkylarkDict.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." + ), + }, + useLocation = true, + useEnvironment = true + ) + public Tuple<Object> resolveCommand( + String command, + Object attributeUnchecked, + Boolean expandLocations, + Object makeVariablesUnchecked, + SkylarkList tools, + SkylarkDict<?, ?> labelDictUnchecked, + SkylarkDict<?, ?> executionRequirementsUnchecked, + Location loc, + Environment env) + throws EvalException; +} diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java new file mode 100644 index 0000000000..3b3d1ce034 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java @@ -0,0 +1,58 @@ +// 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.devtools.build.lib.skylarkinterface.Param; +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.SkylarkNestedSet; + +/** + * Interface for a build target. + */ +@SkylarkModule( + name = "Target", + category = SkylarkModuleCategory.BUILTIN, + doc = + "A BUILD target. It is essentially a <code>struct</code> with the following fields:" + + "<ul>" + + "<li><h3 id=\"modules.Target.label\">label</h3><code><a class=\"anchor\" " + + "href=\"Label.html\">Label</a> Target.label</code><br>The identifier of the " + + "target.</li>" + + "<li><h3 id=\"modules.Target.files\">files</h3><code><a class=\"anchor\" " + + "href=\"depset.html\">depset</a> Target.files </code><br>The set of " + + "<a class=\"anchor\" href=\"File.html\">File</a>s produced directly by this " + + "target.</li>" + + "<li><h3 id=\"modules.Target.aspect_ids\">aspect_ids</h3><code><a class=\"anchor\"" + + "href=\"list.html\">list</a> Target.aspect_ids </code><br>The list of " + + "<a class=\"anchor\" href=\"ctx.html#aspect_id\">aspect_id</a>s applied to this " + + "target.</li>" + + "<li><h3 id=\"modules.Target.extraproviders\">Extra providers</h3>For rule targets all " + + "additional providers provided by this target are accessible as <code>struct</code> " + + "fields. These extra providers are defined in the <code>struct</code> returned by the " + + "rule implementation function.</li>" + + "</ul>" +) +public interface TransitiveInfoCollectionApi { + + @SkylarkCallable( + name = "output_group", + documented = false, // TODO(dslomov): document. + parameters = { + @Param(name = "group_name", type = String.class, doc = "Output group name", named = true) + }) + SkylarkNestedSet outputGroup(String group); +} |