| --- |
| layout: documentation |
| title: Bazel Overview |
| --- |
| |
| # What is Bazel? |
| |
| 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. |
| |
| |
| # Why should I use Bazel? |
| |
| 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.** You can extend Bazel to support your language of |
| choice. |
| |
| |
| # How do I use Bazel? |
| |
| To build or test a project with Bazel, you typically do the following: |
| |
| 1. **Set up Bazel.** Download and [install Bazel](https://docs.bazel.build/versions/master/install.html). |
| |
| 2. **Set up a project [workspace](https://docs.bazel.build/versions/master/build-ref.html#workspaces)**, |
| which is a directory where Bazel looks for build inputs and `BUILD` files, |
| and where it stores build outputs. |
| |
| 3. **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 an abstract |
| Python-like language. (See example [here](https://github.com/bazelbuild/bazel/blob/master/examples/cpp/BUILD).) |
| |
| 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. |
| |
| 4. **Run Bazel** from the [command line](https://docs.bazel.build/versions/master/command-line-reference.html). |
| Bazel places your outputs within the workspace. |
| |
| In addition to building, you can also use Bazel to run [tests](https://docs.bazel.build/versions/master/test-encyclopedia.html) |
| and [query](https://docs.bazel.build/versions/master/query-how-to.html) the |
| build to trace dependencies in your code. |
| |
| |
| # How does Bazel work? |
| |
| When running a build or a test, Bazel does the following: |
| |
| 1. **Loads** the `BUILD` files relevant to the target. |
| |
| 2. **Analyzes** the inputs and their [dependencies](https://docs.bazel.build/versions/master/build-ref.html#dependencies), |
| applies the specified build rules, and produces an [action](https://docs.bazel.build/versions/master/skylark/concepts.html#evaluation-model) |
| graph. |
| |
| 3. **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](https://docs.bazel.build/versions/master/user-manual.html#sandboxing) |
| through sandboxing, minimizing skew and maximizing [reproducibility](https://docs.bazel.build/versions/master/user-manual.html#correctness). |
| |
| |
| ## 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](https://docs.bazel.build/versions/master/user-manual.html#build-consistency-and-incremental-builds) |
| 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](https://docs.bazel.build/versions/master/query-how-to.html) |
| in your code. |
| |
| |
| # How do I get started? |
| |
| To get started with Bazel, see [Getting Started](https://docs.bazel.build/versions/master/getting-started.html) |
| or jump directly to the Bazel tutorials: |
| |
| * [Tutorial: Build a C++ Project](https://docs.bazel.build/versions/master/tutorial/cpp.html) |
| * [Tutorial: Build a Java Project](https://docs.bazel.build/versions/master/tutorial/java.html) |
| * [Tutorial: Build an Android Application](https://docs.bazel.build/versions/master/tutorial/android-app.html) |
| * [Tutorial: Build an iOS Application](https://docs.bazel.build/versions/master/tutorial/ios-app.html) |