0

我正在尝试用这个 Makefile 编译我的 Java 代码。但是,当我运行 make 时,它​​会多次编译代码。

生成文件:

.PHONY: all clean run

SOURCES = \
    Models/CustomException \
    Models/Forest \
    Models/ForestContainer \
    Models/Owner \
    Models/OwnerContainer \
    Models/Tree


SRC = $(addprefix src/, $(addsuffix .java, $(SOURCES)))
BIN = $(addprefix bin/, $(addsuffix .class, $(SOURCES)))

all: ${BIN}

clean:
    -rm -f ${BIN};

${BIN}: ${SRC}
    mkdir -p bin/Controllers;
    mkdir -p bin/Models;
    mkdir -p bin/Views;
    javac -d bin ${SRC};

run: all
    java -cp bin Program;

输出:

┌─( klim ) - ( ~/workspace/Forest-mvc )
└─> make

mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;
mkdir -p bin/Controllers;
mkdir -p bin/Models;
mkdir -p bin/Views;
javac -d bin src/Models/CustomException.java src/Models/Forest.java src/Models/ForestContainer.java src/Models/Owner.java src/Models/OwnerContainer.java src/Models/Tree.java;

如您所见,它不止一次地运行命令,实际上是 6 次。它运行命令的次数随着 SOURCES 数量的添加/删除而增加/减少

怎么会这样?

4

3 回答 3

1

只需在 javac 之后添加主类。

${BIN}: ${SRC}
    javac -d bin -cp . Models/Tree.java

将自动编译依赖于主类的所有类和文件夹(包)。您的 make 正在一次又一次地编译一些已经编译的类。

于 2012-09-05T17:17:29.193 回答
0

Makefile,中的第一个目标all取决于 6 个不同的子目标。据推测,在运行开始时,这些都不存在,因此make认为它需要构建这 6 个子目标中的每一个。但是,构建这些子目标中的任何一个实际上都会按照您定义的方式构建所有 6 个子目标 - 但make不知道这一点。

最重要的是,它正在做你告诉它的事情。你告诉它做的事情是多余的这一事实并不重要make

于 2012-09-05T17:19:37.357 回答
0

对于每个目标 int ${BIN} make 将调用 ${BIN}: ${SRC} 规则,但您在命令行上为 javac 提供所有源代码。您可能希望在 javac 行上将 ${SRC} 替换为 $<。

于 2012-09-05T17:20:08.820 回答