2010-03-27 18 views
11

मैंने सी स्रोत फ़ाइल संकलित करने के तरीके को नियंत्रित करने के लिए कुछ झंडे जोड़ने का फैसला किया (यानी उपयोग-क्लैंग, उपयोग-इंटेल आदि जैसे कुछ)।सी कैबल पैकेज में सी कंपाइलर चयन

 
     C-Sources: c_lib/tiger.c 
     Include-Dirs: c_lib 
     Install-Includes: tiger.h 

     if flag(debug) 
      GHC-Options: -debug -Wall -fno-warn-orphans 
      CPP-Options: -DDEBUG 
      CC-Options: -DDEBUG -g 
     else 
      GHC-Options: -Wall -fno-warn-orphans

प्रश्न यह है: सी संकलक बदलने के लिए descritpion फ़ाइल में कौन से विकल्प संशोधित किए जाने की आवश्यकता है? मुझे केवल सीसी-विकल्प मिले।

उत्तर

1

वास्तव में एक .cabal फ़ाइल में इसे निर्दिष्ट करने का कोई तरीका नहीं प्रतीत होता है; इस समय हमारे पास एकमात्र चीज है जो यहां तक ​​कि दूरस्थ रूप से उपयोगी भी होगी --with-<prog>=path है।

मेरा सुझाव है कि आप trac पर कैबल के खिलाफ टिकट दर्ज करने का प्रयास करें।

+1

सच है। एक [github पर # 1325 मुद्दे] है (https://github.com/haskell/cabal/issues/1325) :) – ony

0

4.10.1. Replacing the program for one or more phases

-pgmc cmd
              उपयोग cmd सी संकलक के रूप में।

यह ghc --make के लिए काम करता है, लेकिन मुझे यकीन है कि कैसे कबाल सी फ़ाइल संकलन करने के लिए इस लागू करने के लिए प्राप्त करने के लिए नहीं कर रहा हूँ।

+0

कोशिश की - कुछ भी नहीं बदला। "-फिविया-सी" निर्दिष्ट करना हास्केल फ़ाइलों संकलन के दौरान अपेक्षित त्रुटियां देता है, इसलिए यह विकल्प फ़िल्टर नहीं किए जाते हैं। ऐसा लगता है कि कैबल ".c" -files बनाने के लिए अपने स्वयं के अनुक्रम का उपयोग कर रहा है। – ony

7

कोई सीधा तरीका नहीं है, लेकिन यह संभव है।

मान लीजिए कि आप वितरण का उपयोग कर रहे हैं। सरल, आपको मूल रूप से बिल्ड चरण में उपयोगकर्ता हुक जोड़ने की आवश्यकता है। यदि आप एक निर्माण हुक की जरूरत

main :: IO() 
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook } 

अगला:, मुख्य

बदलें निर्माण हुक का उपयोग करने की तरह कुछ:

निम्न परिवर्तन की

सभी Setup.hs में प्रदर्शित करने की जरूरत है। यह संभवतः निम्न जैसा दिखता है:

myBuildHook pkg_descr local_bld_info user_hooks bld_flags = 
    do 
    let lib  = fromJust (library pkg_descr) 
     lib_bi = libBuildInfo lib 
     custom_bi = customFieldsBI lib_bi 
     cpp_name = fromJust (lookup "x-cc-name" custom_bi) 
     c_srcs = cSources lib_bi 
     cc_opts = ccOptions lib_bi 
     inc_dirs = includeDirs lib_bi 
     lib_dirs = extraLibDirs lib_bi 
     bld_dir = buildDir local_bld_info 
    -- Compile C/C++ sources 
    putStrLn "invoking my compile phase" 
    objs <- mapM (compileCxx cpp_name cc_opts inc_dirs bld_dir) c_srcs 
    -- Remove C/C++ source code from the hooked build (don't change libs) 
    let lib_bi' = lib_bi { cSources = [] } 
     lib'  = lib { libBuildInfo = lib_bi' } 
     pkg_descr' = pkg_descr { library = Just lib' } 
    -- The following line invokes the standard build behaviour 
    putStrLn "Invoke default build hook" 
    bh <- buildHook simpleUserHooks pkg_descr' local_bld_info user_hooks bld_flags 
    return bh 

ऊपर दिए गए कोड को शायद थोड़ा सा अनपॅक करने की आवश्यकता है। चलो क्लॉज मूल रूप से निर्माण हुक में पारित संरचनाओं से आवश्यक डेटा फ़ील्ड को अनपॅक करने के बारे में हैं। ध्यान दें कि आप अपने foo.cabal में कस्टम stanzas बना सकते हैं।

x-cc-name: icc 

अपने संकलक निर्दिष्ट करने के लिए एक साधन के रूप में: मैं कोड की तरह एक छंद कुछ समर्थन करने के लिए प्रदान की है। सभी स्रोत फ़ाइलों को निकालने के बाद, आप एक फ़ाइल को संकलित करने के लिए फ़ंक्शन का उपयोग करके उन पर नक्शा लगाते हैं (एनबी: यह कुछ मामलों में उप-इष्टतम है, उदाहरण के लिए उन कंपाइलर्स जो एकल ऑब्जेक्ट आउटपुट और लाभ का उत्पादन करने के लिए कई स्रोत फ़ाइलों को कुशलता से संकलित कर सकते हैं बड़े पैमाने पर अनुकूलन से, लेकिन हम अभी इसके लिए छोड़ देंगे)।

आखिरकार, जैसा कि हमने अब सी/सी ++ कोड संकलित किया है, इसे डिफॉल्ट बिल्ड हुक पर सबकुछ पास करने से पहले इसे निर्माण संरचनाओं से हटा दें।

क्षमा करें कि यह एक डिब्बाबंद उत्तर की तुलना में 'हाउटो' से अधिक है, लेकिन इससे आपको जाने में मदद मिलनी चाहिए।

मुझे यह उल्लेख करना चाहिए कि कोड अनचाहे है। मैंने इसे कुछ काम से अनुकूलित किया है जो मैं wxHaskell बिल्ड सिस्टम पर कर रहा हूं, इसलिए मुझे पता है कि विचार ठीक काम करता है।कैबल एपीआई वास्तव में बहुत अच्छी तरह से प्रलेखित है - यह मुख्य रूप से इन क्षेत्रों में से कुछ के आसपास कुछ हद तक अस्थिर होने से पीड़ित है।

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