commit | 66b02a579a0a857dbac5688e24cdb2f64f311b01 | [log] [tgz] |
---|---|---|
author | Cole Faust <[email protected]> | Sun Jan 21 21:23:51 2024 -0800 |
committer | Evan Martin <[email protected]> | Thu Jan 25 00:30:16 2024 -0800 |
tree | 07867bd7afb68c339eca81825314f5b71b84b328 | |
parent | a0e37e96a75f373bd85de0ffda324a8a64f4f6cb [diff] |
Only hash strings once in id_from_canonical Use HashMap.entry() instead of a lookup + insert.
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.