В комментариях этот ответ, MadScientist, текущего сопровождающего GNU Make, говорится о явно объявленных целях .INTERMEDIATE:
[a file] just has to be mentioned explicitly in any rule (not recipe) to remove its eligibility for intermediate status.
С другой стороны, руководство по созданию GNU говорит
However, you can explicitly mark a file as intermediate by listing it as a prerequisite of the special target .INTERMEDIATE. This takes effect even if the file is mentioned explicitly in some other way.
Как правильно или что я не так понял?





Возникло недоразумение: оба приведенных выше утверждения верны, но контекст, который вы применяете (на явно объявленных целях .INTERMEDIATE), неверен; это заявление было ответом на вопрос, заданный в комментарии к моему ответу, который отличался от исходного вопроса.
Без каких-либо специальных переопределений цель может быть промежуточной, если она полностью определена командой make (нигде явно не указана в make-файле, а обнаруживается только с помощью неявного поиска по правилам).
Если цель указана как цель или пререквизит в make-файле, то по умолчанию она не может быть промежуточной. Специальная форма .INTERMEDIATE позволяет вам объявить, что упомянутая цель является промежуточной даже в этом случае.
Чтобы гарантировать, что цель является промежуточной нет, достаточно просто упомянуть ее в make-файле как цель или пререквизит какой-либо цели где-то (это не обязательно должна быть цель, которая фактически создается во время этого вызова make).
Чтобы обеспечить целевое промежуточное звено является, его либо не следует упоминать, либо его следует объявить обязательным условием .INTERMEDIATE.
Я говорю, что текст, который вы цитируете, взят не из моего ответа, а из комментария к моему ответу... и этот комментарий не связан с исходным вопросом, он отвечает на вопрос, заданный в другом комментарии: Без 'another: two.dep', дважды.dep считается промежуточным и соответствующим образом удаляется (если он создан). С этой линией она больше не считается промежуточной. Почему? Мой комментарий объясняет, почему добавление another: twice.dep гарантирует, что twice.dep не считается промежуточным.
Make ничего не знает о .dep файлах. Он обрабатывает их так же, как и любой другой файл. На самом деле, у make НЕТ специального класса целей, которые он по своей сути обрабатывает иначе, чем любой другой класс на основе имени и т. д. (за исключением тех, на которые влияют неявные цели по умолчанию, я думаю).
Это тоже было мое впечатление (хотя я не знал, есть ли что-то еще, кроме неявного таргета по умолчанию). Так что, если она неявно не считается промежуточной, и .INTERMEDIATE: все равно, упоминается ли она где-то, что тогда не так с другой строкой? Кажется, в данном случае ничего не меняется: .INTERMEDIATE: + другая строка: промежуточная, .INTERMEDIATE: + никакая другая строка: промежуточная, нет .INTERMEDIATE: + другая строка: не промежуточная, нет .INTERMEDIATE: + никакая другая строка: не промежуточная...
Это довольно просто, поэтому я не уверен, где путаница. Я неоднократно говорил: если цель не указана в make-файле (но найдена по неявным правилам), то она промежуточная. Если это упоминается, это не промежуточное звено. Отдельно от этого, если цель указана как обязательное условие .INTERMEDIATE, то она является промежуточной вне зависимости от того, упоминается она или нет. Вот и все.
Если вы хотите, чтобы ваша цель была промежуточной, то либо никогда не упоминайте ее, либо объявляйте .INTERMEDIATE; любой из них будет делать работу. Если вы не хотите, чтобы ваша цель была промежуточной, упомяните об этом и, не объявляйте ее .INTERMEDIATE.
В вашем комментарии выше ваше последнее предложение неверно: нет .INTERMEDIATE + нет другой строки означает, что она ЯВЛЯЕТСЯ промежуточная.
Я думаю, что сбивает с толку то, что нет четкого определения «упоминания». Итак, если я предоставляю правило с файлом в качестве цели (в этом примере, дважды.dep), считается ли это упоминанием или файл будет промежуточным? Если первое, как это может быть неявно промежуточным; имея для него шаблонное правило?
Я не уверен, что смущает; например, я сказал Если цель указана как цель или пререквизит в make-файле, то по умолчанию она не может быть промежуточной. Это означает, что «упоминание» означает использование определенного файла либо в качестве цели, либо в качестве предварительного условия. Мне это кажется довольно ясным. Так что в вашем примере да, определенно это считается «упоминанием». Промежуточные файлы возникают в ситуациях, когда у вас есть правило: «foo.a : foo.b», затем правила шаблона два: %.b : %.c и %.c : %.d. foo.c никогда не упоминается в make-файле, предполагается, что это файл средний.
Можете ли вы указать мне, каков будет правильный контекст? Насколько я понял, и вопрос, и отвечать содержали явное объявление цели .INTERMEDIATE (
.INTERMEDIATE: twice.dep). Затем рассматриваемый комментарий просто добавил (и снова удалил) еще одно утверждение. Считаются ли файлы.depпромежуточными целями?