次: Search Path, 前: File Inclusion, 上: File Inclusion
m4にはファイルをインクルードするための組み込みマクロが2つあります。
include(filename)
sinclude(filename)
どちらもfilenameという名前のファイルをm4に読み込ませます。
そのファイルの終りに達すると以前の入力ファイルから入力を再開します。
したがってincludeとsincludeは展開後に
filenameの内容となります。
includeに指定したファイルが存在しないとエラーとなります。
ファイルが存在しないときのエラーメッセージを避けたいときは
sincludeを使います。
sincludeは、もしファイルが存在すればそのファイルをインクルードし、
存在しなければ消滅します。
include(`no-such-file')
=>
error-->30.include:2: m4: Cannot open no-such-file: No such file or directory
sinclude(`no-such-file')
=>
これ以降ファイルincl.m4の内容は仮に以下のものだとします。
Include file start
foo
Include file end
通常、ファイルのインクルードはファイルの内容を入力ストリームに挿入するために
使用されます。
インクルードされたファイルの内容はm4によって読まれ、
そのファイルに含まれるマクロの呼び出しは展開されます。
define(`foo', `FOO')
=>
include(`incl.m4')
=>Include file start
=>FOO
=>Include file end
=>
includeとsincludeがファイルの内容に展開されることを利用して、
ファイル全体に作用するマクロを定義することができます。
次の例では`bar'がincl.m4の内容に展開されるように定義しています。
define(`bar', include(`incl.m4'))
=>
This is `bar': >>>bar<<<
=>This is bar: >>>Include file start
=>foo
=>Include file end
=><<<
もっとも、これはincludeのよくある使い方とは言えません。
なぜならファイルにはクォート、コンマ、カッコといった
m4のパーサ(parser)の働き方に干渉するものがランダムに含まれている可能性が
あるからです。
組み込みマクロincludeとsincludeは引数を与えたときだけ認識されます。