2009-01-16 10 views
21

Mire este archivo MAKE, tiene algún tipo de indicación de progreso primitivo (podría haber sido una barra de progreso).Indicación de progreso make/makefile!

Por favor déme sugerencias o comentarios al respecto!


 

# 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) 


Todas las sugerencias son bienvenidas!

+1

Lindo truco, pero no puedo ver el deseo. –

+1

Yo puedo. En Gentoo esto sería bueno. 'cmake' tiene un contador incorporado [archivo x/n archivos]. Pero una forma de tener una barra de progreso sin inundar la pantalla con cada línea de comando sería agradable. – Evi1M4chine

Respuesta

6

Ésta es menos intrusivo y más impresionante

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

que es un enlace muerto – thejoshwolfe

+0

@Giovanni Funchal, se puede actualizar el vínculo por favor? – thegreendroid

+0

jaja, que unen !? RSR – JohnTortugo

1

Buen truco! (-:.

Pero en realidad no escalable para los proyectos que se distribuyen a través de muchos directorios con una gran cantidad de archivos make crecimiento

estaría más inclinado a tener registro salpicado a través de los akefiles [mm] * en su proyecto y el uso que para realizar un seguimiento del progreso

es sólo una idea BTW Gracias por compartir esta

Editar:... acaba de tener un pensamiento esto podría ser útil en una forma modificada para mostrar un Throbber para mostrar el progreso. mientras que una larga tarea procede, por ejemplo, desempaquetar una gran distribución tarball de contribución en lugar de simplemente especificar la opción -v al comando tar. Todavía un poco de capa de azúcar, pero un poco de diversión también. (-:

aplausos,

Rob

+0

Gracias por su comentario, ¿puede explicar por qué cree que esto no tiene escala? Ok, el código es solo un boceto, pero MAX puede contener 64k x si es necesario, y el cálculo de la variable T es bastante rápido. –

+0

No escala porque no funcionará si usa make en múltiples directorios, con cada subdirectorio teniendo su propio archivo MAKE. –

+0

@ ScottieT812, ¡salud, ese fue el motivo principal de mi comentario!(-: El otro continuamente tiene que calcular y actualizar el número de x necesarios a medida que se expande el proyecto. Aún así, buen truco. –

2

Ésta es una ligera modificación a @ de excelente GiovanniFunchal answer

Así que.. Quería entender esto mejor y hacerlo funcionar para < 10%, así que busqué en el documentation y aprendí más aproximadamente expr.

# PLACE AT THE TOP OF YOUR MAKEFILE 
#--------------------------------- 
# Progress bar defs 
#-------------------------------- 
# words = count the number of words 
ifneq ($(words $(MAKECMDGOALS)),1) # if no argument was given to make... 
.DEFAULT_GOAL = all # set the default goal to all 
# http://www.gnu.org/software/make/manual/make.html 
# [email protected] = target name 
# %: = last resort recipe 
# --no-print-directory = don't print enter/leave messages for each output grouping 
# MAKEFILE_LIST = has a list of all the parsed Makefiles that can be found *.mk, Makefile, etc 
# -n = dry run, just print the recipes 
# -r = no builtin rules, disables implicit rules 
# -R = no builtin variables, disables implicit variables 
# -f = specify the name of the Makefile 
%:     # define a last resort default rule 
     @$(MAKE) [email protected] --no-print-directory -rRf $(firstword $(MAKEFILE_LIST)) # recursive make call, 
else 
ifndef ECHO 
# execute a dry run of make, defining echo beforehand, and count all the instances of "COUNTTHIS" 
T := $(shell $(MAKE) $(MAKECMDGOALS) --no-print-directory \ 
     -nrRf $(firstword $(MAKEFILE_LIST)) \ 
     ECHO="COUNTTHIS" | grep -c "COUNTTHIS") 
# eval = evaluate the text and read the results as makefile commands 
N := x 
# Recursively expand C for each instance of ECHO to count more x's 
C = $(words $N)$(eval N := x $N) 
# Multipy the count of x's by 100, and divide by the count of "COUNTTHIS" 
# Followed by a percent sign 
# And wrap it all in square brackets 
ECHO = echo -ne "\r [`expr $C '*' 100/$T`%]" 
endif 
#------------------ 
# end progress bar 
#------------------ 

# REST OF YOUR MAKEFILE HERE 

#----- Progressbar endif at end Makefile 
endif 

Me libré de la pieza : '.*\(....\)$$'. Devolvería los últimos 4 caracteres del comando interno expr, pero fallaría si fuera menor a 4. ¡Y ahora funciona para menos del 10%!

Y aquí es la versión gratuita comentario:

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 

Espero que ayude.