M4SH

一応M4SHについても書いておこう。M4SHとはmashと発音するらしい。configureスクリプトの移植性を高めるための、AS_が前置されるマクロ(以下AS_マクロ)である。基本的には、autoconf用のマクロで使用されるため、表に出てくることは少ない。infoに書かれているものは少ないが、AS_CASEやAS_IFといった、Shell Scriptで使用されるcase文やif文の移植性を高めるため、autoconf内部ではAS_マクロで記述されている。

例えば、autoscanで生成されるconfigure.scanには、AC_INITというマクロがあるが、このマクロは、/usr/share/autoconf/autoconf/general.m4で定義されていて、一番最初にAS_INITというマクロが呼び出される。マニュアルによると、
#! /bin/sh
を生成するマクロである。そして、環境に依存しないように、Shellの様々な特徴を調べ、M4SHの初期化を行う。空のディレクトリを作成し、

$ echo AS_INIT > configure.ac
$ autoconf
すると、
$ wc -l configure
423 configure

このAS_INITというマクロだけで、大量のコードが生成される。configure.acはShell Scriptであると以前書いたが、if文やcase文もAS_マクロで書くのも格好いいかもしれない(お勧めするつもりはない)。

general.m4という名前のとおり、autoconfはm4というマクロプロセッサを利用して書かれている。Shell ScriptのTipsとして使えそうなものが大量にあるので、これらの.m4ファイルを覗いてみると勉強になる。

ヒアドキュメントでconfig.logに書くために、ファイルディスクリプタの5を使って

[m4_define([AS_MESSAGE_LOG_FD], 5)dnl
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
(snip)
_ACEOF
exec AS_MESSAGE_LOG_FD>>config.log
AS_UNAME >&AS_MESSAGE_LOG_FD

cat >&AS_MESSAGE_LOG_FD <<_ACEOF
(snip)
_ACEOF
])])# _AC_INIT_CONFIG_LOG

こんなコードが書かれている。ファイルディスクリプタの0は標準入力、1は標準出力、2は標準エラー出力として使われるが、それ以外の番号を使って上手にログファイルが生成できるようになっている。

configureの--helpオプションで表示されるヘルプメッセージも、このファイルで見れるようになっている。今後は、autoconfが提供するマクロの中身まで進まずに、configureファイルを見ながら、マクロ展開の様子を見ていこうと思う。