Ninja: Google Chromeの開発者のビルドツールが公開された

gnu makeの高速版のようなもの。ただしシンタックスに互換性はない。

上記のブログでビルドツールの新規開発に至る経過を説明している。大雑把な流れは次のような感じ:

ウインドーズから(linuxに?)移植したときにsconsを使った。しかし、コンパイルし始めるまでに40秒かかることもあった。遅いのはsconsのせいではなく、3万ものインプットを一つのexecutableにコンパイルするビルドシステムのせいだとしている。

gnu makeに書き換えて、グーグルの高速gold linkerを活用し、それ以外にも色々工夫してincrementalビルドが10ー20秒ほどになった。 それでも遅い。

gnu makeの簡単なルールの実行をトレースしてみると、SCCSやRCSのデータを探してたりしていることを発見。{今時の人は何だか知らないでしょ、SCCSなんて} これ見てレガシーのmakeをチューニングするのを諦めて一から書き直す方が早いと思ったんだろう。

週末暇だったので、makefileの簡易版を作ってみた。これでincrementalビルドが6秒ほどに。このビルドシステムをNinjaとして公開した。

色々な面白い詳細を割愛させてもらったので、興味のある方は元記事を。(グーグルの高速リンカ、clangコンパイラ、グーグルのmeta-buildシステム、Makefileの機能的ルールのパフォーマンスなどなど)



言語ごとにビルドシステムを作り直す傾向が見られる。「Unixを理解しないものはそれを下手に再実装する」と賢者は言ったがそういう印象を得ることが多い。しかし、この場合makeをちゃんと使ってみてその限界に逹っして作ったものだから良しとしよう。

githubを見た第一印象では、makeとの互換性はないが、ルールの定義は簡潔でその精神に基いている感じがする。初心者がつまづくタブや「$%^」などの記号も見られない。Pythonみたいなスッキリとしたシンタックスだ。実装はC++のようだ。使用頻度の高いツールはやはりネイティブなものがいい。
Chromeのようにコンパイルが開始されるまでの時間を意識させるぐらい巨大なプロジェクトにはいいかもしれないが、普通のサイズだったらわざわざmakeから乗り換える必要も無さそうだ。