2015-01-03 4 views
0

В нижеприведенном фрагменте Makefile обычный способ makefile ведет себя, когда foo.o имеет указанную здесь зависимость, например, /tmp/foo.o: abc.o xyz.o lmn.o и т. Д., Тогда во время разбора make к правилу, в котором перечислены, как сделать зависимость (abc.o xyz.o lmn.o), но здесь целевой /tmp/foo.o не указал никакой зависимости, даже тогда, как выполняется следующая строка или просто игнорируется.Makefile с перечислением зависимостей

Пожалуйста, объясните это как можно скорее, как и почему эта строка (% .o: $$ (addeduffix /%.c,foo bar) foo.h) выполнена. Любая помощь с телом очень ценится. Мне это нужно из-за моей лекции о make-файле.

.SECONDEXPANSION:

/tmp/foo.o:

% .o: $$ (addsuffix /%.c,foo бар) foo.h @echo $^

ответ

1

Это своеобразный make-файл. Похоже, что тот, кто его написал, не понимает. Делайте очень хорошо.

Использование SECONDEXPANSION приводит список предварительных условий:

$$(addsuffix /%.c,foo bar) foo.h 

быть расширен в два раза; первых к этому:

$(addsuffix /%.c,foo bar) foo.h 

, а затем к этому:

foo/%.c bar/%.c foo.h 

Это использование SECONDEXPANSION не выполняет ничего. Мы точно также могли бы написать правило так:

%.o: $(addsuffix /%.c,foo bar) foo.h 
    @echo $^ 

или это:

%.o: foo/%.c bar/%c foo.h 
    @echo $^ 

В любом случае, это шаблонное правило. Если вы пытаетесь построить snaf.o (и нет никакого явного правила для целевого snaf.o), а затем сделать будет рассматривать это правило, соответствующий шток snaf, так что правило эквивалентно следующему: не

snaf.o: foo/snaf.c bar/snaf.c foo.h 
    @echo $^ 

Ни один из это имеет какое-либо отношение к цели /tmp/foo.o, так как правило шаблона не будет соответствовать цели с косой чертой. (Если правило шаблона было /tmp/%.o: ..., это была бы другая история.) Таким образом, эти два правила действительно не взаимодействуют, и намерение автора неясно.

+0

Спасибо за ответ sir !!!!!!!!!!!! но мой вопрос состоял в том, что у цели есть пустой список и нет явного правила, а затем следующая строка, следующая за правилом шаблона, например, в этом случае «целевое foo.o: не имеет списка зависимостей и не имеет явного правила», тогда make автоматически будет для% .o: правило или оно игнорируется. Это то, что я хочу знать, объясните, пожалуйста. –

+0

@Beta, как для 'Это своеобразный makefile'. Этот make-файл находится из make doc: http://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html, пункт ** Вторичное расширение неявных правил ** –

+0

да, сэр !!!! Это из документов, но в лекции это точка отсчета. Поэтому, пожалуйста, объясните приведенный выше вопрос, что если у цели нет списка зависимостей и нет явного правила и правила шаблона, тогда make автоматически рассматривает правило шаблона для цели или для этого существует какой-то другой механизм. –

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