Целевые файлы должны быть предварительными условиями для целей PHONY только для заказа или нет? - PullRequest
0 голосов
/ 20 мая 2019

В руководстве по стилю Makefile упоминается, что "Никакие файловые цели не должны быть предпосылками .PHONY."

Я предполагаю, что вы могли бы перефразировать это как "Не объявлять файловые цели PHONY"?

Чтобы выразить зависимости, для читателя-человека, а также для Make, я полагаю, вам иногда нужны файловые цели как предварительные условия для целей PHONY.Должны ли они быть целями только для заказов?Насколько я понимаю, в этом случае единственная разница между только для порядка и не в том, если они появляются в $ ^ или в $ |, так что это, вероятно, зависит от того, какое поведение вы хотите в этом отношении, соответственно, какую зависимость вы хотитечтобы выразить.

Я прав здесь?(Если для одного или другого нет четкого обоснования,) есть ли какие-либо причины для выбора одного над другим (только для заказа или нет)?

1 Ответ

2 голосов
/ 20 мая 2019

Я полагаю, что иногда вам необходимо, чтобы файловые цели были предпосылками для целей PHONY

Большую часть времени, на самом деле. Считайте, что «стандартные» вещи:

.PHONY: all
all: myprog other_stuff
myprog: $(OBJECTS)
    ...

Но «Не объявлять файловые цели PHONY / Никакие файловые цели не должны быть предпосылками .PHONY» - это совсем другое. Это означает, что .PHONY: myprog плохо и его следует избегать. Причина в том, что (1) он безусловно запускает восстановление myprog, что ненормально; (2) это может ввести человека в заблуждение, что myprog "не файл".

Если вам нужно принудительно восстановить myprog, как только вы сделаете make -B myprog. Если его действительно нужно перестраивать при каждом запуске, вы можете сделать:

myprog: $(OBJECTS) FORCE
    ...
FORCE:;

Или что-то в этом роде.

Насколько я понимаю, в этом случае единственная разница между только для заказа и не в том, если они появляются в $ ^ или в $ |

Предпосылки только для заказа редко используются расширения GNU. Нет необходимости вставлять их, чтобы показать, что «фальшивые вещи» на левой стороне будут перестроены в любом случае. Так что никто никогда не пишет all: | myprog, хотя это будет работать так же хорошо, как all: myprog.

...