ククログ

Autotools事始め

はじめに

クリアコードが関わるプロジェクトの多くでは、ビルドシステムとしてAutotoolsを使用しています。そのため、新しくプロジェクトに参加した開発者にもAutotoolsに関わる修正を担当してもらうことがあります。しかし、個々の開発者のバックグラウンドは様々であり、必ずしもすべての開発者がAutotoolsに関する知識を持っているわけではありません。その上、プログラミング言語などの基礎的な知識とは異なり、学校の授業や企業の研修などでAutotoolsについて学ぶことができる機会は稀であり、まとまった解説書も少ないなどといった事情があるため、その使い方を伝授するのには毎度手間を要しているというのが実状です。

そこで、これから数回に分けてAutotoolsの使い方を解説していくことを予定しています。

Autotoolsとは

Autotoolsとは、autoconfautomakelibtoolといったツールの総称です。

トップディレクトリに「configure」というスクリプトがあるソフトウェアをビルドしたことがある方はよくご存知でしょうが、このようなソフトウェアは一般的に

./configure
make
make install

という手順でビルドします。configureスクリプトは環境にあったMakefileファイルを自動的に生成するため、ユーザーは環境の違いを意識することなく、一定の手順でソフトウェアをビルドすることができます。ソフトウェアをソースコードで配布する場合、多種多様な環境でビルドできることが求められるため、このような仕組みが必要になります。

このconfigureスクリプトや、Makefileの雛形を生成するためのツールがAutotoolsです1。AutotoolsはGNUプロジェクトによって開発されていますが、GNU以外のプロジェクトにも広く浸透しており、非常に多くのソフトウェアで利用されています。

Autotoolsを使うべき理由

Autotoolsを使うべき理由として、以下のようなことが挙げられます。

Makefileの生成が容易

Autotoolsを使用すると、シンプルな記述で高機能なMakefileを生成することができます。

Autotools対応ソフトウェアのソースパッケージの中には、ソースコード以外のファイルが大量に格納されていて、一見すごく複雑そうにも見えます。しかし、実際にプログラマが記述すべきファイルは、基本的にはconfigure.acとMakefile.amの2種類だけです。その内容も、同機能のMakefileを自力で用意するのと比べると非常にシンプルです。もっとも簡単なMakefile.amの例としては、以下のたったの2行2の記述だけで済みます。

bin_PROGRAMS = hello
hello_SOURCES = hello.c

これだけで、後述する様々なmakeルールが生成されます。 依存ライブラリや対応プラットフォーム、ソフトウェアのオプション機能などが増えてくるとそれなりに面倒な記述は必要になりますが、Autotoolsを利用せずに自力でMakefileを用意する苦労に比べれば、やはりずっとシンプルに記述できます。

移植性

様々な環境に自分のソフトウェアを移植する必要がある場合、プログラマはそれぞれの環境の差異に頭を悩ませることが多々あります。

  • システムAでは存在する機能が、システムBでは存在しない
  • システムAではheader_A.hという名前のヘッダーファイルが、システムBではheader_B.hという名前で提供されている
  • システムAでは定義されている型が、システムBでは定義されていない
  • システムAではcommand-Aという名前のコマンドが、システムBではcommand-Bという名前で提供されている
  • ...

Autotoolsで生成されるconfigureは、こういったシステム間の差異を検出するためのスクリプトです。Autotoolsを使用することで、ソフトウェアを様々な環境に対応させるのが楽になります。

ただし、Autotoolsは移植性の高いプログラムを書くための補助をしてくれるだけに過ぎず、Autotoolsを使用するだけで移植性の高いプログラムができ上がるわけではありません。実際にプログラムの移植性を向上させるためには、プログラマがAutotoolsのコンセプトをよく理解し、そのことを常に意識しておく必要があります。

普及している

同等のツールの中では、Autotoolsは最も普及しているツールと言えるでしょう。普及しているため、Autotools対応ソフトウェアのビルド方法やその挙動は広く知られており、利用者は安心してビルドすることができます。また、それゆえにrpmやdebなどのバイナリパッケージを作成するのにも定番的な方法が用意されており、比較的容易にパッケージを作成することができます。

便利なmakeルール

「高機能なMakefileが生成される」と述べたように、Autotoolsで生成されるMakefileには、単にソフトウェアをビルドする以外にも、色々と便利なmakeルールが自動で追加されます。以下にその一例を示します3

「install」および「uninstall」

Autotoolsはインストールのためのmakeターゲット「install」を自動で生成するため、ビルドされた実行ファイルやライブラリなどはmake installで適切なディレクトリにインストールすることができます。また、installと比べるとあまり知られていませんが、アンインストールのためのmakeターゲット「uninstall」も自動で生成されるため、一度インストールしたファイルを簡単に削除することもできます。

「clean」および「distclean」

「clean」はmakeで生成されたファイルを削除するためのmakeターゲットです。「distclean」は「clean」に加えて、configureで生成されたファイルを削除するためのmakeターゲットです。Autotoolsは、明示的に削除するファイルを指定せずとも、自動的にこれらのmakeルールを生成します。もちろん、削除すべきファイルを手動で追加することもできます。

「dist」

Autotoolsを使用するプロジェクトの多くは、tar.gzなどの形式でソースパッケージを配布しています。このソースパッケージは、make distで簡単に作成することができます。

単純にソースディレクトリをtarコマンドで固めればよいでは?と思う方もおられるかもしれません。しかし、開発者の手元のソースディレクトリ下には、ビルド時に生成されたファイルや、エディタが自動的にバックアップしたファイルなど、ソースパッケージには含めたくないファイルが多数存在しています。make distでソースパッケージを作成すると、これらの不要なファイルは除外され、ソースパッケージとして必要なファイルだけがパッケージ化されます。

make distが生成するデフォルトのパッケージ形式はtar.gzですが、その他の形式に変更することもできます。また、それぞれの形式のパッケージを作成するためのmakeターゲットも用意されています。

  • make dist-bzip2
  • make dist-xz
  • make dist-zip
  • ...

まとめ

Autotoolsを使用すると、高機能かつ移植性の高いMakefileを容易に生成することができます。この便利なツールの使い方を覚えて、賢くソースパッケージを管理していきましょう。

  1. 稀にAutotoolsを使用せずに独自に類似のスクリプトを用意しているソフトウェアも存在しますが、ここでは除外します。

  2. この例の場合はhello_SOURCESもAutotoolsで自動で補完できるため、実は1行で済みます。

  3. 詳細はGNU Coding StandardStandard Targetsなどを参照してください。