2016-12-29 14 views
0

Makefileの実行の順序:私は「FOOを作る `入力した場合のMakefile:メイクファイルに

foo: 
    @echo hello 

%: force 
    @echo foo 

force: 
    @echo force 

は、出力は次のようになります。

force 
foo 
hello 

なぜないhello

しかし、場合私はこれに変更しました:

foo: 
    @echo hello 

%: 
    @echo foo 

force: 
    @echo force 

それだけが出力されますhello

+0

makeの仕組みをよく理解したい場合は、[this](http://www.oreilly.com/openbook/make3/book/index.csp)を読んでください。あなたのスタックオーバーフローの質問。 –

答えて

1

なぜなら、makeはあなたにfooをさせるために依存関係を追跡しなければならないからです。

make fooと入力すると、makeはfooというファイルを作成するように要求していると考えます。だからfooが存在しない(前提)ので、fooの作り方を試してみます。あなたはワイルドカードのルールを作った%は何でも良いオプションがないので、このルールを使ってfooを作ることを試みます。 fooを作成するには、forceの依存関係があります。実行する前に実行する必要があります。fooを作成してください。ファイルforceが存在しないため、makeはforceを作成するためにターゲットを実行する必要があると判断します。

私たちは、出力に関して何かが起こり始めるところに達しました。 forceforceのエコーを実行し、次にワイルドカードルールを実行します。エコーはfooです。最終的にmakeはfooを作成する準備ができており、コマンドはhelloだけをエコーし​​ます。

したがって、実際には、最も外側の依存関係から最初の最後のターゲットまでの順序が逆です。

あなたは離れてforceその後、ワイルドカードルールの依存関係として取るそこに力を作成するためには何の関係もありませんので、実行されません(fooをエコー)その体は、しかしhelloが存在しないとして、それが意志決定しますワイルドカードルールfooターゲットの本体を実行してください。

あなたが力目標でファイル力を作るために何かが含まれている場合(例えばtouch force)あなたが今表示されますfoohelloプリントではなくforceいます。

コマンドラインでフラグ--debug=a(all)を渡すと、makeの手順が表示されます。

関連する問題