| --- |
| layout: posts |
| title: Visualize your build |
| --- |
| |
| _Reposted from |
| [Kristina Chodorow's blog](http://www.kchodorow.com/blog/2015/04/24/have-you-ever-looked-at-your-build-i-mean-really-looked-at-your-build/)._ |
| |
| Bazel lets you see a graph of your build dependencies. It _could_ help you |
| debug things, but honestly it's just really cool to see what your build is doing. |
| |
| To try it out, you'll need a project that uses Bazel to build. If you don't |
| have one handy, |
| [here's a tiny workspace](https://github.com/kchodorow/tiny-workspace) you can |
| use: |
| |
| ```bash |
| $ git clone https://github.com/kchodorow/tiny-workspace.git |
| $ cd tiny-workspace |
| ``` |
| |
| Make sure you've |
| [downloaded and installed Bazel](http://bazel.io/docs/install.html) and have the |
| following line to your _~/.bazelrc_: |
| |
| ``` |
| query --package_path %workspace%:[path to bazel]/base_workspace |
| ``` |
| |
| Now run `bazel query` in your _tiny-workspace/_ directory, asking it to search |
| for all dependencies of `//:main` and format the output as a graph: |
| |
| ```bash |
| $ bazel query 'deps(//:main)' --output graph > graph.in |
| ``` |
| |
| This creates a file called _graph.in_, which is a text representation of the |
| build graph. You can use `dot` (install with `sudo apt-get install graphviz`) |
| to create a png from this: |
| |
| ```bash |
| $ dot -Tpng < graph.in > graph.png |
| ``` |
| |
| If you open up _graph.png_, you should see something like this: |
| |
| <img src="/assets/graph.png"> |
| |
| You can see `//:main` depends on one file (`//:main.cc`) and four targets |
| (`//:x`, `//tools/cpp:stl`, `//tools/default:crosstool`, and |
| `//tools/cpp:malloc`). All of the `//tools` targets are implicit dependencies |
| of any C++ target: every C++ build you do needs the right compiler, flags, and |
| libraries available, but it crowds your result graph. You can exclude these |
| implicit dependencies by removing them from your query results: |
| |
| ```bash |
| $ bazel query --noimplicit_deps 'deps(//:main)' --output graph > simplified_graph.in |
| ``` |
| |
| Now the resulting graph is just: |
| |
| <img src="/assets/simple-graph.png"> |
| |
| Much neater! |
| |
| If you're interested in further refining your query, check out the |
| [docs on querying](/docs/query.html). |