2013-03-23 36 views
1

在下面的makefile中,每次執行一次目標「compile」,而不管它的依賴關係是否被更改。然而,對於目標「文檔」而言,儘管依賴關係是相同的,但是也是如此。請幫忙!爲什麼下面的makefile不起作用?

all : setup compile doc 

setup : 
     @mkdir -p doc bin 

compile: ./src/*.java ./src/cs296BookAnalysis/*.java 
     @echo -n Compiling... 
     @javac -d ./bin ./src/cs296BookAnalysis/*.java ./src/BookAnalysisG01.java 
     @echo Done! 

doc: ./src/*.java ./src/cs296BookAnalysis/*.java 
     @echo Generating Documentation using Javadoc... 
     @javadoc -d ./doc ./src/BookAnalysisG01.java -sourcepath ./src cs296BookAnalysis 
     @echo Done! 

clean: rm -rf doc bin 

回答

1

這是因爲這就是makefile的工作原理:-)。

一個makefile包含規則:每個以非縮進行開始的塊是一條規則。每條規則告訴make如何創建某個文件。

通常情況下,':'左邊的部分是生成文件的名稱(目標)。例如,對於一個C程序,你會寫:

main.o : main.c defs.h 
    cc -c main.c 

這告訴make

  • 這是如何創建main.o
  • main.o取決於main.cdefs.h
  • 規則運行cc ...創建main.o

作爲一個後果,make將運行cc...部分每當

  • main.o不存在
  • main.cdefs.h出現不到main.o

現在,在你的榜樣的目標規則不是創建的文件。這些目標被稱爲假目標。由於make從來沒有將這些目標視爲文件,因此每次都會運行這些規則。

doc規則是一個例外:目錄doc實際上存在,並且由於javadoc寫入此目錄,所以該目錄的時間戳將被更新。 make將看到doc比源文件更新,並且不會運行該規則。


這麼說,我強烈建議你不使用的Makefile編譯Java代碼。儘管這當然是可行的,但Makefiles是爲C代碼設計的,並且缺乏Java的許多有用功能。相反,使用Java的構建工具。有幾種可用的;我可以推薦Maven

+0

非常感謝!這很有用,很清楚! – ashu 2013-03-24 07:43:24

0

試試看看.....

.Phony : abc 

doc : ./src/*.java ./src/cs296BookAnalysis/*.java abc 
     @echo Generating Documentation using Javadoc... 
     @javadoc -d ./doc ./src/BookAnalysisG01.java -sourcepath ./src cs296BookAnalysis 
     @echo Done! 

abc : 

這裏ABC是,這麼想的需要存在,並不會得到建立,因爲它沒有先決條件或recipie一個假目標,用它來的力量使試圖建立目標ABC和在這個過程中doc目標也會顯示爲過時....這就是你想要的,doc每次調用「make all」時的目標都將被構建。

相關問題