.PHONY всі правила в GNU створюють файл?


18

Чи помиляюсь у своєму трактуванні, що в основному я повинен просто поставити на перше місце, перш ніж всі правила:

.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

Відповіді:


24

Посібник зі стилю Makefile Кларка Грубба рекомендує:

  • Усі фальшиві цілі повинні бути оголошені, зробивши їх передумовами .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 у файлі gnu makefile?"

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


1
відмінна частка в путівнику стилів. Дякую.
тарабайт

2

Я думаю, що це доцільно дотримуватися, але фрагментувати його та розміщувати фрагменти навіть після того, як рецепти повного правила також працюють на моєму гмаке (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.