Common definitions
This section defines various terms and concepts that are common to many functions or build rules.
Contents
Bourne shell tokenization
Certain string attributes of some rules are split into multiple words according to the tokenization rules of the Bourne shell: unquoted spaces delimit separate words, and single- and double-quotes characters and backslashes are used to prevent tokenization.
Those attributes that are subject to this tokenization are explicitly indicated as such in their definitions in this document.
Attributes subject to "Make" variable expansion and Bourne shell
tokenization are typically used for passing arbitrary options to
compilers and other tools. Examples of such attributes are
cc_library.copts
and java_library.javacopts
.
Together these substitutions allow a
single string variable to expand into a configuration-specific list
of option words.
Label expansion
Some string attributes of a very few rules are subject to label
expansion: if those strings contain a valid label as a
substring, such as //mypkg:target
, and that label is a
declared prerequisite of the current rule, it is expanded into the
pathname of the file represented by the
target
//mypkg:target
.
Example attributes include genrule.cmd
and
cc_binary.linkopts
. The details may vary significantly in
each case, over such issues as: whether relative labels are
expanded; how labels that expand to multiple files are
treated, etc. Consult the rule attribute documentation for
specifics.
Typical attributes defined by most build rules
This section describes attributes that are defined by many build rules, but not all.
Attribute | Description |
---|---|
data |
Files needed by this rule at runtime. May list file or rule targets. Generally allows any target.
The default outputs and runfiles of targets in the
New rules should define a |
deps |
Dependencies for this target. Generally should only list rule targets. (Though
some rules permit files to be listed directly in Language-specific rules generally limit the listed targets to those with specific providers.
The precise semantics of what it means for a target to depend on another using
Most often, a |
licenses |
A list of license-type strings to be used for this particular target. This is part of a deprecated licensing API that Bazel no longer uses. Don't use this. |
srcs |
Files processed or included by this rule. Generally lists files directly, but
may list rule targets (like Language-specific rules often require that the listed files have particular file extensions. |
Attributes common to all build rules
This section describes attributes that are implicitly added to all build rules.
Attribute | Description |
---|---|
compatible_with |
The list of environments this target can be built for, in addition to default-supported environments. This is part of Bazel's constraint system, which lets users declare which targets can and cannot depend on each other. For example, externally deployable binaries shouldn't depend on libraries with company-secret code. See ConstraintSemantics for details. |
deprecation |
An explanatory warning message associated with this target. Typically this is used to notify users that a target has become obsolete, or has become superseded by another rule, is private to a package, or is perhaps considered harmful for some reason. It is a good idea to include some reference (like a webpage, a bug number or example migration CLs) so that one can easily find out what changes are required to avoid the message. If there is a new target that can be used as a drop in replacement, it is a good idea to just migrate all users of the old target.
This attribute has no effect on the way things are built, but it
may affect a build tool's diagnostic output. The build tool issues a
warning when a rule with a Intra-package dependencies are exempt from this warning, so that, for example, building the tests of a deprecated rule does not encounter a warning. If a deprecated target depends on another deprecated target, no warning message is issued. Once people have stopped using it, the target can be removed. |
distribs |
A list of distribution-method strings to be used for this particular target. This is part of a deprecated licensing API that Bazel no longer uses. Don't use this. |
exec_compatible_with |
A list of
|
exec_properties |
A dictionary of strings that will be added to the If a key is present in both the platform and target-level properties, the value will be taken from the target. |
features |
A feature is string tag that can be enabled or disabled on a target. The meaning of a feature depends on the rule itself. This |
restricted_to |
The list of environments this target can be built for, instead of default-supported environments.
This is part of Bazel's constraint system. See
|
tags |
Tags can be used on any rule. Tags on test and
Bazel modifies the behavior of its sandboxing code if it finds the following
keywords in the
Tags on tests are generally used to annotate a test's role in your debug and release process. Typically, tags are most useful for C++ and Python tests, which lack any runtime annotation ability. The use of tags and size elements gives flexibility in assembling suites of tests based around codebase check-in policy.
Bazel modifies test running behavior if it finds the following keywords in the
|
target_compatible_with |
A list of
Targets that transitively depend on incompatible targets are themselves considered incompatible. They are also skipped for building and testing. An empty list (which is the default) signifies that the target is compatible with all platforms.
All rules other than Workspace Rules support this
attribute.
For some rules this attribute has no effect. For example, specifying
See the Platforms page for more information about incompatible target skipping. |
testonly |
If True, only testonly targets (such as tests) can depend on this target.
Equivalently, a rule that is not
Tests ( This attribute is intended to mean that the target should not be contained in binaries that are released to production. Because testonly is enforced at build time, not run time, and propagates virally through the dependency tree, it should be applied judiciously. For example, stubs and fakes that are useful for unit tests may also be useful for integration tests involving the same binaries that will be released to production, and therefore should probably not be marked testonly. Conversely, rules that are dangerous to even link in, perhaps because they unconditionally override normal behavior, should definitely be marked testonly. |
toolchains |
The set of targets whose Make variables this target is
allowed to access. These targets are either instances of rules that provide
Note that this is distinct from the concept of
toolchain resolution
that is used by rule implementations for platform-dependent configuration. You cannot use this
attribute to determine which specific |
visibility |
The |
Attributes common to all test rules (*_test)
This section describes attributes that are common to all test rules.
Attribute | Description | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
args |
Command line arguments that Bazel passes to the target when it is
executed with
These arguments are passed before any |
||||||||||||||||||||
env |
Specifies additional environment variables to set when the test is executed by
This attribute only applies to native rules, like |
||||||||||||||||||||
env_inherit |
Specifies additional environment variables to inherit from the
external environment when the test is executed by
This attribute only applies to native rules, like |
||||||||||||||||||||
size |
Specifies a test's "heaviness": how much time/resources it needs to run. Unit tests are considered "small", integration tests "medium", and end-to-end tests "large" or
"enormous". Bazel uses the size to determine a default timeout, which can be overridden using the
Test sizes correspond to the following default timeouts and assumed peak local resource usages:
The environment variable
|
||||||||||||||||||||
timeout |
How long the test is expected to run before returning.
While a test's size attribute controls resource estimation, a test's
timeout may be set independently. If not explicitly specified, the
timeout is based on the test's size. The test
timeout can be overridden with the
For times other than the above, the test timeout can be overridden with the
The environment variable
|
||||||||||||||||||||
flaky |
Marks test as flaky. If set, executes the test up to three times, marking it as failed only if it fails each time. By default, this attribute is set to False and the test is executed only once. Note, that use of this attribute is generally discouraged - tests should pass reliably when their assertions are upheld. |
||||||||||||||||||||
shard_count |
Specifies the number of parallel shards to use to run the test. This value will override any heuristics used to determine the number of
parallel shards with which to run the test. Note that for some test
rules, this parameter may be required to enable sharding
in the first place. Also see If test sharding is enabled, the environment variable
Sharding requires the test runner to support the test sharding protocol. If it does not, then it will most likely run every test in every shard, which is not what you want. See Test Sharding in the Test Encyclopedia for details on sharding. |
||||||||||||||||||||
local |
Forces the test to be run locally, without sandboxing. Setting this to True is equivalent to providing "local" as a tag
( |
Attributes common to all binary rules (*_binary)
This section describes attributes that are common to all binary rules.
Attribute | Description |
---|---|
args |
Command line arguments that Bazel will pass to the target when it is executed
either by the
NOTE: The arguments are not passed when you run the target
outside of Bazel (for example, by manually executing the binary in
|
env |
Specifies additional environment variables to set when the target is
executed by
This attribute only applies to native rules, like
NOTE: The environment variables are not set when you run the target
outside of Bazel (for example, by manually executing the binary in
|
output_licenses |
The licenses of the output files that this binary generates. This is part of a deprecated licensing API that Bazel no longer uses. Don't use this. |
Configurable attributes
Most attributes are "configurable", meaning that their values may change when the target is built in different ways. Specifically, configurable attributes may vary based on the flags passed to the Bazel command line, or what downstream dependency is requesting the target. This can be used, for instance, to customize the target for multiple platforms or compilation modes.
The following example declares different sources for different target
architectures. Running bazel build :multiplatform_lib --cpu x86
will build the target using x86_impl.cc
, while substituting
--cpu arm
will instead cause it to use arm_impl.cc
.
cc_library( name = "multiplatform_lib", srcs = select({ ":x86_mode": ["x86_impl.cc"], ":arm_mode": ["arm_impl.cc"] }) ) config_setting( name = "x86_mode", values = { "cpu": "x86" } ) config_setting( name = "arm_mode", values = { "cpu": "arm" } )
The select()
function
chooses among different alternative values for a configurable attribute based
on which config_setting
or constraint_value
criteria the target's configuration satisfies.
Bazel evaluates configurable attributes after processing macros and before
processing rules (technically, between the
loading and analysis phases).
Any processing before select()
evaluation doesn't know which
branch the select()
chooses. Macros, for example, can't change
their behavior based on the chosen branch, and bazel query
can
only make conservative guesses about a target's configurable dependencies. See
this FAQ
for more on using select()
with rules and macros.
Attributes marked nonconfigurable
in their documentation cannot
use this feature. Usually an attribute is nonconfigurable because Bazel
internally needs to know its value before it can determine how to resolve a
select()
.
See Configurable Build Attributes for a detailed overview.
Implicit output targets
Implicit outputs in C++ are deprecated. Please refrain from using it in other languages where possible. We don't have a deprecation path yet but they will eventually be deprecated too.
When you define a build rule in a BUILD file, you are explicitly
declaring a new, named rule target in a package. Many build rule
functions also implicitly entail one or more output file
targets, whose contents and meaning are rule-specific.
For example, when you explicitly declare a
java_binary(name='foo', ...)
rule, you are also
implicitly declaring an output file
target foo_deploy.jar
as a member of the same package.
(This particular target is a self-contained Java archive suitable
for deployment.)
Implicit output targets are first-class members of the global
target graph. Just like other targets, they are built on demand,
either when specified in the top-level built command, or when they
are necessary prerequisites for other build targets. They can be
referenced as dependencies in BUILD files, and can be observed in
the output of analysis tools such as bazel query
.
For each kind of build rule, the rule's documentation contains a special section detailing the names and contents of any implicit outputs entailed by a declaration of that kind of rule.
An important but somewhat subtle distinction between the
two namespaces used by the build system:
labels identify targets,
which may be rules or files, and file targets may be divided into
either source (or input) file targets and derived (or output) file
targets. These are the things you can mention in BUILD files,
build from the command-line, or examine using bazel query
;
this is the target namespace. Each file target corresponds
to one actual file on disk (the "file system namespace"); each rule
target may correspond to zero, one or more actual files on disk.
There may be files on disk that have no corresponding target; for
example, .o
object files produced during C++ compilation
cannot be referenced from within BUILD files or from the command line.
In this way, the build tool may hide certain implementation details of
how it does its job. This is explained more fully in
the BUILD Concept Reference.