2014/01/21


ninja いままで「SCons とか gyp とか、なんで C++ のシステムに python 入れなあかんねん」とか「せっかく python 入れたのに windows でビルドするには cygwin 版が必要とかいい加減にしろ」とか色んな事があったのですが、ninja を使う事で悩みが解消するかもしれません。
Ninja, a small build system with a focus on speed

Ninja is a small build system with a focus on speed. It differs from other build systems in two majo...

http://martine.github.io/ninja/

如何にも外国人ウケしそうなプロジェクト名です。
ninja は chromium ブラウザの開発者が現行のビルドシステムに嫌気をさして作り始めたビルドシステムです。これまでちょっとしたファイルの変更であってもビルド開始までに10秒掛かっていたのが1秒以下になるとの事です。ninja のウリは高速であり、ゴールも高速。configure の様な依存から解決するのではなく、現行のファイル構成からソースレベルの依存情報を解決します。
主に以下の様な目標をかかげています。
  • 高速なインクリメンタルビルド
  • コードのビルド方法を記述する為のポリシーをなるべく小さく
  • 正しく依存を解決
ちなみに ninja は Windows でも簡単にビルド出来ます。mingw を使う場合は python bootstrap.py --platform=mingw とすればok。
ninja は build.ninja というファイルを読み込みます。記述方法は Makefile に似ています。
build.ninja には rule という形でコマンドを定義し、あとは依存関係のみを記述します。例えば Windows で foo.c から foo.o を作り、foo.exe を生成する build.ninja を書くとすれば以下の様になります。
cflags = -Wall

rule ld
  command = gcc $ldlags $in -o $out
rule cc
  command = gcc $cflags -c $in -o $out

build foo.o: cc foo.c
build foo.exe: ld foo.o
depfile にも対応しており、gcc -M と連携して簡単に依存関係が記述出来ます。
rule cc
  depfile = $out.d
  command = gcc -MMD -MF $out.d [other gcc flags here]
色んな所で速度比較が行われている様ですが、ninja の特徴はコマンドを実行してからビルドが開始するまでのオーバーヘッドの短縮にある様です。いずれ chromium のビルドに使われ始めるかもしれませんね。

使われ方は通常の Makefile の様に使うのも良いですが、メタビルドシステムと連携して使うと便利で、例えば gyp のジェネレータとして使う方法もある様です。
NinjaBuild - chromium - Using the Ninja build system - An open-source project to help move the web forward. - Google Project Hosting

Help me to solve this error [44/11153] CC obj\third_party\lzma_sdk\lzma_sdk.7zAlloc.obj FAILED: ninj...

https://code.google.com/p/chromium/wiki/NinjaBuild

blog comments powered by Disqus