2016-01-21 3 views
2

Je veux chronométrer l'exécution d'une règle make, mais j'ai du mal à obtenir des heures de début et de fin valides, ainsi que le calcul de l'arithmétique simple (soustraction).Comment chronométrer l'exécution d'une règle gnu make?

$ make money 
sleep 2 
echo "money: 1453412887" > logfile 
echo "money: 1453412887" >> logfile 
echo "money: 1453412887" >> logfile 

En Makefile:

money: 
     $(eval start := $(shell date +%s)) 
     sleep 2 
     $(eval end := $(shell date +%s)) 
     echo "[email protected]: ${start}" > logfile 
     echo "[email protected]: ${end}" >> logfile 
     echo "[email protected]: $(shell date +%s)" >> logfile 

Répondre

2

La réponse d'Eric est bonne, si vous cherchez à suivre l'heure pour une cible. Bien qu'il n'y ait aucune raison de définir une variable séparée; il est plus simple de faire écho à la sortie de la commande. Aussi, si vous utilisez backquotes old school à la place du nouveau format $(...) pour commandes shell, il peut être plus facile à lire dans une recette de makefile:

test: 
     echo [email protected]: `date +%s` > test.log 
     @sleep 2 
     echo [email protected]: `date +%s` >> test.log 

La raison pour laquelle votre tentative ne fonctionne pas est que faire évaluera tous lignes de la recette avant de commencer la première ligne. Ainsi, toutes les variables de make et les fonctions comme eval, shell, etc. dans la recette entière sont toutes développées en avant, avant que n'importe quelle partie de la recette commence. Ainsi, les résultats de l'exécution de la commande date plusieurs fois seront toujours identiques.

Si vous essayez de chronométrer toutes vos commandes et que vous ne voulez pas modifier toutes les recettes pour conserver un journal, une autre option consiste à écrire un script ou un programme spécial qui prendra une ligne de commande en argument, puis exécutez cette commande dans un shell avec un timing. Ensuite, définissez la variable make SHELL pour utiliser ce script/programme au lieu du shell réel. Le faire fonctionner correctement sera un peu compliqué, si vous avez des recettes complexes (vous devez conserver toutes les citations, etc.). Il est plus facile d'écrire un petit programme C et d'utiliser fork/exec: pas de problème de citation. Mais, c'est la manière la plus fiable et la moins invasive de le faire.

2

S'il vous plaît essayer de suivre par exemple,

test: 
     @start=$$(date +%s); \ 
     echo [email protected]: $$start > test.log 
     @sleep 2 
     @end=$$(date +%s); \ 
     echo [email protected]: $$end >> test.log 

, un élément clé est, l'affectation des variables shell doit être dans la même ligne avec la commande echo.