В чем разница между этими правилами? - PullRequest
0 голосов
/ 05 июня 2019

Если я тестирую следующие примеры, то (1) и (2) ведут себя очень похоже, поэтому я не могу различить разницу между ними.

в случае с правилом % ::, похоже, чтоповедение, отличное от % :, но я не могу понять это наверняка.

% :                        ------ (1)
    @echo % : $@

----------------------

.DEFAULT :                 ------ (2)
    @echo default : $@

----------------------

% ::                       ------ (3)
    @echo % :: $@

В следующем примере %.foo : %.bar не является терминалом и также имеет правило, которое соответствует предварительному условию%.bar поэтому я думаю, что команда make a.foo в приглашении должна соответствовать правилу %.foo : %.bar, но в конечном итоге она соответствует правилу % :: даже более длинного ствола

%.foo : %.bar
    @echo target : $@

%.bar :
    @echo target : $@

% ::
    @echo % :: $@

------------------------

sh$ make a.foo 
% :: a.foo

1 Ответ

1 голос
/ 05 июня 2019

Я думаю, что команда make a.foo в приглашении должна соответствовать правилу% .foo:% .bar, но в конечном итоге она соответствует% :: правилу даже более длинного ствола

Теперь попробуйте это:

$ touch a.bar
$ make a.foo
target : a.foo

То есть make отказывается углубляться в неявные правила, если он уже гарантировал одношаговую цепочку (но в противном случае длина цепочки не имеет значения). Поэтому обычно вы должны использовать .DEFAULT: для рецепта по умолчанию, в то время как %:: только вместе с некоторой предпосылкой (см., Например, встроенные правила).

Признаюсь, я тоже был удивлен, когда обнаружил это. Но оказывается, что когда в руководстве написано :

Если все предпосылки существуют или должны существовать, или нет никаких предпосылок, то применяется это правило.

Это означает "быть ленивым и по возможности сокращать рекурсию".

...