gnu make: match-anything: зависимость от наличия предварительных условий

Пожалуйста, рассмотрите следующий 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. Отсюда кажется, что соответствие зависит от наличия предпосылок.

Видимо:

Когда правило является окончательным, оно не применяется, если на самом деле не существуют его предпосылки.

(согласно руководству по созданию). Но мое правило не окончательно; он не отмечен двойным двоеточием!

Так почему же это все еще кажется применимым?

Я также мог бы спросить, есть ли у кого-нибудь лучшее решение для различения целевых объектов и исполняемых целей, как я пытался сделать в своем файле.


person Patrick    schedule 20.06.2010    source источник


Ответы (1)


Я удивлен, что Make может собрать TS_CG, когда UTILITIES еще не существуют, поскольку я не ожидал, что он узнает, что они нужны TS_CG.

В любом случае, когда Make пытается найти правило для TS_CG, все, что он находит, это неявные правила (ничего специфичного для TS_CG). В частности, у него есть %: %.cpp $(UTILITIES), который вы предоставили, и %: %.cpp, который встроен. Если все $(UTILITIES) существуют, то будет использоваться первое правило, в противном случае он будет двигаться вниз по списку в поисках правила, предварительные условия которого выполняются. существуют, и найти второй. Только если ему не удастся найти какое-либо правило, для которого существуют предварительные условия, он прибегнет к поиску правил для создания предварительных условий.

person Beta    schedule 21.06.2010
comment
Спасибо за ваш ответ, бета, который, как я полагаю, является правильным ответом. Это кажется противоречащим тому, что было процитировано из руководства по созданию в моем посте, но я думаю, это потому, что встроенное правило не перезаписывается моим правилом (как я думал, это будет). - person Patrick; 21.06.2010