2011-09-21 6 views
5

में उपयोग की गई फ़ाइल की सामग्री को अद्यतन करने के लिए कैसे बनाएं, जो कि निर्माण का हिस्सा है, की सामग्री को अद्यतन करने के लिए उचित SCONS विधि क्या है?SCONS को

मैं काफी बड़ी परियोजना बनाने के लिए SCONS का उपयोग करता हूं। लेकिन एक सरल प्रश्न के लिए, मान लें कि यह इस तरह दिखता है:

env.Program("foo", ["foo.c", "version.c"]) 

कुछ निर्माण शर्तों के तहत, यह नई जानकारी के साथ निर्माण में सीपीपी फ़ाइलों में से एक की सामग्री को अद्यतन करने के लिए आवश्यक है - संस्करण जानकारी वास्तव में। उपर्युक्त उदाहरण में, मुझे "version.c" की सामग्री को संशोधित करने की आवश्यकता होगी। मैंने सोचा कि मैं निम्न उदाहरण के साथ नहीं बल्कि अच्छी तरह से ऐसा कर सकता है:

env.Command(target="version.c", source=[], action=PythonFunctionToUpdateContents) 
env.Program("foo", ["foo.c", "version.c"]) 

PythonFunctionToUpdateContents लक्ष्य का प्रयोग करेंगे [0] फ़ाइल का नाम, उसे खोलें, कुछ विशिष्ट पाठ के लिए देखो, यह बदलने के लिए, परिवर्तन लिखने के रूप में एक ही फाइल पर वापस। दुर्भाग्यवश, उपर्युक्त नमूना काम नहीं करता है। SCONS स्वचालित रूप से इसे बनाने से पहले एक लक्षित फ़ाइल हटा देता है, इसलिए इसे अपडेट करने से पहले मेरी "version.c" फ़ाइल हटा दी गई।

मैंने env.Command() कॉल में एक ही फ़ाइल में लक्ष्य और स्रोत सेट करने का प्रयास किया, लेकिन यह केवल एक निर्भरता चक्र बनाता है।

मुझे पता है कि मैं SCONS को एंटीयर संस्करण.c फ़ाइल उत्पन्न करके इसे हल कर सकता हूं, लेकिन यह उपयुक्त नहीं है क्योंकि संस्करण.c में बहुत से अन्य कोड हैं जो सामान्य विकास के हिस्से के रूप में बदल सकते हैं।

उत्तर

5

ऐसा करने का सामान्य तरीका "version.c.in" या "version-in.c" या जो भी आप इसे कॉल करना चाहते हैं। इसे संशोधित करें और इसे संस्करण.c पर आउटपुट करें। आप अपनी संस्करण नियंत्रण प्रणाली में "इन" फ़ाइल जोड़ देंगे, जबकि संस्करण.c फ़ाइल वहां नहीं होगी। तो यह सब के परिणाम के रूप लगेगा इस प्रकार है:

env.Command(target="version.c", source="version-in.c", 
      action=PythonFunctionToUpdateContents) 
env.Program("foo", ["foo.c", "version.c"]) 

यह भी अन्य निर्माण सिस्टम पर लागू होता है - यह आम तौर पर एक बुरा विचार कोई इनपुट फ़ाइल के लिए भी कोई आउटपुट फ़ाइल होना है। काम पूरा करने के लिए एक मध्यवर्ती फ़ाइल का उपयोग करना बेहतर है।

+0

उदाहरण बहुत आसान था, शायद। मेरा "env.Program()" कॉल वास्तव में एक तृतीय-पक्ष निर्माण प्रक्रिया के लिए एक बाहरी कॉल है जो SCONS आधारित नहीं है। तो मैं अपनी प्रक्रिया को बंद करने से पहले फ़ाइल को संशोधित करने की कोशिश कर रहा हूं। मैं सहमत हूं - फ़ाइल को संशोधित करना एक अच्छा विचार नहीं है। लेकिन निर्माण प्रक्रिया के उस हिस्से पर मेरा नियंत्रण नहीं है। –

+1

वही सिद्धांत लागू होता है - आपके पास एक फ़ाइल है जिसे आप नियंत्रित करते हैं जो बाह्य निर्माण प्रक्रिया में इनपुट का टेम्पलेट है। बाहरी प्रक्रिया को लात मारने से पहले आप अपने टेम्पलेट की एक संशोधित प्रति प्रासंगिक निर्देशिका में बनाते हैं। ऐसा विफल होने पर, आप हमेशा तीसरे पक्ष के निर्माण की एक पूरी प्रति बना सकते हैं (व्यावहारिक नहीं हो सकता है) और उस प्रतिलिपि में फ़ाइलों को संशोधित कर सकते हैं। – richq

5

इस उत्तर पार्टी के लिए देर से थोड़े है, लेकिन यहाँ यह वैसे भी है:

आप env.Precious("version.c") उपयोग करना चाहिए। यह फ़ाइल को बनने से पहले हटाए जाने से रोकता है।

शायद आप env.NoClean("version.c") का उपयोग भी करना चाहते हैं ताकि यह साफ़ के दौरान हटाया न जाए।

आप शायद env.SideEffect का उपयोग कर सकते हैं, लेकिन उसमें कुछ अजीब चीजें हैं। मुझे मेलिंग सूची पर आम तौर पर उस का उपयोग नहीं करने के लिए कहा गया था।

+0

इस उत्तर को पढ़ने वाले किसी भी व्यक्ति के लिए अपडेट करें: 'env।SideEffect' का उपयोग तब किया जाना चाहिए जब एकाधिक बिल्डर्स एक ही फ़ाइल में आउटपुट करेंगे (जैसे कि एक लॉग, काउंटर युक्त बाइनरी फ़ाइल इत्यादि); मुझे नहीं लगता कि इससे इस स्थिति में मदद मिलेगी। 'बहुमूल्य' और 'नोक्लीन' की जोड़ी "सही" समाधान होगी। –

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