blog2011-11-27CMakeを使ってみた(1)経緯と簡単なアプリケーションcmakeはじめにCMakeを調べた経緯CやC++でプログラムを書くときは普通何らかのビルドツールを使う。Unix/LinuxならMakeが多いだろう。Makefileにビルド手順を書くわけだ。Studio(以下VS)を使うときはVS上でビルドの設定を行い、その結果はプロジェクトファイル(.vcproj)に保存される。そのため、Unix/LinuxとWindows両方に対応しようとすると、例えばソースファイルを追加するたびにMakefileとVSのプロジェクトファイルの両方を修正することになる。CDTでも開発できるようにしようと考えたり、あるいは古いVS用のプロジェクトファイルが必要になったりすると、サポートするビルド環境がどんどん増えていく。管理も面倒になり普段使わないものが段々放置され、ついにはビルドできなくなる。そのことを知らないユーザが、もう使われなくなったプロジェクトファイルを使ってビルドしようとして「ビルドできないんですが」という質問メールを送るようになる。いう流れがいい加減いやになったので、何とか自動化したいと考えた。ビルド環境は違っていても必要な設定はだいたい同じようなもので、ソースファイルのリストインクルードパスライブラリパスリンクするライブラリマクロの値といったあたりだ。これらの情報から各種ビルドツール用の設定ファイルは自動生成できる。いうことを考える人は昔からいて、各種ツールが存在している。有名なのはGNUのAutotools(AutomakeやAutoconfなど)だろう。Makfile.amに実行ファイル名やソース・ヘッダーファイル名を書くと、Makefileを自動生成してくれる。Linuxなど)で使えるプログラムを作るときは第一候補に挙がるだろう。VS環境については考慮されていないため、今回の目的からすると除外される。Autotools以外のビルドツールを調べたところWikipediaのページにたくさん載っていた。その中で、「何となく聞いたことのある」「ある程度以上実績のあるもの」ということでCMakeを試してみることにした。CMakeという本も出版されており、多分これが一番詳しい文書と思われる。$59というなかなかの値段。使うと決めたわけでもないのものにはちょっと出せない。いうことで、この記事はCMakeの一番詳しい本を全く読まずに書いている。そんなわけでここには間違っている内容もあれば、「もっと簡単にできる」ということもあるだろう。その辺は勘弁して欲しい。実行環境CMakeはクロスプラットフォームのアプリケーションであり、今回CMakeを調べたきっかけもWindowsとLinuxの両方で動かしたいからである。Linuxで試してみることにする。11.10、CMakeのバージョンは2.8.5だ。簡単なアプリケーションソースファイルと最初のCMakeLists.txtまずは簡単なアプリケーションということで、適当なディレクトリ(myapp01)を用意し、こんなソースファイル(main.cpp)を置く。0;}CMakeの設定ファイルは基本的にCMakeLists.txtという名前にする(CMakeList.txtではなくCMakeLists.txtだ)。main.cpp)最初の行は、このCMakeLists.txtを使うのに必要なCMakeのバージョンだ。ここで指定したバージョンより低いと動作しないようになる。Autoconfでも似たような設定(AC_PREREQ)があるが、こういう設定をしなければならないのは正直困る。いうのも、今回作ったファイルがCMakeのどのバージョン以降サポートされたものか、なんてことはいちいち気にしていないからだ。今回も特に理由はなく、何となく2.8にしてみただけだ。いう文句はさておき、次の行のadd_executableは実行ファイルの作成を指示するものである。引数として実行ファイル名とソースファイル名を指定する。CMakeによるビルド上記CMakeLists.txtをmyapp01に置き、myapp01ディレクトリ上でcmakeを実行する。すると、各種ディレクトリ・ファイルが生成される。main.cppMakefileが生成されるので、そのままmakeでビルドできる。今はソースファイルが1つなのでいきなり100%になるが、複数ある場合は進行状況が分かるようになっている。大きなプロジェクトの場合、どのくらい時間がかかりそうか分かるのでなかなか便利だ。何が起きているかしかし、コンパイルの詳細(実際に実行されているコマンド)が隠蔽されているため何が起きているのか分からない。普通Makefileに書かれたコマンドは端末にエコーされるが、このMakefileではコンパイルやリンクのコマンドがエコーされない。これはMakeの.SILENTを有効にしているためだ。MakeではMakefile中に.SILENTと書かれた行があるとコマンドエコーが抑制される。commands.$(VERBOSE).SILENT:という箇所がある。変数VERBOSEはデフォルトでは設定されていないため、.SILENTが有効になるというわけだ。従ってVERBOSE変数に何らかの値を入れると.SILENTではなくなりコマンドがエコーされるようになる。VERBOSE=1などとすればよい。1でなくhogeでもなんでもよい。結果は長くなるので、コンパイルとリンクの部分だけ貼る。コンパイラはc++コマンドであり、特にオプションはない。リンク時は-rdynamicがつくのが分かる。find_packageとpkg_check_modulesによるラ...久しぶりにCMakeの話。外部の依存ライブラリがあるC/C++のコー...2013-06-01Makeでビルドオプションによって出力ディレクトリを変える前回はMakefileをヘッダファイルの依存関係に対応させてみた。設定ファイルを作る今度は設定ファイルを作ってみる。(1)はてなブログをはじめよう!wagavulinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。