【发布时间】:2019-05-19 14:38:22
【问题描述】:
我有一个通配符规则来抓取目录中的所有文件作为测试并运行它们,还有一个 .PHONY 规则来确保我可以运行所有测试,无论它们之前是否已经运行过。当我运行 make tests/PA5obj.java 或 make test 时,它会返回 `make: Nothing to be done for '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 目录中的所有文件(作为一个最小示例)
【问题讨论】:
-
什么是
PROG,$(PROG).jar几岁? -
$(PROG) 是实际的目标程序。它需要存在才能运行测试。 $(PROG).jar 在我运行
make clean时被删除,但测试规则仍然不起作用 -
没有minimal complete example,我认为我们无法帮助您。
-
添加了一个简化的例子
标签: makefile