2011-10-25 10 views
4

私はちょうど本当にmakeの内部動作を踏襲し始めています。次が動作しない理由しかし、私は理解していない:メイクファイルのワイルドカード(静的なルール?)と偽

test%: test%.foo 
    @echo [email protected] 
    @echo $< 

all: test1 test2 

.PHONY: all test1 test2 

期待される動作:

$ make 
test1 
test1.foo 
test2 
test2.foo 
# 1,2 Order not important 

しかし、私が手:

$ make 
make: Nothing to be done for `all'. 

( "すべての作る"、「作りをtest1 "などは違いはありません)。

誰かがPHONYテストルールが実行されていない理由を説明できますか?

答えて

7

GNU makeマニュアルの抜粋。

それは偽のターゲットはスキップ 偽のターゲット(暗黙のルールの使用の項を参照)のための暗黙のルールの検索を行う、 他のファイルからリメイクすることができ、実際のファイルに名前を付けていないことを知っているので。このため、 が実際のファイルが存在するかどうか心配していない場合でも、ターゲットの偽物を宣言することはパフォーマンス上の理由です。

これはあなたのtest1test2ターゲットが偽であるため、それらのための暗黙のルールを検索しません作ることを意味します。たとえ使用するパターンがより正確にパターンルールであっても、すべてのパターンルールは暗黙のルールです。

+0

ああ、それは最後のビット "すべてのパターンのルールは暗黙のルールです"ということは私にとって初めてのことです。このインスタンスで私がしたいことをやり遂げるようにするための標準的な方法ですか? – Pat

+0

'test1'と' test2'を非偽にします。 '@touch $ @'を追加してください。 – reinierpost

+0

@reinierpost:実際の 'test1'と' test2'ファイルは変更されません。 Makefileには偽のものとして定義されているので、既存のファイルにかかわらず偽です。それらを偽でないようにするには、 '.PHONY'ルールからそれらを削除するしかありません。 –

関連する問題