m4
のマクロを書いていると、
(たいていのプログラミング言語の場合と同様に)
往々にしてそれらは思ったようには動いてくれないものです。
m4
にはデバッグをサポートするしくみがいくつか存在します。
ある名前(name)が展開されるとどうなるのか調べたいときは、
組み込みマクロdumpdef
を使用することができます。
dumpdef(...)
このマクロは任意の個数の引数を取ります。 引数を与ずに呼びだすと、既知の名前すべての定義を表示します。 それ以外の場合は与えた引数の定義を表示します。 出力は標準エラー出力に直接行われます。
dumpdef
は展開されると消滅します。
define(`foo', `Hello world.') => dumpdef(`foo') error-->foo: `Hello world.' => dumpdef(`define') error-->define: <define> =>
最後の例は組み込みマクロの定義が表示される様子です。
表示の詳細を調整するための情報についてはSee section デバッグ出力の制御を参照してください。
組み込みマクロtraceon
とtraceoff
を使うと、マクロの呼び出しと
展開をトレース(trace)することができます。
traceon(...) traceoff(...)
traceon
とtraceoff
を引数なしで呼ぶと、
すべての定義済みのマクロに対してトレースがそれぞれオンまたはオフとなります。
引数を指定した場合、その名前のマクロに対してだけ作用します。
traceon
とtraceoff
は展開されると消滅します。
トレース中のマクロが呼ばれるたびに、 そのマクロの呼び出しに関する情報が引数の収集が終ったあとに表示されます。 マクロの呼び出しが展開後に消滅しないときは展開の結果が表示されます。 出力は標準エラー出力へ直接行われます。
define(`foo', `Hello World.') => define(`echo', `$@') => traceon(`foo', `echo') => foo error-->m4trace: -1- foo -> `Hello World.' =>Hello World. echo(gnus, and gnats) error-->m4trace: -1- echo(`gnus', `and gnats') -> ``gnus',`and gnats'' =>gnus,and gnats
ダッシュ(-)の間にある数字は展開の深さを表します。 たいていは最も外側のレベルでの展開を表す1となりますが、 クォートされていないマクロの呼び出しを引数が含む場合には増えていきます。
表示の詳細を調整するための情報についてはSee section デバッグ出力の制御を参照してください。
m4
に`-d'オプションを与えることにより、
これまでの節に記載されているマクロを使ったときに表示される情報の詳しさを
制御します。
このオプションに続けて次のうち1つまたは複数のフラグを指定します。
t
m4
におけるマクロの呼び出しを全てトレースします。
a
traceon
マクロによってトレースしているマクロだけが
対象となります。
e
traceon
マクロによってトレースしているマクロだけが
対象となります。
q
c
x
f
l
p
i
V
`-d'オプションに何もフラグを指定しない場合、 デフォルトで`aeq'が使われます。 前2つの節にある例は、これらデフォルトのフラグを使うことを想定しています。
組み込みマクロdebugmode
を使うと、実行時にデバッグ出力のフォーマットを
制御できます。
debugmode(opt flags)
引数flagsは上に列挙されている文字をいくつか指定します。 特殊なケースとして引数を`+'で始めると、 それらのフラグが現在のデバッグ・フラグ群に追加されます。 また引数を`-'で始めると現在のデバッグ・フラグ群から削除されます。 引数をまったく与えない場合、デバッグ・フラグは(`-d'を与えない場合と同様に) すべてゼロに設定されます。 引数として空文字列を与えるとフラグはデフォルトの値にリセットされます。
デバッグとトレースの出力は、m4
に`-o'オプションを与えるか
組み込みマクロdebugfile
を使うことで、
ファイルにリダイレクト(redirect)することができます。
debugfile(opt filename)
このマクロにより、ここから後に発生するデバッグとトレースの出力は
すべてfilenameへ送られます。
filenameが空文字列のときはデバッグとトレースの出力は捨てられます。
debugfile
が引数無しで呼ばれたときは、デバッグとトレースの出力は
標準エラー出力へ送られます。
Go to the first, previous, next, last section, table of contents.