2011-08-06 15 views
16

के प्रत्येक लक्ष्य में बिताए गए समय को मापने के लिए पर Makefile के प्रत्येक लक्ष्य में बिताए गए सिस्टम (उपयोगकर्ता, वास्तविक) समय को प्रतिबिंबित करने का कोई तरीका है?मेकफ़ाइल

मैं केवल time make all की तुलना में एक और अधिक बारीक तरीके से एक परियोजना के संकलन को बेंचमार्क करना चाहता हूं। आदर्श रूप से, यह निष्पादित लक्ष्य के पेड़ को प्रतिबिंबित करेगा, प्रत्येक व्यक्ति अपनी सभी निर्भरताओं में व्यतीत समय के साथ। यह बहुत अच्छा होगा अगर यह -j (समांतर बनाने) के साथ काम कर सकता है। और जिस तरह से मेरा Makefile गैर-पुनरावर्ती है (प्रत्येक मुख्य लक्ष्य के लिए make उदाहरण नहीं दिखाता है)।

धन्यवाद!

उत्तर

14

जीएनयू लक्ष्य में कमांड निष्पादित करने के लिए $ (SHELL) चर का उपयोग करता है।

डिफ़ॉल्ट रूप से यह/bin/sh पर सेट है।

आप इस चर को एक स्क्रिप्ट पर सेट कर सकते हैं जो "टाइम" कमांड के साथ दिए गए आदेश को निष्पादित करेगा। कुछ इस तरह:

अपने makefile में, शेल चर निर्दिष्ट कहीं शीर्ष पर:

SHELL = ./report_time.sh 

और फ़ाइल ./report_time.sh में:

#!/bin/sh 
shift # get rid of the '-c' supplied by make. 
time sh -c "$*" 

'श की जगह 'मेकफ़ाइल में निर्दिष्ट मूल शेल के साथ आदेश अगर कोई है।

यह समय की रिपोर्ट करेगा।

हालांकि यह आपको नहीं बताएगा कि report_time.sh स्क्रिप्ट किस लक्ष्य को चल रही है। इसके लिए एक समाधान मेकफ़ाइल में प्रत्येक लक्ष्य प्रविष्टि में लक्ष्य नाम ($ @) को प्रीपेड करना है ताकि इसे report_time.sh स्क्रिप्ट में भी पास किया जा सके।

+1

त्वरित और सहायक उत्तर के लिए धन्यवाद! यह अच्छा है, लेकिन यह केवल संकलन निर्भरता पेड़ (वास्तविक आदेश) के 'पत्ते' के समय की रिपोर्ट करेगा, मध्यवर्ती लक्ष्य के समय (उदा। पीएचओएनवाई) नहीं। मुझे लगता है कि इसे संभव बनाने के लिए 'मेक' में बनाया गया एक फीचर होना होगा ... – mqtthiqs

+0

समय बैश (और शायद अन्य गोले) का एक एम्बेडेड कमांड है, लेकिन * नहीं * डैश जो कई वितरणों पर डिफ़ॉल्ट है। मैं समस्याओं से बचने के लिए इस स्क्रिप्ट के लिए '#!/Bin/bash' का उपयोग करने की सिफारिश करता हूं –