2011-11-27 109 views
4

我可能會錯過一些很明顯與這個Makefile:Makefile文件始終運行目標

convert: devel/bar 
    touch convert 

init: devel/foo 
    echo 'init' 

devel/foo: 
    mkdir -p devel 
    touch devel/foo 

devel/bar: init 
    touch devel/bar 

當我運行它時,devel/bar目標始終被調用。我期望它調用convert,檢查文件devel/bar,並且只有在找不到該文件時才調用該目標。如果我刪除它對init的依賴關係,那麼一切都按我的預期工作。我究竟做錯了什麼?

回答

6

您並未創建名爲init的文件,因此init總是過時。因此,所有依賴它的東西總是過時的。

2

可能是沒有名爲init的文件?所以它試圖更新devel/bar(因爲它取決於init)。

考慮使用.PHONY

+0

使用'.PHONY:init'將保持'就算他創建了一個名爲'init'文件init'外的日期。聽起來和他想要的完全相反。 –

+0

哎呀,對不起。 '.INTERMEDIATE'可能會訣竅。但是,這就是它運行目標的原因 - 它試圖首先創建一個名爲init的文件。 –