Ninja | |
---|---|
![]() | |
Developer(s) | Evan Martin |
Initial release | 2012[1] |
Stable release | |
Repository | |
Written in | C++, Python |
Operating system | Linux, macOS, Windows |
Type | Software development tools |
License | Apache License 2.0 [3] |
Website | ninja-build![]() |
Ninja is a build system developed by Evan Martin, [4] a Google employee. Ninja has a focus on speed and it differs from other build systems in two major respects: it is designed to have its input files generated by a higher-level build system, and it is designed to run builds as fast as possible. [5]
In essence, Ninja is meant to replace Make, which is slow when performing incremental (or no-op) builds. [6] This can considerably slow down developers working on large projects, such as Google Chrome, which compiles 40,000 input files into a single executable. In fact, Google Chrome is a main user and motivation for Ninja. [7] It's also used to build Android (via Makefile translation by Kati), [8] and is used by most developers working on LLVM. [9]
In contrast to Make, Ninja lacks features such as string manipulation, as Ninja build files are not meant to be written by hand. Instead, a "build generator" should be used to generate Ninja build files. Gyp, CMake, Meson, and gn [10] are popular build management tools that support creating build files for Ninja. [11]
Below is an example of a Ninja build file that compiles two C source files (source1.c
and source2.c
) into object files and then links them into an executable called myprogram
. It defines two rules: one for compiling (cc
) and one for linking (link
):
rulecccommand=gcc-c-o$out$indescription=CC$outrulelinkcommand=gcc-o$out$indescription=LINK$outbuild source1.o:ccsource1.cbuild source2.o:ccsource2.cbuild myprogram:linksource1.osource2.o