2009-01-16 13 views
21

इस मेकफ़ाइल को देखें, इसमें कुछ प्रकार की आदिम प्रगति संकेत है (प्रगति पट्टी हो सकती थी)।प्रगति संकेत बनाओ/मेकफ़ाइल करें!

कृपया मुझे सुझाव/टिप्पणियां दें!


 

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


सभी सुझावों का स्वागत!

+1

प्यारा चाल, लेकिन मैं इसे देखना नहीं देख सकता। –

+1

मैं कर सकता हूँ। Gentoo पर यह अच्छा होगा। 'cmake' में अंतर्निहित काउंटर [फ़ाइल x/n फ़ाइलें] है। लेकिन हर कमांड लाइन के साथ स्क्रीन बाढ़ के बिना प्रगति पट्टी रखने का एक तरीका अच्छा होगा। – Evi1M4chine

उत्तर

6

यह एक कम दखल और अधिक भयानक है

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

यह एक मृत लिंक है – thejoshwolfe

+0

@Giovanni Funchal, क्या आप कृपया लिंक अपडेट कर सकते हैं? – thegreendroid

+0

हाहा, कौन सा लिंक !? rsrs – JohnTortugo

1

अच्छी चाल! (-:।

लेकिन वास्तव में परियोजनाओं कि makefiles के बहुत सारे के साथ कई निर्देशिका भर में वितरित कर रहे हैं उगाने के लिए स्केलेबल नहीं

मैं और अधिक अपनी परियोजना में [Mm] akefiles * के माध्यम से छिड़का प्रवेश के लिए इच्छुक हो जाएगा और का उपयोग करें कि प्रगति का ट्रैक रखने के

बस एक विचार BTW धन्यवाद इस साझा करने के लिए

संपादित करें:।।।। बस एक विचार एक throbber प्रगति दिखाने के लिए प्रदर्शित करने के लिए यह एक संशोधित रूप में उपयोगी हो सकता था जबकि एक लंबा कार्य आयता है, उदाहरण के लिए एक बड़े distracking unpacking टैर कमांड के लिए -v विकल्प निर्दिष्ट करने के बजाय ibution tarball। अभी भी चीनी कोटिंग का थोड़ा सा लेकिन थोड़ा मज़ा भी। (-:

चियर्स,

रोब

+0

आपकी टिप्पणी के लिए धन्यवाद, क्या आप कृपया बता सकते हैं कि आपको ऐसा क्यों लगता है कि यह स्केल नहीं करता है? ठीक है कोड सिर्फ एक स्केच है, लेकिन यदि आवश्यक हो तो MAX 64k x की हो सकती है, और टी चर की गणना काफी तेज है। –

+0

यह स्केल नहीं करता है क्योंकि यदि आप एकाधिक निर्देशिकाओं पर उपयोग करते हैं तो यह काम नहीं करेगा, प्रत्येक उप-निर्देशिका के साथ यह स्वयं का मेकफ़ाइल है। –

+0

@ स्कॉटीटी 812, चीयर्स, यह मेरी टिप्पणी का मुख्य कारण था!(-: दूसरे को लगातार विस्तार के रूप में एक्स की संख्या की गणना और अद्यतन करना पड़ता है क्योंकि परियोजना विस्तारित होती है। फिर भी। अच्छी चाल हालांकि –

2

यह @ GiovanniFunchal उत्तम answer

तो करने के लिए एक मामूली संशोधन है।। मैं इसे बेहतर समझना चाहता था और इसे < 10% के लिए काम करना चाहता था इसलिए मैंने documentation में खोला और अधिक सीखा लगभग 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 

मुझे : '.*\(....\)$$' भाग से छुटकारा मिला। यह आंतरिक expr कमांड के अंतिम 4 वर्णों को वापस कर देगा, लेकिन अगर यह 4 से कम था तो असफल हो जाएगा और अब यह सब 10% के लिए काम करता है!

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 

आशा है कि मदद करता है:

और यहाँ टिप्पणी मुक्त संस्करण है।

संबंधित मुद्दे