我有一个通配符规则来获取目录中的所有文件作为测试并运行它们,还有一个.PHONY规则以确保无论以前是否运行过它们,我都可以运行所有测试。当我运行make tests/PA5obj.java
或make test
时,它将返回`make:'test'不需要做任何事情。
有时,在将新文件添加到tests/
目录中之后,我必须运行make clean
才能在make test
中将它们提取出来,因此我不确定是否存在缓存问题之类的东西,但这不能解释为什么make test
也不起作用。
以下是makefile的相关部分:
PROG = Test
TESTS = $(wildcard tests/*.java)
.SUFFIXES: .java.class
#-------------------------
JCC = javac
JAR = jar
#-------------------------
all: $(PROG).jar
.PHONY:test $(TESTS)
test: $(TESTS)
tests/%.java: $(PROG).jar
@echo "#### testing $@ ####"
@java -jar $(PROG).jar $@
@echo "> Passed"
$(PROG).jar: Main.class
$(JAR) cmf $(PROG)MainClass.txt $(PROG).jar $^
Main.class: Main.java
javac $^
必要的文件是:
TestMainClass.txt
Main-Class: Main
和Main.java
import java.util.Scanner;
import java.lang.System;
import java.io.File;
import java.io.FileNotFoundException;
class Main {
public static void main(String args[]) {
if (args.length < 1) {
throw new RuntimeException("Usage: Main <filename> ");
}
String filename = args[args.length-1];
try {
Scanner sc = new Scanner(new File(filename));
System.out.println("Contents of file: " + filename);
while (sc.hasNext()) {
System.out.println(sc.nextLine());
}
}
catch (FileNotFoundException e) {
System.out.println(e);
System.exit(1);
}
}
}
运行make test
只需读取test
目录中的所有文件(作为最小示例)
答案 0 :(得分:0)
即使存在具有该名称的文件,Make也会执行PHONY
目标的规则。
但是这不适用于模式规则,这就是您遇到此问题的原因。
但是 确实适用于静态模式规则(至少在GNU版本中,“ m使用)。因此,尝试一下:
$(TESTS): tests/%.java: $(PROG).jar
...
答案 1 :(得分:0)
您没有任何依赖于测试目标的目标。由于测试目标取决于jar目标,因此您可以将所有目标更改为取决于测试目标而不是jar目标。