資料室開発 / autotools

autotoolsのすすめ anchor.png

Makefileを手を抜いて作成したい。
そんな時に,Makefileを簡単に作成するためのツールがautotools*1

通常,Makefileにはコンパイルする際の諸設定,リンクする際の諸設定,処理順序などを逐一記述しておかなくてはならない。しかし,これは,Makefileの作成に慣れていないと面倒な作業です。

そこで,Makefileよりももっと簡単な設定ファイルMakefile.amだけを記述して,あとの細かなところの設定記述はツールを使って作り出せれば便利です。このような時に使用するのが,autoconf,automake,autoreconf,libtoolなどのautotools。

Page Top

makeとMakefile anchor.png

makeは,そのディレクトリ内にあるMakefileを参照して,書かれた通りにコンパイルやリンクを行っていくコマンドツールです。 簡単なMakefileの例だと,

sample.o : sample.c
         gcc sample.c -o sample.exe

単に1つのソースファイルをコンパイルするだけならmakeをする必要はないけど,複雑な依存関係をもっているライブラリを使用したり,複数のファイルを使ってコンパイルするときなんかは,いちいち毎回コマンドを打って手作業でこれをやると大変なので,makeを使うわけです。

この時はMakefileを一度作っておけば,その後はmakeと打てば複数ファイルをコンパイル出来たり,必要なライブラリをリンク出来ます。依存関係にあるファイルの実行ファイルが既に出来ている時は,そのファイルのタイムスタンプを見ながら,ソースファイルに更新があったとかを自動的に認識して,コンパイルはしないで無駄な処理をしない…とか,そういうことも自動で行ってくれます。

Page Top

configureってなに? anchor.png

他人にソースを配布するときは,手軽にコンパイルができるようにMakefileも一緒に配布したい。
しかし,相手の環境によってコンパイルの仕方が変わってしまうかもしれないので(ライブラリが見つからない〜とか,違うOS上で実行するとか),単にMakefileを一緒に配布しても上手くいかないことも多いわけです。
そこで登場するのが,configure*2コマンド。
configureは,実行すると,その実行した環境に合ったMakefileを生成してくれるシェルスクリプト。これをMakefileの代わりにソースコードと一緒に配布することで,

$ ./configure
$ make
$ make install

という手順でコンパイル,インストール,が可能になったりします。この時,たとえ相手の実行環境が違う場合であっても,configureがその違いを吸収してくれます。

configureを手作業で一から書くのはめんどうです。なので,configureを自動で生成してくれるツールautotoolsの出番となります。
これらのことにより,Makefileを手を抜いて作成することも,誰かにコンパイルも可能なソースコードを渡すことも出来るようになります。

Page Top

autotoolsを使えるようにする anchor.png

MinGWをインストールして使えるようになっていれば,これらのツールもインストールされています。
MinGWをインストールしていない場合は,さっさとインストールしちゃいましょう。

Page Top

とりあえず使ってみる anchor.png

Page Top

サンプルの用意 anchor.png

まずは試しに,こんなソースのファイルsample.cを用意してみる

#include <stdio.h>
 
int main(void)
{
	printf("Hello Yuji!\n");
	
	return 0;
}

Makefile.amを作成
移植性の高いMakefileを作るためのMakefile.acの雛形(Makefileの大元)になるMakefile.amを作成する。

noinst_PROGRAMS = sample
sample_SOURCES = sample.c

これは,sample.exeはsample.cから作られる場合です。

noinst_PROGRAMSは,noinstで「make installしてもインストールしない」の意味で,PROGRAMSは実行ファイルを意味していて,それをつなげたものです。この変数には,「make installしてもインストールしない」「実行ファイル」の名前を設定します。複数設定可能。
ちなみに,make installしたときにインストールする実行ファイルは,bin_PROGRAMSに設定します。

sample_SOURCESは,noinst_PROGRAMSに設定したsampleに関するビルド情報の意味で,SOURCESはソースファイルを設定する。複数設定可能。

しかし今回は,何も記述していない空のファイルでも大丈夫です。

$ touch Makefile.am

Editorでも右クリックで新規ファイル作成でもとにかくファイルを作ればOK

つまり,必要なファイルとしては,ソースコード以外にはMakefile.amだけ。

Page Top

autoscanでconfigure.acを生成する anchor.png

$ autoscan
$ 好きなEditorでconfigure.scanを編集する
$ mv configure.scan configure.ac

autoscanを使ってconfigure.scanを作成した後,ファイルを以下のように編集します。

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

AC_PREREQ([2.68])
AC_INIT([sample], [1.0.0], [y-ueno@nalux.co.jp])  <-- 編集
AC_CONFIG_SRCDIR([sample.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign])            <-- 追加

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

AC_INITマクロにプログラムの情報を入れることと,AM_INIT_AUTOMAKEマクロを追加します。
AM_INIT_AUTOMAKEは,automakeを使うことをautoconfに伝えるマクロのようです。
この時の引数はGNU準拠のprojectとして作るわけではないので,foreignにします。*3
AC_PROG_CCは,使用するCコンパイラの設定で,configureが環境変数CCを使用するという意味になる。
AC_CONFIG_FILES([Makefile])は,Makefile.inを雛形にしてMakefileを生成しろという意味になる。

これが終わったら,ファイル名をconfigure.acにリネームします。

Page Top

autoreconfでconfugureを作成する anchor.png

普通は,この後autoconf/automakeを使用してconfigureを作成するわけだけど,この手順を手軽に行うautoreconfを使うと便利。

$ autoreconf -i

これで,configureが作成される。 AM_INIT_AUTOMAKE([foreign 1.11.1])の効果で,必要なファイルが追加される。特にMakefile.inのおかげで,移植性が高いものになっている。

Page Top

autoconf/automakeでconfigureを作成する場合 anchor.png

autoreconfを使わないで,autoconf/automakeでconfigureを作成する場合。autoreconfで作成する場合はいらない。(autoreconfは,この処理を全部行ってくれる。)

$ aclocal

これで,aclocal.m4が作成される。
aclocal.m4は,configure.acやMakefile.amを解析して,autotoolsを実行するのに必要なマクロを集めたものだと思う。

$ autoconf

autoconfを使って,configure.acを解析してconfigureを作成する。

$ autoheader

autoheaderを使って,configure.acを解析してconfig.h.inを作成する。
config.h.inは,configureがconfig.hを作成する時に使用する。

$ automake --add-missing

automakeを使って,Makefile.amとconfigure.ac,config.h.inを解析してMakefile.inを作成する。--add-missingで,install-sh,depcomp,missingなどのファイルを作成する。
Makefile.inは,configureがMakefileを作成する時に使用する。

Page Top

configureを実行してMakefileを作成 anchor.png

$ ./configure

を実行すると,Makefileがめでたく作成される。

Page Top

コンパイルと実行 anchor.png

$ make
$ sample
Hello Yuji!

makeコマンドでコンパイルされ,sample.exeが出来ます。実行してみると無事動きました。

Page Top

make distしてみる anchor.png

$ make dist

を実行すると,sample-1.0.0.tar.gzが作成される。
他の人にソースコード類を渡すのにはこのファイルを渡せばOKです。便利ですね。
この時作られるファイル名は,configure.acに記述した

AC_INIT([sample], [1.0.0], [y-ueno@nalux.co.jp])

から作られます。

$ make distcheck

でパッケージを作成して,正しくプログラムが作成できるかどうかを実際に試してチェックすることが出来ます。
中身が空のMakefile.amでもMakefileが出来るとは,さすがGNUツールです。

Page Top

Autotools(autoconfとautomake)による作業の流れ anchor.png

autotools.png

*1 UNIX系OSにおいて,ソフトウェアパッケージ開発を行うためのツール及びフレームワークの一種
*2 configureは,Bourne Shell用のシェルスクリプト
*3 GNU準拠にした場合,INSTALL,NEWS,README,AUTHORS,ChangeLog,COPYING,といったファイルを用意する必要があります。

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 632, today: 2, yesterday: 0
Last-modified: 2020-12-26 (Sat) 16:07:35 (JST) (1069d) by yuji