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

動的なマクロ

動的なマクロの $< および $* は、旧バージョンでは、暗黙の規則と .DEFAULT という特殊ターゲットでのみ値が代入されると説明されていましたが、実際には、明示的なターゲットエントリにも値が代入される場合がありました。このバージョンでは、値の代入について正しく説明されています。

これらのマクロに実際に割り当てられる値は、暗黙の規則 (この規則は変更されていません) で使用されるのと同一の手順で取得されます。明示的なターゲットエントリでこれらのマクロを使用すると、予期しない結果になる場合があります。

明示的な依存関係を指定しても、make はその依存関係を使用して前述のマクロの値を取得することはせず、適切な暗黙の規則および依存ファイルを検索します。以下に例を示します。

test: test.f 
        	@echo $< 

上記のように明示的なターゲットエントリを指定したときに、test.ctest.f というファイルがある場合には、$< には test.f という値ではなく test.c が割り当てられます。これは、接尾辞のリスト中で .c の方が .f よりも先にあるためです。

$ make test 
test.c 

明示的なエントリでは、厳密な指定方法でマクロ参照および接尾辞の置換を使用して、依存関ファイルの名前を取得することをお勧めします。たとえば、$< の代わりに $@.f を使用して、依存関係の名前を取得できます。.o のターゲットファイルのベース名を取得するには、接尾辞の置換マクロ参照である $(@:.o=)$* の代わりに使用できます。

隠れた依存関係の検査が有効である場合は、$? という動的なマクロの値に、ヘッダーファイルなどの隠れた依存関係の名前が含まれます。このため、以下のようなターゲットエントリで、x.c がヘッダーファイルを展開すると、コンパイルが失敗する場合があります。

x: x.c 
        	$(LINK.c) -o $@ $?

これを解決するには、$? の代わりに $@.< を使用します。