हमेशा क्यों ./configure; बनाना; स्थापित करें; 3 अलग चरणों के रूप में?


118

हर बार जब आप स्रोत से कुछ संकलित करते हैं, तो आप उसी 3 चरणों से गुजरते हैं:

$ ./configure
$ make
$ make install

मैं समझता हूं, कि इंस्टाल करने की प्रक्रिया को अलग-अलग चरणों में विभाजित करने के लिए समझ में आता है, लेकिन मुझे यह नहीं मिलता है, क्यों इस ग्रह पर प्रत्येक कोडर को एक ही काम करने के लिए बार-बार एक ही तीन कमांड लिखना पड़ता है। मेरे दृष्टिकोण से, यह पूरी तरह से समझ में आता है कि ./install.shस्क्रिप्ट को स्वचालित रूप से स्रोत कोड के साथ दिया जाएगा जिसमें निम्नलिखित पाठ शामिल हैं:

#!/bin/sh
./configure
make
make install

लोग अलग-अलग 3 चरण क्यों करेंगे?


2
यदि बिल्ड सिस्टम सही ढंग से लिखा गया है - और यह आमतौर पर है - आप दूसरे चरण को छोड़ सकते हैं।
रीइनियरियरपोस्ट

आपका प्रश्न मूर्खतापूर्ण नहीं है। आप लिनक्स वातावरण में अपने प्रोग्राम का निर्माण कर सकते हैं और उसके बाद आप कुछ वर्चुअलाइजेशन एप्लिकेशन द्वारा उपयोग कर सकते हैं या आप सीधे mingw का उपयोग करके विंडोज़ वातावरण में निर्माण कर सकते हैं।
Mihai8

जवाबों:


121

क्योंकि प्रत्येक चरण अलग-अलग काम करता है

निर्माण के लिए (सेटअप) वातावरण तैयार करें

./configure

इस स्क्रिप्ट में बहुत सारे विकल्प हैं जिन्हें आपको बदलना चाहिए। जैसा --prefixया --with-dir=/foo। इसका मतलब है कि हर सिस्टम का अलग कॉन्फ़िगरेशन होता है। ./configureलापता पुस्तकालयों के लिए भी जांच की जाती है जिन्हें स्थापित किया जाना चाहिए। यहां कुछ भी गलत आपके एप्लिकेशन का निर्माण नहीं करने का कारण बनता है । यही कारण है कि डिस्ट्रोस के पैकेज अलग-अलग जगहों पर स्थापित होते हैं, क्योंकि हर डिस्ट्रो सोचता है कि कुछ लाइब्रेरी और फाइलों को कुछ निर्देशिकाओं में इंस्टॉल करना बेहतर है। इसे चलाने के लिए कहा जाता है ./configure, लेकिन वास्तव में आपको इसे हमेशा बदलना चाहिए।

उदाहरण के लिए पर एक नजर है आर्क लिनक्स संकुल साइट । यहां आप देखेंगे कि कोई भी पैकेज एक अलग कॉन्फ़िगर पैरामीटर का उपयोग करता है (मान लें कि वे निर्माण प्रणाली के लिए ऑटोटूल का उपयोग कर रहे हैं)।

सिस्टम का निर्माण

make

यह वास्तव make allमें डिफ़ॉल्ट रूप से है। और हर मेक को करने के लिए अलग-अलग क्रियाएं होती हैं। कुछ निर्माण करते हैं, कुछ निर्माण के बाद परीक्षण करते हैं, कुछ बाहरी एससीएम रिपॉजिटरी से चेकआउट करते हैं। आमतौर पर आपको कोई पैरामीटर नहीं देना पड़ता है, लेकिन फिर से कुछ पैकेज उन्हें अलग तरीके से निष्पादित करते हैं।

सिस्टम में स्थापित करें

make install

यह कॉन्फ़िगर के साथ निर्दिष्ट स्थान पर पैकेज स्थापित करता है। यदि आप चाहते हैं कि आप ./configureअपने घर निर्देशिका को इंगित कर सकें । हालाँकि, बहुत सारे कॉन्फ़िगर विकल्प /usrया की ओर इशारा करते हैं /usr/local। इसका मतलब है कि तब आपको वास्तव में उपयोग करना होगा sudo make installक्योंकि केवल रूट ही / usr और / usr / लोकल में फाइल कॉपी कर सकता है।


अब आप देखते हैं कि प्रत्येक चरण अगले चरण के लिए पूर्व आवश्यकता है। प्रत्येक चरण एक समस्या रहित प्रवाह में काम करने की तैयारी है। Distros इस रूपक का उपयोग संकुल बनाने के लिए करते हैं (जैसे RPM, deb, आदि)।

यहाँ आप देखेंगे कि प्रत्येक चरण वास्तव में एक अलग स्थिति है। इसीलिए पैकेज मैनेजरों के अलग-अलग रैपर होते हैं। नीचे एक आवरण का एक उदाहरण है जो आपको एक कदम में पूरे पैकेज का निर्माण करने देता है। लेकिन याद रखें कि प्रत्येक एप्लिकेशन का एक अलग आवरण होता है (वास्तव में इन आवरणों का एक नाम होता है जैसे कल्पना, PKGBUILD, आदि):

def setup:
... #use ./configure if autotools is used

def build:
... #use make if autotools is used

def install:
... #use make all if autotools is used

यहाँ एक ऑटोटूलस का उपयोग कर सकते हैं, इसका मतलब है कि ./configure, makeऔर make install। लेकिन दूसरा कोई SCons, Python संबंधित सेटअप या कुछ अलग का उपयोग कर सकता है।

जैसा कि आप देख रहे हैं कि प्रत्येक राज्य को विभाजित करने और बनाए रखने के लिए चीजें बहुत आसान हो जाती हैं, खासकर पैकेज मेंटेनर और डिस्ट्रोस के लिए।


23
इसे फिर से पढ़ना, लगभग एक साल बाद, मुझे यह जोड़ना होगा कि यह सब समझ में आता है, और अभी भी एक ही कमांड कॉल हो सकता है जो सभी 3 चरणों को उनके डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ करता है। उन सभी में एक डिफ़ॉल्ट कॉन्फ़िगरेशन है अन्यथा आप उन्हें बिना तर्क के कॉल नहीं कर सकते।
erikbwork

कभी-कभी मैं बिना मेक इनस्टॉल कर सकता हूं। इसका क्या मतलब है? अगर मैं बनाना छोड़ दूं, तो मैं सिर्फ इंस्टॉल कर सकता हूं?
CMCDragonkai

3
installallइसलिए make installकॉल पर निर्भर करेगाmake all

उत्कृष्ट उत्तर, हालांकि मुझे समझ नहीं आता कि कभी-कभी एक मेक इनस्टॉल की आवश्यकता क्यों होती है और अन्य बार नहीं (एक ही मेक, सभी जादू करते हैं)
हन्नीबेल 90

make installबस पूर्व-परिभाषित स्थान पर विभिन्न संसाधन स्थापित करें। यदि आप केवल निष्पादन योग्य फ़ाइल की परवाह करते हैं, तो आप निर्माण निर्देशिका से निष्पादन योग्य फ़ाइल का उपयोग कर सकते हैं और अपने पीएटीएच में बिल्ड डीआईआर जोड़ सकते हैं।
jdhao

31

सबसे पहले, यह होना चाहिए ./configure && make && make installक्योंकि प्रत्येक पूर्व की सफलता पर निर्भर करता है। कारण का हिस्सा विकास है और कारण का हिस्सा विकास वर्कफ़्लो के लिए सुविधा है।

मूल रूप से, अधिकांश Makefiles में केवल एक प्रोग्राम संकलित करने के लिए कमांड होंगे और इंस्टॉलेशन उपयोगकर्ता के लिए छोड़ दिया गया था। एक अतिरिक्त नियम make installसंकलित आउटपुट को उस स्थान पर रखने की अनुमति देता है जो सही हो सकता है; अभी भी बहुत सारे अच्छे कारण हैं जो आप ऐसा नहीं करना चाहते हैं, जिसमें सिस्टम प्रशासक शामिल नहीं है, इसे बिल्कुल भी स्थापित नहीं करना चाहते हैं। इसके अलावा, अगर मैं सॉफ्टवेयर विकसित कर रहा हूं, तो शायद मैं इसे स्थापित नहीं करना चाहता। मैं कुछ बदलाव करना चाहता हूं और अपनी निर्देशिका में बैठे संस्करण का परीक्षण करना चाहता हूं। अगर मैं एक से अधिक संस्करणों के साथ जा रहा हूँ तो यह और भी अधिक लाजवाब हो जाता है।

./configureजाता है और पता लगाता है कि पर्यावरण में क्या उपलब्ध है और / या सॉफ्टवेयर का निर्माण करने के लिए उपयोगकर्ता द्वारा वांछित है। यह ऐसा कुछ नहीं है जिसे बहुत बार बदलने की आवश्यकता है और अक्सर कुछ समय लग सकता है। फिर, अगर मैं एक डेवलपर हूं, तो लगातार पुन: कॉन्फ़िगर करने के लिए समय के लायक नहीं है। इससे भी महत्वपूर्ण बात यह है कि चूंकि makeमॉड्यूल पुन: निर्माण करने के लिए टाइमस्टैम्प का उपयोग करता है, अगर मैं फिर से दौड़ता हूं तो configureसंभावना है कि झंडे बदल जाएंगे और अब मेरे निर्माण में कुछ घटक एक झंडे के सेट के साथ और दूसरे झंडे के अलग-अलग सेट के साथ संकलित किए जाएंगे। अलग, असंगत व्यवहार। जब तक मैं फिर से नहीं दौड़ता configure, मुझे पता है कि मेरे संकलन का वातावरण समान रहता है, भले ही मैं अपने स्रोतों को बदल दूं। अगर मैं फिर से दौड़ता हूं configure, तो मुझे चाहिएmake clean सबसे पहले, किसी भी निर्मित स्रोतों को हटाने के लिए यह सुनिश्चित करने के लिए कि चीजें समान रूप से निर्मित हैं।

एक ही मामला जहां तीन कमांड को एक पंक्ति में चलाया जाता है, जब उपयोगकर्ता प्रोग्राम इंस्टॉल करते हैं या एक पैकेज बनाया जाता है (उदाहरण के लिए, डेबियन का डिब्यूल्ड या रेडहैट का rpmbuild)। और यह मान लिया कि पैकेज को एक सादा दिया जा सकता है configure, जो आमतौर पर पैकेजिंग के लिए मामला नहीं है, जहां, कम से कम, --prefix=/usrवांछित है। और pacakger make installहिस्सा करते समय नकली-जड़ों से निपटने के लिए पसंद करते हैं । चूंकि बहुत सारे अपवाद हैं, ./configure && make && make installइसलिए नियम बनाना बहुत सारे लोगों के लिए असुविधाजनक होगा जो इसे कहीं अधिक लगातार आधार पर करते हैं!


2
के साथ सलाह के लिए धन्यवाद &&!
एरिकबवर्क

4

सबसे पहले ./configure को हमेशा वह सब कुछ नहीं मिलता है जिसकी उसे जरूरत होती है, या अन्य मामलों में उसे वह सब कुछ मिल जाता है जिसकी उसे आवश्यकता होती है लेकिन वह सब कुछ नहीं जिसका वह उपयोग कर सकता है। उस स्थिति में आप इसके बारे में जानना चाहेंगे (और आपकी ./install.sh स्क्रिप्ट वैसे भी विफल हो जाएगी!) मेरे दृष्टिकोण से, अनपेक्षित परिणामों के साथ गैर-विफलता का क्लासिक उदाहरण, ffmpeg या mplayer जैसे बड़े अनुप्रयोगों को संकलित कर रहा है। यदि वे उपलब्ध हैं, तो ये पुस्तकालयों का उपयोग करेंगे, लेकिन अगर वे नहीं हैं, तो कुछ विकल्पों को अक्षम कर देंगे। समस्या यह है कि आप बाद में पता चलता है कि यह कुछ प्रारूप या किसी अन्य के लिए समर्थन के बिना संकलित किया गया था, इस प्रकार आपको वापस जाने और इसे फिर से करने की आवश्यकता होती है।

एक और बात ।/configure कुछ अंतःक्रियात्मक रूप से आपको यह अनुकूलित करने का विकल्प दे रहा है कि सिस्टम पर जहां एप्लिकेशन इंस्टॉल किया जाएगा। अलग-अलग वितरण / वातावरण में अलग-अलग परंपराएं हैं, और आप शायद अपने सिस्टम पर सम्मेलन से चिपके रहना चाहते हैं। इसके अलावा, आप इसे स्थानीय रूप से (केवल अपने लिए) स्थापित करना चाह सकते हैं। परंपरागत रूप से ./configure और स्टेप्स को रूट के रूप में नहीं चलाया जाता है, जबकि इनस्टॉल करें (जब तक कि यह पूरी तरह से खुद के लिए स्थापित न हो) को रूट के रूप में चलाना होगा।

विशिष्ट वितरण अक्सर स्क्रिप्ट प्रदान करते हैं जो इसे निष्पादित करते हैं। वितरण-संवेदी तरीके से .install.sh कार्यक्षमता - उदाहरण के लिए, स्रोत RPMs + कल्पना फ़ाइल + rpmbuild या slackbuilds

(फुटनोट: जो कहा जा रहा है, मैं सहमत हूं कि /। कॉन्फ़िगर करें; स्थापित करें; बेहद थकाऊ हो सकते हैं।)


सभी समझ में आता है, लेकिन मेरी नजर में इनमें से कोई भी संभावना नष्ट नहीं होती है यदि आपके पास एक अतिरिक्त फाइल है जो तीन चरणों को जोड़ती है। उदाहरण के लिए, यदि आप कुछ कॉन्फ़िगर किए गए stdout को पढ़ना चाहते हैं, तो आप इसके लिए अभी भी संक्षिप्त कर सकते हैं या पूरे stdout को किसी फ़ाइल में डाल सकते हैं और बाद में पढ़ सकते हैं।
erikbwork

3
सच है, लेकिन फिर, एक फ़ाइल की आवश्यकता क्यों है? बस एक उपनाम का उपयोग करें (हालांकि आपको 'कन्फ़र्मिन्स' की तुलना में बेहतर / छोटे नाम के बारे में सोचना होगा, मैं आज अनिच्छुक हूँ!)। उर्फ कन्फ़ेकिंस = '। / कॉन्फ़िगर && मेक && सुडो मेक इनस्टॉल'; सीडी स्रोत निर्देशिका; confmakeins;
सोज

बढ़िया है। मैंने कभी खुद को एक उपनाम नहीं लिखा, इसलिए मैंने इसके बारे में नहीं सोचा!
एरिकबवर्क 13

3

configure विफल हो सकता है अगर यह पाता है कि निर्भरता गायब हैं।

makeडिफ़ॉल्ट लक्ष्य चलाता है, जो पहले मेकफाइल में सूचीबद्ध है। अक्सर यह लक्ष्य होता है all, लेकिन हमेशा नहीं। तो आप केवल make all installतभी जान सकते हैं जब आप जानते हैं कि लक्ष्य था।

इसलिए ...

#!/bin/sh

if ./configure $*; then
  if make; then
    make install
  fi
fi

या:

./configure $* && ./make && ./make install

$*शामिल है क्योंकि एक अक्सर करने के लिए विकल्प प्रदान करने के लिए किया जाता है configure

लेकिन सिर्फ लोगों को ही ऐसा क्यों करने दिया जाए? क्या यह वाकई इतनी बड़ी जीत है?


1
यह घातक नहीं है, लेकिन यह इस बारे में है कि हम प्रोग्रामर क्या करते हैं: हमारे लिए दोहराए जाने वाले कार्यों को करने के लिए कंप्यूटर प्राप्त करना। सही?
एरिकबवर्क

1
खैर ... configureग्नू ऑटोमैटेक टूलकिट का एक हिस्सा है, जो मेक-अप पर मेक-अप की तरह है। मेक ने कई वर्षों के लिए लगभग किया है, और अपना काम अच्छी तरह से करता है। उस ने कहा, लोग मेक प्रोसेस को संभालने के लिए अन्य तरीकों के साथ आए हैं। चींटी और सेमीके के अपने अनुयायी हैं। लेकिन निर्माण प्रक्रिया के हिस्से (जैसे कॉन्फ़िगर करना, भवन बनाना और स्थापित करना) अभी भी सभी अलग-अलग कमांड हैं।
घटि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.