遅延マクロ参照を使用できるのは、make が、メークファイル全体を最初に読み込む際と、ターゲットの依存関係を処理する際の合計 2 回依存関係リストを読み込むためです。make は、リストを読み込むたびにマクロ展開を実行します。動的なマクロは、マクロへの参照が 2 回目の読み取りまで遅延される場合を除き、最初の読み取りではまだ定義されていないため、空の文字列に展開されます。
$$ という文字列は、定義済みマクロの '$
' への参照です。このマクロは値が '$' になっています。make が最初の読み取りでこのマクロを展開する際には、$$@ は $@ に展開されます。依存関係の検査では、その $@
というマクロ参照に動的に値が割り当てられるときに、make は参照をその値に展開します。
make は、最初の読み取りではターゲットのターゲット名部分だけを評価します。ターゲット名として遅延マクロ参照を使用すると、正しい結果が得られません。
NONE= none all: $(NONE) $$(NONE): @: this target's name isn't `none'
このメークファイルは、以下のような結果になります。
$ make make: Fatal error: Don't know how to make target `none'