Bazel has a feature that 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 you can use:
$ git clone https://github.com/kchodorow/tiny-workspace.git $ cd tiny-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:
$ 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:
$ dot -Tpng graph.png
If you open up graph.png, you should see something like this:
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:
$ bazel query --noimplicit_deps 'deps(//:main)' --output graph > simplified_graph.in
Now the resulting graph is just:
If you’re interested in further refining your query, check out the docs on querying.
3 thoughts on “Have you ever looked at your build? I mean, really looked at your build?”
I think, but not sure, that “query –package_path %workspace%:[path to bazel]/base_workspace” is no longer needed. If I’m correct I think it would be helpful to update the post for noobs dropping in (maybe to the repost in bazel blog as well). Thanks for your amazing work!
Quite so! Thank you!
The pictures are expired and some of the commands in this web page are missing chunks:
dot -Tpng graph.in > graph.png
dot -Tpng simplified_graph.in > simplified_graph.png