Bazel Compiler

Go back to Tutorial

Bazel is an open-source build and test tool similar to Make, Maven, and Gradle. It uses a human-readable, high-level build language. Bazel supports projects in multiple languages and builds outputs for multiple platforms. Bazel supports large codebases across multiple repositories, and large numbers of users.

Bazel offers the following advantages:

  • High-level build language. Bazel uses an abstract, human-readable language to describe the build properties of your project at a high semantical level. Unlike other tools, Bazel operates on the concepts of libraries, binaries, scripts, and data sets, shielding you from the complexity of writing individual calls to tools such as compilers and linkers.
  • Bazel is fast and reliable. Bazel caches all previously done work and tracks changes to both file content and build commands. This way, Bazel knows when something needs to be rebuilt, and rebuilds only that. To further speed up your builds, you can set up your project to build in a highly parallel and incremental fashion.
  • Bazel is multi-platform. Bazel runs on Linux, macOS, and Windows. Bazel can build binaries and deployable packages for multiple platforms, including desktop, server, and mobile, from the same project.
  • Bazel scales. Bazel maintains agility while handling builds with 100k+ source files. It works with multiple repositories and user bases in the tens of thousands.
  • Bazel is extensible. Many languages are supported, and you can extend Bazel to support any other language or framework.

Bazel Internals

When running a build or a test, Bazel does the following:

  • Loads the BUILD files relevant to the target.
  • Analyzes the inputs and their dependencies, applies the specified build rules, and produces an action graph.
  • Executes the build actions on the inputs until the final build outputs are produced.

Since all previous build work is cached, Bazel can identify and reuse cached artifacts and only rebuild or retest what’s changed. To further enforce correctness, you can set up Bazel to run builds and tests hermetically through sandboxing, minimizing skew and maximizing reproducibility.

What is the action graph?

The action graph represents the build artifacts, the relationships between them, and the build actions that Bazel will perform. Thanks to this graph, Bazel can track changes to file content as well as changes to actions, such as build or test commands, and know what build work has previously been done. The graph also enables you to easily trace dependencies in your code.

Using Bazel

To build or test a project with Bazel, you typically do the following:

  • Set up Bazel. Download and install Bazel.
  • Set up a project workspace, which is a directory where Bazel looks for build inputs and BUILD files, and where it stores build outputs.
  • Write a BUILD file, which tells Bazel what to build and how to build it.
  • You write your BUILD file by declaring build targets using Starlark, a domain-specific language.
  • A build target specifies a set of input artifacts that Bazel will build plus their dependencies, the build rule Bazel will use to build it, and options that configure the build rule.
  • A build rule specifies the build tools Bazel will use, such as compilers and linkers, and their configurations. Bazel ships with a number of build rules covering the most common artifact types in the supported languages on supported platforms.
  • Run Bazel from the command line. Bazel places your outputs within the workspace.

In addition to building, you can also use Bazel to run tests and query the build to trace dependencies in your code.

Command-Line Reference

bazel [<startup options>] <command> [<args>]


bazel [<startup options>] <command> [<args>] — [<target patterns>]


  • analyze-profile Analyzes build profile data.
  • aquery Analyzes the given targets and queries the action graph.
  • build Builds the specified targets.
  • canonicalize-flags Canonicalizes a list of bazel options.
  • clean Removes output files and optionally stops the server.
  • coverage Generates code coverage report for specified test targets.
  • cquery Loads, analyzes, and queries the specified targets w/ configurations.
  • dump Dumps the internal state of the bazel server process.
  • fetch Fetches external repositories that are prerequisites to the targets.
  • help Prints help for commands, or the index.
  • info Displays runtime info about the bazel server.
  • license Prints the license of this software.
  • mobile-install Installs targets to mobile devices.
  • print_action Prints the command line args for compiling a file.
  • query Executes a dependency graph query.
  • run Runs the specified target.
  • shutdown Stops the bazel server.
  • sync Syncs all repositories specified in the workspace file
  • test Builds and runs the specified test targets.
  • version Prints version information for bazel.

Go back to Tutorial

Get industry recognized certification – Contact us