2015-07-04 97 views
0

我有這樣的Makefile:製作不遵循依賴關係鏈

all: src/exec 

src/exec: 
    make -C src/ 

src/exec: src/bar.o 
src/bar.o: src/bar.h 

而在src目錄中的這些文件:

touch src/exec src/bar.o src/bar.h 

當我擊使我得到:

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

現在,如果我更改爲src/bar.h,我會得到相同的結果:

$ touch src/bar.h 
$ make 
make: Nothing to be done for 'all'. 

我不明白。製作應遵循的依賴關係鏈:

all <- src/exec <- src/bar.o <- src/bar.h 

如果src/bar.h變化目標作爲重建嗎?

當我使用兩種gcc -MMmakedepend產生*.d文件,我注意到,正是在這些文件中相同的規則:

bar.o: bar.c bar.h 
exec: bar.o foo.o 

那麼我要做的應該在某個點工作。我錯了嗎?

+0

由於'src/exec'存在,所以'make'沒有任何用處(src/bar.o'的修改時間幾乎可以肯定地與'src/exec'的修改時間相同)。取消所有後綴也可能不是一個好主意;它有效地刪除了所有有用的默認規則。除非您(a)確實知道它做了什麼,並且(b)將後綴重置爲非空 - 或者以完全不同的風格編寫makefile,否則不應包含'.SUFFIXES:'行。 –

+0

那麼'makedepend'如何工作?它完全相同的創建規則,如'bar.o:bar.c bar.h'和'exec:bar.o' – nowox

+0

您的意思是'makedepend'或'make depend'?前者是一個單獨的程序,與你的makefile只有很小的關係 - 你需要確定它的來源,以便研究它。後者需要在你的makefile中有一個規則,你沒有顯示。 (它不會與'.SUFFIXES'混淆。) –

回答

1

由於您明確要求解釋發生的情況,而不是對您要解決的問題提供任何幫助,所以我會提供前者並忽略後者。

如果您使用make -d並檢查輸出,您將很快看到會發生什麼;這裏是一個摘錄:

 Finished prerequisites of target file 'src/bar.o'. 
    Prerequisite 'src/bar.h' is newer than target 'src/bar.o'. 
    No recipe for 'src/bar.o' and no prerequisites actually changed. 
    No need to remake target 'src/bar.o'. 
    Finished prerequisites of target file 'src/exec'. 
    Prerequisite 'src/bar.o' is older than target 'src/exec'. 
    No need to remake target 'src/exec'. 
Finished prerequisites of target file 'all'. 

因此,請即認爲是bar.hbar.o更新,但沒有可用的配方打造bar.o,所以它不會bar.o做任何事情。因此,請注意bar.o的時間戳沒有更改,因此bar.o不會比src/exec更新,因此不會重建src/exec