Suprimir eco de chamada de comando no makefile?

147

Eu escrevi um programa para uma tarefa que deveria imprimir sua saída em stdout. A especificação de atribuição requer a criação de um Makefile que, quando invocado, make run > outputFiledeve executar o programa e gravar a saída em um arquivo, com uma impressão digital SHA1 idêntica à fornecida na especificação.

Meu problema é que meu makefile:

...
run:
     java myprogram

também imprime o comando que executa o meu programa (por exemplo, java myprogram) no arquivo de saída, para que meu arquivo inclua essa linha extra, causando a impressão digital incorreta.

Existe alguma maneira de executar um comando sem a chamada de comando ecoar na linha de comando?

noobler
fonte

Respostas:

247

Adicione @ao início do comando para informar ao gmake para não imprimir o comando que está sendo executado. Como isso:

run:
     @java myprogram

Como Oli sugeriu, esse é um recurso do Make e não do Bash.

Por outro lado, o Bash nunca fará eco dos comandos que estão sendo executados, a menos que você o faça explicitamente (por exemplo, com a -xopção).


fonte
6
+1. Mas apenas para esclarecer a confusão do OP, talvez valha a pena esclarecer que esse é um recurso do Make, não do Bash.
26768 Oliver Oliverworth
1
@ OliCharlesworth: faz sentido, acrescentou isso. Obrigado.
Existe uma maneira de desativar todos os ecos? Ou desativá-lo para uma seção e voltar mais tarde?
Benubird
2
@Benubird make -sfaz isso, e IMHO é uma solução muito melhor aqui de qualquer maneira. Foi postado recentemente como uma resposta separada para esta pergunta.
Tripleee
1
Isso não funciona para um se ... então declaração :( alguma idéia?
user1623521
74

Ainda mais simples, use make -s(modo silencioso)!

user3619296
fonte
3
Voto a favor: Essa deve realmente ser a resposta aceita aqui. A pulverização de seu Makefile com @comandos dificulta a depuração e adiciona muita confusão.
Tripleee
11
Concordo que este é o caminho a percorrer - mas observe que, na descrição original do problema, não seria eu quem invocaria o meu instrutor. Portanto, eu não teria controle sobre os sinalizadores transmitidos. Eu precisava controlar a saída de dentro do makefile. Upvote para a solução mais prática no mundo real.
noobler
6
Você pode controlar isso sozinho, usando o .SILENT:alvo. Veja make.mad-scientist.net/managing-recipe-echoing
MadScientist
Na verdade, se você tiver avisos como -Wallele ainda os imprime. Claro, por que você usaria -sse também deseja ver avisos?
User81862311
33

Você também pode usar .SILENT

.SILENT: run
hi:
     echo "Hola!"
run:
     java myprogram

Nesse caso, make hio comando make runresultará , mas não será gerado.

Kien Pham
fonte
1

O efeito de preceder o comando com um @pode ser estendido para uma seção estendendo o comando usando uma barra invertida à direita na linha. Se um .PHONYcomando é desejado para suprimir a saída, pode-se iniciar a seção com:

@printf "..."
Wiley
fonte