2010-02-02 9 views
62

Después de años de no usar make, me encuentro necesitado de nuevo, la versión de gnu ahora. Estoy bastante seguro de que debería poder hacer lo que quiero, pero no he descubierto cómo, o encontré una respuesta con Google, etc.¿Cómo hacer que GNU haga una prueba explícita de falla?

Estoy intentando crear un objetivo de prueba que ejecutará mi programa varias veces, guardando los resultados en un archivo de registro. Algunas pruebas deberían hacer abortar mi programa. Lamentablemente, mi archivo MAKE aborta en la primera prueba que conduce a un error. Tengo algo como:

# Makefile 
# 
test: 
     myProg -h > test.log    # Display help 
     myProg good_input >> test.log  # should run fine 
     myProg bad_input1 >> test.log  # Error 1 
     myProg bad_input2 >> test.log  # Error 2 

Con lo anterior, que se cierra después de la carrera bad_input1, sin llegar a la carrera bad_input2.

+0

Make. no se adapta bien a esto. Puede encontrarse con una serie de problemas que incluyen: 'in | a | hilo | secuencia', el último determina el código de salida;' a; más; implicado; receta; línea; 'sufre del El mismo problema, sin pasar por muchos obstáculos, ejecutar lo mismo repetidamente con diferentes parámetros puede ser molesto para el script. Por lo general, he optado por escribir mis pruebas, luego, si es necesario, usarlo desde una computadora kefile –

+0

Como alternativa ['set -e'] (http://stackoverflow.com/questions/3474526/stop-on-first-error) en bash puede hacer posible que se produzca un error cuando falla un comando, similar a hacer líneas de receta . –

Respuesta

16

La solución adecuada si desea exigir que el objetivo de fracasar es negar su código de salida

# Makefile 
# 
test: 
    myProg -h > test.log    # Display help 
    myProg good_input >> test.log  # should run fine 
    ! myProg bad_input1 >> test.log  # Error 1 
    ! myProg bad_input2 >> test.log  # Error 2 

Ahora bien, es un error para tener éxito en estos dos casos

+1

Voy a señalar con retraso que la palabra clave '!' Puede no estar disponible si su shell no es Bash. – tripleee

120

Ponga una - antes del comando, por ejemplo .:

-myProg bad_input >> test.log 

GNU make luego ignorar el código de salida del proceso.

+1

Sí, pero eso desafía el uso de 'make test' en un script que, si falla, ¡significa que las pruebas no pasan! –

+6

Aunque esto no responde a la pregunta real, responde la pregunta que parece ser solo leyendo el título, por lo que tiene tantos votos ascendentes. – LukeGT

+1

@LukeGT: Parte de la razón por la que esto tiene tantos más votos que la respuesta de Tripleee es que fue la respuesta seleccionada durante 4 años antes de que tripleee proporcionara una mejor respuesta. – GreenMatt

30

intenta ejecutarlo como

make -i 

o

make --ignore-errors 

que ignora todos los errores en todos los reglas.

También me gustaría sugerir ejecutarlo como

make -i 2>&1 | tee results 

por lo que tienes todos los errores y la salida a ver qué pasaba.

Simplemente continuar ciegamente después de un error probablemente no sea lo que realmente quieres hacer. La utilidad make, por su propia naturaleza, generalmente se basa en la finalización exitosa de comandos previos para que pueda usar los artefactos de esos comandos como prerrequisitos para que los comandos se ejecuten más adelante.

BTW Me gustaría altamente recomendamos obtener una copia de the O'Reilly book on make. La primera edición tiene una excelente visión general de la naturaleza básica de la marca, específicamente su comportamiento de encadenamiento hacia atrás. Las ediciones posteriores siguen siendo buenas, pero la primera ed. todavía tiene la explicación más clara de lo que está sucediendo realmente. De hecho, mi propia copia es lo primero que le paso a las personas que acuden a mí para preguntar "¡preguntas WTF!" Sobre la marca. (-:.

+1

Esto funcionó bien. Gracias por la respuesta. – GreenMatt

Cuestiones relacionadas