2014年7月27日日曜日

autoconf と automake

autoconf と automake の説明


Linuxでソースコードをダウンロードしてビルドして使用するときには、大抵は同じ手順で行うことが出来ます。tarアーカイブ形式で配布されていて、例えばpkg.tar.gzというtarアーカイブの場合は以下のようになります。

$ tar zxvf pkg.tar.gz
$ cd pkg
$ ./configure
$ make
$ sudo make install

1行目は圧縮ファイルを解凍。
2行目は 解凍したディレクトリへ移動。
3行目は環境の調査とMakefile(ビルドのためのファイル)の作成。
4行目はソースコードのビルド
5行目はインストール

と、非常に簡単にビルドしてインストールができるようになっています。

特徴的なのが3行目でしょう。世の中にはLinux以外にも色々なOSがあります。また同じLinuxであってもPCによってインストールされたソフトウェアが違うなど環境が異なります。configureでそのOSや環境の違いを考慮することができるようになっています。

このconfigureというファイルはスクリプトファイルです。このスクリプトを作成するためのツールがautoconfです。また環境に合わせてビルドを行うためのMakefileをconfigureが書き換えますが、そのMakefileの作成を容易に作成するためのツールがautomakeです。 今回は説明しませんが、ライブラリを作成するためのLibtoolもあります。autoconfとautomakeとLibtoolを合わせてautotoolsと言います。

autoconf と automake の例


これらのautoconfとautomakeを使ったtarアーカイブの作り方の例です。例はAutomake Testという名前のアプリケーションで実行ファイル名はamtest、ファイルはmain.cとfunc.cから作成されています。エディタにはviを使うとします。コマンドの流れは以下のようになります。

$ mkdir amtest; cd amtest
$ vi main.c
$ vi func.c
$ autoscan
$ mv configure.scan configure.ac
$ vi configure.ac
$ vi Makefile.am
$ aclocal
$ autoheader
$ touch NEWS README AUTHORS ChangeLog
$ automake -a -c
$ autoconf
$ ./configure; make
$ make dist


これで、amtest-1.0.tar.gzの作成が出来ます。



1つ目はamtestのディレクトリを作成し、そのディレクトリに移動します。
2つ目はmain.cを作成します。例なので、以下のような簡単なものです。

#include "config.h"

void func();

int main()
{
        func();
        return 0;
}

3つ目はfunc.cを作成します。同じく例で、以下のようなものです。PACKAGE_STRINGは自動的に作成されるconfig.h内に記述されます。

#include "config.h"
#include <stdio.h>

void func()
{
        puts(PACKAGE_STRING);
}

4つ目は、autoscanで自動的にソースコードを検証し、configureの元となるconfigure.scanを作成します。

5つ目ではconfigure.scanをconfigure.acに名前を変更します。autoscanはもしソースコードに大きな修正があった場合には実行し、configure.scanへの差異をconfigure.acに反映することになります。

6つ目ではconfigure.acの中身を書き換えます。変更点は青色の部分です。configure.acの5行目はソフト名、バージョン名、連絡先、パッケージ名の設定で、6行目はautomakeの使用を設定、12行目はインストールスクリプトのチェックの設定、22行目はMakefileを作成することを指定します。

本来なら、ここで他にもヘッダーファイルの存在確認などチェックしたい内容を書き足す必要があります。

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

AC_PREREQ([2.68])
AC_INIT([Automake Test], 1.0, foo@example.com, amtest)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([func.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

7つ目ではMakefile.inの元となるMakefile.amを作成します。bin_PROGRAMSで実行ファイル名をamtest_SOURCESで全てのソース(ヘッダーを含む)を指定します。

bin_PROGRAMS = amtest
amtest_SOURCES = main.c func.c


8つ目のaclocalでは、autoconfでautomakeを使用するためのマクロであるaclocal.m4を自動作成しています。

9つ目のautohedaderではconfig.hの元となるconfig.h.inを自動作成しています。

10つ目では、automakeで必要となるファイル(NEWS, README, AUTHORS, ChangeLog)をとりあえず空(ゼロバイト)のファイルとして、作成しています。

11個目のautomakeで、Makefile.inが作成されます。-a -c はinstall-sh, missing, depcomp 等のサポートスクリプトを自動作成するためのオプションです。

12個目のautoconfで、configureスクリプトを作成し、これでビルドの準備は完了です。

13個目は正しくプログラムが出来たことを確認するビルド作業です。configureスクリプトを実行すると、Makefile.inとconfig.h.inから、Makefileとconfig.hを作成します。そしてmakeを実行すると実行ファイルのamtestが作成されます。

14個目のmake distで、amtest-1.0.tar.gzが作成されます。ビルドで作成されたMakefile等は含まれず、必要なファイルのみ含まれるようになっています。

tarアーカイブの作成例の説明は以上です。 もちろんFedora 20でもWindows上のMinGWでも同様です。

0 件のコメント:

コメントを投稿