我不明白我的makefile做错了什么:
JAVA_SRCS:=$(wildcard tasks/src/*.java) JAVA_CLASSES=$(subst /src/,/build/,$(JAVA_SRCS:.java=.class)) JFLAGS=-cp jar/octobot.jar -d tasks/build JC=javac .SUFFIXES: .java .class .java.class: $(JC) $(JFLAGS) $*.java default: build build: $(JAVA_CLASSES) clean: $(RM) tasks/build/*.class
我收到了这个错误:
make: *** No rule to make target `tasks/build/ClickTask.class', needed by `classes'. Stop. zsh: exit 2 make
但奇怪的是,当我重写这样的规则构建时:
build: $(JAVA_SRCS:.java=.class)
没有错误,规则启动但每次都执行(并且它不正确)
@Dean Povey是正确的:您不能使用后缀规则执行此操作,因为它们与源相同的目录.但是,您可以使用GNU Make模式规则执行此操作(并且您已经在Makefile中使用GNUMake-isms,所以无论如何):
tasks/build/%.class: tasks/src/%.java
$(JC) $(JFLAGS) $<
Run Code Online (Sandbox Code Playgroud)
但请注意,这make不适合构建java源,因为一个.java文件可能会导致许多.class文件(例如内部类).Automake解决这个问题的方法是在一次调用中编译所有内容javac并写出一个时间戳文件(echo timestamp > classnoinst.stamp例如).然后,任何需要构建java源的东西都依赖于该戳记文件并将make clean其.stamp与.class文件一起删除.