2012-09-03 8 views
7

GHC APIを使用してhaskellファイルをtypechecksするプログラムを作成しようとしています。私はローカルファイルのために働くためにタイプチェックを得ましたが、私は同じように利用可能である必要がある特定のcabalパッケージを持っています(この実行可能ファイルは一部になります)。このインポート依存関係を追加するにはどうすればよいですか?GHC APIを使用する場合のキャバールパッケージの検索

また、これを把握するためにghcコマンドラインでコンパイルを試みましたが、ghc -package PKG-VER --make Test.hs -vを使用していますが、インポートのためにローカルディレクトリを調べているようです。

が私の現在のコードは次のようになります。

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するために管理:ここ

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の中で実行する方法である:

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

したがって、dynflags引数で公開されているパッケージをに渡すようになっているようです。いくつかのドキュメントについては、DynFlagsモジュールを参照してください。

+0

私はいくつかの愚かな過ちもあった(この例では存在しない)が、これは私が求めていたものなので、ありがとう! –

+0

新しいGHC API(7.10.2)のアップデートと同じように、パッケージ "pkg"を公開する引数は、次のようにする必要があります: 'ExposePackage(PackageArg" pkg ")$ ModRenaming True []'パッケージを公開します。 – Dmitry

関連する問題