2010-10-05 12 views

Respuesta

16

Hacer una variable que tiene un valor predeterminado de @:

AT := @ 

y luego usar eso en su Makefile:

foo: 
    $(AT)fooc -o [email protected] 

A continuación, ejecute make como make AT=. Puede obtener más elegante que eso, si te gusta:

V := 0 
AT_0 := @ 
AT_1 := 
AT = $(AT_$(V)) 

Esto hará que los comandos de voz, a menos V se establece en 1 (por ejemplo, make V=1). Esto utiliza la característica no POSIX, pero común de la expansión de variables recursivas.

+0

También puede usar ': =' en lugar de '=' para la línea 'AT ='. No puedo recordar –

+0

+1 para el truco genial –

2

En GNU Make, esto no es posible de la caja. Tener un Makefile que no puede configurarse completamente en silencio es simplemente una mala práctica. Quitar los signos @ y ejecutar con -s es la forma más fácil de obtener una compilación silenciosa (excepto posibles comandos echo).

+0

Es posible (y fácil) crear un archivo Makefile con un nivel de detalle configurable. El kernel de Linux hace esto, al igual que 'automake'-generated' Makefile's con 'AM_SILENT_RULES'. –

+0

Buen truco y una respuesta merecidamente aceptada, pero mis comentarios son válidos. –

+0

Es cierto. Si haces alguna edición trivial, eliminaré mi voto downvote. –

7

Usted puede tener maquillaje decirle a otra persona para imprimir las órdenes medida que se ejecutan, lo que es lo mismo:

make SHELL='/bin/sh -x' ...your make arguments... 

Sin embargo, esto no funcionará tan bien si su archivo MAKE contiene fragmentos de secuencias de comandos shell como recetas, en lugar de secuencias de comandos simples separados, ya que verá los comandos de shell individuales a medida que se encuentran en lugar de los fragmentos completos a medida que se invocan.

Alternativamente, podría aprovechar la naturaleza de software libre de GNU Make y modificar su propia versión que ignora los signos @. Grepping el código fuente de GNU Make para COMMANDS_SILENT pronto le muestran que es suficiente añadir 1 || a la condición ?: en los argumentos de la llamada en message()start_job_command() en job.c. ¡Trabajo hecho!

+0

+1 por la voluntad de sumergirse en la fuente. El software libre es genial así. –

2

sacar a todos los @ y añadir esta línea al Makefile:

.SILENT:

Cuando desea depurar, comente la línea .SILENT.

+0

también es una buena idea. +1 –

0

Desactivar el @ delante de un script make es útil; sin embargo, a veces es demasiado ruidoso cuando el script make es muy largo. Otra técnica de depuración es activar una función de shell que emita comandos justo antes de que se ejecuten. Esto obvia la necesidad de manipular @ o .SILENT. Consideremos un ejemplo Makefile:

Ésta es probable que no portátil ya que depende de las características presentes en la cáscara que se ejecuta la secuencia de comandos, pero la portabilidad no es realmente tan importante para la depuración (si funciona para usted).

0

Para que las cosas sean aún más configurables, permita un interruptor de marca para permitir la verbosidad. Es el modo predeterminado de normal a silencioso. Sólo con el modo de VERBOSE -e = 1 será detallado por supuesto:

## 
# Verbose ENABLE/DISABLE 
# invoke make -e VERBOSE=1 
## 
[email protected] 
ifeq ($(VERBOSE),1) 
    V= 
endif 

all: 
    $(V)echo test 
    echo test 

Gracias por este tema era de gran ayuda para mi trabajo.

Cuestiones relacionadas