プログラミングユーティリティ

概要

m4 は、C 言語とアセンブリ言語のプログラムを前処理する際に使用できる汎用マクロプロセッサです。テキストの文字列を別の文字列に置換する簡単な処理のほかに、m4 は以下の処理を行うことができます。

ユーザーは、組み込みマクロを使用してこれらの処理を実行したり、独自のマクロを定義できます。一部の組み込みマクロは処理の状態に副作用を及ぼしますが、それ以外は組み込みマクロとユーザー定義マクロはまったく同じように機能します。

m4 の基本動作は、英数字のトークン (文字と数字の文字列) をすべて読み取り、そのトークンがマクロの名前かどうかを判定することです。マクロの名前はそのマクロの定義テキストに置換され、その文字列は入力に戻されて再度読み取られます。マクロは、引数を使用して呼び出すことができます。引数は、収集されて、定義テキストが再度読み取られる前に適切な位置でその定義テキストに置換されます。

マクロ呼び出しの一般形式を以下に示します。

名前 (引数1, 引数2, ..., 引数n)

マクロ名の直後に左括弧がない場合は、引数がないものとみなされます。引数の収集時に引数の先頭にある引用符で囲まれていない空白文字、タブ、復帰改行は無視されます。左と右の単一引用符は、文字列を囲む際に使用します。引用符で囲まれた文字列の値は、引用符を取り除いた文字列になります。

マクロ名が認識されると、その引数は左括弧に対応する右括弧を検索することによって収集されます。与えられた引数がマクロ定義の引数の数よりも少ない場合には、足りない引数はすべて NULL であるとみなされます。引数を収集している間に、マクロ評価が行われます。また、入れ子にされた呼び出しの値に含まれているコンマや右括弧は、元の入力テキストのコンマや括弧と同様にすべて有効です。引数の収集が終わると、マクロの値は入力ストリームに返され、再度読み取られます。以下に、詳細を説明します。

以下の形式のコマンドを使用して m4 を呼び出します。

$ m4 file file file

各引数ファイルは、順番に処理されます。引数が 1 つも指定されていない場合、またはハイフンが引数として指定されている場合には、標準入力が読み取られます。最終的に m4 の出力をコンパイルする場合は、次のようなコマンドを使用してください。

$ m4 file1.m4 > file1.c

m4 コマンド行で -D オプションを使用すると、マクロを定義できます。たとえば、類似した 2 つのバージョンのプログラムがあり、その 2 つの出力ファイルを生成できる 1 つの m4 入力ファイルがあるとします。つまり、file4.m4 には以下のような行が含まれています。

if(VER, 1, do_something) 
if(VER, 2, do_something)

このプログラムのメークファイルは以下のようになります。

file1.1.c : file1.m4 
m4 -DVER=1 file1.m4 > file1.1.c 
...  
file1.2.c : file1.m4 
m4 -DVER=2 file1.m4 > file1.2.c 
...  

-U オプションを使用すると、 VER の定義を解除することができます。file1.m4 に以下の行が含まれている場合には、

if(VER, 1, do_something) 
if(VER, 2, do_something) 
ifndef(VER, do_something)

そのメークファイルには以下のような行が含まれることになります。

file0.0.c : file1.m4 
m4 -UVER file1.m4 > file1.0.c 
...  
file1.1.c : file1.m4 
m4 -DVER=1 file1.m4 > file1.1.c 
...  
file1.2.c : file1.m4 
m4 -DVER=2 file1.m4 > file1.2.c 
...