2016-12-29 13 views
0

Makefile:Makefile: последовательность выполнения Makefile,

foo: 
    @echo hello 

%: force 
    @echo foo 

force: 
    @echo force 

Если я напечатал `сделать Foo», выход:

force 
foo 
hello 

Так почему бы не hello

Однако, если Я изменил на это:

foo: 
    @echo hello 

%: 
    @echo foo 

force: 
    @echo force 

Это только выходы hello

+0

Если вы хотите получить хорошее представление о том, как делать работы, тогда вы должны прочитать [this] (http://www.oreilly.com/openbook/make3/book/index.csp) вместо того, чтобы постепенно добавлять больше ваши проблемы с переполнением стека. –

ответ

1

Причина в том, что make должен отслеживать обратно зависимости, чтобы сделать вас foo.

Когда вы вводите make foo, подумайте, что вы просите его сделать файл с именем foo. Так как foo не существует (предположение), он пытается выяснить, как сделать foo. Вы сделали правило подстановки % может быть любым, и поскольку нет лучшего варианта make, он попытается использовать это правило, чтобы сделать foo. Чтобы сделать foo, теперь есть зависимость force, которую нужно выполнить, прежде чем мы сможем сделать foo. В файле force не существует make определяет, что ему нужно выполнить цель, чтобы сделать force.

Таким образом, мы достигли точки, когда вещи начинают происходить с точки зрения выхода. force выполняет то, что echos force, затем выполняется правило подстановочного знака, которое echos foo, наконец, делает его готовым к созданию foo, а команда - только для эха hello.

Таким образом, это фактически в обратном порядке, от внешней зависимости сначала до конечной цели.

Когда вы уберете force как зависимость правила подстановки тогда подстановочные правило будет определять нет ничего сделать, чтобы создать силу, и поэтому не будет выполнять его тело (вторя foo), но, как hello не существует, он будет выполните тело цели foo.

Если включить что-то сделать файл силу в целевой силы (например touch force) вы увидите, что в настоящее время foo и hello печати, но не force.

Вы можете увидеть шаги, которые выполняются, если вы передадите флаг --debug=a (все), чтобы сделать в командной строке.

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