Итак, я пишу make-файл, который будет принимать некоторые файлы (* .in) в качестве ввода моей программы на C++ и сравнивать их вывод (results.out) с заданным корректным выводом (* .out). В частности, у меня есть файлы t01.in, t02.in, t03.in, t04.in и t05.in. Я проверил, что $ TESTIN = t01.in t02.in t03.in t04.in t05.in. Проблема заключается в том, что, по-видимому, он запускает блок% .in:% .out только для трех из этих файлов, 1,3 и 4. Почему он это делает?Makefile пропускает определенные зависимости
OUTPUT = chart
COMPILER = g++
SOURCES = chart.cpp
HEADERS =
OBJS = $(SOURCES:.cpp=.o)
TESTIN = tests/*.in
all: $(OUTPUT)
$(OUTPUT): $(OBJS)
$(COMPILER) *.o -o $(OUTPUT)
%.o: %.cpp
clear
$(COMPILER) -c $< -o [email protected]
test: $(TESTIN)
%.in: %.out
./$(OUTPUT) < [email protected] > tests/results.out
printf "\n"
ifeq ($(diff $< tests/results.out),)
printf "\tTest of "[email protected]" succeeded for stdout.\n"
else
printf "\tTest of "[email protected]" FAILED for stdout!\n"
endif
Кроме того, если есть лучший способ достижения того, что я пытаюсь сделать, или какие-либо другие улучшения, я мог бы сделать для этого Makefile (как я скорее новичок в этом), предложения будут высоко оценены.
EDIT: Если я добавлю вторую зависимость к блоку (% .in:% .out% .err), он запустит блок для всех пяти файлов. По-прежнему не знаю, почему это работает так, но не так.
Это правило не делает много смысла , '% .in:% .out' означает« правило для ** создания ** 'foo.in' из' foo.out'. Но похоже, что у вас есть файлы '.in' * a priori *? –
@OliCharlesworth Да, у меня уже есть .in-файлы. Как это следует переформулировать так, чтобы блок '% .in:% .out' выполнялся для каждого файла в' $ (TESTIN) ' –