为什么以下makefile不起作用?

时间:2013-03-23 21:04:28

标签: java makefile

在下面的makefile中,每次执行目标“compile”,而不管其依赖性是否被更改。然而,对于目标“doc”来说,情况却是如此,尽管依赖关系是相同的。请帮忙!

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

2 个答案:

答案 0 :(得分: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.hmain.o
  • 更新

现在,在您的示例中,规则的目标不是创建的文件。这些目标被称为虚假目标。由于make永远不会将这些目标作为文件找到,因此每次都会运行规则。

doc规则是一个例外:目录doc实际存在,并且由于javadoc写入此目录,目录的时间戳将被更新。 make会看到doc比源文件更新,并且不会运行规则。


那就是说,我强烈建议你不要使用Makefile来编译Java代码。虽然它当然是可能的,但Makefile是为C代码设计的,并且缺少Java的许多有用功能。相反,使用Java构建工具。有几个可用;我可以推荐Maven

答案 1 :(得分: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是一个不需要存在并且不会被创建的错误目标,因为它没有先决条件或者收件人,它用于强制make尝试构建目标abc,并且在此过程中doc目标也将看起来已经过时....这就是你想要的,每当你调用“make all”时,doc目标都要构建。