2009-06-21 15 views
5

¿Qué debo hacer para verificar si gcc ha tenido éxito en la compilación de un programa, ha fallado o si ha tenido éxito pero con una advertencia?¿Cómo comprobar si gcc ha fallado, ha devuelto una advertencia o ha tenido éxito? (en bash)

#!/bin/sh 

string=$(gcc helloworld.c -o helloworld) 

if [ string -n ]; then 
    echo "Failure" 
else 
    echo "Success!" 
fi 

Esto solo comprueba si ha tenido éxito o ha fallado o ha sido compilado con advertencias.

-n significa "no es nulo".

Gracias!

EDIT Si no está claro, esto no está funcionando.

+0

Otra razón por la que no puede funcionar: la sintaxis correcta es '[-n "$ cadena"] '. – ephemient

+3

Tenga en cuenta que gcc devolverá un código de salida de 0 incluso cuando se presenten advertencias. – dtmland

Respuesta

15
if gcc helloworld.c -o helloworld; then 
echo "Success!"; 
else 
echo "Failure"; 
fi 

Desea que bash pruebe el código de retorno, no el resultado. Su código captura stdout, pero ignora el valor devuelto por GCC (es decir, el valor devuelto por main()).

+2

Alternativamente, ejecute gcc en una línea de script de shell separada, luego pruebe $ ?. –

19

Su condición debe ser:

if [ $? -ne 0 ] 

GCC volverá a cero en caso de éxito, o alguna otra cosa en caso de fallo. Esa línea dice "si el último comando arrojó algo distinto de cero".

11

Para saber la diferencia entre compilar completamente limpio y compilar con errores, compila primero normalmente y prueba $ ?. Si no es cero, compilación fallida. A continuación, compile con la opción -Werror (las advertencias se tratan como errores). Prueba $? - si es 0, se compiló sin advertencias. Si no es cero, se compiló con advertencias.

Ex:

gcc -Wall -o foo foo.c 
if [ $? -ne 0 ] 
then 
    echo "Compile failed!" 
    exit 1 
fi 

gcc -Wall -Werror -o foo foo.c 
if [ $? -ne 0 ] 
then 
    echo "Compile succeeded, but with warnings" 
    exit 2 
else 
    echo "Compile succeeded without warnings" 
fi 
+0

Este forzado bruto incluye dos compilaciones. Si realmente quieres ir de esa manera, la segunda ejecución debe incluir '-fsyntax-only' (no habrá nada más que analizar el código completo). En cualquier caso, la opción de verificar adicionalmente la salida 'gcc's (almacenar su stdout en un archivo temporal y grep para' arning' [la w puede estar en mayúsculas o no]) es probablemente la mejor solución. –

Cuestiones relacionadas