在下面的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
答案 0 :(得分:1)
这是因为这就是makefile的工作原理: - )。
makefile由规则组成:每个以非缩进行开头的块都是规则。每条规则都会告诉make
如何创建某个文件。
通常,“:”左边的部分是生成文件的名称(目标)。例如,对于您编写的C程序:
main.o : main.c defs.h
cc -c main.c
这告诉make
:
main.o
main.o
取决于main.c
和defs.h
cc ...
以创建main.o
结果是,只要
,make
就会运行cc...
部分
main.o
不存在或 main.c
或defs.h
比main.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目标都要构建。