- Has nice Python based DSL
- Strongly encourages 100% explicit dependency specification
- Has built in caching (local and remote)
- Built in test result caching
- a fully featured build graph query language
- Built in distributed execution support (for any build step)
- All work scales by part of tree you are building not it’s absolute size
- Support for fetching external source code and binary deps
- Has first class support for executing and testing containers
- Has first class support for code gen (ie you can build a compiler use it to generate code, then build its output,and everything works, no hacks in one build system)
The downsides:
- Works best if you all your code is built with Bazel, which makes deps hard
- Support for Python is weak, Ruby non existent, and Node is beta quality
- Has essentially zero convention, everything must be explicitly configured (ie explicitly describing go deps)
- Has a memory hungry local java daemon
- Has a more overhead than ninja (but is more accurate because of hashing and isolation)