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

旧バージョンとの非互換性

この節では、以下について簡単に説明しています。

-d オプション

-d オプションは、このバージョンでは、ターゲットが最新でないとされる理由を出力します。

動的なマクロ

動的なマクロの $< および $* は、旧バージョンでは、暗黙の規則と .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 $@ $?

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

チルド規則

チルド規則はサポートされていません。このバージョンの make は、SCCS でバージョンを取り出すためのチルド規則をサポートしていません。このため、SCCS でバージョンを取り出す必要があるときに特別な処理を実行するためのチルド規則が、旧バージョンのメークファイルで再定義されている場合には、問題が生じることがあります。

ターゲット名

./ で始まるターゲット名は、ローカルディレクトリにあるファイル名として扱われます。

./ で始まるターゲット名を make が検出した場合は、./ を削除します。以下に例を示します。

./filename

このターゲット名は、以下のように解釈されます。

filename

再帰的なターゲットで使用された場合は、無限状態になることがあります。これを回避するには、.. (親ディレクトリ) からの相対パスでターゲットを記述してください。

../dir/filename