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.scanとautoscan.logが生成されました。autoscan.logはただのlog fileですから、今回は気にしなくてもかまいません。
configure.scanをconfigure.inにrename
ここで、configure.scanをconfigure.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
次回に続きます。