n2 (pronounced “into”) implements enough of Ninja to successfully build some projects that build with Ninja. Compared to Ninja, n2 missing some features but is faster to build and has a better UI; see a more detailed comparison.
Here's a small demo of n2 building some of Clang.
$ cargo install --git https://github.com/evmar/n2 # (installs into ~/.cargo/bin/) $ n2 -C some/build/dir some-target
When CMake generates Ninja files it attempts run a program named ninja
with some particular Ninja behaviors. In particular, it attempts to inform Ninja/n2 that its generated build files are up to date so that the build system doesn't attempt to rebuild them.
n2 can emulate the expected CMake behavior when invoked as ninja
. To do this you create a symlink named ninja
somewhere in your $PATH
, such that CMake can discover it.
ln -s path/to/n2 ninja
mklink ninja.exe path\to\n2
New-Item -Type Symlink ninja.exe -Target path\to\n2
Warning
If you don't have Ninja installed at all, you must install such a symlink because CMake attempts to invokeninja
itself!
While building, n2 displays build progress like this:
[=========================--------- ] 2772/4459 done, 8/930 running Building foo/bar (2s) Building foo/baz
The progress bar always covers all build steps needed for the targets, regardless of whether they need to be executed or not.
The bar shows three categories of state:
=
signs show the build steps that are already up to date.-
signs show steps that are in-progress; if you had enough CPUs they would all be executing. The 8/930 running
after shows that n2 is currently executing 8 of the 930 available steps.The lines below the progress bar show some build steps that are currrently running, along with how long they've been running if it has been a while. Their text is controlled by the input build.ninja
file.
I wrote n2 to explore some alternative ideas I had around how to structure a build system. In a very real sense the exploration is more important than the actual software itself, so you can view the design notes as one of the primary artifacts of this.