なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

CMakeでNinja向けファイルを生成する

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

Cmake + Ninjaという解決策

2012-06-13 ■Ninja + CMakeの組み合わせがWindows上でも使えるように

"今回Ninjaをつかうことが出来るようになったことで、特にインクリメンタルビルドがかなり病的に高速化する。例えばLLVMのような比較的大規模なプロジェクトをビルドするなら、多くの場合NinjaとCMakeの組み合わせが最速になる。"

d.hatena.ne.jp


これは4年前の記事なので、cmakeのninja対応もすでに安定板に入っておるだろうと思う。その3か月後のcmake側のブログ更新。

Posted by Bogdan Cristea 2012-09-23

"Recently IT++ has switched to a new build system based on cmake. cmake is a much flexible option for generating files needed for compilation. On Linux, for example, cmake generates by default Makefiles, but the latest cmake versions (e.g. 2.8.9) have the option to generate Ninja files instead. Ninja is a small build system designed for speed (https://github.com/martine/ninja) and can be seen as a replacement for make.
Here is the command used to generate Ninja files (assuming that you are in a folder just below the root source folder):
cmake .. -G Ninja -DCMAKE_MAKE_PROGRAM=/path/to/ninja"

IT++ / Blog: Using cmake with ninja build system

CMake移行

実際CMake使うだけでもかなり早くなった。Autotools特有のshell実行が少ないからだ。
おまけにVisualStudio用のslnファイルとかも生成できるようになる。

am2cmake

configure.acやMakefile.amの書き換えには、KDEプロジェクトの人が作ってたAutomake->cmake移行スクリプトをちょい改造したのを使った。後は手動で書き換え。

It's fork

github.com

ちょっとした書き換え例

AutomakeにせよCMakeにせよ、やることは変わらないので大体の場合代替手段がある

C++11判定
# configure.ac
AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])
# CMake
set_property(TARGET xxxxxxx PROPERTY CXX_STANDARD 11)
set_property(TARGET xxxxxxx PROPERTY CXX_STANDARD_REQUIRED ON)
インストールパスでマクロを変える*2
# configure.ac
AS_IF([test "$prefix" = "NONE"],
      [AC_DEFINE_UNQUOTED([RESOURCE_PATH], ["/usr/local/share/intel2gas/"], [Define research path with --prefix dir macro])],
      [AC_DEFINE_UNQUOTED([RESOURCE_PATH], ["$prefix/share/intel2gas/"],    [Define research path with --prefix dir macro])]
)
# CMake
if (DEFINED DESTDIR)
  add_definitions( -DRESOURCE_PATH="${DESTDIR}/share/intel2gas/" )
else()
  add_definitions( -DRESOURCE_PATH="/usr/local/share/intel2gas/" )
endif()

Ninja用ファイル生成

ここまで来たら後はNinjaをインストールするだけ。
なぜかninjaというパッケージだけだと動かないので、ninja-buildというパッケージをインストールした。

# apt-get install ninja-build
$ cd some_project
$ mkdir build
$ cd build
$ cmake -G Ninja ..
$ ninja

ビルドが1分以内で終わるようになった。

*1:じゃあ今までは気がくるっていたのか?

*2:CMakeの方は未テスト