2008-10-20 4 views
5

J'ai un Makefile construire de nombreux fichiers C avec de longues lignes de commandes à long et nous avons nettoyé la sortie en ayant des règles telles que:Obtenir calme Faire faire écho à des lignes de commande en cas d'erreur

.c${MT}.doj: 

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

Maintenant, ce qui est grand comme le @ supprime la ligne de compilation émise. Mais quand nous obtenons une erreur, tout ce que nous obtenons est le message d'erreur, pas de ligne de commande. Quelqu'un peut-il penser à un moyen «propre» d'émettre la ligne de commande? Tout ce que je peux penser à faire est de faire écho à un fichier et avoir un niveau plus élevé faire attraper l'erreur et chat le fichier. Hacky je sais.

Répondre

7

Testés et cela a fonctionné (GNU make sous Linux):

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

Notez que de cette façon ne faites plus remarquer que la commande a échoué et continuera comme si elle avait réussi. Peut-être que vous pouvez ajouter un "&& faux" à la fin pour compenser cela. – mweerden

+0

J'avais besoin d'ajouter des parenthèses comme: @echo ...; compiler ... || (echo ... && faux) –

0

Une solution simple serait d'utiliser un script simple abc comme ce qui suit:

#!/bin/bash 

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

Ensuite, vous pouvez écrire abc $(COMPILER) $(COPTS) -c -o [email protected] $< dans votre Makefile. Notez que cela ne fonctionne pas lorsque vous avez des tuyaux ou des redirections (car ils seront appliqués à abc au lieu de la commande que vous voulez exécuter).

Vous pouvez également mettre un code similaire directement dans le Makefile si cela est préférable.

0

J'ai récemment utilisé un utilitaire appelé logtext pour le suivi de la sortie qui s'est produite au cours d'un fichier bat en cours d'exécution. Check it out, vous pouvez trouver cela très utile si vous voulez savoir quelle erreur s'est produite où.

7

Cette question est assez vieux, mais pour ceux d'entre vous googler, je pense que je vais faire dans cette situation est alias make-make -s (mode silencieux) dans ma coquille, et seulement mettre le préfixe avant @ lignes où echo ou d'autres commandes de diagnostic sont invoquées. Lorsque je veux la sortie complète de make, je vais remplacer mon alias en l'appelant \make.

Notez également que dans cette situation, vous devrez effectuer une opération typique et placer le @echo sur sa propre ligne, avec les commandes de règles réelles sur des lignes distinctes et sans @.

Questions connexes