Makefileを手を抜いて作成したい。
そんな時に,Makefileを簡単に作成するためのツールがautotools*1。
通常,Makefileにはコンパイルする際の諸設定,リンクする際の諸設定,処理順序などを逐一記述しておかなくてはならない。しかし,これは,Makefileの作成に慣れていないと面倒な作業です。
そこで,Makefileよりももっと簡単な設定ファイルMakefile.amだけを記述して,あとの細かなところの設定記述はツールを使って作り出せれば便利です。このような時に使用するのが,autoconf,automake,autoreconf,libtoolなどのautotools。
makeは,そのディレクトリ内にあるMakefileを参照して,書かれた通りにコンパイルやリンクを行っていくコマンドツールです。 簡単なMakefileの例だと,
sample.o : sample.c gcc sample.c -o sample.exe
単に1つのソースファイルをコンパイルするだけならmakeをする必要はないけど,複雑な依存関係をもっているライブラリを使用したり,複数のファイルを使ってコンパイルするときなんかは,いちいち毎回コマンドを打って手作業でこれをやると大変なので,makeを使うわけです。
この時はMakefileを一度作っておけば,その後はmakeと打てば複数ファイルをコンパイル出来たり,必要なライブラリをリンク出来ます。依存関係にあるファイルの実行ファイルが既に出来ている時は,そのファイルのタイムスタンプを見ながら,ソースファイルに更新があったとかを自動的に認識して,コンパイルはしないで無駄な処理をしない…とか,そういうことも自動で行ってくれます。
他人にソースを配布するときは,手軽にコンパイルができるようにMakefileも一緒に配布したい。
しかし,相手の環境によってコンパイルの仕方が変わってしまうかもしれないので(ライブラリが見つからない〜とか,違うOS上で実行するとか),単にMakefileを一緒に配布しても上手くいかないことも多いわけです。
そこで登場するのが,configure*2コマンド。
configureは,実行すると,その実行した環境に合ったMakefileを生成してくれるシェルスクリプト。これをMakefileの代わりにソースコードと一緒に配布することで,
$ ./configure $ make $ make install
という手順でコンパイル,インストール,が可能になったりします。この時,たとえ相手の実行環境が違う場合であっても,configureがその違いを吸収してくれます。
configureを手作業で一から書くのはめんどうです。なので,configureを自動で生成してくれるツールautotoolsの出番となります。
これらのことにより,Makefileを手を抜いて作成することも,誰かにコンパイルも可能なソースコードを渡すことも出来るようになります。
MinGWをインストールして使えるようになっていれば,これらのツールもインストールされています。
MinGWをインストールしていない場合は,さっさとインストールしちゃいましょう。
まずは試しに,こんなソースのファイル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だけ。
$ 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にリネームします。
普通は,この後autoconf/automakeを使用してconfigureを作成するわけだけど,この手順を手軽に行うautoreconfを使うと便利。
$ autoreconf -i
これで,configureが作成される。 AM_INIT_AUTOMAKE([foreign 1.11.1])の効果で,必要なファイルが追加される。特にMakefile.inのおかげで,移植性が高いものになっている。
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を作成する時に使用する。
$ 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ツールです。
新しくコメントをつける