¿Suprimir e ignorar la salida para Makefile?


Sé que el prefijo @ suprime la salida de un comando de shell en Makefiles, y también que el prefijo - ignorará los errores de un comando de shell. ¿Hay una manera de combinar los dos, es decir, un prefijo que suprime la salida e ignora los errores? No creo que @- o -@ funcione.

Author: Andrew Lee, 2012-08-08

2 answers

En realidad, @- y -@ ambos funcionan, pero imprimirán una advertencia make: [target] Error 1 (ignored).

En su lugar, puede usar

@command || true

O, puesto que : es la abreviatura de true en shell,

@command ||:

Esto a menudo es mejor, porque evita la confusa advertencia de Make de que un error fue ignorado en un comando invisible.

Considere los dos casos más comunes en los que podría querer ignorar el valor devuelto de un comando:

  1. Parte de la construcción está rota y quieres continuar de todos modos, en cuyo caso tienes algo de aprendizaje que hacer. La construcción está rota y necesita ser reparada, no vendada de una manera inalcanzable.
  2. Un comando devuelve un código de salida distinto de cero a pesar de que hizo exactamente lo que quería, en cuyo caso realmente no desea que Make emita una advertencia.

Para el segundo caso, considere el ejemplo de greping para advertencias en el archivo de registro producido por un comando. grep devolverá un error si no encuentra un partido, que no es lo que quieres:

.PHONY: all one two three

all: at-warning at-success or-success or-warning

at-%: %.log
    @echo Making $@
    @-grep ^Warning $<

or-%: %.log
    @echo Making $@
    @grep ^Warning $< ||:

success.log:
    echo 'Success!' > $@

warning.log:
    echo 'Warning: foo' > $@

clean::
    rm -f {success,warning.log}

Produce:

echo 'Warning: foo' > warning.log
Making at-warning
Warning: foo
Making at-success
make: [at-success] Error 1 (ignored)
Making or-success
Making or-warning
Warning: foo

Usando @- produce una advertencia de error ignorada sin sentido cuando hay éxito, mientras que || true maneja tanto las advertencias como la ausencia de advertencias sin queja.

Teóricamente usar || true es más lento que usar @-, pero es poco probable que esta sobrecarga sea un cuello de botella en sistemas de construcción bien diseñados y mantenidos. La gran mayoría del tiempo se debe pasar construyendo, o comprobando marcas de tiempo cuando no hay nada que construir, no en la ejecución de los miles de comandos rápidos cuyos valores de retorno todos se ignoran que sería necesario para que esto tenga un impacto medible en el rendimiento.

 46
Author: andrewdotn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-21 15:10:17

GNU make le permite combinar @ y -:

all:
        @-exit 1

Ejecutar esto con gmake 3.81 produce esta salida:

Gmake: [todos] Error 1 (ignorado)

Como puede ver, el comando no se repite, y el error se ignora como se esperaba.

 8
Author: Eric Melski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-08 20:33:06