我不明白我的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
文件一起删除.
归档时间: |
|
查看次数: |
5811 次 |
最近记录: |