Autotoolsの簡単な使いかた (1)

Compiler言語で開発する際、makeのお世話になることが多いと思います。そういうときに自前でMakefileを書くのもいいのですが、処理系ごとの違いを吸収し、それを反映したMakefileを自動的に作成してくれるような便利なtoolがあります。それがAutotoolsです。

Softwareを自分でcompileしてinstallしたことがある方なら以下のようなcommandを使ったことがあるかもしれません。

$ ./configure
  :
$ make
  :
$ sudo make install
  :

このconfigureこそがAutotoolsで生成されたscriptです。configureを実行することによって、処理系ごとの違いを判別し、Makefileを自動的に生成します。


では、Autotoolsを使うにはどうすればいいのでしょうか。これから順を追って説明していきましょう。各toolのversionによっては細かいところに差異があるかもしれませんが、基本は大きくは変わらないと思います。

Directoryとsource fileの作成

Autotoolsの利用の前提として、directoryを1つ作成し、その配下にcompileがerrorなしに通るsource fileを作成します。前提はこれだけです。

$ mkdir hoge
$ cd hoge
$ emacs hoge.cpp

例として、hoge.cppはHello, World.を表示するprogramのC++ source codeとしましょう。

#include <cstdlib>
#include <iostream>

int
  main
  (
  )
  {
    std::cout << "Hello, World." << std::endl;

    return EXIT_SUCCESS;
  }

autoscan

次に以下のcommandを実行します。これはsource codeを読みとり、configureの元になるconfigure.scanを自動的に生成します。

$ autoscan
$ ls
autoscan.log  configure.scan  hoge.cpp

configure.scanautoscan.logが生成されました。autoscan.logはただのlog fileですから、今回は気にしなくてもかまいません。

configure.scanconfigure.inにrename

ここで、configure.scanconfigure.inにrenameします。Copyでもかまいませんが、configure.scanはこれ以降使用しませんので、不要なら後で削除してください。

$ mv configure.scan configure.in

configure.inはfull scratchで1から書いてもいいのですが、autoscanで自動的に生成するほうがmissがなくていいと思います。

configure.inの中身は大体以下のようになっていると思います。

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([x.xx])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([hoge.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

AC_PREREQの引数のx.xxにはautoconfのversionが入ります。

これらの文法やmacroの細かい説明は今回はしませんので、あしからず御了承ください。

configure.inの修正

無事configure.inが得られたところで、これからconfigure.inをeditor等で開いて修正していきます。

$ emacs configure.in
AC_INITの引数の修正

まず、これから作成するprogramのpackage名、version、bug report用のmail addressを記述します。それにはconfigure.in内のAC_INITの引数を修正します。

 -AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
 +AC_INIT([hoge], [1.0.0], [someone@somewhere])

FULL-PACKAGE-NAMEにpackage名、VERSIONにversion、BUG-REPORT-ADDRESSにbug report用のmail addressを記述します。

AC_CONFIG_SRCDIRの引数の修正

次にsource directoryの確認用にAC_CONFIG_SRCDIRの引数を修正します。現在はhoge.cppになっていると思います。これは別にこのままでもいいのですが、source fileが増えてきて、元のhoge.cppが削除されたり、renameされたりすることもあるため、もっと確実に存在するfileのほうがお勧めです。

 -AC_CONFIG_SRCDIR([hoge.cpp])
 +AC_CONFIG_SRCDIR([config.h.in])

ここではconfig.h.inに変更しました。

AM_INIT_AUTOMAKEの追加

次にautomakeのために1行追加します。configure.inは別のAutotoolsの1つ、automakeからも参照されていて、この1行がないとautomakeが文句を言ってきます。

AC_CONFIG_HEADERの次の行あたりに以下の行を追加して書きます。

 +AM_INIT_AUTOMAKE([$PACKAGE_NAME], [$PACKAGE_VERSION])
AC_CONFIG_FILESの追加

最後に生成するfileがMakefileであることをautoconfに知らせるため、1番最後の行のAC_OUTPUTの前の行あたりに以下の行を追加します。

 +AC_CONFIG_FILES([Makefile])


これでconfigure.inは以下のようになったと思います。

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([x.xx])
AC_INIT([hoge], [1.0.0], [someone@somewhere])
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADERS([config.h])

AM_INIT_AUTOMAKE([$PACKAGE_NAME], [$PACKAGE_VERSION])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])

AC_OUTPUT


次回に続きます。