2012-09-03 22 views
7

का उपयोग कर रहा एक प्रोग्राम है जो मुझे GHC एपीआई का उपयोग कर के लिए Haskell फ़ाइलों typechecks बनाने के लिए कोशिश कर रहा हूँ कबाल संकुल ढूँढना। मुझे स्थानीय फाइलों के लिए काम करने के लिए प्रकार की जांच मिल गई है, लेकिन मेरे पास एक विशिष्ट कैबल पैकेज है जिसे मुझे भी उपलब्ध होना चाहिए (यह निष्पादन योग्य एक ही पैकेज का हिस्सा होगा)। इस आयात निर्भरता को कैसे जोड़ें?जब GHC एपीआई

मैंने ghc -package PKG-VER --make Test.hs -v का उपयोग करके यह पता लगाने के लिए ghc कमांड लाइन के साथ संकलन करने का भी प्रयास किया, लेकिन यह केवल आयात के लिए स्थानीय निर्देशिका में दिखता है।

मेरे वर्तमान कोड इस तरह दिखता है:

import   Control.Exception 
import   Control.Monad 
import   Control.Monad.State 
import   DynFlags 
import   Exception 
import   GHC 
import   GHC.Paths   (libdir) 
typecheck :: MonadIO m => [FilePath] -> FilePath -> m() 
typecheck otherincludes fp = 
    liftIO . defaultErrorHandler defaultLogAction . runGhc (Just libdir) $ do 
    dynflags <- getSessionDynFlags 
    void $ setSessionDynFlags dynflags { includePaths = otherIncludes ++ includePaths dynflags } 
    target <- guessTarget fp Nothing 
    setTargets [target] 
    void $ load LoadAllTargets 
    deps <- depanal [] False 
    forM_ deps $ \ms -> parseModule ms >>= typecheckModule 
+2

http://hackage.haskell.org/package/buildwrapper पैकेज वास्तव में ऐसा करता है। आप इसे संदर्भ के रूप में उपयोग कर सकते हैं। – arrowd

उत्तर

5

मैं अपने कोड को पढ़ने के लिए बनाने के लिए और अपने आप typecheck करने में कामयाब रहे इस प्रकार है:

$ ghci Test.hs -package ghc 
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package array-0.4.0.0 ... linking ... done. 
Loading package deepseq-1.3.0.0 ... linking ... done. 
Loading package containers-0.4.2.1 ... linking ... done. 
Loading package filepath-1.3.0.0 ... linking ... done. 
Loading package old-locale-1.0.0.4 ... linking ... done. 
Loading package old-time-1.1.0.0 ... linking ... done. 
Loading package bytestring-0.9.2.1 ... linking ... done. 
Loading package unix-2.5.1.0 ... linking ... done. 
Loading package directory-1.1.0.2 ... linking ... done. 
Loading package pretty-1.1.1.0 ... linking ... done. 
Loading package process-1.1.0.1 ... linking ... done. 
Loading package Cabal-1.14.0 ... linking ... done. 
Loading package binary-0.5.1.0 ... linking ... done. 
Loading package bin-package-db-0.0.0.0 ... linking ... done. 
Loading package hoopl-3.8.7.3 ... linking ... done. 
Loading package hpc-0.5.1.1 ... linking ... done. 
Loading package template-haskell ... linking ... done. 
Loading package ghc-7.4.1 ... linking ... done. 
Ok, modules loaded: Test. 
Prelude Test> typecheck [] "Test.hs" 
Loading package transformers-0.3.0.0 ... linking ... done. 
Loading package mtl-2.1.1 ... linking ... done. 
Prelude Test> 
:

package Test where 
import   Control.Exception 
import   Control.Monad 
import   Control.Monad.State 
import   DynFlags 
import   Exception 
import   GHC 
import   GHC.Paths   (libdir) 
typecheck :: MonadIO m => [FilePath] -> FilePath -> m() 
typecheck otherincludes fp = 
    liftIO . defaultErrorHandler defaultLogAction . runGhc (Just libdir) $ do 
    dynflags <- getSessionDynFlags 
    void $ setSessionDynFlags dynflags { 
     includePaths = otherincludes ++ includePaths dynflags, 
     packageFlags = [ExposePackage "ghc"]} } 
    target <- guessTarget fp Nothing 
    setTargets [target] 
    void $ load LoadAllTargets 
    deps <- depanal [] False 
    forM_ deps $ \ms -> parseModule ms >>= typecheckModule 
यहाँ

यह कैसे GHCi में चलाता है

तो चालके लिए dynflags तर्क में उजागर संकुल पारित करने के लिए हो रहा है। कुछ दस्तावेज के लिए DynFlags मॉड्यूल देखें।

+0

पता चला कि मेरे पास कुछ बेवकूफ गलतियां भी थीं (इस उदाहरण में मौजूद नहीं है), लेकिन मैंने यही पूछा, इसलिए धन्यवाद! –

+0

बस नए GHC एपीआई (7.10.2) के लिए अद्यतन के रूप में: तर्क एक पैकेज "pkg" बेनकाब करने के लिए किया जाना चाहिए: 'ExposePackage (PackageArg" pkg ") $ ModRenaming सच []' जहां यह सच है (वास्तव में अच्छी तरह से प्रलेखित नहीं) वास्तव में पैकेज का खुलासा करता है। – Dmitry