2012-02-16 18 views
11

Estoy usando un makefile para compilar un programa compuesto por muchos archivos .c, y cada vez que se invoca make, solo compila los archivos modificados después de la última ejecución (nada especial hasta aquí).Controlando la verbosidad de make

Para evitar saturar mi pantalla, precribo @ al comienzo de cada llamada $(CC), y antes de que imprima un mensaje personalizado echo. Por ejemplo:

%.o: %.c $(h1) $(h3) %.h 
    @echo -e "\tCompiling <" $< 
    @$(CC) $(CFLAGS) -c $< -o $(libDir)[email protected]$(MATHOPTS) 

Mi pregunta es: ¿Cómo puedo controlar el nivel de detalle de make de una manera "dinámica" más, con el fin de ser capaz de:

  1. El comportamiento normal: sólo el mensaje personalizado se imprime para cada regla de makefile ejecutada.
  2. Comportamiento detallado: imprima el comando ejecutado realmente por cada regla de los archivos MAKE (como si el @ no se hubiera utilizado en absoluto).

Respuesta

16

lo haría de la forma en que lo hace automake:

V = 0 
ACTUAL_CC := $(CC) 
CC_0 = @echo "Compiling $<..."; $(ACTUAL_CC) 
CC_1 = $(ACTUAL_CC) 
CC = $(CC_$(V)) 

%.o: %.c $(h1) $(h3) %.h 
     $(CC) $(CFLAGS) -c $< -o $(libDir)[email protected]$(MATHOPTS) 

Si necesita ejecutar otros comandos en sus reglas, me gusta el siguiente fragmento. Escriba $(AT) en lugar de @ y se silenciará cuando V=0 pero se imprima cuando V=1.

AT_0 := @ 
AT_1 := 
AT = $(AT_$(V)) 
+2

En su primera parte, supongo que también es necesario anular 'CC = $ (CC _ $ (V))'. –

+1

Sí. Su ausencia fue un pedo cerebral que arreglaré ahora. También debo señalar que la expansión de variables recursivas se implementa ampliamente, pero no actualmente en POSIX (pero eso cambiará en una futura revisión). –

+1

Gran solución @JackKelly. ¡El que crea la variable 'AT' es simple y efectivo !. –

4

Crearía una función que toma un comando para ejecutar y decide si hacer un eco.

# 'cmd' takes two arguments: 
# 1. The actual command to execute. 
# 2. Optional message to print instead of echoing the command 
#  if executing without 'V' flag. 
ifdef V 
cmd = $1 
else 
cmd = @$(if $(value 2),echo -e "$2";)$1 
endif 

%.o: %.c $(h1) $(h3) %.h 
    $(call cmd, \ 
     $(CC) $(CFLAGS) -c $< -o $(libDir)[email protected]$(MATHOPTS), \ 
     Compiling $<) 

A continuación, el resultado de la llanura make invocación será algo como:

Compiling foo.c 

Mientras make V=1 dará:

gcc -Wall -c foo.c -o foo.o ... 
+0

Gracias @Eldar! Su sugerencia es muy buena, pero la redefinición de la "@" propuesta por Jack es más simple. Por cierto, no sabía en absoluto que se podía definir una función de esa manera. –

+0

@ Nicolás, de nada! –

7

Otra solución (una que me gusta porque es flexibles)

ifeq ("$(BUILD_VERBOSE)","1") 
Q := 
vecho = @echo 
else 
Q := @ 
vecho = @true 
endif 

%.o: %.c 
    $(vecho) "-> Compiling [email protected]" 
    $(Q)$(CC) $(CFLAGS) -c $< -o [email protected] 

puede omitir el material Vecho, pero sí muy útil a veces.

+0

Solución brillante. – Benoit

3

Como no puedo comentar la sugerencia AT = $(AT_$(V)), tenga en cuenta que Automake proporciona una macro estándar que hace lo mismo que AT, que se llama AM_V_at.

También encontrará que tiene otra variable muy útil AM_V_GEN, que se resuelve o bien a @echo " GEN " [email protected];, dependiendo de la verbosidad.

Esto le permite codificar algo como esto:

grldr.mbr: mbrstart 
    $(AM_V_GEN) 
    $(AM_V_at)-rm -f grldr.mbr 
    $(AM_V_at)cat mbrstart > grldr.mbr 

La salida de la cual será o bien (verbosidad activada):

GEN grldr.mbr 

o (habilitado verbosidad):

rm -f grldr.mbr 
cat mbrstart > grldr.mbr 

Muy conveniente, y esto elimina la necesidad de definir sus propias macros.

+0

¡Este es el camino a seguir! – rockdaboot

4

En lugar de usar "@gcc" para compilar, puede omitir esa "@" y pasar la opción "-s" a su comando make. (Deje "@echo" tal como está). Luego "make -s" sería su comando breve, y "make" sería verboso.

El distintivo '-s' o '--silent' que se va a crear impide que se repitan todos los ecos, como si todas las recetas comenzaran con '@'. (Respuesta El otro responde mejor a su pregunta, pero este enfoque merece una mención.)

From the GNU Make manual pages

Cuestiones relacionadas