Cmakeの使い方 – インストールと実行

今回は、主にC++のビルドに関する話題です。普段、Visual StudioでC++を使って開発している筆者ですが、久しぶりにAndroidの開発をする機会がありました。Androidの開発は、以前はEclipse & ADT & NDKという開発環境を使っていたのですが、現在は、ADTのサポートは終了しており、Android Studioを使った開発が主流のようです。そこで、Android Studio+ネイティブコンパイルについて調べてみたのですが、そこも以前とは変わっており、ビルドにはCMakeというソフト?を使うのが主流のようです。Android以外にも、iOSやemscriptenを使うことが稀にあるため、便利そうなCMakeについて調べてみました。

この記事では、Windows上(Windows 10)での動作を前提に進めていきます。

CMakeとは?

CMakeは、CMake用の設定ファイルを作成しておくことで、そこから、Visual Studioのプロジェクトファイルや、Xcode用のプロジェクトファイル、Makefileを生成してくれるソフトウェアです。筆者が使う以下の環境については、全て利用可能でした。

  • Visual Studio
  • Android(ネイティブコンパイル)
  • Xcode
  • emscripten

また、筆者は、普段Visual Studioを使って、ライブラリを細かく分けて開発しているのですが、そのような分割開発への対応も容易でした。筆者の感覚としては、Makefileを書くよりも簡単な印象です。

CMakeのインストール

公式サイトからWindows用のインストーラをダウンロードし、起動するだけで完了します。インストール時には、Pathを通しておきます。執筆時点のバージョンは、3.9.0でした。

GUIもあるようですが、この記事ではコマンドラインを使った操作を基本としていきます。コマンドラインから、 cmake -help と入力して、ヘルプが出れば、インストールが完了しています。

使い方

ビルドしたいソースコードのあるディレクトリに、CMake用の設定を書いた「CMakeLists.txt」というファイルを作成します。例えば、main.cpp、hello2.cppという2つのファイルからなる、hello.exe(Windowsの場合)を生成するためのプロジェクトは、以下のように書きます。

これ以外にも色々と設定が書けますが、とりあえず、最低限これだけでOKです。

次に、コマンドラインで先程のディレクトリに移動し、以下のコマンドに実行すると、そのディレクトリにプロジェクトファイルが生成されます。

cmakeの後に「.」(カレントディレクトリの指定)は必須ですので、注意して下さい。筆者の環境では、Visual Studio 2015用のプロジェクトファイルとソリューションファイルが生成されました。この辺りは、環境によると思います。

cmakeは、カレントディレクトリに生成物やキャッシュ等を色々と生成するため、場合によってはディレクトリを汚して嫌なことがあるかもしれません。その場合、先程にディレクトリに例えば「build」のようなディレクトリを作成し、そこへ移動してから、一つ上のディレクトリを渡してcmakeを実行します。以下のような感じです。

cmakeの後に「..」を渡します。こちらのほうが利用機会が多いかもしれません。この記事ではこれ以降「..」を渡す方法を基本します。

このようにcmakeの引数には、「CMakeLists.txt」のあるディレクトリを渡せば良いようです。ただ、CMakeLists.txtのファイル名の変更方法は調べたところ分かりませんでした。もしかしたら無いかもしれません。

生成するプロジェクトの種類を変える

先程は、どのような種類のプロジェクトファイルを生成するかを指定しませんでしたが、cmake実行の際にオプションを与えることで、生成するプロジェクトの種類を変更できます。構文としては「-G」オプションで指定します。以下のような感じです。

  • Visual Studio 2015
    • cmake -G"Visual Studio 14 2015" ..
  • MinGW (WindowsでMakeする環境)
    • cmake -G"MinGW Makefiles" ..

指定できるオプションは、 cmake --helpで確認できます。ちなみに、生成先のディレクトリ(カレントディレクトリ)に「CMakeFiles」というディレクトリと「CMakeCache.txt」というファイルが作成されるのですが、異なるプロジェクトの種類のものがあると、エラーになります。プロジェクトの種類を変えたい場合は、別のディレクトリにするか、これらのフォルダとファイルを削除して下さい。

CMakeLists.txt内で使用する変数を設定する

CMakeLists.txtの中では、変数が使用できるのですが、その変数の値をcmakeする際に指定できます。まだ、CMakeLists.txtの書き方について何も説明していませんが、この記事で、cmakeコマンドの実行方法についてまとめておきたいため、ここで説明します。

変数を指定する場合は「-D」オプションを使用します。例えば、Tという変数に1を設定する場合は、以下のとおりです。

なお、この変数はヘルプによると「cmake cache entry」と言うようで、その名の通り、次回以降cmakeをしても「T=1」という状態は保存されるため、注意が必要な場合があるかもしれません。

この例では、独自の名前のものを使用しましたが、組み込みのものもいくらかあるようです。

ビルドの種類を変える

デバッグオプションをつけてビルドしたいときや、最適化を掛けたいなどビルドの種類を変えたい、つまり、DebugやReleaseを切り替えたい場合があります。このような設定の切り替えもcmakeで行えます。(Visual Studioの場合はあまり意味が無い気もしますが、Makefileですと大事なようです)

切り替えを行うには、先程紹介した変数設定を使い「CMAKE_BUILD_TYPE」という変数に「Debug」や「Release」を渡します。

  • Debugビルド(デバッグシンボルがつく?)
    • cmake -D"CMAKE_BUILD_TYPE=Debug" ..
  • Releaseビルド(最適化オン、デバッグシンボルなし)
    • cmake -D"CMAKE_BUILD_TYPE=Release" ..

その他にも、最適化オン、デバッグシンボルありの「RelWithDebInfo」や、バイナリサイズを小さくする「RelWithDebInfo」を指定できます。

これらを指定した場合、コンパイラに渡すオプションが変わるのですが、それらについては別の機会に紹介したいと思います。

まとめ

CMakeの使い方、特にcmakeコマンドの使い方についてまとめました。次回は、本番?CMakeLists.txtの書き方についてまとめていきたいと思います。

参考