.PHONY todas as regras no GNU make file?

16

Estou errado na minha interpretação de que basicamente devo colocar o primeiro antes de todos fazerem as regras:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

Existe um caso em que você não gostaria de seguir essa 'fórmula'?

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

tarabyte
fonte

Respostas:

23

O guia de estilo Makefile de Clark Grubb recomenda que:

  • Todos os alvos falsos devem ser declarados, tornando-os pré-requisitos de .PHONY.
  • adicione cada alvo falso como um pré-requisito de .PHONY imediatamente antes da declaração de destino, em vez de listar todos os destinos falsos em um único local.
  • Nenhum destino de arquivo deve ser um pré-requisito para .PHONY.
  • alvos falsos não devem ser pré-requisitos dos alvos de arquivos.

Para o seu exemplo, isso significaria:

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

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

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

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

Múltiplos PHONYalvos são permitidos; veja também a pergunta Stack Overflow: "É possível ter vários destinos .PHONY em um arquivo de criação do gnu?"

Além disso, embora isso não seja mencionado diretamente na sua pergunta, deve-se tomar cuidado para não ter um PHONYdestino com o mesmo nome de uma entrada real ou arquivos intermediários no seu projeto. Por exemplo, se o seu projeto hipoteticamente tivesse um arquivo de código-fonte chamado rules(sem sufixo), a inclusão dessa string em um PHONYdestino poderia interromper o makecomportamento esperado .

bnewbold
fonte
1
excelente participação no guia de estilo. obrigado.
tarabyte
2

Eu acho que é uma boa prática seguir, mas fragmentá-lo e colocar os fragmentos, mesmo depois que as receitas completas das regras também funcionarem no meu gmake (3.81):

Por exemplo:

#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
fonte