61ー64日目 - CMake+Ninja環境の構築(harib00i) 2016/9/6-9

CMake+Ninja環境の構築

とにかく遅いAutomake

Windowsでlinux向けC++コードをビルドする際に困るのはそのビルドの遅さだ。msys2を使ってMakefileを生成すると、死ぬほど時間がかかる。今までの数年間はautomakeでMakefileを生成していた。けれどもその遅さは普通の人間なら気が狂うレベルの遅さなのでやってはいけないと最近思い始めた

Ninjaを使うべき理由

以下、引用

Ninjaは非常に軽量なビルドツールで、makeのようなほかのビルドツールと違って、他のプログラムからビルドルールを出力することを想定している。Chromiumのために開発されたのでgypが唯一の生成元だったが、CMake 2.8.8からCMakeプロジェクトをNinjaでビルドできるようになっていた。 従来、CMakeプロジェクトをWindows上でビルドする場合はMSVCかjom、mingw32-makeのようなビルドツールが使われてきたが、これらのツールは異常に遅く、あまり実用的は言いがたい感じだった。 今回Ninjaをつかうことが出来るようになったことで、特にインクリメンタルビルドがかなり病的に高速化する。例えばLLVMのような比較的大規模なプロジェクトをビルドするなら、多くの場合NinjaとCMakeの組み合わせが最速になる。makeと比べてNinjaは再帰的でないので、2,3の巨大なビルドルールを読み込んでファイルを一気に走査するという方法を取ることが出来る。
Ninja + CMakeの組み合わせがWindows上でも使えるように

build手順の変更

最終的にこんな感じに

  • 以下の例ではmsys用、Linux/Mac/BSD用、Ninja用、そしてVisualStudio用ビルドスクリプトを生成している
  • ビルドはとても早くなった!
$ mkdir build
$ cd build

# if you use msys2
$ cmake -G "MSYS Makefiles" ..
$ make

# if you use Unix environment
$ cmake -G "Unix Makefiles" ..
$ make

# if you can use Ninja
$ cmake -G "Ninja" ..
$ ninja

# もしVisual Studioを使うのであれば、以下のような感じでslnファイルを生成できる。スゴイ。
$ cmake -G "Visual Studio 14 2015 Win64" -DUSE_CPPUTEST=OFF ..