Autotools

Autotoolsとは、主にUnix系オペレーティングシステム (OS) においてソフトウェアパッケージ開発を行うための、ツール及びフレームワークの一種である。このツールを使用することにより、多種多様なUNIX互換環境にパッケージを対応させることが容易になる。 Autotoolsは主に autoconf/automake/libtools の3つから成り立っている。 Autotoolsを用いて作成されたパッケージは容易に導入が可能である。典型的な場合、インストールまでの全工程が自動化されており、ソースコードを展開した後、以下のコマンドを入力するだけで全てが完了する。 $ ./configure && make && make install 多くのUNIX用オープンソースソフトウェアで、この方式が採用されている。 configurationスクリプト（configure）はビルド環境の構築を一括でおこなうシェルスクリプトである。 プログラムのビルドは複数のツールを連携させておこなわれるが、その際、ビルド設定（例: 拡張命令フラグ）を外部から取り込み全てのツール間にそれを一貫して適用しなければならない。これを手動でおこなうことは時間の浪費でありバグの温床である。このビルド環境構築を一括して自動でおこなうスクリプトが、慣例的にconfigureと名付けられるconfigurationスクリプトである。パッケージの利用者はconfigureを実行するだけでビルド環境が構築できる。 configure及び付属のスクリプト・Makefileなどは標準的なUNIXコマンドだけを使用しており、パッケージの利用者は、パッケージそのものの構築・運用に必要なソフトウェアを除いて、Autotoolsの為に特別なソフトウェアを導入する必要はない（Windows系OSではUNIXコマンドが標準で含まれていない為、別途Services for UNIXやCygwinなどのUNIX互換環境のインストールが必要である）。 また、自動的な環境検査が好ましくなかったり特別な設定が必要な場合、環境変数またはコマンド引数でconfigureの動作を調整できる。代表的なオプションを以下に説明する。 --prefix=dir インストール先を変更する。--prefix=/opt/hugaとすると、実行ファイルは/opt/huga/bin、ライブラリは/opt/huga/libというように変更される。bin、libなどを個別に変更することも出来る。デフォルトは/usr/localである。OSベンダーなどが提供するバイナリパッケージでは、--prefix=/usrや--prefix=/opt/hugaなどの設定で構築されている場合が多い。root権限のないユーザや試しに利用したい場合は、--prefix=$HOME/hugaなどとすれば、他のユーザに影響を与えることを防止できる。 --with-hoge 別のパッケージhogeを利用することを指定する。--with-hoge=dirでhogeのインストール先を指定できる場合もある。--with-hoge=no又は--without-hogeとすると逆に使用しないことを指定する。 環境変数 CC 環境変数CCを設定すると、その値がCコンパイラのコマンド名として使用される。設定しない場合はccまたは適切なOS標準のコンパイラに設定されるが、明示的に設定することで標準と異なるコンパイラを使用できる。 これ以外にも多くのオプションがあり、少ないパッケージでも10以上、多いパッケージでは数十から100以上の設定項目がある。利用者の設定に矛盾があったり、環境の機能に不足があれば診断情報を出力する。また、クロスコンパイル対応や、構築用の作業ディレクトリをソースコードと異なるディレクトリに設定する機能がある。 Autoconf (autoconf) はconfigurationスクリプトを自動生成するツールである。 ビルド環境の自動構築をおこなうconfigurationスクリプト (configure) はそれ自体が時に数千行に渡る巨大なスクリプトになる。これを手動で記述し維持することは時間の浪費でありバグの温床である。このconfigure生成を自動でおこなうツールがAutoconfである。 Autoconfはconfigure.acを入力とし、configureを出力とする。ユーザーがこのconfigureを実行することでビルド環境が構築される。 autoconfはDavid Mackenzieがフリーソフトウェア財団での仕事で使うために、1991年の夏から開発を開始した。その後、様々な人に改良を加えられ、オープンソースのコミュニティでは最もよく使われるツールの1つとなった。 autoconfはPerlで使われるMetaconfigに似ている。かつて（X11R6.9 まで）X Window Systemで使われていたimake（英語版）にも密接に関連するが、設計思想が異なる。 autoconfは移植性の評価をバージョンではなく機能ベースで行う。例えばSunOS 4のCコンパイラはISO Cをサポートしていない。しかし、ユーザはISO C互換のコンパイラをインストールすることもできる。バージョンのみからでは、ISO Cコンパイラの存在は検出できないが、機能ベースの手法ではユーザがインストールしたISO Cコンパイラを発見できる。他にも、次のような利点がある。 パッケージ開発後に生まれた新たな（未知の）システム上でも、うまく機能する。 カスタマイズされた環境でもうまく対応できる。 バージョンやパッチなどを詳細に把握しておく必要がない。 m4言語のマクロとシェルスクリプトの断片で記述された入力ファイルconfigure.ac（古いバージョンではconfigure.in）を、autoconfがm4を用いて置換しconfigureを得る。 最終出力configureはBourne Shell用のシェルスクリプトで、数百行から数千行の長さがある。 以下に、簡単なconfigure.acの例を示す。 AC_INIT(hello, 1.9, address) # 必須設定 AC_CONFIG_SRCDIR([hello.c]) # このパッケージではhogeを使用可能である configureに--with-hogeが追加される。 #（実際には、この後に利用者が--with-hoge=yesとした場合の動作定義を記述する必要がある） AC_ARG_WITH(hoge, [Use hoge]) AC_PROG_CC # Cコンパイラの設定 configureが環境変数CCを使用する AC_OUTPUT([Makefile]) # Makefile.inを雛形にしてMakefileを生成 出力のconfigureは非常に長いので掲載しない。この場合、一般的なオプションはサポートされる。利用者の要求に応じてhogeを利用するがどうかを決定する。また、Cコンパイラを探し実行方法を確認し、その結果得られたコマンド名・必要オプションなどをMakefileに出力する。 GNU Automake（automake）はMakefile.inファイルを自動生成するツールである。 automakeはプログラムとソースコードの関係などが記述されたMakefile.amファイルを入力とし、Makefile.inを出力する。 HelloWorldプログラムで例を示す #Makefile.am #実行バイナリファイルの名前はhello bin_PROGRAMS = hello #helloのソースコードはhello.c,hello.h hello_SOURCES = hello.c hello.h 出力のMakefile.inは非常に長いので掲載しないが、期待した内容が得られる。 すなわち、configureを実行することでMakefileが生成される。このMakefileを用いてmakeコマンドを使用すると、hello.cをCコンパイラでコンパイルし、次いで標準ライブラリとリンクし、helloの実行ファイルが得られる。make installでは、helloはあるべき場所（ほとんどの場合は/usr/local/bin）にインストールされることになる。