Приоритет пустого явного правила и неявного правила

Мое понимание неявного правила заключается в том, что неявное правило будет использоваться только в том случае, если нет явного правила, соответствующего цели. Если есть как явное, так и неявное правило, соответствующие цели, то будет использоваться явное правило, а неявное правило будет проигнорировано.

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

Makefile

all:

%:
      #match-anything implicit rule

вывод make - неявное правило #match-anything

Makefile

all:
      #explicit rule

%:
      #match-anything implicit rule

вывод make - правило #explicit


person PeopleMoutainPeopleSea    schedule 30.07.2014    source источник
comment
кажется, что одна строка, содержащая все: не считается пустым правилом. если первый make-файл изменен на all:; тогда вывод make: «все» обновлено   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
Я предполагаю, что all: рассматривается как строка настройки предварительного условия, а не как правило (поскольку у него нет тела).   -  person Etan Reisner    schedule 30.07.2014
comment
правило состоит из цели, предпосылок и рецепта.   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
Что означает явное правило? Кажется, что явное правило должно иметь явную цель, явную предпосылку и явный рецепт.   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
См. Синтаксис правила, Что содержат файлы Makefile и последний абзац Несколько правил для одной цели. Для чего должно быть достаточно деталей, чтобы это имело смысл. (Конкретно последняя ссылка.)   -  person Etan Reisner    schedule 30.07.2014
comment
привет Итан, я прочитал те разделы, которые вы упомянули в руководстве GNU make. Но в руководстве не упоминается несколько смешанных неявных правил и явных правил для одной цели.   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
Именно об этом говорит последний абзац моей последней ссылки. Он явно говорит, что если ни одно из явных правил для цели не имеет рецепта, то make ищет применимое неявное правило, чтобы найти его. Это точное поведение, которое вы видите и о котором спрашивали. Явное правило без рецепта не отменяет неявное правило.   -  person Etan Reisner    schedule 30.07.2014
comment
Большое спасибо, Итан, что ответили на мой вопрос. Кажется, мне следует более внимательно прочитать руководство.   -  person PeopleMoutainPeopleSea    schedule 02.08.2014


Ответы (2)


Это поведение описано в руководстве GNU make в Несколько правил для одного Целевой раздел.

Если ни одно из явных правил для цели не имеет рецепта, выполните поиск применимого неявного правила, чтобы найти его (см. Использование неявных правил).

Дополнительная информация (соответствующая пониманию различных взаимосвязанных поведений) доступна в Синтаксис правил и Что содержат файлы Makefile разделы.

person Etan Reisner    schedule 03.08.2014

Из Использование пустых правил в GNU make manual:

Иногда полезно определить рецепты, которые ничего не делают. Это делается просто путем предоставления рецепта, который состоит только из пробелов. Например:

цель: ;

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

Вам может быть интересно, почему вы хотите определить рецепт, который ничего не делает. Единственная причина, по которой это полезно, состоит в том, чтобы предотвратить получение целью неявных рецептов (из неявных правил или специальной цели .DEFAULT; см. Неявные правила и См. Определение правил по умолчанию последней инстанции).

person Hai Zhang    schedule 13.08.2015