2009-01-16 10 views
21

Regardez ce fichier makefile, il a une sorte d'indication de progression primitive (aurait pu être une barre de progression).Indication de progression make/makefile!

S'il vous plaît donnez-moi des suggestions/commentaires à ce sujet!


 

# BUILD is initially undefined 
ifndef BUILD 

# max equals 256 x's 
sixteen := x x x x x x x x x x x x x x x x 
MAX := $(foreach x,$(sixteen),$(sixteen)) 

# T estimates how many targets we are building by replacing BUILD with a special string 
T := $(shell $(MAKE) -nrRf $(firstword $(MAKEFILE_LIST)) $(MAKECMDGOALS) \ 
      BUILD="COUNTTHIS" | grep -c "COUNTTHIS") 

# N is the number of pending targets in base 1, well in fact, base x :-) 
N := $(wordlist 1,$T,$(MAX)) 

# auto-decrementing counter that returns the number of pending targets in base 10 
counter = $(words $N)$(eval N := $(wordlist 2,$(words $N),$N)) 

# BUILD is now defined to show the progress, this also avoids redefining T in loop 
BUILD = @echo $(counter) of $(T) 
endif 

# dummy phony targets 

.PHONY: all clean 

all: target 
    @echo done 

clean: 
    @rm -f target *.c 

# dummy build rules 

target: a.c b.c c.c d.c e.c f.c g.c 
    @touch [email protected] 
    $(BUILD) 

%.c: 
    @touch [email protected] 
    $(BUILD) 


Toutes les suggestions sont les bienvenus!

+1

Astuce mignon, mais je ne peux pas le vouloir. –

+1

Je peux. Sur Gentoo ce serait bien. 'cmake' a un compteur intégré [fichiers x/n]. Mais un moyen d'avoir une barre de progression sans submerger l'écran avec chaque ligne de commande serait bien. – Evi1M4chine

Répondre

6

Celui-ci est

ifneq ($(words $(MAKECMDGOALS)),1) 
.DEFAULT_GOAL = all 
%: 
     @$(MAKE) [email protected] --no-print-directory -rRf $(firstword $(MAKEFILE_LIST)) 
else 
ifndef ECHO 
T := $(shell $(MAKE) $(MAKECMDGOALS) --no-print-directory \ 
     -nrRf $(firstword $(MAKEFILE_LIST)) \ 
     ECHO="COUNTTHIS" | grep -c "COUNTTHIS") 

N := x 
C = $(words $N)$(eval N := x $N) 
ECHO = echo "`expr " [\`expr $C '*' 100/$T\`" : '.*\(....\)$$'`%]" 
endif 

.PHONY: all clean 

all: target 
     @$(ECHO) All done 

clean: 
     @rm -f target *.c 
#  @$(ECHO) Clean done 

target: a.c b.c c.c d.c e.c 
     @$(ECHO) Linking [email protected] 
     @sleep 0.1 
     @touch [email protected] 

%.c: 
     @$(ECHO) Compiling [email protected] 
     @sleep 0.1 
     @touch [email protected] 

endif 
+0

c'est un lien mort – thejoshwolfe

+0

@Giovanni Funchal, pouvez-vous mettre à jour le lien s'il vous plaît? – thegreendroid

+0

haha, quel lien !? rsrs – JohnTortugo

1

Bon tour! (-:.

Mais pas vraiment évolutive pour la croissance des projets qui sont distribués dans de nombreux répertoires avec beaucoup de makefiles

Je serais plus enclin à avoir l'exploitation forestière saupoudré par les akefiles [mm] * dans votre projet et utiliser pour suivre les progrès

Juste une pensée BTW Merci de partager cette

Edit:... juste eu une pensée cela pourrait être utile sous une forme modifiée pour afficher un throbber pour montrer les progrès. pendant une longue tâche, par exemple déballer un grand dis ibution tarball au lieu de simplement spécifier l'option -v à la commande tar. Encore un peu de sucre enrobé mais un peu de plaisir aussi. (-:

acclamations,

Rob

+0

Merci pour votre commentaire, pouvez-vous s'il vous plaît expliquer pourquoi vous pensez que cela ne correspond pas? Ok, le code est juste une esquisse, mais MAX peut contenir 64k x si nécessaire, et le calcul de la variable T est assez rapide. –

+0

Il n'est pas mis à l'échelle car il ne fonctionnera pas si vous utilisez plusieurs répertoires, chaque sous-répertoire ayant son propre fichier makefile. –

+0

@ ScottieT812, acclamations, c'était la principale raison de mon commentaire!(-: L'autre doit continuellement calculer et mettre à jour le nombre de x nécessaires au fur et à mesure que le projet se développe.) –

2

moins intrusive et plus impressionnant Ceci est une légère modification @ GiovanniFunchal Excellents answer

donc.. Je voulais mieux comprendre cela et le faire fonctionner pour < 10% alors j'ai creusé dans le documentation et j'ai appris plus environ expr. Je me suis débarrassé de la partie : '.*\(....\)$$'. Il renverrait les 4 derniers caractères de la commande interne expr, mais échouerait s'il était inférieur à 4. Et maintenant cela fonctionne pour moins de 10%!

Et voici le commentaire version gratuite:

ifneq ($(words $(MAKECMDGOALS)),1) # if no argument was given to make... 
.DEFAULT_GOAL = all # set the default goal to all 
%:     # define a last resort default rule 
     @$(MAKE) [email protected] --no-print-directory -rRf $(firstword $(MAKEFILE_LIST)) # recursive make call, 
else 
ifndef ECHO 
T := $(shell $(MAKE) $(MAKECMDGOALS) --no-print-directory \ 
     -nrRf $(firstword $(MAKEFILE_LIST)) \ 
     ECHO="COUNTTHIS" | grep -c "COUNTTHIS") 
N := x 
C = $(words $N)$(eval N := x $N) 
ECHO = echo -ne "\r [`expr $C '*' 100/$T`%]" 
endif 

# ... 

endif 

espoir qui aide.