El Capitan, चेक बनाएं, DYLD_LIBRARY_PATH


9

मैं सामान्य यूनिक्स टूल सेट का उपयोग करके एप्लिकेशन विकसित करता हूं: एक संकलक make, और साझा लाइब्रेरी। प्रक्रिया तो परंपरागत रूप से कुछ पसंद है

  • ./configure, जो मशीन की सुविधाओं के लिए स्रोतों को चलाता है, जिस पर इसे चलाया जाता है,
  • make, जो वास्तव में साझा किए गए लिबास, एक्ज़ीक्यूटेबल्स आदि को संकलित करता है,
  • make check, जो पैकेज को स्थापित करने से पहले परीक्षण चलाता है ,
  • make install, अगर पैकेज ठीक से व्यवहार करता है, और अंत में, वैकल्पिक रूप से,
  • make installcheck, यह सुनिश्चित करने के लिए कि इंस्टॉलेशन काम करता है।

इस दौरान make, साझा किए गए परिवादों और निष्पादनयोग्य को उनके अंतिम रूप में संकलित किया जाता है: निष्पादन योग्य अपने अंतिम गंतव्य में साझा कामों के लिए एक निर्भरता के साथ संकलित किए जाते हैं (अर्थात, वे पुस्तकालयों पर निर्भर करते हैं, /usr/local/libहालांकि वे अभी तक वहां नहीं हैं, फिर भी वे अभी भी निर्माण में हैं पेड़)। फिर make install, मोटे तौर पर सिर्फ cpनिर्माण के पेड़ से अंतिम स्थान तक लिबास और निष्पादन योग्य स्थापित करने के लिए उपयोग कर रहा है।

make checkचरण के दौरान , हम प्रोग्राम को अनइंस्टॉल कर रहे हैं: साझा किए गए काम, निष्पादन योग्य और सहायक फाइलें अभी भी बिल्ड ट्री में हैं। परीक्षण चलाने के लिए आपको कुछ कस्टम वातावरण चर सेट करने होंगे (उदाहरण के लिए अपने प्रोग्राम को यह बताने के लिए कि आपकी सहायक डेटा फ़ाइलें /usr/local/shareस्रोत ट्री में नहीं हैं), और कुछ सिस्टम वातावरण चर, अपने हिस्से को देखने के लिए लिबर लोडर बताने के लिए। साझा कामों के लिए। पारंपरिक LD_LIBRARY_PATHX पर पर्यावरण चर है , OS X पर है DYLD_LIBRARY_PATH। इसने (दर्जनों) वर्षों तक काम किया है।

लेकिन अब, एल कैपिटन ने इसे तोड़ दिया।

$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$

अब, जब SIP सक्षम होता है, तो कोई DYLD_*भी प्रक्रिया अपने बच्चों को निर्यात नहीं की जाती है।

तो मेरा सवाल यह है: हम ऐसे प्रोग्राम कैसे चला सकते हैं जो इंस्टॉल नहीं हैं? पारंपरिक यूनिक्स अनुक्रम को चलाने में सक्षम होने के लिए क्या प्रक्रिया है ./configure && make && make check?

कृपया , कोई जवाब नहीं जैसे कि " make installपहले चलाएं "। ये मुद्दा नहीं है। मैं एक विकासकर्ता हूं, और "चेक बना" चला रहा हूं (और आमतौर पर एक प्रोग्राम के गैर-स्थापित संस्करण को चलाने वाला) कुछ ऐसा है जो मैं अक्सर करता हूं। यहां तक ​​कि डमी जगह पर स्थापित करने में समय लगता है। मुझे कुछ प्रभावी, और कुशल चाहिए। और SIP को अक्षम करना मेरे पैकेज के उपयोगकर्ताओं के लिए समस्या को ठीक नहीं करेगा जो चलाना चाहते हैं make check


मैं अभी भी DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.610.11 के तहत पुराने APU (पुरानी लाइब्रेरी के साथ) को चलाने के लिए उपयोग कर सकता हूं (भले ही वेरिएबल दिखाई न दे env)। अजीब (लेकिन यह काम करता है)।
nohillside

जवाबों:


6

ऐसा लगता है कि DYLD_ * केवल "संरक्षित" बायनेरिज़ के लिए छीन लिया जाता है (मुझे यकीन नहीं है कि इसका क्या मतलब है, लेकिन जाहिरा तौर पर शुरुआत के लिए / बिन और यूएसआर / बिन में कुछ भी) हालांकि, अगर आप कॉपी / यूएसआर / बिन / एनवी करते हैं कहीं और, इसे अपना DYLD_ * सामान रखने के लिए मिलता है:

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

मुझे लगता है कि हमेशा कमांड / बिन / श के माध्यम से रन बनाते हैं, इसलिए आप मेकफाइल में "खतरनाक" चर सेट नहीं कर सकते हैं और उन्हें कमांड को प्रभावित करते हैं, लेकिन हो सकता है कि आप परीक्षण को शेल स्क्रिप्ट में स्थानांतरित कर सकते हैं, पर्यावरण चर अंदर सेट कर सकते हैं स्क्रिप्ट, और फिर स्क्रिप्ट बनाने से आह्वान। हालांकि जाहिर है, यह आप में मदद नहीं करेगा अगर परीक्षण, बारी में, शेल स्क्रिप्ट पर भरोसा करते हैं (या अगर चीजें परीक्षण किया हैं शेल स्क्रिप्ट!) क्योंकि तब वे आह्वान / bin / श और चर फिर से कम करने के लिए जा रहे हैं .. ।


आपका बहुत बहुत धन्यवाद! अब मैं cp /bin/shअसली के बजाय उस खोल का उपयोग कर सकता हूं । Symlinks नहीं करेंगे, और हार्ड लिंक "ऑपरेशन की अनुमति नहीं है", इसलिए मुझे लगता है कि मुझे साथ रहना होगा cp
एकिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.