.PHONY todas las reglas en GNU hacen archivo?


17

¿Estoy equivocado en mi interpretación de que básicamente debería poner primero antes de que todas establezcan reglas:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

¿Hay algún caso en el que no quieras seguir esta 'fórmula'?

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

Respuestas:


23

La guía de estilo Makefile de Clark Grubb recomienda que:

  • Todos los objetivos falsos deben declararse haciéndolos requisitos previos de .PHONY.
  • agregue cada objetivo falso como prerrequisito de .PHONY inmediatamente antes de la declaración del objetivo, en lugar de enumerar todos los objetivos falsos en un solo lugar.
  • Ningún objetivo de archivo debe ser un requisito previo de .PHONY.
  • los objetivos falsos no deben ser requisitos previos de los objetivos de archivo.

Para su ejemplo, esto significaría:

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

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

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

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

Se PHONYpermiten múltiples objetivos; vea también esta pregunta de desbordamiento de pila: "¿Es posible tener múltiples objetivos .PHONY en un archivo make de GNU?"

Además, aunque esto no se menciona directamente en su pregunta, se debe tener cuidado de no tener un PHONYobjetivo con el mismo nombre de una entrada real o archivos intermedios en su proyecto. Por ejemplo, si su proyecto hipotéticamente tenía un archivo de código fuente llamado rules(sin sufijo), la inclusión de esa cadena en un PHONYdestino podría romper el makecomportamiento esperado .


1
Excelente participación en la guía de estilo. gracias.
tarabyte

2

Creo que es una buena práctica seguirlo, pero fragmentarlo y poner los fragmentos incluso después de las recetas de reglas completas también funciona en mi gmake (3.81):

P.ej:

#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 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.