2013-03-23 134 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”时的目标都将被构建。