2009-06-21 7 views
5

Comment vérifier si gcc a réussi à compiler un programme, a échoué ou réussi mais avec un avertissement?Comment vérifier si gcc a échoué, a renvoyé un avertissement ou réussi? (dans bash)

#!/bin/sh 

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

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

Ceci vérifie seulement s'il a réussi ou (échoué ou compilé avec des avertissements).

-n signifie "n'est pas nul".

Merci!

EDIT Si ce n'est pas clair, cela ne fonctionne pas.

+0

Une autre raison pour laquelle cela ne peut pas fonctionner: la syntaxe correcte est '[-n "$ string"]'. – ephemient

+3

Notez que gcc retournera un code de sortie de 0 même lorsque des avertissements sont présentés. – dtmland

Répondre

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

Vous souhaitez que bash teste le code retour, pas la sortie. Votre code capture stdout, mais ignore la valeur renvoyée par GCC (c'est-à-dire la valeur renvoyée par main()).

+2

Vous pouvez également exécuter gcc dans une ligne de script shell distincte, puis tester $ ?. –

19

Votre condition doit être:

if [ $? -ne 0 ] 

GCC retournera zéro en cas de succès, ou quelque chose d'autre en cas d'échec. Cette ligne dit "si la dernière commande a renvoyé autre chose que zéro".

11

Pour faire la différence entre compiler complètement proprement et compiler avec des erreurs, d'abord compiler normalement et tester $ ?. Si non nul, la compilation a échoué. Ensuite, compilez avec l'option -Werror (les avertissements sont traités comme des erreurs). Testez $? - si 0, il compilé sans avertissements. Si non nul, il compilé avec des avertissements.

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

Ce forçage brut comprend deux compilations. Si vous voulez vraiment aller de cette façon, la deuxième exécution devrait inclure '-fsyntax-only' (il n'y aura rien de plus que l'analyse du code complet). Dans tous les cas, l'option de vérification supplémentaire de la sortie 'gcc's (stocker sa sortie standard dans un fichier temporaire et grep pour' arning' [le w peut être en majuscule ou pas]) est probablement la meilleure solution. –

Questions connexes