¿Cómo hacer que GNU make pruebe explícitamente el fallo?


Después de años de no usar make, me encuentro necesitando de nuevo, la versión gnu ahora. Estoy bastante seguro de que debería ser capaz de hacer lo que quiero, pero no he descubierto cómo, o encontrado una respuesta con Google, etc.

Estoy tratando de crear un objetivo de prueba que ejecutará mi programa varias veces, guardando los resultados en un archivo de registro. Algunas pruebas deberían hacer que mi programa abortara. Desafortunadamente, mi makefile 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, haga salidas después de la ejecución bad_input1, nunca llegando a la ejecución bad_input2.

Author: JBRWilkinson, 2010-02-03

3 answers

La solución adecuada si desea requerir que el objetivo falle 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, es un error tener éxito en esos dos casos.

 16
Author: tripleee,
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
2014-02-21 13:24:28

Ponga un - antes del comando, por ejemplo:

-myProg bad_input >> test.log

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

 120
Author: ,
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
2010-02-02 22:53:15

Intenta ejecutarlo como

make -i

O

make --ignore-errors

Que ignora todos los errores en todas las reglas.

También sugeriría ejecutarlo como

make -i 2>&1 | tee results

Para que tengas todos los errores y la salida para ver qué pasó.

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 anteriores para que pueda usar los artefactos de esos comandos como requisitos previos para que los comandos se ejecuten más adelante.

POR cierto, yo altamenterecomiendo obtener una copia de el libro de O'Reilly sobre make. La primera edición tiene una excelente visión general de la naturaleza básica de make, 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 realmente está sucediendo. De hecho, mi propia copia es la primera cosa que paso a la gente que viene a mí para preguntar " WTF? preguntas " acerca de make! (-:

 30
Author: Rob Wells,
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
2014-03-25 09:20:56