कोड को संकलित करने का मानक तरीका क्या है?


22

मैं कभी-कभी स्रोत से एप्लिकेशन संकलित करता हूं और मैं या तो उपयोग कर रहा हूं:

./configure
make
sudo make install

लेकिन हाल ही में, मैं आया था ./autogen.shजो कॉन्फ़िगर करता है और मेरे लिए स्क्रिप्ट बनाता है और उन्हें निष्पादित करता है।

C / C ++ / C # (मोनो) संकलन को सुव्यवस्थित करने के लिए और क्या तरीके हैं? थोड़ा पुराना लगता है। क्या वहाँ नए उपकरण हैं? पसंद को देखते हुए, मुझे किसका उपयोग करना चाहिए?


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

अच्छी बात। मैं वास्तव में मोनो के साथ C # में कोडिंग कर रहा हूं, लेकिन मेरा प्रश्न C / C ++ पर भी लागू होता है।
लुई सालिन

छोटे नोट: autogen.sh आपके लिए बनावटी निष्पादन नहीं करता है, बस कॉन्फ़िगर करें।
सैंडी

@ कैंडी autogen.shज्यादातर कस्टम स्क्रिप्ट हैं, जो आमतौर पर आह्वान करती हैं, autoreconfलेकिन यह भी आह्वान कर सकती हैं ./configureऔर यहां तक ​​कि make। मुझे नहीं लगता कि इसका व्यवहार किसी भी तरह से मानकीकृत है; मुख्य उद्देश्य परियोजना के भीतर एक एक्साइटेबल फाइल रखने का है, जिसे लोग चला सकते हैं (यह जानने के बजाय कि उन्हें autoreconf
कंजर्व

जवाबों:


42

यूनिक्स के एक विकासवादी समस्या को हल करने के लिए ऑटोकॉन्फ़ और ऑटोमेक की स्थापना की गई थी।

जैसा कि यूनिक्स अलग-अलग दिशाओं में विकसित हुआ था, जो डेवलपर्स चाहते थे कि पोर्टेबल कोड इस तरह कोड लिखने के लिए प्रवृत्त हो:

#if RUNNING_ON_BSD
Set things up in the BSD way
#if RUNNING_ON_SYSTEMV
Set things up in the SystemV way
#endif

जैसा कि यूनिक्स को अलग-अलग कार्यान्वयन (बीएसडी, सिस्टमवी, कई विक्रेता कांटे, और बाद में लिनक्स और अन्य यूनिक्स जैसी प्रणालियों) में कांटा लगाया गया था, डेवलपर्स के लिए यह महत्वपूर्ण हो गया कि वे कोड लिखने के लिए पोर्टेबल कोड लिखना चाहते थे जो ऑपरेटिंग सिस्टम के किसी विशेष ब्रांड पर निर्भर नहीं था। , लेकिन ऑपरेटिंग सिस्टम द्वारा उजागर सुविधाओं पर। यह महत्वपूर्ण है क्योंकि एक यूनिक्स संस्करण एक नई सुविधा पेश करेगा, उदाहरण के लिए "भेजें" सिस्टम कॉल, और बाद में अन्य ऑपरेटिंग सिस्टम इसे अपनाएंगे। ब्रांडों और संस्करणों के लिए जाँच किए गए कोड की स्पेगेटी होने के बजाय, डेवलपर्स ने सुविधाओं द्वारा जांच शुरू की, इसलिए कोड बन गया:

#if HAVE_SEND
Use Send here
#else
Use something else
#endif

अधिकांश README फाइलें 90 के नुकीले डेवलपर्स में एक config.h फ़ाइल को संपादित करने के लिए स्रोत कोड को संकलित करने के लिए फाइल करती हैं और टिप्पणी करती हैं कि सिस्टम पर उपलब्ध उचित सुविधाएँ, या परीक्षण किए गए प्रत्येक ऑपरेटिंग सिस्टम कॉन्फ़िगरेशन के लिए मानक config.h फ़ाइलों को शिप करेगी।

यह प्रक्रिया बोझिल और त्रुटि प्रवण दोनों थी और इस तरह से ऑटोकॉन्फ़ आया। आपको ऑटोकॉन्फ़ के बारे में सोचना चाहिए क्योंकि विशेष मैक्रोज़ के साथ शेल कमांड से बनी एक भाषा जो कि config.h की मानव संपादन प्रक्रिया को बदलने के लिए सक्षम थी, जो एक टूल के साथ है जो कार्यक्षमता के लिए ऑपरेटिंग सिस्टम की जांच करती है।

आप आमतौर पर अपने प्रोबिंग कोड को फाइल config.ac में लिखते हैं और फिर ऑटोकॉन्फ़ कमांड चलाते हैं जो इस फाइल को निष्पादन योग्य कॉन्फ़िगर कमांड के लिए संकलित करेगा जिसे आपने देखा है।

इसलिए जब आप चलाते ./configure && makeहैं तो आप अपने सिस्टम पर उपलब्ध सुविधाओं के लिए जांच कर रहे थे और तब कॉन्फ़िगरेशन के साथ निष्पादन योग्य का निर्माण किया गया था।

जब ओपन सोर्स प्रोजेक्ट्स ने सोर्स कोड कंट्रोल सिस्टम का उपयोग करना शुरू किया, तो यह config.ac फ़ाइल में जांच करने के लिए समझ में आया, लेकिन संकलन (कॉन्फ़िगर) का परिणाम नहीं। ऑटोजेन.श मात्र एक छोटी सी लिपि है जो आपके लिए सही कमांड दलीलों के साथ ऑटोकॉन्फ़ कंपाइलर को आमंत्रित करती है।

-

समुदाय में मौजूदा प्रथाओं से स्वचालित विकास भी हुआ। GNU प्रोजेक्ट ने मेकफाइल्स के लिए नियमित लक्ष्य निर्धारित किया:

  • make all परियोजना का निर्माण करेगा
  • make clean परियोजना से सभी संकलित फ़ाइलों को हटा देगा
  • make install सॉफ्टवेयर स्थापित करेगा
  • जैसी चीजों make distऔर make distcheckवितरण के लिए स्रोत तैयार करने और सत्यापित करें कि परिणाम एक पूर्ण स्रोत कोड पैकेज था होगा
  • और इसी तरह...

बिल्डिंग कंप्लीट मेकफाइल्स बोझ बन गए क्योंकि बहुत सारे बॉयलरप्लेट थे जो बार-बार दोहराए जाते थे। तो आटोमकेक एक नया कंपाइलर था जो ऑटोकॉन्फ़ और प्रोसेस्ड "सोर्स" मेकफाइल (मेकफाइल.म नाम) मेकफाइल्स में एकीकृत था जिसे फिर ऑटोकॉनफ को खिलाया जा सकता था।

स्वचालित / ऑटोकॉन्फ़ टूलचेन वास्तव में कई अन्य सहायक उपकरणों का उपयोग करता है और अन्य विशिष्ट कार्यों के लिए उन्हें अन्य घटकों द्वारा संवर्धित किया जाता है। जैसे-जैसे इन आदेशों को चलाने की जटिलता बढ़ती गई, रेडी-टू-रन स्क्रिप्ट की आवश्यकता पैदा हुई और यहीं से ऑटोजेन.शिश की शुरुआत हुई।

जहां तक ​​मुझे पता है, गनोम प्रोजेक्ट था जिसने इस हेल्पर स्क्रिप्ट के उपयोग को पेश किया था


बस एक मामूली नाइट: GNU मानकों को कम से कम सार्वभौमिक रूप से उपलब्ध साधनों के लिए बिल्ड निर्भरता को कम करने के लिए टारबॉल में शिपिंग जनरेट की गई फाइलें अनिवार्य हैं। यदि आपको (उदाहरण के लिए एक संस्करण नियंत्रण प्रणाली से) कच्चा स्रोत मिलता है, तो उत्पन्न फाइलें नहीं होंगी।
वॉनब्रांड

14

इस क्षेत्र में दो "बड़े खिलाड़ी" हैं; Cmake, और GNU ऑटोटूलस।

  • GNU ऑटोटॉल्स चीजों को करने का GNU तरीका है, और * निक्स पर काफी केंद्रित है। यह मेटा-बिल्ड सिस्टम का एक प्रकार है, जो एक उपकरण प्रदान करता है जो विशिष्ट कॉन्फ़िगरेशन उत्पन्न करता है और जो आप करने की कोशिश कर रहे हैं उसके लिए फाइलें बनाते हैं। यह आपके कोड को सीधे आपके बिल्ड सिस्टम में हेरफेर किए बिना आपके कोड में अधिक बदलाव करने में मदद करता है, और यह दूसरों को आपके कोड को उन तरीकों से बनाने में मदद करता है जिन्हें आपने * nix - के लिए डिज़ाइन नहीं किया था।

  • Cmake चीजों को करने का क्रॉस-प्लेटफॉर्म तरीका है। Cmake टीम GCC, विजुअल स्टूडियो, XCode, विंडोज, OSX, Solaris, BSD, GNU / Linux, जो भी हो, कई अलग-अलग तरीकों से सॉफ्टवेयर बनाती है। यदि आप अपने कोड आधार की पोर्टेबिलिटी से चिंतित हैं, तो जाने का रास्ता यही है।

जैसा कि उल्लेख किया गया है, कुछ लोग स्कैन के शौकीन प्रतीत होते हैं। यदि आप पायथन से परिचित हैं तो यह आपके काम के माहौल में अधिक स्थिरता प्रदान कर सकता है।

रूबी में एक प्रकार का मेटा-बिल्ड सिस्टम भी है, जिसे रेक कहा जाता है, जो अपने आप में बहुत अच्छा है, और रूबी के लिए पहले से परिचित लोगों के लिए बहुत आसान है।


6

स्कैन एक संभव प्रतिस्थापन है, हालांकि मेरे पास कोई व्यक्तिगत अनुभव नहीं है। यह पायथन में भी लागू किया गया है, जो एक समस्या हो सकती है, जो कि बिल्ड पर्यावरण पर निर्भर करती है।


2
पोर्टेबिलिटी समस्या नहीं है क्योंकि पायथन अब लगभग हर जगह है। अब तक SCons के बारे में मुख्य शिकायत यह है कि यह अस्वीकार्य रूप से धीमा है। गति के पक्ष में सटीकता का निर्माण करने के लिए कुछ ट्विक्स की आवश्यकता होती है, लेकिन मुझे यकीन नहीं है कि यह अभी भी मेक के बराबर है।
एलेक्स बी

3

यदि आप C # / Mono का उपयोग कर रहे हैं, तो आप अपनी संपूर्ण बिल्ड प्रक्रिया का प्रबंधन करने के लिए msbuild (.sln / .csproj फ़ाइलों का उपयोग MonoDevelop और Visual Studio) द्वारा कर सकते हैं।

फिर आप या तो मोनड्यूवल से निर्माण कर सकते हैं, या चला सकते हैं xbuild अपने पसंदीदा टर्मिनल में कमांड सकते हैं (मोनो> = 2.6 में सबसे अच्छा काम करता है)। यह बेहद आसान है और इसमें आपकी ओर से बहुत अधिक काम की आवश्यकता नहीं है, क्योंकि मोनड्यूडेल आपके लिए msbuild फाइलें संभालेंगे, और आपको उन्हें संपादित करने की आवश्यकता नहीं होगी, जब तक कि आप मोनोएवलप की यूआई आपके लिए क्या कर सकते हैं, उससे परे की चीजों को मोड़ना नहीं चाहते।

मैं इस बात से परिचित नहीं हूं कि जो लोग msbuild पर निर्भर हैं, वे अपनी परियोजनाओं के लिए इंस्टॉल कैसे संभालते हैं, लेकिन आप हमेशा पूछ सकते हैं। ;-)


हाँ, मैं xbuild के बारे में जानता हूँ, लेकिन मैं खुद को IDEs से वीन करने की कोशिश कर रहा हूँ जो सिर्फ मेरा हाथ पकड़ना चाहते हैं। इसके अलावा, मोनो मोनो का उपयोग करके संकलित किया गया है और ऑटोकॉन्फ़ का उपयोग करता है, इसलिए मैं थोड़ा और जानना चाहता था। धन्यवाद!
लुई सालिन

1
दिलचस्प बात यह है कि बहुत सारी मोनो परियोजनाएं अब एमएसबिल्ट की ओर पलायन करने की कोशिश कर रही हैं कि xbuild इतनी अच्छी तरह से काम कर रहा है। यह विंडोज / मैक सपोर्ट को थोड़ा आसान बनाता है। मोनो के पास इतना सी कोड है कि मुझे यकीन नहीं है कि उनके लिए xbuild को स्थानांतरित करना कितना व्यावहारिक होगा। लेकिन ऑटोकॉनफ़ महान काम करता है, इसलिए आपके लिए जो भी काम करता है। :-)
सैंडी

0

C # के लिए आप xbuild (और विंडोज़ पर msbuild) का उपयोग कर सकते हैं, जो आपकी प्रोजेक्ट फ़ाइलों से प्रोजेक्ट का निर्माण करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.