Пожалуйста, рассмотрите следующий Makefile:
CC = g++
CFLAGS = -c -O -Wall
EFLAGS = -O -Wall -lm -o
UTILITIES = error.o stream_manip.o mat_ops.o GaussElim.o
UTILITIES += abstractmatrix.o dvector.o dmatrix.o ConjGrad.o
# All objects
%.o: %.cpp %.hpp
$(CC) $(CFLAGS) $<
# Executables (doesn't have extension)
% : %.cpp $(UTILITIES)
$(CC) $(EFLAGS) % $< $(UTILITIES)
# Specific executable
#TS_CG : TS_CG.cpp $(UTILITIES)
#$(CC) $(EFLAGS) $@ $@.cpp $(UTILITIES)
Правило match-everything (для исполняемых файлов) должно позволять мне набирать в терминале следующее:
make TS_CG
и make скомпилирует исполняемый файл с именем TS_CG. Тем не менее, make
не использует мою цель соответствия всем. Вместо этого он использует свое правило компиляции по умолчанию.
С другой стороны, если все объекты, перечисленные в UTILITIES, существуют, он использует мою цель соответствия всем. Следовательно, кажется, что соответствие зависит от наличия предпосылок.
По-видимому:
Когда правило является терминальным, оно не применяется, если его предпосылки не существуют.
(согласно
Руководство по эксплуатации ).
Но мое правило не является окончательным; это не отмечено двойным двоеточием!
Так почему же это все еще применимо?
Я мог бы также спросить, есть ли у кого-нибудь лучшее решение для дифференциации между объектными целями и исполняемыми целями, как я пытался сделать в своем файле.