Build systems

Tools that automate a variety of tasks like compiling, packaging, testing and more

Build systems are critical to creating a repeatable, reproducible and consistent build process. This becomes important as the company grows in size and more developers are added to the team and as more products are added to the product line.

Basically you'll use these systems to orchestrate a combination of following tasks:

  • fetch dependecies
  • transpile source codes
  • build executable programs
  • run multiple types of tests
  • bundle websites or apps
  • perform static analysis
  • generate documentation

Before choosing a system, consider following:

  • How easy is for the people to describe the build process?
  • Does it generate all the dependencies correctly?
  • How long does it take for the build to complete?
  • Will the tool scale well and can it include other build tools?



Bazel is a build tool that builds code quickly and reliably. It is used to build the majority of Google's software, and thus it has been designed to handle build problems present in Google's development environment.



Buck encourages the creation of small, reusable modules consisting of code and resources, and supports a variety of languages on many platforms.



Pants is a fast, scalable build system. Pants supports Java, Scala, Python, C/C++, Go, Javascript/Node, Thrift, Protobuf and Android code. Adding support for other languages, frameworks and code generators is straightforward.



Write in Java, C++, Python or your language of choice. Package for deployment on any platform. Go monorepo or multi-repo. And rely on Gradle's unparalleled versatility to build it all.


Apache Maven

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.



CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice.