2009-06-23 10 views
20

मैं scons में देख रहा हूं और मैं यह सुनिश्चित करना चाहता हूं कि मुझे पता है कि विकल्प क्या हैं, इससे पहले कि मैं मस्तिष्क कोशिकाओं का एक हिस्सा पूरी तरह से अलग करता हूं। मैं अतीत में जीएनयू का उपयोग कर रहा हूं लेकिन कभी इसके साथ विशेष रूप से खुश नहीं रहा हूं।चींटी + सीपीटीएक्स बनाम स्कॉन्स बनाम

विशेष रूप से: सी/सी ++ परियोजनाओं के साथ चींटी का अधिक बार उपयोग क्यों नहीं किया जाता है? (यह देखते हुए कि ant cpptasks है) मैंने कुछ पोस्ट पढ़ी हैं जो कहते हैं कि चींटी जावा के आसपास अधिक उन्मुख है (जाहिर है), लेकिन ऐसा करने में क्या कमी है? और स्कॉन बनाने से इतना बेहतर क्यों है?

मैं टीआई डीएसपी के लिए एक क्रॉस-कंपाइलर के साथ काम कर रहा हूं, आमतौर पर एक परियोजना में 20-50 सीपीपी फाइलें होती हैं। ऐसा लगता है कि बिल्ड प्रबंधन में कठिन हिस्सा स्वचालित निर्भरता जांच है। बाकी सब कुछ संकलक विकल्पों के सेट के साथ फाइलों की सूचियों को मैपिंग कर रहा है।

संपादित करें: और क्रॉस-संकलन कुछ भी क्यों बदलता है? यह एक कंपाइलर है जो जीसीसी रनों के समान चलता है, बस यह ऑब्जेक्ट फाइल/निष्पादन योग्य बनाता है जो मेरे पीसी पर नहीं चलेंगे।

उत्तर

25

क्रॉस संकलन के लिए मुझे लगता है कि आपके सर्वोत्तम विकल्प या तो CMake या Autotools हैं। विशेष रूप से यदि आप एकाधिक आर्किटेक्चर/प्लेटफार्मों के लिए अपना कोड संकलित कर सकते हैं। मैं आम तौर पर यूनिट परीक्षण उद्देश्यों के लिए मूल मशीन पर अपने कोड का सबसेट संकलित करता हूं और यह सब लक्ष्य प्लेटफॉर्म के लिए संकलित करता है। सीएमके इसे विशेष रूप से अच्छी तरह से संभालता है, क्योंकि यह आपको यह निर्दिष्ट करने देता है कि क्रॉस संकलित पुस्तकालय कहाँ रहते हैं। क्रॉस संकलित libpng/usr/lib में क्रॉस संकलित करने के बजाय, इसे/build/arm-eabi-gcc/या जहां भी आपके पास अपनी बिल्ड मशीन पर टूल चेन लाइब्रेरी स्थापित है, को देखने के लिए कहा जा सकता है। आप अलग-अलग प्रकारों के लिए कई बिल्ड निर्देशिका बना सकते हैं और मैन्युअल रूप से प्रत्येक संस्करण को संकलित कर सकते हैं, या ब्राइंडेड हैंड-रोलेड रिकर्सिव मेक के साथ बहुत कुछ ट्रिगर कर सकते हैं।

चींटी में यह कमी है कि यह वैनिला मेक के रूप में मूल रूप से अच्छा या बुरा है, इसके अतिरिक्त नुकसान जो आप सी या सी ++ के लिए विशेष रूप से मुख्यधारा नहीं कर रहे हैं। आपको अपनी सभी निर्भरताओं से निपटना होगा - आंतरिक दोनों, जैसे कि सी फ़ाइल को हेडर फ़ाइल में लाइब्रेरी या निष्पादन योग्य, और बाहरी निर्भरताओं जैसे तृतीय पक्ष पुस्तकालयों से जुड़ना। इसके अलावा मुझे नहीं लगता कि चींटी सी कार्यों को वास्तव में बहुत अधिक बनाए रखा जाता है। मैंने जो भी देखा है, वह एंट फॉर सी वकील का उपयोग निष्पादन कार्यों के साथ जीसीसी को बुला रहा है।

स्कॉन्स बेहतर है, लेकिन क्रॉस संकलन इसकी मजबूत बिंदु नहीं है। यह सीएमके या ऑटोटूल जैसे "निर्माण प्रणाली" नहीं है, यह केवल एक निर्माण उपकरण है। जैसा कि यह उनके विकी, it is pretty much "Make in Python" पर कहता है। यह निर्भरताओं के लिए संभालने में बनाया गया है, जिसका अर्थ है कि आपको "जीसीसी-एमएम-एमडी" या जो भी हो, वहां अपना खुद का रोल नहीं करना है, इसलिए यह मेक पर एक लाभ है। स्कैनों को तीसरे पक्ष के पुस्तकालयों का पता लगाने के लिए समर्थन भी मिलता है, लेकिन आमतौर पर जिस तरह से किया जाता है, वह आपके निर्माण समय में बहुत कुछ जोड़ सकता है। अन्य प्रणालियों के विपरीत, स्कैन प्रत्येक बार जब आप इसे चलाते हैं तो जांच चरण चलाता है, हालांकि अधिकांश परिणाम कैश किए जाते हैं। स्कैन अपने लंबे निर्माण के समय के लिए भी कुख्यात है, हालांकि 50 फाइलों के लिए जो कोई मुद्दा नहीं होगा। स्कॉन्स में क्रॉस संकलन समर्थन मौजूद नहीं है - आपको अपना खुद का as discussed on this thread on the mailing list रोल करना होगा। आमतौर पर आप निर्माण को यूनिक्स प्लेटफॉर्म की तरह मजबूर करते हैं, फिर सी कंपाइलर के नाम को ओवरराइड करते हैं। स्रोत निर्देशिका से कई प्रकार का निर्माण या निर्माण निर्देशिका को अलग करना गॉथस से भरा है, जो आपके कोड को पार और मूल रूप से संकलित करते समय इसे कम उपयुक्त बनाता है।

सीएमके और ऑटोोटूल की निर्भरता की समस्याएं काफी अच्छी तरह से लगती हैं, और ऑटोोटूल का क्रॉस संकलन समर्थन परिपक्व है। सीएमके के संस्करण 2.6.0 के बाद से क्रॉस संकलन हुआ है, जिसे अप्रैल 2008 में रिलीज़ किया गया था। आप उन सुविधाओं को मुफ्त में प्राप्त करते हैं, साथ ही पैकेजिंग और चल रहे यूनिट परीक्षण जैसे अन्य ("चेक करें" या इसी तरह के लक्ष्य)। इन दोनों उपकरणों के नकारात्मक पक्ष में उन्हें बूटस्ट्रैपिंग की आवश्यकता है।सीएमके के मामले में, आपको मेकफ़ाइल या विजुअल स्टूडियो समाधान फ़ाइलों को बनाने के लिए सीएमके बाइनरी स्थापित करने की आवश्यकता है। Autotools के मामले में यह थोड़ा अधिक जटिल है क्योंकि सॉफ़्टवेयर को संकलित करने वाले सभी को ऑटोमेक और ऑटोकॉन्फ़ स्थापित करने की आवश्यकता नहीं होगी, केवल उन लोगों को जिन्हें बिल्ड सिस्टम को बदलने की आवश्यकता है (नई फाइलों को बिल्ड सिस्टम को बदलने के रूप में गिना जाता है)। 2 चरण बूटस्ट्रैपिंग (config.ac -> कॉन्फ़िगर करें, कॉन्फ़िगर करें + Makefile.in -> मेकफ़ाइल) समझने के लिए अवधारणात्मक रूप से थोड़ा सा ट्रिकियर है।

संपादन के लिए: क्रॉस संकलन निर्माण प्रणालियों में एक अतिरिक्त सिरदर्द है जिसके कारण यह कार्यक्रमों और पुस्तकालयों के स्वत: पता लगाने में जटिलता को जोड़ता है। स्कैन इस समस्या से निपट नहीं पाते हैं, यह आपको सुलझाने के लिए छोड़ देता है। चींटी समान रूप से कुछ भी नहीं करता है। Autoconf ऑटोटूल केस में इसे संभालता है, लेकिन आपको कमांड लाइन पर "--with-libfoobar =/some/path" प्रदान करना पड़ सकता है जब आप लिंक चरण में/usr/lib का उपयोग करने का प्रयास करते समय टूटी हुई लिंक को कॉन्फ़िगर या सामना करते हैं । सीएमके का दृष्टिकोण टूलचैन फ़ाइल के साथ थोड़ा अधिक भारी है, लेकिन इसका मतलब है कि आपको अपने सभी टूल्स और लाइब्रेरीज़ (सीसी, सीईओक्स, रैनलिब, --with-ibfoo =, आदि) को निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि उन्हें पता लगाया गया है एक मानक सम्मेलन। सिद्धांत रूप में आप उन्हें संकलित करने के लिए कई परियोजनाओं में उपयुक्त ढंग से तैयार की गई सीएमके टूलचैन फ़ाइल का पुन: उपयोग कर सकते हैं। अभ्यास में सीएमके आपके औसत हैकर के लिए सुविधाजनक बनाने के लिए पर्याप्त रूप से पर्याप्त नहीं है, हालांकि यह उपयोगी हो सकता है यदि आप एकाधिक स्वामित्व वाली परियोजनाएं बना रहे हैं।

1

चींटी में बहुत जावा-भारी उपयोगकर्ता-आधार (प्राकृतिक कारणों से) है। तथ्य यह है कि चींटी बहुत व्यापक सेटिंग में बहुत उपयोगी हो सकती है, कुछ गैर-जावा डेवलपर्स अनजान हैं। नतीजतन, यदि आप अपने सी/सी ++ को बनाने के लिए चींटी का उपयोग करते हैं - तो कोड अपने आप को और अधिक करें कि यदि आप बड़े उपयोगकर्ता आधार (सीएमके या स्कैन) वाले सिस्टम का उपयोग करते हैं।

व्यक्तिगत रूप से मैं सीएमके से बहुत खुश हूं, मुख्य रूप से क्योंकि यह एकमात्र निर्माण प्रणाली है जो वास्तविक विजुअल स्टूडियो परियोजनाएं उत्पन्न कर सकती है। स्कैन भी कर सकते हैं, लेकिन वे केवल स्कैन को बाहरी कॉल करते हैं, जबकि सीएमके उन परियोजनाओं को उत्पन्न करता है जो विजुअल स्टूडियो के स्वयं के निर्माण इंजन का उपयोग करते हैं। यह बहुत उपयोगी है अगर आप उन लोगों के साथ मिलकर काम कर रहे हैं जो विजुअल स्टूडियो में उपयोग किए जाते हैं।

मुझे यकीन नहीं है कि मैं क्रॉसकंपिलेशन "परिपक्व" के लिए सीएमके का समर्थन कहूंगा, क्योंकि यह अभी भी बहुत छोटा है। लेकिन सीएमके लोग इसके बारे में गंभीर हैं, इसलिए मैं इसे आजमाने में संकोच नहीं करूंगा।

6

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

जिस तरह से सीपीपीटास्क संकलन विकल्पों का ट्रैक रखता है, और गतिशील रूप से हेडर निर्भरताओं के लिए स्रोत स्कैन करता है, हर समय अभी तक पर्याप्त तेज़ (निर्भरता की कुछ कैशिंग होती है), जिसका मतलब है कि मैंने जिस प्रणाली के साथ काम किया है, उसके साथ सटीक वृद्धिशील निर्माण होता है, बहुत बड़े कोड अड्डों का निर्माण करते समय कुछ बहुत महत्वपूर्ण है।

तो जैसा कि मैंने कहा है चींटी उपयोगकर्ता/dev सूची में कई बार, यदि आप जावा सामान का एक बहुत है और पहले से ही चींटी में एक निवेश है, और नहीं डाइविंग का डर दस्तावेज़ में हैं और सीपीटीटास्क का कोड, और अब जेएनआई "गोंद" कोड, और/या "विरासत" देशी पुस्तकालयों को गोंद कोड का खुलासा करने की आवश्यकता है, यह एक सार्थक दावेदार है, और पुरस्कार महान हो सकते हैं।

मैंने विंडोज़ डीएल के लिए पूरी तरह से < आरसी > एकीकृत संस्करण जानकारी जोड़ने के लिए एकीकृत किया है, उदाहरण के लिए, .res फ़ाइल को सही तरीके से प्रारूपित करने के लिए थोड़ा सा कार्य लिखना।यह मेरे लिए काम करता था, लेकिन एंटी + सीपीटीटास्क निश्चित रूप से "उन्नत" चींटी उपयोगकर्ता/डेवलपर आईएमएचओ के लिए अधिक है।

मुझे उम्मीद है कि इससे मदद मिलती है। - डीडी

3

मैं एएनटी से सी ++ परियोजनाओं के निर्माण के लिए terp की सिफारिश करना चाहता हूं। हमने टेर विकसित किया क्योंकि एएनटी हमारे चुने हुए निर्माण उपकरण है और सीपीटीटास्क दांत में थोड़ी देर लग रहा था और क्योंकि हम एक अलग स्तर पर अमूर्तता पर काम करना चाहते थे। टेरप कई अलग-अलग कंपाइलर्स का समर्थन करता है और यह हमारी कंपनी द्वारा समर्थित है। अधिकांश परियोजनाओं के लिए यह मुफ्त नहीं है।

हमने निर्भरता विश्लेषण के साथ वृद्धिशील निर्माण के बजाय अधिकतर पुनर्निर्माण के लिए टेरप डिज़ाइन किया है। हम वहां जा रहे हैं लेकिन यह अभी तक नहीं है। टेरप के लिए मीठा स्थान मल्टी-प्लेटफॉर्म, मल्टी-प्रोकार्च, मल्टी-कंपाइलर रिलीज़ में है जहां आप सभी संयोजनों के लिए अलग-अलग कॉन्फ़िगरेशन बनाए रखना नहीं चाहते हैं। इस बिंदु पर (जुलाई '0 9) यह सार्वजनिक बीटा में है, लेकिन इसे जल्द ही जारी किया जाएगा।

2

मैं पिछले पांच वर्षों में एक परियोजना पर काम कर रहा हूं जो x86 और बांह चींटी का उपयोग करता है। हमने जेनेरिक कंपाइलर का उत्पादन करने के हमारे उद्देश्यों के लिए cpptasks tweaked है कि हम केवल एक उपसर्ग में ... जैसे arm-gum-linux-gnueabi- और फिर वास्तविक उपकरण जैसे g ++ या ar या जो भी हो, के लिए प्रीपेड हो जाता है। कोई उपसर्ग का मतलब है कि आपको विकास प्लेटफ़ॉर्म बनाने के टूल मिलते हैं। क्रॉस संकलन के लिए टूलचेन में उनके निर्माण उपकरण बाइनरी पर उन उपसर्ग हैं। किसी भी चीज के बजाय चींटी के बजाय एंटी के साथ जाने का लगभग पूरा कारण cpptasks को अपरिवर्तनीय बिल्ड करने और ऑटोकॉन्फ को खुश रखने के लिए होने वाली सामग्री के उत्थान की क्षमता थी। हम इस प्रतिमान का समर्थन करने में सक्षम हैं कि लगभग किसी भी स्रोत फ़ाइल, विशेष रूप से लाइब्रेरी सेट के लिए फ़ोल्डर वृक्ष संरचना में, जिन्हें बनाया/बदला/हटाया जा सकता है और बिल्ड फ़ाइलों को कोई संपादन करने की आवश्यकता नहीं है। एक छोटी सी कमी यह है कि फ़ाइलों को जोड़ने से गुणों को इस तरह से अद्यतन किया जाता है जो अनावश्यक पुनर्निर्माण का कारण बनता है।

<target name="lib.cvp"> 
<fetch.and.log.version 
    svnvers.target="common/cvp" 
    svnvers.property="libcvp.version"/> 
    <cc objdir="${obj.dir}/common/cvp" 
     commandPrefix="${command.prefix}" 
     compilerName="${compiler.name}" 
     outfile="${lib.dir}/cvp" outtype="static"> 
     <compiler extends="base.compiler"/> 
     <compilerarg 
      value="-D__CVP_LIB_BUILD_VERSION__=&quot;${libcvp.version}&quot;"/> 
     <compilerarg 
      value="-D__BUILD_NOTES__=&quot;${libcvp.toolversion}&quot;"/> 
     <compilerarg if="is.x86" value="-DARCH_X86"/> 
     <linker extends="base.linker"/> 
     <includepath refid="common.inc"/> 
     <fileset dir="${project.home}/common/cvp"> 
      <include name="*.c"/> 
      <include name="*.cpp"/> 
     </fileset> 
    </cc> 
</target> 
संबंधित मुद्दे