2011-02-10 9 views
13

मैं हैकेज पर एफएफआई बाइंडिंग के साथ एक पुस्तकालय बनाए रखता हूं। तो मेरी हास्केल लाइब्रेरी संबंधित सी लाइब्रेरी और इसकी शीर्षलेख फ़ाइलों पर निर्भर करती है। अब मैं .cabal फ़ाइल इस तरह में बाहरी निर्भरता निर्दिष्ट करें:.cabal में बाहरी सी लाइब्रेरी पर निर्भरता कैसे निर्दिष्ट करें?

PkgConfig-Depends: 
     libfoo >= 1.2 

और यह लिनक्स में मेरे लिए अच्छी तरह से काम करता है। हालांकि, मैं जो रिपोर्ट पुस्तकालय का एक उपयोगकर्ता, जो Windows पर pkg-config स्थापित करने के बजाय बोझिल है, और इसके बजाय वह

Includes: 
     foo.h 
Extra-libraries: 
     foo 

पसंद मैं चाहूँगा मेरे पुस्तकालय के रूप में संभव के रूप में निर्माण करने के लिए आसान हो सकता है, और डॉन ' टी निर्माण निर्भरताओं को मजबूर करना चाहते हैं जिन्हें कड़ाई से जरूरी नहीं है। हालांकि, मुझे लगता है कि Cabal manualPkgConfig-Depends का उपयोग करने का सुझाव देता है।

मेरे सवालों का:

  • किस तरह मैं पार मंच पैकेज के लिए पसंद करते हैं चाहिए?
  • क्या .cabal फ़ाइल को इस तरह से लिखना संभव है, यह pkg-config के साथ काम कर सकता है और बिना?
  • और, वैसे, pkg-config हैस्केल प्लेटफार्म में शामिल है (मेरे पास अभी जांचने के लिए एक विंडोज मशीन नहीं है)?
+3

पीकेजी-कॉन्फ़िगरेशन विंडोज़ (2010.2.0.0) पर प्लेटफ़ॉर्म के साथ शामिल नहीं है। –

+0

धन्यवाद, @ स्टीफन। – sastanin

उत्तर

12

पीकेजी-कॉन्फ़िगरेशन विधि बेहतर है क्योंकि pkg-config जानता है कि कहां और पुस्तकालय फ़ाइलों को ढूंढना है, जो कि कुछ सिस्टमों पर गैर-मानक स्थानों में हो सकता है।

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

Flag UsePkgConfig 
    Description: Use pkg-config to check for library dependences 
    Default: True 

Executable hax 
    if flag(UsePkgConfig) 
    PkgConfig-Depends: libfoo >= 1.2 
    else 
    Includes: foo.h 
    Extra-libraries: foo 
+0

धन्यवाद। मैंने इस दृष्टिकोण को ध्वज के साथ चुना है, हां, मैंने इसके बजाय 'NoPkgConfig' ध्वज पसंद किया है, क्योंकि' कैबल कॉन्फ़िगरेशन -fNoPkgConfig' 'कैबल कॉन्फ़िगरेशन -f-UsePkgConfig' से अधिक पठनीय है। यह दृष्टिकोण लिनक्स पर अच्छी तरह से काम करता है (या तो 'pkg-config' के साथ और बिना)।मैं रिपोर्ट करूंगा कि बाद में विंडोज उपयोगकर्ता प्रतिक्रिया क्या है। – sastanin

+0

अद्यतन: यह दृष्टिकोण विंडोज पर भी अच्छी तरह से काम करता है। – sastanin

5

pkg-config हास्केल प्लेटफ़ॉर्म में शामिल नहीं है, और न ही मैं कल्पना कर सकता हूं कि यह कभी भी होगा।

आमतौर पर मैं अपेक्षाकृत सरल होने पर includes/Extra-libraries का उपयोग करूंगा। लेकिन जटिल संकुलों के लिए जिनमें बहुत से पुस्तकालय शामिल हैं, जैसे कि gtk, यह उपलब्ध होने पर pkg-config का उपयोग करने के लिए बहुत अच्छा है।

एक .cabal फ़ाइल लिखना संभव है जो विशिष्ट फ़ील्ड के साथ और बिना काम करेगा। इस प्रयास करें:

if os(windows) 
    Includes: 
     foo.h 
    Extra-libraries: 
     foo 
else 
    PkgConfig-Depends: 
     libfoo >= 1.2 

भी ध्यान रखें कि .cabal एक कॉन्फ़िगर स्क्रिप्ट है, जो कुछ स्थितियों में मदद कर सकते हैं लेकिन बहुत खिड़कियों के अनुकूल नहीं है चला सकते हैं।

+0

धन्यवाद। मैंने ऐसा कुछ करने के लिए माना, लेकिन शायद @Heatsink द्वारा प्रस्तावित समाधान अधिक लचीला है। मैं इसे पहले कोशिश करूंगा। – sastanin

+2

@jetxee - यह सच है कि झंडे अधिक लचीला हो सकते हैं, लेकिन वे भी समस्याएं पैदा कर सकते हैं। कैबल पहले से स्थापित संकुल को पुन: संकलित करना चाहता है जब एक नया पैकेज झंडे के एक अलग सेट के साथ बनाया जाता है, जो आपके पैकेज डीबी को असंगत स्थिति में डाल सकता है। मैं पक्षपाती हो सकता हूं क्योंकि मुझे अभी अपने पैकेज डीबी को ठीक करना पड़ा है। –

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

  • कोई संबंधित समस्या नहीं^_^