Windowsでlinux向けC++コードをビルドする際に困るのはそのビルドの遅さだ。msys2を使ってMakefileを生成すると、死ぬほど時間がかかる。今までの数年間はautomakeでMakefileを生成していた。けれどもその遅さは普通の人間なら気が狂うレベルの遅さなのでやってはいけないと最近思い始めた*1。
Cmake + Ninjaという解決策
2012-06-13 ■Ninja + CMakeの組み合わせがWindows上でも使えるように
"今回Ninjaをつかうことが出来るようになったことで、特にインクリメンタルビルドがかなり病的に高速化する。例えばLLVMのような比較的大規模なプロジェクトをビルドするなら、多くの場合NinjaとCMakeの組み合わせが最速になる。"
これは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"
CMake移行
実際CMake使うだけでもかなり早くなった。Autotools特有のshell実行が少ないからだ。
おまけにVisualStudio用のslnファイルとかも生成できるようになる。
am2cmake
configure.acやMakefile.amの書き換えには、KDEプロジェクトの人が作ってたAutomake->cmake移行スクリプトをちょい改造したのを使った。後は手動で書き換え。
It's fork
ちょっとした書き換え例
AutomakeにせよCMakeにせよ、やることは変わらないので大体の場合代替手段がある
C++11判定
- 今までconfigure.acに書いてたやつがこんなふうになった
- c++ - How to detect c++11 support of a compiler with cmake - Stack Overflow
# 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分以内で終わるようになった。