Requirements
Requirements for an output directory layout:- Doesn’t collide if multiple users are building on the same box.
- Supports building in multiple workspaces at the same time.
- Supports building for multiple target configurations in the same workspace.
- Doesn’t collide with any other tools.
- Is easy to access.
- Is easy to clean, even selectively.
- Is unambiguous, even if the user relies on symbolic links when changing into their 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.”)
Current layout
The solution that’s currently implemented:- Bazel must be invoked from a directory containing a WORKSPACE file (the “workspace directory”), or a subdirectory thereof. It reports an error if it is not.
- The outputRoot directory defaults to
~/.cache/bazelon Linux,/private/var/tmpon macOS, and on Windows it defaults to%HOME%if set, else%USERPROFILE%if set, else the result of callingSHGetKnownFolderPath()with theFOLDERID_Profileflag set. If the environment variable$TEST_TMPDIRis set, as in a test of Bazel itself, then that value overrides the default. - The Bazel user’s build state is located beneath
outputRoot/_bazel_$USER. This is called the outputUserRoot directory. - Beneath the
outputUserRootdirectory there is aninstalldirectory, and in it is aninstallBasedirectory whose name is the MD5 hash of the Bazel installation manifest. - Beneath the
outputUserRootdirectory, anoutputBasedirectory is also created 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 an output base directory is created called:/home/user/.cache/bazel/_bazel_user/7ffd56a6e4cb724ea575aba15733d113. - You can use Bazel’s
--output_basestartup option to override the default output base directory. For example,bazel --output_base=/tmp/bazel/output build x/y:z. - You can also use Bazel’s
--output_user_rootstartup option to override the default install base and output base directories. For example:bazel --output_user_root=/tmp/bazel build x/y:z.
Layout diagram
The directories are laid out as follows: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.