のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

CMakeを使ってビルドのみしている人のためのCMake入門

Sponsored Links

皆さんこんにちは
お元気ですか。ついに自宅のパスタがなくなりそうです。

さて、本日のテーマはcmakeです。
大半の人のcmake、実はこんな感じなのではないでしょうか。

  • インストール時にお世話になる(おまじない)けど、何もわからない(文字通り)
  • 仮に見たとしても何をやっているのかわからない。

私もある程度、これらに該当する人なわけです。
しかし、このおまじない系はまると長時間はまってとても困るといった問題がありました。
ということで改めてcmakeをきちんと勉強しておこうと思った次第です。

CMake

CMakeが何かはWikipediaにも書いてあります。

CMakeはコンパイラに依存しないビルド自動化のためのフリーソフトウェアであり、様々なオペレーティングシステムで動作させることができる。CMakeは階層化ディレクトリや複数のライブラリを利用するアプリケーションをサポートするよう設計されている。

環境によってもコンパイル方法(g++/clangなど)が異なるため、それぞれで設定を書く必要があります。
また、C++特有の依存関係を記述していくのは大変です。
それらを一括してCMakeは管理してくれます。

インストール

パッケージ管理ソフト(apt-get/homebrew/yum)でインストール可能です。

Ubuntu
sudo apt-get install cmake
Mac(Homebrew)
brew install cmake
CentOS
sudo  yum install cmake

CMakeを使ってC++コンパイルを行ってみる。

構成の準備

次のサイトのサンプルを参考にします。
derekmolloy.ie

helloworld.cpp/CMakeList.txtは同じディレクトリに配置してください。

1. helloworld.cpp

#include<iostream>

int main(int argc, char *argv[]){
   std::cout << "Hello World!" << std::endl;
   return 0;
}

プログラムはただの「Hello World!」出力用のプログラムです。

2. CMakeLists.txt

cmake_minimum_required(VERSION 2.8.9)
project (hello)
add_executable(hello helloworld.cpp)

cmake_minimum_requiredはcmakeの最低要求のバージョン
projectはプロジェクト名を示します。(挙動には関係ありません。)
今回の場合、add_executableはhelloworld.cppからhelloのファイルを作ります。

CMakeを試す

試してみましょう、次のコマンドで実行します。

mkdir build && cd build
cmake ..

buildディレクトリ作成もおまじないのようにさらっと記述されています。
これは、cmakeした結果のファイルが生成されるので、それ用です。
構成管理ツールでの管理を考えた時に、buildディレクトリを無視すればよいだけなので、管理しやすそうです。

cmakeが完了するとCMakeCache.txtなど、様々なファイルが生成されます。
これらはmakeを使う時に必要なファイル群です。

最後にmakeを実行すれば、実行ファイルの生成がされます。
後は実行ファイルをそのまま実行できます。

その他CMakeについて

CMakeでよく利用されるOption

特によく利用されるOptionは-Dです。
cmakeで環境を示す変数を指定しますが、-D Optionを付与することで、それよりも優先させることができます。
複数の環境を利用していると、デフォルトよりも特定の環境を指定したいこともあります。

その場合に-D Optionを利用して強制的に書き換えることもあります。

どんな変数が設定できるのかは「cmake .. -L」を実行すれば、確認可能です。

CMakeで作成されるMakefileのコマンド

CMakeで作成されるMakefileでよく利用されるコマンドをここでは紹介します
CMakeで作られたMakefileのおまじないの一種として「make -j8」やら「make install」といったコマンドがあります。

「make」では、ソースコードのビルドが行われます。殆どの場合はC++コンパイルですね。
また、「make install」を行うことで、規定のディレクトリに配置されます。これによって外部からでも呼び出し可能になります。

途中までのビルド結果を消したい場合は「make clean」を利用すれば良いでしょう。

ちなみに、よく使うOption「make -j」は並列数を指定できます。許せる限りのCPUコア数を数値として入れると良いでしょう。
ただし、コア数に対してジョブが多すぎると逆効果になるため、慎重に。(一度メモリ不足か何かで誤ってえらい目にあったことがあります)

最後に

おまじない(※僕だけかもしれない)を真面目に解説してみました。
一度はまったときにあれっと思うので、このようなことを勉強しておくのも時には必要でしょう。

その場合にぜひ、見てほしいと思います。