|  | // Copyright 2018 The Bazel Authors. All rights reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //    http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package com.google.devtools.build.lib.starlarkbuildapi; | 
|  |  | 
|  | import com.google.devtools.build.docgen.annot.GlobalMethods; | 
|  | import com.google.devtools.build.docgen.annot.GlobalMethods.Environment; | 
|  | import net.starlark.java.annot.Param; | 
|  | import net.starlark.java.annot.StarlarkMethod; | 
|  | import net.starlark.java.eval.EvalException; | 
|  | import net.starlark.java.eval.StarlarkThread; | 
|  |  | 
|  | /** A collection of global Starlark build API functions that belong in the global namespace. */ | 
|  | @GlobalMethods(environment = Environment.BZL) | 
|  | public interface StarlarkBuildApiGlobals { | 
|  |  | 
|  | @StarlarkMethod( | 
|  | name = "visibility", | 
|  | // TODO(b/22193153): Link to a concepts page for bzl-visibility. May require updating | 
|  | // RuleLinkExpander to correctly link to within the /concepts directory. | 
|  | doc = | 
|  | "<p>Sets the load visibility of the .bzl module currently being initialized." | 
|  | + "<p>The load visibility of a module governs whether or not other BUILD and .bzl" | 
|  | + " files may load it. (This is distinct from the target visibility of the underlying" | 
|  | + " .bzl source file, which governs whether the file may appear as a dependency of" | 
|  | + " other targets.) Load visibility works at the level of packages: To load a module" | 
|  | + " the file doing the loading must live in a package that has been granted" | 
|  | + " visibility to the module. A module can always be loaded within its own package," | 
|  | + " regardless of its visibility." | 
|  | + "<p><code>visibility()</code> may only be called once per .bzl file, and only at" | 
|  | + " the top level, not inside a function. The preferred style is to put this call" | 
|  | + " immediately below the <code>load()</code> statements and any brief logic needed" | 
|  | + " to determine the argument." | 
|  | + "<p>If the flag <code>--check_bzl_visibility</code> is set to false, load" | 
|  | + " visibility violations will emit warnings but not fail the build.", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "value", | 
|  | named = false, | 
|  | doc = | 
|  | "A list of package specification strings, or a single package specification string." | 
|  | + "<p>Package specifications follow the same format as for" | 
|  | + " <code><a href='${link functions#package_group}'>package_group</a></code>," | 
|  | + " except that negative package specifications are not permitted. That is, a" | 
|  | + " specification may have the forms:" | 
|  | + "<ul>" | 
|  | + "<li><code>\"//foo\"</code>: the package <code>//foo</code>" // | 
|  | + "<li><code>\"//foo/...\"</code>: the package <code>//foo</code> and all of" | 
|  | + " its subpackages." // | 
|  | + "<li><code>\"public\"</code> or <code>\"private\"</code>: all packages or no" | 
|  | + " packages, respectively" | 
|  | + "</ul>" | 
|  | + "<p>The \"@\" syntax is not allowed; all specifications are interpreted" | 
|  | + " relative to the current module's repository." | 
|  | + "<p>If <code>value</code> is a list of strings, the set of packages granted" | 
|  | + " visibility to this module is the union of the packages represented by each" | 
|  | + " specification. (An empty list has the same effect as <code>private</code>.)" | 
|  | + " If <code>value</code> is a single string, it is treated as if it were the" | 
|  | + " singleton list <code>[value]</code>." | 
|  | + "<p>Note that the flags" | 
|  | + " <code>--incompatible_package_group_has_public_syntax</code> and" | 
|  | + " <code>--incompatible_fix_package_group_reporoot_syntax</code> have no" | 
|  | + " effect on this argument. The <code>\"public\"</code> and <code>\"private\"" | 
|  | + "</code> values are always available, and <code>\"//...\"</code> is always" | 
|  | + " interpreted as \"all packages in the current repository\".") | 
|  | }, | 
|  | // Ordinarily we'd use enableOnlyWithFlag here to gate access on | 
|  | // --experimental_bzl_visibility. However, the StarlarkSemantics isn't available at the point | 
|  | // where the top-level environment is determined (see StarlarkGlobalsImpl#getFixedBzlToplevels | 
|  | // and notice that it relies on the overload of Starlark#addMethods that uses the default | 
|  | // semantics). So instead we make this builtin unconditionally defined, but have it fail at | 
|  | // call time if used without the flag. | 
|  | useStarlarkThread = true) | 
|  | void visibility(Object value, StarlarkThread thread) throws EvalException; | 
|  |  | 
|  | @StarlarkMethod( | 
|  | name = "configuration_field", | 
|  | // TODO(cparsons): Provide a link to documentation for available StarlarkConfigurationFields. | 
|  | doc = | 
|  | "References a late-bound default value for an attribute of type <a" | 
|  | + " href=\"../toplevel/attr.html#label\">label</a>. A value is 'late-bound' if it" | 
|  | + " requires the configuration to be built before determining the value. Any" | 
|  | + " attribute using this as a value must <a" | 
|  | + " href=\"https://bazel.build/extending/rules#private-attributes\">be private</a>." | 
|  | + " <p>Example usage: <p>Defining a rule attribute: <br><pre" | 
|  | + " class=language-python>'_foo':" | 
|  | + " attr.label(default=configuration_field(fragment='java'," | 
|  | + " name='toolchain'))</pre><p>Accessing in rule implementation: <br><pre" | 
|  | + " class=language-python>  def _rule_impl(ctx):\n" | 
|  | + "    foo_info = ctx.attr._foo\n" | 
|  | + "    ...</pre>", | 
|  | parameters = { | 
|  | @Param( | 
|  | name = "fragment", | 
|  | named = true, | 
|  | doc = "The name of a configuration fragment which contains the late-bound value."), | 
|  | @Param( | 
|  | name = "name", | 
|  | named = true, | 
|  | doc = "The name of the value to obtain from the configuration fragment."), | 
|  | }, | 
|  | useStarlarkThread = true) | 
|  | LateBoundDefaultApi configurationField(String fragment, String name, StarlarkThread thread) | 
|  | throws EvalException; | 
|  | } |