Почему GNU заставляет игнорировать недостающие зависимости для шаблонных правил? - PullRequest
1 голос
/ 14 июля 2020

Минимальный пример:

%.bar: missing_file.pckl
   @echo executed

Когда я набираю make foo.bar, make говорит: «Ничего не делать». Зачем? missing_file.pckl не существует, как и правила для него. Разве это не должно вызывать ошибку? (Я знаю, что вы можете обойти это, сделав правило stati c - я просто хочу понять рассуждение.)

Кстати, я пытаюсь понять лог c позади make лучше - в чем разница между шаблонными и неявными правилами (кажется, что эти термины взаимозаменяемы)? И в чем причина того, что правила шаблонов нельзя сделать фальшивыми? Я читал, что неявные правила предназначены для создания файлов, но для меня также имеет смысл использовать шаблонные правила для фальшивых целей.

Спасибо!

1 Ответ

2 голосов
/ 14 июля 2020

Шаблонное правило - это неявное правило. Но суффиксные правила также являются неявными правилами.

Существует два основных типа c правил в make-файле: явные правила и неявные правила. Явные правила состоят из правил для явных целей, а также из правил шаблона stati c (это определенно сбивает с толку, что «правила шаблона stati c» на самом деле явные, но они таковы: они просто сокращение для написания множества явных правил ). Неявные правила состоят из шаблонных правил и суффиксных правил.

Неявное правило можно рассматривать как шаблон. На самом деле он вообще не определяет никаких целей. Он дает только шаблоны того, как можно создать цель (которая соответствует шаблону / суффиксу). Если ваш make-файл содержит только неявные правила, тогда, когда вы наберете make, он ничего не сделает, потому что ваш make-файл фактически не определил никаких целей ... он только создал шаблоны.

Важно понимать, что может быть много шаблонов, которые могут построить одну и ту же цель. Даже встроенные правила make предоставляют множество различных способов создания объектного файла, например: с помощью компилятора C, компилятора C ++, компилятора FORTRAN и т. Д. c. И пользователи могут добавлять свои собственные.

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

Это в значительной степени дает ответ на все ваши вопросы, но в целом up:

Причина, по которой вы получаете это сообщение, заключается в том, что программа make провела поиск всех неявных правил, которые можно было бы использовать для создания этой цели, и не нашла ни одного, которое можно было бы использовать (указанное вами не работают, потому что необходимого условия не существует ... но make не считает это ошибкой, потому что это всего лишь один из способов создания цели. Люди на самом деле иногда используют эту очень удобную функцию !!) Итак, он сказал: «Я не знаю» Я не знаю, как построить эту цель ".

Конечно, make может сгенерировать здесь более подробную информацию. Он мог сказать: «О, я случайно знаю, что существует только одно неявное правило, которое может соответствовать, поэтому я могу более подробно c объяснить, почему это одно правило не работает, и сказать, что предварительное условие отсутствует». Но это сбивает с толку, если у вас есть два неявных правила, которые могут совпадать. Или он может перечислить все возможные предпосылки, которые он не может найти. Или что-то. Я не уверен, что что-то из этого действительно могло бы улучшить в целом. В одних ситуациях они были бы лучше, а в других - супер-раздражающими.

Причина, по которой вы не можете применить .PHONY к шаблонному правилу, заключается в том, что шаблонное правило не является целью. Конечно, разумным улучшением было бы позволить .PHONY брать шаблон и затем применять фальшивость ко всем целям, которые соответствуют этому шаблону. Но это улучшение не было реализовано по какой-либо причине.

...