cmakeツール最初の一歩
UNIXでは、C/C++のソースコードをビルドするにはMakefileを書いてmakeツールを使うのが一般的です。しかし、Makefileを書くのは大変なので*1、もっと楽なツールを探すと出てくるものの一つがcmakeです*2。
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の書き方については情報量が非常に少ないです。日本語で解説記事はほぼゼロ、英語でも、書籍を買え、という状況でかなり少ない状況です。
英語の書籍
- What We Offer - Kitware, Inc.
- amazon.co.jpでは検索に出てこないので入手は少々面倒かも
Web上の記事(日本語)
Web上の記事(英語)