2010-09-03 5 views
3

Voici un Makefile squelette juste pour le rendre plus facile à décrire le problème:Une cible Makefile peut-elle invoquer des commandes même en cas d'échec d'une condition préalable?

all_tests : unit_tests other_tests_1 other_tests_2 ... other_tests_N 

unit_tests : set1_summary.txt set2_summary.txt ... setN_summary.txt 

%_summary.txt : %_details.txt 
    perl createSummary.pl --in $^ -out [email protected] 

%_details.txt : test_harness 
    ./test_harness --test-set $* 

J'ai donc un coureur de test qui produit un fichier avec des résultats détaillés, puis un mécanisme de filtrage pour créer un fichier de synthèse. Maintenant, l'application du programme d'exécution de test renvoie un code d'erreur si l'un des éléments de l'ensemble de tests échoue, ce qui annulera correctement la cible "all_tests" et n'invoquera jamais les cibles other_test. Cependant, je voudrais exécuter les détails -> transformation inconditionnelle inconditionnellement, puisque cela est pertinent même pour un essai échoué. J'ai essayé différentes variantes, mais la seule méthode que j'ai pu utiliser était de placer toute la chaîne de commande dans un script Perl, en stockant le résultat de la première commande et en l'utilisant comme valeur de retour pour l'ensemble du script. Mais cela ne semble pas être une très bonne solution, d'autant plus que le jeu de commandes "réel" est un peu plus complexe que ce que montre ce squelette. Connaissez-vous une méthode basée purement GNU Make pour accomplir cela?

Répondre

2

Vous pourriez avoir une règle spéciale qui invoque faire récursive deux fois, comme ceci:

.PHONY: test 
test : 
    make all_tests ; make summary 

Le seul inconvénient est que l'état de sortie du processus haut de marque ne sera plus indiquer le succès/échec des tests, mais vous pourriez même corriger cela si vous vouliez par un peu de script supplémentaire en utilisant le $? shell shell.

+3

Je pense 'make all_tests; STATUS = $ ?; faire un résumé; exit $ STATUS' pourrait faire ce que vous voulez. –

4

Vous pourriez dire que c'est bon pour le test_harness pour retourner non-zéro, en ajoutant un - à la commande (voir the manual). Si vous faites cela, make ne considérera pas que la cible "détails" a échoué, donc continuera à faire l'étape "résumé".

On peut supposer que createSummary.pl peut dire si les tests ont échoué en regardant les fichiers "détails" générés. Si vous souhaitez générer une erreur de fabrication en cas d'échec d'un test, vous pouvez renvoyer createSummary.pl non nul si l'erreur est détectée.

Questions connexes