gnu make: match-everything: зависимость от наличия предпосылок - PullRequest
1 голос
/ 21 июня 2010

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

По-видимому:

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

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

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

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

1 Ответ

1 голос
/ 21 июня 2010

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

...