2013-07-12 9 views
5

C++संकलन समय मैक्रो

का उपयोग किए बिना तारीख और समय हो रही है मैं एक स्वचालित समय पर मेरी कोड संकलन और समय, जिस पर कोड कोड अपने आप में संकलित किया गया था का उपयोग करने की जरूरत है। वर्तमान में मैं संकलन-समय की तारीख और समय प्राप्त करने के लिए __DATE__, __TIME__ मैक्रोज़ का उपयोग कर रहा हूं। हालांकि, यह स्रोतों में कोई बदलाव नहीं किए जाने के बावजूद बाइनरी बदलता है (मैक्रोज़ संकलन समय पर फुलाएगा) जो अच्छा नहीं है (मैं नहीं चाहता कि सेटअप यह सोचने के लिए कि यदि कोई बदलाव नहीं हुआ है तो बाइनरी बदल गई है स्रोत के लिए)।

क्या किसी भी माध्यम का उपयोग किए बिना संकलन-समय प्राप्त करना संभव है जिससे स्रोत बदलना पड़ेगा?

धन्यवाद

+0

इसे एक अतिरिक्त फ़ाइल में सहेजने के अलावा जो निर्माण का हिस्सा नहीं है, मुझे नहीं लगता कि यह संभव है ... – Nbr44

+2

उस स्थिति में आप अपने बिल्ड-सिस्टम को केवल तभी निर्माण कर सकते हैं जब कोई बदलाव हो। किसी भी स्रोत में कोई बदलाव नहीं होने पर पुन: संकलन के लिए बस पुन: संकलित करना ज्यादा समझ में नहीं आता है। –

+2

(नोट: आपको अपनी पोस्ट संपादित करनी चाहिए और मैक्रोज़ नामों के चारों ओर बैकटीक्स जोड़ना चाहिए: "' ... \ '__DATE __ \', \ '__TIME __ \' मैक्रोज़ ... '", क्योंकि वर्तमान में वे बोल्ड दिखाई देते हैं और अंडरस्कोर के बिना) –

उत्तर

3

मानक __DATE__ और __TIME__ मैक्रो आप क्या निरीक्षण, एक समय निर्भर स्ट्रिंग लौटाने से करते हैं।

यह सिस्टम (और शायद संकलक) और विशेष रूप से निर्माण प्रणाली (उदाहरण के लिए जीएनयू make) पर निर्भर करता है।

एक संभावित विचार एक अलग टाइमस्टैम्प फ़ाइल में लिंक करने के लिए, की तरह कुछ (make वाक्य रचना में)

timestamp.c: 
     date +'const char timestamp[]="%c";' > [email protected] 

program: $(OBJECTS) timestamp.c 
     $(LINKER.cc) $^ -o [email protected] $(LIBES) 
     rm -f timestamp.c 

timestamp.o तो पुनर्जीवित किया जाएगा हो सकता है और अपने program (हर make पर फिर से जोड़ दिया जाएगा ताकि उत्पन्न कार्यक्रम वास्तव में बदल जाएगा, लेकिन अधिकांश कोड- $(OBJECTS) परिवर्तनीय बनाते हैं- अपरिवर्तित रहेगा)।


वैकल्पिक रूप से, आप उदा। कुछ डेटाबेस या टेक्स्ट लॉग फ़ाइल के अंदर लॉग इन करने का समय लॉग इन करें, उदा।

program: $(OBJECTS) 
     $(LINKER.cc) $^ -o [email protected] $(LIBES) 
     date +'[email protected] built at %c' >> /var/log/build.log 

(आप logger बजाय date का उपयोग syslog में लॉग इन किया है कि प्राप्त करने के लिए हो सकता है)

तब उत्पन्न program परिवर्तन नहीं होगा, लेकिन आप कहीं निर्माण टाइमस्टैम्प लॉग इन किया है जाएगा। बीटीडब्लू आप अपने बाइनरी प्रोग्राम के कुछ चेकसम (उदा। make सिंटैक्स) में लॉग भी कर सकते हैं।

+0

हम्म, क्या यह अभी भी परिणामस्वरूप बाइनरी फ़ाइल को निर्माण से बदलने के लिए नहीं बदलेगा? चूंकि timestamp.c फ़ाइल भी बदलेगी और टाइमस्टैम्प 2.0 फ़ाइल बाइनरी में जुड़ी होगी? –

+0

मुझे इसे बनाने की ज़रूरत है ताकि अंतिम बाइनरी तब तक नहीं बदले जब तक स्रोत में कोई वास्तविक परिवर्तन न हो। –

+0

@ user1322488 अपना पहला मेकफ़ाइल स्निपेट लें, लेकिन फिर निर्भरता जोड़कर timestamp.c लाइन को संशोधित करें। जैसे 'timestamp.c: $ (ऑब्जेक्ट्स) 'इससे ​​यह किसी भी ऑब्जेक्ट से पुराना होने पर timestamp.c को पुन: उत्पन्न कर देगा। –

0

यदि आप अपनी बाइनरी में संकलन-समय का उपयोग करते हैं, तो आपके पास बाइनरी परिवर्तन होगा।

कई समाधान हैं, लेकिन मुझे लगता है कि मुख्य बिंदु यह है कि यदि आप नियमित आधार पर द्विआधारी पुनर्निर्माण करते हैं, तो वास्तव में केवल तभी किया जाना चाहिए जब वास्तव में कुछ परिवर्तन होते हैं (या तो निर्माण प्रणाली या स्रोत कोड में)। तो यह जांचने के लिए कि क्या कोई बदलाव है या नहीं, यह देखने के लिए इसे अपने निर्माण प्रणाली का हिस्सा बनाएं। ऐसा करने का एक आसान तरीका यह है कि स्रोत कोड के लिए संस्करण नियंत्रण प्रणाली में "नवीनतम संस्करण" क्या है। यदि नवीनतम संस्करण पिछले निर्माण में उपयोग किए गए जैसा ही है, तो कुछ भी बनाने की आवश्यकता नहीं है। यह आपको ऐसे निर्माण उत्पन्न करेगा जो समान हैं (निर्माण समय-टिकट के अलावा), और द्विआधारी में storgin __DATE__ और __TIME__ के मुद्दे को हल करेंगे।

0

यह मुझे स्पष्ट नहीं है कि आप क्या चाहते हैं।यदि यह फ़ाइल के आखिरी संशोधित समय है, तो यह आपके सिस्टम पर निर्भर करेगा और बिल्ड सिस्टम: -D $(shell ls -l --time-style=long-iso $< | awk '{ print $7, $8 }') जैसे का उपयोग उदाहरण के लिए जीएनयू के साथ जीएनयू के साथ कंपाइलर आमंत्रण में किया जा सकता है। लेकिन निश्चित रूप से, इसका मतलब है कि यदि फ़ाइल शामिल है बदल गया, लेकिन स्रोत नहीं, तो समय और दिनांक को प्रतिबिंबित नहीं करेगा।

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