Look at this makefile, it has some sort of primitive progress indication (could have been a progress bar).
Please give me suggestions/comments on it!
# 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 $@ $(BUILD) %.c: @touch $@ $(BUILD)
All suggestions welcome!
-
Nice trick! (-:
But not really scalable for growing projects that are distributed across many directories with lots of makefiles.
I'd be more inclined to have logging sprinkled through the [Mm]akefiles* in your project and use that to keep track of progress.
Just a thought. BTW Thanks for sharing this.
Edit: Just had a thought. This could be useful in a modified form to display a throbber to show progress while a long task proceeds, e.g unpacking a large distribution tarball instead of just specifying the -v option to the tar command. Still a bit of sugar coating but a bit of fun aswell. (-:
cheers,
Rob
Helltone : Thanks for your comment, can you please explain why you think this does not scales? Ok the code is just a sketch, but MAX can hold 64k x's if needed, and the calculation of the T variable is quite fast.Scottie T : It doesn't scale because it won't work if you use make over multiple directories, with each sub-directory having it's own makefile.Rob Wells : @ScottieT812, cheers, that was the main reason for my comment! (-: The other one is continually having to calculate and update the number of x's needed as the project expands. Still. nice trick though.Helltone : Rob you did not understood my script. It WORKS if you have makefiles over multiple directories (although I do not recommend recursive make) and the x's are NOT number of targets, its just an upper-bound (256, can be more). The exact number of targets is automatically discovered (see code of $T)
0 comments:
Post a Comment