.PHONY wszystkie reguły w GNU tworzą plik?

18

Czy mylę się w mojej interpretacji, że powinienem po prostu postawić na pierwszym miejscu, zanim wszyscy zaczną tworzyć reguły:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

Czy zdarza się, że nie chcesz stosować się do tej „formuły”?

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

tarabajt
źródło

Odpowiedzi:

24

Przewodnik po stylu Makefile Clarka Grubba zaleca, aby:

  • Wszystkie fałszywe cele powinny być zadeklarowane poprzez uczynienie z nich wstępnych wymagań .PHONY.
  • dodaj każdy fałszywy cel jako warunek wstępny .PHONY bezpośrednio przed deklaracją celu, zamiast wymieniać wszystkie fałszywe cele w jednym miejscu.
  • Żaden obiekt docelowy pliku nie powinien być warunkiem wstępnym .PHONY.
  • fałszywe cele nie powinny być warunkiem wstępnym dla celów plików.

W twoim przykładzie oznaczałoby to:

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

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

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

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

PHONYDozwolonych jest wiele celów; zobacz także pytanie Przepełnienie stosu: „Czy można mieć wiele celów .PHONY w makefile GNU?”

Ponadto, chociaż nie jest to wymienione bezpośrednio w twoim pytaniu, musisz uważać, aby nie mieć PHONYcelu o takiej samej nazwie rzeczywistych plików wejściowych lub pośrednich w swoim projekcie. Na przykład, jeśli twój projekt hipotetycznie miał plik kodu źródłowego o nazwie rules(bez sufiksu), włączenie tego ciągu do obiektu PHONYdocelowego może przerwać oczekiwane makezachowanie.

bnewbold
źródło
1
doskonały udział w przewodniku po stylu. Dziękuję Ci.
tarabyte
2

Myślę, że dobrą praktyką jest przestrzeganie tego, ale fragmentowanie i umieszczanie fragmentów nawet po przepisaniu pełnych reguł działa również na moim gmake (3.81):

Na przykład:

#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 
PSkocik
źródło