【问题标题】:'nothing to be done for' error with .PHONY rule.PHONY 规则出现“无事可做”错误
【发布时间】:2019-05-19 14:38:22
【问题描述】:

我有一个通配符规则来抓取目录中的所有文件作为测试并运行它们,还有一个 .PHONY 规则来确保我可以运行所有测试,无论它们之前是否已经运行过。当我运行 make tests/PA5obj.javamake 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


【解决方案1】:

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

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

确实适用于静态模式规则(至少在GNU Make I'的版本中)米使用)。所以试试这个:

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

【讨论】:

    【解决方案2】:

    您没有任何依赖于测试目标的目标。由于 test 目标依赖于 jar 目标,因此您可以将 all 目标更改为依赖于测试目标而不是 jar 目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2016-07-13
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多