Законно ли переопределение цели в Makefile по порядку в файле? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть Makefile:

.PHONY: all
all: target1

target1:
    $(info "target1")

target1:
    $(info "target1 override")

Если выполнить «make» из bash, он ответит:

$ make
Makefile:8: warning: overriding recipe for target 'target1'
Makefile:5: warning: ignoring old recipe for target 'target1'
"target1 override"
make: Nothing to be done for 'all'.

Такое поведение ожидается мной, потому что я ожидать, что парсер Makefile примет последнее определение цели.

Законно ли ожидать, что последнее правило из Makefile будет взято, если правило переопределено?

Это можно ли избавиться от предупреждений?

PS Также я попробовал ответить на вопросы другого StackOverflow, такие как использование ключевого слова override и символов «::». Это не помогает (появляются ошибки и те же предупреждения из Makefile).

1 Ответ

1 голос
/ 30 апреля 2020

Законно ли ожидать, что последнее правило из файла Makefile будет взято, если правило переопределено?

Файл Makefile, содержащий несколько правил цели, которые предоставляют рецепты для одной цели нарушает спецификации POSIX для make:

Только одно целевое правило для любой данной цели может содержать команды.

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

Диагностические сообщения c, которые вы представляете, и описываемое вами поведение выглядят как характеристики c GNU make. Если вы готовы зависеть от конкретной реализации make, было бы разумно полагаться на раздел 4.11 его руководства , в котором говорится:

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

(Сноска моя.) Но полагайтесь на это делает ваш make-файл не переносимым. Другие реализации make могут вместо этого отклонить make-файл, выбрать первый рецепт, выбрать случайный рецепт, выбрать все совпадающие рецепты в некотором порядке или продемонстрировать любой вид явного или неочевидного нарушения. Уведомление об этом является целью сообщения.

Можно ли избавиться от предупреждений?

Продолжая принимать GNU make, в руководстве определенно сказано что будет выдан диагноз c, а его сводка параметров командной строки не описывает ничего, что я ожидал бы для подавления рассматриваемого вывода без подавления фактической сборки.

Итог

Вопрос создает впечатление, что вы считаете, что описанное использование должно быть приемлемым, так что диагностика c является просто неприятностью. Это не вариант. Такое использование, по крайней мере, плохой стиль, и оно может представлять подлинные проблемы для вас и других. Что бы вы ни пытались достичь sh таким образом, есть лучшие альтернативы.


* Это относится к target правилам. Суффикс и шаблонные правила, которые соответствуют цели, - это другое дело.

...