[英]Java Makefile always rebuilds, even when no changes were made
我的makefile始終重建項目,即使沒有進行任何更改。
我該如何解決?
我的項目結構遵循通常的bin /,src /,Makefile模式。
Makefile文件:
# output directory
BIN = bin/
# input directory
SRC = src/
# java compiler
JC = javac
# compile flags
JFLAGS = -d $(BIN) -cp $(SRC)
sourcefiles = $(addprefix $(SRC), \
A.java \
B.java \
C.java)
classfiles = $(sourcefiles:.java=.class)
all: $(classfiles)
%.class: %.java
$(JC) $(JFLAGS) $<
clean:
$(RM) $(BIN)*.class
我從網上找到的示例中制作了這個makefile,但是我不確定我是否了解所有工作,因此,如果我也能得到解釋,那將是很好的:3
通常, make
不太適合Java。 Make的工作方式與傳統編譯器類似,它們的工作效果最佳:它們采用輸入文件foo.X
(可能還包括其他一些輸入文件),並且生成單個輸出文件foo.Y
例如,對於C編譯器, X
為c
而Y
為o
( foo.c
編譯為foo.o
)。
在編譯器的一次調用會生成多個輸出文件的情況下,很難使用Make,並且在輸出文件的名稱與輸入文件的名稱不直接相關的情況下使用它並不簡單(在這種情況下)您必須編寫所有顯式規則,而不是模式規則)。
對於Java編譯單個.java
輸入文件可以產生多個不同.class
文件和名稱.class
文件不一定涉及到的名稱.java
文件。
根據您的情況,如果您查看javac
為A.java
文件生成的輸出文件,我會打賭,您會看到它沒有生成A.class
。 由於A.class
不存在,make將始終嘗試重建它。
哦。 也。 您將文件放在不同的目錄中。 因此,即使您確實將自己限制在名稱相同的情況下,也必須像這樣編寫模式:
# ... Keep the first part as in your example
classfiles = $(patsubst $(SRC)%.java,$(BIN)%.class,$(sourcefiles))
all: $(classfiles)
$(BIN)%.class : $(SRC)%.java
$(JC) $(JFLAGS) $<
# ... Keep the clean rule as in your example
模式%
必須相同; 如果將內容放在不同的目錄中,則它們是不相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.