1

在下面的 makefile 中,目标“编译”每次都会执行,而不管它的依赖关系是否被改变。然而,目标“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
4

2 回答 2

1

这是因为这就是 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比源文件更新,并且不会运行规则。


也就是说,我强烈建议您不要使用 Makefiles 来编译 Java 代码。虽然确实有可能,但 Makefile 是为 C 代码设计的,并且缺少许多对 Java 有用的特性。而是使用 Java 的构建工具。有几种可用;我可以推荐Maven

于 2013-03-23T21:53:14.670 回答
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 目标也将显示为 out日期....这就是您想要的,每次您调用“make all”时都要构建文档目标。

于 2013-03-24T00:48:48.553 回答