2015-03-16 2 views
0

У меня есть этот Makefile:Может ли предварительное правило шаблона шаблона makefile быть правилом шаблона?

.PHONY: all 
all: foo.o 

makefile: ; 

%.inc: 
    echo INC 
    touch [email protected] 

%.o: bar.inc 
    echo O 
    touch [email protected] 

%.o: 
    FAIL 

я ожидаю, что использовать первый %.o правило, создают bar.inc как необходимое условие, а затем создать foo.o. Вместо этого он использует последнее правило и я получаю это:

FAIL 
make: FAIL: Command not found 
make: *** [foo.o] Error 127 

Он отлично работает, если я либо изменить %.inc к bar.inc или изменить %.o к foo.o. говорит

для того, чтобы шаблонное правило применять его целевой шаблон должен совпадать с именем файла, рассматриваемыми и все его предпосылок (после подстановки шаблона) должен назвать файлы, которые существуют или может быть сделаны ,

Правило ли шаблона %.inc не учитывается как «может быть сделано»? Я использую GNU Make 3.81.

ответ

1

Соответствующая информация, которую вам не хватает, находится в разделе 10.5.4 How Patterns Match.

В частности (курсив мой):

Правило шаблона может быть использовано для создания данного файла, только если есть цель шаблон, который совпадает с именем файла, и все предпосылки в этом правиле либо есть, либо могут быть построенным. Правило, которое вы пишете, имеет приоритет над теми, которые встроены. Обратите внимание, однако, что правило, предпосылки которого фактически существуют или упоминаются, всегда имеет приоритет над правилом с предпосылками, которые должны выполняться путем связывания других неявных правил.

Так что вопрос не является, что ваше условие не может быть сделано, а что делать даже не пытается, так как ваши другие правила «победы».

MadScientist покрывает это немного дополнительной информацией и деталями в своем ответе here.

+0

Спасибо! Я могу удалить последнее правило '% .o', но make будет выбирать встроенное правило' $ (AS) $ (ASFLAGS) ', потому что foo.s существует по другим причинам. Если я отменил это, он должен выбрать правильное правило. –

+1

Для справки, вот как отменить встроенное правило: https://www.gnu.org/software/make/manual/html_node/Canceling-Rules.html#Canceling-Rules –

Смежные вопросы