Autotools

**GNU Autotools**、または**GNU Build System**とは、主にUnix系オペレーティングシステム (OS) においてソフトウェアパッケージ開発を行うための、ツール及びフレームワークの一種である。このツールを使用することにより、多種多様なUNIX互換環境にパッケージを対応させることが容易になる。
Autotoolsは主に Autoconf/Automake/Libtool の3つから成り立っている。他の関連するツールには GNU make、GNU gettext、pkg-config、GNUコンパイラコレクションなどがある。

AutotoolsはGNUツールチェーンの一部であり、多くの自由ソフトウェアやオープンソースパッケージで広く使用されている。そのコンポーネントツールは自由ソフトウェアであり、GNU General Public License の下でライセンスされているが、特別なライセンス例外によりプロプライエタリソフトウェアでの使用が許可されている。

## 動機
ソフトウェアプログラムを移植可能にするのは難しい場合がある。コンパイラはシステムによって異なり、一部のシステムでは特定のライブラリ関数が欠落していることがある。コンパイラファイル（Cヘッダなど）の名前が異なる場合もある。共有ライブラリは、さまざまな方法でコンパイルおよびインストールされることがある。プラットフォームの違いを処理する1つの方法は、条件付きでコンパイルされたコード（つまり`#ifdef`経由）を記述することだが、ビルド環境が多種多様であるため、この方法はすぐに管理不能になる。Autotoolsは、この問題をより管理しやすい方法で解決するように設計されている。

## パッケージ利用者側から視たAutotools

Autotoolsを用いて作成されたパッケージは容易に導入が可能である。典型的な場合、インストールまでの全工程が自動化されており、ソースコードを展開した後、以下のコマンドを入力するだけで全てが完了する。

多くのUNIX用オープンソースソフトウェアで、この方式が採用されている。

## configure
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** (`autoconf`) はconfigurationスクリプトを自動生成するツールである。

ビルド環境の自動構築をおこなうconfigurationスクリプト (`configure`) はそれ自体が時に数千行に渡る巨大なスクリプトになる。これを手動で記述し維持することは時間の浪費でありバグの温床である。この`configure`生成を自動でおこなうツールがAutoconfである。

Autoconfは`configure.ac`を入力とし、`configure`を出力とする。ユーザーがこの`configure`を実行することでビルド環境が構築される。

### 機能
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に出力する。

## automake

**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）にインストールされることになる。

## 脚注

## 関連項目

* ビルド (ソフトウェア)
* Gnits Standards
* GNU Coding Standards
* CMake
* Meson
* Apache Ant
* Apache Maven
* 
* SCons

## 参考文献
『GNU Autoconf/Automake/Libtool』 Gary V. Vaughan, Ben Elliston, Tom Tromey, Ian Lance Taylor著 でびあんぐる監訳 

## 外部リンク
* GNU Autoconf, Automake and Libtool 
* GNU Autoconf home page 
* GNU Autoconf macro archive 
* ''Learning the GNU development tools'' @sourceforge 
* Autotoolset home page 
* チュートリアル:
** "Autotools Tutorial" by Alexandre Duret-Lutz