Пожалуйста, рассмотрите следующий 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) $@ [email protected] $(UTILITIES)
Предполагается, что правило match-anything (для исполняемых файлов) позволит мне ввести в терминале следующее:
make TS_CG
и сделайте компиляцию исполняемого файла с именем TS_CG. Однако make
не использует мою цель "сопоставить все". Вместо этого он использует правило компиляции по умолчанию.
С другой стороны, если все объекты, перечисленные в UTILITIES, существуют, он использует мою цель match-all. Отсюда кажется, что соответствие зависит от наличия предпосылок.
Видимо:
Когда правило является окончательным, оно не применяется, если на самом деле не существуют его предпосылки.
(согласно руководству по созданию). Но мое правило не окончательно; он не отмечен двойным двоеточием!
Так почему же это все еще кажется применимым?
Я также мог бы спросить, есть ли у кого-нибудь лучшее решение для различения целевых объектов и исполняемых целей, как я пытался сделать в своем файле.