2012-09-05 41 views
0

我试图用这个Makefile编译我的Java代码。当我运行make时,它多次编译代码。Makefile运行不止一次

的Makefile:

.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数量的增加/减少而增加/减少

这怎么可能?

回答

1

只需在javac之后添加主类即可。

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

所有依赖于主类的类和文件夹(包)都将被自动编译。你的make正在编译一些已经编译好的类。

0

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

底线是,它正在做你告诉它。你告诉它做的事实是多余的并不重要,make

0

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