कोई सीधा तरीका नहीं है, लेकिन यह संभव है।
मान लीजिए कि आप वितरण का उपयोग कर रहे हैं। सरल, आपको मूल रूप से बिल्ड चरण में उपयोगकर्ता हुक जोड़ने की आवश्यकता है। यदि आप एक निर्माण हुक की जरूरत
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 बिल्ड सिस्टम पर कर रहा हूं, इसलिए मुझे पता है कि विचार ठीक काम करता है।कैबल एपीआई वास्तव में बहुत अच्छी तरह से प्रलेखित है - यह मुख्य रूप से इन क्षेत्रों में से कुछ के आसपास कुछ हद तक अस्थिर होने से पीड़ित है।
स्रोत
2010-05-31 00:13:04
सच है। एक [github पर # 1325 मुद्दे] है (https://github.com/haskell/cabal/issues/1325) :) – ony