Restore even more public content of the bzl style guide
RELNOTES: None.
PiperOrigin-RevId: 301160142
diff --git a/site/docs/skylark/bzl-style.md b/site/docs/skylark/bzl-style.md
index 15ddfa6..60c1c44 100644
--- a/site/docs/skylark/bzl-style.md
+++ b/site/docs/skylark/bzl-style.md
@@ -40,4 +40,155 @@
* Use [Buildifier](https://github.com/bazelbuild/buildtools/tree/master/buildifier#linter)
as a formatter and linter.
* Follow [testing guidelines](testing.md).
+
+## Style
+
+
+### Python style
+
+When in doubt, follow the
+[PEP 8 style guide](https://www.python.org/dev/peps/pep-0008/). In particular,
+use 4 spaces for indentation (we previously recommended 2, but we now follow the
+Python convention).
+
+### Docstring
+
+Document files and functions using [docstrings](https://github.com/bazelbuild/buildtools/blob/master/WARNINGS.md#function-docstring).
+Use a docstring at the top of each `.bzl` file, and a docstring for each public
+function.
+
+### Document rules and aspects
+
+Rules and aspects, along with their attributes, as well as providers and their
+fields, should be documented using the `doc` argument.
+
+### Naming convention
+
+* Variables and function names use lowercase with words separated by
+ underscores (`[a-z][a-z0-9_]*`), e.g. `cc_library`.
+* Top-level private values start with one underscore. Bazel enforces that
+ private values cannot be used from other files. Local variables should not
+ use the underscore prefix.
+
+### Line length
+
+As in BUILD files, there is no strict line length limit as labels can be long.
+When possible, try to use at most 79 characters per line.
+
+### Keyword arguments
+
+In keyword arguments, spaces around the equal sign are preferred:
+
+```python
+def fct(name, srcs):
+ filtered_srcs = my_filter(source = srcs)
+ native.cc_library(
+ name = name,
+ srcs = filtered_srcs,
+ testonly = True,
+ )
+```
+
+### Boolean values
+
+Prefer values `True` and `False` (rather than of `1` and `0`) for boolean values
+(e.g. when using a boolean attribute in a rule).
+
+### Use print only for debugging
+
+Do not use the `print()` function in production code; it is only intended for
+debugging, and will spam all direct and indirect users of your `.bzl` file. The
+only exception is that you may submit code that uses `print()` if it is disabled
+by default and can only be enabled by editing the source -- for example, if all
+uses of `print()` are guarded by `if DEBUG:` where `DEBUG` is hardcoded to
+`False`. Be mindful of whether these statements are useful enough to justify
+their impact on readability.
+
+
+## Macros
+
+A macro is a function which instantiates one or more rules during the loading
+phase. In general, use rules whenever possible instead of macros. The build
+graph seen by the user is not the same as the one used by Bazel during the
+build - macros are expanded _before Bazel does any build graph analysis._
+
+Because of this, when something goes wrong, the user will need to understand
+your macro's implementation to troubleshoot build problems. Additionally, `bazel
+query` results can be hard to interpret because targets shown in the results
+come from macro expansion. Finally, aspects are not aware of macros, so tooling
+depending on aspects (IDEs and others) might fail.
+
+A safe use for macros is leaf nodes, such as macros defining test permutations:
+in that case, only the "end users" of those targets need to know about those
+additional nodes, and any build problems introduced by macros are never far from
+their usage.
+
+For macros that define non-leaf nodes, follow these best practices:
+
+* A macro should take a `name` argument and define a target with that name.
+ That target becomes that macro's _main target_.
+* All other targets defined by a macro should have their names preceded with
+ an underscore (`_`), followed by the name attribute. For instance, if the
+ macro is supplied with the name "resources", internal targets should have
+ names beginning with "_resources". They should also have restricted
+ visibility.
+* The `name` should only be used to derive names of targets defined by the
+ macro, and not for anything else. For example, don't use the name to derive
+ a dependency or input file that is not generated by the macro itself.
+* All the targets created in the macro should be coupled in some way to the
+ main target.
+* Keep the parameter names in the macro consistent. If a parameter is passed
+ as an attribute value to the main target, keep its name the same. If a macro
+ parameter serves the same purpose as a common rule attribute, such as
+ `deps`, name as you would the attribute (see below).
+* When calling a macro, use only keyword arguments. This is consistent with
+ rules, and greatly improves readability.
+
+Engineers often write macros when the Starlark API of relevant rules is
+insufficient for their specific use case, regardless of whether the rule is
+defined within Bazel in native code, or in Starlark. If you're facing this
+problem, ask the rule author if they can extend the API to accomplish your
+goals.
+
+As a rule of thumb, the more macros resemble the rules, the better.
+
+## Rules
+
+* Rules, aspects, and their attributes should use lower_case names ("snake
+ case").
+* Rule names are nouns that describe the main kind of artifact produced by the
+ rule, from the point of view of its dependencies (or for leaf rules, the
+ user). This is not necessarily a file suffix. For instance, a rule that
+ produces C++ artifacts meant to be used as Python extensions might be called
+ `py_extension`. For most languages, typical rules include:
+ * `*_library` - a compilation unit or "module".
+ * `*_binary` - a target producing an executable or a deployment unit.
+ * `*_test` - a test target. This can include multiple tests. Expect all
+ tests in a `*_test` target to be variations on the same theme, for
+ example, testing a single library.
+ * `*_import`: a target encapsulating a pre-compiled artifact, such as a
+ `.jar`, or a `.dll` that is used during compilation.
+* Use consistent names and types for attributes. Some generally applicable
+ attributes include:
+ * `srcs`: `label_list`, allowing files: source files, typically
+ human-authored.
+ * `deps`: `label_list`, typically _not_ allowing files: compilation
+ dependencies.
+ * `data`: `label_list`, allowing files: data files, such as test data etc.
+ * `runtime_deps`: `label_list`: runtime dependencies that are not needed
+ for compilation.
+* For any attributes with non-obvious behavior (for example, string templates
+ with special substitutions, or tools that are invoked with specific
+ requirements), provide documentation using the `doc` keyword argument to the
+ attribute's declaration (`attr.label_list()` or similar).
+* Rule implementation functions should almost always be private functions
+ (named with a leading underscore). A common style is to give the
+ implementation function for `myrule` the name `_myrule_impl`.
+* Pass information between your rules using a well-defined
+ [provider](rules.md#providers) interface. Declare and document provider
+ fields.
+* Design your rule with extensibility in mind. Consider that other rules might
+ want to interact with your rule, access your providers, and reuse the
+ actions you create.
+
* Follow [performance guidelines](performance.md) in your rules.