2016-12-29 163 views
0

Makefile文件的順序:的Makefile:執行makefile文件

foo: 
    @echo hello 

%: force 
    @echo foo 

force: 
    @echo force 

如果我輸入'使富」,輸出的是:

force 
foo 
hello 

那麼,爲什麼不hello

然而,如果我改爲:

foo: 
    @echo hello 

%: 
    @echo foo 

force: 
    @echo force 

它只輸出hello

+0

如果你想對製作方法有一個很好的理解,那麼你應該閱讀[this](http://www.oreilly.com/openbook/make3/book/index.csp),而不是逐步添加更多你的堆棧溢出問題。 –

回答

1

原因是因爲make必須通過依賴項追溯到使foo

當您輸入make foo時,認爲您要求它創建一個名爲foo的文件。因此foo不存在(假定)它試圖找出如何製作foo。你制定了一個通配符規則%可以是任何東西,因爲沒有更好的選項會使用這個規則來製作foo。爲了使foo現在有一個依賴force,這需要執行之前,我們可以制定foo。作爲文件force不存在make決定它需要執行的目標製作force

所以我們已經達到了從輸出的角度開始發生的地步。 force執行哪個回波force,然後執行通配符規則,該回波foo最終認爲它準備好創建foo並且該命令僅回顯hello

所以它實際上是以相反的順序從最外層的依賴關係到最後的最後目標。

當你拿走force作爲通配符規則的依賴,則通配符規則將決定有什麼做的創造力量,所以將不執行它的身體(呼應foo),但作爲hello不存在,它將執行foo目標的正文。

如果你有一件讓在力目標文件力(例如touch force),你會看到現在foohello打印,但不force

如果您在命令行上通過標記--debug=a(全部),您可以看到make的步驟。