グレインの備忘録

プログラミング関係とかをつらつらと。

Cmake+Ninjaでビルドをやってみる

最近プログラムをビルドするのにCmakeを使い始めてみた。

Cmakeでは、軽量な動作で有名なNinja用のファイルを生成できるらしいので試してみる。

Ninjaのインストール 同名のパッケージにご用心

早速入れてみようと、安直に以下のコマンドを実行。

$ sudo apt -y install ninja

ところが、

$ cmake . -G Ninja

とするとエラーが。

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler using: Ninja
CMake Error:
  The detected version of Ninja (0.1.3) is less than the version of Ninja required
  by CMake (1.3).


CMake Error: Internal CMake error, TryCompile generation of cmake failed
-- Check for working C compiler using: Ninja -- broken

バージョンが古くて怒られている模様。確かに、

$ ninja --version
log: ninja version 0.1.3 initializing

と出るので、バージョンが低いらしい。apt提供のパッケージが古いのか?と思い

$ apt search ninja

とすると、

ninja/xenial,now 0.1.3-2 amd64 [インストール済み]
  GNU/Linux 用特権昇格検知システム

ninja-build/xenial,now 1.5.1-0.1ubuntu1 amd64 
  small build system closest in spirit to Make

ninja-build-doc/xenial,xenial 1.5.1-0.1ubuntu1 all
  documentation for ninja-build

ninja-ide/xenial,xenial 2.3-2 all
  integrated development environment (IDE) for Python

と出てきた。どうやらさっきのninjaはビルドツールではなかったらしい。

気を取り直して

$ sudo apt -y remove ninja
$ sudo apt -y install ninja-build

として入れなおす。これでうまく行くだろう。

ツールチェインの切り替えにご注意

ところが、

$ cmake . -G Ninja
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler using: Ninja
CMake Error:
  The detected version of Ninja () is less than the version of Ninja required
  by CMake (1.3).


CMake Error: Internal CMake error, TryCompile generation of cmake failed
-- Check for working C compiler using: Ninja -- broken

またもやエラー。今度はバージョンが検出されていない模様。

調べてみると、以下のページに行き当たった。

github.com

以下引用

"if previously build dir already configured , but ninja executable is moved, cmake didn't report command not found ,but reports "The detected version of Ninja ("") is less than the version of Ninja required by CMake ("1.3") which is confused."

要するに、残骸が残っているとダメということらしい。ということで、

$ rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile
$ cmake . -G Ninja

というふうに残骸を消してやるとうまく行った。

確かに軽量だが出力がログみたいに残らずに消えてしまうのが少し残念かもしれない。