2008-10-20 8 views
5

tengo un Makefile la construcción de muchos archivos de C con largas líneas de largo de mando y hemos limpiado la salida por tener reglas como:conseguir la tranquilidad hacen eco de las líneas de comando en caso de error

.c${MT}.doj: 

     @echo "Compiling $<";\ 
     $(COMPILER) $(COPTS) -c -o [email protected] $< 

Ahora bien, este es un gran como @ suprime la línea de compilación que se está emitiendo. Pero cuando recibimos un error, todo lo que obtenemos es el mensaje de error, no hay línea de comando. ¿Alguien puede pensar en una forma "ordenada" de emitir la línea de comando? Todo lo que puedo pensar es hacer eco de un archivo y tener un nivel superior para detectar el error y cat el archivo. Hacky, lo sé.

Respuesta

7

probado y funcionó (GNU make en Linux):

.c${MT}.doj: 
    @echo "Compiling $<";\ 
      $(COMPILER) $(COPTS) -c -o [email protected] $< \ 
      || echo "Error in command: $(COMPILER) $(COPTS) -c -o [email protected] $<" \ 
      && false 
+2

Tenga en cuenta que de esta manera ya no se da cuenta de que el comando falló y continuará como si tuviera éxito. Tal vez pueda agregar un "&& false" al final para compensar esto. – mweerden

+0

Necesitaba agregar corchetes como: @echo ...; compilar ... || (echo ... && falso) –

0

Una solución sencilla sería utilizar un script sencillo abc como la siguiente:

#!/bin/bash 

[email protected] 
code=$? 
if ((code)); then 
    echo error running [email protected] 
fi 
exit $code 

A continuación, puede escribir abc $(COMPILER) $(COPTS) -c -o [email protected] $< en su Makefile. Tenga en cuenta que esto no funciona cuando tiene pipes o redirects (ya que se aplicarán a abc en lugar del comando que desea ejecutar).

También puede simplemente poner un código similar directamente en el Makefile si es preferible.

0

Recientemente utilicé una utilidad llamada logtext para rastrear qué salida se produjo durante el curso de ejecución de un archivo bat. Compruébelo, puede encontrarlo bastante útil si quiere saber qué error ocurrió.

7

Esta pregunta es bastante viejo, pero para aquellos de ustedes buscar en Google, creo que lo que voy a hacer en esta situación es el alias make-make -s (modo silencioso) en mi concha, y sólo poner el prefijo @ antes de líneas donde echo u otros comandos de diagnóstico están siendo invocados. Cuando deseo la salida completa de make, anularé mi alias llamándolo como \make.

También tenga en cuenta que en esta situación tendrá que hacer lo típico y poner el @echo en su propia línea, con los comandos de la regla real en líneas separadas y sin @.

Cuestiones relacionadas