2010-05-07 10 views
6

संक्षेप में: मैं वर्तमान में से दो अलग-अलग स्रोत पेड़ जेनरेट करना चाहता हूं, केवल एक प्रीप्रोसेसर मैक्रो परिभाषित किया जा रहा है और दूसरे को अपरिभाषित किया गया है, स्रोत में कोई अन्य परिवर्तन नहीं है।अलग विशिष्ट #ifdef शाखाएं

आप रुचि रखते हैं, यहाँ मेरी कहानी ...

शुरुआत में, मेरी कोड साफ था है। फिर हमने एक नया उत्पाद बनाया, और हाँ, यह बेहतर था। लेकिन कोड ने केवल वही परिधीय उपकरणों को देखा, इसलिए हम एक ही कोड रख सकते थे।

ठीक है, लगभग।

एक छोटी सी शर्त यह है कि परिवर्तित करने की जरूरत नहीं थी, तो मैं कहा:

#if defined(PRODUCT_A) 
condition = checkCat(); 
#elif defined(PRODUCT_B) 
condition = checkCat() && checkHat(); 
#endif 

... एक के लिए और केवल एक ही स्रोत फ़ाइल। सभी स्रोत फ़ाइलें-शामिल-इस हेडर फाइल सामान्य तौर पर, मैं था:

#if !(defined(PRODUCT_A)||defined(PRODUCT_B)) 
#error "Don't make me replace you with a small shell script. RTFM." 
#endif 

... ताकि लोगों को यह संकलन नहीं कर सकता है जब तक कि वे स्पष्ट रूप से एक उत्पाद के प्रकार को परिभाषित किया।

सब ठीक थे। ओह ... सिवाय इसके कि संशोधनों को बनाया गया था, घटकों को बदल दिया गया था, और चूंकि नए हार्डवेयर ने बेहतर काम किया है, इसलिए हम नियंत्रण प्रणाली को फिर से लिख सकते हैं।

#ifdef PRODUCT_A 
... 
#else 
... 
#endif 

... या एक ही है, लेकिन PRODUCT_B के लिए: अब जब मैं कोड के चेहरे पर देखो, वहाँ 60 से अधिक अलग या तो द्वारा पृथक किए गए क्षेत्र हैं। या यहाँ तक कि:

#if defined(PRODUCT_A) 
... 
#elif defined(PRODUCT_B) 
... 
#endif 

और निश्चित रूप से, कभी कभी विवेक एक लंबे समय तक छुट्टी ले लिया और:

#ifdef PRODUCT_A 
... 
#endif 
#ifdef PRODUCT_B 
... 
#endif 

इन शर्तों दो सौ लाइनों एक से कहीं भी लपेट (आपको लगता हैं कि पिछले एक हेडर फ़ाइलों को स्विच करके किया जा सकता है, लेकिन फ़ंक्शन नामों को समान होना आवश्यक है)।

यह पागल है। मैं स्रोत रेपो में दो अलग-अलग उत्पाद-आधारित शाखाओं को बनाए रखने और किसी भी सामान्य परिवर्तन को बंद करने से बेहतर होगा। मुझे अब यह एहसास है।

वहाँ कुछ है कि दो अलग-अलग स्रोत पेड़ की आवश्यकता उत्पन्न कर सकते हैं, केवल PRODUCT_A के आधार पर परिभाषित किया जा रहा है और PRODUCT_B अपरिभाषित जा रहा है (और इसके विपरीत), बिना छू कुछ और (यानी। कोई शीर्ष लेख शामिल किए जाने, कोई मैक्रो है विस्तार, आदि)?

+2

यह वही शाखाओं के लिए है निर्धारित करता है। – rlbond

+0

ठीक है, सबसे पहले यह एक अलग पेड़ के लिए 72 स्रोत और हेडर फाइल वाले पेड़ की एक नई शाखा बनाने के लिए मूर्खतापूर्ण लग रहा था। हमने पाया कि दोनों उत्पादों के लिए आम तौर पर परिवर्तन अधिक आम होंगे, और अलग-अलग शाखाओं के साथ हमें हर समय पोर्ट बंद करने की आवश्यकता होगी। वास्तविकता, जाहिर है, अलग हो गया। – detly

+0

स्रोत कोड आपके कमरे की तरह है, आपको इसे समय-समय पर साफ करना होगा। अन्यथा आप एक बड़ी सुगंधित गड़बड़ी के साथ खत्म हो जाते हैं। शाखाओं को इस तरह की जटिलता से निपटने के लिए बनाया गया था। सबसे अच्छा हिस्सा यह है कि, शाखाओं में बग फिक्स विलय करना एक अच्छा एससीएम में छोटा है। –

उत्तर

6

मेरा मानना ​​है कि Coan जो आप खोज रहे हैं वह करेंगे। लिंक से:

एक विन्यास और कुछ स्रोत कोड को देखते हुए, Coan अगर प्रतीकों में से है कि विन्यास पहले से लागू किया गया था कि कैसे स्रोत कोड C/C++ पूर्वप्रक्रमक के लिए प्रकट होता के बारे में सवाल की एक सीमा का जवाब कर सकते हैं।

और यह भी: Coan द्वारा

स्रोत कोड के रूप में फिर से लिखा सी पूर्वप्रक्रमक द्वारा उत्पादित कोड preprocessed नहीं है।इसमें अभी भी टिप्पणियां, मैक्रो-इनवोकेशन, और # -डाirectives शामिल हैं। यह अभी भी स्रोत कोड है, लेकिन चयनित विन्यास के अनुसार सरलीकृत है।

तो तुम इसे दो बार चला सकते हैं, पहला उत्पाद एक और फिर उत्पाद बी

+0

मेरी इच्छा है कि मैं इसे दो बार टिक सकता हूं। – detly

+0

खुशी है कि मैं मदद कर सकता हूं। – Dusty

+0

मैं इसे [कोन के लिए पीपीए] (https://launchpad.net/~detly/+archive/ubuntu/coan) बनाने के बाद समाप्त हुआ क्योंकि मैं इसे इतना उपयोग करता हूं। – detly

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