2010-11-20 25 views
1

J'écris un script shell qui itère sur un ensemble de variables, édite un fichier source ligne par ligne en fonction de la valeur d'itération courante, puis refait, et enfin appelle le juste binaire compilé. Après l'exécution, l'ancienne ligne est restaurée.Appeler make à partir d'un script bash ne fera pas

Voici un extrait:

#!/bin/sh 
for i in 0..4; do 
    perl -i -pe "s/.*/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
    make 
    ./bin/myTool 
    perl -i -pe "s/.*/\/\/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
done 

Fondamentalement, j'ai environ 10 mutuellement exclusifs #define dans un fichier source C++, et j'expérimente les effets de chacun. Puisque je suis fainéant, j'aimerais en faire un processus automatisé, et je me suis retrouvé ici.

Parfois, il arrive que le shell dit:

`make: Nothing to be done for 'all'` 

Maintenant, j'ai essayé de diff le fichier avant et après chaque instruction perl et les fichiers ne semble correct ... Je ne peux pas comprendre pourquoi cela se produit et comment le faire se comporter correctement.

Une idée?

Merci d'avance.

+0

Correction, et l'erreur était complètement à moi. J'ai ajouté l'instruction 'sleep' mais certainement au mauvais endroit ... juste le mettre au début de la boucle (comme indiqué correctement dans les réponses) et tout s'est bien passé. Merci! – Daniele

+0

Dernière version du script: au lieu de m'endormir, j'ai préféré 'touch -t 1010101010 $ {SOURCE} $ {OBJECT} '... Moins de temps perdu! :) – Daniele

Répondre

2

Il est probablement bouclé trop rapidement pour faire dire à chaque itération. Retirez les produits make ou ajoutez un délai de 2 secondes au début ou à la fin de la boucle.

+0

J'ai essayé les deux façons, mais aucune ne fonctionne correctement. D'abord je mets un 'touch $ {SOURCE}' juste avant 'make' mais rien de notable ne change; 'make clean && make' semble fonctionner mais je ne veux pas croire que tout doit être reconstruit à chaque fois. J'ai aussi essayé de supprimer seulement le '.o' mais toujours pas de nouvelles. Un 'sommeil 3s 'ne fera toujours pas le travail. Il semble juste que chaque ligne soit lancée dans son propre thread, d'où un tel comportement asynchrone (oh, j'ai essayé d'attendre sans succès). – Daniele

1

Effectuez uniquement des vérifications si l'horodatage cible est plus récent que l'horodatage source. C'est la seule façon de savoir ce qui doit être mis à jour. Donc, si vous bouclez les itérations en moins d'une seconde, alors vous ne saurez pas que quelque chose a changé.

Vous pouvez soit nettoyer à la fin de chaque itération ou ajouter un retard comme l'a noté Ignacio Vazquez-Abrams.