“无需为'错误规则做任何事情



我有一个通配符规则,可以在目录中获取所有文件作为测试并运行它们,以及一个.phony规则,以确保我可以运行所有测试,而不管它们是否是否先前运行。当我运行make tests/PA5obj.javamake test时,它会以```Make:test''无需完成的返回。

有时在我将新文件添加到 tests/ dir之后,我必须在make test拾取它们之前运行make clean,所以我不确定是否存在缓存问题,但这不会解释为什么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 DIR中的所有文件(作为最小示例(

制造将执行PHONY目标的规则,即使存在该名称的文件。

但是这不适用于模式规则,这就是为什么您遇到此问题的原因。

it dis 适用于 static 模式规则(至少在GNU版本中m使用(。因此,请尝试一下:

$(TESTS): tests/%.java: $(PROG).jar
    ...

您没有任何取决于测试目标的目标。由于测试目标取决于JAR目标,因此您可以将所有目标更改为依赖于测试目标而不是JAR目标。

最新更新