3

前提条件を使用して(ただしレシピを使用せずに)暗黙のルールを作成した場合、依存関係は尊重されていないようです。一方、レシピを定義するブロックで前提条件を定義する場合、またはターゲットの特定のインスタンスの依存関係を指定する場合、それは機能しているように見えます。私は次のMakefileを持っています(GNU make 3.81)

all:  foo.a foo.b bar.b bar.c

dep1:
    @echo "running $@"

%.a: dep1

%.a:
    @echo "running $@ (depends on: $^)"

bar.b: dep1

%.b: dep1
    @echo "running $@ (depends on: $^)"

bar.c: dep1

bar.c:
    @echo "running $@ (depends on: $^)"

makeを実行すると、次のようになります。

~/tmp/tmp5> make
running foo.a (depends on: )
running dep1
running foo.b (depends on: dep1)
running bar.b (depends on: dep1)
running bar.c (depends on: dep1)

%.aに依存しているのにdep1foo.a構築せずに構築できるようdep1です。これはmakeのバグですか、それともこの動作の理由がありますか?

ありがとう、

ジョン

4

1 に答える 1

3

同じターゲットを持つパターンルールは、非パターンルールのように単一のルールに結合されることはありません。同じターゲットに2つの非パターンルールがある場合、それらは2つのルールのすべての依存関係と、アクションを持つルールのアクションを含む1つのルールに結合されます(両方のルールにアクションがあるとエラーになります) 。パターンルールでは、これは発生しません。これらは2つの完全に独立したルールとして扱われ、どちらもターゲットの更新に使用できます。

組み込みのパターンルールを考えると、その理由は非常に明白です%.o。さまざまな言語でソースファイルをコンパイルできるルールが複数あります。それらがすべて1つのルールにまとめられた場合、それは単に機能しません。

于 2013-02-11T16:37:50.983 に答える