Finding cabal packages using the GHC API

I am trying to create a program that typechecks haskell uses the GHC API for me. I got a type check for working with local files, but I have a special package that must be available (this executable will be included in the same package). How to add this import dependency?

I also tried compiling with the ghc command line to figure this out using ghc -package PKG-VER --make Test.hs -v , but it only looks in the local directory for import.

My current code is as follows:

 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 
+7
source share
1 answer

I managed to make your code read and typecheck myself, as followS:

 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 

this is how it works in ghci:

 $ 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> 

So it seems that the trick is to pass open packages in the dynflags argument before setSessionDynFlags . See DynFlags for some documentation.

+5
source

All Articles