又一个"多目标模式" makefile错误

时间:2015-06-25 13:56:25

标签: java makefile

我试着环顾四周,但我在这里看到的所有问题都太高了,我无法理解。

这是我的makefile:

compile: bin src cmp
bin: mkdir bin
src: find src -name "*.java" > sources.txt
cmp: javac -cp biuoop-1.4.jar -d bin @sources.txt
run: java -cp biuoop-1.4.jar:bin:src/resources Ass6Game
jar: jar -cmf Ass6Game.jar Manifest.txt -C bin . -C src resources

当我尝试运行make compile时,我得到了多个目标模式"错误。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的makefile语法不正确。

syntax of a make rule

  

通常,规则如下所示:

targets : prerequisites
   recipe
   …
     

或者像这样:

targets : prerequisites ; recipe
   recipe

然而,您的食谱行位于先决条件位置,因此java命令中的:令人困惑。

你的makefile应该是这样的

compile: bin src cmp
bin: ; mkdir bin
src: ; find src -name "*.java" > sources.txt
cmp: ; javac -cp biuoop-1.4.jar -d bin @sources.txt
run: ; java -cp biuoop-1.4.jar:bin:src/resources Ass6Game
jar: ; jar -cmf Ass6Game.jar Manifest.txt -C bin . -C src resources

或者像这样

compile: bin src cmp
bin:
        mkdir bin
src:
        find src -name "*.java" > sources.txt
cmp: 
        javac -cp biuoop-1.4.jar -d bin @sources.txt
run:
        java -cp biuoop-1.4.jar:bin:src/resources Ass6Game
jar:
        jar -cmf Ass6Game.jar Manifest.txt -C bin . -C src resources

或实际使用make为您提供更多更像这样的东西

JAR := biuoop-1.4.jar
SOURCES := $(shell find src -name '*.java')
# Or if src is a single directory without sub-directories
#SOURCES := $(wildcard src/*.java)

GAMEJAR := Ass6Game.jar

.PHONY: all
all: $(JAR)

bin:
        mkdir bin

$(JAR): $(SOURCES) | bin
        javac -cp $@ -d bin $^

# See http://www.gnu.org/software/make/manual/make.html#Force-Targets for what `FORCE` is doing here.
$(GAMEJAR): FORCE
        jar -cmf $@ Manifest.txt -C bin . -C src resources

FORCE: ;

.PHONY: run
run: $(GAMEJAR)
        java -cp $(JAR):bin:src/resources $(GAMEJAR)

更好地跟随Rules of Makefiles,实际上可以根据需要智能地重建文件。