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

依存関係リストの読み取り

遅延マクロ参照を使用できるのは、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'