.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

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.


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 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.