2012-09-05 43 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}。