2011-12-29 8 views
6

ऑटोोटूल का उपयोग करने वाले अधिकांश पैकेज उपयोगकर्ता-स्तरीय उपयोगिताओं या कम से कम उच्च-पर्याप्त स्तर होने के लिए बाइनरी इंस्टॉल करें पूरी तरह से नीचे/usr, या पूरी तरह से नीचे/usr के लिए पर्याप्त कम है।जीएनयू ऑटोटूल: बाइनरी/बिन,/एसबीएन,/यूएसआर/बिन और/यूएसआर/एसबीएन, इंटरफेक्शन - रेफिक्स और डेस्टडीर

मैं एक पैकेज है कि/बिन में कुछ फ़ाइलों को स्थापित करने के लिए की आवश्यकता होगी लिख रहा हूँ,/sbin,/usr/bin और/usr/sbin में कुछ। यह कई मौजूदा बाइनरी को प्रतिस्थापित कर रहा है जिन्हें परंपरागत रूप से उन स्थानों के तहत रखा जाता है।

इसे/lib/सुरक्षा में एक पीएएम मॉड्यूल स्थापित करने की आवश्यकता है (और जाहिर है/usr/lib/सुरक्षा काम नहीं करेगा)।

अब समस्या है: डिफ़ॉल्ट कॉन्फ़िगर का उपसर्ग/usr/स्थानीय (मैं अपने configure.ac में कि डिफ़ॉल्ट नियंत्रित कर सकते हैं) हो रहा है, और कम से कम Gentoo Linux के डिफ़ॉल्ट है उपसर्ग =/usr (कि एक समस्या है क्योंकि यह मेरे config.ac में रखे गए किसी भी डिफ़ॉल्ट को ओवरराइड करता है)।

मैं इस बारे में एक संक्षिप्त रूप से विचार कर रहा था कि इस तरह के अन्य पैकेज इस मुद्दे से कैसे निपट रहे हैं। यहाँ मेरी निष्कर्ष हैं:

  • बैश-4.1/usr/bin में स्थापित करने के लिए लगता है, और distro निर्माण स्क्रिप्ट बैश बाइनरी/bin ले जाने
  • लिनक्स-पीएएम configure.ac में हैक्स है ताकि यदि उपसर्ग "/ usr" है, यह इसकी कुछ फ़ाइलों के लिए "/ sbin" और "/ lib" का उपयोग करने जा रहा है। यह "/ usr" को डिफ़ॉल्ट उपसर्ग भी सेट करता है। मुझे यकीन नहीं है कि क्या होता है यदि उपयोगकर्ता एक अलग --prefix पास करता है।
  • शैडो-यूटिल्स अगर उपसर्ग "/ usr" है तो exec_prefix को सेट करें। तब bin_PROGRAMS करने के लिए "/ bin" संदर्भित करता है, और ubindir "$ {उपसर्ग}/बिन" को इंगित करने की घोषणा की है, ताकि ubin_PROGRAMS करने के लिए "/ usr/bin"

मेरे सवाल कर रहे हैं संदर्भित करता है:

  • --prefix के लिए अन्य distros 'डिफ़ॉल्ट क्या हैं? क्या मैं उचित रूप से यह हमेशा/usr मान सकता हूँ? मैं केवल इस बिंदु पर लिनक्स के बारे में चिंतित हूं, बीएसडी नहीं।
  • उपरोक्त में से कौन सा समाधान सबसे साफ लगता है? क्या आप कुछ बेहतर समाधान देखते हैं?
  • उपर्युक्त समाधानों के साथ संभावित समस्याएं क्या हैं? क्या उन समस्याओं के कुछ समाधान हैं?
  • मैं सब कुछ "/ bin" में स्थापित करने और संगतता सिम्लिंक बनाने के साथ ठीक हूं। क्या यह समस्या को आसान बनाता है?
  • क्या कोई अन्य सामान्य बिल्ड सिस्टम है जो निम्न स्तर की सिस्टम उपयोगिताओं के लिए स्वीकार्य है जो मेरी आवश्यकताओं को बेहतर तरीके से संभालेगा?

जो मैं करने की कोशिश कर रहा हूं उसके स्पष्टीकरण के लिए पूछने के लिए स्वतंत्र महसूस करें। ध्यान दें कि यदि मैं जो बदल रहा हूं उसके साथ संगतता बरकरार रखना चाहता हूं, यदि यह बाइनरी ए और बी, एक/sbin और एक/usr/bin में एक जहाज को शिप करने के लिए उपयोग किया जाता है, तो मुझे लगता है कि मुझे बस उन स्थानों में प्रतिस्थापन रखना है या कम से कम सिम्लिंक है। पीएएम मॉड्यूल में एक निश्चित स्थापित स्थान भी है।

मैं स्पष्ट रूप से किसी भी उपयोगी उत्तर को ऊपर उठाने जा रहा हूं। मैं एक "स्वीकृत उत्तर" हूं, मैं ज्यादातर सलाह देता हूं कि "मुझे क्या करना चाहिए", समस्या का सबसे साफ समाधान क्या है और यदि विकल्प और दोष, पेशेवरों और विपक्ष की चर्चा लागू होती है।(: नहीं आपकी जिम्मेदारी है पढ़)

+3

आपको अपने config.ac में डिफ़ॉल्ट नहीं बदलना चाहिए। यदि कोई उपयोगकर्ता उपसर्ग निर्दिष्ट किए बिना आपकी कॉन्फ़िगरेशन स्क्रिप्ट चलाता है तो उपयोगकर्ता को डिफ़ॉल्ट रूप से/usr/local की अपेक्षा करने का हर अधिकार होता है। यदि आप इसे बदलते हैं, तो आपके पास एक पैकेजिंग बग है। उपसर्ग सेट करना उपयोगकर्ता का अधिकार (और ज़िम्मेदारी) है और पैकेज रखरखाव के बारे में चिंता करने का कोई अधिकार नहीं है। –

+0

आप अपने .spec फ़ाइल में या Debian/नियमों में उपसर्ग सेट कर सकते हैं, लेकिन आप निश्चित रूप से * * इसे संशोधित नहीं होना चाहिए configure.ac –

उत्तर

3

अनिवार्य रूप से, / और /usr पदानुक्रम के बीच भेद नहीं है और संकुल 'नदी के ऊपर मेंटेनर के हाथों में झूठ नहीं करना चाहिए। चूंकि / में केवल बूटिंग और /usr उपलब्ध कराने के लिए आवश्यक फाइलें होनी चाहिए, यह एक प्रशासनिक निर्णय है जो / पर जाता है। स्रोत से इंस्टॉलेशन के लिए, यह निर्णय इंस्टॉलर द्वारा और वितरण के लिए, पैकेज रखरखाव द्वारा किया जाता है।

एक तर्क के लिए, मान लीजिए कि कोई chroot वातावरण बनाने का प्रयास कर रहा है। पर्यावरण में/usr और/के बीच भेद पर्यावरण में व्यर्थ है, और नहीं बनाया जाएगा। सभी उपसर्ग /foo/bar/chroot पर सेट हैं, और $prefix के साथ किसी भी कॉन्फ़िगर स्क्रिप्ट मैसेजिंग अजीब व्यवहार को प्रेरित करने की संभावना है। डेबियन पैकेजिंग हेल्पर्स जैसी स्क्रिप्ट के लिए एक ही तर्क मिलता है, जो काम करने के लिए सामान्य $prefix अर्थशास्त्र पर निर्भर करता है।

इसलिए सबसे साफ समाधान bash-4.1 समाधान है। आपके पास मूल रूप से दो साफ विकल्प हैं: अपने पैकेज को बूट-क्रिटिकल और गैर-बूट-महत्वपूर्ण भागों में विभाजित करें, या अपने configure स्क्रिप्ट बूट-महत्वपूर्ण भागों के लिए वैकल्पिक उपसर्ग प्रदान करते हैं, जो डिफ़ॉल्ट रूप से / पर सेट किया गया है, $prefix/usr के रूप में छोड़कर ।

+0

में मैं बूट-महत्वपूर्ण और गैर बूट-महत्वपूर्ण भागों में इस विभाजन पसंद है, लेकिन डॉन डिफ़ॉल्ट के बारे में चिंता मत करो। उन्हें दो अलग-अलग पैकेज बनाएं और फिर ebuild 'econf --prefix = /' या कुछ का आह्वान कर सकता है। –

2

इस प्रश्न के दो अलग-अलग स्तर हैं, और आपके प्रश्न दूसरे अर्थ (आपके * .spec फ़ाइल, या डेबियन/नियम, या * .pkg फ़ाइल द्वारा उत्पन्न बाइनरी पैकेज) पर लागू होते प्रतीत होते हैं। जहां तक ​​autotools चिंतित हैं, आप परवाह नहीं है। आपको अपने config.ac में/usr/local के अलावा एक डिफ़ॉल्ट उपसर्ग निर्दिष्ट करने का प्रयास नहीं करना चाहिए। यह निर्दिष्ट करना कि बाइनरी पैकेज नियंत्रण फ़ाइलों में कहां स्थापित किया जाना चाहिए, और config.ac में नहीं। Autoconf जेनरेट कॉन्फ़िगर स्क्रिप्ट का उपयोग कर स्रोत वितरण डिफ़ॉल्ट रूप से/usr/local में स्थापित होना चाहिए, और कुछ और एक पैकेजिंग त्रुटि है।

आप एक स्रोत वितरण है कि उपयोगकर्ता एक विशेष मंच पर एक विशेष स्थान में आसानी से स्थापित करने के लिए उपयोग कर सकते हैं करना चाहते हैं, यह टारबॉल कि ऐसा नहीं करता है में एक स्क्रिप्ट शामिल करने के लिए स्वीकार्य होगा। उदाहरण के लिए, यदि आप एक निर्माण स्क्रिप्ट तरह दिखता है शामिल हो सकता है:

 
#!/bin/sh 

case $1 in 
foo) args='--prefix=/usr --bindir=/bin --sysconfdir=/etc';; 
bar) args='--prefix=/opt';; 
*) args=;; 
esac 
$(dirname $0)/configure $args && 
make && 
make install 

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

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