Simplify visibility docs
Correct legacy uses of "rule" terminology to "target". Eliminate extra example verbosity.
Follow-up work to #8982.
RELNOTES: None
PiperOrigin-RevId: 311414362
diff --git a/site/docs/visibility.md b/site/docs/visibility.md
index d6494cb..e122ca5 100644
--- a/site/docs/visibility.md
+++ b/site/docs/visibility.md
@@ -2,79 +2,64 @@
layout: documentation
title: Visibility
---
+All rule targets have a `visibility` attribute that takes a list of labels. One
+target is visible to another if they are in the same package, or if they are
+granted visibility by one of the labels.
-# Visibility
+Each label has one of the following forms:
-Visibility controls whether a target can be used by other packages. It is an
-important tool to structure the code when a codebase grows: it lets developers
-distinguish between implementation details and libraries other people can depend
-on.
+* `"//visibility:public"`: Anyone can use this target. (May not be combined
+ with any other specification.)
-If you need to disable the visibility check (for example when experimenting),
-use `--check_visibility=false`.
+* `"//visibility:private"`: Only targets in this package can use this
+ target. (May not be combined with any other specification.)
-## Visibility labels
+* `"//foo/bar:__pkg__"`: Grants access to targets defined in `//foo/bar` (but
+ not its subpackages). Here, `__pkg__` is a special piece of syntax
+ representing all of the targets in a package.
-There are five forms a visibility label can take:
+* `"//foo/bar:__subpackages__"`: Grants access to targets defined in
+ `//foo/bar`, or any of its direct or indirect subpackages. Again,
+ `__subpackages__` is special syntax.
-* `["//visibility:public"]`: Anyone can use this rule.
-* `["//visibility:private"]`: Only rules in this package can use this rule.
+* `"//foo/bar:my_package_group"`: Grants access to all of the packages named
+ by the given [package group](be/functions.html#package_group). This can be
+ used to allow access to an entire subtree, such as `//myproj/...`.
-* `["//some/package:__pkg__", "//other/package:__pkg__"]`: Only rules in
- `some/package/BUILD` and `other/package/BUILD` have access to this rule.
- Note that sub-packages do not have access to the rule; for example,
- `//some/package/foo:bar` or `//other/package/testing:bla` wouldn't have
- access. `__pkg__` is a special target and must be used verbatim. It
- represents all of the rules in the package.
-* `["//project:__subpackages__", "//other:__subpackages__"]`: Only rules in
- packages `project` or `other` or in one of their sub-packages have access to
- this rule. For example, `//project:rule`, `//project/library:lib` or
- `//other/testing/internal:munge` are allowed to depend on this rule (but not
- `//independent:evil`)
-* `["//some/package:my_package_group"]`: A
- [package group](be/functions.html#package_group) is a named set of package
- names. Package groups can also grant access rights to entire subtrees,
- e.g.`//myproj/...`.
+For example, if `//some/package:mytarget` has its `visibility` set to
+`[":__subpackages__", "//tests:__pkg__"]`, then it could be used by any target
+that is part of the `//some/package/...` source tree, as well as targets defined
+in `//tests/BUILD`, but not by targets defined in `//tests/integration/BUILD`.
-The visibility specifications of `//visibility:public` and
-`//visibility:private` can not be combined with any other visibility
-specifications.
+## Visibility of a rule target
-A visibility specification may contain a combination of package labels (i.e.
-`//foo:__pkg__`) and `package_group`s.
-
-## Visibility of a rule
-
-If a rule does specify the visibility attribute, that specification overrides
-any [`default_visibility`](be/functions.html#package.default_visibility)
-attribute of the [`package`](functions.html#package) statement in the BUILD
-file containing the rule.
-
-Otherwise, if a rule does not specify the visibility attribute, the
-default_visibility of the package is used.
-
-Otherwise, if the default_visibility for the package is not specified,
-`//visibility:private` is used.
+If a rule target does not set the `visibility` attribute, its visibility is
+given by the
+[`default_visibility`](be/functions.html#package.default_visibility) that was
+specified in the [`package`](functions.html#package) statement of the target's
+BUILD file. If there is no such `default_visibility` declaration, the visibility
+is `//visibility:private`.
### Example
File `//frobber/bin/BUILD`:
```python
-# This rule is visible to everyone
+# This target is visible to everyone
cc_binary(
name = "executable",
visibility = ["//visibility:public"],
deps = [":library"],
)
-# This rule is visible only to rules declared in the same package
+# This target is visible only to targets declared in the same package
cc_library(
name = "library",
- visibility = ["//visibility:private"],
+ # No visibility -- defaults to private since no
+ # package(default_visibility = ...) was used.
)
-# This rule is visible to rules in package //object and //noun
+# This target is visible to targets in package //object and //noun
cc_library(
name = "subject",
visibility = [
@@ -84,7 +69,7 @@
)
# See package group "//frobber:friends" (below) for who can
-# access this rule.
+# access this target.
cc_library(
name = "thingy",
visibility = ["//frobber:friends"],
@@ -94,7 +79,7 @@
File `//frobber/BUILD`:
```python
-# This is the package group declaration to which rule
+# This is the package group declaration to which target
# //frobber/bin:thingy refers.
#
# Our friends are packages //frobber, //fribber and any
@@ -108,20 +93,20 @@
)
```
-## Visibility of a file
+## Visibility of a file target
-By default, files are visible only from the same package. To make a file
+By default, file targets are visible only from the same package. To make a file
accessible from another package, use
[`exports_files`](be/functions.html#exports_files).
-If the call to `exports_files` rule does specify the visibility attribute, that
-specification applies. Otherwise, the file is public (the `default_visibility`
+If the call to `exports_files` specifies the visibility attribute, that
+visibility applies. Otherwise, the file is public (the `default_visibility`
is ignored).
When possible, prefer exposing a library or another type of rule instead of a
source file. For example, declare a `java_library` instead of exporting a
-`.java` file. It's good form for a target to only directly include sources in
-its own package.
+`.java` file. It's good form for a rule target to only directly include sources
+in its own package.
### Example
@@ -145,8 +130,8 @@
If the flag [`--incompatible_no_implicit_file_export`](https://github.com/bazelbuild/bazel/issues/10225)
is not set, a legacy behavior applies instead.
-With the legacy behavior, files used by at least one rule in the file are
-implicitly exported using the `default_visibility` specification. See the
+With the legacy behavior, files used by at least one rule target in the package
+are implicitly exported using the `default_visibility` specification. See the
[design proposal](https://github.com/bazelbuild/proposals/blob/master/designs/2019-10-24-file-visibility.md#example-and-description-of-the-problem)
for more details.