2012-04-19 19 views
17

विभिन्न डेवलपर्स PKG_CHECK_MODULES (उदाहरण के लिए, this answer में) के उपयोग को हतोत्साहित करते हैं, लेकिन जहां तक ​​मैंने देखा है उनके कारणों की कोई स्पष्ट, व्यापक व्याख्या नहीं है। तो, मैं पूछता हूं:PKG_CHECK_MODULES हानिकारक माना जाता है?

  • PKG_CHECK_MODULES हानिकारक क्यों होगा?
  • विकल्प क्या हैं?

मैं, एक के लिए, आज पहली बार इसका इस्तेमाल किया। मैं, यह invaluably उपयोगी पाया विशेष रूप से इस तरह के जीटीके + के रूप में बहुत जटिल पुस्तकालय सेट, है, जहां मैं इन सब निर्भरता है से निपटने के लिए:

-I/usr/lib/i386-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 
-I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 
-I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 
-I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 
-I/usr/include/freetype2 -I/usr/include/libpng12 

-lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 
-lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 
-lgthread-2.0 -lrt -lglib-2.0 
+1

यद्यपि विलियम पर्सेल आमतौर पर प्रस्तावित 'पीकेजी-कॉन्फ़िगरेशन' के विकल्प के पीछे कारण हैं, वास्तविकता यह है कि जीटीके जैसे पूरे प्लेटफ़ॉर्म हैं जो 'गलत' तरीके से काम करते हैं और इसे ठीक करने के लिए उन सभी पुस्तकालयों की आवश्यकता होती है निर्देशिका को बदलने के लिए वे स्वयं को स्थापित करते हैं। इससे मौजूदा अनुप्रयोगों के निर्माण प्रणालियों के बड़े पैमाने पर टूटने का कारण बन जाएगा। चूंकि मुझे नहीं लगता कि 'गलत' तरीका वास्तव में किसी भी नुकसान का कारण बनता है, यह बदलने योग्य नहीं है। – ptomato

+1

इसके अलावा, 'pkg-config' आपको समानांतर में स्थापित पुस्तकालयों (जैसे जीटीके 2 और जीटीके 3) के असंगत संस्करणों को रखने की अनुमति देता है। हालांकि मुझे यकीन है कि विलियम पर्सेल ने इस बारे में सोचा है और उसे यह समझाने में प्रसन्नता होगी कि इसे कैसे किया जाए ;-) – ptomato

+0

@ptomato नहीं, मैं कड़ाई से एक गैर-गुई व्यक्ति हूं और कभी भी gtk के साथ सीधे व्यवहार नहीं किया है। लेकिन मेरा मानना ​​है कि यह "एलडीएफएलजीएस = -एल $ (पीकेजी-कॉन्फिग - लिब्स-केवल-एल gtk + -2.0) सीपीपीएफएलजीएस = $ (पीकेजी-कॉन्फिग - सीएफएलएक्स gtk + -2.0) LIBS = $ जैसी चीजों को करने के लिए पूरी तरह से संभव होना चाहिए (pkg-config --libs-only-l gtk + -2.0) ", और उन विकल्पों को config.site में रखा जा सकता है। स्पष्ट होने के लिए, मुझे pkg-config पर कोई आपत्ति नहीं है, लेकिन मैं अपने उत्तर में उल्लिखित कारणों के लिए PKG_CHECK_MODULES को नापसंद करता हूं। –

उत्तर

19

वर्षों के लिए, मैं PKG_CHECK_MODULES इस्तेमाल किया और यह बहुत उपयोगी पाया। मैंने लोगों को शिकायत की थी कि PKG_CHECK_MODULES का उपयोग विभिन्न प्लेटफार्मों पर "सूक्ष्म बिल्ड त्रुटियों" का कारण बनता है, लेकिन मैंने कभी यह नहीं पाया कि इसका उपयोग बंद करने का एक विशेष कारण है। हालांकि, मुझे विश्वास है कि उपयोगकर्ता की शिकायतों का जवाब देने के लिए यह रखरखाव का दायित्व है, जहां यह हमेशा एक परेशानी का मुद्दा था। हालांकि, PKG_CHECK_MODULES के साथ मेरी मुख्य शिकायत यह है कि यह असफलताओं का कारण बनती है जहां इसे नहीं करना चाहिए। एक उपयोगकर्ता /p/a/t/h में libfoo स्थापित करता है और LDFLAGS=-L/p/a/t/h के साथ एक configure स्क्रिप्ट का आह्वान करते हैं, तो उपयोगकर्ता configury उम्मीद libfoo खोजने के लिए उचित है। लेकिन, उपयोगकर्ता को भी PKG_CONFIG_PATH सेट करना होगा ताकि configure स्क्रिप्ट को सफल होने के लिए foo.pc मिल सके, और आईएमओ टूटा हुआ हो। AC_CHECK_LIB का आह्वान करना संभव होगा और फिर उस समस्या से बचने के लिए लाइब्रेरी मानक तंत्र के माध्यम से नहीं मिली है, तो केवल PKG_CHECK_MODULES का आह्वान करें। एक और मुद्दा यह है कि यह पूरी तरह संभव है PKG_CHECK_MODULES एक .pc फ़ाइल जिसमें जानकारी गलत है खोजने के लिए, निर्माण को विफल कर रही है। उस स्थिति में, PKG_CHECK_MODULES के बाद AC_CHECK_LIB को आमंत्रित करना आवश्यक है।

संक्षेप में, PKG_CHECK_MODULES सही ढंग से उपयोग करने के लिए है, यह आह्वान करने के लिए AC_CHECK_LIBS पहले, तो सशर्त आह्वान PKG_CHECK_MODULES, और फिर जानकारी PKG_CHECK_MODULES द्वारा पाया मान्य करने के लिए फिर से AC_CHECK_LIBS आह्वान आवश्यक है। रखरखाव के हिस्से पर यह अतिरिक्त कार्य केवल उपयोगकर्ताओं के लिए गैर-मानक स्थान में अपने पुस्तकालयों को स्थापित करना आसान बनाता है, आईएमओ, बेतुका है। मानक तंत्र के माध्यम से पुस्तकालयों को खोजने के लिए उपयोगकर्ता को अपनी टूल श्रृंखला सेट करनी चाहिए।

- संपादित करें -

स्पष्ट करने के लिए, मैं सुझाव दे नहीं कर रहा हूँ कि एक पैकेज है जो एक पुस्तकालय जो PKG_CHECK_MODULES के उपयोग को प्रोत्साहित उनके configury में इसका उपयोग करने से बचना चाहिए उपयोग करता है। बल्कि, मैं सिफारिश कर रहा हूँ कि पुस्तकालयों इसके उपयोग को प्रोत्साहित करने और .pc फ़ाइलों के वितरण को बंद नहीं। .pc फ़ाइलों द्वारा हल की जाने वाली समस्या को उच्च स्तर पर बेहतर ढंग से संबोधित किया जाता है। autotools नहीं एक पैकेज प्रबंधन सिस्टम के हैं, और यह एक समस्या यह है कि एक पैकेज प्रबंधन टूल द्वारा संबोधित किया जाना चाहिए है।

+5

.pc के बारे में एक साफ बात यह है कि यह आपको लाइब्रेरी की ज़रूरतों को पूरा करता है, जैसे -एमएमएस-बिटफील्ड। इसके अलावा स्थिर संकलन, विरोधाभासी मॉड्यूल, और मॉड्यूल स्थापना आदि के लिए स्थान जैसे विभिन्न रन-टाइम विवरणों के लिए आवश्यक libs इसलिए आपके मानक "मानक तंत्र पर भरोसा करने के लिए सुझाव" इन मामलों को कवर नहीं करते हैं। यह केवल एक lib और प्रतीक खोजने के बारे में नहीं है। हालांकि मैं इस बात से सहमत हूं कि कुछ मामलों में अधिक लिंक टाइम चेक जोड़ना सहायक हो सकता है, जो कुछ समय के लिए कॉन्फ़िगर धीमा कर देगा। एक मिनट पर निर्भर sys correctness का कुछ कैश्ड परिणाम – elmarco

+3

पर भरोसा करने जैसा ही है, यह कहना है कि आपके द्वारा प्रस्तावित मानक तंत्र पर वापस व्यवहार्य नहीं है, PKG_CONFIG_LIBDIR के साथ एक सही सिस्टम पर भरोसा करना मेरे लिए बिना किसी सिस्टम के क्रॉस-संकलन के लिए छोटा बनाता है कोई दर्द। – elmarco

+1

@elmarco आप PKG_CHECK_MODULES का उपयोग किए बिना CFLAGS, CPPFLAGS, LDFLAGS, और LIBS को पॉप्युलेट करने के लिए pkg-config का उपयोग कर सकते हैं, ताकि आप PKG_CHECK_MODULES पर भरोसा किए बिना pkg-config के सभी लाभ प्राप्त कर सकें। (प्रश्न पर मेरी टिप्पणी देखें) –

5

एक ब्लॉग पोस्ट है कि यहाँ PKG_CHECK_MODULES के बुरे पक्ष पर विस्तार का एक सा में चला जाता है नहीं है:

http://tirania.org/blog/archive/2012/Oct-20.html

या इस stackoverflow प्रश्न:

Using the pkg-config macro PKG_CHECK_MODULES failing

यह अनिवार्य रूप फोड़े नीचे: अगर कोई ऑटोकॉन्फ़ चलाने की कोशिश कर रहा है और इसमें pkg-config स्थापित नहीं है, तो यह बहुत ही अनुपयोगी त्रुटियों का कारण बनता है। बस, इस चीख नहीं है "आप pkg-config स्थापित करने की आवश्यकता" एक पैकेज संकलित करने के लिए कोशिश कर रहा एक उपयोगकर्ता/डेवलपर के लिए

./configure: line 5283: syntax error near unexpected token `FFMPEG,' 
./configure: line 5283: ` PKG_CHECK_MODULES(FFMPEG, libavutil libavformat libavcodec libswscale, HAVE_FFMPEG=yes)' 

: यहाँ एक त्रुटि autoconf && ./configure चल मैं आज मिल गया का एक उदाहरण है।

हैं (लेख के रूप में पता चलता है) तुम सिर्फ pkg-config सीधे कॉल, आप

AC_SUBST(MONO_LIBS) 
AC_SUBST(MONO_CFLAGS) 
if pkg-config --atleast-version=2.10 mono; then 
    MONO_CFLAGS=`pkg-config --cflags mono` 
    MONO_LIBS=`pkg-config --libs mono` 
else 
    AC_MSG_ERROR(Get your mono from www.go-mono.com) 
fi 

अन्य लोगों को बिल्कुल भी उपयोग नहीं कर सुझाव देते हैं pkg-config अधिक उपयोगी त्रुटियों मिल, उदा .:; यह एक अलग मुद्दा है।

+0

मैं उलझन में हूं कि क्यों 'pkg-config' है या नहीं, '//config', '/ bin/sh' स्क्रिप्ट को कैसे प्रभावित करेगा, व्यवहार करना चाहिए। क्या pkg-config स्थापित होने पर '/ bin/sh' को 'PKG_CHECK_MODULES' जैसी चीज़ों की व्याख्या करने की क्षमता प्राप्त होती है? –

+0

@ sid-kap यह 'autoconf' चरण है जहां चीजें गलत होती हैं - यदि pkg-config स्थापित नहीं है, तो PKG_CHECK_MODULES मैक्रो विस्तारित नहीं होता है (क्योंकि वह मैक्रो pkg-config द्वारा प्रदान किया जाता है)। autoconf सफलता देता है, लेकिन एक अवैध कॉन्फ़िगरेशन स्क्रिप्ट उत्पन्न करता है। समस्या इतनी अधिक नहीं है कि यह विफल हो जाती है, लेकिन यह चल रहा कॉन्फ़िगरेशन वास्तव में अनुपयोगी त्रुटि संदेश के साथ विफल रहता है जो अंत उपयोगकर्ता को नहीं सोचता है "आह, मुझे pkg-config स्थापित करने और स्वत: कॉन्फ़िगर चलाने की आवश्यकता है"। – JosephH

+0

सामान्य रूप से 'कॉन्फ़िगरेशन' स्क्रिप्ट उत्पन्न करने के लिए 'ऑटो (पुनः) conf' चलाने के लिए रखरखाव की ज़िम्मेदारी है। यदि pkg-config आवश्यक है, तो इसे पूर्व-निर्माण निर्देशों में उल्लिखित किया जाना चाहिए (या चेक के रूप में 'autogen.sh' में डाल दिया जाना चाहिए)। – Rufflewind

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