torutkのブログ

ソフトウェア・エンジニアのブログ

cmakeツール最初の一歩

UNIXでは、C/C++ソースコードをビルドするにはMakefileを書いてmakeツールを使うのが一般的です。しかし、Makefileを書くのは大変なので*1、もっと楽なツールを探すと出てくるものの一つがcmakeです*2

cmakeのインストール(CentOS 5.2)

# yum install cmake

でインストールできます。

Hello, worldプログラムをcmakeでビルドする

ビルド設定は、CMakeLists.txtという名前のファイルに記述します。とりあえずソースファイルと同じディレクトリに以下の内容で作成します。

  • CMakeLists.txtの作成
PROJECT(HelloWorld)

ADD_EXECUTABLE(hello hello.cpp)
  • cmakeコマンド実行

以下コマンドを実行します。

hello$ cmake .
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Configuring done
-- Generating done
-- Build files have been written to: /home/torutk/hello
hello$

コマンド実行後、以下のファイルが生成されました。かなり多量のファイルです。

hello/
  +-- CMakeCache.txt
  +-- CMakeFiles/
  |     +-- CMakeCCompiler.cmake
  |     +-- CMakeCXXCompiler.cmake
  |     +-- CMakeDirectoryInformation.cmake
  |     +-- CMakeOutput.log
  |     +-- CMakeSystem.cmake
  |     +-- CMakeTmp/
  |     |     +-- CMakeFiles/
  |     |           +-- cmTryCompilerExec.dir/
  |     +-- Makefile.cmake
  |     +-- Makefile2
  |     +-- cmake.check_cache
  |     +-- hello.dir/
  |     |     +-- DependInfo.cmake
  |     |     +-- build.make
  |     |     +-- cmake_clean.cmake
  |     |     +-- cmake_clean_target.cmake
  |     |     +-- depend.make
  |     |     +-- flags.make
  |     |     +-- progress.make
  |     +-- progress.make
  +-- Makefile
  +-- cmake_install.cmake
  • make実行
hello$ make
Scanning dependencies of target hello
[100%] Building CXX object CMakeFiles/hello.dir/hello.o
Linking CXX executable hello
[100%] Built target hello
hello$ 

実行ファイルhelloが生成されています。

  • makeのオプション
hello$ make help
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... edit_cache
... hello
... rebuild_cache
... hello.o
... hello.i
... hello.s
hello$ 
落とし穴

ファイル名を、CMakeLists.txtではなく、CMakeList.txtとしてしまって意味不明なエラーに悩まされました。最初に試したときから今日解決するまで数ヶ月の歳月が流れました(ちょっとやってみて駄目で原因も分からないので放置していただけですが)。

hello$ cmake .
CMake Error: The source directory "/home/torutk/hello" does not appear
 to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
hello$ 

CMakeLists.txtがないとエラーメッセージが表示されていればすみやかに気付いたのですが、CMakeLists.txtの中にソースディレクトリがないというメッセージだったので、ファイル名の違いに気付かず悩んでしまいました。

cmakeの情報源

CMakeの書き方については情報量が非常に少ないです。日本語で解説記事はほぼゼロ、英語でも、書籍を買え、という状況でかなり少ない状況です。

英語の書籍

Web上の記事(日本語)

Web上の記事(英語)

*1:職場ではMakefile書ける人が非常に少ない、また書ける人にとってもMakefileは面倒くさい

*2:他には、Javaで主流のAntをC++で使う方法、ACE+TAOで使用されているMPC、tarball形式で使われるautomakeなどがあります。