format markdown
2 files changed
tree: f86cdbe6379778f058537bbb1156c7a777f17e55
  1. .github/
  2. .vscode/
  3. benches/
  4. doc/
  5. src/
  6. tests/
  7. .gitignore
  8. Cargo.lock
  9. Cargo.toml
  10. dprint.json
  11. git-pre-commit
  12. LICENSE
  13. README.md
README.md

n2, an alternative ninja implementation

CI status MSRV

n2 (pronounced “into”) implements enough of ninja to successfully build some projects that build with ninja.

I wrote it 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.

Here's a small demo of n2 building some of Clang.

Install

$ cargo build --release
$ ./target/release/n2 -C some/build/dir

When CMake executes Ninja it expects some particular Ninja behaviors. n2 emulates these behaviors when invoked as ninja. To use n2 with CMake you can create a symlink:

  • UNIX: ln -s path/to/n2 ninja
  • Windows(cmd): mklink ninja.exe path\to\n2
  • Windows(PowerShell): New-Item -Type Symlink ninja.exe -Target path\to\n2

somewhere in your $PATH, such that CMake can discover it.

More reading

Differences from Ninja

n2 is missing many Ninja features.

n2 does some things Ninja doesn't:

  • Builds start tasks as soon as an out of date one is found, rather than gathering all the out of date tasks before executing.
  • Fancier status output, modeled after Bazel.
  • -d trace generates a performance trace as used by Chrome's about:tracing or alternatives (speedscope, perfetto).