diff --git a/community/images/Bitrise.png b/community/images/Bitrise.png
index 07f85f1ec..e69de29bb 100644
Binary files a/community/images/Bitrise.png and b/community/images/Bitrise.png differ
diff --git a/community/images/Gradle.png b/community/images/Gradle.png
index 1e5f5eb01..e69de29bb 100644
Binary files a/community/images/Gradle.png and b/community/images/Gradle.png differ
diff --git a/community/images/JetBrains.png b/community/images/JetBrains.png
index 0f22176d9..e69de29bb 100644
Binary files a/community/images/JetBrains.png and b/community/images/JetBrains.png differ
diff --git a/community/images/Linkedin-Logo.png b/community/images/Linkedin-Logo.png
index 9dd8715c1..e69de29bb 100644
Binary files a/community/images/Linkedin-Logo.png and b/community/images/Linkedin-Logo.png differ
diff --git a/community/images/aspect-logo-2.png b/community/images/aspect-logo-2.png
index dfebc4cb6..e69de29bb 100644
Binary files a/community/images/aspect-logo-2.png and b/community/images/aspect-logo-2.png differ
diff --git a/community/images/bitrise-logo.png b/community/images/bitrise-logo.png
index 27037ce62..e69de29bb 100644
Binary files a/community/images/bitrise-logo.png and b/community/images/bitrise-logo.png differ
diff --git a/community/images/develocity.png b/community/images/develocity.png
index eb3eb65a7..e69de29bb 100644
Binary files a/community/images/develocity.png and b/community/images/develocity.png differ
diff --git a/community/images/dropbox.png b/community/images/dropbox.png
index 125476a66..e69de29bb 100644
Binary files a/community/images/dropbox.png and b/community/images/dropbox.png differ
diff --git a/community/images/epam-logo.png b/community/images/epam-logo.png
index e6a5674cf..e69de29bb 100644
Binary files a/community/images/epam-logo.png and b/community/images/epam-logo.png differ
diff --git a/community/images/flare-logo.png b/community/images/flare-logo.png
index 84cb0e5b8..e69de29bb 100644
Binary files a/community/images/flare-logo.png and b/community/images/flare-logo.png differ
diff --git a/community/images/liulishuo.png b/community/images/liulishuo.png
index a6758e5ca..e69de29bb 100644
Binary files a/community/images/liulishuo.png and b/community/images/liulishuo.png differ
diff --git a/community/images/oasis-logo.png b/community/images/oasis-logo.png
index 846a9cd56..e69de29bb 100644
Binary files a/community/images/oasis-logo.png and b/community/images/oasis-logo.png differ
diff --git a/community/images/sumglobal-logo.png b/community/images/sumglobal-logo.png
index 6736328dc..e69de29bb 100644
Binary files a/community/images/sumglobal-logo.png and b/community/images/sumglobal-logo.png differ
diff --git a/community/images/tweag-logo.png b/community/images/tweag-logo.png
index 20210ed75..e69de29bb 100644
Binary files a/community/images/tweag-logo.png and b/community/images/tweag-logo.png differ
diff --git a/community/images/typedb.png b/community/images/typedb.png
index 48ce1056b..e69de29bb 100644
Binary files a/community/images/typedb.png and b/community/images/typedb.png differ
diff --git a/community/partners.mdx b/community/partners.mdx
index e27198dc7..44b8724a0 100644
--- a/community/partners.mdx
+++ b/community/partners.mdx
@@ -34,28 +34,24 @@ EngFlow is the build and test acceleration company created by core Bazel enginee
Develocity is a multi-build-system platform for improving developer productivity and happiness. It does this by providing a comprehensive and end-to-end solution for build & test observability, acceleration, and failure analytics, and currently supports the Bazel, Apache Maven, Gradle, and SBT build systems. Specifically, Develocity for Bazel supports Build Cache to speed up build and test feedback cycles; Build Scan® that is like an X-ray for your build to make troubleshooting more efficient; and Failure Analytics to improve toolchain reliability.
- Not recommended —
+ Not recommended —
+ Not recommended —
+ Recommended —
+ Wrong — Correct — refer to Wrong — Do not use Correct — Use
+ Feature-level. This feature implies the specified feature(s).
+ Enabling a feature also implicitly enables all features implied by it
+ (that is, it functions recursively). Also provides the ability to factor common subsets of functionality out of
+ a set of features, such as the common parts of sanitizers. Implied
+ features cannot be disabled. Feature-level. Indicates that this feature is one of several mutually
+ exclusive alternate features. For example, all of the sanitizers could
+ specify This improves error handling by listing the alternatives if the user asks
+ for two or more mutually exclusive features at once.
+ Bazel applies the following changes to the toolchain's features for backwards
+ compatibility:
+
+
+
+JetBrains is a leading provider of IDEs and developer tools. Since 2022, we’ve been active in the Bazel community, delivering robust polyglot support through plugins for CLion, GoLang, PyCharm, and IntelliJ IDEA. We also use Bazel internally to build these products from our own large-scale monorepo.
+
### [Jupiter](https://jupiter.co/)
Jupiter is a company that provides delivery of groceries and household
@@ -747,4 +752,4 @@ architecture.
### [ZhihuDailyPurify](https://github.com/izzyleung/ZhihuDailyPurify)
ZhihuDailyPurify is a light weight version of Zhihu Daily, a Chinese
-question-and-answer webs.
+question-and-answer webs.
\ No newline at end of file
diff --git a/concepts/build-files.mdx b/concepts/build-files.mdx
new file mode 100644
index 000000000..33087dc45
--- /dev/null
+++ b/concepts/build-files.mdx
@@ -0,0 +1,152 @@
+---
+title: 'BUILD files'
+---
+
+
+
+The previous sections described packages, targets and labels, and the
+build dependency graph abstractly. This section describes the concrete syntax
+used to define a package.
+
+By definition, every package contains a `BUILD` file, which is a short
+program.
+
+Note: The `BUILD` file can be named either `BUILD` or `BUILD.bazel`. If both
+files exist, `BUILD.bazel` takes precedence over `BUILD`.
+For simplicity's sake, the documentation refers to these files simply as `BUILD`
+files.
+
+`BUILD` files are evaluated using an imperative language,
+[Starlark](https://github.com/bazelbuild/starlark/){: .external}.
+
+They are interpreted as a sequential list of statements.
+
+In general, order does matter: variables must be defined before they are
+used, for example. However, most `BUILD` files consist only of declarations of
+build rules, and the relative order of these statements is immaterial; all
+that matters is _which_ rules were declared, and with what values, by the
+time package evaluation completes.
+
+When a build rule function, such as `cc_library`, is executed, it creates a
+new target in the graph. This target can later be referred using a label.
+
+In simple `BUILD` files, rule declarations can be re-ordered freely without
+changing the behavior.
+
+To encourage a clean separation between code and data, `BUILD` files cannot
+contain function definitions, `for` statements or `if` statements (but list
+comprehensions and `if` expressions are allowed). Functions can be declared in
+`.bzl` files instead. Additionally, `*args` and `**kwargs` arguments are not
+allowed in `BUILD` files; instead list all the arguments explicitly.
+
+Crucially, programs in Starlark can't perform arbitrary I/O. This invariant
+makes the interpretation of `BUILD` files hermetic — dependent only on a known
+set of inputs, which is essential for ensuring that builds are reproducible.
+For more details, see [Hermeticity](/basics/hermeticity).
+
+Because `BUILD` files need to be updated whenever the dependencies of the
+underlying code change, they are typically maintained by multiple people on a
+team. `BUILD` file authors should comment liberally to document the role
+of each build target, whether or not it is intended for public use, and to
+document the role of the package itself.
+
+## Loading an extension
+
+Bazel extensions are files ending in `.bzl`. Use the `load` statement to import
+a symbol from an extension.
+
+```
+load("//foo/bar:file.bzl", "some_library")
+```
+
+This code loads the file `foo/bar/file.bzl` and adds the `some_library` symbol
+to the environment. This can be used to load new rules, functions, or constants
+(for example, a string or a list). Multiple symbols can be imported by using
+additional arguments to the call to `load`. Arguments must be string literals
+(no variable) and `load` statements must appear at top-level — they cannot be
+in a function body.
+
+The first argument of `load` is a [label](/concepts/labels) identifying a
+`.bzl` file. If it's a relative label, it is resolved with respect to the
+package (not directory) containing the current `bzl` file. Relative labels in
+`load` statements should use a leading `:`.
+
+`load` also supports aliases, therefore, you can assign different names to the
+imported symbols.
+
+```
+load("//foo/bar:file.bzl", library_alias = "some_library")
+```
+
+You can define multiple aliases within one `load` statement. Moreover, the
+argument list can contain both aliases and regular symbol names. The following
+example is perfectly legal (please note when to use quotation marks).
+
+```
+load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")
+```
+
+In a `.bzl` file, symbols starting with `_` are not exported and cannot be
+loaded from another file.
+
+You can use [load visibility](/concepts/visibility#load-visibility) to restrict
+who may load a `.bzl` file.
+
+## Types of build rules
+
+The majority of build rules come in families, grouped together by
+language. For example, `cc_binary`, `cc_library`
+and `cc_test` are the build rules for C++ binaries,
+libraries, and tests, respectively. Other languages use the same
+naming scheme, with a different prefix, such as `java_*` for
+Java. Some of these functions are documented in the
+[Build Encyclopedia](/reference/be/overview), but it is possible
+for anyone to create new rules.
+
+* `*_binary` rules build executable programs in a given language. After a
+ build, the executable will reside in the build tool's binary
+ output tree at the corresponding name for the rule's label,
+ so `//my:program` would appear at (for example) `$(BINDIR)/my/program`.
+
+ In some languages, such rules also create a runfiles directory
+ containing all the files mentioned in a `data`
+ attribute belonging to the rule, or any rule in its transitive
+ closure of dependencies; this set of files is gathered together in
+ one place for ease of deployment to production.
+
+* `*_test` rules are a specialization of a `*_binary` rule, used for automated
+ testing. Tests are simply programs that return zero on success.
+
+ Like binaries, tests also have runfiles trees, and the files
+ beneath it are the only files that a test may legitimately open
+ at runtime. For example, a program `cc_test(name='x',
+ data=['//foo:bar'])` may open and read `$TEST_SRCDIR/workspace/foo/bar` during execution.
+ (Each programming language has its own utility function for
+ accessing the value of `$TEST_SRCDIR`, but they are all
+ equivalent to using the environment variable directly.)
+ Failure to observe the rule will cause the test to fail when it is
+ executed on a remote testing host.
+
+* `*_library` rules specify separately-compiled modules in the given
+ programming language. Libraries can depend on other libraries,
+ and binaries and tests can depend on libraries, with the expected
+ separate-compilation behavior.
+
+
+
+
+## File encoding
+
+`BUILD` and `.bzl` files should be encoded in UTF-8, of which ASCII is a valid
+subset. Arbitrary byte sequences are currently allowed, but may stop being
+supported in the future.
diff --git a/concepts/dependencies.mdx b/concepts/dependencies.mdx
new file mode 100644
index 000000000..d3fcb71e6
--- /dev/null
+++ b/concepts/dependencies.mdx
@@ -0,0 +1,375 @@
+---
+title: 'Dependencies'
+---
+
+
+
+A target `A` _depends upon_ a target `B` if `B` is needed by `A` at build or
+execution time. The _depends upon_ relation induces a
+[Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph)
+(DAG) over targets, and it is called a _dependency graph_.
+
+A target's _direct_ dependencies are those other targets reachable by a path
+of length 1 in the dependency graph. A target's _transitive_ dependencies are
+those targets upon which it depends via a path of any length through the graph.
+
+In fact, in the context of builds, there are two dependency graphs, the graph
+of _actual dependencies_ and the graph of _declared dependencies_. Most of the
+time, the two graphs are so similar that this distinction need not be made, but
+it is useful for the discussion below.
+
+## Actual and declared dependencies
+
+A target `X` is _actually dependent_ on target `Y` if `Y` must be present,
+built, and up-to-date in order for `X` to be built correctly. _Built_ could
+mean generated, processed, compiled, linked, archived, compressed, executed, or
+any of the other kinds of tasks that routinely occur during a build.
+
+A target `X` has a _declared dependency_ on target `Y` if there is a dependency
+edge from `X` to `Y` in the package of `X`.
+
+For correct builds, the graph of actual dependencies _A_ must be a subgraph of
+the graph of declared dependencies _D_. That is, every pair of
+directly-connected nodes `x --> y` in _A_ must also be directly connected in
+_D_. It can be said that _D_ is an _overapproximation_ of _A_.
+
+Important: _D_ should not be too much of an overapproximation of _A_ because
+redundant declared dependencies can make builds slower and binaries larger.
+
+`BUILD` file writers must explicitly declare all of the actual direct
+dependencies for every rule to the build system, and no more.
+
+Failure to observe this principle causes undefined behavior: the build may fail,
+but worse, the build may depend on some prior operations, or upon transitive
+declared dependencies the target happens to have. Bazel checks for missing
+dependencies and report errors, but it's not possible for this checking to be
+complete in all cases.
+
+You need not (and should not) attempt to list everything indirectly imported,
+even if it is _needed_ by `A` at execution time.
+
+During a build of target `X`, the build tool inspects the entire transitive
+closure of dependencies of `X` to ensure that any changes in those targets are
+reflected in the final result, rebuilding intermediates as needed.
+
+The transitive nature of dependencies leads to a common mistake. Sometimes,
+code in one file may use code provided by an _indirect_ dependency — a
+transitive but not direct edge in the declared dependency graph. Indirect
+dependencies don't appear in the `BUILD` file. Because the rule doesn't
+directly depend on the provider, there is no way to track changes, as shown in
+the following example timeline:
+
+### 1. Declared dependencies match actual dependencies
+
+At first, everything works. The code in package `a` uses code in package `b`.
+The code in package `b` uses code in package `c`, and thus `a` transitively
+depends on `c`.
+
+
+
+
+ Labels
+
+
+ Dependencies
+
+
+
+
+The declared dependencies overapproximate the actual dependencies. All is well.
+
+### 2. Adding an undeclared dependency
+
+A latent hazard is introduced when someone adds code to `a` that creates a
+direct _actual_ dependency on `c`, but forgets to declare it in the build file
+`a/BUILD`.
+
+
+
+
+ a/BUILD
+ b/BUILD
+
+
+
+ rule(
+ name = "a",
+ srcs = "a.in",
+ deps = "//b:b",
+)
+
+
+
+
+rule(
+ name = "b",
+ srcs = "b.in",
+ deps = "//c:c",
+)
+
+
+
+
+ a / a.in
+ b / b.in
+
+
+
+import b;
+b.foo();
+
+
+
+
+import c;
+function foo() {
+ c.bar();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+The declared dependencies no longer overapproximate the actual dependencies.
+This may build ok, because the transitive closures of the two graphs are equal,
+but masks a problem: `a` has an actual but undeclared dependency on `c`.
+
+### 3. Divergence between declared and actual dependency graphs
+
+The hazard is revealed when someone refactors `b` so that it no longer depends on
+`c`, inadvertently breaking `a` through no
+fault of their own.
+
+
+
+
+ a / a.in
+
+
+
+
+
+ import b;
+ import c;
+ b.foo();
+ c.garply();
+
+
+
+
+
+
+
+
+
+
+
+
+
+The declared dependency graph is now an underapproximation of the actual
+dependencies, even when transitively closed; the build is likely to fail.
+
+The problem could have been averted by ensuring that the actual dependency from
+`a` to `c` introduced in Step 2 was properly declared in the `BUILD` file.
+
+## Types of dependencies
+
+Most build rules have three attributes for specifying different kinds of
+generic dependencies: `srcs`, `deps` and `data`. These are explained below. For
+more details, see
+[Attributes common to all rules](/reference/be/common-definitions).
+
+Many rules also have additional attributes for rule-specific kinds of
+dependencies, for example, `compiler` or `resources`. These are detailed in the
+[Build Encyclopedia](/reference/be/).
+
+### `srcs` dependencies
+
+Files consumed directly by the rule or rules that output source files.
+
+### `deps` dependencies
+
+Rule pointing to separately-compiled modules providing header files,
+symbols, libraries, data, etc.
+
+### `data` dependencies
+
+A build target might need some data files to run correctly. These data files
+aren't source code: they don't affect how the target is built. For example, a
+unit test might compare a function's output to the contents of a file. When you
+build the unit test you don't need the file, but you do need it when you run
+the test. The same applies to tools that are launched during execution.
+
+The build system runs tests in an isolated directory where only files listed as
+`data` are available. Thus, if a binary/library/test needs some files to run,
+specify them (or a build rule containing them) in `data`. For example:
+
+```
+# I need a config file from a directory named env:
+java_binary(
+ name = "setenv",
+ ...
+ data = [":env/default_env.txt"],
+)
+
+# I need test data from another directory
+sh_test(
+ name = "regtest",
+ srcs = ["regtest.sh"],
+ data = [
+ "//data:file1.txt",
+ "//data:file2.txt",
+ ...
+ ],
+)
+```
+
+These files are available using the relative path `path/to/data/file`. In tests,
+you can refer to these files by joining the paths of the test's source
+directory and the workspace-relative path, for example,
+`${TEST_SRCDIR}/workspace/path/to/data/file`.
+
+## Using labels to reference directories
+
+As you look over our `BUILD` files, you might notice that some `data` labels
+refer to directories. These labels end with `/.` or `/` like these examples,
+which you should not use:
+
+
+
+
+
+ b/BUILD
+
+
+
+
+ rule(
+ name = "b",
+ srcs = "b.in",
+ deps = "//d:d",
+)
+
+
+
+
+
+ b / b.in
+
+
+
+
+
+ import d;
+ function foo() {
+ d.baz();
+ }
+
+
+
+
+
+
+
+
+
+
data = ["//data/regression:unittest/."]
+data = ["testdata/."]
+data = ["testdata/"]
+data = glob(["testdata/**"])
+
+
+
diff --git a/concepts/labels.mdx b/concepts/labels.mdx
new file mode 100644
index 000000000..caf82faf7
--- /dev/null
+++ b/concepts/labels.mdx
@@ -0,0 +1,256 @@
+---
+title: 'Labels'
+---
+
+
+
+A **label** is an identifier for a target. A typical label in its full canonical
+form looks like:
+
+```none
+@@myrepo//my/app/main:app_binary
+```
+
+The first part of the label is the repository name, `@@myrepo`. The double-`@`
+syntax signifies that this is a [*canonical* repo
+name](/external/overview#canonical-repo-name), which is unique within
+the workspace. Labels with canonical repo names unambiguously identify a target
+no matter which context they appear in.
+
+Often the canonical repo name is an arcane string that looks like
+`@@rules_java++toolchains+local_jdk`. What is much more commonly seen is
+labels with an [*apparent* repo name](/external/overview#apparent-repo-name),
+which looks like:
+
+```
+@myrepo//my/app/main:app_binary
+```
+
+The only difference is the repo name being prefixed with one `@` instead of two.
+This refers to a repo with the apparent name `myrepo`, which could be different
+based on the context this label appears in.
+
+In the typical case that a label refers to the same repository from which
+it is used, the repo name part may be omitted. So, inside `@@myrepo` the first
+label is usually written as
+
+```
+//my/app/main:app_binary
+```
+
+The second part of the label is the un-qualified package name
+`my/app/main`, the path to the package
+relative to the repository root. Together, the repository name and the
+un-qualified package name form the fully-qualified package name
+`@@myrepo//my/app/main`. When the label refers to the same
+package it is used in, the package name (and optionally, the colon)
+may be omitted. So, inside `@@myrepo//my/app/main`,
+this label may be written either of the following ways:
+
+```
+app_binary
+:app_binary
+```
+
+It is a matter of convention that the colon is omitted for files,
+but retained for rules, but it is not otherwise significant.
+
+The part of the label after the colon, `app_binary` is the un-qualified target
+name. When it matches the last component of the package path, it, and the
+colon, may be omitted. So, these two labels are equivalent:
+
+```
+//my/app/lib
+//my/app/lib:lib
+```
+
+The name of a file target in a subdirectory of the package is the file's path
+relative to the package root (the directory containing the `BUILD` file). So,
+this file is in the `my/app/main/testdata` subdirectory of the repository:
+
+```
+//my/app/main:testdata/input.txt
+```
+
+Strings like `//my/app` and `@@some_repo//my/app` have two meanings depending on
+the context in which they are used: when Bazel expects a label, they mean
+`//my/app:app` and `@@some_repo//my/app:app`, respectively. But, when Bazel
+expects a package (e.g. in `package_group` specifications), they reference the
+package that contains that label.
+
+A common mistake in `BUILD` files is using `//my/app` to refer to a package, or
+to *all* targets in a package--it does not. Remember, it is
+equivalent to `//my/app:app`, so it names the `app` target in the `my/app`
+package of the current repository.
+
+However, the use of `//my/app` to refer to a package is encouraged in the
+specification of a `package_group` or in `.bzl` files, because it clearly
+communicates that the package name is absolute and rooted in the top-level
+directory of the workspace.
+
+Relative labels cannot be used to refer to targets in other packages; the
+repository identifier and package name must always be specified in this case.
+For example, if the source tree contains both the package `my/app` and the
+package `my/app/testdata` (each of these two directories has its own
+`BUILD` file), the latter package contains a file named `testdepot.zip`. Here
+are two ways (one wrong, one correct) to refer to this file within
+`//my/app:BUILD`:
+
+
+
+
+ BUILD files
+
+
+ Visibility
+
+ testdata is a different package, so you can't use a relative pathtestdata/testdepot.zip
+
+testdata with its full path//my/app/testdata:testdepot.zip
+
+
+Labels starting with `@@//` are references to the main
+repository, which will still work even from external repositories.
+Therefore `@@//a/b/c` is different from
+`//a/b/c` when referenced from an external repository.
+The former refers back to the main repository, while the latter
+looks for `//a/b/c` in the external repository itself.
+This is especially relevant when writing rules in the main
+repository that refer to targets in the main repository, and will be
+used from external repositories.
+
+For information about the different ways you can refer to targets, see
+[target patterns](/run/build#specifying-build-targets).
+
+### Lexical specification of a label
+
+Label syntax discourages use of metacharacters that have special meaning to the
+shell. This helps to avoid inadvertent quoting problems, and makes it easier to
+construct tools and scripts that manipulate labels, such as the
+[Bazel Query Language](/query/language).
+
+The precise details of allowed target names are below.
+
+### Target names — `{{ "" }}package-name{{ "" }}:target-name`
+
+`target-name` is the name of the target within the package. The name of a rule
+is the value of the `name` attribute in the rule's declaration in a `BUILD`
+file; the name of a file is its pathname relative to the directory containing
+the `BUILD` file.
+
+Target names must be composed entirely of characters drawn from the set `a`–`z`,
+`A`–`Z`, `0`–`9`, and the punctuation symbols `!%-@^_"#$&'()*-+,;<=>?[]{|}~/.`.
+
+Filenames must be relative pathnames in normal form, which means they must
+neither start nor end with a slash (for example, `/foo` and `foo/` are
+forbidden) nor contain multiple consecutive slashes as path separators
+(for example, `foo//bar`). Similarly, up-level references (`..`) and
+current-directory references (`./`) are forbidden.
+
+.. to refer to files in other packages//{{ "" }}package-name{{ "" }}:{{ "" }}filename{{ "" }}
+
diff --git a/concepts/runfiles.mdx b/concepts/runfiles.mdx
index 9d5449b41..298e4b172 100644
--- a/concepts/runfiles.mdx
+++ b/concepts/runfiles.mdx
@@ -2,15 +2,9 @@
title: 'Runfiles'
---
+[Runfiles are a set of files used by a target at runtime (as opposed to build time)](/extending/rules#runfiles).
-
-[Runfiles are a set of files used by a target at runtime (as opposed to build
-time)](/extending/rules#runfiles).
-
-Do not hardcode runfiles paths. Those contain the
-[canonical repository name](/external/overview#canonical-repo-name), but
-[the canonical repository name format is an implementation detail that may
-change at any time](/external/module#repository_names_and_strict_deps).
+Do not hardcode runfiles paths. Those contain the [canonical repository name](/external/overview#canonical-repo-name), but [the canonical repository name format is an implementation detail that may change at any time](/external/module#repository_names_and_strict_deps).
Use one of the language-specific runfiles libraries to access them:
@@ -19,24 +13,17 @@ Use one of the language-specific runfiles libraries to access them:
- [rules_python](https://github.com/bazel-contrib/rules_python/blob/main/python/runfiles/runfiles.py)
- [rules_shell](https://github.com/bazelbuild/rules_shell/blob/main/shell/runfiles/runfiles.bash)
-Runfiles are generally referenced by an `rlocationpath` in the form of
-`$REPO/package/file` where `$REPO` should be the
-[apparent repository name](/external/overview#apparent-repo-name).
-Most runfiles libraries (see below) support functionality to determine the
-repository of the currently executed target which is useful to refer to other
-files in the same repository. Many Bazel rules support
-[Make Variables](/reference/be/make-variables#predefined_label_variables)
-to translate from a target to an rlocationpath by using the
-`$(rlocationpath //package:target)` notation.
+Runfiles are generally referenced by an `rlocationpath` in the form of `$REPO/package/file` where `$REPO` should be the [apparent repository name](/external/overview#apparent-repo-name).
+Most runfiles libraries (see below) support functionality to determine the repository of the currently executed target which is useful to refer to other files in the same repository.
+Many Bazel rules support [Make Variables](/reference/be/make-variables#predefined_label_variables) to translate from a target to an rlocationpath by using the `$(rlocationpath //package:target)` notation.
Examples:
-
+
+
+ Targets
+
+
+ BUILD files
+
+ C++
+Golang
+```
+
+Python
-
- ```
+ ```python
load("@rules_python//python:defs.bzl", "py_binary")
py_binary(
@@ -152,9 +136,9 @@ py_binary(
data = ["//examples:runfile.txt"],
deps = ["@rules_python//python/runfiles"],
)
- ```
+```
- ```
+```python
import pathlib
from python.runfiles import runfiles
@@ -171,12 +155,10 @@ print("The content of the runfile is:")
with open(realPathToSomeFile, 'r') as f:
print(f.read())
```
+
+Shell
-
- ```
+```python
load("@rules_shell//shell:sh_binary.bzl", "sh_binary")
sh_binary(
@@ -185,9 +167,9 @@ sh_binary(
data = ["//examples:runfile.txt"],
use_bash_launcher = True,
)
- ```
+ ```
- ```
+```bash
#!/bin/bash
SOME_FILE='examples/runfile.txt'
@@ -200,8 +182,7 @@ real_path_to_some_file="$(rlocation "${root}/${SOME_FILE}")"
echo "The content of the runfile is:"
cat "${real_path_to_some_file}"
- ```
+ ```
+
-
+
+
+
+## Additional Support {:#additional-support}
+
+To report an issue, click the **Feedback** button that appears in the top
+right-hand corner of the screen and enter your feedback in the provided form.
diff --git a/docs.json b/docs.json
index 29101e430..ef2feea3a 100644
--- a/docs.json
+++ b/docs.json
@@ -170,7 +170,9 @@
},
{
"group": "Query Language",
- "pages": []
+ "pages": [
+ "query/quickstart"
+ ]
},
{
"group": "Glossary",
diff --git a/docs/cc-toolchain-config-reference.mdx b/docs/cc-toolchain-config-reference.mdx
new file mode 100644
index 000000000..8b6c26901
--- /dev/null
+++ b/docs/cc-toolchain-config-reference.mdx
@@ -0,0 +1,1150 @@
+---
+title: 'C++ Toolchain Configuration'
+---
+
+## Overview {:#overview}
+
+To invoke the compiler with the right options, Bazel needs some knowledge about
+the compiler internals, such as include directories and important flags.
+In other words, Bazel needs a simplified model of the compiler to understand its
+workings.
+
+Bazel needs to know the following:
+
+* Whether the compiler supports thinLTO, modules, dynamic linking, or PIC
+ (position independent code).
+* Paths to the required tools such as gcc, ld, ar, objcopy, and so on.
+* The built-in system include directories. Bazel needs these to validate that
+ all headers that were included in the source file were properly declared in
+ the `BUILD` file.
+* The default sysroot.
+* Which flags to use for compilation, linking, archiving.
+* Which flags to use for the supported compilation modes (opt, dbg, fastbuild).
+* Make variables specifically required by the compiler.
+
+If the compiler has support for multiple architectures, Bazel needs to configure
+them separately.
+
+[`CcToolchainConfigInfo`](/rules/lib/providers/CcToolchainConfigInfo) is a provider that provides the necessary level of
+granularity for configuring the behavior of Bazel's C++ rules. By default,
+Bazel automatically configures `CcToolchainConfigInfo` for your build, but you
+have the option to configure it manually. For that, you need a Starlark rule
+that provides the `CcToolchainConfigInfo` and you need to point the
+[`toolchain_config`](/reference/be/c-cpp#cc_toolchain.toolchain_config) attribute of the
+[`cc_toolchain`](/reference/be/c-cpp#cc_toolchain) to your rule.
+You can create the `CcToolchainConfigInfo` by calling
+[`cc_common.create_cc_toolchain_config_info()`](/rules/lib/toplevel/cc_common#create_cc_toolchain_config_info).
+You can find Starlark constructors for all structs you'll need in the process in
+[`@rules_cc//cc:cc_toolchain_config_lib.bzl`](https://github.com/bazelbuild/rules_cc/blob/master/cc/cc_toolchain_config_lib.bzl){: .external}.
+
+When a C++ target enters the analysis phase, Bazel selects the appropriate
+`cc_toolchain` target based on the `BUILD` file, and obtains the
+`CcToolchainConfigInfo` provider from the target specified in the
+`cc_toolchain.toolchain_config` attribute. The `cc_toolchain` target
+passes this information to the C++ target through a `CcToolchainProvider`.
+
+For example, a compile or link action, instantiated by a rule such as
+`cc_binary` or `cc_library`, needs the following information:
+
+* The compiler or linker to use
+* Command-line flags for the compiler/linker
+* Configuration flags passed through the `--copt/--linkopt` options
+* Environment variables
+* Artifacts needed in the sandbox in which the action executes
+
+All of the above information except the artifacts required in the sandbox is
+specified in the Starlark target that the `cc_toolchain` points to.
+
+The artifacts to be shipped to the sandbox are declared in the `cc_toolchain`
+target. For example, with the `cc_toolchain.linker_files` attribute you can
+specify the linker binary and toolchain libraries to ship into the sandbox.
+
+## Toolchain selection {:#toolchain-selection}
+
+The toolchain selection logic operates as follows:
+
+1. User specifies a `cc_toolchain_suite` target in the `BUILD` file and points
+ Bazel to the target using the
+ [`--crosstool_top` option](/docs/user-manual#flag--crosstool_top).
+
+2. The `cc_toolchain_suite` target references multiple toolchains. The
+ values of the `--cpu` and `--compiler` flags determine which of those
+ toolchains is selected, either based only on the `--cpu` flag value, or
+ based on a joint `--cpu | --compiler` value. The selection process is as
+ follows:
+
+ * If the `--compiler` option is specified, Bazel selects the
+ corresponding entry from the `cc_toolchain_suite.toolchains`
+ attribute with `--cpu | --compiler`. If Bazel does not find
+ a corresponding entry, it throws an error.
+
+ * If the `--compiler` option is not specified, Bazel selects
+ the corresponding entry from the `cc_toolchain_suite.toolchains`
+ attribute with just `--cpu`.
+
+ * If no flags are specified, Bazel inspects the host system and selects a
+ `--cpu` value based on its findings. See the
+ [inspection mechanism code](https://source.bazel.build/bazel/+/1b73bc37e184e71651eb631223dcce321ba16211:src/main/java/com/google/devtools/build/lib/analysis/config/AutoCpuConverter.java).
+
+Once a toolchain has been selected, corresponding `feature` and `action_config`
+objects in the Starlark rule govern the configuration of the build (that is,
+items described later). These messages allow the implementation of
+fully fledged C++ features in Bazel without modifying the
+Bazel binary. C++ rules support multiple unique actions documented in detail
+[in the Bazel source code](https://source.bazel.build/bazel/+/4f547a7ea86df80e4c76145ffdbb0c8b75ba3afa:tools/build_defs/cc/action_names.bzl).
+
+## Features {:#features}
+
+A feature is an entity that requires command-line flags, actions,
+constraints on the execution environment, or dependency alterations. A feature
+can be something as simple as allowing `BUILD` files to select configurations of
+flags, such as `treat_warnings_as_errors`, or interact with the C++ rules and
+include new compile actions and inputs to the compilation, such as
+`header_modules` or `thin_lto`.
+
+Ideally, `CcToolchainConfigInfo` contains a list of features, where each
+feature consists of one or more flag groups, each defining a list of flags
+that apply to specific Bazel actions.
+
+A feature is specified by name, which allows full decoupling of the Starlark
+rule configuration from Bazel releases. In other words, a Bazel release does not
+affect the behavior of `CcToolchainConfigInfo` configurations as long as those
+configurations do not require the use of new features.
+
+A feature is enabled in one of the following ways:
+
+* The feature's `enabled` field is set to `true`.
+* Bazel or the rule owner explicitly enable it.
+* The user enables it through the `--feature` Bazel option or `features` rule
+ attribute.
+
+Features can have interdependencies, depend on command line flags, `BUILD` file
+settings, and other variables.
+
+### Feature relationships {:#feature-relationships}
+
+Dependencies are typically managed directly with Bazel, which simply enforces
+the requirements and manages conflicts intrinsic to the nature of the features
+defined in the build. The toolchain specification allows for more granular
+constraints for use directly within the Starlark rule that govern feature
+support and expansion. These are:
+
+
+
+
+
+Filter
+Other options
+Description
+Example
+
+
+lang:
+language:
+Perform an exact match by file language.
+lang:java test
+
+
+file:
+filepath:
+
+path:
+f:
+
+
+
+case:yes
+
+ Make the search case sensitive. By default, searches are not case-sensitive.
+case:yes Hello World
+
+
+class:
+
+ Search for a class name.
+class:MainClass
+
+
+function:
+func:
+Search for a function name.
+function:print
+
+
+-
+
+ Negates the term from the search.
+hello -world
+
+
+\
+
+ Escapes special characters, such as ., \, or (.
+run\(\)
+
+
+
+"[term]"
+
+ Perform a literal search.
+"class:main"
+
+
+
+## Actions {:#actions}
+
+Actions provide the flexibility to modify the circumstances under
+which an action executes without assuming how the action will be run. An
+`action_config` specifies the tool binary that an action invokes, while a
+`feature` specifies the configuration (flags) that determine how that tool
+behaves when the action is invoked.
+
+[Features](#features) reference actions to signal which Bazel actions
+they affect since actions can modify the Bazel action graph. The
+`CcToolchainConfigInfo` provider contains actions that have flags and tools
+associated with them, such as `c++-compile`. Flags are assigned to each action
+by associating them with a feature.
+
+Each action name represents a single type of action performed by Bazel, such as
+compiling or linking. There is, however, a many-to-one relationship between
+actions and Bazel action types, where a Bazel action type refers to a Java class
+that implements an action (such as `CppCompileAction`). In particular, the
+"assembler actions" and "compiler actions" in the table below are
+`CppCompileAction`, while the link actions are `CppLinkAction`.
+
+### Assembler actions {:#assembler-actions}
+
+
+
+ Constraint
+
+ Description
+
+
+
+
+ requires = [
+ feature_set (features = [
+ 'feature-name-1',
+ 'feature-name-2'
+ ]),
+]
+ Feature-level. The feature is supported only if the specified required
+ features are enabled. For example, when a feature is only supported in
+ certain build modes (
+ opt, dbg, or
+ fastbuild). If `requires` contains multiple `feature_set`s
+ the feature is supported if any of the `feature_set`s is satisfied
+ (when all specified features are enabled).
+
+
+
+ implies = ['feature']
+
+
+
+
+ provides = ['feature']
+
+ provides = ["sanitizer"].
+
+
+ with_features = [
+ with_feature_set(
+ features = ['feature-1'],
+ not_features = ['feature-2'],
+ ),
+]
+ Flag set-level. A feature can specify multiple flag sets with multiple.
+ When
+ with_features is specified, the flag set will only expand
+ to the build command if there is at least one with_feature_set
+ for which all of the features in the specified features set
+ are enabled, and all the features specified in not_features
+ set are disabled.
+ If with_features is not specified, the flag set will be
+ applied unconditionally for every action specified.
+
+
+
+### Compiler actions {:#compiler-actions}
+
+
+
+ Action
+
+ Description
+
+
+
+
+ preprocess-assemble
+ Assemble with preprocessing. Typically for
+ .S files.
+
+
+
+ assemble
+ Assemble without preprocessing. Typically for
+ .s files.
+
+
+
+### Link actions {:#link-actions}
+
+
+
+ Action
+
+ Description
+
+
+
+
+ cc-flags-make-variable
+ Propagates
+ CC_FLAGS to genrules.
+
+
+
+ c-compile
+ Compile as C.
+
+
+
+
+ c++-compile
+ Compile as C++.
+
+
+
+
+ c++-header-parsing
+ Run the compiler's parser on a header file to ensure that the header is
+ self-contained, as it will otherwise produce compilation errors. Applies
+ only to toolchains that support modules.
+
+
+
+
+### AR actions {:#ar-actions}
+
+AR actions assemble object files into archive libraries (`.a` files) via `ar`
+and encode some semantics into the name.
+
+
+
+ Action
+
+ Description
+
+
+
+
+ c++-link-dynamic-library
+ Link a shared library containing all of its dependencies.
+
+
+
+
+ c++-link-nodeps-dynamic-library
+ Link a shared library only containing
+ cc_library sources.
+
+
+
+ c++-link-executable
+ Link a final ready-to-run library.
+
+
+
+
+### LTO actions {:#lto-actions}
+
+
+
+ Action
+
+ Description
+
+
+
+
+ c++-link-static-library
+ Create a static library (archive).
+
+
+
+
+## Using action_config {:#using-action-config}
+
+The `action_config` is a Starlark struct that describes a Bazel
+action by specifying the tool (binary) to invoke during the action and sets of
+flags, defined by features. These flags apply constraints to the action's
+execution.
+
+The `action_config()` constructor has the following parameters:
+
+
+
+ Action
+
+ Description
+
+
+
+
+ lto-backend
+ ThinLTO action compiling bitcodes into native objects.
+
+
+
+
+ lto-index
+ ThinLTO action generating global index.
+
+
+
+
+An `action_config` can require and imply other features and
+
+
+ Attribute
+
+ Description
+
+
+
+
+ action_name
+ The Bazel action to which this action corresponds.
+ Bazel uses this attribute to discover per-action tool and execution
+ requirements.
+
+
+
+
+ tools
+ The executable to invoke. The tool applied to the action will be the
+ first tool in the list with a feature set that matches the feature
+ configuration. Default value must be provided.
+
+
+
+
+ flag_sets
+ A list of flags that applies to a group of actions. Same as for a
+ feature.
+
+
+
+
+ env_sets
+ A list of environment constraints that applies to a group of actions.
+ Same as for a feature.
+
+ action_configs as dictated by the
+[feature relationships](#feature-relationships) described earlier. This behavior
+is similar to that of a feature.
+
+The last two attributes are redundant against the corresponding attributes on
+features and are included because some Bazel actions require certain flags or
+environment variables and the goal is to avoid unnecessary `action_config`+`feature`
+pairs. Typically, sharing a single feature across multiple `action_config`s is
+preferred.
+
+You can not define more than one `action_config` with the same `action_name`
+within the same toolchain. This prevents ambiguity in tool paths
+and enforces the intention behind `action_config` - that an action's properties
+are clearly described in a single place in the toolchain.
+
+### Using tool constructor {:#using-tool-constructor}
+
+An`action_config` can specify a set of tools via its `tools` parameter.
+The `tool()` constructor takes in the following parameters:
+
+
+
+
+For a given `action_config`, only a single `tool` applies
+its tool path and execution requirements to the Bazel action. A tool is selected
+by iterating through the `tools` attribute on an `action_config` until a tool
+with a `with_feature` set matching the feature configuration is found
+(see [Feature relationships](#feature-relationships) earlier on this page
+for more information). You should end your tool lists with a default
+tool that corresponds to an empty feature configuration.
+
+### Example usage {:#example-usage}
+
+Features and actions can be used together to implement Bazel actions
+with diverse cross-platform semantics. For example, debug symbol generation on
+macOS requires generating symbols in the compile action, then invoking a
+specialized tool during the link action to create compressed dsym archive, and
+then decompressing that archive to produce the application bundle and `.plist`
+files consumable by Xcode.
+
+With Bazel, this process can instead be implemented as follows, with
+`unbundle-debuginfo` being a Bazel action:
+
+ load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
+
+ action_configs = [
+ action_config (
+ action_name = ACTION_NAMES.cpp_link_executable,
+ tools = [
+ tool(
+ with_features = [
+ with_feature(features=["generate-debug-symbols"]),
+ ],
+ path = "toolchain/mac/ld-with-dsym-packaging",
+ ),
+ tool (path = "toolchain/mac/ld"),
+ ],
+ ),
+ ]
+
+ features = [
+ feature(
+ name = "generate-debug-symbols",
+ flag_sets = [
+ flag_set (
+ actions = [
+ ACTION_NAMES.c_compile,
+ ACTION_NAMES.cpp_compile
+ ],
+ flag_groups = [
+ flag_group(
+ flags = ["-g"],
+ ),
+ ],
+ )
+ ],
+ implies = ["unbundle-debuginfo"],
+ ),
+ ]
+
+This same feature can be implemented entirely differently for Linux, which uses
+`fission`, or for Windows, which produces `.pdb` files. For example, the
+implementation for `fission`-based debug symbol generation might look as
+follows:
+
+ load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
+
+ action_configs = [
+ action_config (
+ name = ACTION_NAMES.cpp_compile,
+ tools = [
+ tool(
+ path = "toolchain/bin/gcc",
+ ),
+ ],
+ ),
+ ]
+
+ features = [
+ feature (
+ name = "generate-debug-symbols",
+ requires = [with_feature_set(features = ["dbg"])],
+ flag_sets = [
+ flag_set(
+ actions = [ACTION_NAMES.cpp_compile],
+ flag_groups = [
+ flag_group(
+ flags = ["-gsplit-dwarf"],
+ ),
+ ],
+ ),
+ flag_set(
+ actions = [ACTION_NAMES.cpp_link_executable],
+ flag_groups = [
+ flag_group(
+ flags = ["-Wl", "--gdb-index"],
+ ),
+ ],
+ ),
+ ],
+ ),
+ ]
+
+### Flag groups {:#flag-groups}
+
+`CcToolchainConfigInfo` allows you to bundle flags into groups that serve a
+specific purpose. You can specify a flag within using pre-defined variables
+within the flag value, which the compiler expands when adding the flag to the
+build command. For example:
+
+ flag_group (
+ flags = ["%{output_execpath}"],
+ )
+
+In this case, the contents of the flag will be replaced by the output file path
+of the action.
+
+Flag groups are expanded to the build command in the order in which they appear
+in the list, top-to-bottom, left-to-right.
+
+For flags that need to repeat with different values when added to the build
+command, the flag group can iterate variables of type `list`. For example, the
+variable `include_path` of type `list`:
+
+ flag_group (
+ iterate_over = "include_paths",
+ flags = ["-I%{include_paths}"],
+ )
+
+expands to `-I
+
+ Field
+
+ Description
+
+
+
+
+ path
+ Path to the tool in question (relative to the current location).
+
+
+
+
+ with_features
+ A list of feature sets out of which at least one must be satisfied
+ for this tool to apply.
+
+
+
+
+### Well-known features {:#wellknown-features}
+
+The following is a reference of features and their activation
+conditions.
+
+
+
+ Variable
+
+ Action
+
+ Description
+
+
+
+
+ source_file
+ compile
+ Source file to compile.
+
+
+
+
+ input_file
+ strip
+ Artifact to strip.
+
+
+
+
+ output_file
+ compile, strip
+ Compilation output.
+
+
+
+
+ output_assembly_file
+ compile
+ Emitted assembly file. Applies only when the
+
+ compile action emits assembly text, typically when using the
+ --save_temps flag. The contents are the same as for
+ output_file.
+
+
+
+ output_preprocess_file
+ compile
+ Preprocessed output. Applies only to compile
+ actions that only preprocess the source files, typically when using the
+
+ --save_temps flag. The contents are the same as for
+ output_file.
+
+
+
+ includes
+ compile
+ Sequence of files the compiler must
+ unconditionally include in the compiled source.
+
+
+
+
+ include_paths
+ compile
+ Sequence directories in which the compiler
+ searches for headers included using
+ #include<foo.h>
+ and #include "foo.h".
+
+
+
+ quote_include_paths
+ compile
+ Sequence of
+ -iquote includes -
+ directories in which the compiler searches for headers included using
+ #include "foo.h".
+
+
+
+ system_include_paths
+ compile
+ Sequence of
+ -isystem includes -
+ directories in which the compiler searches for headers included using
+ #include <foo.h>.
+
+
+
+ dependency_file
+ compile
+ The
+ .d dependency file generated by the compiler.
+
+
+
+ preprocessor_defines
+ compile
+ Sequence of
+ defines, such as --DDEBUG.
+
+
+
+ pic
+ compile
+ Compiles the output as position-independent code.
+
+
+
+
+ gcov_gcno_file
+ compile
+ The
+ gcov coverage file.
+
+
+
+ per_object_debug_info_file
+ compile
+ The per-object debug info (
+ .dwp) file.
+
+
+
+ stripopts
+ strip
+ Sequence of
+ stripopts.
+
+
+
+ legacy_compile_flags
+ compile
+ Sequence of flags from legacy
+
+ CROSSTOOL fields such as compiler_flag,
+ optional_compiler_flag, cxx_flag, and
+ optional_cxx_flag.
+
+
+
+ user_compile_flags
+ compile
+ Sequence of flags from either the
+
+ copt rule attribute or the --copt,
+ --cxxopt, and --conlyopt flags.
+
+
+
+ unfiltered_compile_flags
+ compile
+ Sequence of flags from the
+
+ unfiltered_cxx_flag legacy CROSSTOOL field or the
+ unfiltered_compile_flags feature. These are not filtered by
+ the nocopts rule attribute.
+
+
+
+ sysroot
+
+ The
+ sysroot.
+
+
+
+ runtime_library_search_directories
+ link
+ Entries in the linker runtime search path (usually
+ set with the
+ -rpath flag).
+
+
+
+ library_search_directories
+ link
+ Entries in the linker search path (usually set with
+ the
+ -L flag).
+
+
+
+ libraries_to_link
+ link
+ Flags providing files to link as inputs in the linker invocation.
+
+
+
+
+ def_file_path
+ link
+ Location of def file used on Windows with MSVC.
+
+
+
+
+ linker_param_file
+ link
+ Location of linker param file created by bazel to
+ overcome command line length limit.
+
+
+
+
+ output_execpath
+ link
+ Execpath of the output of the linker.
+
+
+
+
+ generate_interface_library
+ link
+
+ "yes" or "no" depending on whether interface library should
+ be generated.
+
+
+
+ interface_library_builder_path
+ link
+ Path to the interface library builder tool.
+
+
+
+
+ interface_library_input_path
+ link
+ Input for the interface library
+ ifso builder tool.
+
+
+
+ interface_library_output_path
+ link
+ Path where to generate interface library using the
+ ifso builder tool.
+
+
+
+ legacy_link_flags
+ link
+ Linker flags coming from the legacy
+ CROSSTOOL fields.
+
+
+
+ user_link_flags
+ link
+ Linker flags coming from the
+ --linkopt
+ or linkopts attribute.
+
+
+
+ linkstamp_paths
+ link
+ A build variable giving linkstamp paths.
+
+
+
+
+ force_pic
+ link
+ Presence of this variable indicates that PIC/PIE code should
+ be generated (Bazel option `--force_pic` was passed).
+
+
+
+
+ strip_debug_symbols
+ link
+ Presence of this variable indicates that the debug
+ symbols should be stripped.
+
+
+
+
+ is_cc_test
+ link
+ Truthy when current action is a
+ cc_test
+ linking action, false otherwise.
+
+
+
+ is_using_fission
+ compile, link
+ Presence of this variable indicates that fission (per-object debug info)
+ is activated. Debug info will be in
+ .dwo files instead
+ of .o files and the compiler and linker need to know this.
+
+
+
+ fdo_instrument_path
+ compile, link
+ Path to the directory that stores FDO instrumentation profile.
+
+
+
+
+ fdo_profile_path
+ compile
+ Path to FDO profile.
+
+
+
+
+ fdo_prefetch_hints_path
+ compile
+ Path to the cache prefetch profile.
+
+
+
+
+ cs_fdo_instrument_path
+ compile, link
+ Path to the directory that stores context sensitive FDO
+ instrumentation profile.
+
+
+
+
+#### Legacy features patching logic {:#legacy-features-patching-logic}
+
+
+
+ Feature
+
+ Documentation
+
+
+
+
+ opt | dbg | fastbuild
+ Enabled by default based on compilation mode.
+
+
+
+
+ static_linking_mode | dynamic_linking_mode
+ Enabled by default based on linking mode.
+
+
+
+
+ per_object_debug_info
+ Enabled if the
+ supports_fission feature is specified and
+ enabled and the current compilation mode is specified in the
+ --fission flag.
+
+
+
+ supports_start_end_lib
+ If enabled (and the option
+ --start_end_lib is set), Bazel
+ will not link against static libraries but instead use the
+ --start-lib/--end-lib linker options to link against objects
+ directly. This speeds up the build since Bazel doesn't have to build
+ static libraries.
+
+
+
+ supports_interface_shared_libraries
+ If enabled (and the option
+ --interface_shared_objects is
+ set), Bazel will link targets that have linkstatic set to
+ False (cc_tests by default) against interface shared
+ libraries. This makes incremental relinking faster.
+
+
+
+ supports_dynamic_linker
+ If enabled, C++ rules will know the toolchain can produce shared
+ libraries.
+
+
+
+
+ static_link_cpp_runtimes
+ If enabled, Bazel will link the C++ runtime statically in static linking
+ mode and dynamically in dynamic linking mode. Artifacts
+ specified in the
+ cc_toolchain.static_runtime_lib or
+ cc_toolchain.dynamic_runtime_lib attribute (depending on the
+ linking mode) will be added to the linking actions.
+
+
+
+ supports_pic
+ If enabled, toolchain will know to use PIC objects for dynamic libraries.
+ The `pic` variable is present whenever PIC compilation is needed. If not enabled
+ by default, and `--force_pic` is passed, Bazel will request `supports_pic` and
+ validate that the feature is enabled. If the feature is missing, or couldn't
+ be enabled, `--force_pic` cannot be used.
+
+
+
+
+
+ static_linking_mode | dynamic_linking_mode
+ Enabled by default based on linking mode.
+
+
+
+ no_legacy_features
+
+ Prevents Bazel from adding legacy features to
+ the C++ configuration when present. See the complete list of
+ features below.
+
+
+
+
+ shorten_virtual_includes
+
+ If enabled, virtual include header files are linked under
+ bin/_virtual_includes/<hash of target path> instead of bin/<target package path>/_virtual_includes/<target name>. Useful on Windows to avoid long path issue with MSVC.
+
+
+legacy_compile_flags feature to the top of the toolchaindefault_compile_flags feature to the top of the toolchaindependency_file (if not present) feature to the top of the toolchainpic (if not present) feature to the top of the toolchainper_object_debug_info (if not present) feature to the top of the toolchainpreprocessor_defines (if not present) feature to the top of the toolchainincludes (if not present) feature to the top of the toolchaininclude_paths (if not present) feature to the top of the toolchainfdo_instrument (if not present) feature to the top of the toolchainfdo_optimize (if not present) feature to the top of the toolchaincs_fdo_instrument (if not present) feature to the top of the toolchaincs_fdo_optimize (if not present) feature to the top of the toolchainfdo_prefetch_hints (if not present) feature to the top of the toolchainautofdo (if not present) feature to the top of the toolchainbuild_interface_libraries (if not present) feature to the top of the toolchaindynamic_library_linker_tool (if not present) feature to the top of the toolchainshared_flag (if not present) feature to the top of the toolchainlinkstamps (if not present) feature to the top of the toolchainoutput_execpath_flags (if not present) feature to the top of the toolchainruntime_library_search_directories (if not present) feature to the top of the toolchainlibrary_search_directories (if not present) feature to the top of the toolchainarchiver_flags (if not present) feature to the top of the toolchainlibraries_to_link (if not present) feature to the top of the toolchainforce_pic_flags (if not present) feature to the top of the toolchainuser_link_flags (if not present) feature to the top of the toolchainlegacy_link_flags (if not present) feature to the top of the toolchainstatic_libgcc (if not present) feature to the top of the toolchainfission_support (if not present) feature to the top of the toolchainstrip_debug_symbols (if not present) feature to the top of the toolchaincoverage (if not present) feature to the top of the toolchainllvm_coverage_map_format (if not present) feature to the top of the toolchaingcc_coverage_map_format (if not present) feature to the top of the toolchainfully_static_link (if not present) feature to the bottom of the toolchainuser_compile_flags (if not present) feature to the bottom of the toolchainsysroot (if not present) feature to the bottom of the toolchainunfiltered_compile_flags (if not present) feature to the bottom of the toolchainlinker_param_file (if not present) feature to the bottom of the toolchaincompiler_input_flags (if not present) feature to the bottom of the toolchaincompiler_output_flags (if not present) feature to the bottom of the toolchain
+ % bazel build --package_path %workspace%:/some/other/root ++ +Package path elements may be specified in three formats: + +1. If the first character is `/`, the path is absolute. +2. If the path starts with `%workspace%`, the path is taken relative + to the nearest enclosing bazel directory. + For instance, if your working directory + is `/home/bob/clients/bob_client/bazel/foo`, then the + string `%workspace%` in the package-path is expanded + to `/home/bob/clients/bob_client/bazel`. +3. Anything else is taken relative to the working directory. + This is usually not what you mean to do, + and may behave unexpectedly if you use Bazel from directories below the bazel workspace. + For instance, if you use the package-path element `.`, + and then cd into the directory + `/home/bob/clients/bob_client/bazel/foo`, packages + will be resolved from the + `/home/bob/clients/bob_client/bazel/foo` directory. + +If you use a non-default package path, specify it in your +[Bazel configuration file](/run/bazelrc) for convenience. + +_Bazel doesn't require any packages to be in the +current directory_, so you can do a build from an empty bazel +workspace if all the necessary packages can be found somewhere else +on the package path. + +Example: Building from an empty client + +
+ % mkdir -p foo/bazel + % cd foo/bazel + % touch MODULE.bazel + % bazel build --package_path /some/other/path //foo ++ +#### `--deleted_packages` {:flag--deleted_packages} + +This option specifies a comma-separated list of packages which Bazel +should consider deleted, and not attempt to load from any directory +on the package path. This can be used to simulate the deletion of packages without +actually deleting them. This option can be passed multiple times, in which case +the individual lists are concatenated. + +### Error checking {:#error-checking} + +These options control Bazel's error-checking and/or warnings. + +#### `--[no]check_visibility` {:#check-visibility} + +If this option is set to false, visibility checks are demoted to warnings. +The default value of this option is true, so that by default, visibility +checking is done. + +#### `--output_filter={{ "" }}regex{{ "" }}` {:#output-filter} + +The `--output_filter` option will only show build and compilation +warnings for targets that match the regular expression. If a target does not +match the given regular expression and its execution succeeds, its standard +output and standard error are thrown away. + +Here are some typical values for this option: + +
| `--output_filter='^//(first/project|second/project):'` | +Show the output for the specified packages. | +
| `--output_filter='^//((?!(first/bad_project|second/bad_project):).)*$'` | +Don't show output for the specified packages. | +
| `--output_filter=` | +Show everything. + | +
| `--output_filter=DONT_MATCH_ANYTHING` | +Show nothing. + | +
+ % bazel build --copt="-g0" --copt="-fpic" //foo ++ +will compile the `foo` library without debug tables, generating +position-independent code. + +Note: Changing `--copt` settings will force a recompilation +of all affected object files. Also note that copts values listed in specific +cc_library or cc_binary build rules will be placed on the compiler command line +_after_ these options. + +Warning: C++-specific options (such as `-fno-implicit-templates`) +should be specified in `--cxxopt`, not in +`--copt`. Likewise, C-specific options (such as -Wstrict-prototypes) +should be specified in `--conlyopt`, not in `copt`. +Similarly, compiler options that only have an +effect at link time (such as `-l`) should be specified in +`--linkopt`, not in `--copt`. + +#### `--host_copt={{ "" }}cc-option{{ "" }}` {:#host-copt} + +This option takes an argument which is to be passed to the compiler for source files +that are compiled in the exec configuration. This is analogous to +the [`--copt`](#copt) option, but applies only to the +exec configuration. + +#### `--host_conlyopt={{ "" }}cc-option{{ "" }}` {:#host-conlyopt} + +This option takes an argument which is to be passed to the compiler for C source files +that are compiled in the exec configuration. This is analogous to +the [`--conlyopt`](#cconlyopt) option, but applies only +to the exec configuration. + +#### `--host_cxxopt={{ "" }}cc-option{{ "" }}` {:#host-cxxopt} + +This option takes an argument which is to be passed to the compiler for C++ source files +that are compiled in the exec configuration. This is analogous to +the [`--cxxopt`](#cxxopt) option, but applies only to the +exec configuration. + +#### `--host_linkopt={{ "" }}linker-option{{ "" }}` {:#host-linkopt} + +This option takes an argument which is to be passed to the linker for source files +that are compiled in the exec configuration. This is analogous to +the [`--linkopt`](#linkopt) option, but applies only to +the exec configuration. + +#### `--conlyopt={{ "" }}cc-option{{ "" }}` {:#cconlyopt} + +This option takes an argument which is to be passed to the compiler when compiling C source files. + +This is similar to `--copt`, but only applies to C compilation, +not to C++ compilation or linking. So you can pass C-specific options +(such as `-Wno-pointer-sign`) using `--conlyopt`. + +Note: copts parameters listed in specific cc_library or cc_binary build rules +are placed on the compiler command line _after_ these options. + +#### `--cxxopt={{ "" }}cc-option{{ "" }}` {:#cxxopt} + +This option takes an argument which is to be passed to the compiler when +compiling C++ source files. + +This is similar to `--copt`, but only applies to C++ compilation, +not to C compilation or linking. So you can pass C++-specific options +(such as `-fpermissive` or `-fno-implicit-templates`) using `--cxxopt`. + +For example: + +
+ % bazel build --cxxopt="-fpermissive" --cxxopt="-Wno-error" //foo/cruddy_code ++ +Note: copts parameters listed in specific cc_library or cc_binary build rules +are placed on the compiler command line _after_ these options. + +#### `--linkopt={{ "" }}linker-option{{ "" }}` {:#linkopt} + +This option takes an argument which is to be passed to the compiler when linking. + +This is similar to `--copt`, but only applies to linking, +not to compilation. So you can pass compiler options that only make sense +at link time (such as `-lssp` or `-Wl,--wrap,abort`) +using `--linkopt`. For example: + +
+ % bazel build --copt="-fmudflap" --linkopt="-lmudflap" //foo/buggy_code ++ +Build rules can also specify link options in their attributes. This option's +settings always take precedence. Also see +[cc_library.linkopts](/reference/be/c-cpp#cc_library.linkopts). + +#### `--strip (always|never|sometimes)` {:#strip} + +This option determines whether Bazel will strip debugging information from +all binaries and shared libraries, by invoking the linker with the `-Wl,--strip-debug` option. +`--strip=always` means always strip debugging information. +`--strip=never` means never strip debugging information. +The default value of `--strip=sometimes` means strip if the `--compilation_mode` +is `fastbuild`. + +
+ % bazel build --strip=always //foo:bar ++ +will compile the target while stripping debugging information from all generated +binaries. + +Note: If you want debugging information, it's not enough to disable stripping; +you also need to make sure that the debugging information was generated by the +compiler, which you can do by using either `-c dbg` or `--copt -g`. + +Bazel's `--strip` option corresponds with ld's `--strip-debug` option: +it only strips debugging information. If for some reason you want to strip _all_ symbols, +not just _debug_ symbols, you would need to use ld's `--strip-all` option, +which you can do by passing `--linkopt=-Wl,--strip-all` to Bazel. Also be +aware that setting Bazel's `--strip` flag will override +`--linkopt=-Wl,--strip-all`, so you should only set one or the other. + +If you are only building a single binary and want all symbols stripped, you could also +pass `--stripopt=--strip-all` and explicitly build the +`//foo:bar.stripped` version of the target. As described in the section on +`--stripopt`, this applies a strip action after the final binary is +linked rather than including stripping in all of the build's link actions. + +#### `--stripopt={{ "" }}strip-option{{ "" }}` {:#stripopt} + +This is an additional option to pass to the `strip` command when generating +a [`*.stripped` binary](/reference/be/c-cpp#cc_binary_implicit_outputs). The default +is `-S -p`. This option can be used multiple times. + +Note: `--stripopt` does not apply to the stripping of the main +binary with `[--strip](#flag--strip)=(always|sometimes)`. + +#### `--fdo_instrument={{ "" }}profile-output-dir{{ "" }}` {:#fdo-instrument} + +The `--fdo_instrument` option enables the generation of +FDO (feedback directed optimization) profile output when the +built C/C++ binary is executed. For GCC, the argument provided is used as a +directory prefix for a per-object file directory tree of .gcda files +containing profile information for each .o file. + +Once the profile data tree has been generated, the profile tree +should be zipped up, and provided to the +`--fdo_optimize={{ "" }}profile-zip{{ "" }}` +Bazel option to enable the FDO-optimized compilation. + +For the LLVM compiler the argument is also the directory under which the raw LLVM profile +data file(s) is dumped. For example: +`--fdo_instrument={{ "" }}/path/to/rawprof/dir/{{ "" }}`. + +The options `--fdo_instrument` and `--fdo_optimize` cannot be used at the same time. + +#### `--fdo_optimize={{ "" }}profile-zip{{ "" }}` {:#fdo-optimize} + +The `--fdo_optimize` option enables the use of the +per-object file profile information to perform FDO (feedback +directed optimization) optimizations when compiling. For GCC, the argument +provided is the zip file containing the previously-generated file tree +of .gcda files containing profile information for each .o file. + +Alternatively, the argument provided can point to an auto profile +identified by the extension .afdo. + +Note: This option also accepts labels that resolve to source files. You +may need to add an `exports_files` directive to the corresponding package to +make the file visible to Bazel. + +For the LLVM compiler the argument provided should point to the indexed LLVM +profile output file prepared by the llvm-profdata tool, and should have a .profdata +extension. + +The options `--fdo_instrument` and `--fdo_optimize` cannot be used at the same time. + +#### `--java_language_version={{ "" }}version{{ "" }}` {:#java-language-version} + +This option specifies the version of Java sources. For example: + +
+ % bazel build --java_language_version=8 java/com/example/common/foo:all ++ +compiles and allows only constructs compatible with Java 8 specification. +Default value is 11. --> +Possible values are: 8, 9, 10, 11, 17, and 21 and may be extended by +registering custom Java toolchains using `default_java_toolchain`. + +#### `--tool_java_language_version={{ "" }}version{{ "" }}` {:#tool-java-language-version} + +The Java language version used to build tools that are executed during a build. +Default value is 11. + +#### `--java_runtime_version={{ "" }}version{{ "" }}` {:#java-runtime-version} + +This option specifies the version of JVM to use to execute the code and run the tests. For +example: + +
+ % bazel run --java_runtime_version=remotejdk_11 java/com/example/common/foo:java_application ++ +downloads JDK 11 from a remote repository and run the Java application using it. + +Default value is `local_jdk`. +Possible values are: `local_jdk`, `local_jdk_{{ "" }}version{{ "" }}`, +`remotejdk_11`, `remotejdk_17`, and `remotejdk_21`. +You can extend the values by registering custom JVM using either +`local_java_repository` or `remote_java_repository` repository rules. + +#### `--tool_java_runtime_version={{ "" }}version{{ "" }}` {:#tool-java-runtime-version} + +The version of JVM used to execute tools that are needed during a build. +Default value is `remotejdk_11`. + +#### `--jvmopt={{ "" }}jvm-option{{ "" }}` {:#jvmopt} + +This option allows option arguments to be passed to the Java VM. It can be used +with one big argument, or multiple times with individual arguments. For example: + +
+ % bazel build --jvmopt="-server -Xms256m" java/com/example/common/foo:all ++ +will use the server VM for launching all Java binaries and set the +startup heap size for the VM to 256 MB. + +#### `--javacopt={{ "" }}javac-option{{ "" }}` {:#javacopt} + +This option allows option arguments to be passed to javac. It can be used +with one big argument, or multiple times with individual arguments. For example: + +
+ % bazel build --javacopt="-g:source,lines" //myprojects:prog ++ +will rebuild a java_binary with the javac default debug info +(instead of the bazel default). + +The option is passed to javac after the Bazel built-in default options for +javac and before the per-rule options. The last specification of +any option to javac wins. The default options for javac are: + +
+ -source 8 -target 8 -encoding UTF-8 ++ +Note: Changing `--javacopt` settings will force a recompilation +of all affected classes. Also note that javacopts parameters listed in +specific java_library or java_binary build rules will be placed on the javac +command line _after_ these options. + +#### `--strict_java_deps (default|strict|off|warn|error)` {:#strict-java-deps} + +This option controls whether javac checks for missing direct dependencies. +Java targets must explicitly declare all directly used targets as +dependencies. This flag instructs javac to determine the jars actually used +for type checking each java file, and warn/error if they are not the output +of a direct dependency of the current target. + +* `off` means checking is disabled. +* `warn` means javac will generate standard java warnings of + type `[strict]` for each missing direct dependency. +* `default`, `strict` and `error` all + mean javac will generate errors instead of warnings, causing the current + target to fail to build if any missing direct dependencies are found. + This is also the default behavior when the flag is unspecified. + +### Build semantics {:#build-semantics} + +These options affect the build commands and/or the output file contents. + +#### `--compilation_mode (fastbuild|opt|dbg)` (-c) {:#compilation-mode} + +The `--compilation_mode` option (often shortened to `-c`, +especially `-c opt`) takes an argument of `fastbuild`, `dbg` +or `opt`, and affects various C/C++ code-generation +options, such as the level of optimization and the completeness of +debug tables. Bazel uses a different output directory for each +different compilation mode, so you can switch between modes without +needing to do a full rebuild _every_ time. + +* `fastbuild` means build as fast as possible: + generate minimal debugging information (`-gmlt + -Wl,-S`), and don't optimize. This is the + default. Note: `-DNDEBUG` will **not** be set. +* `dbg` means build with debugging enabled (`-g`), + so that you can use gdb (or another debugger). +* `opt` means build with optimization enabled and + with `assert()` calls disabled (`-O2 -DNDEBUG`). + Debugging information will not be generated in `opt` mode + unless you also pass `--copt -g`. + +#### `--cpu={{ "" }}cpu{{ "" }}` {:#cpu} + +This option specifies the target CPU architecture to be used for +the compilation of binaries during the build. + +Note: A particular combination of crosstool version, compiler version, +and target CPU is allowed only if it has been specified in the currently +used CROSSTOOL file. + +#### `--action_env={{ "" }}VAR=VALUE{{ "" }}` {:#action-env} + +Specifies the set of environment variables available during the execution of all actions. +Variables can be either specified by name, in which case the value will be taken from the +invocation environment, or by the `name=value` pair which sets the value independent of the +invocation environment. + +This `--action_env` flag can be specified multiple times. If a value is assigned to the same +variable across multiple `--action_env` flags, the latest assignment wins. + +#### `--experimental_action_listener={{ "" }}label{{ "" }}` {:#experimental-action-listener} + +Warning: Extra actions are deprecated. Use +[aspects](/extending/aspects) +instead. + +The `experimental_action_listener` option instructs Bazel to use +details from the [`action_listener`](/reference/be/extra-actions#action_listener) rule specified by {{ "" }}label{{ "" }} to +insert [`extra_actions`](/reference/be/extra-actions#extra_action) into the build graph. + +#### `--[no]experimental_extra_action_top_level_only` {:experimental-extra-action-top-level-only} + +Warning: Extra actions are deprecated. Use +[aspects](/extending/aspects) instead. + +If this option is set to true, extra actions specified by the +[ `--experimental_action_listener`](#experimental-action-listener) command +line option will only be scheduled for top level targets. + +#### `--experimental_extra_action_filter={{ "" }}regex{{ "" }}` {:#experimental-extra-action-filter} + +Warning: Extra actions are deprecated. Use +[aspects](/extending/aspects) instead. + +The `experimental_extra_action_filter` option instructs Bazel to +filter the set of targets to schedule `extra_actions` for. + +This flag is only applicable in combination with the +[`--experimental_action_listener`](#experimental-action-listener) flag. + +By default all `extra_actions` in the transitive closure of the +requested targets-to-build get scheduled for execution. +`--experimental_extra_action_filter` will restrict scheduling to +`extra_actions` of which the owner's label matches the specified +regular expression. + +The following example will limit scheduling of `extra_actions` +to only apply to actions of which the owner's label contains '/bar/': + +
% bazel build --experimental_action_listener=//test:al //foo/... \ + --experimental_extra_action_filter=.*/bar/.* ++ +#### `--host_cpu={{ "" }}cpu{{ "" }}` {:#host-cpu} + +This option specifies the name of the CPU architecture that should be +used to build host tools. + +#### `--android_platforms={{ "" }}platform[,platform]*{{ "" }}` {:#android-platforms} + +The platforms to build the transitive `deps` of +`android_binary` rules (specifically for native dependencies like C++). For +example, if a `cc_library` appears in the transitive `deps` of an +`android_binary` rule it is be built once for each platform specified with +`--android_platforms` for the `android_binary` rule, and included in the final +output. + +There is no default value for this flag: a custom Android platform must be +defined and used. + +One `.so` file is created and packaged in the APK for each platform specified +with `--android_platforms`. The `.so` file's name prefixes the name of the +`android_binary` rule with "lib". For example, if the name of the +`android_binary` is "foo", then the file is `libfoo.so`. + +#### `--per_file_copt={{ "" }}[+-]regex[,[+-]regex]...@option[,option]...{{ "" }}` {:#per-file-copt} + +When present, any C++ file with a label or an execution path matching one of the inclusion regex +expressions and not matching any of the exclusion expressions will be built +with the given options. The label matching uses the canonical form of the label +(i.e //`package`:`label_name`). + +The execution path is the relative path to your workspace directory including the base name +(including extension) of the C++ file. It also includes any platform dependent prefixes. + +Note: If only one of the label or the execution path matches the options will be used. + +To match the generated files (such as genrule outputs) +Bazel can only use the execution path. In this case the regexp shouldn't start with '//' +since that doesn't match any execution paths. Package names can be used like this: +`--per_file_copt=base/.*\.pb\.cc@-g0`. This will match every +`.pb.cc` file under a directory called `base`. + +This option can be used multiple times. + +The option is applied regardless of the compilation mode used. For example, it is possible +to compile with `--compilation_mode=opt` and selectively compile some +files with stronger optimization turned on, or with optimization disabled. + +**Caveat**: If some files are selectively compiled with debug symbols the symbols +might be stripped during linking. This can be prevented by setting +`--strip=never`. + +**Syntax**: `[+-]regex[,[+-]regex]...@option[,option]...` Where +`regex` stands for a regular expression that can be prefixed with +a `+` to identify include patterns and with `-` to identify +exclude patterns. `option` stands for an arbitrary option that is passed +to the C++ compiler. If an option contains a `,` it has to be quoted like so +`\,`. Options can also contain `@`, since only the first +`@` is used to separate regular expressions from options. + +**Example**: +`--per_file_copt=//foo:.*\.cc,-//foo:file\.cc@-O0,-fprofile-arcs` +adds the `-O0` and the `-fprofile-arcs` options to the command +line of the C++ compiler for all `.cc` files in `//foo/` except `file.cc`. + +#### `--dynamic_mode={{ "" }}mode{{ "" }}` {:#dynamic-mode} + +Determines whether C++ binaries will be linked dynamically, interacting with +the [linkstatic attribute](/reference/be/c-cpp#cc_binary.linkstatic) on build rules. + +Modes: + +* `default`: Allows bazel to choose whether to link dynamically. + See [linkstatic](/reference/be/c-cpp#cc_binary.linkstatic) for more + information. +* `fully`: Links all targets dynamically. This will speed up + linking time, and reduce the size of the resulting binaries. +* `off`: Links all targets in + [mostly static](/reference/be/c-cpp#cc_binary.linkstatic) mode. + If `-static` is set in linkopts, targets will change to fully static. + +#### `--fission (yes|no|[dbg][,opt][,fastbuild])` {:#fission} + +Enables [Fission](https://gcc.gnu.org/wiki/DebugFission){: .external}, +which writes C++ debug information to dedicated .dwo files instead of .o files, where it would +otherwise go. This substantially reduces the input size to links and can reduce link times. + +When set to `[dbg][,opt][,fastbuild]` (example: +`--fission=dbg,fastbuild`), Fission is enabled +only for the specified set of compilation modes. This is useful for bazelrc +settings. When set to `yes`, Fission is enabled +universally. When set to `no`, Fission is disabled +universally. Default is
no.
+
+#### `--force_ignore_dash_static` {:#force-ignore-dash-static}
+
+If this flag is set, any `-static` options in linkopts of
+`cc_*` rules BUILD files are ignored. This is only intended as a
+workaround for C++ hardening builds.
+
+#### `--[no]force_pic` {:#force-pic}
+
+If enabled, all C++ compilations produce position-independent code ("-fPIC"),
+links prefer PIC pre-built libraries over non-PIC libraries, and links produce
+position-independent executables ("-pie"). Default is disabled.
+
+Note: Dynamically linked binaries (for example `--dynamic_mode fully`)
+generate PIC code regardless of this flag's setting. So this flag is for cases
+where users want PIC code explicitly generated for static links.
+
+#### `--android_resource_shrinking` {:#flag--android_resource_shrinking}
+
+Selects whether to perform resource shrinking for android_binary rules. Sets the default for the
+[shrink_resources attribute](/reference/be/android#android_binary.shrink_resources) on
+android_binary rules; see the documentation for that rule for further details. Defaults to off.
+
+#### `--custom_malloc={{ "" }}malloc-library-target{{ "" }}` {:#custom-malloc}
+
+When specified, always use the given malloc implementation, overriding all
+`malloc="target"` attributes, including in those targets that use the
+default (by not specifying any `malloc`).
+
+#### `--crosstool_top={{ "" }}label{{ "" }}` {:#crosstool-top}
+
+This option specifies the location of the crosstool compiler suite
+to be used for all C++ compilation during a build. Bazel will look in that
+location for a CROSSTOOL file and uses that to automatically determine
+settings for `--compiler`.
+
+#### `--host_crosstool_top={{ "" }}label{{ "" }}` {:#host-crosstool-top}
+
+If not specified, Bazel uses the value of `--crosstool_top` to compile
+code in the exec configuration, such as tools run during the build. The main purpose of this flag
+is to enable cross-compilation.
+
+#### `--apple_crosstool_top={{ "" }}label{{ "" }}` {:#apple-crosstool-top}
+
+The crosstool to use for compiling C/C++ rules in the transitive `deps` of
+objc_*, ios__*, and apple_* rules. For those targets, this flag overwrites
+`--crosstool_top`.
+
+#### `--compiler={{ "" }}version{{ "" }}` {:#compiler}
+
+This option specifies the C/C++ compiler version (such as `gcc-4.1.0`)
+to be used for the compilation of binaries during the build. If you want to
+build with a custom crosstool, you should use a CROSSTOOL file instead of
+specifying this flag.
+
+Note: Only certain combinations of crosstool version, compiler version,
+and target CPU are allowed.
+
+#### `--android_sdk={{ "" }}label{{ "" }}` {:#android-sdk}
+
+Deprecated. This shouldn't be directly specified.
+
+This option specifies the Android SDK/platform toolchain
+and Android runtime library that will be used to build any Android-related
+rule.
+
+The Android SDK will be automatically selected if an `android_sdk_repository`
+rule is defined in the WORKSPACE file.
+
+#### `--java_toolchain={{ "" }}label{{ "" }}` {:#java-toolchain}
+
+No-op. Kept only for backwards compatibility.
+
+#### `--host_java_toolchain={{ "" }}label{{ "" }}` {:#host-java-toolchain}
+
+No-op. Kept only for backwards compatibility.
+
+#### `--javabase=({{ "" }}label{{ "" }})` {:#javabase}
+
+No-op. Kept only for backwards compatibility.
+
+#### `--host_javabase={{ "" }}label{{ "" }}` {:#host-javabase}
+
+No-op. Kept only for backwards compatibility.
+
+### Execution strategy {:#execution-strategy}
+
+These options affect how Bazel will execute the build.
+They should not have any significant effect on the output files
+generated by the build. Typically their main effect is on the
+speed of the build.
+
+#### `--spawn_strategy={{ "" }}strategy{{ "" }}` {:#spawn-strategy}
+
+This option controls where and how commands are executed.
+
+* `standalone` causes commands to be executed as local subprocesses. This value is
+ deprecated. Please use `local` instead.
+* `sandboxed` causes commands to be executed inside a sandbox on the local machine.
+ This requires that all input files, data dependencies and tools are listed as direct
+ dependencies in the `srcs`, `data` and `tools` attributes.
+ Bazel enables local sandboxing by default, on systems that support sandboxed execution.
+* `local` causes commands to be executed as local subprocesses.
+* `worker` causes commands to be executed using a persistent worker, if available.
+* `docker` causes commands to be executed inside a docker sandbox on the local machine.
+ This requires that docker is installed.
+* `remote` causes commands to be executed remotely; this is only available if a
+ remote executor has been configured separately.
+
+#### `--strategy {{ "" }}mnemonic{{ "" }}={{ "" }}strategy{{ "" }}` {:#strategy}
+
+This option controls where and how commands are executed, overriding the
+[--spawn_strategy](#spawn-strategy) (and
+[--genrule_strategy](#genrule-strategy) with mnemonic
+Genrule) on a per-mnemonic basis. See
+[--spawn_strategy](#spawn-strategy) for the supported
+strategies and their effects.
+
+#### `--strategy_regexp={{ "" }}+ % bazel test --test_size_filters=small,medium //foo:all ++ +and + +
+ % bazel test --test_size_filters=-large,-enormous //foo:all ++ +will test only small and medium tests inside //foo. + +By default, test size filtering is not applied. + +#### `--test_timeout_filters={{ "" }}timeout[,timeout]*{{ "" }}` {:#test-timeout-filters} + +If specified, Bazel will test (or build if `--build_tests_only` +is also specified) only test targets with the given timeout. Test timeout filter +is specified as comma delimited list of allowed test timeout values (short, +moderate, long or eternal), optionally preceded with '-' sign used to denote +excluded test timeouts. See [--test_size_filters](#test-size-filters) +for example syntax. + +By default, test timeout filtering is not applied. + +#### `--test_tag_filters={{ "" }}tag[,tag]*{{ "" }}` {:#test-tag-filters} + +If specified, Bazel will test (or build if `--build_tests_only` +is also specified) only test targets that have at least one required tag +(if any of them are specified) and does not have any excluded tags. Test tag +filter is specified as comma delimited list of tag keywords, optionally +preceded with '-' sign used to denote excluded tags. Required tags may also +have a preceding '+' sign. + +For example, + +
+ % bazel test --test_tag_filters=performance,stress,-flaky //myproject:all ++ +will test targets that are tagged with either `performance` or +`stress` tag but are **not** tagged with the `flaky` tag. + +By default, test tag filtering is not applied. Note that you can also filter +on test's `size` and `local` tags in +this manner. + +#### `--test_lang_filters={{ "" }}string[,string]*{{ "" }}` {:#test-lang-filters} + +Specifies a comma-separated list of strings referring to names of test rule +classes. To refer to the rule class `foo_test`, use the string "foo". Bazel will +test (or build if `--build_tests_only` is also specified) only +targets of the referenced rule classes. To instead exclude those targets, use +the string "-foo". For example, + + +
+ % bazel test --test_lang_filters=foo,bar //baz/... ++
+ will test only targets that are instances of `foo_test` or `bar_test` in + `//baz/...`, while +
++ % bazel test --test_lang_filters=-foo,-bar //baz/... ++
+ will test all the targets in `//baz/...` except for the `foo_test` and + `bar_test` instances. +
+ +Tip: You can use `bazel query --output=label_kind "//p:t"` to +learn the rule class name of the target `//p:t`. And you can +look at the pair of instantiation stacks in the output of +`bazel query --output=build "//p:t"` to learn why that target +is an instance of that rule class. + +Warning: The option name "--test_lang_filter" is vestigal and is therefore +unfortunately misleading; don't make assumptions about the semantics based on +the name. + +#### `--test_filter={{ "" }}filter-expression{{ "" }}` {:#test-filter} + +Specifies a filter that the test runner may use to pick a subset of tests for +running. All targets specified in the invocation are built, but depending on +the expression only some of them may be executed; in some cases, only certain +test methods are run. + +The particular interpretation of {{ "" }}filter-expression{{ "" }} is up to +the test framework responsible for running the test. It may be a glob, +substring, or regexp. `--test_filter` is a convenience +over passing different `--test_arg` filter arguments, +but not all frameworks support it. + +### Verbosity {:#verbosity} + +These options control the verbosity of Bazel's output, +either to the terminal, or to additional log files. + +#### `--explain={{ "" }}logfile{{ "" }}` {:#explain} + +This option, which requires a filename argument, causes the +dependency checker in `bazel build`'s execution phase to +explain, for each build step, either why it is being executed, or +that it is up-to-date. The explanation is written +to _logfile_. + +If you are encountering unexpected rebuilds, this option can help to +understand the reason. Add it to your `.bazelrc` so that +logging occurs for all subsequent builds, and then inspect the log +when you see an execution step executed unexpectedly. This option +may carry a small performance penalty, so you might want to remove +it when it is no longer needed. + +#### `--verbose_explanations` {:#verbose-explanations} + +This option increases the verbosity of the explanations generated +when the [--explain](#explain) option is enabled. + +In particular, if verbose explanations are enabled, +and an output file is rebuilt because the command used to +build it has changed, then the output in the explanation file will +include the full details of the new command (at least for most +commands). + +Using this option may significantly increase the length of the +generated explanation file and the performance penalty of using +`--explain`. + +If `--explain` is not enabled, then +`--verbose_explanations` has no effect. + +#### `--profile={{ "" }}file{{ "" }}` {:#profile} + +This option, which takes a filename argument, causes Bazel to write +profiling data into a file. The data then can be analyzed or parsed using the +`bazel analyze-profile` command. The Build profile can be useful in +understanding where Bazel's `build` command is spending its time. + +#### `--[no]show_loading_progress` {:#show-loading-progress} + +This option causes Bazel to output package-loading progress +messages. If it is disabled, the messages won't be shown. + +#### `--[no]show_progress` {:#show-progress} + +This option causes progress messages to be displayed; it is on by +default. When disabled, progress messages are suppressed. + +#### `--show_progress_rate_limit={{ "" }}n{{ "" }}` {:#show-progress-rate} + +This option causes bazel to display at most one progress message per `n` seconds, +where {{ "" }}n{{ "" }} is a real number. +The default value for this option is 0.02, meaning bazel will limit the progress +messages to one per every 0.02 seconds. + +#### `--show_result={{ "" }}n{{ "" }}` {:#show-result} + +This option controls the printing of result information at the end +of a `bazel build` command. By default, if a single +build target was specified, Bazel prints a message stating whether +or not the target was successfully brought up-to-date, and if so, +the list of output files that the target created. If multiple +targets were specified, result information is not displayed. + +While the result information may be useful for builds of a single +target or a few targets, for large builds (such as an entire top-level +project tree), this information can be overwhelming and distracting; +this option allows it to be controlled. `--show_result` +takes an integer argument, which is the maximum number of targets +for which full result information should be printed. By default, +the value is 1. Above this threshold, no result information is +shown for individual targets. Thus zero causes the result +information to be suppressed always, and a very large value causes +the result to be printed always. + +Users may wish to choose a value in-between if they regularly +alternate between building a small group of targets (for example, +during the compile-edit-test cycle) and a large group of targets +(for example, when establishing a new workspace or running +regression tests). In the former case, the result information is +very useful whereas in the latter case it is less so. As with all +options, this can be specified implicitly via +the [`.bazelrc`](/run/bazelrc) file. + +The files are printed so as to make it easy to copy and paste the +filename to the shell, to run built executables. The "up-to-date" +or "failed" messages for each target can be easily parsed by scripts +which drive a build. + +#### `--sandbox_debug` {:#sandbox-debug} + +This option causes Bazel to print extra debugging information when using sandboxing for action +execution. This option also preserves sandbox directories, so that the files visible to actions +during execution can be examined. + +#### `--subcommands` (`-s`) {:#subcommands} + +This option causes Bazel's execution phase to print the full command line +for each command prior to executing it. + ++ >>>>> # //examples/cpp:hello-world [action 'Linking examples/cpp/hello-world'] + (cd /home/johndoe/.cache/bazel/_bazel_johndoe/4c084335afceb392cfbe7c31afee3a9f/bazel && \ + exec env - \ + /usr/bin/gcc -o bazel-out/local-fastbuild/bin/examples/cpp/hello-world -B/usr/bin/ -Wl,-z,relro,-z,now -no-canonical-prefixes -pass-exit-codes -Wl,-S -Wl,@bazel-out/local_linux-fastbuild/bin/examples/cpp/hello-world-2.params) ++ +Where possible, commands are printed in a Bourne shell compatible syntax, +so that they can be easily copied and pasted to a shell command prompt. +(The surrounding parentheses are provided to protect your shell from the +`cd` and `exec` calls; be sure to copy them!) +However some commands are implemented internally within Bazel, such as +creating symlink trees. For these there's no command line to display. + +`--subcommands=pretty_print` may be passed to print +the arguments of the command as a list rather than as a single line. This may +help make long command lines more readable. + +See also [--verbose_failures](#verbose-failures), below. + +For logging subcommands to a file in a tool-friendly format, see +[--execution_log_json_file](/reference/command-line-reference#flag--execution_log_json_file) +and +[--execution_log_binary_file](/reference/command-line-reference#flag--execution_log_binary_file). + +#### `--verbose_failures` {:#verbose-failures} + +This option causes Bazel's execution phase to print the full command line +for commands that failed. This can be invaluable for debugging a +failing build. + +Failing commands are printed in a Bourne shell compatible syntax, suitable +for copying and pasting to a shell prompt. + +### Workspace status {:#workspace-status} + +Use these options to "stamp" Bazel-built binaries: to embed additional information into the +binaries, such as the source control revision or other workspace-related information. You can use +this mechanism with rules that support the `stamp` attribute, such as +`genrule`, `cc_binary`, and more. + +#### `--workspace_status_command={{ "" }}program{{ "" }}` {:#workspace-status-command} + +This flag lets you specify a binary that Bazel runs before each build. The program can report +information about the status of the workspace, such as the current source control revision. + +The flag's value must be a path to a native program. On Linux/macOS this may be any executable. +On Windows this must be a native binary, typically an ".exe", ".bat", or a ".cmd" file. + +The program should print zero or more key/value pairs to standard output, one entry on each line, +then exit with zero (otherwise the build fails). The key names can be anything but they may only +use upper case letters and underscores. The first space after the key name separates it from the +value. The value is the rest of the line (including additional whitespaces). Neither the key nor +the value may span multiple lines. Keys must not be duplicated. + +Bazel partitions the keys into two buckets: "stable" and "volatile". (The names "stable" and +"volatile" are a bit counter-intuitive, so don't think much about them.) + +Bazel then writes the key-value pairs into two files: + +* `bazel-out/stable-status.txt` + contains all keys and values where the key's name starts with `STABLE_` +* `bazel-out/volatile-status.txt` + contains the rest of the keys and their values + +The contract is: + +* "stable" keys' values should change rarely, if possible. If the contents of + `bazel-out/stable-status.txt` + change, Bazel invalidates the actions that depend on them. In + other words, if a stable key's value changes, Bazel will rerun stamped actions. + Therefore the stable status should not contain things like timestamps, because they change all + the time, and would make Bazel rerun stamped actions with each build. + + Bazel always outputs the following stable keys: + * `BUILD_EMBED_LABEL`: value of `--embed_label` + * `BUILD_HOST`: the name of the host machine that Bazel is running on + * `BUILD_USER`: the name of the user that Bazel is running as +* "volatile" keys' values may change often. Bazel expects them to change all the time, like + timestamps do, and duly updates the + `bazel-out/volatile-status.txt` + file. In order to avoid + rerunning stamped actions all the time though, **Bazel pretends that the volatile file never + changes**. In other words, if the volatile status file is the only file whose contents has + changed, Bazel will not invalidate actions that depend on it. If other inputs of the actions + have changed, then Bazel reruns that action, and the action will see the updated volatile + status, but just the volatile status changing alone will not invalidate the action. + + Bazel always outputs the following volatile keys: + * `BUILD_TIMESTAMP`: time of the build in seconds since the Unix Epoch (the value + of `System.currentTimeMillis()` divided by a thousand) + * `FORMATTED_DATE`: time of the build Formatted as + `yyyy MMM d HH mm ss EEE`(for example 2023 Jun 2 01 44 29 Fri) in UTC. + +On Linux/macOS you can pass `--workspace_status_command=/bin/true` to +disable retrieving workspace status, because `true` does nothing, successfully (exits +with zero) and prints no output. On Windows you can pass the path of MSYS's `true.exe` +for the same effect. + +If the workspace status command fails (exits non-zero) for any reason, the build will fail. + +Example program on Linux using Git: + +
+#!/bin/bash +echo "CURRENT_TIME $(date +%s)" +echo "RANDOM_HASH $(cat /proc/sys/kernel/random/uuid)" +echo "STABLE_GIT_COMMIT $(git rev-parse HEAD)" +echo "STABLE_USER_NAME $USER" ++ +Pass this program's path with `--workspace_status_command`, and the stable status file +will include the STABLE lines and the volatile status file will include the rest of the lines. + +#### `--[no]stamp` {:#stamp} + +This option, in conjunction with the `stamp` rule attribute, controls whether to +embed build information in binaries. + +Stamping can be enabled or disabled explicitly on a per-rule basis using the +`stamp` attribute. Please refer to the Build Encyclopedia for details. When +a rule sets `stamp = -1` (the default for `*_binary` rules), this option +determines whether stamping is enabled. + +Bazel never stamps binaries that are built for the exec configuration, +regardless of this option or the `stamp` attribute. For rules that set `stamp = +0` (the default for `*_test` rules), stamping is disabled regardless of +`--[no]stamp`. Specifying `--stamp` does not force targets to be rebuilt if +their dependencies have not changed. + +Setting `--nostamp` is generally desireable for build performance, as it +reduces input volatility and maximizes build caching. + +### Platform {:#platform} + +Use these options to control the host and target platforms that configure how builds work, and to +control what execution platforms and toolchains are available to Bazel rules. + +Please see background information on [Platforms](/extending/platforms) and [Toolchains](/extending/toolchains). + +#### `--platforms={{ "" }}labels{{ "" }}` {:#platforms} + +The labels of the platform rules describing the target platforms for the +current command. + +#### `--host_platform={{ "" }}label{{ "" }}` {:#host-platform} + +The label of a platform rule that describes the host system. + +#### `--extra_execution_platforms={{ "" }}labels{{ "" }}` {:#extra-execution-platforms} + +The platforms that are available as execution platforms to run actions. +Platforms can be specified by exact target, or as a target pattern. These +platforms will be considered before those declared in MODULE.bazel files by +[register_execution_platforms()](/rules/lib/globals/module#register_execution_platforms). +This option accepts a comma-separated list of platforms in order of priority. +If the flag is passed multiple times, the most recent overrides. + +#### `--extra_toolchains={{ "" }}labels{{ "" }}` {:#extra-toolchains} + +The toolchain rules to be considered during toolchain resolution. Toolchains +can be specified by exact target, or as a target pattern. These toolchains will +be considered before those declared in MODULE.bazel files by +[register_toolchains()](/rules/lib/globals/module#register_toolchains). + +#### `--toolchain_resolution_debug={{ "" }}regex{{ "" }}` {:#toolchain-resolution-debug} + +Print debug information while finding toolchains if the toolchain type matches +the regex. Multiple regexes can be separated by commas. The regex can be +negated by using a `-` at the beginning. This might help developers +of Bazel or Starlark rules with debugging failures due to missing toolchains. + +### Miscellaneous {:#miscellaneous} + +#### `--flag_alias={{ "" }}alias_name=target_path{{ "" }}` {:#flag-alias} + +A convenience flag used to bind longer Starlark build settings to a shorter name. For more +details, see the +[Starlark Configurations](/extending/config#using-build-setting-aliases). + +#### `--symlink_prefix={{ "" }}string{{ "" }}` {:#symlink-prefix} + +Changes the prefix of the generated convenience symlinks. The +default value for the symlink prefix is `bazel-` which +will create the symlinks `bazel-bin`, `bazel-testlogs`, and +`bazel-genfiles`. + +If the symbolic links cannot be created for any reason, a warning is +issued but the build is still considered a success. In particular, +this allows you to build in a read-only directory or one that you have no +permission to write into. Any paths printed in informational +messages at the conclusion of a build will only use the +symlink-relative short form if the symlinks point to the expected +location; in other words, you can rely on the correctness of those +paths, even if you cannot rely on the symlinks being created. + +Some common values of this option: + +* **Suppress symlink creation:** + `--symlink_prefix=/` will cause Bazel to not + create or update any symlinks, including the `bazel-out` and + `bazel-
+$ bazel build --nobuild --starlark_cpu_profile=/tmp/pprof.gz my/project/... +$ pprof /tmp/pprof.gz +(pprof) top +Type: CPU +Time: Feb 6, 2020 at 12:06pm (PST) +Duration: 5.26s, Total samples = 3.34s (63.55%) +Showing nodes accounting for 3.34s, 100% of 3.34s total + flat flat% sum% cum cum% + 1.86s 55.69% 55.69% 1.86s 55.69% sort_source_files + 1.02s 30.54% 86.23% 1.02s 30.54% expand_all_combinations + 0.44s 13.17% 99.40% 0.44s 13.17% range + 0.02s 0.6% 100% 3.34s 100% sorted + 0 0% 100% 1.38s 41.32% my/project/main/BUILD + 0 0% 100% 1.96s 58.68% my/project/library.bzl + 0 0% 100% 3.34s 100% main ++ +For different views of the same data, try the `pprof` commands `svg`, +`web`, and `list`. + +## Using Bazel for releases {:#bazel-for-releases} + +Bazel is used both by software engineers during the development +cycle, and by release engineers when preparing binaries for deployment +to production. This section provides a list of tips for release +engineers using Bazel. + +### Significant options {:#significant-options} + +When using Bazel for release builds, the same issues arise as for other scripts +that perform a build. For more details, see +[Call Bazel from scripts](/run/scripts). In particular, the following options +are strongly recommended: + +* [`--bazelrc=/dev/null`](/run/bazelrc) +* [`--nokeep_state_after_build`](/reference/command-line-reference#common_options-flag--keep_state_after_build) + +These options are also important: + +* [`--package_path`](#package-path) +* [`--symlink_prefix`](#symlink-prefix): + for managing builds for multiple configurations, + it may be convenient to distinguish each build + with a distinct identifier, such as "64bit" vs. "32bit". This option + differentiates the `bazel-bin` (etc.) symlinks. + +## Running tests {:#running-tests} + +To build and run tests with bazel, type `bazel test` followed by +the name of the test targets. + +By default, this command performs simultaneous build and test +activity, building all specified targets (including any non-test +targets specified on the command line) and testing +`*_test` and `test_suite` targets as soon as +their prerequisites are built, meaning that test execution is +interleaved with building. Doing so usually results in significant +speed gains. + +### Options for `bazel test` {:#bazel-test-options} + +#### `--cache_test_results=(yes|no|auto)` (`-t`) {:#cache-test-results} + +If this option is set to 'auto' (the default) then Bazel will only rerun a test if any of the +following conditions applies: + +* Bazel detects changes in the test or its dependencies +* the test is marked as `external` +* multiple test runs were requested with `--runs_per_test` +* the test failed. + +If 'no', all tests will be executed unconditionally. + +If 'yes', the caching behavior will be the same as auto +except that it may cache test failures and test runs with +`--runs_per_test`. + +Note: Test results are _always_ saved in Bazel's output tree, +regardless of whether this option is enabled, so +you needn't have used `--cache_test_results` on the +prior run(s) of `bazel test` in order to get cache hits. +The option only affects whether Bazel will _use_ previously +saved results, not whether it will save results of the current run. + +Users who have enabled this option by default in +their `.bazelrc` file may find the +abbreviations `-t` (on) or `-t-` (off) +convenient for overriding the default on a particular run. + +#### `--check_tests_up_to_date` {:#check-tests-up-to-date} + +This option tells Bazel not to run the tests, but to merely check and report +the cached test results. If there are any tests which have not been +previously built and run, or whose tests results are out-of-date (for example, because +the source code or the build options have changed), then Bazel will report +an error message ("test result is not up-to-date"), will record the test's +status as "NO STATUS" (in red, if color output is enabled), and will return +a non-zero exit code. + +This option also implies +[`--check_up_to_date`](#check-up-to-date) behavior. + +This option may be useful for pre-submit checks. + +#### `--test_verbose_timeout_warnings` {:#test-verbose-timeout-warnings} + +This option tells Bazel to explicitly warn the user if a test's timeout is +significantly longer than the test's actual execution time. While a test's +timeout should be set such that it is not flaky, a test that has a highly +over-generous timeout can hide real problems that crop up unexpectedly. + +For instance, a test that normally executes in a minute or two should not have +a timeout of ETERNAL or LONG as these are much, much too generous. + +This option is useful to help users decide on a good timeout value or +sanity check existing timeout values. + +Note: Each test shard is allotted the timeout of the entire +`XX_test` target. Using this option does not affect a test's timeout +value, merely warns if Bazel thinks the timeout could be restricted further. + +#### `--[no]test_keep_going` {:#test-keep-going} + +By default, all tests are run to completion. If this flag is disabled, +however, the build is aborted on any non-passing test. Subsequent build steps +and test invocations are not run, and in-flight invocations are canceled. +Do not specify both `--notest_keep_going` and `--keep_going`. + +#### `--flaky_test_attempts={{ "" }}attempts{{ "" }}` {:#flaky-test-attempts} + +This option specifies the maximum number of times a test should be attempted +if it fails for any reason. A test that initially fails but eventually +succeeds is reported as `FLAKY` on the test summary. It is, +however, considered to be passed when it comes to identifying Bazel exit code +or total number of passed tests. Tests that fail all allowed attempts are +considered to be failed. + +By default (when this option is not specified, or when it is set to +default), only a single attempt is allowed for regular tests, and +3 for test rules with the `flaky` attribute set. You can specify +an integer value to override the maximum limit of test attempts. Bazel allows +a maximum of 10 test attempts in order to prevent abuse of the system. + +#### `--runs_per_test={{ "" }}[regex@]number{{ "" }}` {:#runs-per-test} + +This option specifies the number of times each test should be executed. All +test executions are treated as separate tests (fallback functionality +will apply to each of them independently). + +The status of a target with failing runs depends on the value of the +`--runs_per_test_detects_flakes` flag: + +* If absent, any failing run causes the entire test to fail. +* If present and two runs from the same shard return PASS and FAIL, the test + will receive a status of flaky (unless other failing runs cause it to + fail). + +If a single number is specified, all tests will run that many times. +Alternatively, a regular expression may be specified using the syntax +regex@number. This constrains the effect of `--runs_per_test` to targets +which match the regex (`--runs_per_test=^//pizza:.*@4` runs all tests +under `//pizza/` 4 times). +This form of `--runs_per_test` may be specified more than once. + +#### `--[no]runs_per_test_detects_flakes` {:#run-per-test-detects-flakes} + +If this option is specified (by default it is not), Bazel will detect flaky +test shards through `--runs_per_test`. If one or more runs for a single shard +fail and one or more runs for the same shard pass, the target will be +considered flaky with the flag. If unspecified, the target will report a +failing status. + +#### `--test_summary={{ "" }}output_style{{ "" }}` {:#test-summary} + +Specifies how the test result summary should be displayed. + +* `short` prints the results of each test along with the name of + the file containing the test output if the test failed. This is the default + value. +* `terse` like `short`, but even shorter: only print + information about tests which did not pass. +* `detailed` prints each individual test case that failed, not + only each test. The names of test output files are omitted. +* `none` does not print test summary. + +#### `--test_output={{ "" }}output_style{{ "" }}` {:#test-output} + +Specifies how test output should be displayed: + +* `summary` shows a summary of whether each test passed or + failed. Also shows the output log file name for failed tests. The summary + will be printed at the end of the build (during the build, one would see + just simple progress messages when tests start, pass or fail). + This is the default behavior. +* `errors` sends combined stdout/stderr output from failed tests + only into the stdout immediately after test is completed, ensuring that + test output from simultaneous tests is not interleaved with each other. + Prints a summary at the build as per summary output above. +* `all` is similar to `errors` but prints output for + all tests, including those which passed. +* `streamed` streams stdout/stderr output from each test in + real-time. + +#### `--java_debug` {:#java-debug} + +This option causes the Java virtual machine of a java test to wait for a connection from a +JDWP-compliant debugger before starting the test. This option implies `--test_output=streamed`. + +#### `--[no]verbose_test_summary` {:#verbose-test-summary} + +By default this option is enabled, causing test times and other additional +information (such as test attempts) to be printed to the test summary. If +`--noverbose_test_summary` is specified, test summary will +include only test name, test status and cached test indicator and will +be formatted to stay within 80 characters when possible. + +#### `--test_tmpdir={{ "" }}path{{ "" }}` {:#test-tmpdir} + +Specifies temporary directory for tests executed locally. Each test will be +executed in a separate subdirectory inside this directory. The directory will +be cleaned at the beginning of the each `bazel test` command. +By default, bazel will place this directory under Bazel output base directory. + +Note: This is a directory for running tests, not storing test results +(those are always stored under the `bazel-out` directory). + +#### `--test_timeout={{ "" }}seconds{{ "" }}` OR `--test_timeout={{ "" }}seconds{{ "" }},{{ "" }}seconds{{ "" }},{{ "" }}seconds{{ "" }},{{ "" }}seconds{{ "" }}` {:#test-timeout} + +Overrides the timeout value for all tests by using specified number of +seconds as a new timeout value. If only one value is provided, then it will +be used for all test timeout categories. + +Alternatively, four comma-separated values may be provided, specifying +individual timeouts for short, moderate, long and eternal tests (in that +order). +In either form, zero or a negative value for any of the test sizes will +be substituted by the default timeout for the given timeout categories as +defined by the page [Writing Tests](/reference/test-encyclopedia). +By default, Bazel will use these timeouts for all tests by +inferring the timeout limit from the test's size whether the size is +implicitly or explicitly set. + +Tests which explicitly state their timeout category as distinct from their +size will receive the same value as if that timeout had been implicitly set by +the size tag. So a test of size 'small' which declares a 'long' timeout will +have the same effective timeout that a 'large' tests has with no explicit +timeout. + +#### `--test_arg={{ "" }}arg{{ "" }}` {:#test-arg} + +Passes command-line options/flags/arguments to each test process. This +option can be used multiple times to pass several arguments. For example, +`--test_arg=--logtostderr --test_arg=--v=3`. + +Note that, unlike the `bazel run` command, you can't pass test arguments +directly as in `bazel test -- target --logtostderr --v=3`. That's because +extraneous arguments passed to `bazel test` are interpreted as additional test +targets. That is, `--logtostderr` and `--v=3` would each be interpreted as a +test target. This ambiguity doesn't exist for a `bazel run` command, which only +accepts one target. + +`--test_arg` can be passed to a `bazel run` command, but it's ignored unless the +target being run is a test target. (As with any other flag, if it's passed in a +`bazel run` command after a `--` token, it's not processed by Bazel but +forwarded verbatim to the executed target.) + +#### `--test_env={{ "" }}variable{{ "" }}=_value_` OR `--test_env={{ "" }}variable{{ "" }}` {:#test-env} + +Specifies additional variables that must be injected into the test +environment for each test. If {{ "" }}value{{ "" }} is not specified it will be +inherited from the shell environment used to start the `bazel test` +command. + +The environment can be accessed from within a test by using +`System.getenv("var")` (Java), `getenv("var")` (C or C++), + +#### `--run_under={{ "" }}command-prefix{{ "" }}` {:#test-run-under} + +This specifies a prefix that the test runner will insert in front +of the test command before running it. The +{{ "" }}command-prefix{{ "" }} is split into words using Bourne shell +tokenization rules, and then the list of words is prepended to the +command that will be executed. + +If the first word is a fully-qualified label (starts with +`//`) it is built. Then the label is substituted by the +corresponding executable location that is prepended to the command +that will be executed along with the other words. + +Some caveats apply: + +* The PATH used for running tests may be different than the PATH in your environment, + so you may need to use an **absolute path** for the `--run_under` + command (the first word in {{ "" }}command-prefix{{ "" }}). +* **`stdin` is not connected**, so `--run_under` + can't be used for interactive commands. + +Examples: + +
+ --run_under=/usr/bin/strace + --run_under='/usr/bin/strace -c' + --run_under=/usr/bin/valgrind + --run_under='/usr/bin/valgrind --quiet --num-callers=20' ++ +#### Test selection {:#test-selection} + +As documented under [Output selection options](#output-selection), +you can filter tests by [size](#test-size-filters), +[timeout](#test-timeout-filters), +[tag](#test-tag-filters), or +[language](#test-lang-filters). A convenience +[general name filter](#test-filter) can forward particular +filter args to the test runner. + +#### Other options for `bazel test` {:#bazel-test-other-options} + +The syntax and the remaining options are exactly like +[`bazel build`](/run/build). + +## Running executables {:#running-executables} + +The `bazel run` command is similar to `bazel build`, except +it is used to build _and run_ a single target. Here is a typical session +(`//java/myapp:myapp` says hello and prints out its args): + +
+ % bazel run java/myapp:myapp -- --arg1 --arg2 + INFO: Analyzed target //java/myapp:myapp (13 packages loaded, 27 targets configured). + INFO: Found 1 target... + Target //java/myapp:myapp up-to-date: + bazel-bin/java/myapp/myapp + INFO: Elapsed time: 14.290s, Critical Path: 5.54s, ... + INFO: Build completed successfully, 4 total actions + INFO: Running command line: bazel-bin/java/myapp/myapp <args omitted> + Hello there + $EXEC_ROOT/java/myapp/myapp + --arg1 + --arg2 ++ +Note: `--` is needed so that Bazel +does not interpret `--arg1` and `--arg2` as +Bazel options, but rather as part of the command line for running the binary. +Additionally, Bazel will avoid logging these arguments to the console in case +they contain sensitive information. + +`bazel run` is similar, but not identical, to directly invoking +the binary built by Bazel and its behavior is different depending on whether the +binary to be invoked is a test or not. + +When the binary is not a test, the current working directory will be the +runfiles tree of the binary. + +When the binary is a test, the current working directory will be the exec root +and a good-faith attempt is made to replicate the environment tests are usually +run in. The emulation is not perfect, though, and tests that have multiple +shards cannot be run this way (the +`--test_sharding_strategy=disabled` command line option can be used +to work around this) + +The following extra environment variables are also available to the binary: + +* `BUILD_WORKSPACE_DIRECTORY`: the root of the workspace where the + build was run. +* `BUILD_WORKING_DIRECTORY`: the current working directory where + Bazel was run from. +* `BUILD_ID`: the build ID of the `bazel run` invocation. This is usually + unique, except if Bazel was run with `--script_path` and the resulting + script is re-used. +* `BUILD_EXECROOT`: the execution root of the `bazel run` invocation. + +These can be used, for example, to interpret file names on the command line in +a user-friendly way. + +### Options for `bazel run` {:#bazel-run-options} + +#### `--run_under={{ "" }}command-prefix{{ "" }}` {:#run-run-under} + +This has the same effect as the `--run_under` option for +`bazel test` ([see above](#test-run-under)), +except that it applies to the command being run by `bazel +run` rather than to the tests being run by `bazel test` +and cannot run under label. + +#### Filtering logging outputs from Bazel + +When invoking a binary with `bazel run`, Bazel prints logging output from Bazel +itself and the binary under invocation. To make the logs less noisy, you can +suppress the outputs from Bazel itself with the `--ui_event_filters` and +`--noshow_progress` flags. + +For example: +`bazel run --ui_event_filters=-info,-stdout,-stderr --noshow_progress //java/myapp:myapp` + +### Executing tests {:#executing-tests} + +`bazel run` can also execute test binaries, which has the effect of +running the test in a close approximation of the environment described at +[Writing Tests](/reference/test-encyclopedia). Note that none of the +`--test_*` arguments have an effect when running a test in this manner except +`--test_arg` . + +## Cleaning build outputs {:#cleaning-build-outputs} + +### The `clean` command {:#clean} + +Bazel has a `clean` command, analogous to that of Make. +It deletes the output directories for all build configurations performed +by this Bazel instance, or the entire working tree created by this +Bazel instance, and resets internal caches. If executed without any +command-line options, then the output directory for all configurations +will be cleaned. + +Recall that each Bazel instance is associated with a single workspace, thus the +`clean` command will delete all outputs from all builds you've done +with that Bazel instance in that workspace. + +To completely remove the entire working tree created by a Bazel +instance, you can specify the `--expunge` option. When +executed with `--expunge`, the clean command simply +removes the entire output base tree which, in addition to the build +output, contains all temp files created by Bazel. It also +stops the Bazel server after the clean, equivalent to the [`shutdown`](#shutdown) command. For example, to +clean up all disk and memory traces of a Bazel instance, you could +specify: + +
+ % bazel clean --expunge ++ +Alternatively, you can expunge in the background by using +`--expunge_async`. It is safe to invoke a Bazel command +in the same client while the asynchronous expunge continues to run. + +Note: This may introduce IO contention. + +The `clean` command is provided primarily as a means of +reclaiming disk space for workspaces that are no longer needed. +Bazel's incremental rebuilds may not be +perfect so `clean` can be used to recover a consistent +state when problems arise. + +Bazel's design is such that these problems are fixable and +these bugs are a high priority to be fixed. If you +ever find an incorrect incremental build, file a bug report, and report bugs in the tools +rather than using `clean`. + +## Querying the dependency graph {:#querying-dependency-graph} + +Bazel includes a query language for asking questions about the +dependency graph used during the build. The query language is used +by two commands: query and cquery. The major difference between the +two commands is that query runs after the [loading phase](/run/build#loading) +and cquery runs after the [analysis phase](/run/build#analysis). These tools are an +invaluable aid to many software engineering tasks. + +The query language is based on the idea of +algebraic operations over graphs; it is documented in detail in + +[Bazel Query Reference](/query/language). +Please refer to that document for reference, for +examples, and for query-specific command-line options. + +The query tool accepts several command-line +option. `--output` selects the output format. +`--[no]keep_going` (disabled by default) causes the query +tool to continue to make progress upon errors; this behavior may be +disabled if an incomplete result is not acceptable in case of errors. + +The `--[no]tool_deps` option, +enabled by default, causes dependencies in non-target configurations to be included in the +dependency graph over which the query operates. + +The `--[no]implicit_deps` option, enabled by default, causes +implicit dependencies to be included in the dependency graph over which the query operates. An +implicit dependency is one that is not explicitly specified in the BUILD file +but added by bazel. + +Example: "Show the locations of the definitions (in BUILD files) of +all genrules required to build all the tests in the PEBL tree." + +
+ bazel query --output location 'kind(genrule, deps(kind(".*_test rule", foo/bar/pebl/...)))'
+
+
+## Querying the action graph {:#aquery}
+
+Caution: The aquery command is still experimental and its API will change.
+
+The `aquery` command allows you to query for actions in your build graph.
+It operates on the post-analysis configured target graph and exposes
+information about actions, artifacts and their relationships.
+
+The tool accepts several command-line options.
+`--output` selects the output format. The default output format
+(`text`) is human-readable, use `proto` or `textproto` for
+machine-readable format.
+Notably, the aquery command runs on top of a regular Bazel build and inherits
+the set of options available during a build.
+
+It supports the same set of functions that is also available to traditional
+`query` but `siblings`, `buildfiles` and
+`tests`.
+
+For more details, see [Action Graph Query](/query/aquery).
+
+## Miscellaneous commands and options {:#misc-commands-options}
+
+### `help` {:#help}
+
+The `help` command provides on-line help. By default, it
+shows a summary of available commands and help topics, as shown in
+[Building with Bazel](/run/build#quickstart).
+Specifying an argument displays detailed help for a particular
+topic. Most topics are Bazel commands, such as `build`
+or `query`, but there are some additional help topics
+that do not correspond to commands.
+
+#### `--[no]long` (`-l`) {:#long}
+
+By default, `bazel help [{{ "" }}topic{{ "" }}]` prints only a
+summary of the relevant options for a topic. If
+the `--long` option is specified, the type, default value
+and full description of each option is also printed.
+
+### `shutdown` {:#shutdown}
+
+Bazel server processes may be stopped by using the `shutdown`
+command. This command causes the Bazel server to exit as soon as it
+becomes idle (for example, after the completion of any builds or other
+commands that are currently in progress). For more details, see
+[Client/server implementation](/run/client-server).
+
+Bazel servers stop themselves after an idle timeout, so this command
+is rarely necessary; however, it can be useful in scripts when it is
+known that no further builds will occur in a given workspace.
+
+`shutdown` accepts one
+option, `--iff_heap_size_greater_than _n_`, which
+requires an integer argument (in MB). If specified, this makes the shutdown
+conditional on the amount of memory already consumed. This is
+useful for scripts that initiate a lot of builds, as any memory
+leaks in the Bazel server could cause it to crash spuriously on
+occasion; performing a conditional restart preempts this condition.
+
+### `info` {:#info}
+
+The `info` command prints various values associated with
+the Bazel server instance, or with a specific build configuration.
+(These may be used by scripts that drive a build.)
+
+The `info` command also permits a single (optional)
+argument, which is the name of one of the keys in the list below.
+In this case, `bazel info {{ "" }}key{{ "" }}` will print only
+the value for that one key. (This is especially convenient when
+scripting Bazel, as it avoids the need to pipe the result
+through `sed -ne /key:/s/key://p`:
+
+#### Configuration-independent data {:#configuration-independent-data}
+
+* `release`: the release label for this Bazel
+ instance, or "development version" if this is not a released
+ binary.
+* `workspace` the absolute path to the base workspace
+ directory.
+* `install_base`: the absolute path to the installation
+ directory used by this Bazel instance for the current user. Bazel
+ installs its internally required executables below this directory.
+
+* `output_base`: the absolute path to the base output
+ directory used by this Bazel instance for the current user and
+ workspace combination. Bazel puts all of its scratch and build
+ output below this directory.
+* `execution_root`: the absolute path to the execution
+ root directory under output_base. This directory is the root for all files
+ accessible to commands executed during the build, and is the working
+ directory for those commands. If the workspace directory is writable, a
+ symlink named `bazel-% bazel info server_pid +1285 ++ +#### Configuration-specific data {:#configuration-specific-data} + +These data may be affected by the configuration options passed +to `bazel info`, for +example `--cpu`, `--compilation_mode`, +etc. The `info` command accepts all +the options that control dependency +analysis, since some of these determine the location of the +output directory of a build, the choice of compiler, etc. + +* `bazel-bin`, `bazel-testlogs`, + `bazel-genfiles`: reports the absolute path to + the `bazel-*` directories in which programs generated by the + build are located. This is usually, though not always, the same as + the `bazel-*` symlinks created in the base workspace directory after a + successful build. However, if the workspace directory is read-only, + no `bazel-*` symlinks can be created. Scripts that use + the value reported by `bazel info`, instead of assuming the + existence of the symlink, will be more robust. +* The complete + ["Make" environment](/reference/be/make-variables). If the `--show_make_env` flag is + specified, all variables in the current configuration's "Make" environment + are also displayed (such as `CC`, `GLIBC_VERSION`, etc). + These are the variables accessed using the `$(CC)` + or `varref("CC")` syntax inside BUILD files. + +Example: the C++ compiler for the current configuration. +This is the `$(CC)` variable in the "Make" environment, +so the `--show_make_env` flag is needed. + +
+ % bazel info --show_make_env -c opt COMPILATION_MODE + opt ++ +Example: the `bazel-bin` output directory for the current +configuration. This is guaranteed to be correct even in cases where +the `bazel-bin` symlink cannot be created for some reason +(such as if you are building from a read-only directory). + +
% bazel info --cpu=piii bazel-bin +/var/tmp/_bazel_johndoe/fbd0e8a34f61ce5d491e3da69d959fe6/execroot/io_bazel/bazel-out/piii-opt/bin +% bazel info --cpu=k8 bazel-bin +/var/tmp/_bazel_johndoe/fbd0e8a34f61ce5d491e3da69d959fe6/execroot/io_bazel/bazel-out/k8-opt/bin ++ +### `version` and `--version` {:#version} + +The version command prints version details about the built Bazel +binary, including the changelist at which it was built and the date. +These are particularly useful in determining if you have the latest +Bazel, or if you are reporting bugs. Some of the interesting values +are: + +* `changelist`: the changelist at which this version of + Bazel was released. +* `label`: the release label for this Bazel + instance, or "development version" if this is not a released + binary. Very useful when reporting bugs. + +`bazel --version`, with no other args, will emit the same output as +`bazel version --gnu_format`, except without the side-effect of potentially starting +a Bazel server or unpacking the server archive. `bazel --version` can be run from +anywhere - it does not require a workspace directory. + +### `mobile-install` {:#mobile-install} + +The `mobile-install` command installs apps to mobile devices. +Currently only Android devices running ART are supported. + +See [bazel mobile-install](/docs/mobile-install) for more information. + +Note: This command does not install the same thing that +`bazel build` produces: Bazel tweaks the app so that it can be +built, installed and re-installed quickly. This should, however, be mostly +transparent to the app. + +The following options are supported: + +#### `--incremental` {:#incremental} + +If set, Bazel tries to install the app incrementally, that is, only those +parts that have changed since the last build. This cannot update resources +referenced from `AndroidManifest.xml`, native code or Java +resources (such as those referenced by `Class.getResource()`). If these +things change, this option must be omitted. Contrary to the spirit of Bazel +and due to limitations of the Android platform, it is the +**responsibility of the user** to know when this command is good enough and +when a full install is needed. + +If you are using a device with Marshmallow or later, consider the +[`--split_apks`](#split-apks) flag. + +#### `--split_apks` {:#split-apks} + +Whether to use split apks to install and update the application on the device. +Works only with devices with Marshmallow or later. Note that the +[`--incremental`](#incremental) flag +is not necessary when using `--split_apks`. + +#### `--start_app` {:#start-app} + +Starts the app in a clean state after installing. Equivalent to `--start=COLD`. + +#### `--debug_app` {:#debug-app} + +Waits for debugger to be attached before starting the app in a clean state after installing. +Equivalent to `--start=DEBUG`. + +#### `--start=_start_type_` {:#start} + +How the app should be started after installing it. Supported _start_type_s are: + +* `NO` Does not start the app. This is the default. +* `COLD` Starts the app from a clean state after install. +* `WARM` Preserves and restores the application state on incremental installs. +* `DEBUG` Waits for the debugger before starting the app in a clean state after + install. + +Note: If more than one of `--start=_start_type_`, `--start_app` or +`--debug_app` is set, the last value is used. + +#### `--adb={{ "" }}path{{ "" }}` {:#adb} + +Indicates the `adb` binary to be used. + +The default is to use the adb in the Android SDK specified by +[`--android_sdk`](#android-sdk). + +#### `--adb_arg={{ "" }}serial{{ "" }}` {:#adb-arg} + +Extra arguments to `adb`. These come before the subcommand in the +command line and are typically used to specify which device to install to. +For example, to select the Android device or emulator to use: + +
% bazel mobile-install --adb_arg=-s --adb_arg=deadbeef ++ +invokes `adb` as + +
+adb -s deadbeef install ... ++ +#### `--incremental_install_verbosity={{ "" }}number{{ "" }}` {:#incremental-install-verbosity} + +The verbosity for incremental install. Set to 1 for debug logging to be +printed to the console. + +### `dump` {:#dump} + +The `dump` command prints to stdout a dump of the +internal state of the Bazel server. This command is intended +primarily for use by Bazel developers, so the output of this command +is not specified, and is subject to change. + +By default, command will just print help message outlining possible +options to dump specific areas of the Bazel state. In order to dump +internal state, at least one of the options must be specified. + +Following options are supported: + +* `--action_cache` dumps action cache content. +* `--packages` dumps package cache content. +* `--skyframe` dumps state of internal Bazel dependency graph. +* `--rules` dumps rule summary for each rule and aspect class, + including counts and action counts. This includes both native and Starlark rules. + If memory tracking is enabled, then the rules' memory consumption is also printed. +* `--skylark_memory` dumps a + [pprof](https://github.com/google/pprof) compatible .gz file to the specified path. + You must enable memory tracking for this to work. + +#### Memory tracking {:#memory-tracking} + +Some `dump` commands require memory tracking. To turn this on, you have to pass +startup flags to Bazel: + +* `--host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar` +* `--host_jvm_args=-DRULE_MEMORY_TRACKER=1` + +The java-agent is checked into Bazel at +`third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar`, so +make sure you adjust `$BAZEL` for where you keep your Bazel repository. + +Do not forget to keep passing these options to Bazel for every command or the server will +restart. + +Example: + +
+ % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar \ + --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \ + build --nobuild <targets> + + # Dump rules + % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar \ + --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \ + dump --rules + + # Dump Starlark heap and analyze it with pprof + % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar \ + --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \ + dump --skylark_memory=$HOME/prof.gz + % pprof -flame $HOME/prof.gz ++ +### `analyze-profile` {:#analyze-profile} + +The `analyze-profile` command analyzes a +[JSON trace profile](/advanced/performance/json-trace-profile) previously +gathered during a Bazel invocation. + +### `canonicalize-flags` {:#canonicalize-flags} + +The [`canonicalize-flags`](/reference/command-line-reference#canonicalize-flags-options) +command, which takes a list of options for a Bazel command and returns a list of +options that has the same effect. The new list of options is canonical. For example, +two lists of options with the same effect are canonicalized to the same new list. + +The `--for_command` option can be used to select between different +commands. At this time, only `build` and `test` are +supported. Options that the given command does not support cause an error. + +Note: A small number of options cannot be reordered, because Bazel cannot +ensure that the effect is identical. Also note that this command +_does not_ expand flags from `--config`. + +As an example: + +
+ % bazel canonicalize-flags -- --config=any_name --test_tag_filters="-lint" + --config=any_name + --test_tag_filters=-lint ++ +### Startup options {:#startup-options} + +The options described in this section affect the startup of the Java +virtual machine used by Bazel server process, and they apply to all +subsequent commands handled by that server. If there is an already +running Bazel server and the startup options do not match, it will +be restarted. + +All of the options described in this section must be specified using the +`--key=value` or `--key value` +syntax. Also, these options must appear _before_ the name of the Bazel +command. Use `startup --key=value` to list these in a `.bazelrc` file. + +#### `--output_base={{ "" }}dir{{ "" }}` {:#output-base} + +This option requires a path argument, which must specify a +writable directory. Bazel will use this location to write all its +output. The output base is also the key by which the client locates +the Bazel server. By changing the output base, you change the server +which will handle the command. + +By default, the output base is derived from the user's login name, +and the name of the workspace directory (actually, its MD5 digest), +so a typical value looks like: +`/var/tmp/google/_bazel_johndoe/d41d8cd98f00b204e9800998ecf8427e`. + +Note: The client uses the output base to find the Bazel server +instance, so if you specify a different output base in a Bazel +command, a different server will be found (or started) to handle the +request. It's possible to perform two concurrent builds in the same +workspace directory by varying the output base. + +For example: + +
+ OUTPUT_BASE=/var/tmp/google/_bazel_johndoe/custom_output_base
+% bazel --output_base ${OUTPUT_BASE}1 build //foo & bazel --output_base ${OUTPUT_BASE}2 build //bar
+
+
+In this command, the two Bazel commands run concurrently (because of
+the shell `&` operator), each using a different Bazel
+server instance (because of the different output bases).
+In contrast, if the default output base was used in both commands,
+then both requests would be sent to the same server, which would
+handle them sequentially: building `//foo` first, followed
+by an incremental build of `//bar`.
+
+Note: We recommend you do not use an NFS or similar networked file system for the root
+directory, as the higher access latency will cause noticeably slower builds.
+
+#### `--output_user_root={{ "" }}dir{{ "" }}` {:#output-user-root}
+
+Points to the root directory where output and install bases are created. The directory
+must either not exist or be owned by the calling user. In the past,
+this was allowed to point to a directory shared among various users
+but it's not allowed any longer. This may be allowed once
+[issue #11100](https://github.com/bazelbuild/bazel/issues/11100){: .external} is addressed.
+
+If the `--output_base` option is specified, it overrides
+using `--output_user_root` to calculate the output base.
+
+The install base location is calculated based on
+`--output_user_root`, plus the MD5 identity of the Bazel embedded
+binaries.
+
+You can use the `--output_user_root` option to choose an
+alternate base location for all of Bazel's output (install base and output
+base) if there is a better location in your filesystem layout.
+
+Note: We recommend you do not use an NFS or similar networked file system for the root
+directory, as the higher access latency will cause noticeably slower builds.
+
+#### `--server_javabase={{ "" }}dir{{ "" }}` {:#server-javabase}
+
+Specifies the Java virtual machine in which _Bazel itself_ runs. The value must be a path to
+the directory containing a JDK or JRE. It should not be a label.
+This option should appear before any Bazel command, for example:
+
++ % bazel --server_javabase=/usr/local/buildtools/java/jdk build //foo ++ +This flag does _not_ affect the JVMs used by Bazel subprocesses such as applications, tests, +tools, and so on. Use build options [--javabase](#javabase) or +[--host_javabase](#host-javabase) instead. + +This flag was previously named `--host_javabase` (sometimes referred to as the +'left-hand side' `--host_javabase`), but was renamed to avoid confusion with the +build flag [--host_javabase](#host-javabase) (sometimes referred to as the +'right-hand side' `--host_javabase`). + +#### `--host_jvm_args={{ "" }}string{{ "" }}` {:#host-jvm-args} + +Specifies a startup option to be passed to the Java virtual machine in which _Bazel itself_ +runs. This can be used to set the stack size, for example: + +
+ % bazel --host_jvm_args="-Xss256K" build //foo ++ +This option can be used multiple times with individual arguments. Note that +setting this flag should rarely be needed. You can also pass a space-separated list of strings, +each of which will be interpreted as a separate JVM argument, but this feature will soon be +deprecated. + +That this does _not_ affect any JVMs used by +subprocesses of Bazel: applications, tests, tools, and so on. To pass +JVM options to executable Java programs, whether run by `bazel +run` or on the command-line, you should use +the `--jvm_flags` argument which +all `java_binary` and `java_test` programs +support. Alternatively for tests, use `bazel test --test_arg=--jvm_flags=foo ...`. + +#### `--host_jvm_debug` {:#host-java-debug} + +This option causes the Java virtual machine to wait for a connection +from a JDWP-compliant debugger before +calling the main method of _Bazel itself_. This is primarily +intended for use by Bazel developers. + +Note: This does _not_ affect any JVMs used by subprocesses of Bazel: +applications, tests, tools, etc. + +#### `--autodetect_server_javabase` {:#autodetect-server-javabase} + +This option causes Bazel to automatically search for an installed JDK on startup, +and to fall back to the installed JRE if the embedded JRE isn't available. +`--explicit_server_javabase` can be used to pick an explicit JRE to +run Bazel with. + +#### `--batch` {:#batch} + +Batch mode causes Bazel to not use the +[standard client/server mode](/run/client-server), but instead runs a bazel +java process for a single command, which has been used for more predictable +semantics with respect to signal handling, job control, and environment +variable inheritance, and is necessary for running bazel in a chroot jail. + +Batch mode retains proper queueing semantics within the same output_base. +That is, simultaneous invocations will be processed in order, without overlap. +If a batch mode Bazel is run on a client with a running server, it first +kills the server before processing the command. + +Bazel will run slower in batch mode, or with the alternatives described above. +This is because, among other things, the build file cache is memory-resident, so it is not +preserved between sequential batch invocations. +Therefore, using batch mode often makes more sense in cases where performance +is less critical, such as continuous builds. + +Warning: `--batch` is sufficiently slower than standard +client/server mode. Additionally it might not support all of the features and optimizations which +are made possible by a persistent Bazel server. If you're using `--batch` +for the purpose of build isolation, you should use the command option +`--nokeep_state_after_build`, which guarantees that no incremental +in-memory state is kept between builds. In order to restart the Bazel server and JVM after a +build, please explicitly do so using the "shutdown" command. + +#### `--max_idle_secs={{ "" }}n{{ "" }}` {:#max-idle-secs} + +This option specifies how long, in seconds, the Bazel server process +should wait after the last client request, before it exits. The +default value is 10800 (3 hours). `--max_idle_secs=0` will cause the +Bazel server process to persist indefinitely. + +Note: this flag is only read if Bazel needs +to start a new server. Changing this option will not cause the server to restart. + +Note: system sleep time where a build is not running is counted as idle time. + +This option may be used by scripts that invoke Bazel to ensure that +they do not leave Bazel server processes on a user's machine when they +would not be running otherwise. +For example, a presubmit script might wish to +invoke `bazel query` to ensure that a user's pending +change does not introduce unwanted dependencies. However, if the +user has not done a recent build in that workspace, it would be +undesirable for the presubmit script to start a Bazel server just +for it to remain idle for the rest of the day. +By specifying a small value of `--max_idle_secs` in the +query request, the script can ensure that _if_ it caused a new +server to start, that server will exit promptly, but if instead +there was already a server running, that server will continue to run +until it has been idle for the usual time. Of course, the existing +server's idle timer will be reset. + +#### `--[no]shutdown_on_low_sys_mem` {:#shutdown-on-low-sys-mem} + +If enabled and `--max_idle_secs` is set to a positive duration, +after the build server has been idle for a while, shut down the server when the system is +low on memory. Linux only. + +In addition to running an idle check corresponding to max_idle_secs, the build server will +starts monitoring available system memory after the server has been idle for some time. +If the available system memory becomes critically low, the server will exit. + +#### `--[no]block_for_lock` {:#block-for-lock} + +If enabled, Bazel will wait for other Bazel commands holding the +server lock to complete before progressing. If disabled, Bazel will +exit in error if it cannot immediately acquire the lock and +proceed. + +Developers might use this in presubmit checks to avoid long waits caused +by another Bazel command in the same client. + +#### `--io_nice_level={{ "" }}n{{ "" }}` {:#io-nice-level} + +Sets a level from 0-7 for best-effort IO scheduling. 0 is highest priority, +7 is lowest. The anticipatory scheduler may only honor up to priority 4. +Negative values are ignored. + +#### `--batch_cpu_scheduling` {:#batch-cpu-scheduling} + +Use `batch` CPU scheduling for Bazel. This policy is useful for +workloads that are non-interactive, but do not want to lower their nice value. +See 'man 2 sched_setscheduler'. This policy may provide for better system +interactivity at the expense of Bazel throughput. + +### Miscellaneous options {:#misc-options} + +#### `--[no]announce_rc` {:#announce-rc} + +Controls whether Bazel announces startup options and command options read from +the bazelrc files when starting up. + +#### `--color (yes|no|auto)` {:#color} + +This option determines whether Bazel will use colors to highlight +its output on the screen. + +If this option is set to `yes`, color output is enabled. +If this option is set to `auto`, Bazel will use color output only if +the output is being sent to a terminal and the TERM environment variable +is set to a value other than `dumb`, `emacs`, or `xterm-mono`. +If this option is set to `no`, color output is disabled, +regardless of whether the output is going to a terminal and regardless +of the setting of the TERM environment variable. + +#### `--config={{ "" }}name{{ "" }}` {:#config} + +Selects additional config section from +[the rc files](/run/bazelrc#bazelrc-file-locations); for the current `command`, +it also pulls in the options from `command:name` if such a section exists. Can be +specified multiple times to add flags from several config sections. Expansions can refer to other +definitions (for example, expansions can be chained). + +#### `--curses (yes|no|auto)` {:#curses} + +This option determines whether Bazel will use cursor controls +in its screen output. This results in less scrolling data, and a more +compact, easy-to-read stream of output from Bazel. This works well with +`--color`. + +If this option is set to `yes`, use of cursor controls is enabled. +If this option is set to `no`, use of cursor controls is disabled. +If this option is set to `auto`, use of cursor controls will be +enabled under the same conditions as for `--color=auto`. + +#### `--[no]show_timestamps` {:#show-timestamps} + +If specified, a timestamp is added to each message generated by +Bazel specifying the time at which the message was displayed. diff --git a/extending/config.mdx b/extending/config.mdx new file mode 100644 index 000000000..0e44c3448 --- /dev/null +++ b/extending/config.mdx @@ -0,0 +1,789 @@ +--- +title: 'Configurations' +--- + +
+# Clone the Bazel Central Registry repository +git clone https://github.com/bazelbuild/bazel-central-registry.git +cd bazel-central-registry + +# Build the migration tool +bazel build //tools:migrate_to_bzlmod + +# Create a convenient alias for the tool +alias migrate2bzlmod=$(realpath ./bazel-bin/tools/migrate_to_bzlmod) + +# Navigate to your project's root directory and run the tool +cd <your project root> +migrate2bzlmod -t <targets> ++ +### Files generated by this script {:#migration-script-files} + +* `MODULE.bazel` - The central manifest file for Bzlmod, which declares the + project's metadata and its direct dependencies on other Bazel modules. +* `migration_info.md` - A file providing step-by-step instructions on how the + migration tool was executed, designed to assist in the manual completion of + the migration process, if necessary. +* `resolved_deps.py` - Contains a comprehensive list of the project's external + dependencies, generated by analyzing the project's `WORKSPACE` file, serving + as a reference during the transition. +* `query_direct_deps` - Contains migration-relevant information regarding the + utilized targets, obtained by invoking Bazel with `--output=build` on the + project's `WORKSPACE` file. This file is primarily consumed by the migration + script. +* `extension_for_XXX` - A file containing a module extension + definition. The migration tool generates these files for dependencies that + are not standard Bazel modules but can be managed using Bzlmod's [module + extensions](/external/extension). + +### Flags {:#migration-script-flags} + +Flags available in this migration scripts are: + +* `--t`/`--target`: Targets to migrate. This flag is repeatable, and the + targets are accumulated. +* `--i`/`--initial`: Deletes `MODULE.bazel`, `resolved_deps.py`, + `migration_info.md` files and starts from scratch - Detect direct + dependencies, introduce them in MODULE.bazel and rerun generation of + resolved dependencies. + +### Post-migration cleanup {:#post-migration-cleanup} + +* Delete `migration_info.md`, `resolved_deps.py` and `query_direct_deps`. +* Clean up comments from `MODULE.bazel` file which were used for the + migration, such as `# -- bazel_dep definitions -- #`. + +## Migration Example {:#migration-tool-example} + +To see the migration script in action, consider the following scenario when +Python, Maven and Go dependencies are declared in `WORKSPACE` file. + +
+ bazel 7.6.1 + + Generating ./resolved_deps.py file - It might take a while... + + RESOLVED:+ +which gives the following important information: + +* Generates `./resolved_deps.py` file, which contains info about all external + repositories declared and loaded using your `WORKSPACE` file. +* `RESOLVED` keyword describes all dependencies which are resolved by the tool + and added to the `MODULE.bazel` file. +* `IMPORTANT` keyword describes significant information worth investing time. +* All dependencies have been resolved in this example, at least with + `--nobuild` flag. +* It is important to run the full build (command specified) and manually fix + potential errors (e.g. toolchain not registered correctly). +* `migration_info.md` file contains details about the migration. Check details + [at this section](#migration-tool-report-generation). + +### Transformations {:#migration-tool-transformations} + +This section illustrates the migration of code from the `WORKSPACE` file to +`MODULE.bazel`. + +rules_javahas been introduced as a Bazel module. + RESOLVED:bazel_gazellehas been introduced as a Bazel module. + RESOLVED:io_bazel_rules_gohas been introduced as a Bazel module. + RESOLVED:rules_pythonhas been introduced as a Bazel module. + IMPORTANT: 3.11 is used as a default python version. If you need a different version, please change it manually and then rerun the migration tool. + RESOLVED:my_python_depshas been introduced as python extension. + RESOLVED:org_golang_x_nethas been introduced as go extension. + RESOLVED:rules_jvm_externalhas been introduced as a Bazel module. + RESOLVED:org.antlrhas been introduced as maven extension. + RESOLVED:rules_shellhas been introduced as a Bazel module. + + Congratulations! All external repositories needed for building //... are available with Bzlmod! + IMPORTANT: Fix potential build time issues by running the following command: + bazel build --enable_bzlmod --noenable_workspace //... + + IMPORTANT:For details about the migration process, check `migration_info.md` file.+
WORKSPACE - Bazel Module
++http_archive( + name = "rules_shell", + sha256 = "3e114424a5c7e4fd43e0133cc6ecdfe54e45ae8affa14fadd839f29901424043", + strip_prefix = "rules_shell-0.4.0", + url = "https://github.com/bazelbuild/rules_shell/releases/download/v0.4.0/rules_shell-v0.4.0.tar.gz", +) ++
MODULE.bazel - Bazel Module
++bazel_dep(name = "rules_shell", version = "0.6.1") ++
WORKSPACE - Go Extension
+
+http_archive(
+ name = "io_bazel_rules_go",
+ integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=",
+ urls = [
+ "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip",
+ "https://github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip",
+ ],
+)
+http_archive(
+ name = "bazel_gazelle",
+ integrity = "sha256-12v3pg/YsFBEQJDfooN6Tq+YKeEWVhjuNdzspcvfWNU=",
+ urls = [
+ "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz",
+ "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz",
+ ],
+)
+
+load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
+load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
+
+go_rules_dependencies()
+go_register_toolchains(version = "1.23.1")
+gazelle_dependencies()
+
+go_repository(
+ name = "org_golang_x_net",
+ importpath = "golang.org/x/net",
+ sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=",
+ version = "v0.0.0-20190311183353-d8887717615a",
+ build_file_proto_mode = "disable",
+ build_naming_convention = "import",
+)
+
+ MODULE.bazel - Go Extension
+
+go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps")
+go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk")
+
+go_deps.from_file(go_mod = "//:go.mod")
+use_repo(go_deps, "org_golang_x_net")
+go_sdk.from_file(go_mod = "//:go.mod")
+
+go_deps.gazelle_override(
+ path = "golang.org/x/net",
+ directives = [
+ "gazelle:proto disable",
+ "gazelle:go_naming_convention import",
+ ],
+)
+
+ WORKSPACE - Python Extension
+
+http_archive(
+ name = "rules_python",
+ integrity = "sha256-qDdnnxOC8mlowe5vg5x9r5B5qlMSgGmh8oFd7KpjcwQ=",
+ strip_prefix = "rules_python-1.4.0",
+ url = "https://github.com/bazelbuild/rules_python/releases/download/1.4.0/rules_python-1.4.0.tar.gz",
+)
+
+load("@rules_python//python:repositories.bzl", "py_repositories")
+py_repositories()
+
+load("@rules_python//python:pip.bzl", "pip_parse")
+pip_parse(
+ name = "my_python_deps",
+ requirements_lock = "@example//:requirements_lock.txt",
+)
+
+load("@my_python_deps//:requirements.bzl", "install_deps")
+install_deps()
+
+load("@rules_python//python:repositories.bzl", "python_register_toolchains")
+python_register_toolchains(
+ name = "python_3_11",
+ python_version = "3.11",
+)
+
+ MODULE.bazel - Python Extension
+
+pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
+pip.parse(
+ hub_name = "my_python_deps",
+ python_version = "3.11",
+ requirements_lock = "//:requirements_lock.txt",
+)
+use_repo(pip, "my_python_deps")
+
+python = use_extension("@rules_python//python/extensions:python.bzl", "python")
+python.defaults(python_version = "3.11")
+python.toolchain(python_version = "3.11")
+
+ WORKSPACE - Maven Extension
+
+
+RULES_JVM_EXTERNAL_TAG = "4.5"
+RULES_JVM_EXTERNAL_SHA = "b17d7388feb9bfa7f2fa09031b32707df529f26c91ab9e5d909eb1676badd9a6"
+
+http_archive(
+ name = "rules_jvm_external",
+ strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
+ sha256 = RULES_JVM_EXTERNAL_SHA,
+ url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
+)
+
+load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps")
+rules_jvm_external_deps()
+load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup")
+rules_jvm_external_setup()
+
+load("@rules_jvm_external//:defs.bzl", "maven_install")
+maven_install(
+ name = "px_deps",
+ artifacts = [
+ "org.antlr:antlr4:4.11.1",
+ ],
+ repositories = [
+ "https://repo1.maven.org/maven2",
+ ],
+)
+
+ MODULE.bazel - Maven Extension
+
+bazel_dep(name = "rules_jvm_external", version = "6.8")
+
+maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
+use_repo(maven, "px_deps")
+
+maven.artifact(
+ name = "px_deps",
+ group = "org.antlr",
+ artifact = "antlr4",
+ version = "4.11.1"
+)
+
+ WORKSPACE - Repo rule
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+http_archive(
+ name = "com_github_cockroachdb_cockroach",
+ sha256 = "6c3568ef244ce6b874694eeeecb83ed4f5d5dff6cf037c952ecde76828a6c502",
+ strip_prefix = "cockroach-22.1.6",
+ url = "https://github.com/cockroachdb/cockroach/archive/v22.1.6.tar.gz",
+)
+
+ MODULE.bazel - Repo rule
+
+http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+http_archive(
+ name = "com_github_cockroachdb_cockroach",
+ url = "https://github.com/cockroachdb/cockroach/archive/v22.1.6.tar.gz",
+ sha256 = "6c3568ef244ce6b874694eeeecb83ed4f5d5dff6cf037c952ecde76828a6c502",
+ strip_prefix = "cockroach-22.1.6",
+)
+
+ WORKSPACE - Module extension
+
+load(":my_custom_macro.bzl", "my_custom_macro")
+
+my_custom_macro(
+ name = "my_custom_repo",
+)
+
+ MODULE.bazel - Module extension
+
+extension_for_my_custom_macro = use_extension("//:extension_for_my_custom_macro.bzl", "extension_for_my_custom_macro")
+use_repo(extension_for_my_custom_macro, "my_custom_repo")
+
+ extension_for_my_custom_macro.bzl
+
+load("//:my_custom_macro.bzl", "my_custom_macro")
+
+def _extension_for_my_custom_macro_impl(ctx):
+ my_custom_macro(
+ name = "my_custom_repo",
+ )
+
+extension_for_my_custom_macro = module_extension(implementation = _extension_for_my_custom_macro_impl)
+
+ + > Click here to see where and how the repo was declared in the WORKSPACE + file ++ +* For each dependency, how it was implemented in `MODULE.bazel` file. From the + earlier [Migration Example](#migration-tool-example), that would look as: + 1. Bazel module Dependency - `Migration of rules_python` + +
+ Found perfect name match in BCR: rules_python + Found partially name matches in BCR: rules_python_gazelle_plugin + + It has been introduced as a Bazel module: + `bazel_dep(name = "rules_python", version = "1.6.1")` ++ + * The script will automatically use the `perfect name match` if it finds + it. In case of an error, you can double check if the name was correctly + added. + 2. Python extension - `Migration of my_python_deps` + +
+ pip.parse( + hub_name = "my_python_deps", + requirements_lock = "//:requirements_lock.txt", + python_version = "3.11", + ) + use_repo(pip, "my_python_deps") ++ + 3. Maven extension - `Migration of org.antlr (px_deps):` + +
+ maven.artifact( + name = "px_deps", + group = "org.antlr", + artifact = "antlr4", + version = "4.11.1" + ) ++ + 4. Go extension - `Migration of org_golang_x_net` + +
+ go_deps.from_file(go_mod = "//:go.mod") + go_sdk.from_file(go_mod = "//:go.mod") + + go_deps.gazelle_override( + path = "golang.org/x/net", + directives = [ + "gazelle:proto disable", + "gazelle:go_naming_convention import", + ], + ) ++ + * It has been introduced as a go module with the help of `go.mod`. If + `go.mod` and `go.sum` are not available, go module is added directly + to the `MODULE.bazel` file. + * `gazelle_override` is used for adding specific directives. + +## Useful links {:#useful-links} + +* Official pages for the external extensions + * [rules_jvm_external](https://github.com/bazelbuild/rules_jvm_external/blob/master/docs/bzlmod.md) + * [rules_go](https://github.com/bazelbuild/rules_go/blob/master/docs/go/core/bzlmod.md) + * [rules_python](https://rules-python.readthedocs.io/en/latest/pypi/download.html) +* Community posts and videos + * [Migrating to Bazel Modules](https://blog.engflow.com/2025/01/16/migrating-to-bazel-modules-aka-bzlmod---module-extensions/index.html#migrating-to-bazel-modules-aka-bzlmod-module-extensions). + * [Moving to Bzlmod](https://www.youtube.com/watch?v=W9uXRYLVHUk). + * [How Uber Manages Go Dependencies with Bzlmod](https://www.youtube.com/watch?v=hIqzkUE_pSY). + +## Feedback {:#feedback} + +If you would like to contribute, do so by creating an Issue or PR at +[bazel-central-registry](https://github.com/bazelbuild/bazel-central-registry). diff --git a/external/mod-command.mdx b/external/mod-command.mdx new file mode 100644 index 000000000..0bf1a564f --- /dev/null +++ b/external/mod-command.mdx @@ -0,0 +1,583 @@ +keywords: Bzlmod + +--- +title: '`mod` Command' +--- + +The `mod` command provides a range of tools to help the user understand their +external dependency graph. It lets you visualize the dependency graph, find out +why a certain module or a version of a module is present in the graph, view the +repo definitions backing modules, inspect usages of module extensions and repos +they generate, among other functions. + +## Syntax {:#syntax} + +```sh +bazel mod
|
+ |
+
+ |
+
+ somepath(S1 + S2, E), one possible result. |
+
+ somepath(S1 + S2, E), another possible result. |
+
+ allpaths(S1 + S2, E) |
+
| Code | +Target | +Kind | +
|---|---|---|
+ + genrule( + name = "a", + srcs = ["a.in"], + outs = ["a.out"], + cmd = "...", + ) ++ |
+ //p:a |
+ genrule rule | +
//p:a.in |
+ source file | +|
//p:a.out |
+ generated file | +|
//p:BUILD |
+ source file | +
+ + minrank + + 0 //c:c + 1 //b:b + 1 //a:a + 2 //b:b.cc + 2 //a:a.cc ++ |
+
+ + maxrank + + 0 //c:c + 1 //b:b + 2 //a:a + 2 //b:b.cc + 3 //a:a.cc ++ |
+
Mac and Cheese
-Check the tags and dependencies for useful information.
-This review was describing the Pizza and Amir was the reviewer. If you look at what dependencies that this rule had using
-bazel query --noimplicit_deps 'deps(//src/main/java/com/example/reviews:review)'
+bazel query --noimplicit\_deps 'deps(//src/main/java/com/example/reviews:review)'
The result of this command reveals that Amir is the reviewer!
Next, since you know the reviewer is Amir, you can use the query function to seek which tag Amir has in the `BUILD` file to see what dish is there.
The command bazel query 'attr(tags, "pizza", //src/main/java/com/example/customers/...)' output that Amir is the only customer that ordered a pizza and is the reviewer which gives us the answer.
-
-