c、c++ でちょっとしたコマンドラインツール作ろうと思ったが、全くやったことがなかったのでビルドツールの調査からするはめとなった。
cやc++をビルドするには
cやc++のプログラムは、必要なファイル(ソース、ヘッダ、リンクするライブラリ)をコンパイル時にすべて指定してあげる必要がある。
これを、gcc等にコマンドライン引数として全て手打ちするのは大変だし、さらに、時にはgccを何度か実行して、できたものをリンクする必要があるので、必要な操作をファイルに書いておいて自動化したいのが人情。
makeは、皆のその気持ちに応えるためのツールで、必要な操作や依存ファイル、成果物のパスなどをまとめてMakefileというファイルに記述する仕組みになっている。
Makefileさえあれば、make
って打ち込むとビルドすることができる。
Makefileさえあれば……。
ただし、Makefileに記述してある依存ライブラリのパスなどは、環境によって異なるため、環境によって正しいMakefileが変わってしまう。
そこで、環境ごとに正しいMakefileを生成してあげるスクリプトが、./configure
。
これはただのシェルスクリプトなのだが、環境ごとに必要なファイルのチェックをする等の機能の充実した シェルスクリプトを手で作成するのはめっちゃむずいので、自動で生成する。
ビルドツール色々
autoconf
autoconfは、GNUのプロジェクト。 configureスクリプトを自動で生成するツール。
configure.ac
という設定ファイルを作成し、autoconf
を実行することで、 configure
が生成される。
という理解だったが、実際にはいくつか準備が必要だった。
-
Makefile
を生成するためには、テンプレートのMakefile.in
が必要。 -
Makefile.in
は、必要な値が変数になったMakefileのような感じで、手で書きたくないっす。となる。 -
Makefile.am
は、Makefile.in
を自動生成するための、ものすごく単純な誰でも手で書けるファイル。実際に編集するのはこれ。作成したら、automake
と実行すると、Makefile.in
が生成される。これとconfigure
スクリプトを配布してあげると、皆が./configure && make
ってできる。 - その他、
- 設定をまとめた config.h を生成するための config.h.in等々、Makefile意外の成果物を作る仕組みある。
今回は僕はこれを使いました。
日本語情報を色々参考にさせていただきました。
http://d.hatena.ne.jp/fut_nis/20090624/1245849007
cmake
おそらくautoconfより後発のツールだと思われる。
Makefileのことはまったく考えなくても、CamkeLists.txt という独自形式のファイルに、必要なソース等いくつかの設定をしておいて、cmake
って実行するだけでビルドが実行できる。
また、windowsなどにも対応しておるようだ。
cmakeには、依存ライブラリを管理する パッケージ という仕組みがあるが、自分で無名のツールのパッケージを作成したり、利用するやり方が正直よくわからなかったので、今回は使いませんでした。
scons
http://www.scons.org/
cmakeと競合するツールのようだがあまり調べてない。
waf
ビルド設定をpythonスクリプトとして記述できるビルドツール。
Linux/Unix、windowsに加えMacOSのxcodeプロジェクトも生成できるようだ。
Linuxならpythonは絶対入ってるだろ! という前提があるのでけっこう良いのかもしれない。
gyp
https://code.google.com/p/gyp/
Google製で、node.jsプロジェクトがwafからこれに乗り換えたというのを読んで知った。
設定ファイルがJSON(厳密にはJSON拡張)なので自分にはわかりやすかった。
node.jsのネイティブアドオンを書くなら必ずこれを使うことになる。
僕は今回は、クロスプラットフォームな機能はあまり必要なかったし、オーバースペックに思えたので使わなかった。