ошибка «ничего не сделать» с правилом .PHONY - PullRequest
0 голосов
/ 19 мая 2019

У меня есть правило с подстановочными знаками для захвата всех файлов в каталоге в качестве тестов и запуска их, а также правило .PHONY, чтобы убедиться, что я могу запустить все тесты независимо от того, были ли они ранее выполнены. Когда я запускаю make tests/PA5obj.java или make test, он возвращается с `make: Ничего не поделаешь для 'test'.

Иногда после того, как я добавляю новые файлы в каталог tests/, мне нужно запустить make clean, прежде чем он подберет их в make test, поэтому я не уверен, есть ли проблема с кэшированием или что-то еще, но это не не объяснить, почему make test тоже не работает.

Вот соответствующий раздел make-файла:

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 (как минимальный пример)

1 Ответ

0 голосов
/ 20 мая 2019

Make выполнит правило цели PHONY, даже если файл с таким именем существует.

Но это не относится к шаблонным правилам, поэтому у вас есть эта проблема.

Но это применимо к статическим шаблонным правилам (по крайней мере, в той версии GNU Make, которую я использую). Так что попробуйте:

$(TESTS): tests/%.java: $(PROG).jar
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...