Ninjaを使ってmrubyをビルドする

__この記事は 2012年05月24日 に投稿したもので、すでに情報が古くなっています。mrubyのビルド方法に関する新しい情報は [mrubyのビルド方法 - Qiita [キータ]](http://qiita.com/masuidrive/items/e516c23b4feab73d139f) などをご覧ください。__
- - -
先日(追記:2012年05月24日当時)mrubyのソースツリーに、CMakeを使ってビルドするための変更が[commitされました][mruby-CMake]。

せっかくCMakeを使えるようになりましたので、早速Ninjaでビルドしてみます。ちなみに[Ninja][Ninja]とはMakeのようなもので、最近は[Chromiumのビルドにも使われているそう][Chromium-Ninja]です。くわしくは[Ninjaのドキュメント][Ninja-Document]をご覧ください。

Ninjaを使ったビルド
----------------

以下はFreeBSD 9.0-STABLE上で行ったビルドのログです。

```
% uname -mrs
FreeBSD 9.0-STABLE amd64
% pwd
~/src/mruby
% cd build
% cmake -G Ninja
-- Build type not set, defaulting to 'RelWithDebInfo'
-- The C compiler identification is GNU 4.2.1
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Looking for string.h
-- Looking for string.h - found
-- Looking for float.h
-- Looking for float.h - found
-- Looking for gettimeofday
-- Looking for gettimeofday - found
-- Found BISON: /usr/local/bin/bison (found version "2.5") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/don/src/mruby/build
% ninja
[2/60] Building C object tools/xpcat/CMakeFiles/xpcat.dir/xpcat.c.o
../tools/xpcat/xpcat.c: In function 'main':
../tools/xpcat/xpcat.c:63: warning: label 'done' defined but not used
[23/60] Building C object src/CMakeFiles/mruby_object.dir/regparse.c.o
../src/regparse.c: In function 'onig_parse_make_tree':
../src/regparse.c:5588: warning: passing argument 3 of 'parse_regexp' discards qualifiers from pointer target type
[39/60] Building C object src/CMakeFiles/mruby_object.dir/dump.c.o
../src/dump.c: In function 'get_syms_block_size':
../src/dump.c:272: warning: passing argument 1 of 'str_dump_len' discards qualifiers from pointer target type
../src/dump.c: In function 'write_syms_block':
../src/dump.c:417: warning: passing argument 1 of 'str_dump_len' discards qualifiers from pointer target type
../src/dump.c:424: warning: passing argument 1 of 'str_dump' discards qualifiers from pointer target type
[60/60] Linking C executable tools/mruby/mruby
```

という感じでビルドが完了しました。

Ninjaに対応したCMake
------------------

CMakeがNinjaのビルドファイルを生成するには、もちろんCMakeがNinjaに対応していなければなりません。CMakeのヘルプを表示して、generatorにNinjaが書かれていれば大丈夫です。

同じバージョンでもgeneratorのラインナップが異なる例として、FreeBSDとMac OS XでのCMakeのヘルプを例に挙げます。

例えばFreeBSD portsでインストールしたCMake 2.8.8では次のように表示されました:

```
Generators

The following generators are available on this platform:
  Ninja                       = Generates build.ninja files (experimental).
  Unix Makefiles              = Generates standard UNIX makefiles.
  CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
  Eclipse CDT4 - Unix Makefiles
                              = Generates Eclipse CDT 4.0 project files.
  KDevelop3                   = Generates KDevelop 3 project files.
  KDevelop3 - Unix Makefiles  = Generates KDevelop 3 project files.
```

しかし、HomebrewでインストールしたCMake 2.8.8では次のように表示されました:

```
Generators

The following generators are available on this platform:
  Unix Makefiles              = Generates standard UNIX makefiles.
  Xcode                       = Generate Xcode project files.
  CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
  Eclipse CDT4 - Unix Makefiles
                              = Generates Eclipse CDT 4.0 project files.
  KDevelop3                   = Generates KDevelop 3 project files.
  KDevelop3 - Unix Makefiles  = Generates KDevelop 3 project files.
```

生成物
-----

mrubyを普通にmakeでビルドした時との違い、生成された実行ファイルやライブラリがあちこちに点在したままになります。

- build/mrblib/libmruby.a
- build/tools/mirb/mirb
- build/tools/mirb/mrbc
- build/tools/mirb/mruby

CMakeでMakefileを生成するやり方はまだやったことありませんが、同じ感じでしょうか。

[mruby-CMake]: https://github.com/mruby/mruby/commit/618697cbb6f2cb96f6e7d076d2beda3bb98b2577
[Ninja]: http://martine.github.com/ninja/ "Ninjaの公式ウェブサイト"
[Chromium-Ninja]: http://code.google.com/p/chromium/wiki/NinjaBuild
[Ninja-Document]: http://martine.github.com/ninja/manual.html