2016-03-24 10 views
4

次の例では、すべてをビルドするときに、ターゲットmain-gs-universalk9-m.oがルール2ではなくルール1と一致するように見えます。ルール2をルール1の前に定義して移動しても、ルール1に一致します。gnu makeパターンルールが間違ったルールと一致する

これをコーディングして期待どおりに動作させる正しい方法は何ですか?

$(info .FEATURES := $(.FEATURES)) 


%.o: 
    @echo "Rule 1 $?" 
    rm -f [email protected] 
    cp $*.c [email protected] 

main-gs-%-m.o: file1.o file2.o file3.o 
    @echo "Rule 2" 
    cat $? > [email protected] 

binos_%_version.o: 
    @echo "Rule 3" 
    echo "Hello World" > [email protected] 

x86-%-m: main-gs-%-m.o binos_%_version.o 
    @echo "Rule 4" 
    cat $? > [email protected] 

all: x86-universalk9-m 

clean: 
    @echo "Rule Cleaning" 
    rm -f *.o 
    rm -f x86-universalk9-m 
+0

ルール2のRHSのためではありません。* '% 'はありません(そのような唯一のルールです)。 – o11c

+0

そのルールが%.o:%cの場合、これは期待どおりに機能しているようです。 –

答えて

2

あなたはどのようにimplicit rule search algorithm作品を見ている場合、あなたはそれを2つの段階で行われていることがわかります。

最初の段階で、makeは、物理的にも存在していなくても、前提条件が存在するルールを削除します。ファイルは、ターゲットとして明示的にメイクファイルに記述されている場合、または非暗黙ルールの前提条件として存在する必要があります。

ルールmain-gs-%-m.o: file1.o file2.o file3.oには3つの前提条件がありますが、存在しないため明示的なターゲットとして指定されておらず、暗黙ルールの前提条件としてのみ表示されます(このルールと組み込み暗黙ルール)。 x86-universalk9-mの場合は%.o:になりました。

これを修正する方法はいくつもありますが、これらのパターンルールをすべて使用する必要がある理由を正確に把握することはできません。%.o:からfile1.o file2.o file3.o:に変更します。

関連する問題