makefile for java

jne*_*ney 3 java makefile

我不明白我的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)

没有错误,规则启动但每次都执行(并且它不正确)

Jac*_*lly 6

@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文件一起删除.