---
layout: documentation
title: Output Directory Layout
---

# Output Directory Layout

## Requirements

Requirements for an output directory layout:

* Don't collide if multiple users are building on the same box.
* Support building in multiple workspaces at the same time.
* Support building for multiple target configurations in the same workspace.
* Don't collide with any other tools.
* Be easy to access.
* Be easy to clean, even selectively.
* Is unambiguous, even if the user relies on symbolic links when changing into
  his/her client directory.
* All the build state per user should be underneath one directory ("I'd like to
  clean all the .o files from all my clients.")

## Documentation of the current Bazel output directory layout

The solution that's currently implemented:

* Bazel must be invoked from a directory containing a WORKSPACE file. It reports
  an error if it is not. We call this the _workspace directory_.
* The _outputRoot_ directory is ~/.cache/bazel. (Unless `$TEST_TMPDIR` is
  set, as in a test of bazel itself, in which case this directory is used
  instead.)
* We stick the Bazel user's build state beneath `outputRoot/_bazel_$USER`. This
  is called the _outputUserRoot_ directory.
* Beneath the `outputUserRoot` directory, we create an `installBase` directory
  whose name is "install" plus the MD5 hash of the Bazel installation manifest.
* Beneath the `outputUserRoot` directory, we also create an `outputBase`
  directory whose name is the MD5 hash of the path name of the workspace
  directory. So, for example, if Bazel is running in the workspace directory
  `/home/user/src/my-project` (or in a directory symlinked to that one), then we
  create an output base directory called:
  `/home/user/.cache/bazel/_bazel_user/7ffd56a6e4cb724ea575aba15733d113`.
* Users can use Bazel's `--output_base` startup option to override the default
  output base directory. For example,
  `bazel --output_base=/tmp/bazel/output build x/y:z`.
* Users can also use Bazel's `--output_user_root` startup option to override the
  default install base and output base directories. For example:
  `bazel --output_user_root=/tmp/bazel build x/y:z`.

We put symlinks "bazel-&lt;workspace-name&gt;" and "bazel-out", as well as
"bazel-bin", "bazel-genfiles", and "bazel-includes" in the workspace directory;
these symlinks points to some directories inside a target-specific directory
inside the output directory. These symlinks are only for the user's convenience,
as Bazel itself does not use them. Also, we only do this if the workspace
directory is writable. The names of the "bazel-bin", "bazel-genfiles", and
"bazel-include" symlinks are affected by the `--symlink_prefix` option to bazel,
but "bazel-&lt;workspace-name&gt;" and "bazel-out" are not.

## Bazel internals: Directory layout

The directories are laid out as follows:

<pre>
&lt;workspace-name&gt;/                         <== The workspace directory
  bazel-my-project => <...my-project>     <== Symlink to execRoot
  bazel-out => <...bin>                   <== Convenience symlink to outputPath
  bazel-bin => <...bin>                   <== Convenience symlink to most recent written bin dir $(BINDIR)
  bazel-genfiles => <...genfiles>         <== Convenience symlink to most recent written genfiles dir $(GENDIR)

/home/user/.cache/bazel/                  <== Root for all Bazel output on a machine: outputRoot
  _bazel_$USER/                           <== Top level directory for a given user depends on the user name:
                                              outputUserRoot
    install/
      fba9a2c87ee9589d72889caf082f1029/   <== Hash of the Bazel install manifest: installBase
        _embedded_binaries/               <== Contains binaries and scripts unpacked from the data section of
                                              the bazel executable on first run (e.g. helper scripts and the
                                              main Java file BazelServer_deploy.jar)
    7ffd56a6e4cb724ea575aba15733d113/     <== Hash of the client's workspace directory (e.g.
                                              /home/some-user/src/my-project): outputBase
      action_cache/                       <== Action cache directory hierarchy
                                              This contains the persistent record of the file metadata
                                              (timestamps, and perhaps eventually also MD5 sums) used by the
                                              FilesystemValueChecker.
      action_outs/                        <== Action output directory. This contains a file with the
                                              stdout/stderr for every action from the most recent bazel run
                                              that produced output.
      command.log                         <== A copy of the stdout/stderr output from the most recent bazel
                                              command.
      external/                           <== The directory that remote repositories are downloaded/symlinked
                                              into.
      server/                             <== The Bazel server puts all server-related files (such as socket
                                              file, logs, etc) here.
        jvm.out                           <== The debugging output for the server.
      &lt;workspace-name&gt;/             <== Working tree for the Bazel build & root of symlink forest: execRoot
        _bin/                             <== Helper tools are linked from or copied to here.

        bazel-out/                        <== All actual output of the build is under here: outputPath
          local_linux-fastbuild/          <== one subdirectory per unique target BuildConfiguration instance;
                                              this is currently encoded
            bin/                          <== Bazel outputs binaries for target configuration here: $(BINDIR)
              foo/bar/_objs/baz/          <== Object files for a cc_* rule named //foo/bar:baz
                foo/bar/baz1.o            <== Object files from source //foo/bar:baz1.cc
                other_package/other.o     <== Object files from source //other_package:other.cc
              foo/bar/baz                 <== foo/bar/baz might be the artifact generated by a cc_binary named
                                              //foo/bar:baz
              foo/bar/baz.runfiles/       <== The runfiles symlink farm for the //foo/bar:baz executable.
                MANIFEST
                &lt;workspace-name&gt;/
                  ...
            genfiles/                     <== Bazel puts generated source for the target configuration here:
                                              $(GENDIR)
              foo/bar.h                       e.g. foo/bar.h might be a headerfile generated by //foo:bargen
            testlogs/                     <== Bazel internal test runner puts test log files here
              foo/bartest.log                 e.g. foo/bar.log might be an output of the //foo:bartest test with
              foo/bartest.status              foo/bartest.status containing exit status of the test (e.g.
                                              PASSED or FAILED (Exit 1), etc)
            include/                      <== a tree with include symlinks, generated as needed.  The
                                              bazel-include symlinks point to here. This is used for
                                              linkstamp stuff, etc.
          host/                           <== BuildConfiguration for build host (user's workstation), for
                                              building prerequisite tools, that will be used in later stages
                                              of the build (ex: Protocol Compiler)
        &lt;packages&gt;/                       <== Packages referenced in the build appear as if under a regular workspace
</pre>

The layout of the *.runfiles directories is documented in more detail in the places pointed to by RunfilesSupport.

## `bazel clean`

`bazel clean` does an `rm -rf` on the `outputPath` and the `action_cache`
directory. It also removes the workspace symlinks. The `--expunge` option
will clean the entire outputBase.
