.PHONY все правила в GNU делают файл?


17

Я ошибаюсь в своей интерпретации, что я должен просто поставить первым, прежде чем все делать правила:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

Был ли случай, когда вы не хотели бы следовать этой «формуле»?

http://www.gnu.org/software/make/manual/make.html#Phony-Targets

Ответы:


23

Руководство по стилю Makefile от Clark Grubb рекомендует:

  • Все фальшивые цели должны быть объявлены, сделав их предпосылками .PHONY.
  • добавьте каждую фальшивую цель в качестве предварительного условия .PHONY непосредственно перед объявлением цели, а не перечисляйте все фальшивые цели в одном месте.
  • Целевые файлы не должны быть предпосылками .PHONY.
  • фиктивные цели не должны быть предпосылками файловых целей.

Для вашего примера это будет означать:

.PHONY: all
all:
    echo "Executing all ..."

.PHONY: of
of:
    echo "Executing of ..."

.PHONY: my
my:
    echo "Executing my ..."

.PHONY: rules
rules:
    echo "Executing rules ..."

PHONYДопускается несколько целей; см. также этот вопрос переполнения стека: «Возможно ли иметь несколько целей .PHONY в make-файле GNU?»

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


1
Отличная акция по стилю руководства. Спасибо.
Тарабайт

2

Я думаю, что это хорошая практика, которой нужно следовать, но фрагментация и размещение фрагментов даже после того, как полный рецепт правил тоже работает на моем gmake (3.81):

Например:

#Makefile
all:
   @echo hello world
.PHONY: all

CMD:

$ touch all
$ make all    #this would be a no-op if all weren't a phoney target
  hello world 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.