C

cやc++をビルドしたいので ./configureスクリプトの作り方調べた

More than 3 years have passed since last update.

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

http://www.cmake.org/

おそらく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のネイティブアドオンを書くなら必ずこれを使うことになる。

僕は今回は、クロスプラットフォームな機能はあまり必要なかったし、オーバースペックに思えたので使わなかった。