---
layout: documentation
title: Concepts and terminology
---
<h1>Concepts and terminology</h1>
<p>
  This document provides an overview of the source tree layout and the
  terminology used in Bazel.
</p>
<h2>Table of contents</h2>

<ul>
  <li><a href="#intro">Introduction</a></li>

  <li><a href="#packages_targets">Workspace, Packages and Targets</a>
    <ul>
      <li><a href="#workspace">Workspace</a></li>
      <li><a href="#repositories">Repositories</a></li>
      <li><a href="#packages">Packages</a></li>
      <li><a href="#targets">Targets</a></li>
      <li><a href="#labels">Labels</a></li>
      <li><a href="#lexi">Lexical Specifications of a Label</a></li>
      <li><a href="#rules">Rules</a></li>
    </ul>
  </li>
  <li><a href="#BUILD_files">BUILD Files</a>
    <ul>
      <li><a href="#load">Loading an extension</a></li>
    </ul>
  </li>
  <li><a href="#funcs">Types of Build Rules</a></li>

  <li><a href="#dependencies">Dependencies</a>
    <ul>
      <li><a href="#actual_and_declared_dependencies">Actual and Declared Dependencies</a></li>
      <li><a href="#types_of_dependencies">Types of Dependencies</a></li>
      <li><a href="#label_directory">Using Labels to Reference Directories</a></li>
    </ul>
  </li>
</ul>

<h2 id="intro">Introduction</h2>

<p>Bazel builds software from source code organized in a directory called
   a workspace. Source files in the workspace are organized in a nested
   hierarchy of packages, where each package is a directory that contains a set
   of related source files and one BUILD file. The BUILD file specifies what
   software outputs can be built from the source.
</p>
<h2 id="packages_targets">Workspace, packages and targets</h2>
<h3 id="workspace">Workspace</h3>

<p>A <em>workspace</em> is a directory on your filesystem that contains the
   source files for the software you want to build, as well as symbolic links
   to directories that contain the build outputs. Each workspace directory has
   a text file named <code>WORKSPACE</code> which may be empty, or may contain
   references to <a href="external.html">external dependencies</a>
   required to build the outputs.</p>

<p>Directories containing a file called
   <code>WORKSPACE</code> are considered the root of a workspace.
   Therefore, Bazel ignores any directory trees in a workspace rooted
   at a subdirectory containing a <code>WORKSPACE</code> file (as they form
   another workspace).</p>

<p>Bazel also supports <code>WORKSPACE.bazel</code> file as an alias of <code>WORKSPACE</code> file.
   If both files exist, <code>WORKSPACE.bazel</code> will take the priority.</p>

<h3 id="repositories">Repositories</h3>
<p>Code is organized in <em>repositories</em>. The directory containing
   the <code>WORKSPACE</code> file is the root of the main repository, also
   called <code>@</code>. Other, (external) repositories
   are defined in the <code>WORKSPACE</code> file using workspace rules.

<p>The workspace rules bundled with Bazel are documented in the
   <a href="be/workspace.html">Workspace Rules</a> section in the Build
   Encyclopedia and the documentation on
   <a href="repo/index.html">embeded Starlark repository rules</a>.</p>

<p>As external repositories are repositories themselves, they often contain
   a <code>WORKSPACE</code> file as well. However, these additional
   <code>WORKSPACE</code> files are ignored by Bazel. In particular,
   repositories depended upon transitively are not added automatically.</p>

<h3 id="packages">Packages</h3>
<p>
  The primary unit of code organization in a repository is
  the <i>package</i>.  A package is a collection of related files and a
  specification of the dependencies among them.
</p>

<p>
  A package is defined as a directory containing a file
  named <code>BUILD</code> or <code>BUILD.bazel</code>,
  residing beneath the top-level directory in the
  workspace.  A package includes all files in its directory, plus all
  subdirectories beneath it, except those which themselves contain a BUILD
  file.
</p>

<p>
  For example, in the following directory tree
  there are two packages, <code>my/app</code>,
  and the subpackage <code>my/app/tests</code>.
  Note that <code>my/app/data</code> is not a package, but a directory
  belonging to package <code>my/app</code>.
</p>

<pre>
src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc
</pre>
<h3 id="targets">Targets</h3>

<p>
  A package is a container. The elements of a package are called
  <i>targets</i>. Most targets are one of two principal kinds, <i>files</i>
  and <i>rules</i>. Additionally, there is another kind of target,
  <a href="be/functions.html#package_group">package groups</a>,
  but they are far less numerous.
</p>

<p>
  Files are further divided into two kinds.
  <i>Source files</i> are usually written by the efforts of people,
  and checked in to the repository.
  <i>Generated files</i>, sometimes called derived files,
  are not checked in, but are generated by the build tool from source
  files according to specific rules.
</p>

<p>
  The second kind of target is the <i>rule</i>.  A rule specifies the
  relationship between a set of input and a set of output files,
  including the necessary steps to derive the outputs from the inputs.
  The outputs of a rule are always generated files.  The inputs to a
  rule may be source files, but they may be generated files also;
  consequently, outputs of one rule may be the inputs to another,
  allowing long chains of rules to be constructed.
</p>

<p>
  Whether the input to a rule is a source file or a generated file is
  in most cases immaterial; what matters is only the contents of that
  file.  This fact makes it easy to replace a complex source file with
  a generated file produced by a rule, such as happens when the burden
  of manually maintaining a highly structured file becomes too
  tiresome, and someone writes a program to derive it.  No change is
  required to the consumers of that file.  Conversely, a generated
  file may easily be replaced by a source file with only local
  changes.
</p>

<p>
  The inputs to a rule may also include <i>other rules</i>.  The
  precise meaning of such relationships is often quite complex and
  language- or rule-dependent, but intuitively it is simple: a C++
  library rule A might have another C++ library rule B for an input.
  The effect of this dependency is that B's header files are
  available to A during compilation, B's symbols are available to A
  during linking, and B's runtime data is available to A during
  execution.
</p>

<p>
  An invariant of all rules is that the files generated by a rule
  always belong to the same package as the rule itself; it is not
  possible to generate files into another package.  It is not uncommon
  for a rule's inputs to come from another package, though.
</p>

<p>
  Package groups are sets of packages whose purpose is to limit accessibility
  of certain rules. Package groups are defined by the
  <code>package_group</code> function. They have two properties: the list of
  packages they contain and their name. The only allowed ways to refer to them
  are from the <code>visibility</code> attribute of rules or from the
  <code>default_visibility</code> attribute of the <code>package</code>
  function; they do not generate or consume files. For more information, refer
  to the appropriate section of the <a
  href='be/functions.html#package_group'>Build Encyclopedia</a>.
</p>


<h3 id="labels">Labels</h3>

<p>
  All targets belong to exactly one package.  The name of a target is
  called its <em>label</em>, and a typical label in canonical form
  looks like this:
</p>


<pre>
@myrepo//my/app/main:app_binary
</pre>

<p>
  In the typical case that a label refers to the same repository it occurs
  in, the repository name may be left out. So, inside <code>@myrepo</code>
  this label is usually written as
</p>

<pre>
//my/app/main:app_binary
</pre>

<p>

  Each label has two parts, a package name (<code>my/app/main</code>)
  and a target name (<code>app_binary</code>).  Every label uniquely
  identifies a target.  Labels sometimes appear in other forms; when
  the colon is omitted, the target name is assumed to be the same as
  the last component of the package name, so these two labels are
  equivalent:
</p>

<pre>
//my/app
//my/app:app
</pre>

<p>
  Short-form labels such as <code>//my/app</code> are not to
  be confused with package names.  Labels start with <code>//</code>,
  but package names never do, thus <code>my/app</code> is the
  package containing <code>//my/app</code>.

  (A common misconception is that <code>//my/app</code> refers
  to a package, or to <em>all</em> the targets in a package; neither
  is true.)
</p>

<p>
  Within a BUILD file, the package-name part of label may be omitted,
  and optionally the colon too.  So within the BUILD file for package
  <code>my/app</code> (i.e. <code>//my/app:BUILD</code>),
  the following "relative" labels are all equivalent:
</p>

<pre>
//my/app:app
//my/app
:app
app
</pre>

<p>
  (It is a matter of convention that the colon is omitted for files,
  but retained for rules, but it is not otherwise significant.)
</p>

<p>
  Similarly, within a BUILD file, files belonging to the package may
  be referenced by their unadorned name relative to the package
  directory:
</p>


<pre>
generate.cc
testdata/input.txt
</pre>

<p>
  But from other packages, or from the command-line, these file
  targets must always be referred to by their complete label, e.g.
  <code>//my/app:generate.cc</code>.
</p>

<p>
  Relative labels cannot be used to refer to targets in other
  packages; the complete package name must always be specified in this
  case.  For example, if the source tree contains both the package
  <code>my/app</code> and the package
  <code>my/app/testdata</code> (i.e., each of these two
  packages has its own BUILD file).  The latter package contains a
  file named <code>testdepot.zip</code>.  Here are two ways (one
  wrong, one correct) to refer to this file within
  <code>//my/app:BUILD</code>:
</p>

<pre>
<span class="discouraged">testdata/testdepot.zip</span>  # Wrong: testdata is a different package.
//my/app/testdata:testdepot.zip   # Right.
</pre>

<p>
  If, by mistake, you refer to <code>testdepot.zip</code> by the wrong
  label, such as <code>//my/app:testdata/testdepot.zip</code>
  or <code>//my:app/testdata/testdepot.zip</code>, you will get an
  error from the build tool saying that the label "crosses a package
  boundary".  You should correct the label by putting the colon after
  the directory containing the innermost enclosing BUILD file, i.e.,
  <code>//my/app/testdata:testdepot.zip</code>.
</p>

<p>
  Labels starting with <code>@//</code> are references to the main
  repository, which will still work even from external repositories.
  Therefore <code>@//a/b/c</code> is different from
  <code>//a/b/c</code> when referenced from an external repository.
  The former refers back to the main repository, while the latter
  looks for <code>//a/b/c</code> 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.
</p>

<h3 id="lexi">Lexical specification of a label</h3>

<p>
  The syntax of labels is intentionally strict, so as to
  forbid 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

  <a href='query.html'>Bazel Query Language</a>.

  The precise details of allowed target names are below.
</p>

<h4 id="name">Target names, <code>//...:<b>target-name</b></code></h4>

<p><code>target-name</code> is the name of the target within the package.
  The name of a rule is the value of the <code>name</code>
  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 <code>a</code>–<code>z</code>,
  <code>A</code>–<code>Z</code>, <code>0</code>–<code>9</code>,
  and the punctuation symbols <code>!%-@^_` "#$&'()*-+,;<=>?[]{|}~/.</code>.
  Do not use <code>..</code> to refer to files in other packages; use
  <code>//<var>packagename</var>:<var>filename</var></code> instead.
  Filenames must be relative pathnames in normal form, which means
  they must neither start nor end with a slash
  (e.g. <code>/foo</code> and <code>foo/</code> are forbidden) nor
  contain multiple consecutive slashes as path separators
  (e.g. <code>foo//bar</code>).  Similarly, up-level references
  (<code>..</code>) and current-directory references
  (<code>./</code>) are forbidden.  The sole exception to this
  rule is that a target name may consist of exactly
  '<code>.</code>'.
</p>

<p>While it is common to use <code>/</code> in the name of a file
  target, we recommend that you avoid the use of <code>/</code> in the
  names of rules.  Especially when the shorthand form of a label is
  used, it may confuse the reader.  The
  label <code>//foo/bar/wiz</code> is always a shorthand
  for <code>//foo/bar/wiz:wiz</code>, even if there is no such package
  <code>foo/bar/wiz</code>; it never refers to <code>//foo:bar/wiz</code>,
  even if that target exists.</p>

<p>However, there are some situations where use of a slash is
  convenient, or sometimes even necessary.  For example, the name of
  certain rules must match their principal source file, which may
  reside in a subdirectory of the package.</p>

<h4>Package names, <code>//<b>package-name</b>:...</code></h4>
<p>
  The name of a package is the name of the directory containing its

  BUILD file, relative to the top-level directory of the source tree.
  For example: <code>my/app</code>.

  Package names must be composed entirely of characters drawn from
  the set <code>A</code>-<code>Z</code>, <code>a</code>–<code>z</code>,
  <code>0</code>–<code>9</code>, '<code>/</code>', '<code>-</code>',
  '<code>.</code>', and '<code>_</code>', and cannot start with
  a slash.
<p>
  For a language with a directory structure that is significant
  to its module system (e.g. Java), it is important to choose directory names
  that are valid identifiers in the language.
</p>

<p>
  Although Bazel allows a package at the build root (e.g. <code>//:foo</code>), this
  is not advised and projects should attempt to use more descriptively named
  packages.
</p>
<p>
  Package names may not contain the substring <code>//</code>, nor
  end with a slash.
</p>

<h3 id="rules">Rules</h3>

<p>
  A rule specifies the relationship between inputs and outputs, and the
  steps to build the outputs.  Rules can be of one of many different
  kinds or <i>classes</i>, which produce compiled
  executables and libraries, test executables and other supported
  outputs as described in the
  <a href="be/overview.html">Build Encyclopedia</a>.
</p>

<p>
  Every rule has a name, specified by the <code>name</code> attribute,
  of type string.  The name must be a syntactically valid target name,
  as specified <a href='#name'>above</a>.  In some cases, the name is
  somewhat arbitrary, and more interesting are the names of the files
  generated by the rule; this is true of genrules.  In other
  cases, the name is significant: for <code>*_binary</code>
  and <code>*_test</code> rules, for example, the rule name determines
  the name of the executable produced by the build.
</p>

<pre>
cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    deps = [
        "//absl/base",
        "//absl/strings",
    ],
)
</pre>

<p>
  Every rule has a set of <i>attributes</i>; the applicable attributes
  for a given rule, and the significance and semantics of each
  attribute are a function of the rule's class; see
  the <a href='be/overview.html'>Build
  Encyclopedia</a> for a list of rules and their
  corresponding attributes.  Each attribute has a name and a
  type.  Some of the common types an attribute can have are integer,
  label, list of labels, string, list of strings, output label,
  list of output labels.  Not all attributes need to be specified in
  every rule.  Attributes thus form a dictionary from keys (names) to
  optional, typed values.
</p>

<p>
  The <code>srcs</code> attribute present in many rules has type "list
  of labels"; its value, if present, is a list of labels, each being
  the name of a target that is an input to this rule.
</p>

<p>
  The <code>outs</code> attribute present in many rules has type "list
  of output labels"; this is similar to the type of
  the <code>srcs</code> attribute, but differs in two significant
  ways.  Firstly, due to the invariant that the outputs of a rule
  belong to the same package as the rule itself, output labels cannot
  include a package component; they must be in one of the "relative"
  forms shown above.  Secondly, the relationship implied by an
  (ordinary) label attribute is inverse to that implied by an output
  label: a rule <i>depends on</i> its <code>srcs</code>, whereas a rule <i>is
    depended on by</i> its <code>outs</code>.  The two types of label attributes
  thus assign direction to the edges between targets, giving rise to a
  dependency graph.
</p>

<p>
  This directed acyclic graph over targets is called the
  "target graph" or "build dependency graph", and is the domain over
  which the <a href='query.html'>Bazel Query tool</a> operates.
</p>


<h2 id="BUILD_files">BUILD files</h2>

<p>
  The previous section described packages, targets and labels, and the
  build dependency graph abstractly.  In this section, we'll look at
  the concrete syntax used to define a package.
</p>

<p>
  By definition, every package contains a BUILD file, which is a short
  program.
  BUILD files are evaluated using an imperative language,
  <a href="https://github.com/bazelbuild/starlark/">Starlark</a>.

  They are interpreted as a sequential list of statements.
</p>

<p>
  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 <em>which</em> rules were declared,
  and with what values, by the time package evaluation completes.

  When a build rule function, such as <code>cc_library</code>, is
  executed, it creates a new target in the graph. This target can later be
  referred using a label.

  So, in simple BUILD files, rule declarations can be re-ordered
  freely without changing the behavior.
</p>


<p>
  To encourage a clean separation between code and data, BUILD files cannot
  contain function definitions, <code>for</code> statements or
  <code>if</code> statements (but list comprehensions and <code>if</code>
  expressions are allowed). Functions should be declared in <code>.bzl</code>
  files instead. Additionally, <code>*args</code> and <code>**kwargs</code>
  arguments are not allowed in BUILD files; instead list all the arguments
  explicitly.
</p>

<p>
  Crucially, programs in Starlark are unable to perform
  arbitrary I/O.  This invariant makes the
  interpretation of BUILD files hermetic, i.e. dependent only on a
  known set of inputs, which is essential for ensuring that builds are
  reproducible.
</p>

<p>
  BUILD files should be written using only ASCII characters,
  although technically they are interpreted using the Latin-1
  character set.
</p>

<p>
  Since 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 are encouraged to use comments
  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.
</p>

<h3 id="load">Loading an extension</h3>

Bazel extensions are files ending in <code>.bzl</code>. Use
the <code>load</code> statement to import a symbol from an extension.

<pre>
load("//foo/bar:file.bzl", "some_library")
</pre>

This code will load the file <code>foo/bar/file.bzl</code> and add the
<code>some_library</code> symbol to the environment. This can be used to load
new rules, functions or constants (e.g. a string, a list, etc.). Multiple
symbols can be imported by using additional arguments to the call
to <code>load</code>. Arguments must be string literals (no variable)
and <code>load</code> statements must appear at top-level, i.e. they cannot be
in a function body.

The first argument of <code>load</code> is a <a href="#labels">label</a>
identifying a <code>.bzl</code> file. If it is a relative label, it is resolved
with respect to the package (not directory) containing the current
<code>bzl</code> file. Relative labels in <code>load</code> statements should
use a leading <code>:</code>.

<code>load</code> also supports aliases, i.e. you can assign different names to
the imported symbols.

<pre>
load("//foo/bar:file.bzl", library_alias = "some_library")
</pre>

You can define multiple aliases within one <code>load</code> 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).

<pre>
load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")
</pre>

In a <code>.bzl</code> file, symbols starting with <code>_</code> are not
exported and cannot be loaded from another file. Visibility doesn't affect
loading (yet): you don't need to use <code>exports_files</code> to make
a <code>.bzl</code> file visible.

<h2 id="funcs">Types of build rule</h2>

<p>
  The majority of build rules come in families, grouped together by
  language.  For
  example, <code>cc_binary</code>, <code>cc_library</code>
  and <code>cc_test</code> are the build rules for C++ binaries,
  libraries, and tests, respectively.  Other languages use the same
  naming scheme, with a different prefix, e.g. <code>java_*</code> for
  Java. Some of these functions are documented in the
  <a href="be/overview.html">Build Encyclopedia</a>, but it is possible
  for anyone to create new rules.
</p>

<ul>
  <li><p><code>*_binary</code>
      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 <code>//my:program</code> would appear at
      (e.g.) <code>$(BINDIR)/my/program</code>. </p>

    <p>Such rules also create a runfiles directory

      containing all the files mentioned in a <code>data</code>
      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.</p>
  </li>

  <li><p><code>*_test</code>
      rules are a specialization of a <code>*_binary</code> rule, used for automated
      testing.  Tests are simply programs that return zero on success.

      </p>

    <p>
      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 <code>cc_test(name='x',
      data=['//foo:bar'])</code> may open and

      read <code>$TEST_SRCDIR/workspace/foo/bar</code> during execution.
      (Each programming language has its own utility function for
      accessing the value of <code>$TEST_SRCDIR</code>, 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.

    </p>
  </li>

  <li><code>*_library</code>
    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.
  </li>
</ul>

<h2 id="dependencies">Dependencies</h2>

<p>
  A target <code>A</code> <i>depends upon</i> a target
  <code>B</code> if <code>B</code> is needed by <code>A</code> at
  build or execution time.  The <i>depends upon</i> relation induces a
  <a href="https://en.wikipedia.org/wiki/Directed_acyclic_graph">Directed
  Acyclic Graph</a> (DAG) over targets, and we call this a
  <em>dependency graph</em>.

  A target's <em>direct</em> dependencies are those other targets
  reachable by a path of length 1 in the dependency graph.  A target's
  <em>transitive</em> dependencies are those targets upon which it
  depends via a path of any length through the graph.
</p>

<p>
  In fact, in the context of builds, there are two dependency graphs,
  the graph of <em>actual dependencies</em> and the graph of
  <em>declared dependencies</em>.  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.
</p>

<h3 id="actual_and_declared_dependencies">Actual and declared dependencies</h3>

<p>
  A target <code>X</code> is <i>actually dependent</i> on target
  <code>Y</code> if and only if <code>Y</code> must be present, built
  and up-to-date in order for <code>X</code> 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.
</p>

<p>
  A target <code>X</code> has a <i>declared dependency</i> on target
  <code>Y</code> if and only if there is a dependency edge from <code>X</code>
  to <code>Y</code> in the package of <code>X</code>.
</p>

<p>
  For correct builds, the graph of actual dependencies <i>A</i> must
  be a subgraph of the graph of declared dependencies <i>D</i>.  That
  is, every pair of directly-connected nodes <code>x --&gt; y</code>
  in <i>A</i> must also be directly connected in <i>D</i>.  We say
  <i>D</i> is an <em>overapproximation</em> of <i>A</i>.
</p>

<p>
  It is important that it not be too much of an overapproximation,
  though, since redundant declared dependencies can make builds slower and
  binaries larger.
</p>

<p>
  What this means for BUILD file writers is that every rule must
  explicitly declare all of its actual direct dependencies 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 which transitive declared dependencies the target
  happens to have.  The build tool attempts aggressively to check for
  missing dependencies and report errors, but it is not possible for
  this checking to be complete in all cases.
</p>

<p>

  You need not (and should not) attempt to list everything indirectly imported,
  even if it is "needed" by A at execution time.
</p>

<p>
  During a build of target <code>X</code>, the build tool inspects the
  entire transitive closure of dependencies of <code>X</code> to ensure that
  any changes in those targets are reflected in the final result,
  rebuilding intermediates as needed.
</p>

<p>
  The transitive nature of dependencies leads to a common mistake.
  Through careless programming, code in one file may use code provided
  by an <em>indirect</em> dependency, i.e. a transitive but not direct
  edge in the declared dependency graph.  Indirect dependencies do not
  appear in the BUILD file.  Since the rule doesn't
  directly depend on the provider, there is no way to track changes,
  as shown in the following example timeline:
</p>

<div class="greenbox">
<p><b>1. At first, everything works</b></p>

<p>The code in package <code>a</code> uses code in package <code>b</code>.
The code in package <code>b</code> uses code in package <code>c</code>,
and thus <code>a</code> transitively depends on <code>c</code>.</p>

<div style="float:left; width: 49%; margin-top: -20px;">
<p><code>a/BUILD</code></p>
<pre class="code">
<b>rule(
    name = "a",
    srcs = "a.in",
    deps = "//b:b",
)</b>
</pre>
<p><code>a/a.in</code></p>
<pre class="code">
<b>import b;
b.foo();</b>
</pre>
</div>
<div style="float:right; width: 49%; margin-top: -20px; ">
<p><code>b/BUILD</code></p>
<pre class="code">
<b>rule(
    name = "b",
    srcs = "b.in",
    deps = "//c:c",
)</b>
</pre>
<p><code>b/b.in</code></p>
<pre class="code">
<b>import c;
function foo() {
  c.bar();
}</b>
</pre>
</div>
<table style='margin: auto; width: 100%'><tr>
<td style='padding: 10px; text-align: center'>
<!-- digraph G {
  graph [size="4,4"];
  node [shape=circle];
  rankdir="LR";
  a -> b -> c;
} -->
<img src="images/a_b_c.svg" alt="a_b_c.svg" style="margin-left=10;" />
<p><i>Declared dependency graph</i></p>
</td>
<td style='padding: 10px; text-align: center'>
<!-- digraph G {
  graph [size="4,4"];
  node [shape=circle];
  rankdir="LR";
  a -> b -> c;
} -->
<img src="images/a_b_c.svg" alt="a_b_c.svg" style="margin-left=10;" />
<p><i>Actual dependency graph</i></p>
</td>
</tr></table>
The declared dependencies overapproximate the actual dependencies.
All is well.
</div>

<div class="greenbox">
<p><b>2. A latent hazard is introduced.</b></p>
<p>
  Someone carelessly adds code to <code>a</code> that creates a direct
  actual dependency on <code>c</code>, but forgets to declare it.
</p>
<div style="float:left; width: 49%; margin-top: -20px; ">
<p><code>a/a.in</code></p>
<pre class="code">
import b;
<b>import c;</b>
b.foo();
<b>c.garply();</b>
</pre>
</div>

<table style='margin: auto; width: 100%'><tr>
<td style='padding: 10px; text-align: center'>
<!-- digraph G {
  graph [size="4,4"];
  node [shape=circle];
  rankdir="LR";
  a -> b -> c;
} -->
<img src="images/a_b_c.svg" alt="a_b_c.svg" style="margin-left=10;" />
<p><i>Declared dependency graph</i></p>
</td>
<td style='padding: 10; text-align: center'>
<!-- digraph G {
  graph [size="4,4"];
  node [shape=circle];
  rankdir="LR";
  a -> b -> c;
  a -> c [constraint=false];
} -->
<img src="images/a_b_c_ac.svg" alt="a_b_c_ac.svg" style="margin-left=10;" />
<p><i>Actual dependency graph</i></p>
</td>
</tr></table>
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: <code>a</code> has an
actual but undeclared dependency on <code>c</code>.
</div>

<div class="greenbox">
<p><b>3. The hazard is revealed</b> </p>
<p>
  Someone refactors <code>b</code> so that it no longer depends on
  <code>c</code>, inadvertently breaking <code>a</code> through no
  fault of their own.
</p>
<div style="float:right; width: 49%; margin-top: -20px; ">
<p><code>b/BUILD</code></p>
<pre class="code">
rule(
    name = "b",
    srcs = "b.in",
    <b>deps = "//d:d"</b>,
)
</pre>
<p><code>b/b.in</code></p>
<pre class="code">
<b>import d;</b>
function foo() {
  <b>d.baz();</b>
}
</pre>
</div>
<table style='margin: auto; width: 100%'><tr>
<td style='padding: 10px; text-align: center'>
<!-- digraph G {
  graph [size="4,4"];
  node [shape=circle];
  rankdir="LR";
  a -> b;
  b -> c [style=invis];
} -->
<img src="images/ab_c.svg" alt="ab_c.svg" style="margin-left=10;" />
<p><i>Declared dependency graph</i></p>
</td>
<td style='padding: 10; text-align: center'>
<!-- digraph G {
  graph [size="4,4"];
  node [shape=circle];
  rankdir="LR";
  a -> b;
  b -> c [style=invis];
  a -> c [constraint=false];
} -->
<img src="images/a_b_a_c.svg" alt="a_b_a_c.svg" style="margin-left=10;" />
<p><i>Actual dependency graph</i></p>
</td>
</tr></table>
<p>
  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 <code>a</code> to <code>c</code> introduced in Step
  2 was properly declared in the BUILD file.
</div>

<h3 id="types_of_dependencies">Types of dependencies</h3>

<p>
  Most build rules have three attributes for specifying different kinds
  of generic dependencies: <code>srcs</code>, <code>deps</code> and
  <code>data</code>. These are explained below. See also
  <a href='be/common-definitions.html'>Attributes common
  to all rules</a> in the Build Encyclopedia.
</p>

<p>
  Many rules also have additional attributes for rule-specific kinds
  of dependency, e.g. <code>compiler</code>, <code>resources</code>,
  etc.  These are detailed in the Build Encyclopedia.
</p>

<h4 id="srcs"><code>srcs</code> dependencies</h4>
<p>
  Files consumed directly by the rule or rules that output source files.
</p>

<h4 id="deps"><code>deps</code> dependencies</h4>
<p>
  Rule pointing to separately-compiled modules providing header files,
  symbols, libraries, data, etc.
</p>

<h4 id="data"><code>data</code> dependencies</h4>
<p>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 we build the unit test, we
   don't need the file; but we do need it when we run the test. The
   same applies to tools that are launched during execution.

<p>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:
</p>

<pre>
# 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",
        ...
    ],
)
</pre>

<p>These files are available using the relative path
<code>path/to/data/file</code>. In tests, it is also possible to refer to
them by joining the paths of the test's source directory and the workspace-relative
path, e.g.

<code>${TEST_SRCDIR}/workspace/path/to/data/file</code>.
   <h3 id="label_directory">Using labels to reference directories</h3>

   <p>As you look over our <code>BUILD</code> files, you might notice
      that some <code>data</code> labels refer to directories.
      These labels end with <code>/.</code> or <code>/</code> like so:

<pre>
<span style="text-decoration: line-through">data = ["//data/regression:unittest/."]</span>  # don't use this
</pre>
<p>
or like so:
</p>
<pre>
<span style="text-decoration: line-through">data = ["testdata/."]</span>  # don't use this
</pre>

<p>
or like so:
</p>

<pre>
<span style="text-decoration: line-through">data = ["testdata/"]</span>  # don't use this
</pre>
   <p>This seems convenient, particularly for tests (since it allows a test to
      use all the data files in the directory).
   </p>

    <p>But try not to do this.  In order to ensure correct incremental rebuilds (and
       re-execution of tests) after a change, the build system must be
       aware of the complete set of files that are inputs to the build (or
       test).  When you specify a directory, the build system will perform
       a rebuild only when the directory itself changes (due to addition or
       deletion of files), but won't be able to detect edits to individual
       files as those changes do not affect the enclosing directory.
       Rather than specifying directories as inputs to the build system,
       you should enumerate the set of files contained within them, either
       explicitly or using the
       <a href='be/functions.html#glob'><code>glob()</code></a> function.
       (Use <code>**</code> to force the <a href='be/functions.html#glob'>
       <code>glob()</code></a> to be recursive.)
   </p>

<pre>
data = glob(["testdata/**"])  # use this instead
</pre>

   <p>Unfortunately, there are some scenarios where directory labels must be used.
      For example, if the <code>testdata</code> directory contains files whose
      names do not conform to the strict <a href='#lexi'>label syntax</a>
      (e.g. they contain certain punctuation symbols), then explicit
      enumeration of files, or use of the
      <a href='be/functions.html#glob'><code>glob()</code></a> function will
      produce an invalid labels error.  You must use directory labels in this case,
      but beware of the concomitant risk of incorrect rebuilds described above.
   </p>

   <p>If you must use directory labels, keep in mind that you can't refer to the parent
      package with a relative "<code>../</code>" path; instead, use an absolute path like
      "<code>//data/regression:unittest/.</code>".
   </p>

   <p>Note that directory labels are only valid for data dependencies.  If you try to use
      a directory as a label in an argument other than <code>data</code>, it
      will fail and you will get a (probably cryptic) error message.
   </p>

