aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skylarkbuildapi
diff options
context:
space:
mode:
authorGravatar cparsons <cparsons@google.com>2018-05-11 11:54:17 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-11 11:56:04 -0700
commitabbb9002c41bbd53588e7249756aab236f6fcb4b (patch)
treecef41e8fe2b6cce4d8692d2c2dc286dd046b6b94 /src/main/java/com/google/devtools/build/lib/skylarkbuildapi
parent0565a930c218f9686c8bb11023cc10348cd16ed8 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java69
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttributesCollectionApi.java54
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java896
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java58
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.&lt;ATTR&gt; 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.&lt;ATTR&gt;.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);
+}