Makefiles को "इंस्टॉल" लक्ष्य क्यों होना चाहिए?


18

C और C ++ की दुनिया से आने वाले, अधिकांश बिल्ड सिस्टम में एक installलक्ष्य होता है, विशेष रूप से मेकफाइल्स (जहां यह उदाहरण के लिए GNU द्वारा अनुशंसित है ) या CMake । यह लक्ष्य ऑपरेटिंग सिस्टम (उदाहरण के लिए, C:\Program Files\विंडोज में) में रनटाइम फाइल्स (एक्जीक्यूटिव, लाइब्रेरी, ...) को कॉपी करता है ।

यह वास्तव में हैकिंग लगता है, क्योंकि मेरे लिए यह प्रोग्राम स्थापित करने के लिए बिल्ड सिस्टम की जिम्मेदारी नहीं है (जो वास्तव में ऑपरेटिंग सिस्टम / पैकेज मैनेजर की जिम्मेदारी है)। इसका अर्थ यह भी है कि बिल्ड सिस्टम या बिल्ड स्क्रिप्ट को पर्यावरण के चर, रजिस्ट्री चर, सहानुभूति, अनुमति, आदि के साथ स्थापित कार्यक्रमों के संगठन को जानना चाहिए

सबसे अच्छा में निर्माण प्रणाली एक होना चाहिए releaseकि इच्छा उत्पादन एक स्थापना योग्य प्रोग्राम (उदाहरण के लिए लक्ष्य .debया .msi), और फिर कृपया ऑपरेटिंग सिस्टम है कि कार्यक्रम को स्थापित करने के लिए कहें। यह उपयोगकर्ता को टाइप करने के बिना अनइंस्टॉल करने की भी अनुमति देगा make uninstall

तो, मेरा सवाल है: निर्माण प्रणाली आमतौर पर installलक्ष्य रखने की सलाह क्यों देती है ?


7
आपका तर्क है कि "मेक इनस्टॉल" एक बिल्ड सिस्टम की ज़िम्मेदारी के दायरे में नहीं आता है, लेकिन बहुत अधिक शामिल और प्लेटफ़ॉर्म विशिष्ट इंस्टाल करने योग्य पैकेज बनाने की ज़िम्मेदारी करता है।
pmf

2
वैसे भी: कभी-कभी आप एक ऐसा एप्लिकेशन इंस्टॉल करना चाहते हैं जो ओएस / पैकेज मैनेजर द्वारा नियंत्रित नहीं किया जाता है (क्योंकि इसमें निर्भरताएं हैं जो पैकेज मैनेजर आदि का उपयोग करने के लिए संघर्षों को हल करना असंभव पैदा करेगा)। make installआम तौर पर "कोर ओएस / पैकेज मैनेजमेंट सिस्टम" द्वारा नियंत्रित नहीं की जाने वाली निर्देशिका के तहत /usr/local(या यहां तक ​​कि /opt) स्थापित करता है । कोई विचार नहीं है कि क्या विंडोज में कुछ समान सम्मेलन हैं।
बकुरीउ

11
"यह वास्तव में हैकी लगता है।" खैर, आपको C / C ++ की दुनिया से क्या उम्मीद थी? ;-)
मेसन व्हीलर

1
ध्यान दें कि make installजब हम क्रॉस-कंपाइलिंग के बारे में बात करते हैं, तो कोई मतलब नहीं है
हेगन वॉन एटिज़ेन

1
@ HagenvonEitzen इसके साथ करता है DESTDIR
नक्स 'vi-vim-nvim'

जवाबों:


23

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


मैं उन प्रणालियों के बारे में उत्सुक हूं जहां make installप्राथमिकता दी जाती है। इसके अलावा, मेरा मतलब प्रोग्राम मैनेजर था जब मैंने कहा कि मेकफाइल्स को इंस्टाल करने योग्य पैकेज बनाने चाहिए। मुझे लगता है कि लगभग सभी ओएस स्थापित कार्यक्रमों को प्रबंधित करने का एक तरीका है? उदाहरण के लिए, विंडोज का कोई पैकेज मैनेजर (स्टोर के अलावा) नहीं है, लेकिन फिर भी इंस्टॉल किए गए प्रोग्राम ( .msiउदाहरण के लिए पैकेज के माध्यम से ) प्रबंधित करने का एक तरीका है
Synxis

2
@ सिनक्सिस बीएसडी, लिनक्स, यूनिक्स सभी मेकफाइल्स का उपयोग करते हैं। चाहे उन्हें स्थापना के लिए उपयोग करना पसंद है, मुझे नहीं पता, लेकिन आपके पास अक्सर उपयोग करने की क्षमता है make install
रोब

1
डेबियन में कम से कम दो कारणों checkinstallसे make installइसका उपयोग करना पसंद किया जाता है: "आप आसानी से एक कदम के साथ पैकेज को निकाल सकते हैं।" और "आप कई मशीनों पर परिणामी पैकेज स्थापित कर सकते हैं।" - के रूप में जाँच स्थापना एक .deb बनाता है और इसे स्थापित करता है, यह पैकेज प्रबंधक का उपयोग करता है ...
हारून हॉल

1
@ साइनएक्सिस - कई लाइनक्स डिस्ट्रीब्यूशन (अक्सर स्रोत डिस्ट्रोस कहा जाता है) जहां पैकेज मैनेजर एक टार फाइल डाउनलोड करके प्रोग्राम इंस्टॉल करता है, इसे make install
डिकम्प्रेस

1
@AaronHall मुझे सही करें यदि मैं गलत हूं, लेकिन मुझे यह धारणा मिली कि एक checkinstallआह्वान वास्तव में पैकेज बिल्डिंग के लिए उपयोग make install और निगरानी करेगा।
सेंटास्टर - मोनिका

5

A makefileका कोई installलक्ष्य नहीं हो सकता है , और इससे भी महत्वपूर्ण बात यह है कि आपके पास ऐसे प्रोग्राम हो सकते हैं जो कि इंस्टाल करने योग्य भी न हों (जैसे कि उन्हें अपनी बिल्ड डायरेक्टरी से चलाना चाहिए, या क्योंकि वे कहीं भी इंस्टॉल किए जा सकते हैं)। installलक्ष्य सिर्फ एक है सम्मेलन सामान्य के लिए makefile-s।

हालांकि, कई कार्यक्रमों को चलाने के लिए बाहरी संसाधनों की आवश्यकता होती है (उदाहरण के लिए: फोंट, डेटाबेस, कॉन्फ़िगरेशन फ़ाइलें, आदि)। और उनके निष्पादन योग्य अक्सर इन संसाधनों के बारे में कुछ परिकल्पना करते हैं। उदाहरण के लिए, आपका bashशेल आम तौर पर /etc/bash.bashrcआदि से कुछ इनिशियलाइज़ेशन फ़ाइल को पढ़ेगा । .... ये संसाधन आम तौर पर फ़ाइल सिस्टम ( फ़ाइल पदानुक्रम के बारे में सम्मेलनों के लिए hier (7) देखें ) में हैं और डिफ़ॉल्ट फ़ाइल पथ आपके निष्पादन योग्य में बनाया गया है।

अपने सिस्टम के अधिकांश निष्पादकों पर स्ट्रिंग्स (1) का उपयोग करने का प्रयास करें । आपको पता चल जाएगा कि कौन से फ़ाइल पथ इसके लिए जाने जाते हैं।

BTW, कई GNU प्रोग्राम का उपयोग करने के लिए autoconf, आप make install DESTDIR=/tmp/destdir/रूट किए बिना चला सकते हैं । फिर /tmp/destdir/उन फाइलों से भर जाता है जिन्हें बाद में पैक किया जाना चाहिए।

एफडब्ल्यूआईडब्ल्यू , मुझे विश्वास है कि मेरा बिस्मोन ( जीपीएलवी 3 + लाइसेंस प्राप्त) कार्यक्रम (मेरे बिस्मों-रथ-डॉक.पीडीएफ रिपोर्ट में वर्णित ) "स्थापित" नहीं हो सकता है; मुझे यकीन नहीं है कि मैं यह साबित करने में सक्षम हूं, और मैं कल्पना नहीं कर सकता कि मैं उस कार्यक्रम को कैसे स्थापित कर सकता हूं।


2
DESTDIR या अन्य उपसर्ग बहुत बार भूल जाते हैं। जैसे ही बाहरी संसाधन जैसे कि गतिशील पुस्तकालय शामिल होते हैं, यह जानना संभव नहीं है कि यह स्थापित किए बिना सॉफ़्टवेयर का निर्माण कहाँ होगा । गैर-मानक स्थानों, जैसे या में स्थापित करने के लिए भी बढ़िया है । विभिन्न उपसर्गों से बचने का एकमात्र तरीका कंटेनरों का उपयोग करना है, लेकिन यह निश्चित रूप से एक लिनक्स-विशिष्ट समाधान है। /opt$HOME
आमोन

2
मैंने एक से अधिक पैकेज देखे हैं कि यदि आपने DESTDIR = / tmp / destdir आज़माया तो बाद में काम नहीं करेगा जब सामान्य स्थान पर स्थापित किया जाएगा क्योंकि DESTDIR का उपयोग पथ निर्माण में किया गया था।
जोशुआ

@ आमोन: मुझे यकीन नहीं है कि मैं कंटेनरों को लिनक्स-विशिष्ट के रूप में चिह्नित करूंगा। लिनक्स कंटेनरीकरण के लिए एक सामान्य लक्ष्य मंच हो सकता है, लेकिन अधिकांश आधुनिक ऑपरेटिंग सिस्टम में कंटेनर तकनीक का कुछ रूप मौजूद है।
केविन

1
@ जोशुआ यह नहीं होना चाहिए, DESTDIR केवल इंस्टाल स्टेप के दौरान प्रासंगिक होना चाहिए। आपको ऐसा करने में सक्षम होना चाहिए: ./configure --prefix="/opt/foo" && make && DESTDIR=/tmp/foo make install और /opt/fooबिना किसी समस्या के पैकेज को स्थानांतरित करने में सक्षम होना चाहिए ।
नक्स 'vi-vim-nvim'

3

कई कारण हैं जो मन में आते हैं।

  • सॉफ्टवेयर बनाने वाले कई पैकेज - उदाहरण के लिए डेबियन बिल्ड सिस्टम, और IIRC rpm - साथ ही बिल्डिंग स्क्रिप्ट से प्रोग्राम को कुछ विशेष उपनिर्देशिका में "इंस्टॉल" करने की उम्मीद है। तो यह दोनों दिशाओं में पिछड़ी अनुकूलता से प्रेरित है।
  • कोई उपयोगकर्ता सॉफ़्टवेयर को किसी स्थानीय स्थान पर स्थापित करना चाह सकता है, जैसे $HOMEनिर्देशिका में। सभी पैकेज मैनेजर इसका समर्थन नहीं करते हैं।
  • अभी भी ऐसे वातावरण हो सकते हैं जिनमें पैकेज नहीं हैं।

मैंने सवाल को थोड़ा सा हटा दिया, मेरा मतलब प्रोग्राम मैनेजर से था जब मैंने कहा कि मेकफाइल्स को इंस्टाल करने योग्य पैकेज बनाने चाहिए।
Synxis

1

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

मान लें कि आप ओपन सोर्स प्रोजेक्ट FOO का उपयोग कर रहे हैं जो वर्तमान में 2.0.1 संस्करण पर है और आप संस्करण 1.3.0 का उपयोग कर रहे हैं। आप इसके बाद के संस्करण का कुछ भी उपयोग नहीं करना चाहते हैं क्योंकि संस्करण 2.0.0 आप वर्तमान में क्या कर रहे हैं के साथ असंगत है, लेकिन 2.0.1 में एक एकल बग फिक्स है जिसकी आपको सख्त आवश्यकता है। बीत रहा है make installविकल्प देना आप एक पैकेज बनाने और अपने सिस्टम पर इसे स्थापित के बारे में चिंता किए बिना संशोधित 1.3.0 सॉफ्टवेयर स्थापित है।


1

लिनक्स वितरण आमतौर पर पैकेज रखरखाव से प्रोग्राम रखरखाव को अलग करता है। एक निर्माण प्रणाली जो पैकेज जनरेशन को एकीकृत करती है, प्रोग्राम मेंटेनरों को पैकेज रखरखाव करने के लिए मजबूर करेगी।

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

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

यह "पार्टी श्रृंखला के शीर्ष" समस्याओं में से एक है जो मल्टी-पार्टी सिस्टम में विशिष्ट हैं। यदि आपके पास कई जटिल प्रणालियां हैं, तो स्पष्ट पदानुक्रम होना चाहिए कि कौन सी प्रणाली अन्य सभी के समन्वय के लिए जिम्मेदार है।

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

पैकेज मैनेजर यहां बिल्ड सिस्टम और रिपॉजिटरी के बीच में खड़ा है, और दोनों के साथ अच्छी तरह से एकीकृत करने के लिए सबसे अच्छी स्थिति में है।

आपने देखा होगा कि केवल कुछ ही जावास्क्रिप्ट पैकेज उपलब्ध हैं जिनके माध्यम से npmभी उपलब्ध है apt- यह मुख्य रूप से है क्योंकि जावास्क्रिप्ट लोगों ने निर्णय लिया कि npmऔर संबंधित रिपॉजिटरी उनकी खाद्य श्रृंखला के शीर्ष होने जा रही है, जिसने इसे असंभव के करीब बना दिया इन पैकेजों को डेबियन पैकेज के रूप में शिप करें।

मेरे डेबियन डेवलपर टोपी के साथ: यदि आप खुले स्रोत सॉफ़्टवेयर जारी करते हैं, तो कृपया वितरण अनुरक्षकों को पैकेजिंग छोड़ दें। यह आपके और हमारे दोनों कार्यों को बचाता है।


आपने इस बारे में कुछ भी नहीं कहा है कि एक इंस्टॉल टारगेट क्यों है, और यह मुझे लगता है कि आपने जो लिखा है, उसमें से अधिकांश इस पर भी लागू होगा ...
curiousdannii

1
@curiousdannii, बिल्ड सिस्टम और पैकेज मैनेजर के बीच कुछ इंटरफ़ेस होना चाहिए , और यह सबसे सरल होने के लिए होता है, इसलिए यह जीत गया।
सिमोन रिक्टर

1

खैर, एप्लिकेशन डेवलपर्स वही हैं जो जानते हैं कि प्रत्येक फ़ाइल को कहां जाना चाहिए। वे दस्तावेज़ीकरण में इसे छोड़ सकते हैं, और पैकेज मेंटेनर पढ़ सकते हैं और प्रत्येक पैकेज के लिए एक स्क्रिप्ट का निर्माण कर सकते हैं। हो सकता है कि पैकेज मेंटेनर्स डॉक्यूमेंटेशन का गलत मतलब निकालेंगे और स्क्रिप्ट को तब तक डिबग करना होगा जब तक वह काम न करे। यह अक्षम्य है। एप्लिकेशन डेवलपर के लिए बेहतर है कि वह अपने द्वारा लिखे गए एप्लिकेशन को ठीक से स्थापित करने के लिए स्क्रिप्ट लिखें।

वह एक मनमाना नाम के साथ एक स्थापित स्क्रिप्ट लिख सकता है या शायद इसे किसी अन्य स्क्रिप्ट की प्रक्रिया का हिस्सा बना सकता है। हालाँकि, एक मानक स्थापित कमांड, make install(एक कन्वेंशन जो पैकेज मैनेजरों को पहले से बताता है), पैकेज बनाना वास्तव में आसान है। यदि आप आर्कलिनक्स पैकेज बनाने के लिए PKGBUILD टेम्पलेट को देखते हैं , तो आप देख सकते हैं कि वास्तव में पैकेज जो फ़ंक्शन करता है वह केवल ए make DESTDIR="$pkgdir/" install। यह संभवतः अधिकांश पैकेजों के लिए काम करता है और शायद थोड़ा संशोधन के साथ। make(और ऑटोटूलस) मानक होने के लिए धन्यवाद , पैकेजिंग वास्तव में आसान है।

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